diff --git a/_maps/cyberiad.dm b/_maps/cyberiad.dm
index af0a1fe1ff4..98ba7cf21f2 100644
--- a/_maps/cyberiad.dm
+++ b/_maps/cyberiad.dm
@@ -10,7 +10,6 @@ z4 = engineering ship
z5 = mining
z6 = russian derelict
z7 = empty
-z8 = syndicate station
*/
#if !defined(MAP_FILE)
@@ -22,7 +21,6 @@ z8 = syndicate station
#include "map_files\cyberiad\z5.dmm"
#include "map_files\cyberiad\z6.dmm"
#include "map_files\cyberiad\z7.dmm"
- #include "map_files\cyberiad\z8.dmm"
#define MAP_FILE "cyberiad.dmm"
#define MAP_NAME "NSS Cyberiad"
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 3a53d963a2c..0e51a86a8d3 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -2853,7 +2853,7 @@
"bcS" = (/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bcT" = (/obj/structure/noticeboard{pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bcU" = (/obj/machinery/camera{c_tag = "Bar East"; network = list("SS13")},/obj/structure/flora/kirbyplants,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bcV" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/kitchen)
+"bcV" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bcW" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 25},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bcX" = (/obj/structure/sink/kitchen{pixel_y = 28},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bcY" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
@@ -2947,7 +2947,7 @@
"beI" = (/obj/structure/piano,/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"beJ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"beK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"beL" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/kitchen)
+"beL" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"beM" = (/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"beN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"beO" = (/obj/machinery/camera{c_tag = "Kitchen"; network = list("SS13")},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/kitchen_machine/candy_maker,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
@@ -3414,7 +3414,7 @@
"bnH" = (/obj/machinery/camera{c_tag = "Bar South"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bnI" = (/obj/item/device/radio/intercom{pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bnJ" = (/obj/machinery/atm{pixel_x = 32; pixel_y = 0},/obj/structure/flora/kirbyplants,/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/bar)
-"bnK" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/machinery/vending/dinnerware,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/kitchen)
+"bnK" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/machinery/vending/dinnerware,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bnL" = (/obj/machinery/icemachine,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bnM" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/fancy/donut_box,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "kitchenhall"; name = "Kitchen Shutters"; opacity = 0},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bnN" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "kitchenhall"; name = "Kitchen Shutters"; opacity = 0},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
@@ -4674,7 +4674,7 @@
"bLT" = (/obj/machinery/computer/message_monitor,/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/server)
"bLU" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "dark"},/area/server)
"bLV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{icon_state = "dark"},/area/server)
-"bLW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access_txt = "30"},/turf/simulated/floor{icon_state = "dark"},/area/server)
+"bLW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access_txt = "30"},/turf/simulated/floor{icon_state = "dark"},/area/server)
"bLX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor,/area/engine/gravitygenerator)
"bLY" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor,/area/engine/gravitygenerator)
"bLZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor,/area/engine/gravitygenerator)
@@ -5405,7 +5405,7 @@
"bZW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bZX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bZY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/paramedic)
-"bZZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/closet/paramedic,/obj/item/weapon/key/ambulance_train{name = "spare ambulance key"},/turf/simulated/floor{icon_state = "white"},/area/medical/paramedic)
+"bZZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/closet/paramedic,/turf/simulated/floor{icon_state = "white"},/area/medical/paramedic)
"caa" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/paramedic)
"cab" = (/obj/machinery/light,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 2; name = "Paramedic APC"; pixel_y = -24},/obj/machinery/camera{c_tag = "Paramedic Bay"; dir = 1; network = list("SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/paramedic)
"cac" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/medical/paramedic)
diff --git a/_maps/map_files/cyberiad/z8.dmm b/_maps/map_files/cyberiad/z8.dmm
deleted file mode 100644
index 7ea368306ba..00000000000
--- a/_maps/map_files/cyberiad/z8.dmm
+++ /dev/null
@@ -1,587 +0,0 @@
-"aa" = (/turf/space,/area/space)
-"ab" = (/turf/simulated/wall/r_wall,/area/traitor/hall)
-"ac" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/traitor/hall)
-"ad" = (/obj/machinery/door/airlock/external{frequency = 1479; icon_state = "door_locked"; id_tag = "traitor_station_outer"; locked = 1; name = "Syndicate Station External Access"; req_access = null; req_access_txt = null},/turf/simulated/floor,/area/traitor/hall)
-"ae" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1479; id_tag = "traitor_station_airlock"; pixel_x = -25; req_access_txt = null; tag_airpump = "traitor_station_pump"; tag_chamber_sensor = "traitor_station_sensor"; tag_exterior_door = "traitor_station_outer"; tag_interior_door = "traitor_station_inner"},/turf/simulated/floor{icon_state = "dark"},/area/traitor/hall)
-"af" = (/turf/simulated/floor{icon_state = "dark"},/area/traitor/hall)
-"ag" = (/obj/machinery/light/small{dir = 4},/obj/machinery/airlock_sensor{frequency = 1479; id_tag = "traitor_station_sensor"; pixel_x = 25; pixel_y = -5},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1479; id_tag = "traitor_station_pump"},/obj/structure/closet/emcloset,/turf/simulated/floor{icon_state = "dark"},/area/traitor/hall)
-"ah" = (/obj/structure/disposaloutlet{dir = 1},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating/airless,/area/space)
-"ai" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor{icon_state = "dark"},/area/traitor/hall)
-"aj" = (/turf/simulated/wall/r_wall,/area/traitor/kitchen)
-"ak" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/traitor/kitchen)
-"al" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/traitor/kitchen)
-"am" = (/turf/simulated/wall/r_wall,/area/traitor/empty)
-"an" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/traitor/empty)
-"ao" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/traitor/chem)
-"ap" = (/turf/simulated/wall/r_wall,/area/traitor/chem)
-"aq" = (/obj/machinery/door/airlock/external{frequency = 1479; icon_state = "door_locked"; id_tag = "traitor_station_inner"; locked = 1; name = "Syndicate Station Interior Access"; req_access = null; req_access_txt = null},/turf/simulated/floor{icon_state = "dark"},/area/traitor/hall)
-"ar" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; pixel_y = 24},/obj/structure/disposalpipe/segment,/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/machinery/alarm/monitor{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor,/area/traitor/kitchen)
-"as" = (/obj/structure/table,/obj/item/candle,/turf/simulated/floor,/area/traitor/kitchen)
-"at" = (/turf/simulated/floor,/area/traitor/kitchen)
-"au" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/remains/human,/turf/simulated/floor,/area/traitor/kitchen)
-"av" = (/obj/machinery/gibber,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/traitor/kitchen)
-"aw" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; pixel_y = 24},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/empty)
-"ax" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/empty)
-"ay" = (/obj/structure/table,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/chem)
-"az" = (/obj/machinery/chem_master,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/chem)
-"aA" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/chem)
-"aB" = (/obj/structure/table,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/hand_labeler,/obj/machinery/alarm/monitor{pixel_y = 22},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/chem)
-"aC" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/chem)
-"aD" = (/obj/machinery/light{dir = 1; in_use = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = 24},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/chem)
-"aE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"aF" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"aG" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1479; master_tag = "traitor_station_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = null},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"aH" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"aI" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor,/area/traitor/hall)
-"aJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/traitor/kitchen)
-"aK" = (/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor,/area/traitor/kitchen)
-"aL" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 0; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/traitor/kitchen)
-"aM" = (/obj/structure/closet/cabinet,/obj/item/clothing/under/syndicate/tacticool,/obj/item/clothing/shoes/jackboots,/obj/item/clothing/mask/gas/syndicate,/obj/item/clothing/gloves/color/black,/obj/item/weapon/storage/fancy/candle_box,/turf/simulated/floor,/area/traitor/kitchen)
-"aN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{dir = 8},/obj/machinery/light_switch{pixel_x = -24; pixel_y = 0},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/empty)
-"aO" = (/obj/machinery/chem_heater,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/chem)
-"aP" = (/obj/structure/stool,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/chem)
-"aQ" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/chem)
-"aR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/chem)
-"aS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/chem)
-"aT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"aU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"aV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"aW" = (/obj/structure/disposalpipe/junction{dir = 4; icon_state = "pipe-y"; tag = "icon-pipe-y (NORTH)"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"aX" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor,/area/traitor/hall)
-"aY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/junction{tag = "icon-pipe-y (NORTH)"; icon_state = "pipe-y"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/traitor/kitchen)
-"aZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/traitor/kitchen)
-"ba" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/traitor/kitchen)
-"bb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/traitor/kitchen)
-"bc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor,/area/traitor/kitchen)
-"bd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/kitchen)
-"be" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/empty)
-"bf" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/chem)
-"bg" = (/obj/machinery/chem_dispenser{broken_on_spawn = 1; energy = 0; recharged = 300},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/chem)
-"bh" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; name = "Chemistry Cleaner"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/chem)
-"bi" = (/obj/structure/closet/secure_closet/chemical,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/chem)
-"bj" = (/obj/machinery/power/apc/noalarm{pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/chem)
-"bk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/chem)
-"bl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"bm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"bn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"bo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"bp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor,/area/traitor/hall)
-"bq" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/traitor/kitchen)
-"br" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/traitor/kitchen)
-"bs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/traitor/kitchen)
-"bt" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/traitor/kitchen)
-"bu" = (/obj/machinery/alarm/monitor{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/empty)
-"bv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"bw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"bx" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"by" = (/obj/machinery/vending/dinnerware,/obj/machinery/light_switch{pixel_x = -24; pixel_y = 0},/turf/simulated/floor,/area/traitor/kitchen)
-"bz" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor,/area/traitor/kitchen)
-"bA" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/turf/simulated/floor,/area/traitor/kitchen)
-"bB" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor,/area/traitor/kitchen)
-"bC" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor,/area/traitor/kitchen)
-"bD" = (/obj/structure/computerframe,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/empty)
-"bE" = (/obj/machinery/teleport/station,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/empty)
-"bF" = (/obj/machinery/teleport/hub,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/empty)
-"bG" = (/obj/structure/disposalpipe/segment,/obj/structure/sign/poster{pixel_x = 32},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"bH" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/traitor/rnd)
-"bI" = (/turf/simulated/wall/r_wall,/area/traitor/rnd)
-"bJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"bK" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"bL" = (/turf/simulated/wall/r_wall,/area/traitor/tox)
-"bM" = (/obj/structure/sign/poster{pixel_y = 32},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"bN" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"bO" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"bP" = (/obj/structure/table,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"bQ" = (/obj/structure/dispenser,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"bR" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/rnd)
-"bS" = (/obj/machinery/constructable_frame/machine_frame,/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/traitor/rnd)
-"bT" = (/obj/structure/table,/obj/machinery/light{dir = 1},/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator{pixel_x = 5; pixel_y = 4},/obj/item/weapon/stock_parts/scanning_module,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/rnd)
-"bU" = (/obj/structure/table,/obj/structure/sign/poster{pixel_y = 32},/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/console_screen,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/rnd)
-"bV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"bW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"bX" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"bY" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/traitor/tox)
-"bZ" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/traitor/tox)
-"ca" = (/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/traitor/tox)
-"cb" = (/obj/machinery/atmospherics/unary/portables_connector,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/traitor/tox)
-"cc" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"cd" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"ce" = (/obj/machinery/atmospherics/binary/pump/highcap{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"cf" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/traitor/tox)
-"cg" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plating/airless,/area/space)
-"ch" = (/obj/structure/table,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin{pixel_x = -3; pixel_y = 2},/obj/machinery/alarm/monitor{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/rnd)
-"ci" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"cj" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/alarm/monitor{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"ck" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/traitor/tox)
-"cl" = (/obj/machinery/atmospherics/trinary/filter{req_access = null},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/traitor/tox)
-"cm" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"cn" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"co" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/traitor/tox)
-"cp" = (/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/traitor/rnd)
-"cq" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/rnd)
-"cr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/rnd)
-"cs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/rnd)
-"ct" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"cu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"cv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"cw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"cx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"cy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"cz" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"cA" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/traitor/tox)
-"cB" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"cC" = (/obj/machinery/atmospherics/binary/pump/highcap{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"cD" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plating,/area/traitor/tox)
-"cE" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/space,/area/space)
-"cF" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/wall/r_wall,/area/traitor/tox)
-"cG" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/engine,/area/traitor/tox)
-"cH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "n2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine,/area/traitor/tox)
-"cI" = (/turf/simulated/floor/engine,/area/traitor/tox)
-"cJ" = (/obj/structure/computer3frame,/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/traitor/rnd)
-"cK" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/rnd)
-"cL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/rnd)
-"cM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/rnd)
-"cN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/multi_tile/glass{dir = 3; name = "Research and Development"; req_access_txt = "0"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/rnd)
-"cO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"cP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"cQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"cR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"cS" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"cT" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/traitor/tox)
-"cU" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/traitor/tox)
-"cV" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/traitor/tox)
-"cW" = (/obj/machinery/atmospherics/binary/pump/highcap{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"cX" = (/obj/machinery/computer/general_air_control{frequency = 1222; name = "Bomb Mix Monitor"; sensors = list("burn_sensor" = "Burn Mix")},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"cY" = (/obj/machinery/igniter{icon_state = "igniter0"; id = "SyndieToxinsIgnitor"; on = 0},/turf/simulated/floor/engine,/area/traitor/tox)
-"cZ" = (/obj/machinery/air_sensor{id_tag = "burn_sensor"},/turf/simulated/floor/engine,/area/traitor/tox)
-"da" = (/obj/machinery/door/poddoor{id_tag = "SyndieToxVent"; name = "Toxins Venting Bay Door"; use_power = 0},/turf/simulated/floor/engine,/area/traitor/tox)
-"db" = (/obj/structure/cable,/obj/machinery/power/apc/noalarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/rnd)
-"dc" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"dd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"de" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"df" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"dg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"dh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"di" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"dj" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"dk" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"dl" = (/obj/machinery/atmospherics/binary/pump/highcap{dir = 4},/obj/machinery/ignition_switch{id = "SyndieToxinsIgnitor"; layer = 3.3; pixel_x = 21; pixel_y = 8},/obj/machinery/door_control{id = "SyndieToxVent"; layer = 3.3; pixel_x = 22; pixel_y = -8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"dm" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plating,/area/traitor/tox)
-"dn" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/space,/area/space)
-"do" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/wall/r_wall,/area/traitor/tox)
-"dp" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/engine,/area/traitor/tox)
-"dq" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/turf/simulated/floor/engine,/area/traitor/tox)
-"dr" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/rnd)
-"ds" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/light_switch{pixel_x = 24; pixel_y = 0},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/rnd)
-"dt" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/traitor/rnd)
-"du" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"dv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"; tag = "icon-pipe-j2"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"dw" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/cable,/obj/machinery/power/apc/noalarm{dir = 8; pixel_x = -24},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"dx" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/traitor/tox)
-"dy" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/traitor/tox)
-"dz" = (/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/traitor/tox)
-"dA" = (/obj/machinery/atmospherics/trinary/mixer{dir = 1; req_access = null},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/traitor/tox)
-"dB" = (/obj/machinery/atmospherics/trinary/mixer{dir = 1; req_access = null},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"dC" = (/obj/machinery/atmospherics/unary/tank/toxins{dir = 8; volume = 20000},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"dD" = (/obj/machinery/alarm/monitor{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"dE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"dF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/apc/noalarm{dir = 4; pixel_x = 24},/obj/structure/disposalpipe/segment,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"dG" = (/obj/machinery/light_switch{pixel_x = -24; pixel_y = 0},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"dH" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"dI" = (/obj/machinery/atmospherics/unary/tank/oxygen{dir = 8; volume = 20000},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"dJ" = (/mob/living/simple_animal/pet/cat/Syndi,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"dK" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"dL" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/tox)
-"dM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/bluespace_beacon{syndicate = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"dN" = (/turf/simulated/floor/plating,/area/traitor/hall)
-"dO" = (/obj/machinery/light{dir = 1},/obj/machinery/light_switch{pixel_y = 24},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"dP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"dQ" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"dR" = (/obj/machinery/light_switch{pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plating,/area/traitor/atmos)
-"dS" = (/obj/effect/decal/cleanable/blood/oil,/obj/machinery/power/apc/noalarm{dir = 1; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plating,/area/traitor/atmos)
-"dT" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plating,/area/traitor/atmos)
-"dU" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plating,/area/traitor/atmos)
-"dV" = (/obj/machinery/atmospherics/binary/volume_pump/on{dir = 8; name = "Air To Distro"},/turf/simulated/floor/plating,/area/traitor/atmos)
-"dW" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 10},/turf/simulated/floor/plating,/area/traitor/atmos)
-"dX" = (/obj/machinery/power/apc/noalarm{dir = 1; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/terminal{dir = 4},/turf/simulated/floor/plating,/area/traitor/atmos)
-"dY" = (/obj/machinery/power/smes{charge = 5e+006},/turf/simulated/floor/plating,/area/traitor/atmos)
-"dZ" = (/turf/simulated/wall/r_wall,/area/traitor/atmos)
-"ea" = (/obj/machinery/telecomms/relay/preset/ruskie,/turf/simulated/floor/plating,/area/traitor/hall)
-"eb" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plating,/area/traitor/hall)
-"ec" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"ed" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"ee" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"ef" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"eg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/traitor/atmos)
-"eh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/traitor/atmos)
-"ei" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/traitor/atmos)
-"ej" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/traitor/atmos)
-"ek" = (/obj/machinery/power/port_gen/pacman{anchored = 1},/turf/simulated/floor/plating,/area/traitor/atmos)
-"el" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plating,/area/traitor/hall)
-"em" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"en" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"eo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"ep" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/hall)
-"eq" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plating,/area/traitor/atmos)
-"er" = (/obj/machinery/atmospherics/trinary/filter{dir = 4; filter_type = 3; name = "Gas filter (CO2 tank)"; on = 1},/turf/simulated/floor/plating,/area/traitor/atmos)
-"es" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/traitor/atmos)
-"et" = (/obj/machinery/atmospherics/trinary/filter{dir = 4; name = "Gas filter (Toxins tank)"; on = 1},/turf/simulated/floor/plating,/area/traitor/atmos)
-"eu" = (/obj/machinery/atmospherics/trinary/filter{dir = 4; filter_type = 4; name = "Gas filter (N2O tank)"; on = 1},/turf/simulated/floor/plating,/area/traitor/atmos)
-"ev" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area/traitor/atmos)
-"ew" = (/turf/simulated/floor/plating,/area/traitor/atmos)
-"ex" = (/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/plating,/area/traitor/atmos)
-"ey" = (/turf/simulated/wall/r_wall,/area/traitor/inter)
-"ez" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"eA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"eB" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"eC" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/turf/simulated/floor/plating,/area/traitor/atmos)
-"eD" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/turf/simulated/floor/plating,/area/traitor/atmos)
-"eE" = (/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor/plating,/area/traitor/atmos)
-"eF" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plating,/area/traitor/atmos)
-"eG" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/traitor/atmos)
-"eH" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/traitor/atmos)
-"eI" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plating,/area/traitor/atmos)
-"eJ" = (/obj/structure/rack,/obj/machinery/door/window/eastright{name = "Gear Rack"},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/traitor/inter)
-"eK" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"eL" = (/obj/machinery/light_switch{pixel_y = 24},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"eM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"eN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"eO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"eP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"eQ" = (/obj/machinery/power/apc/noalarm{dir = 1; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"eR" = (/obj/structure/rack,/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Gear Rack"},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/traitor/inter)
-"eS" = (/obj/machinery/atmospherics/binary/volume_pump/on{name = "Waste"},/turf/simulated/floor/plating,/area/traitor/atmos)
-"eT" = (/obj/machinery/alarm/monitor{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plating,/area/traitor/atmos)
-"eU" = (/obj/structure/rack,/obj/machinery/door/window/eastright{name = "Gear Rack"},/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/traitor/inter)
-"eV" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor{icon_state = "dark"},/area/traitor/inter)
-"eW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "dark"},/area/traitor/inter)
-"eX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "dark"},/area/traitor/inter)
-"eY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "dark"},/area/traitor/inter)
-"eZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{icon_state = "dark"},/area/traitor/inter)
-"fa" = (/obj/structure/rack,/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Fitness Ring"},/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/traitor/inter)
-"fb" = (/obj/effect/spawner/window/reinforced,/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/traitor/atmos)
-"fc" = (/obj/structure/rack,/obj/machinery/door/window/eastright{name = "Gear Rack"},/obj/structure/window/reinforced,/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/traitor/inter)
-"fd" = (/obj/structure/table,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/traitor/inter)
-"fe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/traitor/inter)
-"ff" = (/obj/structure/stool/bed,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/remains/human,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/traitor/inter)
-"fg" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "dark"},/area/traitor/inter)
-"fh" = (/obj/structure/table,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/glasses/sunglasses/blindfold,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/traitor/inter)
-"fi" = (/obj/structure/rack,/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Fitness Ring"},/obj/structure/window/reinforced,/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/traitor/inter)
-"fj" = (/turf/simulated/floor/engine,/area/traitor/atmos)
-"fk" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/engine,/area/traitor/atmos)
-"fl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/light/small{dir = 8},/obj/machinery/alarm/monitor{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"fm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"fn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/traitor/inter)
-"fo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor{icon_state = "dark"},/area/traitor/inter)
-"fp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "dark"},/area/traitor/inter)
-"fq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "dark"},/area/traitor/inter)
-"fr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"fs" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "on"; id = "o2_in"; on = 1},/turf/simulated/floor/engine,/area/traitor/atmos)
-"ft" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "n2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine,/area/traitor/atmos)
-"fu" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"fv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"fw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"fx" = (/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/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"fy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"fz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"fA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"fB" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"fC" = (/turf/simulated/wall/r_wall,/area/traitor/radio)
-"fD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/multi_tile/glass,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/radio)
-"fE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/radio)
-"fF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Interrogation"; req_access_txt = "0"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/inter)
-"fG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/multi_tile/glass,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/surgery)
-"fH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/surgery)
-"fI" = (/obj/machinery/chem_dispenser/beer,/obj/structure/table,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/radio)
-"fJ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc/noalarm{dir = 1; pixel_y = 24},/obj/structure/table,/obj/machinery/chem_dispenser/soda,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/radio)
-"fK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light_switch{pixel_y = 24},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/radio)
-"fL" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/radio)
-"fM" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/radio)
-"fN" = (/obj/machinery/power/apc/noalarm{dir = 1; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{icon_state = "dark"},/area/traitor/inter)
-"fO" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor{icon_state = "dark"},/area/traitor/inter)
-"fP" = (/obj/machinery/light_switch{pixel_y = 24},/turf/simulated/floor{icon_state = "dark"},/area/traitor/inter)
-"fQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/surgery)
-"fR" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/surgery)
-"fS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = 24},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/surgery)
-"fT" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc/noalarm{dir = 1; pixel_y = 24},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/surgery)
-"fU" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/surgery)
-"fV" = (/obj/machinery/alarm/monitor{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/radio)
-"fW" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/radio)
-"fX" = (/obj/machinery/alarm/monitor{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "dark"},/area/traitor/inter)
-"fY" = (/obj/structure/stool/bed/chair,/obj/effect/decal/cleanable/blood,/turf/simulated/floor{icon_state = "dark"},/area/traitor/inter)
-"fZ" = (/turf/simulated/floor{icon_state = "dark"},/area/traitor/inter)
-"ga" = (/obj/machinery/alarm/monitor{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/surgery)
-"gb" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/surgery)
-"gc" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/radio)
-"gd" = (/obj/structure/table,/obj/item/device/radio/intercom/pirate,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/radio)
-"ge" = (/obj/structure/stool/bed/chair/office/light,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/radio)
-"gf" = (/obj/machinery/light/small,/turf/simulated/floor{icon_state = "dark"},/area/traitor/inter)
-"gg" = (/obj/machinery/optable,/obj/effect/decal/cleanable/blood,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/traitor/surgery)
-"gh" = (/obj/structure/table,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/surgery)
-"gi" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/traitor/radio)
-"gj" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/weapon/lighter/zippo/engraved,/obj/item/ashtray/glass{pixel_y = 7},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/radio)
-"gk" = (/obj/structure/table,/obj/item/weapon/paper/djstation{info = "Welcome new owner!
You have purchased the latest in listening equipment. The telecommunication setup we created is the best in listening to common and private radio fequencies. Here is a step by step guide to start listening in on those saucy radio channels:
- Equip yourself with a multi-tool
- Use the multitool on each machine, that is the broadcaster, receiver and the relay.
- Turn all the machines on, it has already been configured for you to listen on.
Simple as that. Now to listen to the private channels, you'll have to configure the intercoms, located on the front desk. Here is a list of frequencies for you to listen on.
- 145.7 - Common Channel
- 144.7 - Private AI Channel
- 135.9 - Security Channel
- 135.7 - Engineering Channel
- 135.5 - Medical Channel
- 135.3 - Command Channel
- 135.1 - Science Channel
- 134.7 - Supply Channel
"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/radio)
-"gl" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/surgery)
-"gm" = (/obj/machinery/bodyscanner,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/traitor/surgery)
-"gn" = (/obj/machinery/body_scanconsole,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/traitor/surgery)
-"go" = (/obj/machinery/light/small,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/surgery)
-"gp" = (/obj/structure/table,/obj/item/stack/rods,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/surgery)
-"gq" = (/obj/structure/table,/obj/item/weapon/hatchet,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/traitor/surgery)
-
-(1,1,1) = {"
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacadacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaeafagabahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafafaiajakalalalajajamanananananaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaoaoaoapapapapacaqacajarasatauavajawaxaxaxaxanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoayazaAaBaCaDaEaFaGaHaIaJaKaLataMajaNaxaxaxaxanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaOaPaQaRaSaSaTaUaVaWaXaYaZbabbbcbdbeaxaxaxaxanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobfbgbhbibjbkblbmbnbobpbqbrbsatbtajbuaxaxaxaxanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaoaoaoapapapapbvbwbxajbybzbAbBbCajaxbDbEbFaxamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbvbwbGajajalalalajajamanananamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHbHbHbHbHbHbIbIbIbvbJbKbLbMbNbNbNbNbObNbNbNbPbQbLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHbRbRbRbRbSbTbUbIbVbWbXbLbNbYbYbZbZbNcacbcccdcecfcgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHbRbRbRbRbRbRchbIbvbwcibLcjbYbYbZbZbNckclcmcnbNcoaabLbLbLbLbLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHbRbScpbScqcrcrcsctcucvcwcxcycycycyczcacAcmcBcCcDcEcFcGcHcIbLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHbRcJcpbScKcLcMcNcOcPcQcRcSbNcTcUcVbNbNbNcWbNcXcoaacocYcZcIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHbRbRbRbRbRbRdbbIdcdddedfdgdhdhdhdhdicbcadjdkdldmdndodpdqcIbLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHbRbRbRbRbRdrdsdtaFdudvbLdwdxdydzdzbNdAcVdBcCdCcoaabLbLbLbLbLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHbHbHbHbHbHbIbIbIdDdEdFbLdGdxdydzdzbNcAcadHcCdIcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdJbwdKbLbNdLbNbNbNbNbNbNbNdLbNbLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacababababdcdMdKbLbLbLbLbLcococococobLbLbLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdNdNdNdcdcdcdOdcbJdedPaUdQdRdSdTdTdUdVdWdXdYdZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdNeaebaUaUaUaUaUecedeeeeefegehegegegegeiejekdZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdNdNelememememeneoepememdQeqereseteseuevewexdZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaceyeyeyeyezeAeBeyeyeyeyeCeDeEeseFeGeHeIdZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeyeJeKeLeMeNeOePeQeReyeweSeweTeweGewewdZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeyeUeKeVeWeXeYeZeKfaeydZfbdZdZdZfbdZdZdZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeyfceKfdfefffgfheKfieyfjfkfjdZfjfkfjdZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeyflfmfnfofpfqfnfmfreyfjfsfjdZfjftfjdZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeyfufvfwfwfxfyfzfAfBeyfjfjfjdZfjfjfjdZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfCfCfCfDfEeyeyfFeyeyfGfHeyfCfCfCdZdZdZdZdZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfIfJfKfLfMeyfNfOfPeyfQfRfSfTfUfCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfVfWfWfWfWeyfXfYfZeygagbgbgbgbfCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCgcgdgegdfWeyfZgffZeygbgbgggbghfCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagifWgjgdgkfWeyeyeyeyeygbgbgbgbglfCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagifWfWfWfWfWgiaaaaaafCgmgngogpgqfCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagigigigigigigiaaaaaafCfCfCfCfCfCfCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-"}
diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index a7fe9ddd537..3f287964e02 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -214,6 +214,7 @@ Pipelines + Other Objects -> Pipe network
initialize_directions = P
var/turf/T = loc
level = T.intact ? 2 : 1
+ add_fingerprint(usr)
initialize()
var/list/nodes = pipeline_expansion()
for(var/obj/machinery/atmospherics/A in nodes)
diff --git a/code/ATMOSPHERICS/pipes/pipe.dm b/code/ATMOSPHERICS/pipes/pipe.dm
index 7041d13993d..b02d990b432 100644
--- a/code/ATMOSPHERICS/pipes/pipe.dm
+++ b/code/ATMOSPHERICS/pipes/pipe.dm
@@ -13,7 +13,6 @@
buckle_requires_restraints = 1
buckle_lying = -1
-
/obj/machinery/atmospherics/pipe/New()
..()
//so pipes under walls are hidden
diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm
index 2d2a5b24e54..80127669417 100644
--- a/code/LINDA/LINDA_turf_tile.dm
+++ b/code/LINDA/LINDA_turf_tile.dm
@@ -1,17 +1,17 @@
-turf
+/turf
var/pressure_difference = 0
var/pressure_direction = 0
var/atmos_adjacent_turfs = 0
var/atmos_adjacent_turfs_amount = 0
var/atmos_supeconductivity = 0
-turf/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air
- del(giver)
+/turf/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air
+ qdel(giver)
return 0
-turf/return_air()
+/turf/return_air()
//Create gas mixture to hold data for passing
var/datum/gas_mixture/GM = new
@@ -24,7 +24,7 @@ turf/return_air()
return GM
-turf/remove_air(amount as num)
+/turf/remove_air(amount as num)
var/datum/gas_mixture/GM = new
var/sum = oxygen + carbon_dioxide + nitrogen + toxins
@@ -39,7 +39,7 @@ turf/remove_air(amount as num)
return GM
-turf/simulated
+/turf/simulated
var/datum/excited_group/excited_group
var/excited = 0
var/recently_active = 0
@@ -53,9 +53,10 @@ turf/simulated
var/atmos_overlay_type = "" //current active overlay
-turf/simulated/New()
+/turf/simulated/New()
..()
+ visibilityChanged()
if(!blocks_air)
air = new
@@ -66,12 +67,13 @@ turf/simulated/New()
air.temperature = temperature
-turf/simulated/Del()
+/turf/simulated/Del()
+ visibilityChanged()
if(active_hotspot)
qdel(active_hotspot)
..()
-turf/simulated/assume_air(datum/gas_mixture/giver)
+/turf/simulated/assume_air(datum/gas_mixture/giver)
if(!giver) return 0
var/datum/gas_mixture/receiver = air
if(istype(receiver))
@@ -84,22 +86,22 @@ turf/simulated/assume_air(datum/gas_mixture/giver)
else return ..()
-turf/simulated/proc/copy_air_with_tile(turf/simulated/T)
+/turf/simulated/proc/copy_air_with_tile(turf/simulated/T)
if(istype(T) && T.air && air)
air.copy_from(T.air)
-turf/simulated/proc/copy_air(datum/gas_mixture/copy)
+/turf/simulated/proc/copy_air(datum/gas_mixture/copy)
if(air && copy)
air.copy_from(copy)
-turf/simulated/return_air()
+/turf/simulated/return_air()
if(air)
return air
else
return ..()
-turf/simulated/remove_air(amount as num)
+/turf/simulated/remove_air(amount as num)
if(air)
var/datum/gas_mixture/removed = null
@@ -112,7 +114,7 @@ turf/simulated/remove_air(amount as num)
else
return ..()
-turf/simulated/proc/mimic_temperature_solid(turf/model, conduction_coefficient)
+/turf/simulated/proc/mimic_temperature_solid(turf/model, conduction_coefficient)
var/delta_temperature = (temperature_archived - model.temperature)
if((heat_capacity > 0) && (abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER))
@@ -120,7 +122,7 @@ turf/simulated/proc/mimic_temperature_solid(turf/model, conduction_coefficient)
(heat_capacity*model.heat_capacity/(heat_capacity+model.heat_capacity))
temperature -= heat/heat_capacity
-turf/simulated/proc/share_temperature_mutual_solid(turf/simulated/sharer, conduction_coefficient)
+/turf/simulated/proc/share_temperature_mutual_solid(turf/simulated/sharer, conduction_coefficient)
var/delta_temperature = (temperature_archived - sharer.temperature_archived)
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER && heat_capacity && sharer.heat_capacity)
@@ -287,10 +289,10 @@ turf/simulated/proc/share_temperature_mutual_solid(turf/simulated/sharer, conduc
-atom/movable/var/pressure_resistance = 5
-atom/movable/var/last_forced_movement = 0
+/atom/movable/var/pressure_resistance = 5
+/atom/movable/var/last_forced_movement = 0
-atom/movable/proc/experience_pressure_difference(pressure_difference, direction)
+/atom/movable/proc/experience_pressure_difference(pressure_difference, direction)
if(last_forced_movement >= air_master.current_cycle)
return 0
else if(!anchored && !pulledby)
diff --git a/code/_DATASTRUCTURES/heap.dm b/code/_DATASTRUCTURES/heap.dm
new file mode 100644
index 00000000000..7246eff8771
--- /dev/null
+++ b/code/_DATASTRUCTURES/heap.dm
@@ -0,0 +1,75 @@
+
+//////////////////////
+//Heap object
+//////////////////////
+
+/Heap
+ var/list/L
+ var/cmp
+
+/Heap/New(compare)
+ L = new()
+ cmp = compare
+
+/Heap/proc/IsEmpty()
+ return !L.len
+
+//Insert and place at its position a new node in the heap
+/Heap/proc/Insert(atom/A)
+
+ L.Add(A)
+ Swim(L.len)
+
+//removes and returns the first element of the heap
+//(i.e the max or the min dependant on the comparison function)
+/Heap/proc/Pop()
+ if(!L.len)
+ return 0
+ . = L[1]
+
+ L[1] = L[L.len]
+ L.Cut(L.len)
+
+ Sink(1)
+
+//Get a node up to its right position in the heap
+/Heap/proc/Swim(var/index)
+ var/parent = round(index * 0.5)
+
+ while(parent > 0 && (call(cmp)(L[index],L[parent]) > 0))
+ L.Swap(index,parent)
+ index = parent
+ parent = round(index * 0.5)
+
+//Get a node down to its right position in the heap
+/Heap/proc/Sink(var/index)
+ var/g_child = GetGreaterChild(index)
+
+ while(g_child > 0 && (call(cmp)(L[index],L[g_child]) < 0))
+ L.Swap(index,g_child)
+ index = g_child
+ g_child = GetGreaterChild(index)
+
+//Returns the greater (relative to the comparison proc) of a node children
+//or 0 if there's no child
+/Heap/proc/GetGreaterChild(var/index)
+ if(index * 2 > L.len)
+ return 0
+
+ if(index * 2 + 1 > L.len)
+ return index * 2
+
+ if(call(cmp)(L[index * 2],L[index * 2 + 1]) < 0)
+ return index * 2 + 1
+ else
+ return index * 2
+
+//Replaces a given node so it verify the heap condition
+/Heap/proc/ReSort(atom/A)
+ var/index = L.Find(A)
+
+ Swim(index)
+ Sink(index)
+
+/Heap/proc/List()
+ . = L.Copy()
diff --git a/code/_DATASTRUCTURES/linked_lists.dm b/code/_DATASTRUCTURES/linked_lists.dm
new file mode 100644
index 00000000000..eccc3c422a8
--- /dev/null
+++ b/code/_DATASTRUCTURES/linked_lists.dm
@@ -0,0 +1,191 @@
+
+//Ok so it's technically a double linked list, bite me.
+
+/datum/linked_list
+ var/datum/linked_node/head
+ var/datum/linked_node/tail
+ var/node_amt = 0
+
+
+/datum/linked_node
+ var/value = null
+ var/datum/linked_list/linked_list = null
+ var/datum/linked_node/next_node = null
+ var/datum/linked_node/previous_node = null
+
+
+/datum/linked_list/proc/IsEmpty()
+ . = (node_amt <= 0)
+
+
+//Add a linked_node (or value, creating a linked_node) at position
+//the added node BECOMES the position-th element,
+//eg: add("Test",5), the 5th node is now "Test", the previous 5th moves up to become the 6th
+/datum/linked_list/proc/Add(node, position)
+ var/datum/linked_node/adding
+ if(istype(node, /datum/linked_node))
+ adding = node
+ else
+ adding = new()
+ adding.value = node
+
+ if(!adding.linked_list || (adding.linked_list && (adding.linked_list != src)))
+ node_amt++
+
+ adding.linked_list = src
+
+ if(position && position < node_amt)
+ //Replacing head
+ if(position == 1)
+ if(head)
+ head.previous_node = adding
+ adding.next_node = head
+ head = adding
+
+ //Replacing any middle node
+ else
+ var/location = 0
+ var/datum/linked_node/at
+ while((location != position) && (location <= node_amt))
+ if(at)
+ if(at.next_node)
+ at = at.next_node
+ else
+ break
+ else
+ at = head
+ location++
+
+ //Push at up and assume it's place as the position-th element
+ if(at && at.previous_node)
+ at.previous_node.next_node = adding
+ adding.previous_node = at.previous_node
+ at.previous_node = adding
+ adding.next_node = at
+ return
+
+ //Replacing tail
+ if(tail)
+ tail.next_node = adding
+ adding.previous_node = tail
+ if(!tail.previous_node)
+ head = tail
+ tail = adding
+
+
+
+//Remove a linked_node or the linked_node of a value
+//If you specify a value the FIRST ONE is removed
+/datum/linked_list/proc/Remove(node)
+ var/datum/linked_node/removing
+ if(istype(node,/datum/linked_node))
+ removing = node
+ else
+ //optimise removing head and tail, no point looping for them, especially the tail
+ if(removing == head)
+ removing = head
+ else if(removing == tail)
+ removing = tail
+ else
+ var/location = 1
+ var/current_value = null
+ var/datum/linked_node/at = null
+ while((current_value != node) && (location <= node_amt))
+ if(at)
+ if(at.next_node)
+ at = at.next_node
+ else
+ at = head
+ location++
+ if(at)
+ current_value = at.value
+ if(current_value == node)
+ removing = at
+ break
+
+ //Adjust pointers of where removing -was- in the chain.
+ if(removing)
+ if(removing.previous_node)
+ if(removing == tail)
+ tail = removing.previous_node
+ if(removing.next_node)
+ if(removing == head)
+ head = removing.next_node
+ removing.next_node.previous_node = removing.previous_node
+ removing.previous_node.next_node = removing.next_node
+ else
+ removing.previous_node.next_node = null
+ else
+ if(removing.next_node)
+ if(removing == head)
+ head = removing.next_node
+ removing.next_node.previous_node = null
+
+ //if this is still true at this point, there's no more nodes to replace them with
+ if(removing == head)
+ head = null
+ if(removing == tail)
+ tail = null
+
+ removing.next_node = null
+ removing.previous_node = null
+ if(removing.linked_list == src)
+ node_amt--
+ removing.linked_list = null
+
+ return removing
+ return 0
+
+
+//Removes and deletes a node or value
+/datum/linked_list/proc/RemoveDelete(node)
+ var/datum/linked_node/dead = Remove(node)
+ if(dead)
+ qdel(dead)
+ return 1
+ return 0
+
+
+//Empty the linked_list, deleting all nodes
+/datum/linked_list/proc/Empty()
+ var/datum/linked_node/n = head
+ while(n)
+ var/next = n.next_node
+ Remove(n)
+ qdel(n)
+ n = next
+ node_amt = 0
+
+
+//Some debugging tools
+/datum/linked_list/proc/CheckNodeLinks()
+ var/datum/linked_node/n = head
+ while(n)
+ . = "|[n.value]|"
+ if(n.previous_node)
+ . = "[n.previous_node.value]<-" + .
+ if(n.next_node)
+ . += "->[n.next_node.value]"
+ n = n.next_node
+ . += "
"
+
+
+/datum/linked_list/proc/DrawNodeLinks()
+ . = "|<-"
+ var/datum/linked_node/n = head
+ while(n)
+ if(n.previous_node)
+ . += "<-"
+ . += "[n.value]"
+ if(n.next_node)
+ . += "->"
+ n = n.next_node
+ . += "->|"
+
+
+/datum/linked_list/proc/ToList()
+ . = list()
+ var/datum/linked_node/n = head
+ while(n)
+ . += n
+ n = n.next_node
\ No newline at end of file
diff --git a/code/_DATASTRUCTURES/priority_queue.dm b/code/_DATASTRUCTURES/priority_queue.dm
new file mode 100644
index 00000000000..8689a19f4e4
--- /dev/null
+++ b/code/_DATASTRUCTURES/priority_queue.dm
@@ -0,0 +1,83 @@
+
+//////////////////////
+//PriorityQueue object
+//////////////////////
+
+//an ordered list, using the cmp proc to weight the list elements
+/PriorityQueue
+ var/list/L //the actual queue
+ var/cmp //the weight function used to order the queue
+
+/PriorityQueue/New(compare)
+ L = new()
+ cmp = compare
+
+/PriorityQueue/proc/IsEmpty()
+ return !L.len
+
+//return the index the element should be in the priority queue using dichotomic search
+/PriorityQueue/proc/FindElementIndex(atom/A)
+ var/i = 1
+ var/j = L.len
+ var/mid
+
+ while(i < j)
+ mid = round((i+j)/2)
+
+ if(call(cmp)(L[mid],A) < 0)
+ i = mid + 1
+ else
+ j = mid
+
+ if(i == 1 || i == L.len) //edge cases
+ return (call(cmp)(L[i],A) > 0) ? i : i+1
+ else
+ return i
+
+
+//add an element in the list,
+//immediatly ordering it to its position using dichotomic search
+/PriorityQueue/proc/Enqueue(atom/A)
+ if(!L.len)
+ L.Add(A)
+ return
+
+ L.Insert(FindElementIndex(A),A)
+
+//removes and returns the first element in the queue
+/PriorityQueue/proc/Dequeue()
+ if(!L.len)
+ return 0
+ . = L[1]
+
+ Remove(.)
+
+//removes an element
+/PriorityQueue/proc/Remove(atom/A)
+ return L.Remove(A)
+
+//returns a copy of the elements list
+/PriorityQueue/proc/List()
+ . = L.Copy()
+
+//return the position of an element or 0 if not found
+/PriorityQueue/proc/Seek(atom/A)
+ . = L.Find(A)
+
+//return the element at the i_th position
+/PriorityQueue/proc/Get(i)
+ if(i > L.len || i < 1)
+ return 0
+ return L[i]
+
+//replace the passed element at it's right position using the cmp proc
+/PriorityQueue/proc/ReSort(atom/A)
+ var/i = Seek(A)
+ if(i == 0)
+ return
+ while(i < L.len && call(cmp)(L[i],L[i+1]) > 0)
+ L.Swap(i,i+1)
+ i++
+ while(i > 1 && call(cmp)(L[i],L[i-1]) <= 0) //last inserted element being first in case of ties (optimization)
+ L.Swap(i,i-1)
+ i--
\ No newline at end of file
diff --git a/code/_DATASTRUCTURES/stacks.dm b/code/_DATASTRUCTURES/stacks.dm
new file mode 100644
index 00000000000..b310a3b9401
--- /dev/null
+++ b/code/_DATASTRUCTURES/stacks.dm
@@ -0,0 +1,56 @@
+/datum/stack
+ var/list/stack = list()
+ var/max_elements = 0
+
+/datum/stack/New(list/elements,max)
+ ..()
+ if(elements)
+ stack = elements.Copy()
+ if(max)
+ max_elements = max
+
+/datum/stack/proc/Pop()
+ if(is_empty())
+ return null
+ . = stack[stack.len]
+ stack.Cut(stack.len,0)
+
+/datum/stack/proc/Push(element)
+ if(max_elements && (stack.len+1 > max_elements))
+ return null
+ stack += element
+
+/datum/stack/proc/Top()
+ if(is_empty())
+ return null
+ . = stack[stack.len]
+
+/datum/stack/proc/is_empty()
+ . = stack.len ? 0 : 1
+
+//Rotate entire stack left with the leftmost looping around to the right
+/datum/stack/proc/RotateLeft()
+ if(is_empty())
+ return 0
+ . = stack[1]
+ stack.Cut(1,2)
+ Push(.)
+
+//Rotate entire stack to the right with the rightmost looping around to the left
+/datum/stack/proc/RotateRight()
+ if(is_empty())
+ return 0
+ . = stack[stack.len]
+ stack.Cut(stack.len,0)
+ stack.Insert(1,.)
+
+
+/datum/stack/proc/Copy()
+ var/datum/stack/S=new()
+ S.stack = stack.Copy()
+ S.max_elements = max_elements
+ return S
+
+
+/datum/stack/proc/Clear()
+ stack.Cut()
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index ced91ac0287..6de010d5f60 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -8,9 +8,8 @@
#define ZLEVEL_ENGI 4
#define ZLEVEL_ASTEROID 5
#define ZLEVEL_DERELICT 6
-#define ZLEVEL_SYNDIE 7
-#define ZLEVEL_EMPTY 8
-#define MAX_Z 8 // Used in space.dm to defince which Z-levels cannot be exited via space.
+#define ZLEVEL_EMPTY 7
+#define MAX_Z 7 // Used in space.dm to defince which Z-levels cannot be exited via space.
#define TRANSITIONEDGE 7 //Distance from edge to move to another z-level
///
@@ -163,4 +162,9 @@
#define MAT_BANANIUM "$bananium"
#define MAX_STACK_SIZE 50
-//The maximum size of a stack object.
\ No newline at end of file
+
+//unmagic-strings for types of polls
+#define POLLTYPE_OPTION "OPTION"
+#define POLLTYPE_TEXT "TEXT"
+#define POLLTYPE_RATING "NUMVAL"
+#define POLLTYPE_MULTI "MULTICHOICE"
\ No newline at end of file
diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm
index cab30ebe8de..5442c621e1b 100644
--- a/code/__DEFINES/mob.dm
+++ b/code/__DEFINES/mob.dm
@@ -100,4 +100,9 @@
// AI wire/radio settings
#define AI_CHECK_WIRELESS 1
-#define AI_CHECK_RADIO 2
\ No newline at end of file
+#define AI_CHECK_RADIO 2
+
+#define POCKET_STRIP_DELAY 40 //time taken (in deciseconds) to search somebody's pockets
+
+#define DEFAULT_ITEM_STRIP_DELAY 40 //time taken (in deciseconds) to strip somebody
+#define DEFAULT_ITEM_PUTON_DELAY 20 //time taken (in deciseconsd) to reverse-strip somebody
\ No newline at end of file
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index d8f402a5233..80b54678f14 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -169,93 +169,6 @@ Turf and target are seperate in case you want to teleport some distance from a t
return destination
-///////////////////
-//A* helpers procs
-///////////////////
-
-// Returns true if a link between A and B is blocked
-// Movement through doors allowed if ID has access
-/proc/LinkBlockedWithAccess(turf/A, turf/B, obj/item/weapon/card/id/ID)
-
- if(A == null || B == null) return 1
- var/adir = get_dir(A,B)
- var/rdir = get_dir(B,A)
- if(adir & (adir-1)) // diagonal
- var/turf/iStep = get_step(A,adir&(NORTH|SOUTH))
- if(!iStep.density && !LinkBlockedWithAccess(A,iStep, ID) && !LinkBlockedWithAccess(iStep,B,ID))
- return 0
-
- var/turf/pStep = get_step(A,adir&(EAST|WEST))
- if(!pStep.density && !LinkBlockedWithAccess(A,pStep,ID) && !LinkBlockedWithAccess(pStep,B,ID))
- return 0
-
- return 1
-
- if(DirBlockedWithAccess(A,adir, ID))
- return 1
-
- if(DirBlockedWithAccess(B,rdir, ID))
- return 1
-
- for(var/obj/O in B)
- if(O.density && !istype(O, /obj/machinery/door) && !(O.flags & ON_BORDER))
- return 1
-
- return 0
-
-// Returns true if direction is blocked from loc
-// Checks doors against access with given ID
-/proc/DirBlockedWithAccess(turf/loc,var/dir,var/obj/item/weapon/card/id/ID)
- for(var/obj/structure/window/D in loc)
- if(!D.density) continue
- if(D.dir == SOUTHWEST) return 1 //full-tile window
- if(D.dir == dir) return 1 //matching border window
-
- for(var/obj/machinery/door/D in loc)
- if(!D.CanAStarPass(ID,dir))
- return 1
- return 0
-
-// Returns true if a link between A and B is blocked
-// Movement through doors allowed if door is open
-/proc/LinkBlocked(turf/A, turf/B)
- if(A == null || B == null)
- return 1
- var/adir = get_dir(A,B)
- var/rdir = get_dir(B,A)
- if(adir & (adir-1)) //diagonal
- var/turf/iStep = get_step(A,adir & (NORTH|SOUTH)) //check the north/south component
- if(!iStep.density && !LinkBlocked(A,iStep) && !LinkBlocked(iStep,B))
- return 0
-
- var/turf/pStep = get_step(A,adir & (EAST|WEST)) //check the east/west component
- if(!pStep.density && !LinkBlocked(A,pStep) && !LinkBlocked(pStep,B))
- return 0
-
- return 1
-
- if(DirBlocked(A,adir)) return 1
- if(DirBlocked(B,rdir)) return 1
-
- for(var/obj/O in B)
- if(O.density && !istype(O, /obj/machinery/door) && !(O.flags & ON_BORDER))
- return 1
-
- return 0
-
-// Returns true if a link is blocked and neither location has something climbable on
-// Used for inventory checks
-/proc/LinkBlockedUnclimbable(turf/A, turf/B)
- if (!LinkBlocked(A, B))
- return 0
- for (var/obj/structure/S in A.contents)
- if(S.climbable)
- return 0
- for (var/obj/structure/S in B.contents)
- if(S.climbable)
- return 0
- return 1
-
// Returns true if direction is blocked from loc
// Checks if doors are open
/proc/DirBlocked(turf/loc,var/dir)
diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm
index f6e02c32602..d6fc14b4f3f 100644
--- a/code/_globalvars/lists/misc.dm
+++ b/code/_globalvars/lists/misc.dm
@@ -21,4 +21,4 @@ var/list/restricted_camera_networks = list( //Those networks can only be accesse
"UO45",
"UO45R",
"Xeno"
- )
\ No newline at end of file
+ )
diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm
index 27da3c1fd4b..452911908bc 100644
--- a/code/_globalvars/lists/mobs.dm
+++ b/code/_globalvars/lists/mobs.dm
@@ -24,7 +24,8 @@ var/global/list/dead_mob_list = list() //List of all dead mobs, including cli
var/global/list/respawnable_list = list() //List of all mobs, dead or in mindless creatures that still be respawned.
//global var of unsafe-to-spawn-on-reaction mobs
-var/global/list/blocked_mobs = list(/mob/living/simple_animal/hostile,
+var/global/list/blocked_mobs = list(/mob/living/simple_animal,
+ /mob/living/simple_animal/hostile,
/mob/living/simple_animal/hostile/pirate,
/mob/living/simple_animal/hostile/pirate/ranged,
/mob/living/simple_animal/hostile/russian,
diff --git a/code/_globalvars/lists/reagents.dm b/code/_globalvars/lists/reagents.dm
new file mode 100644
index 00000000000..8088219e149
--- /dev/null
+++ b/code/_globalvars/lists/reagents.dm
@@ -0,0 +1,12 @@
+// Base chemicals
+var/list/base_chemicals = list("water","oxygen","nitrogen","hydrogen","potassium","mercury","carbon","chlorine","fluorine","phosphorus","lithium","sulfur","sacid","radium","iron","aluminum","silicon","sugar","ethanol")
+// Standard chemicals
+var/list/standard_chemicals = list("slimejelly","blood","water","lube","charcoal","toxin","cyanide","morphine","epinephrine","space_drugs","serotrotium","oxygen","copper","nitrogen","hydrogen","potassium","mercury","sulfur","carbon","chlorine","fluorine","sodium","phosphorus","lithium","sugar","sacid","facid","glycerol","radium","mutadone","thermite","mutagen","virusfood","iron","gold","silver","uranium","aluminum","silicon","fuel","cleaner","atrazine","plasma","teporone","lexorin","silver_sulfadiazine","salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol","potass_iodide","pen_acid","mannitol","oculine","styptic_powder","methamphetamine","cryoxadone","spaceacillin","carpotoxin","lsd","fluorosurfactant","fluorosurfactant","ethanol","ammonia","diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin","frostoil","amanitin","psilocybin","enzyme","nothing","salglu_solution","antifreeze","neurotoxin")
+// Rare chemicals
+var/list/rare_chemicals = list("minttoxin","nanites","xenomicrobes","adminordrazine")
+// Standard medicines
+var/list/standard_medicines = list("charcoal","toxin","cyanide","morphine","epinephrine","space_drugs","serotrotium","mutadone","mutagen","teporone","lexorin","silver_sulfadiazine","salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol","potass_iodide","pen_acid","mannitol","oculine","styptic_powder","methamphetamine","spaceacillin","carpotoxin","lsd","ethanol","ammonia","diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin","frostoil","amanitin","psilocybin","nothing","salglu_solution","neurotoxin")
+// Rare medicines
+var/list/rare_medicines = list("nanites","xenomicrobes","minttoxin","adminordrazine","blood")
+// Drinks
+var/list/drinks = list("beer2","hot_coco","orangejuice","tomatojuice","limejuice","carrotjuice","berryjuice","poisonberryjuice","watermelonjuice","lemonjuice","banana","nothing","potato","milk","soymilk","cream","coffee","tea","icecoffee","icetea","cola","nuka_cola","spacemountainwind","thirteenloko","dr_gibb","space_up","lemon_lime","beer","whiskey","gin","rum","vodka","holywater","tequilla","vermouth","wine","tonic","kahlua","cognac","ale","sodawater","ice","bilk","atomicbomb","threemileisland","goldschlager","patron","gintonic","cubalibre","whiskeycola","martini","vodkamartini","whiterussian","screwdrivercocktail","booger","bloodymary","gargleblaster","bravebull","tequillasunrise","toxinsspecial","beepskysmash","salglu_solution","irishcream","manlydorf","longislandicedtea","moonshine","b52","irishcoffee","margarita","blackrussian","manhattan","manhattan_proj","whiskeysoda","antifreeze","barefoot","snowwhite","demonsblood","vodkatonic","ginfizz","bahama_mama","singulo","sbiten","devilskiss","red_mead","mead","iced_beer","grog","aloe","andalusia","alliescocktail","soy_latte","cafe_latte","acidspit","amasec","neurotoxin","hippiesdelight","bananahonk","silencer","changelingsting","irishcarbomb","syndicatebomb","erikasurprise","driestmartini")
\ No newline at end of file
diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm
index b319f9259b9..bb9d4f354eb 100644
--- a/code/_globalvars/misc.dm
+++ b/code/_globalvars/misc.dm
@@ -48,6 +48,7 @@ var/score_allarrested = 0 // did the crew catch all the enemies alive?
var/score_opkilled = 0 // used during nuke mode, how many operatives died?
var/score_disc = 0 // is the disc safe and secure?
var/score_nuked = 0 // was the station blown into little bits?
+var/score_nuked_penalty = 0 //penalty for getting blown to bits
// these ones are mainly for the stat panel
var/score_powerbonus = 0 // if all APCs on the station are running optimally, big bonus
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 640109b99cd..4479925d5e3 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -450,7 +450,7 @@
if("Allow Item Use")
if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes.
return
- if(!istype(usr.equipped(),/obj/item/weapon/gun))
+ if(!istype(usr.get_active_hand(), /obj/item/weapon/gun))
usr << "You need your gun in your active hand to do that!"
return
usr.client.AllowTargetClick()
@@ -460,7 +460,7 @@
if("Disallow Item Use")
if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes.
return
- if(!istype(usr.equipped(),/obj/item/weapon/gun))
+ if(!istype(usr.get_active_hand(), /obj/item/weapon/gun))
usr << "You need your gun in your active hand to do that!"
return
usr.client.AllowTargetClick()
diff --git a/code/datums/gas_mixture.dm b/code/datums/gas_mixture.dm
index 8676aaf27c5..36f32221f0e 100644
--- a/code/datums/gas_mixture.dm
+++ b/code/datums/gas_mixture.dm
@@ -53,6 +53,10 @@ What are the archived variables for?
var/tmp/fuel_burnt = 0
+/datum/gas_mixture/Destroy()
+ ..()
+ return QDEL_HINT_QUEUE
+
//PV=nRT - related procedures
/datum/gas_mixture/proc/heat_capacity()
var/heat_capacity = HEAT_CAPACITY_CALCULATION(oxygen,carbon_dioxide,nitrogen,toxins)
@@ -319,7 +323,7 @@ What are the archived variables for?
trace_gases += corresponding
corresponding.moles += trace_gas.moles
-// del(giver)
+// qdel(giver)
return 1
/datum/gas_mixture/remove(amount)
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 05a8971bc50..c287c00975d 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -211,7 +211,7 @@ var/list/uplink_items = list()
/datum/uplink_item/jobspecific/telegun
name = "Telegun"
- desc = "An extremely high-tech energy gun that utilizes bluespace technology to teleport away living targets; will teleport targets to the same beacon a teleporter is locked onto."
+ desc = "An extremely high-tech energy gun that utilizes bluespace technology to teleport away living targets. Select the target beacon on the telegun itself; projectiles will send targets to the beacon locked onto."
reference = "TG"
item = /obj/item/weapon/gun/energy/telegun
cost = 12
@@ -511,7 +511,7 @@ var/list/uplink_items = list()
item = /obj/item/weapon/soap/syndie
cost = 1
surplus = 50
-
+
/datum/uplink_item/stealthy_weapons/dart_pistol
name = "Dart Pistol"
desc = "A miniaturized version of a normal syringe gun. It is very quiet when fired and can fit into any space a small item can."
@@ -767,11 +767,11 @@ var/list/uplink_items = list()
cost = 3
gamemodes = list("nuclear emergency")
-/datum/uplink_item/device_tools/pdapinpointer
- name = "PDA Pinpointer"
- desc = "A pinpointer that tracks any PDA on the station. Useful for locating assassination targets or other high-value targets that you can't find. WARNING: Can only set once."
- reference = "PDAP"
- item = /obj/item/weapon/pinpointer/pdapinpointer
+/datum/uplink_item/device_tools/advpinpointer
+ name = "Advanced Pinpointer"
+ desc = "A pinpointer that tracks any specified coordinates, DNA string, high value item or the nuclear authentication disk."
+ reference = "ADVP"
+ item = /obj/item/weapon/pinpointer/advpinpointer
cost = 4
/datum/uplink_item/device_tools/ai_detector
diff --git a/code/datums/wires/radio.dm b/code/datums/wires/radio.dm
index 9da8890ac32..6c2fb9713da 100644
--- a/code/datums/wires/radio.dm
+++ b/code/datums/wires/radio.dm
@@ -12,11 +12,6 @@ var/const/WIRE_TRANSMIT = 4
return 1
return 0
-/datum/wires/radio/Interact(var/mob/living/user)
- if(CanUse(user))
- var/obj/item/device/radio/R = holder
- R.interact(user)
-
/datum/wires/radio/UpdatePulsed(var/index)
var/obj/item/device/radio/R = holder
switch(index)
diff --git a/code/defines/procs/AStar.dm b/code/defines/procs/AStar.dm
index 1c5a40b5e60..1479db76e5d 100644
--- a/code/defines/procs/AStar.dm
+++ b/code/defines/procs/AStar.dm
@@ -3,113 +3,27 @@ A Star pathfinding algorithm
Returns a list of tiles forming a path from A to B, taking dense objects as well as walls, and the orientation of
windows along the route into account.
Use:
-your_list = AStar(start location, end location, adjacent turf proc, distance proc)
-For the adjacent turf proc i wrote:
-/turf/proc/AdjacentTurfs
-And for the distance one i wrote:
-/turf/proc/Distance
-So an example use might be:
-
-src.path_list = AStar(src.loc, target.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance)
-
-Then to start on the path, all you need to do it:
-Step_to(src, src.path_list[1])
-src.path_list -= src.path_list[1] or equivilent to remove that node from the list.
+your_list = AStar(start location, end location, moving atom, distance proc, max nodes, maximum node depth, minimum distance to target, adjacent proc, atom id, turfs to exclude, check only simulated)
Optional extras to add on (in order):
+Distance proc : the distance used in every A* calculation (length of path and heuristic)
MaxNodes: The maximum number of nodes the returned path can be (0 = infinite)
Maxnodedepth: The maximum number of nodes to search (default: 30, 0 = infinite)
Mintargetdist: Minimum distance to the target before path returns, could be used to get
near a target, but not right to it - for an AI mob with a gun, for example.
-Minnodedist: Minimum number of nodes to return in the path, could be used to give a path a minimum
-length to avoid portals or something i guess?? Not that they're counted right now but w/e.
+Adjacent proc : returns the turfs to consider around the actually processed node
+Simulated only : whether to consider unsimulated turfs or not (used by some Adjacent proc)
+
+Also added 'exclude' turf to avoid travelling over; defaults to null
+
+Actual Adjacent procs :
+
+ /turf/proc/reachableAdjacentTurfs : returns reachable turfs in cardinal directions (uses simulated_only)
+
+ /turf/proc/reachableAdjacentAtmosTurfs : returns turfs in cardinal directions reachable via atmos
+
*/
-// Modified to provide ID argument - supplied to 'adjacent' proc, defaults to null
-// Used for checking if route exists through a door which can be opened
-
-// Also added 'exclude' turf to avoid travelling over; defaults to null
-
-//Currently, there's four main ways to call AStar
-//
-// 1) adjacent = "/turf/proc/AdjacentTurfsWithAccess" and distance = "/turf/proc/Distance"
-// Seeks a path moving in all directions (including diagonal) and checking for the correct id to get through doors
-//
-// 2) adjacent = "/turf/proc/CardinalTurfsWithAccess" and distance = "/turf/proc/Distance_cardinal"
-// Seeks a path moving only in cardinal directions and checking if for the correct id to get through doors
-// Used by most bots, including Beepsky
-//
-// 3) adjacent = "/turf/proc/AdjacentTurfs" and distance = "/turf/proc/Distance"
-// Same as 1), but don't check for ID. Can get only get through open doors
-//
-// 4) adjacent = "/turf/proc/AdjacentTurfsSpace" and distance = "/turf/proc/Distance"
-// Same as 1), but check all turf, including unsimulated
-
-//////////////////////
-//PriorityQueue object
-//////////////////////
-
-//an ordered list, using the cmp proc to weight the list elements
-/PriorityQueue
- var/list/L //the actual queue
- var/cmp //the weight function used to order the queue
-
-/PriorityQueue/New(compare)
- L = new()
- cmp = compare
-
-/PriorityQueue/proc/IsEmpty()
- return !L.len
-
-//add an element in the list,
-//immediatly ordering it to its position using Insertion sort
-/PriorityQueue/proc/Enqueue(var/atom/A)
- var/i
- L.Add(A)
- i = L.len -1
- while(i > 0 && call(cmp)(L[i],A) >= 0) //place the element at it's right position using the compare proc
- L.Swap(i,i+1) //last inserted element being first in case of ties (optimization)
- i--
-
-//removes and returns the first element in the queue
-/PriorityQueue/proc/Dequeue()
- if(!L.len)
- return 0
- . = L[1]
- Remove(.)
- return .
-
-//removes an element
-/PriorityQueue/proc/Remove(var/atom/A)
- return L.Remove(A)
-
-//returns a copy of the elements list
-/PriorityQueue/proc/List()
- var/list/ret = L.Copy()
- return ret
-
-//return the position of an element or 0 if not found
-/PriorityQueue/proc/Seek(var/atom/A)
- return L.Find(A)
-
-//return the element at the i_th position
-/PriorityQueue/proc/Get(var/i)
- if(i > L.len || i < 1)
- return 0
- return L[i]
-
-//replace the passed element at it's right position using the cmp proc
-/PriorityQueue/proc/ReSort(var/atom/A)
- var/i = Seek(A)
- if(i == 0)
- return
- while(i < L.len && call(cmp)(L[i],L[i+1]) > 0)
- L.Swap(i,i+1)
- i++
- while(i > 1 && call(cmp)(L[i],L[i-1]) <= 0) //last inserted element being first in case of ties (optimization)
- L.Swap(i,i-1)
- i--
-
//////////////////////
//PathNode object
//////////////////////
@@ -140,23 +54,30 @@ length to avoid portals or something i guess?? Not that they're counted right no
//////////////////////
//the weighting function, used in the A* algorithm
-proc/PathWeightCompare(PathNode/a, PathNode/b)
+/proc/PathWeightCompare(PathNode/a, PathNode/b)
return a.f - b.f
-//search if there's a PathNode that points to turf T in the Priority Queue
-proc/SeekTurf(var/PriorityQueue/Queue, var/turf/T)
- var/i = 1
- var/PathNode/PN
- while(i < Queue.L.len + 1)
- PN = Queue.L[i]
- if(PN.source == T)
- return i
- i++
- return 0
+//reversed so that the Heap is a MinHeap rather than a MaxHeap
+/proc/HeapPathWeightCompare(PathNode/a, PathNode/b)
+ return b.f - a.f
+
+//wrapper that returns an empty list if A* failed to find a path
+/proc/get_path_to(start, end, atom, dist, maxnodes, maxnodedepth = 30, mintargetdist, adjacent = /turf/proc/reachableAdjacentTurfs, id=null, turf/exclude=null, simulated_only = 1)
+ var/list/path = AStar(start, end, atom, dist, maxnodes, maxnodedepth, mintargetdist, adjacent,id, exclude, simulated_only)
+ if(!path)
+ path = list()
+ return path
//the actual algorithm
-proc/AStar(start,end,adjacent,dist,maxnodes,maxnodedepth = 30,mintargetdist,minnodedist,id=null, var/turf/exclude=null)
- var/PriorityQueue/open = new /PriorityQueue(/proc/PathWeightCompare) //the open list, ordered using the PathWeightCompare proc, from lower f to higher
+/proc/AStar(start, end, atom, dist, maxnodes, maxnodedepth = 30, mintargetdist, adjacent = /turf/proc/reachableAdjacentTurfs, id=null, turf/exclude=null, simulated_only = 1)
+
+ if(maxnodes)
+ //if start turf is farther than maxnodes from end turf, no need to do anything
+ if(call(start, dist)(end) > maxnodes)
+ return 0
+ maxnodedepth = maxnodes //no need to consider path longer than maxnodes
+
+ var/Heap/open = new /Heap(/proc/HeapPathWeightCompare) //the open list
var/list/closed = new() //the closed list
var/list/path = null //the returned path, if any
var/PathNode/cur //current processed turf
@@ -167,13 +88,13 @@ proc/AStar(start,end,adjacent,dist,maxnodes,maxnodedepth = 30,mintargetdist,minn
return 0
//initialization
- open.Enqueue(new /PathNode(start,null,0,call(start,dist)(end),0))
+ open.Insert(new /PathNode(start,null,0,call(start,dist)(end),0))
//then run the main loop
while(!open.IsEmpty() && !path)
{
//get the lower f node on the open list
- cur = open.Dequeue() //get the lower f turf in the open list
+ cur = open.Pop() //get the lower f turf in the open list
closed.Add(cur.source) //and tell we've processed it
//if we only want to get near the target, check if we're close enough
@@ -189,33 +110,28 @@ proc/AStar(start,end,adjacent,dist,maxnodes,maxnodedepth = 30,mintargetdist,minn
if(cur.source == end || closeenough)
path = new()
path.Add(cur.source)
+
while(cur.prevNode)
cur = cur.prevNode
path.Add(cur.source)
+
break
- //IMPLEMENTATION TO FINISH
- //do we really need this minnodedist ???
- /*if(minnodedist && maxnodedepth)
- if(call(cur.source,minnodedist)(end) + cur.nt >= maxnodedepth)
- continue
- */
-
//get adjacents turfs using the adjacent proc, checking for access with id
- var/list/L = call(cur.source,adjacent)(id,closed)
-
+ var/list/L = call(cur.source,adjacent)(atom,id, simulated_only)
for(var/turf/T in L)
- if(T == exclude)
+ if(T == exclude || T in closed)
continue
var/newg = cur.g + call(cur.source,dist)(T)
if(!T.PNode) //is not already in open list, so add it
- open.Enqueue(new /PathNode(T,cur,newg,call(T,dist)(end),cur.nt+1))
+ open.Insert(new /PathNode(T,cur,newg,call(T,dist)(end),cur.nt+1))
else //is already in open list, check if it's a better way from the current turf
if(newg < T.PNode.g)
T.PNode.prevNode = cur
T.PNode.g = newg
T.PNode.calc_f()
+ T.PNode.nt = cur.nt + 1
open.ReSort(T.PNode)//reorder the changed element in the list
}
@@ -226,10 +142,6 @@ proc/AStar(start,end,adjacent,dist,maxnodes,maxnodedepth = 30,mintargetdist,minn
for(var/turf/T in closed)
T.PNode = null
- //if the path is longer than maxnodes, then don't return it
- if(path && maxnodes && path.len > (maxnodes + 1))
- return 0
-
//reverse the path to get it from start to finish
if(path)
for(var/i = 1; i <= path.len/2; i++)
@@ -237,9 +149,55 @@ proc/AStar(start,end,adjacent,dist,maxnodes,maxnodedepth = 30,mintargetdist,minn
return path
-//wrapper that returns an empty list if A* failed to find a path
-/proc/get_path_to(var/start,var/end,var/adjacent,var/dist,var/maxnodes,var/maxnodedepth = 30,var/mintargetdist,var/minnodedist,id=null, var/turf/exclude=null)
- var/list/path = AStar(start, end, adjacent, dist, maxnodes, maxnodedepth, mintargetdist, minnodedist,id, exclude)
- if(!path)
- path = list()
- return path
+//Returns adjacent turfs in cardinal directions that are reachable
+//simulated_only controls whether only simulated turfs are considered or not
+/turf/proc/reachableAdjacentTurfs(atom, ID, simulated_only)
+ var/list/L = new()
+ var/turf/simulated/T
+
+ for(var/dir in cardinal)
+ T = get_step(src,dir)
+ if(simulated_only && !istype(T))
+ continue
+ if(!T.density && !LinkBlockedWithAccess(T, ID))
+ L.Add(T)
+ return L
+
+//Returns adjacent turfs in cardinal directions that are reachable via atmos
+/turf/proc/reachableAdjacentAtmosTurfs()
+ var/list/L = new()
+ var/turf/simulated/T
+
+ for(var/dir in cardinal)
+ if(dir & atmos_adjacent_turfs)
+ T = get_step(src,dir)
+ if(!istype(T))
+ continue
+ if(CanAtmosPass(T))
+ L.Add(T)
+ return L
+
+/turf/proc/LinkBlockedWithAccess(turf/T, obj/item/weapon/card/id/ID)
+ var/adir = get_dir(src, T)
+ var/rdir = get_dir(T, src)
+ if(DirBlockedWithAccess(src, adir, ID))
+ return 1
+ if(DirBlockedWithAccess(T, rdir, ID))
+ return 1
+ for(var/obj/O in T)
+ if(O.density && !istype(O, /obj/machinery/door) && !(O.flags & ON_BORDER))
+ return 1
+ return 0
+
+/proc/DirBlockedWithAccess(turf/T, dir, ID)
+ for(var/obj/structure/window/D in T)
+ if(!D.density)
+ continue
+ if(D.dir == SOUTHWEST)
+ return 1
+ if(D.dir == dir)
+ return 1
+ for(var/obj/machinery/door/D in T)
+ if(!D.CanAStarPass(ID, dir))
+ return 1
+ return 0
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index a257cbae129..f6bcfef4171 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -42,6 +42,7 @@
return
/atom/proc/assume_air(datum/gas_mixture/giver)
+ qdel(giver)
return null
/atom/proc/remove_air(amount)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 0e3e69fe274..0ed44c6aa10 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -81,10 +81,8 @@
return
last_move = direct
- src.move_speed = world.timeofday - src.l_move_time
- src.l_move_time = world.timeofday
-
-
+ src.move_speed = world.time - src.l_move_time
+ src.l_move_time = world.time
spawn(5) // Causes space drifting. /tg/station has no concept of speed, we just use 5
if(loc && direct && last_move == direct)
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index cbd7772f535..33a952ace87 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -120,10 +120,10 @@
!istype(O,/obj/item/weapon/stock_parts) && \
!istype(O,/obj/item/stack/cable_coil) && \
O != beaker)
- O.loc = get_turf(src)//Ejects items that manage to get in there (exluding the components and beaker)
+ O.forceMove(get_turf(src))//Ejects items that manage to get in there (exluding the components and beaker)
if(!occupant)
for(var/mob/M in src)//Failsafe so you can get mobs out
- M.loc = get_turf(src)
+ M.forceMove(get_turf(src))
/obj/machinery/dna_scannernew/verb/move_inside()
set src in oview(1)
@@ -146,7 +146,7 @@
usr.stop_pulling()
usr.client.perspective = EYE_PERSPECTIVE
usr.client.eye = src
- usr.loc = src
+ usr.forceMove(src)
src.occupant = usr
src.icon_state = "scanner_occupied"
src.add_fingerprint(usr)
@@ -208,7 +208,7 @@
if(istype(item, /obj/item/weapon/crowbar))
if(panel_open)
for(var/obj/I in contents) // in case there is something in the scanner
- I.loc = src.loc
+ I.forceMove(src.loc)
default_deconstruction_crowbar(item)
return
else if(istype(item, /obj/item/weapon/reagent_containers/glass))
@@ -216,14 +216,14 @@
user << "\red A beaker is already loaded into the machine."
return
+ if(!user.drop_item())
+ user << "\The [item] is stuck to you!"
+ return
+
beaker = item
- if(user.drop_item())
- item.forceMove(src)
- user.visible_message("[user] adds \a [item] to \the [src]!", "You add \a [item] to \the [src]!")
- return
- else
- user << "\The [item] is stuck to you!"
- return
+ item.forceMove(src)
+ user.visible_message("[user] adds \a [item] to \the [src]!", "You add \a [item] to \the [src]!")
+ return
else if (!istype(item, /obj/item/weapon/grab))
return
var/obj/item/weapon/grab/G = item
@@ -247,7 +247,7 @@
if(M.client)
M.client.perspective = EYE_PERSPECTIVE
M.client.eye = src
- M.loc = src
+ M.forceMove(src)
src.occupant = M
src.icon_state = "scanner_occupied"
@@ -275,7 +275,7 @@
if (src.occupant.client)
src.occupant.client.eye = src.occupant.client.mob
src.occupant.client.perspective = MOB_PERSPECTIVE
- src.occupant.loc = src.loc
+ src.occupant.forceMove(src.loc)
src.occupant = null
src.icon_state = "scanner_open"
return
@@ -284,7 +284,7 @@
switch(severity)
if(1.0)
for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
+ A.forceMove(src.loc)
ex_act(severity)
//Foreach goto(35)
//SN src = null
@@ -293,7 +293,7 @@
if(2.0)
if (prob(50))
for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
+ A.forceMove(src.loc)
ex_act(severity)
//Foreach goto(108)
//SN src = null
@@ -302,7 +302,7 @@
if(3.0)
if (prob(25))
for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
+ A.forceMove(src.loc)
ex_act(severity)
//Foreach goto(181)
//SN src = null
@@ -314,7 +314,7 @@
/obj/machinery/dna_scannernew/blob_act()
if(prob(75))
for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
+ A.forceMove(src.loc)
qdel(src)
// Checks if occupants can be irradiated/mutated - prevents exploits where wearing full rad protection would still let you gain mutations
@@ -365,7 +365,7 @@
if (istype(I, /obj/item/weapon/disk/data)) //INSERT SOME diskS
if (!src.disk)
user.drop_item()
- I.loc = src
+ I.forceMove(src)
src.disk = I
user << "You insert [I]."
nanomanager.update_uis(src) // update all UIs attached to src()
@@ -796,7 +796,7 @@
if(href_list["ejectBeaker"])
if(connected.beaker)
var/obj/item/weapon/reagent_containers/glass/B = connected.beaker
- B.loc = connected.loc
+ B.forceMove(connected.loc)
connected.beaker = null
return 1
@@ -821,7 +821,7 @@
if (bufferOption == "ejectDisk")
if (!src.disk)
return
- src.disk.loc = get_turf(src)
+ src.disk.forceMove(get_turf(src))
src.disk = null
return 1
@@ -930,7 +930,7 @@
I.buf = buf
waiting_for_user_input=0
if(success)
- I.loc = src.loc
+ I.forceMove(src.loc)
I.name += " ([buf.name])"
src.injector_ready = 0
spawn(300)
@@ -959,4 +959,4 @@
return 1
-/////////////////////////// DNA MACHINES
+/////////////////////////// DNA MACHINES
\ No newline at end of file
diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm
index 450973dc6a7..14e25c4ef69 100644
--- a/code/game/dna/genes/goon_disabilities.dm
+++ b/code/game/dna/genes/goon_disabilities.dm
@@ -36,11 +36,12 @@
..()
block=RADBLOCK
- OnMobLife(var/mob/owner)
- owner.radiation = max(owner.radiation, 20)
+ OnMobLife(var/mob/living/owner)
+ owner.apply_effect(max(owner.radiation, 20), IRRADIATE)
for(var/mob/living/L in range(1, owner))
- if(L == owner) continue
- L << "\red You are enveloped by a soft green glow emanating from [owner]."
+ if(L == owner)
+ continue
+ L << "You are enveloped by a soft green glow emanating from [owner]."
L.apply_effect(5, IRRADIATE)
return
diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm
index bc21b6d7ebc..050f9a74b8e 100644
--- a/code/game/gamemodes/changeling/powers/tiny_prick.dm
+++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm
@@ -39,10 +39,8 @@
return
if(!isturf(user.loc))
return
- if(get_dist(user, target) > (user.mind.changeling.sting_range))
- return //sanity check as AStar is still throwing insane stunts
- if(!AStar(user.loc, target.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, user.mind.changeling.sting_range))
- return //hope this ancient magic still works
+ if(!AStar(user.loc, target.loc, null, /turf/proc/Distance, user.mind.changeling.sting_range, simulated_only = 0))
+ return
if(target.mind && target.mind.changeling)
sting_feedback(user,target)
take_chemical_cost(user.mind.changeling)
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index 277cfa59406..eab6a665646 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -222,7 +222,7 @@ var/global/datum/controller/gameticker/ticker
*/
processScheduler.start()
-
+
if(config.sql_enabled)
spawn(3000)
statistic_cycle() // Polls population totals regularly and stores them in an SQL DB
@@ -486,14 +486,12 @@ var/global/datum/controller/gameticker/ticker
world << "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] this round."
mode.declare_completion()//To declare normal completion.
-
+
//calls auto_declare_completion_* for all modes
for(var/handler in typesof(/datum/game_mode/proc))
if (findtext("[handler]","auto_declare_completion_"))
call(mode, handler)()
- mode.declare_job_completion()
-
scoreboard()
karmareminder()
diff --git a/code/game/gamemodes/mutiny/key_pinpointer.dm b/code/game/gamemodes/mutiny/key_pinpointer.dm
index 7e8d628d85b..9bee2b92c92 100644
--- a/code/game/gamemodes/mutiny/key_pinpointer.dm
+++ b/code/game/gamemodes/mutiny/key_pinpointer.dm
@@ -13,7 +13,7 @@
mode = 1
active = 1
target = mutiny.captains_key
- workobj()
+ point_at(target)
usr << "\blue You calibrate \the [src] to locate the Captain's Authentication Key."
if (1)
mode = 2
diff --git a/code/game/gamemodes/nations/flag_pinpointer.dm b/code/game/gamemodes/nations/flag_pinpointer.dm
index 028f3cbb357..776932bbb7b 100644
--- a/code/game/gamemodes/nations/flag_pinpointer.dm
+++ b/code/game/gamemodes/nations/flag_pinpointer.dm
@@ -8,7 +8,7 @@
mode = 1
active = 1
target = locate(/obj/item/flag/nation/atmos)
- workobj()
+ point_at(target)
usr << "\blue You calibrate \the [src] to locate the [target.name]"
if (1)
mode = 2
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 3a81b449c1e..0b3592ded97 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -225,7 +225,7 @@ proc/issyndicate(mob/living/M as mob)
var/obj/item/weapon/stamp/syndicate/stamp = new
P.stamp(stamp)
qdel(stamp)
-
+
if (ticker.mode.config_tag=="nuclear")
P.loc = synd_mind.current.loc
else
@@ -447,3 +447,104 @@ proc/issyndicate(mob/living/M as mob)
synd_mind.name = "[pick(first_names_female)] [pick(last_names)]"
synd_mind.current.real_name = synd_mind.name
return
+
+/datum/game_mode/nuclear/set_scoreboard_gvars()
+ var/foecount = 0
+ for(var/datum/mind/M in ticker.mode.syndicates)
+ foecount++
+ if(!M || !M.current)
+ score_opkilled++
+ continue
+
+ if(M.current.stat == DEAD)
+ score_opkilled++
+
+ else if(M.current.restrained())
+ score_arrested++
+
+ if(foecount == score_arrested)
+ score_allarrested = 1
+
+ for(var/obj/machinery/nuclearbomb/nuke in world)
+ if(nuke.r_code == "Nope") continue
+ var/turf/T = get_turf(nuke)
+ var/area/A = T.loc
+
+ var/list/thousand_penalty = list(/area/syndicate_station, /area/wizard_station, /area/solar, /area)
+ var/list/fiftythousand_penalty = list(/area/security/main, /area/security/brig, /area/security/armoury, /area/security/checkpoint2)
+
+ if(is_type_in_list(A, thousand_penalty))
+ score_nuked_penalty = 1000
+
+ else if(is_type_in_list(A, fiftythousand_penalty))
+ score_nuked_penalty = 50000
+
+ else if(istype(A, /area/engine))
+ score_nuked_penalty = 100000
+
+ else
+ score_nuked_penalty = 10000
+
+ break
+
+ var/killpoints = score_opkilled * 250
+ var/arrestpoints = score_arrested * 1000
+ score_crewscore += killpoints
+ score_crewscore += arrestpoints
+ if(score_nuked)
+ score_crewscore -= score_nuked_penalty
+
+
+
+/datum/game_mode/nuclear/get_scoreboard_stats()
+ var/foecount = 0
+ var/crewcount = 0
+
+ var/diskdat = ""
+ var/bombdat = null
+
+ for(var/datum/mind/M in ticker.mode.syndicates)
+ foecount++
+
+ for(var/mob/living/C in world)
+ if(ishuman(C) || isAI(C) || isrobot(C))
+ if(C.stat == 2) continue
+ if(!C.client) continue
+ crewcount++
+
+ var/obj/item/weapon/disk/nuclear/N = locate() in world
+ if(istype(N))
+ var/atom/disk_loc = N.loc
+ while(!isturf(disk_loc))
+ if(ismob(disk_loc))
+ var/mob/M = disk_loc
+ diskdat += "Carried by [M.real_name] "
+ if(isobj(disk_loc))
+ var/obj/O = disk_loc
+ diskdat += "in \a [O]"
+ disk_loc = disk_loc.loc
+ diskdat += "in [disk_loc.loc]"
+
+
+ if(!diskdat)
+ diskdat = "WARNING: Nuked_penalty could not be found, look at [__FILE__], [__LINE__]."
+
+ var/dat = ""
+ dat += "Mode Statistics
"
+
+ dat += "Number of Operatives: [foecount]
"
+ dat += "Number of Surviving Crew: [crewcount]
"
+
+ dat += "Final Location of Nuke: [bombdat]
"
+ dat += "Final Location of Disk: [diskdat]
"
+
+ dat += "
"
+
+ dat += "Operatives Arrested: [score_arrested] ([score_arrested * 1000] Points)
"
+ dat += "All Operatives Arrested: [score_allarrested ? "Yes" : "No"] (Score tripled)
"
+
+ dat += "Operatives Killed: [score_opkilled] ([score_opkilled * 1000] Points)
"
+ dat += "Station Destroyed: [score_nuked ? "Yes" : "No"] (-[score_nuked_penalty] Points)
"
+ dat += "
"
+
+ return dat
\ No newline at end of file
diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index 572d87e149e..29a0a3cc61c 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -12,396 +12,26 @@
var/obj/item/weapon/disk/nuclear/the_disk = null
var/active = 0
- Destroy()
- active = 0
- the_disk = null
- return ..()
-
- attack_self()
- if(!active)
- active = 1
- workdisk()
- usr << "\blue You activate the pinpointer"
- else
- active = 0
- icon_state = "pinoff"
- usr << "\blue You deactivate the pinpointer"
-
- proc/workdisk()
- if(!active) return
- if(!the_disk)
- the_disk = locate()
- if(!the_disk)
- icon_state = "pinonnull"
- return
- dir = get_dir(src,the_disk)
- switch(get_dist(src,the_disk))
- if(0)
- icon_state = "pinondirect"
- if(1 to 8)
- icon_state = "pinonclose"
- if(9 to 16)
- icon_state = "pinonmedium"
- if(16 to INFINITY)
- icon_state = "pinonfar"
- spawn(5) .()
-
- examine(mob/user)
- ..(user)
- for(var/obj/machinery/nuclearbomb/bomb in world)
- if(bomb.timing)
- user << "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]"
-
-
-/obj/item/weapon/pinpointer/advpinpointer
- name = "Advanced Pinpointer"
- icon = 'icons/obj/device.dmi'
- desc = "A larger version of the normal pinpointer, this unit features a helpful quantum entanglement detection system to locate various objects that do not broadcast a locator signal."
- var/mode = 0 // Mode 0 locates disk, mode 1 locates coordinates.
- var/turf/location = null
- var/obj/target = null
-
- attack_self()
- if(!active)
- active = 1
- if(mode == 0)
- workdisk()
- if(mode == 1)
- worklocation()
- if(mode == 2)
- workobj()
- usr << "\blue You activate the pinpointer"
- else
- active = 0
- icon_state = "pinoff"
- usr << "\blue You deactivate the pinpointer"
-
-
- proc/worklocation()
- if(!active)
- return
- if(!location)
- icon_state = "pinonnull"
- return
- dir = get_dir(src,location)
- switch(get_dist(src,location))
- if(0)
- icon_state = "pinondirect"
- if(1 to 8)
- icon_state = "pinonclose"
- if(9 to 16)
- icon_state = "pinonmedium"
- if(16 to INFINITY)
- icon_state = "pinonfar"
- spawn(5) .()
-
-
- proc/workobj()
- if(!active)
- return
- if(!target)
- icon_state = "pinonnull"
- return
- dir = get_dir(src,target)
- switch(get_dist(src,target))
- if(0)
- icon_state = "pinondirect"
- if(1 to 8)
- icon_state = "pinonclose"
- if(9 to 16)
- icon_state = "pinonmedium"
- if(16 to INFINITY)
- icon_state = "pinonfar"
- spawn(5) .()
-
-/obj/item/weapon/pinpointer/advpinpointer/verb/toggle_mode()
- set category = "Object"
- set name = "Toggle Pinpointer Mode"
- set src in view(1)
-
+/obj/item/weapon/pinpointer/Destroy()
active = 0
- icon_state = "pinoff"
- target=null
- location = null
+ the_disk = null
+ return ..()
- switch(alert("Please select the mode you want to put the pinpointer in.", "Pinpointer Mode Select", "Location", "Disk Recovery", "Other Signature"))
- if("Location")
- mode = 1
-
- var/locationx = input(usr, "Please input the x coordinate to search for.", "Location?" , "") as num
- if(!locationx || !(usr in view(1,src)))
- return
- var/locationy = input(usr, "Please input the y coordinate to search for.", "Location?" , "") as num
- if(!locationy || !(usr in view(1,src)))
- return
-
- var/turf/Z = get_turf(src)
-
- location = locate(locationx,locationy,Z.z)
-
- usr << "You set the pinpointer to locate [locationx],[locationy]"
-
-
- return attack_self()
-
- if("Disk Recovery")
- mode = 0
- return attack_self()
-
- if("Other Signature")
- mode = 2
- switch(alert("Search for item signature or DNA fragment?" , "Signature Mode Select" , "" , "Item" , "DNA"))
- if("Item")
- var/list/item_names[0]
- var/list/item_paths[0]
- for(var/typepath in potential_theft_objectives)
- var/obj/item/tmp_object=new typepath
- var/n="[tmp_object]"
- item_names+=n
- item_paths[n]=typepath
- qdel(tmp_object)
- var/targetitem = input("Select item to search for.", "Item Mode Select","") as null|anything in potential_theft_objectives
- if(!targetitem)
- return
- target=locate(item_paths[targetitem])
- if(!target)
- usr << "Failed to locate [targetitem]!"
- return
- usr << "You set the pinpointer to locate [targetitem]"
- if("DNA")
- var/DNAstring = input("Input DNA string to search for." , "Please Enter String." , "")
- if(!DNAstring)
- return
- for(var/mob/living/carbon/M in mob_list)
- if(!M.dna)
- continue
- if(M.dna.unique_enzymes == DNAstring)
- target = M
- break
-
- return attack_self()
-
-
-///////////////////////
-//nuke op pinpointers//
-///////////////////////
-
-
-/obj/item/weapon/pinpointer/nukeop
- var/mode = 0 //Mode 0 locates disk, mode 1 locates the shuttle
- var/obj/machinery/computer/shuttle_control/multi/syndicate/home = null
- slot_flags = SLOT_PDA | SLOT_BELT
-
-/obj/item/weapon/pinpointer/nukeop/attack_self(mob/user as mob)
+/obj/item/weapon/pinpointer/attack_self()
if(!active)
active = 1
- if(!mode)
- workdisk()
- user << "Authentication Disk Locator active."
- else
- worklocation()
- user << "Shuttle Locator active."
- else
- active = 0
- icon_state = "pinoff"
- user << "You deactivate the pinpointer."
-
-
-/obj/item/weapon/pinpointer/nukeop/workdisk()
- if(!active) return
- if(mode) //Check in case the mode changes while operating
- worklocation()
- return
- if(bomb_set) //If the bomb is set, lead to the shuttle
- mode = 1 //Ensures worklocation() continues to work
- worklocation()
- playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) //Plays a beep
- visible_message("Shuttle Locator active.") //Lets the mob holding it know that the mode has changed
- return //Get outta here
- if(!the_disk)
- the_disk = locate()
- if(!the_disk)
- icon_state = "pinonnull"
- return
-// if(loc.z != the_disk.z) //If you are on a different z-level from the disk
-// icon_state = "pinonnull"
-// else
- dir = get_dir(src, the_disk)
- switch(get_dist(src, the_disk))
- if(0)
- icon_state = "pinondirect"
- if(1 to 8)
- icon_state = "pinonclose"
- if(9 to 16)
- icon_state = "pinonmedium"
- if(16 to INFINITY)
- icon_state = "pinonfar"
-
- spawn(5) .()
-
-
-/obj/item/weapon/pinpointer/nukeop/proc/worklocation()
- if(!active) return
- if(!mode)
workdisk()
- return
- if(!bomb_set)
- mode = 0
- workdisk()
- playsound(loc, 'sound/machines/twobeep.ogg', 50, 1)
- visible_message("Authentication Disk Locator active.")
- return
- if(!home)
- home = locate()
- if(!home)
- icon_state = "pinonnull"
- return
- if(loc.z != home.z) //If you are on a different z-level from the shuttle
- icon_state = "pinonnull"
- else
- dir = get_dir(src, home)
- switch(get_dist(src, home))
- if(0)
- icon_state = "pinondirect"
- if(1 to 8)
- icon_state = "pinonclose"
- if(9 to 16)
- icon_state = "pinonmedium"
- if(16 to INFINITY)
- icon_state = "pinonfar"
-
- spawn(5) .()
-
-/obj/item/weapon/pinpointer/pdapinpointer
- name = "pda pinpointer"
- desc = "A pinpointer that has been illegally modified to track the PDA of a crewmember for malicious reasons."
- var/obj/target = null
- var/used = 0
-
- attack_self()
- if(!active)
- active = 1
- point_at(target)
- usr << "\blue You activate the pinpointer"
- else
- active = 0
- icon_state = "pinoff"
- usr << "\blue You deactivate the pinpointer"
-
- verb/select_pda()
- set category = "Object"
- set name = "Select pinpointer target"
- set src in view(1)
-
- if(used)
- usr << "Target has already been set!"
- return
-
- var/list/L = list()
- L["Cancel"] = "Cancel"
- var/length = 1
- for (var/obj/item/device/pda/P in world)
- if(P.name != "\improper PDA")
- L[text("([length]) [P.name]")] = P
- length++
-
- var/t = input("Select pinpointer target. WARNING: Can only set once.") as null|anything in L
- if(t == "Cancel")
- return
- target = L[t]
- if(!target)
- usr << "Failed to locate [target]!"
- return
- active = 1
- point_at(target)
- usr << "You set the pinpointer to locate [target]"
- used = 1
-
-
- examine(mob/user)
- ..(user)
- if (target)
- user << "\blue Tracking [target]"
-
- proc/point_at(atom/target)
- if(!active)
- return
- if(!target)
- icon_state = "pinonnull"
- return
-
- var/turf/T = get_turf(target)
- var/turf/L = get_turf(src)
-
- if((!T) || (!L)) // Someone is no longer in the world...
- icon_state = "pinonnull"
- return
-
- if(T.z != L.z)
- icon_state = "pinonnull"
- else
- dir = get_dir(L, T)
- switch(get_dist(L, T))
- if(-1)
- icon_state = "pinondirect"
- if(1 to 8)
- icon_state = "pinonclose"
- if(9 to 16)
- icon_state = "pinonmedium"
- if(16 to INFINITY)
- icon_state = "pinonfar"
- spawn(5)
- .()
-
-/obj/item/weapon/pinpointer/operative
- name = "operative pinpointer"
- icon = 'icons/obj/device.dmi'
- desc = "A pinpointer that leads to the first Syndicate operative detected."
- var/mob/living/carbon/nearest_op = null
-
-/obj/item/weapon/pinpointer/operative/attack_self()
- if(!usr.mind || !(usr.mind in ticker.mode.syndicates))
- usr << "AUTHENTICATION FAILURE. ACCESS DENIED."
- return 0
- if(!active)
- active = 1
- workop()
usr << "You activate the pinpointer."
else
active = 0
icon_state = "pinoff"
usr << "You deactivate the pinpointer."
+
+/obj/item/weapon/pinpointer/proc/scandisk()
+ if(!the_disk)
+ the_disk = locate()
-/obj/item/weapon/pinpointer/operative/proc/scan_for_ops()
- if(active)
- nearest_op = null //Resets nearest_op every time it scans
- var/closest_distance = 1000
- for(var/mob/living/carbon/M in mob_list)
- if(M.mind && (M.mind in ticker.mode.syndicates))
- if(get_dist(M, get_turf(src)) < closest_distance) //Actually points toward the nearest op, instead of a random one like it used to
- nearest_op = M
- if(!nearest_op) // There are simply no operatives left to point to
- active = 0
- icon_state = "pinoff"
-
-/obj/item/weapon/pinpointer/operative/proc/workop()
- if(active)
- scan_for_ops()
- point_at(nearest_op, 0)
- spawn(5)
- .()
- else
- return 0
-
-/obj/item/weapon/pinpointer/operative/examine(mob/user)
- ..()
- if(active)
- if(nearest_op)
- user << "Nearest operative detected is [nearest_op.real_name]."
- else
- user << "No operatives detected within scanning range."
-
-/obj/item/weapon/pinpointer/operative/proc/point_at(atom/target, spawnself = 1)
+/obj/item/weapon/pinpointer/proc/point_at(atom/target, spawnself = 1)
if(!active)
return
if(!target)
@@ -426,4 +56,242 @@
icon_state = "pinonfar"
if(spawnself)
spawn(5)
- .()
\ No newline at end of file
+ .()
+
+/obj/item/weapon/pinpointer/proc/workdisk()
+ scandisk()
+ point_at(the_disk, 0)
+ spawn(5)
+ .()
+
+/obj/item/weapon/pinpointer/examine(mob/user)
+ ..(user)
+ for(var/obj/machinery/nuclearbomb/bomb in machines)
+ if(bomb.timing)
+ user << "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]"
+
+/obj/item/weapon/pinpointer/advpinpointer
+ name = "advanced pinpointer"
+ desc = "A larger version of the normal pinpointer, this unit features a helpful quantum entanglement detection system to locate various objects that do not broadcast a locator signal."
+ var/mode = 0 // Mode 0 locates disk, mode 1 locates coordinates.
+ var/turf/location = null
+ var/obj/target = null
+
+/obj/item/weapon/pinpointer/advpinpointer/attack_self()
+ if(!active)
+ active = 1
+ if(mode == 0)
+ workdisk()
+ if(mode == 1)
+ point_at(location)
+ if(mode == 2)
+ point_at(target)
+ usr << "You activate the pinpointer."
+ else
+ active = 0
+ icon_state = "pinoff"
+ usr << "You deactivate the pinpointer."
+
+/obj/item/weapon/pinpointer/advpinpointer/workdisk()
+ if(mode == 0)
+ scandisk()
+ point_at(the_disk, 0)
+ spawn(5)
+ .()
+
+/obj/item/weapon/pinpointer/advpinpointer/verb/toggle_mode()
+ set category = "Object"
+ set name = "Toggle Pinpointer Mode"
+ set src in usr
+
+ if(usr.stat || usr.restrained())
+ return
+
+ active = 0
+ icon_state = "pinoff"
+ target = null
+ location = null
+
+ switch(alert("Please select the mode you want to put the pinpointer in.", "Pinpointer Mode Select", "Location", "Disk Recovery", "Other Signature"))
+ if("Location")
+ mode = 1
+
+ var/locationx = input(usr, "Please input the x coordinate to search for.", "Location?" , "") as num
+ if(!locationx || !(usr in view(1,src)))
+ return
+ var/locationy = input(usr, "Please input the y coordinate to search for.", "Location?" , "") as num
+ if(!locationy || !(usr in view(1,src)))
+ return
+
+ var/turf/Z = get_turf(src)
+
+ location = locate(locationx,locationy,Z.z)
+
+ usr << "You set the pinpointer to locate [locationx],[locationy]"
+
+
+ return attack_self()
+
+ if("Disk Recovery")
+ mode = 0
+ return attack_self()
+
+ if("Other Signature")
+ mode = 2
+ switch(alert("Search for item signature or DNA fragment?" , "Signature Mode Select" , "Item" , "DNA"))
+ if("Item")
+ var/list/item_names[0]
+ var/list/item_paths[0]
+ for(var/objective in potential_theft_objectives)
+ var/datum/theft_objective/T = objective
+ var/name = initial(T.name)
+ item_names += name
+ item_paths[name] = initial(T.typepath)
+ var/targetitem = input("Select item to search for.", "Item Mode Select","") as null|anything in item_names
+ if(!targetitem)
+ return
+ target = locate(item_paths[targetitem])
+ if(!target)
+ usr << "Failed to locate [targetitem]!"
+ return
+ usr << "You set the pinpointer to locate [targetitem]."
+ if("DNA")
+ var/DNAstring = input("Input DNA string to search for." , "Please Enter String." , "")
+ if(!DNAstring)
+ return
+ for(var/mob/living/carbon/C in mob_list)
+ if(!C.dna)
+ continue
+ if(C.dna.unique_enzymes == DNAstring)
+ target = C
+ break
+
+ return attack_self()
+
+///////////////////////
+//nuke op pinpointers//
+///////////////////////
+/obj/item/weapon/pinpointer/nukeop
+ var/mode = 0 //Mode 0 locates disk, mode 1 locates the shuttle
+ var/obj/machinery/computer/shuttle_control/multi/syndicate/home = null
+ slot_flags = SLOT_PDA | SLOT_BELT
+
+/obj/item/weapon/pinpointer/nukeop/attack_self(mob/user as mob)
+ if(!active)
+ active = 1
+ if(!mode)
+ workdisk()
+ user << "Authentication Disk Locator active."
+ else
+ worklocation()
+ user << "Shuttle Locator active."
+ else
+ active = 0
+ icon_state = "pinoff"
+ user << "You deactivate the pinpointer."
+
+/obj/item/weapon/pinpointer/nukeop/workdisk()
+ if(!active) return
+ if(mode) //Check in case the mode changes while operating
+ worklocation()
+ return
+ if(bomb_set) //If the bomb is set, lead to the shuttle
+ mode = 1 //Ensures worklocation() continues to work
+ worklocation()
+ playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) //Plays a beep
+ visible_message("Shuttle Locator mode actived.") //Lets the mob holding it know that the mode has changed
+ return //Get outta here
+ scandisk()
+ if(!the_disk)
+ icon_state = "pinonnull"
+ return
+ dir = get_dir(src, the_disk)
+ switch(get_dist(src, the_disk))
+ if(0)
+ icon_state = "pinondirect"
+ if(1 to 8)
+ icon_state = "pinonclose"
+ if(9 to 16)
+ icon_state = "pinonmedium"
+ if(16 to INFINITY)
+ icon_state = "pinonfar"
+
+ spawn(5) .()
+
+/obj/item/weapon/pinpointer/nukeop/proc/worklocation()
+ if(!active)
+ return
+ if(!mode)
+ workdisk()
+ return
+ if(!bomb_set)
+ mode = 0
+ workdisk()
+ playsound(loc, 'sound/machines/twobeep.ogg', 50, 1)
+ visible_message("Authentication Disk Locator mode actived.")
+ return
+ if(!home)
+ home = locate()
+ if(!home)
+ icon_state = "pinonnull"
+ return
+ if(loc.z != home.z) //If you are on a different z-level from the shuttle
+ icon_state = "pinonnull"
+ else
+ dir = get_dir(src, home)
+ switch(get_dist(src, home))
+ if(0)
+ icon_state = "pinondirect"
+ if(1 to 8)
+ icon_state = "pinonclose"
+ if(9 to 16)
+ icon_state = "pinonmedium"
+ if(16 to INFINITY)
+ icon_state = "pinonfar"
+
+ spawn(5)
+ .()
+
+/obj/item/weapon/pinpointer/operative
+ name = "operative pinpointer"
+ desc = "A pinpointer that leads to the first Syndicate operative detected."
+ var/mob/living/carbon/nearest_op = null
+
+/obj/item/weapon/pinpointer/operative/attack_self()
+ if(!usr.mind || !(usr.mind in ticker.mode.syndicates))
+ usr << "AUTHENTICATION FAILURE. ACCESS DENIED."
+ return 0
+ if(!active)
+ active = 1
+ workop()
+ usr << "You activate the pinpointer."
+ else
+ active = 0
+ icon_state = "pinoff"
+ usr << "You deactivate the pinpointer."
+
+/obj/item/weapon/pinpointer/operative/proc/scan_for_ops()
+ if(active)
+ nearest_op = null //Resets nearest_op every time it scans
+ var/closest_distance = 1000
+ for(var/mob/living/carbon/M in mob_list)
+ if(M.mind && (M.mind in ticker.mode.syndicates))
+ if(get_dist(M, get_turf(src)) < closest_distance) //Actually points toward the nearest op, instead of a random one like it used to
+ nearest_op = M
+
+/obj/item/weapon/pinpointer/operative/proc/workop()
+ if(active)
+ scan_for_ops()
+ point_at(nearest_op, 0)
+ spawn(5)
+ .()
+ else
+ return 0
+
+/obj/item/weapon/pinpointer/operative/examine(mob/user)
+ ..()
+ if(active)
+ if(nearest_op)
+ user << "Nearest operative detected is [nearest_op.real_name]."
+ else
+ user << "No operatives detected within scanning range."
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index 099a8e61bad..931032eac22 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -476,3 +476,86 @@
istype(mind.current, /mob/living/carbon/human) && \
!(mind.assigned_role in command_positions) && \
!(mind.assigned_role in list("Security Officer", "Detective", "Warden", "Nanotrasen Representative"))
+
+
+
+/datum/game_mode/revolution/set_scoreboard_gvars()
+ var/foecount = 0
+ for(var/datum/mind/M in ticker.mode.head_revolutionaries)
+ foecount++
+ if(!M || !M.current)
+ score_opkilled++
+ continue
+
+ if(M.current.stat == DEAD)
+ score_opkilled++
+
+ else if(M.current.restrained())
+ score_arrested++
+
+ if(foecount == score_arrested)
+ score_allarrested = 1
+
+ for(var/mob/living/carbon/human/player in world)
+ if(player.mind)
+ var/role = player.mind.assigned_role
+ if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director"))
+ if(player.stat == DEAD)
+ score_deadcommand++
+
+
+ var/arrestpoints = score_arrested * 1000
+ var/killpoints = score_opkilled * 500
+ var/comdeadpts = score_deadcommand * 500
+ if(score_traitorswon)
+ score_crewscore -= 10000
+
+ score_crewscore += arrestpoints
+ score_crewscore += killpoints
+ score_crewscore -= comdeadpts
+
+
+/datum/game_mode/revolution/get_scoreboard_stats()
+ var/foecount = 0
+ var/comcount = 0
+ var/revcount = 0
+ var/loycount = 0
+ for(var/datum/mind/M in ticker.mode:head_revolutionaries)
+ if (M.current && M.current.stat != DEAD)
+ foecount++
+ for(var/datum/mind/M in ticker.mode:revolutionaries)
+ if (M.current && M.current.stat != DEAD)
+ revcount++
+ for(var/mob/living/carbon/human/player in world)
+ if(player.mind)
+ var/role = player.mind.assigned_role
+ if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director"))
+ if(player.stat != DEAD)
+ comcount++
+ else
+ if(player.mind in ticker.mode.revolutionaries) continue
+ loycount++
+
+ for(var/mob/living/silicon/X in world)
+ if(X.stat != DEAD)
+ loycount++
+
+
+ var/dat = ""
+
+ dat += "Mode Statistics
"
+ dat += "Number of Surviving Revolution Heads: [foecount]
"
+ dat += "Number of Surviving Command Staff: [comcount]
"
+ dat += "Number of Surviving Revolutionaries: [revcount]
"
+ dat += "Number of Surviving Loyal Crew: [loycount]
"
+
+ dat += "
"
+ dat += "Revolution Heads Arrested: [score_arrested] ([score_arrested * 1000] Points)
"
+ dat += "All Revolution Heads Arrested: [score_allarrested ? "Yes" : "No"] (Score tripled)
"
+
+ dat += "Revolution Heads Slain: [score_opkilled] ([score_opkilled * 500] Points)
"
+ dat += "Command Staff Slain: [score_deadcommand] (-[score_deadcommand * 500] Points)
"
+ dat += "Revolution Successful: [score_traitorswon ? "Yes" : "No"] (-[score_traitorswon * 10000] Points)
"
+ dat += "
"
+
+ return dat
\ No newline at end of file
diff --git a/code/game/gamemodes/revolution/rp-revolution.dm b/code/game/gamemodes/revolution/rp-revolution.dm
index 7e2b42461fe..b0c58fd8c5f 100644
--- a/code/game/gamemodes/revolution/rp-revolution.dm
+++ b/code/game/gamemodes/revolution/rp-revolution.dm
@@ -158,9 +158,9 @@
// spawn (100)
// if (rev_mob.r_store)
-// rev_mob.equip_if_possible(new /obj/item/weapon/paper/communist_manifesto(rev_mob), rev_mob.slot_l_store)
+// rev_mob.equip_or_collect(new /obj/item/weapon/paper/communist_manifesto(rev_mob), rev_mob.slot_l_store)
// if (rev_mob.l_store)
-// rev_mob.equip_if_possible(new /obj/item/weapon/paper/communist_manifesto(rev_mob), rev_mob.slot_r_store)
+// rev_mob.equip_or_collect(new /obj/item/weapon/paper/communist_manifesto(rev_mob), rev_mob.slot_r_store)
/datum/game_mode/rp_revolution/check_win()
diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm
index 73fbc4d972d..56f37477b76 100644
--- a/code/game/gamemodes/scoreboard.dm
+++ b/code/game/gamemodes/scoreboard.dm
@@ -20,126 +20,92 @@
// Score Calculation and Display
// Who is alive/dead, who escaped
- for (var/mob/living/silicon/ai/I in mob_list)
- if (I.stat == 2 && (I.z in config.station_levels))
- score_deadaipenalty = 1
- score_deadcrew += 1
- for (var/mob/living/carbon/human/I in mob_list)
-// for (var/datum/ailment/disease/V in I.ailments)
-// if (!V.vaccine && !V.spread != "Remissive") score_disease++
- if (I.stat == 2 && (I.z in config.station_levels)) score_deadcrew += 1
- if (I.job == "Clown")
- for(var/thing in I.attack_log)
- if(findtext(thing, "")) score_clownabuse++
+ for(var/mob/living/silicon/ai/I in mob_list)
+ if(I.stat == DEAD && (I.z in config.station_levels))
+ score_deadaipenalty++
+ score_deadcrew++
+
+ for(var/mob/living/carbon/human/I in mob_list)
+ if(I.stat == DEAD && (I.z in config.station_levels))
+ score_deadcrew++
+
+ if(I && I.mind)
+ if(I.mind.assigned_role == "Clown")
+ for(var/thing in I.attack_log)
+ if(findtext(thing, "")) //This has to be the hackiest fucking way _ever_ to see attacks.
+ score_clownabuse++
for(var/mob/living/player in mob_list)
- if (player.client)
- if (player.stat != 2)
+ if(player.client)
+ if (player.stat != DEAD)
var/turf/location = get_turf(player.loc)
var/area/escape_zone = locate(/area/shuttle/escape/centcom)
- if (location in escape_zone)
- score_escapees += 1
-// player.unlock_medal("100M Dash", 1)
-// player.unlock_medal("Survivor", 1)
-// for (var/obj/item/weapon/gnomechompski/G in player.get_contents())
-// player.unlock_medal("Guardin' gnome", 1)
+ if(location in escape_zone)
+ score_escapees++
- var/cashscore = 0
- var/dmgscore = 0
+
+ var/cash_score = 0
+ var/dmg_score = 0
for(var/mob/living/carbon/human/E in mob_list)
- cashscore = 0
- dmgscore = 0
+ cash_score = 0
+ dmg_score = 0
var/turf/location = get_turf(E.loc)
var/area/escape_zone = locate(/area/shuttle/escape/centcom)
- if(E.stat != 2 && location in escape_zone) // Escapee Scores
- for (var/obj/item/weapon/card/id/C1 in E.contents) cashscore += C1.money
- for (var/obj/item/weapon/spacecash/C2 in E.contents) cashscore += C2.worth
- for (var/obj/item/weapon/storage/S in E.contents)
- for (var/obj/item/weapon/card/id/C3 in S.contents) cashscore += C3.money
- for (var/obj/item/weapon/spacecash/C4 in S.contents) cashscore += C4.worth
-// for(var/datum/data/record/Ba in data_core.bank)
-// if(Ba.fields["name"] == E.real_name) cashscore += Ba.fields["current_money"]
- if (cashscore > score_richestcash)
- score_richestcash = cashscore
+
+ if(E.stat != DEAD && location in escape_zone) // Escapee Scores
+ for(var/obj/item/weapon/card/id/C1 in E.contents)
+ cash_score += C1.money
+ for(var/obj/item/weapon/spacecash/C2 in E.contents)
+ cash_score += C2.worth
+ for(var/obj/item/weapon/storage/S in E.contents)
+ for(var/obj/item/weapon/card/id/C3 in S.contents)
+ cash_score += C3.money
+ for(var/obj/item/weapon/spacecash/C4 in S.contents)
+ cash_score += C4.worth
+
+ if(cash_score > score_richestcash)
+ score_richestcash = cash_score
score_richestname = E.real_name
score_richestjob = E.job
score_richestkey = E.key
- dmgscore = E.bruteloss + E.fireloss + E.toxloss + E.oxyloss
- if (dmgscore > score_dmgestdamage)
- score_dmgestdamage = dmgscore
+
+ dmg_score = E.bruteloss + E.fireloss + E.toxloss + E.oxyloss
+ if(dmg_score > score_dmgestdamage)
+ score_dmgestdamage = dmg_score
score_dmgestname = E.real_name
score_dmgestjob = E.job
score_dmgestkey = E.key
- var/nukedpenalty = 1000
- if (ticker.mode.config_tag == "nuclear")
- var/foecount = 0
- for(var/datum/mind/M in ticker.mode:syndicates)
- foecount++
- if (!M || !M.current)
- score_opkilled++
- continue
- var/turf/T = M.current.loc
- if (T && istype(T.loc, /area/security/brig)) score_arrested += 1
- else if (M.current.stat == 2) score_opkilled++
- if(foecount == score_arrested) score_allarrested = 1
+ if(ticker && ticker.mode)
+ ticker.mode.set_scoreboard_gvars()
-/*
- score_disc = 1
- for(var/obj/item/weapon/disk/nuclear/A in world)
- if(A.loc != /mob/living/carbon) continue
- var/turf/location = get_turf(A.loc)
- var/area/bad_zone1 = locate(/area)
- var/area/bad_zone2 = locate(/area/syndicate_station)
- var/area/bad_zone3 = locate(/area/wizard_station)
- if (location in bad_zone1) score_disc = 0
- if (location in bad_zone2) score_disc = 0
- if (location in bad_zone3) score_disc = 0
- if (!(A.loc.z in config.station_levels)) score_disc = 0
-*/
- if (score_nuked)
- for (var/obj/machinery/nuclearbomb/NUKE in machines)
- if (NUKE.r_code == "Nope") continue
- var/turf/T = NUKE.loc
- if (istype(T,/area/syndicate_station) || istype(T,/area/wizard_station) || istype(T,/area/solar)) nukedpenalty = 1000
- else if (istype(T,/area/security/main) || istype(T,/area/security/brig) || istype(T,/area/security/armoury) || istype(T,/area/security/checkpoint2)) nukedpenalty = 50000
- else if (istype(T,/area/engine)) nukedpenalty = 100000
- else nukedpenalty = 10000
-
- if (ticker.mode.config_tag == "revolution")
- var/foecount = 0
- for(var/datum/mind/M in ticker.mode:head_revolutionaries)
- foecount++
- if (!M || !M.current)
- score_opkilled++
- continue
- var/turf/T = M.current.loc
- if (istype(T.loc, /area/security/brig)) score_arrested += 1
- else if (M.current.stat == 2) score_opkilled++
- if(foecount == score_arrested) score_allarrested = 1
- for(var/mob/living/carbon/human/player in world)
- if(player.mind)
- var/role = player.mind.assigned_role
- if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director"))
- if (player.stat == 2) score_deadcommand++
// Check station's power levels
- for (var/obj/machinery/power/apc/A in machines)
- if (!(A.z in config.station_levels)) continue
- for (var/obj/item/weapon/stock_parts/cell/C in A.contents)
- if (C.charge < 2300) score_powerloss += 1 // 200 charge leeway
+ for(var/obj/machinery/power/apc/A in machines)
+ if(!(A.z in config.station_levels)) continue
+
+ for(var/obj/item/weapon/stock_parts/cell/C in A.contents)
+ if(C.charge < 2300)
+ score_powerloss++ //200 charge leeway
+
// Check how much uncleaned mess is on the station
- for (var/obj/effect/decal/cleanable/M in world)
- if (!(M.z in config.station_levels)) continue
- if (istype(M, /obj/effect/decal/cleanable/blood/gibs/)) score_mess += 3
- if (istype(M, /obj/effect/decal/cleanable/blood/)) score_mess += 1
-// if (istype(M, /obj/effect/decal/cleanable/greenpuke)) score_mess += 1
- if (istype(M, /obj/effect/decal/cleanable/poop)) score_mess += 1
-// if (istype(M, /obj/decal/cleanable/urine)) score_mess += 1
- if (istype(M, /obj/effect/decal/cleanable/vomit)) score_mess += 1
+ for(var/obj/effect/decal/cleanable/M in world)
+ if(!(M.z in config.station_levels)) continue
+ if(istype(M, /obj/effect/decal/cleanable/blood/gibs))
+ score_mess += 3
+
+ if(istype(M, /obj/effect/decal/cleanable/blood))
+ score_mess += 1
+
+ if(istype(M, /obj/effect/decal/cleanable/poop))
+ score_mess += 1
+
+ if(istype(M, /obj/effect/decal/cleanable/vomit))
+ score_mess += 1
+
// Bonus Modifiers
//var/traitorwins = score_traitorswon
@@ -153,26 +119,10 @@
var/meals = score_meals * 5 //done, but this only counts cooked meals, not drinks served
var/power = score_powerloss * 20
var/messpoints
- if (score_mess != 0) messpoints = score_mess //done
+ if(score_mess != 0)
+ messpoints = score_mess //done
var/plaguepoints = score_disease * 30
- // Mode Specific
- if (ticker.mode.config_tag == "nuclear")
- if (score_disc) score_crewscore += 500
- var/killpoints = score_opkilled * 250
- var/arrestpoints = score_arrested * 1000
- score_crewscore += killpoints
- score_crewscore += arrestpoints
- if (score_nuked) score_crewscore -= nukedpenalty
-
- if (ticker.mode.config_tag == "revolution")
- var/arrestpoints = score_arrested * 1000
- var/killpoints = score_opkilled * 500
- var/comdeadpts = score_deadcommand * 500
- if (score_traitorswon) score_crewscore -= 10000
- score_crewscore += arrestpoints
- score_crewscore += killpoints
- score_crewscore -= comdeadpts
// Good Things
score_crewscore += shipping
@@ -182,23 +132,26 @@
score_crewscore += eventpoints
score_crewscore += escapoints
- if (power == 0)
+ if(power == 0)
score_crewscore += 2500
score_powerbonus = 1
- if (score_mess == 0)
+
+ if(score_mess == 0)
score_crewscore += 3000
score_messbonus = 1
- score_crewscore += meals
- if (score_allarrested) score_crewscore *= 3 // This needs to be here for the bonus to be applied properly
- // Bad Things
+
+ score_crewscore += meals
+ if(score_allarrested)
+ score_crewscore *= 3 // This needs to be here for the bonus to be applied properly
+
+
score_crewscore -= deathpoints
- if (score_deadaipenalty) score_crewscore -= 250
+ if(score_deadaipenalty)
+ score_crewscore -= 250
score_crewscore -= power
- //if (score_crewscore != 0) // Dont divide by zero!
- // while (traitorwins > 0)
- // score_crewscore /= 2
- // traitorwins -= 1
+
+
score_crewscore -= messpoints
score_crewscore -= plaguepoints
@@ -209,124 +162,60 @@
if(E.client)
if(E.client.prefs && !(E.client.prefs.toggles & DISABLE_SCOREBOARD))
E.scorestats()
- return
+/datum/game_mode/proc/get_scoreboard_stats()
+ return null
+
+/datum/game_mode/proc/set_scoreboard_gvars()
+ return null
/mob/proc/scorestats()
- var/dat = {"Round Statistics and Score
"}
- if (ticker.mode.name == "nuclear emergency")
- var/foecount = 0
- var/crewcount = 0
- var/diskdat = ""
- var/bombdat = null
- for(var/datum/mind/M in ticker.mode:syndicates)
- foecount++
- for(var/mob/living/C in world)
- if (!istype(C,/mob/living/carbon/human) || !istype(C,/mob/living/silicon/robot) || !istype(C,/mob/living/silicon/ai)) continue
- if (C.stat == 2) continue
- if (!C.client) continue
- crewcount++
+ var/dat = "Round Statistics and Score
"
+ if(ticker && ticker.mode)
+ dat += ticker.mode.get_scoreboard_stats()
- for(var/obj/item/weapon/disk/nuclear/N in world)
- if(!N) continue
- var/atom/disk_loc = N.loc
- while(!istype(disk_loc, /turf))
- if(istype(disk_loc, /mob))
- var/mob/M = disk_loc
- diskdat += "Carried by [M.real_name] "
- if(istype(disk_loc, /obj))
- var/obj/O = disk_loc
- diskdat += "in \a [O.name] "
- disk_loc = disk_loc.loc
- diskdat += "in [disk_loc.loc]"
- break // Should only need one go-round, probably
- var/nukedpenalty = 0
- for(var/obj/machinery/nuclearbomb/NUKE in world)
- if (NUKE.r_code == "Nope") continue
- var/turf/T = NUKE.loc
- bombdat = T.loc
- if (istype(T,/area/syndicate_station) || istype(T,/area/wizard_station) || istype(T,/area/solar/) || istype(T,/area)) nukedpenalty = 1000
- else if (istype(T,/area/security/main) || istype(T,/area/security/brig) || istype(T,/area/security/armoury) || istype(T,/area/security/checkpoint2)) nukedpenalty = 50000
- else if (istype(T,/area/engine)) nukedpenalty = 100000
- else nukedpenalty = 10000
- break
- if (!diskdat) diskdat = "Uh oh. Something has fucked up! Report this."
- dat += {"MODE STATS
- Number of Operatives: [foecount]
- Number of Surviving Crew: [crewcount]
- Final Location of Nuke: [bombdat]
- Final Location of Disk: [diskdat]
- Operatives Arrested: [score_arrested] ([score_arrested * 1000] Points)
- Operatives Killed: [score_opkilled] ([score_opkilled * 250] Points)
- Station Destroyed: [score_nuked ? "Yes" : "No"] (-[nukedpenalty] Points)
- All Operatives Arrested: [score_allarrested ? "Yes" : "No"] (Score tripled)
-
"}
-// Nuclear Disk Secure: [score_disc ? "Yes" : "No"] ([score_disc * 500] Points)
- if (ticker.mode.name == "revolution")
- var/foecount = 0
- var/comcount = 0
- var/revcount = 0
- var/loycount = 0
- for(var/datum/mind/M in ticker.mode:head_revolutionaries)
- if (M.current && M.current.stat != 2) foecount++
- for(var/datum/mind/M in ticker.mode:revolutionaries)
- if (M.current && M.current.stat != 2) revcount++
- for(var/mob/living/carbon/human/player in world)
- if(player.mind)
- var/role = player.mind.assigned_role
- if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director"))
- if (player.stat != 2) comcount++
- else
- if(player.mind in ticker.mode:revolutionaries) continue
- loycount++
- for(var/mob/living/silicon/X in world)
- if (X.stat != 2) loycount++
- var/revpenalty = 10000
- dat += {"MODE STATS
- Number of Surviving Revolution Heads: [foecount]
- Number of Surviving Command Staff: [comcount]
- Number of Surviving Revolutionaries: [revcount]
- Number of Surviving Loyal Crew: [loycount]
- Revolution Heads Arrested: [score_arrested] ([score_arrested * 1000] Points)
- Revolution Heads Slain: [score_opkilled] ([score_opkilled * 500] Points)
- Command Staff Slain: [score_deadcommand] (-[score_deadcommand * 500] Points)
- Revolution Successful: [score_traitorswon ? "Yes" : "No"] (-[score_traitorswon * revpenalty] Points)
- All Revolution Heads Arrested: [score_allarrested ? "Yes" : "No"] (Score tripled)
-
"}
-// var/totalfunds = wagesystem.station_budget + wagesystem.research_budget + wagesystem.shipping_budget
- dat += {"GENERAL STATS
- THE GOOD:
- Useful Items Shipped: [score_stuffshipped] ([score_stuffshipped * 5] Points)
- Hydroponics Harvests: [score_stuffharvested] ([score_stuffharvested * 5] Points)
- Ore Mined: [score_oremined] ([score_oremined * 2] Points)
- Refreshments Prepared: [score_meals] ([score_meals * 5] Points)
- Research Completed: [score_researchdone] ([score_researchdone * 30] Points)
"}
- if (!emergency_shuttle.location()) dat += "Shuttle Escapees: [score_escapees] ([score_escapees * 25] Points)
"
- dat += {"Random Events Endured: [score_eventsendured] ([score_eventsendured * 50] Points)
- Whole Station Powered: [score_powerbonus ? "Yes" : "No"] ([score_powerbonus * 2500] Points)
- Ultra-Clean Station: [score_mess ? "No" : "Yes"] ([score_messbonus * 3000] Points)
- THE BAD:
- Dead Bodies on Station: [score_deadcrew] (-[score_deadcrew * 25] Points)
- Uncleaned Messes: [score_mess] (-[score_mess] Points)
- Station Power Issues: [score_powerloss] (-[score_powerloss * 20] Points)
- Rampant Diseases: [score_disease] (-[score_disease * 30] Points)
- AI Destroyed: [score_deadaipenalty ? "Yes" : "No"] (-[score_deadaipenalty * 250] Points)
- THE WEIRD
"}
-/* Final Station Budget: $[num2text(totalfunds,50)]
"}
- var/profit = totalfunds - 100000
- if (profit > 0) dat += "Station Profit: +[num2text(profit,50)]
"
- else if (profit < 0) dat += "Station Deficit: [num2text(profit,50)]
"}*/
- dat += {"Food Eaten: [score_foodeaten]
- Times a Clown was Abused: [score_clownabuse]
"}
+ dat += {"
+ General Statistics
+ The Good:
+
+ Useful Items Shipped: [score_stuffshipped] ([score_stuffshipped * 5] Points)
+ Hydroponics Harvests: [score_stuffharvested] ([score_stuffharvested * 5] Points)
+ Ore Mined: [score_oremined] ([score_oremined * 2] Points)
+ Refreshments Prepared: [score_meals] ([score_meals * 5] Points)
+ Research Completed: [score_researchdone] ([score_researchdone * 30] Points)
"}
+ if (!emergency_shuttle.location()) dat += "Shuttle Escapees: [score_escapees] ([score_escapees * 25] Points)
"
+ dat += {"Random Events Endured: [score_eventsendured] ([score_eventsendured * 50] Points)
+ Whole Station Powered: [score_powerbonus ? "Yes" : "No"] ([score_powerbonus * 2500] Points)
+ Ultra-Clean Station: [score_mess ? "No" : "Yes"] ([score_messbonus * 3000] Points)
+ The bad:
+
+ Dead bodies on Station: [score_deadcrew] (-[score_deadcrew * 25] Points)
+ Uncleaned Messes: [score_mess] (-[score_mess] Points)
+ Station Power Issues: [score_powerloss] (-[score_powerloss * 20] Points)
+ Rampant Diseases: [score_disease] (-[score_disease * 30] Points)
+ AI Destroyed: [score_deadaipenalty ? "Yes" : "No"] (-[score_deadaipenalty * 250] Points)
+ The Weird
+
+ Food Eaten: [score_foodeaten]
+ Times a Clown was Abused: [score_clownabuse]
+ "}
if (score_escapees)
- dat += {"Richest Escapee: [score_richestname], [score_richestjob]: $[num2text(score_richestcash,50)] ([score_richestkey])
- Most Battered Escapee: [score_dmgestname], [score_dmgestjob]: [score_dmgestdamage] damage ([score_dmgestkey])
"}
+ dat += {"Richest Escapee: [score_richestname], [score_richestjob]: $[num2text(score_richestcash,50)] ([score_richestkey])
+ Most Battered Escapee: [score_dmgestname], [score_dmgestjob]: [score_dmgestdamage] damage ([score_dmgestkey])
"}
else
- if (emergency_shuttle.location()) dat += "The station wasn't evacuated!
"
- else dat += "No-one escaped!
"
- dat += {"
- FINAL SCORE: [score_crewscore]
"}
+ if(emergency_shuttle.location())
+ dat += "The station wasn't evacuated!
"
+ else
+ dat += "No-one escaped!
"
+
+ dat += ticker.mode.declare_job_completion()
+
+ dat += {"
+
+ FINAL SCORE: [score_crewscore]
+ "}
+
var/score_rating = "The Aristocrats!"
switch(score_crewscore)
if(-99999 to -50000) score_rating = "Even the Singularity Deserves Better"
@@ -345,6 +234,6 @@
if(5000 to 9999) score_rating = "Ambassadors of Discovery"
if(10000 to 49999) score_rating = "The Pride of Science Itself"
if(50000 to INFINITY) score_rating = "Nanotrasen's Finest"
- dat += "RATING: [score_rating]"
- src << browse(dat, "window=roundstats;size=500x600")
- return
\ No newline at end of file
+
+ dat += "RATING: [score_rating]"
+ src << browse(dat, "window=roundstats;size=500x600")
\ No newline at end of file
diff --git a/code/game/gamemodes/shadowling/shadowling_items.dm b/code/game/gamemodes/shadowling/shadowling_items.dm
index 863ea9c43a6..6af78895077 100644
--- a/code/game/gamemodes/shadowling/shadowling_items.dm
+++ b/code/game/gamemodes/shadowling/shadowling_items.dm
@@ -4,7 +4,7 @@
item_state = "golem"
origin_tech = null
icon_state = "golem"
- _color = "golem"
+ item_color = "golem"
flags = ABSTRACT | NODROP
has_sensor = 0
unacidable = 1
diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm
index 9914ba1c582..3e83033169d 100644
--- a/code/game/gamemodes/vampire/vampire_powers.dm
+++ b/code/game/gamemodes/vampire/vampire_powers.dm
@@ -347,7 +347,7 @@
if(locs.len == 2) //we found 2 locations and thats all we need
break
var/turf/T = get_step(M.current,direction) //getting a loc in that direction
- if(AStar(M.current.loc, T, /turf/proc/AdjacentTurfs, /turf/proc/Distance, 1)) // if a path exists, so no dense objects in the way its valid salid
+ if(AStar(M.current.loc, T, /turf/proc/AdjacentTurfs, /turf/proc/Distance, 1, simulated_only = 0)) // if a path exists, so no dense objects in the way its valid salid
locs += T
if(locs.len)
for(var/turf/tospawn in locs)
diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm
index e113e525c04..257f82dc3c0 100644
--- a/code/game/jobs/job/supervisor.dm
+++ b/code/game/jobs/job/supervisor.dm
@@ -129,9 +129,9 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
H.equip_or_collect(new /obj/item/weapon/melee/baton/loaded/ntcane(H.back), slot_in_backpack)
H.equip_or_collect(new /obj/item/weapon/lighter/zippo/nt_rep(H.back), slot_in_backpack)
- H.equip_if_possible(new /obj/item/clothing/under/rank/ntrep(H), slot_w_uniform)
- H.equip_if_possible(new /obj/item/clothing/suit/storage/ntrep(H), slot_wear_suit)
- H.equip_if_possible(new /obj/item/clothing/shoes/centcom(H), slot_shoes)
+ H.equip_or_collect(new /obj/item/clothing/under/rank/ntrep(H), slot_w_uniform)
+ H.equip_or_collect(new /obj/item/clothing/suit/storage/ntrep(H), slot_wear_suit)
+ H.equip_or_collect(new /obj/item/clothing/shoes/centcom(H), slot_shoes)
H.equip_or_collect(new /obj/item/device/pda/heads/ntrep(H), slot_wear_pda)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
L.imp_in = H
@@ -172,8 +172,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
H.equip_or_collect(new /obj/item/clothing/gloves/combat(H), slot_gloves)
H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_or_collect(new /obj/item/clothing/glasses/hud/health_advanced, slot_glasses)
- H.equip_if_possible(new /obj/item/clothing/under/rank/blueshield(H), slot_w_uniform)
- H.equip_if_possible(new /obj/item/clothing/suit/armor/vest/blueshield(H), slot_wear_suit)
+ H.equip_or_collect(new /obj/item/clothing/under/rank/blueshield(H), slot_w_uniform)
+ H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/blueshield(H), slot_wear_suit)
H.equip_or_collect(new /obj/item/weapon/gun/energy/advtaser(H), slot_s_store)
H.equip_or_collect(new /obj/item/device/pda/heads/blueshield(H), slot_wear_pda)
if(H.backbag == 1)
@@ -215,9 +215,9 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
- H.equip_if_possible(new /obj/item/clothing/under/suit_jacket/really_black(H), slot_w_uniform)
- H.equip_if_possible(new /obj/item/clothing/suit/judgerobe(H), slot_wear_suit)
- H.equip_if_possible(new /obj/item/clothing/shoes/centcom(H), slot_shoes)
+ H.equip_or_collect(new /obj/item/clothing/under/suit_jacket/really_black(H), slot_w_uniform)
+ H.equip_or_collect(new /obj/item/clothing/suit/judgerobe(H), slot_wear_suit)
+ H.equip_or_collect(new /obj/item/clothing/shoes/centcom(H), slot_shoes)
H.equip_or_collect(new /obj/item/clothing/head/powdered_wig(H), slot_head)
H.equip_or_collect(new /obj/item/clothing/glasses/sunglasses/sechud(H), slot_glasses)
H.equip_or_collect(new /obj/item/device/pda/heads/magistrate(H), slot_wear_pda)
diff --git a/code/game/jobs/job_objective.dm b/code/game/jobs/job_objective.dm
index 1efb8ba0c76..8860cdf4931 100644
--- a/code/game/jobs/job_objective.dm
+++ b/code/game/jobs/job_objective.dm
@@ -1,12 +1,12 @@
-/datum/mind/var/list/job_objectives=list()
+/datum/mind/var/list/job_objectives = list()
#define FINDJOBTASK_DEFAULT_NEW 1 // Make a new task of this type if one can't be found.
-/datum/mind/proc/findJobTask(var/typepath,var/options=0)
- var/datum/job_objective/task = locate(typepath) in src.job_objectives
+/datum/mind/proc/findJobTask(var/typepath, var/options = 0)
+ var/datum/job_objective/task = locate(typepath) in job_objectives
if(!istype(task,typepath))
if(options & FINDJOBTASK_DEFAULT_NEW)
task = new typepath()
- src.job_objectives += task
+ job_objectives += task
return task
/datum/job_objective
@@ -19,13 +19,13 @@
var/completion_payment = 0 // Credits paid to owner when completed
/datum/job_objective/New(var/datum/mind/new_owner)
- owner=new_owner
+ owner = new_owner
owner.job_objectives += src
-/datum/job_objective/Destroy()
/datum/job_objective/proc/get_description()
- return "Placeholder objective."
+ var/desc = "Placeholder Objective"
+ return desc
/datum/job_objective/proc/unit_completed(var/count=1)
units_completed += count
@@ -36,47 +36,41 @@
return completed
/datum/job_objective/proc/check_for_completion()
- return per_unit && units_completed > 0
+ if(per_unit)
+ if(units_completed > 0)
+ return 1
+ return 0
/datum/game_mode/proc/declare_job_completion()
- var/text = "Job Completion:"
- var/numEmployees=0
+ var/text = "
Job Completion"
+
for(var/datum/mind/employee in ticker.minds)
+
if(!employee.job_objectives.len)//If the employee had no objectives, don't need to process this.
continue
+
if(!employee.assigned_role=="MODE")//If the employee is a gamemode thing, skip.
continue
- numEmployees++
+
var/tasks_completed=0
- //text += "[L.name] ([ckey(D.mind.key)]), the [L.job]:\n"
- text += "
[employee.key] was [employee.name], the [employee.assigned_role] ("
- if(employee.current)
- if(employee.current.stat == DEAD)
- text += "died"
- else
- text += "survived"
- if(employee.current.real_name != employee.name)
- text += " as [employee.current.real_name]"
- else
- text += "body destroyed"
- text += ")"
+ text += "
[employee.name] was a [employee.assigned_role]:"
var/count = 1
for(var/datum/job_objective/objective in employee.job_objectives)
if(objective.is_completed(1))
- text += "
Task #[count]: [objective.get_description()] Completed!"
+ text += "
- Task #[count]: [objective.get_description()] Completed!"
feedback_add_details("employee_objective","[objective.type]|SUCCESS")
tasks_completed++
else
+ text += "
- Task #[count]: [objective.get_description()] Failed."
feedback_add_details("employee_objective","[objective.type]|FAIL")
count++
- if(tasks_completed>=1)
- text += "
The [employee.assigned_role] did their fucking job!"
+ if(tasks_completed >= 1)
+ text += "
[employee.name] did their fucking job!"
feedback_add_details("employee_success","SUCCESS")
else
feedback_add_details("employee_success","FAIL")
- if(numEmployees>0)
- world << text
- return 1
\ No newline at end of file
+
+ return text
\ No newline at end of file
diff --git a/code/game/jobs/job_objectives/science.dm b/code/game/jobs/job_objectives/science.dm
index 996193ba66e..64cd041838c 100644
--- a/code/game/jobs/job_objectives/science.dm
+++ b/code/game/jobs/job_objectives/science.dm
@@ -4,21 +4,21 @@
// MAXIMUM SCIENCE
/datum/job_objective/maximize_research
- completion_payment=1000
+ completion_payment = 1000
/datum/job_objective/maximize_research/get_description()
- return "Maximize all legal research tech levels."
+ var/desc = "Maximize all legal research tech levels."
+ return desc
/datum/job_objective/maximize_research/check_for_completion()
var/obj/machinery/r_n_d/server/server = null
for(var/obj/machinery/r_n_d/server/serber in machines)
if(serber.name == "Core R&D Server")
- server=serber
+ server = serber
break
if(!server)
- // This was just used for testing.
- //world << "UNABLE TO FIND A GODDAMN RND SERVER. FUCK."
- return
+ return 0
+
for(var/datum/tech/T in server.files.possible_tech)
if(T.max_level==0) // Ignore illegal tech, etc
continue
@@ -33,28 +33,24 @@
// Robotics
/////////////////////////////////////////////////////////////////////////////////////////
-// Mek cyburg
+//Cyborgs
/datum/job_objective/make_cyborg
- completion_payment=100
- per_unit=1
+ completion_payment = 100
+ per_unit = 1
/datum/job_objective/make_cyborg/get_description()
- return "Make a cyborg. ([units_completed] created.)"
-/*
-// Mek MoMMI
-/datum/job_objective/make_mommi
- completion_payment=150
- per_unit=1
+ var/desc = "Make a cyborg."
+ desc += "([units_completed] created.)"
+ return desc
-/datum/job_objective/make_mommi/get_description()
- return "Make a Mobile MMI. ([units_completed] created.)"
-*/
-// Mek Ripley
+
+
+//RIPLEY's
/datum/job_objective/make_ripley
- completion_payment=600
- per_unit=1
+ completion_payment = 600
+ per_unit = 1
/datum/job_objective/make_ripley/get_description()
- return "Make a Ripley. ([units_completed] created.)"
-
-
+ var/desc = "Make a Ripley."
+ desc += "([units_completed] created.)"
+ return desc
\ No newline at end of file
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 582a8466e22..6cb48aef355 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -290,7 +290,7 @@
/obj/machinery/sleeper/blob_act()
if(prob(75))
for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
+ A.forceMove(src.loc)
A.blob_act()
qdel(src)
return
@@ -299,14 +299,16 @@
/obj/machinery/sleeper/attackby(var/obj/item/weapon/G as obj, var/mob/user as mob, params)
if(istype(G, /obj/item/weapon/reagent_containers/glass))
if(!beaker)
- if (user.drop_item())
- beaker = G
- G.forceMove(src)
- user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!")
- src.updateUsrDialog()
+ if (!user.drop_item())
+ user << "\The [G] is stuck to you!"
return
- else
- user << "\The [G] is stuck to you!"
+
+ beaker = G
+ G.forceMove(src)
+ user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!")
+ src.updateUsrDialog()
+ return
+
else
user << "\red The sleeper has a beaker already."
return
@@ -363,7 +365,7 @@
if(M.client)
M.client.perspective = EYE_PERSPECTIVE
M.client.eye = src
- M.loc = src
+ M.forceMove(src)
src.occupant = M
src.icon_state = "sleeper"
M << "\blue You feel cool air surround you. You go numb as your senses turn inward."
@@ -380,21 +382,21 @@
switch(severity)
if(1.0)
for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
+ A.forceMove(src.loc)
ex_act(severity)
qdel(src)
return
if(2.0)
if(prob(50))
for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
+ A.forceMove(src.loc)
ex_act(severity)
qdel(src)
return
if(3.0)
if(prob(25))
for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
+ A.forceMove(src.loc)
ex_act(severity)
qdel(src)
return
@@ -439,7 +441,7 @@
if(src.occupant.client)
src.occupant.client.eye = src.occupant.client.mob
src.occupant.client.perspective = MOB_PERSPECTIVE
- src.occupant.loc = src.loc
+ src.occupant.forceMove(src.loc)
src.occupant = null
icon_state = "sleeper-open"
return
@@ -510,7 +512,7 @@
return
if(beaker)
filtering = 0
- beaker.loc = usr.loc
+ beaker.forceMove(usr.loc)
beaker = null
add_fingerprint(usr)
return
@@ -566,7 +568,7 @@
if(L.client)
L.client.perspective = EYE_PERSPECTIVE
L.client.eye = src
- L.loc = src
+ L.forceMove(src)
src.occupant = L
src.icon_state = "sleeper"
L << "\blue You feel cool air surround you. You go numb as your senses turn inward."
@@ -605,7 +607,7 @@
usr.stop_pulling()
usr.client.perspective = EYE_PERSPECTIVE
usr.client.eye = src
- usr.loc = src
+ usr.forceMove(src)
src.occupant = usr
src.icon_state = "sleeper"
@@ -613,4 +615,4 @@
qdel(O)
src.add_fingerprint(usr)
return
- return
+ return
\ No newline at end of file
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 86d7b5ac00d..8cbe56b2d3b 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -607,9 +607,6 @@
src.add_hiddenprint(user)
return ui_interact(user)
-/obj/machinery/alarm/attack_robot(mob/user)
- return attack_ai(user)
-
/obj/machinery/alarm/attack_ghost(user as mob)
if(stat & (BROKEN|MAINT))
return
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index b68b74313d5..99db01bfae2 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -57,7 +57,7 @@ var/datum/canister_icons/canister_icon_container = new()
var/valve_open = 0
var/release_pressure = ONE_ATMOSPHERE
- var/list/_color //variable that stores colours
+ var/list/canister_color //variable that stores colours
var/list/decals //list that stores the decals
//lists for check_change()
@@ -81,7 +81,7 @@ var/datum/canister_icons/canister_icon_container = new()
New()
..()
- _color = list(
+ canister_color = list(
"prim" = "yellow",
"sec" = "none",
"ter" = "none",
@@ -117,7 +117,7 @@ var/datum/canister_icons/canister_icon_container = new()
for(var/C in colorcontainer)
if(C == "prim") continue
var/list/L = colorcontainer[C]
- if(!(_color[C]) || (_color[C] == "none"))
+ if(!(canister_color[C]) || (canister_color[C] == "none"))
L.Add(list("anycolor" = 0))
else
L.Add(list("anycolor" = 1))
@@ -151,9 +151,9 @@ var/datum/canister_icons/canister_icon_container = new()
else
update_flag |= 32
- if(list2params(oldcolor) != list2params(_color))
+ if(list2params(oldcolor) != list2params(canister_color))
update_flag |= 64
- oldcolor = _color.Copy()
+ oldcolor = canister_color.Copy()
if(list2params(olddecals) != list2params(decals))
update_flag |= 128
@@ -180,20 +180,20 @@ update_flag
if (src.destroyed)
src.overlays = 0
- src.icon_state = text("[]-1", src._color["prim"])//yes, I KNOW the colours don't reflect when the can's borked, whatever.
+ src.icon_state = text("[]-1", src.canister_color["prim"])//yes, I KNOW the colours don't reflect when the can's borked, whatever.
- if(icon_state != src._color["prim"])
- icon_state = src._color["prim"]
+ if(icon_state != src.canister_color["prim"])
+ icon_state = src.canister_color["prim"]
if(check_change()) //Returns 1 if no change needed to icons.
return
overlays.Cut()
- for(var/C in _color)
+ for(var/C in canister_color)
if(C == "prim") continue
- if(_color[C] == "none") continue
- overlays.Add(_color[C])
+ if(canister_color[C] == "none") continue
+ overlays.Add(canister_color[C])
for(var/D in decals)
if(decals[D])
@@ -393,7 +393,7 @@ update_flag
data["name"] = name
data["menu"] = menu ? 1 : 0
data["canLabel"] = can_label ? 1 : 0
- data["_color"] = _color
+ data["canister_color"] = canister_color
data["colorContainer"] = colorcontainer
data["possibleDecals"] = possibledecals
data["portConnected"] = connected_port ? 1 : 0
@@ -482,22 +482,22 @@ update_flag
if (href_list["choice"] == "Primary color")
if (is_a_color(href_list["icon"],"prim"))
- _color["prim"] = href_list["icon"]
+ canister_color["prim"] = href_list["icon"]
if (href_list["choice"] == "Secondary color")
if (href_list["icon"] == "none")
- _color["sec"] = "none"
+ canister_color["sec"] = "none"
else if (is_a_color(href_list["icon"],"sec"))
- _color["sec"] = href_list["icon"]
+ canister_color["sec"] = href_list["icon"]
if (href_list["choice"] == "Tertiary color")
if (href_list["icon"] == "none")
- _color["ter"] = "none"
+ canister_color["ter"] = "none"
else if (is_a_color(href_list["icon"],"ter"))
- _color["ter"] = href_list["icon"]
+ canister_color["ter"] = href_list["icon"]
if (href_list["choice"] == "Quaternary color")
if (href_list["icon"] == "none")
- _color["quart"] = "none"
+ canister_color["quart"] = "none"
else if (is_a_color(href_list["icon"],"quart"))
- _color["quart"] = href_list["icon"]
+ canister_color["quart"] = href_list["icon"]
if (href_list["choice"] == "decals")
if (is_a_decal(href_list["icon"]))
@@ -542,7 +542,7 @@ update_flag
/obj/machinery/portable_atmospherics/canister/toxins/New()
..()
- _color["prim"] = "orange"
+ canister_color["prim"] = "orange"
decals["plasma"] = 1
src.air_contents.toxins = (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
@@ -552,7 +552,7 @@ update_flag
/obj/machinery/portable_atmospherics/canister/oxygen/New()
..()
- _color["prim"] = "blue"
+ canister_color["prim"] = "blue"
src.air_contents.oxygen = (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
src.update_icon()
@@ -561,7 +561,7 @@ update_flag
/obj/machinery/portable_atmospherics/canister/sleeping_agent/New()
..()
- _color["prim"] = "redws"
+ canister_color["prim"] = "redws"
var/datum/gas/sleeping_agent/trace_gas = new
air_contents.trace_gases += trace_gas
trace_gas.moles = (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
@@ -588,7 +588,7 @@ update_flag
/obj/machinery/portable_atmospherics/canister/nitrogen/New()
..()
- _color["prim"] = "red"
+ canister_color["prim"] = "red"
src.air_contents.nitrogen = (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
src.update_icon()
@@ -597,7 +597,7 @@ update_flag
/obj/machinery/portable_atmospherics/canister/carbon_dioxide/New()
..()
- _color["prim"] = "black"
+ canister_color["prim"] = "black"
src.air_contents.carbon_dioxide = (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
src.update_icon()
@@ -607,7 +607,7 @@ update_flag
/obj/machinery/portable_atmospherics/canister/air/New()
..()
- _color["prim"] = "grey"
+ canister_color["prim"] = "grey"
src.air_contents.oxygen = (O2STANDARD*src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
src.air_contents.nitrogen = (N2STANDARD*src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
@@ -617,7 +617,7 @@ update_flag
/obj/machinery/portable_atmospherics/canister/custom_mix/New()
..()
- _color["prim"] = "whiters"
+ canister_color["prim"] = "whiters"
src.update_icon() // Otherwise new canisters do not have their icon updated with the pressure light, likely want to add this to the canister class constructor, avoiding at current time to refrain from screwing up code for other canisters. --DZD
return 1
diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm
index 40859fed3b6..34fa34e1188 100644
--- a/code/game/machinery/biogenerator.dm
+++ b/code/game/machinery/biogenerator.dm
@@ -70,8 +70,10 @@
user << "A container is already loaded into the machine."
return
else
- user.unEquip(O)
- O.loc = src
+ if(!user.drop_item())
+ user << "\The [O] is stuck to you!"
+ return
+ O.forceMove(src)
beaker = O
user << "You add the container to the machine."
updateUsrDialog()
@@ -82,7 +84,7 @@
if(default_deconstruction_screwdriver(user, "biogen-empty-o", "biogen-empty", O))
if(beaker)
var/obj/item/weapon/reagent_containers/glass/B = beaker
- B.loc = loc
+ B.forceMove(loc)
beaker = null
return
@@ -104,7 +106,7 @@
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents)
if(i >= max_items)
break
- G.loc = src
+ G.forceMove(src)
i++
if(i < max_items)
user << "You empty the plant bag into the biogenerator."
@@ -123,7 +125,7 @@
user << "The biogenerator is full! Activate it."
else
user.unEquip(O)
- O.loc = src
+ O.forceMove(src)
user << "You put [O.name] in [src.name]"
@@ -339,7 +341,7 @@
/obj/machinery/biogenerator/proc/detach()
if(beaker)
- beaker.loc = src.loc
+ beaker.forceMove(src.loc)
beaker = null
update_icon()
diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index b7cba392b2e..7491a88c9a8 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -448,7 +448,7 @@ obj/machinery/bot/proc/bot_step(var/dest)
var/datum/job/captain/All = new/datum/job/captain
all_access.access = All.get_access()
- path = AStar(src, waypoint, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance_cardinal, 0, 200, id=all_access)
+ path = get_path_to(src, waypoint, src, /turf/proc/Distance_cardinal, 0, 200, id=all_access)
calling_ai = caller //Link the AI to the bot!
ai_waypoint = waypoint
@@ -741,13 +741,13 @@ obj/machinery/bot/proc/bot_summon()
// given an optional turf to avoid
/obj/machinery/bot/proc/calc_path(var/turf/avoid)
check_bot_access()
- path = AStar(loc, patrol_target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance_cardinal, 0, 120, id=botcard, exclude=avoid)
+ path = get_path_to(loc, patrol_target, src, /turf/proc/Distance_cardinal, 0, 120, id=botcard, exclude=avoid)
if(!path)
path = list()
/obj/machinery/bot/proc/calc_summon_path(var/turf/avoid)
check_bot_access()
- path = AStar(loc, summon_target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance_cardinal, 0, 150, id=botcard, exclude=avoid)
+ path = get_path_to(loc, summon_target, src, /turf/proc/Distance_cardinal, 0, 150, id=botcard, exclude=avoid)
if(!path || tries >= 5) //Cannot reach target. Give up and announce the issue.
speak("Summon command failed, destination unreachable.", radio_name)
bot_reset()
diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm
index 9f7ac7500bd..d363a358870 100644
--- a/code/game/machinery/bots/cleanbot.dm
+++ b/code/game/machinery/bots/cleanbot.dm
@@ -184,7 +184,7 @@ text("[on ? "On" : "Off"]"))
if(target)
if(!path || path.len == 0) //No path, need a new one
//Try to produce a path to the target, and ignore airlocks to which it has access.
- path = AStar(loc, target.loc, /turf/proc/AdjacentTurfsWithAccess, /turf/proc/Distance, 0, 30, id=botcard)
+ path = get_path_to(loc, target.loc, src, /turf/proc/Distance_cardinal, 0, 30, id=botcard)
if (!bot_move(target))
add_to_ignore(target)
target = null
diff --git a/code/game/machinery/bots/farmbot.dm b/code/game/machinery/bots/farmbot.dm
deleted file mode 100644
index c8775c7f5ca..00000000000
--- a/code/game/machinery/bots/farmbot.dm
+++ /dev/null
@@ -1,597 +0,0 @@
-//Farmbots by GauHelldragon - 12/30/2012
-// A new type of buildable aiBot that helps out in hydroponics
-
-// Made by using a robot arm on a water tank and then adding:
-// A plant analyzer, a bucket, a mini-hoe and then a proximity sensor (in that order)
-
-// Will water, weed and fertilize plants that need it
-// When emagged, it will "water", "weed" and "fertilize" humans instead
-// Holds up to 10 fertilizers (only the type dispensed by the machines, not chemistry bottles)
-// It will fill up it's water tank at a sink when low.
-
-// The behavior panel can be unlocked with hydroponics access and be modified to disable certain behaviors
-// By default, it will ignore weeds and mushrooms, but can be set to tend to these types of plants as well.
-
-//Seems a little stupid handling multiple Go direction X,Y,Z to do Job F,G,H if it's in multiple directions so I'd reccomend only enabling 1 water/fertilize/weed task at a time. - SarahJohnson
-
-
-#define FARMBOT_MODE_WATER 1
-#define FARMBOT_MODE_FERTILIZE 2
-#define FARMBOT_MODE_WEED 3
-#define FARMBOT_MODE_REFILL 4
-#define FARMBOT_MODE_WAITING 5
-
-#define FARMBOT_ANIMATION_TIME 25 //How long it takes to use one of the action animations
-#define FARMBOT_EMAG_DELAY 60 //How long of a delay after doing one of the emagged attack actions
-#define FARMBOT_ACTION_DELAY 35 //How long of a delay after doing one of the normal actions
-
-/obj/machinery/bot/farmbot
- name = "Farmbot"
- desc = "The botanist's best friend."
- icon = 'icons/obj/aibots.dmi'
- icon_state = "farmbot0"
- layer = 5.0
- density = 1
- anchored = 0
- health = 50
- maxhealth = 50
- req_access =list(access_hydroponics)
-
- var/Max_Fertilizers = 10
-
- var/setting_water = 1
- var/setting_refill = 1
- var/setting_fertilize = 1
- var/setting_weed = 1
- var/setting_ignoreWeeds = 1
- var/setting_ignoreMushrooms = 1
-
- var/atom/target //Current target, can be a human, a hydroponics tray, or a sink
- var/mode //Which mode is being used, 0 means it is looking for work
-
- var/obj/structure/reagent_dispensers/watertank/tank // the water tank that was used to make it, remains inside the bot.
-
- var/path[] = new() // used for pathing
- var/frustration
-
-/obj/machinery/bot/farmbot/New()
- ..()
- src.icon_state = "farmbot[src.on]"
- spawn (4)
- src.botcard = new /obj/item/weapon/card/id(src)
- src.botcard.access = req_access
-
- if ( !tank ) //Should be set as part of making it... but lets check anyway
- tank = locate(/obj/structure/reagent_dispensers/watertank/) in contents
- if ( !tank ) //An admin must have spawned the farmbot! Better give it a tank.
- tank = new /obj/structure/reagent_dispensers/watertank(src)
-
-/obj/machinery/bot/farmbot/Bump(M as mob|obj) //Leave no door unopened!
- spawn(0)
- if ((istype(M, /obj/machinery/door)) && (!isnull(src.botcard)))
- var/obj/machinery/door/D = M
- if (!istype(D, /obj/machinery/door/firedoor) && D.check_access(src.botcard))
- D.open()
- src.frustration = 0
- return
- return
-
-/obj/machinery/bot/farmbot/turn_on()
- . = ..()
- src.icon_state = "farmbot[src.on]"
- src.updateUsrDialog()
-
-/obj/machinery/bot/farmbot/turn_off()
- ..()
- src.path = new()
- src.icon_state = "farmbot[src.on]"
- src.updateUsrDialog()
-
-/obj/machinery/bot/farmbot/attack_paw(mob/user as mob)
- return attack_hand(user)
-
-
-/obj/machinery/bot/farmbot/proc/get_total_ferts()
- var total_fert = 0
- for (var/obj/item/nutrient/fert in contents)
- total_fert++
- return total_fert
-
-/obj/machinery/bot/farmbot/attack_hand(mob/user as mob)
- . = ..()
- if (.)
- return
- var/dat
- dat += "Automatic Hydroponic Assisting Unit v1.0
"
- dat += "Status: [src.on ? "On" : "Off"]
"
-
- dat += "Water Tank: "
- if ( tank )
- dat += "\[[tank.reagents.total_volume]/[tank.reagents.maximum_volume]\]"
- else
- dat += "Error: Water Tank not Found"
-
- dat += "
Fertilizer Storage: \[[get_total_ferts()]/[Max_Fertilizers]\]"
-
- dat += "
Behaviour controls are [src.locked ? "locked" : "unlocked"]
"
- if(!src.locked)
- dat += "Watering Controls:
"
- dat += " Water Plants : [src.setting_water ? "Yes" : "No"]
"
- dat += " Refill Watertank : [src.setting_refill ? "Yes" : "No"]
"
- dat += "
Fertilizer Controls:
"
- dat += " Fertilize Plants : [src.setting_fertilize ? "Yes" : "No"]
"
- dat += "
Weeding Controls:
"
- dat += " Weed Plants : [src.setting_weed ? "Yes" : "No"]
"
- dat += "
Ignore Weeds : [src.setting_ignoreWeeds ? "Yes" : "No"]
"
- dat += "Ignore Mushrooms : [src.setting_ignoreMushrooms ? "Yes" : "No"]
"
- dat += ""
-
- user << browse("Farmbot v1.0 controls[dat]", "window=autofarm")
- onclose(user, "autofarm")
- return
-
-/obj/machinery/bot/farmbot/Topic(href, href_list)
- if(..())
- return
- usr.machine = src
- src.add_fingerprint(usr)
- if ((href_list["power"]) && (src.allowed(usr)))
- if (src.on)
- turn_off()
- else
- turn_on()
-
- else if((href_list["water"]) && (!src.locked))
- setting_water = !setting_water
- else if((href_list["refill"]) && (!src.locked))
- setting_refill = !setting_refill
- else if((href_list["fertilize"]) && (!src.locked))
- setting_fertilize = !setting_fertilize
- else if((href_list["weed"]) && (!src.locked))
- setting_weed = !setting_weed
- else if((href_list["ignoreWeed"]) && (!src.locked))
- setting_ignoreWeeds = !setting_ignoreWeeds
- else if((href_list["ignoreMush"]) && (!src.locked))
- setting_ignoreMushrooms = !setting_ignoreMushrooms
- else if (href_list["eject"] )
- flick("farmbot_hatch",src)
- for (var/obj/item/nutrient/fert in contents)
- fert.loc = get_turf(src)
-
- src.updateUsrDialog()
- return
-
-/obj/machinery/bot/farmbot/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
- if (src.allowed(user))
- src.locked = !src.locked
- user << "Controls are now [src.locked ? "locked." : "unlocked."]"
- src.updateUsrDialog()
- else
- user << "\red Access denied."
-
- else if (istype(W, /obj/item/nutrient))
- if ( get_total_ferts() >= Max_Fertilizers )
- user << "The fertilizer storage is full!"
- return
- user.drop_item()
- W.loc = src
- user << "You insert [W]."
- flick("farmbot_hatch",src)
- src.updateUsrDialog()
- return
-
- else
- ..()
-
-/obj/machinery/bot/farmbot/Emag(mob/user as mob)
- ..()
- if(user) user << "\red You short out [src]'s plant identifier circuits."
- spawn(0)
- for(var/mob/O in hearers(src, null))
- O.show_message("\red [src] buzzes oddly!", 1)
- flick("farmbot_broke", src)
- src.emagged = 1
- src.on = 1
- src.icon_state = "farmbot[src.on]"
- target = null
- mode = FARMBOT_MODE_WAITING //Give the emagger a chance to get away! 15 seconds should be good.
- spawn(150)
- mode = 0
-
-/obj/machinery/bot/farmbot/explode()
- src.on = 0
- visible_message("\red [src] blows apart!", 1)
- var/turf/Tsec = get_turf(src)
-
- new /obj/item/weapon/minihoe(Tsec)
- new /obj/item/weapon/reagent_containers/glass/bucket(Tsec)
- new /obj/item/device/assembly/prox_sensor(Tsec)
- new /obj/item/device/analyzer/plant_analyzer(Tsec)
-
- if ( tank )
- tank.loc = Tsec
-
- for ( var/obj/item/nutrient/fert in contents )
- if ( prob(50) )
- fert.loc = Tsec
-
- if (prob(50))
- new /obj/item/robot_parts/l_arm(Tsec)
-
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- del(src)
- return
-
-/obj/machinery/bot/farmbot/process()
- //set background = 1
-
- if(!src.on)
- return
-
- if ( emagged && prob(1) )
- flick("farmbot_broke", src)
-
- if ( mode == FARMBOT_MODE_WAITING )
- return
-
- if ( !mode || !target || !(target in view(7,src)) ) //Don't bother chasing down targets out of view
-
- mode = 0
- target = null
- if ( !find_target() )
- // Couldn't find a target, wait a while before trying again.
- mode = FARMBOT_MODE_WAITING
- spawn(100)
- mode = 0
- return
-
- if ( mode && target )
- if ( get_dist(target,src) <= 1 || ( emagged && mode == FARMBOT_MODE_FERTILIZE ) )
- // If we are in emagged fertilize mode, we throw the fertilizer, so distance doesn't matter
- frustration = 0
- use_farmbot_item()
- else
- move_to_target()
- return
-
-/obj/machinery/bot/farmbot/proc/use_farmbot_item()
- if ( !target )
- mode = 0
- return 0
-
- if ( emagged && !ismob(target) ) // Humans are plants!
- mode = 0
- target = null
- return 0
-
- if ( !emagged && !istype(target,/obj/machinery/hydroponics) && !istype(target,/obj/structure/sink) ) // Humans are not plants!
- mode = 0
- target = null
- return 0
-
- if ( mode == FARMBOT_MODE_FERTILIZE )
- //Find which fertilizer to use
- var/obj/item/nutrient/fert
- for ( var/obj/item/nutrient/nut in contents )
- fert = nut
- break
- if ( !fert )
- target = null
- mode = 0
- return
- fertilize(fert)
-
- if ( mode == FARMBOT_MODE_WEED )
- weed()
-
- if ( mode == FARMBOT_MODE_WATER )
- water()
-
- if ( mode == FARMBOT_MODE_REFILL )
- refill()
-
-
-
-
-/obj/machinery/bot/farmbot/proc/find_target()
- if ( emagged ) //Find a human and help them!
- for ( var/mob/living/carbon/human/human in view(7,src) )
- if (human.stat == 2)
- continue
-
- var list/options = list(FARMBOT_MODE_WEED)
- if ( get_total_ferts() )
- options.Add(FARMBOT_MODE_FERTILIZE)
- if ( tank && tank.reagents.total_volume >= 1 )
- options.Add(FARMBOT_MODE_WATER)
- mode = pick(options)
- target = human
- return mode
- return 0
- else
- if ( setting_refill && tank && tank.reagents.total_volume < 100 )
- for ( var/obj/structure/sink/source in view(7,src) )
- target = source
- mode = FARMBOT_MODE_REFILL
- return 1
- for ( var/obj/machinery/hydroponics/tray in view(7,src) )
- var newMode = GetNeededMode(tray)
- if ( newMode )
- mode = newMode
- target = tray
- return 1
- return 0
-
-/obj/machinery/bot/farmbot/proc/GetNeededMode(obj/machinery/hydroponics/tray)
- if ( !tray.planted || tray.dead )
- return 0
- if ( tray.myseed.plant_type == 1 && setting_ignoreWeeds )
- return 0
- if ( tray.myseed.plant_type == 2 && setting_ignoreMushrooms )
- return 0
-
- if ( setting_water && tray.waterlevel <= 10 && tank && tank.reagents.total_volume >= 1 )
- return FARMBOT_MODE_WATER
-
- if ( setting_weed && tray.weedlevel >= 5 )
- return FARMBOT_MODE_WEED
-
- if ( setting_fertilize && tray.nutrilevel <= 2 && get_total_ferts() )
- return FARMBOT_MODE_FERTILIZE
-
- return 0
-
-/obj/machinery/bot/farmbot/proc/move_to_target()
- //Mostly copied from medibot code.
-
- if(src.frustration > 8)
- target = null
- mode = 0
- frustration = 0
- src.path = new()
- if(src.target && (src.path.len) && (get_dist(src.target,src.path[src.path.len]) > 2))
- src.path = new()
- if(src.target && src.path.len == 0 && (get_dist(src,src.target) > 1))
- spawn(0)
- var/turf/dest = get_step_towards(target,src) //Can't pathfind to a tray, as it is dense, so pathfind to the spot next to the tray
-
- src.path = AStar(src.loc, dest, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30,id=botcard)
- if(src.path.len == 0)
- for ( var/turf/spot in orange(1,target) ) //The closest one is unpathable, try the other spots
- if ( spot == dest ) //We already tried this spot
- continue
- if ( spot.density )
- continue
- src.path = AStar(src.loc, spot, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30,id=botcard)
- src.path = reverselist(src.path)
- if ( src.path.len > 0 )
- break
-
- if ( src.path.len == 0 )
- target = null
- mode = 0
- return
-
- if(src.path.len > 0 && src.target)
- step_to(src, src.path[1])
- src.path -= src.path[1]
- spawn(3)
- if(src.path.len)
- step_to(src, src.path[1])
- src.path -= src.path[1]
-
- if(src.path.len > 8 && src.target)
- src.frustration++
-
-
-/obj/machinery/bot/farmbot/proc/fertilize(obj/item/nutrient/fert)
- if ( !fert )
- target = null
- mode = 0
- return 0
-
- if ( emagged ) // Warning, hungry humans detected: throw fertilizer at them
- spawn(0)
- fert.loc = src.loc
- fert.throw_at(target, 16, 3, src)
- src.visible_message("\red [src] launches [fert.name] at [target.name]!")
- flick("farmbot_broke", src)
- spawn (FARMBOT_EMAG_DELAY)
- mode = 0
- target = null
- return 1
-
- else // feed them plants~
- var /obj/machinery/hydroponics/tray = target
- tray.nutrilevel = 10
- tray.yieldmod = fert.yieldmod
- tray.mutmod = fert.mutmod
- del fert
- tray.updateicon()
- icon_state = "farmbot_fertile"
- mode = FARMBOT_MODE_WAITING
-
- spawn (FARMBOT_ACTION_DELAY)
- mode = 0
- target = null
- spawn (FARMBOT_ANIMATION_TIME)
- icon_state = "farmbot[src.on]"
- return 1
-
-/obj/machinery/bot/farmbot/proc/weed()
- icon_state = "farmbot_hoe"
- spawn(FARMBOT_ANIMATION_TIME)
- icon_state = "farmbot[src.on]"
-
- if ( emagged ) // Warning, humans infested with weeds!
- mode = FARMBOT_MODE_WAITING
- spawn(FARMBOT_EMAG_DELAY)
- mode = 0
-
- if ( prob(50) ) // better luck next time little guy
- src.visible_message("\red [src] swings wildly at [target] with a minihoe, missing completely!")
-
- else // yayyy take that weeds~
- var/attackVerb = pick("slashed", "sliced", "cut", "clawed")
- var /mob/living/carbon/human/human = target
-
- src.visible_message("\red [src] [attackVerb] [human]!")
- var/damage = 5
- var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
- var/datum/organ/external/affecting = human.get_organ(ran_zone(dam_zone))
- var/armor = human.run_armor_check(affecting, "melee")
- human.apply_damage(damage,BRUTE,affecting,armor,sharp=1,edge=1)
-
- else // warning, plants infested with weeds!
- mode = FARMBOT_MODE_WAITING
- spawn(FARMBOT_ACTION_DELAY)
- mode = 0
-
- var /obj/machinery/hydroponics/tray = target
- tray.weedlevel = 0
- tray.updateicon()
-
-/obj/machinery/bot/farmbot/proc/water()
- if ( !tank || tank.reagents.total_volume < 1 )
- mode = 0
- target = null
- return 0
-
- icon_state = "farmbot_water"
- spawn(FARMBOT_ANIMATION_TIME)
- icon_state = "farmbot[src.on]"
-
- if ( emagged ) // warning, humans are thirsty!
- var splashAmount = min(70,tank.reagents.total_volume)
- src.visible_message("\red [src] splashes [target] with a bucket of water!")
- playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1)
- if ( prob(50) )
- tank.reagents.reaction(target, TOUCH) //splash the human!
- else
- tank.reagents.reaction(target.loc, TOUCH) //splash the human's roots!
- spawn(5)
- tank.reagents.remove_any(splashAmount)
-
- mode = FARMBOT_MODE_WAITING
- spawn(FARMBOT_EMAG_DELAY)
- mode = 0
- else
- var /obj/machinery/hydroponics/tray = target
- var/b_amount = tank.reagents.get_reagent_amount("water")
- if(b_amount > 0 && tray.waterlevel < 100)
- if(b_amount + tray.waterlevel > 100)
- b_amount = 100 - tray.waterlevel
- tank.reagents.remove_reagent("water", b_amount)
- tray.waterlevel += b_amount
- playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1)
-
- // Toxicity dilutation code. The more water you put in, the lesser the toxin concentration.
- tray.toxic -= round(b_amount/4)
- if (tray.toxic < 0 ) // Make sure it won't go overboard
- tray.toxic = 0
-
- tray.updateicon()
- mode = FARMBOT_MODE_WAITING
- spawn(FARMBOT_ACTION_DELAY)
- mode = 0
-
-/obj/machinery/bot/farmbot/proc/refill()
- if ( !tank || !tank.reagents.total_volume > 600 || !istype(target,/obj/structure/sink) )
- mode = 0
- target = null
- return
-
- mode = FARMBOT_MODE_WAITING
- playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1)
- src.visible_message("\blue [src] starts filling it's tank from [target].")
- spawn(300)
- src.visible_message("\blue [src] finishes filling it's tank.")
- src.mode = 0
- tank.reagents.add_reagent("water", tank.reagents.maximum_volume - tank.reagents.total_volume )
- playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1)
-
-
-/obj/item/weapon/farmbot_arm_assembly
- name = "water tank/robot arm assembly"
- desc = "A water tank with a robot arm permanently grafted to it."
- icon = 'icons/obj/aibots.dmi'
- icon_state = "water_arm"
- var/build_step = 0
- var/created_name = "Farmbot" //To preserve the name if it's a unique farmbot I guess
- w_class = 3.0
-
- New()
- ..()
- spawn(4) // If an admin spawned it, it won't have a watertank it, so lets make one for em!
- var tank = locate(/obj/structure/reagent_dispensers/watertank) in contents
- if( !tank )
- new /obj/structure/reagent_dispensers/watertank(src)
-
-
-/obj/structure/reagent_dispensers/watertank/attackby(var/obj/item/robot_parts/S, mob/user as mob, params)
-
- if ((!istype(S, /obj/item/robot_parts/l_arm)) && (!istype(S, /obj/item/robot_parts/r_arm)))
- ..()
- return
-
- //Making a farmbot!
-
- var/obj/item/weapon/farmbot_arm_assembly/A = new /obj/item/weapon/farmbot_arm_assembly
-
- A.loc = src.loc
- user << "You add the robot arm to the [src]"
- src.loc = A //Place the water tank into the assembly, it will be needed for the finished bot
- user.unEquip(S)
- del(S)
-
-/obj/item/weapon/farmbot_arm_assembly/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- ..()
- if((istype(W, /obj/item/device/analyzer/plant_analyzer)) && (!src.build_step))
- src.build_step++
- user << "You add the plant analyzer to [src]!"
- src.name = "farmbot assembly"
- user.unEquip(W)
- del(W)
-
- else if(( istype(W, /obj/item/weapon/reagent_containers/glass/bucket)) && (src.build_step == 1))
- src.build_step++
- user << "You add a bucket to [src]!"
- src.name = "farmbot assembly with bucket"
- user.unEquip(W)
- del(W)
-
- else if(( istype(W, /obj/item/weapon/minihoe)) && (src.build_step == 2))
- src.build_step++
- user << "You add a minihoe to [src]!"
- src.name = "farmbot assembly with bucket and minihoe"
- user.unEquip(W)
- del(W)
-
- else if((isprox(W)) && (src.build_step == 3))
- src.build_step++
- user << "You complete the Farmbot! Beep boop."
- var/obj/machinery/bot/farmbot/S = new /obj/machinery/bot/farmbot
- for ( var/obj/structure/reagent_dispensers/watertank/wTank in src.contents )
- wTank.loc = S
- S.tank = wTank
- S.loc = get_turf(src)
- S.name = src.created_name
- user.unEquip(W)
- del(W)
- del(src)
-
- else if(istype(W, /obj/item/weapon/pen))
- var/t = input(user, "Enter new robot name", src.name, src.created_name) as text
- t = sanitize(copytext(t), 1, MAX_NAME_LEN)
- if (!t)
- return
- if (!in_range(src, usr) && src.loc != usr)
- return
-
- src.created_name = t
-
-/obj/item/weapon/farmbot_arm_assembly/attack_hand(mob/user as mob)
- return //it's a converted watertank, no you cannot pick it up and put it in your backpack
diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm
index a962d81d6e4..eb8a61235b9 100644
--- a/code/game/machinery/bots/floorbot.dm
+++ b/code/game/machinery/bots/floorbot.dm
@@ -272,9 +272,9 @@
if(path.len == 0)
if(!istype(target, /turf/))
var/turf/TL = get_turf(target)
- path = get_path_to(loc, TL, /turf/proc/AdjacentTurfsSpace, /turf/proc/Distance, 0, 30, id=botcard)
+ path = get_path_to(loc, TL, src, /turf/proc/Distance_cardinal, 0, 30, id=botcard, simulated_only = 0)
else
- path = get_path_to(loc, target, /turf/proc/AdjacentTurfsSpace, /turf/proc/Distance, 0, 30, id=botcard)
+ path = get_path_to(loc, target, src, /turf/proc/Distance_cardinal, 0, 30, id=botcard, simulated_only = 0)
if(!bot_move(target))
add_to_ignore(target)
diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm
index b6a45149fab..fa15de1bf75 100644
--- a/code/game/machinery/bots/medbot.dm
+++ b/code/game/machinery/bots/medbot.dm
@@ -198,7 +198,7 @@
use_beaker = !use_beaker
else if (href_list["eject"] && (!isnull(reagent_glass)))
- reagent_glass.loc = get_turf(src)
+ reagent_glass.forceMove(get_turf(src))
reagent_glass = null
else if (href_list["togglevoice"])
@@ -240,8 +240,10 @@
user << "There is already a beaker loaded."
return
- user.drop_item()
- W.loc = src
+ if(!user.drop_item())
+ user << "\The [W] is stuck to your hand!"
+ return
+ W.forceMove(src)
reagent_glass = W
user << "You insert [W]."
updateUsrDialog()
@@ -512,7 +514,7 @@
new /obj/item/device/healthanalyzer(Tsec)
if(reagent_glass)
- reagent_glass.loc = Tsec
+ reagent_glass.forceMove(Tsec)
reagent_glass = null
if (prob(50))
@@ -577,8 +579,7 @@
else
switch(build_step)
if(0)
- if(istype(W, /obj/item/device/healthanalyzer))
- user.drop_item()
+ if(istype(W, /obj/item/device/healthanalyzer) && user.drop_item())
qdel(W)
build_step++
user << "You add the health sensor to [src]."
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index d9253e89294..c5b170b8fcc 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -30,6 +30,7 @@
var/emped = 0 //Number of consecutive EMP's on this camera
/obj/machinery/camera/New()
+ ..()
wires = new(src)
assembly = new(src)
@@ -39,13 +40,22 @@
invalidateCameraCache()
+ if(cameranet.cameras_unsorted || !ticker)
+ cameranet.cameras += src
+ cameranet.cameras_unsorted = 1
+ else
+ dd_insertObjectList(cameranet.cameras, src)
+
+ var/list/open_networks = difflist(network,restricted_camera_networks) //...but if all of camera's networks are restricted, it only works for specific camera consoles.
+ if(open_networks.len) //If there is at least one open network, chunk is available for AI usage.
+ cameranet.addCamera(src)
+
/* // Use this to look for cameras that have the same c_tag.
for(var/obj/machinery/camera/C in cameranet.cameras)
var/list/tempnetwork = C.network&src.network
if(C != src && C.c_tag == src.c_tag && tempnetwork.len)
log_to_dd("[src.c_tag] [src.x] [src.y] [src.z] conflicts with [C.c_tag] [C.x] [C.y] [C.z]")
*/
- ..()
/obj/machinery/camera/initialize()
if(z == ZLEVEL_STATION && prob(3) && !start_active)
@@ -65,6 +75,10 @@
qdel(wires)
wires = null
cameranet.removeCamera(src) //Will handle removal from the camera network and the chunks, so we don't need to worry about that
+ cameranet.cameras -= src
+ var/list/open_networks = difflist(network,restricted_camera_networks)
+ if(open_networks.len)
+ cameranet.removeCamera(src)
return ..()
/obj/machinery/camera/emp_act(severity)
@@ -233,6 +247,11 @@
return
/obj/machinery/camera/proc/deactivate(user as mob, var/choice = 1)
+ if(can_use())
+ cameranet.addCamera(src)
+ else
+ set_light(0)
+ cameranet.removeCamera(src)
if(choice==1)
invalidateCameraCache()
status = !( src.status )
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index 98d4cd9a5fc..b4e9dc9822c 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -420,10 +420,10 @@
var/active = 0
/obj/item/weapon/holo/esword/green/New()
- _color = "green"
+ item_color = "green"
/obj/item/weapon/holo/esword/red/New()
- _color = "red"
+ item_color = "red"
/obj/item/weapon/holo/esword/IsShield()
if(active)
@@ -431,13 +431,13 @@
return 0
/obj/item/weapon/holo/esword/New()
- _color = pick("red","blue","green","purple")
+ item_color = pick("red","blue","green","purple")
/obj/item/weapon/holo/esword/attack_self(mob/living/user as mob)
active = !active
if (active)
force = 30
- icon_state = "sword[_color]"
+ icon_state = "sword[item_color]"
w_class = 4
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
user << "[src] is now active."
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 53f903121ad..1a3361425d9 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -73,7 +73,7 @@
T.contents += contents
var/obj/item/weapon/reagent_containers/glass/B = beaker
if(beaker)
- B.loc = get_step(T, SOUTH) //Beaker is carefully ejected from the wreckage of the cryotube
+ B.forceMove(get_step(T, SOUTH)) //Beaker is carefully ejected from the wreckage of the cryotube
beaker = null
return ..()
@@ -261,7 +261,7 @@
if(href_list["ejectBeaker"])
if(beaker)
- beaker.loc = get_step(loc, SOUTH)
+ beaker.forceMove(get_step(loc, SOUTH))
beaker = null
if(href_list["ejectOccupant"])
@@ -279,11 +279,11 @@
return
beaker = G
- if(user.drop_item())
- G.forceMove(src)
- user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!")
- else
+ if(!user.drop_item())
user << "The [G] is stuck to you!"
+ return
+ G.forceMove(src)
+ user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!")
if (istype(G, /obj/item/weapon/screwdriver))
if(occupant || on)
@@ -412,15 +412,12 @@
/obj/machinery/atmospherics/unary/cryo_cell/proc/go_out()
if(!( occupant ))
return
- //for(var/obj/O in src)
- // O.loc = loc
if (occupant.client)
occupant.client.eye = occupant.client.mob
occupant.client.perspective = MOB_PERSPECTIVE
- occupant.loc = get_step(loc, SOUTH) //this doesn't account for walls or anything, but i don't forsee that being a problem.
+ occupant.forceMove(get_step(loc, SOUTH)) //this doesn't account for walls or anything, but i don't forsee that being a problem.
if (occupant.bodytemperature < 261 && occupant.bodytemperature >= 70) //Patch by Aranclanos to stop people from taking burn damage after being ejected
occupant.bodytemperature = 261
-// occupant.metabslow = 0
occupant = null
update_icon()
return
@@ -441,7 +438,7 @@
M.client.perspective = EYE_PERSPECTIVE
M.client.eye = src
M.stop_pulling()
- M.loc = src
+ M.forceMove(src)
if(M.health > -100 && (M.health < 0 || M.sleeping))
M << "\blue You feel a cold liquid surround you. Your skin starts to freeze up."
occupant = M
@@ -494,4 +491,4 @@
return
/datum/data/function/proc/display()
- return
+ return
\ No newline at end of file
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 48d1b27d9bd..ec3b787b7fe 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -928,7 +928,7 @@ About the new airlock wires panel:
set_opacity(1)
operating = 0
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
if(safe)
if(locate(/mob/living) in get_turf(src))
open()
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 721b06ec5dd..08d8cab4438 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -46,7 +46,7 @@
bound_height = width * world.icon_size
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
airlocks += src
return
@@ -54,7 +54,7 @@
/obj/machinery/door/Destroy()
density = 0
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
airlocks -= src
return ..()
@@ -223,7 +223,7 @@
set_opacity(0)
operating = 0
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
if(autoclose && normalspeed)
spawn(150)
@@ -251,7 +251,7 @@
set_opacity(1) //caaaaarn!
operating = 0
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
return
/obj/machinery/door/proc/crush()
@@ -293,6 +293,12 @@
bound_width = world.icon_size
bound_height = width * world.icon_size
+/obj/machinery/door/proc/update_freelook_sight()
+ // Glass door glass = 1
+ // don't check then?
+ if(!glass && cameranet)
+ cameranet.updateVisibility(src, 0)
+
/obj/machinery/door/BlockSuperconductivity()
if(opacity || heat_proof)
return 1
diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm
index b14fd005674..7f1c8951794 100644
--- a/code/game/machinery/doors/poddoor.dm
+++ b/code/game/machinery/doors/poddoor.dm
@@ -84,7 +84,7 @@
src.density = 0
sleep(5)
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
if(operating == 1) //emag again
src.operating = 0
@@ -101,7 +101,7 @@
src.icon_state = "pdoor1"
src.set_opacity(initial(opacity))
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
sleep(5)
crush()
src.density = 1
@@ -130,7 +130,7 @@
f2.set_opacity(0)
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
if(operating == 1) //emag again
src.operating = 0
@@ -155,7 +155,7 @@
if (src.visible)
src.set_opacity(1)
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
sleep(10)
src.operating = 0
@@ -182,7 +182,7 @@
f3.set_opacity(0)
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
if(operating == 1) //emag again
src.operating = 0
@@ -209,7 +209,7 @@
if (src.visible)
src.set_opacity(1)
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
sleep(10)
src.operating = 0
@@ -238,7 +238,7 @@
f4.set_opacity(0)
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
if(operating == 1) //emag again
src.operating = 0
@@ -267,7 +267,7 @@
if (src.visible)
src.set_opacity(1)
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
sleep(10)
src.operating = 0
@@ -294,7 +294,7 @@
f2.set_opacity(0)
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
if(operating == 1) //emag again
src.operating = 0
@@ -319,7 +319,7 @@
if (src.visible)
src.set_opacity(1)
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
sleep(10)
src.operating = 0
@@ -346,7 +346,7 @@
f3.set_opacity(0)
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
if(operating == 1) //emag again
src.operating = 0
@@ -373,7 +373,7 @@
if (src.visible)
src.set_opacity(1)
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
sleep(10)
src.operating = 0
@@ -402,7 +402,7 @@
f4.set_opacity(0)
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
if(operating == 1) //emag again
src.operating = 0
@@ -431,7 +431,7 @@
if (src.visible)
src.set_opacity(1)
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
sleep(10)
src.operating = 0
diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm
index d140ce42888..5375e9fe084 100644
--- a/code/game/machinery/doors/shutters.dm
+++ b/code/game/machinery/doors/shutters.dm
@@ -42,7 +42,7 @@
density = 0
set_opacity(0)
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
if(operating == 1) //emag again
operating = 0
@@ -61,7 +61,7 @@
if(visible)
set_opacity(1)
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
sleep(10)
operating = 0
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 88000858646..0c53fd9bcca 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -123,7 +123,7 @@
src.density = 0
// src.sd_set_opacity(0) //TODO: why is this here? Opaque windoors? ~Carn
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
if(operating == 1) //emag again
src.operating = 0
@@ -147,7 +147,7 @@
// if(src.visible)
// set_opacity(1) //TODO: why is this here? Opaque windoors? ~Carn
air_update_turf(1)
- update_freelok_sight()
+ update_freelook_sight()
sleep(10)
src.operating = 0
diff --git a/code/game/machinery/kitchen/icecream_vat.dm b/code/game/machinery/kitchen/icecream_vat.dm
index 711e2020361..76cbac6f581 100644
--- a/code/game/machinery/kitchen/icecream_vat.dm
+++ b/code/game/machinery/kitchen/icecream_vat.dm
@@ -116,9 +116,11 @@ var/list/ingredients_source = list(
if(held_container)
user << "You must remove [held_container] from [src] first."
else
+ if(!user.drop_item())
+ user << "\The [O] is stuck to your hand!"
+ return
+ O.forceMove(src)
user << "You insert [O] into [src]."
- user.drop_item()
- O.loc = src
held_container = O
else
var/obj/item/weapon/reagent_containers/R = O
@@ -198,7 +200,7 @@ var/list/ingredients_source = list(
if(href_list["eject"])
if(held_container)
- held_container.loc = src.loc
+ held_container.forceMove(src.loc)
held_container = null
updateDialog()
@@ -241,4 +243,4 @@ var/list/ingredients_source = list(
#undef INGR_FLOUR
#undef INGR_SUGAR
#undef INGR_ICE
-#undef MUCK
+#undef MUCK
\ No newline at end of file
diff --git a/code/game/machinery/kitchen/juicer.dm b/code/game/machinery/kitchen/juicer.dm
index 14fb3b12f62..e1f7bd7c091 100644
--- a/code/game/machinery/kitchen/juicer.dm
+++ b/code/game/machinery/kitchen/juicer.dm
@@ -44,7 +44,7 @@
if(!user.unEquip(O))
user << "\the [O] is stuck to your hand, you cannot put it in \the [src]"
return 0
- O.loc = src
+ O.forceMove(src)
beaker = O
src.verbs += /obj/machinery/juicer/verb/detach
update_icon()
@@ -56,7 +56,7 @@
if(!user.unEquip(O))
user << "\the [O] is stuck to your hand, you cannot put it in \the [src]"
return 0
- O.loc = src
+ O.forceMove(src)
src.updateUsrDialog()
return 0
@@ -129,7 +129,7 @@
if (!beaker)
return
src.verbs -= /obj/machinery/juicer/verb/detach
- beaker.loc = src.loc
+ beaker.forceMove(src.loc)
beaker = null
update_icon()
@@ -180,5 +180,4 @@
new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src)
new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src)
new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src)
- new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src)
-
+ new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src)
\ No newline at end of file
diff --git a/code/game/machinery/kitchen/kitchen_machine.dm b/code/game/machinery/kitchen/kitchen_machine.dm
index 2bef05d57a9..6c0338c5569 100644
--- a/code/game/machinery/kitchen/kitchen_machine.dm
+++ b/code/game/machinery/kitchen/kitchen_machine.dm
@@ -135,11 +135,11 @@
"[user] has added one of [O] to \the [src].", \
"You add one of [O] to \the [src].")
else
- // user.unEquip(O) //This just causes problems so far as I can tell. -Pete
if(!user.drop_item())
user << "\The [O] is stuck to your hand, you cannot put it in \the [src]"
return 0
- O.loc = src
+
+ O.forceMove(src)
user.visible_message( \
"[user] has added \the [O] to \the [src].", \
"You add \the [O] to \the [src].")
@@ -296,7 +296,7 @@
byproduct = recipe.get_byproduct()
stop()
if(cooked)
- cooked.loc = src.loc
+ cooked.forceMove(src.loc)
for(var/i=1,i\The [src] is full."
return 1
else
- user.remove_from_mob(O)
- O.loc = src
+ if(!user.drop_item())
+ user << "\The [O] is stuck to you!"
+ return
+
+ O.forceMove(src)
if(item_quants[O.name])
item_quants[O.name]++
else
@@ -338,7 +341,7 @@
var/i = amount
for(var/obj/O in contents)
if(O.name == K)
- O.loc = loc
+ O.forceMove(loc)
i--
if(i <= 0)
return 1
@@ -359,7 +362,7 @@
item_quants[O]--
for(var/obj/T in contents)
if(T.name == O)
- T.loc = src.loc
+ T.forceMove(src.loc)
throw_item = T
break
break
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index ab437a4a1e9..bed10ccf131 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -337,8 +337,6 @@ Class Procs:
return src.attack_hand(user)
/obj/machinery/attack_hand(mob/user as mob)
- if(!interact_offline && stat & (NOPOWER|BROKEN|MAINT))
- return 1
if(user.lying || user.stat)
return 1
@@ -346,11 +344,6 @@ Class Procs:
user << "You don't have the dexterity to do this!"
return 1
-/*
- //distance checks are made by atom/proc/DblClick
- if ((get_dist(src, user) > 1 || !istype(src.loc, /turf)) && !istype(user, /mob/living/silicon))
- return 1
-*/
if (ishuman(user))
var/mob/living/carbon/human/H = user
if(H.getBrainLoss() >= 60)
@@ -359,10 +352,17 @@ Class Procs:
else if(prob(H.getBrainLoss()))
user << "You momentarily forget how to use [src]."
return 1
+
+ if(panel_open)
+ src.add_fingerprint(user)
+ return 0
+
+ if(!interact_offline && stat & (NOPOWER|BROKEN|MAINT))
+ return 1
src.add_fingerprint(user)
- return 0
+ return ..()
/obj/machinery/CheckParts()
RefreshParts()
diff --git a/code/game/machinery/metaldetector.dm b/code/game/machinery/metaldetector.dm
deleted file mode 100644
index 4cdb45507d4..00000000000
--- a/code/game/machinery/metaldetector.dm
+++ /dev/null
@@ -1,163 +0,0 @@
-/obj/machinery/metaldetector
- name = "metal detector"
- desc = "a metal detector. staff can toggle this between ignore security and detect all with their id."
- anchored = 1.0
- density = 0
- icon = 'icons/obj/machines/metal_detector.dmi'
- icon_state = "metaldetector0"
- use_power = 1
- idle_power_usage = 20
- active_power_usage = 250
- var/guncount = 0
- var/knifecount = 0
- var/bombcount = 0
- var/meleecount = 0
- var/detectall = 0
-
-/obj/machinery/metaldetector/check_access(obj/item/weapon/card/id/I, list/access_list)
- if(!istype(access_list))
- return 1
- if(!access_list.len) //no requirements
- return 1
- if(istype(I, /obj/item/device/pda))
- var/obj/item/device/pda/pda = I
- I = pda.id
- if(!istype(I) || !I.access) //not ID or no access
- return 0
- return 1
-
-/obj/machinery/metaldetector/attackby(obj/item/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/weapon/card))
- for(var/ID in list(user.equipped(), user:wear_id, user:belt))
- if(src.check_access(ID,list("20")))
- if(!src.detectall)
- src.detectall = 1
- user << "\blue You set the [src] to detect all personnel."
- return
- else
- src.detectall = 0
- user << "\blue You set the [src] to ignore all staff and security."
- return
- else
- user << "\red You lack access to the control panel!"
- return
-
-/obj/machinery/metaldetector/emag_act(user as mob)
- if(!emagged)
- emagged = 1
- user << "\blue You short out the circuitry."
- return
-
-/obj/machinery/metaldetector/Crossed(AM as mob|obj)
- if(emagged)
- return
- if (istype(AM, /mob/living))
- var/mob/M = AM
- if(!src.detectall)
- if(M:wear_id || M:belt)
- for(var/ID in list(M:equipped(), M:wear_id, M:belt))
- if(src.check_access(ID,list("1", "2", "3", "20", "57", "58")))
- return
- if (istype(M, /mob/living))
- for(var/obj/item/weapon/gun/G in M)
- guncount++
- for(var/obj/item/device/transfer_valve/B in M)
- bombcount++
- for(var/obj/item/weapon/kitchen/utensil/knife/K in M)
- knifecount++
- for(var/obj/item/weapon/kitchenknife/KK in M)
- knifecount++
- for(var/obj/item/weapon/c4/KK in M)
- bombcount++
- for(var/obj/item/weapon/melee/ML in M)
- meleecount++
- if(guncount)
- flick("metaldetector2",src)
- playsound(src.loc, 'sound/effects/alert.ogg', 60, 0)
- for (var/mob/O in viewers(O, null))
- O << "\red [src.name] beeps, \"Alert! Firearm found on [M.name]!\""
-
- if(seen_by_camera(M))
- // determine the name of the perp (goes by ID if wearing one)
- var/perpname = M.name
- if(M:wear_id && M:wear_id.registered_name)
- perpname = M:wear_id.registered_name
- // find the matching security record
- for(var/datum/data/record/R in data_core.general)
- if(R.fields["name"] == perpname)
- for (var/datum/data/record/S in data_core.security)
- if (S.fields["id"] == R.fields["id"])
- // now add to rap sheet
- S.fields["criminal"] = "*Arrest*"
- S.fields["mi_crim"] = "Carrying a firearm."
- break
-
- guncount = 0
- else if(knifecount)
- flick("metaldetector2",src)
- playsound(src.loc, 'sound/effects/alert.ogg', 60, 0)
- for (var/mob/O in viewers(O, null))
- O << "\red [src.name] beeps, \"Alert! Knife found on [M.name]!\""
-
- if(seen_by_camera(M))
- // determine the name of the perp (goes by ID if wearing one)
- var/perpname = M.name
- if(M:wear_id && M:wear_id.registered_name)
- perpname = M:wear_id.registered_name
- // find the matching security record
- for(var/datum/data/record/R in data_core.general)
- if(R.fields["name"] == perpname)
- for (var/datum/data/record/S in data_core.security)
- if (S.fields["id"] == R.fields["id"])
- // now add to rap sheet
- S.fields["criminal"] = "*Arrest*"
- S.fields["mi_crim"] = "Carrying a knife."
- break
-
- knifecount = 0
- else if(bombcount)
- flick("metaldetector2",src)
- playsound(src.loc, 'sound/effects/alert.ogg', 60, 0)
- for (var/mob/O in viewers(O, null))
- O << "\red [src.name] beeps, \"Alert! Bomb found on [M.name]!\""
-
- if(seen_by_camera(M))
- // determine the name of the perp (goes by ID if wearing one)
- var/perpname = M.name
- if(M:wear_id && M:wear_id.registered_name)
- perpname = M:wear_id.registered_name
- // find the matching security record
- for(var/datum/data/record/R in data_core.general)
- if(R.fields["name"] == perpname)
- for (var/datum/data/record/S in data_core.security)
- if (S.fields["id"] == R.fields["id"])
- // now add to rap sheet
- S.fields["criminal"] = "*Arrest*"
- S.fields["mi_crim"] = "Carrying a bomb."
- break
-
- bombcount = 0
- else if(meleecount)
- flick("metaldetector2",src)
- playsound(src.loc, 'sound/effects/alert.ogg', 60, 0)
- for (var/mob/O in viewers(O, null))
- O << "\red [src.name] beeps, \"Alert! Melee weapon found on [M.name]!\""
-
- if(seen_by_camera(M))
- // determine the name of the perp (goes by ID if wearing one)
- var/perpname = M.name
- if(M:wear_id && M:wear_id.registered_name)
- perpname = M:wear_id.registered_name
- // find the matching security record
- for(var/datum/data/record/R in data_core.general)
- if(R.fields["name"] == perpname)
- for (var/datum/data/record/S in data_core.security)
- if (S.fields["id"] == R.fields["id"])
- // now add to rap sheet
- S.fields["criminal"] = "*Arrest*"
- S.fields["mi_crim"] = "Carrying a weapon."
- break
-
- meleecount = 0
- else
- flick("metaldetector1",src)
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 7ff7cc466d8..2d568cf1f30 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -145,20 +145,23 @@
for(var/obj/O in um)
// Engineering
if(istype(O,/obj/item/stack/sheet/metal) || istype(O,/obj/item/stack/sheet/rglass) || istype(O,/obj/item/stack/cable_coil))
- if(O:amount < 50)
- O:amount += 1 * coeff
+ var/obj/item/stack/sheet/S = O
+ if(S.amount < 50)
+ S.amount += 1 * coeff
// Security
if(istype(O,/obj/item/device/flash))
- if(O:broken)
- O:broken = 0
- O:times_used = 0
- O:icon_state = "flash"
+ var/obj/item/device/flash/F = O
+ if(F.broken)
+ F.broken = 0
+ F.times_used = 0
+ F.icon_state = "flash"
if(istype(O,/obj/item/weapon/gun/energy/disabler/cyborg))
- if(O:power_supply.charge < O:power_supply.maxcharge)
- O:power_supply.give(O:charge_cost)
- O:update_icon()
+ var/obj/item/weapon/gun/energy/disabler/cyborg/D = O
+ if(D.power_supply.charge < D.power_supply.maxcharge)
+ D.power_supply.give(D.charge_cost)
+ D.update_icon()
else
- O:charge_tick = 0
+ D.charge_tick = 0
if(istype(O,/obj/item/weapon/melee/baton))
var/obj/item/weapon/melee/baton/B = O
if(B.bcell)
@@ -178,15 +181,6 @@
var/i = 1
for(1, i <= coeff, i++)
LR.Charge(occupant)
- //Alien
- if(istype(O,/obj/item/weapon/reagent_containers/spray/alien/smoke))
- if(O.reagents.get_reagent_amount("water") < 50)
- O.reagents.add_reagent("water", 2 * coeff)
- if(istype(O,/obj/item/weapon/reagent_containers/spray/alien/stun))
- if(O.reagents.get_reagent_amount("ether") < 250)
- O.reagents.add_reagent("ether", 2 * coeff)
-
-
if(R)
if(R.module)
R.module.respawn_consumable(R)
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index 6bb538b349f..9223d7c4428 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -23,7 +23,7 @@ var/const/SAFETY_COOLDOWN = 100
component_parts += new /obj/item/weapon/circuitboard/recycler(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- materials = new /datum/material_container(src, list(MAT_METAL=1, MAT_GLASS=1, MAT_SILVER=1, MAT_GOLD=1, MAT_DIAMOND=1, MAT_URANIUM=1, MAT_BANANIUM=1))
+ materials = new /datum/material_container(src, list(MAT_METAL=1, MAT_GLASS=1, MAT_SILVER=1, MAT_GOLD=1, MAT_DIAMOND=1, MAT_PLASMA=1, MAT_URANIUM=1, MAT_BANANIUM=1))
RefreshParts()
update_icon()
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 918783941fc..9313acda3cb 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -1067,7 +1067,7 @@
helmet.name = "engineering hardsuit helmet"
helmet.icon_state = "rig0-engineering"
helmet.item_state = "eng_helm"
- helmet._color = "engineering"
+ helmet.item_color = "engineering"
if(suit)
suit.name = "engineering hardsuit"
suit.icon_state = "rig-engineering"
@@ -1077,7 +1077,7 @@
helmet.name = "mining hardsuit helmet"
helmet.icon_state = "rig0-mining"
helmet.item_state = "mining_helm"
- helmet._color = "mining"
+ helmet.item_color = "mining"
if(suit)
suit.name = "mining hardsuit"
suit.icon_state = "rig-mining"
@@ -1087,7 +1087,7 @@
helmet.name = "medical hardsuit helmet"
helmet.icon_state = "rig0-medical"
helmet.item_state = "medical_helm"
- helmet._color = "medical"
+ helmet.item_color = "medical"
if(suit)
suit.name = "medical hardsuit"
suit.icon_state = "rig-medical"
@@ -1097,7 +1097,7 @@
helmet.name = "security hardsuit helmet"
helmet.icon_state = "rig0-sec"
helmet.item_state = "sec_helm"
- helmet._color = "sec"
+ helmet.item_color = "sec"
if(suit)
suit.name = "security hardsuit"
suit.icon_state = "rig-sec"
@@ -1107,7 +1107,7 @@
helmet.name = "atmospherics hardsuit helmet"
helmet.icon_state = "rig0-atmos"
helmet.item_state = "atmos_helm"
- helmet._color = "atmos"
+ helmet.item_color = "atmos"
if(suit)
suit.name = "atmospherics hardsuit"
suit.icon_state = "rig-atmos"
@@ -1117,7 +1117,7 @@
helmet.name = "blood-red hardsuit helmet"
helmet.icon_state = "rig0-syndie"
helmet.item_state = "syndie_helm"
- helmet._color = "syndie"
+ helmet.item_color = "syndie"
if(suit)
suit.name = "blood-red hardsuit"
suit.item_state = "syndie_hardsuit"
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 724643ed751..bd2000595f6 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -52,15 +52,15 @@
if(crayon)
- var/_color
+ var/wash_color
if(istype(crayon,/obj/item/toy/crayon))
var/obj/item/toy/crayon/CR = crayon
- _color = CR.colourName
+ wash_color = CR.colourName
else if(istype(crayon,/obj/item/weapon/stamp))
var/obj/item/weapon/stamp/ST = crayon
- _color = ST._color
+ wash_color = ST.item_color
- if(_color)
+ if(wash_color)
var/new_jumpsuit_icon_state = ""
var/new_jumpsuit_item_state = ""
var/new_jumpsuit_name = ""
@@ -77,7 +77,7 @@
for(var/T in typesof(/obj/item/clothing/under))
var/obj/item/clothing/under/J = new T
//world << "DEBUG: [color] == [J.color]"
- if(_color == J._color)
+ if(wash_color == J.item_color)
new_jumpsuit_icon_state = J.icon_state
new_jumpsuit_item_state = J.item_state
new_jumpsuit_name = J.name
@@ -88,7 +88,7 @@
for(var/T in typesof(/obj/item/clothing/gloves/color))
var/obj/item/clothing/gloves/color/G = new T
//world << "DEBUG: [color] == [J.color]"
- if(_color == G._color)
+ if(wash_color == G.item_color)
new_glove_icon_state = G.icon_state
new_glove_item_state = G.item_state
new_glove_name = G.name
@@ -99,7 +99,7 @@
for(var/T in typesof(/obj/item/clothing/shoes))
var/obj/item/clothing/shoes/S = new T
//world << "DEBUG: [color] == [J.color]"
- if(_color == S._color)
+ if(wash_color == S.item_color)
new_shoe_icon_state = S.icon_state
new_shoe_name = S.name
qdel(S)
@@ -109,7 +109,7 @@
for(var/T in typesof(/obj/item/weapon/bedsheet))
var/obj/item/weapon/bedsheet/B = new T
//world << "DEBUG: [color] == [J.color]"
- if(_color == B._color)
+ if(wash_color == B.item_color)
new_sheet_icon_state = B.icon_state
new_sheet_name = B.name
qdel(B)
@@ -119,7 +119,7 @@
for(var/T in typesof(/obj/item/clothing/head/soft))
var/obj/item/clothing/head/soft/H = new T
//world << "DEBUG: [color] == [J.color]"
- if(_color == H._color)
+ if(wash_color == H.item_color)
new_softcap_icon_state = H.icon_state
new_softcap_name = H.name
qdel(H)
@@ -131,7 +131,7 @@
//world << "DEBUG: YUP! FOUND IT!"
J.item_state = new_jumpsuit_item_state
J.icon_state = new_jumpsuit_icon_state
- J._color = _color
+ J.item_color = wash_color
J.name = new_jumpsuit_name
J.desc = new_desc
if(new_glove_icon_state && new_glove_item_state && new_glove_name)
@@ -139,7 +139,7 @@
//world << "DEBUG: YUP! FOUND IT!"
G.item_state = new_glove_item_state
G.icon_state = new_glove_icon_state
- G._color = _color
+ G.item_color = wash_color
G.name = new_glove_name
if(!istype(G, /obj/item/clothing/gloves/color/black/thief))
G.desc = new_desc
@@ -151,21 +151,21 @@
S.slowdown = SHOES_SLOWDOWN
new /obj/item/weapon/restraints/handcuffs( src )
S.icon_state = new_shoe_icon_state
- S._color = _color
+ S.item_color = wash_color
S.name = new_shoe_name
S.desc = new_desc
if(new_sheet_icon_state && new_sheet_name)
for(var/obj/item/weapon/bedsheet/B in contents)
//world << "DEBUG: YUP! FOUND IT!"
B.icon_state = new_sheet_icon_state
- B._color = _color
+ B.item_color = wash_color
B.name = new_sheet_name
B.desc = new_desc
if(new_softcap_icon_state && new_softcap_name)
for(var/obj/item/clothing/head/soft/H in contents)
//world << "DEBUG: YUP! FOUND IT!"
H.icon_state = new_softcap_icon_state
- H._color = _color
+ H.item_color = wash_color
H.name = new_softcap_name
H.desc = new_desc
qdel(crayon)
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
index 14f9f42ec06..a4e9739868d 100644
--- a/code/game/objects/buckling.dm
+++ b/code/game/objects/buckling.dm
@@ -12,6 +12,11 @@
. = ..()
if(can_buckle && buckled_mob)
return user_unbuckle_mob(user)
+
+/atom/movable/attack_robot(mob/living/user)
+ . = ..()
+ if(can_buckle && buckled_mob && Adjacent(user)) // attack_robot is called on all ranges, so the Adjacent check is needed
+ return user_unbuckle_mob(user)
/atom/movable/MouseDrop_T(mob/living/M, mob/living/user)
. = ..()
diff --git a/code/game/objects/effects/decals/Cleanable/tracks.dm b/code/game/objects/effects/decals/Cleanable/tracks.dm
index ae05e0e4cc3..86c03a683e8 100644
--- a/code/game/objects/effects/decals/Cleanable/tracks.dm
+++ b/code/game/objects/effects/decals/Cleanable/tracks.dm
@@ -24,9 +24,9 @@ var/global/list/image/fluidtrack_cache=list()
var/crusty=0
var/image/overlay
- New(_direction,_color,_wet)
+ New(_direction,item_color,_wet)
src.direction=_direction
- src.basecolor=_color
+ src.basecolor=item_color
src.wet=_wet
// Footprints, tire trails...
diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index 4432bc0008f..9c13cdfa991 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -12,6 +12,16 @@ would spawn and follow the beaker, even if it is carried or thrown.
mouse_opacity = 0
unacidable = 1//So effect are not targeted by alien acid.
+/obj/effect/effect/New()
+ ..()
+ if(ticker)
+ cameranet.updateVisibility(src)
+
+/obj/effect/effect/Destroy()
+ if(ticker)
+ cameranet.updateVisibility(src)
+ return ..()
+
/datum/effect/effect/proc/fadeOut(var/atom/A, var/frames = 16)
if(A.alpha == 0) //Handle already transparent case
return
@@ -53,13 +63,6 @@ would spawn and follow the beaker, even if it is carried or thrown.
return
return
-/obj/effect/effect/water/Destroy()
- //var/turf/T = src.loc
- //if (istype(T, /turf))
- // T.firelevel = 0 //TODO: FIX
- src.delete()
- return ..()
-
/obj/effect/effect/water/Move(turf/newloc)
//var/turf/T = src.loc
//if (istype(T, /turf))
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 822bb161023..069a6f6d7ad 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -37,7 +37,7 @@
var/list/materials = list()
//Since any item can now be a piece of clothing, this has to be put here so all items share it.
var/flags_inv //This flag is used to determine when items in someone's inventory cover others. IE helmets making it so you can't see glasses, etc.
- var/_color = null
+ var/item_color = null
var/body_parts_covered = 0 //see setup.dm for appropriate bit flags
//var/heat_transfer_coefficient = 1 //0 prevents all transfers, 1 is invisible
var/gas_transfer_coefficient = 1 // for leaking gas from turf to mask and vice-versa (for masks right now, but at some point, i'd like to include space helmets)
@@ -49,6 +49,9 @@
var/list/allowed = null //suit storage stuff.
var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers.
+ var/strip_delay = DEFAULT_ITEM_STRIP_DELAY
+ var/put_on_delay = DEFAULT_ITEM_PUTON_DELAY
+
/* Species-specific sprites, concept stolen from Paradise//vg/.
ex:
sprite_sheets = list(
@@ -297,252 +300,12 @@
//the mob M is attempting to equip this item into the slot passed through as 'slot'. Return 1 if it can do this and 0 if it can't.
//If you are making custom procs but would like to retain partial or complete functionality of this one, include a 'return ..()' to where you want this to happen.
-//Set disable_warning to 1 if you wish it to not give you outputs.
-/obj/item/proc/mob_can_equip(M as mob, slot, disable_warning = 0)
- if(!slot) return 0
- if(!M) return 0
- if(issmall(M))
- //START MONKEY
- var/mob/living/carbon/human/H = M
-
- switch(slot)
- if(slot_l_hand)
- if(H.l_hand)
- return 0
- return 1
- if(slot_r_hand)
- if(H.r_hand)
- return 0
- return 1
- if(slot_wear_mask)
- if(H.wear_mask)
- return 0
- if(H.head && H.head.flags & NODROP && H.head.flags & HEADCOVERSMOUTH)
- H << "\The [H.head] is in the way."
- return 0
- if( !(slot_flags & SLOT_MASK) )
- return 0
- return 1
- if(slot_back)
- if(H.back)
- return 0
- if( !(slot_flags & SLOT_BACK) )
- return 0
- return 1
- if(slot_handcuffed)
- if(H.handcuffed)
- return 0
- if(!istype(src, /obj/item/weapon/restraints/handcuffs))
- return 0
- return 1
- if(slot_in_backpack)
- if (H.back && istype(H.back, /obj/item/weapon/storage/backpack))
- var/obj/item/weapon/storage/backpack/B = H.back
- if(B.contents.len < B.storage_slots && w_class <= B.max_w_class)
- return 1
- return 0
- return 0 //Unsupported slot
- //END MONKEY
- if(ishuman(M))
- //START HUMAN
- var/mob/living/carbon/human/H = M
-
-
- if(istype(src, /obj/item/clothing/under) || istype(src, /obj/item/clothing/suit))
- if(FAT in H.mutations)
- //testing("[M] TOO FAT TO WEAR [src]!")
- if(!(flags & ONESIZEFITSALL))
- if(!disable_warning)
- H << "\red You're too fat to wear the [name]."
- return 0
-
- switch(slot)
- if(slot_l_hand)
- if(H.l_hand)
- return 0
- return 1
- if(slot_r_hand)
- if(H.r_hand)
- return 0
- return 1
- if(slot_wear_mask)
- if(H.wear_mask)
- return 0
- if( !(slot_flags & SLOT_MASK) )
- return 0
- return 1
- if(slot_back)
- if(H.back)
- return 0
- if( !(slot_flags & SLOT_BACK) )
- return 0
- return 1
- if(slot_wear_suit)
- if(H.wear_suit)
- return 0
- if( !(slot_flags & SLOT_OCLOTHING) )
- return 0
- return 1
- if(slot_gloves)
- if(H.gloves)
- return 0
- if( !(slot_flags & SLOT_GLOVES) )
- return 0
- return 1
- if(slot_shoes)
- if(H.shoes)
- return 0
- if( !(slot_flags & SLOT_FEET) )
- return 0
- return 1
- if(slot_belt)
- if(H.belt)
- return 0
- if(!H.w_uniform)
- if(!disable_warning)
- H << "\red You need a jumpsuit before you can attach this [name]."
- return 0
- if( !(slot_flags & SLOT_BELT) )
- return
- return 1
- if(slot_glasses)
- if(H.glasses)
- return 0
- if(H.head && H.head.flags & NODROP && H.head.flags & HEADCOVERSMOUTH)
- H << "\The [H.head] is in the way."
- return 0
- if( !(slot_flags & SLOT_EYES) )
- return 0
- return 1
- if(slot_head)
- if(H.head)
- return 0
- if( !(slot_flags & SLOT_HEAD) )
- return 0
- return 1
- if(slot_l_ear)
- if(H.l_ear)
- return 0
- if( !(slot_flags & SLOT_EARS) )
- return 0
- if( (slot_flags & SLOT_TWOEARS) && H.r_ear )
- return 0
- return 1
- if(slot_r_ear)
- if(H.r_ear)
- return 0
- if( !(slot_flags & SLOT_EARS) )
- return 0
- if( (slot_flags & SLOT_TWOEARS) && H.l_ear )
- return 0
- return 1
- if(slot_w_uniform)
- if(H.w_uniform)
- return 0
- if( !(slot_flags & SLOT_ICLOTHING) )
- return 0
- return 1
- if(slot_wear_id)
- if(H.wear_id)
- return 0
- if(!H.w_uniform)
- if(!disable_warning)
- H << "\red You need a jumpsuit before you can attach this [name]."
- return 0
- if( !(slot_flags & SLOT_ID) )
- return 0
- return 1
- if(slot_wear_pda)
- if(H.wear_pda)
- return 0
- if(!H.w_uniform)
- if(!disable_warning)
- H << "\red You need a jumpsuit before you can attach this [name]."
- return 0
- if( !(slot_flags & SLOT_PDA) )
- return 0
- return 1
- if(slot_l_store)
- if(flags & NODROP) //Pockets aren't visible, so you can't move NODROP items into them.
- return 0
- if(H.l_store)
- return 0
- if(!H.w_uniform)
- if(!disable_warning)
- H << "\red You need a jumpsuit before you can attach this [name]."
- return 0
- if(slot_flags & SLOT_DENYPOCKET)
- return
- if( w_class <= 2 || (slot_flags & SLOT_POCKET) )
- return 1
- if(slot_r_store)
- if(flags & NODROP)
- return 0
- if(H.r_store)
- return 0
- if(!H.w_uniform)
- if(!disable_warning)
- H << "\red You need a jumpsuit before you can attach this [name]."
- return 0
- if(slot_flags & SLOT_DENYPOCKET)
- return 0
- if( w_class <= 2 || (slot_flags & SLOT_POCKET) )
- return 1
- return 0
- if(slot_s_store)
- if(flags & NODROP) //Suit storage NODROP items drop if you take a suit off, this is to prevent people exploiting this.
- return 0
- if(H.s_store)
- return 0
- if(!H.wear_suit)
- if(!disable_warning)
- H << "\red You need a suit before you can attach this [name]."
- return 0
- if(!H.wear_suit.allowed)
- if(!disable_warning)
- usr << "You somehow have a suit with no defined allowed items for suit storage, stop that."
- return 0
- if(src.w_class > 4)
- if(!disable_warning)
- usr << "The [name] is too big to attach."
- return 0
- if( istype(src, /obj/item/device/pda) || istype(src, /obj/item/weapon/pen) || is_type_in_list(src, H.wear_suit.allowed) )
- return 1
- return 0
- if(slot_handcuffed)
- if(H.handcuffed)
- return 0
- if(!istype(src, /obj/item/weapon/restraints/handcuffs))
- return 0
- return 1
- if(slot_legcuffed)
- if(H.legcuffed)
- return 0
- if(!istype(src, /obj/item/weapon/restraints/legcuffs))
- return 0
- return 1
- if(slot_in_backpack)
- if (H.back && istype(H.back, /obj/item/weapon/storage/backpack))
- var/obj/item/weapon/storage/backpack/B = H.back
- if(B.contents.len < B.storage_slots && w_class <= B.max_w_class)
- return 1
- return 0
- if(slot_tie)
- if(!H.w_uniform)
- if(!disable_warning)
- H << "You need a jumpsuit before you can attach this [name]."
- return 0
- var/obj/item/clothing/under/uniform = H.w_uniform
- if(uniform.accessories.len && !uniform.can_attach_accessory(src))
- if (!disable_warning)
- H << "You already have an accessory of this type attached to your [uniform]."
- return 0
- if( !(slot_flags & SLOT_TIE) )
- return 0
- return 1
- return 0 //Unsupported slot
- //END HUMAN
+//Set disable_warning to 1 if you wish it to not give you outputs.
+/obj/item/proc/mob_can_equip(mob/M, slot, disable_warning = 0)
+ if(!M)
+ return 0
+ return M.can_equip(src, slot, disable_warning)
/obj/item/verb/verb_pickup()
set src in oview(1)
diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm
index e061b993e72..159365f0b79 100644
--- a/code/game/objects/items/devices/aicard.dm
+++ b/code/game/objects/items/devices/aicard.dm
@@ -20,7 +20,7 @@
add_logs(AI,user, "carded", object="[name]")
else //No AI on the card, therefore the user wants to download one.
target.transfer_ai(AI_TRANS_TO_CARD, user, null, src)
- update_state() //Whatever happened, update the card's state (icon, name) to match.
+ update_state() //Whatever happened, update the card's state (icon, name) to match.
/obj/item/device/aicard/proc/update_state()
var/mob/living/silicon/ai/AI = locate(/mob/living/silicon/ai) in src //AI is inside.
@@ -34,90 +34,74 @@
else
icon_state = "aicard"
name = "intelliCard"
- overlays.Cut()
-
+ overlays.Cut()
+
/obj/item/device/aicard/attack_self(mob/user)
- if (!in_range(src, user))
- return
- user.set_machine(src)
- var/dat = "Intelicard
"
- var/laws
- for(var/mob/living/silicon/ai/A in src)
- dat += "Stored AI: [A.name]
System integrity: [(A.health+100)/2]%
"
+ ui_interact(user)
- for (var/datum/ai_law/law in A.laws.all_laws())
- laws += "[law.get_index()]: [law.law]
"
- dat += "Laws:
[laws]
"
+/obj/item/device/aicard/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = inventory_state)
+ var/data[0]
- if (A.stat == 2)
- dat += "AI nonfunctional"
- else
- if (!src.flush)
- dat += {"Wipe AI"}
- else
- dat += "Wipe in progress"
- dat += "
"
- dat += {"[A.control_disabled ? "Enable" : "Disable"] Wireless Activity"}
- dat += "
"
- dat += "Subspace Transceiver is: [A.aiRadio.disabledAi ? "Disabled" : "Enabled"]"
- dat += "
"
- dat += {"[A.aiRadio.disabledAi ? "Enable" : "Disable"] Subspace Transceiver"}
- dat += "
"
- dat += {" Close"}
- user << browse(dat, "window=aicard")
- onclose(user, "aicard")
- return
+ var/mob/living/silicon/ai/AI = locate() in src
+ if(istype(AI))
+ data["has_ai"] = 1
+ data["name"] = AI.name
+ data["hardware_integrity"] = ((AI.health + 100) / 2)
+ data["radio"] = !AI.aiRadio.disabledAi
+ data["wireless"] = !AI.control_disabled
+ data["operational"] = AI.stat != DEAD
+ data["flushing"] = flush
-/obj/item/device/aicard/Topic(href, href_list)
- var/mob/U = usr
- if (!in_range(src, U)||U.machine!=src)//If they are not in range of 1 or less or their machine is not the card (ie, clicked on something else).
- U << browse(null, "window=aicard")
- U.unset_machine()
- return
+ var/laws[0]
+ for(var/datum/ai_law/AL in AI.laws.all_laws())
+ laws[++laws.len] = list("index" = AL.get_index(), "law" = sanitize(AL.law))
+ data["laws"] = laws
+ data["has_laws"] = laws.len
- add_fingerprint(U)
- U.set_machine(src)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "aicard.tmpl", "[name]", 600, 400, state = state)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
- switch(href_list["choice"])//Now we switch based on choice.
- if ("Close")
- U << browse(null, "window=aicard")
- U.unset_machine()
- return
- if ("Wipe")
- var/confirm = alert("Are you sure you want to wipe this card's memory? This cannot be undone once started.", "Confirm Wipe", "Yes", "No")
- if(confirm == "Yes")
- if(isnull(src)||!in_range(src, U)||U.machine!=src)
- U << browse(null, "window=aicard")
- U.unset_machine()
- return
- else
- flush = 1
- for(var/mob/living/silicon/ai/A in src)
- A.suiciding = 1
- A << "Your core files are being wiped!"
- while (A.stat != 2)
- A.adjustOxyLoss(2)
- A.updatehealth()
- sleep(10)
- flush = 0
+/obj/item/device/aicard/Topic(href, href_list, nowindow, state)
+ if(..())
+ return 1
- if ("Radio")
- for(var/mob/living/silicon/ai/A in src)
- A.aiRadio.disabledAi = !A.aiRadio.disabledAi
- A << "Your Subspace Transceiver has been: [A.aiRadio.disabledAi ? "disabled" : "enabled"]"
- U << "You [A.aiRadio.disabledAi ? "Disable" : "Enable"] the AI's Subspace Transceiver"
+ var/mob/living/silicon/ai/AI = locate() in src
+ if(!istype(AI))
+ return 1
- if ("Wireless")
- for(var/mob/living/silicon/ai/A in src)
- A.control_disabled = !A.control_disabled
- A << "The intelicard's wireless port has been [A.control_disabled ? "disabled" : "enabled"]!"
- if (A.control_disabled)
- overlays -= image('icons/obj/aicards.dmi', "aicard-on")
- else
- overlays += image('icons/obj/aicards.dmi', "aicard-on")
- attack_self(U)
+ var/user = usr
+
+ if (href_list["wipe"])
+ var/confirm = alert("Are you sure you want to wipe this card's memory? This cannot be undone once started.", "Confirm Wipe", "Yes", "No")
+ if(confirm == "Yes" && (CanUseTopic(user, state) == STATUS_INTERACTIVE))
+ msg_admin_attack("[key_name_admin(user)] wiped [key_name_admin(AI)] with \the [src].")
+ flush = 1
+ AI.suiciding = 1
+ AI << "Your core files are being wiped!"
+ while (AI && AI.stat != DEAD)
+ AI.adjustOxyLoss(2)
+ AI.updatehealth()
+ sleep(10)
+ flush = 0
+
+ if (href_list["radio"])
+ AI.aiRadio.disabledAi = text2num(href_list["radio"])
+ AI << "Your Subspace Transceiver has been [AI.aiRadio.disabledAi ? "disabled" : "enabled"]!"
+ user << "You [AI.aiRadio.disabledAi ? "disable" : "enable"] the AI's Subspace Transceiver."
+
+ if (href_list["wireless"])
+ AI.control_disabled = text2num(href_list["wireless"])
+ AI << "Your wireless interface has been [AI.control_disabled ? "disabled" : "enabled"]!"
+ user << "You [AI.control_disabled ? "disable" : "enable"] the AI's wireless interface."
+ update_icon()
+
+ return 1
/obj/item/device/aicard/ex_act(severity)
switch(severity)
diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm
index 56d6fbbdafd..aea107885f7 100644
--- a/code/game/objects/items/devices/radio/electropack.dm
+++ b/code/game/objects/items/devices/radio/electropack.dm
@@ -10,11 +10,13 @@
materials = list(MAT_METAL=10000, MAT_GLASS=2500)
var/code = 2
+ is_special = 1
+
/obj/item/device/radio/electropack/attack_hand(mob/user as mob)
if(src == user.back)
user << "You need help taking this off!"
- return
- ..()
+ return 0
+ . = ..()
/obj/item/device/radio/electropack/Destroy()
if(istype(src.loc, /obj/item/assembly/shock_kit))
@@ -53,42 +55,22 @@
A.flags |= NODROP
/obj/item/device/radio/electropack/Topic(href, href_list)
- //..()
- if(usr.stat || usr.restrained())
- return
- if(((istype(usr, /mob/living/carbon/human) && ((!( ticker ) || (ticker && ticker.mode != "monkey")) && usr.contents.Find(src))) || (usr.contents.Find(master) || (in_range(src, usr) && istype(loc, /turf)))))
- usr.set_machine(src)
- if(href_list["freq"])
- var/new_frequency = sanitize_frequency(frequency + text2num(href_list["freq"]))
- set_frequency(new_frequency)
- else
- if(href_list["code"])
- code += text2num(href_list["code"])
- code = round(code)
- code = min(100, code)
- code = max(1, code)
- else
- if(href_list["power"])
- on = !( on )
- icon_state = "electropack[on]"
- if(!( master ))
- if(istype(loc, /mob))
- attack_self(loc)
- else
- for(var/mob/M in viewers(1, src))
- if(M.client)
- attack_self(M)
- else
- if(istype(master.loc, /mob))
- attack_self(master.loc)
- else
- for(var/mob/M in viewers(1, master))
- if(M.client)
- attack_self(M)
- else
- usr << browse(null, "window=radio")
- return
- return
+ if(..())
+ return 1
+
+ if(href_list["freq"])
+ var/new_frequency = sanitize_frequency(frequency + text2num(href_list["freq"]))
+ set_frequency(new_frequency)
+
+ else if(href_list["code"])
+ code += text2num(href_list["code"])
+ code = round(code)
+ code = Clamp(code, 1, 100)
+
+ else if(href_list["power"])
+ on = !on
+
+ add_fingerprint(usr)
/obj/item/device/radio/electropack/receive_signal(datum/signal/signal)
if(!signal || signal.encryption != code)
@@ -115,26 +97,17 @@
master.receive_signal()
return
-/obj/item/device/radio/electropack/attack_self(mob/user as mob, flag1)
- if(!istype(user, /mob/living/carbon/human))
- return
- user.set_machine(src)
- var/dat = {"
-Turn [on ? "Off" : "On"]
-Frequency/Code for electropack:
-Frequency:
--
-- [format_frequency(frequency)]
-+
-+
+/obj/item/device/radio/electropack/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ var/data[0]
-Code:
--
-- [code]
-+
-+
-"}
- user << browse(dat, "window=radio")
- onclose(user, "radio")
- return
+ data["power"] = on
+ data["freq"] = format_frequency(frequency)
+ data["code"] = code
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "radio_electro.tmpl", "[name]", 400, 500)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
\ No newline at end of file
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 4aa8f8b73f0..1ef94fde8d2 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -38,6 +38,9 @@ var/global/list/default_medbay_channels = list(
var/list/channels = list() //see communications.dm for full list. First channes is a "default" for :h
var/subspace_transmission = 0
var/syndie = 0//Holder to see if it's a syndicate encrpyed radio
+
+ var/is_special = 0 //For electropacks mostly, skips Topic() checks
+
flags = CONDUCT
slot_flags = SLOT_BELT
throw_speed = 2
@@ -89,59 +92,68 @@ var/global/list/default_medbay_channels = list(
secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
/obj/item/device/radio/attack_ghost(mob/user)
- interact(user)
+ return ui_interact(user)
/obj/item/device/radio/attack_self(mob/user as mob)
user.set_machine(src)
interact(user)
-/obj/item/device/radio/interact(mob/user as mob)
- if(!on)
- return
+/obj/item/device/radio/interact(mob/user)
+ if(!user)
+ return 0
- if(active_uplink_check(user))
- return
+ if(b_stat)
+ wires.Interact(user)
- var/dat = "[src]"
+ return ui_interact(user)
- if(!istype(src, /obj/item/device/radio/headset)) //Headsets dont get a mic button
- dat += "Microphone: [broadcasting ? "Engaged" : "Disengaged"]
"
+/obj/item/device/radio/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ var/data[0]
- dat += {"
- Speaker: [listening ? "Engaged" : "Disengaged"]
- Frequency:
- -
- -
- [format_frequency(frequency)]
- +
- +
- "}
+ data["mic_status"] = broadcasting
+ data["speaker"] = listening
+ data["freq"] = format_frequency(frequency)
+ data["rawfreq"] = num2text(frequency)
- dat+=list_channels(user)
+ data["mic_cut"] = (wires.IsIndexCut(WIRE_TRANSMIT) || wires.IsIndexCut(WIRE_SIGNAL))
+ data["spk_cut"] = (wires.IsIndexCut(WIRE_RECEIVE) || wires.IsIndexCut(WIRE_SIGNAL))
- dat+={"[text_wires()]"}
- user << browse(dat, "window=radio")
- onclose(user, "radio")
- return
+ var/list/chanlist = list_channels(user)
+ if(islist(chanlist) && chanlist.len)
+ data["chan_list"] = chanlist
+ data["chan_list_len"] = chanlist.len
+
+ if(syndie)
+ data["useSyndMode"] = 1
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "radio_basic.tmpl", "[name]", 400, 550)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
/obj/item/device/radio/proc/list_channels(var/mob/user)
return list_internal_channels(user)
/obj/item/device/radio/proc/list_secure_channels(var/mob/user)
- var/dat = ""
- for (var/ch_name in channels)
- dat+=text_sec_channel(ch_name, channels[ch_name])
+ var/dat[0]
+
+ for(var/ch_name in channels)
+ var/chan_stat = channels[ch_name]
+ var/listening = !!(chan_stat & FREQ_LISTENING) != 0
+
+ dat.Add(list(list("chan" = ch_name, "display_name" = ch_name, "secure_channel" = 1, "sec_channel_listen" = !listening)))
+
return dat
/obj/item/device/radio/proc/list_internal_channels(var/mob/user)
- var/dat = ""
- for (var/internal_chan in internal_channels)
+ var/dat[0]
+ for(var/internal_chan in internal_channels)
if(has_channel_access(user, internal_chan))
- dat+="[get_frequency_name(text2num(internal_chan))]
"
+ dat.Add(list(list("chan" = internal_chan, "display_name" = get_frequency_name(text2num(internal_chan)))))
- if(dat)
- dat = "
Internal Channels
" + dat
return dat
/obj/item/device/radio/proc/has_channel_access(var/mob/user, var/freq)
@@ -169,13 +181,6 @@ var/global/list/default_medbay_channels = list(
return wires.GetInteractWindow()
return
-/obj/item/device/radio/proc/text_sec_channel(var/chan_name, var/chan_stat)
- var/list = !!(chan_stat&FREQ_LISTENING)!=0
- return {"
- [chan_name]
- Speaker: [list ? "Engaged" : "Disengaged"]
- "}
-
/obj/item/device/radio/proc/ToggleBroadcast()
broadcasting = !broadcasting && !(wires.IsIndexCut(WIRE_TRANSMIT) || wires.IsIndexCut(WIRE_SIGNAL))
@@ -186,6 +191,9 @@ var/global/list/default_medbay_channels = list(
if(..())
return 1
+ if(is_special)
+ return 0
+
if (href_list["track"])
var/mob/target = locate(href_list["track"])
var/mob/living/silicon/ai/A = locate(href_list["track2"])
@@ -205,7 +213,7 @@ var/global/list/default_medbay_channels = list(
else if (href_list["talk"])
ToggleBroadcast()
. = 1
- else if (href_list["listen"])
+ else if(href_list["listen"])
var/chan_name = href_list["ch_name"]
if (!chan_name)
ToggleReception()
@@ -220,11 +228,10 @@ var/global/list/default_medbay_channels = list(
if(has_channel_access(usr, freq))
set_frequency(text2num(freq))
. = 1
+
if(href_list["nowindow"]) // here for pAIs, maybe others will want it, idk
return 1
- if(.)
- interact(usr)
add_fingerprint(usr)
/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel, var/zlevel = config.contact_levels) //BS12 EDIT
@@ -576,6 +583,11 @@ var/global/list/default_medbay_channels = list(
syndie = 1
keyslot = new /obj/item/device/encryptionkey/syndicate
+/obj/item/device/radio/borg/syndicate/CanUseTopic(mob/user, datum/topic_state/state)
+ . = ..()
+ if(. == STATUS_UPDATE && istype(user, /mob/living/silicon/robot/syndicate))
+ . = STATUS_INTERACTIVE
+
/obj/item/device/radio/borg/Destroy()
myborg = null
return ..()
@@ -703,32 +715,40 @@ var/global/list/default_medbay_channels = list(
usr << "Loudspeaker enabled."
. = 1
- if(.)
- interact(usr)
/obj/item/device/radio/borg/interact(mob/user as mob)
if(!on)
return
- var/dat = "[src]"
- dat += {"
- Speaker: [listening ? "Engaged" : "Disengaged"]
- Frequency:
- -
- -
- [format_frequency(frequency)]
- +
- +
- Broadcasting: [subspace_transmission ? "Disable" : "Enable"]
- Loudspeaker: [shut_up ? "Enable" : "Disable"]
- "}
+ . = ..()
- if(subspace_transmission)//Don't even bother if subspace isn't turned on
- dat+=list_channels(user)
- dat+={"[text_wires()]"}
- user << browse(dat, "window=radio")
- onclose(user, "radio")
- return
+/obj/item/device/radio/borg/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ var/data[0]
+
+ data["mic_status"] = broadcasting
+ data["speaker"] = listening
+ data["freq"] = format_frequency(frequency)
+ data["rawfreq"] = num2text(frequency)
+
+ var/list/chanlist = list_channels(user)
+ if(islist(chanlist) && chanlist.len)
+ data["chan_list"] = chanlist
+ data["chan_list_len"] = chanlist.len
+
+ if(syndie)
+ data["useSyndMode"] = 1
+
+ data["has_loudspeaker"] = 1
+ data["loudspeaker"] = !shut_up
+ data["has_subspace"] = 1
+ data["subspace"] = subspace_transmission
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "radio_basic.tmpl", "[name]", 430, 500)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
/obj/item/device/radio/proc/config(op)
if(radio_controller)
diff --git a/code/game/objects/items/random_items.dm b/code/game/objects/items/random_items.dm
index 81d9a7769e5..b08245b010f 100644
--- a/code/game/objects/items/random_items.dm
+++ b/code/game/objects/items/random_items.dm
@@ -47,8 +47,7 @@
New()
..()
var/datum/reagent/R = pick(chemical_reagents_list)
- var/global/list/rare_chems = list("minttoxin","nanites","xenomicrobes","adminordrazine")
- if(rare_chems.Find(R))
+ if(rare_chemicals.Find(R))
reagents.add_reagent(R,10)
else
reagents.add_reagent(R,rand(2,3)*10)
@@ -61,11 +60,9 @@
// identify_probability = 0
New()
..()
- var/global/list/chems_only = list("slimejelly","blood","water","lube","charcoal","toxin","cyanide","morphine","epinephrine","space_drugs","serotrotium","oxygen","copper","nitrogen","hydrogen","potassium","mercury","sulfur","carbon","chlorine","fluorine","sodium","phosphorus","lithium","sugar","sacid","facid","glycerol","radium","mutadone","thermite","mutagen","virusfood","iron","gold","silver","uranium","aluminum","silicon","fuel","cleaner","atrazine","plasma","teporone","lexorin","silver_sulfadiazine","salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol","potass_iodide","pen_acid","mannitol","oculine","styptic_powder","methamphetamine","cryoxadone","spaceacillin","carpotoxin","lsd","fluorosurfactant","fluorosurfactant","ethanol","ammonia","diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin","frostoil","amanitin","psilocybin","enzyme","nothing","salglu_solution","antifreeze","neurotoxin")
- var/global/list/rare_chems = list("minttoxin","nanites","xenomicrobes","adminordrazine")
- var/datum/reagent/R = pick(chems_only + rare_chems)
- if(rare_chems.Find(R))
+ var/datum/reagent/R = pick(standard_chemicals + rare_chemicals)
+ if(rare_chemicals.Find(R))
reagents.add_reagent(R,10)
else
reagents.add_reagent(R,rand(2,3)*10)
@@ -78,35 +75,35 @@
// identify_probability = 0
New()
..()
- var/global/list/base_chems = list("water","oxygen","nitrogen","hydrogen","potassium","mercury","carbon","chlorine","fluorine","phosphorus","lithium","sulfur","sacid","radium","iron","aluminum","silicon","sugar","ethanol")
- var/datum/reagent/R = pick(base_chems)
+ var/datum/reagent/R = pick(base_chemicals)
reagents.add_reagent(R,rand(2,6)*5)
name = "unlabelled bottle"
pixel_x = rand(-10,10)
pixel_y = rand(-10,10)
+
/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink
name = "unlabelled drink"
icon = 'icons/obj/drinks.dmi'
New()
..()
- var/list/drinks_only = list("beer2","hot_coco","orangejuice","tomatojuice","limejuice","carrotjuice","berryjuice","poisonberryjuice","watermelonjuice","lemonjuice","banana","nothing","potato","milk","soymilk","cream","coffee","tea","icecoffee","icetea","cola","nuka_cola","spacemountainwind","thirteenloko","dr_gibb","space_up","lemon_lime","beer","whiskey","gin","rum","vodka","holywater","tequilla","vermouth","wine","tonic","kahlua","cognac","ale","sodawater","ice","bilk","atomicbomb","threemileisland","goldschlager","patron","gintonic","cubalibre","whiskeycola","martini","vodkamartini","whiterussian","screwdrivercocktail","booger","bloodymary","gargleblaster","bravebull","tequillasunrise","toxinsspecial","beepskysmash","salglu_solution","irishcream","manlydorf","longislandicedtea","moonshine","b52","irishcoffee","margarita","blackrussian","manhattan","manhattan_proj","whiskeysoda","antifreeze","barefoot","snowwhite","demonsblood","vodkatonic","ginfizz","bahama_mama","singulo","sbiten","devilskiss","red_mead","mead","iced_beer","grog","aloe","andalusia","alliescocktail","soy_latte","cafe_latte","acidspit","amasec","neurotoxin","hippiesdelight","bananahonk","silencer","changelingsting","irishcarbomb","syndicatebomb","erikasurprise","driestmartini")
+ var/list/additional_drinks = list()
if(prob(50))
- drinks_only += list("pancuronium","adminordrazine","lsd","omnizine","blood")
+ additional_drinks += list("pancuronium","adminordrazine","lsd","omnizine","blood")
- var/datum/reagent/R = pick(drinks_only)
+ var/datum/reagent/R = pick(drinks + additional_drinks)
reagents.add_reagent(R,volume)
name = "unlabelled bottle"
icon_state = pick("alco-white","alco-green","alco-blue","alco-clear","alco-red")
pixel_x = rand(-5,5)
pixel_y = rand(-5,5)
+
/obj/item/weapon/reagent_containers/food/drinks/bottle/random_reagent // Same as the chembottle code except the container
name = "unlabelled drink?"
icon = 'icons/obj/drinks.dmi'
New()
..()
var/datum/reagent/R = pick(chemical_reagents_list)
- var/global/list/rare_chems = list("minttoxin","nanites","xenomicrobes","adminordrazine")
- if(rare_chems.Find(R))
+ if(rare_chemicals.Find(R))
reagents.add_reagent(R,10)
else
reagents.add_reagent(R,rand(3,10)*10)
@@ -123,20 +120,17 @@
New()
..()
- var/global/list/meds_only = list("charcoal","toxin","cyanide","morphine","epinephrine","space_drugs","serotrotium","mutadone","mutagen","teporone","lexorin","silver_sulfadiazine","salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol","potass_iodide","pen_acid","mannitol","oculine","styptic_powder","methamphetamine","spaceacillin","carpotoxin","lsd","ethanol","ammonia","diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin","frostoil","amanitin","psilocybin","nothing","salglu_solution","neurotoxin")
- var/global/list/rare_meds = list("nanites","xenomicrobes","minttoxin","adminordrazine","blood")
-
var/i = 1
while(i < storage_slots)
var/datum/reagent/R
if(prob(50))
- R = pick(meds_only + rare_meds)
+ R = pick(standard_medicines + rare_medicines)
else
- R = pick(meds_only)
+ R = pick(standard_medicines)
var/obj/item/weapon/reagent_containers/pill/P = new(src)
- if(rare_meds.Find(R))
+ if(rare_medicines.Find(R))
P.reagents.add_reagent(R,10)
else
P.reagents.add_reagent(R,rand(2,5)*10)
@@ -185,8 +179,7 @@
New()
..()
sleep(2)
- var/global/list/base_chems = list("water","oxygen","nitrogen","hydrogen","potassium","mercury","carbon","chlorine","fluorine","phosphorus","lithium","sulfur","sacid","radium","iron","aluminum","silicon","sugar","ethanol")
- for(var/chem in base_chems)
+ for(var/chem in standard_chemicals)
var/obj/item/weapon/reagent_containers/glass/bottle/B = new(src)
B.reagents.add_reagent(chem,B.volume)
if(prob(85))
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 62214dd86c2..f6f1fa5faa3 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -229,7 +229,7 @@
if(..())
return 1
- if (istype(M, /mob/living/carbon/human))
+ if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
var/limb = affecting.name
@@ -238,6 +238,9 @@
return
if(affecting.status & ORGAN_SPLINTED)
user << "\red [M]'s [limb] is already splinted!"
+ if(alert(user, "Would you like to remove the splint from [M]'s [limb]?", "Removing.", "Yes", "No") == "Yes")
+ affecting.status &= ~ORGAN_SPLINTED
+ user << "You remove the splint from [M]'s [limb]."
return
if (M != user)
user.visible_message("\red [user] starts to apply \the [src] to [M]'s [limb].", "\red You start to apply \the [src] to [M]'s [limb].", "\red You hear something being wrapped.")
diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm
index 87bd6a78d5d..0a91cc28708 100644
--- a/code/game/objects/items/weapons/dna_injector.dm
+++ b/code/game/objects/items/weapons/dna_injector.dm
@@ -96,10 +96,13 @@
if(ishuman(M)) // Would've done this via species instead of type, but the basic mob doesn't have a species, go figure.
var/mob/living/carbon/human/H = M
if(H.species.flags & NO_DNA_RAD)
- return
-
- if (!usr.IsAdvancedToolUser())
- return
+ return 0
+
+ if (!user.IsAdvancedToolUser())
+ return 0
+
+ if(inuse)
+ return 0
M.attack_log += text("\[[time_stamp()]\] Has been injected with [name] by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [name] to inject [M.name] ([M.ckey])")
@@ -110,91 +113,37 @@
else
M.LAssailant = user
- if (user)
- if (istype(M, /mob/living/carbon/human))
- if(!inuse)
- var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( )
- O.source = user
- O.target = M
- O.item = src
- O.s_loc = user.loc
- O.t_loc = M.loc
- O.place = "dnainjector"
- src.inuse = 1
- spawn(50) // Not the best fix. There should be an failure proc, for /effect/equip_e/, which is called when the first initital checks fail
- inuse = 0
- M.requests += O
- if (buf.types & DNA2_BUF_SE)
- if(block)// Isolated injector
- //testing("Isolated block [block] injector with contents: [GetValue()]")
- if (GetState() && block == MONKEYBLOCK && istype(M, /mob/living/carbon/human) )
- message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
- log_attack("[key_name(user)] injected [key_name(M)] with the Isolated [name] (MONKEY)")
- log_game("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
- else
- log_attack("[key_name(user)] injected [key_name(M)] with the Isolated [name]")
- else
- // testing("DNA injector with contents: [english_list(buf.dna.SE)]")
- if (GetState(MONKEYBLOCK) && istype(M, /mob/living/carbon/human) )
- message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] \red(MONKEY)")
- log_attack("[key_name(user)] injected [key_name(M)] with the [name] (MONKEY)")
- log_game("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] \red(MONKEY)")
- else
- // message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name]")
- log_attack("[key_name(user)] injected [key_name(M)] with the [name]")
- else
- // message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name]")
- log_attack("[key_name(user)] injected [key_name(M)] with the [name]")
+ if(buf.types & DNA2_BUF_SE)
+
+ if(block)
+ if(GetState() && block == MONKEYBLOCK && ishuman(M))
+ message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
+ log_attack("[key_name(user)] injected [key_name(M)] with the Isolated [name] (MONKEY)")
+ log_game("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
+ else
+ log_attack("[key_name(user)] injected [key_name(M)] with the Isolated [name]")
- spawn( 0 )
- O.process()
- return
else
- if(!inuse)
+ if(GetState(MONKEYBLOCK) && ishuman(M))
+ message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
+ log_attack("[key_name(user)] injected [key_name(M)] with the Isolated [name] (MONKEY)")
+ log_game("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
+ else
+ log_attack("[key_name(user)] injected [key_name(M)] with the Isolated [name]")
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] has been injected with [] by [].", M, src, user), 1)
- //Foreach goto(192)
- if (!(istype(M, /mob/living/carbon/human)))
- user << "\red Apparently it didn't work."
- return
+ else
+ log_attack("[key_name(user)] injected [key_name(M)] with the [name]")
- if (buf.types & DNA2_BUF_SE)
- if(block)// Isolated injector
- // testing("Isolated block [block] injector with contents: [english_list(GetValue())]")
- if (GetState() && block == MONKEYBLOCK && istype(M, /mob/living/carbon/human) )
- message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
- log_attack("[key_name(user)] injected [key_name(M)] with the Isolated [name] (MONKEY)")
- log_game("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
- else
- log_attack("[key_name(user)] injected [key_name(M)] with the Isolated [name]")
- else
- // testing("DNA injector with contents: [english_list(buf.dna.SE)]")
- if (GetState(MONKEYBLOCK) && istype(M, /mob/living/carbon/human))
- message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] \red(MONKEY)")
- log_game("[key_name(user)] injected [key_name(M)] with the [name] (MONKEY)")
- else
- // message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name]")
- log_game("[key_name(user)] injected [key_name(M)] with the [name]")
- else
-// message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name]")
- log_game("[key_name(user)] injected [key_name(M)] with the [name]")
- inuse = 1
- inject(M, user)//Now we actually do the heavy lifting.
- spawn(50)
- inuse = 0
- /*
- A user injecting themselves could mean their own transformation and deletion of mob.
- I don't have the time to figure out how this code works so this will do for now.
- I did rearrange things a bit.
- */
- if(user)//If the user still exists. Their mob may not.
- if(M)//Runtime fix: If the mob doesn't exist, mob.name doesnt work. - Nodrak
- user.show_message(text("\red You inject [M.name]"))
- else
- user.show_message(text("\red You finish the injection."))
- return
+ user.visible_message("\The [user] starts injecting \the [M] with \the [src]!", "You start injecting \the [M] with \the [src].")
+ if(do_after(user, 50, target = M))
+ inject(M, user)//Now we actually do the heavy lifting
+ user.visible_message("\The [user] injects \the [M] with \the [src]!", "You inject \the [M] with \the [src].")
+ if(user)//If the user still exists. Their mob may not.
+ if(M)//Runtime fix: If the mob doesn't exist, mob.name doesnt work. - Nodrak
+ user.show_message("You inject [M.name]")
+ else
+ user.show_message("You finish the injection.")
/obj/item/weapon/dnainjector/hulkmut
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index b93db8244e2..74863ccd4af 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -8,7 +8,7 @@
var/implanted = null
var/mob/living/imp_in = null
var/obj/item/organ/external/part = null
- _color = "b"
+ item_color = "b"
var/allow_reagents = 0
var/malfunction = 0
diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm
index f32764ae410..742717c1b70 100644
--- a/code/game/objects/items/weapons/implants/implantcase.dm
+++ b/code/game/objects/items/weapons/implants/implantcase.dm
@@ -22,7 +22,7 @@
update()
if (src.imp)
- src.icon_state = text("implantcase-[]", src.imp._color)
+ src.icon_state = text("implantcase-[]", src.imp.item_color)
src.origin_tech = src.imp.origin_tech
else
src.icon_state = "implantcase-0"
diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implantfreedom.dm
index 282717b606c..978b6eb237b 100644
--- a/code/game/objects/items/weapons/implants/implantfreedom.dm
+++ b/code/game/objects/items/weapons/implants/implantfreedom.dm
@@ -3,7 +3,7 @@
/obj/item/weapon/implant/freedom
name = "freedom"
desc = "Use this to escape from those evil Red Shirts."
- _color = "r"
+ item_color = "r"
var/activation_emote = "chuckle"
origin_tech = "materials=2;magnets=3;biotech=3;syndicate=4"
var/uses = 4
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index d8be2b42563..59347a12251 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -25,10 +25,10 @@
hitsound = 'sound/weapons/blade1.ogg'
if(attack_verb_on.len)
attack_verb = attack_verb_on
- if(!_color)
+ if(!item_color)
icon_state = icon_state_on
else
- icon_state = "sword[_color]"
+ icon_state = "sword[item_color]"
w_class = w_class_on
playsound(user, 'sound/weapons/saberon.ogg', 35, 1) //changed it from 50% volume to 35% because deafness
user << "[src] is now active."
@@ -86,8 +86,8 @@
var/blade_color
/obj/item/weapon/melee/energy/sword/New()
- if(_color == null)
- _color = pick("red", "blue", "green", "purple")
+ if(item_color == null)
+ item_color = pick("red", "blue", "green", "purple")
/obj/item/weapon/melee/energy/sword/IsShield()
if(active)
@@ -120,12 +120,12 @@
icon_state = "esaw_0"
icon_state_on = "esaw_1"
hitcost = 75 //Costs more than a standard cyborg esword
- _color = null
+ item_color = null
w_class = 3
/obj/item/weapon/melee/energy/sword/cyborg/saw/New()
..()
- _color = null
+ item_color = null
/obj/item/weapon/melee/energy/sword/cyborg/saw/IsShield()
return 0
@@ -133,16 +133,16 @@
/obj/item/weapon/melee/energy/sword/saber
/obj/item/weapon/melee/energy/sword/saber/blue
- _color = "blue"
+ item_color = "blue"
/obj/item/weapon/melee/energy/sword/saber/purple
- _color = "purple"
+ item_color = "purple"
/obj/item/weapon/melee/energy/sword/saber/green
- _color = "green"
+ item_color = "green"
/obj/item/weapon/melee/energy/sword/saber/red
- _color = "red"
+ item_color = "red"
/obj/item/weapon/melee/energy/sword/saber/attackby(obj/item/weapon/W, mob/living/user, params)
..()
@@ -156,7 +156,7 @@
var/obj/item/weapon/twohanded/dualsaber/newSaber = new /obj/item/weapon/twohanded/dualsaber(user.loc)
if(src.hacked) // That's right, we'll only check the "original" esword.
newSaber.hacked = 1
- newSaber._color = "rainbow"
+ newSaber.item_color = "rainbow"
user.unEquip(W)
user.unEquip(src)
qdel(W)
@@ -165,7 +165,7 @@
else if(istype(W, /obj/item/device/multitool))
if(hacked == 0)
hacked = 1
- _color = "rainbow"
+ item_color = "rainbow"
user << "RNBW_ENGAGE"
if(active)
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index bdf8a85286c..a823a880866 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -31,6 +31,13 @@
..()
if(climbable)
verbs += /obj/structure/proc/climb_on
+ if(ticker)
+ cameranet.updateVisibility(src)
+
+/obj/structure/Destroy()
+ if(ticker)
+ cameranet.updateVisibility(src)
+ return ..()
/obj/structure/proc/climb_on()
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index f492bcc639c..af608addbf8 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -15,7 +15,7 @@ LINEN BINS
throw_speed = 1
throw_range = 2
w_class = 1.0
- _color = "white"
+ item_color = "white"
slot_flags = SLOT_BACK
@@ -31,127 +31,127 @@ LINEN BINS
/obj/item/weapon/bedsheet/blue
icon_state = "sheetblue"
- _color = "blue"
+ item_color = "blue"
/obj/item/weapon/bedsheet/green
icon_state = "sheetgreen"
- _color = "green"
+ item_color = "green"
/obj/item/weapon/bedsheet/orange
icon_state = "sheetorange"
- _color = "orange"
+ item_color = "orange"
/obj/item/weapon/bedsheet/purple
icon_state = "sheetpurple"
- _color = "purple"
+ item_color = "purple"
/obj/item/weapon/bedsheet/patriot
name = "patriotic bedsheet"
desc = "You've never felt more free than when sleeping on this."
icon_state = "sheetUSA"
- _color = "sheetUSA"
+ item_color = "sheetUSA"
/obj/item/weapon/bedsheet/rainbow
name = "rainbow bedsheet"
desc = "A multi_colored blanket. It's actually several different sheets cut up and sewn together."
icon_state = "sheetrainbow"
- _color = "rainbow"
+ item_color = "rainbow"
/obj/item/weapon/bedsheet/red
icon_state = "sheetred"
- _color = "red"
+ item_color = "red"
/obj/item/weapon/bedsheet/yellow
icon_state = "sheetyellow"
- _color = "yellow"
+ item_color = "yellow"
/obj/item/weapon/bedsheet/mime
name = "mime's blanket"
desc = "A very soothing striped blanket. All the noise just seems to fade out when you're under the covers in this."
icon_state = "sheetmime"
- _color = "mime"
+ item_color = "mime"
/obj/item/weapon/bedsheet/clown
name = "clown's blanket"
desc = "A rainbow blanket with a clown mask woven in. It smells faintly of bananas."
icon_state = "sheetclown"
- _color = "clown"
+ item_color = "clown"
/obj/item/weapon/bedsheet/captain
name = "captain's bedsheet."
desc = "It has a Nanotrasen symbol on it, and was woven with a revolutionary new kind of thread guaranteed to have 0.01% permeability for most non-chemical substances, popular among most modern captains."
icon_state = "sheetcaptain"
- _color = "captain"
+ item_color = "captain"
/obj/item/weapon/bedsheet/rd
name = "research director's bedsheet"
desc = "It appears to have a beaker emblem, and is made out of fire-resistant material, although it probably won't protect you in the event of fires you're familiar with every day."
icon_state = "sheetrd"
- _color = "director"
+ item_color = "director"
/obj/item/weapon/bedsheet/medical
name = "medical blanket"
desc = "It's a sterilized* blanket commonly used in the Medbay. *Sterilization is voided if a virologist is present onboard the station."
icon_state = "sheetmedical"
- _color = "medical"
+ item_color = "medical"
/obj/item/weapon/bedsheet/cmo
name = "chief medical officer's bedsheet"
desc = "It's a sterilized blanket that has a cross emblem. There's some cat fur on it, likely from Runtime."
icon_state = "sheetcmo"
- _color = "cmo"
+ item_color = "cmo"
/obj/item/weapon/bedsheet/hos
name = "head of security's bedsheet"
desc = "It is decorated with a shield emblem. While crime doesn't sleep, you do, but you are still THE LAW!"
icon_state = "sheethos"
- _color = "hosred"
+ item_color = "hosred"
/obj/item/weapon/bedsheet/hop
name = "head of personnel's bedsheet"
desc = "It is decorated with a key emblem. For those rare moments when you can rest and cuddle with Ian without someone screaming for you over the radio."
icon_state = "sheethop"
- _color = "hop"
+ item_color = "hop"
/obj/item/weapon/bedsheet/ce
name = "chief engineer's bedsheet"
desc = "It is decorated with a wrench emblem. It's highly reflective and stain resistant, so you don't need to worry about ruining it with oil."
icon_state = "sheetce"
- _color = "chief"
+ item_color = "chief"
/obj/item/weapon/bedsheet/qm
name = "quartermaster's bedsheet"
desc = "It is decorated with a crate emblem in silver lining. It's rather tough, and just the thing to lie on after a hard day of pushing paper."
icon_state = "sheetqm"
- _color = "qm"
+ item_color = "qm"
/obj/item/weapon/bedsheet/brown
icon_state = "sheetbrown"
- _color = "cargo"
+ item_color = "cargo"
/obj/item/weapon/bedsheet/centcom
name = "centcom bedsheet"
desc = "Woven with advanced nanothread for warmth as well as being very decorated, essential for all officials."
icon_state = "sheetcentcom"
- _color = "centcom"
+ item_color = "centcom"
/obj/item/weapon/bedsheet/syndie
name = "syndicate bedsheet"
desc = "It has a syndicate emblem and it has an aura of evil."
icon_state = "sheetsyndie"
- _color = "syndie"
+ item_color = "syndie"
/obj/item/weapon/bedsheet/cult
name = "cultist's bedsheet"
desc = "You might dream of Nar'Sie if you sleep with this. It seems rather tattered and glows of an eldritch presence."
icon_state = "sheetcult"
- _color = "cult"
+ item_color = "cult"
/obj/item/weapon/bedsheet/wiz
name = "wizard's bedsheet"
desc = "A special fabric enchanted with magic so you can have an enchanted night. It even glows!"
icon_state = "sheetwiz"
- _color = "wiz"
+ item_color = "wiz"
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index 50ffc340dbf..f824fa3a5fa 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -131,17 +131,12 @@
new /obj/item/clothing/head/soft/blue(src)
new /obj/item/clothing/gloves/color/latex(src)
new /obj/item/clothing/gloves/color/latex(src)
- new /obj/item/clothing/gloves/color/latex(src)
- new /obj/item/clothing/gloves/color/latex(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/clothing/head/soft/blue(src)
new /obj/item/clothing/head/soft/blue(src)
new /obj/item/clothing/suit/storage/paramedic(src)
new /obj/item/clothing/suit/storage/paramedic(src)
- new /obj/item/clothing/suit/storage/paramedic(src)
- new /obj/item/clothing/suit/storage/paramedic(src)
- new /obj/item/weapon/tank/emergency_oxygen/engi(src)
- new /obj/item/weapon/tank/emergency_oxygen/engi(src)
new /obj/item/weapon/tank/emergency_oxygen/engi(src)
new /obj/item/weapon/tank/emergency_oxygen/engi(src)
+ new /obj/item/key/ambulance(src)
diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
index 51424aeb26e..167e3cd0fa8 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
@@ -30,6 +30,11 @@
if(buckled_mob)
if(buckled_mob.incapacitated())
return 0
+
+ var/mob/living/thedriver = user
+ var/mob_delay = thedriver.movement_delay()
+ if(mob_delay > 0)
+ move_delay += mob_delay
if(ishuman(buckled_mob))
var/mob/living/carbon/human/driver = user
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 36ef84ec83d..0ad197e085e 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -33,6 +33,8 @@
flags = 0
+ var/image/obscured //camerachunks
+
/turf/New()
..()
for(var/atom/movable/AM in src)
@@ -273,7 +275,7 @@
for(var/dir in cardinal)
T = get_step(src, dir)
if(istype(T) && !T.density)
- if(!LinkBlocked(src, T))
+ if(!CanAtmosPass(T))
L.Add(T)
return L
@@ -304,7 +306,7 @@
if(T in closed) //turf already proceeded by A*
continue
if(istype(T) && !T.density)
- if(!LinkBlocked(src, T))
+ if(!CanAtmosPass(T))
L.Add(T)
return L
@@ -318,7 +320,7 @@
continue
if(istype(T) && !T.density)
if(!ID)
- if(!LinkBlocked(src, T))
+ if(!CanAtmosPass(T))
L.Add(T)
else
if(!LinkBlockedWithAccess(src, T, ID))
@@ -359,7 +361,11 @@
ChangeTurf(/turf/space)
return(2)
+/turf/proc/visibilityChanged()
+ if(ticker)
+ cameranet.updateVisibility(src)
+
/turf/proc/get_lumcount() //Gets the lighting level of a given turf.
if(lighting_overlay)
return lighting_overlay.get_clamped_lum()
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index c6acf4af28a..c2eda15b18a 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -115,5 +115,5 @@
modmsg += "\t[C] is a [C.holder.rank]\n"
num_mods_online++
- msg = "Current Admins ([num_admins_online]):\n" + msg + "\n Current Mods/Mentors ([num_mods_online]):\n" + modmsg
+ msg = "Current Admins ([num_admins_online]):\n" + msg + "\nCurrent Mods/Mentors ([num_mods_online]):\n" + modmsg
src << msg
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 721fd897214..b6cc60c82ed 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -56,10 +56,11 @@ var/global/nologevent = 0
body += "[admin_jump_link(M, src)]\]
"
body += "Mob type: [M.type]
"
- if(M.client.related_accounts_cid.len)
- body += "Related accounts by CID: [list2text(M.client.related_accounts_cid, " - ")]
"
- if(M.client.related_accounts_ip.len)
- body += "Related accounts by IP: [list2text(M.client.related_accounts_ip, " - ")]
"
+ if(M.client)
+ if(M.client.related_accounts_cid.len)
+ body += "Related accounts by CID: [list2text(M.client.related_accounts_cid, " - ")]
"
+ if(M.client.related_accounts_ip.len)
+ body += "Related accounts by IP: [list2text(M.client.related_accounts_ip, " - ")]
"
body += "Kick | "
body += "Warn | "
diff --git a/code/modules/admin/create_poll.dm b/code/modules/admin/create_poll.dm
index afeeca6e7db..6e690b469ac 100644
--- a/code/modules/admin/create_poll.dm
+++ b/code/modules/admin/create_poll.dm
@@ -6,18 +6,50 @@
if(!dbcon.IsConnected())
src << "Failed to establish database connection."
return
+ var/returned = create_poll_function()
+ if(returned)
+ var/DBQuery/query_check_option = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_option")] WHERE pollid = [returned]")
+ if(!query_check_option.Execute())
+ var/err = query_check_option.ErrorMsg()
+ log_game("SQL ERROR obtaining id from poll_option table. Error : \[[err]\]\n")
+ return
+ if(query_check_option.NextRow())
+ var/DBQuery/query_log_get = dbcon.NewQuery("SELECT polltype, question, adminonly FROM [format_table_name("poll_question")] WHERE id = [returned]")
+ if(!query_log_get.Execute())
+ var/err = query_log_get.ErrorMsg()
+ log_game("SQL ERROR obtaining polltype, question, adminonly from poll_question table. Error : \[[err]\]\n")
+ return
+ if(query_log_get.NextRow())
+ var/polltype = query_log_get.item[1]
+ var/question = query_log_get.item[2]
+ var/adminonly = query_log_get.item[3]
+ log_admin("[key_name(usr)] has created a new server poll. Poll Type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"] - Question: [question]")
+ message_admins("[key_name_admin(usr)] has created a new server poll. Poll Type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"]
Question: [question]")
+ else
+ src << "Poll question created without any options, poll will be deleted."
+ var/DBQuery/query_del_poll = dbcon.NewQuery("DELETE FROM [format_table_name("poll_question")] WHERE id = [returned]")
+ if(!query_del_poll.Execute())
+ var/err = query_del_poll.ErrorMsg()
+ log_game("SQL ERROR deleting poll question [returned]. Error : \[[err]\]\n")
+ return
+
+/client/proc/create_poll_function()
+ if(!check_rights(R_PERMISSIONS))
+ return
var/polltype = input("Choose poll type.","Poll Type") in list("Single Option","Text Reply","Rating","Multiple Choice")
var/choice_amount = 0
switch(polltype)
if("Single Option")
- polltype = "OPTION"
+ polltype = POLLTYPE_OPTION
if("Text Reply")
- polltype = "TEXT"
+ polltype = POLLTYPE_TEXT
if("Rating")
- polltype = "NUMVAL"
+ polltype = POLLTYPE_RATING
if("Multiple Choice")
- polltype = "MULTICHOICE"
- choice_amount = input("How many choices should be allowed?","Select choice amount") as num
+ polltype = POLLTYPE_MULTI
+ choice_amount = input("How many choices should be allowed?","Select choice amount") as num|null
+ if(!choice_amount)
+ return
var/starttime = SQLtime()
var/endtime = input("Set end time for poll as format YYYY-MM-DD HH:MM:SS. All times in server time. HH:MM:SS is optional and 24-hour. Must be later than starting time for obvious reasons.", "Set end time", SQLtime()) as text
if(!endtime)
@@ -33,7 +65,7 @@
if(!endtime)
src << "Datetime entered is invalid."
return
- var/DBQuery/query_time_later = dbcon.NewQuery("SELECT DATE('[endtime]') < NOW()")
+ var/DBQuery/query_time_later = dbcon.NewQuery("SELECT TIMESTAMP('[endtime]') < NOW()")
if(!query_time_later.Execute())
var/err = query_time_later.ErrorMsg()
log_game("SQL ERROR comparing endtime to NOW(). Error : \[[err]\]\n")
@@ -52,7 +84,7 @@
else
return
var/sql_ckey = sanitizeSQL(ckey)
- var/question = input("Write your question","Question") as message
+ var/question = input("Write your question","Question") as message|null
if(!question)
return
question = sanitizeSQL(question)
@@ -61,6 +93,10 @@
var/err = query_polladd_question.ErrorMsg()
log_game("SQL ERROR adding new poll question to table. Error : \[[err]\]\n")
return
+ if(polltype == POLLTYPE_TEXT)
+ log_admin("[key_name(usr)] has created a new server poll. Poll type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"] - Question: [question]")
+ message_admins("[key_name_admin(usr)] has created a new server poll. Poll type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"]
Question: [question]")
+ return
var/pollid = 0
var/DBQuery/query_get_id = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_question")] WHERE question = '[question]' AND starttime = '[starttime]' AND endtime = '[endtime]' AND createdby_ckey = '[sql_ckey]' AND createdby_ip = '[address]'")
if(!query_get_id.Execute())
@@ -69,13 +105,11 @@
return
if(query_get_id.NextRow())
pollid = query_get_id.item[1]
- if(polltype == "TEXT")
- return
var/add_option = 1
while(add_option)
- var/option = input("Write your option","Option") as message
+ var/option = input("Write your option",POLLTYPE_OPTION) as message|null
if(!option)
- return
+ return pollid
option = sanitizeSQL(option)
var/percentagecalc
switch(alert("Calculate option results as percentage?",,"Yes","No","Cancel"))
@@ -84,42 +118,45 @@
if("No")
percentagecalc = 0
else
- return
+ return pollid
var/minval = 0
var/maxval = 0
var/descmin = ""
var/descmid = ""
var/descmax = ""
- if(polltype == "NUMVAL")
- minval = input("Set minimum rating value.","Minimum rating") as num
+ if(polltype == POLLTYPE_RATING)
+ minval = input("Set minimum rating value.","Minimum rating") as num|null
if(!minval)
- return
- maxval = input("Set maximum rating value.","Maximum rating") as num
+ return pollid
+ maxval = input("Set maximum rating value.","Maximum rating") as num|null
if(!maxval)
- return
+ return pollid
if(minval >= maxval)
src << "Minimum rating value can't be more than maximum rating value"
- return
- descmin = input("Optional: Set description for minimum rating","Minimum rating description") as message
+ return pollid
+ descmin = input("Optional: Set description for minimum rating","Minimum rating description") as message|null
if(descmin)
descmin = sanitizeSQL(descmin)
- descmid = input("Optional: Set description for median rating","Median rating description") as message
+ else if(descmin == null)
+ return pollid
+ descmid = input("Optional: Set description for median rating","Median rating description") as message|null
if(descmid)
descmid = sanitizeSQL(descmid)
- descmax = input("Optional: Set description for maximum rating","Maximum rating description") as message
+ else if(descmid == null)
+ return pollid
+ descmax = input("Optional: Set description for maximum rating","Maximum rating description") as message|null
if(descmax)
descmax = sanitizeSQL(descmax)
+ else if(descmax == null)
+ return pollid
var/DBQuery/query_polladd_option = dbcon.NewQuery("INSERT INTO [format_table_name("poll_option")] (pollid, text, percentagecalc, minval, maxval, descmin, descmid, descmax) VALUES ('[pollid]', '[option]', '[percentagecalc]', '[minval]', '[maxval]', '[descmin]', '[descmid]', '[descmax]')")
if(!query_polladd_option.Execute())
var/err = query_polladd_option.ErrorMsg()
log_game("SQL ERROR adding new poll option to table. Error : \[[err]\]\n")
- return
- switch(alert(" ",,"Add option","Finish","Cancel"))
+ return pollid
+ switch(alert(" ",,"Add option","Finish"))
if("Add option")
add_option = 1
if("Finish")
- log_admin("[key_name(usr)] has created a new server poll. Poll type: [polltype] - Question: [question] - Admin Only: [adminonly ? "Yes" : "No"]")
- message_admins("[key_name_admin(usr)] has created a new server poll. Poll type: [polltype] - Question: [question] - Admin Only: [adminonly ? "Yes" : "No"]")
add_option = 0
- else
- return
+ return pollid
\ No newline at end of file
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index b922b4979c8..1b21829f739 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -2652,7 +2652,7 @@
for(var/obj/item/clothing/under/W in world)
W.icon_state = "schoolgirl"
W.item_state = "w_suit"
- W._color = "schoolgirl"
+ W.item_color = "schoolgirl"
message_admins("[key_name_admin(usr)] activated Japanese Animes mode")
world << sound('sound/AI/animes.ogg')
if("eagles")//SCRAW
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 198e5c8a042..b7f2f2d91bb 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -91,41 +91,38 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
//send this msg to all admins
var/admin_number_afk = 0
+ var/list/mentorholders = list()
var/list/modholders = list()
var/list/adminholders = list()
for(var/client/X in admins)
- if(check_rights(R_MOD|R_MENTOR, 0, X.mob))
- if(X.is_afk())
- admin_number_afk++
- modholders += X
if(check_rights(R_ADMIN, 0, X.mob))
if(X.is_afk())
admin_number_afk++
adminholders += X
+ continue
+ if(check_rights(R_MOD, 0, X.mob))
+ modholders += X
+ continue
+ if(check_rights(R_MENTOR, 0, X.mob))
+ mentorholders += X
+ continue
switch(selected_type)
if("Question")
- if(modholders.len)
- for(var/client/X in modholders)
- if(X.prefs.sound & SOUND_ADMINHELP)
- X << 'sound/effects/adminhelp.ogg'
- X << msg
- if(adminholders.len)
- for(var/client/X in adminholders)
- if(X.prefs.sound & SOUND_ADMINHELP)
- X << 'sound/effects/adminhelp.ogg'
- X << msg
+ for(var/client/X in mentorholders + modholders + adminholders)
+ if(X.prefs.sound & SOUND_ADMINHELP)
+ X << 'sound/effects/adminhelp.ogg'
+ X << msg
if("Player Complaint")
- if(adminholders.len)
- for(var/client/X in adminholders)
- if(X.prefs.sound & SOUND_ADMINHELP)
- X << 'sound/effects/adminhelp.ogg'
- X << msg
+ for(var/client/X in modholders + adminholders)
+ if(X.prefs.sound & SOUND_ADMINHELP)
+ X << 'sound/effects/adminhelp.ogg'
+ X << msg
//show it to the person adminhelping too
src << "[selected_type]: [original_msg]"
- var/admin_number_present = admins.len - admin_number_afk
+ var/admin_number_present = adminholders.len - admin_number_afk
log_admin("[selected_type]: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.")
if(admin_number_present <= 0)
if(!admin_number_afk)
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index d9030d7147f..ae97f0e6ad2 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -1,8 +1,8 @@
/client/proc/Debug2()
set category = "Debug"
set name = "Debug-Game"
-
- if(!check_rights(R_DEBUG))
+
+ if(!check_rights(R_DEBUG))
return
if(Debug2)
@@ -30,7 +30,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
set category = "Debug"
set name = "Advanced ProcCall"
- if(!check_rights(R_PROCCALL))
+ if(!check_rights(R_PROCCALL))
return
spawn(0)
@@ -186,10 +186,10 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
/client/proc/Cell()
set category = "Debug"
set name = "Air Status in Location"
-
+
if(!check_rights(R_DEBUG))
- return
-
+ return
+
if(!mob)
return
var/turf/T = mob.loc
@@ -211,9 +211,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
/client/proc/cmd_admin_robotize(var/mob/M in mob_list)
set category = "Event"
set name = "Make Robot"
-
+
if(!check_rights(R_SPAWN))
- return
+ return
if(!ticker)
alert("Wait until the game starts")
@@ -229,9 +229,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
/client/proc/cmd_admin_animalize(var/mob/M in mob_list)
set category = "Event"
set name = "Make Simple Animal"
-
+
if(!check_rights(R_SPAWN))
- return
+ return
if(!ticker)
alert("Wait until the game starts")
@@ -254,7 +254,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
set category = "Event"
set name = "Make pAI"
set desc = "Specify a location to spawn a pAI device, then specify a key to play that pAI"
-
+
if(!check_rights(R_SPAWN))
return
@@ -283,9 +283,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
/client/proc/cmd_admin_alienize(var/mob/M in mob_list)
set category = "Event"
set name = "Make Alien"
-
+
if(!check_rights(R_SPAWN))
- return
+ return
if(!ticker)
alert("Wait until the game starts")
@@ -303,9 +303,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
/client/proc/cmd_admin_slimeize(var/mob/M in mob_list)
set category = "Event"
set name = "Make slime"
-
+
if(!check_rights(R_SPAWN))
- return
+ return
if(!ticker)
alert("Wait until the game starts")
@@ -323,9 +323,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
/client/proc/cmd_admin_super(var/mob/M in mob_list)
set category = "Event"
set name = "Make Superhero"
-
+
if(!check_rights(R_SPAWN))
- return
+ return
if(!ticker)
alert("Wait until the game starts")
@@ -346,7 +346,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
set name = "Del-All"
if(!check_rights(R_DEBUG))
- return
+ return
// to prevent REALLY stupid deletions
var/blocked = list(/mob/living, /mob/living/carbon, /mob/living/carbon/human, /mob/dead, /mob/dead/observer, /mob/living/silicon, /mob/living/silicon/robot, /mob/living/silicon/ai)
@@ -362,10 +362,10 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
/client/proc/cmd_debug_make_powernets()
set category = "Debug"
set name = "Make Powernets"
-
+
if(!check_rights(R_DEBUG))
- return
-
+ return
+
makepowernets()
log_admin("[key_name(src)] has remade the powernet. makepowernets() called.")
message_admins("[key_name_admin(src)] has remade the powernets. makepowernets() called.", 0)
@@ -374,7 +374,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
/client/proc/cmd_admin_grantfullaccess(var/mob/M in mob_list)
set category = "Admin"
set name = "Grant Full Access"
-
+
if(!check_rights(R_EVENT))
return
@@ -410,9 +410,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
set name = "Assume direct control"
set desc = "Direct intervention"
- if(!check_rights(R_DEBUG|R_ADMIN))
+ if(!check_rights(R_DEBUG|R_ADMIN))
return
-
+
if(M.ckey)
if(alert("This mob is being controlled by [M.ckey]. Are you sure you wish to assume control of it? [M.ckey] will be made a ghost.",,"Yes","No") != "Yes")
return
@@ -431,7 +431,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
/client/proc/cmd_admin_areatest()
set category = "Mapping"
set name = "Test areas"
-
+
if(!check_rights(R_DEBUG))
return
@@ -522,14 +522,14 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
/client/proc/cmd_admin_dress(var/mob/living/carbon/human/M in mob_list)
set category = "Event"
set name = "Select equipment"
-
+
if(!check_rights(R_EVENT))
- return
-
+ return
+
if(!ishuman(M))
alert("Invalid mob")
return
-
+
//log_admin("[key_name(src)] has alienized [M.key].")
var/list/dresspacks = list(
"strip",
@@ -826,43 +826,43 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_syndicate_commando()
if("nanotrasen officer")
- M.equip_if_possible(new /obj/item/clothing/under/rank/centcom/officer(M), slot_w_uniform)
- M.equip_if_possible(new /obj/item/clothing/shoes/centcom(M), slot_shoes)
- M.equip_if_possible(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
- M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain/alt(M), slot_l_ear)
- M.equip_if_possible(new /obj/item/clothing/head/beret/centcom/officer(M), slot_head)
+
+ M.equip_or_collect(new /obj/item/clothing/shoes/centcom(M), slot_shoes)
+ M.equip_or_collect(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
+ M.equip_or_collect(new /obj/item/device/radio/headset/heads/captain/alt(M), slot_l_ear)
+ M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/officer(M), slot_head)
var/obj/item/device/pda/centcom/pda = new(M)
pda.owner = M.real_name
pda.ownjob = "Nanotrasen Navy Officer"
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
- M.equip_if_possible(pda, slot_r_store)
- M.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store)
- M.equip_if_possible(new /obj/item/weapon/gun/energy/pulse_rifle/pistol(M), slot_belt)
+ M.equip_or_collect(pda, slot_r_store)
+ M.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store)
+ M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse_rifle/pistol(M), slot_belt)
var/obj/item/weapon/card/id/centcom/W = new(M)
W.name = "[M.real_name]'s ID Card (Nanotrasen Navy Officer)"
W.assignment = "Nanotrasen Navy Officer"
W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
- M.equip_if_possible(W, slot_wear_id)
+ M.equip_or_collect(W, slot_wear_id)
if("nanotrasen captain")
- M.equip_if_possible(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform)
- M.equip_if_possible(new /obj/item/clothing/shoes/centcom(M), slot_shoes)
- M.equip_if_possible(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
- M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain/alt(M), slot_l_ear)
- M.equip_if_possible(new /obj/item/clothing/head/beret/centcom/captain(M), slot_head)
+ M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform)
+ M.equip_or_collect(new /obj/item/clothing/shoes/centcom(M), slot_shoes)
+ M.equip_or_collect(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
+ M.equip_or_collect(new /obj/item/device/radio/headset/heads/captain/alt(M), slot_l_ear)
+ M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/captain(M), slot_head)
var/obj/item/device/pda/centcom/pda = new(M)
pda.owner = M.real_name
pda.ownjob = "Nanotrasen Navy Captain"
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
- M.equip_if_possible(pda, slot_r_store)
- M.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store)
- M.equip_if_possible(new /obj/item/weapon/gun/energy/pulse_rifle/pistol(M), slot_belt)
+ M.equip_or_collect(pda, slot_r_store)
+ M.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store)
+ M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse_rifle/pistol(M), slot_belt)
var/obj/item/weapon/card/id/centcom/W = new(M)
W.name = "[M.real_name]'s ID Card (Nanotrasen Navy Captain)"
@@ -870,7 +870,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
W.assignment = "Nanotrasen Navy Captain"
W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
- M.equip_if_possible(W, slot_wear_id)
+ M.equip_or_collect(W, slot_wear_id)
if("emergency response team member")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
@@ -947,7 +947,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(W, slot_wear_id)
if("special ops formal")
- M.equip_if_possible(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform)
+ M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/alt(src), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
@@ -957,7 +957,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/pistol/m1911(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store)
- M.equip_if_possible(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_l_store)
+ M.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_l_store)
var/obj/item/device/pda/centcom/pda = new(M)
pda.owner = M.real_name
@@ -966,10 +966,10 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
pda.desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a special edition designed for military field work."
- M.equip_if_possible(pda, slot_wear_pda)
+ M.equip_or_collect(pda, slot_wear_pda)
- M.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store)
- M.equip_if_possible(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
+ M.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store)
+ M.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card (Special Operations Officer)"
@@ -1056,7 +1056,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
W.assignment = "Admiral"
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
-
+
if("chrono legionnaire")
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/chronos(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(src), slot_wear_mask)
@@ -1086,8 +1086,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
set desc = "Sets up the singularity and all machines to get power flowing through the station"
if(!check_rights(R_DEBUG))
- return
-
+ return
+
if(alert("Are you sure? This will start up the engine. Should only be used during debug!",,"Yes","No") != "Yes")
return
@@ -1137,9 +1137,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
set category = "Debug"
set name = "Debug Mob Lists"
set desc = "For when you just gotta know"
-
+
if(!check_rights(R_DEBUG))
- return
+ return
switch(input("Which list?") in list("Players","Admins","Mobs","Living Mobs","Dead Mobs","Silicons","Clients","Respawnable Mobs"))
if("Players")
@@ -1162,7 +1162,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
/client/proc/cmd_admin_toggle_block(var/mob/M,var/block)
if(!check_rights(R_SPAWN))
- return
+ return
if(!ticker)
alert("Wait until the game starts")
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 243842ff906..19ab6d2a366 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -190,48 +190,48 @@ BLIND // can't see anything
/obj/item/clothing/gloves/proc/Touch()
return
-/obj/item/clothing/under/proc/set_sensors(mob/usr as mob)
- var/mob/M = usr
+/obj/item/clothing/under/proc/set_sensors(mob/user as mob)
+ var/mob/M = user
if (istype(M, /mob/dead/)) return
- if (usr.stat || usr.restrained()) return
+ if (user.stat || user.restrained()) return
if(has_sensor >= 2)
- usr << "The controls are locked."
+ user << "The controls are locked."
return 0
if(has_sensor <= 0)
- usr << "This suit does not have any sensors."
+ user << "This suit does not have any sensors."
return 0
var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon")
var/switchMode = input("Select a sensor mode:", "Suit Sensor Mode", modes[sensor_mode + 1]) in modes
- if(get_dist(usr, src) > 1)
- usr << "You have moved too far away."
+ if(get_dist(user, src) > 1)
+ user << "You have moved too far away."
return
sensor_mode = modes.Find(switchMode) - 1
- if (src.loc == usr)
+ if (src.loc == user)
switch(sensor_mode)
if(0)
- usr << "You disable your suit's remote sensing equipment."
+ user << "You disable your suit's remote sensing equipment."
if(1)
- usr << "Your suit will now report whether you are live or dead."
+ user << "Your suit will now report whether you are live or dead."
if(2)
- usr << "Your suit will now report your vital lifesigns."
+ user << "Your suit will now report your vital lifesigns."
if(3)
- usr << "Your suit will now report your vital lifesigns as well as your coordinate position."
+ user << "Your suit will now report your vital lifesigns as well as your coordinate position."
else if (istype(src.loc, /mob))
switch(sensor_mode)
if(0)
- for(var/mob/V in viewers(usr, 1))
- V.show_message("\red [usr] disables [src.loc]'s remote sensing equipment.", 1)
+ for(var/mob/V in viewers(user, 1))
+ V.show_message("\red [user] disables [src.loc]'s remote sensing equipment.", 1)
if(1)
- for(var/mob/V in viewers(usr, 1))
- V.show_message("[usr] turns [src.loc]'s remote sensors to binary.", 1)
+ for(var/mob/V in viewers(user, 1))
+ V.show_message("[user] turns [src.loc]'s remote sensors to binary.", 1)
if(2)
- for(var/mob/V in viewers(usr, 1))
- V.show_message("[usr] sets [src.loc]'s sensors to track vitals.", 1)
+ for(var/mob/V in viewers(user, 1))
+ V.show_message("[user] sets [src.loc]'s sensors to track vitals.", 1)
if(3)
- for(var/mob/V in viewers(usr, 1))
- V.show_message("[usr] sets [src.loc]'s sensors to maximum.", 1)
+ for(var/mob/V in viewers(user, 1))
+ V.show_message("[user] sets [src.loc]'s sensors to maximum.", 1)
/obj/item/clothing/under/verb/toggle()
set name = "Toggle Suit Sensors"
@@ -480,11 +480,11 @@ BLIND // can't see anything
if(!istype(usr, /mob/living)) return
if(usr.stat) return
- if(copytext(_color,-2) != "_d")
- basecolor = _color
+ if(copytext(item_color,-2) != "_d")
+ basecolor = item_color
usr << "DEBUG:[basecolor]"
if(basecolor + "_d_s" in icon_states('icons/mob/uniform.dmi'))
- _color = _color == "[basecolor]" ? "[basecolor]_d" : "[basecolor]"
+ item_color = item_color == "[basecolor]" ? "[basecolor]_d" : "[basecolor]"
usr.update_inv_w_uniform()
else
usr << "You cannot roll down the uniform!"
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 9c364775343..bd9dc271366 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -5,7 +5,7 @@
item_state = "ygloves"
siemens_coefficient = 0
permeability_coefficient = 0.05
- _color="yellow"
+ item_color="yellow"
power
var/next_shock = 0
@@ -20,7 +20,7 @@
item_state = "ygloves"
siemens_coefficient = 1 //Set to a default of 1, gets overridden in New()
permeability_coefficient = 0.05
- _color="yellow"
+ item_color="yellow"
New()
siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5)
@@ -30,7 +30,7 @@
name = "black gloves"
icon_state = "black"
item_state = "bgloves"
- _color="brown"
+ item_color="brown"
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
@@ -38,10 +38,10 @@
hos
- _color = "hosred" //Exists for washing machines. Is not different from black gloves in any way.
+ item_color = "hosred" //Exists for washing machines. Is not different from black gloves in any way.
ce
- _color = "chief" //Exists for washing machines. Is not different from black gloves in any way.
+ item_color = "chief" //Exists for washing machines. Is not different from black gloves in any way.
thief
pickpocket = 1
@@ -51,14 +51,14 @@
desc = "A pair of gloves, they don't look special in any way."
icon_state = "orange"
item_state = "orangegloves"
- _color="orange"
+ item_color="orange"
/obj/item/clothing/gloves/color/red
name = "red gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "red"
item_state = "redgloves"
- _color = "red"
+ item_color = "red"
/obj/item/clothing/gloves/color/red/insulated
name = "insulated gloves"
@@ -71,60 +71,60 @@
desc = "A pair of gloves, they don't look special in any way."
icon_state = "rainbow"
item_state = "rainbowgloves"
- _color = "rainbow"
+ item_color = "rainbow"
clown
- _color = "clown"
+ item_color = "clown"
/obj/item/clothing/gloves/color/blue
name = "blue gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "blue"
item_state = "bluegloves"
- _color="blue"
+ item_color="blue"
/obj/item/clothing/gloves/color/purple
name = "purple gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "purple"
item_state = "purplegloves"
- _color="purple"
+ item_color="purple"
/obj/item/clothing/gloves/color/green
name = "green gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "green"
item_state = "greengloves"
- _color="green"
+ item_color="green"
/obj/item/clothing/gloves/color/grey
name = "grey gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "gray"
item_state = "graygloves"
- _color="grey"
+ item_color="grey"
rd
- _color = "director" //Exists for washing machines. Is not different from gray gloves in any way.
+ item_color = "director" //Exists for washing machines. Is not different from gray gloves in any way.
hop
- _color = "hop" //Exists for washing machines. Is not different from gray gloves in any way.
+ item_color = "hop" //Exists for washing machines. Is not different from gray gloves in any way.
/obj/item/clothing/gloves/color/light_brown
name = "light brown gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "lightbrown"
item_state = "lightbrowngloves"
- _color="light brown"
+ item_color="light brown"
/obj/item/clothing/gloves/color/brown
name = "brown gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "brown"
item_state = "browngloves"
- _color="brown"
+ item_color="brown"
cargo
- _color = "cargo" //Exists for washing machines. Is not different from brown gloves in any way.
+ item_color = "cargo" //Exists for washing machines. Is not different from brown gloves in any way.
/obj/item/clothing/gloves/color/latex
name = "latex gloves"
@@ -133,7 +133,7 @@
item_state = "lgloves"
siemens_coefficient = 0.30
permeability_coefficient = 0.01
- _color="white"
+ item_color="white"
transfer_prints = TRUE
/obj/item/clothing/gloves/color/latex/nitrile
@@ -142,17 +142,17 @@
icon_state = "nitrile"
item_state = "nitrilegloves"
transfer_prints = FALSE
- _color = "medical"
+ item_color = "medical"
/obj/item/clothing/gloves/color/white
name = "white gloves"
desc = "These look pretty fancy."
icon_state = "white"
item_state = "wgloves"
- _color="mime"
+ item_color="mime"
redcoat
- _color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way.
+ item_color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way.
/obj/item/clothing/gloves/color/captain
@@ -160,7 +160,7 @@
name = "captain's gloves"
icon_state = "captain"
item_state = "egloves"
- _color = "captain"
+ item_color = "captain"
siemens_coefficient = 0
permeability_coefficient = 0.05
cold_protection = HANDS
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 79871b9afdc..a377e445bb7 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -3,7 +3,7 @@
desc = "Plain black gloves without fingertips for the hard working."
icon_state = "fingerless"
item_state = "fingerless"
- _color = null //So they don't wash.
+ item_color = null //So they don't wash.
transfer_prints = TRUE
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
@@ -44,4 +44,4 @@
name = "batgloves"
icon_state = "bmgloves"
item_state = "bmgloves"
- _color="bmgloves"
\ No newline at end of file
+ item_color="bmgloves"
\ No newline at end of file
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index f603230bde0..ca24ab55d80 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -6,7 +6,7 @@
item_state = "hardhat0_yellow"
var/brightness_on = 4 //luminosity when on
var/on = 0
- _color = "yellow" //Determines used sprites: hardhat[on]_[color] and hardhat[on]_[color]2 (lying down sprite)
+ item_color = "yellow" //Determines used sprites: hardhat[on]_[color] and hardhat[on]_[color]2 (lying down sprite)
armor = list(melee = 30, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20)
flags_inv = 0
action_button_name = "Toggle Helmet Light"
@@ -18,8 +18,8 @@
user << "You cannot turn the light on while in this [user.loc]" //To prevent some lighting anomalities.
return
on = !on
- icon_state = "hardhat[on]_[_color]"
- item_state = "hardhat[on]_[_color]"
+ icon_state = "hardhat[on]_[item_color]"
+ item_state = "hardhat[on]_[item_color]"
if(on) set_light(brightness_on)
else set_light(0)
@@ -28,12 +28,12 @@
/obj/item/clothing/head/hardhat/orange
icon_state = "hardhat0_orange"
item_state = "hardhat0_orange"
- _color = "orange"
+ item_color = "orange"
/obj/item/clothing/head/hardhat/red
icon_state = "hardhat0_red"
item_state = "hardhat0_red"
- _color = "red"
+ item_color = "red"
name = "firefighter helmet"
flags = STOPSPRESSUREDMAGE
heat_protection = HEAD
@@ -44,7 +44,7 @@
/obj/item/clothing/head/hardhat/white
icon_state = "hardhat0_white"
item_state = "hardhat0_white"
- _color = "white"
+ item_color = "white"
flags = STOPSPRESSUREDMAGE
heat_protection = HEAD
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
@@ -55,12 +55,12 @@
/obj/item/clothing/head/hardhat/dblue
icon_state = "hardhat0_dblue"
item_state = "hardhat0_dblue"
- _color = "dblue"
+ item_color = "dblue"
/obj/item/clothing/head/hardhat/atmos
icon_state = "hardhat0_atmos"
item_state = "hardhat0_atmos"
- _color = "atmos"
+ item_color = "atmos"
name = "atmospheric technician's firefighting helmet"
desc = "A firefighter's helmet, able to keep the user cool in any situation."
flags = STOPSPRESSUREDMAGE
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index f5913956ad8..7ca5f2ce444 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -30,7 +30,7 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi'
)
-
+
/obj/item/clothing/head/welding/flamedecal
name = "flame decal welding helmet"
desc = "A welding helmet adorned with flame decals, and several cryptic slogans of varying degrees of legibility."
@@ -39,8 +39,8 @@
/obj/item/clothing/head/welding/flamedecal/blue
name = "blue flame decal welding helmet"
desc = "A welding helmet with blue flame decals on it."
- icon_state = "welding_blueflame"
-
+ icon_state = "welding_blueflame"
+
/obj/item/clothing/head/welding/white
name = "white decal welding helmet"
desc = "A white welding helmet with a character written across it."
@@ -146,7 +146,7 @@
desc = "A jack o' lantern! Believed to ward off evil spirits."
icon_state = "hardhat0_pumpkin"//Could stand to be renamed
item_state = "hardhat0_pumpkin"
- _color = "pumpkin"
+ item_color = "pumpkin"
flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
@@ -161,7 +161,7 @@
desc = "Some fake antlers and a very fake red nose."
icon_state = "hardhat0_reindeer"
item_state = "hardhat0_reindeer"
- _color = "reindeer"
+ item_color = "reindeer"
flags_inv = 0
action_button_name = "Toggle Nose Light"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
@@ -179,18 +179,24 @@
siemens_coefficient = 1.5
loose = 33
- update_icon(var/mob/living/carbon/human/user)
- if(!istype(user)) return
- mob = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty")
+/obj/item/clothing/head/kitty/update_icon(var/mob/living/carbon/human/user)
+ if(!istype(user)) return
+ mob = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty")
// mob2 = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty2") - Commented out because it seemingly does nothing.
- mob.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD)
+ mob.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD)
// mob2.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD) - Commented out because it seemingly does nothing.
- var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner")
+ var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner")
// var/icon/earbit2 = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner2") - Commented out because it seemingly does nothing.
- mob.Blend(earbit, ICON_OVERLAY)
+ mob.Blend(earbit, ICON_OVERLAY)
// mob2.Blend(earbit2, ICON_OVERLAY) - Commented out because it seemingly does nothing.
+ icon_override = mob
+
+/obj/item/clothing/head/kitty/equipped(var/mob/M, slot)
+ . = ..()
+ if(ishuman(M) && slot == slot_head)
+ update_icon(M)
/obj/item/clothing/head/kitty/mouse
@@ -198,10 +204,12 @@
desc = "A pair of mouse ears. Squeak!"
icon_state = "mousey"
- update_icon(var/mob/living/carbon/human/user)
- if(!istype(user)) return
- mob = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "mousey")
- mob.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD)
+/obj/item/clothing/head/kitty/mouse/update_icon(var/mob/living/carbon/human/user)
+ if(!istype(user)) return
+ mob = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "mousey")
+ mob.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD)
- var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "mouseyinner")
- mob.Blend(earbit, ICON_OVERLAY)
+ var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "mouseyinner")
+ mob.Blend(earbit, ICON_OVERLAY)
+
+ icon_override = mob
\ No newline at end of file
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index 1f88aaa231c..101852ad4c9 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -3,12 +3,12 @@
desc = "It's a baseball hat in a tasteless yellow colour."
icon_state = "cargosoft"
item_state = "helmet"
- _color = "cargo"
+ item_color = "cargo"
var/flipped = 0
siemens_coefficient = 0.9
dropped()
- src.icon_state = "[_color]soft"
+ src.icon_state = "[item_color]soft"
src.flipped=0
..()
@@ -19,10 +19,10 @@
if(usr.canmove && !usr.stat && !usr.restrained())
src.flipped = !src.flipped
if(src.flipped)
- icon_state = "[_color]soft_flipped"
+ icon_state = "[item_color]soft_flipped"
usr << "You flip the hat backwards."
else
- icon_state = "[_color]soft"
+ icon_state = "[item_color]soft"
usr << "You flip the hat back in normal position."
usr.update_inv_head() //so our mob-overlays update
@@ -30,71 +30,71 @@
name = "red cap"
desc = "It's a baseball hat in a tasteless red colour."
icon_state = "redsoft"
- _color = "red"
+ item_color = "red"
/obj/item/clothing/head/soft/blue
name = "blue cap"
desc = "It's a baseball hat in a tasteless blue colour."
icon_state = "bluesoft"
- _color = "blue"
+ item_color = "blue"
/obj/item/clothing/head/soft/green
name = "green cap"
desc = "It's a baseball hat in a tasteless green colour."
icon_state = "greensoft"
- _color = "green"
+ item_color = "green"
/obj/item/clothing/head/soft/yellow
name = "yellow cap"
desc = "It's a baseball hat in a tasteless yellow colour."
icon_state = "yellowsoft"
- _color = "yellow"
+ item_color = "yellow"
/obj/item/clothing/head/soft/grey
name = "grey cap"
desc = "It's a baseball hat in a tasteful grey colour."
icon_state = "greysoft"
- _color = "grey"
+ item_color = "grey"
/obj/item/clothing/head/soft/orange
name = "orange cap"
desc = "It's a baseball hat in a tasteless orange colour."
icon_state = "orangesoft"
- _color = "orange"
+ item_color = "orange"
/obj/item/clothing/head/soft/mime
name = "white cap"
desc = "It's a baseball hat in a tasteless white colour."
icon_state = "mimesoft"
- _color = "mime"
+ item_color = "mime"
/obj/item/clothing/head/soft/purple
name = "purple cap"
desc = "It's a baseball hat in a tasteless purple colour."
icon_state = "purplesoft"
- _color = "purple"
+ item_color = "purple"
/obj/item/clothing/head/soft/black
name = "black cap"
desc = "It's a baseball hat in a tasteless black colour."
icon_state = "blacksoft"
- _color = "black"
+ item_color = "black"
/obj/item/clothing/head/soft/rainbow
name = "rainbow cap"
desc = "It's a baseball hat in a bright rainbow of colors."
icon_state = "rainbowsoft"
- _color = "rainbow"
+ item_color = "rainbow"
/obj/item/clothing/head/soft/sec
name = "security cap"
desc = "It's baseball hat in tasteful red colour."
icon_state = "secsoft"
- _color = "sec"
+ item_color = "sec"
armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/head/soft/sec/corp
name = "corporate security cap"
desc = "It's baseball hat in corpotate colours."
icon_state = "corpsoft"
- _color = "corp"
+ item_color = "corp"
diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm
index f2a89c662dd..364c4d808ac 100644
--- a/code/modules/clothing/shoes/colour.dm
+++ b/code/modules/clothing/shoes/colour.dm
@@ -1,7 +1,7 @@
/obj/item/clothing/shoes/black
name = "black shoes"
icon_state = "black"
- _color = "black"
+ item_color = "black"
desc = "A pair of black shoes."
cold_protection = FEET
@@ -10,7 +10,7 @@
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
redcoat
- _color = "redcoat" //Exists for washing machines. Is not different from black shoes in any way.
+ item_color = "redcoat" //Exists for washing machines. Is not different from black shoes in any way.
/obj/item/clothing/shoes/black/greytide
flags = NODROP
@@ -21,71 +21,71 @@
icon_state = "brown"
captain
- _color = "captain" //Exists for washing machines. Is not different from brown shoes in any way.
+ item_color = "captain" //Exists for washing machines. Is not different from brown shoes in any way.
hop
- _color = "hop" //Exists for washing machines. Is not different from brown shoes in any way.
+ item_color = "hop" //Exists for washing machines. Is not different from brown shoes in any way.
ce
- _color = "chief" //Exists for washing machines. Is not different from brown shoes in any way.
+ item_color = "chief" //Exists for washing machines. Is not different from brown shoes in any way.
rd
- _color = "director" //Exists for washing machines. Is not different from brown shoes in any way.
+ item_color = "director" //Exists for washing machines. Is not different from brown shoes in any way.
cmo
- _color = "medical" //Exists for washing machines. Is not different from brown shoes in any way.
+ item_color = "medical" //Exists for washing machines. Is not different from brown shoes in any way.
cmo
- _color = "cargo" //Exists for washing machines. Is not different from brown shoes in any way.
+ item_color = "cargo" //Exists for washing machines. Is not different from brown shoes in any way.
/obj/item/clothing/shoes/blue
name = "blue shoes"
icon_state = "blue"
- _color = "blue"
+ item_color = "blue"
/obj/item/clothing/shoes/green
name = "green shoes"
icon_state = "green"
- _color = "green"
+ item_color = "green"
/obj/item/clothing/shoes/yellow
name = "yellow shoes"
icon_state = "yellow"
- _color = "yellow"
+ item_color = "yellow"
/obj/item/clothing/shoes/purple
name = "purple shoes"
icon_state = "purple"
- _color = "purple"
+ item_color = "purple"
/obj/item/clothing/shoes/brown
name = "brown shoes"
icon_state = "brown"
- _color = "brown"
+ item_color = "brown"
/obj/item/clothing/shoes/red
name = "red shoes"
desc = "Stylish red shoes."
icon_state = "red"
- _color = "red"
+ item_color = "red"
/obj/item/clothing/shoes/white
name = "white shoes"
icon_state = "white"
permeability_coefficient = 0.01
- _color = "white"
+ item_color = "white"
/obj/item/clothing/shoes/leather
name = "leather shoes"
desc = "A sturdy pair of leather shoes."
icon_state = "leather"
- _color = "leather"
+ item_color = "leather"
/obj/item/clothing/shoes/rainbow
name = "rainbow shoes"
desc = "Very gay shoes."
icon_state = "rain_bow"
- _color = "rainbow"
+ item_color = "rainbow"
/obj/item/clothing/shoes/orange
name = "orange shoes"
icon_state = "orange"
- _color = "orange"
+ item_color = "orange"
/obj/item/clothing/shoes/orange/attack_self(mob/user as mob)
if (src.chained)
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 5fbb5495aad..7a07fe249a2 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -13,7 +13,7 @@
/obj/item/clothing/shoes/mime
name = "mime shoes"
icon_state = "mime"
- _color = "mime"
+ item_color = "mime"
/obj/item/clothing/shoes/combat //basic syndicate combat boots for nuke ops and mob corpses
name = "combat boots"
@@ -57,7 +57,7 @@
icon_state = "clown"
item_state = "clown_shoes"
slowdown = SHOES_SLOWDOWN+1
- _color = "clown"
+ item_color = "clown"
var/footstep = 1 //used for squeeks whilst walking
species_restricted = null
@@ -66,7 +66,7 @@
desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time."
icon_state = "jackboots"
item_state = "jackboots"
- _color = "hosred"
+ item_color = "hosred"
siemens_coefficient = 0.7
var/footstep=1
@@ -74,7 +74,7 @@
name = "jacksandals"
desc = "Nanotrasen-issue Security combat sandals for combat scenarios. They're jacksandals, however that works."
icon_state = "jacksandal"
- _color = "jacksandal"
+ item_color = "jacksandal"
species_restricted = null
/obj/item/clothing/shoes/cult
@@ -82,7 +82,7 @@
desc = "A pair of boots worn by the followers of Nar-Sie."
icon_state = "cult"
item_state = "cult"
- _color = "cult"
+ item_color = "cult"
siemens_coefficient = 0.7
cold_protection = FEET
@@ -137,6 +137,6 @@
name = "noble boots"
desc = "The boots are economically designed to balance function and comfort, so that you can step on peasants without having to worry about blisters. The leather also resists unwanted blood stains."
icon_state = "noble_boot"
- _color = "noble_boot"
+ item_color = "noble_boot"
item_state = "noble_boot"
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm
index 55c28110382..f44e426f368 100644
--- a/code/modules/clothing/spacesuits/alien.dm
+++ b/code/modules/clothing/spacesuits/alien.dm
@@ -9,12 +9,12 @@
/obj/item/clothing/head/helmet/space/skrell/white
icon_state = "skrell_helmet_white"
item_state = "skrell_helmet_white"
- _color = "skrell_helmet_white"
+ item_color = "skrell_helmet_white"
/obj/item/clothing/head/helmet/space/skrell/black
icon_state = "skrell_helmet_black"
item_state = "skrell_helmet_black"
- _color = "skrell_helmet_black"
+ item_color = "skrell_helmet_black"
/obj/item/clothing/suit/space/skrell
name = "Skrellian hardsuit"
@@ -28,12 +28,12 @@
/obj/item/clothing/suit/space/skrell/white
icon_state = "skrell_suit_white"
item_state = "skrell_suit_white"
- _color = "skrell_suit_white"
+ item_color = "skrell_suit_white"
/obj/item/clothing/suit/space/skrell/black
icon_state = "skrell_suit_black"
item_state = "skrell_suit_black"
- _color = "skrell_suit_black"
+ item_color = "skrell_suit_black"
//Unathi space gear. Huge and restrictive.
/obj/item/clothing/head/helmet/space/unathi
@@ -48,7 +48,7 @@
desc = "Hey! Watch it with that thing! It's a knock-off of a Unathi battle-helm, and that spike could put someone's eye out."
icon_state = "unathi_helm_cheap"
item_state = "unathi_helm_cheap"
- _color = "unathi_helm_cheap"
+ item_color = "unathi_helm_cheap"
/obj/item/clothing/suit/space/unathi
armor = list(melee = 40, bullet = 30, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 50)
@@ -69,14 +69,14 @@
desc = "Weathered, ancient and battle-scarred. The helmet is too."
icon_state = "unathi_breacher"
item_state = "unathi_breacher"
- _color = "unathi_breacher"
+ item_color = "unathi_breacher"
/obj/item/clothing/suit/space/unathi/breacher
name = "breacher chassis"
desc = "Huge, bulky and absurdly heavy. It must be like wearing a tank."
icon_state = "unathi_breacher"
item_state = "unathi_breacher"
- _color = "unathi_breacher"
+ item_color = "unathi_breacher"
slowdown = 1
// Vox space gear (vaccuum suit, low pressure armour)
@@ -162,7 +162,7 @@
name = "alien clothing"
desc = "This doesn't look very comfortable."
icon_state = "vox-casual-1"
- _color = "vox-casual-1"
+ item_color = "vox-casual-1"
item_state = "vox-casual-1"
body_parts_covered = LEGS
@@ -170,7 +170,7 @@
name = "alien robes"
desc = "Weird and flowing!"
icon_state = "vox-casual-2"
- _color = "vox-casual-2"
+ item_color = "vox-casual-2"
item_state = "vox-casual-2"
/obj/item/clothing/gloves/color/yellow/vox
@@ -180,7 +180,7 @@
item_state = "gloves-vox"
siemens_coefficient = 0
permeability_coefficient = 0.05
- _color = "gloves-vox"
+ item_color = "gloves-vox"
species_restricted = list("Vox","Vox Armalis")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi',
diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm
index 66a7504f3b8..0a65501a37f 100644
--- a/code/modules/clothing/spacesuits/ert.dm
+++ b/code/modules/clothing/spacesuits/ert.dm
@@ -44,7 +44,7 @@
desc = "A helmet worn by the commander of a Nanotrasen Emergency Response Team. Has blue highlights. Armoured and space ready."
icon_state = "rig0-ert_commander"
item_state = "helm-command"
- _color = "ert_commander"
+ item_color = "ert_commander"
/obj/item/clothing/suit/space/rig/ert/commander
name = "emergency response team commander suit"
@@ -58,7 +58,7 @@
desc = "A helmet worn by security members of a Nanotrasen Emergency Response Team. Has red highlights. Armoured and space ready."
icon_state = "rig0-ert_security"
item_state = "syndicate-helm-black-red"
- _color = "ert_security"
+ item_color = "ert_security"
/obj/item/clothing/suit/space/rig/ert/security
name = "emergency response team security suit"
@@ -71,7 +71,7 @@
name = "emergency response team engineer helmet"
desc = "A helmet worn by engineers of a Nanotrasen Emergency Response Team. Has yellow highlights. Armoured and space ready."
icon_state = "rig0-ert_engineer"
- _color = "ert_engineer"
+ item_color = "ert_engineer"
/obj/item/clothing/suit/space/rig/ert/engineer
name = "emergency response team engineer suit"
@@ -83,7 +83,7 @@
name = "emergency response team medical helmet"
desc = "A helmet worn by medical members of a Nanotrasen Emergency Response Team. Has white highlights. Armoured and space ready."
icon_state = "rig0-ert_medical"
- _color = "ert_medical"
+ item_color = "ert_medical"
/obj/item/clothing/suit/space/rig/ert/medical
name = "emergency response team medical suit"
@@ -95,7 +95,7 @@
name = "emergency response team janitor helmet"
desc = "A helmet worn by janitorial members of a Nanotrasen Emergency Response Team. Has purple highlights. Armoured and space ready."
icon_state = "rig0-ert_janitor"
- _color = "ert_janitor"
+ item_color = "ert_janitor"
/obj/item/clothing/suit/space/rig/ert/janitor
name = "emergency response team janitor suit"
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index da245eec5c8..e86246c6930 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -8,7 +8,7 @@
armor = list(melee = 0, bullet = 0, laser = 0 ,energy = 0, bomb = 0, bio = 100, rad = 20)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
+ flags_inv = HIDEGLOVES|HIDESHOES
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
species_restricted = list("Plasmaman")
flags = STOPSPRESSUREDMAGE | PLASMAGUARD
@@ -53,19 +53,19 @@
user << "You cannot turn the light on while in this [user.loc]." //To prevent some lighting anomalities.
return
toggle_light(user)
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/proc/toggle_light(mob/user)
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/proc/toggle_light(mob/user)
on = !on
icon_state = "[base_state][on]"
- if(on)
+ if(on)
set_light(brightness_on)
- else
+ else
set_light(0)
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
- H.update_inv_head()
+ H.update_inv_head()
// ENGINEERING
/obj/item/clothing/suit/space/eva/plasmaman/assistant
diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm
index 7303ae12c15..d5f09cdc741 100644
--- a/code/modules/clothing/spacesuits/rig.dm
+++ b/code/modules/clothing/spacesuits/rig.dm
@@ -9,7 +9,7 @@
allowed = list(/obj/item/device/flashlight)
var/brightness_on = 4 //luminosity when on
var/on = 0
- _color = "engineering" //Determines used sprites: rig[on]-[color] and rig[on]-[color]2 (lying down sprite)
+ item_color = "engineering" //Determines used sprites: rig[on]-[color] and rig[on]-[color]2 (lying down sprite)
action_button_name = "Toggle Helmet Light"
//Species-specific stuff.
@@ -35,7 +35,7 @@
/obj/item/clothing/head/helmet/space/rig/proc/toggle_light(mob/user)
on = !on
- icon_state = "rig[on]-[_color]"
+ icon_state = "rig[on]-[item_color]"
if(on)
set_light(brightness_on)
@@ -248,7 +248,7 @@
desc = "An advanced helmet designed for work in a hazardous, low pressure environment. Shines with a high polish."
icon_state = "rig0-white"
item_state = "ce_helm"
- _color = "white"
+ item_color = "white"
armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 90)
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
@@ -268,7 +268,7 @@
desc = "A special helmet designed for work in a hazardous, low pressure environment. Has reinforced plating."
icon_state = "rig0-mining"
item_state = "mining_helm"
- _color = "mining"
+ item_color = "mining"
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE
armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
@@ -287,14 +287,14 @@
desc = "A dual-mode advanced helmet designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
icon_state = "hardsuit1-syndi"
item_state = "syndie_helm"
- _color = "syndi"
+ item_color = "syndi"
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
on = 1
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL
action_button_name = "Toggle Helmet Mode"
/obj/item/clothing/head/helmet/space/rig/syndi/update_icon()
- icon_state = "hardsuit[on]-[_color]"
+ icon_state = "hardsuit[on]-[item_color]"
/obj/item/clothing/head/helmet/space/rig/syndi/attack_self(mob/user)
if(!isturf(user.loc))
@@ -328,7 +328,7 @@
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
icon_state = "hardsuit1-syndi"
item_state = "syndie_hardsuit"
- _color = "syndi"
+ item_color = "syndi"
slowdown = 1
w_class = 3
var/on = 1
@@ -337,7 +337,7 @@
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
/obj/item/clothing/suit/space/rig/syndi/update_icon()
- icon_state = "hardsuit[on]-[_color]"
+ icon_state = "hardsuit[on]-[item_color]"
/obj/item/clothing/suit/space/rig/syndi/attack_self(mob/user)
on = !on
@@ -369,7 +369,7 @@
desc = "A bizarre gem-encrusted helmet that radiates magical energies."
icon_state = "rig0-wiz"
item_state = "wiz_helm"
- _color = "wiz"
+ item_color = "wiz"
unacidable = 1 //No longer shall our kind be foiled by lone chemists with spray bottles!
armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60)
siemens_coefficient = 0.7
@@ -400,7 +400,7 @@
desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra comfort, but does not protect the eyes from intense light."
icon_state = "rig0-medical"
item_state = "medical_helm"
- _color = "medical"
+ item_color = "medical"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
flash_protect = 0
@@ -420,7 +420,7 @@
desc = "A special helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor."
icon_state = "rig0-sec"
item_state = "sec_helm"
- _color = "sec"
+ item_color = "sec"
armor = list(melee = 30, bullet = 15, laser = 30,energy = 10, bomb = 10, bio = 100, rad = 50)
siemens_coefficient = 0.7
@@ -440,7 +440,7 @@
name = "atmospherics hardsuit helmet"
icon_state = "rig0-atmos"
item_state = "atmos_helm"
- _color = "atmos"
+ item_color = "atmos"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
@@ -460,7 +460,7 @@
desc = "This is an adamantium helmet from the chapter of the Singuloth Knights. It shines with a holy aura."
icon_state = "rig0-singuloth"
item_state = "singuloth_helm"
- _color = "singuloth"
+ item_color = "singuloth"
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 100)
/obj/item/clothing/suit/space/rig/singuloth
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 66d00261ac6..c56779b1b6a 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -334,14 +334,14 @@
name = "pink swimsuit"
desc = "A rather skimpy pink swimsuit."
icon_state = "stripper_p_under"
- _color = "stripper_p"
+ item_color = "stripper_p"
siemens_coefficient = 1
/obj/item/clothing/under/stripper/stripper_green
name = "green swimsuit"
desc = "A rather skimpy green swimsuit."
icon_state = "stripper_g_under"
- _color = "stripper_g"
+ item_color = "stripper_g"
siemens_coefficient = 1
/obj/item/clothing/suit/stripper/stripper_pink
@@ -362,7 +362,7 @@
name = "the mankini"
desc = "No honest man would wear this abomination"
icon_state = "mankini"
- _color = "mankini"
+ item_color = "mankini"
siemens_coefficient = 1
/obj/item/clothing/suit/jacket/miljacket
@@ -389,35 +389,35 @@
name = "black swimsuit"
desc = "An oldfashioned black swimsuit."
icon_state = "swim_black"
- _color = "swim_black"
+ item_color = "swim_black"
siemens_coefficient = 1
/obj/item/clothing/under/swimsuit/blue
name = "blue swimsuit"
desc = "An oldfashioned blue swimsuit."
icon_state = "swim_blue"
- _color = "swim_blue"
+ item_color = "swim_blue"
siemens_coefficient = 1
/obj/item/clothing/under/swimsuit/purple
name = "purple swimsuit"
desc = "An oldfashioned purple swimsuit."
icon_state = "swim_purp"
- _color = "swim_purp"
+ item_color = "swim_purp"
siemens_coefficient = 1
/obj/item/clothing/under/swimsuit/green
name = "green swimsuit"
desc = "An oldfashioned green swimsuit."
icon_state = "swim_green"
- _color = "swim_green"
+ item_color = "swim_green"
siemens_coefficient = 1
/obj/item/clothing/under/swimsuit/red
name = "red swimsuit"
desc = "An oldfashioned red swimsuit."
icon_state = "swim_red"
- _color = "swim_red"
+ item_color = "swim_red"
siemens_coefficient = 1
/obj/item/clothing/suit/storage/mercy_hoodie
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index 2f6fb17f314..bdf0c955ca4 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/clothing/ties.dmi'
icon_state = "bluetie"
item_state = "" //no inhands
- _color = "bluetie"
+ item_color = "bluetie"
slot_flags = SLOT_TIE
w_class = 2.0
var/slot = "decor"
@@ -13,7 +13,7 @@
/obj/item/clothing/accessory/New()
..()
- inv_overlay = image("icon" = 'icons/obj/clothing/ties_overlay.dmi', "icon_state" = "[_color? "[_color]" : "[icon_state]"]")
+ inv_overlay = image("icon" = 'icons/obj/clothing/ties_overlay.dmi', "icon_state" = "[item_color? "[item_color]" : "[icon_state]"]")
//when user attached an accessory to S
/obj/item/clothing/accessory/proc/on_attached(obj/item/clothing/under/S, mob/user as mob)
@@ -47,36 +47,36 @@
/obj/item/clothing/accessory/blue
name = "blue tie"
icon_state = "bluetie"
- _color = "bluetie"
+ item_color = "bluetie"
/obj/item/clothing/accessory/red
name = "red tie"
icon_state = "redtie"
- _color = "redtie"
+ item_color = "redtie"
/obj/item/clothing/accessory/black
name = "black tie"
icon_state = "blacktie"
- _color = "blacktie"
+ item_color = "blacktie"
/obj/item/clothing/accessory/horrible
name = "horrible tie"
desc = "A neosilk clip-on tie. This one is disgusting."
icon_state = "horribletie"
- _color = "horribletie"
+ item_color = "horribletie"
/obj/item/clothing/accessory/waistcoat // No overlay
name = "waistcoat"
desc = "For some classy, murderous fun."
icon_state = "waistcoat"
item_state = "waistcoat"
- _color = "waistcoat"
+ item_color = "waistcoat"
/obj/item/clothing/accessory/stethoscope
name = "stethoscope"
desc = "An outdated medical apparatus for listening to the sounds of the human body. It also makes you look like you know what you're doing."
icon_state = "stethoscope"
- _color = "stethoscope"
+ item_color = "stethoscope"
/obj/item/clothing/accessory/stethoscope/attack(mob/living/carbon/human/M, mob/living/user)
if(ishuman(M) && isliving(user))
@@ -117,7 +117,7 @@
name = "bronze medal"
desc = "A bronze medal."
icon_state = "bronze"
- _color = "bronze"
+ item_color = "bronze"
materials = list(MAT_METAL=1000)
/obj/item/clothing/accessory/medal/conduct
@@ -137,7 +137,7 @@
name = "silver medal"
desc = "A silver medal."
icon_state = "silver"
- _color = "silver"
+ item_color = "silver"
materials = list(MAT_SILVER=1000)
/obj/item/clothing/accessory/medal/silver/valor
@@ -152,7 +152,7 @@
name = "gold medal"
desc = "A prestigious golden medal."
icon_state = "gold"
- _color = "gold"
+ item_color = "gold"
materials = list(MAT_GOLD=1000)
/obj/item/clothing/accessory/medal/gold/captain
@@ -173,7 +173,7 @@
name = "holobadge"
desc = "This glowing blue badge marks the holder as THE LAW."
icon_state = "holobadge"
- _color = "holobadge"
+ item_color = "holobadge"
slot_flags = SLOT_BELT | SLOT_TIE
var/emagged = 0 //Emagging removes Sec check.
@@ -181,7 +181,7 @@
/obj/item/clothing/accessory/holobadge/cord
icon_state = "holobadge-cord"
- _color = "holobadge-cord"
+ item_color = "holobadge-cord"
slot_flags = SLOT_MASK | SLOT_TIE
/obj/item/clothing/accessory/holobadge/attack_self(mob/user as mob)
@@ -250,57 +250,57 @@
/obj/item/clothing/accessory/scarf/red
name = "red scarf"
icon_state = "redscarf"
- _color = "redscarf"
+ item_color = "redscarf"
/obj/item/clothing/accessory/scarf/green
name = "green scarf"
icon_state = "greenscarf"
- _color = "greenscarf"
+ item_color = "greenscarf"
/obj/item/clothing/accessory/scarf/darkblue
name = "dark blue scarf"
icon_state = "darkbluescarf"
- _color = "darkbluescarf"
+ item_color = "darkbluescarf"
/obj/item/clothing/accessory/scarf/purple
name = "purple scarf"
icon_state = "purplescarf"
- _color = "purplescarf"
+ item_color = "purplescarf"
/obj/item/clothing/accessory/scarf/yellow
name = "yellow scarf"
icon_state = "yellowscarf"
- _color = "yellowscarf"
+ item_color = "yellowscarf"
/obj/item/clothing/accessory/scarf/orange
name = "orange scarf"
icon_state = "orangescarf"
- _color = "orangescarf"
+ item_color = "orangescarf"
/obj/item/clothing/accessory/scarf/lightblue
name = "light blue scarf"
icon_state = "lightbluescarf"
- _color = "lightbluescarf"
+ item_color = "lightbluescarf"
/obj/item/clothing/accessory/scarf/white
name = "white scarf"
icon_state = "whitescarf"
- _color = "whitescarf"
+ item_color = "whitescarf"
/obj/item/clothing/accessory/scarf/black
name = "black scarf"
icon_state = "blackscarf"
- _color = "blackscarf"
+ item_color = "blackscarf"
/obj/item/clothing/accessory/scarf/zebra
name = "zebra scarf"
icon_state = "zebrascarf"
- _color = "zebrascarf"
+ item_color = "zebrascarf"
/obj/item/clothing/accessory/scarf/christmas
name = "christmas scarf"
icon_state = "christmasscarf"
- _color = "christmasscarf"
+ item_color = "christmasscarf"
//The three following scarves don't have the scarf subtype
//This is because Ian can equip anything from that subtype
@@ -308,22 +308,22 @@
/obj/item/clothing/accessory/stripedredscarf
name = "striped red scarf"
icon_state = "stripedredscarf"
- _color = "stripedredscarf"
+ item_color = "stripedredscarf"
/obj/item/clothing/accessory/stripedgreenscarf
name = "striped green scarf"
icon_state = "stripedgreenscarf"
- _color = "stripedgreenscarf"
+ item_color = "stripedgreenscarf"
/obj/item/clothing/accessory/stripedbluescarf
name = "striped blue scarf"
icon_state = "stripedbluescarf"
- _color = "stripedbluescarf"
+ item_color = "stripedbluescarf"
/obj/item/clothing/accessory/petcollar
name = "pet collar"
icon_state = "petcollar"
- _color = "petcollar"
+ item_color = "petcollar"
var/tagname = null
/obj/item/clothing/accessory/petcollar/attack_self(mob/user as mob)
diff --git a/code/modules/clothing/under/accessories/armband.dm b/code/modules/clothing/under/accessories/armband.dm
index 8c4dd79ffe8..67d0208b6df 100644
--- a/code/modules/clothing/under/accessories/armband.dm
+++ b/code/modules/clothing/under/accessories/armband.dm
@@ -2,41 +2,41 @@
name = "red armband"
desc = "A fancy red armband!"
icon_state = "red"
- _color = "red"
+ item_color = "red"
slot = "armband"
/obj/item/clothing/accessory/armband/cargo
name = "cargo armband"
desc = "An armband, worn by the crew to display which department they're assigned to. This one is brown."
icon_state = "cargo"
- _color = "cargo"
+ item_color = "cargo"
/obj/item/clothing/accessory/armband/engine
name = "engineering armband"
desc = "An armband, worn by the crew to display which department they're assigned to. This one is orange with a reflective strip!"
icon_state = "engie"
- _color = "engie"
+ item_color = "engie"
/obj/item/clothing/accessory/armband/science
name = "science armband"
desc = "An armband, worn by the crew to display which department they're assigned to. This one is purple."
icon_state = "rnd"
- _color = "rnd"
+ item_color = "rnd"
/obj/item/clothing/accessory/armband/hydro
name = "hydroponics armband"
desc = "An armband, worn by the crew to display which department they're assigned to. This one is green and blue."
icon_state = "hydro"
- _color = "hydro"
+ item_color = "hydro"
/obj/item/clothing/accessory/armband/med
name = "medical armband"
desc = "An armband, worn by the crew to display which department they're assigned to. This one is white."
icon_state = "med"
- _color = "med"
+ item_color = "med"
/obj/item/clothing/accessory/armband/medgreen
name = "EMT armband"
desc = "An armband, worn by the crew to display which department they're assigned to. This one is white and green."
icon_state = "medgreen"
- _color = "medgreen"
+ item_color = "medgreen"
diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm
index 06e13d50ed0..cc9e37cecd7 100644
--- a/code/modules/clothing/under/accessories/holster.dm
+++ b/code/modules/clothing/under/accessories/holster.dm
@@ -2,7 +2,7 @@
name = "shoulder holster"
desc = "A handgun holster."
icon_state = "holster"
- _color = "holster"
+ item_color = "holster"
slot = "utility"
var/holster_allow = /obj/item/weapon/gun
var/obj/item/weapon/gun/holstered = null
@@ -125,11 +125,11 @@
name = "shoulder holster"
desc = "A worn-out handgun holster. Perfect for concealed carry"
icon_state = "holster"
- _color = "holster"
+ item_color = "holster"
holster_allow = /obj/item/weapon/gun/projectile
/obj/item/clothing/accessory/holster/waist
name = "shoulder holster"
desc = "A handgun holster. Made of expensive leather."
icon_state = "holster"
- _color = "holster_low"
\ No newline at end of file
+ item_color = "holster_low"
\ No newline at end of file
diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm
index fc560f47476..36e59a86eb3 100644
--- a/code/modules/clothing/under/accessories/storage.dm
+++ b/code/modules/clothing/under/accessories/storage.dm
@@ -2,7 +2,7 @@
name = "load bearing equipment"
desc = "Used to hold things when you don't have enough hands."
icon_state = "webbing"
- _color = "webbing"
+ item_color = "webbing"
slot = "utility"
var/slots = 3
var/obj/item/weapon/storage/internal/hold
@@ -69,27 +69,27 @@
name = "webbing"
desc = "Sturdy mess of synthcotton belts and buckles, ready to share your burden."
icon_state = "webbing"
- _color = "webbing"
+ item_color = "webbing"
/obj/item/clothing/accessory/storage/black_vest
name = "black webbing vest"
desc = "Robust black synthcotton vest with lots of pockets to hold whatever you need, but cannot hold in hands."
icon_state = "vest_black"
- _color = "vest_black"
+ item_color = "vest_black"
slots = 5
/obj/item/clothing/accessory/storage/brown_vest
name = "brown webbing vest"
desc = "Worn brownish synthcotton vest with lots of pockets to unload your hands."
icon_state = "vest_brown"
- _color = "vest_brown"
+ item_color = "vest_brown"
slots = 5
/obj/item/clothing/accessory/storage/knifeharness
name = "decorated harness"
desc = "A heavily decorated harness of sinew and leather with two knife-loops."
icon_state = "unathiharness2"
- _color = "unathiharness2"
+ item_color = "unathiharness2"
slots = 2
/obj/item/clothing/accessory/storage/knifeharness/New()
diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm
index 0e67c973e54..14635fb2946 100644
--- a/code/modules/clothing/under/chameleon.dm
+++ b/code/modules/clothing/under/chameleon.dm
@@ -3,7 +3,7 @@
name = "black jumpsuit"
icon_state = "black"
item_state = "bl_suit"
- _color = "black"
+ item_color = "black"
desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist."
origin_tech = "syndicate=3"
siemens_coefficient = 0.8
@@ -38,11 +38,11 @@
name = "psychedelic"
desc = "Groovy!"
icon_state = "psyche"
- _color = "psyche"
+ item_color = "psyche"
spawn(200)
name = "Black Jumpsuit"
icon_state = "bl_suit"
- _color = "black"
+ item_color = "black"
desc = null
..()
@@ -68,7 +68,7 @@
name = A.name
icon_state = A.icon_state
item_state = A.item_state
- _color = A._color
+ item_color = A.item_color
usr.update_inv_w_uniform() //so our overlays update.
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index eca864123c5..e0386585f26 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -9,13 +9,13 @@
name = initial(C.name)
icon_state = initial(C.icon_state)
item_state = initial(C.item_state)
- _color = initial(C._color)
+ item_color = initial(C.item_color)
/obj/item/clothing/under/color/black
name = "black jumpsuit"
icon_state = "black"
item_state = "bl_suit"
- _color = "black"
+ item_color = "black"
flags = ONESIZEFITSALL
/obj/item/clothing/under/color/blackf
@@ -23,13 +23,13 @@
desc = "It's very smart and in a ladies-size!"
icon_state = "black"
item_state = "bl_suit"
- _color = "blackf"
+ item_color = "blackf"
/obj/item/clothing/under/color/blue
name = "blue jumpsuit"
icon_state = "blue"
item_state = "b_suit"
- _color = "blue"
+ item_color = "blue"
flags = ONESIZEFITSALL
/obj/item/clothing/under/color/blue/dodgeball
@@ -39,7 +39,7 @@
name = "green jumpsuit"
icon_state = "green"
item_state = "g_suit"
- _color = "green"
+ item_color = "green"
flags = ONESIZEFITSALL
/obj/item/clothing/under/color/grey
@@ -47,7 +47,7 @@
desc = "A tasteful grey jumpsuit that reminds you of the good old days."
icon_state = "grey"
item_state = "gy_suit"
- _color = "grey"
+ item_color = "grey"
flags = ONESIZEFITSALL
/obj/item/clothing/under/color/grey/greytide
@@ -58,7 +58,7 @@
desc = "Don't wear this near paranoid security officers"
icon_state = "orange"
item_state = "o_suit"
- _color = "orange"
+ item_color = "orange"
flags = ONESIZEFITSALL
/obj/item/clothing/under/color/orange/prison
@@ -66,7 +66,7 @@
desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position."
icon_state = "orange"
item_state = "o_suit"
- _color = "orange"
+ item_color = "orange"
has_sensor = 2
sensor_mode = 3
flags = ONESIZEFITSALL
@@ -76,14 +76,14 @@
desc = "Just looking at this makes you feel fabulous."
icon_state = "pink"
item_state = "p_suit"
- _color = "pink"
+ item_color = "pink"
flags = ONESIZEFITSALL
/obj/item/clothing/under/color/red
name = "red jumpsuit"
icon_state = "red"
item_state = "r_suit"
- _color = "red"
+ item_color = "red"
flags = ONESIZEFITSALL
/obj/item/clothing/under/color/red/dodgeball
@@ -93,21 +93,21 @@
name = "white jumpsuit"
icon_state = "white"
item_state = "w_suit"
- _color = "white"
+ item_color = "white"
flags = ONESIZEFITSALL
/obj/item/clothing/under/color/yellow
name = "yellow jumpsuit"
icon_state = "yellow"
item_state = "y_suit"
- _color = "yellow"
+ item_color = "yellow"
flags = ONESIZEFITSALL
/obj/item/clothing/under/psyche
name = "psychedelic jumpsuit"
desc = "Groovy!"
icon_state = "psyche"
- _color = "psyche"
+ item_color = "psyche"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/uniform.dmi'
@@ -116,66 +116,66 @@
/obj/item/clothing/under/color/lightblue
name = "light blue jumpsuit"
icon_state = "lightblue"
- _color = "lightblue"
+ item_color = "lightblue"
/obj/item/clothing/under/color/aqua
name = "aqua jumpsuit"
icon_state = "aqua"
- _color = "aqua"
+ item_color = "aqua"
flags = ONESIZEFITSALL
/obj/item/clothing/under/color/purple
name = "purple jumpsuit"
icon_state = "purple"
item_state = "p_suit"
- _color = "purple"
+ item_color = "purple"
/obj/item/clothing/under/color/lightpurple
name = "light purple jumpsuit"
icon_state = "lightpurple"
- _color = "lightpurple"
+ item_color = "lightpurple"
/obj/item/clothing/under/color/lightgreen
name = "light green jumpsuit"
icon_state = "lightgreen"
- _color = "lightgreen"
+ item_color = "lightgreen"
/obj/item/clothing/under/color/lightblue
name = "light blue jumpsuit"
icon_state = "lightblue"
- _color = "lightblue"
+ item_color = "lightblue"
/obj/item/clothing/under/color/lightbrown
name = "light brown jumpsuit"
icon_state = "lightbrown"
- _color = "lightbrown"
+ item_color = "lightbrown"
flags = ONESIZEFITSALL
/obj/item/clothing/under/color/brown
name = "brown jumpsuit"
icon_state = "brown"
- _color = "brown"
+ item_color = "brown"
/obj/item/clothing/under/color/yellowgreen
name = "yellow green jumpsuit"
icon_state = "yellowgreen"
- _color = "yellowgreen"
+ item_color = "yellowgreen"
/obj/item/clothing/under/color/darkblue
name = "dark blue jumpsuit"
icon_state = "darkblue"
- _color = "darkblue"
+ item_color = "darkblue"
flags = ONESIZEFITSALL
/obj/item/clothing/under/color/lightred
name = "light red jumpsuit"
icon_state = "lightred"
- _color = "lightred"
+ item_color = "lightred"
/obj/item/clothing/under/color/darkred
name = "dark red jumpsuit"
icon_state = "darkred"
- _color = "darkred"
+ item_color = "darkred"
flags = ONESIZEFITSALL
/obj/item/clothing/under/color/red/jersey
@@ -183,7 +183,7 @@
desc = "The jersey of the Nanotrasen Phi-ghters!"
icon_state = "redjersey"
item_state = "r_suit"
- _color = "redjersey"
+ item_color = "redjersey"
flags = ONESIZEFITSALL
/obj/item/clothing/under/color/blue/jersey
@@ -191,5 +191,5 @@
desc = "The jersey of the Nanotrasen Pi-rates!"
icon_state = "bluejersey"
item_state = "b_suit"
- _color = "bluejersey"
+ item_color = "bluejersey"
flags = ONESIZEFITSALL
diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm
index 9d7b74e9e82..78d9428d4b2 100644
--- a/code/modules/clothing/under/jobs/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian.dm
@@ -5,7 +5,7 @@
name = "bartender's uniform"
icon_state = "ba_suit"
item_state = "ba_suit"
- _color = "ba_suit"
+ item_color = "ba_suit"
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define.
@@ -13,7 +13,7 @@
name = "captain's jumpsuit"
icon_state = "captain"
item_state = "caparmor"
- _color = "captain"
+ item_color = "captain"
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/cargo
@@ -21,7 +21,7 @@
desc = "It's a jumpsuit worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper."
icon_state = "qm"
item_state = "lb_suit"
- _color = "qm"
+ item_color = "qm"
flags = ONESIZEFITSALL
@@ -30,7 +30,7 @@
desc = "Shooooorts! They're comfy and easy to wear!"
icon_state = "cargotech"
item_state = "lb_suit"
- _color = "cargo"
+ item_color = "cargo"
flags = ONESIZEFITSALL
@@ -39,14 +39,14 @@
name = "chaplain's jumpsuit"
icon_state = "chaplain"
item_state = "bl_suit"
- _color = "chapblack"
+ item_color = "chapblack"
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/chef
desc = "It's an apron which is given only to the most hardcore chefs in space."
name = "chef's uniform"
icon_state = "chef"
- _color = "chef"
+ item_color = "chef"
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/clown
@@ -54,7 +54,7 @@
desc = "'HONK!'"
icon_state = "clown"
item_state = "clown"
- _color = "clown"
+ item_color = "clown"
flags = ONESIZEFITSALL
@@ -63,7 +63,7 @@
name = "head of personnel's jumpsuit"
icon_state = "hop"
item_state = "b_suit"
- _color = "hop"
+ item_color = "hop"
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/head_of_personnel_whimsy
@@ -71,7 +71,7 @@
name = "head of personnel's suit"
icon_state = "hopwhimsy"
item_state = "hopwhimsy"
- _color = "hopwhimsy"
+ item_color = "hopwhimsy"
/obj/item/clothing/under/rank/hydroponics
@@ -79,7 +79,7 @@
name = "botanist's jumpsuit"
icon_state = "hydroponics"
item_state = "g_suit"
- _color = "hydroponics"
+ item_color = "hydroponics"
permeability_coefficient = 0.50
flags = ONESIZEFITSALL
@@ -88,7 +88,7 @@
name = "Internal Affairs uniform"
icon_state = "internalaffairs"
item_state = "internalaffairs"
- _color = "internalaffairs"
+ item_color = "internalaffairs"
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/ntrep
@@ -96,14 +96,14 @@
name = "dress shirt"
icon_state = "internalaffairs"
item_state = "internalaffairs"
- _color = "internalaffairs"
+ item_color = "internalaffairs"
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/janitor
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
name = "janitor's jumpsuit"
icon_state = "janitor"
- _color = "janitor"
+ item_color = "janitor"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
@@ -116,42 +116,42 @@
/obj/item/clothing/under/lawyer/black
icon_state = "lawyer_black"
item_state = "lawyer_black"
- _color = "lawyer_black"
+ item_color = "lawyer_black"
/obj/item/clothing/under/lawyer/female
icon_state = "black_suit_fem"
item_state = "black_suit_fem"
- _color = "black_suit_fem"
+ item_color = "black_suit_fem"
/obj/item/clothing/under/lawyer/red
icon_state = "lawyer_red"
item_state = "lawyer_red"
- _color = "lawyer_red"
+ item_color = "lawyer_red"
/obj/item/clothing/under/lawyer/blue
icon_state = "lawyer_blue"
item_state = "lawyer_blue"
- _color = "lawyer_blue"
+ item_color = "lawyer_blue"
/obj/item/clothing/under/lawyer/bluesuit
name = "Blue Suit"
desc = "A classy suit and tie"
icon_state = "bluesuit"
item_state = "bluesuit"
- _color = "bluesuit"
+ item_color = "bluesuit"
/obj/item/clothing/under/lawyer/purpsuit
name = "Purple Suit"
icon_state = "lawyer_purp"
item_state = "lawyer_purp"
- _color = "lawyer_purp"
+ item_color = "lawyer_purp"
/obj/item/clothing/under/lawyer/oldman
name = "Old Man's Suit"
desc = "A classic suit for the older gentleman with built in back support."
icon_state = "oldman"
item_state = "oldman"
- _color = "oldman"
+ item_color = "oldman"
/obj/item/clothing/under/librarian
@@ -159,7 +159,7 @@
desc = "It's very... sensible."
icon_state = "red_suit"
item_state = "red_suit"
- _color = "red_suit"
+ item_color = "red_suit"
flags = ONESIZEFITSALL
/obj/item/clothing/under/mime
@@ -167,7 +167,7 @@
desc = "It's not very colourful."
icon_state = "mime"
item_state = "mime"
- _color = "mime"
+ item_color = "mime"
flags = ONESIZEFITSALL
@@ -176,7 +176,7 @@
name = "shaft miner's jumpsuit"
icon_state = "miner"
item_state = "miner"
- _color = "miner"
+ item_color = "miner"
flags = ONESIZEFITSALL
/obj/item/clothing/under/barber
@@ -184,4 +184,4 @@
name = "barber's uniform"
icon_state = "barber"
item_state = "barber"
- _color = "barber"
+ item_color = "barber"
diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm
index c190e31c95b..4b91e82b2fc 100644
--- a/code/modules/clothing/under/jobs/engineering.dm
+++ b/code/modules/clothing/under/jobs/engineering.dm
@@ -4,7 +4,7 @@
name = "chief engineer's jumpsuit"
icon_state = "chiefengineer"
item_state = "g_suit"
- _color = "chief"
+ item_color = "chief"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
flags = ONESIZEFITSALL
@@ -13,7 +13,7 @@
name = "atmospheric technician's jumpsuit"
icon_state = "atmos"
item_state = "atmos_suit"
- _color = "atmos"
+ item_color = "atmos"
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/engineer
@@ -21,7 +21,7 @@
name = "engineer's jumpsuit"
icon_state = "engine"
item_state = "engi_suit"
- _color = "engine"
+ item_color = "engine"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
flags = ONESIZEFITSALL
@@ -30,7 +30,7 @@
name = "roboticist's jumpsuit"
icon_state = "robotics"
item_state = "robotics"
- _color = "robotics"
+ item_color = "robotics"
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/mechanic
@@ -38,4 +38,4 @@
name = "mechanic's overalls"
icon_state = "mechanic"
item_state = "mechanic"
- _color = "mechanic"
+ item_color = "mechanic"
diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm
index b5895bc9d26..b6f83e78beb 100644
--- a/code/modules/clothing/under/jobs/medsci.dm
+++ b/code/modules/clothing/under/jobs/medsci.dm
@@ -6,7 +6,7 @@
name = "research director's jumpsuit"
icon_state = "director"
item_state = "g_suit"
- _color = "director"
+ item_color = "director"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 10, rad = 0)
flags = ONESIZEFITSALL
@@ -15,7 +15,7 @@
name = "scientist's jumpsuit"
icon_state = "toxins"
item_state = "w_suit"
- _color = "toxinswhite"
+ item_color = "toxinswhite"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
flags = ONESIZEFITSALL
@@ -25,7 +25,7 @@
name = "chemist's jumpsuit"
icon_state = "chemistry"
item_state = "w_suit"
- _color = "chemistrywhite"
+ item_color = "chemistrywhite"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
@@ -38,7 +38,7 @@
name = "chief medical officer's jumpsuit"
icon_state = "cmo"
item_state = "w_suit"
- _color = "cmo"
+ item_color = "cmo"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
@@ -48,7 +48,7 @@
name = "geneticist's jumpsuit"
icon_state = "genetics"
item_state = "w_suit"
- _color = "geneticswhite"
+ item_color = "geneticswhite"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
@@ -58,7 +58,7 @@
name = "virologist's jumpsuit"
icon_state = "virology"
item_state = "w_suit"
- _color = "virologywhite"
+ item_color = "virologywhite"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
@@ -68,7 +68,7 @@
name = "nurse's suit"
icon_state = "nursesuit"
item_state = "nursesuit"
- _color = "nursesuit"
+ item_color = "nursesuit"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
@@ -78,7 +78,7 @@
name = "nurse's dress"
icon_state = "nurse"
item_state = "nurse"
- _color = "nurse"
+ item_color = "nurse"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
@@ -88,7 +88,7 @@
name = "orderly's uniform"
icon_state = "orderly"
item_state = "orderly"
- _color = "orderly"
+ item_color = "orderly"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
@@ -98,7 +98,7 @@
name = "medical doctor's jumpsuit"
icon_state = "medical"
item_state = "w_suit"
- _color = "medical"
+ item_color = "medical"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
@@ -107,28 +107,28 @@
name = "medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue."
icon_state = "scrubsblue"
- _color = "scrubsblue"
+ item_color = "scrubsblue"
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/medical/green
name = "medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in dark green."
icon_state = "scrubsgreen"
- _color = "scrubsgreen"
+ item_color = "scrubsgreen"
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/medical/purple
name = "medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in deep purple."
icon_state = "scrubspurple"
- _color = "scrubspurple"
+ item_color = "scrubspurple"
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/medical/mortician
name = "coroner's scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is as dark as an emo's poetry."
icon_state = "scrubsblack"
- _color = "scrubsblack"
+ item_color = "scrubsblack"
flags = ONESIZEFITSALL
//paramedic
@@ -137,7 +137,7 @@
name = "paramedic's jumpsuit"
icon_state = "paramedic"
item_state = "paramedic"
- _color = "paramedic"
+ item_color = "paramedic"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 10)
flags = ONESIZEFITSALL
@@ -147,7 +147,7 @@
name = "psychiatrist's jumpsuit"
icon_state = "psych"
item_state = "w_suit"
- _color = "psych"
+ item_color = "psych"
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/psych/turtleneck
@@ -155,7 +155,7 @@
name = "psychologist's turtleneck"
icon_state = "psychturtle"
item_state = "b_suit"
- _color = "psychturtle"
+ item_color = "psychturtle"
flags = ONESIZEFITSALL
@@ -167,7 +167,7 @@
name = "geneticist's jumpsuit"
icon_state = "genetics_new"
item_state = "w_suit"
- _color = "genetics_new"
+ item_color = "genetics_new"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
@@ -177,7 +177,7 @@
name = "chemist's jumpsuit"
icon_state = "chemist_new"
item_state = "w_suit"
- _color = "chemist_new"
+ item_color = "chemist_new"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
@@ -187,7 +187,7 @@
name = "scientist's jumpsuit"
icon_state = "scientist_new"
item_state = "w_suit"
- _color = "scientist_new"
+ item_color = "scientist_new"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
flags = ONESIZEFITSALL
@@ -197,7 +197,7 @@
name = "virologist's jumpsuit"
icon_state = "virologist_new"
item_state = "w_suit"
- _color = "virologist_new"
+ item_color = "virologist_new"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index 0c73309342d..9982e7c592a 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -14,7 +14,7 @@
name = "warden's jumpsuit"
icon_state = "warden"
item_state = "r_suit"
- _color = "warden"
+ item_color = "warden"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
flags = ONESIZEFITSALL
siemens_coefficient = 0.9
@@ -24,7 +24,7 @@
desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for robust protection."
icon_state = "security"
item_state = "r_suit"
- _color = "secred"
+ item_color = "secred"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
flags = ONESIZEFITSALL
siemens_coefficient = 0.9
@@ -34,7 +34,7 @@
desc = "A dress shirt and khakis with a security patch sewn on."
icon_state = "dispatch"
item_state = "dispatch"
- _color = "dispatch"
+ item_color = "dispatch"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
flags = ONESIZEFITSALL
siemens_coefficient = 0.9
@@ -44,7 +44,7 @@
desc = "It's made of a slightly sturdier material, to allow for robust protection."
icon_state = "redshirt2"
item_state = "r_suit"
- _color = "redshirt2"
+ item_color = "redshirt2"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
flags = ONESIZEFITSALL
siemens_coefficient = 0.9
@@ -52,12 +52,12 @@
/obj/item/clothing/under/rank/security/corp
icon_state = "sec_corporate"
item_state = "sec_corporate"
- _color = "sec_corporate"
+ item_color = "sec_corporate"
/obj/item/clothing/under/rank/warden/corp
icon_state = "warden_corporate"
item_state = "warden_corporate"
- _color = "warden_corporate"
+ item_color = "warden_corporate"
/*
* Detective
@@ -67,7 +67,7 @@
desc = "Someone who wears this means business."
icon_state = "detective"
item_state = "det"
- _color = "detective"
+ item_color = "detective"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
flags = ONESIZEFITSALL
siemens_coefficient = 0.9
@@ -84,7 +84,7 @@
name = "head of security's jumpsuit"
icon_state = "hos"
item_state = "r_suit"
- _color = "hosred"
+ item_color = "hosred"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
flags = ONESIZEFITSALL
siemens_coefficient = 0.8
@@ -92,7 +92,7 @@
/obj/item/clothing/under/rank/head_of_security/corp
icon_state = "hos_corporate"
item_state = "hos_corporate"
- _color = "hos_corporate"
+ item_color = "hos_corporate"
//Jensen cosplay gear
/obj/item/clothing/under/rank/head_of_security/jensen
@@ -100,7 +100,7 @@
name = "head of security's jumpsuit"
icon_state = "jensen"
item_state = "jensen"
- _color = "jensen"
+ item_color = "jensen"
siemens_coefficient = 0.6
flags = ONESIZEFITSALL
@@ -133,21 +133,21 @@
desc = "A formal security suit for officers complete with nanotrasen belt buckle."
icon_state = "security_formal"
item_state = "gy_suit"
- _color = "security_formal"
+ item_color = "security_formal"
/obj/item/clothing/under/rank/warden/formal
name = "warden's suit"
desc = "A formal security suit for the warden with blue desginations and '/Warden/' stiched into the shoulders."
icon_state = "warden_formal"
item_state = "gy_suit"
- _color = "warden_formal"
+ item_color = "warden_formal"
/obj/item/clothing/under/rank/head_of_security/formal
name = "head of security's suit"
desc = "A security suit decorated for those few with the dedication to achieve the position of Head of Security."
icon_state = "hos_formal"
item_state = "gy_suit"
- _color = "hos_formal"
+ item_color = "hos_formal"
//Brig Physician
@@ -156,7 +156,7 @@
name = "brig physician's jumpsuit"
icon_state = "brig_phys"
item_state = "brig_phys"
- _color = "brig_phys"
+ item_color = "brig_phys"
permeability_coefficient = 0.50
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
\ No newline at end of file
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 704746d851d..e33e9e598a4 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -2,14 +2,14 @@
name = "red pj's"
desc = "Sleepwear."
icon_state = "red_pyjamas"
- _color = "red_pyjamas"
+ item_color = "red_pyjamas"
item_state = "w_suit"
/obj/item/clothing/under/pj/blue
name = "blue pj's"
desc = "Sleepwear."
icon_state = "blue_pyjamas"
- _color = "blue_pyjamas"
+ item_color = "blue_pyjamas"
item_state = "w_suit"
/obj/item/clothing/under/patriotsuit
@@ -17,76 +17,76 @@
desc = "Motorcycle not included."
icon_state = "ek"
item_state = "ek"
- _color = "ek"
+ item_color = "ek"
/obj/item/clothing/under/captain_fly
name = "rogue captains uniform"
desc = "For the man who doesn't care because he's still free."
icon_state = "captain_fly"
item_state = "captain_fly"
- _color = "captain_fly"
+ item_color = "captain_fly"
/obj/item/clothing/under/scratch
name = "white suit"
desc = "A white suit, suitable for an excellent host"
icon_state = "scratch"
item_state = "scratch"
- _color = "scratch"
+ item_color = "scratch"
/obj/item/clothing/under/sl_suit
desc = "It's a very amish looking suit."
name = "amish suit"
icon_state = "sl_suit"
- _color = "sl_suit"
+ item_color = "sl_suit"
/obj/item/clothing/under/waiter
name = "waiter's outfit"
desc = "It's a very smart uniform with a special pocket for tip."
icon_state = "waiter"
item_state = "waiter"
- _color = "waiter"
+ item_color = "waiter"
/obj/item/clothing/under/rank/mailman
name = "mailman's jumpsuit"
desc = "'Special delivery!'"
icon_state = "mailman"
item_state = "b_suit"
- _color = "mailman"
+ item_color = "mailman"
/obj/item/clothing/under/sexyclown
name = "sexy-clown suit"
desc = "It makes you look HONKable!"
icon_state = "sexyclown"
item_state = "sexyclown"
- _color = "sexyclown"
+ item_color = "sexyclown"
/obj/item/clothing/under/rank/vice
name = "vice officer's jumpsuit"
desc = "It's the standard issue pretty-boy outfit, as seen on Holo-Vision."
icon_state = "vice"
item_state = "gy_suit"
- _color = "vice"
+ item_color = "vice"
/obj/item/clothing/under/rank/centcom_officer
desc = "It's a jumpsuit worn by CentCom Officers."
name = "\improper CentCom officer's jumpsuit"
icon_state = "officer"
item_state = "g_suit"
- _color = "officer"
+ item_color = "officer"
/obj/item/clothing/under/rank/centcom_commander
desc = "It's a jumpsuit worn by CentCom's highest-tier Commanders."
name = "\improper CentCom officer's jumpsuit"
icon_state = "centcom"
item_state = "dg_suit"
- _color = "centcom"
+ item_color = "centcom"
/obj/item/clothing/under/rank/centcom/officer
desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant-Commander\" and bears \"N.C.V. Fearless CV-286\" on the left shounder."
name = "\improper Nanotrasen Officers Uniform"
icon_state = "officer"
item_state = "g_suit"
- _color = "officer"
+ item_color = "officer"
displays_id = 0
flags = ONESIZEFITSALL
@@ -95,7 +95,7 @@
name = "\improper Nanotrasen Captains Uniform"
icon_state = "centcom"
item_state = "dg_suit"
- _color = "centcom"
+ item_color = "centcom"
displays_id = 0
/obj/item/clothing/under/rank/centcom/blueshield
@@ -103,7 +103,7 @@
name = "\improper Nanotrasen Navy Uniform"
icon_state = "officer"
item_state = "g_suit"
- _color = "officer"
+ item_color = "officer"
displays_id = 0
flags = ONESIZEFITSALL
@@ -112,7 +112,7 @@
name = "\improper Nanotrasen Navy Uniform"
icon_state = "officer"
item_state = "g_suit"
- _color = "officer"
+ item_color = "officer"
displays_id = 0
flags = ONESIZEFITSALL
@@ -121,7 +121,7 @@
name = "\improper Nanotrasen Diplomatic Uniform"
icon_state = "presidente"
item_state = "g_suit"
- _color = "presidente"
+ item_color = "presidente"
displays_id = 0
/obj/item/clothing/under/rank/blueshield
@@ -129,7 +129,7 @@
desc = "A short-sleeved black uniform, paired with grey digital-camo cargo pants. Standard issue to Blueshield officers."
icon_state = "ert_uniform"
item_state = "bl_suit"
- _color = "ert_uniform"
+ item_color = "ert_uniform"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/under/space
@@ -137,7 +137,7 @@
desc = "It has a NASA logo on it and is made of space-proofed materials."
icon_state = "black"
item_state = "bl_suit"
- _color = "black"
+ item_color = "black"
w_class = 4//bulky item
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.02
@@ -151,7 +151,7 @@
name = "administrative cybernetic jumpsuit"
icon_state = "syndicate"
item_state = "bl_suit"
- _color = "syndicate"
+ item_color = "syndicate"
desc = "it's a cybernetically enhanced jumpsuit used for administrative duties."
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
@@ -168,69 +168,69 @@
name = "johnny~~ jumpsuit"
desc = "Johnny~~"
icon_state = "johnny"
- _color = "johnny"
+ item_color = "johnny"
/obj/item/clothing/under/rainbow
name = "rainbow"
desc = "rainbow"
icon_state = "rainbow"
item_state = "rainbow"
- _color = "rainbow"
+ item_color = "rainbow"
/obj/item/clothing/under/cloud
name = "cloud"
desc = "cloud"
icon_state = "cloud"
- _color = "cloud"
+ item_color = "cloud"
/obj/item/clothing/under/psysuit
name = "dark undersuit"
desc = "A thick, layered grey undersuit lined with power cables. Feels a little like wearing an electrical storm."
icon_state = "psysuit"
item_state = "psysuit"
- _color = "psysuit"
+ item_color = "psysuit"
/obj/item/clothing/under/gimmick/rank/captain/suit
name = "captain's suit"
desc = "A green suit and yellow necktie. Exemplifies authority."
icon_state = "green_suit"
item_state = "dg_suit"
- _color = "green_suit"
+ item_color = "green_suit"
/obj/item/clothing/under/gimmick/rank/head_of_personnel/suit
name = "head of personnel's suit"
desc = "A teal suit and yellow necktie. An authoritative yet tacky ensemble."
icon_state = "teal_suit"
item_state = "g_suit"
- _color = "teal_suit"
+ item_color = "teal_suit"
/obj/item/clothing/under/suit_jacket
name = "black suit"
desc = "A black suit and red tie. Very formal."
icon_state = "black_suit"
item_state = "bl_suit"
- _color = "black_suit"
+ item_color = "black_suit"
/obj/item/clothing/under/suit_jacket/really_black
name = "executive suit"
desc = "A formal black suit and red tie, intended for the station's finest."
icon_state = "really_black_suit"
item_state = "bl_suit"
- _color = "really_black_suit"
+ item_color = "really_black_suit"
/obj/item/clothing/under/suit_jacket/female
name = "executive suit"
desc = "A formal trouser suit for women, intended for the station's finest."
icon_state = "black_suit_fem"
item_state = "black_suit_fem"
- _color = "black_suit_fem"
+ item_color = "black_suit_fem"
/obj/item/clothing/under/suit_jacket/red
name = "red suit"
desc = "A red suit and blue tie. Somewhat formal."
icon_state = "red_suit"
item_state = "r_suit"
- _color = "red_suit"
+ item_color = "red_suit"
flags = ONESIZEFITSALL
/obj/item/clothing/under/suit_jacket/navy
@@ -238,34 +238,34 @@
desc = "A navy suit and red tie, intended for the station's finest."
icon_state = "navy_suit"
item_state = "navy_suit"
- _color = "navy_suit"
+ item_color = "navy_suit"
/obj/item/clothing/under/suit_jacket/tan
name = "tan suit"
desc = "A tan suit with a yellow tie. Smart, but casual."
icon_state = "tan_suit"
item_state = "tan_suit"
- _color = "tan_suit"
+ item_color = "tan_suit"
/obj/item/clothing/under/suit_jacket/burgundy
name = "burgundy suit"
desc = "A burgundy suit and black tie. Somewhat formal."
icon_state = "burgundy_suit"
item_state = "burgundy_suit"
- _color = "burgundy_suit"
+ item_color = "burgundy_suit"
/obj/item/clothing/under/suit_jacket/charcoal
name = "charcoal suit"
desc = "A charcoal suit and red tie. Very professional."
icon_state = "charcoal_suit"
item_state = "charcoal_suit"
- _color = "charcoal_suit"
+ item_color = "charcoal_suit"
/obj/item/clothing/under/blackskirt
name = "black skirt"
desc = "A black skirt, very fancy!"
icon_state = "blackskirt"
- _color = "blackskirt"
+ item_color = "blackskirt"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
/obj/item/clothing/under/schoolgirl
@@ -273,7 +273,7 @@
desc = "It's just like one of my Japanese animes!"
icon_state = "schoolgirl"
item_state = "schoolgirl"
- _color = "schoolgirl"
+ item_color = "schoolgirl"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
/obj/item/clothing/under/overalls
@@ -281,42 +281,42 @@
desc = "A set of durable overalls for getting the job done."
icon_state = "overalls"
item_state = "lb_suit"
- _color = "overalls"
+ item_color = "overalls"
/obj/item/clothing/under/pirate
name = "pirate outfit"
desc = "Yarr."
icon_state = "pirate"
item_state = "pirate"
- _color = "pirate"
+ item_color = "pirate"
/obj/item/clothing/under/pirate_rags
name = "pirate rags"
desc = "an old ragged set of clothing"
icon_state = "piraterags"
item_state = "piraterags"
- _color = "piraterags"
+ item_color = "piraterags"
/obj/item/clothing/under/soviet
name = "soviet uniform"
desc = "For the Motherland!"
icon_state = "soviet"
item_state = "soviet"
- _color = "soviet"
+ item_color = "soviet"
/obj/item/clothing/under/redcoat
name = "redcoat uniform"
desc = "Looks old."
icon_state = "redcoat"
item_state = "redcoat"
- _color = "redcoat"
+ item_color = "redcoat"
/obj/item/clothing/under/kilt
name = "kilt"
desc = "Includes shoes and plaid"
icon_state = "kilt"
item_state = "kilt"
- _color = "kilt"
+ item_color = "kilt"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|FEET
/obj/item/clothing/under/sexymime
@@ -324,7 +324,7 @@
desc = "The only time when you DON'T enjoy looking at someone's rack."
icon_state = "sexymime"
item_state = "sexymime"
- _color = "sexymime"
+ item_color = "sexymime"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/gladiator
@@ -332,7 +332,7 @@
desc = "Are you not entertained? Is that not why you are here?"
icon_state = "gladiator"
item_state = "gladiator"
- _color = "gladiator"
+ item_color = "gladiator"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
//dress
@@ -341,79 +341,79 @@
name = "flame dress"
desc = "A small black dress with blue flames print on it."
icon_state = "dress_fire"
- _color = "dress_fire"
+ item_color = "dress_fire"
/obj/item/clothing/under/dress/dress_green
name = "green dress"
desc = "A simple, tight fitting green dress."
icon_state = "dress_green"
- _color = "dress_green"
+ item_color = "dress_green"
/obj/item/clothing/under/dress/dress_orange
name = "orange dress"
desc = "A fancy orange gown for those who like to show leg."
icon_state = "dress_orange"
- _color = "dress_orange"
+ item_color = "dress_orange"
/obj/item/clothing/under/dress/dress_pink
name = "pink dress"
desc = "A simple, tight fitting pink dress."
icon_state = "dress_pink"
- _color = "dress_pink"
+ item_color = "dress_pink"
/obj/item/clothing/under/dress/dress_yellow
name = "yellow dress"
desc = "A flirty, little yellow dress."
icon_state = "dress_yellow"
- _color = "dress_yellow"
+ item_color = "dress_yellow"
/obj/item/clothing/under/dress/dress_saloon
name = "saloon girl dress"
desc = "A old western inspired gown for the girl who likes to drink."
icon_state = "dress_saloon"
- _color = "dress_saloon"
+ item_color = "dress_saloon"
/obj/item/clothing/under/dress/dress_rd
name = "research director dress uniform"
desc = "Feminine fashion for the style concious RD."
icon_state = "dress_rd"
- _color = "dress_rd"
+ item_color = "dress_rd"
/obj/item/clothing/under/dress/dress_cap
name = "captain dress uniform"
desc = "Feminine fashion for the style concious captain."
icon_state = "dress_cap"
- _color = "dress_cap"
+ item_color = "dress_cap"
/obj/item/clothing/under/dress/dress_hop
name = "head of personal dress uniform"
desc = "Feminine fashion for the style concious HoP."
icon_state = "dress_hop"
- _color = "dress_hop"
+ item_color = "dress_hop"
/obj/item/clothing/under/dress/dress_hr
name = "human resources director uniform"
desc = "Superior class for the nosy H.R. Director."
icon_state = "huresource"
- _color = "huresource"
+ item_color = "huresource"
/obj/item/clothing/under/dress/plaid_blue
name = "blue plaid skirt"
desc = "A preppy blue skirt with a white blouse."
icon_state = "plaid_blue"
- _color = "plaid_blue"
+ item_color = "plaid_blue"
/obj/item/clothing/under/dress/plaid_red
name = "red plaid skirt"
desc = "A preppy red skirt with a white blouse."
icon_state = "plaid_red"
- _color = "plaid_red"
+ item_color = "plaid_red"
/obj/item/clothing/under/dress/plaid_purple
name = "blue purple skirt"
desc = "A preppy purple skirt with a white blouse."
icon_state = "plaid_purple"
- _color = "plaid_purple"
+ item_color = "plaid_purple"
//wedding stuff
@@ -421,35 +421,35 @@
name = "orange wedding dress"
desc = "A big and puffy orange dress."
icon_state = "bride_orange"
- _color = "bride_orange"
+ item_color = "bride_orange"
flags_inv = HIDESHOES
/obj/item/clothing/under/wedding/bride_purple
name = "purple wedding dress"
desc = "A big and puffy purple dress."
icon_state = "bride_purple"
- _color = "bride_purple"
+ item_color = "bride_purple"
flags_inv = HIDESHOES
/obj/item/clothing/under/wedding/bride_blue
name = "blue wedding dress"
desc = "A big and puffy blue dress."
icon_state = "bride_blue"
- _color = "bride_blue"
+ item_color = "bride_blue"
flags_inv = HIDESHOES
/obj/item/clothing/under/wedding/bride_red
name = "red wedding dress"
desc = "A big and puffy red dress."
icon_state = "bride_red"
- _color = "bride_red"
+ item_color = "bride_red"
flags_inv = HIDESHOES
/obj/item/clothing/under/wedding/bride_white
name = "orange wedding dress"
desc = "A white wedding gown made from the finest silk."
icon_state = "bride_white"
- _color = "bride_white"
+ item_color = "bride_white"
flags_inv = HIDESHOES
/obj/item/clothing/under/sundress
@@ -457,14 +457,14 @@
desc = "Makes you want to frolic in a field of daisies."
icon_state = "sundress"
item_state = "sundress"
- _color = "sundress"
+ item_color = "sundress"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/roman
name = "roman armor"
desc = "An ancient Roman armor. Made of metallic strips and leather straps."
icon_state = "roman"
- _color = "roman"
+ item_color = "roman"
item_state = "armor"
/obj/item/clothing/under/maid
@@ -472,7 +472,7 @@
desc = "Maid in China."
icon_state = "meido"
item_state = "meido"
- _color = "meido"
+ item_color = "meido"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/janimaid
@@ -480,7 +480,7 @@
desc = "A simple maid uniform for housekeeping."
icon_state = "janimaid"
item_state = "janimaid"
- _color = "janimaid"
+ item_color = "janimaid"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/flappers
@@ -488,42 +488,42 @@
desc = "Nothing like the roarin' '20s, flapping the night away on the dance floor."
icon_state = "flapper"
item_state = "flapper"
- _color = "flapper"
+ item_color = "flapper"
/obj/item/clothing/under/mafia
name = "mafia outfit"
desc = "The business of the mafia is business."
icon_state = "mafia"
item_state = "mafia"
- _color = "mafia"
+ item_color = "mafia"
/obj/item/clothing/under/mafia/vest
name = "mafia vest"
desc = "Extreme problems often require extreme solutions."
icon_state = "mafiavest"
item_state = "mafiavest"
- _color = "mafiavest"
+ item_color = "mafiavest"
/obj/item/clothing/under/mafia/white
name = "white mafia outfit"
desc = "The best defense against the treacherous is treachery."
icon_state = "mafiawhite"
item_state = "mafiawhite"
- _color = "mafiawhite"
+ item_color = "mafiawhite"
/obj/item/clothing/under/mafia/sue
name = "mafia vest"
desc = "The business is born into."
icon_state = "suevest"
item_state = "suevest"
- _color = "suevest"
+ item_color = "suevest"
/obj/item/clothing/under/mafia/tan
name = "leather mafia outfit"
desc = "The big drum sounds good only from a distance."
icon_state = "mafiatan"
item_state = "mafiatan"
- _color = "mafiatan"
+ item_color = "mafiatan"
/obj/item/clothing/under/bane
@@ -531,42 +531,42 @@
desc = "Wear this harness to become the bane of the station."
icon_state = "bane"
item_state = "bane"
- _color = "bane"
+ item_color = "bane"
/obj/item/clothing/under/vox_grey
name = "Grey Vox Jumpsuit"
desc = "An assistant's jumpsuit ripped to better fit a vox."
icon_state = "vgrey"
item_state = "vgrey"
- _color = "vgrey"
+ item_color = "vgrey"
/obj/item/clothing/under/vox_robotics
name = "Vox Robotics Jumpsuit"
desc = "A roboticist's jumpsuit ripped to better fit a vox."
icon_state = "vrobotics"
item_state = "vrobotics"
- _color = "vrobotics"
+ item_color = "vrobotics"
/obj/item/clothing/under/vox_toxins
name = "Vox Toxins Jumpsuit"
desc = "A Toxin Researcher's jumpsuit ripped to better fit a vox."
icon_state = "vtoxinswhite"
item_state = "vtoxinswhite"
- _color = "vtoxinswhite"
+ item_color = "vtoxinswhite"
/obj/item/clothing/under/vox_atmos
name = "Vox Atmos Jumpsuit"
desc = "An Atmos Tech's jumpsuit ripped to better fit a vox."
icon_state = "vatmos"
item_state = "vatmos"
- _color = "vatmos"
+ item_color = "vatmos"
/obj/item/clothing/under/vox_engi
name = "Vox Engineer Jumpsuit"
desc = "An Engineer's jumpsuit ripped to better fit a vox."
icon_state = "vengine"
item_state = "vengine"
- _color = "vengine"
+ item_color = "vengine"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
/obj/item/clothing/under/vox_sec
@@ -574,7 +574,7 @@
desc = "A Security officer's jumpsuit ripped to better fit a vox."
icon_state = "vred"
item_state = "vred"
- _color = "vred"
+ item_color = "vred"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/under/vox_chem
@@ -582,7 +582,7 @@
desc = "A Chemist's jumpsuit ripped to better fit a vox."
icon_state = "vchem"
item_state = "vchem"
- _color = "vchem"
+ item_color = "vchem"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
/obj/item/clothing/under/psyjump
@@ -590,34 +590,34 @@
desc = "A suit made of strange materials."
icon_state = "psyamp"
item_state = "psyamp"
- _color = "psyamp"
+ item_color = "psyamp"
/obj/item/clothing/under/rebeloutfit
name = "Rebel Outfit"
desc = "Made in Seattle, 2216."
icon_state = "colin_earle"
item_state = "colin_earle"
- _color = "colin_earle"
+ item_color = "colin_earle"
/obj/item/clothing/under/officeruniform
name = "Clown Officer's Uniform"
desc = "For Clown officers, this uniform was designed by the great clown designer Hugo Boss."
icon_state = "officeruniform"
- _color = "officeruniform"
+ item_color = "officeruniform"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/soldieruniform
name = "Clown Soldier's Uniform"
desc = "For the basic grunt of the Clown army."
icon_state = "soldieruniform"
- _color = "soldieruniform"
+ item_color = "soldieruniform"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/pennywise
name = "Pennywise Costume"
desc = "It's everything you ever were afraid of."
icon_state = "pennywise"
- _color = "pennywise"
+ item_color = "pennywise"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/assistantformal
@@ -625,60 +625,60 @@
desc = "An assistant's formal-wear. Why an assistant needs formal-wear is still unknown."
icon_state = "assistant_formal"
item_state = "gy_suit"
- _color = "assistant_formal"
+ item_color = "assistant_formal"
/obj/item/clothing/under/blacktango
name = "black tango dress"
desc = "Filled with Latin fire."
icon_state = "black_tango"
item_state = "wcoat"
- _color = "black_tango"
+ item_color = "black_tango"
/obj/item/clothing/under/stripeddress
name = "striped dress"
desc = "Fashion in space."
icon_state = "striped_dress"
item_state = "stripeddress"
- _color = "striped_dress"
+ item_color = "striped_dress"
/obj/item/clothing/under/sailordress
name = "sailor dress"
desc = "Formal wear for a leading lady."
icon_state = "sailor_dress"
item_state = "sailordress"
- _color = "sailor_dress"
+ item_color = "sailor_dress"
/obj/item/clothing/under/redeveninggown
name = "red evening gown"
desc = "Fancy dress for space bar singers."
icon_state = "red_evening_gown"
item_state = "redeveninggown"
- _color = "red_evening_gown"
+ item_color = "red_evening_gown"
/obj/item/clothing/under/suit_jacket/checkered
name = "checkered suit"
desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?"
icon_state = "checkered_suit"
item_state = "checkered_suit"
- _color = "checkered_suit"
+ item_color = "checkered_suit"
/obj/item/clothing/under/owl
name = "owl uniform"
desc = "A soft brown jumpsuit made of synthetic feathers and strong conviction."
icon_state = "owl"
- _color = "owl"
+ item_color = "owl"
flags = NODROP
/obj/item/clothing/under/griffin
name = "griffon uniform"
desc = "A soft brown jumpsuit with a white feather collar made of synthetic feathers and a lust for mayhem."
icon_state = "griffin"
- _color = "griffin"
+ item_color = "griffin"
flags = NODROP
/obj/item/clothing/under/noble_clothes
name = "noble clothes"
desc = "They fall just short of majestic."
icon_state = "noble_clothes"
- _color = "noble_clothes"
+ item_color = "noble_clothes"
item_state = "noble_clothes"
diff --git a/code/modules/clothing/under/pants.dm b/code/modules/clothing/under/pants.dm
index 92ce44bdac3..8beff8f41f3 100644
--- a/code/modules/clothing/under/pants.dm
+++ b/code/modules/clothing/under/pants.dm
@@ -7,83 +7,83 @@
name = "classic jeans"
desc = "You feel cooler already."
icon_state = "jeansclassic"
- _color = "jeansclassic"
+ item_color = "jeansclassic"
/obj/item/clothing/under/pants/mustangjeans
name = "Must Hang jeans"
desc = "Made in the finest space jeans factory this side of Alpha Centauri."
icon_state = "jeansmustang"
- _color = "jeansmustang"
+ item_color = "jeansmustang"
/obj/item/clothing/under/pants/blackjeans
name = "black jeans"
desc = "Only for those who can pull it off."
icon_state = "jeansblack"
- _color = "jeansblack"
+ item_color = "jeansblack"
/obj/item/clothing/under/pants/youngfolksjeans
name = "Young Folks jeans"
desc = "For those tired of boring old jeans. Relive the passion of your youth!"
icon_state = "jeansyoungfolks"
- _color = "jeansyoungfolks"
+ item_color = "jeansyoungfolks"
/obj/item/clothing/under/pants/white
name = "white pants"
desc = "Plain white pants. Boring."
icon_state = "whitepants"
- _color = "whitepants"
+ item_color = "whitepants"
/obj/item/clothing/under/pants/red
name = "red pants"
desc = "Bright red pants. Overflowing with personality."
icon_state = "redpants"
- _color = "redpants"
+ item_color = "redpants"
/obj/item/clothing/under/pants/black
name = "black pants"
desc = "These pants are dark, like your soul."
icon_state = "blackpants"
- _color = "blackpants"
+ item_color = "blackpants"
/obj/item/clothing/under/pants/tan
name = "tan pants"
desc = "Some tan pants. You look like a white collar worker with these on."
icon_state = "tanpants"
- _color = "tanpants"
+ item_color = "tanpants"
/obj/item/clothing/under/pants/blue
name = "blue pants"
desc = "Stylish blue pants. These go well with a lot of clothes."
icon_state = "bluepants"
- _color = "bluepants"
+ item_color = "bluepants"
/obj/item/clothing/under/pants/track
name = "track pants"
desc = "A pair of track pants, for the athletic."
icon_state = "trackpants"
- _color = "trackpants"
+ item_color = "trackpants"
/obj/item/clothing/under/pants/jeans
name = "jeans"
desc = "A nondescript pair of tough blue jeans."
icon_state = "jeans"
- _color = "jeans"
+ item_color = "jeans"
/obj/item/clothing/under/pants/khaki
name = "khaki pants"
desc = "A pair of dust beige khaki pants."
icon_state = "khaki"
- _color = "khaki"
+ item_color = "khaki"
/obj/item/clothing/under/pants/camo
name = "camo pants"
desc = "A pair of woodland camouflage pants. Probably not the best choice for a space station."
icon_state = "camopants"
- _color = "camopants"
+ item_color = "camopants"
/obj/item/clothing/under/pants/chaps
name = "black leather assless chaps"
desc = "For those brave enough to weather the breeze."
icon_state = "chaps"
- _color = "chaps"
+ item_color = "chaps"
flags = ONESIZEFITSALL
\ No newline at end of file
diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm
index 76ff9f42d7a..13008c4ff6d 100644
--- a/code/modules/clothing/under/shorts.dm
+++ b/code/modules/clothing/under/shorts.dm
@@ -7,20 +7,20 @@
/obj/item/clothing/under/shorts/red
icon_state = "redshorts"
- _color = "redshorts"
+ item_color = "redshorts"
/obj/item/clothing/under/shorts/green
icon_state = "greenshorts"
- _color = "greenshorts"
+ item_color = "greenshorts"
/obj/item/clothing/under/shorts/blue
icon_state = "blueshorts"
- _color = "blueshorts"
+ item_color = "blueshorts"
/obj/item/clothing/under/shorts/black
icon_state = "blackshorts"
- _color = "blackshorts"
+ item_color = "blackshorts"
/obj/item/clothing/under/shorts/grey
icon_state = "greyshorts"
- _color = "greyshorts"
\ No newline at end of file
+ item_color = "greyshorts"
\ No newline at end of file
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index 60c2c82bef5..8e5eafdceb1 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -3,7 +3,7 @@
desc = "It's some non-descript, slightly suspicious looking, support clothing."
icon_state = "syndicate"
item_state = "bl_suit"
- _color = "syndicate"
+ item_color = "syndicate"
has_sensor = 0
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
@@ -16,7 +16,7 @@
desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
icon_state = "tactifool"
item_state = "bl_suit"
- _color = "tactifool"
+ item_color = "tactifool"
siemens_coefficient = 1
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 8ccc40fbc87..34c4e097d8e 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -141,7 +141,7 @@
icon= 'icons/obj/clothing/uniforms.dmi'
icon_state = "syndicate"
item_state = "bl_suit"
- _color = "syndicate"
+ item_color = "syndicate"
has_sensor = 1 // Jumpsuit has no sensor by default
displays_id = 0 // Purely astetic, the ID does not show up on the player sprite when equipped. Examining still reveals it.
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) // Standard Security jumpsuit stats
@@ -153,7 +153,7 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "castile_dress"
item_state = "castile_dress"
- _color = "castile_dress"
+ item_color = "castile_dress"
/obj/item/clothing/under/psysuit/fluff/isaca_sirius_1 // Xilia: Isaca Sirius
name = "Isaca's suit"
@@ -165,7 +165,7 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "jane_sid_suit"
item_state = "jane_sid_suit"
- _color = "jane_sid_suit"
+ item_color = "jane_sid_suit"
has_sensor = 2
sensor_mode = 3
@@ -178,14 +178,14 @@
return 0
if(src.icon_state == "jane_sid_suit_down")
- src._color = "jane_sid_suit"
+ src.item_color = "jane_sid_suit"
usr << "You zip up \the [src]."
else
- src._color = "jane_sid_suit_down"
+ src.item_color = "jane_sid_suit_down"
usr << "You unzip and roll down \the [src]."
- src.icon_state = "[_color]"
- src.item_state = "[_color]"
+ src.icon_state = "[item_color]"
+ src.item_state = "[item_color]"
usr.update_inv_w_uniform()
//////////// Masks ////////////
@@ -207,7 +207,7 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "fox_suit"
item_state = "g_suit"
- _color = "fox_suit"
+ item_color = "fox_suit"
displays_id = 0 //still appears on examine; this is pure fluff.
// TheFlagbearer: Willow Walker
@@ -217,7 +217,7 @@
icon = 'icons/obj/clothing/uniforms.dmi'
icon_state = "superior_suit"
item_state = "superior_suit"
- _color = "superior_suit"
+ item_color = "superior_suit"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES
diff --git a/code/modules/customitems/item_spawning.dm b/code/modules/customitems/item_spawning.dm
index 93c9733eae0..18735c73cc9 100644
--- a/code/modules/customitems/item_spawning.dm
+++ b/code/modules/customitems/item_spawning.dm
@@ -38,7 +38,7 @@
I.dna_hash = C.dna_hash
I.fingerprint_hash = C.fingerprint_hash
qdel(C)
- ok = M.equip_if_possible(I, slot_wear_id, 0) //if 1, last argument deletes on fail
+ ok = M.equip_or_collect(I, slot_wear_id, 0) //if 1, last argument deletes on fail
break
else if(istype(M.back, /obj/item/weapon/storage)) // Try to place it in something on the mob's back
var/obj/item/weapon/storage/S = M.back
@@ -68,7 +68,7 @@
/proc/HackProperties(var/mob/living/carbon/human/M,var/obj/item/I,var/script)
var/list/statements = text2list(script,";")
if(statements.len == 0)
- return
+ return
for(var/statement in statements)
var/list/assignmentChunks = text2list(statement,"=")
var/varname = assignmentChunks[1]
diff --git a/code/modules/economy/POS.dm b/code/modules/economy/POS.dm
index 7b1c885ff10..5a107e8f11a 100644
--- a/code/modules/economy/POS.dm
+++ b/code/modules/economy/POS.dm
@@ -361,11 +361,6 @@ var/const/POS_HEADER = {"
else
overlays += "pos-standby"
-/obj/machinery/pos/attack_robot(var/mob/user)
-// if(isMoMMI(user))
-// return attack_hand(user)
- return ..()
-
/obj/machinery/pos/attack_hand(var/mob/user)
user.set_machine(src)
var/logindata=""
diff --git a/code/modules/food/icecream_vat.dm b/code/modules/food/icecream_vat.dm
index e71afb26482..eae35e2df0e 100644
--- a/code/modules/food/icecream_vat.dm
+++ b/code/modules/food/icecream_vat.dm
@@ -34,9 +34,11 @@
if(beaker)
user << "A container is already inside [src]."
return
+ if(!user.drop_item())
+ user << "\The [I] is stuck to you!"
+ return
beaker = I
- user.drop_item()
- I.loc = src
+ I.forceMove(src)
user << "You add [I] to [src]"
updateUsrDialog()
return
@@ -105,7 +107,7 @@
else if(href_list["eject"])
if(beaker)
- A.loc = loc
+ A.forceMove(loc)
beaker = null
reagents.trans_to(A,reagents.total_volume)
@@ -248,4 +250,4 @@
dat += show_toppings()
var/datum/browser/popup = new(user, "cream_master","Cream-Master Deluxe", 700, 400, src)
popup.set_content(dat)
- popup.open()
\ No newline at end of file
+ popup.open()
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index e5b37c78657..3d067d0c8fa 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -3,28 +3,26 @@
//Returns the thing in our active hand
/mob/proc/get_active_hand()
- if(issilicon(src))
- if(isrobot(src))
- if(src:module_active)
- return src:module_active
- else
- if(hand) return l_hand
- else return r_hand
+ if(hand) return l_hand
+ else return r_hand
//Returns the thing in our inactive hand
/mob/proc/get_inactive_hand()
if(hand) return r_hand
else return l_hand
+//Returns if a certain item can be equipped to a certain slot.
+// Currently invalid for two-handed items - call obj/item/mob_can_equip() instead.
+/mob/proc/can_equip(obj/item/I, slot, disable_warning = 0)
+ return 0
+
// Because there's several different places it's stored.
/mob/proc/get_multitool(var/if_active=0)
return null
//Puts the item into your l_hand if possible and calls all necessary triggers/updates. returns 1 on success.
/mob/proc/put_in_l_hand(var/obj/item/W)
- if(lying && !(W.flags & ABSTRACT))
- return 0
- if(!istype(W))
+ if(!put_in_hand_check(W))
return 0
if(!l_hand)
W.forceMove(src) //TODO: move to equipped?
@@ -40,9 +38,7 @@
//Puts the item into your r_hand if possible and calls all necessary triggers/updates. returns 1 on success.
/mob/proc/put_in_r_hand(var/obj/item/W)
- if(lying && !(W.flags & ABSTRACT))
- return 0
- if(!istype(W))
+ if(!put_in_hand_check(W))
return 0
if(!r_hand)
W.forceMove(src)
@@ -56,6 +52,11 @@
return 1
return 0
+/mob/proc/put_in_hand_check(var/obj/item/W)
+ if(lying && !(W.flags & ABSTRACT)) return 0
+ if(!istype(W)) return 0
+ return 1
+
//Puts the item into our active hand if possible. returns 1 on success.
/mob/proc/put_in_active_hand(var/obj/item/W)
if(hand) return put_in_l_hand(W)
@@ -97,6 +98,13 @@
//Here lie unEquip and before_item_take, already forgotten and not missed.
+/mob/proc/canUnEquip(obj/item/I, force)
+ if(!I)
+ return 1
+ if((I.flags & NODROP) && !force)
+ return 0
+ return 1
+
/mob/proc/unEquip(obj/item/I, force) //Force overrides NODROP for things like wizarditis and admin undress.
if(!I) //If there's nothing to drop, the drop is automatically succesfull. If(unEquip) should generally be used to check for NODROP.
return 1
@@ -152,120 +160,19 @@
return items
-/** BS12's proc to get the item in the active hand. Couldn't find the /tg/ equivalent. **/
-/mob/proc/equipped()
- if(issilicon(src))
- if(isrobot(src))
- if(src:module_active)
- return src:module_active
- else
- if (hand)
- return l_hand
- else
- return r_hand
- return
-
-/mob/living/carbon/human/proc/equip_if_possible(obj/item/W, slot, del_on_fail = 1) // since byond doesn't seem to have pointers, this seems like the best way to do this :/
- //warning: icky code
- var/equipped = 0
- switch(slot)
- if(slot_back)
- if(!src.back)
- src.back = W
- equipped = 1
- if(slot_wear_mask)
- if(!src.wear_mask)
- src.wear_mask = W
- equipped = 1
- if(slot_handcuffed)
- if(!src.handcuffed)
- src.handcuffed = W
- equipped = 1
- if(slot_l_hand)
- if(!src.l_hand)
- src.l_hand = W
- equipped = 1
- if(slot_r_hand)
- if(!src.r_hand)
- src.r_hand = W
- equipped = 1
- if(slot_belt)
- if(!src.belt && src.w_uniform)
- src.belt = W
- equipped = 1
- if(slot_wear_id)
- if(!src.wear_id && src.w_uniform)
- src.wear_id = W
- equipped = 1
- if(slot_wear_pda)
- if(!src.wear_pda && src.w_uniform)
- src.wear_pda = W
- equipped = 1
- if(slot_l_ear)
- if(!src.l_ear)
- src.l_ear = W
- equipped = 1
- if(slot_r_ear)
- if(!src.r_ear)
- src.r_ear = W
- equipped = 1
- if(slot_glasses)
- if(!src.glasses)
- src.glasses = W
- equipped = 1
- if(slot_gloves)
- if(!src.gloves)
- src.gloves = W
- equipped = 1
- if(slot_head)
- if(!src.head)
- src.head = W
- equipped = 1
- if(slot_shoes)
- if(!src.shoes)
- src.shoes = W
- equipped = 1
- if(slot_wear_suit)
- if(!src.wear_suit)
- src.wear_suit = W
- equipped = 1
- if(slot_w_uniform)
- if(!src.w_uniform)
- src.w_uniform = W
- equipped = 1
- if(slot_l_store)
- if(!src.l_store && src.w_uniform)
- src.l_store = W
- equipped = 1
- if(slot_r_store)
- if(!src.r_store && src.w_uniform)
- src.r_store = W
- equipped = 1
- if(slot_s_store)
- if(!src.s_store && src.wear_suit)
- src.s_store = W
- equipped = 1
- if(slot_in_backpack)
- if (src.back && istype(src.back, /obj/item/weapon/storage/backpack))
- var/obj/item/weapon/storage/backpack/B = src.back
- if(B.contents.len < B.storage_slots && W.w_class <= B.max_w_class)
- W.forceMove(B)
- equipped = 1
-
- if(equipped)
- W.layer = 20
- if(src.back && W.loc != src.back)
- W.forceMove(src)
- else
- if (del_on_fail)
- qdel(W)
- return equipped
-
/mob/proc/get_all_slots()
- return list(wear_mask, back, l_hand, r_hand)
-
+ return list(wear_mask, back, l_hand, r_hand)
+
/mob/proc/get_id_card()
for(var/obj/item/I in src.get_all_slots())
. = I.GetID()
if(.)
- break
\ No newline at end of file
+ break
+
+/mob/proc/get_item_by_slot(slot_id)
+ switch(slot_id)
+ if(slot_l_hand)
+ return l_hand
+ if(slot_r_hand)
+ return r_hand
+ return null
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 19b3c07c8c6..0fd832ebc0c 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -2,8 +2,6 @@
name = "alien"
icon_state = "alien_s"
- var/obj/item/clothing/suit/wear_suit = null //TODO: necessary? Are they even used? ~Carn
- var/obj/item/clothing/head/head = null //
var/obj/item/weapon/r_store = null
var/obj/item/weapon/l_store = null
var/caste = ""
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index 7157ff6f7ba..1f584b97c35 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -25,16 +25,15 @@
spawn(600)
if(ghost_volunteers.len)
var/mob/dead/observer/O = pick(ghost_volunteers)
- if(istype(O) && O.client && O.key)
+ if(check_observer(O))
transfer_personality(O)
reset_search()
/obj/item/device/mmi/posibrain/proc/request_player()
for(var/mob/dead/observer/O in player_list)
- if(O.client && O.client.prefs.be_special & BE_PAI && !jobban_isbanned(O, "Cyborg") && !jobban_isbanned(O,"nonhumandept"))
- if(check_observer(O))
- O << "\blue \A [src] has been activated. (Teleport | Sign Up)"
- //question(O.client)
+ if(check_observer(O))
+ O << "\blue \A [src] has been activated. (Teleport | Sign Up)"
+ //question(O.client)
/obj/item/device/mmi/posibrain/proc/check_observer(var/mob/dead/observer/O)
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 68f6020c440..1ea66f59c61 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -513,7 +513,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
if(I == back)
back = null
- update_inv_back(0)
+ update_inv_back()
else if(I == wear_mask)
if(istype(src, /mob/living/carbon/human)) //If we don't do this hair won't be properly rebuilt.
return
@@ -523,10 +523,10 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
handcuffed = null
if(buckled && buckled.buckle_requires_restraints)
buckled.unbuckle_mob()
- update_inv_handcuffed(1)
+ update_inv_handcuffed()
else if(I == legcuffed)
legcuffed = null
- update_inv_legcuffed(1)
+ update_inv_legcuffed()
/mob/living/carbon/proc/get_temperature(var/datum/gas_mixture/environment)
var/loc_temp = T0C
@@ -558,24 +558,73 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
return loc_temp
-/mob/living/carbon/show_inv(mob/living/carbon/user as mob)
+/mob/living/carbon/show_inv(mob/user)
user.set_machine(src)
var/dat = {"
-
[name]
-
-
Head(Mask): [(wear_mask && !(wear_mask.flags & ABSTRACT)) ? wear_mask : "Nothing"]
-
Left Hand: [(l_hand && !(l_hand.flags & ABSTRACT)) ? l_hand : "Nothing"]
-
Right Hand: [(r_hand && !(r_hand.flags & ABSTRACT)) ? r_hand : "Nothing"]
-
Back: [(back ? back : "Nothing")] [((istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank) && !( internal )) ? text(" Set Internal", src) : "")]
-
[(handcuffed ? text("Handcuffed") : text("Not Handcuffed"))]
-
[(internal ? text("Remove Internal") : "")]
-
Empty Pockets
-
Refresh
+
+ [name]
+
+
Head: [(head && !(head.flags&ABSTRACT)) ? head : "Nothing"]
+
Mask: [(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "Nothing"]
+
Left Hand: [(l_hand && !(l_hand.flags&ABSTRACT)) ? l_hand : "Nothing"]
+
Right Hand: [(r_hand && !(r_hand.flags&ABSTRACT)) ? r_hand : "Nothing"]"}
+
+ dat += "
Back: [back ? back : "Nothing"]"
+
+ if(istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank))
+ dat += "
[internal ? "Disable Internals" : "Set Internals"]"
+
+ if(handcuffed)
+ dat += "
Handcuffed"
+ if(legcuffed)
+ dat += "
Legcuffed"
+
+ dat += {"
+
Close
-
"}
- user << browse(dat, text("window=mob\ref[src];size=325x500"))
+ "}
+ user << browse(dat, "window=mob\ref[src];size=325x500")
onclose(user, "mob\ref[src]")
- return
+
+/mob/living/carbon/Topic(href, href_list)
+ ..()
+ //strip panel
+ if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr))
+ if(href_list["internal"])
+ var/slot = text2num(href_list["internal"])
+ var/obj/item/ITEM = get_item_by_slot(slot)
+ if(ITEM && istype(ITEM, /obj/item/weapon/tank) && wear_mask && (wear_mask.flags & MASKINTERNALS))
+ visible_message("[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM].", \
+ "[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM].")
+ if(do_mob(usr, src, POCKET_STRIP_DELAY))
+ if(internal)
+ internal = null
+ if(internals)
+ internals.icon_state = "internal0"
+ else if(ITEM && istype(ITEM, /obj/item/weapon/tank) && wear_mask && (wear_mask.flags & MASKINTERNALS))
+ internal = ITEM
+ if(internals)
+ internals.icon_state = "internal1"
+
+ visible_message("[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM].", \
+ "[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM].")
+
+/mob/living/carbon/get_item_by_slot(slot_id)
+ switch(slot_id)
+ if(slot_back)
+ return back
+ if(slot_wear_mask)
+ return wear_mask
+ if(slot_handcuffed)
+ return handcuffed
+ if(slot_legcuffed)
+ return legcuffed
+ if(slot_l_hand)
+ return l_hand
+ if(slot_r_hand)
+ return r_hand
+ return null
+
//generates realistic-ish pulse output based on preset levels
/mob/living/carbon/proc/get_pulse(var/method) //method 0 is for hands, 1 is for machines, more accurate
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index b6852c8a8dc..b3b8db03ad7 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -13,6 +13,10 @@
var/number_wounds = 0
var/obj/item/handcuffed = null //Whether or not the mob is handcuffed
var/obj/item/legcuffed = null //Same as handcuffs but for legs. Bear traps use this.
+
+ var/obj/item/head = null
+ var/obj/item/clothing/suit/wear_suit = null //TODO: necessary? Are they even used? ~Carn
+
//Surgery info
var/datum/surgery_status/op_stage = new/datum/surgery_status
//Active emote/pose
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 1dcea3e1b4d..183640bb45b 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -266,9 +266,9 @@
var/obj/item/organ/external/E = organs_by_name[organ_tag]
if(!E)
- wound_flavor_text["[organ_tag]"] = "[t_He] is missing [t_his] [organ_descriptor].\n"
+ wound_flavor_text["[organ_tag]"] = "[t_He] [t_is] missing [t_his] [organ_descriptor].\n"
else if(E.is_stump())
- wound_flavor_text["[organ_tag]"] = "[t_He] has a stump where [t_his] [organ_descriptor] should be.\n"
+ wound_flavor_text["[organ_tag]"] = "[t_He] [t_has] a stump where [t_his] [organ_descriptor] should be.\n"
else
continue
@@ -277,10 +277,10 @@
if(temp.status & ORGAN_ROBOT)
if(!(temp.brute_dam + temp.burn_dam))
if(!isSynthetic())
- wound_flavor_text["[temp.limb_name]"] = "[t_He] has a robotic [temp.name]!\n"
+ wound_flavor_text["[temp.limb_name]"] = "[t_He] [t_has] a robotic [temp.name]!\n"
continue
else
- wound_flavor_text["[temp.limb_name]"] = "[t_He] has a robotic [temp.name]. It has"
+ wound_flavor_text["[temp.limb_name]"] = "[t_He] [t_has] a robotic [temp.name]. It has"
if(temp.brute_dam) switch(temp.brute_dam)
if(0 to 20)
wound_flavor_text["[temp.limb_name]"] += " some dents"
@@ -317,22 +317,22 @@
switch(wound_descriptors[wound])
if(1)
if(!flavor_text.len)
- flavor_text += "[t_He] has[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a [wound]"
+ flavor_text += "[t_He] [t_has][prob(10) && !(wound in no_exclude) ? " what might be" : ""] a [wound]"
else
flavor_text += "[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a [wound]"
if(2)
if(!flavor_text.len)
- flavor_text += "[t_He] has[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a pair of [wound]s"
+ flavor_text += "[t_He] [t_has][prob(10) && !(wound in no_exclude) ? " what might be" : ""] a pair of [wound]s"
else
flavor_text += "[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a pair of [wound]s"
if(3 to 5)
if(!flavor_text.len)
- flavor_text += "[t_He] has several [wound]s"
+ flavor_text += "[t_He] [t_has] several [wound]s"
else
flavor_text += " several [wound]s"
if(6 to INFINITY)
if(!flavor_text.len)
- flavor_text += "[t_He] has a bunch of [wound]s"
+ flavor_text += "[t_He] [t_has] a bunch of [wound]s"
else
flavor_text += " a ton of [wound]\s"
var/flavor_text_string = ""
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 3f805af1f4f..b8e58315cce 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1,4 +1,3 @@
-#define STRIP_DELAY 40 //time taken (in deciseconds) to strip somebody
/mob/living/carbon/human
name = "unknown"
real_name = "unknown"
@@ -422,7 +421,8 @@
var/armor = run_armor_check(affecting, "melee")
var/obj/item/organ/external/affected = src.get_organ(dam_zone)
- affected.add_autopsy_data(M.name, damage) // Add the mob's name to the autopsy data
+ if(affected)
+ affected.add_autopsy_data(M.name, damage) // Add the mob's name to the autopsy data
apply_damage(damage, BRUTE, affecting, armor, M.name)
updatehealth()
@@ -532,54 +532,108 @@
/mob/living/carbon/human/var/temperature_resistance = T0C+75
-/mob/living/carbon/human/show_inv(mob/user as mob)
- var/obj/item/clothing/under/suit = null
- if (istype(w_uniform, /obj/item/clothing/under))
- suit = w_uniform
-
- var/obj/item/clothing/gloves/G
- var/pickpocket = 0
- if(ishuman(user))
- if(user:gloves)
- G = user:gloves
- pickpocket = G.pickpocket
+/mob/living/carbon/human/show_inv(mob/user)
user.set_machine(src)
- var/dat = {"
-
[name]
-
-
Back: [(back && !(back.flags & ABSTRACT)) ? back : "Nothing"] [((istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank) && !( internal )) ? text(" Set Internal", src) : "")]
-
Head(Mask): [(wear_mask && !(wear_mask.flags & ABSTRACT)) ? wear_mask : "Nothing"]
-
Left Hand: [(l_hand && !(l_hand.flags & ABSTRACT)) ? l_hand : "Nothing"]
-
Right Hand: [(r_hand && !(r_hand.flags&ABSTRACT)) ? r_hand : "Nothing"]"}
+ var/has_breathable_mask = istype(wear_mask, /obj/item/clothing/mask)
+ var/list/obscured = check_obscured_slots()
+
+ var/dat = {"
+ | Left Hand: | [(l_hand && !(l_hand.flags&ABSTRACT)) ? l_hand : "Empty"] |
+ | Right Hand: | [(r_hand && !(r_hand.flags&ABSTRACT)) ? r_hand : "Empty"] |
+ | |
"}
+
+ dat += "| Back: | [(back && !(back.flags&ABSTRACT)) ? back : "Empty"]"
+ if(has_breathable_mask && istype(back, /obj/item/weapon/tank))
+ dat += " [internal ? "Disable Internals" : "Set Internals"]"
+
+ dat += " |
| |
"
+
+ dat += "| Head: | [(head && !(head.flags&ABSTRACT)) ? head : "Empty"] |
"
+
+ if(slot_wear_mask in obscured)
+ dat += "| Mask: | Obscured |
"
+ else
+ dat += "| Mask: | [(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "Empty"] |
"
+
if(!issmall(src))
- dat += {"
-
Gloves: [(gloves && !(gloves.flags & ABSTRACT)) ? gloves : "Nothing"]
-
Eyes: [(glasses && !(glasses.flags & ABSTRACT)) ? glasses : "Nothing"]
-
Left Ear: [(l_ear && !(l_ear.flags & ABSTRACT)) ? l_ear : "Nothing"]
-
Right Ear: [(r_ear && !(r_ear.flags & ABSTRACT)) ? r_ear : "Nothing"]
-
Head: [(head && !(head.flags & ABSTRACT)) ? head : "Nothing"]
-
Shoes: [(shoes && !(shoes.flags & ABSTRACT)) ? shoes : "Nothing"]
-
Belt: [(belt && !(belt.flags & ABSTRACT)) ? belt : "Nothing"] [((istype(wear_mask, /obj/item/clothing/mask) && istype(belt, /obj/item/weapon/tank) && !( internal )) ? text(" Set Internal", src) : "")]
-
Uniform: [(w_uniform && !(w_uniform.flags & ABSTRACT)) ? w_uniform : "Nothing"] [(suit) ? ((suit.has_sensor == 1) ? text(" Sensors", src) : "") :]
-
(Exo)Suit: [(wear_suit && !(wear_suit.flags & ABSTRACT)) ? wear_suit : "Nothing"]
-
ID: [(wear_id && !(wear_id.flags & ABSTRACT)) ? wear_id : "Nothing"]
-
PDA: [(wear_pda && !(wear_pda.flags & ABSTRACT)) ? wear_pda : "Nothing"]
-
Suit Storage: [(s_store && !(s_store.flags & ABSTRACT)) ? s_store : "Nothing"]
-
Left Pocket ([(l_store && !(l_store.flags & ABSTRACT)) ? (pickpocket ? l_store.name : "Full") : "Empty"])
-
Right Pocket ([(r_store && !(r_store.flags & ABSTRACT)) ? (pickpocket ? r_store.name : "Full") : "Empty"])
-
Empty Both Pockets"}
- dat += {"
-
[(handcuffed ? text("Handcuffed") : text("Not Handcuffed"))]
-
[(legcuffed ? text("Legcuffed") : text(""))]
- [(suit) ? ((suit.accessories.len) ? text("
Remove Accessory", src) : "") :]
- [(internal ? text("
Remove Internal") : "")]
-
Remove Splints
-
Refresh
-
Close
-
"}
- user << browse(dat, text("window=mob\ref[src];size=340x480"))
- onclose(user, "mob\ref[src]")
- return
+ if(slot_glasses in obscured)
+ dat += "| Eyes: | Obscured |
"
+ else
+ dat += "| Eyes: | [(glasses && !(glasses.flags&ABSTRACT)) ? glasses : "Empty"] |
"
+
+ if(slot_l_ear in obscured)
+ dat += "| Left Ear: | Obscured |
"
+ else
+ dat += "| Left Ear: | [(l_ear && !(l_ear.flags&ABSTRACT)) ? l_ear : "Empty"] |
"
+
+ if(slot_r_ear in obscured)
+ dat += "| Right Ear: | Obscured |
"
+ else
+ dat += "| Right Ear: | [(r_ear && !(r_ear.flags&ABSTRACT)) ? r_ear : "Empty"] |
"
+
+ dat += "| |
"
+
+ dat += "| Exosuit: | [(wear_suit && !(wear_suit.flags&ABSTRACT)) ? wear_suit : "Empty"] |
"
+ if(wear_suit)
+ dat += "| ↳Suit Storage: | [(s_store && !(s_store.flags&ABSTRACT)) ? s_store : "Empty"]"
+ if(has_breathable_mask && istype(s_store, /obj/item/weapon/tank))
+ dat += " [internal ? "Disable Internals" : "Set Internals"]"
+ dat += " |
"
+ else
+ dat += "| ↳Suit Storage: |
"
+
+ if(slot_shoes in obscured)
+ dat += "| Shoes: | Obscured |
"
+ else
+ dat += "| Shoes: | [(shoes && !(shoes.flags&ABSTRACT)) ? shoes : "Empty"] |
"
+
+ if(slot_gloves in obscured)
+ dat += "| Gloves: | Obscured |
"
+ else
+ dat += "| Gloves: | [(gloves && !(gloves.flags&ABSTRACT)) ? gloves : "Empty"] |
"
+
+ if(slot_w_uniform in obscured)
+ dat += "| Uniform: | Obscured |
"
+ else
+ dat += "| Uniform: | [(w_uniform && !(w_uniform.flags&ABSTRACT)) ? w_uniform : "Empty"] |
"
+
+ if(w_uniform == null || (slot_w_uniform in obscured))
+ dat += "| ↳Pockets: |
"
+ dat += "| ↳ID: |
"
+ dat += "| ↳Belt: |
"
+ dat += "| ↳Suit Sensors: |
"
+ dat += "| ↳PDA: |
"
+ else
+ dat += "| ↳Belt: | [(belt && !(belt.flags&ABSTRACT)) ? belt : "Empty"]"
+ if(has_breathable_mask && istype(belt, /obj/item/weapon/tank))
+ dat += " [internal ? "Disable Internals" : "Set Internals"]"
+ dat += " |
"
+ dat += "| ↳Pockets: | [(l_store && !(l_store.flags&ABSTRACT)) ? "Left (Full)" : "Left (Empty)"]"
+ dat += " [(r_store && !(r_store.flags&ABSTRACT)) ? "Right (Full)" : "Right (Empty)"] |
"
+ dat += "| ↳ID: | [(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "Empty"] |
"
+ dat += "| ↳PDA: | [(wear_pda && !(wear_pda.flags&ABSTRACT)) ? wear_pda : "Empty"] |
"
+
+ if(istype(w_uniform, /obj/item/clothing/under))
+ var/obj/item/clothing/under/U = w_uniform
+ dat += "| ↳Suit Sensors: | [U.has_sensor >= 2 ? "--SENSORS LOCKED--" : "Set Sensors"] |
"
+
+ if(U.accessories.len)
+ dat += "| ↳Remove Accessory |
"
+
+
+ if(handcuffed)
+ dat += "| Handcuffed: Remove |
"
+ if(legcuffed)
+ dat += "| Legcuffed |
"
+
+ dat += {"
+ Close
+ "}
+
+ var/datum/browser/popup = new(user, "mob\ref[src]", "[src]", 440, 540)
+ popup.set_content(dat)
+ popup.open()
+
// called when something steps onto a human
// this handles mulebots and vehicles
@@ -697,94 +751,66 @@
/mob/living/carbon/human/Topic(href, href_list)
- var/pickpocket = 0
-
- if(ishuman(usr))
- var/mob/living/carbon/human/H = usr
- var/obj/item/clothing/gloves/G = H.gloves
- if(G)
- pickpocket = G.pickpocket
-
if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr))
- // if looting pockets with gloves, do it quietly
- if(href_list["pockets"])
- if(isanimal(usr))
- return //animals cannot strip people
-
- if(frozen)
- usr << "\red Do not attempt to strip frozen people."
+ if(href_list["item"])
+ var/slot = text2num(href_list["item"])
+ if(slot in check_obscured_slots())
+ usr << "You can't reach that! Something is covering it."
return
+
+ if(href_list["pockets"])
var/pocket_side = href_list["pockets"]
var/pocket_id = (pocket_side == "right" ? slot_r_store : slot_l_store)
- var/obj/item/pocket_item = (pocket_id == slot_r_store ? src.r_store : src.l_store)
+ var/obj/item/pocket_item = (pocket_id == slot_r_store ? r_store : l_store)
var/obj/item/place_item = usr.get_active_hand() // Item to place in the pocket, if it's empty
- if(pocket_item && !(pocket_item.flags & ABSTRACT))
+ var/delay_denominator = 1
+ if(pocket_item && !(pocket_item.flags&ABSTRACT))
if(pocket_item.flags & NODROP)
- usr << "You try to empty [src]'s [pocket_side] pocket, it seems to be stuck!"
+ usr << "You try to empty [src]'s [pocket_side] pocket, it seems to be stuck!"
usr << "You try to empty [src]'s [pocket_side] pocket."
- else if(place_item && place_item.mob_can_equip(src, pocket_id, 1) && !(place_item.flags & ABSTRACT))
+ else if(place_item && place_item.mob_can_equip(src, pocket_id, 1) && !(place_item.flags&ABSTRACT))
usr << "You try to place [place_item] into [src]'s [pocket_side] pocket."
+ delay_denominator = 4
else
return
- if(do_mob(usr, src, STRIP_DELAY))
+ if(do_mob(usr, src, POCKET_STRIP_DELAY/delay_denominator)) //placing an item into the pocket is 4 times faster
if(pocket_item)
- unEquip(pocket_item)
- usr.put_in_hands(pocket_item)
+ if(pocket_item == (pocket_id == slot_r_store ? r_store : l_store)) //item still in the pocket we search
+ unEquip(pocket_item)
else
if(place_item)
usr.unEquip(place_item)
- equip_to_slot_if_possible(place_item, pocket_id, 0, 1)
+ equip_to_slot_if_possible(place_item, pocket_id, 0, 1)
// Update strip window
if(usr.machine == src && in_range(src, usr))
show_inv(usr)
-
- else if(!pickpocket)
+ else
// Display a warning if the user mocks up
src << "You feel your [pocket_side] pocket being fumbled with!"
- // if looting id with gloves, do it quietly - this allows pickpocket gloves to take/place id stealthily - Bone White
- if(href_list["item"])
- if(isanimal(usr))
- return //animals cannot strip people
+ if(href_list["set_sensor"])
+ if(istype(w_uniform, /obj/item/clothing/under))
+ var/obj/item/clothing/under/U = w_uniform
+ U.set_sensors(usr)
- if(frozen)
- usr << "\red Do not attempt to strip frozen people."
- return
- var/itemTarget = href_list["item"]
- if(itemTarget == "id")
- if(pickpocket)
- var/obj/item/worn_id = src.wear_id
- var/obj/item/place_item = usr.get_active_hand() // Item to place in the pocket, if it's empty
+ if(href_list["strip_accessory"])
+ if(istype(w_uniform, /obj/item/clothing/under))
+ var/obj/item/clothing/under/U = w_uniform
+ if(U.accessories.len)
+ var/obj/item/clothing/accessory/A = U.accessories[1]
+ usr.visible_message("\The [usr] starts to take off \the [A] from \the [src]'s [U]!", \
+ "You start to take off \the [A] from \the [src]'s [U]!")
- if(worn_id)
- usr << "You try to remove [src]'s ID."
- else if(place_item && place_item.mob_can_equip(src, slot_wear_id, 1))
- usr << "You try to place [place_item] onto [src]."
- else
- return
-
- if(do_mob(usr, src, STRIP_DELAY))
- if(worn_id)
- unEquip(worn_id)
- usr.put_in_hands(worn_id)
- else
- if(place_item)
- usr.unEquip(place_item)
- equip_to_slot_if_possible(place_item, slot_wear_id, 0, 1)
-
- // Update strip window
- if(usr.machine == src && in_range(src, usr))
- show_inv(usr)
-
-
-
- else if(!pickpocket)
- // Display a warning if the user mocks up
- src << "You feel your ID slot being fumbled with!"
+ if(do_mob(usr, src, 40) && A && U.accessories.len)
+ usr.visible_message("\The [usr] takes \the [A] off of \the [src]'s [U]!", \
+ "You take \the [A] off of \the [src]'s [U]!")
+ A.on_removed(usr)
+ U.accessories -= A
+ update_inv_w_uniform()
if (href_list["refresh"])
if((machine)&&(in_range(src, usr)))
@@ -795,21 +821,6 @@
unset_machine()
src << browse(null, t1)
- if ((href_list["item"] && !( usr.stat ) && usr.canmove && !( usr.restrained() ) && in_range(src, usr) && ticker)) //if game hasn't started, can't make an equip_e
- var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( )
- if(!pickpocket || href_list["item"] != "id") // Stop the non-stealthy verbose strip if pickpocketing id.
- O.source = usr
- O.target = src
- O.item = usr.get_active_hand()
- O.s_loc = usr.loc
- O.t_loc = loc
- O.place = href_list["item"]
- O.pickpocket = pickpocket //Stealthy
- requests += O
- spawn( 0 )
- O.process()
- return
-
if (href_list["criminal"])
if(hasHUD(usr,"security"))
@@ -959,7 +970,6 @@
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.general)
if (R.fields["id"] == E.fields["id"])
-
var/setmedical = input(usr, "Specify a new medical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("*SSD*", "*Deceased*", "Physically Unfit", "Active", "Disabled", "Cancel")
if(hasHUD(usr,"medical"))
@@ -1077,8 +1087,7 @@
if (href_list["lookmob"])
var/mob/M = locate(href_list["lookmob"])
src.examinate(M)
- ..()
- return
+ . = ..()
///eyecheck()
@@ -1155,7 +1164,7 @@
xylophone=0
return
-/mob/living/carbon/human/can_inject(var/mob/user, var/error_msg, var/target_zone)
+/mob/living/carbon/human/can_inject(var/mob/user, var/error_msg, var/target_zone, var/penetrate_thick = 0)
. = 1
if(!target_zone)
@@ -1175,16 +1184,41 @@
else
switch(target_zone)
if("head")
- if(head && head.flags & THICKMATERIAL)
+ if(head && head.flags & THICKMATERIAL && !penetrate_thick)
. = 0
else
- if(wear_suit && wear_suit.flags & THICKMATERIAL)
+ if(wear_suit && wear_suit.flags & THICKMATERIAL && !penetrate_thick)
. = 0
if(!. && error_msg && user)
if(!fail_msg)
fail_msg = "There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"] to inject into."
user << "[fail_msg]"
+/mob/living/carbon/human/proc/check_obscured_slots()
+ var/list/obscured = list()
+
+ if(wear_suit)
+ if(wear_suit.flags_inv & HIDEGLOVES)
+ obscured |= slot_gloves
+ if(wear_suit.flags_inv & HIDEJUMPSUIT)
+ obscured |= slot_w_uniform
+ if(wear_suit.flags_inv & HIDESHOES)
+ obscured |= slot_shoes
+
+ if(head)
+ if(head.flags_inv & HIDEMASK)
+ obscured |= slot_wear_mask
+ if(head.flags_inv & HIDEEYES)
+ obscured |= slot_glasses
+ if(head.flags_inv & HIDEEARS)
+ obscured |= slot_r_ear
+ obscured |= slot_l_ear
+
+ if(obscured.len > 0)
+ return obscured
+ else
+ return null
+
/mob/living/carbon/human/proc/check_has_mouth()
// Todo, check stomach organ when implemented.
var/obj/item/organ/external/head/H = get_organ("head")
@@ -1806,4 +1840,4 @@
/mob/living/carbon/human/proc/get_full_print()
if(!dna || !dna.uni_identity)
return
- return md5(dna.uni_identity)
+ return md5(dna.uni_identity)
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index c863249b79a..09bca41ed3f 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -76,17 +76,22 @@
M << "Remove his mask!"
return 0
- var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human()
- O.source = M
- O.target = src
- O.s_loc = M.loc
- O.t_loc = loc
- O.place = "CPR"
- requests += O
- spawn(0)
- O.process()
- add_logs(src, M, "CPRed")
- return 1
+ M.visible_message("\The [M] is trying to perform CPR on \the [src]!", \
+ "You try to perform CPR on \the [src]!")
+ if(do_mob(M, src, 40))
+ if(health > config.health_threshold_dead && health <= config.health_threshold_crit)
+ var/suff = min(getOxyLoss(), 7)
+ adjustOxyLoss(-suff)
+ updatehealth()
+ M.visible_message("\The [M] performs CPR on \the [src]!", \
+ "You perform CPR on \the [src].")
+
+ src << "You feel a breath of fresh air enter your lungs. It feels good."
+ M << "Repeat at least every 7 seconds."
+ add_logs(src, M, "CPRed")
+ return 1
+ else
+ M << "You need to stay still while performing CPR!"
if(I_GRAB)
if(attacker_style && attacker_style.grab_act(H, src))
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index ef88db4a6dc..eb53f62a774 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -35,13 +35,11 @@
var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack.
//Equipment slots
- var/obj/item/wear_suit = null
var/obj/item/w_uniform = null
var/obj/item/shoes = null
var/obj/item/belt = null
var/obj/item/gloves = null
var/obj/item/glasses = null
- var/obj/item/head = null
var/obj/item/l_ear = null
var/obj/item/r_ear = null
var/obj/item/wear_id = null
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 4bea67b9ab3..fae439fd414 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -183,12 +183,6 @@
else if(I == back)
back = null
update_inv_back()
- else if(I == handcuffed)
- handcuffed = null
- update_inv_handcuffed()
- else if(I == legcuffed)
- legcuffed = null
- update_inv_legcuffed()
else if(I == r_hand)
r_hand = null
update_inv_r_hand()
@@ -213,107 +207,90 @@
src.r_hand = null
update_inv_r_hand()
+ W.screen_loc = null
W.loc = src
+ W.equipped(src, slot)
+ W.layer = 20
+
switch(slot)
if(slot_back)
- src.back = W
- W.equipped(src, slot)
+ back = W
update_inv_back(redraw_mob)
if(slot_wear_mask)
- src.wear_mask = W
+ wear_mask = W
if((wear_mask.flags & BLOCKHAIR) || (wear_mask.flags & BLOCKHEADHAIR))
update_hair(redraw_mob) //rebuild hair
- W.equipped(src, slot)
update_inv_wear_mask(redraw_mob)
if(slot_handcuffed)
- src.handcuffed = W
+ handcuffed = W
update_inv_handcuffed(redraw_mob)
if(slot_legcuffed)
- src.legcuffed = W
- W.equipped(src, slot)
+ legcuffed = W
update_inv_legcuffed(redraw_mob)
if(slot_l_hand)
- src.l_hand = W
- W.equipped(src, slot)
+ l_hand = W
update_inv_l_hand(redraw_mob)
if(slot_r_hand)
- src.r_hand = W
- W.equipped(src, slot)
+ r_hand = W
update_inv_r_hand(redraw_mob)
if(slot_belt)
- src.belt = W
- W.equipped(src, slot)
+ belt = W
update_inv_belt(redraw_mob)
if(slot_wear_id)
- src.wear_id = W
- W.equipped(src, slot)
+ wear_id = W
update_inv_wear_id(redraw_mob)
if(slot_wear_pda)
- src.wear_pda = W
- W.equipped(src, slot)
+ wear_pda = W
update_inv_wear_pda(redraw_mob)
if(slot_l_ear)
- src.l_ear = W
+ l_ear = W
if(l_ear.slot_flags & SLOT_TWOEARS)
var/obj/item/clothing/ears/offear/O = new(W)
O.loc = src
- src.r_ear = O
+ r_ear = O
O.layer = 20
- W.equipped(src, slot)
update_inv_ears(redraw_mob)
if(slot_r_ear)
- src.r_ear = W
+ r_ear = W
if(r_ear.slot_flags & SLOT_TWOEARS)
var/obj/item/clothing/ears/offear/O = new(W)
O.loc = src
- src.l_ear = O
+ l_ear = O
O.layer = 20
- W.equipped(src, slot)
update_inv_ears(redraw_mob)
if(slot_glasses)
- src.glasses = W
- W.equipped(src, slot)
+ glasses = W
update_inv_glasses(redraw_mob)
if(slot_gloves)
- src.gloves = W
- W.equipped(src, slot)
+ gloves = W
update_inv_gloves(redraw_mob)
if(slot_head)
- src.head = W
+ head = W
if((head.flags & BLOCKHAIR) || (head.flags & BLOCKHEADHAIR))
update_hair(redraw_mob) //rebuild hair
- if(istype(W,/obj/item/clothing/head/kitty))
- W.update_icon(src)
- W.equipped(src, slot)
update_inv_head(redraw_mob)
if(slot_shoes)
- src.shoes = W
- W.equipped(src, slot)
+ shoes = W
update_inv_shoes(redraw_mob)
if(slot_wear_suit)
- src.wear_suit = W
- W.equipped(src, slot)
+ wear_suit = W
update_inv_wear_suit(redraw_mob)
if(slot_w_uniform)
- src.w_uniform = W
- W.equipped(src, slot)
+ w_uniform = W
update_inv_w_uniform(redraw_mob)
if(slot_l_store)
- src.l_store = W
- W.equipped(src, slot)
+ l_store = W
update_inv_pockets(redraw_mob)
if(slot_r_store)
- src.r_store = W
- W.equipped(src, slot)
+ r_store = W
update_inv_pockets(redraw_mob)
if(slot_s_store)
- src.s_store = W
- W.equipped(src, slot)
+ s_store = W
update_inv_s_store(redraw_mob)
if(slot_in_backpack)
- if(src.get_active_hand() == W)
- src.unEquip(W)
- W.loc = src.back
+ if(get_active_hand() == W)
+ unEquip(W)
+ W.loc = back
if(slot_tie)
var/obj/item/clothing/under/uniform = src.w_uniform
uniform.attackby(W,src)
@@ -321,10 +298,6 @@
src << "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!"
return
- W.layer = 20
-
- return
-
/mob/living/carbon/human/put_in_hands(obj/item/W)
if(!W) return 0
if(put_in_active_hand(W)) return 1
@@ -332,516 +305,6 @@
else
..()
-/obj/effect/equip_e
- name = "equip e"
- var/mob/source = null
- var/s_loc = null //source location
- var/t_loc = null //target location
- var/obj/item/item = null
- var/place = null
- var/pickpocket = null
-
-/obj/effect/equip_e/human
- name = "human"
- var/mob/living/carbon/human/target = null
-
-/obj/effect/equip_e/process()
- return
-
-/obj/effect/equip_e/proc/done()
- return
-
-/obj/effect/equip_e/New()
- if (!ticker)
- qdel(src)
- spawn(100)
- qdel(src)
- ..()
- return
-
-/obj/effect/equip_e/human/process()
- if (item)
- item.add_fingerprint(source)
- else
- switch(place)
- if("mask")
- if (!( target.wear_mask ))
- qdel(src)
- if("l_hand")
- if (!( target.l_hand ))
- qdel(src)
- if("r_hand")
- if (!( target.r_hand ))
- qdel(src)
- if("suit")
- if (!( target.wear_suit ))
- qdel(src)
- if("uniform")
- if (!( target.w_uniform ))
- qdel(src)
- if("back")
- if (!( target.back ))
- qdel(src)
- if("syringe")
- return
- if("pill")
- return
- if("fuel")
- return
- if("drink")
- return
- if("dnainjector")
- return
- if("handcuff")
- if (!( target.handcuffed ))
- qdel(src)
- if("id")
- if ((!( target.wear_id ) || !( target.w_uniform )))
- qdel(src)
- if("splints")
- var/count = 0
- for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
- var/obj/item/organ/external/o = target.organs_by_name[organ]
- if(o.status & ORGAN_SPLINTED)
- count = 1
- break
- if(count == 0)
- qdel(src)
- return
- if("internal")
- if ((!( (istype(target.wear_mask, /obj/item/clothing/mask) && (istype(target.back, /obj/item/weapon/tank) || istype(target.belt, /obj/item/weapon/tank) || istype(target.s_store, /obj/item/weapon/tank)) && !( target.internal )) ) && !( target.internal )))
- qdel(src)
-
- var/message=null
- if(target.frozen)
- source << "\red Do not attempt to strip frozen people."
- return
-
-
- switch(place)
- if("syringe")
- message = "\red [source] is trying to inject [target]!"
- if("pill")
- message = "\red [source] is trying to force [target] to swallow [item]!"
- if("drink")
- message = "\red [source] is trying to force [target] to swallow a gulp of [item]!"
- if("dnainjector")
- message = "\red [source] is trying to inject [target] with the [item]!"
- if("mask")
- target.attack_log += text("\[[time_stamp()]\] Had their mask removed by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) mask")
- if(target.wear_mask && (target.wear_mask.flags & NODROP))
- message = "\red [source] fails to take off \a [target.wear_mask] from [target]'s head!"
- return
- else if(target.wear_mask)
- message = "\red [source] is trying to take off \a [target.wear_mask] from [target]'s head!"
- if("l_hand")
- target.attack_log += text("\[[time_stamp()]\] Has had their left hand item ([target.l_hand]) removed by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) left hand item ([target.l_hand])")
- message = "\red [source] is trying to take off \a [target.l_hand] from [target]'s left hand!"
- if("r_hand")
- target.attack_log += text("\[[time_stamp()]\] Has had their right hand item ([target.r_hand]) removed by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) right hand item ([target.r_hand])")
- message = "\red [source] is trying to take off \a [target.r_hand] from [target]'s right hand!"
- if("gloves")
- target.attack_log += text("\[[time_stamp()]\] Has had their gloves ([target.gloves]) removed by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) gloves ([target.gloves])")
- if(target.gloves && (target.gloves.flags & NODROP))
- message = "\red [source] fails to take off \a [target.gloves] from [target]'s hands!"
- return
- else if(target.gloves)
- message = "\red [source] is trying to take off the [target.gloves] from [target]'s hands!"
- if("eyes")
- target.attack_log += text("\[[time_stamp()]\] Has had their eyewear ([target.glasses]) removed by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) eyewear ([target.glasses])")
- if(target.glasses && (target.glasses.flags & NODROP))
- message = "\red [source] fails to take off \a [target.glasses] from [target]'s eyes!"
- return
- else if(target.glasses)
- message = "\red [source] is trying to take off the [target.glasses] from [target]'s eyes!"
- if("l_ear")
- target.attack_log += text("\[[time_stamp()]\] Has had their left ear item ([target.l_ear]) removed by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) left ear item ([target.l_ear])")
- if(target.l_ear && (target.l_ear.flags & NODROP))
- message = "\red [source] fails to take off \a [target.l_ear] from [target]'s left ear!"
- return
- else if(target.l_ear)
- message = "\red [source] is trying to take off the [target.l_ear] from [target]'s left ear!"
- if("r_ear")
- target.attack_log += text("\[[time_stamp()]\] Has had their right ear item ([target.r_ear]) removed by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) right ear item ([target.r_ear])")
- if(target.r_ear && (target.r_ear.flags & NODROP))
- message = "\red [source] fails to take off \a [target.r_ear] from [target]'s right ear!"
- return
- else if(target.r_ear)
- message = "\red [source] is trying to take off the [target.r_ear] from [target]'s right ear!"
- if("head")
- target.attack_log += text("\[[time_stamp()]\] Has had their hat ([target.head]) removed by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) hat ([target.head])")
- if(target.head && (target.head.flags & NODROP))
- message = "\red [source] fails to take off \a [target.head] from [target]'s head!"
- return
- else if(target.head)
- message = "\red [source] is trying to take off the [target.head] from [target]'s head!"
- if("shoes")
- target.attack_log += text("\[[time_stamp()]\] Has had their shoes ([target.shoes]) removed by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) shoes ([target.shoes])")
- if(target.shoes && (target.shoes.flags & NODROP))
- message = "\red [source] fails to take off \a [target.shoes] from [target]'s feet!"
- return
- else if(target.shoes)
- message = "\red [source] is trying to take off [target.shoes] from [target]'s feet!"
- if("belt")
- target.attack_log += text("\[[time_stamp()]\] Has had their belt item ([target.belt]) removed by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) belt item ([target.belt])")
- if(!pickpocket && target.belt)
- message = "\red [source] is trying to take off \a [target.belt] from [target]'s belt!"
- if("suit")
- target.attack_log += text("\[[time_stamp()]\] Has had their suit ([target.wear_suit]) removed by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) suit ([target.wear_suit])")
- if(target.wear_suit && (target.wear_suit.flags & NODROP))
- message = "\red [source] fails to take off \a [target.wear_suit] from [target]'s body!"
- return
- else if(target.wear_suit)
- message = "\red [source] is trying to take off \a [target.wear_suit] from [target]'s body!"
- if("back")
- target.attack_log += text("\[[time_stamp()]\] Has had their back item ([target.back]) removed by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) back item ([target.back])")
- message = "\red [source] is trying to take off \a [target.back] from [target]'s back!"
- if("handcuff")
- target.attack_log += text("\[[time_stamp()]\] Was unhandcuffed by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to unhandcuff [target.name]'s ([target.ckey])")
- if(target.handcuffed)
- message = "\red [source] is trying to unhandcuff [target]!"
- if("legcuff")
- target.attack_log += text("\[[time_stamp()]\] Was unlegcuffed by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to unlegcuff [target.name]'s ([target.ckey])")
- if(target.legcuffed)
- message = "\red [source] is trying to unlegcuff [target]!"
- else
- message = "\red [source] is trying to legcuff [target]!"
- if("uniform")
- target.attack_log += text("\[[time_stamp()]\] Has had their uniform ([target.w_uniform]) removed by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) uniform ([target.w_uniform])")
- for(var/obj/item/I in list(target.l_store, target.r_store))
- if(I.on_found(source))
- return
- if(target.w_uniform && (target.w_uniform.flags & NODROP))
- message = "\red [source] fails to take off \a [target.w_uniform] from [target]'s body!"
- return
- else
- message = "\red [source] is trying to take off \a [target.w_uniform] from [target]'s body!"
- if("tie")
- var/obj/item/clothing/under/suit = target.w_uniform
- if(suit.accessories.len)
- var/obj/item/clothing/accessory/A = suit.accessories[1]
- target.attack_log += "\[[time_stamp()]\] Has had their accessory ([A]) removed by [source.name] ([source.ckey])"
- source.attack_log += "\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) accessory ([A])"
- if(istype(A, /obj/item/clothing/accessory/holobadge) || istype(A, /obj/item/clothing/accessory/medal))
- for(var/mob/M in viewers(target, null))
- M.show_message("\red [source] tears off \the [A] from [target]'s [suit]!" , 1)
- done()
- return
- else
- message = "\red [source] is trying to take off \a [A] from [target]'s [suit]!"
- if("s_store")
- target.attack_log += text("\[[time_stamp()]\] Has had their suit storage item ([target.s_store]) removed by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) suit storage item ([target.s_store])")
- message = "\red [source] is trying to take off \a [target.s_store] from [target]'s suit!"
- if("pockets")
- target.attack_log += text("\[[time_stamp()]\] Has had their pockets emptied by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to empty [target.name]'s ([target.ckey]) pockets")
- for(var/obj/item/I in list(target.l_store, target.r_store))
- if(I.on_found(source))
- return
- message = "\red [source] is trying to empty [target]'s pockets!"
- if("CPR")
- if (!target.cpr_time)
- qdel(src)
- target.cpr_time = 0
- message = "\red [source] is trying perform CPR on [target]!"
- if("id")
- target.attack_log += text("\[[time_stamp()]\] Has had their ID ([target.wear_id]) removed by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) ID ([target.wear_id])")
- if(!pickpocket)
- message = "\red [source] is trying to take off [target.wear_id] from [target]'s uniform!"
- else
- source << "\blue You try to take off [target.wear_id] from [target]'s uniform!"
- if("pda")
- target.attack_log += text("\[[time_stamp()]\] Has had their PDA ([target.wear_pda]) removed by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) PDA ([target.wear_pda])")
- message = "\red [source] is trying to take off [target.wear_pda] from [target]'s uniform!"
- if("internal")
- target.attack_log += text("\[[time_stamp()]\] Has had their internals toggled by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to toggle [target.name]'s ([target.ckey]) internals")
- if (target.internal)
- message = "\red [source] is trying to remove [target]'s internals!"
- else
- message = "\red [source] is trying to set on [target]'s internals."
- if("splints")
- message = "\red [source] is trying to remove [target]'s splints!"
- if("sensor")
- target.attack_log += text("\[[time_stamp()]\] Has had their sensors toggled by [source.name] ([source.ckey])")
- source.attack_log += text("\[[time_stamp()]\] Attempted to toggle [target.name]'s ([target.ckey]) sensors")
- var/obj/item/clothing/under/suit = target.w_uniform
- if (suit.has_sensor >= 2)
- source << "The controls are locked."
- return
- message = "\red [source] is trying to set [target]'s suit sensors!"
-
- for(var/mob/M in viewers(target, null))
- if(findtext(message, "is trying to take off from", 1, 0) > 0 || message == null)
- message = "\red [source] is trying to put \a [item] on [target]!"
- if(findtext(message, "is trying to put on", 1, 0) > 0)
- return
- else
- M.show_message(message, 1)
- else
- M.show_message(message, 1)
- spawn( HUMAN_STRIP_DELAY )
- done()
- return
- return
-
-/*
-This proc equips stuff (or does something else) when removing stuff manually from the character window when you click and drag.
-It works in conjuction with the process() above.
-This proc works for humans only. Aliens stripping humans and the like will all use this proc. Stripping monkeys or somesuch will use their version of this proc.
-The first if statement for "mask" and such refers to items that are already equipped and un-equipping them.
-The else statement is for equipping stuff to empty slots.
-The NODROP flag refers to variable of /obj/item/clothing which either allows or disallows that item to be removed.
-It can still be worn/put on as normal.
-*/
-/obj/effect/equip_e/human/done() //TODO: And rewrite this :< ~Carn
- target.cpr_time = 1
- if(isanimal(source)) return //animals cannot strip people
- if(!source || !target) return //Target or source no longer exist
- if(source.loc != s_loc) return //source has moved
- if(target.loc != t_loc) return //target has moved
- if (LinkBlockedUnclimbable(t_loc, s_loc)) return
- if(item && source.get_active_hand() != item) return //Swapped hands / removed item from the active one
- if ((source.restrained() || source.stat)) return //Source restrained or unconscious / dead
- if(target.frozen)
- source << "\red Do not attempt to strip frozen people."
- return
-
-
- var/slot_to_process
- var/strip_item //this will tell us which item we will be stripping - if any.
-
- switch(place) //here we go again...
- if("mask")
- slot_to_process = slot_wear_mask
- if (target.wear_mask && !(target.wear_mask.flags & NODROP))
- strip_item = target.wear_mask
- if("gloves")
- slot_to_process = slot_gloves
- if (target.gloves && !(target.gloves.flags & NODROP))
- strip_item = target.gloves
- if("eyes")
- slot_to_process = slot_glasses
- if (target.glasses)
- strip_item = target.glasses
- if("belt")
- slot_to_process = slot_belt
- if (target.belt)
- strip_item = target.belt
- if("s_store")
- slot_to_process = slot_s_store
- if (target.s_store)
- strip_item = target.s_store
- if("head")
- slot_to_process = slot_head
- if (target.head && !(target.head.flags & NODROP))
- strip_item = target.head
- if("l_ear")
- slot_to_process = slot_l_ear
- if (target.l_ear)
- strip_item = target.l_ear
- if("r_ear")
- slot_to_process = slot_r_ear
- if (target.r_ear)
- strip_item = target.r_ear
- if("shoes")
- slot_to_process = slot_shoes
- if (target.shoes && !(target.shoes.flags & NODROP))
- strip_item = target.shoes
- if("l_hand")
- if (istype(target, /obj/item/clothing/suit/straight_jacket))
- qdel(src)
- slot_to_process = slot_l_hand
- if (target.l_hand)
- strip_item = target.l_hand
- if("r_hand")
- if (istype(target, /obj/item/clothing/suit/straight_jacket))
- qdel(src)
- slot_to_process = slot_r_hand
- if (target.r_hand)
- strip_item = target.r_hand
- if("uniform")
- slot_to_process = slot_w_uniform
- if(target.w_uniform && !(target.w_uniform.flags & NODROP))
- strip_item = target.w_uniform
- if("suit")
- slot_to_process = slot_wear_suit
- if (target.wear_suit && !(target.wear_suit.flags & NODROP))
- strip_item = target.wear_suit
- if("tie")
- var/obj/item/clothing/under/suit = target.w_uniform
- //var/obj/item/clothing/accessory/tie = suit.hastie
- /*if(tie)
- if (istype(tie,/obj/item/clothing/accessory/storage))
- var/obj/item/clothing/accessory/storage/W = tie
- if (W.hold)
- W.hold.close(usr)
- usr.put_in_hands(tie)
- suit.hastie = null*/
- if(suit && suit.accessories.len)
- var/obj/item/clothing/accessory/A = suit.accessories[1]
- A.on_removed(usr)
- suit.accessories -= A
- target.update_inv_w_uniform()
- if("id")
- slot_to_process = slot_wear_id
- if (target.wear_id)
- strip_item = target.wear_id
- if("pda")
- slot_to_process = slot_wear_pda
- if (target.wear_pda)
- strip_item = target.wear_pda
- if("back")
- slot_to_process = slot_back
- if (target.back)
- strip_item = target.back
- if("handcuff")
- slot_to_process = slot_handcuffed
- if (target.handcuffed)
- strip_item = target.handcuffed
- if("legcuff")
- slot_to_process = slot_legcuffed
- if (target.legcuffed)
- strip_item = target.legcuffed
- if("splints")
- for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
- var/obj/item/organ/external/o = target.get_organ(organ)
- if (o && o.status & ORGAN_SPLINTED)
- var/obj/item/W = new /obj/item/stack/medical/splint/single()
- o.status &= ~ORGAN_SPLINTED
- if (W)
- W.loc = target.loc
- W.layer = initial(W.layer)
- W.add_fingerprint(source)
- if("CPR")
- if ((target.health > config.health_threshold_dead && target.health <= config.health_threshold_crit))
- var/suff = min(target.getOxyLoss(), 7)
- target.adjustOxyLoss(-suff)
- target.updatehealth()
- for(var/mob/O in viewers(source, null))
- O.show_message("\red [source] performs CPR on [target]!", 1)
- target << "\blue You feel a breath of fresh air enter your lungs. It feels good."
- source << "\red Repeat at least every 7 seconds."
- if("dnainjector")
- var/obj/item/weapon/dnainjector/S = item
- if(S)
- S.add_fingerprint(source)
- if (!( istype(S, /obj/item/weapon/dnainjector) ))
- S.inuse = 0
- qdel(src)
- S.inject(target, source)
- if (S.s_time >= world.time + 30)
- S.inuse = 0
- qdel(src)
- S.s_time = world.time
- for(var/mob/O in viewers(source, null))
- O.show_message("\red [source] injects [target] with the DNA Injector!", 1)
- S.inuse = 0
- if("pockets")
- slot_to_process = slot_l_store
- strip_item = target.l_store //We'll do both
- if("sensor")
- var/obj/item/clothing/under/suit = target.w_uniform
- if (suit)
- if(suit.has_sensor >= 2)
- source << "The controls are locked."
- else
- suit.set_sensors(source)
- if("internal")
- if (target.internal)
- target.internal.add_fingerprint(source)
- target.internal = null
- if (target.internals)
- target.internals.icon_state = "internal0"
- else
- if (!( istype(target.wear_mask, /obj/item/clothing/mask) ))
- return
- else
- if (istype(target.back, /obj/item/weapon/tank))
- target.internal = target.back
- else if (istype(target.s_store, /obj/item/weapon/tank))
- target.internal = target.s_store
- else if (istype(target.belt, /obj/item/weapon/tank))
- target.internal = target.belt
- if (target.internal)
- for(var/mob/M in viewers(target, 1))
- M.show_message("[target] is now running on internals.", 1)
- target.internal.add_fingerprint(source)
- if (target.internals)
- target.internals.icon_state = "internal1"
- if(slot_to_process)
- if(strip_item) //Stripping an item from the mob
- var/obj/item/W = strip_item
- if((W.flags & NODROP) || (W.flags & ABSTRACT)) //Just to be sure
- return
- target.unEquip(W)
- if (target.client)
- target.client.screen -= W
- if (W)
- W.loc = target.loc
- W.layer = initial(W.layer)
- W.dropped(target)
- W.add_fingerprint(source)
- if(slot_to_process == slot_l_store) //pockets! Needs to process the other one too. Snowflake code, wooo! It's not like anyone will rewrite this anytime soon. If I'm wrong then... CONGRATULATIONS! ;)
- if(target.r_store)
- target.unEquip(target.r_store) //At this stage l_store is already processed by the code above, we only need to process r_store.
- else
- if(item && target.has_organ_for_slot(slot_to_process)) //Placing an item on the mob
- if(item.mob_can_equip(target, slot_to_process, 0))
- source.unEquip(item)
- target.equip_to_slot_if_possible(item, slot_to_process, 0, 1, 1)
- item.dropped(source)
- source.update_icons()
- target.update_icons()
-
- if(source && target)
- if(source.machine == target)
- target.show_inv(source)
- qdel(src)
-
-
-/mob/proc/get_item_by_slot(slot_id)
- switch(slot_id)
- if(slot_l_hand)
- return l_hand
- if(slot_r_hand)
- return r_hand
- return null
-
-/mob/living/carbon/get_item_by_slot(slot_id)
- switch(slot_id)
- if(slot_back)
- return back
- if(slot_wear_mask)
- return wear_mask
- if(slot_handcuffed)
- return handcuffed
- if(slot_legcuffed)
- return legcuffed
- if(slot_l_hand)
- return l_hand
- if(slot_r_hand)
- return r_hand
- return null
-
// Return the item currently in the slot ID
/mob/living/carbon/human/get_item_by_slot(slot_id)
switch(slot_id)
@@ -861,6 +324,8 @@ It can still be worn/put on as normal.
return belt
if(slot_wear_id)
return wear_id
+ if(slot_wear_pda)
+ return wear_pda
if(slot_l_ear)
return l_ear
if(slot_r_ear)
@@ -901,6 +366,7 @@ It can still be worn/put on as normal.
shoes,
belt,
wear_id,
+ wear_pda,
l_store,
r_store,
w_uniform
@@ -913,4 +379,219 @@ It can still be worn/put on as normal.
glasses,
r_ear,
l_ear,
- )
\ No newline at end of file
+ )
+
+// humans have their pickpocket gloves, so they get no message when stealing things
+/mob/living/carbon/human/stripPanelUnequip(obj/item/what, mob/who, where)
+ var/is_silent = 0
+ var/obj/item/clothing/gloves/G = gloves
+ if(istype(G))
+ is_silent = G.pickpocket
+
+ ..(what, who, where, silent = is_silent)
+
+// humans have their pickpocket gloves, so they get no message when stealing things
+/mob/living/carbon/human/stripPanelEquip(obj/item/what, mob/who, where)
+ var/is_silent = 0
+ var/obj/item/clothing/gloves/G = gloves
+ if(istype(G))
+ is_silent = G.pickpocket
+
+ ..(what, who, where, silent = is_silent)
+
+/mob/living/carbon/human/can_equip(obj/item/I, slot, disable_warning = 0)
+ switch(species.handle_can_equip(I, slot, disable_warning, src))
+ if(1) return 1
+ if(2) return 0 //if it returns 2, it wants no normal handling
+
+ if(istype(I, /obj/item/clothing/under) || istype(I, /obj/item/clothing/suit))
+ if(FAT in mutations)
+ //testing("[M] TOO FAT TO WEAR [src]!")
+ if(!(I.flags & ONESIZEFITSALL))
+ if(!disable_warning)
+ src << "You're too fat to wear the [I]."
+ return 0
+
+ switch(slot)
+ if(slot_l_hand)
+ if(l_hand)
+ return 0
+ return 1
+ if(slot_r_hand)
+ if(r_hand)
+ return 0
+ return 1
+ if(slot_wear_mask)
+ if(wear_mask)
+ return 0
+ if(!(I.slot_flags & SLOT_MASK))
+ return 0
+ return 1
+ if(slot_back)
+ if(back)
+ return 0
+ if(!(I.slot_flags & SLOT_BACK))
+ return 0
+ return 1
+ if(slot_wear_suit)
+ if(wear_suit)
+ return 0
+ if(!(I.slot_flags & SLOT_OCLOTHING))
+ return 0
+ return 1
+ if(slot_gloves)
+ if(gloves)
+ return 0
+ if(!(I.slot_flags & SLOT_GLOVES))
+ return 0
+ return 1
+ if(slot_shoes)
+ if(shoes)
+ return 0
+ if(!(I.slot_flags & SLOT_FEET))
+ return 0
+ return 1
+ if(slot_belt)
+ if(belt)
+ return 0
+ if(!w_uniform)
+ if(!disable_warning)
+ src << "You need a jumpsuit before you can attach this [name]."
+ return 0
+ if(!(I.slot_flags & SLOT_BELT))
+ return
+ return 1
+ if(slot_glasses)
+ if(glasses)
+ return 0
+ if(!(I.slot_flags & SLOT_EYES))
+ return 0
+ return 1
+ if(slot_head)
+ if(head)
+ return 0
+ if(!(I.slot_flags & SLOT_HEAD))
+ return 0
+ return 1
+ if(slot_l_ear)
+ if(l_ear)
+ return 0
+ if(!(I.slot_flags & SLOT_EARS))
+ return 0
+ if((I.slot_flags & SLOT_TWOEARS) && r_ear )
+ return 0
+ return 1
+ if(slot_r_ear)
+ if(r_ear)
+ return 0
+ if(!(I.slot_flags & SLOT_EARS))
+ return 0
+ if((I.slot_flags & SLOT_TWOEARS) && l_ear)
+ return 0
+ return 1
+ if(slot_w_uniform)
+ if(w_uniform)
+ return 0
+ if(!(I.slot_flags & SLOT_ICLOTHING))
+ return 0
+ return 1
+ if(slot_wear_id)
+ if(wear_id)
+ return 0
+ if(!w_uniform)
+ if(!disable_warning)
+ src << "You need a jumpsuit before you can attach this [name]."
+ return 0
+ if(!(I.slot_flags & SLOT_ID))
+ return 0
+ return 1
+ if(slot_wear_pda)
+ if(wear_pda)
+ return 0
+ if(!w_uniform)
+ if(!disable_warning)
+ src << "You need a jumpsuit before you can attach this [name]."
+ return 0
+ if(!(I.slot_flags & SLOT_PDA))
+ return 0
+ return 1
+ if(slot_l_store)
+ if(I.flags & NODROP) //Pockets aren't visible, so you can't move NODROP items into them.
+ return 0
+ if(l_store)
+ return 0
+ if(!w_uniform)
+ if(!disable_warning)
+ src << "You need a jumpsuit before you can attach this [name]."
+ return 0
+ if(I.slot_flags & SLOT_DENYPOCKET)
+ return
+ if(I.w_class <= 2 || (I.slot_flags & SLOT_POCKET))
+ return 1
+ if(slot_r_store)
+ if(I.flags & NODROP)
+ return 0
+ if(r_store)
+ return 0
+ if(!w_uniform)
+ if(!disable_warning)
+ src << "You need a jumpsuit before you can attach this [name]."
+ return 0
+ if(I.slot_flags & SLOT_DENYPOCKET)
+ return 0
+ if(I.w_class <= 2 || (I.slot_flags & SLOT_POCKET))
+ return 1
+ return 0
+ if(slot_s_store)
+ if(I.flags & NODROP) //Suit storage NODROP items drop if you take a suit off, this is to prevent people exploiting this.
+ return 0
+ if(s_store)
+ return 0
+ if(!wear_suit)
+ if(!disable_warning)
+ src << "You need a suit before you can attach this [name]."
+ return 0
+ if(!wear_suit.allowed)
+ if(!disable_warning)
+ src << "You somehow have a suit with no defined allowed items for suit storage, stop that."
+ return 0
+ if(I.w_class > 4)
+ if(!disable_warning)
+ src << "The [name] is too big to attach."
+ return 0
+ if(istype(I, /obj/item/device/pda) || istype(I, /obj/item/weapon/pen) || is_type_in_list(I, wear_suit.allowed))
+ return 1
+ return 0
+ if(slot_handcuffed)
+ if(handcuffed)
+ return 0
+ if(!istype(I, /obj/item/weapon/restraints/handcuffs))
+ return 0
+ return 1
+ if(slot_legcuffed)
+ if(legcuffed)
+ return 0
+ if(!istype(I, /obj/item/weapon/restraints/legcuffs))
+ return 0
+ return 1
+ if(slot_in_backpack)
+ if(back && istype(back, /obj/item/weapon/storage/backpack))
+ var/obj/item/weapon/storage/backpack/B = back
+ if(B.contents.len < B.storage_slots && I.w_class <= B.max_w_class)
+ return 1
+ return 0
+ if(slot_tie)
+ if(!w_uniform)
+ if(!disable_warning)
+ src << "You need a jumpsuit before you can attach this [name]."
+ return 0
+ var/obj/item/clothing/under/uniform = w_uniform
+ if(uniform.accessories.len && !uniform.can_attach_accessory(src))
+ if(!disable_warning)
+ src << "You already have an accessory of this type attached to your [uniform]."
+ return 0
+ if(!(I.slot_flags & SLOT_TIE))
+ return 0
+ return 1
+
+ return 0 //Unsupported slot
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/npcs.dm b/code/modules/mob/living/carbon/human/npcs.dm
index a51a9cbd990..290c81723ee 100644
--- a/code/modules/mob/living/carbon/human/npcs.dm
+++ b/code/modules/mob/living/carbon/human/npcs.dm
@@ -2,7 +2,7 @@
name = "fancy uniform"
desc = "It looks like it was tailored for a monkey."
icon_state = "punpun"
- _color = "punpun"
+ item_color = "punpun"
species_restricted = list("Monkey")
/mob/living/carbon/human/monkey/punpun/New()
diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm
index 88e4d5a1962..aaa073879fb 100644
--- a/code/modules/mob/living/carbon/human/species/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/golem.dm
@@ -39,7 +39,7 @@
desc = "a golem's skin"
icon_state = "golem"
item_state = "golem"
- _color = "golem"
+ item_color = "golem"
has_sensor = 0
flags = ABSTRACT | NODROP
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
@@ -93,7 +93,7 @@
/obj/item/clothing/head/space/golem
icon_state = "golem"
item_state = "dermal"
- _color = "dermal"
+ item_color = "dermal"
name = "golem's head"
desc = "a golem's head"
unacidable = 1
diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm
index c7c6f49bd57..e1212758309 100644
--- a/code/modules/mob/living/carbon/human/species/monkey.dm
+++ b/code/modules/mob/living/carbon/human/species/monkey.dm
@@ -52,10 +52,46 @@ datum/species/monkey/get_random_name(var/gender)
/datum/species/monkey/handle_dna(var/mob/living/carbon/human/H)
H.dna.SetSEState(MONKEYBLOCK,1)
+/datum/species/monkey/handle_can_equip(obj/item/I, slot, disable_warning = 0, mob/living/carbon/human/user)
+ switch(slot)
+ if(slot_l_hand)
+ if(user.l_hand)
+ return 2
+ return 1
+ if(slot_r_hand)
+ if(user.r_hand)
+ return 2
+ return 1
+ if(slot_wear_mask)
+ if(user.wear_mask)
+ return 2
+ if(!(I.slot_flags & SLOT_MASK))
+ return 2
+ return 1
+ if(slot_back)
+ if(user.back)
+ return 2
+ if(!(I.slot_flags & SLOT_BACK))
+ return 2
+ return 1
+ if(slot_handcuffed)
+ if(user.handcuffed)
+ return 2
+ if(!istype(I, /obj/item/weapon/restraints/handcuffs))
+ return 2
+ return 1
+ if(slot_in_backpack)
+ if(user.back && istype(user.back, /obj/item/weapon/storage/backpack))
+ var/obj/item/weapon/storage/backpack/B = user.back
+ if(B.contents.len < B.storage_slots && I.w_class <= B.max_w_class)
+ return 1
+ return 2
+ return 2
+
/datum/species/monkey/tajaran
name = "Farwa"
name_plural = "Farwa"
-
+
icobase = 'icons/mob/human_races/monkeys/r_farwa.dmi'
deform = 'icons/mob/human_races/monkeys/r_farwa.dmi'
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 2f50a3a4d51..1ed4360db60 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -78,7 +78,7 @@
//Used in icon caching.
var/race_key = 0
var/icon/icon_template
-
+
var/is_small
var/show_ssd = 1
var/virus_immune
@@ -103,7 +103,7 @@
"brain" = /obj/item/organ/brain,
"appendix" = /obj/item/organ/appendix,
"eyes" = /obj/item/organ/eyes
- )
+ )
var/vision_organ // If set, this organ is required for vision. Defaults to "eyes" if the species has them.
var/list/has_limbs = list(
"chest" = list("path" = /obj/item/organ/external/chest),
@@ -364,3 +364,6 @@
/datum/unarmed_attack/claws/armalis
attack_verb = list("slash", "claw")
damage = 6 //they're huge! they should do a little more damage, i'd even go for 15-20 maybe...
+
+/datum/species/proc/handle_can_equip(obj/item/I, slot, disable_warning = 0, mob/living/carbon/human/user)
+ return 0
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 830cdc379fc..0a3eefa609b 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -515,7 +515,7 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/update_inv_w_uniform(var/update_icons=1)
if(w_uniform && istype(w_uniform, /obj/item/clothing/under) )
w_uniform.screen_loc = ui_iclothing
- var/t_color = w_uniform._color
+ var/t_color = w_uniform.item_color
if(!t_color) t_color = icon_state
var/image/standing = image("icon_state" = "[t_color]_s")
@@ -541,7 +541,7 @@ var/global/list/damage_icon_parts = list()
if(w_uniform:accessories.len) //WE CHECKED THE TYPE ABOVE. THIS REALLY SHOULD BE FINE.
for(var/obj/item/clothing/accessory/A in w_uniform:accessories)
- var/tie_color = A._color
+ var/tie_color = A.item_color
if(!tie_color) tie_color = A.icon_state
standing.overlays += image("icon" = 'icons/mob/ties.dmi', "icon_state" = "[tie_color]")
@@ -692,15 +692,12 @@ var/global/list/damage_icon_parts = list()
if(head)
head.screen_loc = ui_head //TODO
var/image/standing
- if(istype(head,/obj/item/clothing/head/kitty))
- standing = image("icon" = head:mob)
+ if(head.icon_override)
+ standing = image("icon" = head.icon_override, "icon_state" = "[head.icon_state]")
+ else if(head.sprite_sheets && head.sprite_sheets[species.name])
+ standing = image("icon" = head.sprite_sheets[species.name], "icon_state" = "[head.icon_state]")
else
- if(head.icon_override)
- standing = image("icon" = head.icon_override, "icon_state" = "[head.icon_state]")
- else if(head.sprite_sheets && head.sprite_sheets[species.name])
- standing = image("icon" = head.sprite_sheets[species.name], "icon_state" = "[head.icon_state]")
- else
- standing = image("icon" = 'icons/mob/head.dmi', "icon_state" = "[head.icon_state]")
+ standing = image("icon" = 'icons/mob/head.dmi', "icon_state" = "[head.icon_state]")
if(head.blood_DNA)
var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "helmetblood")
diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm
index f49a2c9996d..3806584a0d6 100644
--- a/code/modules/mob/living/carbon/metroid/metroid.dm
+++ b/code/modules/mob/living/carbon/metroid/metroid.dm
@@ -587,7 +587,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
throw_speed = 3
throw_range = 6
origin_tech = "biotech=4"
- _color = "grey"
+ item_color = "grey"
var/Uses = 1 // uses before it goes inert
var/enhanced = 0 //has it been enhanced before?
@@ -612,87 +612,87 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
/obj/item/slime_extract/grey
name = "grey slime extract"
icon_state = "grey slime extract"
- _color = "grey"
+ item_color = "grey"
/obj/item/slime_extract/gold
name = "gold slime extract"
icon_state = "gold slime extract"
- _color = "gold"
+ item_color = "gold"
/obj/item/slime_extract/silver
name = "silver slime extract"
icon_state = "silver slime extract"
- _color = "silver"
+ item_color = "silver"
/obj/item/slime_extract/metal
name = "metal slime extract"
icon_state = "metal slime extract"
- _color = "metal"
+ item_color = "metal"
/obj/item/slime_extract/purple
name = "purple slime extract"
icon_state = "purple slime extract"
- _color = "purple"
+ item_color = "purple"
/obj/item/slime_extract/darkpurple
name = "dark purple slime extract"
icon_state = "dark purple slime extract"
- _color = "darkpurple"
+ item_color = "darkpurple"
/obj/item/slime_extract/orange
name = "orange slime extract"
icon_state = "orange slime extract"
- _color = "orange"
+ item_color = "orange"
/obj/item/slime_extract/yellow
name = "yellow slime extract"
icon_state = "yellow slime extract"
- _color = "yellow"
+ item_color = "yellow"
/obj/item/slime_extract/red
name = "red slime extract"
icon_state = "red slime extract"
- _color = "red"
+ item_color = "red"
/obj/item/slime_extract/blue
name = "blue slime extract"
icon_state = "blue slime extract"
- _color = "blue"
+ item_color = "blue"
/obj/item/slime_extract/darkblue
name = "dark blue slime extract"
icon_state = "dark blue slime extract"
- _color = "darkblue"
+ item_color = "darkblue"
/obj/item/slime_extract/pink
name = "pink slime extract"
icon_state = "pink slime extract"
- _color = "pink"
+ item_color = "pink"
/obj/item/slime_extract/green
name = "green slime extract"
icon_state = "green slime extract"
- _color = "green"
+ item_color = "green"
/obj/item/slime_extract/lightpink
name = "light pink slime extract"
icon_state = "light pink slime extract"
- _color = "lightpink"
+ item_color = "lightpink"
/obj/item/slime_extract/black
name = "black slime extract"
icon_state = "black slime extract"
- _color = "black"
+ item_color = "black"
/obj/item/slime_extract/oil
name = "oil slime extract"
icon_state = "oil slime extract"
- _color = "oil"
+ item_color = "oil"
/obj/item/slime_extract/adamantine
name = "adamantine slime extract"
icon_state = "adamantine slime extract"
- _color = "adamantine"
+ item_color = "adamantine"
/obj/item/slime_extract/bluespace
name = "bluespace slime extract"
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 452493b4fdb..f3cb5145f78 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -890,6 +890,40 @@
/mob/living/proc/can_use_vents()
return "You can't fit into that vent."
+// The src mob is trying to strip an item from someone
+// Override if a certain type of mob should be behave differently when stripping items (can't, for example)
+/mob/living/stripPanelUnequip(obj/item/what, mob/who, where, var/silent = 0)
+ if(what.flags & NODROP)
+ src << "You can't remove \the [what.name], it appears to be stuck!"
+ return
+ if(!silent)
+ who.visible_message("[src] tries to remove [who]'s [what.name].", \
+ "[src] tries to remove [who]'s [what.name].")
+ what.add_fingerprint(src)
+ if(do_mob(src, who, what.strip_delay))
+ if(what && what == who.get_item_by_slot(where) && Adjacent(who))
+ who.unEquip(what)
+ add_logs(who, src, "stripped", addition="of [what]")
+
+// The src mob is trying to place an item on someone
+// Override if a certain mob should be behave differently when placing items (can't, for example)
+/mob/living/stripPanelEquip(obj/item/what, mob/who, where, var/silent = 0)
+ what = src.get_active_hand()
+ if(what && (what.flags & NODROP))
+ src << "You can't put \the [what.name] on [who], it's stuck to your hand!"
+ return
+ if(what)
+ if(!what.mob_can_equip(who, where, 1))
+ src << "\The [what.name] doesn't fit in that place!"
+ return
+ if(!silent)
+ visible_message("[src] tries to put [what] on [who].")
+ if(do_mob(src, who, what.put_on_delay))
+ if(what && Adjacent(who))
+ unEquip(what)
+ who.equip_to_slot_if_possible(what, where, 0, 1)
+ add_logs(who, src, "equipped", what)
+
/mob/living/singularity_act()
var/gain = 20
diff --git a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm b/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm
deleted file mode 100644
index 44e358da9d6..00000000000
--- a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm
+++ /dev/null
@@ -1,109 +0,0 @@
-#define BORG_CAMERA_BUFFER 30
-
-//UPDATE TRIGGERS, when the chunk (and the surrounding chunks) should update.
-
-// TURFS
-
-/turf
- var/image/obscured
-
-/turf/proc/visibilityChanged()
- if(ticker)
- cameranet.updateVisibility(src)
-
-/turf/simulated/Del()
- visibilityChanged()
- ..()
-
-/turf/simulated/New()
- ..()
- visibilityChanged()
-
-
-
-// STRUCTURES
-
-/obj/structure/Destroy()
- if(ticker)
- cameranet.updateVisibility(src)
- return ..()
-
-/obj/structure/New()
- ..()
- if(ticker)
- cameranet.updateVisibility(src)
-
-// EFFECTS
-
-/obj/effect/Destroy()
- if(ticker)
- cameranet.updateVisibility(src)
- return ..()
-
-/obj/effect/New()
- ..()
- if(ticker)
- cameranet.updateVisibility(src)
-
-
-// DOORS
-
-// Simply updates the visibility of the area when it opens/closes/destroyed.
-/obj/machinery/door/proc/update_freelok_sight()
- // Glass door glass = 1
- // don't check then?
- if(!glass && cameranet)
- cameranet.updateVisibility(src, 0)
-
-
-// ROBOT MOVEMENT
-
-// Update the portable camera everytime the Robot moves.
-// This might be laggy, comment it out if there are problems.
-/mob/living/silicon/robot/var/updating = 0
-
-/mob/living/silicon/robot/Move()
- var/oldLoc = src.loc
- . = ..()
- if(.)
- if(src.camera && src.camera.network.len)
- if(!updating)
- updating = 1
- spawn(BORG_CAMERA_BUFFER)
- if(oldLoc != src.loc)
- cameranet.updatePortableCamera(src.camera)
- updating = 0
-
-// CAMERA
-
-// An addition to deactivate which removes/adds the camera from the chunk list based on if it works or not.
-
-/obj/machinery/camera/deactivate(user as mob, var/choice = 1)
- ..(user, choice)
- if(src.can_use())
- cameranet.addCamera(src)
- else
- src.set_light(0)
- cameranet.removeCamera(src)
-
-/obj/machinery/camera/New()
- ..()
- //Camera must be added to global list of all cameras no matter what...
- if(cameranet.cameras_unsorted || !ticker)
- cameranet.cameras += src
- cameranet.cameras_unsorted = 1
- else
- dd_insertObjectList(cameranet.cameras, src)
-
- var/list/open_networks = difflist(network,restricted_camera_networks) //...but if all of camera's networks are restricted, it only works for specific camera consoles.
- if(open_networks.len) //If there is at least one open network, chunk is available for AI usage.
- cameranet.addCamera(src)
-
-/obj/machinery/camera/Destroy()
- cameranet.cameras -= src
- var/list/open_networks = difflist(network,restricted_camera_networks)
- if(open_networks.len)
- cameranet.removeCamera(src)
- return ..()
-
-#undef BORG_CAMERA_BUFFER
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index ba419f16b5c..cbc449410fc 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -284,9 +284,9 @@
src << "
You are a maintenance drone, a tiny-brained robotic repair machine."
src << "You have no individual will, no personality, and no drives or urges other than your laws."
src << "Use ; to talk to other drones, and say to speak silently to your nearby fellows."
- src << "Remember, you are lawed against interference with the crew. Also remember, you DO NOT take orders from the AI."
+ src << "Remember, you are lawed against interference with the crew. Also remember, you DO NOT take orders from the AI."
src << "Don't invade their worksites, don't steal their resources, don't tell them about the changeling in the toilets."
- src << "If a crewmember has noticed you, you are probably breaking your first law."
+ src << "Make sure crew members do not notice you.."
/*
sprite["Default"] = "repairbot"
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 2f570cdbf6b..2e71b85b668 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -78,6 +78,8 @@ var/list/robot_verbs_default = list(
var/lamp_intensity = 0 //Luminosity of the headlamp. 0 is off. Higher settings than the minimum require power.
var/lamp_recharging = 0 //Flag for if the lamp is on cooldown after being forcibly disabled.
+ var/updating = 0 //portable camera camerachunk update
+
var/jetpackoverlay = 0
var/magpulse = 0
@@ -386,8 +388,8 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/verb/cmd_unequip_module()
set name = "Unequip Module"
set hidden = 1
- uneq_active()
-
+ uneq_active()
+
// this verb lets cyborgs see the stations manifest
/mob/living/silicon/robot/verb/cmd_station_manifest()
set category = "Robot Commands"
@@ -753,7 +755,7 @@ var/list/robot_verbs_default = list(
U.forceMove(src)
else
user << "Upgrade error."
-
+
else
spark_system.start()
return ..()
@@ -1132,10 +1134,18 @@ var/list/robot_verbs_default = list(
update_icons()
+#define BORG_CAMERA_BUFFER 30
/mob/living/silicon/robot/Move(a, b, flag)
-
+ var/oldLoc = src.loc
. = ..()
-
+ if(.)
+ if(src.camera)
+ if(!updating)
+ updating = 1
+ spawn(BORG_CAMERA_BUFFER)
+ if(oldLoc != src.loc)
+ cameranet.updatePortableCamera(src.camera)
+ updating = 0
if(module)
if(module.type == /obj/item/weapon/robot_module/janitor)
var/turf/tile = loc
@@ -1167,8 +1177,9 @@ var/list/robot_verbs_default = list(
cleaned_human.shoes.clean_blood()
cleaned_human.update_inv_shoes(0,0)
cleaned_human.clean_blood()
- cleaned_human << "\red [src] cleans your face!"
+ cleaned_human << "[src] cleans your face!"
return
+#undef BORG_CAMERA_BUFFER
/mob/living/silicon/robot/proc/self_destruct()
if(emagged)
@@ -1281,7 +1292,7 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/deathsquad/init()
laws = new /datum/ai_laws/deathsquad
module = new /obj/item/weapon/robot_module/deathsquad(src)
-
+
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
radio = new /obj/item/device/radio/borg/deathsquad(src)
radio.recalculateChannels()
@@ -1295,7 +1306,7 @@ var/list/robot_verbs_default = list(
var/list/borg_candidates = pollCandidates("Do you want to play as a Nanotrasen Combat borg?", poll_time = 300)
if(borg_candidates.len > 0 && isnull(ckey))
searching_for_ckey = 0
- var/mob/M = pick(borg_candidates)
+ var/mob/M = pick(borg_candidates)
M.mind.transfer_to(src)
M.mind.assigned_role = "MODE"
M.mind.special_role = "Death Commando"
@@ -1304,10 +1315,10 @@ var/list/robot_verbs_default = list(
else
searching_for_ckey = 0
user << "Unable to connect to Central Command. Please wait and try again later."
- return
+ return
else
user << "[src] is already checking for possible borgs."
- return
+ return
/mob/living/silicon/robot/syndicate
icon_state = "syndie_bloodhound"
@@ -1328,7 +1339,7 @@ var/list/robot_verbs_default = list(
..()
cell.maxcharge = 25000
cell.charge = 25000
-
+
/mob/living/silicon/robot/syndicate/init()
laws = new /datum/ai_laws/syndicate_override
module = new /obj/item/weapon/robot_module/syndicate(src)
@@ -1336,13 +1347,13 @@ var/list/robot_verbs_default = list(
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
radio = new /obj/item/device/radio/borg/syndicate(src)
radio.recalculateChannels()
-
+
spawn(5)
if(playstyle_string)
src << playstyle_string
playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0)
-
+
/mob/living/silicon/robot/syndicate/medical
icon_state = "syndi-medi"
designation = "Syndicate Medical"
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index f5bcb2112c4..4e45d6bc2ba 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -279,6 +279,7 @@
if(src.emag)
var/obj/item/weapon/reagent_containers/food/drinks/cans/beer/B = src.emag
B.reagents.add_reagent("beer2", 2)
+ ..()
/obj/item/weapon/robot_module/butler/add_languages(var/mob/living/silicon/robot/R)
//full set of languages
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index ac707426430..0b904097fa3 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -129,6 +129,9 @@
switch(remove_from)
if("head")
if(inventory_head)
+ if(inventory_head.flags & NODROP)
+ usr << "\The [inventory_head] is stuck too hard to [src] for you to remove!"
+ return
name = real_name
desc = initial(desc)
speak = list("YAP", "Woof!", "Bark!", "AUUUUUU")
@@ -145,6 +148,9 @@
return
if("back")
if(inventory_back)
+ if(inventory_back.flags & NODROP)
+ usr << "\The [inventory_back] is stuck too hard to [src] for you to remove!"
+ return
inventory_back.loc = src.loc
inventory_back = null
regenerate_icons()
@@ -669,4 +675,4 @@
s.start()
respawnable_list += src
qdel(src)
- return
+ return
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index c380fba0ea2..6fd450a4c34 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -218,18 +218,18 @@ var/global/chicken_count = 0
attacktext = "kicks"
health = 10
var/eggsleft = 0
- var/_color
+ var/chicken_color
pass_flags = PASSTABLE | PASSMOB
small = 1
can_hide = 1
/mob/living/simple_animal/chicken/New()
..()
- if(!_color)
- _color = pick( list("brown","black","white") )
- icon_state = "chicken_[_color]"
- icon_living = "chicken_[_color]"
- icon_dead = "chicken_[_color]_dead"
+ if(!chicken_color)
+ chicken_color = pick( list("brown","black","white") )
+ icon_state = "chicken_[chicken_color]"
+ icon_living = "chicken_[chicken_color]"
+ icon_dead = "chicken_[chicken_color]_dead"
pixel_x = rand(-6, 6)
pixel_y = rand(0, 10)
chicken_count += 1
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 1c25a12f2c1..7dfa82c4989 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -23,7 +23,7 @@
density = 0
ventcrawler = 2
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
- var/_color //brown, gray and white, leave blank for random
+ var/mouse_color //brown, gray and white, leave blank for random
layer = MOB_LAYER
min_oxy = 16 //Require atleast 16kPA oxygen
minbodytemp = 223 //Below -50 Degrees Celcius
@@ -39,33 +39,33 @@
if(!ckey && stat == CONSCIOUS && prob(0.5))
stat = UNCONSCIOUS
- icon_state = "mouse_[_color]_sleep"
+ icon_state = "mouse_[mouse_color]_sleep"
wander = 0
speak_chance = 0
//snuffles
else if(stat == UNCONSCIOUS)
if(ckey || prob(1))
stat = CONSCIOUS
- icon_state = "mouse_[_color]"
+ icon_state = "mouse_[mouse_color]"
wander = 1
else if(prob(5))
emote("snuffles")
/mob/living/simple_animal/mouse/New()
..()
- if(!_color)
- _color = pick( list("brown","gray","white") )
- icon_state = "mouse_[_color]"
- icon_living = "mouse_[_color]"
- icon_dead = "mouse_[_color]_dead"
- desc = "It's a small [_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself."
+ if(!mouse_color)
+ mouse_color = pick( list("brown","gray","white") )
+ icon_state = "mouse_[mouse_color]"
+ icon_living = "mouse_[mouse_color]"
+ icon_dead = "mouse_[mouse_color]_dead"
+ desc = "It's a small [mouse_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself."
/mob/living/simple_animal/mouse/proc/splat()
src.health = 0
src.stat = DEAD
- src.icon_dead = "mouse_[_color]_splat"
- src.icon_state = "mouse_[_color]_splat"
+ src.icon_dead = "mouse_[mouse_color]_splat"
+ src.icon_state = "mouse_[mouse_color]_splat"
layer = MOB_LAYER
if(client)
client.time_died_as_mouse = world.time
@@ -116,15 +116,15 @@
*/
/mob/living/simple_animal/mouse/white
- _color = "white"
+ mouse_color = "white"
icon_state = "mouse_white"
/mob/living/simple_animal/mouse/gray
- _color = "gray"
+ mouse_color = "gray"
icon_state = "mouse_gray"
/mob/living/simple_animal/mouse/brown
- _color = "brown"
+ mouse_color = "brown"
icon_state = "mouse_brown"
//TOM IS ALIVE! SQUEEEEEEEE~K :)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 2c1c695bdcb..ae830d920b3 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -469,23 +469,18 @@ var/list/slot_equipment_priority = list( \
return
-/mob/proc/show_inv(mob/user as mob)
+/mob/proc/show_inv(mob/user)
user.set_machine(src)
var/dat = {"
-
[name]
-
-
Head(Mask): [(wear_mask ? wear_mask : "Nothing")]
-
Left Hand: [(l_hand && !(l_hand.flags & ABSTRACT)) ? l_hand : "Nothing"]
-
Right Hand: [(r_hand && !(r_hand.flags & ABSTRACT)) ? r_hand : "Nothing"]
-
Back: [(back && !(back.flags & ABSTRACT)) ? back : "Nothing"] [((istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank) && !( internal )) ? text(" Set Internal", src) : "")]
-
[(internal ? text("Remove Internal") : "")]
-
Empty Pockets
-
Refresh
+
+ [name]
+
+
Left Hand: [(l_hand&&!(l_hand.flags&ABSTRACT)) ? l_hand : "Nothing"]
+
Right Hand: [(r_hand&&!(r_hand.flags&ABSTRACT)) ? r_hand : "Nothing"]
Close
-
"}
- user << browse(dat, text("window=mob[];size=325x500", name))
+ "}
+ user << browse(dat, "window=mob\ref[src];size=325x500")
onclose(user, "mob\ref[src]")
- return
//mob verbs are faster than object verbs. See http://www.byond.com/forum/?post=1326139&page=2#comment8198716 for why this isn't atom/verb/examine()
/mob/verb/examinate(atom/A as mob|obj|turf in view())
@@ -786,14 +781,42 @@ var/list/slot_equipment_priority = list( \
unset_machine()
src << browse(null, t1)
+ if(href_list["refresh"])
+ if(machine && in_range(src, usr))
+ show_inv(machine)
+
+ if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr))
+ if(href_list["item"])
+ var/slot = text2num(href_list["item"])
+ var/obj/item/what = get_item_by_slot(slot)
+
+ if(what)
+ usr.stripPanelUnequip(what,src,slot)
+ else
+ usr.stripPanelEquip(what,src,slot)
+
+ if(usr.machine == src)
+ if(Adjacent(usr))
+ show_inv(usr)
+ else
+ usr << browse(null,"window=mob\ref[src]")
+
if(href_list["flavor_more"])
usr << browse(text("[][]", name, replacetext(flavor_text, "\n", "
")), text("window=[];size=500x200", name))
onclose(usr, "[name]")
if(href_list["flavor_change"])
update_flavor_text()
+ return
-// ..()
+// The src mob is trying to strip an item from someone
+// Defined in living.dm
+/mob/proc/stripPanelUnequip(obj/item/what, mob/who)
+ return
+
+// The src mob is trying to place an item on someone
+// Defined in living.dm
+/mob/proc/stripPanelEquip(obj/item/what, mob/who)
return
@@ -1272,8 +1295,6 @@ mob/proc/yank_out_object()
NPC.key = key
spawn(5)
respawnable_list += usr
- else
-// message_admins("Failed to check type")
else
usr << "You are not dead or you have given up your right to be respawned!"
return
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 6e2d31f8630..dce8b3c9ffd 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -170,7 +170,7 @@
if(S.victim == mob)
return
- if(mob.stat==2) return
+ if(mob.stat==DEAD) return
// handle possible spirit movement
if(istype(mob,/mob/spirit))
@@ -237,6 +237,7 @@
return 0
move_delay = world.time//set move delay
+ mob.last_movement = world.time
mob.last_move_intent = world.time + 10
switch(mob.m_intent)
if("run")
@@ -289,10 +290,8 @@
else if(mob.confused)
step(mob, pick(cardinal))
- mob.last_movement = world.time
else
. = ..()
- mob.last_movement=world.time
for (var/obj/item/weapon/grab/G in mob)
if (G.state == GRAB_NECK)
diff --git a/code/modules/mob/new_player/poll.dm b/code/modules/mob/new_player/poll.dm
index 7be517eb2d9..d9e240936d7 100644
--- a/code/modules/mob/new_player/poll.dm
+++ b/code/modules/mob/new_player/poll.dm
@@ -64,7 +64,7 @@
switch(polltype)
//Polls that have enumerated options
- if("OPTION")
+ if(POLLTYPE_OPTION)
var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
voted_query.Execute()
@@ -117,7 +117,7 @@
src << browse(output,"window=playerpoll;size=500x250")
//Polls with a text input
- if("TEXT")
+ if(POLLTYPE_TEXT)
var/DBQuery/voted_query = dbcon.NewQuery("SELECT replytext FROM [format_table_name("poll_textreply")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
voted_query.Execute()
@@ -159,7 +159,7 @@
src << browse(output,"window=playerpoll;size=500x500")
//Polls with a text input
- if("NUMVAL")
+ if(POLLTYPE_RATING)
var/DBQuery/voted_query = dbcon.NewQuery("SELECT o.text, v.rating FROM [format_table_name("poll_option")] o, erro_poll_vote v WHERE o.pollid = [pollid] AND v.ckey = '[usr.ckey]' AND o.id = v.optionid")
voted_query.Execute()
@@ -228,7 +228,7 @@
output += ""
src << browse(output,"window=playerpoll;size=500x500")
- if("MULTICHOICE")
+ if(POLLTYPE_MULTI)
var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
voted_query.Execute()
@@ -308,7 +308,7 @@
var/multiplechoiceoptions = 0
while(select_query.NextRow())
- if(select_query.item[4] != "OPTION" && select_query.item[4] != "MULTICHOICE")
+ if(select_query.item[4] != POLLTYPE_OPTION && select_query.item[4] != POLLTYPE_MULTI)
return
validpoll = 1
if(select_query.item[5])
@@ -377,7 +377,7 @@
var/validpoll = 0
while(select_query.NextRow())
- if(select_query.item[4] != "TEXT")
+ if(select_query.item[4] != POLLTYPE_TEXT)
return
validpoll = 1
break
@@ -435,7 +435,7 @@
var/validpoll = 0
while(select_query.NextRow())
- if(select_query.item[4] != "NUMVAL")
+ if(select_query.item[4] != POLLTYPE_RATING)
return
validpoll = 1
break
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 4fabdc6510e..eb59f6b9aca 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -278,10 +278,6 @@
var/list/mobtypes = typesof(/mob/living/simple_animal)
var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes
- if(!safe_animal(mobpath))
- usr << "\red Sorry but this mob type is currently unavailable."
- return
-
if(notransform)
return
for(var/obj/item/W in src)
@@ -313,10 +309,6 @@
var/list/mobtypes = typesof(/mob/living/simple_animal)
var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes
- if(!safe_animal(mobpath))
- usr << "\red Sorry but this mob type is currently unavailable."
- return
-
var/mob/new_mob = new mobpath(src.loc)
new_mob.key = key
@@ -326,72 +318,10 @@
qdel(src)
-/* Certain mob types have problems and should not be allowed to be controlled by players.
- *
- * This proc is here to force coders to manually place their mob in this list, hopefully tested.
- * This also gives a place to explain -why- players shouldnt be turn into certain mobs and hopefully someone can fix them.
- */
-/mob/proc/safe_animal(var/MP)
-
-//Bad mobs! - Remember to add a comment explaining what's wrong with the mob
- if(!MP)
- return 0 //Sanity, this should never happen.
-
- if(ispath(MP, /mob/living/simple_animal/hostile/spaceWorm))
- return 0 //Unfinished. Very buggy, they seem to just spawn additional space worms everywhere and eating your own tail results in new worms spawning.
-
- if(ispath(MP, /mob/living/simple_animal/construct/behemoth))
- return 0 //I think this may have been an unfinished WiP or something. These constructs should really have their own class simple_animal/construct/subtype
-
- if(ispath(MP, /mob/living/simple_animal/construct/armoured))
- return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype
-
- if(ispath(MP, /mob/living/simple_animal/construct/wraith))
- return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype
-
- if(ispath(MP, /mob/living/simple_animal/construct/builder))
- return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype
-
-//Good mobs!
- if(ispath(MP, /mob/living/simple_animal/pet/cat))
- return 1
- if(ispath(MP, /mob/living/simple_animal/pet/corgi))
- return 1
- if(ispath(MP, /mob/living/simple_animal/crab))
- return 1
- if(ispath(MP, /mob/living/simple_animal/hostile/carp))
- return 1
- if(ispath(MP, /mob/living/simple_animal/hostile/mushroom))
- return 1
- if(ispath(MP, /mob/living/simple_animal/shade))
- return 1
- if(ispath(MP, /mob/living/simple_animal/tomato))
- return 1
- if(ispath(MP, /mob/living/simple_animal/mouse))
- return 1 //It is impossible to pull up the player panel for mice (Fixed! - Nodrak)
- if(ispath(MP, /mob/living/simple_animal/hostile/bear))
- return 1 //Bears will auto-attack mobs, even if they're player controlled (Fixed! - Nodrak)
- if(ispath(MP, /mob/living/simple_animal/parrot))
- return 1 //Parrots are no longer unfinished! -Nodrak
- if(ispath(MP, /mob/living/simple_animal/pony))
- return 1 // ZOMG PONIES WHEEE
- if(ispath(MP, /mob/living/simple_animal/pet/fox))
- return 1
- if(ispath(MP, /mob/living/simple_animal/chick))
- return 1
- if(ispath(MP, /mob/living/simple_animal/pet/pug))
- return 1
- if(ispath(MP, /mob/living/simple_animal/butterfly))
- return 1
- //Not in here? Must be untested!
- return 0
-
-
/mob/proc/safe_respawn(var/MP)
if(!MP)
- return 0 //Sanity, this should never happen.
+ return 0
-//Animals!
if(ispath(MP, /mob/living/simple_animal/pet/cat))
return 1
if(ispath(MP, /mob/living/simple_animal/pet/corgi))
@@ -415,15 +345,10 @@
if(ispath(MP, /mob/living/simple_animal/butterfly))
return 1
-//Antag Creatures!
if(ispath(MP, /mob/living/simple_animal/borer) && !jobban_isbanned(src, "alien") && !jobban_isbanned(src, "Syndicate"))
return 1
- if(ispath(MP, /mob/living/simple_animal/hostile/statue) && !jobban_isbanned(src, "Syndicate"))
- return 1
-
-//Friendly Creatures!
+
if(ispath(MP, /mob/living/simple_animal/diona) && !jobban_isbanned(src, "Dionaea"))
return 1
- //Not in here? Must be untested!
return 0
diff --git a/code/modules/organs/subtypes/diona.dm b/code/modules/organs/subtypes/diona.dm
index 735b5120582..e41c8ce3c62 100644
--- a/code/modules/organs/subtypes/diona.dm
+++ b/code/modules/organs/subtypes/diona.dm
@@ -129,6 +129,7 @@
w_class = 3
body_part = HEAD
parent_organ = "chest"
+ var/can_intake_reagents = 1
/obj/item/organ/external/diona/head/removed()
if(owner)
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index a453b76a123..479bb429efc 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -65,7 +65,7 @@
send_asset_list(user.client, S.assets)
var/data
- if(!(user.say_understands(null, all_languages["Galactic Common"]) && !forceshow) || forcestars) //assuming all paper is written in common is better than hardcoded type checks
+ if((!user.say_understands(null, all_languages["Galactic Common"]) && !forceshow) || forcestars) //assuming all paper is written in common is better than hardcoded type checks
data = "[name][stars(info)][stamps]"
if(view)
usr << browse(data, "window=[name]")
@@ -418,10 +418,11 @@
B.update_icon()
else if(istype(P, /obj/item/weapon/pen) || istype(P, /obj/item/toy/crayon))
- if ( istype(P, /obj/item/weapon/pen/robopen) && P:mode == 2 )
- P:RenamePaper(user,src)
+ var/obj/item/weapon/pen/robopen/RP = P
+ if(istype(P, /obj/item/weapon/pen/robopen) && RP.mode == 2)
+ RP.RenamePaper(user,src)
else
- show_content(user, forceshow = 1, infolinks = 1)
+ show_content(user, infolinks = 1)
//openhelp(user)
return
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 4f61c78c761..f463cc71447 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -24,6 +24,9 @@
var/colour = "black" //what colour the ink is!
pressure_resistance = 2
+/obj/item/weapon/pen/suicide_act(mob/user)
+ viewers(user) << "[user] starts scribbling numbers over \himself with the [src.name]! It looks like \he's trying to commit sudoku."
+ return (BRUTELOSS)
/obj/item/weapon/pen/blue
name = "blue-ink pen"
@@ -143,4 +146,4 @@
item_state = "edagger"
else
icon_state = initial(icon_state) //looks like a normal pen when off.
- item_state = initial(item_state)
\ No newline at end of file
+ item_state = initial(item_state)
diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm
index 5a3df2ff47f..44ecc3f1f12 100644
--- a/code/modules/paperwork/stamps.dm
+++ b/code/modules/paperwork/stamps.dm
@@ -9,7 +9,7 @@
throw_speed = 3
throw_range = 7
materials = list(MAT_METAL=60)
- _color = "cargo"
+ item_color = "cargo"
pressure_resistance = 2
attack_verb = list("stamped")
@@ -20,67 +20,67 @@
/obj/item/weapon/stamp/qm
name = "Quartermaster's rubber stamp"
icon_state = "stamp-qm"
- _color = "qm"
+ item_color = "qm"
/obj/item/weapon/stamp/law
name = "Law office's rubber stamp"
icon_state = "stamp-law"
- _color = "cargo"
+ item_color = "cargo"
/obj/item/weapon/stamp/captain
name = "captain's rubber stamp"
icon_state = "stamp-cap"
- _color = "captain"
+ item_color = "captain"
/obj/item/weapon/stamp/hop
name = "head of personnel's rubber stamp"
icon_state = "stamp-hop"
- _color = "hop"
+ item_color = "hop"
/obj/item/weapon/stamp/hos
name = "head of security's rubber stamp"
icon_state = "stamp-hos"
- _color = "hosred"
+ item_color = "hosred"
/obj/item/weapon/stamp/ce
name = "chief engineer's rubber stamp"
icon_state = "stamp-ce"
- _color = "chief"
+ item_color = "chief"
/obj/item/weapon/stamp/rd
name = "research director's rubber stamp"
icon_state = "stamp-rd"
- _color = "director"
+ item_color = "director"
/obj/item/weapon/stamp/cmo
name = "chief medical officer's rubber stamp"
icon_state = "stamp-cmo"
- _color = "medical"
+ item_color = "medical"
/obj/item/weapon/stamp/granted
name = "\improper GRANTED rubber stamp"
icon_state = "stamp-ok"
- _color = "qm"
+ item_color = "qm"
/obj/item/weapon/stamp/denied
name = "\improper DENIED rubber stamp"
icon_state = "stamp-deny"
- _color = "redcoat"
+ item_color = "redcoat"
/obj/item/weapon/stamp/clown
name = "clown's rubber stamp"
icon_state = "stamp-clown"
- _color = "clown"
+ item_color = "clown"
/obj/item/weapon/stamp/centcom
name = "Nanotrasen Representative's rubber stamp"
icon_state = "stamp-cent"
- _color = "centcom"
+ item_color = "centcom"
/obj/item/weapon/stamp/syndicate
name = "suspicious rubber stamp"
icon_state = "stamp-syndicate"
- _color = "syndicate"
+ item_color = "syndicate"
// Syndicate stamp to forge documents.
@@ -105,4 +105,4 @@
if(chosen_stamp)
name = chosen_stamp.name
icon_state = chosen_stamp.icon_state
- _color = chosen_stamp._color
\ No newline at end of file
+ item_color = chosen_stamp.item_color
\ No newline at end of file
diff --git a/code/modules/pooling/atom_pool.dm b/code/modules/pooling/atom_pool.dm
deleted file mode 100644
index c5d11f6b599..00000000000
--- a/code/modules/pooling/atom_pool.dm
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
-/tg/station13 /atom/movable Pool:
----------------------------------
-By RemieRichards
-Creation/Deletion is laggy, so let's reduce reuse and recycle!
-Locked to /atom/movable and it's subtypes due to Loc being a const var on /atom
-but being read&write on /movable due to how they... move.
-Usage:
-To get a object, just called PoolOrNew(type, list of args to pass to New)
-To put a object back in the pool, call place in pool.
-This will call destroy on the object, set its loc to null,
-and reset all of its vars to their default
-You can override your object's destroy to return QDEL_HINT_PLACEINPOOL
-to ensure its always placed in this pool (this will only be acted on if qdel calls destroy, and destroy will not get called twice)
-*/
-
-var/global/list/GlobalPool = list()
-
-//You'll be using this proc 90% of the time.
-//It grabs a type from the pool if it can
-//And if it can't, it creates one
-//The pool is flexible and will expand to fit
-//The new created atom when it eventually
-//Goes into the pool
-
-//Second argument can be a new location
-//Or a list of arguments
-//Either way it gets passed to new
-
-/proc/PoolOrNew(var/get_type,var/second_arg)
- if(!get_type)
- return
-
- var/atom/movable/AM
- AM = GetFromPool(get_type,second_arg)
-
- if(!AM)
- if(ispath(get_type))
- if(islist(second_arg))
- AM = new get_type (arglist(second_arg))
- else
- AM = new get_type (second_arg)
-
- if(AM)
- return AM
-
-
-
-/proc/GetFromPool(var/get_type,var/second_arg)
- if(!get_type)
- return 0
-
- if(isnull(GlobalPool[get_type]))
- return 0
-
- if(length(GlobalPool[get_type]) == 0)
- return 0
-
- var/atom/movable/AM = pick_n_take(GlobalPool[get_type])
- if(AM)
- AM.ResetVars()
- if(islist(second_arg))
- AM.loc = second_arg[1]
- AM.New(arglist(second_arg))
- else
- AM.loc = second_arg
- AM.New(second_arg)
- return AM
- return 0
-
-
-
-/proc/PlaceInPool(var/atom/movable/AM, destroy = 1)
- if(!istype(AM))
- return
-
- if(AM in GlobalPool[AM.type])
- return
-
- if(!GlobalPool[AM.type])
- GlobalPool[AM.type] = list()
-
- GlobalPool[AM.type] |= AM
-
- if (destroy)
- AM.Destroy()
-
- AM.ResetVars()
-
-
-
-/atom/movable/proc/ResetVars()
- var/list/excluded = list("animate_movement", "loc", "locs", "parent_type", "vars", "verbs", "type")
-
- for(var/V in vars)
- if(V in excluded)
- continue
-
- vars[V] = initial(vars[V])
-
- vars["loc"] = null
diff --git a/code/modules/pooling/pool.dm b/code/modules/pooling/pool.dm
new file mode 100644
index 00000000000..048940cfb51
--- /dev/null
+++ b/code/modules/pooling/pool.dm
@@ -0,0 +1,114 @@
+
+/*
+/tg/station13 /datum Pool:
+---------------------------------
+By RemieRichards
+
+Creation/Deletion is laggy, so let's reduce reuse and recycle!
+
+Usage:
+
+To get a object, just call
+ - PoolOrNew(type, arg) if you only want to pass one argument to New(), usually loc
+ - PoolOrNew(type, list) if you want to pass multiple arguments to New()
+
+To put a object back in the pool, call PlaceInPool(object)
+This will call destroy on the object, set its loc to null,
+and reset all of its vars to their default
+
+You can override your object's destroy to return QDEL_HINT_PLACEINPOOL
+to ensure its always placed in this pool (this will only be acted on if qdel calls destroy, and destroy will not get called twice)
+
+*/
+
+var/global/list/GlobalPool = list()
+
+//You'll be using this proc 90% of the time.
+//It grabs a type from the pool if it can
+//And if it can't, it creates one
+//The pool is flexible and will expand to fit
+//The new created atom when it eventually
+//Goes into the pool
+
+//Second argument can be a single arg
+//Or a list of arguments
+//Either way it gets passed to new
+
+/proc/PoolOrNew(get_type,second_arg)
+ if(!get_type)
+ return
+
+ . = GetFromPool(get_type,second_arg)
+
+ if(!.)
+ if(ispath(get_type))
+ if(islist(second_arg))
+ . = new get_type (arglist(second_arg))
+ else
+ . = new get_type (second_arg)
+
+
+/proc/GetFromPool(get_type,second_arg)
+ if(!get_type)
+ return
+
+ if(isnull(GlobalPool[get_type]))
+ return
+
+ if(length(GlobalPool[get_type]) == 0)
+ return
+
+ var/datum/pooled = pop(GlobalPool[get_type])
+ if(pooled)
+ var/atom/movable/AM
+ if(istype(pooled, /atom/movable))
+ AM = pooled
+
+ if(islist(second_arg))
+ if(AM)
+ AM.loc = second_arg[1] //we need to do loc setting explicetly before even calling New() to replicate new()'s behavior
+ pooled.New(arglist(second_arg))
+
+ else
+ if(AM)
+ AM.loc = second_arg
+ pooled.New(second_arg)
+
+ return pooled
+
+
+/proc/PlaceInPool(datum/diver, destroy = 1)
+ if(!istype(diver))
+ return
+
+ if(diver in GlobalPool[diver.type])
+ return
+
+ if(!GlobalPool[diver.type])
+ GlobalPool[diver.type] = list()
+
+ GlobalPool[diver.type] |= diver
+
+ if (destroy)
+ diver.Destroy()
+
+ diver.ResetVars()
+
+
+/datum/proc/ResetVars()
+ var/list/excluded = list("animate_movement", "contents", "loc", "locs", "parent_type", "vars", "verbs", "type")
+
+ for(var/V in vars)
+ if(V in excluded)
+ continue
+
+ vars[V] = initial(vars[V])
+
+/atom/movable/ResetVars()
+ ..()
+ loc = null
+ contents = initial(contents) //something is really wrong if this object still has stuff in it by this point
+
+/image/ResetVars()
+ ..()
+ loc = null
\ No newline at end of file
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 05e5bbbe73b..41e294eba58 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -160,6 +160,7 @@
wires = null
if(cell)
qdel(cell) // qdel
+ cell = null
if(terminal)
disconnect_terminal()
return ..()
diff --git a/code/modules/projectiles/targeting.dm b/code/modules/projectiles/targeting.dm
index c3f7b695ef5..5b4811a0486 100644
--- a/code/modules/projectiles/targeting.dm
+++ b/code/modules/projectiles/targeting.dm
@@ -74,7 +74,7 @@
var/mob/living/M = loc
if(M == T) return
if(!istype(M)) return
- if(src != M.equipped())
+ if(src != M.get_active_hand())
stop_aim()
return
M.last_move_intent = world.time
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index e0127fe9862..7707a257634 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -191,7 +191,7 @@
if(href_list["ejectBeaker"])
if(beaker)
var/obj/item/weapon/reagent_containers/glass/B = beaker
- B.loc = loc
+ B.forceMove(loc)
beaker = null
overlays.Cut()
add_fingerprint(usr)
@@ -202,33 +202,35 @@
return
if(broken_requirements.len && B.type == broken_requirements[1])
- broken_requirements -= broken_requirements[1]
- user << "You fix [src]."
if(istype(B,/obj/item/stack))
var/obj/item/stack/S = B
S.use(1)
else
- user.drop_item()
+ if(!user.drop_item())
+ user << "\The [B] is stuck to you!"
+ return
qdel(B)
+ broken_requirements -= broken_requirements[1]
+ user << "You fix [src]."
return
if(src.beaker)
- user << "Something is already loaded into the machine."
+ user << "Something is already loaded into the machine."
return
if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks))
src.beaker = B
- if(user.drop_item())
- B.forceMove(src)
- user << "You set [B] on the machine."
- nanomanager.update_uis(src) // update all UIs attached to src
- if(!icon_beaker)
- icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position.
- icon_beaker.pixel_x = rand(-10,5)
- overlays += icon_beaker
+ if(!user.drop_item())
+ user << "\The [B] is stuck to you!"
return
- else
- user << "\The [B] is stuck to you!"
+ B.forceMove(src)
+ user << "You set [B] on the machine."
+ nanomanager.update_uis(src) // update all UIs attached to src
+ if(!icon_beaker)
+ icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position.
+ icon_beaker.pixel_x = rand(-10,5)
+ overlays += icon_beaker
+ return
/obj/machinery/chem_dispenser/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob, params)
..()
@@ -358,16 +360,16 @@
playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
if(anchored)
anchored = 0
- user << "The [src] can now be moved."
+ user << "\The [src] can now be moved."
else if(!anchored)
anchored = 1
- user << "The [src] is now secured."
+ user << "\The [src] is now secured."
if(panel_open)
if(istype(I, /obj/item/weapon/crowbar))
if(beaker)
var/obj/item/weapon/reagent_containers/glass/B = beaker
- B.loc = loc
+ B.forceMove(loc)
beaker = null
default_deconstruction_crowbar(I)
return 1
@@ -427,25 +429,29 @@
if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass))
if(src.beaker)
- user << "A beaker is already loaded into the machine."
+ user << "A beaker is already loaded into the machine."
+ return
+ if(!user.drop_item())
+ user << "\The [B] is stuck to you!"
return
src.beaker = B
- user.drop_item()
- B.loc = src
- user << "You add the beaker to the machine!"
+ B.forceMove(src)
+ user << "You add the beaker to the machine!"
src.updateUsrDialog()
icon_state = "mixer1"
else if(istype(B, /obj/item/weapon/storage/pill_bottle))
if(src.loaded_pill_bottle)
- user << "A pill bottle is already loaded into the machine."
+ user << "A pill bottle is already loaded into the machine."
return
+ if(!user.drop_item())
+ user << "\The [B] is stuck to you!"
+ return
src.loaded_pill_bottle = B
- user.drop_item()
- B.loc = src
- user << "You add the pill bottle into the dispenser slot!"
+ B.forceMove(src)
+ user << "You add the pill bottle into the dispenser slot!"
src.updateUsrDialog()
return
@@ -459,7 +465,7 @@
if (href_list["ejectp"])
if(loaded_pill_bottle)
- loaded_pill_bottle.loc = src.loc
+ loaded_pill_bottle.forceMove(src.loc)
loaded_pill_bottle = null
else if(href_list["close"])
usr << browse(null, "window=chem_master")
@@ -579,7 +585,7 @@
reagents.trans_to(P,amount_per_pill)
if(src.loaded_pill_bottle)
if(loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots)
- P.loc = loaded_pill_bottle
+ P.forceMove(loaded_pill_bottle)
src.updateUsrDialog()
else
var/name = reject_bad_text(input(usr,"Name:","Name your bag!",reagents.get_master_reagent_name()))
@@ -816,15 +822,17 @@
if (beaker)
return 1
else
+ if(!user.drop_item())
+ user << "\The [O] is stuck to you!"
+ return
src.beaker = O
- user.drop_item()
- O.loc = src
+ O.forceMove(src)
update_icon()
src.updateUsrDialog()
return 0
if(holdingitems && holdingitems.len >= limit)
- usr << "The machine cannot hold anymore items."
+ usr << "The machine cannot hold anymore items."
return 1
//Fill machine with the plantbag!
@@ -832,25 +840,25 @@
for (var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents)
O.contents -= G
- G.loc = src
+ G.forceMove(src)
holdingitems += G
if(holdingitems && holdingitems.len >= limit) //Sanity checking so the blender doesn't overfill
- user << "You fill the All-In-One grinder to the brim."
+ user << "You empty the plant bag into the All-In-One grinder."
src.updateUsrDialog()
return 0
if (!is_type_in_list(O, blend_items) && !is_type_in_list(O, juice_items))
- user << "Cannot refine into a reagent."
+ user << "Cannot refine into a reagent."
return 1
user.unEquip(O)
- O.loc = src
+ O.forceMove(src)
holdingitems += O
src.updateUsrDialog()
return 0
@@ -929,7 +937,7 @@
return
if (!beaker)
return
- beaker.loc = src.loc
+ beaker.forceMove(src.loc)
beaker = null
update_icon()
@@ -941,7 +949,7 @@
return
for(var/obj/item/O in holdingitems)
- O.loc = src.loc
+ O.forceMove(src.loc)
holdingitems -= O
holdingitems = list()
@@ -1146,4 +1154,4 @@
var/amount = O.reagents.total_volume
O.reagents.trans_to(beaker, amount)
if(!O.reagents.total_volume)
- remove_object(O)
+ remove_object(O)
\ No newline at end of file
diff --git a/code/modules/reagents/dartgun.dm b/code/modules/reagents/dartgun.dm
index 6affdf1f8b7..52b297d88eb 100644
--- a/code/modules/reagents/dartgun.dm
+++ b/code/modules/reagents/dartgun.dm
@@ -60,11 +60,11 @@
/obj/item/weapon/gun/dartgun/examine(mob/user)
if(..(user, 2))
if(beakers.len)
- user << "\blue [src] contains:"
+ user << "[R.volume] units of [R.name]"
/obj/item/weapon/gun/dartgun/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I, /obj/item/weapon/dart_cartridge))
@@ -72,34 +72,36 @@
var/obj/item/weapon/dart_cartridge/D = I
if(!D.darts)
- user << "\blue [D] is empty."
+ user << "[D] is empty."
return 0
if(cartridge)
if(cartridge.darts <= 0)
src.remove_cartridge()
else
- user << "\blue There's already a cartridge in [src]."
+ user << "There's already a cartridge in [src]."
return 0
user.drop_item()
cartridge = D
- D.loc = src
- user << "\blue You slot [D] into [src]."
+ D.forceMove(src)
+ user << "You slot [D] into [src]."
update_icon()
return
if(istype(I, /obj/item/weapon/reagent_containers/glass))
if(!istype(I, container_type))
- user << "\blue [I] doesn't seem to fit into [src]."
+ user << "[I] doesn't seem to fit into [src]."
return
if(beakers.len >= max_beakers)
- user << "\blue [src] already has [max_beakers] beakers in it - another one isn't going to fit!"
+ user << "[src] already has [max_beakers] beakers in it - another one isn't going to fit!"
return
var/obj/item/weapon/reagent_containers/glass/beaker/B = I
- user.drop_item()
- B.loc = src
+ if(!user.drop_item())
+ user << "\The [B] is stuck to you!"
+ return
+ B.forceMove(src)
beakers += B
- user << "\blue You slot [B] into [src]."
+ user << "You pop the cartridge out of [src]."
var/obj/item/weapon/dart_cartridge/C = cartridge
- C.loc = get_turf(src)
+ C.forceMove(get_turf(src))
C.update_icon()
cartridge = null
src.update_icon()
@@ -143,10 +145,10 @@
var/obj/effect/syringe_gun_dummy/D = new/obj/effect/syringe_gun_dummy(get_turf(src))
var/obj/item/weapon/reagent_containers/syringe/S = get_mixed_syringe()
if(!S)
- user << "\red There are no darts in [src]!"
+ user << "There are no darts in [src]!"
return
if(!S.reagents)
- user << "\red There are no reagents available!"
+ user << "There are no reagents available!"
return
cartridge.darts--
src.update_icon()
@@ -269,10 +271,10 @@
if(index <= beakers.len)
if(beakers[index])
var/obj/item/weapon/reagent_containers/glass/beaker/B = beakers[index]
- usr << "You remove [B] from [src]."
+ usr << "You remove [B] from [src]."
mixing -= B
beakers -= B
- B.loc = get_turf(src)
+ B.forceMove(get_turf(src))
else if (href_list["eject_cart"])
remove_cartridge()
src.updateUsrDialog()
@@ -282,7 +284,7 @@
if(cartridge)
spawn(0) fire_dart(target,user)
else
- usr << "\red [src] is empty."
+ usr << "[src] is empty."
/obj/item/weapon/gun/dartgun/vox
diff --git a/code/modules/reagents/newchem/chem_heater.dm b/code/modules/reagents/newchem/chem_heater.dm
index be04e4d8d0a..e6e4ca61958 100644
--- a/code/modules/reagents/newchem/chem_heater.dm
+++ b/code/modules/reagents/newchem/chem_heater.dm
@@ -53,7 +53,7 @@
/obj/machinery/chem_heater/proc/eject_beaker()
if(beaker)
- beaker.loc = get_turf(src)
+ beaker.forceMove(get_turf(src))
beaker.reagents.handle_reactions()
beaker = null
icon_state = "mixer0b"
@@ -79,7 +79,7 @@
if(user.drop_item())
beaker = I
- I.loc = src
+ I.forceMove(src)
user << "You add the beaker to the machine!"
icon_state = "mixer1b"
nanomanager.update_uis(src)
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index f34c8aa8eb3..e723005e60e 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -12,6 +12,7 @@
var/charge_cost = 50
var/charge_tick = 0
var/recharge_time = 5 //Time it takes for shots to recharge (in seconds)
+ var/bypass_protection = 0 //If the hypospray can go through armor or thick material
var/list/datum/reagents/reagent_list = list()
var/list/reagent_ids = list("salglu_solution", "epinephrine", "spaceacillin", "charcoal")
@@ -30,6 +31,7 @@
charge_cost = 20
recharge_time = 2
reagent_ids = list("syndicate_nanites", "potass_iodide", "ether")
+ bypass_protection = 1
/obj/item/weapon/reagent_containers/borghypo/New()
..()
@@ -74,7 +76,7 @@
return
if (!istype(M))
return
- if (R.total_volume && M.can_inject(user,1))
+ if (R.total_volume && M.can_inject(user, 1, penetrate_thick = bypass_protection))
user << "You inject [M] with the injector."
M << "You feel a tiny prick!"
diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm
index 4e4eee07c0e..9e2bca5edcb 100644
--- a/code/modules/reagents/reagent_containers/food/drinks.dm
+++ b/code/modules/reagents/reagent_containers/food/drinks.dm
@@ -69,11 +69,12 @@
reagents.trans_to(M, gulp_size)
if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell
- var/mob/living/silicon/robot/bro = user
- bro.cell.use(30)
+ var/mob/living/silicon/robot/borg = user
+ borg.cell.use(30)
var/refill = R.get_master_reagent_id()
- spawn(600)
- R.add_reagent(refill, fillevel)
+ if(refill in drinks) // Only synthesize drinks
+ spawn(600)
+ R.add_reagent(refill, fillevel)
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
return 1
@@ -125,15 +126,16 @@
user << "\blue You transfer [trans] units of the solution to [target]."
if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell
- var/mob/living/silicon/robot/bro = user
- var/chargeAmount = max(30,4*trans)
- bro.cell.use(chargeAmount)
- user << "Now synthesizing [trans] units of [refillName]..."
+ if(refill in drinks) // Only synthesize drinks
+ var/mob/living/silicon/robot/bro = user
+ var/chargeAmount = max(30,4*trans)
+ bro.cell.use(chargeAmount)
+ user << "Now synthesizing [trans] units of [refillName]..."
- spawn(300)
- reagents.add_reagent(refill, trans)
- user << "Cyborg [src] refilled."
+ spawn(300)
+ reagents.add_reagent(refill, trans)
+ user << "Cyborg [src] refilled."
return
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index ee79e2e64bc..6f12c03c6a8 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -567,41 +567,41 @@
usr << "\blue You color \the [src] [clr]"
icon_state = "egg-[clr]"
- _color = clr
+ item_color = clr
else
..()
/obj/item/weapon/reagent_containers/food/snacks/egg/blue
icon_state = "egg-blue"
- _color = "blue"
+ item_color = "blue"
/obj/item/weapon/reagent_containers/food/snacks/egg/green
icon_state = "egg-green"
- _color = "green"
+ item_color = "green"
/obj/item/weapon/reagent_containers/food/snacks/egg/mime
icon_state = "egg-mime"
- _color = "mime"
+ item_color = "mime"
/obj/item/weapon/reagent_containers/food/snacks/egg/orange
icon_state = "egg-orange"
- _color = "orange"
+ item_color = "orange"
/obj/item/weapon/reagent_containers/food/snacks/egg/purple
icon_state = "egg-purple"
- _color = "purple"
+ item_color = "purple"
/obj/item/weapon/reagent_containers/food/snacks/egg/rainbow
icon_state = "egg-rainbow"
- _color = "rainbow"
+ item_color = "rainbow"
/obj/item/weapon/reagent_containers/food/snacks/egg/red
icon_state = "egg-red"
- _color = "red"
+ item_color = "red"
/obj/item/weapon/reagent_containers/food/snacks/egg/yellow
icon_state = "egg-yellow"
- _color = "yellow"
+ item_color = "yellow"
/obj/item/weapon/reagent_containers/food/snacks/friedegg
name = "Fried egg"
diff --git a/code/modules/reagents/reagent_containers/glass/bottle/robot.dm b/code/modules/reagents/reagent_containers/glass/bottle/robot.dm
index cb6a7cb0a8a..6a8eb261bb4 100644
--- a/code/modules/reagents/reagent_containers/glass/bottle/robot.dm
+++ b/code/modules/reagents/reagent_containers/glass/bottle/robot.dm
@@ -14,11 +14,10 @@
icon_state = "bottle16"
reagent = "epinephrine"
- New()
- ..()
- reagents.add_reagent("epinephrine", 60)
- return
-
+/obj/item/weapon/reagent_containers/glass/bottle/robot/epinephrine/New()
+ ..()
+ reagents.add_reagent("epinephrine", 60)
+ return
/obj/item/weapon/reagent_containers/glass/bottle/robot/charcoal
name = "internal charcoal bottle"
@@ -27,7 +26,7 @@
icon_state = "bottle17"
reagent = "charcoal"
- New()
- ..()
- reagents.add_reagent("charcoal", 60)
- return
\ No newline at end of file
+/obj/item/weapon/reagent_containers/glass/bottle/robot/charcoal/New()
+ ..()
+ reagents.add_reagent("charcoal", 60)
+ return
\ No newline at end of file
diff --git a/code/modules/vehicle/train/train.dm b/code/modules/vehicle/train/train.dm
index cf318c04a64..33021d80e06 100644
--- a/code/modules/vehicle/train/train.dm
+++ b/code/modules/vehicle/train/train.dm
@@ -2,7 +2,7 @@
name = "train"
dir = 4
- move_delay = 1
+ move_delay = 2
health = 100
maxhealth = 100
diff --git a/code/modules/vehicle/train/trains/ambulance.dm b/code/modules/vehicle/train/trains/ambulance.dm
index 813a2a918aa..fea50fba521 100644
--- a/code/modules/vehicle/train/trains/ambulance.dm
+++ b/code/modules/vehicle/train/trains/ambulance.dm
@@ -13,14 +13,7 @@
var/car_limit = 3 //how many cars an engine can pull before performance degrades
active_engines = 1
- var/obj/item/weapon/key/ambulance_train/key
-
-/obj/item/weapon/key/ambulance_train
- name = "ambulance key"
- desc = "A keyring with a small steel key, and tag with a red cross on it."
- icon = 'icons/obj/vehicles.dmi'
- icon_state = "keydoc"
- w_class = 1
+ var/obj/item/key/ambulance/key
/obj/vehicle/train/ambulance/trolley
name = "ambulance train trolley"
@@ -56,7 +49,7 @@
..()
/obj/vehicle/train/ambulance/engine/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/weapon/key/ambulance_train))
+ if(istype(W, /obj/item/key/ambulance))
if(!key)
user.drop_item()
key = W
@@ -174,7 +167,6 @@
else
return ..()
-
/obj/vehicle/train/ambulance/engine/examine(mob/user)
if(..(user, 1))
user << "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition."
@@ -287,5 +279,5 @@
else
move_delay = max(0, (-car_limit * active_engines) + train_length - active_engines) //limits base overweight so you cant overspeed trains
move_delay *= (1 / max(1, active_engines)) * 2 //overweight penalty (scaled by the number of engines)
- move_delay += config.run_speed //base reference speed
+ move_delay += 1+config.run_speed //base reference speed
move_delay *= 1.05
diff --git a/code/modules/virus2/centrifuge.dm b/code/modules/virus2/centrifuge.dm
index 9573e08ea50..79c7096ec64 100644
--- a/code/modules/virus2/centrifuge.dm
+++ b/code/modules/virus2/centrifuge.dm
@@ -18,9 +18,12 @@
user << "\The [src] is already loaded."
return
+ if(!user.drop_item())
+ user << "\The [O] is stuck to you!"
+ return
+
sample = O
- user.drop_item()
- O.loc = src
+ O.forceMove(src)
user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!")
nanomanager.update_uis(src)
@@ -140,7 +143,7 @@
if("sample")
if(sample)
- sample.loc = src.loc
+ sample.forceMove(src.loc)
sample = null
return 1
@@ -210,4 +213,4 @@
Additional Notes:
"}
- state("The nearby computer prints out a pathology report.")
+ state("The nearby computer prints out a pathology report.")
\ No newline at end of file
diff --git a/code/modules/virus2/curer.dm b/code/modules/virus2/curer.dm
index 054f56c8cd4..1db66e49fa4 100644
--- a/code/modules/virus2/curer.dm
+++ b/code/modules/virus2/curer.dm
@@ -11,14 +11,13 @@
/obj/machinery/computer/curer/attackby(var/obj/I as obj, var/mob/user as mob, params)
if(istype(I,/obj/item/weapon/reagent_containers))
var/mob/living/carbon/C = user
- if(!container)
+ if(!container && C.drop_item())
container = I
- C.drop_item()
- I.loc = src
+ I.forceMove(src)
return
if(istype(I,/obj/item/weapon/virusdish))
if(virusing)
- user << "The pathogen materializer is still recharging.."
+ user << "The pathogen materializer is still recharging.."
return
var/obj/item/weapon/reagent_containers/glass/beaker/product = new(src.loc)
@@ -88,7 +87,7 @@
if (href_list["antibody"])
curing = 10
else if(href_list["eject"])
- container.loc = src.loc
+ container.forceMove(src.loc)
container = null
src.add_fingerprint(usr)
@@ -105,4 +104,4 @@
data["antibodies"] = B.data["antibodies"]
product.reagents.add_reagent("antibodies",30,data)
- state("\The [src.name] buzzes", "blue")
+ state("\The [src.name] buzzes", "blue")
\ No newline at end of file
diff --git a/code/modules/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm
index cc79387c7e6..844528e7ed6 100644
--- a/code/modules/virus2/dishincubator.dm
+++ b/code/modules/virus2/dishincubator.dm
@@ -18,12 +18,15 @@
if(istype(O, /obj/item/weapon/reagent_containers/glass) || istype(O,/obj/item/weapon/reagent_containers/syringe))
if(beaker)
- user << "\The [src] is already loaded."
+ user << "\The [src] is already loaded."
+ return
+
+ if(!user.drop_item())
+ user << "\The [O] is stuck to you!"
return
beaker = O
- user.drop_item()
- O.loc = src
+ O.forceMove(src)
user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!")
nanomanager.update_uis(src)
@@ -37,9 +40,11 @@
user << "The dish tray is aleady full!"
return
+ if(!user.drop_item())
+ user << "\The [O] is stuck to you!"
+ return
dish = O
- user.drop_item()
- O.loc = src
+ O.forceMove(src)
user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!")
nanomanager.update_uis(src)
@@ -152,7 +157,7 @@
if (href_list["ejectchem"])
if(beaker)
- beaker.loc = src.loc
+ beaker.forceMove(src.loc)
beaker = null
return 1
@@ -164,7 +169,7 @@
if (href_list["ejectdish"])
if(dish)
- dish.loc = src.loc
+ dish.forceMove(src.loc)
dish = null
return 1
@@ -200,4 +205,4 @@
ping("\The [src] pings, \"Injection complete.\"")
return 1
- return 0
+ return 0
\ No newline at end of file
diff --git a/code/world.dm b/code/world.dm
index 14b23b525b5..9062500b0d8 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -219,8 +219,8 @@ var/world_topic_spam_protect_time = world.timeofday
world << "Rebooting world immediately due to host request"
return ..(1)
var/delay
- if(time)
- delay = time
+ if(!isnull(time))
+ delay = max(0,time)
else
delay = ticker.restart_timeout
if(ticker.delay_end)
diff --git a/config/example/space_levels.txt b/config/example/space_levels.txt
index e724264daac..d40624bb64d 100644
--- a/config/example/space_levels.txt
+++ b/config/example/space_levels.txt
@@ -10,6 +10,4 @@ Mining Asteroid;5;linked
Derelicted Station;6;linked
-Empty Area;7;linked
-
-Syndicate Station;8;unlinked
\ No newline at end of file
+Empty Area;7;linked
\ No newline at end of file
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index b844e40addc..7aec18d1dcd 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi
index 50405159f34..cb002637bb7 100644
Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ
diff --git a/nano/templates/aicard.tmpl b/nano/templates/aicard.tmpl
new file mode 100644
index 00000000000..0cf123de8ad
--- /dev/null
+++ b/nano/templates/aicard.tmpl
@@ -0,0 +1,98 @@
+
+
+
+
+
+{{if data.has_ai}}
+
+
+ Hardware Integrity:
+
+
+ {{:data.hardware_integrity}}%
+
+
+
+ {{if data.has_laws}}
+
+ | Index | Law |
+
+
+ Laws:
+
+ {{for data.laws}}
+ | {{:value.index}}. | {{:value.law}} |
+ {{/for}}
+
+ {{else}}
+ No laws found.
+ {{/if}}
+
+ {{if data.operational}}
+
+
+ | Radio Subspace Transceiver |
+ {{:helper.link("Enabled", null, {'radio' : 0}, data.radio ? 'selected' : null)}} |
+ {{:helper.link("Disabled", null, {'radio' : 1}, data.radio ? null : 'redButton' )}} |
+
+ | Wireless Interface |
+ {{:helper.link("Enabled", null, {'wireless' : 0}, data.wireless ? 'selected' : null)}} |
+ {{:helper.link("Disabled", null, {'wireless' : 1}, data.wireless ? null : 'redButton' )}} |
+
+ {{if data.flushing}}
+ | AI wipe in progress... |
+ {{else}}
+
+ | Wipe AI |
+ {{:helper.link("Wipe", 'radiation', {'wipe' : 1}, null, 'redButton')}} |
+
+ {{/if}}
+
+ {{/if}}
+{{else}}
+ Stored AI: No AI detected.
+{{/if}}
diff --git a/nano/templates/canister.tmpl b/nano/templates/canister.tmpl
index 06dfbd2ae27..9ddef45b098 100644
--- a/nano/templates/canister.tmpl
+++ b/nano/templates/canister.tmpl
@@ -98,7 +98,7 @@
{{:data.colorContainer.prim.name}}
{{for data.colorContainer.prim.options}}
- {{if value.icon == data._color.prim}}
+ {{if value.icon == data.canister_color.prim}}
{{:helper.link(value.name, '', {'choice' : data.colorContainer.prim.name, 'icon' : value.icon}, data.canLabel ? null : 'disabled', 'selected')}}
{{else}}
{{:helper.link(value.name, '', {'choice' : data.colorContainer.prim.name, 'icon' : value.icon}, data.canLabel ? null : 'disabled', null)}}
@@ -111,7 +111,7 @@
{{:helper.link("None", '', {'choice' : data.colorContainer.sec.name, 'icon' : "none"}, data.canLabel ? null : 'disabled', data.colorContainer.sec.anycolor ? null : 'selected')}}
{{for data.colorContainer.sec.options}}
- {{if value.icon == data._color.sec}}
+ {{if value.icon == data.canister_color.sec}}
{{:helper.link(value.name, '', {'choice' : data.colorContainer.sec.name, 'icon' : value.icon}, data.canLabel ? null : 'disabled', 'selected')}}
{{else}}
{{:helper.link(value.name, '', {'choice' : data.colorContainer.sec.name, 'icon' : value.icon}, data.canLabel ? null : 'disabled', null)}}
@@ -124,7 +124,7 @@
{{:helper.link("None", '', {'choice' : data.colorContainer.ter.name, 'icon' : "none"}, data.canLabel ? null : 'disabled', data.colorContainer.ter.anycolor ? null : 'selected')}}
{{for data.colorContainer.ter.options}}
- {{if value.icon == data._color.ter}}
+ {{if value.icon == data.canister_color.ter}}
{{:helper.link(value.name, '', {'choice' : data.colorContainer.ter.name, 'icon' : value.icon}, data.canLabel ? null : 'disabled', 'selected')}}
{{else}}
{{:helper.link(value.name, '', {'choice' : data.colorContainer.ter.name, 'icon' : value.icon}, data.canLabel ? null : 'disabled', null)}}
@@ -137,7 +137,7 @@
{{:helper.link("None", '', {'choice' : data.colorContainer.quart.name, 'icon' : "none"}, data.canLabel ? null : 'disabled', data.colorContainer.quart.anycolor ? null : 'selected')}}
{{for data.colorContainer.quart.options}}
- {{if value.icon == data._color.quart}}
+ {{if value.icon == data.canister_color.quart}}
{{:helper.link(value.name, '', {'choice' : data.colorContainer.quart.name, 'icon' : value.icon}, data.canLabel ? null : 'disabled', 'selected')}}
{{else}}
{{:helper.link(value.name, '', {'choice' : data.colorContainer.quart.name, 'icon' : value.icon}, data.canLabel ? null : 'disabled', null)}}
diff --git a/nano/templates/radio_basic.tmpl b/nano/templates/radio_basic.tmpl
new file mode 100644
index 00000000000..9aaad8cb489
--- /dev/null
+++ b/nano/templates/radio_basic.tmpl
@@ -0,0 +1,89 @@
+
+{{if data.useSyndMode}}
+ {{:helper.syndicateMode()}}
+{{/if}}
+
+
+
+ Microphone
+
+
+ {{if data.mic_cut}}
+ {{:helper.link('On', null, null, 'disabled')}}
+ {{:helper.link('Off', null, null, 'disabled')}}
+ {{else}}
+ {{:helper.link('On', null, {'talk' : 0}, data.mic_status ? 'selected' : null)}}
+ {{:helper.link('Off', null, {'talk' : 1}, data.mic_status ? null : 'selected')}}
+ {{/if}}
+
+
+
+
+
+ Speaker
+
+
+ {{if data.spk_cut}}
+ {{:helper.link('On', null, null, 'disabled')}}
+ {{:helper.link('Off', null, null, 'disabled')}}
+ {{else}}
+ {{:helper.link('On', null, {'listen' : 0}, data.speaker ? 'selected' : null)}}
+ {{:helper.link('Off', null, {'listen' : 1}, data.speaker ? null : 'selected')}}
+ {{/if}}
+
+
+
+{{if data.has_subspace}}
+
+ Subspace Transmission:
+
+
+ {{:helper.link('On', null, {'mode' : 1}, data.subspace ? 'selected' : null)}}
+ {{:helper.link('Off', null, {'mode' : 0}, data.subspace ? null : 'selected')}}
+
+{{/if}}
+
+{{if data.has_loudspeaker}}
+
+ Loudspeaker:
+
+
+ {{:helper.link('On', null, {'shutup' : 0}, data.loudspeaker ? 'selected' : null)}}
+ {{:helper.link('Off', null, {'shutup' : 1}, data.loudspeaker ? null : 'selected')}}
+
+{{/if}}
+
+
+
+ Frequency: {{:data.freq}}
+
+
+ {{:helper.link('--', null, {'freq' : -10})}}
+ {{:helper.link('-', null, {'freq' : -2})}}
+ {{:helper.link('+', null, {'freq' : 2})}}
+ {{:helper.link('++', null, {'freq' : 10})}}
+
+
+
+{{if data.chan_list_len >= 1}}
+
Channels
+
+ {{for data.chan_list}}
+
+ {{:value.display_name}}
+
+
+ {{if value.secure_channel}}
+ Speaker:
+ {{:helper.link('On', null, {'ch_name' : value.chan, 'listen' : value.sec_channel_listen}, value.sec_channel_listen ? null : 'selected')}}
+ {{:helper.link('Off', null, {'ch_name' : value.chan, 'listen' : value.sec_channel_listen}, value.sec_channel_listen ? 'selected' : null)}}
+ {{else}}
+ {{:helper.link('Switch', null, {'spec_freq' : value.chan}, data.rawfreq == value.chan ? 'selected' : null)}}
+ {{/if}}
+
+ {{/for}}
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/radio_electro.tmpl b/nano/templates/radio_electro.tmpl
new file mode 100644
index 00000000000..9fb8183ad01
--- /dev/null
+++ b/nano/templates/radio_electro.tmpl
@@ -0,0 +1,37 @@
+
+
+
+ Power
+
+
+ {{:helper.link('On', null, {'power' : 1}, data.power ? 'selected' : null)}}
+ {{:helper.link('Off', null, {'power' : 1}, data.power ? null : 'selected')}}
+
+
+
+
+
+ Frequency: {{:data.freq}}
+
+
+ {{:helper.link('--', null, {'freq' : -10})}}
+ {{:helper.link('-', null, {'freq' : -2})}}
+ {{:helper.link('+', null, {'freq' : 2})}}
+ {{:helper.link('++', null, {'freq' : 10})}}
+
+
+
+
+
+ Code: {{:data.code}}
+
+
+ {{:helper.link('--', null, {'code' : -5})}}
+ {{:helper.link('-', null, {'code' : -1})}}
+ {{:helper.link('+', null, {'code' : 1})}}
+ {{:helper.link('++', null, {'code' : 5})}}
+
+
\ No newline at end of file
diff --git a/paradise.dme b/paradise.dme
index bdb32953696..0894c33a3f6 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -57,6 +57,10 @@
#include "code\__HELPERS\type2type.dm"
#include "code\__HELPERS\unsorted.dm"
#include "code\__HELPERS\bygex\bygex.dm"
+#include "code\_DATASTRUCTURES\heap.dm"
+#include "code\_DATASTRUCTURES\linked_lists.dm"
+#include "code\_DATASTRUCTURES\priority_queue.dm"
+#include "code\_DATASTRUCTURES\stacks.dm"
#include "code\_globalvars\configuration.dm"
#include "code\_globalvars\database.dm"
#include "code\_globalvars\game_modes.dm"
@@ -71,6 +75,7 @@
#include "code\_globalvars\lists\mobs.dm"
#include "code\_globalvars\lists\names.dm"
#include "code\_globalvars\lists\objects.dm"
+#include "code\_globalvars\lists\reagents.dm"
#include "code\_hooks\area.dm"
#include "code\_hooks\hooks.dm"
#include "code\_hooks\mob.dm"
@@ -422,7 +427,6 @@
#include "code\game\machinery\machinery.dm"
#include "code\game\machinery\magnet.dm"
#include "code\game\machinery\mass_driver.dm"
-#include "code\game\machinery\metaldetector.dm"
#include "code\game\machinery\navbeacon.dm"
#include "code\game\machinery\newscaster.dm"
#include "code\game\machinery\OpTable.dm"
@@ -1411,7 +1415,6 @@
#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm"
#include "code\modules\mob\living\silicon\ai\freelook\eye.dm"
#include "code\modules\mob\living\silicon\ai\freelook\read_me.dm"
-#include "code\modules\mob\living\silicon\ai\freelook\update_triggers.dm"
#include "code\modules\mob\living\silicon\decoy\death.dm"
#include "code\modules\mob\living\silicon\decoy\decoy.dm"
#include "code\modules\mob\living\silicon\decoy\life.dm"
@@ -1577,7 +1580,7 @@
#include "code\modules\paperwork\photography.dm"
#include "code\modules\paperwork\silicon_photography.dm"
#include "code\modules\paperwork\stamps.dm"
-#include "code\modules\pooling\atom_pool.dm"
+#include "code\modules\pooling\pool.dm"
#include "code\modules\power\apc.dm"
#include "code\modules\power\cable.dm"
#include "code\modules\power\cable_heavyduty.dm"