diff --git a/_maps/map_files/MetaStation/MetaStation.v40D.dmm b/_maps/map_files/MetaStation/MetaStation.v40D.dmm
index db480a267f4..3e93cfc1116 100644
--- a/_maps/map_files/MetaStation/MetaStation.v40D.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v40D.dmm
@@ -7790,7 +7790,7 @@
"cVB" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #1"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
"cVC" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #2"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/xenobiology)
"cVD" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #2"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/toxins/xenobiology)
-"cVE" = (/mob/living/carbon/slime,/turf/simulated/floor/engine,/area/toxins/xenobiology)
+"cVE" = (/mob/living/simple_animal/slime,/turf/simulated/floor/engine,/area/toxins/xenobiology)
"cVG" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio3"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/xenobiology)
"cVI" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cVK" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/toxins/xenobiology)
diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm
index 26440cffee6..392ef5442c9 100644
--- a/_maps/map_files/MiniStation/MiniStation.dmm
+++ b/_maps/map_files/MiniStation/MiniStation.dmm
@@ -134,7 +134,7 @@
"cD" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/plasteel,/area/security/brig)
"cE" = (/obj/machinery/photocopier,/turf/simulated/floor/plasteel,/area/security/brig)
"cF" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
-"cG" = (/mob/living/carbon/slime,/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
+"cG" = (/mob/living/simple_animal/slime,/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"cH" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"})
"cI" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/medical/research{name = "Research Division"})
"cJ" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/medical/research{name = "Research Division"})
@@ -1703,7 +1703,7 @@
"GM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/computer)
"GN" = (/obj/structure/closet/radiation,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/tcommsat/computer)
"GO" = (/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 12; id = "ferry_home"; name = "station"; turf_type = /turf/space; width = 5},/turf/simulated/floor/plating,/area/space)
-
+
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index 04d20e82fe0..454dbfb2ca3 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -657,7 +657,7 @@
"amG" = (/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},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"amH" = (/turf/simulated/wall,/area/maintenance/fpmaint2)
"amI" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/space)
-"amJ" = (/obj/machinery/door/airlock/shuttle{name = "Labor Shuttle Airlock"},/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 5; id = "laborcamp"; name = "labor camp shuttle"; travelDir = 90; width = 9},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 5; id = "laborcamp_home"; name = "fore bay 1"; width = 9},/turf/simulated/shuttle/floor,/area/space)
+"amJ" = (/obj/machinery/door/airlock/shuttle{id_tag = "prisonshuttle"; name = "Labor Shuttle Airlock"},/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 5; id = "laborcamp"; name = "labor camp shuttle"; travelDir = 90; width = 9},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 5; id = "laborcamp_home"; name = "fore bay 1"; width = 9},/turf/simulated/shuttle/floor,/area/space)
"amK" = (/obj/machinery/door/airlock/external{name = "Labor Camp Shuttle Airlock"},/turf/simulated/floor/plating,/area/security/processing)
"amL" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{id_tag = "laborexit"; name = "Labor Shuttle"; req_access = null; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/processing)
"amM" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
@@ -2625,12 +2625,12 @@
"aYy" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/bridge/meeting_room)
"aYz" = (/obj/machinery/door/airlock/command{name = "Conference Room"; req_access = null; req_access_txt = "19"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"aYA" = (/turf/simulated/wall,/area/bridge/meeting_room)
-"aYB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/wall/r_wall,/area/bridge/meeting_room)
+"aYB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
"aYC" = (/obj/machinery/porta_turret{ai = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"aYD" = (/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
"aYE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"aYF" = (/obj/machinery/camera/motion{c_tag = "AI Upload Chamber"; dir = 2; network = list("SS13","RD","AIUpload")},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
-"aYG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/wall/r_wall,/area/crew_quarters/captain)
+"aYG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
"aYH" = (/turf/simulated/wall/r_wall,/area/crew_quarters/captain)
"aYI" = (/obj/machinery/door/airlock/command{name = "Captain's Office"; req_access = null; req_access_txt = "20"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"aYJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/crew_quarters/captain)
@@ -2702,7 +2702,7 @@
"aZX" = (/obj/structure/table,/obj/item/weapon/aiModule/reset,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"aZY" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"aZZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table,/obj/item/weapon/phone,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
-"baa" = (/obj/structure/table,/obj/item/weapon/aiModule/supplied/protectStation,/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
+"baa" = (/obj/structure/table,/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"bab" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
"bac" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bad" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/wood,/area/crew_quarters/captain)
@@ -2728,6 +2728,7 @@
"bax" = (/obj/machinery/power/apc{dir = 8; name = "Vacant Office APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/vacantoffice)
"bay" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/port)
"baz" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/port)
+"baA" = (/obj/structure/table,/obj/item/weapon/aiModule/supplied/oxygen,/obj/item/weapon/aiModule/zeroth/oneHuman,/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "High-Risk Modules"; req_access_txt = "20"},/obj/item/weapon/aiModule/reset/purge,/obj/structure/window/reinforced,/obj/item/weapon/aiModule/core/full/antimov,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/aiModule/supplied/protectStation,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"baB" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"baC" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"baD" = (/obj/machinery/washing_machine,/turf/simulated/floor/plasteel{icon_state = "barber"},/area/crew_quarters/locker)
@@ -2853,7 +2854,7 @@
"bcT" = (/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "Upload APC"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
"bcU" = (/obj/machinery/computer/upload/borg,/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1447; listening = 0; name = "Station Intercom (AI Private)"; pixel_y = -29},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
"bcV" = (/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
-"bcW" = (/obj/structure/table,/obj/item/weapon/aiModule/supplied/oxygen,/obj/item/weapon/aiModule/zeroth/oneHuman,/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "High-Risk Modules"; req_access_txt = "20"},/obj/item/weapon/aiModule/reset/purge,/obj/structure/window/reinforced,/obj/item/weapon/aiModule/core/full/antimov,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
+"bcW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
"bcX" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bcY" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bcZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/wood,/area/crew_quarters/captain)
@@ -2882,6 +2883,7 @@
"bdw" = (/obj/machinery/newscaster{pixel_y = -32},/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit)
"bdx" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/hallway/secondary/exit)
"bdy" = (/obj/machinery/door/airlock/external{name = "Port Docking Bay 4"; req_access_txt = "0"},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
+"bdz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
"bdA" = (/obj/machinery/door/airlock/external{name = "Port Docking Bay 3"; req_access_txt = "0"},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"bdB" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry)
"bdC" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry)
@@ -2915,13 +2917,13 @@
"bee" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge RC"; pixel_y = -30},/obj/machinery/light,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bef" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/fancy/carpet,/area/bridge/meeting_room)
"beg" = (/obj/structure/noticeboard{dir = 8; pixel_x = 27; pixel_y = 0},/turf/simulated/floor/wood,/area/bridge/meeting_room)
-"beh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/wall/r_wall,/area/bridge/meeting_room)
+"beh" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bei" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (EAST)"; dir = 4},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
"bej" = (/obj/machinery/ai_status_display,/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
"bek" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
"bel" = (/obj/machinery/status_display{density = 0; layer = 4},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
"bem" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (WEST)"; dir = 8},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
-"ben" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/wall/r_wall,/area/crew_quarters/captain)
+"ben" = (/obj/structure/table,/obj/item/weapon/pen,/obj/machinery/camera{c_tag = "Experimentor Lab"; dir = 2; network = list("SS13","RD")},/obj/item/weapon/hand_labeler,/obj/item/stack/packageWrap,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/toxins/explab)
"beo" = (/obj/structure/table/wood,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bep" = (/obj/structure/table/wood,/obj/item/weapon/folder/blue,/obj/item/weapon/stamp/captain,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"beq" = (/obj/structure/table/wood,/obj/item/weapon/hand_tele,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/wood,/area/crew_quarters/captain)
@@ -3006,6 +3008,7 @@
"bfR" = (/obj/machinery/chem_dispenser,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteyellow"},/area/medical/chemistry)
"bfS" = (/obj/machinery/chem_master,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whiteyellow"},/area/medical/chemistry)
"bfT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/atmospherics/pipe/simple/general/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison)
+"bfU" = (/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/toxins/explab)
"bfV" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bfW" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bfX" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
@@ -3082,6 +3085,7 @@
"bhq" = (/obj/structure/bodycontainer/morgue,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"bhr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"bhs" = (/turf/simulated/floor/plating,/area/storage/emergency)
+"bht" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/window/fulltile,/turf/simulated/floor/plating,/area/toxins/explab)
"bhu" = (/obj/machinery/light/small{dir = 1},/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/storage/emergency)
"bhv" = (/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/storage/emergency)
"bhw" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/power/apc{dir = 4; name = "Mech Bay APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/assembly/chargebay)
@@ -3543,7 +3547,7 @@
"bqk" = (/obj/machinery/door/firedoor/heavy,/obj/machinery/door/poddoor/shutters/preopen{id = "rnd2"; name = "research lab shutters"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"bql" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/heavy,/obj/machinery/door/poddoor/shutters/preopen{id = "rnd2"; name = "research lab shutters"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"bqm" = (/obj/structure/grille,/obj/machinery/door/poddoor/shutters/preopen{id = "rnd2"; name = "research lab shutters"},/obj/structure/window/fulltile,/turf/simulated/floor/plating,/area/toxins/lab)
-"bqn" = (/obj/structure/table,/obj/item/weapon/storage/firstaid,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"bqn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (NORTH)"; icon_state = "pipe-j2"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bqo" = (/obj/machinery/computer/libraryconsole,/obj/structure/table/wood,/turf/simulated/floor/wood,/area/library)
"bqp" = (/obj/structure/table/wood,/obj/machinery/computer/libraryconsole/bookmanagement{pixel_y = 0},/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/wood,/area/library)
"bqq" = (/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine,/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/machinery/requests_console{department = "Chemistry"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
@@ -3632,11 +3636,11 @@
"brV" = (/turf/simulated/wall/r_wall,/area/toxins/explab)
"brW" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"},/area/medical/chemistry)
"brX" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 0; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitecorner"},/area/toxins/explab)
-"brY" = (/obj/structure/closet/l3closet/scientist{pixel_x = -2},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/toxins/explab)
+"brY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/firedoor/heavy,/obj/machinery/door/airlock/research{name = "Experimentation Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
"brZ" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/item/device/radio/off,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/toxins/explab)
"bsa" = (/obj/structure/closet/emcloset{pixel_x = -2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/toxins/explab)
-"bsb" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/window/fulltile,/obj/machinery/door/firedoor/heavy,/turf/simulated/floor/plating,/area/toxins/explab)
-"bsc" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bsb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bsc" = (/obj/machinery/camera{c_tag = "Experimentor Lab Chamber"; dir = 1; network = list("SS13","RD")},/obj/machinery/light,/obj/structure/sign/nosmoking_2{pixel_y = -32},/turf/simulated/floor/engine,/area/toxins/explab)
"bsd" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 2},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bse" = (/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bsf" = (/obj/machinery/camera{c_tag = "Cargo Recieving Dock"; dir = 4},/obj/machinery/door_control{id = "QMLoaddoor"; layer = 4; name = "Loading Doors"; pixel_x = -24; pixel_y = -8},/obj/machinery/door_control{dir = 2; id = "QMLoaddoor2"; layer = 4; name = "Loading Doors"; pixel_x = -24; pixel_y = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/storage)
@@ -3646,6 +3650,7 @@
"bsj" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (EAST)"; dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bsk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bsl" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Cargo Office"; req_access_txt = "50"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bsm" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bsn" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central)
"bso" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/crew_quarters/heads)
"bsp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
@@ -3698,7 +3703,7 @@
"btk" = (/obj/machinery/door/airlock/maintenance{name = "Experimentation Lab Maintenance"; req_access_txt = "7"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/toxins/explab)
"btl" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
"btm" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"btn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"btn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bto" = (/obj/docking_port/stationary{dir = 8; dwidth = 5; height = 7; id = "supply_home"; name = "supply bay"; width = 12},/turf/space,/area/space)
"btp" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "QMLoad"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"btq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
@@ -3811,7 +3816,7 @@
"bvt" = (/obj/structure/table/glass,/obj/item/weapon/folder/white,/obj/item/device/radio/headset/headset_medsci,/obj/machinery/requests_console{department = "Genetics"; departmentType = 0; name = "Genetics Requests Console"; pixel_x = 0; pixel_y = 30},/obj/item/weapon/storage/pill_bottle/mutadone,/obj/item/weapon/storage/pill_bottle/mannitol,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
"bvu" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel,/area/medical/sleeper)
"bvv" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor/plasteel,/area/medical/sleeper)
-"bvw" = (/obj/structure/table,/obj/item/weapon/pen,/obj/machinery/camera{c_tag = "Telescience Lab"; dir = 2; network = list("SS13","RD")},/obj/item/weapon/hand_labeler,/obj/item/stack/packageWrap,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/toxins/explab)
+"bvw" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bvx" = (/obj/machinery/camera{c_tag = "Genetics Cloning"; dir = 4; network = list("SS13")},/obj/structure/table,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/storage/box/rxglasses{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
"bvy" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (WEST)"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
"bvz" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
@@ -3840,7 +3845,7 @@
"bvW" = (/obj/machinery/computer/aifixer,/obj/machinery/requests_console{announcementConsole = 1; department = "Research Director's Desk"; departmentType = 5; name = "Research Director RC"; pixel_x = -2; pixel_y = 30},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
"bvX" = (/obj/structure/rack,/obj/item/weapon/circuitboard/aicore{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/crew_quarters/hor)
"bvY" = (/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 1},/area/crew_quarters/hor)
-"bvZ" = (/obj/machinery/door/airlock/research{name = "Experimentation Lab"; req_access_txt = "7"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/firedoor/heavy,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"bvZ" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bwa" = (/obj/machinery/power/apc{dir = 4; name = "Experimentation Lab APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
"bwb" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = -30},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
"bwc" = (/obj/machinery/light_switch{pixel_x = -20; pixel_y = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
@@ -4220,9 +4225,9 @@
"bDm" = (/obj/machinery/atmospherics/unary/portables_connector/visible,/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/toxins/mixing)
"bDn" = (/turf/simulated/wall/r_wall,/area/toxins/mixing)
"bDo" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 4; name = "4maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"bDp" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"bDq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"bDr" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bDp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (WEST)"; dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/toxins/mixing)
+"bDq" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/o2,/obj/item/weapon/storage/firstaid/regular{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bDr" = (/obj/structure/table,/obj/machinery/requests_console{announcementConsole = 0; department = "Medbay"; departmentType = 1; name = "Medbay RC"; pixel_x = 0; pixel_y = -30; pixel_z = 0},/obj/item/weapon/storage/firstaid/fire{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bDs" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/toxins/mixing)
"bDt" = (/obj/machinery/computer/security/mining,/obj/machinery/camera{c_tag = "Mining Dock"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
"bDu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
@@ -4290,7 +4295,7 @@
"bEE" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"bEF" = (/obj/machinery/atmospherics/pipe/manifold/general/visible,/obj/machinery/meter,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"bEG" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 9},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"bEH" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bEH" = (/obj/structure/table,/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; frequency = 1485; listening = 1; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = -30},/obj/item/weapon/storage/firstaid/toxin{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/regular{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bEI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/wall,/area/maintenance/asmaint2)
"bEJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/toxins/mixing)
"bEK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/wall,/area/toxins/mixing)
@@ -4338,6 +4343,7 @@
"bFA" = (/obj/machinery/vending/wallmed{pixel_x = 28; pixel_y = 0},/obj/machinery/camera{c_tag = "Medbay Recovery Room"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (EAST)"; dir = 4},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bFB" = (/obj/structure/grille,/obj/machinery/door/poddoor/preopen{id = "telelab"; name = "test chamber blast door"},/obj/structure/window/reinforced/fulltile,/obj/machinery/door/firedoor/heavy,/turf/simulated/floor/engine,/area/toxins/explab)
"bFC" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/item/weapon/gun/syringe,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bFD" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/brute{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/brute,/obj/item/weapon/storage/firstaid/regular{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bFE" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bFF" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/door_control{id = "medpriv4"; name = "Privacy Shutters"; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bFG" = (/obj/structure/grille,/obj/machinery/door/poddoor/preopen{id = "medpriv4"; name = "privacy door"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/window/fulltile,/turf/simulated/floor/plating,/area/medical/medbay)
@@ -4360,7 +4366,7 @@
"bFX" = (/obj/machinery/door/firedoor/heavy,/obj/machinery/door/airlock/research{name = "Toxins Lab"; req_access_txt = "8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"bFY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"bFZ" = (/obj/structure/sign/securearea{pixel_x = -32},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 1},/area/toxins/mixing)
-"bGa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (WEST)"; dir = 8},/turf/simulated/floor/plasteel,/area/toxins/mixing)
+"bGa" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/toxins/mixing)
"bGb" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 2},/area/toxins/mixing)
"bGc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/toxins/mixing)
"bGd" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/toxins/mixing)
@@ -4397,7 +4403,7 @@
"bGI" = (/obj/structure/disposalpipe/segment,/obj/structure/grille,/obj/structure/window/fulltile,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bGJ" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/medical/sleeper)
"bGK" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/medical/sleeper)
-"bGL" = (/obj/machinery/camera{c_tag = "Telescience Test Chamber"; dir = 1; network = list("SS13","RD")},/obj/machinery/light,/obj/structure/sign/nosmoking_2{pixel_y = -32},/turf/simulated/floor/engine,/area/toxins/explab)
+"bGL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/toxins/mixing)
"bGM" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/medical/sleeper)
"bGN" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 7; pixel_y = -3},/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bGO" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
@@ -4405,9 +4411,9 @@
"bGQ" = (/obj/structure/closet/crate/freezer,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty{pixel_x = -3; pixel_y = -3},/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/BMinus{pixel_x = -4; pixel_y = 4},/obj/item/weapon/reagent_containers/blood/BPlus{pixel_x = 1; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = -2; pixel_y = -1},/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/turf/simulated/floor/plasteel,/area/medical/sleeper)
"bGR" = (/obj/structure/table,/obj/machinery/light,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bGS" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"bGT" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 3; pixel_y = -3},/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/o2,/obj/item/weapon/storage/firstaid/o2{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"bGU" = (/obj/structure/table,/obj/machinery/requests_console{announcementConsole = 0; department = "Medbay"; departmentType = 1; name = "Medbay RC"; pixel_x = 0; pixel_y = -30; pixel_z = 0},/obj/item/weapon/storage/firstaid/regular{pixel_x = 3; pixel_y = -3},/obj/item/weapon/storage/firstaid/fire{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/fire{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"bGV" = (/obj/structure/table,/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; frequency = 1485; listening = 1; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = -30},/obj/item/weapon/storage/firstaid/regular{pixel_x = 3; pixel_y = -3},/obj/item/weapon/storage/firstaid/toxin{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/toxin{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bGT" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bGU" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint2)
+"bGV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bGW" = (/obj/machinery/light,/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bGX" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bGY" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
@@ -4437,7 +4443,7 @@
"bHw" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"bHx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor/heavy,/obj/machinery/door/airlock/research{name = "Toxins Launch Room Access"; req_access_txt = "8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"bHy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/mixing)
-"bHz" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/toxins/mixing)
+"bHz" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/window/reinforced/tinted/fulltile,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bHA" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/mixing)
"bHB" = (/obj/machinery/door/airlock/research{name = "Toxins Launch Room"; req_access_txt = "8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/toxins/mixing)
"bHC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/toxins/mixing)
@@ -4474,7 +4480,7 @@
"bIh" = (/obj/effect/landmark{name = "blobstart"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bIi" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bIj" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (NORTH)"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"bIk" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 3; pixel_y = -3},/obj/item/weapon/storage/firstaid/brute{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/brute,/obj/item/weapon/storage/firstaid/brute{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bIk" = (/obj/machinery/atmospherics/binary/valve/open{tag = "icon-mvalve_map (EAST)"; icon_state = "mvalve_map"; dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/asmaint)
"bIl" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bIm" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bIn" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/shieldwallgen{req_access = list(55)},/turf/simulated/floor/plating,/area/toxins/xenobiology)
@@ -4497,7 +4503,7 @@
"bIE" = (/obj/structure/dispenser,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"bIF" = (/obj/machinery/power/apc{dir = 4; name = "Toxins Lab APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"bIG" = (/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 4},/area/toxins/mixing)
-"bIH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/toxins/mixing)
+"bIH" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/item/weapon/wrench,/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (WEST)"; dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/asmaint)
"bII" = (/obj/machinery/camera{c_tag = "Toxins Launch Room Access"; dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 8},/area/toxins/mixing)
"bIJ" = (/obj/machinery/door/window/southleft{name = "Mass Driver Door"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "loadingarea"},/area/toxins/mixing)
"bIK" = (/obj/structure/grille,/obj/structure/window/fulltile,/turf/simulated/floor/plating,/area/toxins/mixing)
@@ -4907,8 +4913,8 @@
"bQy" = (/obj/machinery/atmospherics/pipe/manifold/general/visible,/turf/simulated/floor/engine,/area/toxins/misc_lab)
"bQz" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 8},/turf/simulated/floor/engine,/area/toxins/misc_lab)
"bQA" = (/obj/machinery/magnetic_module,/obj/effect/landmark{name = "blobstart"},/obj/structure/target_stake,/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/toxins/misc_lab)
-"bQB" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"bQC" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint2)
+"bQB" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/asmaint)
+"bQC" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/asmaint)
"bQD" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/aft)
"bQE" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft)
"bQF" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/aft)
@@ -4956,7 +4962,7 @@
"bRv" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/misc_lab)
"bRw" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/misc_lab)
"bRx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/maintenance/asmaint2)
-"bRy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bRy" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/asmaint)
"bRz" = (/obj/machinery/atmospherics/unary/outlet_injector,/turf/simulated/floor/plating/airless,/area/space)
"bRA" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/aft)
"bRB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/wall,/area/maintenance/aft)
@@ -5068,7 +5074,7 @@
"bTD" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/misc_lab)
"bTE" = (/obj/machinery/camera{c_tag = "Testing Firing Range"; dir = 8; network = list("SS13","RD"); pixel_y = -22},/turf/simulated/floor/plating,/area/toxins/misc_lab)
"bTF" = (/obj/structure/target_stake,/turf/simulated/floor/plating,/area/toxins/misc_lab)
-"bTG" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/space)
+"bTG" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/asmaint)
"bTH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/turf/simulated/floor/plating,/area/maintenance/aft)
"bTI" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/aft)
"bTJ" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 5},/turf/simulated/floor/plating,/area/maintenance/aft)
@@ -5115,8 +5121,8 @@
"bUy" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (NORTH)"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/misc_lab)
"bUz" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plasteel,/area/toxins/misc_lab)
"bUA" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 2},/area/toxins/misc_lab)
-"bUB" = (/obj/machinery/door/airlock/external{name = "External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/space)
-"bUC" = (/turf/simulated/floor/plating,/area/space)
+"bUB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint2)
+"bUC" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bUD" = (/obj/machinery/door/airlock/external{name = "External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/aft)
"bUE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/aft)
"bUF" = (/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/aft)
@@ -5148,7 +5154,7 @@
"bVf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"bVg" = (/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"bVh" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"bVi" = (/mob/living/carbon/slime,/turf/simulated/floor/engine,/area/toxins/xenobiology)
+"bVi" = (/mob/living/simple_animal/slime,/turf/simulated/floor/engine,/area/toxins/xenobiology)
"bVj" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/engine,/area/toxins/xenobiology)
"bVk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio7"; name = "containment blast door"},/turf/simulated/floor/engine,/area/toxins/xenobiology)
"bVl" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/misc_lab)
@@ -5164,7 +5170,7 @@
"bVv" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/recharger{pixel_y = 4},/obj/item/weapon/paper/range,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/toxins/misc_lab)
"bVw" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/misc_lab)
"bVx" = (/obj/structure/table/reinforced,/obj/machinery/magnetic_controller{autolink = 1},/obj/structure/window/reinforced{dir = 1},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/toxins/misc_lab)
-"bVy" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/window/reinforced/tinted/fulltile,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bVy" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bVz" = (/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},/turf/simulated/floor/plating,/area/maintenance/aft)
"bVA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 5},/turf/simulated/floor/plating,/area/maintenance/aft)
"bVB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/aft)
@@ -5284,9 +5290,9 @@
"bXL" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bXM" = (/obj/effect/decal/cleanable/cobweb2,/obj/effect/spawner/lootdrop/maintenance,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bXN" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/wall/r_wall,/area/medical/virology)
-"bXO" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/item/weapon/wrench,/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (WEST)"; dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/medical/virology)
-"bXP" = (/obj/machinery/atmospherics/binary/valve/open{tag = "icon-mvalve_map (EAST)"; icon_state = "mvalve_map"; dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/medical/virology)
-"bXQ" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/medical/virology)
+"bXO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bXP" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bXQ" = (/obj/structure/grille,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/window/reinforced/tinted/fulltile,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bXR" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bXS" = (/obj/structure/rack{dir = 1},/obj/machinery/light/small{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bXT" = (/obj/structure/grille,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/engine,/area/toxins/xenobiology)
@@ -5332,9 +5338,9 @@
"bYH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bYI" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bYJ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"bYK" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/medical/virology)
-"bYL" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/medical/virology)
-"bYM" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/medical/virology)
+"bYK" = (/obj/structure/reagent_dispensers/watertank,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bYL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bYM" = (/obj/structure/rack{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/spawner/lootdrop/maintenance,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bYN" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bYO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (EAST)"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bYP" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint)
@@ -5349,7 +5355,7 @@
"bYY" = (/obj/machinery/power/apc{dir = 4; name = "Testing Lab APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/misc_lab)
"bYZ" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel,/area/toxins/misc_lab)
"bZa" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"bZb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint2)
+"bZb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bZc" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bZd" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bZe" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft)
@@ -5457,6 +5463,7 @@
"cbc" = (/obj/machinery/computer/telecomms/monitor{network = "tcommsat"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "yellow"},/area/tcommsat/computer)
"cbd" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor/plating,/area/construction)
"cbe" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
+"cbf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cbg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cbh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/hallway/primary/aft)
"cbi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "32"},/turf/simulated/floor/plasteel,/area/engine/break_room)
@@ -5540,12 +5547,12 @@
"ccI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/toxins/misc_lab)
"ccJ" = (/obj/item/stack/sheet/cardboard,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"ccK" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ccL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ccM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ccN" = (/obj/machinery/light/small,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ccO" = (/obj/machinery/door/airlock/external{name = "Starboard Docking Bay 2"; req_access_txt = "13"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ccP" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ccQ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/lattice/catwalk,/turf/space,/area/space)
+"ccL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"ccM" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"ccN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/engine_smes)
+"ccO" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"ccP" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/wall,/area/aisat)
+"ccQ" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/wall,/area/aisat)
"ccR" = (/obj/item/clothing/under/rank/vice,/obj/structure/closet,/obj/item/clothing/shoes/jackboots,/turf/simulated/floor/plating,/area/maintenance/aft)
"ccS" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/aft)
"ccT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/engineering)
@@ -5624,7 +5631,7 @@
"ceo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/maintenance/asmaint2)
"cep" = (/obj/machinery/space_heater,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"ceq" = (/obj/structure/sign/securearea{pixel_y = 32},/obj/effect/spawner/lootdrop/maintenance,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cer" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cer" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
"ces" = (/obj/structure/rack{dir = 1},/obj/effect/decal/cleanable/cobweb2,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cet" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/wall,/area/maintenance/asmaint2)
"ceu" = (/obj/machinery/door/airlock/maintenance{name = "Research Delivery access"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
@@ -5679,14 +5686,14 @@
"cfr" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (NORTH)"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cfs" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cft" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cfu" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cfv" = (/obj/structure/reagent_dispensers/watertank,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cfw" = (/obj/structure/grille,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/window/reinforced/tinted/fulltile,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cfx" = (/obj/structure/rack{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cfy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cfz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cfA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cfB" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cfu" = (/obj/structure/lattice,/obj/structure/window/reinforced,/obj/structure/grille,/turf/space,/area/space)
+"cfv" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
+"cfw" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/window/reinforced,/turf/space,/area/space)
+"cfx" = (/obj/structure/window/reinforced,/obj/machinery/door/window{base_state = "right"; dir = 1; icon_state = "right"; name = "MiniSat Walkway Access"; req_access_txt = "13;65"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/aisat)
+"cfy" = (/obj/structure/window/reinforced,/obj/machinery/door/window{dir = 1; name = "MiniSat Walkway Access"; req_access_txt = "13;65"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/aisat)
+"cfz" = (/obj/machinery/door/window{name = "AI Core Door"; req_access_txt = "16"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
+"cfA" = (/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "AI Chamber APC"; pixel_y = 24},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
+"cfB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"cfC" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cfD" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; on = 1},/turf/simulated/floor/plating/airless,/area/space)
"cfE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/lattice/catwalk,/turf/space,/area/solar/port)
@@ -5954,7 +5961,7 @@
"ckG" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"ckH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/airlock/external{name = "Solar Maintenance"; req_access = null; req_access_txt = "10; 13"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"ckI" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/lattice/catwalk,/turf/space,/area/solar/port)
-"ckJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 7; on = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/engine_smes)
+"ckJ" = (/obj/machinery/hologram/holopad,/obj/machinery/power/terminal,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
"ckK" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/engine/engine_smes)
"ckL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/engine_smes)
"ckM" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/engine/engine_smes)
@@ -6148,7 +6155,7 @@
"cos" = (/obj/structure/lattice/catwalk,/turf/space,/area/solar/starboard)
"cot" = (/obj/structure/table,/obj/item/device/taperecorder{pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/aft)
"cou" = (/obj/structure/table,/obj/item/weapon/storage/box/matches,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor/plating,/area/maintenance/aft)
-"cov" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating/airless,/area/space)
+"cov" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
"cow" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/engine/engineering)
"cox" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/engine/engineering)
"coy" = (/obj/structure/grille,/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/engine/engineering)
@@ -6362,20 +6369,17 @@
"csy" = (/obj/machinery/ai_slipper{icon_state = "motion0"; uses = 10},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"csz" = (/obj/item/device/radio/intercom{broadcasting = 0; freerange = 1; listening = 1; name = "Common Channel"; pixel_x = -27; pixel_y = 5},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 27},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 27; pixel_y = 5},/obj/effect/landmark/start{name = "AI"},/obj/machinery/requests_console{department = "AI"; departmentType = 5; pixel_x = 32; pixel_y = 32},/obj/machinery/newscaster/security_unit{pixel_x = -32; pixel_y = 32},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"csA" = (/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 28},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 1; listening = 1; name = "Common Channel"; pixel_x = 27; pixel_y = 5},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
-"csB" = (/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "AI Chamber APC"; pixel_y = 24},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
-"csC" = (/obj/machinery/door/window{name = "AI Core Door"; req_access_txt = "16"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
+"csB" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
+"csC" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
"csD" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/turretid{name = "AI Chamber turret control"; pixel_x = 5; pixel_y = 24},/obj/machinery/flasher{id = "AI"; pixel_x = -6; pixel_y = 24},/obj/machinery/camera/motion{c_tag = "AI Chamber South"; dir = 2; network = list("RD","MiniSat")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
-"csE" = (/obj/machinery/ai_slipper{icon_state = "motion0"; uses = 10},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
+"csE" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/wall/r_wall,/area/turret_protected/ai)
"csF" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
-"csG" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
-"csH" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
-"csI" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
+"csG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/turret_protected/ai)
+"csH" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/wall/r_wall,/area/turret_protected/ai)
+"csI" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/wall/r_wall,/area/turret_protected/ai)
"csJ" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 4},/obj/machinery/camera{c_tag = "MiniSat Exterior South West"; dir = 8; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/aisat)
-"csK" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
"csL" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera{c_tag = "MiniSat Exterior South East"; dir = 4; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/aisat)
"csM" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_se"; name = "southeast of station"; turf_type = /turf/space; width = 18},/turf/space,/area/space)
-"csN" = (/turf/simulated/wall/r_wall,/area/ai_monitored/storage/secure)
-"csO" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/wall/r_wall,/area/turret_protected/ai)
"csP" = (/turf/simulated/wall,/area/ai_monitored/storage/secure)
"csQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/camera{c_tag = "MiniSat Entrance"; dir = 4; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/obj/machinery/power/apc{dir = 8; name = "MiniSat External Power APC"; pixel_x = -27; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-darkbluecorners (WEST)"; icon_state = "darkbluecorners"; dir = 8},/area/aisat)
"csR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-darkbluecorners"; icon_state = "darkbluecorners"; temperature = 273.15},/area/aisat)
@@ -6385,9 +6389,7 @@
"csV" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space)
"csW" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/space)
"csX" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (EAST)"; dir = 4},/turf/simulated/floor/plasteel{tag = "icon-darkbluecorners"; icon_state = "darkbluecorners"; temperature = 273.15},/area/aisat)
-"csY" = (/obj/structure/lattice/catwalk,/turf/space,/area/aisat)
"csZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat)
-"cta" = (/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/aisat)
"ctb" = (/obj/structure/lattice,/turf/space,/area/aisat)
"ctc" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
"ctd" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/aisat)
@@ -6395,10 +6397,6 @@
"ctf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-darkblue"; icon_state = "darkblue"; temperature = 273.15},/area/aisat)
"ctg" = (/obj/machinery/computer/security/telescreen{dir = 1; name = "MiniSat Monitor"; network = list("MiniSat"); pixel_x = 0; pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{tag = "icon-darkblue"; icon_state = "darkblue"; temperature = 273.15},/area/aisat)
"cth" = (/obj/machinery/turretid{control_area = "\improper AI Satellite Antechamber"; enabled = 1; icon_state = "control_standby"; name = "Antechamber Turret Control"; pixel_x = 0; pixel_y = -24; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{tag = "icon-darkblue"; icon_state = "darkblue"; temperature = 273.15},/area/aisat)
-"cti" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/wall,/area/space)
-"ctj" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/wall,/area/space)
-"ctk" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/aisat)
-"ctl" = (/obj/structure/lattice,/obj/structure/window/reinforced,/obj/structure/grille,/turf/space,/area/aisat)
"ctm" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plating,/area/aisat)
"ctn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/light/small{dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior)
"cto" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior)
@@ -6410,10 +6408,6 @@
"ctu" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/turf/space,/area/space)
"ctv" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_s"; name = "south of station"; turf_type = /turf/space; width = 18},/turf/space,/area/space)
"ctw" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior)
-"ctx" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/aisat)
-"cty" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/window/reinforced,/turf/space,/area/aisat)
-"ctz" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/space)
-"ctA" = (/obj/structure/window/reinforced,/obj/machinery/door/window{base_state = "right"; dir = 1; icon_state = "right"; name = "MiniSat Walkway Access"; req_access_txt = "13;65"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/space)
"ctB" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/ai_monitored/storage/secure)
"ctC" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/chem_heater,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
"ctD" = (/obj/effect/landmark{name = "blobstart"},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/engine,/area/toxins/explab)
@@ -6424,8 +6418,6 @@
"ctI" = (/obj/structure/table/reinforced,/obj/item/stack/medical/bruise_pack{pixel_x = -3; pixel_y = 2},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ctJ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel{tag = "icon-darkbluecorners"; icon_state = "darkbluecorners"; temperature = 273.15},/area/turret_protected/aisat_interior)
"ctK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior)
-"ctL" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/space)
-"ctM" = (/obj/structure/window/reinforced,/obj/machinery/door/window{dir = 1; name = "MiniSat Walkway Access"; req_access_txt = "13;65"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/space)
"ctN" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior)
"ctO" = (/turf/simulated/floor/plasteel{tag = "icon-darkbluecorners (WEST)"; icon_state = "darkbluecorners"; dir = 8},/area/turret_protected/aisat_interior)
"ctP" = (/turf/simulated/floor/plasteel{tag = "icon-darkbluecorners"; icon_state = "darkbluecorners"; temperature = 273.15},/area/turret_protected/aisat_interior)
@@ -6468,7 +6460,7 @@
"cuA" = (/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_x = 32; pixel_y = -24; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/science{dir = 4; icon_state = "direction_sci"; pixel_x = 32; pixel_y = -32; tag = "icon-direction_sci (EAST)"},/obj/structure/sign/directions/engineering{pixel_x = 32; pixel_y = -40},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"cuB" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/sign/directions/engineering{pixel_x = -32; pixel_y = -40},/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_x = -32; pixel_y = -24; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_x = -32; pixel_y = -32; tag = "icon-direction_evac (EAST)"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"cuD" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/camera{c_tag = "Custodial Closet"},/obj/structure/stool/bed/chair/janicart,/turf/simulated/floor/plasteel,/area/janitor)
-
+
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6574,19 +6566,19 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaafaqparpasuauEaqparpauFauEaqpamHauGamHamHamHamHamHasyatJanSauHauIanSanSamHasyatJauJaafauJamHapwatRamHauKauLamHasIapAaszauMasAauNauOauOauOauOauOauPauOauOauOauNauQauNauNauRauNauSauRauTauUauVauWauWauWauWauWauWauWauXauYauWauWauWauWauZavaavbavbavcavdapTarQarSarSavfarUavgavhatfavjaxZavlavmavnavoavpavqavraunauoauoaupasfaveatoaqcaqcaqcaqcaqcatoavtausatoaaaaaaallavuamlamlavvallavwanLavxavyanKallatqanKallavzamlallavAamlallavBavCavDavEatsatsavFavGavHavIavJavKavLaroabtabtaaIaaIabtabtabtabtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMavNavNavNavOavNavNavNavPavQavRavPavPavPavSamHavTatJaDravUavVanSavWamHasyavXasAasAasAasAasAasAasCanSavVavYanSanSavZawaawbawcawdawdawdaweawdawfawdawdawgawhawiawjawjawjawjawjawjawkawlawmawnawnawnawnawnawnawnawoawnawpawpawpawpawpawqawrawsawtawuapTapTapTapTapTawvawwawxawyawzawAawBaviawDawEawFawGawHawIawJawJavsawLawMawNaqcaqcaqcaqcaqcawOawPawQatoaaaaaaallamlamlamlamlamlamlavDatsatsatsatsatsatsatsawRamlamlamlamlasnamlamlarjawSawTawUawVawWawXatwatwatwawYaroaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMawZaxaawZaxbaxaaxaaxcawZaxaaxdaxeaxfaxfaxgamHavTatJaxhanSanSaxiaxjamHaxkarvarvarvarvarvarvaxlatJaxmanSamHasvasvaxnapNaqCaxoaxpaxqaxqaxraxqaxsaxqaxqaxtaxoaxuaxvaxvaxvaxvaxvaxvaxvavZaxwaxxaxyaxzaxAaxBaxCaxDaxEaxFaxGaxHaxIaxJaxKaxLamwaxMacAaeUapTaqOaqPaxNaqRaxOaxPaxQaxQaxQaxRaxSaxTaxUaxVaulaxWaxXaxYaHFayaaybatiaycaydaqcaqcaqcaqcaqcaydapWapWapWallallallanKallallaoyallallarjallallayeallallaoyallarjavuallallaoyallamlavuarjawSayfaroaygavGayhayiayjavGaykaroaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarpavMaylavMaBGaxaaxaaMBavMaylavMayqayraxbaysamHavTavXaytasAasAasCayuayuallasnallayuayuayuayuayvaywauQauNauNauNauNayxapNarBaxoaaaaafaaaayyaaaayzaaaaafaaaaxoaxuaxvayAayBayCayDayEaxvavZayFayGayHayIayJayKayLayMayMayNayOayOayOayPaxKayQamwayRacAaeUapTarQarSarSaySarUayTayUayVayWayXayYayZayZazaayZapWazbazcazdazeazfazgapWaydaqcaqcaqcaqcaqcaydapWaqoamlawTazhallallallaqoamlallaqoarjallaziamlallazjamlallazkazlallazmamlallaoyaoyarjaznazoaroazpavGazqazrazqavGazsaroaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaztaqpazuatBavMaymaynawCaypavMatBazuavMaqpazvazwamHazxazyazzazAatGazBayuazCazDazEazFazGazHazCayuazIazJazKawdawdawdawdawdazLazMaxoaafazNazNazOazNazPazNazNaafaxoaxuaxvazQazRazSazTazQaxvazUazVazWazXazYazZaAaaAbaAcaAdaAeaAfayOayOayOaAgayQamwaAhacAaeUapTapTapTapTapTaAiaAjaAkayZayZayZayZayZaAlaAmaAnayZapWapWapWapWaAoaApapWaydaqcaqcaqcaqcaqcaydapWallamlaAqazhallaArallamlamlallamlarjallamlamlallamlamlallarjasjallamlamlallaAsamlarjawSaAtaroaroaroaroaroaroaroaroaroabtabtabtabtabtaafaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarpavMaylavMaBGaxaaxaaMBavMaylavMayqayraxbaysamHavTavXaytasAasAasCayuayuallasnallayuayuayuayuayvaywauQauNauNauNauNayxapNarBaxoaaaaafaaaayyaaaayzaaaaafaaaaxoaxuaxvayAayBayCayDayEaxvavZayFayGayHayIayJayKayLayMayMayNayOayOayOayPaxKayQamwayRacAaeUapTarQarSarSaySarUayTayUayVayWayXayYayZayZazaayZapWazbazcazdazeazfazgapWaydaqcaqcaqcaqcaqcaydallaqoamlawTazhallallallaqoamlallaqoarjallaziamlallazjamlallazkazlallazmamlallaoyaoyarjaznazoaroazpavGazqazrazqavGazsaroaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaztaqpazuatBavMaymaynawCaypavMatBazuavMaqpazvazwamHazxazyazzazAatGazBayuazCazDazEazFazGazHazCayuazIazJazKawdawdawdawdawdazLazMaxoaafazNazNazOazNazPazNazNaafaxoaxuaxvazQazRazSazTazQaxvazUazVazWazXazYazZaAaaAbaAcaAdaAeaAfayOayOayOaAgayQamwaAhacAaeUapTapTapTapTapTaAiaAjaAkayZayZayZayZayZaAlaAmaAnayZapWapWapWapWaAoaApapWaydaqcaqcaqcaqcaqcaydallallamlaAqazhallaArallamlamlallamlarjallamlamlallamlamlallarjasjallamlamlallaAsamlarjawSaAtaroaroaroaroaroaroaroaroaroabtabtabtabtabtaafaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaylavMavMavMavMavMavMaylavMaaaaqpaAuaysaAvaAvaAwaAxaAvaAvaAyayuazCazEaAzaAAazEazEazCayuaqCaABaACaADaADaADaADaADaADaADaAEaaaazNaAFaAGaAIaAHaAJazNaaaaxoaxuaxvazQaAKaALaAMazQaxvawaazLaxxaANaAOaAPaAQaARaAbaASaATayOayOaAUayOaAgayQamwayRacAaeUapTaqOaqPaAVaqRaxOaAWayZaAXaAmaAYaAYayZaAlaAZaAnayZaBaaBbaBcaBdaBeaApaafaBfaBgaBgaBgaBgaBgaBhaaaallamlaBiaBjallallallallallallaBkaBlallallallallallallaBmaBnaBoaBpaBpaBpaBqaBraBsaBtaBuaBvaBwaBxaByaBzaBAaBBaBCaBDaBDaBDaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaajxaekaBEaekaeZaeZaeZaeZaekaBEaBFaelaqpaBGaBHaBIaBJaBKaBLaBMaBNaBOayuazCazEazEaBPazEazEazCayuaBQaBRaBSaBTaBUaBVaBWaBXaBYaBZaAEaafazNaCaaCbaCdaCcaCeazNaafaxoaxuaxvaCfaCgaChaCiaCjaxvapNaCkaxxaClaCmaCnayOaCnaCoaCpaCqaCraAgaxKaCsaxKayQamwayRacAaeUapTarQarRarSaCtarUaCuayZaCvaAmaAmaAmazaaCwaCxaCyayZaCzaCAaCBaCCaCDaApaaaaafaaaaafaaaaafaaaaafaaaallavuaCEaBsaCFaCGallasiamlavuarjamlallaaaallawTaBsaBsaCHaCIaCJaCJaCJaCJaCJaCKaCLaCMaCNaCOaCOaCOaCPaCQaCRaCSaCTaCUaCVaCWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajxaekaekaCXaOualQaCZaDaaDbaDcaDdaDealQaDgaDfavMaBGaDhaAvaDiaDjaDkaDlaDmaDnayuaDoazEazEazEazEaDpaDqbRJaDsaDtaDuaBYaBYaBYaBYaBYaBYaBYaAEaaaazNaDvaDwaDwaDxaDzazNaaaaxoaxuaxvaDAaDBaDCaDDaDEaxvapNaDFaxxaxxaDGaATaDHaATaDIaxxaxxaDJaDKaxKaDLaxKayQamwayRacAaeUapTapTapTapTapTaDMaDNaDOaDPaDQaDRaDRaDRaDSayZaDTayZaDUaDVaDWaBdaBeaApallallallallallallallallallallallallallaDXallallallallawTaBtaDYaDZaEaaDZaEbaEcaEdaEdaEeaEfaEfaEfaEfaEfaEgaEhaEiaEiaEiaEiaEiaEiaBDaEjaEkaElaBDaBDaBDaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZaEmaEmaEnalQaEoalQaEoalQaEoalQaEoalQaDgaEpavMaBGaEqaAvaEraEsaEtaEuaEvaEwayuaExazEaEyaEzaEzaEAaEBaECaEDaEEaEFawKaEGaEGaEGawKaEHaEIaAEaafazNaEJaDyaEKaELaEMazNaafaxoaENaEOaEPaEQaDCaERaESaETaEUaEVaxKaEWaEXaDJaDJaDJaEYaEZaxKaFaaFaaxKaDJaxKaFbaoeaFcacAaeUaeUaeUaeUaeUamXawvaFdaFeaFfaFgaFeayoaFeaFiaFeaFjayZaFkaFlaFmaBdaFnaFoaFpaFqaFraFsaFtaFuaFuaFuaFuaFvaFwaFuaFuaFxaFyaFzaFAaBpaFBaFCaFDaFEaFFaFEaFGaFHaEfaEfaFIaEfaFJaFKaFLaEfaEiaFMaEiaFNaFOaFPaFQaFRaFSaFTaFUaFVaFWaFXaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZalQalQaGaalQaEoalQaEoaGbaEoalQaEoalQaDgaEpavMaBGaGcaAvaAvaGdaGeaGfaGgaAvayuayuayuayuaGhazEaAzaGiayuaGjaGkaBYaBYaBYaFhaBYaBYaBYaGmaAEaaaazNazNaGnaGoaGnazNazNaaaaxoaxuaxvaGpaGqaGraGsaGtaxvapNaGuaxKaGvaEXaDJaDJaDJaEYaGwaxKaAgaAgaxKaCsaxKaGxaGyaGzacAamXacAacAacAacAacAaGAaGBayZaGlaAmayZaGDayZaGEayZaGFayZaGGaGHaFmaBdaGIaGJaGKaGLaGMaGMaGNaGMaGMaGOaGMaGPaGQauwauwauwauwaGRaGSaGTaGUaGVamlaGWaGWaGWaGWaGXaEfaGYaGZaHaaGCaHcaHdaEfaHeaHfaEiaHgaHhaHiaHjaFRaHkaEjaEkaCTaHlaHmaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZaHnaHnaHoalQaEoalQaEoalQaEoalQaEoalQaDgaEpavMaHpaHqaHraHsaHsaHtaHuaxaaHvaHwaHxaHyayuaHzazEazEaHAayuaHBaHCaBYaHDaHEaOwaHGaHHaHIaHJaAEaaaaafaaaaHKaHLaHKaaaaafaaaaxoaxuaxvaDCaHMaHNaHOaHPaxvapNasJaxKaHQaHRaDJaDJaDJaHSaHTaxKaaaaaaaHUaHVaHWaHXaHYbzZaIaaIbaHUaaaaaaaIcaIdaIeaIfayZaIgaAmaAmaAmaCxaAmaAmaAmayZaBdaIhaIiaBdaBdaApaIjaIkaIkaIlaImaInaIkaIoaIkaIpaIqaIpaIraIpaIsaGWaGWaItaGWaGWaGWaGWaIuaIvaGWaGXaEfaGZaIwaIxaIyaIzaIAaEfaIBaICaIDaIEaIFaIGaIHaIIaIJaBAaIKaFVaFWaILaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZalQalQaGaalQaEoalQaEoaGbaEoalQaEoalQaDgaEpavMaBGaGcaAvaAvaGdaGeaGfaGgaAvayuayuayuayuaGhazEaAzaGiayuaGjaGkaBYaBYaBYaFhaBYaBYaBYaGmaAEaaaazNazNaGnaGoaGnazNazNaaaaxoaxuaxvaGpaGqaGraGsaGtaxvapNaGuaxKaGvaEXaDJaDJaDJaEYaGwaxKaAgaAgaxKaCsaxKaGxaGyaGzacAamXacAacAacAacAacAaGAaGBayZaGlaAmayZaGDayZaGEayZaGFayZaGGaGHaFmaBdaGIaGJaGKaGLaGMaGMaGNaGMaGMaGOaSOaGPaGQauwauwauwauwaGRaGSaGTaGUaGVamlaGWaGWaGWaGWaGXaEfaGYaGZaHaaGCaHcaHdaEfaHeaHfaEiaHgaHhaHiaHjaFRaHkaEjaEkaCTaHlaHmaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZaHnaHnaHoalQaEoalQaEoalQaEoalQaEoalQaDgaEpavMaHpaHqaHraHsaHsaHtaHuaxaaHvaHwaHxaHyayuaHzazEazEaHAayuaHBaHCaBYaHDaHEaOwaHGaHHaHIaHJaAEaaaaafaaaaHKaHLaHKaaaaafaaaaxoaxuaxvaDCaHMaHNaHOaHPaxvapNasJaxKaHQaHRaDJaDJaDJaHSaHTaxKaaaaaaaHUaHVaHWaHXaHYbzZaIaaIbaHUaaaaaaaIcaIdaIeaIfayZaIgaAmaAmaAmaCxaAmaAmaAmayZaBdaIhaIiaBdaBdaApaIjaIkaIkaIlaImaInaIkaIoaIpaIpaIqaIpaIraIpaIsaGWaGWaItaGWaGWaGWaGWaIuaIvaGWaGXaEfaGZaIwaIxaIyaIzaIAaEfaIBaICaIDaIEaIFaIGaIHaIIaIJaBAaIKaFVaFWaILaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanTaekaekaCXaCYalQalQalQalQalQalQaIMalQaDgaINavMaBGaxaaIOaIPaIPaIPaIPaIPaIPaIPaIQaxaayuaIRaISaIRayuayuaITaIUaIVaADaADaADaADaIVaIWaIXaAEaIYaIZaIZaJaaJbaJaaIZaIZaJcaxoaJdaxvaJeaxvaJfaJfaJgaxvaJhaJiaxKaxKaxKaAgaDHaAgaxKaxKaxKaHUaHUaHUaJjaHYaHYaHYaHYaHYaJkaHUaHUaHUaIcaJlaIeaJmayZayZayZayZayZayZayZayZayZayZaJnaJoaJpaJqaJraJsaJtaJuaIkaJvaImaJwaJxaJwaIpaJyaJzaIpaJAaIpaJBaJCaJDaJEaJFaJFaJFaJGaJHaJIaGWaGXaEfaJJaIwaJKaIyaIzaJLaEfaJMaJNaJOaJPaJQaJRaJSaJTaJUaJVaJWaCTaHlaHmaFYaaaaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanTaekaJXaekaeZaeZaeZaeZaekaBEaJYafOaqpaJZaxaaKaaHbaKbaKcaKbaKdarpaKeaKfaxaaKgaKhaKiaKiaKjaKiaKkaKlaKiaKiaKiaKiaKiaKiaKiaKmaKnaKoaKpaKqaKqaKraKsaKqaKqaKqaKtaKuaKvaKraKqaKqaKqaKwaGyaKxaHYaKyaKzaHZaIaaIaaIaaHXaHYaHYaKAaHYaKBaKCaKDaKEaKFaKGaKHaKIaHYaHYaKAaKJaKKaKLaKMaKNaKOaKPaKQaHYaKRaHYaBdaKSaKTaKUaJoaKVaKWaKXaKYaKZaLaaIkaLbaLcaLdaLeaLfaIpaLgaJzaLhaLiaIpaGWaLjaLkaLlaLmaLnaLoaLpaLqaLraGWaGXaEfaLsaLtaLuaLvaLwaLxaEfaLyaLzaEiaLAaLAaLAaLAaEiaLBaCRaJWaCTaBDaBDaBDaLCaLCaLCaLDaLDaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanTaekaJXaekaeZaeZaeZaeZaekaBEaJYafOaqpaJZaxaaKaaHbaKbaKcaKbaKdarpaKeaKfaxaaKgaKhaKiaKiaKjaKiaKkaKlaKiaKiaKiaKiaKiaKiaKiaKmaKnaKoaKpaKqaKqaKraKsaKqaKqaKqaKtaKuaKvaKraKqaKqaKqaKwaGyaKxaHYaKyaKzaHZaIaaIaaIaaHXaHYaHYaKAaHYaKBaKCaKDaKEaKFaKGaKHaKIaHYaHYaKAaKJaKKaKLaKMaKNaKOaKPaKQaHYaKRaHYaBdaKSaKTaKUaJoaKVaKWaKXaKYaKZaLaaIkaLbaLcaLdaLeaLfaIpaLgaJzaLhaLiaIpaIpaLjaLkaLlaLmaLnaLoaLpaLqaLraGWaGXaEfaLsaLtaLuaLvaLwaLxaEfaLyaLzaEiaLAaLAaLAaLAaEiaLBaCRaJWaCTaBDaBDaBDaLCaLCaLCaLDaLDaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaylavMavMavMavMavMavMaylavMaaaaqpaAuaLEaKaaLFaLGaLHaLHaLIarpaLJaKfaLKaLLaKhaLMaLNaLOaLPaLQaLRaKiaKiaKiaKiaKiaKiaKiaKmaKiaKhaKiaKiaKiaLSaLTaLUaLUaLUaLUaLVaLUaLWaLUaLUaLXaKhaGyaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaKAaHYaLYaLZaMaaMbaMcaMdaMeaMfaHYaHYaKAaHYaHYaHYaHYaHYaHYaHYaHYaHYaMgaHYaBdaKUaKUaKUaMhaMiaMjaMkaMlaMmaMnaIkaMoaImaMpaIkaIkaIpaMqaJzaMraLiaMsaIpaGWaGWaGWaGWaGWaGWaMtaMuaMvaGWaGXaEfaMwaGZaMxaMyaGZaMzaEfaEiaEiaEiaEiaEiaEiaMAaEiaEjaEjaEkaCTaMCaMDaBDaMEaMFaMGaMHaMIaLDaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaztaqpavMatBavMaNTaNUaNVaNWavMatBavMavMaqpaBGaxaaKaaMJaMKaLHaLHaLIarpaMLaKfaxaaLLaKhaKiaMMaMNaMNaMNaMOaMPaMQaMNaMRaMNaMNaMNaMSaMNaMTaMNaMNaMNaMUaMVaMWaMXaMXaMYaMZaNaaNbaNcaKicrraKhaGyaHYaNeaHYaNfaNfaNfaNfaNfaNfaNfaNfaNgaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNhaNfaNfaNfaNfaNfaNfaNfaNfaHYaHYaHYaBdaNiaNiaNiaNiaNiaNjaNkaJsaKZaNlaIkaNmaNnaNoaIkaNpaIpaNqaNraNsaLiaNtaIpaGWaNuaNvaNwaNxaNwaNyaNzaNAaGWaGXaEfaNBaNBaNCaNDaNEaNEbqoaEfaNGaNHaNIaBDaNJaNKaNLaEjaEjaNMaNNaBDaNOaBDaNPaNQaNRaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafarpavMaylavMaBGaxaaxaaMBavMaylavMaNXaNYaNZaxaaKaaOaaRhaKcaOaaKdarpaObaKfaxaaOcaOcaOcaOdaOcaOeaOeaOeaOeaOeaOfaOgaOeaOhaOeaOeaOeaOiaOjaOkaOjaOlaOmaOnaKiaKiaOoaOpaOqaOraKlaKiaNdaOsaOsaHYaHYaHZaHUaHUaHUaHUaHUaHUaHUaHUaOtbUPbUObUQbUObUObUObVMbUObWHbUObXtaOtaHUaHUaHUaHUaHUaHUaHUaHUaHXaHYaHYaIkaOAaOBaOCaOCaOCaOCaOCaJsaODaOCaIkaOEaOFaOGaIpaIpaIpaOHaOIaIpaIpaIpaIpaGWaNwaOJaOKaOKaOKaOLaOMaNwaGWaGXaEfaONaGZaNCaNDaGZaGZaOOaEfaOPaOQaORaBDaEjaOSaOTaOUaOUaOVaOWaOXaOYaBDaOZaPaaNRaPbaNRaPcaPdaPdaPcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafarpavMaylavMaBGaxaaxaaMBavMaylavMaNXaNYaNZaxaaKaaOaaRhaKcaOaaKdarpaObaKfaxaaOcaOcaOcaOdaOcaOeaOeaOeaOeaOeaOfaOgaOeaOhaOeaOeaOeaOiaOjaOkaOjaOlaOmaOnaKiaKiaOoaOpaOqaOraKlaKiaNdaOsaOsaHYaHYaHZaHUaHUaHUaHUaHUaHUaHUaHUaOtbUPbUObUQbUObUObUObVMbUObWHbUObXtaOtaHUaHUaHUaHUaHUaHUaHUaHUaHXaHYaHYaIkaOAaOBaOCaOCaOCaOCaOCaJsaODaOCaIkaOEaOFaOGaIpaIpaIpaOHaOIaIpaIpaIpaIpaIpaNwaOJaOKaOKaOKaOLaOMaNwaGWaGXaEfaONaGZaNCaNDaGZaGZaOOaEfaOPaOQaORaBDaEjaOSaOTaOUaOUaOVaOWaOXaOYaBDaOZaPaaNRaPbaNRaPcaPdaPdaPcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaPeaxaavNaNZaxaaxaaPfavNaxaaPeaNZaxaaxaaxaaPgaPhaPhaPhaPhaPhaPhaPhaPiaxaaOcaPjaOcaPkaOeaPlaPmaPnaPoaPpaPmaPqaPraPsaPtaPuaPvaOiaPwaPxaPyaOlaPzaOnaOnaPAaOnaOnaOsaPBaPCaPDaPEaOsaOsaPFaHYaHZaHUaaaaaaaaaaaaaaaaaaaaaaOtaPGaPHaPIaPJaPKaPLaPMaPNaPOaPPaPQaOtaaaaaaaaaaaaaaaaaaaaaaHUaHXaHYaPRaIkaPSaOCaOCaOCaOCaOCaUaaJsaODaPUaPVaJsaPWaPXaIpaPYaPZaQaaQbaQcaQdaQeaQfaIpaNwaQgaQhaQhaQhaQiaQjaNwaGWaQkaEfaQlaQlaNCaNDaQmaQmaQnaEfaEfaQoaEfaBDaQpaNKaNLaQqaQqaNMaNNaBDaBDaBDaLDaQraQsaQtaLDaLDaLDaLDaQuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaavMaQvaQwaQwaQwaQwaQwaQwaQwaQwaQvaQwaQxaxaaxaaLLaxaaQyaQzaxaaQAaQBaxaaQCaQDaOcaQEaOcaPkaOeaQFaPmaQGaPmaPmaPmaPqaQHaPmaPmaPmaPvaOiaQIaPxaPxaOlaPzaOnaQJaQKaQKaQLaOsaQMaQNaQOaQPaQQaQRaHYaHYaHZaHUaaaaaaaaaaaaaOtaOtaOtaOtaQSaQTaQUaQVaQWaQXaQYaQZaRaaRbaRcaOtaOtaOtaOtaaaaaaaaaaaaaHUaHXaHYaHYaRdaOCaReaRgaRgaRgaRjaRiaRHaRkaRlaRmaRnaRoaRpaRqaRraRraRsaRtaRuaRuaRvaRraRwaRxaRyaRzaRAaRBaRCaQjaNwaGWaGXaEfaGZaGZaNCaNDaGZaGZaGZaRDaREaGZbqpaBDaRGaUyaRIaQqaQqaSHaRKaRLaBDaRMaRNaPaaNRaROaNRaRPaPdaPdaRQaRRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaqpaqpavMavMavMavMavMavMavMavMaqpaqparpaLLaRSaRTaRTaRUaRTaRTaRTaRVaRTaRTaRTaOcaQEaRWaRXaOeaRYaPmaRZaTfaSbaScaSdaSaaPmaPmaPmaSeaOiaSfaSgaShaOlaPzaOnaSiaSjaSkaSlaOsaSmaSnaSoaSpaSqaQRaHYaHYaHZaHUaHUaIcaSraOtaOtaSsaStaSuaSvaSwaSxaSyaSzaSxaSAaSxaSxaSBaSCaSDaSEaSFaOtaOtaSraIcaHUaHUaHXaHYaHYaIkaSGaJsaOCaOCaOCaOCaXsaOCaSIaSJaSKaSLaSMaSNaSOaSPaSQaSRaSSaSTaSUaSVaSPaSWaSXaSYaSZaTaaTbaSZaTcaTdaGWaGXaEfaTeaTeaNCaNDaTlaGZaGZaTgaGZaThaTiaBDaTjaTkaTpaQqaQqaTmaTnaEjaBDaToaNRaPaaNRaROaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6594,70 +6586,70 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUFavMavMaBGaUGaUHaUIaUJaUKaULaUMaUNaTraTtaRTaUOaUPaUQaOcaOeaURaUSaUTaUUaUTaUVaUWaUVaUVaUVaUXaUYaOeaUZaVaaVbaVcaVdaVeaVfaVgaOcaVhaOsaViaVjaVkaVlaVlaQRaHYaHYaHYaHYaHYaVmaVnaVoaVpaVqaVraVsaVtaVuaVvaVwaVxaVyaVzaVAaVBaVCaVDaVsaVEaVFaVGaVHaVIaVJaVKaVLaVMaHYaHYaIkaVNaVOaVPaVQaOCaVRaVSaVQaODaPUaVTaVTaVUaVVaIpaUeaUeaUeaVWaUeaUeaUkaVXaIpaNwaUnaQhaQhaUpaQhaVYaNwaGWaVZaWaaWbaWcaWdaWeaWfaWfaWfaWfaWfaWfaWgaWhaWiaWiaWiaWiaWiaWjaWkaWlaWhaWmaWnaWoaWpaNRaWqaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWraWsatBaWsaxaaxaaRTaWtaWuaWvaWvaWvaWwaWxaWyaRTaWzaQEaUQaWAaWAaWAaWBaWCaWAaWDaWEaWFaWGaWHaWHaWIaWJaOeaWKaWLaWMaWNaWOaWPaWPaWQaWRaWRaWSaWSaWSaWSaWSaWTaOsaHYaHYaWUaWVaWWaWXaWYaWZaOtaXaaXbaXcaXdaXeaXfaXfaXgaXhaXiaXjaXkaXlaXmaXcaXnaXaaOtaWZaWYaXoaXpaWVaXqaHYaHYaRdaOCaXraXsaOCaOCaOCaXsaOCaODaOCaPUaPUaOCaOCaXtaXuaXvaUeaUeaUeaUeaXwaXxaIpaXyaXzaQhaXAaXBaXCaXzaXDaGWaXEaXFaXFaXGaXHaXIaXJaXKaXLaXJaXJaXJaXMaXNaXOaXPaXPaXPaXPaXPaXQaXRaXNaXSaXTaXUaXVaNRaXWaLDaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMavMavMaBGaxaaXXaTraXYaWvaWvaWvaXZaYaaTraRTaYbaYcaUQaWAaYdaYeaYfaYgaWAaYhaYiaYjaOeaYkaYlaYmaRZaOeaYnaYoaYpaYpaYpaYpaYqaYpaYpaYraYsaYsaYsaYtaYsaYuaYvaKAaKAaYwaYxaYxaYxaYxaYxaYxaYyaYzaYAaYBaXgaYCaYDaYDaYEaYFaYDaYCaXiaYGaYHaYIaYJaYHaYHaYHaYHaYHaYHaYKaKAaKAaIkaYLaYMaYNaYOaOCaOCaOCaYPaYQaYRaOCaYSaYTaYUaIpaIpaIpaYVaYWaYWaYWaIpaIpaIpaYXaQhaQhaYYaYZaZaaZbaYYaGWaZcaXFaZdaEfaZeaUzaZgaZfaZiaZjaTgaUuaZkaBDaZlaEjaZmaQqaQqaZmaEjaZnaBDaZoaZpaZqaROaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaZraNZaZsaRTaTtaZtaTtaTraZuaZvaZwaTtaRTaZxaZyaZzaWAaWAaWAaZAaZBaWAaZCaYiaZEaOeaYkaYlaYmaRZaOeaYnaYoaYpaZFaZGaZGaZGaZHaYpaZIaZJaZKaZLaYvaYvaYvaYvaHYaHYaZMaZNaZOaZPaZQaZRaZSaZTaZUaZVaZWaZXaYDaYDaZYaZZaZYaYDaYDbaababbacbadbaebafbagbahbaibajaYHaXqaHYaHYaIkaIkaIkaIkaIkbakaRdbakbalaIkaIkaIkaIkaIkaIkbanbaobaobaobaobaobaobapbaobanaYYbaqbaqaYYbaraXFaXFaXFbanaZcaXFaZdaEfaEfaEfbasbatbasaEfbasaEfaEfaBDaBDbaubaubaubaubaubauaBDaBDbavaNRbawaROaNRaNRaRQaPdaPdaRQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaZraNZaZsaRTaTtaZtaTtaTraZuaZvaZwaTtaRTaZxaZyaZzaWAaWAaWAaZAaZBaWAaZCaYiaZEaOeaYkaYlaYmaRZaOeaYnaYoaYpaZFaZGaZGaZGaZHaYpaZIaZJaZKaZLaYvaYvaYvaYvaHYaHYaZMaZNaZOaZPaZQaZRaZSaZTaZUaZVaZWaZXaYDaYDaZYaZZaZYaYDaYDbaababbacbadbaebafbagbahbaibajaYHaXqaHYaHYaIkaIkaIkaIkaIkbakaRdbakbalaIkaIkaIkaIkaIkaIkaIkbaobaobaobaobaobaobapbaoaGWaYYbaqbaqaYYbaraXFaXFaXFbanaZcaXFaZdaEfaEfaEfbasbatbasaEfbasaEfaEfaBDaBDbaubaubaubaubaubauaBDaBDbavaNRbawaROaNRaNRaRQaPdaPdaRQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaqpaqpavMavMavMavMavMavMavMavMaqpaqparpaQyaxaaRTaRTaRUaRTaRTaRTaRVaRTaRTaRTbaxbaybazaWAaYdbaBaZAbaCaWAbaDbaEbaDaOeaYkaYlaYmaRZaOeaYnaYoaYpaZGbaFbaFaZGbaFaYpaZIbaGbaHbaHbaIbaJbaKaYvbaLaHYaWUbXubaNbaObaPbaQbaQbaRbaSbaTaZWbaUaYDaYDaZYbaVaZYaYDaYDbaWbabbaXbaYbaZbbabbbbbcbajbbdaYHaXqbbecrtaGybbfaXFaXFaXFaXFaXFaXFaXFaXFbbgaXFaXFaXFaXFbbhaXFaXFaXFaXFaXFaXFaXFaXFbbfaXFaXFaXFaXFbaraXFaXFaXFbbibbjaXFaXFbbkaXFaXFaXFbblaXFaXFaXFaXFaXFbbhbbmaXFaXFaXFaXFaXFaXFbbfbbnaRNaNRbbobbpbbqbbraLDaLDaLDaQuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMavQavPavPavPavPavPavPavPavPavQavPbbsbbtaxabbuaRWbbvaWPaWPaWPbbwbbxbbyaOcbbzbbAbbBaWAaWAaWAbbCbbDaWAaOeaOeaOeaOeaYkaYlbbEbbFaOeaYnaYoaYpaZGbbGaZGbaFbbHaYpaZIbbIbaHbaHbaHbbJbbKaYvbbLaHYaWUbXvbbMbaObbNbbObbPbbQbbRbbSaZWbbTaZYaYDbbUbbVbbUaYDaZYbbWbabbbXbbYbbZbcabcbbbcbajbajaYHbccaHYaHYaGybbfaXFaXFaXFaXFaXFaXFaXFaXFbcdaXFaXFaXFaXFaXFaXFbcebcfbcfbcfbcgaXFaXFbbfaXFaXFaXFaXFbaraXFaXFbchaWbbciaWbaWbaWbaWbaWbaWbbcjaWbaWbaWbaWbaWbaWbaWbaWbaWbaWbaWbaWbbckbclbcmbcnbcnbcoaROaNRaNRbcpaPdaPdbcpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafavMawZaxaawZaxbaxaaxaaxcawZaxaawZaxbaxabcqaHqbcrbcsbctbcrbcrbcrbcubcvaOcaOcaOcbcwaUQaWAaYdbcxbcybczaWAbcAbcBbcAaOeaOeaOebcCbcDaOcaYnaYoaYpbcEaZGbaFbcFbcGaYpaZIaYvbcHbaHbaHbcIbcJbcKbcLaHYaWUbXvbcMbaObbNbcNbcObcPbaSbaOaZWbcQbcRaYDbcSbcTbcUaYDbcVbcWbabbcXbcYbcZbdabdabdbbajbdcaYHbddbdecuAaGybbfaXFaXFbdfaXFbdgbdhbdhbdhbdibdhbdhbdhbdjaXFaXFaXFaXFaXFaXFbdkbdlbdmbbfaXFaXFaXFaXFbarbdnbdobdpbdqbdraXFaXFaXFaXFaXFbdsbdtaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFbbfbdubdvbdwbdxaROaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarpavMbdyavMaBGaxaaxaaMBavMbdAavMayqbdBbdCbdCbdDbdEbdFbdGbdHbdIbdJbdKbdLbdMbdMbdNbdOaWAaWAaWAbdPbdQaWAaOcaOcaOcaOcbdRaVbbdSbdTaVbbdUaYoaYpbdVaZGaZGbdWbdXaYpbdYaYvbdZbaHbaHbeabebbecbedaHYaWUaYxbaObeebaPbaPbefbaRbaSbegbehaXfbeibejbekbekbekbelbemaXkbenbeobepbeqberbajbesbajbetaYHaXqaHYaHYbeubeubeubeubeubeubeubevbewbewbexbeybeybevbezbezbezbezbezbeAbeAbeBbeCbeAbeAbeAbeAbeDaXFbeEbeFbeGbeHbeIaXFaXFaXFbeJbeJbeKbeKbeKbeKbeKbeLbeMbeMbeMbeNbeMbeObePbeMbeMbeQbeRbeRbeRbeRbeSbeTbeUbeVaLDaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaztaqpazuatBavMaymaynbeWbeXavMatBazuavMaqpaztarpbdDbeYbeZbeZbeZbfabdJbfbbfcbfdbfdbfebffaWAaYdbfgbdPbfhaWAbfibfiaQEaQEbfjbfkbflbfmbflbflbfnaYpbfobfpaZGaZGbdXbfqbfraYvbfsbaHbaHbeabftbfubedaHYbfvaYxbfwaYAbfxbfybfzbfAbaSbfBaYxaafbfCbfDbfDbfDbfEbfFbfGaafaYHbfHbfIbfJbfKbajbfLbajbfMaYHaXqaHYbfNbeubfObotbfQbfRbfSbeubqnbfVbfVbfWbfXbfXbfXbfYbfZbgabgbbezbgcbgdbgebgdbgdbgfbggbeAbeGbghbeGbeGbeGbgibeIbeIbgjbeIbgkbgkbeKbglbgmbgnbeKbgobgpbgobeKbgqbgrbgqbeRbgsbgtbgsbeRbgubgvbeRbgwbgxaLDaLDaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafavMawZaxaawZaxbaxaaxaaxcawZaxaawZaxbaxabcqaHqbcrbcsbctbcrbcrbcrbcubcvaOcaOcaOcbcwaUQaWAaYdbcxbcybczaWAbcAbcBbcAaOeaOeaOebcCbcDaOcaYnaYoaYpbcEaZGbaFbcFbcGaYpaZIaYvbcHbaHbaHbcIbcJbcKbcLaHYaWUbXvbcMbaObbNbcNbcObcPbaSbaOaZWbcQbcRaYDbcSbcTbcUaYDbcVbaAbabbcXbcYbcZbdabdabdbbajbdcaYHbddbdecuAaGybbfaXFaXFbdfaXFbdgbdhbdhbdhbdibdhbdhbdhbdjaXFaXFaXFaXFaXFaXFbdkbdlbdmbbfaXFaXFaXFaXFbarbdnbdobdpbdqbdraXFaXFaXFaXFaXFbdsbdtaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFbbfbdubdvbdwbdxaROaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarpavMbdyavMaBGaxaaxaaMBavMbdAavMayqbdBbdCbdCbdDbdEbdFbdGbdHbdIbdJbdKbdLbdMbdMbdNbdOaWAaWAaWAbdPbdQaWAaOcaOcaOcaOcbdRaVbbdSbdTaVbbdUaYoaYpbdVaZGaZGbdWbdXaYpbdYaYvbdZbaHbaHbeabebbecbedaHYaWUaYxbaObeebaPbaPbefbaRbaSbegbcWaXfbeibejbekbekbekbelbemaXkbdzbeobepbeqberbajbesbajbetaYHaXqaHYaHYbeubeubeubeubeubeubeubevbewbewbexbeybeybevbezbezbezbezbezbeAbeAbeBbeCbeAbeAbeAbeAbeDaXFbeEbeFbeGbeHbeIaXFaXFaXFbeJbeJbeKbeKbeKbeKbeKbeLbeMbeMbeMbeNbeMbeObePbeMbeMbeQbeRbeRbeRbeRbeSbeTbeUbeVaLDaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaztaqpazuatBavMaymaynbeWbeXavMatBazuavMaqpaztarpbdDbeYbeZbeZbeZbfabdJbfbbfcbfdbfdbfebffaWAaYdbfgbdPbfhaWAbfibfiaQEaQEbfjbfkbflbfmbflbflbfnaYpbfobfpaZGaZGbdXbfqbfraYvbfsbaHbaHbeabftbfubedaHYbfvaYxbfwaYAbfxbfybfzbfAbaSbfBaYxaafbfCbfDbfDbfDbfEbfFbfGaafaYHbfHbfIbfJbfKbajbfLbajbfMaYHaXqaHYbfNbeubfObotbfQbfRbfSbeubehbfVbfVbfWbfXbfXbfXbfYbfZbgabgbbezbgcbgdbgebgdbgdbgfbggbeAbeGbghbeGbeGbeGbgibeIbeIbgjbeIbgkbgkbeKbglbgmbgnbeKbgobgpbgobeKbgqbgrbgqbeRbgsbgtbgsbeRbgubgvbeRbgwbgxaLDaLDaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafavMbdyavMavMavMavMavMavMbdAavMaafaafaafaaabdDbgybdDbgzbeZbgAbgBbcraVbbgCbgDbgEbgFbgGbgGbgGbgGbgGbgGbgHbgIbgJbfdbgKbgLaYpaYpaYpaYpaYpaYpbgMaYpaYpaYpbgNbgObgPbgQbgRbaHbaHbeabgSbecbedaHYbgTaYxbgUaYAaYAaYAaYAbfAbaSbgVaYxaafbfCbfDbgWbgXbgYbfDbgZaafaYHbhabbYbhbbhcbajbesbajbajaYHaXqaHYaHYbeubqqbhebhfbhgbhhbhibfXbhjbfXbhkbfXbfXbhlbfYbhmbhnbhobezbhpbgdbhqbgdbhpbhrbgdbeAbhsbhsbhubhvbeGbhwbeIbhxbhybhzbhAbhAbeKbhBbhCbhDbhEbhFbhGbhHbeKbhIbhJbhKbeRbhLbhMbhLbhNbhObhObeRbhPbgxaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaacuzaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaabdDbhQbhRbhSbhTbhTbhUbhVaWPbhWaOcbhXbhYbhZbhZbhZbiabiabiabiabiabiabiabibbgNbicbidbiebifbigbihbiibijaYpbikbilbimbinbinbiobaHbaHbeabaHaYvbedaHYaWUbipbiqbirbisbitaYAbiubaSaYxaYxaafbfCbfDbgXbfDbgXbfDbgZaafaYHaYHbivbcZbiwbajbixbiybizaYHaXqaHYbiAbiBbiCbiDbqrbiFbrWbiHbfXbiIbiJbiKbiLbiLbiMbfYbiNbhnbiObezbhpbgdbhqbiPbhpbiQbiRbeAbiSbiTbiUbiVbeGbgibeIbiWbiXbiXbiYbiZbjabjbbjcbjcbjcbjdbjebjfbeKbjgbhJbjhbeRbjibjjbjkbjlbjmbjnbeRbhPbgxbjobjobjobjoaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaabdDbjpbdDbjqbjrbjrbjsbdDbjtbjtaOcbjubjvbjubjubjubjvbjuaOcaOcaYpaYpaYpbjwbgNbjxbjxbjybjxbjxbjxbiibjxbjzbjAbjBbjCbjDbjEbjEbjEbjEbjFbjGbjHbjIbjJbjKbjLbjMbjNbjObjPaYAbfAbaSaYxaafaafbfCbfDbgYbjQbgWbjRbgZaafaafaYHbjSbjTaYHaYHaYHaYHbjUaYHbjVaHYaHYbeubjWbhebjXbhgbhhbjYbfXbjZbkabkbbkcbtmbkebezbkfbkgbkhbezbhpbgdbkibkjbhpbkkbgdbeAbeGbeGbeGbeGbeGbgibeIbklbkmbknbkobkpbkqbkrbksbktbktbkubkvbkwbeKbkxbhJbkybeRbkzbkAbkBbkCbkDbkEbeRbhPbkFbkGbkHbkIbkHaaaaaaaafaaaaafaaaaafaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaabdDbkJbhRbkKbjrbkLbkMbdDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkNbkObkPbkQbkRbkSbkSbkTbkSbkSbkSbkUbkSbkVbkWbkXbkYbkZbecbecbecblaaYvblbaYvblcbldaKAbipbleblfblfblfblfblgblhbliaafaaabljblkbllbfDbfDblmbgZaaaaafblnbloblpblqblrblsblnbltblnbluaHYaHYbeublvbhectCblwblxbeublybjZbkablzblAbfXblBbezblCblDblEbezblFblGblHblIblJblKblLblMblNblOblNblNblNblPbeIblQbhyblRblSblTbkqblUblVblWblWblXblYblZbeKbmabgrbmbbeRbmcbmdbmebkCbhObmfbeRbhPbmgbmhbmibmibmibmibmibmibmjaafaaaaafaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaabdDbmkbhRbhRbhRbdDbdDbdDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkNbmlbjxbmmbmnbmobmnbmnbmnbmnbmnbmpbmnbmqbmrbmsbmtbmubmvbecbmwbaHbmxbmybmzbedbmAbmBbipbipblibmCbmDbmEbmFbmGbliaaaaaabfCbmHbmIbmJbmIbmKbgZaaaaaablnbmLbmMbmNblnbmOblnbltblnbluaHYaHYbeubmPbhebjXbmQbmRbeubmSbmTbmUbmVbmWbfXbmXbezbfYbmYbmZbezbeAbnabeAbeBbnbbncbncbncbncbncbncbncbncbgibeIbndbkmbknbnebnfbngbnhbnibnibniblXbkvbnjbnkbnlbnmbnnbnobnpbnqbnpbnrbhObnsbeRbntbnubnubnubnubnubnubnubnvbgxbjobjobjoaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbnxbjxbjxbjxbnybnzbnzbnzbjxbjxbjxbjxbjzbnAbeabnBbnCbnDbnEbnFbnGbnHbaHbmzbnIbnJbnKbnLbnMbnNbnObnPbnQbnRbnSbliaafaaabfCbnTbnUbnUbnUbnVbgZaaaaafblnbnWbnXbnYblnbnZblnbltblnboaaHYaKJbobbocbodboebofbogbeubohbjZbhkbmVboibojbmSbmSbokbolbombonboobopbfXboqborbosbvtboubovbowboxboybncbgibeIbozboAboBboCboDbeKboEbnibniboFboGbkvboHboIboJboKboLbnoboMboNbhOboOboPboQbeRboRbrVbrVbrVbrVbrVbrVbrVbhPbgxboTboUbjobjoaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboVboWboVboXboYbjxbjxbiibjxbjxbjxbjxbjxboZaYpaYpbpabpbbjEbpcbpdbecbpebaHbpfbaHbpgblubmAbphbpibpjbpkbplbpmbpnbpobppbliaaaaaabfCbpqbprbpsbprbptbgZaaaaaabpubpvbpwbpubpubpubpubpxbpubpyaKAaKAbeubeubpzbpAbpBbpCbeubpDbjZbpEbpFbpFbpFbpFbpFbpGbpHbpIbpJbpFbpKbpFbpLbpMbosbpNbpObpPbpQbpRbpSbncbpTbpUbpVbpWbpWbpXbpYbpZbqabqbbqbbqcbqdbkvbqebqfbqgbqhbqibnobnobqjbqkbqlbqmbnobeRbrVbrVbrXbvwbrZbrYbsabrVbqsbqtbqubqvbqwbjoaaaaafaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqxbqybqxbqzbjxbjxbjxbnybnzbnzbnzbjxbjxbqAbqBaYpbqCbaHbaHbqDbqEbqFbqGbaHbaHbaHbpgblubqHaHYbpibpjbqIbqJbqKbqLbqMbqNbliaafaafbqObqPbqQbqRbqSbqTbqUaafaafbqVbqWbqXbqYbqZbrabrbbrcbpubrdaHYaHYbmVbrebrfbrgbrhbribrjbrkbrlbrmbrnbrnbrnbrnbrnbrobrpbrqbrrbrsbrtbrubrvbrwbosbrxbrybrzbrAbrBboybncbgibeIbrCbrDbrEbrFbrFbeKbrGbrHbrIbnkbrJbkvbrKbnkbrLbrMbrNbrObrPbrQbrRbrSbrTbrUbsbbthbtgbtjbtibtibtibtlbtkbscbgxbsdbsebjobjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbsfbjxbjxbjxbiibjxbjxbjxbjxbjxbqAbsgaYpbshbsibjEbsjbskbslbeabaHbaHaZhbmzbsnbqHaHYbpibpjblibsobspbsqbsrbssbliaaaaaaaafbfCbstbsubstbgZaafaaaaaabqVbsvbswbsxbsybszbszbsAbsBbsCaHYaHYbmVbsDbfXbsEbsFbsGbsHbsGbsIbsJbsKbsLbsKbsKbsKbsMbsNbfXbhkbsObsPbsPbsQbsRbosbosbsSbsTbsUbpRboybncbeHbeIbsVbsVbsVbsVbsVbeKbnkbnkbnkbnkbsWbsXbsYbnkbsZbtabtbbtcbtcbtcbtcbtdbtebtfbvZbuAbuzbuCbuBbuBbuDbwabrVbtnbgxbsdbsebjoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtobqxbqybqxbmlbtpbjxbjxbtqbjxbtpbjxbjxbjxbqAbtraYpbtsbttbnGbtubtvbecbpbbjEbtwbtxbmzbsnbqHaWUbpibtyblibtzbtAbtBbtCbmGbliaaaaaaaafbtDbtEbnUbtFbtGaafaaaaaabqVbtHbtIbtJbtKbtLbtMbtNbpubtOaHYaHYbmSbmSbtPbtQbpGbtRbtSbtTbtUbtVbtWbtXbtWbtXbtWbtXbtWbtXbtYbtZbsPbuabubbucbudbuebufbugbuhbuibujbncbukbulbumbnmbunbhJbhJbuobhJbhJbupbuqburbusbutbtcbuubuvbuwbuxbuxbuxbuybuybuybuybuybwcbwbbwebwdbwebwfbwebrVbtnbgxbsdbuEbjobjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabuFbuGbuFbuHbuIbuHbuHbuHbuHbuHbuJbuKbjxbqAbuLaYpbuMbaHbuNbuObuPbuQbuRbuRbuRbuQbuQbuSbqHaJkbuTbpjblibuUbuVbuWbuXbuYbliaaaaaaaafbuZbvabqRbvbbvcaafaaaaaabqVbvdbvebvfbvgbtLbtMbtNbpubvhaHYaHYbvibvjbvkbvlbvmbvnbtXbvobvpbvqbvrbvsbDibvubvvbvubFzbtXbhkbjZbsPbvxbvybvzbvAbvBbvCbvDbvEbvEbvFbvGbvHbvIbvJbvKbvLbvMbvNbvMbvMbvObvMbvMbvPbvQbvRbvRbvSbvTbqibuxbvUbvVbvWbvXbvYbambuybxjbxibzCbyAbzDbxibAVbrVbtnbgxbwgbqvbwhbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbkNaYpbkNbkNbkNbwibwibwibwibwjbwkbwkbwibwibwlbwlbwmbwnbuQbwobwpbwqbwrbuQbsnbqHaHZaIcaIcbliblibwsbliblibwtbliaHUaHUaHUbwubwvbsubwwbwxaHUaHUaHUbpubpubpubpubpubpubpubpubpubvhaHYbwybtXbtXbtXbwzbtXbtXbtXbwAbvpbwBbwCbwDbwEbwFbwGbwHbwIbwDbhkbjZbsPbwJbwKbwLbwMbwNbwObrAbrAbrAbwPbwQbwRbwSbwTbwTbwTbwTbwUbwTbwTbwTbwVbwVbwWbwXbwYbwYbwZbxabqibuxbxbbxcbxdbxebxfbxgbxhbrVbrVbFBbFBbFBbrVcfYbrVbtnbgxbsdbsebjobjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibxkbxlbxmbxnbxobxpbwkbxqbxrbxsbxtbxubxvbxwbxxbxybuQbsnbqHaHYaHYaHYbxzaKQbxAaKAbxBbxCbxDaVLaVLaVLbxEbxFbxGbxHbxIaHYaHYaHYaHYaKQaHYaKAaHYaHYaHYbxzaHYbvhaHYbxJbtXbxKbxLbxMbxNbxObtXbxPbxQbxRbxSbwDbwEbwEbxTbxUbxVbwDbhkbxWbsPbrAbxXbxYbxZbwQbyabybbycbydbncbncbeHbyebwTbyfbygbyhbyibyjbykbwTbylbymbynbyobypbwYbyqbyrbysbytbyubyvbywbyxbyybyzbxhchfchfchfchfchfchfchfbrVbtnbgxbsdbsebjoaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwkbyBbyCbyDbyEbyFbyGbyHbyIbyJbyKbyLbyMbyNbyObxxbyPbuQbsnbyQaHYaHYaHYaHYaHYaHYaKAaHYbqHaHYaHYaHYaHYaHYbyRbySbyTaHYaHYaHYaHYaHYaHYaHYaKAbyUaHYaHYaHYaHYbvhbyVbyWbtSbyXbyYbyZbyYbzabtXbzbbvpbvqbzcbtXbzdbzebzfbzgbzhbtXbhkbjZbsPbsPbsPbsPbsPbncbncbncbncbncbncbzibgibzjbwTbzkbzlbzmbznbzobzpbwTbzqbzrbzsbztbzubwYbyqbzvbzwbzxbzybzzbzzbzzbzAbzBbxhchfchfctEctDchfchfchfbrVbtnbgxbsdbsebjobjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibzEbzFbzGbzHbzIbzJbwkbxrbxrbzKbzLbuRbzMbzNbzObzPbuQbzQbzRbzSbzSbzSbzTbzSbzSbzUbzSbzVaHYbzWbzXbzYbzYcuBbAabAbbAcbAdbAeaVLaVLbAfaVLbAgbAhaVLbAibAjbAkbAlaHYaHYbtXbAmbAnbAobtWbApbtXbtWbAqbArbtXbtXbtXbtXbtXbtXbtXbtXbhkbjZbfXbAsbAtbAubAvbAwbAxbAybAzbAAbAwbzibgibABbwTbACbADbAEbAFbAGbAHbwTbAIbAJbAKbALbAMbwYbyqbANbAObuybAPbAQbARbASbATbAUbxhchfchfchfbGLchfchfchfbrVbtnbqtbAWbqvbqwbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibwibwkbwkbwkbwkbwibwibAXbAYbAZbBabuQbuQbuQbuQbuQbuQbBbbBcaIcaIcaIcaIcbBdbBdbBdbBdbBdbBdbBdbBdbBdbBdbBebBfbBgbBhbBhbBhbBhbBhbBibBhbBhbBjbBhbyebBkbyeaIdaJlbBlbtXbBmbBnbBobBpbBqbtXbBrbxQbBsbBtbBubBvbBwbBxbBybBzbBAbBBbBCbBDbBDbBEbBFbBGbBHbBIbBJbBKbBLbAwbzibgibBMbBMbBMbBMbBMbBMbBMbBMbBMbBNbBNbBNbBNbBNbBNbBObBPbBQbuybuybuybuybuybuybuybxhbrVbrVbrVbrVbrVbrVbrVbrVbtnbgxbBRbBSbjobjoaafaafaafaagaagaagaagaagaagaagaagaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBTaaaaaaaaaaafaaaaaabwlbBUbBVbBWbBXbBYbBZbCabCbbCcbCdbCebCfaaaaaaaafaaabBdbCgbChbCibCjbCkbClbCmbCnbCobCpbCqbCrbBhbCsbCtcuDbCubCwbCvbCvbCxbCybCzbCAbyebyebyebyebtXbCBbCCbCDbCCbCEbtXbCFbvpbCGbCHbCIbCJbCIbCIbCKbCLbCMbCNbCObCObCObCPbCQbvlbCRbCSbCTbCUbCVbAwbzibgibBMbCWbCWbCWbCXbCWbCWbCWbBMbCYbCYbCZbCYbCYbBNbDabDbbqibDcbDdbDebDfbDgbDhbJqbDjbDkbDlbDmbDnbDobDpbDqbDqbDrbDsbDdbDdbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajxaekaeZaekaelaaaaafaaabwlbwlbDtbxrbDubDvbDwbDxbDybDybDzbDAbDBbDCaafbDDbDEbDFbDGbDHbDIbDJbDIbDKbDIbDIbDIbBdbDLbDMbDNbBhbDObDPbDQbDRbDSbCvbDTbBjbBhbDUbDVbDWbDXbDYbDZbEabEbbCCbEcbCCbxQbEdbEebEfbEgbtXbEhbEibCCbCCbEjbEkbmSbmSbmSbmSbmSbElbEmbpGbEnbEobEpbBKbEqbAwbzibgibBMbCWbCWbCWbCWbCWbCWbCWbBMbErbEsbEtbEubEvbBNbEwbExbEybEzbEAbEBbECbEDbEDbEDbEDbEEbEFbEGbDnbjobEHbEIbEJbEJbEKbELbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbENbEObENaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZbEPbEQbEPajZbERbERbERbwlbESbxrbETbEUbEVbEWbwlbBcbEXbBcbBcbEYbEZaaabFabFbbFcbFdbDIbDIbFebDIbFfbFgbFhbDIbBdbDLbFibFjbBhbFkbFlbFmbFnbFobCvbFpbBjbzibFqbFrbFsbFrbFtbFubtXbFvbCIbFwbCIbFxbtSbFybCJbFAbtXbFCbCCbCCbCCbCCbGNbmSbPIbFEbFFbFGbBEbFHbvlbFIbBKbBKbFJbFKbFLbFMbFNbBMbCWbCWbCWbCWbCWbCWbCWbBMbFObFPbFQbFRbFSbFTbFUbFVbtbbFWbFXbEDbFYbEDbEDbEDbEDbEDbEDbEDbDnbFZbGabGbbGcbGdbGebGfbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbGgbENbEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZalQaHnalQaeZbERbGhbGibwlbGjbxrbGkbxrbxrbEWbwlbGlbGmbGnbBcbEYbEZaafbFabGobGpbGqbGrbGsbGrbGrbGtbGubGrbGrbGvbGwbGxbGybBhbGzbBhbBhbBhbBhbGAbGBbGCbGDbGEbGFbGGbGHbGIbGIbtXbGJbGKcltbGMbGQbtXbGObGPbGSbtXbGRbGTbGVbGUbIkbGWbmSbGXbGYbpFbGZbHabHbbHcbCRbHdbBKbBKbHebAwbzibgibBMbBMbHfbCWbCWbHgbHfbBMbBMbHhbHibHjbHkbHlbBNbHmbHnbtbbHobHpbHqbHqbHrbHsbHtbHqbHubHvbHwbHxbHybHzbHAbHBbHCbHDbHEbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObHGbHHbHIbEObHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZalQalQalQbHJbHKbxrbxrbHLbGjbxrbxrbxrbxrbEWbwlbHMbGnbHNbBcbEYbEZaaabFabHObHPbHQbDIbDIbHRbDIbHSbHTbHUbHVbBdbHWbHXbHYbHZbIabIbbIbbIbbIbbIbbIcbIbbIdbIebIfbIgbIhbIibIjbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbMNbMNbMNbMNbMNbMNbOnbOCbmSbmSbmSbmSbIlbImbhjbAwbAwbAwbAwbAwbAwbzibgibBMbInbIobIpbIqbIrbIsbInbItbHhbHibHjbIubIvbIwbIxbIybuwbIzbDdbIAbIAbIBbICbIDbIEbEDbEDbIFbDnbIGbIHbIIbDdbIJbIKbIKbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObILbIMbIMbIMbINbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZaHnaHnaHnaeZbERbIObIPbIQbIRbxrbxrbISbITbIUbwlbBcbBcbBcbBcbEYbDCaafbIVbDEbIWbDGbIXbDIbIYbDIbDIbDIbDIbDIbBdbDLbIZbJabJbbJcbJcbJcbJcbJcbJcbJdbJebJfbJgbJhbJibJjbJkbJlbJmbJnbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJobJpbmSbGXcqlbBDbJrbBEbJsbJtbJubJvbJvbJwbJxbJgbJybJzbBMbJAbJBbJCbJDbJEbJFbJGbItbItbItbItbItbItbJHbJIbJJbJKbJLbDdbDnbDnbDnbDnbDnbDnbJMbEDbEDbDnbjobEHbgxbDdbJNbJObJPbJQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJRbJSbJRbIMbJTbIMbJUbJVbENaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZamIbJWbJXajZbERbERbERbwlbwlbERbERbERbwlbwlbwlaaaaaaaaabJYbJZbEZaaaaaaaafaaabBdbKabKbbKcbDIbKdbKebKfbKgbKhbKibKjbKkbKlbKmbKnbKobKpbKqbKmbKmbKmbKmbKmbKrbKsbKmbKmbKtbKmbKubKmbKmbKmbKmbKmbyebyebyebyebyebyebyebyebKvbKwbmSbKxbKybKzbKAbKBbKCbKDbKEbKFbKFbKGbKFbKFbKHbKIbBMbKJbKKbKLbKKbKMbKKbKNbKObKPbKQbKRbKSbKTbKUbyqbHnbqibKVaafbKWbKXbKYbKZbLabKZbLbbLcbLdbDnbLebtnbLfbDdbDdbDdbDdbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObLgbIMbIMbIMbLhbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanTaekbLiaekafOaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaafbJYbEYbEZaafaafaafaafbBdbBdbBdbBdbBdbBdbBdbBdbBdbBdbLjbLkbLlbLmbKmbKnbKobKpbKqbLnbLnbLobLpbLqbLrbLsbLtbLubLvbLwbLxbLybLzbLAbLBbLCbLDbLDbLDbLDbLDbLDbLEbyebKvbLFbLGbLGbLGbLGbLGbLHbLIbLJbLGbLGbLGbLGbLGbLGbLFbLKbLLbLMbLNbLObLNbLPbLQbLRbLSbLSbLSbLSbLSbLSbLTbLUbLVbqibKVaafbKWbLWbLWbLXbLYbLZbMabMbbMcbDnbMdbtnbkFbjobMebMfbjoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObMgbMhbMibMjbHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaaabJYbEYbEZaaaaaaaaaaafbMkbMlbMlbMmbMnbMobMobMpbMpbMkbDLbMqbKkbMrbKmbMsbMtbMtbMubMvbLnbMwbMxbMybMzbMAbMBbMCbMDbMEbMFbMGbMFbMHbMIbMJaafbMKbMKbMKbMKbMKbMLbyebKvbMMcqzbMObMPbMQbLGbMRbMSbMTbLGbMUbMVbMWbMVbMUbLFbMXbBMbKKbKKbKKbMYbKKbKKbMZbNabNbbNbbNcbNbbNbbNdbNebNfbNgbKVaafbKWbLWbNhbKZbNibKZbNjbNkbNlbDnbsebtnbkFbjobsebsebjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbNmbENbMjaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbBcbBcbJYbJYbJYbBcbBcaaaaaaaaaaaabJYbEYbEZaaaaaaaaaaafbMkbNnbMmbMmbMmbMmbMobYnbNpbNqbNrbKjbNsbNtbNubNvbNwbNxbNybNzbNAbNwbNwbNwbNybNBbNCbNDbNEbNFbLBbNGbNHbNIbNJbNKbLDbNLbNMbNNbNObMKbMLbNPbKvbLFbNQbMUbMUcrqbLGbNRbNSbNTbLGbMVbNUbMVbNVbNWbNXbNYbBMbNZbOabObbOcbOdbOebOfbOgbOhbOibOjbOkbOlbItbOmbZlbOobOpbOpbDnbDnbDnbDnbDnbDnbDdbDdbDdbDnbsebtnbOqbsebsebOrbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbENbEObENaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBcbOsbGnbOtbGnbOubBcaaaaaaaaaaaabJYbJZbEZaaaaafbJYbJYbMkbMmbMmbOwbOvbMmbOxbMobMobOzbDLbMqbOAbOBbZmbODbOEbOFbOGbOHbOIbOFbOJbOFbOKbOLbOMbLubONbOObOPbOQbORbOSbOTbOUaafbOVbOWbNObOXbMKbMLbNPbKvbLFbOYbOZbMUbPabLGbPbbPcbPdbLGbMUbPebPfbMUbMUbLFbKvbBMbItbItbItbItbJHbPgbPhbPibJHbItbItbItbItbItbPjbPkbPlbPmbPnbPobPpbPqbPpbPrbOpbPsbPtbPubPvbPwbtnbkFbjobjobjobjoabtaafaafaafaagaagaagaagaagaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbBcbPxbGnbGnbGnbPybBcaaaaaaaaaaaabJYbEYbEZaaaaafbJYbPzbPAbPBbMmbMmcbdbPDbPDbPDbPEbPFcbebMqbOAbPHccdbPJbPKbMFbPLbPMbPNbPObPPbPQbPRbPSbPSbPTbPUbLBbPVbPWbPXbPYbPZbQabQbbNLbQcbNObNObMKbMLbNPbKvbLFbQdbMUbQebLHbLGbLGbQfbLGbLGbQgbQhbQibQgbQgbLFbKvbBMbQjbQkbQkbQlbQmbKKbQnbQobQpbQqbCWbCWbCWbItbQrbQsbQtbQubQvbPobQwbQxbQybQzbOmbPtbQAbPtbPvbBRbQBbQCbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaabBcbPxbGnbGnbQDbQEbBcaaaaafaaaaaabJYbEYbDCbBcbBcbBcbQFbMkbQGbMmbMmcqmbQHbQIbQJbQKbMkcqnbMqbOAbPHcqobQLbQMbMFbMFbQNbLnbQObQPbQQbQRbMFbMFbLubQSbQTbQUbQVbQWbQXbQWbQYaafbMKbMKbMKbMKbMKbMLbyebKvbLFbQZbRabRabRbbRcbRdbRebRfbRgbMUbPebMUbMUcqpbLFbKvbBMbCWbCWbCWbRhbRibKKbRjbKKbRkbRlbCWbCWbCWbItbRmbRnbRobRpbRqbRrbRsbRtbRrbRubOpbRvbPtbRwbPvbjobRxbRybjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafbRzaafaafaafbBcbBcbBcbBcbBcbBcbBcbBcbBcbBcbRAbBcbBcbBcbJYbJYbJYbRBbRCbRDbREbRFbRGbRCbRHbPFbPFbPFbPFcqrbMkbMkbMkbMkbMkcqtbRKbOAbRLbKmbRMbRNbPNbRObPNbLnbMFbMFbMFbQRbRPbRQbRQbRRbRSbRTbNGbRUbRVbRWbNKbLDbNLbRXbRYbRYbMKbMLbyebKvbRZbSabSabSabSbbScbMUbSdbMUbMUbMUbPebMUbMUbMUbLFbKvbBMbCWbCWbCWbSebSfbQobSgbKKbShbSibQkbQkbSjbItbSkbSlbPlbSmbSnbPobQybSobRrbSpbOpbSqbSqbSqbPvbSrbSsbRybjoaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabStbSubSubSubSubSvbSwbSwbSxbSybSzbSAbSBbSCbSDbSEbBcbGnbGnbGnbGnbGnbGnbGnbSFbSGbSHbSIbSJbSKbSKbSKbSKbSLbSMbSMbSMbSNcqubSObDybDybSPbBccqnbMqbOAbSQbSRbSSbSTbRQbRQbSUbSVbRQbRQbSWbSXbSYbMFbSZbTabTbbTcbMFbTdbTebTfbOUaafbOVbTgbThbTibMKbMLbNPbTjbTkbTkbTkbTlbLFbTmbQZbTnbTobTpbTqbTrbTsbTsbTtbLFbKvbBMbItbItbItbItbTubTvbRjbTwbTubItbItbItbItbItbTxbTybTzbTAbTBbTCbTCbTCbTCbTDbOmbSqbSqbTEbPvbTFbSsbRybjobjobjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaaaaafaaaaaabTGbTGbJYbGnbTHbTIbTJbTKbTLbBcbTMbJYbJYbJYbJYbJYbJYbJYbJYbDCbTNbTObTObTObTObTObTObTObTObTPbTPcqxbTPbTPbTQbTRbBccqnbMqbOAbSQbTSbTTbTUbTVbPSbTWbTXbPSbPSbTYbTZbUabUbbUcbUdbUebUfbMFbTdbUgbUhbQabQbbNLbUibRYbRYbMKbMLbNPbUjbyebyebyebNYbLFbUkbMUbMUbUlbUmbUnbUobUpbUobUnbLFbKvbBMbQjbQkbQkbUqbQmbKKbQnbQobUrbUsbCWbCWbCWbItbUtbUubUvbUwbRnbRpbUxbUybUzbUAbOpbSqbSqbSqbPvbTFbSsbRybsebsebjoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaagaagaagaagbUBbUCbUDbGnbUEbTIbTIbUFbGnbBcbGnbJYaaaaaaaafaaaaaaaafaaabDCbTNbTObUGbUHbUIbUJbUKbULbUGbUMbUNcqCcqybTPbTPbTRbBccqDbMqbOAbURbUSbUTbUTbUUbKmbKmbKmbKmbKmbUVbUWbLnbLnbLnbUXbMFbTbbMFbTdbTebUYbOUaafbMKbMKbMKbMKbMKbMLbNPbUjbyebUZbzibNYbMMbVabVbbVcbVdbVebVfbVgbUpbVgbVhbLFbKvbBMbCWbVibCWbVjbRibKKbRjbKKbRkbVkbCWbVibCWbItbVlbVmbVnbVobVpbVqbVrbVsbVtbVubOmbVvbVwbVxbPvbSqbSsbVybjobsebjobjobjoaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbTGbTGbJYbVzbVAbVBbVCbVDbGnbVEbGnbJYaaaaaaaafaaaaaaaafaaabDCbTNbTObUGbVFbVGbVHbVIbVJbUGbVKbVLcqEbVNbVObTPbTRbBccqnbMqbOAbVPbVQbKmbVRbVSbKmbVTbVUbVVbKmbVWbQRbVXbLnbVYbUfbMFbUdbVZbWabRVbWbbNKbLDbNLbWcbWdbWebMKbMLbyebUjbyebABbzibNYbLFbWfbWgbWhbWibUmbWgbWjbUpbWjbNVbNXbKvbBMbCWbCWbCWbWkbWlbQobSgbKKbShbWmbQkbQkbSjbBMbPvbWnbWobWobPvbPvbWpbWqbWrbWsbWtbWubTCbWvbSqbSqbSsbRybjobWwbjobWxbjoaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbJYbWybWzbWzbWAbTLbWBbBcbJYbJYaaaaaaaaaaaaaaaaaaaaabDCbTNbTObWCbWDbWEbVHbWFbWCbWCbVKbWGcqGcqFbWIbTPbTRbBccqnbMqbWJbWKbWKbWLbWMbWNbWObWPbWQbWRbKmbMFbQRbWSbWTbVYbWUbMFbUdbVZbTdbTebWVbOUaafbOVbWWbWXbWYbMKbMLbyebUjbyebGHbGHbNYbLFbLGbWZbXabLGbXbbLGbLGbLGbLGbLGbLFbKvbBMbItbItbItbItbTubXcbRjbXdbTubItbItbItbItbBMbRrbXebRrbRrbRrbPvbWpbWqbXfbXgbXhbXibUwbXjbPvbSqbSsbRybjobsebsebsebXkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafabtabtabtbBcbBcbBcbVEbBcbBcbBcbBcaafaaaaaabXlaaaaaaaaaaaaaaabEZbTNbTObWCbWCbXmbXnbXobWCbXpbXqbXrcqIcqHbXsbTPbTRbBccqJbXwbCrbWKbXxbXybXybXzbXAbXBbXCbXDbKmbXEbXFbVXbLnbVYbXGbMFbXHbVZbTdbXIbXJbQabQbbNLbXKbWdbWdbMKbMLbNPbUjbyebXLbzibNYbXMbSabSabXNbLGbXObXPbXQbLHbXRbXSbKwbKvbBMbQjbQkbQkbXTbQmbKKbQnbQobXUbXVbCWbCWbCWbBMbXWbRrbRrbRrbRrbPvbXXbXXbXYbXZbOpbOpbUwbOpbPvbOpbSsbRybjobYabYbbYcbXkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabfabfabfabfabqabfabfabfabfabfaaaaaabBcbGnbGnbGnbGnbGnbGnbGnbGnbWBbJYaafaaaaaaaafaaIbYdaaaaaaaaabEZbTNbTObYebYfbYgbYhbYibYjbYkbYlbYmcqMcqKbYobTPbYpbYqbYrbYsbGybWKbYtbXybYubYvbYwbYxbYybYzbYAbNFbYBbLnbLnbLnbYCbMFbYDbYEbTdbTebMFbOUaafbMKbMKbMKbMKbMKbMLbNPbUjbyebYFbzibYGbYHbTkbYIbYJbLHbYKbYLbYMbLHbYNbKFbYObYPbBMbCWbCWbCWbYQbRibKKbRjbKKbRkbYRbCWbCWbCWbBMbYSbRrbYTbRrbRrbYUbYVbYWbYXbYYbOpbUwbUwbYZbPvbBRbZabZbbjobZcbZdbsebXkaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaafaaaaafaaaacfaaaaafaaaaafaaaabfaafaafbBcbZebGnbBcbBcbBcbRAbBcbBcbBcbBcaaaaaaaaaaaIbZfbZgaaIaaIaafbEZbTNbTObZhbWCbUGbUGbUGbWCbZibZjbZkcqGcqNcqPbTPbBcbBcbZnbZobZpbWKbWKbZqbXybZrbZsbZtbZsbZubKmbMFbZvbZwbZxbZybONbZzbZAbZBbWabRVbZCbNKbLDbNLbZDbZEbZEbMKbMLbNPbUjbyebyebyebZFbZGbyebZHbZIbyebyebZJbyebyebZIbZKbZLbZMbBMbCWbCWbCWbZNbZObQobZPbKKbShbZQbQkbQkbSjbBMbRrbRrbZRbRrbRrbPvbXXbXXbZSbZTbOpbZUbZVbZWbPvboUbZabRybjobjobjobsebjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXbZYbZZaaabZXbZYbZZaaabZXbZYbZZaaaabfaaaaaabBccaacabbBccacbGnbGncadbOucaebBcaaaaaaaaacafaaIaaIaafaaaaaabEZbTNbTObWCcagcahbUGcaibWCbWCbVKcajcqGcqKcakbTPcalcamcancaocapcaqcarcascatcascatcaucatcavbKmcawcaxcaybPSbPSbPUbRPcazbRUbPVbTecaAbOUaafbOVcaBcaCcaDbMKbMLbyebUjbzicaEcaFbZFcaGbyebZHcaHcaIcaJcaKcaLcaIcaMbZHbgxcaNbBMbBMbBMbBMbBMbBMcaOcaPcaObBMbBMbBMbBMbBMbBMbPvbPvbPvbPvbPvbPvcaQcaQcaRcaSbPvbPvbPvbPvbPvbjobRxbRybjocaTcaUbsebjoaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafbZXcaVbZZaaabZXcaVbZZaaabZXcaVbZZaafaafaaaaaabBcbJYbJYbBcbBccaWcaXbOubGnbQDbBcaaaaaaaaaaaaaafaaaaaaaaaaaabDCbTNbTObUGcaYcaZbUGcbacbbbUGbVKcbccqEcqQcqVcqUcqXcqWbOAaZDcbgcbhcbicbjcbkcblcbmcbnbXycbobKmcbpbMFbZvbRPbRQcbqcbrcbscbtbLAcbucbvbQabQbbNLcbwbZEbZEbMKbMLbyecbxcbycbzcbAcbBcbCbyecbDcbEcbFcbGcbHcbGcbIcbEcbJbgxcbKbjoaaaaaaaaaaafaaaaaacbLaaaaafaaaaaaaaaaaabjocbMbMfbkGcbNcbNbPvcbOcbOcaRbQtcbPcbQbsebsebsebBRbRxbVybjocbRbsebsebjobjobjoaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXcaVbZZaafbZXcaVbZZaafbZXcaVbZZaaaaafaafaafaafaafaafaafbBcbBcbBcbBcbRAbBcbBcaaaaaaaaaaaaaafaaaaaaaafaaabDCbTNbTObUGcbScbTcbUcbVcbWbUGcbXcbYcbZccaccbbTPccccqYcceccfccgcchcciccjcckcclccmccnccoccpccqccrbOQccscctbMFbMFbMFbMHbSYcctbTebUYbOUaafbMKbMKbMKbMKbMKbMLbyebYFccuccvccwccxccybyebyecczccAccBbKwccCccDbyebyebgxcbKbjoaaaaaaaaaaafaaaaaacbLaaaaafaaaaaaaaaaaabjobseccEbqvccFccGbPvccHccHccIbQtbPvbOpbjoccJccKbBRbRxccLccMccMccMccNccOccPccOccQaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbZXcaVbZZaaabZXcaVbZZaaabZXcaVbZZaafaafaaaaaaaaaaaaaaaaaabBcccRbBcbGnbGnbBcaafaaaaafaaaaaaaafaaaaaaaafaaabDCbTNbTObTObTObTObTObTObTObTObTPbTPbTPbTPbTPbTPbBcccSbBcccTccUccUccUccVccWccXccUccYccZcdabKmcdbcdcbPXcddcdecdfcdecddcdgcddcdhbRPcdiaafaafaafaafaafaafbMLcdjcdjcdjcdkcdlcdjcdjcdjcdmbyecdncdncdocdncdnbyebABbZGcbKbjobXkbXkbXkbjobXkbXkcdpbXkbjobXkbXkbXkbXkbjobjobRxcdqbjobjobPvbPvbPvcdrcdsbPvbBRbjobYcbseboTbRxbZbbjobjocdtbjobjobjobjoaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaafaaabZXcaVbZZaaabZXcaVbZZaaabZXcaVbZZaaaaafaaaaaacducdvcdvcdvcdvbBcbBccdwbGnbBcbJYbJYbJYbJYbJYbJYbJYbJYbJYbBcbDCbTNbBccdxcdycdzcdzcdzcdzcdzcdzcdzcdzcdzcdAcdAcdzcdBcaWccTcdCcdDcdEcdFcdGcdHccUcdIcdJcdKbKmcdbcdLcdMcdNcdOcdPcdQcdRbMFcdScdTcdUbLuaafaafaaaaaaaaaaaacdVcdWcdXcdYcdZceacebceccdjcedceecefcegcehccBccBbzibzibZGbntceiceiceiceiceiceiceicejcekcekcekcekcekcekcelcekcemcekcekcenceocepceqcercesbjobjocetceoceuceocevbRybjocewbsebsebjoaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaaaaaacexaaaaaaaaacexaaaaaaaaacexaaaaaaaafcducducduceycezceAceBceCbGnceDceEceFceEceEceEceEceEceEceEceEceEceEceGceHbRGceIceJceKceKceKceKceKceKceKceKceKceKceKceKceKceKccTccUceLceMceNceOcePceQceRceSceTceKbLuceUbLuceVbLuceUbLuceVbLuceWbLuceWbLuaafaafaaaaaaaaaaaacdjceXceYceZcfacfbcfccfdcdjcedcfeccBcffcfgcfhcfibDZcfjcfkcflcflcflcflcflcflcflcfmcfncflcflcflcflcflcflcfocfpcfqbmicfrcfscftcftcftcfucfvcfwcfxcfycfzcftcftcfAcfBbjocaUbsecfCbjoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboVboWboVboXboYbjxbjxbiibjxbjxbjxbjxbjxboZaYpaYpbpabpbbjEbpcbpdbecbpebaHbpfbaHbpgblubmAbphbpibpjbpkbplbpmbpnbpobppbliaaaaaabfCbpqbprbpsbprbptbgZaaaaaabpubpvbpwbpubpubpubpubpxbpubpyaKAaKAbeubeubpzbpAbpBbpCbeubpDbjZbpEbpFbpFbpFbpFbpFbpGbpHbpIbpJbpFbpKbpFbpLbpMbosbpNbpObpPbpQbpRbpSbncbpTbpUbpVbpWbpWbpXbpYbpZbqabqbbqbbqcbqdbkvbqebqfbqgbqhbqibnobnobqjbqkbqlbqmbnobeRbrVbrVbrXbenbrZbfUbsabrVbqsbqtbqubqvbqwbjoaaaaafaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqxbqybqxbqzbjxbjxbjxbnybnzbnzbnzbjxbjxbqAbqBaYpbqCbaHbaHbqDbqEbqFbqGbaHbaHbaHbpgblubqHaHYbpibpjbqIbqJbqKbqLbqMbqNbliaafaafbqObqPbqQbqRbqSbqTbqUaafaafbqVbqWbqXbqYbqZbrabrbbrcbpubrdaHYaHYbmVbrebrfbrgbrhbribrjbrkbrlbrmbrnbrnbrnbrnbrnbrobrpbrqbrrbrsbrtbrubrvbrwbosbrxbrybrzbrAbrBboybncbgibeIbrCbrDbrEbrFbrFbeKbrGbrHbrIbnkbrJbkvbrKbnkbrLbrMbrNbrObrPbrQbrRbrSbrTbrUbhtbthbtgbtjbtibtibtibtlbtkbqnbgxbsdbsebjobjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbsfbjxbjxbjxbiibjxbjxbjxbjxbjxbqAbsgaYpbshbsibjEbsjbskbslbeabaHbaHaZhbmzbsnbqHaHYbpibpjblibsobspbsqbsrbssbliaaaaaaaafbfCbstbsubstbgZaafaaaaaabqVbsvbswbsxbsybszbszbsAbsBbsCaHYaHYbmVbsDbfXbsEbsFbsGbsHbsGbsIbsJbsKbsLbsKbsKbsKbsMbsNbfXbhkbsObsPbsPbsQbsRbosbosbsSbsTbsUbpRboybncbeHbeIbsVbsVbsVbsVbsVbeKbnkbnkbnkbnkbsWbsXbsYbnkbsZbtabtbbtcbtcbtcbtcbtdbtebtfbrYbuAbuzbuCbuBbuBbuDbwabrVbsbbgxbsdbsebjoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtobqxbqybqxbmlbtpbjxbjxbtqbjxbtpbjxbjxbjxbqAbtraYpbtsbttbnGbtubtvbecbpbbjEbtwbtxbmzbsnbqHaWUbpibtyblibtzbtAbtBbtCbmGbliaaaaaaaafbtDbtEbnUbtFbtGaafaaaaaabqVbtHbtIbtJbtKbtLbtMbtNbpubtOaHYaHYbmSbmSbtPbtQbpGbtRbtSbtTbtUbtVbtWbtXbtWbtXbtWbtXbtWbtXbtYbtZbsPbuabubbucbudbuebufbugbuhbuibujbncbukbulbumbnmbunbhJbhJbuobhJbhJbupbuqburbusbutbtcbuubuvbuwbuxbuxbuxbuybuybuybuybuybwcbwbbwebwdbwebwfbwebrVbsbbgxbsdbuEbjobjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabuFbuGbuFbuHbuIbuHbuHbuHbuHbuHbuJbuKbjxbqAbuLaYpbuMbaHbuNbuObuPbuQbuRbuRbuRbuQbuQbuSbqHaJkbuTbpjblibuUbuVbuWbuXbuYbliaaaaaaaafbuZbvabqRbvbbvcaafaaaaaabqVbvdbvebvfbvgbtLbtMbtNbpubvhaHYaHYbvibvjbvkbvlbvmbvnbtXbvobvpbvqbvrbvsbDibvubvvbvubFzbtXbhkbjZbsPbvxbvybvzbvAbvBbvCbvDbvEbvEbvFbvGbvHbvIbvJbvKbvLbvMbvNbvMbvMbvObvMbvMbvPbvQbvRbvRbvSbvTbqibuxbvUbvVbvWbvXbvYbambuybxjbxibzCbyAbzDbxibAVbrVbsbbgxbwgbqvbwhbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbkNaYpbkNbkNbkNbwibwibwibwibwjbwkbwkbwibwibwlbwlbwmbwnbuQbwobwpbwqbwrbuQbsnbqHaHZaIcaIcbliblibwsbliblibwtbliaHUaHUaHUbwubwvbsubwwbwxaHUaHUaHUbpubpubpubpubpubpubpubpubpubvhaHYbwybtXbtXbtXbwzbtXbtXbtXbwAbvpbwBbwCbwDbwEbwFbwGbwHbwIbwDbhkbjZbsPbwJbwKbwLbwMbwNbwObrAbrAbrAbwPbwQbwRbwSbwTbwTbwTbwTbwUbwTbwTbwTbwVbwVbwWbwXbwYbwYbwZbxabqibuxbxbbxcbxdbxebxfbxgbxhbrVbrVbFBbFBbFBbrVcfYbrVbsbbgxbsdbsebjobjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibxkbxlbxmbxnbxobxpbwkbxqbxrbxsbxtbxubxvbxwbxxbxybuQbsnbqHaHYaHYaHYbxzaKQbxAaKAbxBbxCbxDaVLaVLaVLbxEbxFbxGbxHbxIaHYaHYaHYaHYaKQaHYaKAaHYaHYaHYbxzaHYbvhaHYbxJbtXbxKbxLbxMbxNbxObtXbxPbxQbxRbxSbwDbwEbwEbxTbxUbxVbwDbhkbxWbsPbrAbxXbxYbxZbwQbyabybbycbydbncbncbeHbyebwTbyfbygbyhbyibyjbykbwTbylbymbynbyobypbwYbyqbyrbysbytbyubyvbywbyxbyybyzbxhchfchfchfchfchfchfchfbrVbsbbgxbsdbsebjoaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwkbyBbyCbyDbyEbyFbyGbyHbyIbyJbyKbyLbyMbyNbyObxxbyPbuQbsnbyQaHYaHYaHYaHYaHYaHYaKAaHYbqHaHYaHYaHYaHYaHYbyRbySbyTaHYaHYaHYaHYaHYaHYaHYaKAbyUaHYaHYaHYaHYbvhbyVbyWbtSbyXbyYbyZbyYbzabtXbzbbvpbvqbzcbtXbzdbzebzfbzgbzhbtXbhkbjZbsPbsPbsPbsPbsPbncbncbncbncbncbncbzibgibzjbwTbzkbzlbzmbznbzobzpbwTbzqbzrbzsbztbzubwYbyqbzvbzwbzxbzybzzbzzbzzbzAbzBbxhchfchfctEctDchfchfchfbrVbsbbgxbsdbsebjobjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibzEbzFbzGbzHbzIbzJbwkbxrbxrbzKbzLbuRbzMbzNbzObzPbuQbzQbzRbzSbzSbzSbzTbzSbzSbzUbzSbzVaHYbzWbzXbzYbzYcuBbAabAbbAcbAdbAeaVLaVLbAfaVLbAgbAhaVLbAibAjbAkbAlaHYaHYbtXbAmbAnbAobtWbApbtXbtWbAqbArbtXbtXbtXbtXbtXbtXbtXbtXbhkbjZbfXbAsbAtbAubAvbAwbAxbAybAzbAAbAwbzibgibABbwTbACbADbAEbAFbAGbAHbwTbAIbAJbAKbALbAMbwYbyqbANbAObuybAPbAQbARbASbATbAUbxhchfchfchfbscchfchfchfbrVbsbbqtbAWbqvbqwbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibwibwkbwkbwkbwkbwibwibAXbAYbAZbBabuQbuQbuQbuQbuQbuQbBbbBcaIcaIcaIcaIcbBdbBdbBdbBdbBdbBdbBdbBdbBdbBdbBebBfbBgbBhbBhbBhbBhbBhbBibBhbBhbBjbBhbyebBkbyeaIdaJlbBlbtXbBmbBnbBobBpbBqbtXbBrbxQbBsbBtbBubBvbBwbBxbBybBzbBAbBBbBCbBDbBDbBEbBFbBGbBHbBIbBJbBKbBLbAwbzibgibBMbBMbBMbBMbBMbBMbBMbBMbBMbBNbBNbBNbBNbBNbBNbBObBPbBQbuybuybuybuybuybuybuybxhbrVbrVbrVbrVbrVbrVbrVbrVbsbbgxbBRbBSbjobjoaafaafaafaagaagaagaagaagaagaagaagaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBTaaaaaaaaaaafaaaaaabwlbBUbBVbBWbBXbBYbBZbCabCbbCcbCdbCebCfaaaaaaaafaaabBdbCgbChbCibCjbCkbClbCmbCnbCobCpbCqbCrbBhbCsbCtcuDbCubCwbCvbCvbCxbCybCzbCAbyebyebyebyebtXbCBbCCbCDbCCbCEbtXbCFbvpbCGbCHbCIbCJbCIbCIbCKbCLbCMbCNbCObCObCObCPbCQbvlbCRbCSbCTbCUbCVbAwbzibgibBMbCWbCWbCWbCXbCWbCWbCWbBMbCYbCYbCZbCYbCYbBNbDabDbbqibDcbDdbDebDfbDgbDhbJqbDjbDkbDlbDmbDnbDobsmbtnbtnbvwbDsbDdbDdbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajxaekaeZaekaelaaaaafaaabwlbwlbDtbxrbDubDvbDwbDxbDybDybDzbDAbDBbDCaafbDDbDEbDFbDGbDHbDIbDJbDIbDKbDIbDIbDIbBdbDLbDMbDNbBhbDObDPbDQbDRbDSbCvbDTbBjbBhbDUbDVbDWbDXbDYbDZbEabEbbCCbEcbCCbxQbEdbEebEfbEgbtXbEhbEibCCbCCbEjbEkbmSbmSbmSbmSbmSbElbEmbpGbEnbEobEpbBKbEqbAwbzibgibBMbCWbCWbCWbCWbCWbCWbCWbBMbErbEsbEtbEubEvbBNbEwbExbEybEzbEAbEBbECbEDbEDbEDbEDbEEbEFbEGbDnbjobvZbEIbEJbEJbEKbELbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbENbEObENaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZbEPbEQbEPajZbERbERbERbwlbESbxrbETbEUbEVbEWbwlbBcbEXbBcbBcbEYbEZaaabFabFbbFcbFdbDIbDIbFebDIbFfbFgbFhbDIbBdbDLbFibFjbBhbFkbFlbFmbFnbFobCvbFpbBjbzibFqbFrbFsbFrbFtbFubtXbFvbCIbFwbCIbFxbtSbFybCJbFAbtXbFCbCCbCCbCCbCCbGNbmSbPIbFEbFFbFGbBEbFHbvlbFIbBKbBKbFJbFKbFLbFMbFNbBMbCWbCWbCWbCWbCWbCWbCWbBMbFObFPbFQbFRbFSbFTbFUbFVbtbbFWbFXbEDbFYbEDbEDbEDbEDbEDbEDbEDbDnbFZbDpbGbbGcbGdbGebGfbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbGgbENbEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZalQaHnalQaeZbERbGhbGibwlbGjbxrbGkbxrbxrbEWbwlbGlbGmbGnbBcbEYbEZaafbFabGobGpbGqbGrbGsbGrbGrbGtbGubGrbGrbGvbGwbGxbGybBhbGzbBhbBhbBhbBhbGAbGBbGCbGDbGEbGFbGGbGHbGIbGIbtXbGJbGKcltbGMbGQbtXbGObGPbGSbtXbGRbDqbEHbDrbFDbGWbmSbGXbGYbpFbGZbHabHbbHcbCRbHdbBKbBKbHebAwbzibgibBMbBMbHfbCWbCWbHgbHfbBMbBMbHhbHibHjbHkbHlbBNbHmbHnbtbbHobHpbHqbHqbHrbHsbHtbHqbHubHvbHwbHxbHybGabHAbHBbHCbHDbHEbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObHGbHHbHIbEObHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZalQalQalQbHJbHKbxrbxrbHLbGjbxrbxrbxrbxrbEWbwlbHMbGnbHNbBcbEYbEZaaabFabHObHPbHQbDIbDIbHRbDIbHSbHTbHUbHVbBdbHWbHXbHYbHZbIabIbbIbbIbbIbbIbbIcbIbbIdbIebIfbIgbIhbIibIjbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbMNbMNbMNbMNbMNbMNbOnbOCbmSbmSbmSbmSbIlbImbhjbAwbAwbAwbAwbAwbAwbzibgibBMbInbIobIpbIqbIrbIsbInbItbHhbHibHjbIubIvbIwbIxbIybuwbIzbDdbIAbIAbIBbICbIDbIEbEDbEDbIFbDnbIGbGLbIIbDdbIJbIKbIKbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObILbIMbIMbIMbINbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZaHnaHnaHnaeZbERbIObIPbIQbIRbxrbxrbISbITbIUbwlbBcbBcbBcbBcbEYbDCaafbIVbDEbIWbDGbIXbDIbIYbDIbDIbDIbDIbDIbBdbDLbIZbJabJbbJcbJcbJcbJcbJcbJcbJdbJebJfbJgbJhbJibJjbJkbJlbJmbJnbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJobJpbmSbGXcqlbBDbJrbBEbJsbJtbJubJvbJvbJwbJxbJgbJybJzbBMbJAbJBbJCbJDbJEbJFbJGbItbItbItbItbItbItbJHbJIbJJbJKbJLbDdbDnbDnbDnbDnbDnbDnbJMbEDbEDbDnbjobvZbgxbDdbJNbJObJPbJQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJRbJSbJRbIMbJTbIMbJUbJVbENaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZamIbJWbJXajZbERbERbERbwlbwlbERbERbERbwlbwlbwlaaaaaaaaabJYbJZbEZaaaaaaaafaaabBdbKabKbbKcbDIbKdbKebKfbKgbKhbKibKjbKkbKlbKmbKnbKobKpbKqbKmbKmbKmbKmbKmbKrbKsbKmbKmbKtbKmbKubKmbKmbKmbKmbKmbyebyebyebyebyebyebyebyebKvbKwbmSbKxbKybKzbKAbKBbKCbKDbKEbKFbKFbKGbKFbKFbKHbKIbBMbKJbKKbKLbKKbKMbKKbKNbKObKPbKQbKRbKSbKTbKUbyqbHnbqibKVaafbKWbKXbKYbKZbLabKZbLbbLcbLdbDnbLebsbbLfbDdbDdbDdbDdbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObLgbIMbIMbIMbLhbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanTaekbLiaekafOaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaafbJYbEYbEZaafaafaafaafbBdbBdbBdbBdbBdbBdbBdbBdbBdbBdbLjbLkbLlbLmbKmbKnbKobKpbKqbLnbLnbLobLpbLqbLrbLsbLtbLubLvbLwbLxbLybLzbLAbLBbLCbLDbLDbLDbLDbLDbLDbLEbyebKvbLFbLGbLGbLGbLGbLGbLHbLIbLJbLGbLGbLGbLGbLGbLGbLFbLKbLLbLMbLNbLObLNbLPbLQbLRbLSbLSbLSbLSbLSbLSbLTbLUbLVbqibKVaafbKWbLWbLWbLXbLYbLZbMabMbbMcbDnbMdbsbbkFbjobMebMfbjoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObMgbMhbMibMjbHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaaabJYbEYbEZaaaaaaaaaaafbMkbMlbMlbMmbMnbMobMobMpbMpbMkbDLbMqbKkbMrbKmbMsbMtbMtbMubMvbLnbMwbMxbMybMzbMAbMBbMCbMDbMEbMFbMGbMFbMHbMIbMJaafbMKbMKbMKbMKbMKbMLbyebKvbMMcqzbMObMPbMQbLGbMRbMSbMTbLGbMUbMVbMWbMVbMUbLFbMXbBMbKKbKKbKKbMYbKKbKKbMZbNabNbbNbbNcbNbbNbbNdbNebNfbNgbKVaafbKWbLWbNhbKZbNibKZbNjbNkbNlbDnbsebsbbkFbjobsebsebjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbNmbENbMjaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbBcbBcbJYbJYbJYbBcbBcaaaaaaaaaaaabJYbEYbEZaaaaaaaaaaafbMkbNnbMmbMmbMmbMmbMobYnbNpbNqbNrbKjbNsbNtbNubNvbNwbNxbNybNzbNAbNwbNwbNwbNybNBbNCbNDbNEbNFbLBbNGbNHbNIbNJbNKbLDbNLbNMbNNbNObMKbMLbNPbKvbLFbNQbMUbMUcrqbLGbNRbNSbNTbLGbMVbNUbMVbNVbNWbNXbNYbBMbNZbOabObbOcbOdbOebOfbOgbOhbOibOjbOkbOlbItbOmbZlbOobOpbOpbDnbDnbDnbDnbDnbDnbDdbDdbDdbDnbsebsbbOqbsebsebOrbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbENbEObENaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBcbOsbGnbOtbGnbOubBcaaaaaaaaaaaabJYbJZbEZaaaaafbJYbJYbMkbMmbMmbOwbOvbMmbOxbMobMobOzbDLbMqbOAbOBbZmbODbOEbOFbOGbOHbOIbOFbOJbOFbOKbOLbOMbLubONbOObOPbOQbORbOSbOTbOUaafbOVbOWbNObOXbMKbMLbNPbKvbLFbOYbOZbMUbPabLGbPbbPcbPdbLGbMUbPebPfbMUbMUbLFbKvbBMbItbItbItbItbJHbPgbPhbPibJHbItbItbItbItbItbPjbPkbPlbPmbPnbPobPpbPqbPpbPrbOpbPsbPtbPubPvbPwbsbbkFbjobjobjobjoabtaafaafaafaagaagaagaagaagaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbBcbPxbGnbGnbGnbPybBcaaaaaaaaaaaabJYbEYbEZaaaaafbJYbPzbPAbPBbMmbMmcbdbPDbPDbPDbPEbPFcbebMqbOAbPHccdbPJbPKbMFbPLbPMbPNbPObPPbPQbPRbPSbPSbPTbPUbLBbPVbPWbPXbPYbPZbQabQbbNLbQcbNObNObMKbMLbNPbKvbLFbQdbMUbQebLHbLGbLGbQfbLGbLGbQgbQhbQibQgbQgbLFbKvbBMbQjbQkbQkbQlbQmbKKbQnbQobQpbQqbCWbCWbCWbItbQrbQsbQtbQubQvbPobQwbQxbQybQzbOmbPtbQAbPtbPvbBRbGTbGUbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaabBcbPxbGnbGnbQDbQEbBcaaaaafaaaaaabJYbEYbDCbBcbBcbBcbQFbMkbQGbMmbMmcqmbQHbQIbQJbQKbMkcqnbMqbOAbPHcqobQLbQMbMFbMFbQNbLnbQObQPbQQbQRbMFbMFbLubQSbQTbQUbQVbQWbQXbQWbQYaafbMKbMKbMKbMKbMKbMLbyebKvbLFbQZbRabRabRbbRcbRdbRebRfbRgbMUbPebMUbMUcqpbLFbKvbBMbCWbCWbCWbRhbRibKKbRjbKKbRkbRlbCWbCWbCWbItbRmbRnbRobRpbRqbRrbRsbRtbRrbRubOpbRvbPtbRwbPvbOpbSsbGVbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafbRzaafaafaafbBcbBcbBcbBcbBcbBcbBcbBcbBcbBcbRAbBcbBcbBcbJYbJYbJYbRBbRCbRDbREbRFbRGbRCbRHbPFbPFbPFbPFcqrbMkbMkbMkbMkbMkcqtbRKbOAbRLbKmbRMbRNbPNbRObPNbLnbMFbMFbMFbQRbRPbRQbRQbRRbRSbRTbNGbRUbRVbRWbNKbLDbNLbRXbRYbRYbMKbMLbyebKvbRZbSabSabSabSbbScbMUbSdbMUbMUbMUbPebMUbMUbMUbLFbKvbBMbCWbCWbCWbSebSfbQobSgbKKbShbSibQkbQkbSjbItbSkbSlbPlbSmbSnbPobQybSobRrbSpbOpbSqbSqbSqbPvbSrbSsbGVbjoaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabStbSubSubSubSubSvbSwbSwbSxbSybSzbSAbSBbSCbSDbSEbBcbGnbGnbGnbGnbGnbGnbGnbSFbSGbSHbSIbSJbSKbSKbSKbSKbSLbSMbSMbSMbSNcqubSObDybDybSPbBccqnbMqbOAbSQbSRbSSbSTbRQbRQbSUbSVbRQbRQbSWbSXbSYbMFbSZbTabTbbTcbMFbTdbTebTfbOUaafbOVbTgbThbTibMKbMLbNPbTjbTkbTkbTkbTlbLFbTmbQZbTnbTobTpbTqbTrbTsbTsbTtbLFbKvbBMbItbItbItbItbTubTvbRjbTwbTubItbItbItbItbItbTxbTybTzbTAbTBbTCbTCbTCbTCbTDbOmbSqbSqbTEbPvbTFbSsbGVbjobjobjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaaaaafaaaaaabJYbJYbJYbGnbTHbTIbTJbTKbTLbBcbTMbJYbJYbJYbJYbJYbJYbJYbJYbDCbTNbTObTObTObTObTObTObTObTObTPbTPcqxbTPbTPbTQbTRbBccqnbMqbOAbSQbTSbTTbTUbTVbPSbTWbTXbPSbPSbTYbTZbUabUbbUcbUdbUebUfbMFbTdbUgbUhbQabQbbNLbUibRYbRYbMKbMLbNPbUjbyebyebyebNYbLFbUkbMUbMUbUlbUmbUnbUobUpbUobUnbLFbKvbBMbQjbQkbQkbUqbQmbKKbQnbQobUrbUsbCWbCWbCWbItbUtbUubUvbUwbRnbRpbUxbUybUzbUAbOpbSqbSqbSqbPvbTFbSsbGVbsebsebjoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaagaagaagaagbUDbGnbUDbGnbUEbTIbTIbUFbGnbBcbGnbJYaaaaaaaafaaaaaaaafaaabDCbTNbTObUGbUHbUIbUJbUKbULbUGbUMbUNcqCcqybTPbTPbTRbBccqDbMqbOAbURbUSbUTbUTbUUbKmbKmbKmbKmbKmbUVbUWbLnbLnbLnbUXbMFbTbbMFbTdbTebUYbOUaafbMKbMKbMKbMKbMKbMLbNPbUjbyebUZbzibNYbMMbVabVbbVcbVdbVebVfbVgbUpbVgbVhbLFbKvbBMbCWbVibCWbVjbRibKKbRjbKKbRkbVkbCWbVibCWbItbVlbVmbVnbVobVpbVqbVrbVsbVtbVubOmbVvbVwbVxbPvbSqbSsbHzbjobsebjobjobjoaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbJYbJYbJYbVzbVAbVBbVCbVDbGnbVEbGnbJYaaaaaaaafaaaaaaaafaaabDCbTNbTObUGbVFbVGbVHbVIbVJbUGbVKbVLcqEbVNbVObTPbTRbBccqnbMqbOAbVPbVQbKmbVRbVSbKmbVTbVUbVVbKmbVWbQRbVXbLnbVYbUfbMFbUdbVZbWabRVbWbbNKbLDbNLbWcbWdbWebMKbMLbyebUjbyebABbzibNYbLFbWfbWgbWhbWibUmbWgbWjbUpbWjbNVbNXbKvbBMbCWbCWbCWbWkbWlbQobSgbKKbShbWmbQkbQkbSjbBMbPvbWnbWobWobPvbPvbWpbWqbWrbWsbWtbWubTCbWvbSqbSqbSsbGVbjobWwbjobWxbjoaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbJYbWybWzbWzbWAbTLbWBbBcbJYbJYaaaaaaaaaaaaaaaaaaaaabDCbTNbTObWCbWDbWEbVHbWFbWCbWCbVKbWGcqGcqFbWIbTPbTRbBccqnbMqbWJbWKbWKbWLbWMbWNbWObWPbWQbWRbKmbMFbQRbWSbWTbVYbWUbMFbUdbVZbTdbTebWVbOUaafbOVbWWbWXbWYbMKbMLbyebUjbyebGHbGHbNYbLFbLGbWZbXabLGbXbbLGbLGbLGbLGbLGbLFbKvbBMbItbItbItbItbTubXcbRjbXdbTubItbItbItbItbBMbRrbXebRrbRrbRrbPvbWpbWqbXfbXgbXhbXibUwbXjbPvbSqbSsbGVbjobsebsebsebXkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafbBcbBcbBcbBcbBcbBcbVEbBcbBcbBcbBcaafaaaaaabXlaaaaaaaaaaaaaaabEZbTNbTObWCbWCbXmbXnbXobWCbXpbXqbXrcqIcqHbXsbTPbTRbBccqJbXwbCrbWKbXxbXybXybXzbXAbXBbXCbXDbKmbXEbXFbVXbLnbVYbXGbMFbXHbVZbTdbXIbXJbQabQbbNLbXKbWdbWdbMKbMLbNPbUjbyebXLbzibNYbXMbSabSabXNbLGbIHbIkbQBbyebXRbXSbKwbKvbBMbQjbQkbQkbXTbQmbKKbQnbQobXUbXVbCWbCWbCWbBMbXWbRrbRrbRrbRrbPvbXXbXXbXYbXZbOpbOpbUwbOpbPvbOpbSsbGVbjobYabYbbYcbXkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabfabfabfabfabqabfabfabfabfabfaaaaaabBcbGnbGnbGnbGnbGnbGnbGnbGnbWBbJYaafaaaaaaaafaaIbYdaaaaaaaaabEZbTNbTObYebYfbYgbYhbYibYjbYkbYlbYmcqMcqKbYobTPbYpbYqbYrbYsbGybWKbYtbXybYubYvbYwbYxbYybYzbYAbNFbYBbLnbLnbLnbYCbMFbYDbYEbTdbTebMFbOUaafbMKbMKbMKbMKbMKbMLbNPbUjbyebYFbzibYGbYHbTkbYIbYJbyebRybQCbTGbyebYNbKFbYObYPbBMbCWbCWbCWbYQbRibKKbRjbKKbRkbYRbCWbCWbCWbBMbYSbRrbYTbRrbRrbYUbYVbYWbYXbYYbOpbUwbUwbYZbPvbBRbZabUBbjobZcbZdbsebXkaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaafaaaaafaaaacfaaaaafaaaaafaaaabfaafaafbBcbZebGnbBcbBcbBcbRAbBcbBcbBcbBcaaaaaaaaaaaIbZfbZgaaIaaIaafbEZbTNbTObZhbWCbUGbUGbUGbWCbZibZjbZkcqGcqNcqPbTPbBcbBcbZnbZobZpbWKbWKbZqbXybZrbZsbZtbZsbZubKmbMFbZvbZwbZxbZybONbZzbZAbZBbWabRVbZCbNKbLDbNLbZDbZEbZEbMKbMLbNPbUjbyebyebyebZFbZGbyebZHbZIbyebyebZJbyebyebZIbZKbZLbZMbBMbCWbCWbCWbZNbZObQobZPbKKbShbZQbQkbQkbSjbBMbRrbRrbZRbRrbRrbPvbXXbXXbZSbZTbOpbZUbZVbZWbPvboUbZabGVbjobjobjobsebjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXbZYbZZaaabZXbZYbZZaaabZXbZYbZZaaaabfaaaaaabBccaacabbBccacbGnbGncadbOucaebBcaaaaaaaaacafaaIaaIaafaaaaaabEZbTNbTObWCcagcahbUGcaibWCbWCbVKcajcqGcqKcakbTPcalcamcancaocapcaqcarcascatcascatcaucatcavbKmcawcaxcaybPSbPSbPUbRPcazbRUbPVbTecaAbOUaafbOVcaBcaCcaDbMKbMLbyebUjbzicaEcaFbZFcaGbyebZHcaHcaIcaJcaKcaLcaIcaMbZHbgxcaNbBMbBMbBMbBMbBMbBMcaOcaPcaObBMbBMbBMbBMbBMbBMbPvbPvbPvbPvbPvbPvcaQcaQcaRcaSbPvbPvbPvbPvbPvbjobRxbGVbjocaTcaUbsebjoaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafbZXcaVbZZaaabZXcaVbZZaaabZXcaVbZZaafaafaaaaaabBcbJYbJYbBcbBccaWcaXbOubGnbQDbBcaaaaaaaaaaaaaafaaaaaaaaaaaabDCbTNbTObUGcaYcaZbUGcbacbbbUGbVKcbccqEcqQcqVcqUcqXcqWbOAaZDcbgcbhcbicbjcbkcblcbmcbnbXycbobKmcbpbMFbZvbRPbRQcbqcbrcbscbtbLAcbucbvbQabQbbNLcbwbZEbZEbMKbMLbyecbxcbycbzcbAcbBcbCbyecbDcbEcbFcbGcbHcbGcbIcbEcbJbgxcbKbjoaaaaaaaaaaafaaaaaacbLaaaaafaaaaaaaaaaaabjocbMbMfbkGcbNcbNbPvcbOcbOcaRbQtcbPcbQbsebsebsebBRbRxbHzbjocbRbsebsebjobjobjoaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXcaVbZZaafbZXcaVbZZaafbZXcaVbZZaaaaafaafaafaafaafaafaafbBcbBcbBcbBcbRAbBcbBcaaaaaaaaaaaaaafaaaaaaaafaaabDCbTNbTObUGcbScbTcbUcbVcbWbUGcbXcbYcbZccaccbbTPccccqYcceccfccgcchcciccjcckcclccmccnccoccpccqccrbOQccscctbMFbMFbMFbMHbSYcctbTebUYbOUaafbMKbMKbMKbMKbMKbMLbyebYFccuccvccwccxccybyebyecczccAccBbKwccCccDbyebyebgxcbKbjoaaaaaaaaaaafaaaaaacbLaaaaafaaaaaaaaaaaabjobseccEbqvccFccGbPvccHccHccIbQtbPvbOpbjoccJccKbBRbRxbGVbsebsebsebUCbkHbVybkHaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbZXcaVbZZaaabZXcaVbZZaaabZXcaVbZZaafaafaaaaaaaaaaaaaaaaaabBcccRbBcbGnbGnbBcaafaaaaafaaaaaaaafaaaaaaaafaaabDCbTNbTObTObTObTObTObTObTObTObTPbTPbTPbTPbTPbTPbBcccSbBcccTccUccUccUccVccWccXccUccYccZcdabKmcdbcdcbPXcddcdecdfcdecddcdgcddcdhbRPcdiaafaafaafaafaafaafbMLcdjcdjcdjcdkcdlcdjcdjcdjcdmbyecdncdncdocdncdnbyebABbZGcbKbjobXkbXkbXkbjobXkbXkcdpbXkbjobXkbXkbXkbXkbjobjobRxcdqbjobjobPvbPvbPvcdrcdsbPvbBRbjobYcbseboTbRxbUBbjobjocdtbjobjobjobjoaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaafaaabZXcaVbZZaaabZXcaVbZZaaabZXcaVbZZaaaaafaaaaaacducdvcdvcdvcdvbBcbBccdwbGnbBcbJYbJYbJYbJYbJYbJYbJYbJYbJYbBcbDCbTNbBccdxcdycdzcdzcdzcdzcdzcdzcdzcdzcdzcdAcdAcdzcdBcaWccTcdCcdDcdEcdFcdGcdHccUcdIcdJcdKbKmcdbcdLcdMcdNcdOcdPcdQcdRbMFcdScdTcdUbLuaafaafaaaaaaaaaaaacdVcdWcdXcdYcdZceacebceccdjcedceecefcegcehccBccBbzibzibZGbntceiceiceiceiceiceiceicejcekcekcekcekcekcekcelcekcemcekcekcenceocepceqbXOcesbjobjocetceoceuceocevbGVbjocewbsebsebjoaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaaaaaacexaaaaaaaaacexaaaaaaaaacexaaaaaaaafcducducduceycezceAceBceCbGnceDceEceFceEceEceEceEceEceEceEceEceEceEceGceHbRGceIceJceKceKceKceKceKceKceKceKceKceKceKceKceKceKccTccUceLceMceNceOcePceQceRceSceTceKbLuceUbLuceVbLuceUbLuceVbLuceWbLuceWbLuaafaafaaaaaaaaaaaacdjceXceYceZcfacfbcfccfdcdjcedcfeccBcffcfgcfhcfibDZcfjcfkcflcflcflcflcflcflcflcfmcfncflcflcflcflcflcflcfocfpcfqbmicfrcfscftcftcftbXPbYKbXQbYMbYLcbfbZbbZbccLccMbjocaUbsecfCbjoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafalkcfEcfEcfFcfGcfGcfGcfGcfGcfGcfGcfGcfGcfGcfGcfHcfIcfJcfIcfKcfLcfMcfNceEcfOcfPbOubBcbJYbJYbJYbJYbJYbJYbJYbJYbJYbBcbBccfQbSKcfRcfSceKcfTcfTcfUceKcfVcfWcfXctHcfZcgacgbcgccgdcgeccUcgfcggcghcgicgjcgkcglcgmcgnceKaafcgoaafbMLaafcgoaafbMLaafcgpaafcgpaaaaaaaaaaaaaaaaaaaaacdjcgqcgrcgscgtcgucgvcgwcdjbzicgxcgycgzcgAcgBbDZcgCcgDbyebjobXkbXkbXkbXkbjobXkbXkbXkbXkbjobXkbXkbXkbXkbjocgEbsebjocgFcgGbjobjobXkbXkbjobjocgHbZacgIbjocgJcgKboRbjobjobjobjobjoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaaaaaacgLaaaaaaaaacgLaaaaaaaaacgLaaaaaaaafcducducducgMcgNcgOcdvbGnbGnbGnbGnbBcaaaaaaaafaaaaaaaafaaaaaaaafaaabBccgPbBccgQcgRceKcgScgTcgUcgVcgWcgXceRceRceRcgYcgZchachbcgXccUchcchdchecgictIccUchgchhchiceKbMKchjbOVchjbMKchjbOVchjbMKchkbOVchlbMKaaaaaaaaaaaaaaaaaacdjchmchnchochpchqchrchschtchuchubFMchvchwbFMchxbyebyebyeaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaabjochybLebjochzbZabjoaaaaaaaaaaaabjobsebZachAchBchBchCchDchBaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaafaaabZXchEbZZaaabZXchEbZZaaabZXchEbZZaaaaafaaaaaacducdvcdvcdvcdvchFbWBbGnbGnbBcaafaafchGchGchGchGchGchGchGaafbBcbBcbBcchHchIceKchJcgUcgUcgVchKchLchLchMchNchOchPchPchQceRccUchRchSchTchUchVccUchWcdJchXceKbMKchYchZciabMKcibciccidbMKciecifcigbMKaaaaaaaaaaaaaaaaaacihciichncijcikcilcimcincdjaafbyecczciobNPbNPbyebyeaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaabjocipbjobjociqbZabjobjobXkbXkbjobjobsecircischBcitciucivchBaaaaaaaafaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbZXchEbZZaaabZXchEbZZaaabZXchEbZZaafaafaafaaaaaaaaaaaaaagbBcbBcbBcciwbGnbBcaaaaaachGcixciycizciyciAchGaaabBcbQDbGnciBchIceKciCciCciDceKciEciFciGciHceSciIciJciKciLciLccUciMciNciOciPciQciRciSciTciUceKbMKciVciWciVbMKciXciYciXbMKciZcjacjbbMKaaaaaaaaaaaaaaaaaacdjcjccjdcjecjfcjgcjhcjicdjaafaafaafcjjaaaaaaaafaaaaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXkbXkbXkbjocjkbBRbjocjlcjmcjnceocjncjncjncjncjocjpcjqchBcjrcjscjtchBaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXchEbZZaafbZXchEbZZaafbZXchEbZZaaaaafaafaafaaaaaaaaaaagcjucjvcjubGnbGnbBcaaaaaachGcjwcjxcjycjzcjAchGaaabBccaXbGnciBchIceKciCciCciDceKcjBcgccjCcjDcjEcjFcjCcgccjCcjCcgccjGcjHcjIciIcjJcjKcjLceScjMceKbMKciVcjNciVbMKciXcjOciXbMKcjbcjPcjbbMKaaaaaaaaaaaaaaaaaacdjcdjcdjcjQcjRcjScjTcjUcjRaafaaaaafcfDaaaaaaaaaaaaaaaabtaafaafaafaafaafaafaaaaaaaaaaaaaaaaaabXkbsecjWbjocjXbsebjocjYbmhbmhcjZbmhbmibmibmickackackbchBckcckdckechBaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafbZXchEbZZaaabZXchEbZZaaabZXchEbZZaafaafaaaaafaafaaaaaaaagbBcbBcbBcbBcbGnbBcaafaafchGckfckgckhckickfchGaafbBcceKckjckkcklceKciCciDciDceKckmcknckockpceSckqckrcksckrckrcktckuckvckwckxckyckyckyckzckAceKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKaaaaaaaaaaaaaaaaaaaaaaaaaaackBcjRckCckDckEcjRaafaafaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXkckFbsebWwcgEbsebjobjobjobjobjobsebjoaafaaaaaaaaaaafckGckGckHckGckGaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabZXckIbZZaaabZXckIbZZaaabZXckIbZZaaaabfaaaaaaaafaafaaaaaaaaaaaaaaabJYbGnbJYaaaaaachGckJckKckLckMckNchGchGchGceKckOckkckPceKceKceKceKceKckQceRckRciHceSceRceRceRckSckTckUceSceSciHceRckVceRceRckWckXceKaafaaaaaaaaaaafaafaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaackYcjRcjSckZcjUcjRaaaaafaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXkbsebuEbjoclabsebsebsebsebsebsebsebjoaafaaaaaaaaaaafaaackGclbckGaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabZXckIbZZaaabZXckIbZZaaabZXckIbZZaaaabfaaaaaaaafaafaaaaaaaaaaaaaaabJYbGnbJYaaaaaachGccNckKckLckMckNchGchGchGceKckOckkckPceKceKceKceKceKckQceRckRciHceSceRceRceRckSckTckUceSceSciHceRckVceRceRckWckXceKaafaaaaaaaaaaafaafaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaackYcjRcjSckZcjUcjRaaaaafaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXkbsebuEbjoclabsebsebsebsebsebsebsebjoaafaaaaaaaaaaafaaackGclbckGaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaafaaaaafaaaaafaaaaafaaaaafaaaabfaaaaaaaaaaafaafaaaaaaaaaaaabJYbGnbJYaaaaaachGclccldcleclfclgclhclicljclhclkcllclmclncloclpclqclrclschLcqqcluclvclwclxclyclzclyclzclAclBclCchLchLclDchLclEclFceKceKceKceKceKcgccgccgccgcceKaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaackYcjRclGclHclIclJaaaaafaafaafaafaaeaafaaaaaaaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaabXkbXkbXkbjocipbjobjoclKclLbLebMdbjobjoaafaaaaaaaaaaafaaackGckHckGaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabqabfabfabfabfabfabfabfabfabfaaaaaaaaaaaaaafaafaaaaaaaafbJYbGnbJYaafaafchGclMclNclOclPclQclRclSclTclRclUclVclWclXclYclZcmaclZcmbcmccmdcmecmfcmgcmhcmicmjcmkcmjcmlcmmcmnchPcmecmochPcmpcmqchPcmrceRcmsceKcmtcgccmuaekaekaelaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackYcjRcjRcmvcjRcjRaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaafcmwaafbjobjobXkbXkbjobjoaaaaafaaaaaaaaaaafaaaaaacmxaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaabJYbGnbJYaaaaaachGcmycmzcmAcmBcmCchGcmDcmEchGcmFceRcmGciHceScmHcjCcmIciIcmJcmKcmLcmLcmLcmMcmNcmOcmPcmQcmRcmMcmScmSckUceRckVciIcmTcmUcmVchLcmWcmXcgUcmXcmYaeXaeYaeZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackYaagcjRcmZcjRcnaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaeaaaaaaaaaaaaaaaaafcnbaafaaaaafaaaaaaaafaaaaaaaafaaaaaaaaaaafaaaaaacmxaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbBcbBcbRAbBcbBcaaachGcnccndcnechGchGchGchGchGceKcnfceRcmGcngcnhcnicjCcnjciIcnkcnlcnmcnncnoceKcnpcnqcnrcnscntceKcnucnvcnvcnlcnkciIcnwcnxceSceRcnyceKcnzcgccnAaekaekafOaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaacfDaagcnBcnCcnBaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafcnDaafaaaaafaaaaaaaafaaaabfabfabfabqaafaafaafaafcmxaafaafaafaafaafabqabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbBccgPbGncnEbBcaafchGchGchGchGchGaafaaaaaaaafceKcnFceRcnGcnHcnHcnIcgccgccnJceKcnKcnLcnLcnLceKcnMcnNcnOcnPcnQceKcnLcnLcnLcnKceKcnJcgccnRceSceRceKceKcgccgccgccgcceKaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaafaagaaaaaaaaaaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaaaaaaaafaaaaaaaafaaaabfaaaaaaaafaaaaafaaaaaacnSaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJYcnTcnUcnVbBcaafaaaaaaaafaaaaaaaafaaaaaaaafceKcnWcnXciIcnYcnZcoacgccobcocceKcodcoecofcoecogcohcoicojcokcnQcogcoecoecoecolceKcomconckkceScoochWcopceRcoqcogaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaabfaafcorcorcorcorcoraaacosaaacorcorcorcorcoraafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJYcotcoubHMbBcbBccovcovcovcovcovcovcovcovcgcceKcowcoxcoycozcowceKceKceKcnJceKceKcogcogcogcogcoAcoBcoCcoBcoDcogcogcogcogceKceKcnJceKckkcoEcoFcoGcoHceRcoIcogaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaabfaaacoJcoKcoKcoKcoKcoLcoscoMcoNcoNcoNcoNcoOaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJYcotcoubHMbBccgcccOccOccOccOccOccOccOccOcgcceKcowcoxcoycozcowceKceKceKcnJceKceKcogcogcogcogcoAcoBcoCcoBcoDcogcogcogcogceKceKcnJceKckkcoEcoFcoGcoHceRcoIcogaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaabfaaacoJcoKcoKcoKcoKcoLcoscoMcoNcoNcoNcoNcoOaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJYbJYbJYbJYbBcaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceKcoPcoQcoRaaaaaaaaacogcogcogcogcogcogcogcogcogaaaaaaaaacoScoTcoUcoVcoWclyclycoXcoYcoZcogaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaabfacfcpacpacpacpacpaaaacosaaacpacpacpacpacpaaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceKcpbcpccpcaaaaaaaafaafaafaafaafaafaafaafaafaafaafaaaaaacpccpdcpbceKcpecpfceKcgccgccpgcgcaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaabfaaaaaaaaaaafaaaaaaaaacosaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceKcphcpicpjaafaafaafcpkaaaaaaaaaaaacpkaaaaaacpkaafaafaafcplcpmcpnceKcpocdIcgcaafaaacppcpqaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafcorcorcorcorcoraaacosaaacorcorcorcorcoraafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6673,11 +6665,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceKcqscpccqAaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaacqBcpccqsceKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaaaaaaaaaaafcqecsgcrWcshcqOcsmcslcsncqeaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaachWceKceKceKcpcaafaafaafaafaaaaaaaaaaaaaaaaafaafaafaafcpcceKceKceKchWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaaaaaaaaaaafcqecqecqecsQcsqcsRcqecqecqeaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacqsceKceKceKceKceKceKceKceKceKceKceKceKceKceKceKceKceKcqsaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaafaaacsTcqgcrPcsUcsXcqgcsTaaaaagaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaacqscqscqscqscpMcqscqscqscqscqscqscqscpMcqscqscqscqsaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagcsYcsYaagaafaaacsTcqgcrPcsZcrQcqgcsTaaaaagaagcsYcsYaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaafaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfcqLcqLctaaafaafctbcqectgctfcthcqectbaafaafctacqLcqLabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcqScqTctiaaacrgcrgcrgcrhcricrkcrgcrgcrgaaactjcrbcrccrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcqScrcctkctlcrgctoctnctpcrsctrctqctwcrgctyctxcqScrccrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcrmctActzctzcrpctFcrFctGcrGctJcrFctKcrwctLctLctMcrzcrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaacqscqscqscqscpMcqscqscqscqscqscqscqscpMcqscqscqscqsaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaafaaacsTcqgcrPcsZcrQcqgcsTaaaaagaagaagaagaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaafaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfcqLcqLabfaafaafctbcqectgctfcthcqectbaafaafabfcqLcqLabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcqScqTccPaaacrgcrgcrgcrhcricrkcrgcrgcrgaaaccQcrbcrccrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcqScrccercfucrgctoctnctpcrsctrctqctwcrgcfwcfvcqScrccrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcrmcfxcrocrocrpctFcrFctGcrGctJcrFctKcrwcrxcrxcfycrzcrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcrBcrdaaaaaacrgctNcrFctOcrNctPcrFctQcrgcrDcrDcrIcrJcrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfctRcrRcqecqecqecrgcrSctScrUcrUcrVctScrXcrgcqecqecqecrYctTabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcrBcrdaaaaaacrZcsacsbcsccsdcrZcsecsfcrZaaaaaacqRcrJcrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6686,11 +6678,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcrBcrdaaacrZcrZcsrcspcspcsscspcspcstcrZcrZaaacqRcrJcrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfctRcsucqecqecrZcrZcsocspcsvcsvcsvcspcsocrZcrZcqecqecswctTabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcrBcrdcqhcrZcsxcsocsycsvcszcsvcsycsocsAcrZcqhcqRcrJcrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcrBcrdaaacrZcrZcsocspcsBcsCcsDcspcsocrZcrZaaacqRcrJcrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcrBcrdaaacrZcrZcsrcspcspcsEcspcspcstcrZcrZaaacqRcrJcrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcrBcrdaaacrZcrZcsFcspcsGcsHcsIcspcsFcrZcrZaaacqRcrJcrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfctRcsJcqecqecsvcrZcrZcsecrZcsKcrZcsbcrZcrZcsvcqecqecsLctTabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcrBcrdaaaaafaaacsNcsNcsNcsOcsNcsNcsNaaaaafaaacqRcrJcrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcrBcrdaaacrZcrZcsocspcfAcfzcsDcspcsocrZcrZaaacqRcrJcrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcrBcrdaaacrZcrZcsrcspcfBcsycspcspcstcrZcrZaaacqRcrJcrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcrBcrdaaacrZcrZcsFcspcovckJcsBcspcsFcrZcrZaaacqRcrJcrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfctRcsJcqecqecsvcrZcrZcsecsEcsCcsGcsbcrZcrZcsvcqecqecsLctTabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcrBcrdaaaaafaaacrZcrZcrZcsHcsIcrZcrZaaaaafaaacqRcrJcrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcrBcrdaaaaafaaacsPctZcuacsScuccubcsPaaaaafaaacqRcrJcrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRcrBcsVcrfcsWcsWcsPcudcufcuecuhcugcsPcrfcsWcrfctccrJcrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcqRctdctecrocrocrocujcuiculcukcuncumcuocrxcrxcrxcrxctmcrdabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm
index e160a9e1d29..950e7c8cb57 100644
--- a/_maps/map_files/generic/z2.dmm
+++ b/_maps/map_files/generic/z2.dmm
@@ -215,12 +215,12 @@
"eg" = (/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/plating,/area/space)
"eh" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"},/turf/simulated/shuttle/plating,/area/space)
"ei" = (/turf/unsimulated/wall,/area/centcom/control)
-"ej" = (/obj/machinery/door/airlock/centcom{name = "Centcom Customs"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control)
+"ej" = (/obj/machinery/door/airlock/centcom{name = "Centcom Customs"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control)
"ek" = (/turf/unsimulated/wall,/area/centcom/evac)
"el" = (/obj/machinery/vending/clothing,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry)
"em" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
-"en" = (/obj/machinery/door/poddoor/preopen{id = "CentComPort"; name = "security door"},/turf/unsimulated/floor{dir = 8; heat_capacity = 1; icon_state = "warning"},/area/centcom/control)
-"eo" = (/obj/machinery/door/airlock/centcom{name = "Centcom Docks"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control)
+"en" = (/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/control)
+"eo" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control)
"ep" = (/turf/unsimulated/wall,/area/centcom/prison)
"eq" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 1; icon_state = "rightsecure"; name = "Centcom Customs"; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control)
"er" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/control)
@@ -239,10 +239,10 @@
"eE" = (/obj/machinery/computer/emergency_shuttle,/turf/simulated/shuttle/floor,/area/space)
"eF" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
"eG" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall/interior{icon_state = "swall_f6"},/area/space)
-"eH" = (/obj/structure/table,/obj/item/weapon/paper_bin,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/suppy)
+"eH" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (SOUTHWEST)"; icon_state = "fakewindows"; dir = 10},/area/centcom/evac)
"eI" = (/obj/structure/closet/crate,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/suppy)
"eJ" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac)
-"eK" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac)
+"eK" = (/turf/unsimulated/floor{tag = "icon-darkgreen (EAST)"; icon_state = "darkgreen"; dir = 4},/area/centcom/ferry)
"eL" = (/obj/machinery/computer/atmos_alert,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
"eM" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/space)
"eN" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/space)
@@ -258,7 +258,7 @@
"eX" = (/turf/unsimulated/floor{dir = 8; icon_state = "vault"},/area/centcom/control)
"eY" = (/turf/unsimulated/floor,/area/centcom/suppy)
"eZ" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control)
-"fa" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac)
+"fa" = (/turf/unsimulated/floor{tag = "icon-warndark (WEST)"; icon_state = "warndark"; dir = 8},/area/centcom/ferry)
"fb" = (/obj/structure/stool/bed/chair/office/dark,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac)
"fc" = (/obj/structure/showcase/fakesec,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac)
"fd" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/space)
@@ -269,9 +269,9 @@
"fi" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control)
"fj" = (/obj/structure/table,/obj/item/weapon/stamp{pixel_x = -3; pixel_y = 3},/obj/item/weapon/stamp/denied{pixel_x = 4; pixel_y = -2},/obj/item/weapon/paper/centcom,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control)
"fk" = (/obj/machinery/door/window/northleft{dir = 2; name = "Centcom Security"; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac)
-"fl" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac)
-"fm" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac)
-"fn" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac)
+"fl" = (/turf/unsimulated/floor{tag = "icon-yellowsiding (WEST)"; icon_state = "yellowsiding"; dir = 8},/area/centcom/evac)
+"fm" = (/obj/structure/stool/bed/chair/office/dark,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac)
+"fn" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/evac)
"fo" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/space)
"fp" = (/obj/machinery/flasher{id = "cockpit_flasher"; pixel_x = 6; pixel_y = 24},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
"fq" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
@@ -313,8 +313,8 @@
"ga" = (/turf/simulated/shuttle/wall{icon_state = "swallc4"; dir = 2},/area/space)
"gb" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry)
"gc" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/ferry)
-"gd" = (/turf/unsimulated/floor{dir = 8; heat_capacity = 1; icon_state = "warning"},/area/centcom/ferry)
-"ge" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/ferry)
+"gd" = (/obj/effect/landmark{name = "Deathsquad"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"ge" = (/obj/structure/stool/bed/chair,/turf/unsimulated/floor{dir = 1; icon_state = "green"},/area/centcom/evac)
"gf" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/control)
"gg" = (/turf/unsimulated/floor{icon_state = "greencorner"},/area/centcom/control)
"gh" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/evac)
@@ -330,7 +330,7 @@
"gr" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/space)
"gs" = (/turf/unsimulated/floor{name = "plating"},/area/space)
"gt" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/centcom/ferry)
-"gu" = (/obj/effect/landmark{name = "Deathsquad"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
+"gu" = (/obj/structure/flora/kirbyplants,/turf/unsimulated/floor{icon_state = "green"; dir = 9},/area/centcom/evac)
"gv" = (/turf/unsimulated/wall/fakeglass,/area/centcom/control)
"gw" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
"gx" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
@@ -343,7 +343,7 @@
"gE" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/space)
"gF" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/centcom/ferry)
"gG" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (SOUTHEAST)"; icon_state = "fakewindows"; dir = 6},/area/centcom/ferry)
-"gH" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/evac)
+"gH" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/shotgun/toy/crossbow,/obj/item/toy/foamblade,/turf/unsimulated/floor{dir = 1; icon_state = "green"},/area/centcom/evac)
"gI" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership)
"gJ" = (/obj/structure/flora/grass/brown,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership)
"gK" = (/obj/structure/flora/tree/pine,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership)
@@ -356,9 +356,9 @@
"gR" = (/obj/structure/table,/obj/item/weapon/scalpel,/obj/item/weapon/retractor,/obj/item/weapon/hemostat,/obj/item/weapon/surgical_drapes,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
"gS" = (/obj/item/weapon/shard{color = "#008000"; icon_state = "small"},/obj/structure/grille{color = "#008000"; density = 0; icon_state = "brokengrille"},/turf/unsimulated/floor/plating,/area/wizard_station)
"gT" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 12; id = "ferry"; name = "ferry shuttle"; travelDir = 180; width = 5},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 12; id = "ferry_away"; name = "unknown"; turf_type = /turf/unsimulated/floor; width = 5},/turf/simulated/shuttle/floor,/area/space)
-"gU" = (/obj/machinery/door/airlock/external{name = "Ferry Airlock"; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "engine"},/area/centcom/ferry)
-"gV" = (/turf/unsimulated/floor{icon_state = "engine"},/area/centcom/ferry)
-"gW" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 4},/area/centcom/ferry)
+"gU" = (/turf/unsimulated/floor{dir = 1; icon_state = "green"},/area/centcom/evac)
+"gV" = (/obj/structure/rack,/obj/item/weapon/storage/fancy/crayons,/obj/item/toy/sword,/turf/unsimulated/floor{dir = 1; icon_state = "green"},/area/centcom/evac)
+"gW" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/evac)
"gX" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/unsimulated/wall,/area/centcom/evac)
"gY" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/turf/unsimulated/floor/plating,/area/wizard_station)
"gZ" = (/obj/machinery/door/poddoor/preopen,/obj/effect/decal/cleanable/blood/splatter,/turf/unsimulated/floor/plating,/area/wizard_station)
@@ -371,8 +371,8 @@
"hg" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor/plating,/area/wizard_station)
"hh" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry)
"hi" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/space)
-"hj" = (/turf/unsimulated/floor{icon_state = "greencorner"},/area/centcom/ferry)
-"hk" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/evac)
+"hj" = (/turf/unsimulated/floor{tag = "icon-warndark (EAST)"; icon_state = "warndark"; dir = 4},/area/centcom/evac)
+"hk" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/centcom/evac)
"hl" = (/turf/unsimulated/floor{dir = 1; icon_state = "green"},/area/centcom/control)
"hm" = (/turf/unsimulated/wall/fakeglass,/area/centcom/ferry)
"hn" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/simulated/shuttle/plating,/area/space)
@@ -407,6 +407,7 @@
"hQ" = (/turf/unsimulated/floor{name = "plating"},/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/space)
"hR" = (/obj/machinery/door/airlock/centcom{name = "Transport Shuttle"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
"hS" = (/obj/machinery/door/airlock/centcom{name = "briefing room"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"hT" = (/obj/machinery/door/poddoor/preopen{id = "CentComPort"; name = "security door"},/turf/unsimulated/floor{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/area/centcom/control)
"hU" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"hV" = (/obj/structure/dresser,/obj/structure/mirror{pixel_x = 0; pixel_y = 30},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"hW" = (/obj/structure/closet/secure_closet/ertCom,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
@@ -430,6 +431,7 @@
"io" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/syndicate_mothership)
"ip" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/grass/both,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"},/area/syndicate_mothership)
"iq" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/tree/pine,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"},/area/syndicate_mothership)
+"ir" = (/turf/unsimulated/floor{dir = 8; heat_capacity = 1; icon_state = "warning"},/area/centcom/evac)
"is" = (/obj/structure/closet/secure_closet/ertMed,/turf/unsimulated/floor{tag = "icon-darkblue (EAST)"; icon_state = "darkblue"; dir = 4},/area/centcom/ferry)
"it" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve)
"iu" = (/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve)
@@ -464,6 +466,7 @@
"iX" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/evac)
"iY" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac)
"iZ" = (/obj/structure/filingcabinet/filingcabinet,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac)
+"ja" = (/obj/machinery/door/airlock/centcom{name = "Centcom Docks"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control)
"jb" = (/turf/unsimulated/wall/fakeglass{color = "#008000"; dir = 8; icon_state = "fakewindows2"},/area/wizard_station)
"jc" = (/turf/unsimulated/wall/fakeglass{color = "#008000"; dir = 4; icon_state = "fakewindows"},/area/wizard_station)
"jd" = (/turf/unsimulated/wall/normal{tag = "icon-uranium2"; icon_state = "uranium2"},/area/wizard_station)
@@ -499,7 +502,11 @@
"jH" = (/obj/structure/closet/secure_closet/ertMed,/turf/unsimulated/floor{tag = "icon-darkblue"; icon_state = "darkblue"; dir = 2},/area/centcom/ferry)
"jI" = (/obj/structure/closet/secure_closet/ertSec,/turf/unsimulated/floor{tag = "icon-darkred"; icon_state = "darkred"; dir = 2},/area/centcom/ferry)
"jJ" = (/obj/structure/closet/secure_closet/ertEngi,/obj/structure/extinguisher_cabinet{pixel_y = -28},/turf/unsimulated/floor{tag = "icon-darkbrown"; icon_state = "darkbrown"; dir = 2},/area/centcom/ferry)
+"jK" = (/turf/unsimulated/floor{tag = "icon-yellowcornersiding (WEST)"; icon_state = "yellowcornersiding"; dir = 8},/area/centcom/evac)
"jL" = (/obj/structure/table/reinforced,/obj/item/weapon/c4,/obj/item/weapon/c4{pixel_x = 7},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"jM" = (/turf/unsimulated/floor{tag = "icon-yellowsiding"; icon_state = "yellowsiding"},/area/centcom/evac)
+"jN" = (/turf/unsimulated/floor{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/centcom/evac)
+"jO" = (/turf/unsimulated/floor{tag = "icon-darkgreencorners"; icon_state = "darkgreencorners"},/area/centcom/ferry)
"jP" = (/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/tdome/tdomeobserve)
"jQ" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/tdome/tdomeobserve)
"jR" = (/turf/unsimulated/floor{dir = 10; icon_state = "green"},/area/centcom/evac)
@@ -520,12 +527,15 @@
"kg" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (NORTHWEST)"; icon_state = "podhatch"; dir = 9},/area/syndicate_mothership)
"kh" = (/obj/structure/dresser,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership)
"ki" = (/obj/structure/table/wood,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership)
+"kj" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/evac)
+"kk" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/turf/unsimulated/floor{icon_state = "green"},/area/centcom/evac)
"kl" = (/turf/unsimulated/floor{icon_state = "red"; dir = 10},/area/tdome/tdomeobserve)
"km" = (/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/tdome/tdomeobserve)
"kn" = (/turf/unsimulated/floor{icon_state = "green"},/area/tdome/tdomeobserve)
"ko" = (/turf/unsimulated/floor{icon_state = "green"; dir = 6},/area/tdome/tdomeobserve)
"kp" = (/turf/unsimulated/wall/fakedoor{name = "Centcom"},/area/centcom/evac)
"kq" = (/obj/structure/showcase{desc = "A strange machine supposedly from another world. The Wizard Federation has been meddling with it for years."; icon_state = "processor"; name = "byond random number generator"},/turf/unsimulated/floor{tag = "icon-cultdamage7"; icon_state = "cultdamage7"},/area/wizard_station)
+"kr" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/control)
"ks" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"kt" = (/obj/structure/showcase{desc = "A historical figure of great importance to the wizard federation. He spent his long life learning magic, stealing artifacts, and harassing idiots with swords. May he rest forever, Rodney."; icon = 'icons/mob/mob.dmi'; icon_state = "nim"; name = "wizard of yendor showcase"},/turf/unsimulated/floor{tag = "icon-cultdamage4"; icon_state = "cultdamage4"},/area/wizard_station)
"ku" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
@@ -535,6 +545,13 @@
"ky" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/mushroompizza,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"kz" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/drinks/beer{pixel_x = 5; pixel_y = -2; step_x = 0},/obj/item/toy/cards/deck/syndicate{icon_state = "deck_syndicate_full"; pixel_x = -6; pixel_y = 6},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"kA" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (WEST)"; icon_state = "podhatch"; dir = 8},/area/syndicate_mothership)
+"kB" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "green"},/area/centcom/evac)
+"kC" = (/obj/structure/table/reinforced,/obj/item/toy/carpplushie,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 6},/area/centcom/evac)
+"kD" = (/turf/unsimulated/floor{tag = "icon-yellowcornersiding (NORTH)"; icon_state = "yellowcornersiding"; dir = 1},/area/centcom/evac)
+"kE" = (/turf/unsimulated/floor{tag = "icon-yellowsiding (NORTH)"; icon_state = "yellowsiding"; dir = 1},/area/centcom/evac)
+"kF" = (/turf/unsimulated/floor{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/centcom/evac)
+"kG" = (/turf/unsimulated/floor{tag = "icon-warndark (EAST)"; icon_state = "warndark"; dir = 4},/area/centcom/ferry)
+"kH" = (/obj/machinery/door/airlock/external{name = "Ferry Airlock"; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"kI" = (/turf/unsimulated/wall/fakeglass{color = "#008000"; dir = 6; icon_state = "fakewindows2"},/area/wizard_station)
"kJ" = (/obj/effect/forcefield,/obj/structure/door_assembly{anchored = 1; icon_state = "door_as_uranium1"; name = "Bridge"},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"kK" = (/turf/unsimulated/wall/normal{tag = "icon-uranium6"; icon_state = "uranium6"},/area/wizard_station)
@@ -542,8 +559,11 @@
"kM" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/syndicate_mothership)
"kN" = (/turf/unsimulated/floor,/area/syndicate_mothership)
"kO" = (/obj/machinery/door/poddoor/shutters{id = "nukeop_ready"; name = "shuttle dock"},/turf/unsimulated/floor,/area/syndicate_mothership)
+"kP" = (/turf/unsimulated/floor{tag = "icon-darkgreencorners (EAST)"; icon_state = "darkgreencorners"; dir = 4},/area/centcom/ferry)
+"kQ" = (/obj/structure/table,/obj/item/weapon/paper_bin,/turf/unsimulated/floor{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/centcom/suppy)
"kR" = (/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{tag = "icon-cultdamage6"; icon_state = "cultdamage6"},/area/wizard_station)
"kS" = (/obj/effect/decal/cleanable/blood/splatter,/turf/unsimulated/floor{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station)
+"kT" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/turf/unsimulated/floor{tag = "icon-darkred (WEST)"; icon_state = "darkred"; dir = 8},/area/centcom/evac)
"kU" = (/obj/machinery/suit_storage_unit/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
"kV" = (/obj/effect/landmark{name = "Syndicate-Uplink"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
"kW" = (/turf/unsimulated/wall/fakeglass,/area/syndicate_mothership)
@@ -552,6 +572,11 @@
"kZ" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (SOUTHWEST)"; icon_state = "podhatch"; dir = 10},/area/syndicate_mothership)
"la" = (/obj/structure/urinal{pixel_y = 28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"lb" = (/obj/structure/toilet{pixel_y = 8},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"},/obj/machinery/door/window{name = "Tactical Toilet"; opacity = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
+"lc" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/unsimulated/floor{tag = "icon-darkred"; icon_state = "darkred"; dir = 2},/area/centcom/evac)
+"ld" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/turf/unsimulated/floor{tag = "icon-darkred"; icon_state = "darkred"; dir = 2},/area/centcom/evac)
+"le" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{tag = "icon-darkred (SOUTHWEST)"; icon_state = "darkred"; dir = 10},/area/centcom/evac)
+"lf" = (/turf/unsimulated/floor{tag = "icon-darkred (NORTHWEST)"; icon_state = "darkred"; dir = 9},/area/centcom/evac)
+"lg" = (/turf/unsimulated/floor{tag = "icon-darkred (NORTH)"; icon_state = "darkred"; dir = 1},/area/centcom/evac)
"lh" = (/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/wizard_station)
"li" = (/turf/unsimulated/wall/fakedoor{name = "Squad 4 Pod"},/area/wizard_station)
"lj" = (/turf/simulated/shuttle/wall{icon_state = "swall4"; dir = 2},/area/wizard_station)
@@ -573,8 +598,10 @@
"lz" = (/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 2},/area/tdome/tdomeobserve)
"lA" = (/obj/structure/stool/bed/chair,/obj/effect/landmark{name = "tdomeobserve"},/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 2},/area/tdome/tdomeobserve)
"lB" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/space/transit,/area/wizard_station)
+"lC" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{tag = "icon-darkred (NORTHEAST)"; icon_state = "darkred"; dir = 5},/area/centcom/evac)
"lD" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/unsimulated/floor{icon_state = "floor"},/area/wizard_station)
"lE" = (/turf/unsimulated/floor{icon_state = "floor"},/area/wizard_station)
+"lF" = (/obj/structure/closet,/turf/unsimulated/floor{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/centcom/suppy)
"lG" = (/turf/unsimulated/floor{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station)
"lH" = (/obj/effect/forcefield,/turf/unsimulated/floor{tag = "icon-cultdamage7"; icon_state = "cultdamage7"},/area/wizard_station)
"lI" = (/obj/effect/forcefield,/turf/unsimulated/floor{tag = "icon-cultdamage5"; icon_state = "cultdamage5"},/area/wizard_station)
@@ -605,6 +632,7 @@
"mh" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/shuttle/plating,/area/space)
"mi" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate/black/red,/obj/item/clothing/head/helmet/space/syndicate/black/red,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
"mj" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership)
+"mk" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/centcom/evac)
"ml" = (/obj/machinery/mech_bay_recharge_port,/turf/unsimulated/floor/plating,/area/syndicate_mothership)
"mm" = (/turf/unsimulated/floor{icon_state = "recharge_floor"; name = "mech bay recharge floor"; tag = "icon-recharge_floor"},/area/syndicate_mothership)
"mn" = (/obj/machinery/computer/mech_bay_power_console,/turf/unsimulated/floor/plating,/area/syndicate_mothership)
@@ -620,6 +648,7 @@
"mx" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{tag = "icon-gravsnow_corner (NORTH)"; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership)
"my" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/bush,/turf/unsimulated/floor{tag = "icon-gravsnow_corner (NORTH)"; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership)
"mz" = (/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
+"mA" = (/obj/structure/table/reinforced,/obj/item/toy/AI,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/evac)
"mB" = (/turf/unsimulated/wall,/area/tdome/arena)
"mC" = (/obj/machinery/igniter,/turf/simulated/floor/plasteel,/area/tdome/arena)
"mD" = (/turf/simulated/floor/plasteel,/area/tdome/arena)
@@ -627,6 +656,7 @@
"mF" = (/obj/structure/stool/bed/chair/wood/wings,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"mG" = (/obj/structure/table/wood,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/ointment,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"mH" = (/obj/structure/table/wood,/obj/item/weapon/retractor,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
+"mI" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{tag = "icon-red (NORTHEAST)"; icon_state = "red"; dir = 5},/area/centcom/evac)
"mJ" = (/obj/structure/table/wood,/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"mK" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/hardsuit/wizard,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"mL" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/gibs/body,/turf/unsimulated/floor{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station)
@@ -641,6 +671,8 @@
"mU" = (/obj/structure/table,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
"mV" = (/obj/structure/table,/obj/item/weapon/weldingtool/largetank{pixel_y = 3},/obj/item/device/multitool,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
"mW" = (/obj/structure/stool,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
+"mX" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/unsimulated/floor{tag = "icon-red (NORTH)"; icon_state = "red"; dir = 1},/area/centcom/evac)
+"mY" = (/turf/unsimulated/floor{tag = "icon-redcorner (WEST)"; icon_state = "redcorner"; dir = 8},/area/centcom/evac)
"mZ" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/saber/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"na" = (/obj/machinery/door/poddoor{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"nb" = (/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2)
@@ -664,11 +696,14 @@
"nt" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1)
"nu" = (/turf/unsimulated/wall/fakeglass{color = "#008000"; dir = 1; icon_state = "fakewindows2"},/area/wizard_station)
"nv" = (/obj/structure/bookcase,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
+"nw" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/turf/unsimulated/floor{tag = "icon-red (NORTH)"; icon_state = "red"; dir = 1},/area/centcom/evac)
"nx" = (/obj/structure/cult/talisman{desc = "A altar dedicated to the Wizard's Federation"},/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"ny" = (/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/staff/broom,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"nz" = (/obj/effect/decal/cleanable/blood/splatter,/mob/living/simple_animal/hostile/creature{name = "Experiment 35b"},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
+"nA" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 9},/area/centcom/evac)
"nB" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/remains/human,/turf/unsimulated/floor{icon_state = "floor"},/area/wizard_station)
"nC" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/gibs/body,/turf/unsimulated/floor{icon_state = "floor"},/area/wizard_station)
+"nD" = (/turf/unsimulated/wall/fakeglass,/area/centcom/evac)
"nE" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space/transit,/area/wizard_station)
"nF" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
"nG" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
@@ -678,6 +713,7 @@
"nK" = (/obj/machinery/flasher{id = "tdomeflash"; name = "Thunderdome Flash"},/turf/simulated/floor/bluegrid,/area/tdome/arena)
"nL" = (/obj/machinery/camera{pixel_x = 12; pixel_y = -10; network = list("thunder"); c_tag = "Green Team"},/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1)
"nM" = (/turf/unsimulated/wall/fakeglass{color = "#008000"},/area/wizard_station)
+"nN" = (/obj/structure/rack,/obj/item/weapon/storage/fancy/crayons,/obj/item/toy/sword,/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/centcom/evac)
"nO" = (/obj/effect/landmark/start{name = "wizard"},/turf/unsimulated/floor{tag = "icon-cultdamage5"; icon_state = "cultdamage5"},/area/wizard_station)
"nP" = (/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/splatter,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"nQ" = (/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/wizard_station)
@@ -697,9 +733,14 @@
"oe" = (/turf/unsimulated/floor{tag = "icon-cultdamage4"; icon_state = "cultdamage4"},/area/wizard_station)
"of" = (/obj/machinery/telecomms/allinone{intercept = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
"og" = (/obj/effect/landmark{name = "Nuclear-Bomb"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
+"oh" = (/obj/structure/flora/kirbyplants,/turf/unsimulated/floor{icon_state = "red"; dir = 10},/area/centcom/evac)
+"oi" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/centcom/evac)
"oj" = (/obj/structure/door_assembly{anchored = 1; icon_state = "door_as_uranium1"; name = "Corridor A"},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"ok" = (/turf/unsimulated/wall/normal{tag = "icon-uranium15"; icon_state = "uranium15"},/area/wizard_station)
"ol" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Dooruranium.dmi'; name = "Corridor A"},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
+"om" = (/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/centcom/evac)
+"on" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/shotgun/toy/crossbow,/obj/item/toy/katana,/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/centcom/evac)
+"oo" = (/obj/structure/table,/obj/item/weapon/gun/projectile/automatic/toy/pistol,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/centcom/holding)
"op" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/space)
"oq" = (/obj/machinery/teleport/station,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
"or" = (/obj/machinery/teleport/hub/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
@@ -747,6 +788,7 @@
"ph" = (/turf/unsimulated/wall/fakedoor{name = "Squad 2 Pod"},/area/wizard_station)
"pi" = (/turf/unsimulated/wall/normal{tag = "icon-uranium13"; icon_state = "uranium13"},/area/wizard_station)
"pj" = (/turf/simulated/shuttle/wall,/area/wizard_station)
+"pk" = (/obj/structure/rack,/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/gun/projectile/shotgun/toy/crossbow,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/centcom/holding)
"pl" = (/obj/structure/table/wood,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"pm" = (/obj/structure/table/wood,/obj/item/weapon/gun/magic/wand{desc = "Used in emergency's to reignite magma engines. This one appears spent."; name = "wand of emergency engine ignition"},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"pn" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"},/turf/space,/area/wizard_station)
@@ -779,13 +821,13 @@
"pO" = (/obj/structure/rack,/obj/item/clothing/head/that,/obj/item/clothing/under/suit_jacket,/obj/item/clothing/tie/waistcoat,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/centcom/holding)
"pP" = (/obj/item/weapon/beach_ball,/turf/unsimulated/beach/sand,/area/centcom/holding)
"pQ" = (/obj/structure/shuttle/engine/heater,/turf/unsimulated/floor{tag = "icon-lava"; icon_state = "lava"},/area/wizard_station)
-"pR" = (/obj/structure/rack,/obj/item/weapon/storage/fancy/crayons,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/centcom/holding)
+"pR" = (/obj/structure/rack,/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/gun/projectile/automatic/toy/pistol,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/centcom/holding)
"pS" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "cafeteria"},/area/centcom/holding)
"pT" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/space)
"pU" = (/turf/unsimulated/beach/coastline,/area/centcom/holding)
"pV" = (/obj/item/clothing/head/collectable/paper,/turf/unsimulated/beach/coastline,/area/centcom/holding)
"pW" = (/obj/structure/rack,/obj/item/clothing/shoes/laceup,/obj/item/clothing/under/suit_jacket/female{desc = "A black trouser suit for women. Very formal."; name = "black suit"; pixel_x = 3; pixel_y = 1},/turf/unsimulated/floor{icon_state = "cafeteria"},/area/centcom/holding)
-"pX" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/centcom/holding)
+"pX" = (/obj/structure/table,/obj/item/ammo_box/foambox,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding)
"pY" = (/turf/unsimulated/beach/water,/area/centcom/holding)
"pZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding)
"qa" = (/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/holding)
@@ -928,41 +970,41 @@ abababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdwdwdwdwdwdwdwdwababababababababababababepepepepepepepepepababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdAdBdBdBdBdBdCdwababababababababababababepeuepeuepeuepeuepababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdGdwdwdwdwdwdwdwababababababepepepepepepepepepababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdGdwhrhChthChrdwababababababepeuepeuepeuepeuepababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdMhqfvetetetetdwababababababepepepepepepepepepababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdThEfvetetetetdNabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdUdGhqhFetetetetdwababababababepepepepepepepepepababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdVhEfvetetetetdwababababababepeuepeuepeuepeuepababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdWhDfvetetetetdwdwdwdwdwababepepepepepepepepepababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdGfwfvetetetetdweIeIeIdwababepeuepeuepeuepeuepababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdXeBdHdHdHeGeafEfvetetetetfGeIeIeIdwababepepepepepepepepepababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwebecedededeceedweHeyexeteYdweIeIeIdwababababababababababababababdAezezezezezdCababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdwefegegegehdwdwdwdwdwdwfudwdwdwdwdwababababekekeAekekekabababdAdZeCeDeEeDeFdYdCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdwdwdwdwdwdweifXfXfXfHhlfHfXfXfXeiababababekeJeJeJeKekabababdGeLeMdHdHdHeNeOdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfhfhfheifXhpfXfVemfVfXhpfXeiababababekeJeJeJeJekabababdGeSeTeUeVdHeNeWdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhftfFfWfIfhfXfXfXgvemgvfXfXfXeiababababekeJfafbfcekababdAfddBdBfedBfffgdBfddCababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfYhhfFfFfheQeieQeiemeieQeieQeiababababekfkflfmfnekababdGfofofoezfpdHfqfrfsezababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfFfFfFelfhfJfHgfemememggeQfJeiababababekeJeJeJeJfxfyfzdGfAfBfBfCdHdHdHdHfqdGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfUfhfhfJfVevemememeseieQeieieieieiekeJeJeJeJfKfLfKfMfBfNfNezfOfPfQdHfqezababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgbgbgbgbgbgbgbgbgbgbgbgbgbgcgdfSgefhfJfVevememememememejePePePeiekfxfzfZfxfyfyfzdXdBdBdBgafQfQfQdHfqdGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgbhHdBdBgqdBdBdBezdBdBgrgsgtgdgugefhfJfVevemememggeieQeieiePfieiekghgigigjfKfLfKgkdHgldHdHdHdHdHdHgmdGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzababababababababababababababababababababababababababababfhhHhIeNgDgEgEgEgEgEgEgEgqgFgGgdgugefhfJgvevemememeseQfJeieReZfjeiekghgigigjfxfyfzdGfPdHgwgxdHgwgxdHgydGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgJgIgIgIgKgLgIgIgIgKgIgIgIgIgIgIgKgIgIgzababababababababababababababababababababababababababababfhgodHdHdHdHdHdHdHdHdHdHgTgUgVgdgugWfhgAfherememememeieQeieQeqeQeiekgHgigigjekababezfPdHgwgxdHgwgxdHgyezababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgJgIgIgIgIgIgIgIgIgIgIgIgKgIgIgIgIgIgKgIgIgIgIgIgzababababababababababababababababababababababababababababfhhQeBgMgMeDeDeDeDeDeDeDgqgFhagdgufShRfSfSemememememememeoePeXePengigigigigjgXababezfPdHgwgxdHgwgxdHgyezababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhcgIgIgIgIgIgJgIgIgLgKgIgIgKgIgIgKgLgIgKgIgzababababababababababababababababababababababababababababfhgbhQdBdBgqdBdBdBezdBdBhigsgtgdguhjfhgAfhgfemememggeieQeieieieieiekhkgigigjekababezfPdHgwgxdHgwgxdHgyezababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgJgIgIgKgLgIgIgKgIgLgzababababababababababababababababababababababababababababfhgbgbgbgbgbgbgbgbgbgbgbgbgbhmgdfSgefhfJfHevemememewfHfJeiababababekghgigigjfxfyfzdGfPdHgwgxdHgwgxdHgydGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgJgIgIgIgIgIgLgIgKgLgIgKgIgzababababababababababababababababababababababababababababfhfhfhfhfhfhfhhzhAhAhBfhfhfhfhfhhSfhfhfJfVevemememewfVfJeiababababekghgigigjfKfLfKhndHhodHdHdHdHdHdHgmdGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIhyhyhyhyhyhyhygIgIgIgIgIgIgIgKgIgIhcgLgIgIgIgzabababababababababababababababababababababababababababababababfhhUhVhUhUhUhUhUhUhWhYhXhUhUhUfhfJgvevemememewgvfJeiababababekfxfzhufxfyfyfzdXdBdBhvdBhwezhxezezeaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhMhNhOhOhOhOhOhNhPgIgIgIgIhcgIhygJhygJgIgKgIgKgzabababababababababababababababababababababababababababababababfhhUhUhUhUfDhUfDhUhUhUhUhUhUisfhhZhZiaibicidiehZhZhZababababekgigigigjfKfLfKhnhJhJhJhKdGfrfqfqhLezababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNigihiiijikililhNimgIgIhygzgziniogzgzhyipiqhygzabababababababababababababababababababababababababababababababfhiJhUhUiKiKiKiKfRhUhUhUhUhUiLfhitiuiviwixiyiviuiuhZababababekgigigigjfxfyfzdGhJhJhJhJdGfqfqfqifdGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNiEihihiFihihihhNimgIiGgzgziHiIiIiHgzgzgzgzgzgzgzgzabababababababababababababababababababababababababababababfhiMhUfTiKiNiOiKhUhUhUhUhUhUiPfhiuiUiViwixiyiViWiuhZababababekgiiziAiBekababdGiCiCiDiDdGfrfqfqhLezababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagSjbjcjdaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNjeihihihjfihjghNimhciGgzjhjijijijijjjkjljmjnjojpgzabababababababababababababababababababababababababababababfhiQhUhUiKiKiKiKfRhUhUhUhUhUiRfhjriujriwixiyjriujrhZababababekgiiXiYiZekababebfeedededededededfeeeababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajsaajtjujvjwjxaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIjyhNhNhNjzhNhNhNjAgIgIjBgzjCjijDjDjEjijijijFjGjGjGgzabababababababababababababababababababababababababababababfhiShUhUgnhUgnhUhUhUhUhUhUhUiTfhjPiuiuiwixiyiuiujQhZababababekgigigigiekabababebegegegegegegegeeabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajsjUjVjWjvjXjYaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhNjZihkahNkbhyhyhykcgzjijDkdkejDjikfkgjmkhkigzgzabababababababababababababababababababababababababababababfhjqhUhUhUhUhUhUhUjHjJjIgpiTjLfhklkmkmiwixiyknknkohZababababekjRjSjSjTekabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajYkqlGjXksktjYaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhNkuihkvhNkwkxkxkxiogzjijDkykzjDjikfkAgzgzgzgzababababababababababababababababababababababababababababababfhfhfhfhfhgBfhfhfhfhfhfhfhfhfhfhhZhZhZhZixhZhZhZhZhZababababekekkpekekekabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdwdwdwdwdwdwdwdwabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdAdBdBdBdBdBdCdwabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdGdwdwdwdwdwdwdwabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdGdwlFhChthChrdwabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdMhqfvetetetetdwabababababepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdThEfvetetetetdNabababababepeuepeuepeuepeuepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdUdGhqhFetetetetdwabababababepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdVhEfvetetetetdwabababababepeuepeuepeuepeuepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdWhDfvetetetetdwdwdwdwdwabepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdGfwfvetetetetdweIeIeIdwabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdXeBdHdHdHeGeafEfvetetetetfGeIeIeIdwabepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwebecedededeceedwkQeyexeteYdweIeIeIdwabepeuepeuepeuepeuepabababababababababababdAezezezezezdCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdwefegegegehdwdwdwdwdwdwfudwdwdwdwdwabepepepepepepepepepabekekekekekekabababdAdZeCeDeEeDeFdYdCababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdwdwdwdwdwdweifXfXfXfHhlfHfXfXfXeiabepeuepeuepeuepeuepabeklflglglCekabababdGeLeMdHdHdHeNeOdGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfhfhfheifXhpfXfVemfVfXhpfXeiabepepepepepepepepepabeAeJeJeJeJekabababdGeSeTeUeVdHeNeWdGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhftfFfWfIfhfXfXfXgvemgvfXfXfXeiabababababababababababekeJkTfbfcekababdAfddBdBfedBfffgdBfddCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfYhhfFfFfheQeieQeiemeieQeieQeiabababekekekekekekekekekfklelcldekababdGfofofoezfpdHfqfrfsezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfFfFfFelfhfJfHgfemememggeQfJeiabababekgugegegegUgHgVgWeJeJeJhjfxfyfzdGfAfBfBfCdHdHdHdHfqdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfUfhfhfJfVevemememeseieQeieieieiekghgigigigigigihkeJeJeJhjfKfLfKfMfBfNfNezfOfPfQdHfqezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgbgbgbgbgbgbgbgbgbgbgbgbgbgcfahUeKfhfJfVevemememememenejePePeoekghgigigigigigieHfyfzfZfxfyfyfzdXdBdBdBgafQfQfQdHfqdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgbhHdBdBgqdBdBdBezdBdBgrgsgtfagdeKfhfJfVevemememggeieQeieiePfiekghgigigigigifmfnflgigigjfKfLfKgkdHgldHdHdHdHdHdHgmdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzababababababababababababababababababababababababababababfhhHhIeNgDgEgEgEgEgEgEgEgqgFgGfagdeKfhfJgvevemememkreQfJeieReZfjekkjgigigigikkkBkCflgigigjfxfyfzdGfPdHgwgxdHgwgxdHgydGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgJgIgIgIgKgLgIgIgIgKgIgIgIgIgIgIgKgIgIgzababababababababababababababababababababababababababababfhgodHdHdHdHdHdHdHdHdHdHgTkHkGfagdkPfhgAfheremememeseieQeieQeqeQekkFgigigigikEkEkEkDgigigjekababezfPdHgwgxdHgwgxdHgyezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgJgIgIgIgIgIgIgIgIgIgIgIgKgIgIgIgIgIgKgIgIgIgIgIgzababababababababababababababababababababababababababababfhhQeBgMgMeDeDeDeDeDeDeDgqgFhafagdhUhRfSfSememememememenjaePeXePhTirgigigigigigigigigigigjgXababezfPdHgwgxdHgwgxdHgyezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhcgIgIgIgIgIgJgIgIgLgKgIgIgKgIgIgKgLgIgKgIgzababababababababababababababababababababababababababababfhgbhQdBdBgqdBdBdBezdBdBhigsgtfagdjOfhgAfhgfemememggeieQeieieieiekjNgigigigijMjMjMjKgigigjekababezfPdHgwgxdHgwgxdHgyezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgJgIgIgKgLgIgIgKgIgLgzababababababababababababababababababababababababababababfhgbgbgbgbgbgbgbgbgbgbgbgbgbhmfahUeKfhfJfHevemememewfHfJeiabababekmYgigigiginwmXmIflgigigjfxfyfzdGfPdHgwgxdHgwgxdHgydGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgJgIgIgIgIgIgLgIgKgLgIgKgIgzababababababababababababababababababababababababababababfhfhfhfhfhfhfhhzhAhAhBfhfhfhfhfhhSfhfhfJfVevemememewfVfJeiabababekmkgigigigigiiYmAflgigigjfKfLfKhndHhodHdHdHdHdHdHgmdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIhyhyhyhyhyhyhygIgIgIgIgIgIgIgKgIgIhcgLgIgIgIgzabababababababababababababababababababababababababababababababfhhUhVhUhUhUhUhUhUhWhYhXhUhUhUfhfJgvevemememewgvfJeiabababekmkgigigigigiginAfyfzhufxfyfyfzdXdBdBhvdBhwezhxezezeaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhMhNhOhOhOhOhOhNhPgIgIgIgIhcgIhygJhygJgIgKgIgKgzabababababababababababababababababababababababababababababababfhhUhUhUhUfDhUfDhUhUhUhUhUhUisfhhZhZiaibicidiehZhZhZabababekmkgigigigigigihkgigigigjfKfLfKhnhJhJhJhKdGfrfqfqhLezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNigihiiijikililhNimgIgIhygzgziniogzgzhyipiqhygzabababababababababababababababababababababababababababababababfhiJhUhUiKiKiKiKfRhUhUhUhUhUiLfhitiuiviwixiyiviuiuhZabababekohoioioiomonnNnDgigigigjfxfyfzdGhJhJhJhJdGfqfqfqifdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNiEihihiFihihihhNimgIiGgzgziHiIiIiHgzgzgzgzgzgzgzgzabababababababababababababababababababababababababababababfhiMhUfTiKiNiOiKhUhUhUhUhUhUiPfhiuiUiViwixiyiViWiuhZabababekekekekekekekekekgiiziAiBekababdGiCiCiDiDdGfrfqfqhLezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagSjbjcjdaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNjeihihihjfihjghNimhciGgzjhjijijijijjjkjljmjnjojpgzabababababababababababababababababababababababababababababfhiQhUhUiKiKiKiKfRhUhUhUhUhUiRfhjriujriwixiyjriujrhZabababababababababababekgiiXiYiZekababebfeedededededededfeeeabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajsaajtjujvjwjxaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIjyhNhNhNjzhNhNhNjAgIgIjBgzjCjijDjDjEjijijijFjGjGjGgzabababababababababababababababababababababababababababababfhiShUhUgnhUgnhUhUhUhUhUhUhUiTfhjPiuiuiwixiyiuiujQhZabababababababababababkpgigigigiekabababebegegegegegegegeeababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajsjUjVjWjvjXjYaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhNjZihkahNkbhyhyhykcgzjijDkdkejDjikfkgjmkhkigzgzabababababababababababababababababababababababababababababfhjqhUhUhUhUhUhUhUjHjJjIgpiTjLfhklkmkmiwixiyknknkohZabababababababababababekjRjSjSjTekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajYkqlGjXksktjYaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhNkuihkvhNkwkxkxkxiogzjijDkykzjDjikfkAgzgzgzgzababababababababababababababababababababababababababababababfhfhfhfhfhgBfhfhfhfhfhfhfhfhfhfhhZhZhZhZixhZhZhZhZhZabababababababababababekekekekekekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajwjxkIkJkIkKkLaaaaaaaaaaaaaaaaaaaaababababababgzgIgIhMhNhNhNhNhNkuihkvhNkMkNkNkNkNkOjijijijijijikfkAgzgzgzgzabababababababababababababababababababababababababababababababababababababababababababababababababhZixhZabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaajsjskLkRkSjvjwaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIhNkUihihkVhNkuihkvhNkWkXinkxiogzkYjDjDjDjijikfkZgzlalbgzgzabababababababababababababababababababababababababababababababababababababababababhZhZhZhZhZhZhZhZichZhZhZhZhZhZhZhZababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaalhliljlklllmjvlnjsaaaaaaaaaaaaaaaaaaaaababababababgzgIgIhNkUihlolphNkuihkvhNhNnrlrhPlsgzltlulvlulujijijilwlxlxlygzabababababababababababababababababababababababababababababababababababababababababhZlzlAlAlAlAlAlzlzlzlAlAlAlAlAlzhZababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
@@ -986,11 +1028,11 @@ ababababababababababaaaaaaaaaaaaaaaaaaaaaaaalmjsjdpepfpgjdjWphlEpdaajsaaaaaaaaaa
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaajsmupimqkImspimupjhgpdaajsaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhshshshshshshshshshshshshshshshshshshsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaajsmEjvplpmpljvmEaapnaaaajsaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhspopppqprprpppsptpupvpwpxpypxpxpxpzhsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaajslGpAjvjvjvjvjvpAaaaaaaaalGaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhspopppppppppppBpwpwpwpCpxpxpxpDpxpxhsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaajsjslmjvjdpEjvjvjvpEjdaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhspopppFpopGpHpIpwpwpwpwpxpxpJpxpKpyhsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaajsjslmjvjdpEjvjvjvpEjdaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhspXpppFpopGpHpIpwpwpwpwpxpxpJpxpKpyhsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaajsmtmtpLpMpMpMpMpMpNaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhspOpwpCpCpCpCpCpwpwpwpwpxpxpxpPpxpxhsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajwmqpQpQpQmskLaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhspRpwpwpwpwpwpwpwpwpwpwpSpxpxpxpxpxhsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapTpTpTaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhspRpwpwpwpwpwpwpwpwpCpwpSpUpUpUpVpUhsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhspWpwpwpwpwpwpwpwpCpXpCpSpYpYpYpYpYhsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapTpTpTaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhspkpwpwpwpwpwpwpwpwpCpwpSpUpUpUpVpUhsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhspWpwpwpwpwpwpwpwpCoopCpSpYpYpYpYpYhsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhshspZqaqaqbhshshshshshshshshshshshshsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhsqcqcqcqchsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhsqcqcqcqchsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index ca29b09f718..61aa9962d6b 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -1,5 +1,26 @@
#define MIDNIGHT_ROLLOVER 864000 //number of deciseconds in a day
+#define JANUARY 1
+#define FEBRUARY 2
+#define MARCH 3
+#define APRIL 4
+#define MAY 5
+#define JUNE 6
+#define JULY 7
+#define AUGUST 8
+#define SEPTEMBER 9
+#define OCTOBER 10
+#define NOVEMBER 11
+#define DECEMBER 12
+
+//Select holiday names -- If you test for a holiday in the code, make the holiday's name a define and test for that instead
+#define NEW_YEAR "New Year"
+#define VALENTINES "Valentine's Day"
+#define APRIL_FOOLS "April Fool's Day"
+#define EASTER "Easter"
+#define HALLOWEEN "Halloween"
+#define CHRISTMAS "Christmas"
+#define FRIDAY_13TH "Friday the 13th"
//Human Overlays Indexes/////////
#define SPECIES_LAYER 26 // mutantrace colors... these are on a seperate layer in order to prvent
@@ -113,3 +134,26 @@
#define PEN_FONT "Verdana"
#define CRAYON_FONT "Comic Sans MS"
#define SIGNFONT "Times New Roman"
+
+
+//NPC DEFINES
+#define INTERACTING 2
+#define TRAVEL 4
+#define FIGHTING 8
+
+//TRAITS
+
+#define TRAIT_ROBUST 2
+#define TRAIT_UNROBUST 4
+#define TRAIT_SMART 8
+#define TRAIT_DUMB 16
+#define TRAIT_MEAN 32
+#define TRAIT_FRIENDLY 64
+#define TRAIT_THIEVING 128
+
+//defines
+#define MAX_RANGE_FIND 32
+#define MIN_RANGE_FIND 16
+#define FUZZY_CHANCE_HIGH 85
+#define FUZZY_CHANCE_LOW 50
+#define CHANCE_TALK 15
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index d6c41b34888..bdfc636ee20 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -7,8 +7,10 @@
#define MEMBER_PUBLIC 16
#define INTENT_STYLE 32
#define MIDROUND_ANTAG 64
+#define SOUND_INSTRUMENTS 128
+#define SOUND_SHIP_AMBIENCE 256
-#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG)
+#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE)
//Chat toggles
#define CHAT_OOC 1
diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm
index d0b8e36896b..50f981a3b04 100644
--- a/code/__HELPERS/names.dm
+++ b/code/__HELPERS/names.dm
@@ -70,23 +70,16 @@ var/religion_name = null
new_station_name = name + " "
// Prefix
- switch(SSevent.holiday)
- //get normal name
- if(null,"",0)
- name = pick("", "Stanford", "Dorf", "Alium", "Prefix", "Clowning", "Aegis", "Ishimura", "Scaredy", "Death-World", "Mime", "Honk", "Rogue", "MacRagge", "Ultrameens", "Safety", "Paranoia", "Explosive", "Neckbear", "Donk", "Muppet", "North", "West", "East", "South", "Slant-ways", "Widdershins", "Rimward", "Expensive", "Procreatory", "Imperial", "Unidentified", "Immoral", "Carp", "Ork", "Pete", "Control", "Nettle", "Aspie", "Class", "Crab", "Fist","Corrogated","Skeleton","Race", "Fatguy", "Gentleman", "Capitalist", "Communist", "Bear", "Beard", "Derp", "Space", "Spess", "Star", "Moon", "System", "Mining", "Neckbeard", "Research", "Supply", "Military", "Orbital", "Battle", "Science", "Asteroid", "Home", "Production", "Transport", "Delivery", "Extraplanetary", "Orbital", "Correctional", "Robot", "Hats", "Pizza")
- if(name)
- new_station_name += name + " "
-
- //For special days like christmas, easter, new-years etc ~Carn
- if("Friday the 13th")
- name = pick("Mike","Friday","Evil","Myers","Murder","Deathly","Stabby")
- new_station_name += name + " "
+ for(var/holiday_name in SSevent.holidays)
+ if(holiday_name == "Friday the 13th")
random = 13
- else
- //get the first word of the Holiday and use that
- var/i = findtext(SSevent.holiday," ",1,0)
- name = copytext(SSevent.holiday,1,i)
- new_station_name += name + " "
+ var/datum/holiday/holiday = SSevent.holidays[holiday_name]
+ name = holiday.getStationPrefix()
+ //get normal name
+ if(!name)
+ name = pick("", "Stanford", "Dorf", "Alium", "Prefix", "Clowning", "Aegis", "Ishimura", "Scaredy", "Death-World", "Mime", "Honk", "Rogue", "MacRagge", "Ultrameens", "Safety", "Paranoia", "Explosive", "Neckbear", "Donk", "Muppet", "North", "West", "East", "South", "Slant-ways", "Widdershins", "Rimward", "Expensive", "Procreatory", "Imperial", "Unidentified", "Immoral", "Carp", "Ork", "Pete", "Control", "Nettle", "Aspie", "Class", "Crab", "Fist","Corrogated","Skeleton","Race", "Fatguy", "Gentleman", "Capitalist", "Communist", "Bear", "Beard", "Derp", "Space", "Spess", "Star", "Moon", "System", "Mining", "Neckbeard", "Research", "Supply", "Military", "Orbital", "Battle", "Science", "Asteroid", "Home", "Production", "Transport", "Delivery", "Extraplanetary", "Orbital", "Correctional", "Robot", "Hats", "Pizza")
+ if(name)
+ new_station_name += name + " "
// Suffix
name = pick("Station", "Fortress", "Frontier", "Suffix", "Death-trap", "Space-hulk", "Lab", "Hazard","Spess Junk", "Fishery", "No-Moon", "Tomb", "Crypt", "Hut", "Monkey", "Bomb", "Trade Post", "Fortress", "Village", "Town", "City", "Edition", "Hive", "Complex", "Base", "Facility", "Depot", "Outpost", "Installation", "Drydock", "Observatory", "Array", "Relay", "Monitor", "Platform", "Construct", "Hangar", "Prison", "Center", "Port", "Waystation", "Factory", "Waypoint", "Stopover", "Hub", "HQ", "Office", "Object", "Fortification", "Colony", "Planet-Cracker", "Roost", "Fat Camp")
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index d6840ad30e8..0b5b128540a 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -506,7 +506,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
moblist.Add(M)
for(var/mob/living/carbon/monkey/M in sortmob)
moblist.Add(M)
- for(var/mob/living/carbon/slime/M in sortmob)
+ for(var/mob/living/simple_animal/slime/M in sortmob)
moblist.Add(M)
for(var/mob/living/simple_animal/M in sortmob)
moblist.Add(M)
@@ -1268,6 +1268,37 @@ Turf and target are seperate in case you want to teleport some distance from a t
if(T)
return T
+//Finds the distance between two atoms, in pixels
+/proc/getPixelDistance(var/atom/A, var/atom/B)
+ if(!istype(A)||!istype(B))
+ return 0
+
+ var/_x1 = A.x
+ var/_x2 = B.x
+ var/_y1 = A.y
+ var/_y2 = B.y
+
+ //Ensure _x1 is bigger, simplicity
+ if(_x2 > _x1)
+ var/tx = _x1
+ _x1 = _x2
+ _x2 = tx
+
+ //Ensure _y1 is bigger, simplicity
+ if(_y2 > _y1)
+ var/ty = _y1
+ _y1 = _y2
+ _y2 = ty
+
+ //DY/DX
+ var/dx = _x1 - _x2 + A.pixel_x + B.pixel_x
+ var/dy = _y1 - _y2 + A.pixel_y + B.pixel_y
+
+ //Distance check
+ if(dx == 0 && dy == 0) //No distance, don't bother calculating
+ return 0
+
+ . = sqrt(((dx**2) + (dy**2)))
/proc/get(atom/loc, type)
while(loc)
@@ -1328,7 +1359,7 @@ var/global/list/common_tools = list(
return 1000
else
return 0
- if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
+ if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
return 3800
if(istype(W, /obj/item/weapon/melee/energy))
var/obj/item/weapon/melee/energy/O = W
@@ -1504,4 +1535,4 @@ var/list/WALLITEMS = list(
return pick("red","green","blue","brown","yellow","orange","darkred","crimson",
"lime","darkgreen","cyan","navy","teal","purple","indigo")
else
- return "white"
\ No newline at end of file
+ return "white"
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index cbbd9bc7052..88dd74669d2 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -54,6 +54,7 @@
#define ui_borg_camera "CENTER+3:21,SOUTH:5" //borgs
#define ui_borg_album "CENTER+4:21,SOUTH:5" //borgs
+#define ui_monkey_head "CENTER-4:13,SOUTH:5" //monkey
#define ui_monkey_mask "CENTER-3:14,SOUTH:5" //monkey
#define ui_monkey_back "CENTER-2:15,SOUTH:5" //monkey
diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm
index c96e2556de9..ad2d394d7b3 100644
--- a/code/_onclick/hud/monkey.dm
+++ b/code/_onclick/hud/monkey.dm
@@ -73,6 +73,15 @@
inv_box.layer = 19
adding += inv_box
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "head"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "head"
+ inv_box.screen_loc = ui_monkey_head
+ inv_box.slot_id = slot_head
+ inv_box.layer = 19
+ adding += inv_box
+
inv_box = new /obj/screen/inventory()
inv_box.name = "back"
inv_box.icon = ui_style
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 75917f2de7d..b2f0fd6fcdf 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -39,6 +39,17 @@
visible_message("[attack_message]",
"[attack_message]")
+/mob/living/simple_animal/attacked_by(var/obj/item/I, var/mob/living/user)
+ if(!I.force)
+ user.visible_message("[user] gently taps [src] with [I].",\
+ "This weapon is ineffective, it does no damage.")
+ else if(I.force >= force_threshold && I.damtype != STAMINA)
+ ..()
+ else
+ visible_message("[I] bounces harmlessly off of [src].",\
+ "[I] bounces harmlessly off of [src].")
+
+
// Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person.
// Click parameters is the params string from byond Click() code, see that documentation.
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index b6060e3d3f7..515f0368ec6 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -117,11 +117,11 @@
Slimes
Nothing happening here
*/
-/mob/living/carbon/slime/UnarmedAttack(var/atom/A)
+/mob/living/simple_animal/slime/UnarmedAttack(var/atom/A)
A.attack_slime(src)
/atom/proc/attack_slime(mob/user as mob)
return
-/mob/living/carbon/slime/RestrainedClickOn(var/atom/A)
+/mob/living/simple_animal/slime/RestrainedClickOn(var/atom/A)
return
/*
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index b95575cec58..ba766fbee8c 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -168,8 +168,7 @@ var/const/tk_maxrange = 15
O.icon_state = "nothing"
flick("empdisable",O)
spawn(5)
- O.delete()
- return
+ qdel(O)
/obj/item/tk_grab/update_icon()
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 6cc5abb7a18..515dfef3825 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -110,6 +110,10 @@
var/mutant_races = 0 //players can choose their mutant race before joining the game
var/mutant_colors = 0
+ var/no_summon_guns //No
+ var/no_summon_magic //Fun
+ var/no_summon_events //Allowed
+
var/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced."
var/alert_desc_blue_upto = "The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted."
var/alert_desc_blue_downto = "The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed."
@@ -476,6 +480,12 @@
config.starlight = 1
if("grey_assistants")
config.grey_assistants = 1
+ if("no_summon_guns")
+ config.no_summon_guns = 1
+ if("no_summon_magic")
+ config.no_summon_magic = 1
+ if("no_summon_events")
+ config.no_summon_events = 1
else
diary << "Unknown setting in configuration: '[name]'"
diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm
index 93e38c36be7..929d2078bb2 100644
--- a/code/controllers/subsystem/events.dm
+++ b/code/controllers/subsystem/events.dm
@@ -11,7 +11,7 @@ var/datum/subsystem/events/SSevent
var/frequency_lower = 3000 //5 minutes lower bound.
var/frequency_upper = 9000 //15 minutes upper bound. Basically an event will happen every 5 to 15 minutes.
- var/holiday //This will be a string of the name of any realworld holiday which occurs today (GMT time)
+ var/list/holidays //List of all holidays occuring today or null if no holidays
var/wizardmode = 0
@@ -65,7 +65,7 @@ var/datum/subsystem/events/SSevent
if(E.occurrences >= E.max_occurrences) continue
if(E.earliest_start >= world.time) continue
if(E.holidayID)
- if(E.holidayID != holiday) continue
+ if(!holidays || !holidays[E.holidayID]) continue
if(E.weight < 0) //for round-start events etc.
if(E.runEvent() == PROCESS_KILL)
E.max_occurrences = 0
@@ -82,7 +82,7 @@ var/datum/subsystem/events/SSevent
if(E.occurrences >= E.max_occurrences) continue
if(E.earliest_start >= world.time) continue
if(E.holidayID)
- if(E.holidayID != holiday) continue
+ if(!holidays || !holidays[E.holidayID]) continue
sum_of_weights -= E.weight
if(sum_of_weights <= 0) //we've hit our goal
@@ -152,12 +152,12 @@ var/datum/subsystem/events/SSevent
//////////////
//Uncommenting ALLOW_HOLIDAYS in config.txt will enable holidays
-//It's easy to add stuff. Just modify getHoliday to set holiday to something using the switch for DD(#day) MM(#month) YY(#year).
-//You can then check if it's a special day in any code in the game by doing if(events.holiday == "MyHolidayID")
+//It's easy to add stuff. Just add a holiday datum in code/modules/holiday/holidays.dm
+//You can then check if it's a special day in any code in the game by doing if(SSevent.holidays["Groundhog Day"])
//You can also make holiday random events easily thanks to Pete/Gia's system.
-//simply make a random event normally, then assign it a holidayID string which matches the one you gave it in getHolday.
-//Anything with a holidayID, which does not match the holiday string, will never occur.
+//simply make a random event normally, then assign it a holidayID string which matches the holiday's name.
+//Anything with a holidayID, which isn't in the holidays list, will never occur.
//Please, Don't spam stuff up with stupid stuff (key example being april-fools Pooh/ERP/etc),
//And don't forget: CHECK YOUR CODE!!!! We don't want any zero-day bugs which happen only on holidays and never get found/fixed!
@@ -165,111 +165,27 @@ var/datum/subsystem/events/SSevent
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//ALSO, MOST IMPORTANTLY: Don't add stupid stuff! Discuss bonus content with Project-Heads first please!//
//////////////////////////////////////////////////////////////////////////////////////////////////////////
-~Carn */
+*/
-//sets up the holiday string in the events manager.
+//sets up the holidays and holidays list
/datum/subsystem/events/proc/getHoliday()
if(!config.allow_holidays) return // Holiday stuff was not enabled in the config!
- holiday = null
- var/YY = text2num(time2text(world.timeofday, "YY")) // get the current year
- var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month
- var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day
+ var/YY = text2num(time2text(world.timeofday, "YY")) // get the current year
+ var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month
+ var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day
- //Main switch. If any of these are too dumb/inappropriate, or you have better ones, feel free to change whatever
- switch(MM)
- if(1) //Jan
- switch(DD)
- if(1) holiday = "New Year"
-
- if(2) //Feb
- switch(DD)
- if(2) holiday = "Groundhog Day"
- if(14) holiday = "Valentine's Day"
- if(17) holiday = "Random Acts of Kindness Day"
-
- if(3) //Mar
- switch(DD)
- if(14) holiday = "Pi Day"
- if(17) holiday = "St. Patrick's Day"
- if(27)
- if(YY == 16)
- holiday = "Easter"
- if(31)
- if(YY == 13)
- holiday = "Easter"
-
- if(4) //Apr
- switch(DD)
- if(1)
- holiday = "April Fool's Day"
- if(YY == 18 && prob(50)) holiday = "Easter"
- if(5)
- if(YY == 15) holiday = "Easter"
- if(16)
- if(YY == 17) holiday = "Easter"
- if(20)
- holiday = "Four-Twenty"
- if(YY == 14 && prob(50)) holiday = "Easter"
- if(22) holiday = "Earth Day"
-
- if(5) //May
- switch(DD)
- if(1) holiday = "Labour Day"
- if(4) holiday = "FireFighter's Day"
- if(12) holiday = "Owl and Pussycat Day" //what a dumb day of observence...but we -do- have costumes already :3
-
- if(6) //Jun
-
- if(7) //Jul
- switch(DD)
- if(1) holiday = "Doctor's Day"
- if(2) holiday = "UFO Day"
- if(8) holiday = "Writer's Day"
- if(30) holiday = "Friendship Day"
-
- if(8) //Aug
- switch(DD)
- if(5) holiday = "Beer Day"
-
- if(9) //Sep
- switch(DD)
- if(19) holiday = "Talk-Like-a-Pirate Day"
- if(28) holiday = "Stupid-Questions Day"
-
- if(10) //Oct
- switch(DD)
- if(4) holiday = "Animal's Day"
- if(7) holiday = "Smiling Day"
- if(16) holiday = "Boss' Day"
- if(31) holiday = "Halloween"
-
- if(11) //Nov
- switch(DD)
- if(1) holiday = "Vegan Day"
- if(13) holiday = "Kindness Day"
- if(19) holiday = "Flowers Day"
- if(21) holiday = "Saying-'Hello' Day"
-
- if(12) //Dec
- switch(DD)
- if(10) holiday = "Human-Rights Day"
- if(14) holiday = "Monkey Day"
- if(21) holiday = "Mayan Doomsday Anniversary"
- if(22) holiday = "Orgasming Day" //lol. These all actually exist
- if(24) holiday = "Xmas"
- if(25) holiday = "Xmas"
- if(26) holiday = "Boxing Day"
- if(31) holiday = "New Year"
-
- if(!holiday)
- //Friday the 13th
- if(DD == 13)
- if(time2text(world.timeofday, "DDD") == "Fri")
- holiday = "Friday the 13th"
-
- world.update_status()
+ for(var/H in typesof(/datum/holiday) - /datum/holiday)
+ var/datum/holiday/holiday = new H()
+ if(holiday.shouldCelebrate(DD, MM, YY))
+ holiday.celebrate()
+ if(!holidays)
+ holidays = list()
+ holidays[holiday.name] = holiday
+ if(holidays)
+ holidays = shuffle(holidays)
+ world.update_status()
/datum/subsystem/events/proc/toggleWizardmode()
wizardmode = !wizardmode
diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm
new file mode 100644
index 00000000000..436f1ba8e76
--- /dev/null
+++ b/code/controllers/subsystem/npcpool.dm
@@ -0,0 +1,114 @@
+var/datum/subsystem/npcpool/SSbp
+
+/datum/subsystem/npcpool
+ name = "NPCPool"
+ priority = 27
+
+ var/list/canBeUsed = list()
+ var/list/canBeUsed_non = list()
+ var/list/needsDelegate = list()
+ var/list/needsAssistant = list()
+ var/list/needsHelp_non = list()
+ var/list/botPool_l = list() //list of all npcs using the pool
+ var/list/botPool_l_non = list() //list of all non SNPC mobs using the pool
+
+/datum/subsystem/npcpool/proc/insertBot(var/toInsert)
+ if(istype(toInsert,/mob/living/carbon/human/interactive))
+ botPool_l |= toInsert
+ else if(istype(toInsert,/obj/machinery/bot))
+ botPool_l_non |= toInsert
+
+/datum/subsystem/npcpool/New()
+ NEW_SS_GLOBAL(SSbp)
+
+
+/datum/subsystem/npcpool/stat_entry()
+ stat(name, "[round(cost,0.001)]ds (CPU:[round(cpu,1)]%) (T:[botPool_l.len + botPool_l_non.len] | D: [needsDelegate.len] | A: [needsAssistant.len + needsHelp_non.len] | U: [canBeUsed.len + canBeUsed_non.len])")
+
+
+/datum/subsystem/npcpool/fire()
+ //bot delegation and coordination systems
+ //General checklist/Tasks for delegating a task or coordinating it (for SNPCs)
+ // 1. Bot proximity to task target: if too far, delegate, if close, coordinate
+ // 2. Bot Health/status: check health with bots in local area, if their health is higher, delegate task to them, else coordinate
+ // 3. Process delegation: if a bot (or bots) has been delegated, assign them to the task.
+ // 4. Process coordination: if a bot(or bots) has been asked to coordinate, assign them to help.
+ // 5. Do all assignments: goes through the delegated/coordianted bots and assigns the right variables/tasks to them.
+ var/npcCount = 1
+
+ //bot handling
+ for(var/obj/machinery/bot/check in botPool_l_non)
+ if(!check)
+ botPool_l_non.Cut(npcCount,npcCount+1)
+
+ if(check.hacked)
+ needsHelp_non |= check
+ else if(check.frustration > 5) //average for most bots
+ needsHelp_non |= check
+ else if(check.mode == 0)
+ canBeUsed_non |= check
+ npcCount++
+
+ npcCount = 1 //reset the count
+
+ //SNPC handling
+ for(var/mob/living/carbon/human/interactive/check in botPool_l)
+ var/checkInRange = view(MAX_RANGE_FIND,check)
+ if(!check)
+ botPool_l.Cut(npcCount,npcCount+1)
+ if(!(locate(check.TARGET) in checkInRange))
+ needsDelegate |= check
+
+ else if(check.isnotfunc(FALSE))
+ needsDelegate |= check
+
+ else if(check.doing & FIGHTING)
+ needsAssistant |= check
+
+ else
+ canBeUsed |= check
+ npcCount++
+
+ if(needsDelegate.len)
+ for(var/mob/living/carbon/human/interactive/check in needsDelegate)
+ if(canBeUsed.len)
+ var/mob/living/carbon/human/interactive/candidate = pick(canBeUsed)
+ var/facCount = 0
+ var/helpProb = 0
+ for(var/C in check.faction)
+ if(candidate.faction[facCount] == C)
+ helpProb = min(100,helpProb + 25)
+ facCount++
+ if(facCount == 1 && helpProb > 0)
+ helpProb = 100
+ if(prob(helpProb))
+ if(candidate.takeDelegate(check))
+ needsDelegate -= check
+ canBeUsed -= candidate
+ candidate.eye_color = "red"
+
+ if(needsAssistant.len)
+ for(var/mob/living/carbon/human/interactive/check in needsAssistant)
+ if(canBeUsed.len)
+ var/mob/living/carbon/human/interactive/candidate = pick(canBeUsed)
+ var/facCount = 0
+ var/helpProb = 0
+ for(var/C in check.faction)
+ if(candidate.faction[facCount] == C)
+ helpProb = min(100,helpProb + 10)
+ facCount++
+ if(facCount == 1 && helpProb > 0)
+ helpProb = 100
+ if(prob(helpProb))
+ if(candidate.takeDelegate(check,FALSE))
+ needsAssistant -= check
+ canBeUsed -= candidate
+ candidate.eye_color = "yellow"
+
+ if(needsHelp_non.len)
+ for(var/obj/machinery/bot/B in needsHelp_non)
+ if(canBeUsed_non.len)
+ var/obj/machinery/bot/candidate = pick(canBeUsed_non.len)
+ candidate.call_bot(B,get_turf(B),FALSE)
+ canBeUsed_non -= B
+ needsHelp_non -= candidate
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 2f6c5b2d9d6..040232d7baa 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -47,7 +47,7 @@ var/datum/subsystem/ticker/ticker
NEW_SS_GLOBAL(ticker)
login_music = pickweight(list('sound/ambience/title2.ogg' = 49, 'sound/ambience/title1.ogg' = 49, 'sound/ambience/clown.ogg' = 2)) // choose title music!
- if(SSevent.holiday == "April Fool's Day")
+ if(SSevent.holidays && SSevent.holidays[APRIL_FOOLS])
login_music = 'sound/ambience/clown.ogg'
/datum/subsystem/ticker/Initialize()
@@ -188,11 +188,13 @@ var/datum/subsystem/ticker/ticker
world << "Welcome to [station_name()], enjoy your stay!"
- world << sound('sound/AI/welcome.ogg') // Skie
- //Holiday Round-start stuff ~Carn
- if(SSevent.holiday)
+ world << sound('sound/AI/welcome.ogg')
+
+ if(SSevent.holidays)
world << "and..."
- world << "
Happy [SSevent.holiday] Everybody!
"
+ for(var/holidayname in SSevent.holidays)
+ var/datum/holiday/holiday = SSevent.holidays[holidayname]
+ world << "[holiday.greet()]
"
spawn(0)//Forking here so we dont have to wait for this to finish
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index 55dfc5b593a..de27718296c 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -189,7 +189,7 @@
stage3 = list("Your limbs are getting oozy.", "Your skin begins to peel away.")
stage4 = list("You are turning into a slime.")
stage5 = list("You have become a slime.")
- new_form = /mob/living/carbon/slime
+ new_form = /mob/living/simple_animal/slime
/datum/disease/transformation/slime/stage_act()
..()
diff --git a/code/datums/goon_mutations_disabilities.dm b/code/datums/goon_mutations_disabilities.dm
deleted file mode 100644
index 9da8e51307e..00000000000
--- a/code/datums/goon_mutations_disabilities.dm
+++ /dev/null
@@ -1,184 +0,0 @@
-/datum/mutation/human/wacky
- name = "Wacky"
- quality = MINOR_NEGATIVE
- text_gain_indication = "You feel an off sensation in your voicebox."
- text_lose_indication = "The off sensation passes."
-
-/datum/mutation/human/wacky/get_spans()
- return list(SPAN_SANS)
-
-/datum/mutation/human/mute
- name = "Mute"
- quality = NEGATIVE
- text_gain_indication = "You feel unable to express yourself at all."
- text_lose_indication = "You feel able to speak freely again."
-
-/datum/mutation/human/mute/on_acquiring(mob/living/carbon/human/owner)
- if(..()) return
- owner.disabilities |= MUTE
-
-/datum/mutation/human/mute/on_losing(mob/living/carbon/human/owner)
- if(..()) return
- owner.disabilities &= ~MUTE
-
-/datum/mutation/human/smile
- name = "Smile"
- quality = MINOR_NEGATIVE
- text_gain_indication = "You feel so happy. Nothing can be wrong with anything. :)"
- text_lose_indication = "Everything is terrible again. :("
-
-/datum/mutation/human/smile/say_mod(var/message)
- if(message)
- message = " [message] "
- //Time for a friendly game of SS13
- message = replacetext(message," stupid "," smart ")
- message = replacetext(message," retard "," genius ")
- message = replacetext(message," unrobust "," robust ")
- message = replacetext(message," dumb "," smart ")
- message = replacetext(message," awful "," great ")
- message = replacetext(message," gay ",pick(" nice "," ok "," alright "))
- message = replacetext(message," horrible "," fun ")
- message = replacetext(message," terrible "," terribly fun ")
- message = replacetext(message," terrifying "," wonderful ")
- message = replacetext(message," gross "," cool ")
- message = replacetext(message," disgusting "," amazing ")
- message = replacetext(message," loser "," winner ")
- message = replacetext(message," useless "," useful ")
- message = replacetext(message," oh god "," cheese and crackers ")
- message = replacetext(message," jesus "," gee wiz ")
- message = replacetext(message," weak "," strong ")
- message = replacetext(message," kill "," hug ")
- message = replacetext(message," murder "," tease ")
- message = replacetext(message," ugly "," beautiful ")
- message = replacetext(message," douchbag "," nice guy ")
- message = replacetext(message," whore "," lady ")
- message = replacetext(message," nerd "," smart guy ")
- message = replacetext(message," moron "," fun person ")
- message = replacetext(message," IT'S LOOSE "," EVERYTHING IS FINE ")
- message = replacetext(message," sex "," hug fight ")
- message = replacetext(message," idiot "," genius ")
- message = replacetext(message," fat "," thin ")
- message = replacetext(message," beer "," water with ice ")
- message = replacetext(message," drink "," water ")
- message = replacetext(message," feminist "," empowered woman ")
- message = replacetext(message," i hate you "," you're mean ")
- message = replacetext(message," nigger "," african american ")
- message = replacetext(message," jew "," jewish ")
- message = replacetext(message," shit "," shiz ")
- message = replacetext(message," crap "," poo ")
- message = replacetext(message," slut "," tease ")
- message = replacetext(message," ass "," butt ")
- message = replacetext(message," damn "," dang ")
- message = replacetext(message," fuck "," ")
- message = replacetext(message," penis "," privates ")
- message = replacetext(message," cunt "," privates ")
- message = replacetext(message," dick "," jerk ")
- message = replacetext(message," vagina "," privates ")
- return trim(message)
-
-/datum/mutation/human/unintelligable
- name = "Unintelligable"
- quality = NEGATIVE
- text_gain_indication = "You can't seem to form any coherent thoughts!"
- text_lose_indication = "Your mind feels more clear."
-
-/datum/mutation/human/unintelligable/say_mod(var/message)
- if(message)
- var/prefix=copytext(message,1,2)
- if(prefix == ";")
- message = copytext(message,2)
- else if(prefix in list(":","#"))
- prefix += copytext(message,2,3)
- message = copytext(message,3)
- else
- prefix=""
-
- var/list/words = text2list(message," ")
- var/list/rearranged = list()
- for(var/i=1;i<=words.len;i++)
- var/cword = pick(words)
- words.Remove(cword)
- var/suffix = copytext(cword,length(cword)-1,length(cword))
- while(length(cword)>0 && suffix in list(".",",",";","!",":","?"))
- cword = copytext(cword,1 ,length(cword)-1)
- suffix = copytext(cword,length(cword)-1,length(cword) )
- if(length(cword))
- rearranged += cword
- message = "[prefix][uppertext(list2text(rearranged," "))]!!"
- return message
-
-/datum/mutation/human/swedish
- name = "Swedish"
- quality = MINOR_NEGATIVE
- text_gain_indication = "You feel Swedish, however that works."
- text_lose_indication = "The feeling of Swedishness passes."
-
-/datum/mutation/human/swedish/say_mod(var/message)
- if(message)
- message = replacetext(message,"w","v")
- if(prob(30))
- message += " Bork[pick("",", bork",", bork, bork")]!"
- return message
-
-/datum/mutation/human/chav
- name = "Chav"
- quality = MINOR_NEGATIVE
- text_gain_indication = "Ye feel like a reet prat like, innit?"
- text_lose_indication = "You no longer feel like being rude and sassy."
-
-/datum/mutation/human/chav/say_mod(var/message)
- if(message)
- message = " [message] "
- message = replacetext(message," looking at "," gawpin' at ")
- message = replacetext(message," great "," bangin' ")
- message = replacetext(message," man "," mate ")
- message = replacetext(message," friend ",pick(" mate "," bruv "," bledrin "))
- message = replacetext(message," what "," wot ")
- message = replacetext(message," drink "," wet ")
- message = replacetext(message," get "," giz ")
- message = replacetext(message," what "," wot ")
- message = replacetext(message," no thanks "," wuddent fukken do one ")
- message = replacetext(message," i don't know "," wot mate ")
- message = replacetext(message," no "," naw ")
- message = replacetext(message," robust "," chin ")
- message = replacetext(message," hi "," how what how ")
- message = replacetext(message," hello "," sup bruv ")
- message = replacetext(message," kill "," bang ")
- message = replacetext(message," murder "," bang ")
- message = replacetext(message," windows "," windies ")
- message = replacetext(message," window "," windy ")
- message = replacetext(message," break "," do ")
- message = replacetext(message," your "," yer ")
- message = replacetext(message," security "," coppers ")
- return trim(message)
-
-/datum/mutation/human/elvis
- name = "Elvis"
- quality = MINOR_NEGATIVE
- text_gain_indication = "You feel pretty good, honeydoll."
- text_lose_indication = "You feel a little less conversation would be great."
-
-/datum/mutation/human/elvis/on_life(mob/living/carbon/human/owner)
- switch(pick(1,2))
- if(1)
- if(prob(15))
- var/list/dancetypes = list("swinging", "fancy", "stylish", "20'th century", "jivin'", "rock and roller", "cool", "salacious", "bashing", "smashing")
- var/dancemoves = pick(dancetypes)
- owner.visible_message("[owner] busts out some [dancemoves] moves!")
- if(2)
- if(prob(15))
- owner.visible_message("[owner] [pick("jiggles their hips", "rotates their hips", "gyrates their hips", "taps their foot", "dances to an imaginary song", "jiggles their legs", "snaps their fingers")]!")
-
-/datum/mutation/human/elvis/say_mod(var/message)
- if(message)
- message = " [message] "
- message = replacetext(message," i'm not "," I aint ")
- message = replacetext(message," girl ",pick(" honey "," baby "," baby doll "))
- message = replacetext(message," man ",pick(" son "," buddy "," brother"," pal "," friendo "))
- message = replacetext(message," out of "," outta ")
- message = replacetext(message," thank you "," thank you, thank you very much ")
- message = replacetext(message," what are you "," whatcha ")
- message = replacetext(message," yes ",pick(" sure", "yea "))
- message = replacetext(message," faggot "," square ")
- message = replacetext(message," muh valids "," getting my kicks ")
- return trim(message)
diff --git a/code/datums/goon_mutations_powers.dm b/code/datums/goon_mutations_powers.dm
deleted file mode 100644
index a2e64ff37ee..00000000000
--- a/code/datums/goon_mutations_powers.dm
+++ /dev/null
@@ -1,43 +0,0 @@
-/datum/mutation/human/stealth
- name = "Cloak Of Darkness"
- quality = POSITIVE
- get_chance = 10
- lowest_value = 256 * 14
- text_gain_indication = "You begin to fade into the shadows."
- text_lose_indication = "You become fully visible."
-
-
-/datum/mutation/human/stealth/on_life(mob/living/carbon/human/owner)
- var/turf/simulated/T = get_turf(owner)
- if(!istype(T))
- return
- if(T.lighting_lumcount <= 2)
- owner.alpha -= 25
- else
- owner.alpha = round(255 * 0.80)
-
-/datum/mutation/human/stealth/on_losing(mob/living/carbon/human/owner)
- ..()
- owner.alpha = 255
-
-/datum/mutation/human/chameleon
- name = "Chameleon"
- quality = POSITIVE
- get_chance = 10
- lowest_value = 256 * 14
- text_gain_indication = "You feel one with your surroundings."
- text_lose_indication = "You feel oddly exposed."
- var/last_location
-
-/datum/mutation/human/chameleon/on_life(mob/living/carbon/human/owner)
- if(owner.loc != last_location)
- owner.alpha = round(255 * 0.80)
- last_location = owner.loc
- if((world.time - owner.next_move) >= 30 && !owner.stat && owner.canmove && !owner.restrained())
- owner.alpha -= 25
- else
- owner.alpha = round(255 * 0.80)
-
-/datum/mutation/human/chameleon/on_losing(mob/living/carbon/human/owner)
- ..()
- owner.alpha = 255
\ No newline at end of file
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index a8092bc89e0..dbdcb3afadb 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -1338,7 +1338,7 @@
..()
//slime
-/mob/living/carbon/slime/mind_initialize()
+/mob/living/simple_animal/slime/mind_initialize()
..()
mind.special_role = "slime"
mind.assigned_role = "slime"
diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm
index 1548615ddd0..4b435d4b09c 100644
--- a/code/datums/mutations.dm
+++ b/code/datums/mutations.dm
@@ -5,7 +5,6 @@
var/name
/datum/mutation/New()
-
mutations_list[name] = src
/datum/mutation/human
@@ -50,7 +49,7 @@
. = on_losing(owner)
/datum/mutation/human/proc/on_acquiring(mob/living/carbon/human/owner)
- if(src in owner.dna.mutations)
+ if(!owner || (src in owner.dna.mutations))
return 1
owner.dna.mutations.Add(src)
gain_indication(owner)
@@ -78,7 +77,7 @@
return
/datum/mutation/human/proc/on_losing(mob/living/carbon/human/owner)
- if(owner.dna.mutations.Remove(src))
+ if(owner && (owner.dna.mutations.Remove(src)))
lose_indication(owner)
owner << text_lose_indication
return 0
@@ -124,7 +123,8 @@
owner.emote("collapse")
/datum/mutation/human/hulk/on_losing(mob/living/carbon/human/owner)
- ..()
+ if(..())
+ return
owner.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH
/datum/mutation/human/hulk/say_mod(var/message)
@@ -181,7 +181,8 @@
owner.see_in_dark = 8
/datum/mutation/human/x_ray/on_losing(mob/living/carbon/human/owner)
- if(..()) return
+ if(..())
+ return
if((SEE_MOBS & owner.permanent_sight_flags) && (SEE_OBJS & owner.permanent_sight_flags) && (SEE_TURFS & owner.permanent_sight_flags)) //Xray flag combo
return
owner.see_in_dark = initial(owner.see_in_dark)
@@ -194,11 +195,13 @@
text_gain_indication = "You can't see very well."
/datum/mutation/human/nearsight/on_acquiring(mob/living/carbon/human/owner)
- if(..()) return
+ if(..())
+ return
owner.disabilities |= NEARSIGHT
/datum/mutation/human/nearsight/on_losing(mob/living/carbon/human/owner)
- if(..()) return
+ if(..())
+ return
owner.disabilities &= ~NEARSIGHT
/datum/mutation/human/epilepsy
@@ -256,7 +259,8 @@
owner.disabilities |= CLUMSY
/datum/mutation/human/clumsy/on_losing(mob/living/carbon/human/owner)
- if(..()) return
+ if(..())
+ return
owner.disabilities &= ~CLUMSY
/datum/mutation/human/tourettes
@@ -301,7 +305,8 @@
owner.disabilities |= DEAF
/datum/mutation/human/deaf/on_losing(mob/living/carbon/human/owner)
- if(..()) return
+ if(..())
+ return
owner.disabilities &= ~DEAF
/datum/mutation/human/blind
@@ -315,7 +320,8 @@
owner.disabilities |= BLIND
/datum/mutation/human/blind/on_losing(mob/living/carbon/human/owner)
- if(..()) return
+ if(..())
+ return
owner.disabilities &= ~BLIND
/datum/mutation/human/race
@@ -334,9 +340,245 @@
return
/datum/mutation/human/race/on_losing(mob/living/carbon/monkey/owner)
- if(..()) return
+ if(..())
+ return
. = owner.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE)
+
+/datum/mutation/human/stealth
+ name = "Cloak Of Darkness"
+ quality = POSITIVE
+ get_chance = 10
+ lowest_value = 256 * 14
+ text_gain_indication = "You begin to fade into the shadows."
+ text_lose_indication = "You become fully visible."
+
+
+/datum/mutation/human/stealth/on_life(mob/living/carbon/human/owner)
+ var/turf/simulated/T = get_turf(owner)
+ if(!istype(T))
+ return
+ if(T.lighting_lumcount <= 2)
+ owner.alpha -= 25
+ else
+ owner.alpha = round(255 * 0.80)
+
+/datum/mutation/human/stealth/on_losing(mob/living/carbon/human/owner)
+ if(..())
+ return
+ owner.alpha = 255
+
+/datum/mutation/human/chameleon
+ name = "Chameleon"
+ quality = POSITIVE
+ get_chance = 10
+ lowest_value = 256 * 14
+ text_gain_indication = "You feel one with your surroundings."
+ text_lose_indication = "You feel oddly exposed."
+ var/last_location
+
+/datum/mutation/human/chameleon/on_life(mob/living/carbon/human/owner)
+ if(owner.loc != last_location)
+ owner.alpha = round(255 * 0.80)
+ last_location = owner.loc
+ if((world.time - owner.next_move) >= 30 && !owner.stat && owner.canmove && !owner.restrained())
+ owner.alpha -= 25
+ else
+ owner.alpha = round(255 * 0.80)
+
+/datum/mutation/human/chameleon/on_losing(mob/living/carbon/human/owner)
+ if(..())
+ return
+ owner.alpha = 255
+
+/datum/mutation/human/wacky
+ name = "Wacky"
+ quality = MINOR_NEGATIVE
+ text_gain_indication = "You feel an off sensation in your voicebox."
+ text_lose_indication = "The off sensation passes."
+
+/datum/mutation/human/wacky/get_spans()
+ return list(SPAN_SANS)
+
+/datum/mutation/human/mute
+ name = "Mute"
+ quality = NEGATIVE
+ text_gain_indication = "You feel unable to express yourself at all."
+ text_lose_indication = "You feel able to speak freely again."
+
+/datum/mutation/human/mute/on_acquiring(mob/living/carbon/human/owner)
+ if(..())
+ return
+ owner.disabilities |= MUTE
+
+/datum/mutation/human/mute/on_losing(mob/living/carbon/human/owner)
+ if(..())
+ return
+ owner.disabilities &= ~MUTE
+
+/datum/mutation/human/smile
+ name = "Smile"
+ quality = MINOR_NEGATIVE
+ text_gain_indication = "You feel so happy. Nothing can be wrong with anything. :)"
+ text_lose_indication = "Everything is terrible again. :("
+
+/datum/mutation/human/smile/say_mod(var/message)
+ if(message)
+ message = " [message] "
+ //Time for a friendly game of SS13
+ message = replacetext(message," stupid "," smart ")
+ message = replacetext(message," retard "," genius ")
+ message = replacetext(message," unrobust "," robust ")
+ message = replacetext(message," dumb "," smart ")
+ message = replacetext(message," awful "," great ")
+ message = replacetext(message," gay ",pick(" nice "," ok "," alright "))
+ message = replacetext(message," horrible "," fun ")
+ message = replacetext(message," terrible "," terribly fun ")
+ message = replacetext(message," terrifying "," wonderful ")
+ message = replacetext(message," gross "," cool ")
+ message = replacetext(message," disgusting "," amazing ")
+ message = replacetext(message," loser "," winner ")
+ message = replacetext(message," useless "," useful ")
+ message = replacetext(message," oh god "," cheese and crackers ")
+ message = replacetext(message," jesus "," gee wiz ")
+ message = replacetext(message," weak "," strong ")
+ message = replacetext(message," kill "," hug ")
+ message = replacetext(message," murder "," tease ")
+ message = replacetext(message," ugly "," beautiful ")
+ message = replacetext(message," douchbag "," nice guy ")
+ message = replacetext(message," whore "," lady ")
+ message = replacetext(message," nerd "," smart guy ")
+ message = replacetext(message," moron "," fun person ")
+ message = replacetext(message," IT'S LOOSE "," EVERYTHING IS FINE ")
+ message = replacetext(message," sex "," hug fight ")
+ message = replacetext(message," idiot "," genius ")
+ message = replacetext(message," fat "," thin ")
+ message = replacetext(message," beer "," water with ice ")
+ message = replacetext(message," drink "," water ")
+ message = replacetext(message," feminist "," empowered woman ")
+ message = replacetext(message," i hate you "," you're mean ")
+ message = replacetext(message," nigger "," african american ")
+ message = replacetext(message," jew "," jewish ")
+ message = replacetext(message," shit "," shiz ")
+ message = replacetext(message," crap "," poo ")
+ message = replacetext(message," slut "," tease ")
+ message = replacetext(message," ass "," butt ")
+ message = replacetext(message," damn "," dang ")
+ message = replacetext(message," fuck "," ")
+ message = replacetext(message," penis "," privates ")
+ message = replacetext(message," cunt "," privates ")
+ message = replacetext(message," dick "," jerk ")
+ message = replacetext(message," vagina "," privates ")
+ return trim(message)
+
+/datum/mutation/human/unintelligable
+ name = "Unintelligable"
+ quality = NEGATIVE
+ text_gain_indication = "You can't seem to form any coherent thoughts!"
+ text_lose_indication = "Your mind feels more clear."
+
+/datum/mutation/human/unintelligable/say_mod(var/message)
+ if(message)
+ var/prefix=copytext(message,1,2)
+ if(prefix == ";")
+ message = copytext(message,2)
+ else if(prefix in list(":","#"))
+ prefix += copytext(message,2,3)
+ message = copytext(message,3)
+ else
+ prefix=""
+
+ var/list/words = text2list(message," ")
+ var/list/rearranged = list()
+ for(var/i=1;i<=words.len;i++)
+ var/cword = pick(words)
+ words.Remove(cword)
+ var/suffix = copytext(cword,length(cword)-1,length(cword))
+ while(length(cword)>0 && suffix in list(".",",",";","!",":","?"))
+ cword = copytext(cword,1 ,length(cword)-1)
+ suffix = copytext(cword,length(cword)-1,length(cword) )
+ if(length(cword))
+ rearranged += cword
+ message = "[prefix][uppertext(list2text(rearranged," "))]!!"
+ return message
+
+/datum/mutation/human/swedish
+ name = "Swedish"
+ quality = MINOR_NEGATIVE
+ text_gain_indication = "You feel Swedish, however that works."
+ text_lose_indication = "The feeling of Swedishness passes."
+
+/datum/mutation/human/swedish/say_mod(var/message)
+ if(message)
+ message = replacetext(message,"w","v")
+ if(prob(30))
+ message += " Bork[pick("",", bork",", bork, bork")]!"
+ return message
+
+/datum/mutation/human/chav
+ name = "Chav"
+ quality = MINOR_NEGATIVE
+ text_gain_indication = "Ye feel like a reet prat like, innit?"
+ text_lose_indication = "You no longer feel like being rude and sassy."
+
+/datum/mutation/human/chav/say_mod(var/message)
+ if(message)
+ message = " [message] "
+ message = replacetext(message," looking at "," gawpin' at ")
+ message = replacetext(message," great "," bangin' ")
+ message = replacetext(message," man "," mate ")
+ message = replacetext(message," friend ",pick(" mate "," bruv "," bledrin "))
+ message = replacetext(message," what "," wot ")
+ message = replacetext(message," drink "," wet ")
+ message = replacetext(message," get "," giz ")
+ message = replacetext(message," what "," wot ")
+ message = replacetext(message," no thanks "," wuddent fukken do one ")
+ message = replacetext(message," i don't know "," wot mate ")
+ message = replacetext(message," no "," naw ")
+ message = replacetext(message," robust "," chin ")
+ message = replacetext(message," hi "," how what how ")
+ message = replacetext(message," hello "," sup bruv ")
+ message = replacetext(message," kill "," bang ")
+ message = replacetext(message," murder "," bang ")
+ message = replacetext(message," windows "," windies ")
+ message = replacetext(message," window "," windy ")
+ message = replacetext(message," break "," do ")
+ message = replacetext(message," your "," yer ")
+ message = replacetext(message," security "," coppers ")
+ return trim(message)
+
+/datum/mutation/human/elvis
+ name = "Elvis"
+ quality = MINOR_NEGATIVE
+ text_gain_indication = "You feel pretty good, honeydoll."
+ text_lose_indication = "You feel a little less conversation would be great."
+
+/datum/mutation/human/elvis/on_life(mob/living/carbon/human/owner)
+ switch(pick(1,2))
+ if(1)
+ if(prob(15))
+ var/list/dancetypes = list("swinging", "fancy", "stylish", "20'th century", "jivin'", "rock and roller", "cool", "salacious", "bashing", "smashing")
+ var/dancemoves = pick(dancetypes)
+ owner.visible_message("[owner] busts out some [dancemoves] moves!")
+ if(2)
+ if(prob(15))
+ owner.visible_message("[owner] [pick("jiggles their hips", "rotates their hips", "gyrates their hips", "taps their foot", "dances to an imaginary song", "jiggles their legs", "snaps their fingers")]!")
+
+/datum/mutation/human/elvis/say_mod(var/message)
+ if(message)
+ message = " [message] "
+ message = replacetext(message," i'm not "," I aint ")
+ message = replacetext(message," girl ",pick(" honey "," baby "," baby doll "))
+ message = replacetext(message," man ",pick(" son "," buddy "," brother"," pal "," friendo "))
+ message = replacetext(message," out of "," outta ")
+ message = replacetext(message," thank you "," thank you, thank you very much ")
+ message = replacetext(message," what are you "," whatcha ")
+ message = replacetext(message," yes ",pick(" sure", "yea "))
+ message = replacetext(message," faggot "," square ")
+ message = replacetext(message," muh valids "," getting my kicks ")
+ return trim(message)
+
+
/datum/mutation/human/laser_eyes
name = "Laser Eyes"
@@ -347,3 +589,4 @@
/datum/mutation/human/laser_eyes/on_ranged_attack(mob/living/carbon/human/owner, atom/target)
if(owner.a_intent == "harm")
owner.LaserEyes(target)
+
diff --git a/code/datums/spell.dm b/code/datums/spell.dm
index 7137bbf9ad1..587d5f1c646 100644
--- a/code/datums/spell.dm
+++ b/code/datums/spell.dm
@@ -1,3 +1,6 @@
+#define TARGET_CLOSEST 1
+#define TARGET_RANDOM 2
+
/obj/effect/proc_holder
var/panel = "Debug"//What panel the proc holder needs to go on.
@@ -245,6 +248,8 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
var/max_targets = 1 //leave 0 for unlimited targets in range, 1 for one selectable target in range, more for limited number of casts (can all target one guy, depends on target_ignore_prev) in range
var/target_ignore_prev = 1 //only important if max_targets > 1, affects if the spell can be cast multiple times at one person from one cast
var/include_user = 0 //if it includes usr in the target list
+ var/random_target = 0 // chooses random viable target instead of asking the caster
+ var/random_target_priority = TARGET_CLOSEST // if random_target is enabled how it will pick the target
/obj/effect/proc_holder/spell/aoe_turf //affects all turfs in view or range (depends)
var/inner_radius = -1 //for all your ring spell needs
@@ -269,7 +274,22 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
//targets += input("Choose the target for the spell.", "Targeting") as mob in possible_targets
//Adds a safety check post-input to make sure those targets are actually in range.
- var/mob/M = input("Choose the target for the spell.", "Targeting") as mob in possible_targets
+ var/mob/M
+ if(!random_target)
+ M = input("Choose the target for the spell.", "Targeting") as mob in possible_targets
+ else
+ switch(random_target_priority)
+ if(TARGET_RANDOM)
+ M = pick(possible_targets)
+ if(TARGET_CLOSEST)
+ for(var/mob/living/L in possible_targets)
+ if(M)
+ if(get_dist(user,L) < get_dist(user,M))
+ if(los_check(user,L))
+ M = L
+ else
+ if(los_check(user,L))
+ M = L
if(M in view_or_range(range, user, selection_type)) targets += M
else
@@ -315,4 +335,16 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
/obj/effect/proc_holder/spell/proc/can_be_cast_by(mob/caster)
if((human_req || clothes_req) && !ishuman(caster))
return 0
+ return 1
+
+/obj/effect/proc_holder/spell/targeted/proc/los_check(mob/A,mob/B)
+ //Checks for obstacles from A to B
+ var/obj/dummy = new(A.loc)
+ dummy.pass_flags |= PASSTABLE
+ for(var/turf/turf in getline(A,B))
+ for(var/atom/movable/AM in turf)
+ if(!AM.CanPass(dummy,turf,1))
+ qdel(dummy)
+ return 0
+ qdel(dummy)
return 1
\ No newline at end of file
diff --git a/code/datums/spells/lightning.dm b/code/datums/spells/lightning.dm
new file mode 100644
index 00000000000..b3e813c7e0e
--- /dev/null
+++ b/code/datums/spells/lightning.dm
@@ -0,0 +1,98 @@
+/obj/effect/proc_holder/spell/targeted/lightning
+ name = "Lightning Bolt"
+ desc = "Throws a lightning bolt at the nearby enemy. Classic."
+ charge_type = "recharge"
+ charge_max = 300
+ clothes_req = 1
+ invocation = "UN'LTD P'WAH!"
+ invocation_type = "shout"
+ range = 7
+ cooldown_min = 30
+ selection_type = "view"
+ random_target = 1
+ var/energy = 0
+ var/ready = 0
+ var/image/halo = null
+
+/obj/effect/proc_holder/spell/targeted/lightning/Click()
+ if(!ready)
+ if(cast_check())
+ StartChargeup()
+ else
+ if(cast_check(skipcharge=1))
+ choose_targets()
+ return 1
+
+/obj/effect/proc_holder/spell/targeted/lightning/proc/StartChargeup(mob/user = usr)
+ ready = 1
+ user << "You start gathering the power."
+ halo = image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = EFFECTS_LAYER)
+ user.overlays.Add(halo)
+ spawn(0)
+ while(ready)
+ sleep(1)
+ energy++
+ if(energy >= 100 && ready)
+ Discharge()
+
+obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr)
+ ready = 0
+ energy = 0
+ if(halo)
+ user.overlays.Remove(halo)
+
+/obj/effect/proc_holder/spell/targeted/lightning/revert_cast(mob/user = usr)
+ user << "No target found in range."
+ Reset(user)
+ ..()
+
+/obj/effect/proc_holder/spell/targeted/lightning/proc/Discharge(mob/user = usr)
+ var/mob/living/M = user
+ //M.electrocute_act(25,"Lightning Bolt")
+ M << "You lose control over the spell."
+ Reset(user)
+ start_recharge()
+
+
+/obj/effect/proc_holder/spell/targeted/lightning/cast(list/targets, mob/user = usr)
+
+ var/mob/living/carbon/target = targets[1]
+
+ if(get_dist(user,target)>range)
+ user << "They are too far away!"
+ Reset(user)
+ return
+
+ user.Beam(target,icon_state="lightning",icon='icons/effects/effects.dmi',time=5)
+
+ switch(energy)
+ if(0 to 25)
+ target.electrocute_act(10,"Lightning Bolt")
+ playsound(get_turf(target), 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ if(25 to 75)
+ target.electrocute_act(25,"Lightning Bolt")
+ playsound(get_turf(target), 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ if(75 to 100)
+ //CHAIN LIGHTNING
+ Bolt(user,target,energy,user)
+ Reset(user)
+
+/obj/effect/proc_holder/spell/targeted/lightning/proc/Bolt(mob/origin,mob/target,bolt_energy,mob/user = usr)
+ origin.Beam(target,icon_state="lightning",icon='icons/effects/effects.dmi',time=5)
+ var/mob/living/carbon/current = target
+ if(bolt_energy < 75)
+ current.electrocute_act(25,"Lightning Bolt")
+ playsound(get_turf(current), 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ else
+ current.electrocute_act(25,"Lightning Bolt")
+ playsound(get_turf(current), 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ var/list/possible_targets = new
+ for(var/mob/living/M in view_or_range(range,target,"view"))
+ if(user == M || target == M && los_check(current,M)) // || origin == M ? Not sure double shockings is good or not
+ continue
+ possible_targets += M
+ if(!possible_targets.len)
+ return
+ var/mob/living/next = pick(possible_targets)
+ if(next)
+ Bolt(current,next,bolt_energy-6,user) // 5 max bounces
\ No newline at end of file
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 4b2b44a65ee..119f1682296 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -185,9 +185,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/security/helmets
name = "Helmets Crate"
- contains = list(/obj/item/clothing/head/helmet,
- /obj/item/clothing/head/helmet,
- /obj/item/clothing/head/helmet)
+ contains = list(/obj/item/clothing/head/helmet/sec,
+ /obj/item/clothing/head/helmet/sec,
+ /obj/item/clothing/head/helmet/sec)
cost = 10
containername = "helmet crate"
@@ -1247,3 +1247,26 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/lipstick/random)
cost = 30 //Lots of very expensive items. You gotta pay up to look good!
containername = "formal-wear crate"
+
+/datum/supply_packs/misc/foamforce
+ name = "Foam Force Crate"
+ contains = list(/obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy)
+ cost = 10
+ containername = "foam force crate"
+
+/datum/supply_packs/misc/foamforce/bonus
+ name = "Foam Force Pistols Crate"
+ contains = list(/obj/item/weapon/gun/projectile/automatic/toy/pistol,
+ /obj/item/weapon/gun/projectile/automatic/toy/pistol,
+ /obj/item/ammo_box/magazine/toy/pistol,
+ /obj/item/ammo_box/magazine/toy/pistol)
+ cost = 40
+ containername = "foam force pistols crate"
+ contraband = 1
\ No newline at end of file
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 1c9ad814679..be8c7879494 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -171,6 +171,22 @@ var/list/uplink_items = list()
item = /obj/item/weapon/grenade/syndieminibomb
cost = 6
+/datum/uplink_item/dangerous/foamsmg
+ name = "Toy Submachine Gun"
+ desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade rounds with a 20-round magazine."
+ item = /obj/item/weapon/gun/projectile/automatic/c20r/toy
+ cost = 12
+ gamemodes = list(/datum/game_mode/nuclear)
+ surplus = 0
+
+/datum/uplink_item/dangerous/foammachinegun
+ name = "Toy Machine Gun"
+ desc = "A fully-loaded Donksoft belt-fed machine gun. This weapon has a massive 50-round magazine of devastating riot grade darts, that can briefly incapacitate someone in just one volley."
+ item = /obj/item/weapon/gun/projectile/automatic/l6_saw/toy
+ cost = 30
+ gamemodes = list(/datum/game_mode/nuclear)
+ surplus = 0
+
/datum/uplink_item/dangerous/viscerators
name = "Viscerator Delivery Grenade"
desc = "A unique grenade that deploys a swarm of viscerators upon activation, which will chase down and shred any non-operatives in the area."
@@ -287,6 +303,14 @@ var/list/uplink_items = list()
gamemodes = list(/datum/game_mode/nuclear)
surplus = 0
+/datum/uplink_item/ammo/toydarts
+ name = "Box of Riot Darts"
+ desc = "A box of 40 Donksoft foam riot darts, for reloading any compatible foam dart gun. Don't forget to share!"
+ item = /obj/item/ammo_box/foambox/riot
+ cost = 10
+ gamemodes = list(/datum/game_mode/nuclear)
+ surplus = 0
+
// STEALTHY WEAPONS
/datum/uplink_item/stealthy_weapons
@@ -300,6 +324,13 @@ var/list/uplink_items = list()
cost = 6
excludefrom = list(/datum/game_mode/nuclear)
+/datum/uplink_item/stealthy_weapons/foampistol
+ name = "Toy Gun (with Stun Darts)"
+ desc = "An innocent looking toy pistol designed to fire foam darts. Comes loaded with riot grade darts, to incapacitate a target."
+ item = /obj/item/weapon/gun/projectile/automatic/toy/pistol/riot
+ cost = 10
+ surplus = 10
+
/datum/uplink_item/stealthy_weapons/sleepy_pen
name = "Sleepy Pen"
desc = "A syringe disguised as a functional pen, filled with a potent mix of drugs, including a strong anaesthetic and a chemical that is capable of blocking the movement of the vocal chords. \
diff --git a/code/datums/wires/explosive.dm b/code/datums/wires/explosive.dm
index 7a43c1bde8d..fac7163a486 100644
--- a/code/datums/wires/explosive.dm
+++ b/code/datums/wires/explosive.dm
@@ -30,3 +30,17 @@ var/const/WIRE_EXPLODE = 1
var/obj/item/weapon/c4/P = holder
P.explode(get_turf(P))
+
+
+/datum/wires/explosive/gibtonite
+ holder_type = /obj/item/weapon/twohanded/required/gibtonite
+
+/datum/wires/explosive/gibtonite/CanUse(var/mob/living/L)
+ return 1
+
+/datum/wires/explosive/gibtonite/UpdateCut(var/index, var/mended)
+ return
+
+/datum/wires/explosive/gibtonite/explode()
+ var/obj/item/weapon/twohanded/required/gibtonite/P = holder
+ P.GibtoniteReaction(null, 2)
\ No newline at end of file
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 023212155f7..86520169a27 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -330,12 +330,12 @@
L.lastarea = newarea
// Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch
- if(!(L && L.client && (L.client.prefs.toggles & SOUND_AMBIENCE))) return
-
- if(!L.client.ambience_playing)
+ if(!L.client.ambience_playing && L.client.prefs.toggles & SOUND_SHIP_AMBIENCE)
L.client.ambience_playing = 1
L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = 2)
+ if(!(L && L.client && (L.client.prefs.toggles & SOUND_AMBIENCE))) return //General ambience check is below the ship ambience so one can play without the other
+
if(prob(35))
var/sound = pick(ambientsounds)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index d750748ce3c..3cf497ed472 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -121,8 +121,7 @@
return
/atom/proc/bullet_act(obj/item/projectile/P, def_zone)
- P.on_hit(src, 0, def_zone)
- . = 0
+ . = P.on_hit(src, 0, def_zone)
/atom/proc/in_contents_of(container)//can take class or object instance as argument
if(ispath(container))
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index cc04a274cfc..a0eaf523e16 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -9,6 +9,7 @@
var/languages = 0 //For say() and Hear()
var/verb_say = "says"
var/verb_ask = "asks"
+ var/verb_exclaim = "exclaims"
var/verb_yell = "yells"
var/inertia_dir = 0
var/pass_flags = 0
@@ -158,7 +159,7 @@
//use a modified version of Bresenham's algorithm to get from the atom's current position to that of the target
src.throwing = 1
-
+ SpinAnimation(5, 1)
var/dist_x = abs(target.x - src.x)
var/dist_y = abs(target.y - src.y)
var/dx = (target.x > src.x) ? EAST : WEST
diff --git a/code/game/communications.dm b/code/game/communications.dm
index 08a79d05af5..16cd14b7fb7 100644
--- a/code/game/communications.dm
+++ b/code/game/communications.dm
@@ -130,7 +130,7 @@ var/list/radiochannels = list(
"Medical" = 1355,
"Engineering" = 1357,
"Security" = 1359,
- "Deathsquad" = 1441,
+ "Centcom" = 1441,
"Syndicate" = 1213,
"Supply" = 1347,
"Service" = 1349,
@@ -144,7 +144,7 @@ var/list/radiochannelsreverse = list(
"1355" = "Medical",
"1357" = "Engineering",
"1359" = "Security",
- "1441" = "Deathsquad",
+ "1441" = "Centcom",
"1213" = "Syndicate",
"1347" = "Supply",
"1349" = "Service",
@@ -160,7 +160,7 @@ var/const/COMM_FREQ = 1353 //command, colored gold in chat window
var/const/MED_FREQ = 1355 //medical, coloured blue in chat window
var/const/ENG_FREQ = 1357 //engineering, coloured orange in chat window
var/const/SEC_FREQ = 1359 //security, coloured red in chat window
-var/const/DSQUAD_FREQ = 1441 //death squad frequency, coloured grey in chat window
+var/const/CENTCOM_FREQ = 1441 //centcom frequency, coloured grey in chat window
var/const/AIPRIV_FREQ = 1447 //AI private, colored magenta in chat window
#define TRANSMISSION_WIRE 0
diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm
index f2a2ca65f29..7be421ee470 100644
--- a/code/game/gamemodes/antag_spawner.dm
+++ b/code/game/gamemodes/antag_spawner.dm
@@ -64,7 +64,7 @@
H << "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later."
/obj/item/weapon/antag_spawner/contract/spawn_antag(var/client/C, var/turf/T, var/type = "")
- new /obj/effect/effect/harmless_smoke(T)
+ PoolOrNew(/obj/effect/effect/harmless_smoke, T)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
C.prefs.copy_to(M)
M.key = C.key
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 7930227362e..d8b317d1eb6 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -8,14 +8,7 @@
icon = 'icons/mob/blob.dmi'
pass_flags = PASSBLOB
faction = list("blob")
- min_oxy = 0
- max_oxy = 0
- min_tox = 0
- max_tox = 0
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = 360
var/mob/camera/blob/overmind = null
@@ -93,7 +86,8 @@
H.loc = src
loc.visible_message(" The corpse of [H.name] suddenly rises!")
-/mob/living/simple_animal/hostile/blob/blobspore/Die()
+/mob/living/simple_animal/hostile/blob/blobspore/death(gibbed)
+ ..(1)
// On death, create a small smoke of harmful gas (s-Acid)
var/datum/effect/effect/system/chem_smoke_spread/S = new
var/turf/location = get_turf(src)
@@ -111,6 +105,7 @@
S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud
S.start()
+ ghostize()
qdel(src)
/mob/living/simple_animal/hostile/blob/blobspore/Destroy()
@@ -166,6 +161,6 @@
/mob/living/simple_animal/hostile/blob/blobbernaut/blob_act()
return
-/mob/living/simple_animal/hostile/blob/blobbernaut/Die()
- ..()
+/mob/living/simple_animal/hostile/blob/blobbernaut/death(gibbed)
+ ..(gibbed)
flick("blobbernaut_death", src)
\ No newline at end of file
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index 6a45f0e4765..c2c7d247809 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -42,10 +42,8 @@
/obj/effect/blob/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
- var/damage = Clamp(0.01 * exposed_temperature / fire_resist, 0, 4 - fire_resist)
- if(damage)
- health -= damage
- update_icon()
+ var/damage = Clamp(0.01 * exposed_temperature, 0, 4)
+ take_damage(damage, BURN)
/obj/effect/blob/proc/Life()
return
@@ -132,21 +130,12 @@
/obj/effect/blob/ex_act(severity, target)
..()
- var/damage = 150
- health -= ((damage/brute_resist) - (severity * 5))
- update_icon()
- return
-
+ var/damage = 150 - 20 * severity
+ take_damage(damage, BRUTE)
/obj/effect/blob/bullet_act(var/obj/item/projectile/Proj)
..()
- switch(Proj.damage_type)
- if(BRUTE)
- health -= (Proj.damage/brute_resist)
- if(BURN)
- health -= (Proj.damage/fire_resist)
-
- update_icon()
+ take_damage(Proj.damage, Proj.damage_type)
return 0
/obj/effect/blob/Crossed(var/mob/living/L)
@@ -159,18 +148,9 @@
user.do_attack_animation(src)
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
visible_message("[user] has attacked the [src.name] with \the [W]!")
- var/damage = 0
- switch(W.damtype)
- if("fire")
- damage = (W.force / max(src.fire_resist,1))
- if(istype(W, /obj/item/weapon/weldingtool))
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- if("brute")
- damage = (W.force / max(src.brute_resist,1))
-
- health -= damage
- update_icon()
- return
+ if(W.damtype == BURN)
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
+ take_damage(W.force, W.damtype)
/obj/effect/blob/attack_animal(mob/living/simple_animal/M as mob)
M.changeNext_move(CLICK_CD_MELEE)
@@ -178,12 +158,28 @@
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
visible_message("\The [M] has attacked the [src.name]!")
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
+ take_damage(damage, BRUTE)
+ return
+
+/obj/effect/blob/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
+ M.changeNext_move(CLICK_CD_MELEE)
+ M.do_attack_animation(src)
+ playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
+ visible_message("[M] has slashed the [src.name]!")
+ var/damage = rand(15, 30)
+ take_damage(damage, BRUTE)
+ return
+
+/obj/effect/blob/proc/take_damage(damage, damage_type)
if(!damage) // Avoid divide by zero errors
return
- damage /= max(src.brute_resist, 1)
+ switch(damage_type)
+ if(BRUTE)
+ damage /= max(brute_resist, 1)
+ if(BURN)
+ damage /= max(fire_resist, 1)
health -= damage
update_icon()
- return
/obj/effect/blob/proc/change_to(var/type)
if(!ispath(type))
diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm
index e2f88ac9d9f..e76ed33827c 100644
--- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm
+++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm
@@ -4,7 +4,7 @@
/obj/effect/proc_holder/changeling/augmented_eyesight
name = "Augmented Eyesight"
desc = "Creates heat receptors in our eyes and dramatically increases light sensing ability."
- helptext = "Grants us night vision and thermal vision. It may be toggled on or off."
+ helptext = "Grants us night vision and thermal vision. It may be toggled on or off. We will become more vulnerable to flash-based devices while active."
chemical_cost = 0
dna_cost = 2 //Would be 1 without thermal vision
var/active = 0 //Whether or not vision is enhanced
@@ -13,9 +13,11 @@
active = !active
if(active)
user << "We feel a minute twitch in our eyes, and darkness creeps away."
+ user.weakeyes = 1
else
user << "Our vision dulls. Shadows gather."
user.sight -= SEE_MOBS
+ user.weakeyes = 0
while(active)
user.see_in_dark = 8
user.see_invisible = 2
diff --git a/code/game/gamemodes/changeling/powers/headcrab.dm b/code/game/gamemodes/changeling/powers/headcrab.dm
new file mode 100644
index 00000000000..5970b10de9c
--- /dev/null
+++ b/code/game/gamemodes/changeling/powers/headcrab.dm
@@ -0,0 +1,16 @@
+/obj/effect/proc_holder/changeling/headcrab
+ name = "Last Resort"
+ desc = "We sacrifce our current body in a moment of need, stunning and damaging everyone nearby. If a dead body is nearby we infect it to raise again."
+ chemical_cost = 20
+ dna_cost = 1
+ req_human = 1
+
+/obj/effect/proc_holder/changeling/headcrab/sting_action(var/mob/user)
+ explosion(get_turf(user),0,0,2,0,silent=1)
+ var/turf = get_turf(user)
+ spawn(5) // So it's not killed in explosion
+ var/mob/living/simple_animal/hostile/headcrab/crab = new(turf)
+ crab.origin = user.mind
+ user.gib()
+ feedback_add_details("changeling_powers","LR")
+ return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm
index 92b1e000d41..bc4e20ba0fc 100644
--- a/code/game/gamemodes/malfunction/malfunction.dm
+++ b/code/game/gamemodes/malfunction/malfunction.dm
@@ -156,6 +156,8 @@
priority_announce("Hostile enviroment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority")
SSshuttle.emergencyNoEscape = 0
malf_mode_declared = 0
+ if(get_security_level() == "delta")
+ set_security_level("red")
round_converted = convert_roundtype()
else
return 1
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 100f8d0bc5e..9f0eee8e881 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -265,6 +265,7 @@ datum/objective/escape/check_completion()
datum/objective/escape/escape_with_identity
dangerrating = 10
var/target_real_name // Has to be stored because the target's real_name can change over the course of the round
+ var/target_missing_id
datum/objective/escape/escape_with_identity/find_target()
target = ..()
@@ -273,7 +274,16 @@ datum/objective/escape/escape_with_identity/find_target()
datum/objective/escape/escape_with_identity/update_explanation_text()
if(target && target.current)
target_real_name = target.current.real_name
- explanation_text = "Escape on the shuttle or an escape pod with the identity of [target_real_name], the [target.assigned_role] while wearing their identification card."
+ explanation_text = "Escape on the shuttle or an escape pod with the identity of [target_real_name], the [target.assigned_role]"
+ var/mob/living/carbon/human/H
+ if(ishuman(target.current))
+ H = target.current
+ if(H && H.get_id_name() != target_real_name)
+ target_missing_id = 1
+ else
+ explanation_text += " while wearing their identification card"
+ explanation_text += "." //Proper punctuation is important!
+
else
explanation_text = "Free Objective."
@@ -285,7 +295,7 @@ datum/objective/escape/escape_with_identity/check_completion()
var/mob/living/carbon/human/H = owner.current
if(..())
if(H.dna.real_name == target_real_name)
- if(H.get_id_name()== target_real_name)
+ if(H.get_id_name()== target_real_name || target_missing_id)
return 1
return 0
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index b7ff72de867..7df187b1aa6 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -106,9 +106,12 @@
dat += "Flesh to Stone (60)
"
dat += "This spell will curse a person to immediately turn into an unmoving statue. The effect will eventually wear off if the statue is not destroyed.
"
+ dat += "Lightning Bolt (30)
"
+ dat += "Charge up and throw lightning bolt at the nearby enemy. Classic. The longer you charge the more powerful the spell, beware of overcharge however!
"
+
dat += "Instant Summons (10)
"
dat += "This spell can be used to bind a valuable item to you, bringing it to your hand at will. Using this spell while holding the bound item will allow you to unbind it. It does not require wizard garb.
"
- if(ticker.mode.name != "ragin' mages") // we totally need summon greentext x100
+ if(ticker.mode.name != "ragin' mages" && !config.no_summon_events) // we totally need summon greentext x100
dat += "Summon Events (One time use, persistent global spell)
"
dat += "Give Murphy's law a little push and replace all events with special wizard ones that will confound and confuse everyone. Multiple castings increase the rate of these events.
"
@@ -124,11 +127,11 @@
dat += "
"
- if(!("summon guns" in active_challenges))
+ if(!("summon guns" in active_challenges) && !config.no_summon_guns)
dat += "Summon Guns (Single use only, global spell)
"
dat += "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long!
"
- if(!("summon magic" in active_challenges))
+ if(!("summon magic" in active_challenges) && !config.no_summon_magic)
dat += "Summon Magic (Single use only, global spell)
"
dat += "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time.
"
@@ -220,7 +223,7 @@
uses--
/*
*/
- var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", repulse = "Repulse", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", barnyardcurse = "The Curse of the Barnyard", fleshtostone = "Flesh to Stone", summonitem = "Instant Summons", summonguns = "Summon Guns", summonmagic = "Summon Magic", summonevents = "Summon Events", staffchange = "Staff of Change", soulstone = "Six Soul Stone Shards and the spell Artificer", necrostone = "A Necromantic Stone", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", staffchaos = "Staff of Chaos", staffdoor = "Staff of Door Creation", wands = "Wand Assortment")
+ var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", repulse = "Repulse", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", barnyardcurse = "The Curse of the Barnyard", fleshtostone = "Flesh to Stone", summonitem = "Instant Summons", summonguns = "Summon Guns", summonmagic = "Summon Magic", summonevents = "Summon Events", staffchange = "Staff of Change", soulstone = "Six Soul Stone Shards and the spell Artificer", necrostone = "A Necromantic Stone", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", staffchaos = "Staff of Chaos", staffdoor = "Staff of Door Creation", wands = "Wand Assortment", lightningbolt = "Lightning Bolt")
var/already_knows = 0
for(var/obj/effect/proc_holder/spell/aspell in H.mind.spell_list)
if(available_spells[href_list["spell_choice"]] == initial(aspell.name))
@@ -318,6 +321,10 @@
feedback_add_details("wizard_spell_learned","IS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/summonitem(null)
temp = "You have learned instant summons."
+ if("lightningbolt")
+ feedback_add_details("wizard_spell_learned","LB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/lightning(null)
+ temp = "You have learned lightning bolt."
if("summonguns")
feedback_add_details("wizard_spell_learned","SG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
rightandwrong(0, H, 0)
diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm
index 734f483cf55..386c11d09c9 100644
--- a/code/game/machinery/ai_slipper.dm
+++ b/code/game/machinery/ai_slipper.dm
@@ -96,7 +96,7 @@
if(cooldown_on || disabled)
return
else
- new /obj/effect/effect/foam(src.loc)
+ PoolOrNew(/obj/effect/effect/foam, loc)
src.uses--
cooldown_on = 1
cooldown_time = world.timeofday + 100
diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index a749f95c488..19883679181 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -98,6 +98,7 @@
/obj/machinery/bot/New()
..()
SSbot.processing += src //Global bot list
+ SSbp.insertBot(src)
botcard = new /obj/item/weapon/card/id(src)
set_custom_texts()
Radio = new /obj/item/device/radio(src)
@@ -323,7 +324,7 @@
pulse2.dir = pick(cardinal)
spawn(10)
- pulse2.delete()
+ qdel(pulse2)
if (on)
turn_off()
spawn(severity*300)
@@ -439,7 +440,7 @@ obj/machinery/bot/proc/bot_step(var/dest)
if(mode != BOT_SUMMON && mode != BOT_RESPONDING)
botcard.access = prev_access
-/obj/machinery/bot/proc/call_bot(var/caller, var/turf/waypoint)
+/obj/machinery/bot/proc/call_bot(var/caller, var/turf/waypoint, var/message=TRUE)
bot_reset() //Reset a bot before setting it to call mode.
var/area/end_area = get_area(waypoint)
@@ -456,12 +457,14 @@ obj/machinery/bot/proc/bot_step(var/dest)
if(!on)
turn_on() //Saves the AI the hassle of having to activate a bot manually.
botcard = all_access //Give the bot all-access while under the AI's command.
- calling_ai << "\icon[src] [name] called to [end_area.name]. [path.len-1] meters to destination."
+ if(message)
+ calling_ai << "\icon[src] [name] called to [end_area.name]. [path.len-1] meters to destination."
pathset = 1
mode = BOT_RESPONDING
tries = 0
else
- calling_ai << "Failed to calculate a valid route. Ensure destination is clear of obstructions and within range."
+ if(message)
+ calling_ai << "Failed to calculate a valid route. Ensure destination is clear of obstructions and within range."
calling_ai = null
path = list()
diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm
index 0a72528e8e7..b9b28435749 100644
--- a/code/game/machinery/bots/cleanbot.dm
+++ b/code/game/machinery/bots/cleanbot.dm
@@ -157,7 +157,7 @@ text("[on ? "On" : "Off"]"))
if(prob(5)) //Spawns foam!
visible_message("[src] whirs and bubbles violently, before releasing a plume of froth!")
- new /obj/effect/effect/foam(loc)
+ PoolOrNew(/obj/effect/effect/foam, loc)
else if (prob(5))
visible_message("[src] makes an excited beeping booping sound!")
diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm
index faf974bb6db..87f53d40a0c 100644
--- a/code/game/machinery/bots/ed209bot.dm
+++ b/code/game/machinery/bots/ed209bot.dm
@@ -37,14 +37,6 @@
bot_type = SEC_BOT
bot_filter = RADIO_SECBOT
- //List of weapons that secbots will not arrest for
- var/safe_weapons = list(\
- /obj/item/weapon/gun/energy/laser/bluetag,\
- /obj/item/weapon/gun/energy/laser/redtag,\
- /obj/item/weapon/gun/energy/laser/practice,\
- /obj/item/weapon/melee/classic_baton/telescopic,\
- /obj/item/weapon/gun/energy/kinetic_accelerator)
-
/obj/item/weapon/ed209_assembly
name = "\improper ED-209 assembly"
@@ -206,6 +198,17 @@ Auto Patrol[]"},
icon_state = "[lasercolor]ed209[on]"
set_weapon()
+/obj/machinery/bot/ed209/bullet_act(var/obj/item/projectile/Proj)
+ if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
+ if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
+ if (!Proj.nodamage && Proj.damage < src.health)
+ threatlevel = Proj.firer.assess_threat(src)
+ threatlevel += 6
+ if(threatlevel >= 4)
+ target = Proj.firer
+ mode = BOT_HUNT
+ ..()
+
/obj/machinery/bot/ed209/bot_process()
if (!..())
return
@@ -392,9 +395,8 @@ Auto Patrol[]"},
continue
/obj/machinery/bot/ed209/proc/check_for_weapons(var/obj/item/slot_item)
- if(istype(slot_item, /obj/item/weapon/gun) || istype(slot_item, /obj/item/weapon/melee))
- if(!(slot_item.type in safe_weapons))
- return 1
+ if(slot_item && slot_item.needs_permit)
+ return 1
return 0
/* terrible
@@ -513,7 +515,7 @@ Auto Patrol[]"},
pulse2.anchored = 1
pulse2.dir = pick(cardinal)
spawn(10)
- pulse2.delete()
+ qdel(pulse2)
var/list/mob/living/carbon/targets = new
for (var/mob/living/carbon/C in view(12,src))
if (C.stat==2)
diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm
index 5a6b904683f..0596bbe5b5e 100644
--- a/code/game/machinery/bots/secbot.dm
+++ b/code/game/machinery/bots/secbot.dm
@@ -27,15 +27,6 @@
bot_type = SEC_BOT
bot_filter = RADIO_SECBOT
- //List of weapons that secbots will not arrest for
- var/safe_weapons = list(\
- /obj/item/weapon/gun/energy/laser/bluetag,\
- /obj/item/weapon/gun/energy/laser/redtag,\
- /obj/item/weapon/gun/energy/laser/practice,\
- /obj/item/weapon/melee/classic_baton/telescopic,\
- /obj/item/weapon/gun/energy/kinetic_accelerator)
-
-
/obj/machinery/bot/secbot/beepsky
name = "Officer Beep O'sky"
desc = "It's Officer Beep O'sky! Powered by a potato and a shot of whiskey."
@@ -189,6 +180,17 @@ Auto Patrol: []"},
declare_arrests = 0
icon_state = "secbot[on]"
+/obj/machinery/bot/secbot/bullet_act(var/obj/item/projectile/Proj)
+ if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
+ if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
+ if (!Proj.nodamage && Proj.damage < src.health)
+ threatlevel = Proj.firer.assess_threat(src)
+ threatlevel += 6
+ if(threatlevel >= 4)
+ target = Proj.firer
+ mode = BOT_HUNT
+ ..()
+
/obj/machinery/bot/secbot/bot_process()
if (!..())
return
@@ -350,9 +352,8 @@ Auto Patrol: []"},
else
continue
/obj/machinery/bot/secbot/proc/check_for_weapons(var/obj/item/slot_item)
- if(istype(slot_item, /obj/item/weapon/gun) || istype(slot_item, /obj/item/weapon/melee))
- if(!(slot_item.type in safe_weapons))
- return 1
+ if(slot_item && slot_item.needs_permit)
+ return 1
return 0
/obj/machinery/bot/secbot/explode()
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 147ef9b1c15..76d084ffba7 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -3,35 +3,35 @@
desc = "random arcade machine"
icon = 'icons/obj/computer.dmi'
icon_state = "arcade"
- var/list/prizes = list( /obj/item/weapon/storage/box/snappops = 2,
- /obj/item/toy/AI = 2,
- /obj/item/clothing/under/syndicate/tacticool = 2,
- /obj/item/toy/sword = 2,
- /obj/item/toy/gun = 2,
- /obj/item/toy/crossbow = 2,
- /obj/item/weapon/storage/box/fakesyndiesuit = 2,
- /obj/item/weapon/storage/fancy/crayons = 2,
- /obj/item/toy/spinningtoy = 2,
- /obj/item/toy/prize/ripley = 1,
- /obj/item/toy/prize/fireripley = 1,
- /obj/item/toy/prize/deathripley = 1,
- /obj/item/toy/prize/gygax = 1,
- /obj/item/toy/prize/durand = 1,
- /obj/item/toy/prize/honk = 1,
- /obj/item/toy/prize/marauder = 1,
- /obj/item/toy/prize/seraph = 1,
- /obj/item/toy/prize/mauler = 1,
- /obj/item/toy/prize/odysseus = 1,
- /obj/item/toy/prize/phazon = 1,
- /obj/item/toy/prize/reticence = 1,
- /obj/item/toy/cards/deck = 2,
- /obj/item/toy/nuke = 2,
- /obj/item/toy/minimeteor = 2,
- /obj/item/toy/carpplushie = 2,
- /obj/item/toy/foamblade = 2,
- /obj/item/toy/redbutton = 2,
- /obj/item/toy/owl = 2,
- /obj/item/toy/griffin = 2
+ var/list/prizes = list( /obj/item/weapon/storage/box/snappops = 2,
+ /obj/item/toy/AI = 2,
+ /obj/item/clothing/under/syndicate/tacticool = 2,
+ /obj/item/toy/sword = 2,
+ /obj/item/toy/gun = 2,
+ /obj/item/weapon/gun/projectile/shotgun/toy/crossbow = 2,
+ /obj/item/weapon/storage/box/fakesyndiesuit = 2,
+ /obj/item/weapon/storage/fancy/crayons = 2,
+ /obj/item/toy/spinningtoy = 2,
+ /obj/item/toy/prize/ripley = 1,
+ /obj/item/toy/prize/fireripley = 1,
+ /obj/item/toy/prize/deathripley = 1,
+ /obj/item/toy/prize/gygax = 1,
+ /obj/item/toy/prize/durand = 1,
+ /obj/item/toy/prize/honk = 1,
+ /obj/item/toy/prize/marauder = 1,
+ /obj/item/toy/prize/seraph = 1,
+ /obj/item/toy/prize/mauler = 1,
+ /obj/item/toy/prize/odysseus = 1,
+ /obj/item/toy/prize/phazon = 1,
+ /obj/item/toy/prize/reticence = 1,
+ /obj/item/toy/cards/deck = 2,
+ /obj/item/toy/nuke = 2,
+ /obj/item/toy/minimeteor = 2,
+ /obj/item/toy/carpplushie = 2,
+ /obj/item/toy/foamblade = 2,
+ /obj/item/toy/redbutton = 2,
+ /obj/item/toy/owl = 2,
+ /obj/item/toy/griffin = 2
)
/obj/machinery/computer/arcade/New()
diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm
index db4becd96bf..692bf826437 100644
--- a/code/game/machinery/computer/shuttle.dm
+++ b/code/game/machinery/computer/shuttle.dm
@@ -92,7 +92,7 @@
else if(istype(A, /mob/living)) // You Shall Not Pass!
var/mob/living/M = A
- if(!M.lying && !istype(M, /mob/living/carbon/monkey) && !istype(M, /mob/living/carbon/slime)) //If your not laying down, or a small creature, no pass.
+ if(!M.lying && !ismonkey(M) && !isslime(M)) //If your not laying down, or a small creature, no pass.
return 0
return ..()
@@ -134,7 +134,7 @@
circuit = /obj/item/weapon/circuitboard/supplycomp
verb_say = "flashes"
verb_ask = "flashes"
- verb_yell = "flashes"
+ verb_exclaim = "flashes"
var/temp = null
var/reqtime = 0 //Cooldown for requisitions - Quarxink
var/hacked = 0
@@ -155,7 +155,7 @@
circuit = /obj/item/weapon/circuitboard/ordercomp
verb_say = "flashes"
verb_ask = "flashes"
- verb_yell = "flashes"
+ verb_exclaim = "flashes"
var/temp = null
var/reqtime = 0 //Cooldown for requisitions - Quarxink
var/last_viewed_group = "categories"
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index 5e77e908e94..5c823178fad 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -381,6 +381,16 @@ to destroy them and players will be able to make replacements.
/obj/item/weapon/stock_parts/manipulator = 1,
/obj/item/weapon/stock_parts/console_screen = 1,
/obj/item/weapon/stock_parts/cell = 1)
+
+/obj/item/weapon/circuitboard/chem_master
+ name = "circuit board (Chem Master 2999)"
+ build_path = /obj/machinery/chem_master/constructable
+ board_type = "machine"
+ origin_tech = "materials=2;programming=2;biotech=1"
+ req_components = list(
+ /obj/item/weapon/reagent_containers/glass/beaker = 2,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
/obj/item/weapon/circuitboard/chem_heater
name = "circuit board (Chemical Heater)"
diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm
index 7c47ceba176..ac30218b651 100644
--- a/code/game/machinery/doors/poddoor.dm
+++ b/code/game/machinery/doors/poddoor.dm
@@ -73,13 +73,14 @@
flick("closing", src)
icon_state = "closed"
SetOpacity(1)
+ sleep(5)
+ density = 1
+ sleep(5)
air_update_turf(1)
update_freelook_sight()
sleep(5)
crush()
- density = 1
sleep(5)
-
operating = 0
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 88c3cad51e1..412048bb8a5 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -233,7 +233,7 @@
attack_generic(M, M.melee_damage_upper)
-/obj/machinery/door/window/attack_slime(mob/living/carbon/slime/user as mob)
+/obj/machinery/door/window/attack_slime(mob/living/simple_animal/slime/user as mob)
user.do_attack_animation(src)
if(!user.is_adult)
return
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index 3873123583f..f575ccd7778 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -84,6 +84,9 @@
if(L.flash_eyes())
L.Weaken(strength)
+ if(L.weakeyes)
+ L.Weaken(strength * 1.5)
+ L.visible_message("[L] gasps and shields their eyes!")
return 1
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index bd71a6f4005..bfa9f68ef65 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -93,6 +93,7 @@ Class Procs:
/obj/machinery
name = "machinery"
icon = 'icons/obj/stationobjs.dmi'
+ verb_yell = "blares"
var/stat = 0
var/emagged = 0
var/use_power = 1
@@ -143,7 +144,7 @@ Class Procs:
pulse2.dir = pick(cardinal)
spawn(10)
- pulse2.delete()
+ qdel(pulse2)
..()
/obj/machinery/proc/open_machine()
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 72aa050feb2..a69a1526de8 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -126,7 +126,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
icon_state = "newscaster_normal"
verb_say = "beeps"
verb_ask = "beeps"
- verb_yell = "beeps"
+ verb_exclaim = "beeps"
var/isbroken = 0 //1 if someone banged it with something heavy
var/ispowered = 1 //starts powered, changes with power_change()
//var/list/datum/feed_channel/channel_list = list() //This list will contain the names of the feed channels. Each name will refer to a data region where the messages of the feed channels are stored.
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 44b12faf411..8f3d33fafbb 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -22,9 +22,12 @@
user << "[src] blinks red as you try to insert [G]."
return
- if (istype(G, /obj/item/weapon/gun/energy/gun/nuclear))
- user << "Your gun's recharge port was removed to make room for a miniaturized reactor."
- return
+ if (istype(G, /obj/item/weapon/gun/energy))
+ var/obj/item/weapon/gun/energy/gun = G
+ if(!gun.can_charge)
+ user << "Your gun has no external power connector."
+ return
+
user.drop_item()
G.loc = src
charging = G
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 8cad35a743d..e1755317dce 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -44,11 +44,11 @@
STORAGE_TYPE = /obj/item/weapon/tank/jetpack/oxygen
/obj/machinery/suit_storage_unit/engine
- SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit
+ SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/engine
MASK_TYPE = /obj/item/clothing/mask/breath
/obj/machinery/suit_storage_unit/ce
- SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/elite
+ SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/engine/elite
MASK_TYPE = /obj/item/clothing/mask/breath
STORAGE_TYPE= /obj/item/clothing/shoes/magboots/advance
@@ -61,7 +61,7 @@
MASK_TYPE = /obj/item/clothing/mask/gas/sechailer
/obj/machinery/suit_storage_unit/atmos
- SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/atmos
+ SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/engine/atmos
MASK_TYPE = /obj/item/clothing/mask/gas
STORAGE_TYPE = /obj/item/weapon/watertank/atmos
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index 1a70443e37f..27f39329e7c 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -59,7 +59,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
Broadcast_Message(signal.data["mob"],
signal.data["vmask"], signal.data["radio"],
signal.data["message"], signal.data["name"], signal.data["job"], signal.data["realname"],
- 0, signal.data["compression"], signal.data["level"], signal.frequency, signal.data["spans"])
+ 0, signal.data["compression"], signal.data["level"], signal.frequency, signal.data["spans"],
+ signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"])
/** #### - Simple Broadcast - #### **/
@@ -83,7 +84,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
signal.data["vmask"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
- signal.data["realname"], 4, signal.data["compression"], signal.data["level"], signal.frequency, signal.data["spans"])
+ signal.data["realname"], 4, signal.data["compression"], signal.data["level"], signal.frequency, signal.data["spans"],
+ signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"])
if(!message_delay)
message_delay = 1
@@ -143,7 +145,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
signal.data["vmask"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
- signal.data["realname"],, signal.data["compression"], list(0, z), signal.frequency, signal.data["spans"])
+ signal.data["realname"],, signal.data["compression"], list(0, z), signal.frequency, signal.data["spans"],
+ signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"])
/**
@@ -204,7 +207,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
/proc/Broadcast_Message(var/atom/movable/AM,
var/vmask, var/obj/item/device/radio/radio,
var/message, var/name, var/job, var/realname,
- var/data, var/compression, var/list/level, var/freq, var/list/spans)
+ var/data, var/compression, var/list/level, var/freq, var/list/spans,
+ var/verb_say, var/verb_ask, var/verb_exclaim, var/verb_yell)
message = copytext(message, 1, MAX_BROADCAST_LEN)
@@ -220,9 +224,10 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
virt.source = AM
virt.faketrack = data == 4 ? 1 : 0
virt.radio = radio
- virt.verb_say = AM.verb_say
- virt.verb_ask = AM.verb_ask
- virt.verb_yell = AM.verb_yell
+ virt.verb_say = verb_say
+ virt.verb_ask = verb_ask
+ virt.verb_exclaim = verb_exclaim
+ virt.verb_yell = verb_yell
if(compression > 0)
message = Gibberish(message, compression + 40)
@@ -461,8 +466,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
part_a = ""
else if (display_freq==SUPP_FREQ)
part_a = ""
- else if (display_freq==DSQUAD_FREQ)
- part_a = ""
+ else if (display_freq==CENTCOM_FREQ)
+ part_a = ""
else if (display_freq==AIPRIV_FREQ)
part_a = ""
diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm
index 829af0c35d1..b7ebd4314ac 100644
--- a/code/game/machinery/telecomms/logbrowser.dm
+++ b/code/game/machinery/telecomms/logbrowser.dm
@@ -75,7 +75,7 @@
var/list/humans = typesof(/mob/living/carbon/human, /mob/living/carbon/brain)
var/list/monkeys = typesof(/mob/living/carbon/monkey)
var/list/silicons = typesof(/mob/living/silicon)
- var/list/slimes = typesof(/mob/living/carbon/slime)
+ var/list/slimes = typesof(/mob/living/simple_animal/slime)
var/list/animals = typesof(/mob/living/simple_animal)
if(mobtype in humans)
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index 1fd2f349c89..c0c8d3abbf9 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -88,7 +88,11 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
"server" = signal.data["server"],
"reject" = signal.data["reject"],
"level" = signal.data["level"],
- "spans" = signal.data["spans"]
+ "spans" = signal.data["spans"],
+ "verb_say" = signal.data["verb_say"],
+ "verb_ask" = signal.data["verb_ask"],
+ "verb_exclaim" = signal.data["verb_exclaim"],
+ "verb_yell" = signal.data["verb_yell"]
)
// Keep the "original" signal constant
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 762005ecd6f..d5be45d6338 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -16,7 +16,7 @@
density = 1
verb_say = "beeps"
verb_ask = "beeps"
- verb_yell = "beeps"
+ verb_exclaim = "beeps"
var/active = 1 //No sales pitches if off!
var/vend_ready = 1 //Are we ready to vend?? Is it time??
var/vend_delay = 10 //How long does it take to vend?
@@ -727,7 +727,8 @@
/obj/item/weapon/lighter/grayscale = 4,
/obj/item/weapon/storage/fancy/rollingpapers = 5)
contraband = list(/obj/item/weapon/lighter/zippo = 4)
- premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2, /obj/item/weapon/storage/fancy/cigarettes/cigpack_robustgold = 1)
+ premium = list(/obj/item/weapon/storage/fancy/cigarettes/cigpack_robustgold = 2, \
+ /obj/item/weapon/storage/fancy/cigars = 1, /obj/item/weapon/storage/fancy/cigars/havana = 1, /obj/item/weapon/storage/fancy/cigars/cohiba = 1)
refill_canister = /obj/item/weapon/vending_refill/cigarette
/obj/machinery/vending/medical
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index 8d010698780..486d47a003c 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -47,7 +47,7 @@
if(occupant)
occupant_message("The sleeper is already occupied")
return
- for(var/mob/living/carbon/slime/M in range(1,target))
+ for(var/mob/living/simple_animal/slime/M in range(1,target))
if(M.Victim == target)
occupant_message("[target] will not fit into the sleeper because they have a slime latched onto their head.")
return
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index ac3841fcae2..05cb1cb48a4 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -211,7 +211,7 @@
var/list/the_targets = list(T,T1,T2)
spawn(0)
for(var/a=0, a<5, a++)
- var/obj/effect/effect/water/W = new /obj/effect/effect/water(get_turf(chassis))
+ var/obj/effect/effect/water/W = PoolOrNew(/obj/effect/effect/water, get_turf(chassis))
if(!W)
return
var/turf/my_target = pick(the_targets)
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index c9ad3ae4189..e8fe2378646 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -101,6 +101,22 @@
projectile = /obj/item/projectile/beam/pulse/heavy
fire_sound = 'sound/weapons/marauder.ogg'
+/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma
+ equip_cooldown = 8
+ name = "217-D Heavy Plasma Cutter"
+ desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demloishing solid obstacles."
+ icon_state = "mecha_plasmacutter"
+ item_state = "plasmacutter"
+ energy_drain = 45
+ origin_tech = "materials=3;combat=2;powerstorage=3;plasma=3"
+ projectile = /obj/item/projectile/plasma/adv/mech
+ fire_sound = 'sound/weapons/pulse.ogg'
+
+/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/can_attach(obj/mecha/M as obj)
+ if(istype(M, /obj/mecha/working))
+ if(M.equipment.lenAccess denied."
src.log_append_to_last("Permission denied.")
return
- for(var/mob/living/carbon/slime/S in range(1,user))
+ for(var/mob/living/simple_animal/slime/S in range(1,user))
if(S.Victim == user)
user << "You're too busy getting your life sucked out of you."
return
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index 0b781d9369c..b8bbbc23481 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -73,6 +73,7 @@
desc = "Device used to transmit exosuit data."
icon = 'icons/obj/device.dmi'
icon_state = "motion2"
+ w_class = 2
origin_tech = "programming=2;magnets=2"
/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info()
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index b45b9bebf25..f015c1f346a 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -7,7 +7,8 @@
health = 200
lights_power = 7
deflect_chance = 15
- damage_absorption = list("brute"=0.6,"bomb"=0.2)
+ damage_absorption = list("brute"=0.6,"fire"=1,"bullet"=0.8,"laser"=0.9,"energy"=1,"bomb"=0.6)
+ max_equip = 6
wreckage = /obj/structure/mecha_wreckage/ripley
var/list/cargo = new
var/cargo_capacity = 15
@@ -18,6 +19,14 @@
return
*/
+/obj/mecha/working/ripley/Move()
+ . = ..()
+ if(. && (locate(/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp) in equipment))
+ var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in cargo
+ if(ore_box)
+ for(var/obj/item/weapon/ore/ore in get_turf(src))
+ ore.Move(ore_box)
+
/obj/mecha/working/ripley/Destroy()
while(src.damage_absorption.["brute"] < 0.6)
new /obj/item/asteroid/goliath_hide(src.loc)
@@ -30,7 +39,7 @@
/obj/mecha/working/ripley/go_out()
..()
- if (src.damage_absorption.["brute"] < 0.6 && src.damage_absorption.["brute"] > 0.3)
+ if (src.damage_absorption["brute"] < 0.6 && src.damage_absorption["brute"] > 0.3)
src.overlays = null
src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-open")
else if (src.damage_absorption.["brute"] == 0.3)
@@ -39,30 +48,31 @@
/obj/mecha/working/ripley/moved_inside(var/mob/living/carbon/human/H as mob)
..()
- if (src.damage_absorption.["brute"] < 0.6 && src.damage_absorption.["brute"] > 0.3)
+ if (src.damage_absorption["brute"] < 0.6 && src.damage_absorption["brute"] > 0.3)
src.overlays = null
src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g")
- else if (src.damage_absorption.["brute"] == 0.3)
+ else if (src.damage_absorption["brute"] == 0.3)
src.overlays = null
src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full")
/obj/mecha/working/ripley/mmi_moved_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob)
..()
- if (src.damage_absorption.["brute"] < 0.6 && src.damage_absorption.["brute"] > 0.3)
+ if (src.damage_absorption["brute"] < 0.6 && src.damage_absorption["brute"] > 0.3)
src.overlays = null
src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g")
- else if (src.damage_absorption.["brute"] == 0.3)
+ else if (src.damage_absorption["brute"] == 0.3)
src.overlays = null
src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full")
/obj/mecha/working/ripley/firefighter
- desc = "Standart APLU chassis was refitted with additional thermal protection and cistern."
+ desc = "Autonomous Power Loader Unit. This model is refitted with additional thermal protection."
name = "\improper APLU \"Firefighter\""
icon_state = "firefighter"
max_temperature = 65000
health = 250
lights_power = 7
- damage_absorption = list("brute"=1,"fire"=0.5,"bullet"=0.8,"bomb"=0.5)
+ damage_absorption = list("brute"=0.6,"fire"=0.5,"bullet"=0.7,"laser"=0.7,"energy"=1,"bomb"=0.4)
+ max_equip = 5 // More armor, less tools
wreckage = /obj/structure/mecha_wreckage/ripley/firefighter
/obj/mecha/working/ripley/deathripley
@@ -82,7 +92,7 @@
return
/obj/mecha/working/ripley/mining
- desc = "An old, dusty mining ripley."
+ desc = "An old, dusty mining Ripley."
name = "\improper APLU \"Miner\""
/obj/mecha/working/ripley/mining/New()
@@ -95,7 +105,15 @@
var/obj/item/mecha_parts/mecha_equipment/tool/drill/D = new /obj/item/mecha_parts/mecha_equipment/tool/drill
D.attach(src)
- //Attach hydrolic clamp
+ //Add possible plasma cutter
+ if(prob(25))
+ var/obj/item/mecha_parts/mecha_equipment/M = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma
+ M.attach(src)
+
+ //Add ore box to cargo
+ cargo.Add(new /obj/structure/ore_box(src))
+
+ //Attach hydraulic clamp
var/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/HC = new /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp
HC.attach(src)
for(var/obj/item/mecha_parts/mecha_tracking/B in src.contents)//Deletes the beacon so it can't be found easily
diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm
index 7a59b6190ed..6516e3f4a46 100644
--- a/code/game/mecha/working/working.dm
+++ b/code/game/mecha/working/working.dm
@@ -4,29 +4,4 @@
/obj/mecha/working/New()
..()
new /obj/item/mecha_parts/mecha_tracking(src)
- return
-
-/*
-/obj/mecha/working/melee_action(atom/target as obj|mob|turf)
- if(internal_damage&MECHA_INT_CONTROL_LOST)
- target = pick(oview(1,src))
- if(selected_tool)
- selected_tool.action(target)
- return
-*/
-
-/obj/mecha/working/range_action(atom/target as obj|mob|turf)
- return
-
-/*
-/obj/mecha/working/get_stats_part()
- var/output = ..()
- output += "[src.name] Tools:"
- if(equipment.len)
- for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment)
- output += "[selected==MT?"
":""][MT.get_equip_info()][selected==MT?"":""]
"
- else
- output += "None"
- output += "
"
- return output
-*/
\ No newline at end of file
+ return
\ No newline at end of file
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
index 78933650b03..ffc4db6400c 100644
--- a/code/game/objects/buckling.dm
+++ b/code/game/objects/buckling.dm
@@ -34,7 +34,7 @@
if(!can_buckle || !istype(M) || (M.loc != loc) || M.buckled || (buckle_requires_restraints && !M.restrained()))
return 0
- if (istype(M, /mob/living/carbon/slime) || istype(M, /mob/living/simple_animal/slime))
+ if (isslime(M))
return 0
M.buckled = src
diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm
index 5636d376136..3c314ee975c 100644
--- a/code/game/objects/effects/anomalies.dm
+++ b/code/game/objects/effects/anomalies.dm
@@ -27,7 +27,7 @@
/obj/effect/anomaly/proc/anomalyNeutralize()
- new /obj/effect/effect/bad_smoke(loc)
+ PoolOrNew(/obj/effect/effect/bad_smoke, loc)
for(var/atom/movable/O in src)
O.loc = src.loc
diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm
index db1952f145e..0ff875dd2f7 100644
--- a/code/game/objects/effects/decals/crayon.dm
+++ b/code/game/objects/effects/decals/crayon.dm
@@ -12,12 +12,16 @@
return
-/obj/effect/decal/cleanable/crayon/New(location, main = "#FFFFFF", var/type = "rune1", var/e_name = "rune")
+/obj/effect/decal/cleanable/crayon/New(location, main = "#FFFFFF", var/type = "rune1", var/e_name = "rune", var/rotation = 0)
..()
loc = location
name = e_name
desc = "A [name] drawn in crayon."
-
icon_state = type
- color = main
\ No newline at end of file
+
+ var/matrix/M = matrix()
+ M.Turn(rotation)
+ src.transform = M
+
+ color = main
diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm
index 9f3662ae8ed..e150828bc99 100644
--- a/code/game/objects/effects/effect_system/effect_system.dm
+++ b/code/game/objects/effects/effect_system/effect_system.dm
@@ -13,10 +13,10 @@ would spawn and follow the beaker, even if it is carried or thrown.
unacidable = 1//So effect are not targeted by alien acid.
pass_flags = PASSTABLE | PASSGRILLE
-/obj/effect/proc/delete()
- loc = null
- if(reagents)
- qdel(reagents)
+/obj/effect/effect/Destroy()
+ ..()
+ PlaceInPool(src)
+ return 1
/datum/effect/effect/proc/fadeOut(var/atom/A, var/frames = 16)
if(A.alpha == 0) //Handle already transparent case
@@ -36,6 +36,11 @@ would spawn and follow the beaker, even if it is carried or thrown.
var/atom/holder
var/setup = 0
+/datum/effect/effect/system/Destroy()
+ holder = null
+ location = null
+ ..()
+
/datum/effect/effect/system/proc/set_up(n = 3, c = 0, turf/loc)
if(n > 10)
n = 10
diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm
index dd4270ece3f..892bd547dc3 100644
--- a/code/game/objects/effects/effect_system/effects_foam.dm
+++ b/code/game/objects/effects/effect_system/effects_foam.dm
@@ -33,6 +33,9 @@
SSobj.processing.Add(src)
playsound(src, 'sound/effects/bubbles2.ogg', 80, 1, -3)
+/obj/effect/effect/foam/Destroy()
+ SSobj.processing.Remove(src)
+ return ..()
/obj/effect/effect/foam/metal/New(loc)
..()
@@ -45,7 +48,7 @@
SSobj.processing.Remove(src)
flick("[icon_state]-disolve", src)
spawn(5)
- delete()
+ qdel(src)
/obj/effect/effect/foam/process()
@@ -84,7 +87,7 @@
if(foundfoam)
continue
- var/obj/effect/effect/foam/F = new type(T)
+ var/obj/effect/effect/foam/F = PoolOrNew(/obj/effect/effect/foam, T)
F.amount = amount
reagents.copy_to(F, (reagents.total_volume))
F.color = color
@@ -114,11 +117,15 @@
/datum/effect/effect/system/foam_spread/New()
..()
- chemholder = new/obj()
+ chemholder = PoolOrNew(/obj)
var/datum/reagents/R = new/datum/reagents(1000)
chemholder.reagents = R
R.my_atom = chemholder
+/datum/effect/effect/system/foam_spread/Destroy()
+ qdel(chemholder)
+ chemholder = null
+ return ..()
/datum/effect/effect/system/foam_spread/set_up(amt=5, loca, var/datum/reagents/carry = null)
if(istype(loca, /turf/))
@@ -139,7 +146,7 @@
if(foundfoam)//If there was already foam where we start, we add our foaminess to it.
foundfoam.amount += amount
else
- var/obj/effect/effect/foam/F = new foamtype(src.location)
+ var/obj/effect/effect/foam/F = PoolOrNew(foamtype, location)
var/foamcolor = mix_color_from_reagents(chemholder.reagents.reagent_list)
chemholder.reagents.copy_to(F, chemholder.reagents.total_volume)
F.color = foamcolor
diff --git a/code/game/objects/effects/effect_system/effects_other.dm b/code/game/objects/effects/effect_system/effects_other.dm
index 4e58261b04b..0b54d310233 100644
--- a/code/game/objects/effects/effect_system/effects_other.dm
+++ b/code/game/objects/effects/effect_system/effects_other.dm
@@ -16,6 +16,10 @@
var/processing = 1
var/on = 1
+/datum/effect/effect/system/ion_trail_follow/Destroy()
+ oldposition = null
+ return ..()
+
/datum/effect/effect/system/ion_trail_follow/set_up(atom/atom)
attach(atom)
@@ -29,13 +33,12 @@
var/turf/T = get_turf(src.holder)
if(T != src.oldposition)
if(!has_gravity(T))
- var/obj/effect/effect/ion_trails/I = new /obj/effect/effect/ion_trails(src.oldposition)
+ var/obj/effect/effect/ion_trails/I = PoolOrNew(/obj/effect/effect/ion_trails, oldposition)
I.dir = src.holder.dir
flick("ion_fade", I)
I.icon_state = ""
spawn( 20 )
- if(I)
- I.delete()
+ qdel(I)
src.oldposition = T
spawn(2)
if(src.on)
diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm
index 59220d9cee6..d8a4a1804a6 100644
--- a/code/game/objects/effects/effect_system/effects_smoke.dm
+++ b/code/game/objects/effects/effect_system/effects_smoke.dm
@@ -28,12 +28,7 @@
/obj/effect/effect/harmless_smoke/New()
..()
spawn (100)
- delete()
- return
-
-/obj/effect/effect/harmless_smoke/Move()
- ..()
- return
+ qdel(src)
/datum/effect/effect/system/harmless_smoke_spread
var/total_smoke = 0 // To stop it being spammed and lagging!
@@ -60,7 +55,7 @@
spawn(0)
if(holder)
src.location = get_turf(holder)
- var/obj/effect/effect/harmless_smoke/smoke = new /obj/effect/effect/harmless_smoke(src.location)
+ var/obj/effect/effect/harmless_smoke/smoke = PoolOrNew(/obj/effect/effect/harmless_smoke, location)
src.total_smoke++
var/direction = src.direction
if(!direction)
@@ -74,7 +69,7 @@
spawn(75+rand(10,30))
if(smoke)
fadeOut(smoke)
- smoke.delete()
+ qdel(smoke)
src.total_smoke--
@@ -96,8 +91,7 @@
/obj/effect/effect/bad_smoke/New()
..()
spawn (200+rand(10,30))
- delete()
- return
+ qdel(src)
/obj/effect/effect/bad_smoke/Move()
..()
@@ -163,7 +157,7 @@
spawn(0)
if(holder)
src.location = get_turf(holder)
- var/obj/effect/effect/bad_smoke/smoke = new /obj/effect/effect/bad_smoke(src.location)
+ var/obj/effect/effect/bad_smoke/smoke = PoolOrNew(/obj/effect/effect/bad_smoke, location)
src.total_smoke++
var/direction = src.direction
if(!direction)
@@ -177,7 +171,7 @@
spawn(150+rand(10,30))
if(smoke)
fadeOut(smoke)
- smoke.delete()
+ qdel(smoke)
src.total_smoke--
@@ -201,8 +195,7 @@
..()
create_reagents(500)
spawn(200+rand(10,30))
- delete()
- return
+ qdel(src)
/obj/effect/effect/chem_smoke/Move()
@@ -228,11 +221,15 @@
/datum/effect/effect/system/chem_smoke_spread/New()
..()
- chemholder = new/obj()
+ chemholder = PoolOrNew(/obj)
var/datum/reagents/R = new/datum/reagents(500)
chemholder.reagents = R
R.my_atom = chemholder
+/datum/effect/effect/system/chem_smoke_spread/Destroy()
+ PlaceInPool(chemholder)
+ chemholder = null
+ ..()
/datum/effect/effect/system/chem_smoke_spread/set_up(var/datum/reagents/carry = null, n = 5, c = 0, loca, direct, silent = 0)
if(n > 20)
@@ -284,7 +281,7 @@
spawn(0)
if(holder)
src.location = get_turf(holder)
- var/obj/effect/effect/chem_smoke/smoke = new /obj/effect/effect/chem_smoke(src.location)
+ var/obj/effect/effect/chem_smoke/smoke = PoolOrNew(/obj/effect/effect/chem_smoke, location)
src.total_smoke++
var/direction = src.direction
if(!direction)
@@ -309,7 +306,7 @@
spawn(150+rand(10,30))
if(smoke)
fadeOut(smoke)
- smoke.delete()
+ qdel(smoke)
src.total_smoke--
@@ -334,8 +331,7 @@
/obj/effect/effect/sleep_smoke/New()
..()
spawn (200+rand(10,30))
- delete()
- return
+ qdel(src)
/obj/effect/effect/sleep_smoke/Move()
..()
@@ -395,7 +391,7 @@
spawn(0)
if(holder)
src.location = get_turf(holder)
- var/obj/effect/effect/sleep_smoke/smoke = new /obj/effect/effect/sleep_smoke(src.location)
+ var/obj/effect/effect/sleep_smoke/smoke = PoolOrNew(/obj/effect/effect/sleep_smoke, location)
src.total_smoke++
var/direction = src.direction
if(!direction)
@@ -409,5 +405,5 @@
spawn(150+rand(10,30))
if(smoke)
fadeOut(smoke)
- smoke.delete()
+ qdel(smoke)
src.total_smoke--
\ No newline at end of file
diff --git a/code/game/objects/effects/effect_system/effects_sparks.dm b/code/game/objects/effects/effect_system/effects_sparks.dm
index 88f15977f84..2c7e6e9d6d1 100644
--- a/code/game/objects/effects/effect_system/effects_sparks.dm
+++ b/code/game/objects/effects/effect_system/effects_sparks.dm
@@ -14,20 +14,19 @@
/obj/effect/effect/sparks/New()
..()
+ flick("sparks", src) // replay the animation
playsound(src.loc, "sparks", 100, 1)
var/turf/T = src.loc
if (istype(T, /turf))
T.hotspot_expose(1000,100)
spawn (100)
- delete()
- return
+ qdel(src)
/obj/effect/effect/sparks/Destroy()
var/turf/T = src.loc
if (istype(T, /turf))
T.hotspot_expose(1000,100)
- ..()
- return
+ return ..()
/obj/effect/effect/sparks/Move()
..()
@@ -57,7 +56,7 @@
spawn(0)
if(holder)
src.location = get_turf(holder)
- var/obj/effect/effect/sparks/sparks = new /obj/effect/effect/sparks(src.location)
+ var/obj/effect/effect/sparks/sparks = PoolOrNew(/obj/effect/effect/sparks, location)
src.total_sparks++
var/direction
if(src.cardinals)
@@ -68,8 +67,7 @@
sleep(5)
step(sparks,direction)
spawn(20)
- if(sparks) // Might be deleted already
- sparks.delete()
+ qdel(sparks)
src.total_sparks--
@@ -101,7 +99,7 @@
spawn(0)
if(holder)
src.location = get_turf(holder)
- var/obj/effect/effect/sparks/electricity/sparks = new /obj/effect/effect/sparks/electricity(src.location)
+ var/obj/effect/effect/sparks/electricity/sparks = PoolOrNew(/obj/effect/effect/sparks/electricity, location)
src.total_sparks++
var/direction
if(src.cardinals)
@@ -112,6 +110,5 @@
sleep(5)
step(sparks,direction)
spawn(20)
- if(sparks) // Might be deleted already
- sparks.delete()
+ qdel(sparks)
src.total_sparks--
\ No newline at end of file
diff --git a/code/game/objects/effects/effect_system/effects_water.dm b/code/game/objects/effects/effect_system/effects_water.dm
index f559d9fd8f8..1f860327ceb 100644
--- a/code/game/objects/effects/effect_system/effects_water.dm
+++ b/code/game/objects/effects/effect_system/effects_water.dm
@@ -10,21 +10,13 @@
/obj/effect/effect/water/New()
..()
- //var/turf/T = src.loc
- //if (istype(T, /turf))
- // T.firelevel = 0 //TODO: FIX
spawn( 70 )
- delete()
- return
- return
+ qdel(src)
/obj/effect/effect/water/Move(turf/newloc)
- //var/turf/T = src.loc
- //if (istype(T, /turf))
- // T.firelevel = 0 //TODO: FIX
if (--src.life < 1)
- //SN src = null
- delete()
+ qdel(src)
+ return 0
if(newloc.density)
return 0
.=..()
@@ -71,7 +63,7 @@ steam.start() -- spawns the effect
spawn(0)
if(holder)
src.location = get_turf(holder)
- var/obj/effect/effect/steam/steam = new /obj/effect/effect/steam(src.location)
+ var/obj/effect/effect/steam/steam = PoolOrNew(/obj/effect/effect/steam, location)
var/direction
if(src.cardinals)
direction = pick(cardinal)
@@ -81,7 +73,7 @@ steam.start() -- spawns the effect
sleep(5)
step(steam,direction)
spawn(20)
- steam.delete()
+ qdel(steam)
/////////////////////////////////////////////
@@ -106,12 +98,12 @@ steam.start() -- spawns the effect
src.processing = 0
spawn(0)
if(src.number < 3)
- var/obj/effect/effect/steam/I = new /obj/effect/effect/steam(src.oldposition)
+ var/obj/effect/effect/steam/I = PoolOrNew(/obj/effect/effect/steam, oldposition)
src.number++
src.oldposition = get_turf(holder)
I.dir = src.holder.dir
spawn(10)
- I.delete()
+ qdel(I)
src.number--
spawn(2)
if(src.on)
diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm
index 4ccb47e18cd..4f6350832ae 100644
--- a/code/game/objects/empulse.dm
+++ b/code/game/objects/empulse.dm
@@ -15,7 +15,7 @@ proc/empulse(turf/epicenter, heavy_range, light_range, log=0)
pulse.name = "emp pulse"
pulse.anchored = 1
spawn(20)
- pulse.delete()
+ qdel(pulse)
if(heavy_range > light_range)
light_range = heavy_range
diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm
index 902fccd1660..45efaba9b5e 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -19,7 +19,7 @@ proc/trange(var/Dist=0,var/turf/Center=null)//alternative to range (ONLY process
return block(x1y1,x2y2)
-proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0)
+proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0)
src = null //so we don't abort once src is deleted
epicenter = get_turf(epicenter)
@@ -56,21 +56,22 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
far_dist += heavy_impact_range * 5
far_dist += devastation_range * 20
- var/frequency = get_rand_frequency()
- for(var/mob/M in player_list)
- // Double check for client
- if(M && M.client)
- var/turf/M_turf = get_turf(M)
- if(M_turf && M_turf.z == epicenter.z)
- var/dist = get_dist(M_turf, epicenter)
- // If inside the blast radius + world.view - 2
- if(dist <= round(max_range + world.view - 2, 1))
- M.playsound_local(epicenter, get_sfx("explosion"), 100, 1, frequency, falloff = 5) // get_sfx() is so that everyone gets the same sound
- // You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station.
- else if(dist <= far_dist)
- var/far_volume = Clamp(far_dist, 30, 50) // Volume is based on explosion size and dist
- far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion
- M.playsound_local(epicenter, 'sound/effects/explosionfar.ogg', far_volume, 1, frequency, falloff = 5)
+ if(!silent)
+ var/frequency = get_rand_frequency()
+ for(var/mob/M in player_list)
+ // Double check for client
+ if(M && M.client)
+ var/turf/M_turf = get_turf(M)
+ if(M_turf && M_turf.z == epicenter.z)
+ var/dist = get_dist(M_turf, epicenter)
+ // If inside the blast radius + world.view - 2
+ if(dist <= round(max_range + world.view - 2, 1))
+ M.playsound_local(epicenter, get_sfx("explosion"), 100, 1, frequency, falloff = 5) // get_sfx() is so that everyone gets the same sound
+ // You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station.
+ else if(dist <= far_dist)
+ var/far_volume = Clamp(far_dist, 30, 50) // Volume is based on explosion size and dist
+ far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion
+ M.playsound_local(epicenter, 'sound/effects/explosionfar.ogg', far_volume, 1, frequency, falloff = 5)
//postpone light processing for a bit
SSlighting.postpone()
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index fa93441963f..20706d966fb 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -43,6 +43,7 @@
var/g_amt = 0 // glass
var/reliability = 100 //Used by SOME devices to determine how reliable they are.
var/origin_tech = null //Used by R&D to determine what research bonuses it grants.
+ var/needs_permit = 0 //Used by security bots to determine if this item is safe for public use.
var/list/attack_verb = list() //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]"
var/list/species_exception = list() // even if a species cannot put items in a certain slot, if the species id is in the item's exception list, it will be able to wear that item
@@ -336,7 +337,7 @@
user << "You're going to need to remove that mask/helmet/glasses first."
return
- if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/slime))//Aliens don't have eyes./N slimes also don't have eyes!
+ if(isalien(M))//Aliens don't have eyes./N slimes also don't have eyes!
user << "You cannot locate any eyes on this creature!"
return
diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm
index a7df044de11..0c5002a60f5 100644
--- a/code/game/objects/items/blueprints.dm
+++ b/code/game/objects/items/blueprints.dm
@@ -51,6 +51,7 @@
desc = "This is a one-use permit that allows the user to offically declare a built room as new addition to the station."
fluffnotice = "Nanotrasen Engineering requires all on-station construction projects to be approved by a head of staff, as detailed in Nanotrasen Company Regulation 512-C (Mid-Shift Modifications to Company Property). \
By submitting this form, you accept any fines, fees, or personal injury/death that may occur during construction."
+ w_class = 1
/obj/item/areaeditor/permit/attack_self(mob/user as mob)
diff --git a/code/game/objects/items/body_egg.dm b/code/game/objects/items/body_egg.dm
new file mode 100644
index 00000000000..b1ab40cb28b
--- /dev/null
+++ b/code/game/objects/items/body_egg.dm
@@ -0,0 +1,57 @@
+/obj/item/body_egg
+ name = "generic egg"
+ desc = "All slimy and yuck."
+ icon = 'icons/mob/alien.dmi'
+ icon_state = "larva0_dead"
+ var/mob/living/affected_mob
+
+/obj/item/body_egg/New()
+ if(istype(loc, /mob/living))
+ affected_mob = loc
+ affected_mob.status_flags |= XENO_HOST
+ SSobj.processing |= src
+ if(istype(affected_mob,/mob/living/carbon))
+ var/mob/living/carbon/H = affected_mob
+ H.med_hud_set_status()
+ spawn(0)
+ AddInfectionImages(affected_mob)
+ else
+ qdel(src)
+
+/obj/item/body_egg/Destroy()
+ if(affected_mob)
+ affected_mob.status_flags &= ~(XENO_HOST)
+ if(istype(affected_mob,/mob/living/carbon))
+ var/mob/living/carbon/H = affected_mob
+ H.med_hud_set_status()
+ spawn(0)
+ RemoveInfectionImages(affected_mob)
+ ..()
+
+/obj/item/body_egg/process()
+ if(!affected_mob) return
+ if(loc != affected_mob)
+ affected_mob.status_flags &= ~(XENO_HOST)
+ SSobj.processing.Remove(src)
+ if(istype(affected_mob,/mob/living/carbon))
+ var/mob/living/carbon/H = affected_mob
+ H.med_hud_set_status()
+ spawn(0)
+ RemoveInfectionImages(affected_mob)
+ affected_mob = null
+ return
+
+ egg_process()
+
+/obj/item/body_egg/proc/egg_process()
+ return
+
+/obj/item/body_egg/proc/RefreshInfectionImage()
+ RemoveInfectionImages()
+ AddInfectionImages()
+
+/obj/item/body_egg/proc/AddInfectionImages()
+ return
+
+/obj/item/body_egg/proc/RemoveInfectionImages()
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index 6319441cb71..f7b754a93d5 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -49,7 +49,8 @@
var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src))
T.icon = 'icons/effects/effects.dmi'
flick("emppulse",T)
- spawn(8) T.delete()
+ spawn(8)
+ qdel(T)
else
playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6)
var/obj/O = new saved_item(src)
@@ -61,7 +62,8 @@
var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src))
T.icon = 'icons/effects/effects.dmi'
flick("emppulse",T)
- spawn(8) T.delete()
+ spawn(8)
+ qdel(T)
/obj/item/device/chameleon/proc/disrupt(var/delete_dummy = 1)
if(active_dummy)
diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm
index f3c01d735f7..3e9018cb1bb 100644
--- a/code/game/objects/items/devices/flash.dm
+++ b/code/game/objects/items/devices/flash.dm
@@ -60,11 +60,16 @@
/obj/item/device/flash/proc/flash_carbon(var/mob/living/carbon/M, var/mob/user = null, var/power = 5, targeted = 1)
add_logs(user, M, "flashed", object="[src.name]")
if(user && targeted)
+ if(M.weakeyes)
+ M.Weaken(3) //quick weaken bypasses eye protection but has no eye flash
if(M.flash_eyes(1, 1))
M.confused += power
terrible_conversion_proc(M, user)
M.Stun(1)
user.visible_message("[user] blinds [M] with the flash!")
+ if(M.weakeyes)
+ M.Stun(2)
+ M.visible_message("[M] gasps and shields their eyes!")
else
user.visible_message("[user] fails to blind [M] with the flash!")
else
diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm
index e6f2db2dd4b..d773852de9b 100644
--- a/code/game/objects/items/devices/laserpointer.dm
+++ b/code/game/objects/items/devices/laserpointer.dm
@@ -109,6 +109,8 @@
//20% chance to actually hit the eyes
if(prob(effectchance * diode.rating) && C.flash_eyes(severity))
outmsg = "You blind [C] by shining [src] in their eyes."
+ if(C.weakeyes)
+ C.Stun(1)
else
outmsg = "You fail to blind [C] by shining [src] at their eyes."
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index e87eb6da388..c054a5de007 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -188,11 +188,22 @@
/obj/item/device/radio/headset/headset_cent
name = "\improper Centcom headset"
- desc = "A headset used by the upper echelons of Nanotrasen. \nChannels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :v - service, :m - medical, :n - science."
+ desc = "A headset used by the upper echelons of Nanotrasen. \nTo access the command channel, use :c."
icon_state = "cent_headset"
item_state = "headset"
+ keyslot = new /obj/item/device/encryptionkey/headset_com
+
+/obj/item/device/radio/headset/headset_cent/commander
keyslot = new /obj/item/device/encryptionkey/heads/captain
+/obj/item/device/radio/headset/headset_cent/alt
+ name = "\improper Centcom bowman headset"
+ desc = "A headset especially for emergency response personnel. Protects ears from flashbangs."
+ flags = EARBANGPROTECT
+ icon_state = "cent_headset_alt"
+ item_state = "cent_headset_alt"
+ keyslot = null
+
/obj/item/device/radio/headset/ai
name = "\proper Integrated Subspace Transceiver "
keyslot2 = new /obj/item/device/encryptionkey/ai
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 0143a4887b6..816c0f37b0a 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -360,7 +360,11 @@
"reject" = 0, // if nonzero, the signal will not be accepted by any broadcasting machinery
"level" = position.z, // The source's z level
"languages" = M.languages, //The languages M is talking in.
- "spans" = spans //the span classes of this message.
+ "spans" = spans, //the span classes of this message.
+ "verb_say" = M.verb_say, //the verb used when talking normally
+ "verb_ask" = M.verb_ask, //the verb used when asking
+ "verb_exclaim" = M.verb_exclaim, //the verb used when exclaiming
+ "verb_yell" = M.verb_yell //the verb used when yelling
)
signal.frequency = freq
@@ -406,7 +410,11 @@
"reject" = 0,
"level" = position.z,
"languages" = languages,
- "spans" = spans
+ "spans" = spans,
+ "verb_say" = M.verb_say,
+ "verb_ask" = M.verb_ask,
+ "verb_exclaim" = M.verb_exclaim,
+ "verb_yell" = M.verb_yell
)
signal.frequency = text2num(freq) // Quick frequency set
for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
@@ -423,7 +431,8 @@
// Send a mundane broadcast with limited targets:
Broadcast_Message(M, voicemask,
src, message, voice, jobname, real_name,
- filter_type, signal.data["compression"], list(position.z), freq, spans)
+ filter_type, signal.data["compression"], list(position.z), freq, spans,
+ verb_say, verb_ask, verb_exclaim, verb_yell)
/obj/item/device/radio/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
if(radio_freq)
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index c5757121167..487345421fd 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -385,7 +385,7 @@ MASS SPECTROMETER
if (!isslime(M))
user.show_message("This device can only scan slimes!", 1)
return
- var/mob/living/carbon/slime/T = M
+ var/mob/living/simple_animal/slime/T = M
user.show_message("Slime scan results:", 1)
user.show_message(text("[T.colour] [] slime", T.is_adult ? "adult" : "baby"), 1)
user.show_message(text("Nutrition: [T.nutrition]/[]", T.get_max_nutrition()), 1)
diff --git a/code/game/objects/items/devices/violin.dm b/code/game/objects/items/devices/violin.dm
index dcc3c309c1e..e8481778326 100644
--- a/code/game/objects/items/devices/violin.dm
+++ b/code/game/objects/items/devices/violin.dm
@@ -19,6 +19,10 @@
song = null
..()
+/obj/item/device/violin/initialize()
+ song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded
+ ..()
+
/obj/item/device/violin/attack_self(mob/user as mob)
if(!user.IsAdvancedToolUser())
user << "You don't have the dexterity to do this!"
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index f21f71a1fa0..6d72b88b05d 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -186,120 +186,6 @@
..()
user << "There [amount_left == 1 ? "is" : "are"] [amount_left] cap\s left."
-/*
- * Toy crossbow
- */
-
-/obj/item/toy/crossbow
- name = "foam dart crossbow"
- desc = "A weapon favored by many overactive children. Ages 8 and up."
- icon = 'icons/obj/guns/energy.dmi'
- icon_state = "crossbow100"
- item_state = "crossbow"
- lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
- w_class = 2.0
- attack_verb = list("attacked", "struck", "hit")
- var/bullets = 5
-
-/obj/item/toy/crossbow/examine(mob/user)
- ..()
- if (bullets)
- user << "It is loaded with [bullets] foam dart\s."
-
-/obj/item/toy/crossbow/attackby(obj/item/I as obj, mob/user as mob, params)
- if(istype(I, /obj/item/toy/ammo/crossbow))
- if(bullets <= 4)
- user.drop_item()
- qdel(I)
- bullets++
- user << "You load the foam dart into the crossbow."
- else
- usr << "It's already fully loaded."
-
-
-/obj/item/toy/crossbow/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
- if(!isturf(target.loc) || target == user) return
- if(flag) return
-
- if (locate (/obj/structure/table, src.loc))
- return
- else if (bullets)
- var/turf/trg = get_turf(target)
- var/obj/effect/foam_dart_dummy/D = new/obj/effect/foam_dart_dummy(get_turf(src))
- bullets--
- D.icon_state = "foamdart"
- D.name = "foam dart"
- playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
-
- for(var/i=0, i<6, i++)
- if (D)
- if(D.loc == trg) break
- step_towards(D,trg)
-
- for(var/mob/living/M in D.loc)
- if(!istype(M,/mob/living)) continue
- if(M == user) continue
- D.visible_message("[M] was hit by the foam dart!")
- new /obj/item/toy/ammo/crossbow(M.loc)
- qdel(D)
- return
-
- for(var/atom/A in D.loc)
- if(A == user) continue
- if(A.density)
- new /obj/item/toy/ammo/crossbow(A.loc)
- qdel(D)
-
- sleep(1)
-
- spawn(10)
- if(D)
- new /obj/item/toy/ammo/crossbow(D.loc)
- qdel(D)
-
- return
- else if (bullets == 0)
- user.Weaken(5)
- user.visible_message("[user] realized they were out of ammo and starting scrounging for some!")
-
-
-/obj/item/toy/crossbow/attack(mob/M as mob, mob/user as mob)
- src.add_fingerprint(user)
-
-// ******* Check
-
- if (src.bullets > 0 && M.lying)
-
- M.visible_message("[user] casually lines up a shot with [M]'s head and pulls the trigger!")
- M.visible_message("[M] was hit in the head by the foam dart!", \
- "You're hit in the head by the foam dart!", \
- "You hear the sound of foam against skull.")
-
- playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
- new /obj/item/toy/ammo/crossbow(M.loc)
- src.bullets--
- else if (M.lying && src.bullets == 0)
- M.visible_message("[user] casually lines up a shot with [M]'s head, pulls the trigger, then realizes they are out of ammo and drops to the floor in search of some!")
- user.Weaken(5)
- return
-
-/obj/item/toy/ammo/crossbow
- name = "foam dart"
- desc = "Its nerf or nothing! Ages 8 and up."
- icon = 'icons/obj/toy.dmi'
- icon_state = "foamdart"
- w_class = 1.0
-
-/obj/effect/foam_dart_dummy
- name = ""
- desc = ""
- icon = 'icons/obj/toy.dmi'
- icon_state = "null"
- anchored = 1
- density = 0
-
-
/*
* Toy swords
*/
@@ -434,8 +320,9 @@
attack_verb = list("attacked", "coloured")
var/colour = "#FF0000" //RGB
var/drawtype = "rune"
- var/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka")
+ var/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka","arrow")
var/list/letters = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")
+ var/list/oriented = list("arrow","body") // These turn to face the same way as the drawer
var/uses = 30 //0 for unlimited uses
var/instant = 0
var/colourName = "red" //for updateIcon purposes
@@ -515,9 +402,20 @@
temp = "letter"
else if(graffiti.Find(drawtype))
temp = "graffiti"
+ var/graf_rot
+ if(oriented.Find(drawtype))
+ switch(user.dir)
+ if(EAST)
+ graf_rot = 90
+ if(SOUTH)
+ graf_rot = 180
+ if(WEST)
+ graf_rot = 270
+ else
+ graf_rot = 0
user << "You start drawing a [temp] on the [target.name]."
if(instant || do_after(user, 50))
- new /obj/effect/decal/cleanable/crayon(target,colour,drawtype,temp)
+ new /obj/effect/decal/cleanable/crayon(target,colour,drawtype,temp,graf_rot)
user << "You finish drawing [temp]."
if(uses)
uses--
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index b71c719761a..e76181e672a 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -100,6 +100,11 @@ RCD
return
+/obj/item/weapon/rcd/Destroy()
+ qdel(spark_system)
+ spark_system = null
+ return ..()
+
/obj/item/weapon/rcd/attackby(obj/item/weapon/W, mob/user, params)
..()
if(istype(W, /obj/item/weapon/rcd_ammo))
diff --git a/code/game/objects/items/weapons/courtroom.dm b/code/game/objects/items/weapons/courtroom.dm
new file mode 100644
index 00000000000..c3f62193260
--- /dev/null
+++ b/code/game/objects/items/weapons/courtroom.dm
@@ -0,0 +1,35 @@
+// Contains:
+// Gavel Hammer
+// Gavel Block
+
+/obj/item/weapon/gavelhammer
+ name = "gavel hammer"
+ desc = "Order, order! No bombs in my courthouse."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "gavelhammer"
+ force = 5.0
+ throwforce = 6.0
+ w_class = 2.0
+ attack_verb = list("bashed", "battered", "judged", "whacked")
+
+/obj/item/weapon/gavelhammer/suicide_act(mob/user)
+ user.visible_message("[user] has sentenced \himself to death with the [src.name]! It looks like \he's trying to commit suicide.")
+ playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1)
+ return (BRUTELOSS)
+
+/obj/item/weapon/gavelblock
+ name = "gavel block"
+ desc = "Smack it with a gavel hammer when the assistants get rowdy."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "gavelblock"
+ force = 2.0
+ throwforce = 2.0
+ w_class = 1.0
+
+/obj/item/weapon/gavelblock/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/gavelhammer))
+ playsound(loc, 'sound/items/gavel.ogg', 100, 1)
+ user.visible_message("[user] strikes \the [src] with \the [I].")
+ user.changeNext_move(CLICK_CD_MELEE)
+ else
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index 18c0d9fb0a6..d1ad1fb981d 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -46,7 +46,7 @@
if(istype(I, /obj/item/weapon/screwdriver))
open_panel = !open_panel
user << "You [open_panel ? "open" : "close"] the wire panel."
- else if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler ))
+ else if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler))
wires.Interact(user)
else
..()
@@ -63,6 +63,9 @@
return
if (ismob(target) || istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage/))
return
+ if(loc == target)
+ return
+
user << "Planting explosives..."
if(do_after(user, 50) && in_range(user, target))
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index 3b06377cccf..f4dd08ea68f 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -124,7 +124,7 @@
for(var/a=0, a<5, a++)
spawn(0)
- var/obj/effect/effect/water/W = new /obj/effect/effect/water( get_turf(src) )
+ var/obj/effect/effect/water/W = PoolOrNew( /obj/effect/effect/water, get_turf(src) )
var/turf/my_target = pick(the_targets)
if(precision)
the_targets -= my_target
diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm
index 8157a2208e7..9c39b6c5f3d 100644
--- a/code/game/objects/items/weapons/grenades/flashbang.dm
+++ b/code/game/objects/items/weapons/grenades/flashbang.dm
@@ -27,11 +27,19 @@
var/distance = max(1,get_dist(src,T))
//Flash
+ if(M.weakeyes)
+ M.visible_message("[M] screams and collapses!")
+ M << "AAAAGH!"
+ M.Weaken(15) //hella stunned
+ M.Stun(15)
+ M.eye_stat += 8
+
if(M.flash_eyes())
M.eye_stat += rand(1, 3)
M.Stun(max(10/distance, 3))
M.Weaken(max(10/distance, 3))
+
//Bang
if((loc == M) || loc == M.loc)//Holding on person or being exactly where lies is significantly more dangerous and voids protection
M.Stun(10)
diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm
index ada3e235fff..95c25363a96 100644
--- a/code/game/objects/items/weapons/implants/implantchair.dm
+++ b/code/game/objects/items/weapons/implants/implantchair.dm
@@ -77,7 +77,7 @@
if(istype(G, /obj/item/weapon/grab))
if(!ismob(G:affecting))
return
- for(var/mob/living/carbon/slime/M in range(1,G:affecting))
+ for(var/mob/living/simple_animal/slime/M in range(1,G:affecting))
if(M.Victim == G:affecting)
usr << "[G:affecting:name] will not fit into the [src.name] because they have a slime latched onto their head."
return
diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm
index 13420578704..fa346334278 100644
--- a/code/game/objects/items/weapons/melee/misc.dm
+++ b/code/game/objects/items/weapons/melee/misc.dm
@@ -1,3 +1,6 @@
+/obj/item/weapon/melee
+ needs_permit = 1
+
/obj/item/weapon/melee/chainofcommand
name = "chain of command"
desc = "A tool used by great men to placate the frothing masses."
@@ -79,6 +82,7 @@
item_state = null
slot_flags = SLOT_BELT
w_class = 2
+ needs_permit = 0
force = 0
on = 0
diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm
index 7cbdc8f8261..e3538aeb232 100644
--- a/code/game/objects/items/weapons/power_cells.dm
+++ b/code/game/objects/items/weapons/power_cells.dm
@@ -45,9 +45,9 @@
..()
charge = 0
-/obj/item/weapon/stock_parts/cell/pulse //40 pulse shots
+/obj/item/weapon/stock_parts/cell/pulse //80 pulse shots
name = "pulse rifle power cell"
- maxcharge = 8000
+ maxcharge = 16000
rating = 3
chargerate = 1500
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index 006b0c5936d..1f3675fc8a1 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -11,6 +11,7 @@
* Candle Box
* Crayon Box
* Cigarette Box
+ * Cigar Case
*/
/obj/item/weapon/storage/fancy/
@@ -273,3 +274,45 @@
..()
for(var/i = 1 to storage_slots)
new /obj/item/weapon/rollingpaper(src)
+
+/////////////
+//CIGAR BOX//
+/////////////
+
+/obj/item/weapon/storage/fancy/cigars
+ name = "\improper premium cigar case"
+ desc = "A case of premium cigars. Very expensive."
+ icon = 'icons/obj/cigarettes.dmi'
+ icon_state = "cigarcasep"
+ item_state = "cigarcasep"
+ w_class = 3
+ throwforce = 0
+ slot_flags = SLOT_BELT
+ storage_slots = 7
+ can_hold = list(/obj/item/clothing/mask/cigarette/cigar)
+ icon_type = "cigar"
+ var/cigar_type = /obj/item/clothing/mask/cigarette/cigar
+
+/obj/item/weapon/storage/fancy/cigars/New()
+ ..()
+ flags |= NOREACT
+ for(var/i = 1 to storage_slots)
+ new cigar_type(src)
+
+/obj/item/weapon/storage/fancy/cigars/update_icon()
+ icon_state = "[initial(icon_state)][contents.len]"
+ return
+
+/obj/item/weapon/storage/fancy/cigars/cohiba
+ name = "\improper cohiba robusto cigar case"
+ desc = "A case of imported Cohiba cigars, renowned for their strong flavor."
+ icon_state = "cigarcase"
+ item_state = "cigarcase"
+ cigar_type = /obj/item/clothing/mask/cigarette/cigar/cohiba
+
+/obj/item/weapon/storage/fancy/cigars/havana
+ name = "\improper premium havanian cigar case"
+ desc = "A case of classy Havanian cigars."
+ icon_state = "cigarcase"
+ item_state = "cigarcase"
+ cigar_type = /obj/item/clothing/mask/cigarette/cigar/havana
diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm
index 6bb7562f847..65a043fa5de 100644
--- a/code/game/objects/items/weapons/tanks/jetpack.dm
+++ b/code/game/objects/items/weapons/tanks/jetpack.dm
@@ -106,4 +106,62 @@
..()
ion_trail = new /datum/effect/effect/system/ion_trail_follow()
ion_trail.set_up(src)
- air_contents.carbon_dioxide = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
\ No newline at end of file
+ air_contents.carbon_dioxide = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
+
+
+/obj/item/weapon/tank/jetpack/suit
+ name = "suit inbuilt jetpack"
+ desc = "A device that will use your internals tank as a gas source for propulsion."
+ icon_state = "jetpack-void"
+ item_state = "jetpack-void"
+ var/obj/item/weapon/tank/internals/tank = null
+
+/obj/item/weapon/tank/jetpack/suit/New()
+ ..()
+ SSobj.processing -= src
+ air_contents = null
+
+/obj/item/weapon/tank/jetpack/suit/toggle()
+ set name = "Toggle Jetpack"
+ set category = "Object"
+
+ if(istype(loc.loc,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = loc.loc
+
+ if(!H.wear_suit)
+ H << "You must be wearing the suit to use the inbuilt jetpack."
+ return
+ if(!istype(H.s_store,/obj/item/weapon/tank/internals))
+ H << "You must have a tank in your suit's storage to use the inbuilt jetpack."
+ return
+ if(usr.stat || !usr.canmove || usr.restrained())
+ return
+
+ on = !on
+ if(on)
+ ion_trail.start()
+ tank = H.s_store
+ air_contents = tank.air_contents
+ SSobj.processing |= src
+ icon_state = "[icon_state]-on"
+ else
+ turn_off()
+ H << "You toggle the inbuilt jetpack [on? "on":"off"]."
+
+/obj/item/weapon/tank/jetpack/suit/proc/turn_off()
+ on = 0
+ SSobj.processing -= src
+ ion_trail.stop()
+ air_contents = null
+ tank = null
+ icon_state = initial(icon_state)
+
+/obj/item/weapon/tank/jetpack/suit/process()
+ if(!istype(loc.loc,/mob/living/carbon/human))
+ turn_off()
+ return
+ var/mob/living/carbon/human/H = loc.loc
+ if(!tank || tank != H.s_store)
+ turn_off()
+ return
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm
index 010ae17b7da..72389fa1df1 100644
--- a/code/game/objects/items/weapons/tanks/watertank.dm
+++ b/code/game/objects/items/weapons/tanks/watertank.dm
@@ -290,7 +290,7 @@
if(!Adj|| !istype(target, /turf))
return
if(metal_synthesis_cooldown < 5)
- var/obj/effect/effect/foam/metal/F = new /obj/effect/effect/foam/metal(get_turf(target))
+ var/obj/effect/effect/foam/metal/F = PoolOrNew(/obj/effect/effect/foam/metal, get_turf(target))
F.amount = 0
metal_synthesis_cooldown++
spawn(100)
@@ -309,7 +309,7 @@
pass_flags = PASSTABLE
/obj/effect/nanofrost_container/proc/Smoke()
- new /obj/effect/effect/freezing_smoke(src.loc, 6, 1)
+ PoolOrNew(/obj/effect/effect/freezing_smoke, list(loc, 6, 1))
var/obj/effect/decal/cleanable/flour/F = new /obj/effect/decal/cleanable/flour(src.loc)
F.color = "#B2FFFF"
F.name = "nanofrost residue"
@@ -332,7 +332,7 @@
/obj/effect/effect/freezing_smoke/New(loc, var/amt, var/blast)
..()
spawn(100+rand(10,30))
- delete()
+ qdel(src)
amount = amt
if(amount)
var/datum/effect/effect/system/freezing_smoke_spread/F = new /datum/effect/effect/system/freezing_smoke_spread
@@ -377,7 +377,7 @@
var/i = 0
for(i=0, iYou begin cutting \the [src] apart..."
playsound(loc, 'sound/items/Welder.ogg', 40, 1)
if(do_after(user,40,5,1))
- if( !src.opened || !istype(src, /obj/structure/closet) || !user || !WT || !WT.isOn() || !user.loc )
+ if( !opened || !istype(src, /obj/structure/closet) || !user || !WT || !WT.isOn() || !user.loc )
return
playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
new /obj/item/stack/sheet/metal(src.loc)
visible_message("[user] has cut \the [src] apart with \the [WT].", "You hear welding.")
qdel(src)
- return
+ return
if(isrobot(user))
return
@@ -187,25 +187,25 @@
if(user.drop_item())
W.Move(loc)
- else if(istype(W, /obj/item/stack/packageWrap))
- return
- else if(istype(W, /obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/WT = W
- if(WT.remove_fuel(0,user))
- user << "You begin [welded ? "unwelding":"welding"] \the [src]..."
- playsound(loc, 'sound/items/Welder2.ogg', 40, 1)
- if(do_after(user,40,5,1))
- if(src.opened || !istype(src, /obj/structure/closet) || !user || !WT || !WT.isOn() || !user.loc )
- return
- playsound(loc, 'sound/items/welder.ogg', 50, 1)
- welded = !welded
- user << "You [welded ? "welded [src] shut":"unwelded [src]"]."
- update_icon()
- user.visible_message("[user.name] has [welded ? "welded [src] shut":"unwelded [src]"].")
- return
- else if(!place(user, W))
- src.attack_hand(user)
- return
+ else
+ if(istype(W, /obj/item/stack/packageWrap))
+ return
+ if(istype(W, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = W
+ if(WT.remove_fuel(0,user))
+ user << "You begin [welded ? "unwelding":"welding"] \the [src]..."
+ playsound(loc, 'sound/items/Welder2.ogg', 40, 1)
+ if(do_after(user,40,5,1))
+ if(opened || !istype(src, /obj/structure/closet) || !user || !WT || !WT.isOn() || !user.loc )
+ return
+ playsound(loc, 'sound/items/welder.ogg', 50, 1)
+ welded = !welded
+ user << "You [welded ? "welded [src] shut":"unwelded [src]"]."
+ update_icon()
+ user.visible_message("[user.name] has [welded ? "welded [src] shut":"unwelded [src]"].")
+ return
+ if(!place(user, W))
+ src.attack_hand(user)
/obj/structure/closet/proc/place(var/mob/user, var/obj/item/I)
return 0
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index ee5684c24c6..7af569a1d13 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -118,7 +118,7 @@
else
user << "You can't reach, close it first!"
- if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
+ if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
dismantle(user)
if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer))
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 1b26e4e5410..e14abdc52d2 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -33,7 +33,7 @@
transfer_fingerprints_to(G)
qdel(src)
- else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
+ else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
user << "Now slicing apart the girder..."
if(do_after(user,30))
if(!src.loc)
@@ -280,7 +280,7 @@
transfer_fingerprints_to(R)
qdel(src)
- else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
+ else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
user << "Now slicing apart the girder..."
if(do_after(user,30))
user << "You slice apart the girder!"
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 211b3ec3491..03df21e80a9 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -63,7 +63,7 @@
healthcheck()
return
-/obj/structure/grille/attack_slime(mob/living/carbon/slime/user as mob)
+/obj/structure/grille/attack_slime(mob/living/simple_animal/slime/user as mob)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
if(!user.is_adult) return
diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm
index 85875833820..2324c724ed4 100644
--- a/code/game/objects/structures/musician.dm
+++ b/code/game/objects/structures/musician.dm
@@ -3,7 +3,7 @@
/datum/song
var/name = "Untitled"
var/list/lines = new()
- var/tempo = 5
+ var/tempo = 5 // delay between notes
var/playing = 0 // if we're playing
var/help = 0 // if help is open
@@ -16,6 +16,7 @@
var/obj/instrumentObj = null // the associated obj playing the sound
/datum/song/New(dir, obj)
+ tempo = sanitize_tempo(tempo)
instrumentDir = dir
instrumentObj = obj
@@ -58,13 +59,17 @@
// and play
var/turf/source = get_turf(instrumentObj)
for(var/mob/M in get_hearers_in_view(15, source))
+ if(!M.client || !(M.client.prefs.toggles & SOUND_INSTRUMENTS))
+ continue
M.playsound_local(source, soundfile, 100, falloff = 5)
/datum/song/proc/updateDialog(mob/user as mob)
instrumentObj.updateDialog() // assumes it's an object in world, override if otherwise
-/datum/song/proc/shouldStopPlaying()
+/datum/song/proc/shouldStopPlaying(mob/user)
if(instrumentObj)
+ if(!user.canUseTopic(instrumentObj))
+ return 1
return !instrumentObj.anchored // add special cases to stop in subclasses
else
return 1
@@ -84,7 +89,7 @@
var/list/notes = text2list(beat, "/")
for(var/note in text2list(notes[1], "-"))
//world << "note: [note]"
- if(!playing || shouldStopPlaying())//If the instrument is playing, or special case
+ if(!playing || shouldStopPlaying(user))//If the instrument is playing, or special case
playing = 0
return
if(lentext(note) == 0)
@@ -104,7 +109,7 @@
cur_oct[cur_note] = text2num(ni)
playnote(cur_note, cur_acc[cur_note], cur_oct[cur_note])
if(notes.len >= 2 && text2num(notes[2]))
- sleep(tempo / text2num(notes[2]))
+ sleep(sanitize_tempo(tempo / text2num(notes[2])))
else
sleep(tempo)
repeat--
@@ -136,10 +141,8 @@
dat += "Hide Editor"
dat += " Start a New Song"
dat += " Import a Song
"
- var/calctempo = round(600 / tempo)
- var/calcstep = tempo - 600 / (calctempo+1)
- var/calcstep_b = tempo - 600 / (calctempo+10)
- dat += "Tempo: -- [calctempo] BPM ++
"
+ var/bpm = round(600 / tempo)
+ dat += "Tempo: - [bpm] BPM +
"
var/linecount = 0
for(var/line in lines)
linecount += 1
@@ -183,7 +186,7 @@
if(href_list["newsong"])
lines = new()
- tempo = 5 // default 120 BPM
+ tempo = sanitize_tempo(5) // default 120 BPM
name = ""
else if(href_list["import"])
@@ -203,10 +206,10 @@
spawn()
lines = text2list(t, "\n")
if(copytext(lines[1],1,6) == "BPM: ")
- tempo = 600 / max(1, text2num(copytext(lines[1],6)))
+ tempo = sanitize_tempo(600 / text2num(copytext(lines[1],6)))
lines.Cut(1,2)
else
- tempo = 5 // default 120 BPM
+ tempo = sanitize_tempo(5) // default 120 BPM
if(lines.len > 50)
usr << "Too many lines!"
lines.Cut(51)
@@ -235,11 +238,7 @@
repeat = max_repeats
else if(href_list["tempo"])
- tempo += text2num(href_list["tempo"])
- if(tempo < 1)
- tempo = 1
- if(tempo > 600)
- tempo = 600
+ tempo = sanitize_tempo(tempo + text2num(href_list["tempo"]))
else if(href_list["play"])
playing = 1
@@ -279,6 +278,9 @@
updateDialog(usr)
return
+/datum/song/proc/sanitize_tempo(new_tempo)
+ new_tempo = abs(new_tempo)
+ return max(round(new_tempo, world.tick_lag), world.tick_lag)
// subclass for handheld instruments, like violin
/datum/song/handheld
@@ -322,6 +324,10 @@
song = null
..()
+/obj/structure/piano/initialize()
+ song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded
+ ..()
+
/obj/structure/piano/attack_hand(mob/user as mob)
if(!user.IsAdvancedToolUser())
user << "You don't have the dexterity to do this!"
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index 888af8a09ac..198ecc64993 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -44,7 +44,7 @@
"You have secured the [name]'s bolts!")
anchored = 1
- else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
+ else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
user.visible_message("[user] is slicing apart the [name]...", \
"You are slicing apart the [name]...")
if(do_after(user,30))
diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
index 594ce58d2d4..5a7cb5c8f2d 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
@@ -7,23 +7,32 @@
icon_state = "nest"
var/health = 100
-/*
-/obj/structure/stool/bed/nest/unbuckle_other(mob/user as mob)
- buckled_mob.visible_message(\
- "[user.name] pulls [buckled_mob.name] free from the sticky nest!",\
- "[user.name] pulls you free from the gelatinous resin.",\
- "You hear squelching...")
- unbuckle()
+/obj/structure/stool/bed/nest/user_unbuckle_mob(mob/user as mob)
+ if(buckled_mob && buckled_mob.buckled == src)
+ var/mob/living/M = buckled_mob
+ if(M != user)
+ M.visible_message(\
+ "[user.name] pulls [M.name] free from the sticky nest!",\
+ "[user.name] pulls you free from the gelatinous resin.",\
+ "You hear squelching...")
+ else
+ M.visible_message(\
+ "[M.name] struggles to break free from the gelatinous resin!",\
+ "You struggle to break free from the gelatinous resin. (Stay still for two minutes.)",\
+ "You hear squelching...")
+ if(!do_after(M, 1200))
+ if(M && M.buckled)
+ M << "You fail to unbuckle yourself!"
+ return
+ if(!M.buckled)
+ return
+ M.visible_message(\
+ "[M.name] breaks free from the gelatinous resin!",\
+ "You break free from the gelatinous resin!",\
+ "You hear squelching...")
-/obj/structure/stool/bed/nest/unbuckle_myself(mob/user as mob)
- buckled_mob.visible_message(\
- "[buckled_mob.name] struggles to break free of the gelatinous resin...",\
- "You struggle to break free from the gelatinous resin...",\
- "You hear squelching...")
- spawn(600)
- if(user && buckled_mob && user.buckled == src)
- unbuckle()
-*/
+ unbuckle_mob()
+ add_fingerprint(user)
/obj/structure/stool/bed/nest/user_buckle_mob(mob/M as mob, mob/user as mob)
if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || user.stat || M.buckled || istype(user, /mob/living/silicon/pai) )
@@ -44,12 +53,15 @@
/obj/structure/stool/bed/nest/post_buckle_mob(mob/living/M)
if(M == buckled_mob)
- M.pixel_y += 6
- M.pixel_x += 2
+ M.pixel_y = 0
+ M.pixel_x = initial(M.pixel_x) + 2
overlays += image('icons/mob/alien.dmi', "nestoverlay", layer=6)
else
- M.pixel_x -= 2
+ M.pixel_x = initial(M.pixel_x)
M.pixel_y = initial(M.pixel_y)
+ if(M.lying)
+ var/lying_pixel_y_offset = -6
+ M.pixel_y += lying_pixel_y_offset
overlays.Cut()
/obj/structure/stool/bed/nest/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index b81baa63d7b..e99a06209bf 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -59,7 +59,6 @@
icon = 'icons/obj/rollerbed.dmi'
icon_state = "down"
anchored = 0
- var/const/buckled_pixel_y_offset = 6 //Mobs buckled will have their pixel_y offset by this much
/obj/structure/stool/bed/roller/post_buckle_mob(mob/M)
@@ -72,7 +71,8 @@
icon_state = "down"
M.pixel_y = initial(M.pixel_y)
if(M.lying)
- M.pixel_y -= buckled_pixel_y_offset
+ var/lying_pixel_y_offset = -6
+ M.pixel_y += lying_pixel_y_offset
/obj/item/roller
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index da22c57e321..9b751df0eb3 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -220,7 +220,7 @@
/obj/structure/table/attack_hand(mob/living/user)
user.changeNext_move(CLICK_CD_MELEE)
- if(tableclimber)
+ if(tableclimber && tableclimber != user)
tableclimber.Weaken(2)
tableclimber.visible_message("[tableclimber.name] has been knocked off the table", "You've been knocked off the table", "You see [tableclimber.name] get knocked off the table")
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index a38bcadf6e0..42be0f87cec 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -172,7 +172,7 @@
attack_generic(M, M.melee_damage_upper)
update_nearby_icons()
-/obj/structure/window/attack_slime(mob/living/carbon/slime/user as mob)
+/obj/structure/window/attack_slime(mob/living/simple_animal/slime/user as mob)
user.do_attack_animation(src)
if(!user.is_adult)
return
diff --git a/code/game/pooling/atom_pool.dm b/code/game/pooling/atom_pool.dm
index c12302b7555..e35e80d4854 100644
--- a/code/game/pooling/atom_pool.dm
+++ b/code/game/pooling/atom_pool.dm
@@ -20,29 +20,30 @@ var/global/list/GlobalPool = list()
//The new created atom when it eventually
//Goes into the pool
-/proc/PoolOrNew(var/get_type,var/new_loc)
+//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
- if(new_loc)
- AM = GetFromPool(get_type,new_loc)
- else
- AM = GetFromPool(get_type,null)
+ AM = GetFromPool(get_type,second_arg)
if(!AM)
if(ispath(get_type))
- if(new_loc)
- AM = new get_type (new_loc)
+ if(islist(second_arg))
+ AM = new get_type (arglist(second_arg))
else
- AM = new get_type (null)
+ AM = new get_type (second_arg)
if(AM)
return AM
-/proc/GetFromPool(var/get_type,var/new_loc)
+/proc/GetFromPool(var/get_type,var/second_arg)
if(!get_type)
return 0
@@ -55,9 +56,12 @@ var/global/list/GlobalPool = list()
var/atom/movable/AM = pick_n_take(GlobalPool[get_type])
if(AM)
AM.ResetVars()
- AM.New()
- if(new_loc)
- AM.loc = new_loc
+ 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
@@ -69,19 +73,19 @@ var/global/list/GlobalPool = list()
if(AM in GlobalPool[AM.type])
return
-
+
if(!GlobalPool[AM.type])
GlobalPool[AM.type] = list()
GlobalPool[AM.type] |= AM
-
+
AM.Destroy()
AM.ResetVars()
/atom/movable/proc/ResetVars()
- var/list/excluded = list("loc", "locs", "parent_type", "vars", "verbs", "type")
+ var/list/excluded = list("animate_movement", "loc", "locs", "parent_type", "vars", "verbs", "type")
for(var/V in vars)
if(V in excluded)
diff --git a/code/game/say.dm b/code/game/say.dm
index 4f0f24139dd..040f26c8d84 100644
--- a/code/game/say.dm
+++ b/code/game/say.dm
@@ -13,7 +13,7 @@ var/list/freqtospan = list(
"1353" = "comradio",
"1447" = "aiprivradio",
"1213" = "syndradio",
- "1441" = "dsquadradio"
+ "1441" = "centcomradio"
)
/atom/movable/proc/say(message)
@@ -68,18 +68,21 @@ var/list/freqtospan = list(
var/ending = copytext(input, length(input))
if(copytext(input, length(input) - 1) == "!!")
spans |= SPAN_YELL
+ return "[verb_yell], \"[attach_spans(input, spans)]\""
input = attach_spans(input, spans)
if(ending == "?")
return "[verb_ask], \"[input]\""
if(ending == "!")
- return "[verb_yell], \"[input]\""
+ return "[verb_exclaim], \"[input]\""
return "[verb_say], \"[input]\""
/atom/movable/proc/lang_treat(atom/movable/speaker, message_langs, raw_message, list/spans)
if(languages & message_langs)
var/atom/movable/AM = speaker.GetSource()
- if(AM)
+ if(AM) //Basically means "if the speaker is virtual"
+ if(AM.verb_say != speaker.verb_say || AM.verb_ask != speaker.verb_ask || AM.verb_exclaim != speaker.verb_exclaim || AM.verb_yell != speaker.verb_yell) //If the saymod was changed
+ return speaker.say_quote(raw_message, spans)
return AM.say_quote(raw_message, spans)
else
return speaker.say_quote(raw_message, spans)
@@ -136,11 +139,11 @@ var/list/freqtospan = list(
/atom/movable/proc/IsVocal()
return 1
+/atom/movable/proc/get_alt_name()
+
//HACKY VIRTUALSPEAKER STUFF BEYOND THIS POINT
//these exist mostly to deal with the AIs hrefs and job stuff.
-/atom/movable/proc/get_alt_name()
-
/atom/movable/proc/GetJob() //Get a job, you lazy butte
/atom/movable/proc/GetTrack()
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 2c88719d4b9..76206f08ab6 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -190,7 +190,7 @@
user << "You remove the outer plating."
dismantle_wall()
return 1
- else if( istype(W, /obj/item/weapon/pickaxe/plasmacutter) )
+ else if( istype(W, /obj/item/weapon/gun/energy/plasmacutter) )
user << "You begin slicing through the outer plating."
playsound(src, 'sound/items/Welder.ogg', 100, 1)
if(do_after(user, slicing_duration*0.6)) // plasma cutter is faster than welding tool
diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm
index b7e71d69e0b..cf7b6ffd6ec 100644
--- a/code/game/turfs/simulated/walls_reinforced.dm
+++ b/code/game/turfs/simulated/walls_reinforced.dm
@@ -119,7 +119,7 @@
user << "You press firmly on the cover, dislodging it."
return 1
- if( istype(W, /obj/item/weapon/pickaxe/plasmacutter) )
+ if( istype(W, /obj/item/weapon/gun/energy/plasmacutter) )
user << "You begin slicing through the metal cover."
playsound(src, 'sound/items/Welder.ogg', 100, 1)
@@ -185,7 +185,7 @@
user << "The support rods drop out as you cut them loose from the frame."
return 1
- if( istype(W, /obj/item/weapon/pickaxe/plasmacutter) )
+ if( istype(W, /obj/item/weapon/gun/energy/plasmacutter) )
user << "You begin slicing through the support rods."
playsound(src, 'sound/items/Welder.ogg', 100, 1)
diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm
index f743889fcf9..7fc2486a184 100644
--- a/code/game/verbs/suicide.dm
+++ b/code/game/verbs/suicide.dm
@@ -150,25 +150,6 @@
adjustOxyLoss(max(175 - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
updatehealth()
-
-/mob/living/carbon/slime/verb/suicide()
- set hidden = 1
- if(!canSuicide())
- return
- var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
- if(!canSuicide())
- return
- if(confirm == "Yes")
- suiciding = 1
- visible_message("[src] is growing dull and lifeless. It looks like it's lost the will to live.", \
- "[src] is growing dull and lifeless. It looks like it's lost the will to live.")
- setOxyLoss(100)
- adjustBruteLoss(100 - getBruteLoss())
- setToxLoss(100)
- setCloneLoss(100)
-
- updatehealth()
-
/mob/living/simple_animal/verb/suicide()
set hidden = 1
if(!canSuicide())
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 58469dfd03a..956e2d99bc7 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -20,7 +20,6 @@ var/list/admin_verbs_default = list(
/client/proc/stop_sounds
)
var/list/admin_verbs_admin = list(
- /client/proc/player_panel, /*shows an interface for all players, with links to various panels (old style)*/
/client/proc/player_panel_new, /*shows an interface for all players, with links to various panels*/
/client/proc/invisimin, /*allows our mob to go invisible/visible*/
// /datum/admins/proc/show_traitor_panel, /*interface which shows a mob's mind*/ -Removed due to rare practical use. Moved to debug verbs ~Errorage
@@ -83,7 +82,8 @@ var/list/admin_verbs_fun = list(
/client/proc/object_say,
/client/proc/toggle_random_events,
/client/proc/set_ooc,
- /client/proc/forceEvent
+ /client/proc/forceEvent,
+ /client/proc/bluespace_artillery
)
var/list/admin_verbs_spawn = list(
/datum/admins/proc/spawn_atom, /*allows us to spawn instances*/
@@ -324,17 +324,8 @@ var/list/admin_verbs_hideable = list(
mob.invisibility = INVISIBILITY_OBSERVER
mob << "Invisimin on. You are now as invisible as a ghost."
-
-/client/proc/player_panel()
- set name = "Player Panel"
- set category = "Admin"
- if(holder)
- holder.player_panel_old()
- feedback_add_details("admin_verb","PP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- return
-
/client/proc/player_panel_new()
- set name = "Player Panel New"
+ set name = "Player Panel"
set category = "Admin"
if(holder)
holder.player_panel_new()
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 10af3669fc4..4b50cfa3af0 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -229,8 +229,6 @@
if(iscarbon(M)) //Carbon stuff
if(ishuman(M))
M_job = M.job
- else if(isslime(M))
- M_job = "slime"
else if(ismonkey(M))
M_job = "Monkey"
else if(isalien(M)) //aliens
@@ -254,6 +252,8 @@
else if(isanimal(M)) //simple animals
if(iscorgi(M))
M_job = "Corgi"
+ else if(isslime(M))
+ M_job = "slime"
else
M_job = "Animal"
@@ -304,66 +304,6 @@
usr << browse(dat, "window=players;size=600x480")
-//The old one
-/datum/admins/proc/player_panel_old()
- if(!check_rights())
- return
- var/dat = "Player Menu"
- dat += "| Name | Real Name | Assigned Job | Key | Options | PM | Traitor? |
"
- //add IP: | to this if wanting to add back in IP checking
- //add (IP: [M.lastKnownIP]) | if you want to know their ip to the lists below
- var/list/mobs = sortmobs()
-
- for(var/mob/M in mobs)
- if(!M.ckey) continue
-
- dat += "| [M.name] | "
- if(isAI(M))
- dat += "AI | "
- else if(isrobot(M))
- dat += "Cyborg | "
- else if(ishuman(M))
- dat += "[M.real_name] | "
- else if(istype(M, /mob/living/silicon/pai))
- dat += "pAI | "
- else if(istype(M, /mob/new_player))
- dat += "New Player | "
- else if(isobserver(M))
- dat += "Ghost | "
- else if(ismonkey(M))
- dat += "Monkey | "
- else if(isalien(M))
- dat += "Alien | "
- else
- dat += "Unknown | "
-
-
- if(istype(M,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- if(H.mind && H.mind.assigned_role)
- dat += "[H.mind.assigned_role] | "
- else
- dat += "NA | "
-
-
- dat += {"[(M.client ? "[M.client]" : "No client")] |
- X |
- PM |
- "}
- switch(is_special_character(M))
- if(0)
- dat += {"Traitor? | "}
- if(1)
- dat += {"Traitor? | "}
- if(2)
- dat += {"Traitor? | "}
-
- dat += "
"
-
- usr << browse(dat, "window=players;size=640x480")
-
-
-
/datum/admins/proc/check_antagonists()
if (ticker && ticker.current_state >= GAME_STATE_PLAYING)
var/dat = "Round StatusRound Status
"
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 348920560fb..1821f3d7f71 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -7,6 +7,9 @@
return
if(href_list["makeAntag"])
+ if (!ticker.mode)
+ usr << "Not until the round starts!"
+ return
switch(href_list["makeAntag"])
if("1")
message_admins("[key_name_admin(usr)] created traitors.")
@@ -265,7 +268,7 @@
if("sentinel") M.change_mob_type( /mob/living/carbon/alien/humanoid/sentinel , null, null, delmob )
if("larva") M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob )
if("human") M.change_mob_type( /mob/living/carbon/human , null, null, delmob )
- if("slime") M.change_mob_type( /mob/living/carbon/slime , null, null, delmob )
+ if("slime") M.change_mob_type( /mob/living/simple_animal/slime , null, null, delmob )
if("monkey") M.change_mob_type( /mob/living/carbon/monkey , null, null, delmob )
if("robot") M.change_mob_type( /mob/living/silicon/robot , null, null, delmob )
if("cat") M.change_mob_type( /mob/living/simple_animal/pet/cat , null, null, delmob )
@@ -1469,40 +1472,8 @@
H << "Your prayers have been answered!! You received the best cookie!"
else if(href_list["BlueSpaceArtillery"])
- if(!check_rights(R_ADMIN|R_FUN)) return
-
var/mob/living/M = locate(href_list["BlueSpaceArtillery"])
- if(!isliving(M))
- usr << "This can only be used on instances of type /mob/living"
- return
-
- if(alert(src.owner, "Are you sure you wish to hit [key_name(M)] with Blue Space Artillery?", "Confirm Firing?" , "Yes" , "No") != "Yes")
- return
-
- if(BSACooldown)
- src.owner << "Standby! Reload cycle in progress! Gunnary crews ready in five seconds!"
- return
-
- BSACooldown = 1
- spawn(50)
- BSACooldown = 0
-
- M << "You've been hit by bluespace artillery!"
- log_admin("[key_name(M)] has been hit by Bluespace Artillery fired by [src.owner]")
- message_admins("[key_name(M)] has been hit by Bluespace Artillery fired by [src.owner]")
-
- var/turf/simulated/floor/T = get_turf(M)
- if(istype(T))
- if(prob(80)) T.break_tile_to_plating()
- else T.break_tile()
-
- if(M.health == 1)
- M.gib()
- else
- M.adjustBruteLoss( min( 99 , (M.health - 1) ) )
- M.Stun(20)
- M.Weaken(20)
- M.stuttering = 20
+ M.client.bluespace_artillery(M)
else if(href_list["CentcommReply"])
var/mob/living/carbon/human/H = locate(href_list["CentcommReply"])
diff --git a/code/modules/admin/verbs/bluespacearty.dm b/code/modules/admin/verbs/bluespacearty.dm
new file mode 100644
index 00000000000..c3c0c0d90b7
--- /dev/null
+++ b/code/modules/admin/verbs/bluespacearty.dm
@@ -0,0 +1,34 @@
+/client/proc/bluespace_artillery(var/mob/M in mob_list)
+ set name = "Bluespace Artillery"
+ set category = "Fun"
+
+ if(!holder || !check_rights(R_FUN))
+ return
+
+ var/mob/living/target = M
+
+ if(!isliving(target))
+ usr << "This can only be used on instances of type /mob/living"
+ return
+
+ if(alert(usr, "Are you sure you wish to hit [key_name(target)] with Blue Space Artillery?", "Confirm Firing?" , "Yes" , "No") != "Yes")
+ return
+
+ explosion(target.loc, 0, 0, 0, 0)
+
+ var/turf/simulated/floor/T = get_turf(target)
+ if(istype(T))
+ if(prob(80)) T.break_tile_to_plating()
+ else T.break_tile()
+
+ if(target.health <= 1)
+ target.gib()
+ else
+ target.adjustBruteLoss(min(99,(target.health - 1)))
+ target.Stun(20)
+ target.Weaken(20)
+ target.stuttering = 20
+
+ target << "You've been hit by bluespace artillery!"
+ log_admin("[target.name] has been hit by Bluespace Artillery fired by [usr]")
+ message_admins("[target.name] has been hit by Bluespace Artillery fired by [usr]")
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 1e49686bd0e..0e7532d5ffa 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -863,17 +863,18 @@ var/global/list/g_fancy_list_of_types = null
equip_emergencyresponsesquad(M, "sec")
if("Engineer")
equip_emergencyresponsesquad(M, "eng")
- if("Medic")
+ if("Medical")
equip_emergencyresponsesquad(M, "med")
if("centcom official")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_com(M), slot_ears)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cent(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/pen(M), slot_l_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(M), slot_back)
var/obj/item/device/pda/heads/pda = new(M)
pda.owner = M.real_name
@@ -895,16 +896,17 @@ var/global/list/g_fancy_list_of_types = null
if("centcom commander")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_commander(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/bulletproof(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cent(M), slot_ears)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cent/commander(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/clothing/head/centhat(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/lighter/zippo(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_l_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
var/obj/item/weapon/card/id/W = new(M)
W.icon_state = "centcom"
@@ -916,7 +918,7 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(W, slot_wear_id)
if("special ops officer")
- var/obj/item/device/radio/headset/R = new /obj/item/device/radio/headset/headset_cent(M)
+ var/obj/item/device/radio/headset/R = new /obj/item/device/radio/headset/headset_cent/commander(M)
R.set_frequency(1441)
M.equip_to_slot_or_del(R, slot_ears)
@@ -1103,7 +1105,7 @@ var/global/list/g_fancy_list_of_types = null
//Deathsquad
/proc/equip_deathsquad(var/mob/living/carbon/human/M, var/officer)
- var/obj/item/device/radio/R = new /obj/item/device/radio/headset(M)
+ var/obj/item/device/radio/R = new /obj/item/device/radio/headset/headset_cent/alt(M)
R.set_frequency(1441)
M.equip_to_slot_or_del(R, slot_ears)
@@ -1134,12 +1136,13 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(new /obj/item/weapon/tank/internals/emergency_oxygen(M), slot_s_store)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse(M), slot_r_hand)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/loyalpin(M), slot_r_hand)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)//Here you go Deuryn
L.imp_in = M
L.implanted = 1
+ M.sec_hud_set_implants()
var/obj/item/weapon/card/id/W = new(M)
W.icon_state = "centcom"
@@ -1147,22 +1150,24 @@ var/global/list/g_fancy_list_of_types = null
W.access += get_centcom_access("Death Commando")//Let's add their alloted Centcom access.
W.assignment = "Death Commando"
W.registered_name = M.real_name
- W.update_label(M.real_name)
+ W.update_label(W.registered_name, W.assignment)
M.equip_to_slot_or_del(W, slot_wear_id)
//Emergency Response Team
/proc/equip_emergencyresponsesquad(var/mob/living/carbon/human/M, var/ertrole)
- var/obj/item/device/radio/R = new /obj/item/device/radio/headset(M)
+ var/obj/item/weapon/card/id/W = null
+ var/obj/item/device/radio/R = new /obj/item/device/radio/headset/headset_cent/alt(M)
R.set_frequency(1441)
M.equip_to_slot_or_del(R, slot_ears)
switch(ertrole)
if("commander")
+ W = new /obj/item/weapon/card/id/ert(M)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
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/suit/space/hardsuit/ert(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/card/id/ert(M), slot_wear_id)
+ M.equip_to_slot_or_del(W, slot_wear_id)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/captain(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
@@ -1173,12 +1178,15 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/full(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store)
+ R.keyslot = new /obj/item/device/encryptionkey/heads/captain
+
if("sec")
+ W = new /obj/item/weapon/card/id/ert/Security(M)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
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/suit/space/hardsuit/ert/sec(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/card/id/ert/Security(M), slot_wear_id)
+ M.equip_to_slot_or_del(W, slot_wear_id)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
@@ -1189,12 +1197,15 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/full(M), slot_belt)
+ R.keyslot = new /obj/item/device/encryptionkey/heads/hos
+
if("med")
+ W = new /obj/item/weapon/card/id/ert/Medical(M)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
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/suit/space/hardsuit/ert/med(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/card/id/ert/Medical(M), slot_wear_id)
+ M.equip_to_slot_or_del(W, slot_wear_id)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health(M), slot_glasses)
@@ -1207,12 +1218,15 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(M), slot_r_hand)
+ R.keyslot = new /obj/item/device/encryptionkey/heads/cmo
+
if("eng")
+ W = new /obj/item/weapon/card/id/ert/Engineer(M)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
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/suit/space/hardsuit/ert/engi(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/card/id/ert/Engineer(M), slot_wear_id)
+ M.equip_to_slot_or_del(W, slot_wear_id)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson/engine(M), slot_glasses)
@@ -1224,7 +1238,15 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_l_store)
+ R.keyslot = new /obj/item/device/encryptionkey/heads/ce
+
+ R.recalculateChannels()
+
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
L.imp_in = M
L.implanted = 1
M.sec_hud_set_implants()
+
+ if (W)
+ W.registered_name = M.real_name
+ W.update_label(W.registered_name, W.assignment)
\ No newline at end of file
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index e5c3b465337..b8041bc269e 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -353,8 +353,10 @@ client/proc/one_click_antag()
//Pick the lucky players
var/numagents = min(5,candidates.len) //How many commandos to spawn
var/list/spawnpoints = deathsquadspawn
- while(numagents && spawnpoints.len && candidates.len)
- var/spawnloc = spawnpoints[1]
+ while(numagents && candidates.len)
+ if (numagents > spawnpoints.len)
+ continue // This guy's unlucky, not enough spawn points, we skip him.
+ var/spawnloc = spawnpoints[numagents]
var/mob/dead/observer/chosen_candidate = pick(candidates)
candidates -= chosen_candidate
if(!chosen_candidate.key)
@@ -396,10 +398,12 @@ client/proc/one_click_antag()
if(numagents == 1)
message_admins("The deathsquad has spawned with the mission: [mission].")
log_game("[key_name(Commando)] has been selected as a Death Commando")
- spawnpoints -= spawnloc
numagents--
- return 1
+ if (numagents == candidates.len)
+ return 0 // No one got spawned!
+ else
+ return 1
return
@@ -464,8 +468,10 @@ client/proc/one_click_antag()
//Pick the (un)lucky players
var/numagents = min(7,candidates.len) //How many officers to spawn
var/list/spawnpoints = emergencyresponseteamspawn
- while(numagents && spawnpoints.len && candidates.len)
- var/spawnloc = spawnpoints[1]
+ while(numagents && candidates.len)
+ if (candidates.len > spawnpoints.len)
+ continue // This guy's unlucky, not enough spawn points, we skip him.
+ var/spawnloc = spawnpoints[numagents]
var/mob/dead/observer/chosen_candidate = pick(candidates)
candidates -= chosen_candidate
if(!chosen_candidate.key)
@@ -480,13 +486,22 @@ client/proc/one_click_antag()
if(1)
ERTOperative.real_name = "Commander [pick(lastname)]"
equip_emergencyresponsesquad(ERTOperative, "commander")
- if(2 || 5)
+ if(2)
ERTOperative.real_name = "Security Officer [pick(lastname)]"
equip_emergencyresponsesquad(ERTOperative, "sec")
- if(3 || 6)
+ if(3)
ERTOperative.real_name = "Medical Officer [pick(lastname)]"
equip_emergencyresponsesquad(ERTOperative, "med")
- if(4 || 7)
+ if(4)
+ ERTOperative.real_name = "Engineer [pick(lastname)]"
+ equip_emergencyresponsesquad(ERTOperative, "eng")
+ if(5)
+ ERTOperative.real_name = "Security Officer [pick(lastname)]"
+ equip_emergencyresponsesquad(ERTOperative, "sec")
+ if(6)
+ ERTOperative.real_name = "Medical Officer [pick(lastname)]"
+ equip_emergencyresponsesquad(ERTOperative, "med")
+ if(7)
ERTOperative.real_name = "Engineer [pick(lastname)]"
equip_emergencyresponsesquad(ERTOperative, "eng")
ERTOperative.key = chosen_candidate.key
@@ -515,10 +530,12 @@ client/proc/one_click_antag()
if(numagents == 1)
message_admins("The emergency response team has spawned with the mission: [mission].")
log_game("[key_name(ERTOperative)] has been selected as an Emergency Response Officer")
- spawnpoints -= spawnloc
numagents--
- return 1
+ if (numagents == candidates.len)
+ return 0 // No one got spawned!
+ else
+ return 1
return
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index 8127159f7a0..22f77f0e643 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -13,7 +13,7 @@ var/sound/admin_sound
log_admin("[key_name(src)] played sound [S]")
message_admins("[key_name_admin(src)] played sound [S]")
- if(SSevent.holiday == "April Fool's Day")
+ if(SSevent.holidays && SSevent.holidays[APRIL_FOOLS])
admin_sound.frequency = pick(0.5, 0.7, 0.8, 0.85, 0.9, 0.95, 1.1, 1.2, 1.4, 1.6, 2.0, 2.5)
src << "You feel the Honkmother messing with your song..."
diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm
index 75fe87e9802..1042d781a0c 100644
--- a/code/modules/assembly/voice.dm
+++ b/code/modules/assembly/voice.dm
@@ -9,7 +9,7 @@
attachable = 1
verb_say = "beeps"
verb_ask = "beeps"
- verb_yell = "beeps"
+ verb_exclaim = "beeps"
var/listening = 0
var/recorded = "" //the activation message
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 703962ae3ba..c52adc42c2c 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -105,10 +105,10 @@
icon_state = "grey baby slime" //sets the icon in the map editor
/obj/effect/landmark/corpse/slimeCorpse/createCorpse() //proc creates a dead slime
- var/A = locate(/mob/living/carbon/slime/) in loc //variable A looks for a slime at the location of the landmark
+ var/A = locate(/mob/living/simple_animal/slime/) in loc //variable A looks for a slime at the location of the landmark
if(A) //if variable A is true
return //stop executing the proc
- var/mob/living/carbon/slime/M = new(src.loc) //variable M is a new slime at the location of the landmark
+ var/mob/living/simple_animal/slime/M = new(src.loc) //variable M is a new slime at the location of the landmark
M.colour = src.mobcolour //slime colour is set by landmark's mobcolour var
M.adjustToxLoss(9001) //kills the slime, death() doesn't update its icon correctly
qdel(src)
@@ -196,7 +196,7 @@
corpseidaccess = "Station Engineer"
/obj/effect/landmark/corpse/engineer/rig
- corpsesuit = /obj/item/clothing/suit/space/hardsuit
+ corpsesuit = /obj/item/clothing/suit/space/hardsuit/engine
corpsemask = /obj/item/clothing/mask/breath
/obj/effect/landmark/corpse/clown
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index 52b9329094d..f24d7e2a301 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -157,6 +157,34 @@
src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
feedback_add_details("admin_verb","TAmbi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+// This needs a toggle because you people are awful and spammed terrible music
+/client/verb/toggle_instruments()
+ set name = "Hear/Silence Instruments"
+ set category = "Preferences"
+ set desc = "Toggles hearing musical instruments like the violin and piano"
+ prefs.toggles ^= SOUND_INSTRUMENTS
+ prefs.save_preferences()
+ if(prefs.toggles & SOUND_INSTRUMENTS)
+ src << "You will now hear people playing musical instruments."
+ else
+ src << "You will no longer hear musical instruments."
+ feedback_add_details("admin_verb","TInstru") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+//Lots of people get headaches from the normal ship ambience, this is to prevent that
+/client/verb/toggle_ship_ambience()
+ set name = "Hear/Silence Ship Ambience"
+ set category = "Preferences"
+ set desc = "Toggles hearing generalized ship ambience, no matter your area."
+ prefs.toggles ^= SOUND_SHIP_AMBIENCE
+ prefs.save_preferences()
+ if(prefs.toggles & SOUND_SHIP_AMBIENCE)
+ src << "You will now hear ship ambience."
+ else
+ src << "You will no longer hear ship ambience."
+ src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
+ src.ambience_playing = 0
+ feedback_add_details("admin_verb", "SAmbi") //If you are copy-pasting this, I bet you read this comment expecting to see the same thing :^)
+
//be special
/client/verb/toggle_be_special(role in be_special_flags)
set name = "Toggle SpecialRole Candidacy"
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 9a26058d953..3367901fc15 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -4,7 +4,7 @@
icon_state = "meson"
item_state = "meson"
origin_tech = "magnets=2;engineering=2"
- darkness_view = 1
+ darkness_view = 2
vision_flags = SEE_TURFS
invis_view = SEE_INVISIBLE_MINIMUM
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 1048d8a158b..4fbd2b6b832 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -189,6 +189,7 @@ obj/item/clothing/head/helmet/bluetaghelm
/obj/item/clothing/head/helmet/ui_action_click()
toggle_helmlight()
+ ..()
/obj/item/clothing/head/helmet/attackby(var/obj/item/A as obj, mob/user as mob, params)
if(istype(A, /obj/item/device/flashlight/seclite))
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 610f50c5642..ab22fb8e773 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -1,6 +1,6 @@
- //Regular (engineering) hardsuits
+ //Baseline hardsuits
/obj/item/clothing/head/helmet/space/hardsuit
- name = "engineering hardsuit helmet"
+ name = "hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
icon_state = "hardsuit0-engineering"
item_state = "eng_helm"
@@ -36,7 +36,7 @@
/obj/item/clothing/suit/space/hardsuit
- name = "engineering hardsuit"
+ name = "hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
icon_state = "hardsuit-engineering"
item_state = "eng_hardsuit"
@@ -46,9 +46,42 @@
var/obj/item/clothing/head/helmet/space/hardsuit/helmet
action_button_name = "Toggle Helmet"
var/helmettype = /obj/item/clothing/head/helmet/space/hardsuit
+ var/obj/item/weapon/tank/jetpack/suit/jetpack = null
+
+/obj/item/clothing/suit/space/hardsuit/verb/Jetpack()
+ set name = "Toggle Inbuilt Jetpack"
+ set category = "Object"
+ jetpack.toggle()
+
+/obj/item/clothing/suit/space/hardsuit/verb/Jetpack_Rockets()
+ set name = "Toggle Inbuilt Jetpack Stabilization"
+ set category = "Object"
+ jetpack.toggle_rockets()
+
+ //Engineering
+/obj/item/clothing/head/helmet/space/hardsuit/engine
+ name = "engineering hardsuit helmet"
+ desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
+ icon_state = "hardsuit0-engineering"
+ item_state = "eng_helm"
+ armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
+ item_color = "engineering"
+
+/obj/item/clothing/suit/space/hardsuit/engine
+ name = "engineering hardsuit"
+ desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
+ icon_state = "hardsuit-engineering"
+ item_state = "eng_hardsuit"
+ armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine
+
+
+/obj/item/clothing/suit/space/hardsuit/engine/New()
+ jetpack = new /obj/item/weapon/tank/jetpack/suit(src)
+ ..()
//Atmospherics
-/obj/item/clothing/head/helmet/space/hardsuit/atmos
+/obj/item/clothing/head/helmet/space/hardsuit/engine/atmos
name = "atmospherics hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has thermal shielding."
icon_state = "hardsuit0-atmospherics"
@@ -58,6 +91,7 @@
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
+/obj/item/clothing/suit/space/hardsuit/engine/atmos
/obj/item/clothing/suit/space/hardsuit/atmos
name = "atmospherics hardsuit"
@@ -67,11 +101,11 @@
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/atmos
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/atmos
//Chief Engineer's hardsuit
-/obj/item/clothing/head/helmet/space/hardsuit/elite
+/obj/item/clothing/head/helmet/space/hardsuit/engine/elite
name = "advanced hardsuit helmet"
desc = "An advanced helmet designed for work in a hazardous, low pressure environment. Shines with a high polish."
icon_state = "hardsuit0-white"
@@ -82,7 +116,7 @@
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
-/obj/item/clothing/suit/space/hardsuit/elite
+/obj/item/clothing/suit/space/hardsuit/engine/elite
icon_state = "hardsuit-white"
name = "advanced hardsuit"
desc = "An advanced suit that protects against hazardous, low pressure environments. Shines with a high polish."
@@ -90,7 +124,7 @@
armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 90)
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/elite
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite
//Mining hardsuit
@@ -202,6 +236,9 @@
..()
flags ^= NODROP
+/obj/item/clothing/suit/space/hardsuit/syndi/New()
+ jetpack = new /obj/item/weapon/tank/jetpack/suit(src)
+ ..()
//The Owl Hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/syndi/owl
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index c9567e9c4ed..380e0262597 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -80,6 +80,9 @@
/obj/item/clothing/suit/space/hardsuit/New()
MakeHelmet()
+ if(!jetpack)
+ verbs -= /obj/item/clothing/suit/space/hardsuit/verb/Jetpack
+ verbs -= /obj/item/clothing/suit/space/hardsuit/verb/Jetpack_Rockets
..()
/obj/item/clothing/suit/space/hardsuit/proc/MakeHelmet()
@@ -136,4 +139,4 @@
else
H << "You disengage the helmet on the hardsuit."
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
- RemoveHelmet()
\ No newline at end of file
+ RemoveHelmet()
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index c0d55ed45e4..4ce2dc6849c 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -92,7 +92,6 @@
icon_state = "officer"
item_state = "g_suit"
item_color = "officer"
- can_adjust = 0
/obj/item/clothing/under/rank/centcom_commander
desc = "It's a jumpsuit worn by Centcom's highest-tier Commanders."
@@ -100,7 +99,6 @@
icon_state = "centcom"
item_state = "dg_suit"
item_color = "centcom"
- can_adjust = 0
/obj/item/clothing/under/space
name = "\improper NASA jumpsuit"
diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm
index 71fc5d1b932..affb72d1381 100644
--- a/code/modules/detectivework/scanner.dm
+++ b/code/modules/detectivework/scanner.dm
@@ -5,7 +5,7 @@
/obj/item/device/detective_scanner
name = "forensic scanner"
desc = "Used to remotely scan objects and biomass for DNA and fingerprints. Can print a report of the findings."
- icon_state = "forensic1"
+ icon_state = "forensicnew"
w_class = 3.0
item_state = "electronic"
flags = CONDUCT | NOBLUDGEON
diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm
index 237e59a1d48..9f5feea38e1 100644
--- a/code/modules/events/anomaly_pyro.dm
+++ b/code/modules/events/anomaly_pyro.dm
@@ -30,7 +30,7 @@
if(newAnomaly.loc)
explosion(get_turf(newAnomaly), -1,0,3, flame_range = 4)
- var/mob/living/carbon/slime/S = new/mob/living/carbon/slime(get_turf(newAnomaly))
+ var/mob/living/simple_animal/slime/S = new/mob/living/simple_animal/slime(get_turf(newAnomaly))
S.colour = pick("red", "orange")
qdel(newAnomaly)
\ No newline at end of file
diff --git a/code/modules/events/event.dm b/code/modules/events/event.dm
index 172a562905b..e55c3203f4c 100644
--- a/code/modules/events/event.dm
+++ b/code/modules/events/event.dm
@@ -13,7 +13,7 @@
var/max_occurrences = 20 //The maximum number of times this event can occur (naturally), it can still be forced.
//By setting this to 0 you can effectively disable an event.
- var/holidayID //string which should match the events.holiday variable if you wish this event to be holiday-specific
+ var/holidayID = "" //string which should be in the SSevents.holidays list if you wish this event to be holiday-specific
//anything with a (non-null) holidayID which does not match holiday, cannot run.
var/wizardevent = 0
diff --git a/code/modules/events/holiday/friday13th.dm b/code/modules/events/holiday/friday13th.dm
index a227cb6f611..e1a393fb867 100644
--- a/code/modules/events/holiday/friday13th.dm
+++ b/code/modules/events/holiday/friday13th.dm
@@ -2,7 +2,7 @@
/datum/round_event_control/fridaythethirteen
name = "Friday the 13th"
- holidayID = "Friday the 13th"
+ holidayID = FRIDAY_13TH
typepath = /datum/round_event/fridaythethirteen
weight = -1
max_occurrences = 1
diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm
index d08eebb919e..8c3536444de 100644
--- a/code/modules/events/holiday/halloween.dm
+++ b/code/modules/events/holiday/halloween.dm
@@ -1,6 +1,6 @@
/datum/round_event_control/spooky
name = "2 SPOOKY! (Halloween)"
- holidayID = "Halloween"
+ holidayID = HALLOWEEN
typepath = /datum/round_event/spooky
weight = -1 //forces it to be called, regardless of weight
max_occurrences = 1
@@ -27,7 +27,7 @@
/datum/round_event_control/carp_migration/eyeballs
name = "Eyeball Migration"
typepath = /datum/round_event/carp_migration/eyeballs
- holidayID = "Halloween"
+ holidayID = HALLOWEEN
weight = 25
earliest_start = 0
@@ -40,7 +40,7 @@
/datum/round_event_control/meteor_wave/spooky
name = "Pumpkin Wave"
typepath = /datum/round_event/meteor_wave/spooky
- holidayID = "Halloween"
+ holidayID = HALLOWEEN
weight = 20
max_occurrences = 2
diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm
index f7f3d202206..eacc8eacaba 100644
--- a/code/modules/events/holiday/xmas.dm
+++ b/code/modules/events/holiday/xmas.dm
@@ -1,6 +1,6 @@
/datum/round_event_control/treevenge
name = "Treevenge (Christmas)"
- holidayID = "Xmas"
+ holidayID = CHRISTMAS
typepath = /datum/round_event/treevenge
max_occurrences = 1
weight = 20
@@ -17,7 +17,7 @@
//this is an example of a possible round-start event
/datum/round_event_control/presents
name = "Presents under Trees (Christmas)"
- holidayID = "Xmas"
+ holidayID = CHRISTMAS
typepath = /datum/round_event/presents
weight = -1 //forces it to be called, regardless of weight
max_occurrences = 1
@@ -81,7 +81,7 @@
/datum/round_event_control/santa
name = "Santa is coming to town! (Christmas)"
- holidayID = "Xmas"
+ holidayID = CHRISTMAS
typepath = /datum/round_event/santa
weight = 150
max_occurrences = 1
diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm
index 1a55876b8e8..e3b4c5d1fb6 100644
--- a/code/modules/events/wizard/imposter.dm
+++ b/code/modules/events/wizard/imposter.dm
@@ -14,7 +14,7 @@
if(!candidates) return //Sad Trombone
var/client/C = pick(candidates)
- new /obj/effect/effect/harmless_smoke(W.loc)
+ PoolOrNew(/obj/effect/effect/harmless_smoke, W.loc)
var/mob/living/carbon/human/I = new /mob/living/carbon/human(W.loc)
I.real_name = W.real_name
diff --git a/code/modules/events/wizard/summons.dm b/code/modules/events/wizard/summons.dm
index afe85bad448..7b3e27e16c6 100644
--- a/code/modules/events/wizard/summons.dm
+++ b/code/modules/events/wizard/summons.dm
@@ -5,6 +5,11 @@
max_occurrences = 1
earliest_start = 0
+/datum/round_event_control/wizard/summonguns/New()
+ if(config.no_summon_guns)
+ weight = 0
+ ..()
+
/datum/round_event/wizard/summonguns/start()
rightandwrong(0,,10)
@@ -15,5 +20,10 @@
max_occurrences = 1
earliest_start = 0
+/datum/round_event_control/wizard/summonmagic/New()
+ if(config.no_summon_magic)
+ weight = 0
+ ..()
+
/datum/round_event/wizard/summonmagic/start()
rightandwrong(1,,10)
\ No newline at end of file
diff --git a/code/modules/food&drinks/drinks/drinks/bottle.dm b/code/modules/food&drinks/drinks/drinks/bottle.dm
index 5c0bdec3e23..5cdfcd67a2c 100644
--- a/code/modules/food&drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food&drinks/drinks/drinks/bottle.dm
@@ -92,8 +92,8 @@
target.visible_message("[user] has hit [target][head_attack_message] with a bottle of [src.name]!", \
"[user] has hit [target][head_attack_message] with a bottle of [src.name]!")
else
- user.visible_message("[target] hits himself with a bottle of [src.name][head_attack_message]!", \
- "[target] hits himself with a bottle of [src.name][head_attack_message]!")
+ user.visible_message("[target] hits \himself with a bottle of [src.name][head_attack_message]!", \
+ "[target] hits \himself with a bottle of [src.name][head_attack_message]!")
//Attack logs
add_logs(user, target, "attacked", object="bottle")
diff --git a/code/modules/food&drinks/food/snacks.dm b/code/modules/food&drinks/food/snacks.dm
index 4f2576ec72e..3199cde393a 100644
--- a/code/modules/food&drinks/food/snacks.dm
+++ b/code/modules/food&drinks/food/snacks.dm
@@ -51,7 +51,7 @@
M.unEquip(src) //so icons update :[
qdel(src)
return 0
- if(istype(M, /mob/living/carbon))
+ if(iscarbon(M))
if(!canconsume(M, user))
return 0
@@ -79,7 +79,7 @@
M << "You cannot force any more of \the [src] to go down your throat."
return 0
else
- if(! (isslime(M) || isbrain(M)) ) //If you're feeding it to someone else.
+ if(!isbrain(M)) //If you're feeding it to someone else.
if(wrapped)
return 0
if(fullness <= (600 * (1 + M.overeatduration / 1000)))
diff --git a/code/modules/food&drinks/kitchen machinery/processor.dm b/code/modules/food&drinks/kitchen machinery/processor.dm
index 1a3be0f8587..f34053de43c 100644
--- a/code/modules/food&drinks/kitchen machinery/processor.dm
+++ b/code/modules/food&drinks/kitchen machinery/processor.dm
@@ -53,7 +53,7 @@
/datum/food_processor_process/mob/slime/process(loc, what)
- var/mob/living/carbon/slime/S = what
+ var/mob/living/simple_animal/slime/S = what
var/C = S.cores
if(S.stat != DEAD)
S.loc = loc
@@ -64,7 +64,7 @@
feedback_add_details("slime_core_harvested","[replacetext(S.colour," ","_")]")
..()
-/datum/food_processor_process/mob/slime/input = /mob/living/carbon/slime
+/datum/food_processor_process/mob/slime/input = /mob/living/simple_animal/slime
/datum/food_processor_process/mob/slime/output = null
/datum/food_processor_process/mob/monkey/process(loc, what)
diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm
new file mode 100644
index 00000000000..d6cfdca9759
--- /dev/null
+++ b/code/modules/holiday/easter.dm
@@ -0,0 +1,235 @@
+//Easter start
+/datum/holiday/easter/greet()
+ return "Greetings! Have a Happy Easter and keep an eye out for Easter Bunnies!"
+
+/datum/round_event_control/easter
+ name = "Easter Eggselence"
+ holidayID = EASTER
+ typepath = /datum/round_event/easter
+ weight = -1
+ max_occurrences = 1
+ earliest_start = 0
+
+/datum/round_event/easter/announce()
+ priority_announce(pick("Hip-hop into Easter!","Find some Bunny's stash!","Today is National 'Hunt a Wabbit' Day.","Be kind, give Chocolate Eggs!"))
+
+
+/datum/round_event_control/rabbitrelease
+ name = "Release the Rabbits!"
+ typepath = /datum/round_event/rabbitrelease
+ weight = 5
+ max_occurrences = 10
+
+/datum/round_event/rabbitrelease/announce()
+ priority_announce("Unidentified furry objects detected coming aboard [station_name()]. Beware of Adorable-ness.", "Fluffy Alert", 'sound/AI/aliens.ogg')
+
+
+/datum/round_event/rabbitrelease/start()
+ for(var/obj/effect/landmark/R in landmarks_list)
+ if(R.name != "blobspawn")
+ if(prob(35))
+ if(istype(R.loc,/turf/space))
+ new /mob/living/simple_animal/chicken/rabbit/space(R.loc)
+ else
+ new /mob/living/simple_animal/chicken/rabbit(R.loc)
+
+/mob/living/simple_animal/chicken/rabbit
+ name = "\improper rabbit"
+ desc = "The hippiest hop around."
+ icon = 'icons/mob/Easter.dmi'
+ icon_state = "rabbit"
+ icon_living = "rabbit"
+ icon_dead = "rabbit_dead"
+ speak = list("Hop into Easter!","Come get your eggs!","Prizes for everyone!")
+ speak_emote = list("sniffles","twitches")
+ emote_hear = list("hops.")
+ emote_see = list("hops around","bounces up and down")
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
+ egg_type = /obj/item/weapon/reagent_containers/food/snacks/egg/loaded
+ food_type = /obj/item/weapon/reagent_containers/food/snacks/grown/carrot
+ meat_amount = 1
+ eggsleft = 10
+ eggsFertile = FALSE
+ icon_prefix = "rabbit"
+ feedMessages = list("It nibbles happily.","It noms happily.")
+ layMessage = list("hides an egg.","scampers around suspiciously.","begins making a huge racket.","begins shuffling.")
+
+/mob/living/simple_animal/chicken/rabbit/space
+ icon_prefix = "s_rabbit"
+ icon_state = "s_rabbit"
+ icon_living = "s_rabbit"
+ icon_dead = "s_rabbit_dead"
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+ maxbodytemp = 1500
+ unsuitable_atmos_damage = 0 //This damage is taken when atmos doesn't fit all the requirements above
+
+//Easter Baskets
+/obj/item/weapon/storage/bag/easterbasket
+ name = "Easter Basket"
+ icon = 'icons/mob/Easter.dmi'
+ icon_state = "basket"
+ can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/egg,/obj/item/weapon/reagent_containers/food/snacks/chocolateegg,/obj/item/weapon/reagent_containers/food/snacks/boiledegg)
+
+/obj/item/weapon/storage/bag/easterbasket/proc/countEggs()
+ overlays.Cut()
+ overlays += image("icon" = icon, "icon_state" = "basket-grass", "layer" = -1)
+ overlays += image("icon" = icon, "icon_state" = "basket-egg[contents.len <= 5 ? contents.len : 5]", "layer" = -1)
+
+/obj/item/weapon/storage/bag/easterbasket/remove_from_storage(obj/item/W as obj, atom/new_location)
+ ..()
+ countEggs()
+
+/obj/item/weapon/storage/bag/easterbasket/handle_item_insertion(obj/item/I, prevent_warning = 0)
+ ..()
+ countEggs()
+
+//Bunny Suit
+/obj/item/clothing/head/bunnyhead
+ name = "Easter Bunny Head"
+ icon_state = "bunnyhead"
+ item_state = "bunnyhead"
+ desc = "Considerably more cute than 'Frank'"
+ slowdown = -1
+ flags = BLOCKHAIR
+ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
+
+/obj/item/clothing/suit/bunnysuit
+ name = "Easter Bunny Suit"
+ desc = "Hop Hop Hop!"
+ icon_state = "bunnysuit"
+ item_state = "bunnysuit"
+ slowdown = -1
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS
+ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
+
+//Egg prizes and egg spawns!
+/obj/item/weapon/reagent_containers/food/snacks/egg
+ var/containsPrize = FALSE
+
+/obj/item/weapon/reagent_containers/food/snacks/egg/loaded
+ containsPrize = TRUE
+
+/obj/item/weapon/reagent_containers/food/snacks/egg/loaded/New()
+ ..()
+ var/color = pick("blue","green","mime","orange","purple","rainbow","red","yellow")
+ icon_state = "egg-[color]"
+ item_color = "[color]"
+
+/obj/item/weapon/reagent_containers/food/snacks/egg/proc/dispensePrize(var/turf/where)
+ var/won = pick(/obj/item/clothing/head/bunnyhead,
+ /obj/item/clothing/suit/bunnysuit,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/carrot,
+ /obj/item/weapon/reagent_containers/food/snacks/chocolateegg,
+ /obj/item/toy/balloon,
+ /obj/item/toy/gun,
+ /obj/item/toy/sword,
+ /obj/item/toy/foamblade,
+ /obj/item/toy/prize/ripley,
+ /obj/item/toy/prize/honk,
+ /obj/item/toy/carpplushie,
+ /obj/item/toy/redbutton,
+ /obj/item/clothing/head/collectable/rabbitears)
+ new won(where)
+ new/obj/item/weapon/reagent_containers/food/snacks/chocolateegg(where)
+
+/obj/item/weapon/reagent_containers/food/snacks/egg/attack_self(mob/user as mob)
+ ..()
+ if(containsPrize)
+ user << "You unwrap the [src] and find a prize inside!"
+ dispensePrize(get_turf(user))
+ containsPrize = FALSE
+ qdel(src)
+
+/obj/effect/spawner/lootdrop/maintenance/New()
+ ..()
+ loot += list(/obj/item/weapon/reagent_containers/food/snacks/egg/loaded = 15, /obj/item/weapon/storage/bag/easterbasket = 15)
+
+//Easter Recipes + food
+/obj/item/weapon/reagent_containers/food/snacks/hotcrossbun
+ bitesize = 2
+ name = "hot-cross bun"
+ desc = "The Cross represents the Assistants that died for your sins."
+ icon_state = "hotcrossbun"
+
+/datum/table_recipe/hotcrossbun
+ name = "Hot-Cross Bun"
+ reqs = list(
+ /obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1,
+ /datum/reagent/consumable/sugar = 1
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/hotcrossbun
+
+
+/obj/item/weapon/reagent_containers/food/snacks/store/cake/brioche
+ name = "brioche cake"
+ desc = "A ring of sweet, glazed buns."
+ icon_state = "briochecake"
+ slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/brioche
+ slices_num = 6
+ bonus_reagents = list("nutriment" = 10, "vitamin" = 2)
+
+/obj/item/weapon/reagent_containers/food/snacks/cakeslice/brioche
+ name = "brioche cake slice"
+ desc = "Delicious sweet-bread. Who needs anything else?"
+ icon_state = "briochecake_slice"
+ filling_color = "#FFD700"
+
+/datum/table_recipe/briochecake
+ name = "Brioche cake"
+ reqs = list(
+ /obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1,
+ /datum/reagent/consumable/sugar = 2
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/brioche
+
+/obj/item/weapon/reagent_containers/food/snacks/scotchegg
+ name = "scotch egg"
+ desc = "A boiled egg wrapped in a delicious, seasoned meatball."
+ icon_state = "scotchegg"
+ bonus_reagents = list("nutriment" = 2, "vitamin" = 2)
+ bitesize = 3
+ filling_color = "#FFFFF0"
+ list_reagents = list("nutriment" = 6)
+
+/datum/table_recipe/scotchegg
+ name = "Scotch egg"
+ reqs = list(
+ /datum/reagent/consumable/sodiumchloride = 1,
+ /datum/reagent/consumable/blackpepper = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/boiledegg = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/faggot = 1
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/scotchegg
+
+/obj/item/weapon/reagent_containers/food/snacks/soup/mammi
+ name = "Mämmi"
+ desc = "A bowl of mushy bread and milk. It reminds you, not too fondly, of a bowel movement."
+ icon_state = "mammi"
+ bonus_reagents = list("nutriment" = 3, "vitamin" = 1)
+ list_reagents = list("nutriment" = 8, "vitamin" = 1)
+
+/datum/table_recipe/mammi
+ name = "Mämmi"
+ reqs = list(
+ /obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 1,
+ /datum/reagent/consumable/milk = 5
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/soup/mammi
+
+/obj/item/weapon/reagent_containers/food/snacks/chocolatebunny
+ name = "chocolate bunny"
+ desc = "Contains less than 10% real rabbit!"
+ icon_state = "chocolatebunny"
+ bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
+ list_reagents = list("nutriment" = 4, "sugar" = 2, "cocoa" = 2)
+ filling_color = "#A0522D"
+
+/datum/table_recipe/chocolatebunny
+ name = "Chocolate bunny"
+ reqs = list(
+ /datum/reagent/consumable/sugar = 2,
+ /obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 1
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/chocolatebunny
diff --git a/code/modules/holiday/halloween.dm b/code/modules/holiday/halloween.dm
index 8850b6e3f4d..1f74c911de0 100644
--- a/code/modules/holiday/halloween.dm
+++ b/code/modules/holiday/halloween.dm
@@ -234,8 +234,6 @@
maxHealth = 1e6
health = 1e6
emote_see = list("silently stares")
- heat_damage_per_tick = 0
- cold_damage_per_tick = 0
unsuitable_atmos_damage = 0
var/timer
@@ -288,3 +286,6 @@
visible_message("[src] seems to be resisting the effect!")
else
..()
+
+/mob/living/simple_animal/hostile/retaliate/clown/insane/handle_temperature_damage()
+ return
\ No newline at end of file
diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm
new file mode 100644
index 00000000000..50190ce4e67
--- /dev/null
+++ b/code/modules/holiday/holidays.dm
@@ -0,0 +1,316 @@
+/datum/holiday
+ var/name = "Bugsgiving"
+ //Right now, only holidays that take place on a certain day or within a time period are supported
+ //It would be nice to support things like "the second monday in march" or "the first sunday after the second sunday in june"
+ var/begin_day = 1
+ var/begin_month = 0
+ var/end_day = 0 // Default of 0 means the holiday lasts a single day
+ var/end_month = 0
+
+// This proc gets run before the game starts when the holiday is activated. Do festive shit here.
+/datum/holiday/proc/celebrate()
+
+// When the round starts, this proc is ran to get a text message to display to everyone to wish them a happy holiday
+/datum/holiday/proc/greet()
+ return "Have a happy [name]!"
+
+// Returns special prefixes for the station name on certain days. You wind up with names like "Christmas Object Epsilon". See new_station_name()
+/datum/holiday/proc/getStationPrefix()
+ //get the first word of the Holiday and use that
+ var/i = findtext(name," ",1,0)
+ return copytext(name,1,i)
+
+// Return 1 if this holidy should be celebrated today
+/datum/holiday/proc/shouldCelebrate(dd, mm, yy)
+ if(!end_day)
+ end_day = begin_day
+ if(!end_month)
+ end_month = begin_month
+
+ if(end_month > begin_month) //holiday spans multiple months in one year
+ if(mm == end_month) //in final month
+ if(dd <= end_day)
+ return 1
+
+ else if(mm == begin_month)//in first month
+ if(dd >= begin_day)
+ return 1
+
+ else if(mm in begin_month to end_month) //holiday spans 3+ months and we're in the middle, day doesn't matter at all
+ return 1
+
+ else if(end_month == begin_month) // starts and stops in same month, simplest case
+ if(mm == begin_month && (dd in begin_day to end_day))
+ return 1
+
+ else // starts in one year, ends in the next
+ if(mm >= begin_month && dd >= begin_day) // Holiday ends next year
+ return 1
+ if(mm <= end_month && dd <= end_day) // Holiday started last year
+ return 1
+
+ return 0
+
+// The actual holidays
+
+/datum/holiday/new_year
+ name = NEW_YEAR
+ begin_day = 30 // 1 day early
+ begin_month = DECEMBER
+ end_day = 5 //4 days extra
+ end_month = JANUARY
+
+/datum/holiday/groundhog
+ name = "Groundhog Day"
+ begin_day = 2
+ begin_month = FEBRUARY
+
+/datum/holiday/valentines
+ name = VALENTINES
+ begin_day = 9 //6 days early
+ begin_month = FEBRUARY
+ end_day = 15 //1 day extra
+
+/datum/holiday/random_kindness
+ name = "Random Acts of Kindness Day"
+ begin_day = 17
+ begin_month = FEBRUARY
+
+/datum/holiday/random_kindness/greet()
+ return "Go do some random acts of kindness for a stranger!" //haha yeah right
+
+/datum/holiday/pi
+ name = "Pi Day"
+ begin_day = 14
+ begin_month = MARCH
+
+/datum/holiday/no_this_is_patrick
+ name = "St. Patrick's Day"
+ begin_day = 17
+ begin_month = MARCH
+
+/datum/holiday/april_fools
+ name = APRIL_FOOLS
+ begin_day = 1
+ begin_month = APRIL
+ end_day = 8 //7 days extra so everyone can enjoy the festivities
+
+/datum/holiday/fourtwenty
+ name = "Four-Twenty"
+ begin_day = 20
+ begin_month = APRIL
+
+/datum/holiday/earth
+ name = "Earth Day"
+ begin_day = 22
+ begin_month = APRIL
+
+/datum/holiday/labor
+ name = "Labor Day"
+ begin_day = 1
+ begin_month = MAY
+
+/datum/holiday/firefighter
+ name = "Firefighter's Day"
+ begin_day = 4
+ begin_month = MAY
+
+// No holidays in June :'(
+
+/datum/holiday/doctor
+ name = "Doctor's Day"
+ begin_day = 1
+ begin_month = JULY
+
+/datum/holiday/UFO
+ name = "UFO Day"
+ begin_day = 2
+ begin_month = JULY
+
+/datum/holiday/writer
+ name = "Writer's Day"
+ begin_day = 8
+ begin_month = JULY
+
+/datum/holiday/friendship
+ name = "Friendship Day"
+ begin_day = 30
+ begin_month = JULY
+
+/datum/holiday/friendship/greet()
+ return "Have a magical [name]!"
+
+/datum/holiday/beer
+ name = "Beer Day"
+ begin_day = 5
+ begin_month = AUGUST
+
+/datum/holiday/pirate
+ name = "Talk-Like-a-Pirate Day"
+ begin_day = 19
+ begin_month = SEPTEMBER
+
+/datum/holiday/pirate/greet()
+ return "Ye be talkin' like a pirate today or else ye'r walkin' tha plank, matey!"
+
+/datum/holiday/questions
+ name = "Stupid-Questions Day"
+ begin_day = 28
+ begin_month = SEPTEMBER
+
+/datum/holiday/questions/greet()
+ return "Are you having a happy [name]?"
+
+/datum/holiday/animal
+ name = "Animal's Day"
+ begin_day = 4
+ begin_month = OCTOBER
+
+/datum/holiday/smile
+ name = "Smiling Day"
+ begin_day = 7
+ begin_month = OCTOBER
+
+/datum/holiday/boss
+ name = "Boss' Day"
+ begin_day = 16
+ begin_month = OCTOBER
+
+/datum/holiday/halloween
+ name = HALLOWEEN
+ begin_day = 24 //7 days early
+ begin_month = OCTOBER
+ end_day = 7 //7 days extra
+ end_month = NOVEMBER
+
+/datum/holiday/halloween/greet()
+ return "Have a spooky Halloween!"
+
+/datum/holiday/vegan
+ name = "Vegan Day"
+ begin_day = 1
+ begin_month = NOVEMBER
+
+/datum/holiday/kindness
+ name = "Kindness Day"
+ begin_day = 13
+ begin_month = NOVEMBER
+
+/datum/holiday/flowers
+ name = "Flowers Day"
+ begin_day = 19
+ begin_month = NOVEMBER
+
+/datum/holiday/hello
+ name = "Saying-'Hello' Day"
+ begin_day = 21
+ begin_month = NOVEMBER
+
+/datum/holiday/hello/greet()
+ return "[pick(list("Aloha", "Bonjour", "Hello", "Hi", "Greetings", "Salutations", "Bienvenidos", "Hola", "Howdy"))]! " + ..()
+
+/datum/holiday/human_rights
+ name = "Human-Rights Day"
+ begin_day = 10
+ begin_month = DECEMBER
+
+/datum/holiday/monkey
+ name = "Monkey Day"
+ begin_day = 14
+ begin_month = DECEMBER
+
+/datum/holiday/xmas
+ name = CHRISTMAS
+ begin_day = 18 //7 days early
+ begin_month = DECEMBER
+ end_day = 8 //14 days extra, christmas is important
+ end_month = JANUARY
+
+/datum/holiday/xmas/greet()
+ return "Have a merry Christmas!"
+
+/datum/holiday/boxing
+ name = "Boxing Day"
+ begin_day = 26
+ begin_month = DECEMBER
+
+/datum/holiday/friday_thirteenth
+ name = "Friday the 13th"
+
+/datum/holiday/friday_thirteenth/shouldCelebrate(dd, mm, yy)
+ if(dd == 13)
+ if(time2text(world.timeofday, "DDD") == "Fri")
+ return 1
+ return 0
+
+/datum/holiday/friday_thirteenth/getStationPrefix()
+ return pick("Mike","Friday","Evil","Myers","Murder","Deathly","Stabby")
+
+/datum/holiday/easter
+ name = EASTER
+ var/const/days_early = 1 //to make editing the holiday easier
+ var/const/days_extra = 6
+
+/datum/holiday/easter/shouldCelebrate(dd, mm, yy)
+// Easter's celebration day is as snowflakey as Uhangi's code
+
+ if(!begin_month)
+
+ var/yy_string = "[yy]"
+// year = days after March 22that Easter falls on that year.
+// For 2015 Easter is on April 5th, so 2015 = 14 since the 5th is 14 days past the 22nd
+// If it's 2040 and this is still in use, invent a time machine and teach me a better way to do this. Also tell us about HL3.
+ var/list/easters = list(
+ "15" = 14,\
+ "16" = 6,\
+ "17" = 25,\
+ "18" = 10,\
+ "19" = 30,\
+ "20" = 22,\
+ "21" = 13,\
+ "22" = 26,\
+ "23" = 18,\
+ "24" = 9,\
+ "25" = 29,\
+ "26" = 14,\
+ "27" = 6,\
+ "28" = 25,\
+ "29" = 10,\
+ "30" = 30,\
+ "31" = 23,\
+ "32" = 6,\
+ "33" = 26,\
+ "34" = 18,\
+ "35" = 3,\
+ "36" = 22,\
+ "37" = 14,\
+ "38" = 34,\
+ "39" = 19,\
+ "40" = 9,\
+ )
+
+ begin_day = easters[yy_string]
+ if(begin_day <= 9)
+ begin_day += 22
+ begin_month = MARCH
+ else
+ begin_day -= 9
+ begin_month = APRIL
+
+ end_day = begin_day + days_extra
+ end_month = begin_month
+ if(end_day >= 32 && end_month == MARCH) //begins in march, ends in april
+ end_day -= 31
+ end_month++
+ if(end_day >= 31 && end_month == APRIL) //begins in april, ends in june
+ end_day -= 30
+ end_month++
+
+ begin_day -= days_early
+ if(begin_day <= 0)
+ if(begin_month == APRIL)
+ begin_day += 31
+ begin_month-- //begins in march, ends in april
+
+// world << "Easter calculates to be on [begin_day] of [begin_month] ([days_early] early) to [end_day] of [end_month] ([days_extra] extra) for 20[yy]"
+ return ..()
\ No newline at end of file
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 7294b806112..d3a74ed88be 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -405,7 +405,8 @@ obj/machinery/hydroponics/proc/mutatepest()
obj/machinery/hydroponics/proc/applyChemicals(var/datum/reagents/S)
- myseed.on_chem_reaction(S) //In case seeds have some special interactions with special chems, currently only used by vines
+ if(myseed)
+ myseed.on_chem_reaction(S) //In case seeds have some special interactions with special chems, currently only used by vines
// Requires 5 mutagen to possibly change species.// Poor man's mutagen.
if(S.has_reagent("mutagen", 5) || S.has_reagent("radium", 10) || S.has_reagent("uranium", 10))
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 4c42141cd91..56c309a95fc 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -577,7 +577,7 @@
potency = 15
oneharvest = 1
plant_type = 0
- growthstages = 6
+ growthstages = 3
/obj/item/seeds/carrotseed
name = "pack of carrot seeds"
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index aaba77bd9e0..2bc127de6db 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -164,7 +164,7 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book
verb_say = "beeps"
verb_ask = "beeps"
- verb_yell = "beeps"
+ verb_exclaim = "beeps"
var/buffer_book
var/buffer_mob
var/upload_category = "Fiction"
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index ecd272300fb..94378c89ecb 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -244,6 +244,7 @@
new /datum/data/mining_equipment("GAR mesons", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 750),
new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 800),
+ new /datum/data/mining_equipment("Plasma Cutter", /obj/item/weapon/gun/energy/plasmacutter/charged, 950),
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000),
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 1200),
new /datum/data/mining_equipment("Jetpack", /obj/item/weapon/tank/jetpack/carbondioxide/mining, 1500),
@@ -344,7 +345,7 @@
..()
/obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/weapon/mining_voucher/voucher, mob/redeemer)
- var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in list("Mining Drill", "Kinetic Accelerator", "Resonator", "Mining Drone", "Advanced Scanner")
+ var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in list("Mining Drill", "Kinetic Accelerator", "Plasma Cutter", "Resonator", "Mining Drone", "Advanced Scanner")
if(!selection || !Adjacent(redeemer) || voucher.gc_destroyed || voucher.loc != redeemer)
return
switch(selection)
@@ -354,6 +355,8 @@
if("Kinetic Accelerator")
new /obj/item/weapon/gun/energy/kinetic_accelerator(src.loc)
new /obj/item/weapon/screwdriver(src.loc)
+ if("Plasma Cutter")
+ new /obj/item/weapon/gun/energy/plasmacutter/charged(src.loc)
if("Resonator")
new /obj/item/weapon/resonator(src.loc)
new /obj/item/weapon/screwdriver(src.loc)
@@ -378,7 +381,7 @@
/obj/item/weapon/mining_voucher
name = "mining voucher"
desc = "A token to redeem a piece of equipment. Use it on a mining equipment vendor."
- icon = 'icons/obj/items.dmi'
+ icon = 'icons/obj/mining.dmi'
icon_state = "mining_voucher"
w_class = 1
@@ -410,7 +413,7 @@
/obj/item/device/wormhole_jaunter
name = "wormhole jaunter"
desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to blue space for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least."
- icon = 'icons/obj/items.dmi'
+ icon = 'icons/obj/mining.dmi'
icon_state = "Jaunter"
item_state = "electronic"
throwforce = 0
@@ -470,7 +473,7 @@
/obj/item/weapon/resonator
name = "resonator"
- icon = 'icons/obj/items.dmi'
+ icon = 'icons/obj/mining.dmi'
icon_state = "resonator"
item_state = "resonator"
desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in a vacuum."
@@ -582,14 +585,7 @@
mouse_opacity = 1
faction = list("neutral")
a_intent = "harm"
- min_oxy = 0
- max_oxy = 0
- min_tox = 0
- max_tox = 0
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
wander = 0
idle_vision_range = 5
@@ -631,7 +627,7 @@
return
..()
-/mob/living/simple_animal/hostile/mining_drone/Die()
+/mob/living/simple_animal/hostile/mining_drone/death()
..()
visible_message("[src] is destroyed!")
new /obj/effect/decal/cleanable/robot_debris(src.loc)
@@ -790,7 +786,7 @@
else
for(M in L)
var/turf/T = get_turf(M)
- var/image/I = image('icons/turf/walls.dmi', loc = T, icon_state = M.scan_state, layer = 18)
+ var/image/I = image('icons/turf/mining.dmi', loc = T, icon_state = M.scan_state, layer = 18)
C.images += I
spawn(30)
if(C)
@@ -818,7 +814,7 @@
/obj/item/device/t_scanner/adv_mining_scanner/scan()
if(!cooldown)
cooldown = 1
- spawn(60)
+ spawn(35)
cooldown = 0
var/turf/t = get_turf(src)
var/list/mobs = recursive_mob_check(t, 1,0,0)
@@ -835,7 +831,7 @@
var/client/C = user.client
for(M in L)
var/turf/T = get_turf(M)
- var/image/I = image('icons/turf/walls.dmi', loc = T, icon_state = M.scan_state, layer = 18)
+ var/image/I = image('icons/turf/mining.dmi', loc = T, icon_state = M.scan_state, layer = 18)
C.images += I
spawn(30)
if(C)
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index fffb61016e5..ea456b180fb 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -50,7 +50,7 @@
/obj/item/weapon/pickaxe
name = "pickaxe"
- icon = 'icons/obj/items.dmi'
+ icon = 'icons/obj/mining.dmi'
icon_state = "pickaxe"
flags = CONDUCT
slot_flags = SLOT_BELT
@@ -79,12 +79,12 @@
name = "mining drill"
icon_state = "handdrill"
item_state = "jackhammer"
- digspeed = 30 //available from roundstart, faster than a pickaxe but needs recharging or cell replacements
+ digspeed = 25 //available from roundstart, faster than a pickaxe but needs recharging or cell replacements
digsound = list('sound/weapons/drill.ogg')
hitsound = 'sound/weapons/drill.ogg'
origin_tech = "materials=2;powerstorage=3;engineering=2"
desc = "An electric mining drill for the especially scrawny."
- var/drillcost = 125 //80 mineral walls by default
+ var/drillcost = 50 //80 mineral walls by default
var/obj/item/weapon/stock_parts/cell/high/bcell = null
/obj/item/weapon/pickaxe/drill/New() //this one starts with a cell pre-installed.
@@ -134,42 +134,28 @@
/obj/item/weapon/pickaxe/drill/diamonddrill
name = "diamond-tipped mining drill"
icon_state = "diamonddrill"
- digspeed = 10 //it's a fast drill with a relatively low power cost. what more could you ask for?
+ digspeed = 8 //it's a fast drill with a relatively low power cost. what more could you ask for?
origin_tech = "materials=6;powerstorage=4;engineering=5"
desc = "Yours is the drill that will pierce the heavens!"
- drillcost = 150 //66 mineral walls by default, but very quickly
+ drillcost = 75 //66 mineral walls by default, but very quickly
/obj/item/weapon/pickaxe/drill/jackhammer
name = "sonic jackhammer"
icon_state = "jackhammer"
item_state = "jackhammer"
- digspeed = 5 //the epitome of powertools. high power consumption, extremely fast mining, laughs at puny walls
+ digspeed = 4 //the epitome of powertools. high power consumption, extremely fast mining, laughs at puny walls
origin_tech = "materials=3;powerstorage=2;engineering=2"
digsound = list('sound/weapons/sonic_jackhammer.ogg')
hitsound = 'sound/weapons/sonic_jackhammer.ogg'
- desc = "Cracks rocks with sonic blasts, and doubles as a demolition power tool for smashing walls.."
- drillcost = 200
-
-/obj/item/weapon/pickaxe/plasmacutter
- name = "plasma cutter"
- icon_state = "plasmacutter"
- item_state = "gun"
- w_class = 3 //it is smaller than the pickaxe
- damtype = "fire"
- throwforce = 8
- digspeed = 30 //Mines slightly faster than a normal pickaxe, but doubles as an unlimited-ammo welding tool in some cases such as wall deconstruction
- digsound = list('sound/weapons/plasma_cutter.ogg')
- hitsound = 'sound/weapons/plasma_cutter.ogg'
- origin_tech = "materials=4;plasmatech=3;engineering=3"
- desc = "A rock cutter that uses bursts of hot plasma. You could use it to cut limbs off of xenos! Or, you know, mine stuff."
-
+ desc = "Cracks rocks with sonic blasts, and doubles as a demolition power tool for smashing walls."
+ drillcost = 100
/*****************************Shovel********************************/
/obj/item/weapon/shovel
name = "shovel"
desc = "A large tool for digging and moving dirt."
- icon = 'icons/obj/items.dmi'
+ icon = 'icons/obj/mining.dmi'
icon_state = "shovel"
flags = CONDUCT
slot_flags = SLOT_BELT
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 38afd36308c..4cb58dc6994 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -2,7 +2,7 @@
/turf/simulated/mineral //wall piece
name = "rock"
- icon = 'icons/turf/walls.dmi'
+ icon = 'icons/turf/mining.dmi'
icon_state = "rock_nochance"
oxygen = 0
nitrogen = 0
@@ -10,7 +10,7 @@
density = 1
blocks_air = 1
temperature = TCMB
- var/mineralName = ""
+ var/mineralType = null
var/mineralAmt = 3
var/spread = 0 //will the seam spread?
var/spreadChance = 0 //the percentual chance of an ore spreading to the neighbouring tiles
@@ -38,21 +38,21 @@
if((istype(get_step(src, NORTH), /turf/simulated/floor)) || (istype(get_step(src, NORTH), /turf/space)) || (istype(get_step(src, NORTH), /turf/simulated/shuttle/floor)))
T = get_step(src, NORTH)
if (T)
- T.overlays += image('icons/turf/walls.dmi', "rock_side_s")
+ T.overlays += image('icons/turf/mining.dmi', "rock_side_s")
if((istype(get_step(src, SOUTH), /turf/simulated/floor)) || (istype(get_step(src, SOUTH), /turf/space)) || (istype(get_step(src, SOUTH), /turf/simulated/shuttle/floor)))
T = get_step(src, SOUTH)
if (T)
- T.overlays += image('icons/turf/walls.dmi', "rock_side_n", layer=6)
+ T.overlays += image('icons/turf/mining.dmi', "rock_side_n", layer=6)
if((istype(get_step(src, EAST), /turf/simulated/floor)) || (istype(get_step(src, EAST), /turf/space)) || (istype(get_step(src, EAST), /turf/simulated/shuttle/floor)))
T = get_step(src, EAST)
if (T)
- T.overlays += image('icons/turf/walls.dmi', "rock_side_w", layer=6)
+ T.overlays += image('icons/turf/mining.dmi', "rock_side_w", layer=6)
if((istype(get_step(src, WEST), /turf/simulated/floor)) || (istype(get_step(src, WEST), /turf/space)) || (istype(get_step(src, WEST), /turf/simulated/shuttle/floor)))
T = get_step(src, WEST)
if (T)
- T.overlays += image('icons/turf/walls.dmi', "rock_side_e", layer=6)
+ T.overlays += image('icons/turf/mining.dmi', "rock_side_e", layer=6)
- if (mineralName && mineralAmt && spread && spreadChance)
+ if (mineralType && mineralAmt && spread && spreadChance)
for(var/dir in cardinal)
if(prob(spreadChance))
var/turf/T = get_step(src, dir)
@@ -73,7 +73,12 @@
/turf/simulated/mineral/random
name = "mineral deposit"
icon_state = "rock"
- var/mineralSpawnChanceList = list("Uranium" = 5, "Diamond" = 1, "Gold" = 10, "Silver" = 12, "Plasma" = 20, "Iron" = 40, "Gibtonite" = 4/*, "Adamantine" =5*/, "Cave" = 2)//Currently, Adamantine won't spawn as it has no uses. -Durandan
+ var/mineralSpawnChanceList = list(
+ "Uranium" = 5, "Diamond" = 1, "Gold" = 10,
+ "Silver" = 12, "Plasma" = 20, "Iron" = 40,
+ "Gibtonite" = 4, "Cave" = 2, "BScrystal" = 1,
+ /*, "Adamantine" =5*/)
+ //Currently, Adamantine won't spawn as it has no uses. -Durandan
var/mineralChance = 13
/turf/simulated/mineral/random/New()
@@ -102,6 +107,8 @@
M = new/turf/simulated/mineral/gibtonite(src)
if("Bananium")
M = new/turf/simulated/mineral/clown(src)
+ if("BScrystal")
+ M = new/turf/simulated/mineral/bscrystal(src)
/*if("Adamantine")
M = new/turf/simulated/mineral/adamantine(src)*/
if(M)
@@ -112,7 +119,10 @@
/turf/simulated/mineral/random/high_chance
icon_state = "rock_highchance"
mineralChance = 25
- mineralSpawnChanceList = list("Uranium" = 35, "Diamond" = 30, "Gold" = 45, "Silver" = 50, "Plasma" = 50)
+ mineralSpawnChanceList = list(
+ "Uranium" = 35, "Diamond" = 30,
+ "Gold" = 45, "Silver" = 50, "Plasma" = 50,
+ "BScrystal" = 20)
/turf/simulated/mineral/random/high_chance/New()
icon_state = "rock"
@@ -121,31 +131,34 @@
/turf/simulated/mineral/random/low_chance
icon_state = "rock_lowchance"
mineralChance = 6
- mineralSpawnChanceList = list("Uranium" = 2, "Diamond" = 1, "Gold" = 4, "Silver" = 6, "Plasma" = 15, "Iron" = 40, "Gibtonite" = 2)
+ mineralSpawnChanceList = list(
+ "Uranium" = 2, "Diamond" = 1, "Gold" = 4,
+ "Silver" = 6, "Plasma" = 15, "Iron" = 40,
+ "Gibtonite" = 2, "BScrystal" = 1)
/turf/simulated/mineral/random/low_chance/New()
icon_state = "rock"
..()
+/turf/simulated/mineral/iron
+ name = "iron deposit"
+ icon_state = "rock_Iron"
+ mineralType = /obj/item/weapon/ore/iron
+ spreadChance = 20
+ spread = 1
+ hidden = 0
+
/turf/simulated/mineral/uranium
name = "uranium deposit"
- mineralName = "Uranium"
+ mineralType = /obj/item/weapon/ore/uranium
spreadChance = 5
spread = 1
hidden = 1
scan_state = "rock_Uranium"
-/turf/simulated/mineral/iron
- name = "iron deposit"
- icon_state = "rock_Iron"
- mineralName = "Iron"
- spreadChance = 20
- spread = 1
- hidden = 0
-
/turf/simulated/mineral/diamond
name = "diamond deposit"
- mineralName = "Diamond"
+ mineralType = /obj/item/weapon/ore/diamond
spreadChance = 0
spread = 1
hidden = 1
@@ -153,7 +166,7 @@
/turf/simulated/mineral/gold
name = "gold deposit"
- mineralName = "Gold"
+ mineralType = /obj/item/weapon/ore/gold
spreadChance = 5
spread = 1
hidden = 1
@@ -161,7 +174,7 @@
/turf/simulated/mineral/silver
name = "silver deposit"
- mineralName = "Silver"
+ mineralType = /obj/item/weapon/ore/silver
spreadChance = 5
spread = 1
hidden = 1
@@ -170,7 +183,7 @@
/turf/simulated/mineral/plasma
name = "plasma deposit"
icon_state = "rock_Plasma"
- mineralName = "Plasma"
+ mineralType = /obj/item/weapon/ore/plasma
spreadChance = 8
spread = 1
hidden = 1
@@ -179,17 +192,26 @@
/turf/simulated/mineral/clown
name = "bananium deposit"
icon_state = "rock_Clown"
- mineralName = "Bananium"
+ mineralType = /obj/item/weapon/ore/bananium
mineralAmt = 3
spreadChance = 0
spread = 0
hidden = 0
+/turf/simulated/mineral/bscrystal
+ name = "bluespace crystal deposit"
+ icon_state = "rock_BScrystal"
+ mineralType = /obj/item/bluespace_crystal
+ mineralAmt = 1
+ spreadChance = 0
+ spread = 0
+ hidden = 1
+ scan_state = "rock_BScrystal"
+
////////////////////////////////Gibtonite
/turf/simulated/mineral/gibtonite
name = "gibtonite deposit"
icon_state = "rock_Gibtonite"
- mineralName = "Gibtonite"
mineralAmt = 1
spreadChance = 0
spread = 0
@@ -419,23 +441,10 @@
return
/turf/simulated/mineral/proc/gets_drilled()
- if ((src.mineralName != "") && (src.mineralAmt > 0) && (src.mineralAmt < 11))
+ if (mineralType && (src.mineralAmt > 0) && (src.mineralAmt < 11))
var/i
for (i=0;i[user] attaches [I] to [src]!")
+ wires = new(src)
+ attacher = key_name(user)
+ qdel(I)
+ overlays += "Gibtonite_igniter"
+ return
+
+ if(wires && !primed)
+ if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler))
+ wires.Interact(user)
+ return
+
+ if(istype(I, /obj/item/weapon/pickaxe) || istype(I, /obj/item/weapon/resonator) || I.force >= 10)
GibtoniteReaction(user)
return
- if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner) && primed)
- primed = 0
- user.visible_message("The chain reaction was stopped! ...The ore's quality went down.")
- icon_state = "Gibtonite ore"
- quality = 1
- return
+ if(primed)
+ if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner) || istype(I, /obj/item/device/multitool))
+ primed = 0
+ user.visible_message("The chain reaction was stopped! ...The ore's quality went down.")
+ icon_state = "Gibtonite ore"
+ quality = 1
+ return
..()
+/obj/item/weapon/twohanded/required/gibtonite/attack_self(user)
+ if(wires)
+ wires.Interact(user)
+ else
+ ..()
+
/obj/item/weapon/twohanded/required/gibtonite/bullet_act(var/obj/item/projectile/P)
- if(istype(P, /obj/item/projectile/kinetic))
- GibtoniteReaction(P.firer)
+ GibtoniteReaction(P.firer)
..()
/obj/item/weapon/twohanded/required/gibtonite/ex_act()
GibtoniteReaction(null, 1)
-/obj/item/weapon/twohanded/required/gibtonite/proc/GibtoniteReaction(mob/user, triggered_by_explosive = 0)
+
+
+/obj/item/weapon/twohanded/required/gibtonite/proc/GibtoniteReaction(mob/user, triggered_by = 0)
if(!primed)
playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,1)
primed = 1
@@ -149,13 +172,18 @@
var/notify_admins = 0
if(z != 5)//Only annoy the admins ingame if we're triggered off the mining zlevel
notify_admins = 1
+
if(notify_admins)
- if(triggered_by_explosive)
+ if(triggered_by == 1)
message_admins("An explosion has triggered a [name] to detonate at [A.name] (JMP).")
+ else if(triggered_by == 2)
+ message_admins("A signal has triggered a [name] to detonate at [A.name] (JMP). Igniter attacher: [attacher]")
else
message_admins("[key_name(user)]? has triggered a [name] to detonate at [A.name] (JMP).")
- if(triggered_by_explosive)
+ if(triggered_by == 1)
log_game("An explosion has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
+ else if(triggered_by == 2)
+ log_game("A signal has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z]). Igniter attacher: [attacher].")
else
user.visible_message("[user] strikes \the [src], causing a chain reaction!")
log_game("[key_name(user)] has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
diff --git a/code/modules/mob/interactive.dm b/code/modules/mob/interactive.dm
index c7d0cd73725..cd7dd65d019 100644
--- a/code/modules/mob/interactive.dm
+++ b/code/modules/mob/interactive.dm
@@ -1,24 +1,3 @@
-#define INTERACTING 2
-#define TRAVEL 4
-#define FIGHTING 8
-
-//TRAITS
-
-#define TRAIT_ROBUST 2
-#define TRAIT_UNROBUST 4
-#define TRAIT_SMART 8
-#define TRAIT_DUMB 16
-#define TRAIT_MEAN 32
-#define TRAIT_FRIENDLY 64
-#define TRAIT_THIEVING 128
-
-//defines
-#define MAX_RANGE_FIND 32
-#define MIN_RANGE_FIND 16
-#define FUZZY_CHANCE_HIGH 85
-#define FUZZY_CHANCE_LOW 50
-#define CHANCE_TALK 15
-
/*
NPC VAR EXPLANATIONS (for modules and other things)
@@ -69,6 +48,7 @@
var/obj/item/other_hand
var/TRAITS = 0
var/datum/job/myjob
+ faction = list("station")
//trait vars
var/robustness = 50
var/smartness = 50
@@ -79,6 +59,31 @@
//modules
var/list/functions = list("nearbyscan","combat","doorscan","shitcurity","chatter")
+//botPool funcs
+/mob/living/carbon/human/interactive/proc/takeDelegate(var/mob/living/carbon/human/interactive/from,var/doReset=TRUE)
+ eye_color = "red"
+ if(from == src)
+ return FALSE
+ TARGET = from.TARGET
+ LAST_TARGET = from.LAST_TARGET
+ retal = from.retal
+ retal_target = from.retal_target
+ doing = from.doing
+ //
+ timeout = 0
+ inactivity_period = 0
+ interest = 100
+ //
+ if(doReset)
+ from.TARGET = null
+ from.LAST_TARGET = null
+ from.retal = 0
+ from.retal_target = null
+ from.doing = 0
+ return TRUE
+
+//end pool funcs
+
/mob/living/carbon/human/interactive/proc/random()
//this is here because this has no client/prefs/brain whatever.
underwear = random_underwear(gender)
@@ -87,7 +92,7 @@
facial_hair_style = random_facial_hair_style(gender)
hair_color = random_short_color()
facial_hair_color = hair_color
- eye_color = random_eye_color()
+ eye_color = "blue"
age = rand(AGE_MIN,AGE_MAX)
ready_dna(src,random_blood_type())
//job handling
@@ -106,6 +111,12 @@
retal = 1
retal_target = user
+/mob/living/carbon/human/interactive/bullet_act(var/obj/item/projectile/P)
+ var/potentialAssault = locate(/mob/living) in view(2,P.starting)
+ if(potentialAssault)
+ attacked_by(P,potentialAssault)
+ ..()
+
/mob/living/carbon/human/interactive/New()
..()
gender = pick(MALE,FEMALE)
@@ -133,29 +144,29 @@
//arms
if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
var/obj/item/organ/limb/r_arm/R = locate(/obj/item/organ/limb/r_arm) in organs
- del(R)
+ qdel(R)
organs += new /obj/item/organ/limb/robot/r_arm
else
var/obj/item/organ/limb/l_arm/L = locate(/obj/item/organ/limb/l_arm) in organs
- del(L)
+ qdel(L)
organs += new /obj/item/organ/limb/robot/l_arm
//legs
if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
var/obj/item/organ/limb/r_leg/R = locate(/obj/item/organ/limb/r_leg) in organs
- del(R)
+ qdel(R)
organs += new /obj/item/organ/limb/robot/r_leg
else
var/obj/item/organ/limb/l_leg/L = locate(/obj/item/organ/limb/l_leg) in organs
- del(L)
+ qdel(L)
organs += new /obj/item/organ/limb/robot/l_leg
//chest and head
if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
var/obj/item/organ/limb/chest/R = locate(/obj/item/organ/limb/chest) in organs
- del(R)
+ qdel(R)
organs += new /obj/item/organ/limb/robot/chest
else
var/obj/item/organ/limb/head/L = locate(/obj/item/organ/limb/head) in organs
- del(L)
+ qdel(L)
organs += new /obj/item/organ/limb/robot/head
for(var/obj/item/organ/limb/LIMB in organs)
LIMB.owner = src
@@ -220,10 +231,10 @@
toReturn = "Excited"
return toReturn
//END DEBUG
-/mob/living/carbon/human/interactive/proc/isnotfunc()
+/mob/living/carbon/human/interactive/proc/isnotfunc(var/checkDead = TRUE)
if(!canmove)
return 1
- if(health <= 0)
+ if(health <= 0 && checkDead)
return 1
if(restrained())
return 1
@@ -634,12 +645,14 @@
New()
TRAITS |= TRAIT_ROBUST
TRAITS |= TRAIT_MEAN
+ faction = list("bot_angry")
..()
/mob/living/carbon/human/interactive/friendly
New()
TRAITS |= TRAIT_FRIENDLY
TRAITS |= TRAIT_UNROBUST
+ faction = list("bot_friendly")
..()
/mob/living/carbon/human/interactive/greytide
@@ -648,16 +661,6 @@
TRAITS |= TRAIT_MEAN
TRAITS |= TRAIT_THIEVING
TRAITS |= TRAIT_DUMB
+ faction = list("bot_grey")
graytide = 1
- ..()
-
-#undef INTERACTING
-#undef TRAVEL
-#undef FIGHTING
-#undef TRAIT_ROBUST
-#undef TRAIT_UNROBUST
-#undef TRAIT_SMART
-#undef TRAIT_DUMB
-#undef TRAIT_MEAN
-#undef TRAIT_FRIENDLY
-#undef TRAIT_THIEVING
\ No newline at end of file
+ ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 6bff22c7fab..da83251d5ce 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -185,7 +185,7 @@ Des: Gives the client of the alien an image on each infected mob.
if (client)
for (var/mob/living/C in mob_list)
if(C.status_flags & XENO_HOST)
- var/obj/item/alien_embryo/A = locate() in C
+ var/obj/item/body_egg/alien_embryo/A = locate() in C
var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[A.stage]")
client.images += I
return
diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm
index bb032d309ef..51e086ae669 100644
--- a/code/modules/mob/living/carbon/alien/alien_defense.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defense.dm
@@ -76,3 +76,11 @@ In all, this is a lot like the monkey code. /N
adjustBruteLoss(damage)
updatehealth()
+/mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M as mob)
+ if(..()) //successful slime attack
+ var/damage = rand(5, 35)
+ if(M.is_adult)
+ damage = rand(10, 40)
+ adjustBruteLoss(damage)
+ add_logs(M, src, "attacked", admin=0)
+ updatehealth()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 3734ea7ea07..337f05ebbff 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -27,16 +27,6 @@
if(l_store) l_store.emp_act(severity)
..()
-/mob/living/carbon/alien/humanoid/attack_slime(mob/living/carbon/slime/M as mob)
- ..()
- var/damage = rand(5, 35)
- if(M.is_adult)
- damage = rand(10, 40)
- adjustBruteLoss(damage)
- add_logs(M, src, "attacked", admin=0)
- updatehealth()
- return
-
/mob/living/carbon/alien/humanoid/attack_hulk(mob/living/carbon/human/user)
if(user.a_intent == "harm")
..(user, 1)
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index 9a01954a6d9..c560c3d7f3e 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -38,17 +38,6 @@
/mob/living/carbon/alien/larva/attack_ui(slot_id)
return
-/mob/living/carbon/alien/larva/attack_slime(mob/living/carbon/slime/M as mob)
-
- ..()
- var/damage = rand(5, 35)
- if(M.is_adult)
- damage = rand(20, 40)
- adjustBruteLoss(damage)
- add_logs(M, src, "attacked", admin=0)
- updatehealth()
- return
-
/mob/living/carbon/alien/larva/attack_hulk(mob/living/carbon/human/user)
if(user.a_intent == "harm")
..(user, 1)
diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm
index 6654abf55f9..4df5469296f 100644
--- a/code/modules/mob/living/carbon/alien/life.dm
+++ b/code/modules/mob/living/carbon/alien/life.dm
@@ -31,25 +31,21 @@
handle_breath_temperature(breath)
-/mob/living/carbon/alien/handle_regular_status_updates()
+/mob/living/carbon/alien/handle_status_effects()
..()
//natural reduction of movement delay due to stun.
if(move_delay_add > 0)
move_delay_add = max(0, move_delay_add - rand(1, 2))
- return 1
+/mob/living/carbon/alien/update_sight()
-/mob/living/carbon/alien/handle_vision()
-
- client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask)
-
- if (stat == 2)
+ if(stat == DEAD)
sight |= SEE_TURFS
sight |= SEE_MOBS
sight |= SEE_OBJS
see_in_dark = 8
see_invisible = SEE_INVISIBLE_LEVEL_TWO
- else if (stat != 2)
+ else
sight |= SEE_MOBS
sight &= ~SEE_TURFS
sight &= ~SEE_OBJS
@@ -62,32 +58,8 @@
if(see_override)
see_invisible = see_override
- if ((blind && stat != 2))
- if((eye_blind))
- blind.layer = 18
- else
- blind.layer = 0
-
- if (disabilities & NEARSIGHT)
- client.screen += global_hud.vimpaired
-
- if (eye_blurry)
- client.screen += global_hud.blurry
-
- if (druggy)
- client.screen += global_hud.druggy
-
- if (stat != 2)
- if(machine)
- if (!( machine.check_eye(src) ))
- reset_view(null)
- else
- if(!client.adminobs)
- reset_view(null)
-
-
/mob/living/carbon/alien/handle_hud_icons()
handle_hud_icons_health()
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
index 19d37221c19..d7c223124b6 100644
--- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
+++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
@@ -2,50 +2,11 @@
// It functions almost identically (see code/datums/diseases/alien_embryo.dm)
var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
-/obj/item/alien_embryo
+/obj/item/body_egg/alien_embryo
name = "alien embryo"
- desc = "All slimy and yuck."
- icon = 'icons/mob/alien.dmi'
- icon_state = "larva0_dead"
- var/mob/living/affected_mob
var/stage = 0
-/obj/item/alien_embryo/New()
- if(istype(loc, /mob/living))
- affected_mob = loc
- affected_mob.status_flags |= XENO_HOST
- SSobj.processing |= src
- if(istype(affected_mob,/mob/living/carbon))
- var/mob/living/carbon/H = affected_mob
- H.med_hud_set_status()
- spawn(0)
- AddInfectionImages(affected_mob)
- else
- qdel(src)
-
-/obj/item/alien_embryo/Destroy()
- if(affected_mob)
- affected_mob.status_flags &= ~(XENO_HOST)
- if(istype(affected_mob,/mob/living/carbon))
- var/mob/living/carbon/H = affected_mob
- H.med_hud_set_status()
- spawn(0)
- RemoveInfectionImages(affected_mob)
- ..()
-
-/obj/item/alien_embryo/process()
- if(!affected_mob) return
- if(loc != affected_mob)
- affected_mob.status_flags &= ~(XENO_HOST)
- SSobj.processing.Remove(src)
- if(istype(affected_mob,/mob/living/carbon))
- var/mob/living/carbon/H = affected_mob
- H.med_hud_set_status()
- spawn(0)
- RemoveInfectionImages(affected_mob)
- affected_mob = null
- return
-
+/obj/item/body_egg/alien_embryo/egg_process()
if(stage < 5 && prob(3))
stage++
spawn(0)
@@ -87,7 +48,9 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
if(prob(50))
AttemptGrow()
-/obj/item/alien_embryo/proc/AttemptGrow(var/gib_on_success = 1)
+
+
+/obj/item/body_egg/alien_embryo/proc/AttemptGrow(var/gib_on_success = 1)
var/list/candidates = get_candidates(BE_ALIEN, ALIEN_AFK_BRACKET)
var/client/C = null
@@ -123,7 +86,7 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
Proc: RefreshInfectionImage()
Des: Removes the current icons located in the infected mob adds the current stage
----------------------------------------*/
-/obj/item/alien_embryo/proc/RefreshInfectionImage()
+/obj/item/body_egg/alien_embryo/RefreshInfectionImage()
RemoveInfectionImages()
AddInfectionImages()
@@ -131,7 +94,7 @@ Des: Removes the current icons located in the infected mob adds the current stag
Proc: AddInfectionImages(C)
Des: Adds the infection image to all aliens for this embryo
----------------------------------------*/
-/obj/item/alien_embryo/proc/AddInfectionImages()
+/obj/item/body_egg/alien_embryo/AddInfectionImages()
for(var/mob/living/carbon/alien/alien in player_list)
if(alien.client)
var/I = image('icons/mob/alien.dmi', loc = affected_mob, icon_state = "infected[stage]")
@@ -141,7 +104,7 @@ Des: Adds the infection image to all aliens for this embryo
Proc: RemoveInfectionImage(C)
Des: Removes all images from the mob infected by this embryo
----------------------------------------*/
-/obj/item/alien_embryo/proc/RemoveInfectionImages()
+/obj/item/body_egg/alien_embryo/RemoveInfectionImages()
for(var/mob/living/carbon/alien/alien in player_list)
if(alien.client)
for(var/image/I in alien.client.images)
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index c30b431f3ec..a4c27b35cf4 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -115,7 +115,7 @@ var/const/MAX_ACTIVE_TIME = 400
if(loc == L) return 0
if(stat != CONSCIOUS) return 0
- if(locate(/obj/item/alien_embryo) in L) return 0
+ if(locate(/obj/item/body_egg/alien_embryo) in L) return 0
if(!sterile) L.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage
L.visible_message("[src] leaps at [L]'s face!", \
@@ -174,7 +174,7 @@ var/const/MAX_ACTIVE_TIME = 400
icon_state = "[initial(icon_state)]_impregnated"
if(!target.getlimb(/obj/item/organ/limb/robot/chest) && !(target.status_flags & XENO_HOST))
- new /obj/item/alien_embryo(target)
+ new /obj/item/body_egg/alien_embryo(target)
if(iscorgi(target))
diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm
index 0f1ef27541f..be2b01d8732 100644
--- a/code/modules/mob/living/carbon/brain/life.dm
+++ b/code/modules/mob/living/carbon/brain/life.dm
@@ -64,10 +64,7 @@
death()
eye_blind = max(eye_blind, 1)
silent = 0
- return 1
- if(health < config.health_threshold_crit)
- stat = UNCONSCIOUS
- eye_blind = max(eye_blind, 1)
+ return
else
stat = CONSCIOUS
@@ -124,8 +121,13 @@
else
eye_blind = 0
- return 1
+ return 1
+/mob/living/carbon/brain/handle_disabilities()
+ return
+
+/mob/living/carbon/brain/handle_status_effects()
+ return
/mob/living/carbon/brain/handle_regular_hud_updates()
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 244071e4a7a..22a879adae3 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -157,6 +157,8 @@
/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0)
var/damage = intensity - check_eye_prot()
if(..()) // we've been flashed
+ if(weakeyes)
+ Stun(2)
switch(damage)
if(1)
src << "Your eyes sting a little."
@@ -292,55 +294,6 @@
/mob/living/carbon/proc/canBeHandcuffed()
return 0
-/mob/living/carbon/unEquip(obj/item/I) //THIS PROC DID NOT CALL ..() AND THAT COST ME AN ENTIRE DAY OF DEBUGGING.
- . = ..() //Sets the default return value to what the parent returns.
- if(!. || !I) //We don't want to set anything to null if the parent returned 0.
- return
-
- if(I == back)
- back = null
- update_inv_back(0)
- 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
- wear_mask = null
- update_inv_wear_mask(0)
- else if(I == handcuffed)
- handcuffed = null
- if(buckled && buckled.buckle_requires_restraints)
- buckled.unbuckle_mob()
- update_inv_handcuffed(0)
- else if(I == legcuffed)
- legcuffed = null
- update_inv_legcuffed(0)
-
-
-/mob/living/carbon/proc/get_temperature(var/datum/gas_mixture/environment)
- var/loc_temp = T0C
- if(istype(loc, /obj/mecha))
- var/obj/mecha/M = loc
- loc_temp = M.return_temperature()
-
- else if(istype(loc, /obj/structure/transit_tube_pod))
- loc_temp = environment.temperature
-
- else if(istype(get_turf(src), /turf/space))
- var/turf/heat_turf = get_turf(src)
- loc_temp = heat_turf.temperature
-
- else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
- var/obj/machinery/atmospherics/unary/cryo_cell/C = loc
-
- if(C.air_contents.total_moles() < 10)
- loc_temp = environment.temperature
- else
- loc_temp = C.air_contents.temperature
-
- else
- loc_temp = environment.temperature
-
- return loc_temp
-
/mob/living/carbon/show_inv(mob/user)
user.set_machine(src)
@@ -348,6 +301,7 @@
[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"]"}
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 6e6516ccd0f..49e93256442 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -13,9 +13,9 @@
/mob/living/carbon/attackby(obj/item/I, mob/user, params)
- if(lying || isslime(src))
+ if(lying)
if(surgeries.len)
- if(user.a_intent == "help")
+ if(user != src && user.a_intent == "help")
for(var/datum/surgery/S in surgeries)
if(S.next_step(user, src))
return 1
@@ -34,7 +34,7 @@
if(D.IsSpreadByTouch())
ContractDisease(D)
- if(lying || isslime(src))
+ if(lying)
if(user.a_intent == "help")
if(surgeries.len)
for(var/datum/surgery/S in surgeries)
@@ -65,15 +65,27 @@
return 0
-/mob/living/carbon/attack_slime(mob/living/carbon/slime/M)
- if(..())
- var/power = M.powerlevel + rand(0,3)
- Weaken(power)
- if (stuttering < power)
- stuttering = power
- Stun(power)
- var/stunprob = M.powerlevel * 7 + 10
- if (prob(stunprob) && M.powerlevel >= 8)
- adjustFireLoss(M.powerlevel * rand(6,10))
- updatehealth()
+/mob/living/carbon/attack_slime(mob/living/simple_animal/slime/M)
+ if(..()) //successful slime attack
+ if(M.powerlevel > 0)
+ var/stunprob = M.powerlevel * 7 + 10 // 17 at level 1, 80 at level 10
+ if(prob(stunprob))
+ M.powerlevel -= 3
+ if(M.powerlevel < 0)
+ M.powerlevel = 0
+
+ visible_message("The [M.name] has shocked [src]!", \
+ "The [M.name] has shocked [src]!")
+
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(5, 1, src)
+ s.start()
+ var/power = M.powerlevel + rand(0,3)
+ Weaken(power)
+ if(stuttering < power)
+ stuttering = power
+ Stun(power)
+ if (prob(stunprob) && M.powerlevel >= 8)
+ adjustFireLoss(M.powerlevel * rand(6,10))
+ updatehealth()
return 1
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 7904c7cfb0f..1f96e677eaf 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -13,6 +13,7 @@
var/obj/item/back = null
var/obj/item/clothing/mask/wear_mask = null
var/obj/item/weapon/tank/internal = null
+ var/obj/item/head = null
var/datum/dna/dna = null//Carbon
var/heart_attack = 0
diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm
index deca15ff0f7..2cef64b3c89 100644
--- a/code/modules/mob/living/carbon/death.dm
+++ b/code/modules/mob/living/carbon/death.dm
@@ -1,4 +1,5 @@
/mob/living/carbon/death(gibbed)
+ silent = 0
med_hud_set_health()
med_hud_set_status()
..(gibbed)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index fe665d3686e..087e499a732 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -646,19 +646,17 @@
-/mob/living/carbon/human/help_shake_act(mob/living/carbon/human/M)
+/mob/living/carbon/human/help_shake_act(mob/living/carbon/M)
if(!istype(M))
return
- var/mob/living/carbon/human/H = src
-
if(health >= 0)
if(src == M)
visible_message( \
"[src] examines \himself.", \
"You check yourself for injuries.")
- for(var/obj/item/organ/limb/org in H.organs)
+ for(var/obj/item/organ/limb/org in organs)
var/status = ""
var/brutedamage = org.brute_dam
var/burndamage = org.burn_dam
@@ -688,9 +686,9 @@
src << "\t [status == "OK" ? "\blue" : "\red"] My [org.getDisplayName()] is [status]."
for(var/obj/item/I in org.embedded_objects)
- src << "\t \red There is \a [I] embedded in your [org.getDisplayName()]!"
+ src << "\t \red There is \a [I] embedded in your [org.getDisplayName()]!"
- if(H.blood_max)
+ if(blood_max)
src << "You are bleeding!"
if(staminaloss)
if(staminaloss > 30)
@@ -698,10 +696,10 @@
else
src << "You feel fatigued."
else
- if(H.wear_suit)
- H.wear_suit.add_fingerprint(M)
- else if(H.w_uniform)
- H.w_uniform.add_fingerprint(M)
+ if(wear_suit)
+ wear_suit.add_fingerprint(M)
+ else if(w_uniform)
+ w_uniform.add_fingerprint(M)
..()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 108d680a734..555feee5791 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -398,25 +398,21 @@ emp_act
updatehealth()
-/mob/living/carbon/human/attack_slime(mob/living/carbon/slime/M as mob)
- ..()
- var/damage = rand(1, 3)
+/mob/living/carbon/human/attack_slime(mob/living/simple_animal/slime/M as mob)
+ if(..()) //successful slime attack
+ var/damage = rand(5, 25)
+ if(M.is_adult)
+ damage = rand(10, 35)
- if(M.is_adult)
- damage = rand(10, 35)
- else
- damage = rand(5, 25)
+ if(check_shields(damage, "the [M.name]"))
+ return 0
- if(check_shields(damage, "the [M.name]"))
- return 0
+ var/dam_zone = pick("head", "chest", "l_arm", "r_arm", "l_leg", "r_leg", "groin")
- var/dam_zone = pick("head", "chest", "l_arm", "r_arm", "l_leg", "r_leg", "groin")
+ var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
+ var/armor_block = run_armor_check(affecting, "melee")
+ apply_damage(damage, BRUTE, affecting, armor_block)
- var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
- var/armor_block = run_armor_check(affecting, "melee")
- apply_damage(damage, BRUTE, affecting, armor_block)
-
- return
/mob/living/carbon/human/mech_melee_attack(obj/mecha/M)
if(M.occupant.a_intent == "harm")
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 189124770a2..df617e2c68e 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -31,7 +31,6 @@
var/obj/item/belt = null
var/obj/item/gloves = null
var/obj/item/glasses = null
- var/obj/item/head = null
var/obj/item/ears = null
var/obj/item/wear_id = null
var/obj/item/r_store = null
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 01a14d53a6d..5e914e68242 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -15,6 +15,10 @@
var/obj/item/weapon/tank/jetpack/J = back
if((movement_dir || J.stabilization_on) && J.allow_thrust(0.01, src))
return 1
+ if(istype(wear_suit, /obj/item/clothing/suit/space/hardsuit/engine) && isturf(loc)) //Second check is so you can't use a jetpack in a mech
+ var/obj/item/clothing/suit/space/hardsuit/engine/C = wear_suit
+ if((movement_dir || C.jetpack.stabilization_on) && C.jetpack.allow_thrust(0.01, src))
+ return 1
return 0
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 6da553aaf24..c1e89721f8a 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -268,11 +268,6 @@
else if(I == glasses)
glasses = null
update_inv_glasses(0)
- else if(I == head)
- head = null
- if(I.flags & BLOCKHAIR)
- update_hair(0) //rebuild hair
- update_inv_head(0)
else if(I == ears)
ears = null
update_inv_ears(0)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index c25f6048a27..d66d73d0e1c 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -655,40 +655,50 @@
/datum/species/proc/movement_delay(var/mob/living/carbon/human/H)
var/mspeed = 0
- var/hasjetpack = 0
- if(istype(H.back, /obj/item/weapon/tank/jetpack))
- var/obj/item/weapon/tank/jetpack/J = H.back
- if(J.allow_thrust(0.01, H))
- hasjetpack = 1
- var/grav = has_gravity(H)
+ if(!(H.status_flags & IGNORESLOWDOWN))
- if(!grav && !hasjetpack)
- mspeed += 1 //Slower space without jetpack
+ var/grav = has_gravity(H)
+ var/hasjetpack = 0
+ if(!grav)
+ var/obj/item/weapon/tank/jetpack/J
+ var/obj/item/weapon/tank/jetpack/P
- var/health_deficiency = (100 - H.health + H.staminaloss)
- if(health_deficiency >= 40)
- mspeed += (health_deficiency / 25)
+ if(istype(H.back, /obj/item/weapon/tank/jetpack))
+ J = H.back
+ if(istype(H.wear_suit,/obj/item/clothing/suit/space/hardsuit)) //copypasta but faster implementation currently
+ var/obj/item/clothing/suit/space/hardsuit/engine/C = H.wear_suit
+ P = C.jetpack
+ if(J)
+ if(J.allow_thrust(0.01, H))
+ hasjetpack = 1
+ else if(P)
+ if(P.allow_thrust(0.01, H))
+ hasjetpack = 1
- var/hungry = (500 - H.nutrition) / 5 //So overeat would be 100 and default level would be 80
- if(hungry >= 70)
- mspeed += hungry / 50
+ mspeed = 1 - hasjetpack
- if(H.wear_suit && grav)
- mspeed += H.wear_suit.slowdown
- if(H.shoes && grav)
- mspeed += H.shoes.slowdown
- if(H.back && grav)
- mspeed += H.back.slowdown
+ if(grav || !hasjetpack)
+ var/health_deficiency = (100 - H.health + H.staminaloss)
+ if(health_deficiency >= 40)
+ mspeed += (health_deficiency / 25)
- if((H.disabilities & FAT) && grav)
- mspeed += 1.5
- if(H.bodytemperature < 283.222)
- mspeed += (283.222 - H.bodytemperature) / 10 * (grav+0.5)
+ var/hungry = (500 - H.nutrition) / 5 //So overeat would be 100 and default level would be 80
+ if(hungry >= 70)
+ mspeed += hungry / 50
- mspeed += speedmod
+ if(H.wear_suit)
+ mspeed += H.wear_suit.slowdown
+ if(H.shoes)
+ mspeed += H.shoes.slowdown
+ if(H.back)
+ mspeed += H.back.slowdown
- if(H.status_flags & IGNORESLOWDOWN)
- mspeed = 0
+ if((H.disabilities & FAT))
+ mspeed += 1.5
+ if(H.bodytemperature < 283.222)
+ mspeed += (283.222 - H.bodytemperature) / 10 * (grav+0.5)
+
+ mspeed += speedmod
if(H.status_flags & GOTTAGOFAST)
mspeed -= 1
@@ -696,7 +706,6 @@
if(H.status_flags & GOTTAGOREALLYFAST)
mspeed -= 2
-
return mspeed
//////////////////
diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm
index 58091c54642..74248154ddf 100644
--- a/code/modules/mob/living/carbon/human/species_types.dm
+++ b/code/modules/mob/living/carbon/human/species_types.dm
@@ -53,7 +53,7 @@
id = "plant"
default_color = "59CE00"
specflags = list(MUTCOLORS,EYECOLOR)
- attack_verb = "slice"
+ attack_verb = "slash"
attack_sound = 'sound/weapons/slice.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
burnmod = 1.25
@@ -157,7 +157,7 @@
specflags = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
hair_color = "mutcolor"
hair_alpha = 150
- ignored_by = list(/mob/living/carbon/slime)
+ ignored_by = list(/mob/living/simple_animal/slime)
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/slime
exotic_blood = /datum/reagent/toxin/slimejelly
var/recently_changed = 1
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 3c324b4081d..8d1c801472a 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -138,7 +138,7 @@ Please contact me on #coderbus IRC. ~Carnie x
//HAIR OVERLAY
-/mob/living/carbon/human/proc/update_hair()
+/mob/living/carbon/human/update_hair()
//Reset our hair
remove_overlay(HAIR_LAYER)
diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm
index 5a7455748cf..876f23fc37a 100644
--- a/code/modules/mob/living/carbon/inventory.dm
+++ b/code/modules/mob/living/carbon/inventory.dm
@@ -4,6 +4,8 @@
return back
if(slot_wear_mask)
return wear_mask
+ if(slot_head)
+ return head
if(slot_handcuffed)
return handcuffed
if(slot_legcuffed)
@@ -12,4 +14,33 @@
return l_hand
if(slot_r_hand)
return r_hand
- return null
\ No newline at end of file
+ return null
+
+
+/mob/living/carbon/unEquip(obj/item/I) //THIS PROC DID NOT CALL ..() AND THAT COST ME AN ENTIRE DAY OF DEBUGGING.
+ . = ..() //Sets the default return value to what the parent returns.
+ if(!. || !I) //We don't want to set anything to null if the parent returned 0.
+ return
+
+ if(I == head)
+ head = null
+ if(I.flags & BLOCKHAIR)
+ update_hair(0)
+ update_inv_head(0)
+ else if(I == back)
+ back = null
+ update_inv_back(0)
+ 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
+ wear_mask = null
+ update_inv_wear_mask(0)
+ else if(I == handcuffed)
+ handcuffed = null
+ if(buckled && buckled.buckle_requires_restraints)
+ buckled.unbuckle_mob()
+ update_inv_handcuffed(0)
+ else if(I == legcuffed)
+ legcuffed = null
+ update_inv_legcuffed(0)
+
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 6b433d27019..daebf276b12 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -6,63 +6,21 @@
return
if(!loc)
return
- var/datum/gas_mixture/environment = loc.return_air()
-
- if(stat != DEAD)
-
- //Breathing, if applicable
- handle_breathing()
+ if(..())
//Updates the number of stored chemicals for powers
handle_changeling()
-
- //Mutations and radiation
- handle_mutations_and_radiation()
-
- //Chemicals in the body
- handle_chemicals_in_body()
-
- //Blud
- handle_blood()
-
- //Random events (vomiting etc)
- handle_random_events()
-
//Heart Attacks, etc.
handle_heart()
. = 1
- //Handle temperature/pressure differences between body and environment
- handle_environment(environment)
-
- handle_fire()
-
- //stuff in the stomach
- handle_stomach()
-
- update_canmove()
-
- update_gravity(mob_has_gravity())
-
- for(var/obj/item/weapon/grab/G in src)
- G.process()
-
- handle_regular_status_updates() // Status updates, death etc.
-
- if(client)
- handle_regular_hud_updates()
-
- return .
-
-
-
///////////////
// BREATHING //
///////////////
//Start of a breath chain, calls breathe()
-/mob/living/carbon/proc/handle_breathing()
+/mob/living/carbon/handle_breathing()
if(SSmob.times_fired%4==2 || failed_last_breath)
breathe() //Breathe per 4 ticks, unless suffocating
else
@@ -230,7 +188,7 @@
//Fourth and final link in a breath chain
/mob/living/carbon/proc/handle_breath_temperature(datum/gas_mixture/breath)
-
+ return
/mob/living/carbon/proc/get_breath_from_internal(volume_needed)
if(internal)
@@ -251,7 +209,7 @@
/mob/living/carbon/proc/handle_changeling()
return
-/mob/living/carbon/proc/handle_mutations_and_radiation()
+/mob/living/carbon/handle_mutations_and_radiation()
if(radiation)
switch(radiation)
@@ -276,26 +234,21 @@
radiation = Clamp(radiation, 0, 100)
-/mob/living/carbon/proc/handle_chemicals_in_body()
+/mob/living/carbon/handle_chemicals_in_body()
if(reagents)
reagents.metabolize(src)
- updatehealth()
+/mob/living/carbon/handle_blood()
return
-/mob/living/carbon/proc/handle_blood()
+/mob/living/carbon/handle_random_events()
return
/mob/living/carbon/proc/handle_heart()
return
+/mob/living/carbon/handle_environment(var/datum/gas_mixture/environment) return
-/mob/living/carbon/proc/handle_random_events()
- return
-
-/mob/living/carbon/proc/handle_environment(var/datum/gas_mixture/environment)
- return
-
-/mob/living/carbon/proc/handle_stomach()
+/mob/living/carbon/handle_stomach()
spawn(0)
for(var/mob/living/M in stomach_contents)
if(M.loc != src)
@@ -312,58 +265,59 @@
M.adjustBruteLoss(5)
nutrition += 10
-/mob/living/carbon/proc/handle_regular_status_updates()
+//This updates the health and status of the mob (conscious, unconscious, dead)
+/mob/living/carbon/handle_regular_status_updates()
+
+ if(..()) //alive
- if(stat == DEAD)
- eye_blind = max(eye_blind, 1)
- silent = 0
- else
- updatehealth()
if(health <= config.health_threshold_dead || !getorgan(/obj/item/organ/brain))
death()
- eye_blind = max(eye_blind, 1)
- silent = 0
- return 1
+ return
if(getOxyLoss() > 50 || health <= config.health_threshold_crit)
Paralyse(3)
stat = UNCONSCIOUS
- if(paralysis)
- AdjustParalysis(-1)
- else if(sleeping)
- handle_dreams()
- adjustStaminaLoss(-10)
- sleeping = max(sleeping-1, 0)
- stat = UNCONSCIOUS
- if( prob(10) && health && !hal_crit )
- spawn(0)
- emote("snore")
-
- else if (status_flags & FAKEDEATH)
+ if(sleeping)
stat = UNCONSCIOUS
- else
- stat = CONSCIOUS
+ CheckStamina()
+ return 1
- handle_disabilities()
+//this updates all special effects: stunned, sleeping, weakened, druggy, stuttering, etc..
+/mob/living/carbon/handle_status_effects()
+ ..()
- var/restingpwr = 1 //used to decrease jitteriness, drowsyness and dizziness
- if(resting)
- restingpwr = 5
+ if(sleeping)
+ handle_dreams()
+ adjustStaminaLoss(-10)
+ sleeping = max(sleeping-1, 0)
+ if( prob(10) && health && !hal_crit )
+ spawn(0)
+ emote("snore")
- //Dizziness
- if(dizziness)
- var/client/C = client
- var/pixel_x_diff = 0
- var/pixel_y_diff = 0
- var/temp
- var/saved_dizz = dizziness
- if(C)
- var/oldsrc = src
- var/amplitude = dizziness*(sin(dizziness * 0.044 * world.time) + 1) / 70 // This shit is annoying at high strength
- src = null
- spawn(0)
+ var/restingpwr = 1 + 4 * resting
+
+ //Dizziness
+ if(dizziness)
+ var/client/C = client
+ var/pixel_x_diff = 0
+ var/pixel_y_diff = 0
+ var/temp
+ var/saved_dizz = dizziness
+ if(C)
+ var/oldsrc = src
+ var/amplitude = dizziness*(sin(dizziness * 0.044 * world.time) + 1) / 70 // This shit is annoying at high strength
+ src = null
+ spawn(0)
+ if(C)
+ temp = amplitude * sin(0.008 * saved_dizz * world.time)
+ pixel_x_diff += temp
+ C.pixel_x += temp
+ temp = amplitude * cos(0.008 * saved_dizz * world.time)
+ pixel_y_diff += temp
+ C.pixel_y += temp
+ sleep(3)
if(C)
temp = amplitude * sin(0.008 * saved_dizz * world.time)
pixel_x_diff += temp
@@ -371,96 +325,54 @@
temp = amplitude * cos(0.008 * saved_dizz * world.time)
pixel_y_diff += temp
C.pixel_y += temp
- sleep(3)
- if(C)
- temp = amplitude * sin(0.008 * saved_dizz * world.time)
- pixel_x_diff += temp
- C.pixel_x += temp
- temp = amplitude * cos(0.008 * saved_dizz * world.time)
- pixel_y_diff += temp
- C.pixel_y += temp
- sleep(3)
- if(C)
- C.pixel_x -= pixel_x_diff
- C.pixel_y -= pixel_y_diff
- src = oldsrc
- dizziness = max(0, dizziness - restingpwr)
+ sleep(3)
+ if(C)
+ C.pixel_x -= pixel_x_diff
+ C.pixel_y -= pixel_y_diff
+ src = oldsrc
+ dizziness = max(dizziness - restingpwr, 0)
- //Drowsyness
- if(drowsyness)
- drowsyness = max(drowsyness-restingpwr, 0)
- eye_blurry = max(2, eye_blurry)
- if(prob(5))
- sleeping += 1
- Paralyse(5)
+ if(drowsyness)
+ drowsyness = max(drowsyness - restingpwr, 0)
+ eye_blurry = max(2, eye_blurry)
+ if(prob(5))
+ sleeping += 1
+ Paralyse(5)
- //Jitteriness
- if(jitteriness)
- do_jitter_animation(jitteriness)
- jitteriness = max(0, jitteriness-restingpwr)
+ if(confused)
+ confused = max(0, confused - 1)
- //Other
+ //Jitteryness
+ if(jitteriness)
+ do_jitter_animation(jitteriness)
+ jitteriness = max(jitteriness - restingpwr, 0)
- if(confused)
- confused = max(0, confused - 1)
+ if(stuttering)
+ stuttering = max(stuttering-1, 0)
- if(stuttering)
- stuttering = max(stuttering-1, 0)
+ if(slurring)
+ slurring = max(slurring-1,0)
- if(slurring)
- slurring = max(slurring-1,0)
+ if(silent)
+ silent = max(silent-1, 0)
- if(silent)
- silent = max(silent-1, 0)
+ if(druggy)
+ druggy = max(druggy-1, 0)
- if(druggy)
- druggy = max(druggy-1, 0)
-
- if(stunned)
- AdjustStunned(-1)
- if(!stunned)
- update_icons()
-
- if(weakened)
- weakened = max(weakened-1,0)
- if(!weakened)
- update_icons()
-
- if(hallucination)
- spawn handle_hallucinations()
-
- if(hallucination<=2)
- hallucination = 0
- else
- hallucination -= 2
+ if(hallucination)
+ spawn handle_hallucinations()
+ if(hallucination<=2)
+ hallucination = 0
else
- for(var/atom/a in hallucinations)
- qdel(a)
+ hallucination -= 2
- CheckStamina()
- return 1
-
-/mob/living/carbon/proc/handle_disabilities()
- //Eyes
- if(disabilities & BLIND || stat) //blindness from disability or unconsciousness doesn't get better on its own
- eye_blind = max(eye_blind, 1)
- else if(eye_blind) //blindness, heals slowly over time
- eye_blind = max(eye_blind-1,0)
- else if(eye_blurry) //blurry eyes heal slowly
- eye_blurry = max(eye_blurry-1, 0)
-
- //Ears
- if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own
- setEarDamage(-1, max(ear_deaf, 1))
else
- // deafness heals slowly over time, unless ear_damage is over 100
- if(ear_damage < 100)
- adjustEarDamage(-0.05,-1)
-
+ for(var/atom/a in hallucinations)
+ qdel(a)
//this handles hud updates. Calls update_vision() and handle_hud_icons()
-/mob/living/carbon/proc/handle_regular_hud_updates()
+/mob/living/carbon/handle_regular_hud_updates()
if(!client) return 0
update_action_buttons()
@@ -541,15 +453,11 @@
damageoverlay.overlays += I
damageoverlay.overlays += black
-
- handle_vision()
- handle_hud_icons()
+ ..()
return 1
-/mob/living/carbon/proc/handle_vision()
-
- client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask)
+/mob/living/carbon/update_sight()
if(stat == DEAD)
sight |= SEE_TURFS
@@ -570,38 +478,11 @@
if(see_override)
see_invisible = see_override
- if(blind)
- if(eye_blind)
- blind.layer = 18
- else
- blind.layer = 0
- if (disabilities & NEARSIGHT)
- client.screen += global_hud.vimpaired
-
- if (eye_blurry)
- client.screen += global_hud.blurry
-
- if (druggy)
- client.screen += global_hud.druggy
-
- if(eye_stat > 20)
- if(eye_stat > 30)
- client.screen += global_hud.darkMask
- else
- client.screen += global_hud.vimpaired
-
- if(machine)
- if (!( machine.check_eye(src) ))
- reset_view(null)
- else
- if(!client.adminobs)
- reset_view(null)
-
-/mob/living/carbon/proc/handle_hud_icons()
+/mob/living/carbon/handle_hud_icons()
return
-/mob/living/carbon/proc/handle_hud_icons_health()
+/mob/living/carbon/handle_hud_icons_health()
if(healths)
if (stat != DEAD)
switch(health)
diff --git a/code/modules/mob/living/carbon/monkey/examine.dm b/code/modules/mob/living/carbon/monkey/examine.dm
index a3686d7a478..48963b00eed 100644
--- a/code/modules/mob/living/carbon/monkey/examine.dm
+++ b/code/modules/mob/living/carbon/monkey/examine.dm
@@ -3,8 +3,10 @@
if (src.handcuffed)
msg += "It is \icon[src.handcuffed] handcuffed!\n"
+ if (src.head)
+ msg += "It has \icon[src.head] \a [src.head] on its head. \n"
if (src.wear_mask)
- msg += "It has \icon[src.wear_mask] \a [src.wear_mask] on its head.\n"
+ msg += "It has \icon[src.wear_mask] \a [src.wear_mask] on its face.\n"
if (src.l_hand)
msg += "It has \icon[src.l_hand] \a [src.l_hand] in its left hand.\n"
if (src.r_hand)
diff --git a/code/modules/mob/living/carbon/monkey/inventory.dm b/code/modules/mob/living/carbon/monkey/inventory.dm
index 95ff775c0a4..c0ae3e21920 100644
--- a/code/modules/mob/living/carbon/monkey/inventory.dm
+++ b/code/modules/mob/living/carbon/monkey/inventory.dm
@@ -14,6 +14,12 @@
if( !(I.slot_flags & SLOT_MASK) )
return 0
return 1
+ if(slot_head)
+ if(head)
+ return 0
+ if( !(I.slot_flags & SLOT_HEAD) )
+ return 0
+ return 1
if(slot_back)
if(back)
return 0
@@ -43,6 +49,10 @@
wear_mask = I
I.equipped(src, slot)
update_inv_wear_mask(redraw_mob)
+ if(slot_head)
+ head = I
+ I.equipped(src, slot)
+ update_inv_head(redraw_mob)
if(slot_handcuffed)
handcuffed = I
update_inv_handcuffed(redraw_mob)
@@ -70,3 +80,6 @@
I.loc = src
I.equipped(src, slot)
I.layer = 20
+
+
+
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 27dc01abc17..d275d0744ba 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -137,7 +137,6 @@
if (M.a_intent == "disarm")
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
- var/damage = 5
if(prob(95))
Weaken(10)
visible_message("[M] has tackled down [name]!", \
@@ -147,7 +146,6 @@
visible_message("[M] has disarmed [name]!", \
"[M] has disarmed [name]!")
add_logs(M, src, "disarmed", admin=0)
- adjustBruteLoss(damage)
updatehealth()
return
@@ -158,18 +156,13 @@
updatehealth()
-/mob/living/carbon/monkey/attack_slime(mob/living/carbon/slime/M as mob)
- ..()
- var/damage = rand(1, 3)
-
- if(M.is_adult)
- damage = rand(20, 40)
- else
- damage = rand(5, 35)
- adjustBruteLoss(damage)
- updatehealth()
-
- return
+/mob/living/carbon/monkey/attack_slime(mob/living/simple_animal/slime/M as mob)
+ if(..()) //successful slime attack
+ var/damage = rand(5, 35)
+ if(M.is_adult)
+ damage = rand(20, 40)
+ adjustBruteLoss(damage)
+ updatehealth()
/mob/living/carbon/monkey/Stat()
..()
@@ -261,4 +254,4 @@
src << "Your mask protects you from the acid."
return
- take_organ_damage(min(6*toxpwr, acid_volume * toxpwr))
\ No newline at end of file
+ take_organ_damage(min(6*toxpwr, acid_volume * toxpwr))
diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm
index bcdbbb6b633..5be5fbc43b8 100644
--- a/code/modules/mob/living/carbon/monkey/update_icons.dm
+++ b/code/modules/mob/living/carbon/monkey/update_icons.dm
@@ -1,11 +1,12 @@
//Monkey Overlays Indexes////////
-#define M_FIRE_LAYER 6
-#define M_MASK_LAYER 5
+#define M_FIRE_LAYER 7
+#define M_MASK_LAYER 6
+#define M_HEAD_LAYER 5
#define M_BACK_LAYER 4
#define M_HANDCUFF_LAYER 3
#define M_L_HAND_LAYER 2
#define M_R_HAND_LAYER 1
-#define M_TOTAL_LAYERS 6
+#define M_TOTAL_LAYERS 7
/////////////////////////////////
/mob/living/carbon/monkey
@@ -14,6 +15,7 @@
/mob/living/carbon/monkey/regenerate_icons()
..()
update_inv_wear_mask(0)
+ update_inv_head(0)
update_inv_back(0)
update_inv_r_hand(0)
update_inv_l_hand(0)
@@ -39,7 +41,7 @@
if(client && hud_used)
client.screen += wear_mask
overlays -= overlays_standing[M_MASK_LAYER]
- var/image/standing = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "[wear_mask.icon_state]", "layer" = -M_MASK_LAYER)
+ var/image/standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]", "layer" = -M_MASK_LAYER)
if(!istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA )
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "maskblood")
overlays_standing[M_MASK_LAYER] = standing
@@ -50,6 +52,21 @@
if(update_icons) update_icons()
+/mob/living/carbon/monkey/update_inv_head(var/update_icons=1)
+ if(head)
+ head.screen_loc = ui_monkey_head
+ if(client && hud_used)
+ client.screen += head
+ overlays -= overlays_standing[M_HEAD_LAYER]
+ var/image/standing = image("icon" = 'icons/mob/head.dmi', "icon_state" = "[head.icon_state]", "layer" = -M_HEAD_LAYER)
+ overlays_standing[M_HEAD_LAYER] = standing
+ overlays += overlays_standing[M_HEAD_LAYER]
+ else
+ overlays -= overlays_standing[M_HEAD_LAYER]
+ overlays_standing[M_HEAD_LAYER] = null
+ if(update_icons) update_icons()
+
+
/mob/living/carbon/monkey/update_inv_r_hand(var/update_icons=1)
if (handcuffed)
drop_r_hand()
@@ -61,7 +78,9 @@
var/t_state = r_hand.item_state
if(!t_state) t_state = r_hand.icon_state
overlays -= overlays_standing[M_R_HAND_LAYER]
- overlays_standing[M_R_HAND_LAYER] = image("icon" = r_hand.righthand_file, "icon_state" = t_state, "layer" = -M_R_HAND_LAYER)
+ var/image/standing = image("icon" = r_hand.righthand_file, "icon_state" = t_state, "layer" = -M_R_HAND_LAYER)
+ standing.pixel_y = 2
+ overlays_standing[M_R_HAND_LAYER] = standing
overlays += overlays_standing[M_R_HAND_LAYER]
else
overlays -= overlays_standing[M_R_HAND_LAYER]
@@ -80,7 +99,9 @@
var/t_state = l_hand.item_state
if(!t_state) t_state = l_hand.icon_state
overlays -= overlays_standing[M_L_HAND_LAYER]
- overlays_standing[M_L_HAND_LAYER] = image("icon" = l_hand.lefthand_file, "icon_state" = t_state, "layer" = -M_L_HAND_LAYER)
+ var/image/standing = image("icon" = l_hand.lefthand_file, "icon_state" = t_state, "layer" = -M_L_HAND_LAYER)
+ standing.pixel_y = 2
+ overlays_standing[M_L_HAND_LAYER] = standing
overlays += overlays_standing[M_L_HAND_LAYER]
else
overlays -= overlays_standing[M_L_HAND_LAYER]
diff --git a/code/modules/mob/living/carbon/slime/examine.dm b/code/modules/mob/living/carbon/slime/examine.dm
deleted file mode 100644
index 609addde9f5..00000000000
--- a/code/modules/mob/living/carbon/slime/examine.dm
+++ /dev/null
@@ -1,31 +0,0 @@
-/mob/living/carbon/slime/examine(mob/user)
-
- var/msg = "*---------*\nThis is \icon[src] \a [src]!\n"
- if (src.stat == DEAD)
- msg += "It is limp and unresponsive.\n"
- else
- if (src.getBruteLoss())
- msg += ""
- if (src.getBruteLoss() < 40)
- msg += "It has some punctures in its flesh!"
- else
- msg += "It has severe punctures and tears in its flesh!"
- msg += "\n"
-
- switch(powerlevel)
-
- if(2 to 3)
- msg += "It is flickering gently with a little electrical activity.\n"
-
- if(4 to 5)
- msg += "It is glowing gently with moderate levels of electrical activity.\n"
-
- if(6 to 9)
- msg += "It is glowing brightly with high levels of electrical activity.\n"
-
- if(10)
- msg += "It is radiating with massive levels of electrical activity!\n"
-
- msg += "*---------*"
- user << msg
- return
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/slime/login.dm b/code/modules/mob/living/carbon/slime/login.dm
deleted file mode 100644
index d3ac320f2f4..00000000000
--- a/code/modules/mob/living/carbon/slime/login.dm
+++ /dev/null
@@ -1,4 +0,0 @@
-/mob/living/carbon/slime/Login()
- ..()
- update_hud()
- return
diff --git a/code/modules/mob/living/carbon/slime/say.dm b/code/modules/mob/living/carbon/slime/say.dm
deleted file mode 100644
index 8f391736954..00000000000
--- a/code/modules/mob/living/carbon/slime/say.dm
+++ /dev/null
@@ -1,17 +0,0 @@
-/mob/living/carbon/slime/say_quote(var/text)
- var/ending = copytext(text, length(text))
-
- if (ending == "?")
- return "telepathically asks, \"[text]\"";
- else if (ending == "!")
- return "telepathically cries, \"[text]\"";
-
- return "telepathically chirps, \"[text]\"";
-
-/mob/living/carbon/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans)
- if(speaker != src && !radio_freq)
- if (speaker in Friends)
- speech_buffer = list()
- speech_buffer += speaker
- speech_buffer += lowertext(html_decode(message))
- ..()
diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm
deleted file mode 100644
index 488e946f270..00000000000
--- a/code/modules/mob/living/carbon/slime/slime.dm
+++ /dev/null
@@ -1,949 +0,0 @@
-/mob/living/carbon/slime
- name = "baby slime"
- icon = 'icons/mob/slimes.dmi'
- icon_state = "grey baby slime"
- pass_flags = PASSTABLE
- ventcrawler = 2
- var/is_adult = 0
- var/docile = 0
- languages = SLIME | HUMAN
- faction = list("slime")
-
- layer = 5
-
- maxHealth = 150
- health = 150
- gender = NEUTER
-
- nutrition = 700
-
- see_in_dark = 8
- update_slimes = 0
-
- verb_say = "telepathically chirps"
- verb_ask = "telepathically asks"
- verb_yell = "telephatically cries"
-
- // canstun and canweaken don't affect slimes because they ignore stun and weakened variables
- // for the sake of cleanliness, though, here they are.
- status_flags = CANPARALYSE|CANPUSH
-
- var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside
- var/mutation_chance = 30 // Chance of mutating, should be between 25 and 35
-
- var/powerlevel = 0 // 1-10 controls how much electricity they are generating
- var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces
-
- var/number = 0 // Used to understand when someone is talking to it
-
- var/mob/living/Victim = null // the person the slime is currently feeding on
- var/mob/living/Target = null // AI variable - tells the slime to hunt this down
- var/mob/living/Leader = null // AI variable - tells the slime to follow this person
-
- var/attacked = 0 // Determines if it's been attacked recently. Can be any number, is a cooloff-ish variable
- var/rabid = 0 // If set to 1, the slime will attack and eat anything it comes in contact with
- var/holding_still = 0 // AI variable, cooloff-ish for how long it's going to stay in one place
- var/target_patience = 0 // AI variable, cooloff-ish for how long it's going to follow its target
-
- var/list/Friends = list() // A list of friends; they are not considered targets for feeding; passed down after splitting
-
- var/list/speech_buffer = list() // Last phrase said near it and person who said it
-
- var/mood = "" // To show its face
-
- ///////////TIME FOR SUBSPECIES
-
- var/colour = "grey"
- var/coretype = /obj/item/slime_extract/grey
- var/list/slime_mutation[4]
-
-/mob/living/carbon/slime/New()
- create_reagents(100)
- spawn (0)
- number = rand(1, 1000)
- name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
- icon_state = "[colour] [is_adult ? "adult" : "baby"] slime"
- real_name = name
- slime_mutation = mutation_table(colour)
- mutation_chance = rand(25, 35)
- var/sanitizedcolour = replacetext(colour, " ", "")
- coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]")
- ..()
-
-/mob/living/carbon/slime/regenerate_icons()
- icon_state = "[colour] [is_adult ? "adult" : "baby"] slime"
- overlays.len = 0
- if (mood)
- overlays += image('icons/mob/slimes.dmi', icon_state = "aslime-[mood]")
- ..()
-
-/mob/living/carbon/slime/movement_delay()
- if (bodytemperature >= 330.23) // 135 F
- return -1 // slimes become supercharged at high temperatures
-
- var/tally = 0
-
- var/health_deficiency = (100 - health)
- if(health_deficiency >= 45) tally += (health_deficiency / 25)
-
- if (bodytemperature < 183.222)
- tally += (283.222 - bodytemperature) / 10 * 1.75
-
- if(reagents)
- if(reagents.has_reagent("morphine")) // morphine slows slimes down
- tally *= 2
-
- if(reagents.has_reagent("frostoil")) // frostoil also makes them move VEEERRYYYYY slow
- tally *= 5
-
- if(health <= 0) // if damaged, the slime moves twice as slow
- tally *= 2
-
- return tally + config.slime_delay
-
-/mob/living/carbon/slime/ObjBump(obj/O)
- if(!client && powerlevel > 0)
- var/probab = 10
- switch(powerlevel)
- if(1 to 2) probab = 20
- if(3 to 4) probab = 30
- if(5 to 6) probab = 40
- if(7 to 8) probab = 60
- if(9) probab = 70
- if(10) probab = 95
- if(prob(probab))
- if(istype(O, /obj/structure/window) || istype(O, /obj/structure/grille))
- if(nutrition <= get_hunger_nutrition() && !Atkcool)
- if (is_adult || prob(5))
- O.attack_slime(src)
- Atkcool = 1
- spawn(45)
- Atkcool = 0
-
-/mob/living/carbon/slime/MobBump(mob/M)
- if(istype(M, /mob/living/carbon/human)) //pushing humans
- if(is_adult && prob(10)) //only if we're adult, and 10% of the time
- return 0
- else
- return 1
-
-/mob/living/carbon/slime/Process_Spacemove(var/movement_dir = 0)
- return 2
-
-/mob/living/carbon/slime/Stat()
- ..()
-
- if(statpanel("Status"))
- if(is_adult)
- stat(null, "Health: [round((health / 200) * 100)]%")
- else
- stat(null, "Health: [round((health / 150) * 100)]%")
- if(!docile)
- stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]")
- if(amount_grown >= 10)
- if(is_adult)
- stat(null, "You can reproduce!")
- else
- stat(null, "You can evolve!")
-
- stat(null,"Power Level: [powerlevel]")
-
-/mob/living/carbon/slime/adjustFireLoss(amount)
- ..(-abs(amount)) // Heals them
- return
-
-/mob/living/carbon/slime/bullet_act(var/obj/item/projectile/Proj)
- attacked += 10
- ..(Proj)
- return 0
-
-/mob/living/carbon/slime/emp_act(severity)
- powerlevel = 0 // oh no, the power!
- ..()
-
-/mob/living/carbon/slime/ex_act(severity, target)
- ..()
-
- switch (severity)
- if (1.0)
- gib()
- return
-
- if (2.0)
- adjustBruteLoss(60)
- adjustFireLoss(60)
-
- if(3.0)
- adjustBruteLoss(30)
-
- updatehealth()
-
-/mob/living/carbon/slime/MouseDrop(var/atom/movable/A as mob|obj)
- if(isliving(A) && A != src && usr == src)
- var/mob/living/Food = A
- if(Food.Adjacent(src) && !stat && Food.stat != DEAD) //messy
- Feedon(Food)
- ..()
-
-/mob/living/carbon/slime/unEquip(obj/item/W as obj)
- return
-
-/mob/living/carbon/slime/start_pulling(var/atom/movable/AM)
- return
-
-/mob/living/carbon/slime/attack_ui(slot)
- return
-
-/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob)
- ..()
- if(src.Victim)
- src.Victim = null
- visible_message("[M] pulls [src] off!")
- return
- attacked += 5
- if(src.nutrition >= 100) //steal some nutrition. negval handled in life()
- src.nutrition -= (50 + (5 * M.amount_grown))
- M.add_nutrition(50 + (5 * M.amount_grown))
- if(src.health > 0)
- src.adjustBruteLoss(4 + (2 * M.amount_grown)) //amt_grown isn't very linear but it works
- src.updatehealth()
- M.adjustBruteLoss(-4 + (-2 * M.amount_grown))
- M.updatehealth()
- return
-
-/mob/living/carbon/slime/attack_animal(mob/living/simple_animal/M as mob)
- if(..())
- var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- attacked += 10
- adjustBruteLoss(damage)
- updatehealth()
-
-/mob/living/carbon/slime/attack_paw(mob/living/carbon/monkey/M as mob)
- if(..()) //successful monkey bite.
- if(stat != DEAD)
- attacked += 10
- adjustBruteLoss(rand(1, 3))
- updatehealth()
- return
-
-/mob/living/carbon/slime/attack_larva(mob/living/carbon/alien/larva/L as mob)
- if(..()) //successful larva bite.
- var/damage = rand(1, 3)
- if(stat != DEAD)
- L.amount_grown = min(L.amount_grown + damage, L.max_grown)
- adjustBruteLoss(damage)
- updatehealth()
-
-/mob/living/carbon/slime/attack_hulk(mob/living/carbon/human/user)
- if(user.a_intent == "harm")
- adjustBruteLoss(5)
- if(Victim || Target)
- Victim = null
- Target = null
- anchored = 0
- if(prob(80) && !client)
- Discipline++
- spawn(0)
- step_away(src,user,15)
- sleep(3)
- step_away(src,user,15)
-
-
-/mob/living/carbon/slime/attack_hand(mob/living/carbon/human/M as mob)
- if(Victim)
- if(Victim == M)
- if(prob(60))
- visible_message("[M] attempts to wrestle \the [name] off!")
- playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
-
- else
- visible_message(" [M] manages to wrestle \the [name] off!")
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
-
- if(prob(90) && !client)
- Discipline++
-
- spawn()
- SStun = 1
- sleep(rand(45,60))
- if(src)
- SStun = 0
-
- Victim = null
- anchored = 0
- step_away(src,M)
-
- return
-
- else
- M.do_attack_animation(src)
- if(prob(30))
- visible_message("[M] attempts to wrestle \the [name] off of [Victim]!")
- playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
-
- else
- visible_message(" [M] manages to wrestle \the [name] off of [Victim]!")
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
-
- if(prob(80) && !client)
- Discipline++
-
- if(!is_adult)
- if(Discipline == 1)
- attacked = 0
-
- spawn()
- SStun = 1
- sleep(rand(55,65))
- if(src)
- SStun = 0
-
- Victim = null
- anchored = 0
- step_away(src,M)
-
- return
-
- if(..()) //To allow surgery to return properly.
- return
-
- switch(M.a_intent)
- if("help")
- help_shake_act(M)
- if("grab")
- grabbedby(M)
- else
- M.do_attack_animation(src)
- var/damage = rand(1, 9)
- attacked += 10
- if (prob(90))
- playsound(loc, "punch", 25, 1, -1)
- add_logs(M, src, "attacked", admin=0)
- visible_message("[M] has punched [src]!", \
- "[M] has punched [src]!")
-
- if (stat != DEAD)
- adjustBruteLoss(damage)
- updatehealth()
- else
- playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
- visible_message("[M] has attempted to punch [src]!")
- return
-
-
-
-/mob/living/carbon/slime/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
- if(..()) //if harm or disarm intent.
-
- if (M.a_intent == "harm")
- if (prob(95))
- attacked += 10
- playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
- var/damage = rand(15, 30)
- if (damage >= 25)
- damage = rand(20, 40)
- visible_message("[M] has slashed [name]!", \
- "[M] has slashed [name]!")
- else
- visible_message("[M] has wounded [name]!", \
- ")[M] has wounded [name]!")
-
- add_logs(M, src, "attacked", admin=0)
- if (health != DEAD)
- adjustBruteLoss(damage)
- updatehealth()
- else
- playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
- visible_message("[M] has attempted to lunge at [name]!", \
- "[M] has attempted to lunge at [name]!")
-
- if (M.a_intent == "disarm")
- playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
- var/damage = 5
- attacked += 10
-
- if(prob(95))
- visible_message("[M] has tackled [name]!", \
- "[M] has tackled [name]!")
-
- if(Victim || Target)
- Victim = null
- Target = null
- anchored = 0
- if(prob(80) && !client)
- Discipline++
- if(!istype(src, /mob/living/carbon/slime))
- if(Discipline == 1)
- attacked = 0
-
- spawn()
- SStun = 1
- sleep(rand(5,20))
- SStun = 0
-
- spawn(0)
-
- step_away(src,M,15)
- sleep(3)
- step_away(src,M,15)
-
- else
- drop_item()
- visible_message("[M] has disarmed [name]!",
- "[M] has disarmed [name]!")
- add_logs(M, src, "disarmed", admin=0)
- adjustBruteLoss(damage)
- updatehealth()
- return
-
-/mob/living/carbon/slime/attackby(obj/item/W, mob/living/user, params)
- if(istype(W,/obj/item/stack/sheet/mineral/plasma)) //Let's you feed slimes plasma.
- if (user in Friends)
- ++Friends[user]
- else
- Friends[user] = 1
- user << "You feed the slime the plasma. It chirps happily."
- var/obj/item/stack/sheet/mineral/plasma/S = W
- S.use(1)
- return
- else if(W.force > 0)
- attacked += 10
- if(prob(25))
- user.do_attack_animation(src)
- user << "[W] passes right through [src]!"
- return
- if(Discipline && prob(50)) // wow, buddy, why am I getting attacked??
- Discipline = 0
- else if(W.force >= 3)
- if(is_adult)
- if(prob(5 + round(W.force/2)))
- if(Victim || Target)
- if(prob(80) && !client)
- Discipline++
-
- Victim = null
- Target = null
- anchored = 0
-
- spawn()
- SStun = 1
- sleep(rand(5,20))
- SStun = 0
-
- spawn(0)
- if(user)
- canmove = 0
- step_away(src, user)
- if(prob(25 + W.force))
- sleep(2)
- if(user)
- step_away(src, user)
- canmove = 1
-
- else
- if(prob(10 + W.force*2))
- if(Victim || Target)
- if(prob(80) && !client)
- Discipline++
- if(Discipline == 1)
- attacked = 0
- spawn()
- SStun = 1
- sleep(rand(5,20))
- SStun = 0
-
- Victim = null
- Target = null
- anchored = 0
-
- spawn(0)
- if(user)
- canmove = 0
- step_away(src, user)
- if(prob(25 + W.force*4))
- sleep(2)
- if(user)
- step_away(src, user)
- canmove = 1
- ..()
-
-/mob/living/carbon/slime/restrained()
- return 0
-
-/mob/living/carbon/slime/show_inv(mob/user)
- return
-
-/mob/living/carbon/slime/toggle_throw_mode()
- return
-
-/mob/living/carbon/slime/proc/apply_water()
- adjustToxLoss(rand(15,20))
- if (!client)
- if (Target) // Like cats
- Target = null
- ++Discipline
- return
-
-/obj/item/slime_extract
- name = "slime extract"
- desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"."
- icon = 'icons/mob/slimes.dmi'
- icon_state = "grey slime extract"
- force = 1.0
- w_class = 1.0
- throwforce = 0
- throw_speed = 3
- throw_range = 6
- origin_tech = "biotech=4"
- var/Uses = 1 // uses before it goes inert
- var/enhanced = 0 //has it been enhanced before?
-
- attackby(obj/item/O as obj, mob/user as mob)
- if(istype(O, /obj/item/weapon/slimesteroid2))
- if(enhanced == 1)
- user << " This extract has already been enhanced!"
- return ..()
- if(Uses == 0)
- user << " You can't enhance a used extract!"
- return ..()
- user <<"You apply the enhancer. It now has triple the amount of uses."
- Uses = 3
- enhanced = 1
- qdel(O)
-
-/obj/item/slime_extract/New()
- ..()
- create_reagents(100)
-
-/obj/item/slime_extract/grey
- name = "grey slime extract"
- icon_state = "grey slime extract"
-
-/obj/item/slime_extract/gold
- name = "gold slime extract"
- icon_state = "gold slime extract"
-
-/obj/item/slime_extract/silver
- name = "silver slime extract"
- icon_state = "silver slime extract"
-
-/obj/item/slime_extract/metal
- name = "metal slime extract"
- icon_state = "metal slime extract"
-
-/obj/item/slime_extract/purple
- name = "purple slime extract"
- icon_state = "purple slime extract"
-
-/obj/item/slime_extract/darkpurple
- name = "dark purple slime extract"
- icon_state = "dark purple slime extract"
-
-/obj/item/slime_extract/orange
- name = "orange slime extract"
- icon_state = "orange slime extract"
-
-/obj/item/slime_extract/yellow
- name = "yellow slime extract"
- icon_state = "yellow slime extract"
-
-/obj/item/slime_extract/red
- name = "red slime extract"
- icon_state = "red slime extract"
-
-/obj/item/slime_extract/blue
- name = "blue slime extract"
- icon_state = "blue slime extract"
-
-/obj/item/slime_extract/darkblue
- name = "dark blue slime extract"
- icon_state = "dark blue slime extract"
-
-/obj/item/slime_extract/pink
- name = "pink slime extract"
- icon_state = "pink slime extract"
-
-/obj/item/slime_extract/green
- name = "green slime extract"
- icon_state = "green slime extract"
-
-/obj/item/slime_extract/lightpink
- name = "light pink slime extract"
- icon_state = "light pink slime extract"
-
-/obj/item/slime_extract/black
- name = "black slime extract"
- icon_state = "black slime extract"
-
-/obj/item/slime_extract/oil
- name = "oil slime extract"
- icon_state = "oil slime extract"
-
-/obj/item/slime_extract/adamantine
- name = "adamantine slime extract"
- icon_state = "adamantine slime extract"
-
-/obj/item/slime_extract/bluespace
- name = "bluespace slime extract"
- icon_state = "bluespace slime extract"
-
-/obj/item/slime_extract/pyrite
- name = "pyrite slime extract"
- icon_state = "pyrite slime extract"
-
-/obj/item/slime_extract/cerulean
- name = "cerulean slime extract"
- icon_state = "cerulean slime extract"
-
-/obj/item/slime_extract/sepia
- name = "sepia slime extract"
- icon_state = "sepia slime extract"
-
-/obj/item/slime_extract/rainbow
- name = "rainbow slime extract"
- icon_state = "rainbow slime extract"
-
-////Pet Slime Creation///
-
-/obj/item/slimepotion
- name = "docility potion"
- desc = "A potent chemical mix that nullifies a slime's hunger, causing it to become docile and tame."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle19"
-
-/obj/item/slimepotion/attack(mob/living/carbon/slime/M as mob, mob/user as mob)
- if(!isslime(M))
- user << "The potion only works on slimes!"
- return ..()
- if(M.stat)
- user << "The slime is dead!"
- return..()
-
- M.docile = 1
- M.nutrition = 700
- M <<" You absorb the potion and feel your intense desire to feed melt away."
- user <<" You feed the slime the potion, removing it's hunger and calming it."
- var/newname = copytext(sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text),1,MAX_NAME_LEN)
-
- if (!newname)
- newname = "pet slime"
- M.name = newname
- M.real_name = newname
- qdel(src)
-
-/obj/item/slimepotion2
- name = "sentience potion"
- desc = "A miraculous chemical mix that can raise the intelligence of creatures to human levels."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle19"
- var/list/not_interested = list()
- var/being_used = 0
-
-/obj/item/slimepotion2/afterattack(mob/living/M as mob, mob/user as mob)
- if(being_used || !ismob(M))
- return
- if(!(isslime(M) || isanimal(M) || ismonkey(M) || !M.ckey)) //I'm sorry for this line
- user << "[M] is already too intelligent for this to work!"
- return ..()
- if(M.stat)
- user << "[M] is dead!"
- return..()
-
- user << "You begin to apply the potion to [M]..."
- being_used = 1
-
- var/list/candidates = get_candidates(BE_ALIEN, ALIEN_AFK_BRACKET)
-
- shuffle(candidates)
-
- var/time_passed = world.time
- var/list/consenting_candidates = list()
-
- for(var/candidate in candidates)
-
- if(candidate in not_interested)
- continue
-
- spawn(0)
- switch(alert(candidate, "Would you like to play as [M.name]? Please choose quickly!","Confirmation","Yes","No"))
- if("Yes")
- if((world.time-time_passed)>=50 || !src)
- return
- consenting_candidates += candidate
- if("No")
- if(!src)
- return
- not_interested += candidate
-
- sleep(50)
-
- if(!src)
- return
-
- if(consenting_candidates.len)
- var/client/C = null
- C = pick(consenting_candidates)
- M.key = C.key
- M.languages |= HUMAN
- M.faction -= "neutral"
- M << "All at once it makes sense, you know what you are and who you are! Self awareness is yours!"
- M << "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost."
- user << "[M] is suddenly attentive and aware. It worked!"
- qdel(src)
- else
- user << "[M] looks interested for a moment, but then looks back down. Maybe you should try again later..."
- being_used = 0
- ..()
-
-/obj/item/weapon/slimesteroid
- name = "slime steroid"
- desc = "A potent chemical mix that will cause a slime to generate more extract."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle16"
-
- attack(mob/living/carbon/slime/M as mob, mob/user as mob)
- if(!istype(M, /mob/living/carbon/slime))//If target is not a slime.
- user << " The steroid only works on baby slimes!"
- return ..()
- if(M.is_adult) //Can't tame adults
- user << " Only baby slimes can use the steroid!"
- return..()
- if(M.stat)
- user << " The slime is dead!"
- return..()
- if(M.cores == 3)
- user <<" The slime already has the maximum amount of extract!"
- return..()
-
- user <<"You feed the slime the steroid. It now has triple the amount of extract."
- M.cores = 3
- qdel(src)
-
-/obj/item/weapon/slimesteroid2
- name = "extract enhancer"
- desc = "A potent chemical mix that will give a slime extract three uses."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle17"
-
- /*afterattack(obj/target, mob/user , flag)
- if(istype(target, /obj/item/slime_extract))
- if(target.enhanced == 1)
- user << " This extract has already been enhanced!"
- return ..()
- if(target.Uses == 0)
- user << " You can't enhance a used extract!"
- return ..()
- user <<"You apply the enhancer. It now has triple the amount of uses."
- target.Uses = 3
- target.enahnced = 1
- qdel(src)*/
-
-////////Adamantine Golem stuff I dunno where else to put it
-
-// This will eventually be removed.
-
-/obj/item/clothing/under/golem
- name = "adamantine skin"
- desc = "a golem's skin"
- icon_state = "golem"
- item_state = "golem"
- item_color = "golem"
- flags = ABSTRACT | NODROP
- has_sensor = 0
-
-/obj/item/clothing/suit/golem
- name = "adamantine shell"
- desc = "a golem's thick outter shell"
- icon_state = "golem"
- item_state = "golem"
- w_class = 4//bulky item
- gas_transfer_coefficient = 0.90
- permeability_coefficient = 0.50
- body_parts_covered = FULL_BODY
- flags_inv = HIDEGLOVES | HIDESHOES | HIDEJUMPSUIT
- flags = ABSTRACT | NODROP
-
-/obj/item/clothing/shoes/golem
- name = "golem's feet"
- desc = "sturdy adamantine feet"
- icon_state = "golem"
- item_state = null
- flags = NOSLIP | ABSTRACT | NODROP
-
-
-/obj/item/clothing/mask/breath/golem
- name = "golem's face"
- desc = "the imposing face of an adamantine golem"
- icon_state = "golem"
- item_state = "golem"
- siemens_coefficient = 0
- unacidable = 1
- flags = ABSTRACT | NODROP
-
-
-/obj/item/clothing/gloves/golem
- name = "golem's hands"
- desc = "strong adamantine hands"
- icon_state = "golem"
- item_state = null
- siemens_coefficient = 0
- flags = ABSTRACT | NODROP
-
-
-/obj/item/clothing/head/space/golem
- icon_state = "golem"
- item_state = "dermal"
- item_color = "dermal"
- name = "golem's head"
- desc = "a golem's head"
- unacidable = 1
- flags = ABSTRACT | NODROP
-
-/obj/effect/golemrune
- anchored = 1
- desc = "a strange rune used to create golems. It glows when spirits are nearby."
- name = "rune"
- icon = 'icons/obj/rune.dmi'
- icon_state = "golem"
- unacidable = 1
- layer = TURF_LAYER
-
- New()
- ..()
- SSobj.processing |= src
-
-/obj/effect/golemrune/process()
- var/mob/dead/observer/ghost
- for(var/mob/dead/observer/O in src.loc)
- if(!O.client) continue
- if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
- ghost = O
- break
- if(ghost)
- icon_state = "golem2"
- else
- icon_state = "golem"
-
-/obj/effect/golemrune/attack_hand(mob/living/user as mob)
- var/mob/dead/observer/ghost
- for(var/mob/dead/observer/O in src.loc)
- if(!O.client) continue
- if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
- ghost = O
- break
- if(!ghost)
- user << "The rune fizzles uselessly. There is no spirit nearby."
- return
- var/mob/living/carbon/human/G = new /mob/living/carbon/human
- if(prob(50)) G.gender = "female"
- hardset_dna(G, null, null, null, null, /datum/species/golem/adamantine)
-
- G.set_cloned_appearance()
- G.real_name = text("Adamantine Golem ([rand(1, 1000)])")
- G.dna.species.auto_equip(G)
- G.loc = src.loc
- G.key = ghost.key
- G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost."
- qdel(src)
-
-/mob/living/carbon/slime/getTrail()
- return null
-
-/mob/living/carbon/slime/slip(var/s_amount, var/w_amount, var/obj/O, var/lube)
- if(lube>=2)
- return 0
- .=..()
-
-/mob/living/carbon/slime/stripPanelUnequip(obj/item/what, mob/who)
- src << "You don't have the dexterity to do this!"
- return
-
-/mob/living/carbon/slime/stripPanelEquip(obj/item/what, mob/who)
- src << "You don't have the dexterity to do this!"
- return
-
-
-//////////////////////////////Old shit from metroids/RoRos, and the old cores, would not take much work to re-add them////////////////////////
-
-/*
-// Basically this slime Core catalyzes reactions that normally wouldn't happen anywhere
-/obj/item/slime_core
- name = "slime extract"
- desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"."
- icon = 'icons/mob/slimes.dmi'
- icon_state = "slime extract"
- force = 1.0
- w_class = 1.0
- throwforce = 1.0
- throw_speed = 2
- throw_range = 6
- origin_tech = "biotech=4"
- var/POWERFLAG = 0 // sshhhhhhh
- var/Flush = 30
- var/Uses = 5 // uses before it goes inert
-
-/obj/item/slime_core/New()
- ..()
- create_reagents(100)
- POWERFLAG = rand(1,10)
- Uses = rand(7, 25)
- //flags |= NOREACT
-/*
- spawn()
- Life()
-
- proc/Life()
- while(src)
- sleep(25)
- Flush--
- if(Flush <= 0)
- reagents.clear_reagents()
- Flush = 30
-*/
-
-
-
-/obj/item/weapon/reagent_containers/food/snacks/egg/slime
- name = "slime egg"
- desc = "A small, gelatinous egg."
- icon = 'icons/mob/mob.dmi'
- icon_state = "slime egg-growing"
- bitesize = 12
- origin_tech = "biotech=4"
- var/grown = 0
-
-/obj/item/weapon/reagent_containers/food/snacks/egg/slime/New()
- ..()
- reagents.add_reagent("nutriment", 4)
- reagents.add_reagent("slimejelly", 1)
- spawn(rand(1200,1500))//the egg takes a while to "ripen"
- Grow()
-
-/obj/item/weapon/reagent_containers/food/snacks/egg/slime/proc/Grow()
- grown = 1
- icon_state = "slime egg-grown"
- SSobj.processing.Add(src)
- return
-
-/obj/item/weapon/reagent_containers/food/snacks/egg/slime/proc/Hatch()
- SSobj.processing.Remove(src)
- var/turf/T = get_turf(src)
- src.visible_message(" The [name] pulsates and quivers!")
- spawn(rand(50,100))
- src.visible_message(" The [name] bursts open!")
- new/mob/living/carbon/slime(T)
- qdel(src)
-
-
-/obj/item/weapon/reagent_containers/food/snacks/egg/slime/process()
- var/turf/location = get_turf(src)
- var/datum/gas_mixture/environment = location.return_air()
- if (environment.toxins > MOLES_PLASMA_VISIBLE)//plasma exposure causes the egg to hatch
- src.Hatch()
-
-/obj/item/weapon/reagent_containers/food/snacks/egg/slime/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype( W, /obj/item/toy/crayon ))
- return
- else
- ..()
-*/
diff --git a/code/modules/mob/living/carbon/slime/update_icons.dm b/code/modules/mob/living/carbon/slime/update_icons.dm
deleted file mode 100644
index 3edf65b6f83..00000000000
--- a/code/modules/mob/living/carbon/slime/update_icons.dm
+++ /dev/null
@@ -1,4 +0,0 @@
-//no special icon processing
-
-/mob/living/carbon/slime/update_transform() //They're slimes, they don't lie down.
- return
\ No newline at end of file
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index 9b0accbe230..c0eddd775b7 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -32,11 +32,14 @@
flick(flick_name, animate)
/mob/living/death(gibbed)
+ eye_blind = max(eye_blind, 1)
timeofdeath = world.time
living_mob_list -= src
if(!gibbed)
dead_mob_list += src
+ else if(buckled)
+ buckled.unbuckle_mob()
/mob/living/proc/setup_animation(var/animation, var/prev_lying)
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index 35817513e08..8c712e7c83c 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -85,6 +85,12 @@
message = "[src] flaps its wings."
m_type = 2
+ if ("flip")
+ if (!src.restrained())
+ message = "[src] does a flip!"
+ src.SpinAnimation(5,1)
+ m_type = 2
+
if ("frown")
message = "[src] frowns."
m_type = 1
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
new file mode 100644
index 00000000000..89a2a13a753
--- /dev/null
+++ b/code/modules/mob/living/life.dm
@@ -0,0 +1,180 @@
+/mob/living/Life()
+ set invisibility = 0
+ set background = BACKGROUND_ENABLED
+
+ if (notransform)
+ return
+ if(!loc)
+ return
+ var/datum/gas_mixture/environment = loc.return_air()
+
+ if(stat != DEAD)
+
+ //Breathing, if applicable
+ handle_breathing()
+
+ //Mutations and radiation
+ handle_mutations_and_radiation()
+
+ //Chemicals in the body
+ handle_chemicals_in_body()
+
+ //Blud
+ handle_blood()
+
+ //Random events (vomiting etc)
+ handle_random_events()
+
+ . = 1
+
+ //Handle temperature/pressure differences between body and environment
+ if(environment)
+ handle_environment(environment)
+
+ handle_fire()
+
+ //stuff in the stomach
+ handle_stomach()
+
+ update_gravity(mob_has_gravity())
+
+ for(var/obj/item/weapon/grab/G in src)
+ G.process()
+
+ if(handle_regular_status_updates()) // Status & health update, are we dead or alive etc.
+ handle_disabilities() // eye, ear, brain damages
+ handle_status_effects() //all special effects, stunned, weakened, jitteryness, hallucination, sleeping, etc
+
+ update_canmove()
+
+ if(client)
+ handle_regular_hud_updates()
+
+ return .
+
+
+
+/mob/living/proc/handle_breathing()
+ return
+
+/mob/living/proc/handle_mutations_and_radiation()
+ return
+
+/mob/living/proc/handle_chemicals_in_body()
+ return
+
+/mob/living/proc/handle_blood()
+ return
+
+/mob/living/proc/handle_random_events()
+ return
+
+/mob/living/proc/handle_environment(var/datum/gas_mixture/environment)
+ return
+
+/mob/living/proc/handle_stomach()
+ return
+
+//This updates the health and status of the mob (conscious, unconscious, dead)
+/mob/living/proc/handle_regular_status_updates()
+
+ updatehealth()
+
+ if(stat != DEAD)
+
+ if(paralysis)
+ stat = UNCONSCIOUS
+
+ else if (status_flags & FAKEDEATH)
+ stat = UNCONSCIOUS
+
+ else
+ stat = CONSCIOUS
+
+ return 1
+
+//this updates all special effects: stunned, sleeping, weakened, druggy, stuttering, etc..
+/mob/living/proc/handle_status_effects()
+ if(paralysis)
+ AdjustParalysis(-1)
+ if(stunned)
+ AdjustStunned(-1)
+ if(!stunned)
+ update_icons()
+
+ if(weakened)
+ AdjustWeakened(-1)
+ if(!weakened)
+ update_icons()
+
+/mob/living/proc/handle_disabilities()
+ //Eyes
+ if(disabilities & BLIND || stat) //blindness from disability or unconsciousness doesn't get better on its own
+ eye_blind = max(eye_blind, 1)
+ else if(eye_blind) //blindness, heals slowly over time
+ eye_blind = max(eye_blind-1,0)
+ else if(eye_blurry) //blurry eyes heal slowly
+ eye_blurry = max(eye_blurry-1, 0)
+
+ //Ears
+ if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own
+ setEarDamage(-1, max(ear_deaf, 1))
+ else
+ // deafness heals slowly over time, unless ear_damage is over 100
+ if(ear_damage < 100)
+ adjustEarDamage(-0.05,-1)
+
+
+//this handles hud updates. Calls update_vision() and handle_hud_icons()
+/mob/living/proc/handle_regular_hud_updates()
+ if(!client) return 0
+
+ handle_vision()
+ handle_hud_icons()
+
+ return 1
+
+/mob/living/proc/handle_vision()
+
+ client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask)
+
+ update_sight()
+
+ if(stat != DEAD)
+ if(blind)
+ if(eye_blind)
+ blind.layer = 18
+ else
+ blind.layer = 0
+
+ if (disabilities & NEARSIGHT)
+ client.screen += global_hud.vimpaired
+
+ if (eye_blurry)
+ client.screen += global_hud.blurry
+
+ if (druggy)
+ client.screen += global_hud.druggy
+
+ if(eye_stat > 20)
+ if(eye_stat > 30)
+ client.screen += global_hud.darkMask
+ else
+ client.screen += global_hud.vimpaired
+
+ if(machine)
+ if (!( machine.check_eye(src) ))
+ reset_view(null)
+ else
+ if(!client.adminobs)
+ reset_view(null)
+
+/mob/living/proc/update_sight()
+ return
+
+/mob/living/proc/handle_hud_icons()
+ handle_hud_icons_health()
+ return
+
+/mob/living/proc/handle_hud_icons_health()
+ return
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 782b47d5847..fd28cd22c86 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -8,7 +8,6 @@ Sorry Giacom. Please don't be mad :(
push_mob_back(src, A.push_dir)
*/
-
/mob/living/New()
. = ..()
generateStaticOverlay()
@@ -97,7 +96,7 @@ Sorry Giacom. Please don't be mad :(
M.loc = oldloc
M.LAssailant = src
- for(var/mob/living/carbon/slime/slime in view(1,M))
+ for(var/mob/living/simple_animal/slime/slime in view(1,M))
if(slime.Victim == M)
slime.UpdateFeed()
@@ -443,10 +442,10 @@ Sorry Giacom. Please don't be mad :(
C.reagents.clear_reagents()
for(var/datum/disease/D in viruses)
D.cure(0)
- if(stat == 2)
+ if(stat == DEAD)
dead_mob_list -= src
living_mob_list += src
- if(!isanimal(src)) stat = CONSCIOUS
+ stat = CONSCIOUS
if(ishuman(src))
var/mob/living/carbon/human/human_mob = src
human_mob.restore_blood()
@@ -454,8 +453,7 @@ Sorry Giacom. Please don't be mad :(
update_fire()
regenerate_icons()
- ..()
- return
+
/mob/living/proc/update_damage_overlays()
return
@@ -549,7 +547,7 @@ Sorry Giacom. Please don't be mad :(
s_active.close(src)
if(update_slimes)
- for(var/mob/living/carbon/slime/M in view(1,src))
+ for(var/mob/living/simple_animal/slime/M in view(1,src))
M.UpdateFeed(src)
/mob/living/proc/makeTrail(var/turf/T, var/mob/living/M)
@@ -695,13 +693,12 @@ Sorry Giacom. Please don't be mad :(
if(do_after(usr, 600))
if(!C.buckled)
return
- C.visible_message("[C] manages to unbuckle themself!", \
- "You successfully unbuckle yourself.")
C.buckled.user_unbuckle_mob(C,C)
else
- C << "You fail to unbuckle yourself!"
+ if(C && C.buckled)
+ C << "You fail to unbuckle yourself!"
else
- L.buckled.user_unbuckle_mob(L,L)
+ C.buckled.user_unbuckle_mob(C,C)
else
L.buckled.user_unbuckle_mob(L,L)
@@ -883,3 +880,28 @@ Sorry Giacom. Please don't be mad :(
animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y) , time = 2)
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure to restart it in next life().
+/mob/living/proc/get_temperature(var/datum/gas_mixture/environment)
+ var/loc_temp = T0C
+ if(istype(loc, /obj/mecha))
+ var/obj/mecha/M = loc
+ loc_temp = M.return_temperature()
+
+ else if(istype(loc, /obj/structure/transit_tube_pod))
+ loc_temp = environment.temperature
+
+ else if(istype(get_turf(src), /turf/space))
+ var/turf/heat_turf = get_turf(src)
+ loc_temp = heat_turf.temperature
+
+ else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
+ var/obj/machinery/atmospherics/unary/cryo_cell/C = loc
+
+ if(C.air_contents.total_moles() < 10)
+ loc_temp = environment.temperature
+ else
+ loc_temp = C.air_contents.temperature
+
+ else
+ loc_temp = environment.temperature
+
+ return loc_temp
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index aedc993e895..28acd2aa693 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -161,7 +161,7 @@ proc/vol_by_throwforce_and_or_w_class(var/obj/item/I)
visible_message("[user] has grabbed [src] passively!")
-/mob/living/attack_slime(mob/living/carbon/slime/M as mob)
+/mob/living/attack_slime(mob/living/simple_animal/slime/M as mob)
if (!ticker)
M << "You cannot attack people before the game has started."
return
@@ -170,26 +170,11 @@ proc/vol_by_throwforce_and_or_w_class(var/obj/item/I)
return // can't attack while eating!
if (stat != DEAD)
+ add_logs(M, src, "attacked", admin=0)
M.do_attack_animation(src)
visible_message("The [M.name] glomps [src]!", \
"The [M.name] glomps [src]!")
-
- if(M.powerlevel > 0)
- var/stunprob = M.powerlevel * 7 + 10 // 17 at level 1, 80 at level 10
- if(prob(stunprob))
- M.powerlevel -= 3
- if(M.powerlevel < 0)
- M.powerlevel = 0
-
- visible_message("The [M.name] has shocked [src]!", \
- "The [M.name] has shocked [src]!")
-
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(5, 1, src)
- s.start()
- return 1
- add_logs(M, src, "attacked", admin=0)
- return
+ return 1
/mob/living/attack_animal(mob/living/simple_animal/M as mob)
if(M.melee_damage_upper == 0)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 1b3b9fbe187..05ba0479602 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -783,6 +783,6 @@ var/list/ai_list = list()
set_autosay()
-/mob/living/silicon/ai/attack_slime(mob/living/carbon/slime/user)
+/mob/living/silicon/ai/attack_slime(mob/living/simple_animal/slime/user)
return
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index a3fd584aac4..8566b31eff0 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -1,11 +1,11 @@
/mob/living/silicon/ai/Life()
- if (src.stat == 2)
+ if (src.stat == DEAD)
return
else //I'm not removing that shitton of tabs, unneeded as they are. -- Urist
//Being dead doesn't mean your temperature never changes
var/turf/T = get_turf(src)
- if (src.stat!=0)
+ if (src.stat!= CONSCIOUS)
src.cameraFollow = null
src.reset_view(null)
src.unset_machine()
diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm
index 04e80299d9a..c0017863de6 100644
--- a/code/modules/mob/living/silicon/pai/life.dm
+++ b/code/modules/mob/living/silicon/pai/life.dm
@@ -1,5 +1,5 @@
/mob/living/silicon/pai/Life()
- if (src.stat == 2)
+ if (src.stat == DEAD)
return
if(src.cable)
if(get_dist(src, src.cable) > 1)
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index e8767275e01..e12b5db835b 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -19,7 +19,8 @@
..(animate, "dust-r")
/mob/living/silicon/robot/death(gibbed)
- if(stat == DEAD) return
+ if(stat == DEAD)
+ return
if(!gibbed)
emote("deathgasp")
stat = DEAD
@@ -29,7 +30,8 @@
uneq_all() // particularly to ensure sight modes are cleared
- if(blind) blind.layer = 0
+ if(blind)
+ blind.layer = 0
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
see_in_dark = 8
see_invisible = SEE_INVISIBLE_LEVEL_TWO
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 94ee5d29975..09aef431b21 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -5,23 +5,8 @@
if (src.notransform)
return
- //Status updates, death etc.
clamp_values()
- handle_regular_status_updates()
-
- if(client)
- handle_regular_hud_updates()
- update_items()
- if (src.stat != DEAD) //still using power
- use_power()
-
- update_canmove()
-
- update_gravity(mob_has_gravity())
-
- handle_fire()
-
-
+ ..()
/mob/living/silicon/robot/proc/clamp_values()
@@ -36,51 +21,40 @@
/mob/living/silicon/robot/proc/use_power()
- if (src.cell)
- if(src.cell.charge <= 0)
+ if(cell)
+ if(cell.charge <= 0)
uneq_all()
- src.stat = 1
- else if (src.cell.charge <= 100)
+ stat = UNCONSCIOUS
+ else if (cell.charge <= 100)
uneq_all()
- src.cell.use(1)
+ cell.use(1)
else
- if(src.module_state_1)
- src.cell.use(5)
- if(src.module_state_2)
- src.cell.use(5)
- if(src.module_state_3)
- src.cell.use(5)
- src.cell.use(1)
- src.eye_blind = 0
- src.stat = 0
+ if(module_state_1)
+ cell.use(5)
+ if(module_state_2)
+ cell.use(5)
+ if(module_state_3)
+ cell.use(5)
+ cell.use(1)
else
uneq_all()
- src.stat = 1
+ stat = UNCONSCIOUS
-/mob/living/silicon/robot/proc/handle_regular_status_updates()
+/mob/living/silicon/robot/handle_regular_status_updates()
- if(src.camera && !scrambledcodes)
- if(src.stat == 2 || wires.IsCameraCut())
- src.camera.status = 0
+ if(camera && !scrambledcodes)
+ if(stat == DEAD || wires.IsCameraCut())
+ camera.status = 0
else
- src.camera.status = 1
+ camera.status = 1
- health = maxHealth - (getOxyLoss() + getFireLoss() + getBruteLoss())
+ if (..()) //Alive.
- if(getOxyLoss() > 50) Paralyse(3)
+ if(health <= config.health_threshold_dead) //die only once
+ death()
+ return
- if(src.sleeping)
- Paralyse(3)
- src.sleeping--
-
- if(src.resting)
- Weaken(5)
-
- if(health <= config.health_threshold_dead && src.stat != 2) //die only once
- death()
-
- if (src.stat != 2) //Alive.
if(health < 50) //Gradual break down of modules as more damage is sustained
if(uneq_module(module_state_3))
src << "SYSTEM ERROR: Module 3 OFFLINE."
@@ -91,47 +65,48 @@
if(uneq_module(module_state_1))
src << "CRITICAL ERROR: All modules OFFLINE."
- if (src.paralysis || src.stunned || src.weakened) //Stunned etc.
- src.stat = 1
- if (src.stunned > 0)
- AdjustStunned(-1)
- if (src.weakened > 0)
- AdjustWeakened(-1)
- if (src.paralysis > 0)
- AdjustParalysis(-1)
- src.eye_blind = max(eye_blind, 1)
- else
- src.eye_blind = 0
+ if(getOxyLoss() > 50)
+ Paralyse(3)
- else //Not stunned.
- src.stat = 0
+ if (paralysis || stunned || weakened) //Stunned etc.
+ stat = UNCONSCIOUS
- else //Dead.
- src.eye_blind = 1
+ use_power()
- if (src.stuttering) src.stuttering--
+ return 1
- if (src.eye_blind)
- src.eye_blind--
+/mob/living/silicon/robot/handle_status_effects()
+ ..()
+ if (stuttering)
+ stuttering = max(0, stuttering - 1)
- src.density = !( src.lying )
+ if (druggy)
+ druggy = max(0, druggy - 1)
- if (src.disabilities & BLIND)
- src.eye_blind = max(1, eye_blind)
+/mob/living/silicon/robot/handle_regular_hud_updates()
- if (src.eye_blurry > 0)
- src.eye_blurry--
- src.eye_blurry = max(0, src.eye_blurry)
-
- if (src.druggy > 0)
- src.druggy--
- src.druggy = max(0, src.druggy)
+ if(!client)
+ return
+ if (syndicate)
+ if(ticker.mode.name == "traitor")
+ for(var/datum/mind/tra in ticker.mode.traitors)
+ if(tra.current)
+ var/I = image('icons/mob/mob.dmi', loc = tra.current, icon_state = "traitor") //no traitor sprite in that dmi!
+ src.client.images += I
+ if(connected_ai)
+ connected_ai.connected_robots -= src
+ connected_ai = null
+ if(mind)
+ if(!mind.special_role)
+ mind.special_role = "traitor"
+ ticker.mode.traitors += mind
+ ..()
return 1
-/mob/living/silicon/robot/proc/handle_regular_hud_updates()
+/mob/living/silicon/robot/update_sight()
- if (src.stat == 2 || src.sight_mode & BORGXRAY)
+ if (stat == DEAD || src.sight_mode & BORGXRAY)
src.sight |= SEE_TURFS
src.sight |= SEE_MOBS
src.sight |= SEE_OBJS
@@ -150,7 +125,7 @@
else if (src.sight_mode & BORGTHERM)
src.sight |= SEE_MOBS
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
- else if (src.stat != 2)
+ else if (src.stat != DEAD)
src.sight &= ~SEE_MOBS
src.sight &= ~SEE_TURFS
src.sight &= ~SEE_OBJS
@@ -158,39 +133,32 @@
if(see_override)
see_invisible = see_override
- if (src.healths)
- if (src.stat != 2)
+/mob/living/silicon/robot/handle_hud_icons()
+ update_items()
+ update_cell()
+ ..()
+
+/mob/living/silicon/robot/handle_hud_icons_health()
+ if (healths)
+ if (stat != DEAD)
switch(health)
if(100 to INFINITY)
- src.healths.icon_state = "health0"
+ healths.icon_state = "health0"
if(50 to 100)
- src.healths.icon_state = "health2"
+ healths.icon_state = "health2"
if(0 to 50)
- src.healths.icon_state = "health3"
+ healths.icon_state = "health3"
if(-50 to 0)
- src.healths.icon_state = "health4"
+ healths.icon_state = "health4"
if(config.health_threshold_dead to -50)
- src.healths.icon_state = "health5"
+ healths.icon_state = "health5"
else
- src.healths.icon_state = "health6"
+ healths.icon_state = "health6"
else
- src.healths.icon_state = "health7"
+ healths.icon_state = "health7"
- if (src.syndicate && src.client)
- if(ticker.mode.name == "traitor")
- for(var/datum/mind/tra in ticker.mode.traitors)
- if(tra.current)
- var/I = image('icons/mob/mob.dmi', loc = tra.current, icon_state = "traitor")
- src.client.images += I
- if(src.connected_ai)
- src.connected_ai.connected_robots -= src
- src.connected_ai = null
- if(src.mind)
- if(!src.mind.special_role)
- src.mind.special_role = "traitor"
- ticker.mode.traitors += src.mind
-
- if (src.cell)
+/mob/living/silicon/robot/proc/update_cell()
+ if (cell)
var/cellcharge = src.cell.charge/src.cell.maxcharge
switch(cellcharge)
if(0.75 to INFINITY)
@@ -206,44 +174,18 @@
else
throw_alert("charge","nocell")
- client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired)
-
- if ((src.blind && src.stat != 2))
- if(src.eye_blind)
- src.blind.layer = 18
- else
- src.blind.layer = 0
- if (src.disabilities & NEARSIGHT)
- src.client.screen += global_hud.vimpaired
-
- if (src.eye_blurry)
- src.client.screen += global_hud.blurry
-
- if (src.druggy)
- src.client.screen += global_hud.druggy
-
- if (src.stat != 2)
- if (src.machine)
- if (!( src.machine.check_eye(src) ))
- src.reset_view(null)
- else
- if(!client.adminobs)
- reset_view(null)
-
- return 1
-
/mob/living/silicon/robot/proc/update_items()
- if (src.client)
- src.client.screen -= src.contents
- for(var/obj/I in src.contents)
+ if (client)
+ client.screen -= contents
+ for(var/obj/I in contents)
if(I && !(istype(I,/obj/item/weapon/stock_parts/cell) || istype(I,/obj/item/device/radio) || istype(I,/obj/machinery/camera) || istype(I,/obj/item/device/mmi)))
- src.client.screen += I
- if(src.module_state_1)
- src.module_state_1:screen_loc = ui_inv1
- if(src.module_state_2)
- src.module_state_2:screen_loc = ui_inv2
- if(src.module_state_3)
- src.module_state_3:screen_loc = ui_inv3
+ client.screen += I
+ if(module_state_1)
+ module_state_1:screen_loc = ui_inv1
+ if(module_state_2)
+ module_state_2:screen_loc = ui_inv2
+ if(module_state_3)
+ module_state_3:screen_loc = ui_inv3
//Robots on fire
@@ -269,6 +211,8 @@
IgniteMob()
/mob/living/silicon/robot/update_canmove()
- if(paralysis || stunned || weakened || buckled || lockcharge) canmove = 0
- else canmove = 1
+ if(paralysis || stunned || weakened || buckled || lockcharge)
+ canmove = 0
+ else
+ canmove = 1
return canmove
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index e98c41fb681..6fcf7c2c9d1 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -636,7 +636,7 @@
-/mob/living/silicon/robot/attack_slime(mob/living/carbon/slime/M as mob)
+/mob/living/silicon/robot/attack_slime(mob/living/simple_animal/slime/M as mob)
if(..()) //successful slime shock
flick("noise", flash)
var/stunprob = M.powerlevel * 7 + 10
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index 7fe05e7dce4..f15bf738781 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -1,14 +1,6 @@
/mob/living/silicon/say(var/message)
return ..(message, "R")
-/mob/living/silicon/say_quote(input, spans)
- if(copytext(input, length(input) - 1) == "!!")
- spans |= SPAN_YELL
- input = attach_spans(input, spans)
- return "alarms, \"[input]\""
-
- return ..()
-
/mob/living/silicon/get_spans()
return ..() | SPAN_ROBOT
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 0256aaa0a9f..24bb007c3d2 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -5,7 +5,8 @@
has_unlimited_silicon_privilege = 1
verb_say = "states"
verb_ask = "queries"
- verb_yell = "declares"
+ verb_exclaim = "declares"
+ verb_yell = "alarms"
var/syndicate = 0
var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS
var/list/alarms_to_show = list()
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 59f3d664c1a..4005451ecc9 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -7,21 +7,13 @@
response_help = "thinks better of touching"
response_disarm = "flails at"
response_harm = "punches"
- icon_dead = "shade_dead"
icon = 'icons/mob/mob.dmi'
speed = 0
a_intent = "harm"
stop_automated_movement = 1
status_flags = CANPUSH
attack_sound = 'sound/weapons/punch1.ogg'
- min_oxy = 0
- max_oxy = 0
- min_tox = 0
- max_tox = 0
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
faction = list("cult")
var/list/construct_spells = list()
@@ -34,8 +26,8 @@
for(var/spell in construct_spells)
mob_spell_list += new spell(src)
-/mob/living/simple_animal/construct/Die()
- ..()
+/mob/living/simple_animal/construct/death()
+ ..(1)
new /obj/item/weapon/ectoplasm (src.loc)
visible_message("[src] collapses in a shattered heap.")
ghostize()
@@ -57,7 +49,7 @@
/mob/living/simple_animal/construct/attack_animal(mob/living/simple_animal/M as mob)
if(istype(M, /mob/living/simple_animal/construct/builder))
- health += 5
+ adjustBruteLoss(-5)
M.emote("me", 1, "mends some of \the [src]'s wounds.")
else if(src != M)
..()
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index 4c5633207aa..d01b0412edb 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -24,8 +24,8 @@
pcollar = new(src)
update_collar()
-/mob/living/simple_animal/pet/Die()
- ..()
+/mob/living/simple_animal/pet/death(gibbed)
+ ..(gibbed)
update_collar()
/mob/living/simple_animal/pet/proc/update_collar()
@@ -58,6 +58,7 @@
see_in_dark = 5
childtype = /mob/living/simple_animal/pet/corgi/puppy
species = /mob/living/simple_animal/pet/corgi
+ var/shaved = 0
var/obj/item/inventory_head
var/obj/item/inventory_back
var/facehugger
@@ -67,15 +68,16 @@
..()
regenerate_icons()
-/mob/living/simple_animal/pet/corgi/Die()
- ..()
+
+/mob/living/simple_animal/pet/corgi/death(gibbed)
+ ..(gibbed)
regenerate_icons()
/mob/living/simple_animal/pet/corgi/revive()
..()
regenerate_icons()
-/mob/living/simple_animal/pet/corgi/sac_act(var/obj/effect/rune/R, victim)
+/mob/living/simple_animal/pet/corgi/sac_act(var/obj/effect/rune/R, victim) //Still the best thing in this game
usr << "Even dark gods from another plane have standards, sicko."
usr.reagents.add_reagent("hell_water", 2)
R.stone_or_gib(victim)
@@ -120,8 +122,21 @@
for(var/i in list(1,2,4,8,4,2,1,2))
dir = i
sleep(1)
- else
- ..()
+
+ if (istype(O, /obj/item/weapon/razor))
+ if (shaved)
+ user << "You can't shave this corgi, it's already been shaved."
+ return
+ user.visible_message("[user] starts to shave [src] using \the [O].")
+ if(do_after(user, 50))
+ user.visible_message("[user] shaves [src]'s hair using \the [O]. ")
+ playsound(loc, 'sound/items/Welder2.ogg', 20, 1)
+ shaved = 1
+ icon_state = "[initial(icon_living)]_shaved"
+ icon_living = "[initial(icon_living)]_shaved"
+ icon_dead = "[initial(icon_living)]_shaved_dead"
+ return
+ ..()
/mob/living/simple_animal/pet/corgi/Topic(href, href_list)
@@ -507,6 +522,7 @@
icon_state = "puppy"
icon_living = "puppy"
icon_dead = "puppy_dead"
+ shaved = 0
mob_size = MOB_SIZE_SMALL
accept_collar = 1
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
index c91808e5d58..6b7f731e675 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
@@ -19,8 +19,6 @@
gender = NEUTER
health = 30
maxHealth = 30
- heat_damage_per_tick = 0
- cold_damage_per_tick = 0
unsuitable_atmos_damage = 0
wander = 0
speed = 0
@@ -94,8 +92,8 @@
pickVisualAppearence()
-/mob/living/simple_animal/drone/Die()
- ..()
+/mob/living/simple_animal/drone/death(gibbed)
+ ..(gibbed)
drop_l_hand()
drop_r_hand()
if(internal_storage)
@@ -174,4 +172,7 @@
src << "--- [class] alarm in [A.name] has been cleared."
/mob/living/simple_animal/drone/check_eye_prot()
- return 2
\ No newline at end of file
+ return 2
+
+/mob/living/simple_animal/drone/handle_temperature_damage()
+ return
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
index 1a9dfb7db3e..d5d8cf19f5c 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
@@ -94,7 +94,8 @@
if(health < health_repair_max)
user << "You start to tighten loose screws on [src]."
if(do_after(user,80))
- health = health_repair_max
+ var/repair = health_repair_max - health
+ adjustBruteLoss(-repair)
visible_message("[user] tightens [src == user ? "their" : "[src]'s"] loose screws!")
else
user << "You need to remain still to tighten [src]'s screws."
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 b01d3ef8d56..8ade1262914 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -201,6 +201,8 @@ var/global/chicken_count = 0
speak_chance = 2
turns_per_move = 3
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
+ var/egg_type = /obj/item/weapon/reagent_containers/food/snacks/egg
+ var/food_type = /obj/item/weapon/reagent_containers/food/snacks/grown/wheat
meat_amount = 2
response_help = "pets"
response_disarm = "gently pushes aside"
@@ -209,28 +211,34 @@ var/global/chicken_count = 0
health = 10
ventcrawler = 2
var/eggsleft = 0
+ var/eggsFertile = TRUE
var/body_color
+ var/icon_prefix = "chicken"
pass_flags = PASSTABLE
+ var/list/feedMessages = list("It clucks happily.","It clucks happily.")
+ var/list/layMessage = list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")
+ var/list/validColors = list("brown","black","white")
/mob/living/simple_animal/chicken/New()
..()
if(!body_color)
- body_color = pick( list("brown","black","white") )
- icon_state = "chicken_[body_color]"
- icon_living = "chicken_[body_color]"
- icon_dead = "chicken_[body_color]_dead"
+ body_color = pick(validColors)
+ icon_state = "[icon_prefix]_[body_color]"
+ icon_living = "[icon_prefix]_[body_color]"
+ icon_dead = "[icon_prefix]_[body_color]_dead"
pixel_x = rand(-6, 6)
pixel_y = rand(0, 10)
chicken_count += 1
-/mob/living/simple_animal/chicken/Die()
- ..()
+/mob/living/simple_animal/chicken/death(gibbed)
+ ..(gibbed)
chicken_count -= 1
/mob/living/simple_animal/chicken/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
- if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/wheat)) //feedin' dem chickens
+ if(istype(O, food_type)) //feedin' dem chickens
if(!stat && eggsleft < 8)
- user.visible_message("[user] feeds [O] to [name]! It clucks happily.","You feed [O] to [name]! It clucks happily.")
+ var/feedmsg = "[user] feeds [O] to [name]! [pick(feedMessages)]"
+ user.visible_message(feedmsg)
user.drop_item()
qdel(O)
eggsleft += rand(1, 4)
@@ -245,13 +253,14 @@ var/global/chicken_count = 0
if(!.)
return
if(!stat && prob(3) && eggsleft > 0)
- visible_message("[src] [pick("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")]")
+ visible_message("[src] [pick(layMessage)]")
eggsleft--
- var/obj/item/weapon/reagent_containers/food/snacks/egg/E = new(get_turf(src))
+ var/obj/item/E = new egg_type(get_turf(src))
E.pixel_x = rand(-6,6)
E.pixel_y = rand(-6,6)
- if(chicken_count < MAX_CHICKENS && prob(25))
- SSobj.processing |= E
+ if(eggsFertile)
+ if(chicken_count < MAX_CHICKENS && prob(25))
+ SSobj.processing |= E
/obj/item/weapon/reagent_containers/food/snacks/egg/var/amount_grown = 0
/obj/item/weapon/reagent_containers/food/snacks/egg/process()
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index c59bf21ec64..38e9f399ae1 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -36,14 +36,16 @@
/mob/living/simple_animal/mouse/proc/splat()
src.health = 0
src.icon_dead = "mouse_[body_color]_splat"
- Die()
+ death()
-/mob/living/simple_animal/mouse/Die()
- ..()
+/mob/living/simple_animal/mouse/death(gibbed)
if(!ckey)
+ ..(1)
var/obj/item/trash/deadmouse/M = new(src.loc)
- M.icon_state = src.icon_dead
+ M.icon_state = icon_dead
qdel(src)
+ else
+ ..(gibbed)
/mob/living/simple_animal/mouse/Crossed(AM as mob|obj)
if( ishuman(AM) )
diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm
deleted file mode 100644
index 85405278096..00000000000
--- a/code/modules/mob/living/simple_animal/friendly/slime.dm
+++ /dev/null
@@ -1,35 +0,0 @@
-/mob/living/simple_animal/slime
- name = "pet slime"
- desc = "A lovable, domesticated slime."
- icon = 'icons/mob/slimes.dmi'
- icon_state = "grey baby slime"
- icon_living = "grey baby slime"
- icon_dead = "grey baby slime dead"
- speak_emote = list("chirps")
- health = 100
- maxHealth = 100
- response_help = "pets"
- response_disarm = "shoos"
- response_harm = "stomps on"
- emote_see = list("jiggles", "bounces in place")
- ventcrawler = 2
- var/colour = "grey"
-
-/mob/living/simple_animal/slime/adult
- health = 200
- maxHealth = 200
- icon_state = "grey adult slime"
- icon_living = "grey adult slime"
-
-/mob/living/simple_animal/slime/adult/New()
- ..()
- overlays += "aslime-:33"
-
-/mob/living/simple_animal/slime/adult/Die()
- for(var/i = 0, i<=1, i++)
- var/mob/living/simple_animal/slime/S1 = new /mob/living/simple_animal/slime (src.loc)
- S1.icon_state = "[colour] baby slime"
- S1.icon_living = "[colour] baby slime"
- S1.icon_dead = "[colour] baby slime dead"
- S1.colour = "[colour]"
- qdel(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index 90294014e67..0af9b62a638 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -21,19 +21,13 @@
attacktext = "slashes"
a_intent = "harm"
attack_sound = 'sound/weapons/bladeslice.ogg'
- min_oxy = 0
- max_oxy = 0
- min_tox = 0
- max_tox = 0
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 15
faction = list("alien")
status_flags = CANPUSH
minbodytemp = 0
- heat_damage_per_tick = 20
+ see_in_dark = 8
+ see_invisible = SEE_INVISIBLE_MINIMUM
/mob/living/simple_animal/hostile/alien/drone
name = "alien drone"
@@ -136,7 +130,13 @@
damage = 30
icon_state = "toxin"
-/mob/living/simple_animal/hostile/alien/Die()
- ..()
+/mob/living/simple_animal/hostile/alien/death(gibbed)
+ ..(gibbed)
visible_message("[src] lets out a waning guttural screech, green blood bubbling from its maw...")
playsound(src, 'sound/voice/hiss6.ogg', 100, 1)
+
+/mob/living/simple_animal/hostile/alien/handle_temperature_damage()
+ if(bodytemperature < minbodytemp)
+ adjustBruteLoss(2)
+ else if(bodytemperature > maxbodytemp)
+ adjustBruteLoss(20)
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index 6e6022cd1ee..5a05889ccd9 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -28,14 +28,7 @@
friendly = "bear hugs"
//Space bears aren't affected by cold.
- min_oxy = 0
- max_oxy = 0
- min_tox = 0
- max_tox = 0
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = 1500
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index 66707ccf069..31316587039 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -3,7 +3,6 @@
desc = ""
icon_state = "bee_1"
icon_living = "bee"
- icon_dead = ""
speak_emote = list("buzzes")
emote_hear = list("buzzes")
turns_per_move = 0
@@ -23,14 +22,7 @@
pass_flags = PASSTABLE
//Spaceborn beings don't get hurt by space
- min_oxy = 0
- max_oxy = 0
- min_tox = 0
- max_tox = 0
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
/mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(var/movement_dir = 0)
@@ -40,8 +32,9 @@
..()
update_bees()
-/mob/living/simple_animal/hostile/poison/bees/Die()
- ..()
+/mob/living/simple_animal/hostile/poison/bees/death(gibbed)
+ ..(1)
+ ghostize()
qdel(src)
return
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index f60245b6415..651ed536c0d 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -23,14 +23,7 @@
attack_sound = 'sound/weapons/bite.ogg'
//Space carp aren't affected by cold.
- min_oxy = 0
- max_oxy = 0
- min_tox = 0
- max_tox = 0
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = 1500
@@ -57,7 +50,9 @@
icon_living = "holocarp"
maxbodytemp = INFINITY
-/mob/living/simple_animal/hostile/carp/holocarp/Die()
+/mob/living/simple_animal/hostile/carp/holocarp/death()
+ ..(1)
+ ghostize()
qdel(src)
return
diff --git a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm
index 46f2e679e22..313798c6b22 100644
--- a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm
@@ -5,7 +5,6 @@
desc = "An odd looking creature, it won't stop staring..."
icon_state = "eyeball"
icon_living = "eyeball"
- icon_dead = ""
icon_gib = ""
meat_type = null
meat_amount = 0
@@ -29,6 +28,7 @@
if(.)
emote("me", 1, "glares at [.]")
-/mob/living/simple_animal/hostile/carp/eyeball/Die()
+/mob/living/simple_animal/hostile/carp/eyeball/death()
+ ..(1)
+ ghostize()
qdel(src)
- return
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm
index 51465393c2c..aa8912cb618 100644
--- a/code/modules/mob/living/simple_animal/hostile/faithless.dm
+++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm
@@ -19,14 +19,7 @@
attacktext = "grips"
attack_sound = 'sound/hallucinations/growl1.ogg'
- min_oxy = 0
- max_oxy = 0
- min_tox = 0
- max_tox = 0
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
faction = list("faithless")
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index b4582cd4d46..c0219aac81b 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -43,8 +43,6 @@
health = 200
melee_damage_lower = 15
melee_damage_upper = 20
- heat_damage_per_tick = 20
- cold_damage_per_tick = 20
faction = list("spiders")
var/busy = 0
pass_flags = PASSTABLE
@@ -264,6 +262,12 @@
busy = 0
stop_automated_movement = 0
+/mob/living/simple_animal/hostile/poison/giant_spider/handle_temperature_damage()
+ if(bodytemperature < minbodytemp)
+ adjustBruteLoss(20)
+ else if(bodytemperature > maxbodytemp)
+ adjustBruteLoss(20)
+
#undef SPINNING_WEB
#undef LAYING_EGGS
#undef MOVING_TO_TARGET
diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
new file mode 100644
index 00000000000..4065fcfe198
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
@@ -0,0 +1,59 @@
+#define EGG_INCUBATION_TIME 180
+
+/mob/living/simple_animal/hostile/headcrab
+ name = "Headslug"
+ desc = "Absolutely not de-beaked or harmless. Keep away from corpses."
+ icon_state = "headcrab"
+ icon_living = "headcrab"
+ icon_dead = "headcrab_dead"
+ health = 20
+ maxHealth = 20
+ melee_damage_lower = 5
+ melee_damage_upper = 5
+ attacktext = "chomps"
+ attack_sound = 'sound/weapons/bite.ogg'
+ faction = list("creature")
+ robust_searching = 1
+ stat_attack = 2
+ environment_smash = 0
+ var/datum/mind/origin
+
+/mob/living/simple_animal/hostile/headcrab/proc/Infect(var/mob/living/carbon/human/victim)
+ var/obj/item/body_egg/changeling_egg/egg = new(victim)
+ egg.owner = origin
+ victim.internal_organs += egg
+ visible_message("[src] lays an egg in a [victim]!")
+
+/mob/living/simple_animal/hostile/headcrab/AttackingTarget()
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ if(H.stat == DEAD)
+ Infect(target)
+ death()
+ return
+ target.attack_animal(src)
+
+
+
+
+/obj/item/body_egg/changeling_egg
+ name = "changeling egg"
+ desc = "Twitching and disgusting"
+ var/datum/mind/owner
+ var/time
+
+/obj/item/body_egg/changeling_egg/egg_process()
+ //Changeling eggs grow in dead people
+ time++
+ if(time >= EGG_INCUBATION_TIME)
+ Pop()
+
+obj/item/body_egg/changeling_egg/proc/Pop()
+ var/mob/living/carbon/monkey/M = new(affected_mob.loc)
+ owner.transfer_to(M)
+ owner.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null)
+ M.key = owner.key
+ affected_mob.gib()
+ qdel(src)
+
+#undef EGG_INCUBATION_TIME
diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
index 0915a8e5b5c..b79fecee6ef 100644
--- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
@@ -17,14 +17,7 @@
projectilesound = 'sound/weapons/Gunshot.ogg'
projectiletype = /obj/item/projectile/hivebotbullet
faction = list("hivebot")
- min_oxy = 0
- max_oxy = 0
- min_tox = 0
- max_tox = 0
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
/mob/living/simple_animal/hostile/hivebot/range
@@ -46,13 +39,14 @@
health = 80
ranged = 1
-/mob/living/simple_animal/hostile/hivebot/Die()
- ..()
- visible_message("[src] blows apart!")
+/mob/living/simple_animal/hostile/hivebot/death(gibbed)
+ ..(1)
+ visible_message("[src] blows apart!")
new /obj/effect/decal/cleanable/robot_debris(src.loc)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
+ ghostize()
qdel(src)
return
@@ -72,38 +66,35 @@
var/spawn_delay = 600
var/turn_on = 0
var/auto_spawn = 1
- proc
- warpbots()
+
+/mob/living/simple_animal/hostile/hivebot/tele/New()
+ ..()
+ var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
+ smoke.set_up(5, 0, src.loc)
+ smoke.start()
+ visible_message("The [src] warps in!")
+ playsound(src.loc, 'sound/effects/EMPulse.ogg', 25, 1)
+
+/mob/living/simple_animal/hostile/hivebot/tele/proc/warpbots()
+ icon_state = "def_radar"
+ visible_message("The [src] turns on!")
+ while(bot_amt > 0)
+ bot_amt--
+ switch(bot_type)
+ if("norm")
+ new /mob/living/simple_animal/hostile/hivebot(get_turf(src))
+ if("range")
+ new /mob/living/simple_animal/hostile/hivebot/range(get_turf(src))
+ if("rapid")
+ new /mob/living/simple_animal/hostile/hivebot/rapid(get_turf(src))
+ spawn(100)
+ qdel(src)
+ return
- New()
- ..()
- var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
- smoke.set_up(5, 0, src.loc)
- smoke.start()
- visible_message("The [src] warps in!")
- playsound(src.loc, 'sound/effects/EMPulse.ogg', 25, 1)
-
- warpbots()
- icon_state = "def_radar"
- visible_message("The [src] turns on!")
- while(bot_amt > 0)
- bot_amt--
- switch(bot_type)
- if("norm")
- new /mob/living/simple_animal/hostile/hivebot(get_turf(src))
- if("range")
- new /mob/living/simple_animal/hostile/hivebot/range(get_turf(src))
- if("rapid")
- new /mob/living/simple_animal/hostile/hivebot/rapid(get_turf(src))
- spawn(100)
- qdel(src)
- return
-
-
- Life()
- ..()
- if(stat == 0)
- if(prob(2))//Might be a bit low, will mess with it likely
- warpbots()
+/mob/living/simple_animal/hostile/hivebot/tele/Life()
+ ..()
+ if(stat == 0)
+ if(prob(2))//Might be a bit low, will mess with it likely
+ warpbots()
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 7d1b74fe07a..91a67fcb380 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -236,9 +236,9 @@
//////////////END HOSTILE MOB TARGETTING AND AGGRESSION////////////
-/mob/living/simple_animal/hostile/Die()
+/mob/living/simple_animal/hostile/death(gibbed)
LoseAggro()
- ..()
+ ..(gibbed)
walk(src, 0)
/mob/living/simple_animal/hostile/proc/OpenFire(var/the_target)
@@ -349,4 +349,4 @@
//Convenience
/mob/living/simple_animal/hostile/proc/AIShouldSleep()
- . = !(AIShouldWake())
\ No newline at end of file
+ . = !(AIShouldWake())
diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm
index 5f746f8a27f..efddba87b34 100644
--- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm
+++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm
@@ -20,13 +20,6 @@
ventcrawler = 2
faction = list("plants")
- min_oxy = 5
- max_oxy = 0
- min_tox = 0
- max_tox = 5
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 150
maxbodytemp = 500
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index e6f77f15489..85089cae53c 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -23,14 +23,7 @@
attack_sound = 'sound/weapons/bite.ogg'
var/Attackemote = "growls at"
- min_oxy = 0
- max_oxy = 0
- min_tox = 0
- max_tox = 0
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
faction = list("mimic")
@@ -41,9 +34,10 @@
if(.)
emote("me", 1, "[Attackemote] [.].")
-/mob/living/simple_animal/hostile/mimic/Die()
- ..()
- visible_message("[src] stops moving!")
+/mob/living/simple_animal/hostile/mimic/death()
+ ..(1)
+ visible_message("[src] stops moving!")
+ ghostize()
qdel(src)
@@ -107,7 +101,7 @@
..()
icon_state = initial(icon_state)
-/mob/living/simple_animal/hostile/mimic/crate/Die()
+/mob/living/simple_animal/hostile/mimic/crate/death()
var/obj/structure/closet/crate/C = new(get_turf(src))
// Put loot in crate
@@ -144,9 +138,9 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
/mob/living/simple_animal/hostile/mimic/copy/Life()
..()
for(var/mob/living/M in contents) //a fix for animated statues from the flesh to stone spell
- Die()
+ death()
-/mob/living/simple_animal/hostile/mimic/copy/Die()
+/mob/living/simple_animal/hostile/mimic/copy/death()
for(var/atom/movable/M in src)
M.loc = get_turf(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 062aab6e7cb..70ec5f7a488 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -1,18 +1,10 @@
/mob/living/simple_animal/hostile/asteroid/
vision_range = 2
- min_oxy = 0
- max_oxy = 0
- min_tox = 0
- max_tox = 0
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 15
faction = list("mining")
environment_smash = 2
minbodytemp = 0
- heat_damage_per_tick = 20
response_help = "pokes"
response_disarm = "shoves"
response_harm = "strikes"
@@ -20,6 +12,8 @@
a_intent = "harm"
var/throw_message = "bounces off of"
var/icon_aggro = null // for swapping to when we get aggressive
+ see_in_dark = 8
+ see_invisible = SEE_INVISIBLE_MINIMUM
/mob/living/simple_animal/hostile/asteroid/Aggro()
..()
@@ -108,12 +102,12 @@
if(3.0)
adjustBruteLoss(110)
-/mob/living/simple_animal/hostile/asteroid/basilisk/Die()
+/mob/living/simple_animal/hostile/asteroid/basilisk/death(gibbed)
var/counter
for(counter=0, counter<2, counter++)
var/obj/item/weapon/ore/diamond/D = new /obj/item/weapon/ore/diamond(src.loc)
D.layer = 4.1
- ..()
+ ..(gibbed)
/mob/living/simple_animal/hostile/asteroid/goldgrub
name = "goldgrub"
@@ -204,10 +198,10 @@
visible_message("The [P.name] was repelled by [src.name]'s girth!")
return
-/mob/living/simple_animal/hostile/asteroid/goldgrub/Die()
+/mob/living/simple_animal/hostile/asteroid/goldgrub/death(gibbed)
alerted = 0
Reward()
- ..()
+ ..(gibbed)
/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustBruteLoss(var/damage)
idle_vision_range = 9
@@ -253,10 +247,10 @@
/mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget()
OpenFire()
-/mob/living/simple_animal/hostile/asteroid/hivelord/Die()
+/mob/living/simple_animal/hostile/asteroid/hivelord/death(gibbed)
new /obj/item/asteroid/hivelord_core(src.loc)
mouse_opacity = 1
- ..()
+ ..(gibbed)
/obj/item/asteroid/hivelord_core
name = "hivelord remains"
@@ -318,7 +312,7 @@
spawn(100)
qdel(src)
-/mob/living/simple_animal/hostile/asteroid/hivelordbrood/Die()
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/death()
qdel(src)
/mob/living/simple_animal/hostile/asteroid/goliath
@@ -367,9 +361,9 @@
anchored = 1
..()
-/mob/living/simple_animal/hostile/asteroid/goliath/Die()
+/mob/living/simple_animal/hostile/asteroid/goliath/death(gibbed)
anchored = 0
- ..()
+ ..(gibbed)
/mob/living/simple_animal/hostile/asteroid/goliath/OpenFire()
var/tturf = get_turf(target)
@@ -434,15 +428,15 @@
spawn(50)
qdel(src)
-/mob/living/simple_animal/hostile/asteroid/goliath/Die()
+/mob/living/simple_animal/hostile/asteroid/goliath/death(gibbed)
var/obj/item/asteroid/goliath_hide/G = new /obj/item/asteroid/goliath_hide(src.loc)
G.layer = 4.1
- ..()
+ ..(gibbed)
/obj/item/asteroid/goliath_hide
name = "goliath hide plates"
desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna."
- icon = 'icons/obj/items.dmi'
+ icon = 'icons/obj/mining.dmi'
icon_state = "goliath_hide"
flags = NOBLUDGEON
w_class = 3
@@ -463,8 +457,11 @@
if(istype(target, /obj/mecha/working/ripley))
var/obj/mecha/D = target
var/list/damage_absorption = D.damage_absorption
- if(damage_absorption.["brute"] > 0.3)
- damage_absorption.["brute"] = max(damage_absorption.["brute"] - 0.1, 0.3)
+ if(damage_absorption["brute"] > 0.3)
+ damage_absorption["brute"] = max(damage_absorption["brute"] - 0.1, 0.3)
+ damage_absorption["bullet"] = damage_absorption["bullet"] - 0.05
+ damage_absorption["fire"] = damage_absorption["fire"] - 0.05
+ damage_absorption["laser"] = damage_absorption["laser"] - 0.025
user << "You strengthen [target], improving its resistance against melee attacks."
qdel(src)
if(D.icon_state == "ripley-open")
@@ -481,3 +478,9 @@
else
user << "You can't improve [D] any further."
return
+
+/mob/living/simple_animal/hostile/asteroid/handle_temperature_damage()
+ if(bodytemperature < minbodytemp)
+ adjustBruteLoss(2)
+ else if(bodytemperature > maxbodytemp)
+ adjustBruteLoss(20)
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index c93b394050e..aacc4da57f3 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -42,7 +42,7 @@
/mob/living/simple_animal/hostile/mushroom/Life()
..()
if(!stat)//Mushrooms slowly regenerate if conscious, for people who want to save them from being eaten
- health = min(health+2, maxHealth)
+ adjustBruteLoss(-2)
/mob/living/simple_animal/hostile/mushroom/New()//Makes every shroom a little unique
melee_damage_lower += rand(3, 5)
@@ -78,7 +78,7 @@
if(level_gain < 1)//So we still gain a level if two mushrooms were the same level
level_gain = 1
M.LevelUp(level_gain)
- M.health = M.maxHealth
+ M.adjustBruteLoss(-M.maxHealth)
qdel(src)
..()
@@ -87,9 +87,10 @@
icon_state = "mushroom_color"
UpdateMushroomCap()
-/mob/living/simple_animal/hostile/mushroom/Die()
- visible_message("[src] fainted.")
- ..()
+/mob/living/simple_animal/hostile/mushroom/death(gibbed)
+ if(!gibbed)
+ visible_message("[src] fainted.")
+ ..(gibbed)
UpdateMushroomCap()
/mob/living/simple_animal/hostile/mushroom/proc/UpdateMushroomCap()
@@ -101,9 +102,8 @@
/mob/living/simple_animal/hostile/mushroom/proc/Recover()
visible_message("[src] slowly begins to recover.")
- health = 5
faint_ticker = 0
- icon_state = icon_living
+ revive()
UpdateMushroomCap()
recovery_cooldown = 1
spawn(300)
@@ -117,7 +117,7 @@
else
melee_damage_upper += (level_gain * rand(1,5))
maxHealth += (level_gain * rand(1,5))
- health = maxHealth //They'll always heal, even if they don't gain a level, in case you want to keep this shroom around instead of harvesting it
+ adjustBruteLoss(-maxHealth) //They'll always heal, even if they don't gain a level, in case you want to keep this shroom around instead of harvesting it
/mob/living/simple_animal/hostile/mushroom/proc/Bruise()
if(!bruised && !stat)
diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm
index aae825a6538..2bd4ffb6341 100644
--- a/code/modules/mob/living/simple_animal/hostile/pirate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm
@@ -20,14 +20,7 @@
attacktext = "slashes"
attack_sound = 'sound/weapons/bladeslice.ogg'
- min_oxy = 5
- max_oxy = 0
- min_tox = 0
- max_tox = 1
- min_co2 = 0
- max_co2 = 5
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 15
var/corpse = /obj/effect/landmark/mobcorpse/pirate
var/weapon1 = /obj/item/weapon/melee/energy/sword/pirate
@@ -49,11 +42,13 @@
weapon1 = /obj/item/weapon/gun/energy/laser
-/mob/living/simple_animal/hostile/pirate/Die()
- ..()
+/mob/living/simple_animal/hostile/pirate/death()
+ ..(1)
+ visible_message("[src] stops moving.")
if(corpse)
new corpse (src.loc)
if(weapon1)
new weapon1 (src.loc)
+ ghostize()
qdel(src)
return
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
index 91284c9586a..bf79c041a63 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
@@ -24,15 +24,11 @@
environment_smash = 0
ventcrawler = 2
mob_size = MOB_SIZE_SMALL
+ var/max_co2 = 0 //to be removed once metastation map no longer use those for Sgt Araneus
+ var/min_oxy = 0
+ var/max_tox = 0
//Space bats need no air to fly in.
- min_oxy = 0
- max_oxy = 0
- min_tox = 0
- max_tox = 0
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
index 23fc3a7db42..3fca1ad51b4 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
@@ -25,16 +25,13 @@
attack_sound = 'sound/items/bikehorn.ogg'
environment_smash = 0
- min_oxy = 5
- max_oxy = 0
- min_tox = 0
- max_tox = 1
- min_co2 = 0
- max_co2 = 5
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 270
maxbodytemp = 370
- heat_damage_per_tick = 15 //amount of damage applied if animal's body temperature is higher than maxbodytemp
- cold_damage_per_tick = 10 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
- unsuitable_atmos_damage = 10
\ No newline at end of file
+ unsuitable_atmos_damage = 10
+
+/mob/living/simple_animal/hostile/retaliate/clown/handle_temperature_damage()
+ if(bodytemperature < minbodytemp)
+ adjustBruteLoss(10)
+ else if(bodytemperature > maxbodytemp)
+ adjustBruteLoss(15)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm
index 3f143ea19fe..1f96f9533a4 100644
--- a/code/modules/mob/living/simple_animal/hostile/russian.dm
+++ b/code/modules/mob/living/simple_animal/hostile/russian.dm
@@ -21,14 +21,7 @@
a_intent = "harm"
var/corpse = /obj/effect/landmark/mobcorpse/russian
var/weapon1 = /obj/item/weapon/kitchenknife
- min_oxy = 5
- max_oxy = 0
- min_tox = 0
- max_tox = 1
- min_co2 = 0
- max_co2 = 5
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 15
faction = list("russian")
status_flags = CANPUSH
@@ -51,11 +44,13 @@
weapon1 = /obj/item/weapon/gun/projectile/shotgun/boltaction
casingtype = /obj/item/ammo_casing/a762
-/mob/living/simple_animal/hostile/russian/Die()
- ..()
+/mob/living/simple_animal/hostile/russian/death(gibbed)
+ ..(1)
+ visible_message("[src] stops moving.")
if(corpse)
new corpse (src.loc)
if(weapon1)
new weapon1 (src.loc)
+ ghostize()
qdel(src)
return
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index 5f9fcd35428..29dcdd93ebc 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -23,14 +23,7 @@
attacktext = "claws"
attack_sound = 'sound/hallucinations/growl1.ogg'
- min_oxy = 0
- max_oxy = 0
- min_tox = 0
- max_tox = 0
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
faction = list("statue")
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index ff418b1d48f..bfd39fc4f7c 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -22,20 +22,13 @@
var/corpse = /obj/effect/landmark/mobcorpse/syndicatesoldier
var/weapon1
var/weapon2
- min_oxy = 5
- max_oxy = 0
- min_tox = 0
- max_tox = 1
- min_co2 = 0
- max_co2 = 5
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 15
faction = list("syndicate")
status_flags = CANPUSH
-/mob/living/simple_animal/hostile/syndicate/Die()
- ..()
+/mob/living/simple_animal/hostile/syndicate/death(gibbed)
+ ..(gibbed)
if(corpse)
new corpse (src.loc)
if(weapon1)
@@ -84,14 +77,7 @@
/mob/living/simple_animal/hostile/syndicate/melee/space
- min_oxy = 0
- max_oxy = 0
- min_tox = 0
- max_tox = 0
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
icon_state = "syndicatemeleespace"
icon_living = "syndicatemeleespace"
@@ -119,14 +105,7 @@
icon_state = "syndicaterangedpsace"
icon_living = "syndicaterangedpsace"
name = "Syndicate Commando"
- min_oxy = 0
- max_oxy = 0
- min_tox = 0
- max_tox = 0
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
corpse = /obj/effect/landmark/mobcorpse/syndicatecommando
speed = 1
@@ -149,19 +128,12 @@
attacktext = "cuts"
attack_sound = 'sound/weapons/bladeslice.ogg'
faction = list("syndicate")
- min_oxy = 0
- max_oxy = 0
- min_tox = 0
- max_tox = 0
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
mob_size = MOB_SIZE_SMALL
-/mob/living/simple_animal/hostile/viscerator/Die()
- ..()
+/mob/living/simple_animal/hostile/viscerator/death(gibbed)
+ ..(gibbed)
visible_message("[src] is smashed into pieces!")
qdel(src)
return
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index 397c96bf695..79edd57a33f 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -25,17 +25,11 @@
attack_sound = 'sound/weapons/bite.ogg'
//Space carp aren't affected by atmos.
- min_oxy = 0
- max_oxy = 0
- min_tox = 0
- max_tox = 0
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
faction = list("hostile")
+ var/drop_type = /obj/item/stack/sheet/mineral/wood
/mob/living/simple_animal/hostile/tree/FindTarget()
. = ..()
@@ -50,10 +44,11 @@
L.Weaken(3)
L.visible_message("\The [src] knocks down \the [L]!")
-/mob/living/simple_animal/hostile/tree/Die()
- ..()
- visible_message("[src] is hacked into pieces!")
- new /obj/item/stack/sheet/mineral/wood(loc)
+/mob/living/simple_animal/hostile/tree/death(gibbed)
+ ..(1)
+ visible_message("[src] is hacked into pieces!")
+ new drop_type(loc)
+ ghostize()
qdel(src)
/mob/living/simple_animal/hostile/tree/festivus
@@ -63,9 +58,5 @@
icon_living = "festivus_pole"
icon_dead = "festivus_pole"
icon_gib = "festivus_pole"
+ drop_type = /obj/item/stack/rods
-/mob/living/simple_animal/hostile/tree/festivus/Die()
- ..()
- visible_message("[src] is hacked into pieces!")
- new /obj/item/stack/rods(loc)
- qdel(src)
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 5c3fc9142ef..bc1e35d3b6a 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -113,12 +113,12 @@
/mob/living/simple_animal/parrot/proc/toggle_mode)
-/mob/living/simple_animal/parrot/Die()
+/mob/living/simple_animal/parrot/death(gibbed)
if(held_item)
held_item.loc = src.loc
held_item = null
walk(src,0)
- ..()
+ ..(gibbed)
/mob/living/simple_animal/parrot/Stat()
..()
@@ -347,25 +347,21 @@
/mob/living/simple_animal/parrot/Life()
..()
- //Sprite and AI update for when a parrot gets pulled
+ //Sprite update for when a parrot gets pulled
if(pulledby && stat == CONSCIOUS)
icon_state = "parrot_fly"
if(!client)
parrot_state = PARROT_WANDER
return
- if(client || stat)
- return //Lets not force players or dead/incap parrots to move
-
- if(!isturf(src.loc) || !canmove || buckled)
- return //If it can't move, dont let it move. (The buckled check probably isn't necessary thanks to canmove)
-
//-----SPEECH
/* Parrot speech mimickry!
Phrases that the parrot Hear()s get added to speach_buffer.
Every once in a while, the parrot picks one of the lines from the buffer and replaces an element of the 'speech' list.
Then it clears the buffer to make sure they dont magically remember something from hours ago. */
+/mob/living/simple_animal/parrot/handle_automated_speech()
+ ..()
if(speech_buffer.len && prob(10))
if(speak.len)
speak.Remove(pick(speak))
@@ -374,6 +370,11 @@
clearlist(speech_buffer)
+/mob/living/simple_animal/parrot/handle_automated_movement()
+ if(!isturf(src.loc) || !canmove || buckled)
+ return //If it can't move, dont let it move. (The buckled check probably isn't necessary thanks to canmove)
+
+
//-----SLEEPING
if(parrot_state == PARROT_PERCH)
if(parrot_perch && parrot_perch.loc != src.loc) //Make sure someone hasnt moved our perch on us
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index ebca47633b9..a1982d4d0bd 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -5,7 +5,6 @@
icon = 'icons/mob/mob.dmi'
icon_state = "shade"
icon_living = "shade"
- icon_dead = "shade_dead"
maxHealth = 50
health = 50
speak_emote = list("hisses")
@@ -18,9 +17,7 @@
attacktext = "drains the life from"
minbodytemp = 0
maxbodytemp = 4000
- min_oxy = 0
- max_co2 = 0
- max_tox = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
speed = -1
stop_automated_movement = 1
status_flags = 0
@@ -28,14 +25,13 @@
status_flags = CANPUSH
-/mob/living/simple_animal/shade/Life()
- ..()
- if(stat == 2)
- new /obj/item/weapon/ectoplasm (src.loc)
- visible_message("[src] lets out a contented sigh as their form unwinds.")
- ghostize()
- qdel(src)
- return
+/mob/living/simple_animal/shade/death()
+ ..(1)
+ new /obj/item/weapon/ectoplasm (src.loc)
+ visible_message("[src] lets out a contented sigh as their form unwinds.")
+ ghostize()
+ qdel(src)
+ return
/mob/living/simple_animal/shade/attackby(var/obj/item/O as obj, var/mob/user as mob, params) //Marker -Agouri
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index ee4b01460d6..f81bdac5d59 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -35,21 +35,11 @@
//Temperature effect
var/minbodytemp = 250
var/maxbodytemp = 350
- var/heat_damage_per_tick = 3 //amount of damage applied if animal's body temperature is higher than maxbodytemp
- var/cold_damage_per_tick = 2 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
//Atmos effect - Yes, you can make creatures that require plasma or co2 to survive. N2O is a trace gas and handled separately, hence why it isn't here. It'd be hard to add it. Hard and me don't mix (Yes, yes make all the dick jokes you want with that.) - Errorage
- var/min_oxy = 5
- var/max_oxy = 0 //Leaving something at 0 means it's off - has no maximum
- var/min_tox = 0
- var/max_tox = 1
- var/min_co2 = 0
- var/max_co2 = 5
- var/min_n2 = 0
- var/max_n2 = 0
+ var/list/atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) //Leaving something at 0 means it's off - has no maximum
var/unsuitable_atmos_damage = 2 //This damage is taken when atmos doesn't fit all the requirements above
-
//LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly
var/melee_damage_lower = 0
var/melee_damage_upper = 0
@@ -81,52 +71,61 @@
..()
/mob/living/simple_animal/updatehealth()
- return
+ health = max(maxHealth - getBruteLoss(), 0)
/mob/living/simple_animal/Life()
+ if(..())
+ if(!client && !stat)
+ handle_automated_movement()
- update_gravity(mob_has_gravity())
+ handle_automated_speech()
+ return 1
- //Health
- if(stat == DEAD)
- if(health > 0)
- icon_state = icon_living
- dead_mob_list -= src
- living_mob_list += src
- stat = CONSCIOUS
- density = 1
- update_canmove()
- return 0
+/mob/living/simple_animal/handle_regular_status_updates()
+ if(..()) //alive
+ if(health < 1)
+ death()
+ return 0
+ return 1
+/mob/living/simple_animal/handle_disabilities()
+ //Eyes
+ if(disabilities & BLIND || stat)
+ eye_blind = max(eye_blind, 1)
+ else
+ if(eye_blind)
+ eye_blind = 0
+ if(eye_blurry)
+ eye_blurry = 0
- if(health < 1 && stat != DEAD)
- Die()
+ //Ears
+ if(disabilities & DEAF)
+ setEarDamage(-1, max(ear_deaf, 1))
+ else if(ear_damage < 100)
+ setEarDamage(0, 0)
- if(health > maxHealth)
- health = maxHealth
+/mob/living/simple_animal/handle_status_effects()
+ ..()
+ if(stuttering)
+ stuttering = 0
- if(stunned)
- AdjustStunned(-1)
- if(weakened)
- AdjustWeakened(-1)
- if(paralysis)
- AdjustParalysis(-1)
+ if(druggy)
+ druggy = 0
- adjustEarDamage((ear_damage < 25 ? -0.05 : 0), -1)
-
- //Movement
- if(!client && !stop_automated_movement && wander)
+/mob/living/simple_animal/proc/handle_automated_movement()
+ if(!stop_automated_movement && wander)
if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc.
turns_since_move++
if(turns_since_move >= turns_per_move)
- if(!(stop_automated_movement_when_pulled && pulledby)) //Soma animals don't move when pulled
+ if(!(stop_automated_movement_when_pulled && pulledby)) //Some animals don't move when pulled
var/anydir = pick(cardinal)
if(Process_Spacemove(anydir))
Move(get_step(src, anydir), anydir)
turns_since_move = 0
+ return 1
- //Speaking
- if(!client && speak_chance)
+/mob/living/simple_animal/proc/handle_automated_speech()
+ if(speak_chance)
if(rand(0,200) < speak_chance)
if(speak && speak.len)
if((emote_hear && emote_hear.len) || (emote_see && emote_see.len))
@@ -160,13 +159,13 @@
emote("me", 2, pick(emote_hear))
- //Atmos
+/mob/living/simple_animal/handle_environment(datum/gas_mixture/environment)
var/atmos_suitable = 1
var/atom/A = src.loc
if(isturf(A))
var/turf/T = A
- var/areatemp = T.temperature
+ var/areatemp = get_temperature(environment)
if( abs(areatemp - bodytemperature) > 40 )
var/diff = areatemp - bodytemperature
diff = diff / 5
@@ -181,40 +180,33 @@
var/n2 = ST.air.nitrogen
var/co2 = ST.air.carbon_dioxide
- if(min_oxy)
- if(oxy < min_oxy)
- atmos_suitable = 0
- if(max_oxy)
- if(oxy > max_oxy)
- atmos_suitable = 0
- if(min_tox)
- if(tox < min_tox)
- atmos_suitable = 0
- if(max_tox)
- if(tox > max_tox)
- atmos_suitable = 0
- if(min_n2)
- if(n2 < min_n2)
- atmos_suitable = 0
- if(max_n2)
- if(n2 > max_n2)
- atmos_suitable = 0
- if(min_co2)
- if(co2 < min_co2)
- atmos_suitable = 0
- if(max_co2)
- if(co2 > max_co2)
- atmos_suitable = 0
+ if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"])
+ atmos_suitable = 0
+ else if(atmos_requirements["max_oxy"] && oxy > atmos_requirements["max_oxy"])
+ atmos_suitable = 0
+ else if(atmos_requirements["min_tox"] && tox < atmos_requirements["min_tox"])
+ atmos_suitable = 0
+ else if(atmos_requirements["max_tox"] && tox > atmos_requirements["max_tox"])
+ atmos_suitable = 0
+ else if(atmos_requirements["min_n2"] && n2 < atmos_requirements["min_n2"])
+ atmos_suitable = 0
+ else if(atmos_requirements["max_n2"] && n2 > atmos_requirements["max_n2"])
+ atmos_suitable = 0
+ else if(atmos_requirements["min_co2"] && co2 < atmos_requirements["min_co2"])
+ atmos_suitable = 0
+ else if(atmos_requirements["max_co2"] && co2 > atmos_requirements["max_co2"])
+ atmos_suitable = 0
- //Atmos effect
+ if(!atmos_suitable)
+ adjustBruteLoss(unsuitable_atmos_damage)
+
+ handle_temperature_damage()
+
+/mob/living/simple_animal/proc/handle_temperature_damage()
if(bodytemperature < minbodytemp)
- adjustBruteLoss(cold_damage_per_tick)
+ adjustBruteLoss(2)
else if(bodytemperature > maxbodytemp)
- adjustBruteLoss(heat_damage_per_tick)
-
- if(!atmos_suitable)
- adjustBruteLoss(unsuitable_atmos_damage)
- return 1
+ adjustBruteLoss(3)
/mob/living/simple_animal/gib(var/animation = 0)
if(icon_gib)
@@ -251,6 +243,7 @@
if(..())
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
attack_threshold_check(damage)
+ return 1
/mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
if(!Proj)
@@ -275,16 +268,17 @@
M.do_attack_animation(src)
visible_message("[M] [response_harm] [src]!")
playsound(loc, "punch", 25, 1, -1)
- adjustBruteLoss(harm_intent_damage)
+ attack_threshold_check(harm_intent_damage)
add_logs(M, src, "attacked", admin=0)
updatehealth()
- return
+ return 1
/mob/living/simple_animal/attack_paw(mob/living/carbon/monkey/M as mob)
if(..()) //successful monkey bite.
if(stat != DEAD)
var/damage = rand(1, 3)
attack_threshold_check(damage)
+ return 1
if (M.a_intent == "help")
if (health > 0)
visible_message("[M.name] [response_help] [src].")
@@ -294,13 +288,19 @@
/mob/living/simple_animal/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
if(..()) //if harm or disarm intent.
- var/damage = rand(15, 30)
- visible_message("[M] has slashed at [src]!", \
- "[M] has slashed at [src]!")
- playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
- add_logs(M, src, "attacked", admin=0)
- attack_threshold_check(damage)
- return
+ if(M.a_intent == "disarm")
+ playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
+ visible_message("[M] [response_disarm] [name]!", \
+ "[M] [response_disarm] [name]!")
+ add_logs(M, src, "disarmed", admin=0)
+ else
+ var/damage = rand(15, 30)
+ visible_message("[M] has slashed at [src]!", \
+ "[M] has slashed at [src]!")
+ playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
+ add_logs(M, src, "attacked", admin=0)
+ attack_threshold_check(damage)
+ return 1
/mob/living/simple_animal/attack_larva(mob/living/carbon/alien/larva/L as mob)
if(..()) //successful larva bite
@@ -308,17 +308,15 @@
if(stat != DEAD)
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
attack_threshold_check(damage)
+ return 1
-/mob/living/simple_animal/attack_slime(mob/living/carbon/slime/M as mob)
- ..()
- var/damage = rand(1, 3)
-
- if(M.is_adult)
- damage = rand(20, 40)
- else
- damage = rand(5, 35)
- attack_threshold_check(damage)
- return
+/mob/living/simple_animal/attack_slime(mob/living/simple_animal/slime/M as mob)
+ if(..()) //successful slime attack
+ var/damage = rand(15, 25)
+ if(M.is_adult)
+ damage = rand(20, 35)
+ attack_threshold_check(damage)
+ return 1
/mob/living/simple_animal/proc/attack_threshold_check(var/damage)
if(damage <= force_threshold)
@@ -332,9 +330,8 @@
if(O.flags & NOBLUDGEON)
return
- user.changeNext_move(CLICK_CD_MELEE)
-
if(istype(O, /obj/item/stack/medical))
+ user.changeNext_move(CLICK_CD_MELEE)
if(stat != DEAD)
var/obj/item/stack/medical/MED = O
if(health < maxHealth)
@@ -357,28 +354,13 @@
return
if((meat_type || skin_type) && (stat == DEAD)) //if the animal has a meat, and if it is dead.
+ user.changeNext_move(CLICK_CD_MELEE)
var/sharpness = is_sharp(O)
if(sharpness)
harvest(user, sharpness)
return
- user.do_attack_animation(src)
- var/damage = 0
- if(O.force)
- if(O.force >= force_threshold)
- damage = O.force
- if (O.damtype == STAMINA)
- damage = 0
- visible_message("[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] [src] with [O]!",\
- "[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] you with [O]!")
- else
- visible_message("[O] bounces harmlessly off of [src].",\
- "[O] bounces harmlessly off of [src].")
- playsound(loc, O.hitsound, 50, 1, -1)
- else
- user.visible_message("[user] gently taps [src] with [O].",\
- "This weapon is ineffective, it does no damage.")
- adjustBruteLoss(damage)
+ ..()
/mob/living/simple_animal/movement_delay()
var/tally = 0 //Incase I need to add stuff other than "speed" later
@@ -392,23 +374,17 @@
if(statpanel("Status"))
stat(null, "Health: [round((health / maxHealth) * 100)]%")
+ return 1
-/mob/living/simple_animal/proc/Die()
- health = 0 // so /mob/living/simple_animal/Life() doesn't magically revive them
- dead_mob_list += src
+/mob/living/simple_animal/death(gibbed)
+ health = 0
icon_state = icon_dead
stat = DEAD
density = 0
- return
-
-/mob/living/simple_animal/death(gibbed)
- if(stat == DEAD)
- return
-
+ lying = 1
if(!gibbed)
visible_message("\the [src] stops moving...")
-
- Die()
+ ..()
/mob/living/simple_animal/ex_act(severity, target)
..()
@@ -420,14 +396,9 @@
if (2.0)
adjustBruteLoss(60)
-
if(3.0)
adjustBruteLoss(30)
-
-/mob/living/simple_animal/adjustBruteLoss(damage)
- health = Clamp(health - damage, 0, maxHealth)
- if(health < 1 && stat != DEAD)
- Die()
+ updatehealth()
/mob/living/simple_animal/proc/CanAttack(var/atom/the_target)
if(see_invisible < the_target.invisibility)
@@ -442,6 +413,8 @@
return 0
return 1
+/mob/living/simple_animal/handle_fire()
+ return
/mob/living/simple_animal/update_fire()
return
@@ -452,6 +425,10 @@
/mob/living/simple_animal/revive()
health = maxHealth
+ icon_state = icon_living
+ lying = 0
+ density = 1
+ update_canmove()
..()
/mob/living/simple_animal/proc/make_babies() // <3 <3 <3
diff --git a/code/modules/mob/living/carbon/slime/death.dm b/code/modules/mob/living/simple_animal/slime/death.dm
similarity index 57%
rename from code/modules/mob/living/carbon/slime/death.dm
rename to code/modules/mob/living/simple_animal/slime/death.dm
index ecf01af344b..81493941d34 100644
--- a/code/modules/mob/living/carbon/slime/death.dm
+++ b/code/modules/mob/living/simple_animal/slime/death.dm
@@ -1,11 +1,12 @@
-/mob/living/carbon/slime/death(gibbed)
+/mob/living/simple_animal/slime/death(gibbed)
if(stat == DEAD)
return
if(!gibbed)
if(is_adult)
- var/mob/living/carbon/slime/M = new /mob/living/carbon/slime(loc)
+ var/mob/living/simple_animal/slime/M = new /mob/living/simple_animal/slime(loc)
M.colour = colour
M.rabid = 1
+ M.regenerate_icons()
is_adult = 0
maxHealth = 150
revive()
@@ -13,21 +14,19 @@
number = rand(1, 1000)
name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
return
- else
- visible_message("The [name] seizes up and falls limp...")
stat = DEAD
- icon_state = "[colour] baby slime dead"
overlays.len = 0
update_canmove()
- if(blind) blind.layer = 0
+ if(blind)
+ blind.layer = 0
if(ticker && ticker.mode)
ticker.mode.check_win()
return ..(gibbed)
-/mob/living/carbon/slime/gib()
+/mob/living/simple_animal/slime/gib()
death(1)
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/modules/mob/living/carbon/slime/emote.dm b/code/modules/mob/living/simple_animal/slime/emote.dm
similarity index 95%
rename from code/modules/mob/living/carbon/slime/emote.dm
rename to code/modules/mob/living/simple_animal/slime/emote.dm
index d8d70595333..7f8127d3bcf 100644
--- a/code/modules/mob/living/carbon/slime/emote.dm
+++ b/code/modules/mob/living/simple_animal/slime/emote.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/slime/emote(var/act)
+/mob/living/simple_animal/slime/emote(var/act)
if (findtext(act, "-", 1, null))
@@ -76,7 +76,7 @@
else
src << "Unusable emote '[act]'. Say *help for a list."
- if ((message && src.stat == 0))
+ if ((message && stat == CONSCIOUS))
if(client)
log_emote("[name]/[key] : [message]")
if (m_type & 1)
diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm
similarity index 78%
rename from code/modules/mob/living/carbon/slime/life.dm
rename to code/modules/mob/living/simple_animal/slime/life.dm
index ddfe2867bc0..904803ff26c 100644
--- a/code/modules/mob/living/carbon/slime/life.dm
+++ b/code/modules/mob/living/simple_animal/slime/life.dm
@@ -1,11 +1,13 @@
-/mob/living/carbon/slime
+
+/mob/living/simple_animal/slime
var/AIproc = 0 // determines if the AI loop is activated
var/Atkcool = 0 // attack cooldown
var/Tempstun = 0 // temporary temperature stuns
var/Discipline = 0 // if a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while
var/SStun = 0 // stun variable
-/mob/living/carbon/slime/Life()
+
+/mob/living/simple_animal/slime/Life()
set invisibility = 0
set background = BACKGROUND_ENABLED
@@ -15,12 +17,10 @@
handle_nutrition()
handle_targets()
if (!ckey)
- handle_speech_and_mood()
+ handle_mood()
+ handle_speech()
-/mob/living/carbon/slime/handle_breathing()
- return
-
-/mob/living/carbon/slime/proc/AIprocess() // the master AI process
+/mob/living/simple_animal/slime/proc/AIprocess() // the master AI process
if(AIproc || stat == DEAD || client) return
@@ -45,7 +45,7 @@
break
if(Target)
- for(var/mob/living/carbon/slime/M in view(1,Target))
+ for(var/mob/living/simple_animal/slime/M in view(1,Target))
if(M.Victim == Target)
Target = null
AIproc = 0
@@ -99,9 +99,8 @@
AIproc = 0
-/mob/living/carbon/slime/handle_environment(datum/gas_mixture/environment)
+/mob/living/simple_animal/slime/handle_environment(datum/gas_mixture/environment)
if(!environment)
- adjustToxLoss(rand(10,20))
return
//var/environment_heat_capacity = environment.heat_capacity()
@@ -120,9 +119,9 @@
if(bodytemperature <= (T0C - 50)) // hurt temperature
if(bodytemperature <= 50) // sqrting negative numbers is bad
- adjustToxLoss(200)
+ adjustBruteLoss(200)
else
- adjustToxLoss(round(sqrt(bodytemperature)) * 2)
+ adjustBruteLoss(round(sqrt(bodytemperature)) * 2)
else
Tempstun = 0
@@ -131,7 +130,7 @@
return //TODO: DEFERRED
-/mob/living/carbon/slime/proc/adjust_body_temperature(current, loc_temp, boost)
+/mob/living/simple_animal/slime/proc/adjust_body_temperature(current, loc_temp, boost)
var/temperature = current
var/difference = abs(current-loc_temp) //get difference
var/increments// = difference/10 //find how many increments apart they are
@@ -148,9 +147,10 @@
temp_change = (temperature - current)
return temp_change
-/mob/living/carbon/slime/handle_chemicals_in_body()
+/mob/living/simple_animal/slime/handle_chemicals_in_body()
- if(reagents) reagents.metabolize(src)
+ if(reagents)
+ reagents.metabolize(src)
if (reagents.get_reagent_amount("plasma")>=5)
mutation_chance = min(mutation_chance + 5,50) //Prevents mutation chance going >50%
@@ -158,81 +158,15 @@
if (reagents.get_reagent_amount("epinephrine")>=5)
mutation_chance = max(mutation_chance - 5,0) //Prevents muation chance going <0%
reagents.remove_reagent("epinephrine", 5)
- src.updatehealth()
+ updatehealth()
- return //TODO: DEFERRED
+/mob/living/simple_animal/slime/handle_regular_status_updates()
+ if(..())
+ if(prob(30))
+ adjustBruteLoss(-1)
-/mob/living/carbon/slime/handle_mutations_and_radiation()
- return
-
-/mob/living/carbon/slime/handle_regular_hud_updates()
- return
-
-/mob/living/carbon/slime/handle_regular_status_updates()
-
- if(is_adult)
- health = 200 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss())
- else
- health = 150 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss())
-
- if(health < config.health_threshold_dead && stat != DEAD)
- death()
- return
-
- else if(health < config.health_threshold_crit)
-
- if(!reagents.has_reagent("epinephrine"))
- adjustOxyLoss(3)
-
- if(stat != DEAD)
- Paralyse(3)
- stat = UNCONSCIOUS
- else
- if(stat != DEAD)
- stat = CONSCIOUS
-
- if(prob(30))
- adjustOxyLoss(-1)
- adjustToxLoss(-1)
- adjustFireLoss(-1)
- adjustCloneLoss(-1)
- adjustBruteLoss(-1)
-
- if (stat == DEAD)
- lying = 1
- eye_blind = max(eye_blind, 1)
- else
- if(stunned > 0)
- AdjustStunned(-1)
- if(weakened > 0)
- AdjustWeakened(-1)
- if (paralysis > 0)
- AdjustParalysis(-1)
-
- if(stuttering)
- stuttering = 0
-
- if(eye_blind)
- eye_blind = 0
- eye_blind = max(eye_blind, 1)
-
- setEarDamage((ear_damage < 25 ? 0 : ear_damage),(disabilities & DEAF ? 1 :0))
-
- density = !( src.lying )
-
- if(disabilities & BLIND)
- eye_blind = max(eye_blind, 1)
-
- if(eye_blurry > 0)
- eye_blurry = 0
-
- if(druggy > 0)
- druggy = 0
-
- return 1
-
-/mob/living/carbon/slime/proc/handle_nutrition()
+/mob/living/simple_animal/slime/proc/handle_nutrition()
if(docile) //God as my witness, I will never go hungry again
nutrition = 700
@@ -244,7 +178,7 @@
if(nutrition <= 0)
nutrition = 0
if(prob(75))
- adjustToxLoss(rand(0,5))
+ adjustBruteLoss(rand(0,5))
else if (nutrition >= get_grow_nutrition() && amount_grown < 10)
nutrition -= 20
@@ -256,7 +190,7 @@
else
Evolve()
-/mob/living/carbon/slime/proc/add_nutrition(var/nutrition_to_add = 0, var/lastnut = 0)
+/mob/living/simple_animal/slime/proc/add_nutrition(var/nutrition_to_add = 0, var/lastnut = 0)
nutrition = min((nutrition + nutrition_to_add), get_max_nutrition())
if(nutrition >= (lastnut + 50))
if(prob(80))
@@ -264,11 +198,11 @@
powerlevel++
if(powerlevel > 10)
powerlevel = 10
- adjustToxLoss(-10)
+ adjustBruteLoss(-10)
-/mob/living/carbon/slime/proc/handle_targets()
+/mob/living/simple_animal/slime/proc/handle_targets()
if(Tempstun)
if(!Victim) // not while they're eating!
canmove = 0
@@ -336,7 +270,7 @@
if(!L.canmove) // Only one slime can latch on at a time.
var/notarget = 0
- for(var/mob/living/carbon/slime/M in view(1,L))
+ for(var/mob/living/simple_animal/slime/M in view(1,L))
if(M.Victim == L)
notarget = 1
if(notarget)
@@ -365,7 +299,7 @@
if(!Target) // If we have no target, we are wandering or following orders
if (Leader)
- if (holding_still)
+ if(holding_still)
holding_still = max(holding_still - 1, 0)
else if(canmove && isturf(loc))
step_to(src, Leader)
@@ -377,7 +311,7 @@
step(src, pick(cardinal))
else
- if (holding_still)
+ if(holding_still)
holding_still = max(holding_still - 1, 0)
else if (docile && pulledby)
holding_still = 10
@@ -387,12 +321,20 @@
spawn()
AIprocess()
-/mob/living/carbon/slime/proc/handle_speech_and_mood()
- //Mood starts here
+/mob/living/simple_animal/slime/handle_automated_movement()
+ return //slime random movement is currently handled in handle_targets()
+
+/mob/living/simple_animal/slime/handle_automated_speech()
+ return //slime random speech is currently handled in handle_speech()
+
+/mob/living/simple_animal/slime/proc/handle_mood()
var/newmood = ""
- if (rabid || attacked) newmood = "angry"
- else if (docile) newmood = ":3"
- else if (Target) newmood = "mischevous"
+ if (rabid || attacked)
+ newmood = "angry"
+ else if (docile)
+ newmood = ":3"
+ else if (Target)
+ newmood = "mischevous"
if (!newmood)
if (Discipline && prob(25))
@@ -401,12 +343,14 @@
newmood = pick("sad", ":3", "pout")
if ((mood == "sad" || mood == ":3" || mood == "pout") && !newmood)
- if (prob(75)) newmood = mood
+ if(prob(75))
+ newmood = mood
if (newmood != mood) // This is so we don't redraw them every time
mood = newmood
regenerate_icons()
+/mob/living/simple_animal/slime/proc/handle_speech()
//Speech understanding starts here
var/to_say
if (speech_buffer.len > 0)
@@ -483,17 +427,17 @@
emote(pick("bounce","sway","light","vibrate","jiggle"))
else
var/t = 10
- var/slimes_near = -1 // Don't count myself
+ var/slimes_near = 0
var/dead_slimes = 0
var/friends_near = list()
- for (var/mob/living/carbon/M in view(7,src))
- if (isslime(M))
+ for (var/mob/living/L in view(7,src))
+ if(isslime(L) && L != src)
++slimes_near
- if (M.stat == DEAD)
+ if (L.stat == DEAD)
++dead_slimes
- if (M in Friends)
+ if (L in Friends)
t += 20
- friends_near += M
+ friends_near += L
if (nutrition < get_hunger_nutrition()) t += 10
if (nutrition < get_starve_nutrition()) t += 10
if (prob(2) && prob(t))
@@ -519,12 +463,12 @@
phrases += "Purr..."
if (attacked)
phrases += "Grrr..."
- if (getToxLoss() > 30)
+ if (bodytemperature < T0C)
phrases += "Cold..."
- if (getToxLoss() > 60)
+ if (bodytemperature < T0C - 30)
phrases += "So... cold..."
phrases += "Very... cold..."
- if (getToxLoss() > 90)
+ if (bodytemperature < T0C - 50)
phrases += "..."
phrases += "C... c..."
if (Victim)
@@ -545,23 +489,23 @@
phrases += "[M]... feed me..."
say (pick(phrases))
-/mob/living/carbon/slime/proc/get_max_nutrition() // Can't go above it
+/mob/living/simple_animal/slime/proc/get_max_nutrition() // Can't go above it
if (is_adult) return 1200
else return 1000
-/mob/living/carbon/slime/proc/get_grow_nutrition() // Above it we grow, below it we can eat
+/mob/living/simple_animal/slime/proc/get_grow_nutrition() // Above it we grow, below it we can eat
if (is_adult) return 1000
else return 800
-/mob/living/carbon/slime/proc/get_hunger_nutrition() // Below it we will always eat
+/mob/living/simple_animal/slime/proc/get_hunger_nutrition() // Below it we will always eat
if (is_adult) return 600
else return 500
-/mob/living/carbon/slime/proc/get_starve_nutrition() // Below it we will eat before everything else
- if (is_adult) return 300
+/mob/living/simple_animal/slime/proc/get_starve_nutrition() // Below it we will eat before everything else
+ if(is_adult) return 300
else return 200
-/mob/living/carbon/slime/proc/will_hunt(var/hunger = -1) // Check for being stopped from feeding and chasing
+/mob/living/simple_animal/slime/proc/will_hunt(var/hunger = -1) // Check for being stopped from feeding and chasing
if (docile) return 0
if (hunger == 2 || rabid || attacked) return 1
if (Leader) return 0
diff --git a/code/modules/mob/living/carbon/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm
similarity index 56%
rename from code/modules/mob/living/carbon/slime/powers.dm
rename to code/modules/mob/living/simple_animal/slime/powers.dm
index 01918ec5fc5..e39b9400dfd 100644
--- a/code/modules/mob/living/carbon/slime/powers.dm
+++ b/code/modules/mob/living/simple_animal/slime/powers.dm
@@ -1,6 +1,25 @@
-/mob/living/carbon/slime/verb/Feed()
+/mob/living/simple_animal/slime/verb/Feed()
set category = "Slime"
set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process."
+
+ if(stat)
+ return 0
+
+ var/list/choices = list()
+ for(var/mob/living/C in view(1,src))
+ if(C!=src && !isslime(C) && Adjacent(C))
+ choices += C
+
+ var/mob/living/M = input(src,"Who do you wish to feed on?") in null|choices
+ if(!M) return 0
+ if(CanFeedon(M))
+ Feedon(M)
+ return 1
+
+/mob/living/simple_animal/slime/proc/CanFeedon(var/mob/living/M)
+ if(!Adjacent(M))
+ return 0
+
if(Victim)
Feedstop()
return 0
@@ -13,64 +32,35 @@
src << "I must be conscious to do this..."
return 0
- var/list/choices = list()
- for(var/mob/living/C in view(1,src))
- if(C!=src && !istype(C,/mob/living/carbon/slime) && Adjacent(C))
- choices += C
+ if(M.stat == DEAD)
+ src << "This subject does not have a strong enough life energy..."
+ return 0
- var/mob/living/M = input(src,"Who do you wish to feed on?") in null|choices
- if(!M) return 0
- if(Adjacent(M))
-
- if(istype(M, /mob/living/carbon/brain))
- src << "This subject does not have an edible life energy..."
+ for(var/mob/living/simple_animal/slime/met in view())
+ if(met.Victim == M && met != src)
+ src << "The [met.name] is already feeding on this subject..."
return 0
+ return 1
- if(istype(M, /mob/living/carbon) && (M.health < -70))
- src << "This subject does not have a strong enough life energy..."
- return 0
+/mob/living/simple_animal/slime/proc/Feedon(var/mob/living/M)
- if(istype(M, /mob/living/simple_animal) && (M.health < 1))//animals don't go into crit, stupid; fixes infinite energy exploit
- src << "This subject does not have a strong enough life energy..."
- return 0
+ src << "I have latched onto the subject and begun feeding..."
+ M << "The [name] has latched onto [M.name]!"
- for(var/mob/living/carbon/slime/met in view())
- if(met.Victim == M && met != src)
- src << "The [met.name] is already feeding on this subject..."
- return 0
-
- src << "I have latched onto the subject and begun feeding..."
- M << "The [src.name] has latched onto your head!"
-
- Feedon(M)
- return 1
-
-
-/mob/living/carbon/slime/proc/Feedon(var/mob/living/M)
Victim = M
src.loc = M.loc
canmove = 0
anchored = 1
var/lastnut = nutrition
var/fed_succesfully = 0
- var/health_minimum = -70
- if(is_adult)
- icon_state = "[colour] adult slime eat"
- else
- icon_state = "[colour] baby slime eat"
-
-
- if(istype(Victim, /mob/living/simple_animal))
- health_minimum = 0
-
- while(Victim && Victim.health > health_minimum && stat != 2)
+ while(Victim && Victim == M && Victim.stat != DEAD && stat != DEAD)
canmove = 0
if(Adjacent(Victim))
loc = M.loc
- if(istype(Victim, /mob/living/carbon))
+ if(iscarbon(Victim))
Victim.adjustCloneLoss(rand(5,6))
Victim.adjustToxLoss(rand(1,2))
if(Victim.health <= 0)
@@ -87,12 +77,12 @@
fed_succesfully = 1
- else if(health_minimum == 0) //we already know it's a simple_animal from above
+ else if(isanimal(Victim)) //we already know it's a simple_animal from above
Victim.adjustBruteLoss(is_adult ? rand(7, 15) : rand(4, 12))
fed_succesfully = 1
else
- src << "[pick("This subject is incompatable", \
+ src << "[pick("This subject is incompatible", \
"This subject does not have a life energy", "This subject is empty", \
"I am not satisified", "I can not feed from this subject", \
"I do not feel nourished", "This subject is not food")]..."
@@ -101,10 +91,7 @@
add_nutrition(rand(15,30), lastnut)
//Heal yourself.
- adjustOxyLoss(-10)
adjustBruteLoss(-10)
- adjustFireLoss(-10)
- adjustCloneLoss(-10)
updatehealth()
if(Victim)
@@ -115,62 +102,45 @@
else
break
- if(stat == 2) //why the fuck are you doing icon updating here
- if(!is_adult)
- icon_state = "[colour] baby slime dead"
-
- else
- if(is_adult)
- icon_state = "[colour] adult slime"
- else
- icon_state = "[colour] baby slime"
-
canmove = 1
anchored = 0
- if(M)
- if(M.health < health_minimum)
- M.canmove = 0
- if(!client)
- if(Victim && !rabid && !attacked)
- if(Victim.LAssailant && Victim.LAssailant != Victim)
- if(prob(50))
- if(!(Victim.LAssailant in Friends))
- Friends[Victim.LAssailant] = 1
- //Friends.Add(Victim.LAssailant) // no idea why i was using the |= operator
- else
- ++Friends[Victim.LAssailant]
+ if(M && M.stat == DEAD)
+ if(!client)
+ if(Victim && !rabid && !attacked)
+ if(Victim.LAssailant && Victim.LAssailant != Victim)
+ if(prob(50))
+ if(!(Victim.LAssailant in Friends))
+ Friends[Victim.LAssailant] = 1
+ else
+ ++Friends[Victim.LAssailant]
- if(M.client && istype(src, /mob/living/carbon/human))
- if(prob(85))
- rabid = 1 // UUUNNBGHHHH GONNA EAT JUUUUUU
+ if(M.client && ishuman(M))
+ if(prob(85))
+ rabid = 1 // UUUNNBGHHHH GONNA EAT JUUUUUU
- if(client)
- src << "This subject does not have a strong enough life energy anymore..."
- else
- M.canmove = 1
-
- if(client)
- src << "I have stopped feeding..."
- else
if(client)
- src << "I have stopped feeding..."
+ src << "This subject does not have a strong enough life energy anymore..."
+
+ else if(client)
+ src << "I have stopped feeding..."
Victim = null
-/mob/living/carbon/slime/proc/Feedstop()
+/mob/living/simple_animal/slime/proc/Feedstop()
if(Victim)
- if(Victim.client) Victim << "[src] has let go of your head!"
+ if(Victim.client)
+ Victim << "[src] has let go of your head!"
Victim = null
-/mob/living/carbon/slime/proc/UpdateFeed(var/mob/M)
+/mob/living/simple_animal/slime/proc/UpdateFeed(var/mob/M)
if(Victim)
if(Victim == M)
loc = M.loc // simple "attach to head" effect!
-/mob/living/carbon/slime/verb/Evolve()
+/mob/living/simple_animal/slime/verb/Evolve()
set category = "Slime"
set desc = "This will let you evolve from baby to adult slime."
@@ -189,7 +159,7 @@
else
src << "I have already evolved..."
-/mob/living/carbon/slime/verb/Reproduce()
+/mob/living/simple_animal/slime/verb/Reproduce()
set category = "Slime"
set desc = "This will make you split into four Slimes."
@@ -207,7 +177,7 @@
var/new_nutrition = round(nutrition * 0.9)
var/new_powerlevel = round(powerlevel / 4)
for(var/i=1,i<=4,i++)
- var/mob/living/carbon/slime/M = new /mob/living/carbon/slime/(loc)
+ var/mob/living/simple_animal/slime/M = new /mob/living/simple_animal/slime/(loc)
if(prob(mutation_chance))
M.colour = slime_mutation[rand(1,4)]
else
@@ -219,7 +189,7 @@
babies += M
feedback_add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]")
- var/mob/living/carbon/slime/new_slime = pick(babies)
+ var/mob/living/simple_animal/slime/new_slime = pick(babies)
new_slime.a_intent = "harm"
new_slime.languages = languages
if(src.mind)
diff --git a/code/modules/mob/living/simple_animal/slime/say.dm b/code/modules/mob/living/simple_animal/slime/say.dm
new file mode 100644
index 00000000000..a45b9fad0b3
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/slime/say.dm
@@ -0,0 +1,7 @@
+/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans)
+ if(speaker != src && !radio_freq)
+ if (speaker in Friends)
+ speech_buffer = list()
+ speech_buffer += speaker
+ speech_buffer += lowertext(html_decode(message))
+ ..()
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
new file mode 100644
index 00000000000..44cd079bca5
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -0,0 +1,383 @@
+/mob/living/simple_animal/slime
+ name = "baby slime"
+ icon = 'icons/mob/slimes.dmi'
+ icon_state = "grey baby slime"
+ pass_flags = PASSTABLE
+ ventcrawler = 2
+ var/is_adult = 0
+ var/docile = 0
+ languages = SLIME | HUMAN
+ faction = list("slime")
+
+ harm_intent_damage = 5
+ icon_living = "grey baby slime"
+ icon_dead = "grey baby slime dead"
+ response_help = "pets"
+ response_disarm = "shoos"
+ response_harm = "stomps on"
+ emote_see = list("jiggles", "bounces in place")
+ speak_emote = list("chirps")
+
+ layer = 5
+
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+
+ maxHealth = 150
+ health = 150
+ gender = NEUTER
+
+ nutrition = 700
+
+ see_in_dark = 8
+ update_slimes = 0
+
+ verb_say = "telepathically chirps"
+ verb_ask = "telepathically asks"
+ verb_exclaim = "telepathically cries"
+ verb_yell = "telephatically cries"
+
+ // canstun and canweaken don't affect slimes because they ignore stun and weakened variables
+ // for the sake of cleanliness, though, here they are.
+ status_flags = CANPARALYSE|CANPUSH
+
+ var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside
+ var/mutation_chance = 30 // Chance of mutating, should be between 25 and 35
+
+ var/powerlevel = 0 // 1-10 controls how much electricity they are generating
+ var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces
+
+ var/number = 0 // Used to understand when someone is talking to it
+
+ var/mob/living/Victim = null // the person the slime is currently feeding on
+ var/mob/living/Target = null // AI variable - tells the slime to hunt this down
+ var/mob/living/Leader = null // AI variable - tells the slime to follow this person
+
+ var/attacked = 0 // Determines if it's been attacked recently. Can be any number, is a cooloff-ish variable
+ var/rabid = 0 // If set to 1, the slime will attack and eat anything it comes in contact with
+ var/holding_still = 0 // AI variable, cooloff-ish for how long it's going to stay in one place
+ var/target_patience = 0 // AI variable, cooloff-ish for how long it's going to follow its target
+
+ var/list/Friends = list() // A list of friends; they are not considered targets for feeding; passed down after splitting
+
+ var/list/speech_buffer = list() // Last phrase said near it and person who said it
+
+ var/mood = "" // To show its face
+
+ ///////////TIME FOR SUBSPECIES
+
+ var/colour = "grey"
+ var/coretype = /obj/item/slime_extract/grey
+ var/list/slime_mutation[4]
+
+/mob/living/simple_animal/slime/New()
+ if(is_adult)
+ health = 200
+ maxHealth = 200
+ create_reagents(100)
+ spawn (0)
+ number = rand(1, 1000)
+ name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
+ icon_state = "[colour] [is_adult ? "adult" : "baby"] slime"
+ icon_dead = "[icon_state] dead"
+ real_name = name
+ slime_mutation = mutation_table(colour)
+ mutation_chance = rand(25, 35)
+ var/sanitizedcolour = replacetext(colour, " ", "")
+ coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]")
+ ..()
+
+/mob/living/simple_animal/slime/regenerate_icons()
+ overlays.len = 0
+ var/icon_text = "[colour] [is_adult ? "adult" : "baby"] slime"
+ icon_dead = "[icon_text] dead"
+ if(stat != DEAD)
+ icon_state = icon_text
+ if(mood)
+ overlays += image('icons/mob/slimes.dmi', icon_state = "aslime-[mood]")
+ else
+ icon_state = icon_dead
+ ..()
+
+/mob/living/simple_animal/slime/movement_delay()
+ if(bodytemperature >= 330.23) // 135 F
+ return -1 // slimes become supercharged at high temperatures
+
+ var/tally = 0
+
+ var/health_deficiency = (100 - health)
+ if(health_deficiency >= 45)
+ tally += (health_deficiency / 25)
+
+ if(bodytemperature < 183.222)
+ tally += (283.222 - bodytemperature) / 10 * 1.75
+
+ if(reagents)
+ if(reagents.has_reagent("morphine")) // morphine slows slimes down
+ tally *= 2
+
+ if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow
+ tally *= 5
+
+ if(health <= 0) // if damaged, the slime moves twice as slow
+ tally *= 2
+
+ return tally + config.slime_delay
+
+/mob/living/simple_animal/slime/ObjBump(obj/O)
+ if(!client && powerlevel > 0)
+ var/probab = 10
+ switch(powerlevel)
+ if(1 to 2) probab = 20
+ if(3 to 4) probab = 30
+ if(5 to 6) probab = 40
+ if(7 to 8) probab = 60
+ if(9) probab = 70
+ if(10) probab = 95
+ if(prob(probab))
+ if(istype(O, /obj/structure/window) || istype(O, /obj/structure/grille))
+ if(nutrition <= get_hunger_nutrition() && !Atkcool)
+ if (is_adult || prob(5))
+ O.attack_slime(src)
+ Atkcool = 1
+ spawn(45)
+ Atkcool = 0
+
+/mob/living/simple_animal/slime/MobBump(mob/M)
+ if(istype(M, /mob/living/carbon/human)) //pushing humans
+ if(is_adult && prob(10)) //only if we're adult, and 10% of the time
+ return 0
+ else
+ return 1
+
+/mob/living/simple_animal/slime/Process_Spacemove(var/movement_dir = 0)
+ return 2
+
+/mob/living/simple_animal/slime/Stat()
+ if(..())
+
+ if(!docile)
+ stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]")
+ if(amount_grown >= 10)
+ if(is_adult)
+ stat(null, "You can reproduce!")
+ else
+ stat(null, "You can evolve!")
+
+ stat(null,"Power Level: [powerlevel]")
+
+/mob/living/simple_animal/slime/bullet_act(var/obj/item/projectile/Proj)
+ if(!Proj)
+ return
+ attacked += 10
+ if((Proj.damage_type == BURN))
+ adjustBruteLoss(-abs(Proj.damage)) //fire projectiles heals slimes.
+ Proj.on_hit(src, 0)
+ else
+ ..(Proj)
+ return 0
+
+/mob/living/simple_animal/slime/emp_act(severity)
+ powerlevel = 0 // oh no, the power!
+ ..()
+
+/mob/living/simple_animal/slime/MouseDrop(var/atom/movable/A as mob|obj)
+ if(isliving(A) && A != src)
+ var/mob/living/Food = A
+ if(CanFeedon(Food))
+ Feedon(Food)
+ ..()
+
+/mob/living/simple_animal/slime/unEquip(obj/item/W as obj)
+ return
+
+/mob/living/simple_animal/slime/start_pulling(var/atom/movable/AM)
+ return
+
+/mob/living/simple_animal/slime/attack_ui(slot)
+ return
+
+/mob/living/simple_animal/slime/attack_slime(mob/living/simple_animal/slime/M as mob)
+ if(..()) //successful slime attack
+ if(M == src)
+ return
+ if(Victim)
+ Victim = null
+ visible_message("[M] pulls [src] off!")
+ return
+ attacked += 5
+ if(nutrition >= 100) //steal some nutrition. negval handled in life()
+ nutrition -= (50 + (40 * M.is_adult))
+ M.add_nutrition(50 + (40 * M.is_adult))
+ if(health > 0)
+ M.adjustBruteLoss(-10 + (-10 * M.is_adult))
+ M.updatehealth()
+
+/mob/living/simple_animal/slime/attack_animal(mob/living/simple_animal/M as mob)
+ if(..())
+ attacked += 10
+
+
+/mob/living/simple_animal/slime/attack_paw(mob/living/carbon/monkey/M as mob)
+ if(..()) //successful monkey bite.
+ attacked += 10
+
+/mob/living/simple_animal/slime/attack_larva(mob/living/carbon/alien/larva/L as mob)
+ if(..()) //successful larva bite.
+ attacked += 10
+
+/mob/living/simple_animal/slime/attack_hulk(mob/living/carbon/human/user)
+ if(user.a_intent == "harm")
+ adjustBruteLoss(10)
+ discipline_slime(user)
+
+
+/mob/living/simple_animal/slime/attack_hand(mob/living/carbon/human/M as mob)
+ if(Victim)
+ if(Victim == M)
+ if(prob(60))
+ visible_message("[M] attempts to wrestle \the [name] off!")
+ playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
+
+ else
+ visible_message(" [M] manages to wrestle \the [name] off!")
+ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+
+ discipline_slime(M)
+
+ else
+ M.do_attack_animation(src)
+ if(prob(30))
+ visible_message("[M] attempts to wrestle \the [name] off of [Victim]!")
+ playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
+
+ else
+ visible_message(" [M] manages to wrestle \the [name] off of [Victim]!")
+ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+
+ discipline_slime(M)
+ else
+ if(stat == DEAD && surgeries.len)
+ if(M.a_intent == "help")
+ for(var/datum/surgery/S in surgeries)
+ if(S.next_step(M, src))
+ return 1
+ if(..()) //successful attack
+ attacked += 10
+
+/mob/living/simple_animal/slime/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
+ if(..()) //if harm or disarm intent.
+ attacked += 10
+ discipline_slime(M)
+
+
+/mob/living/simple_animal/slime/attackby(obj/item/W, mob/living/user, params)
+ if(stat == DEAD && surgeries.len)
+ if(user.a_intent == "help")
+ for(var/datum/surgery/S in surgeries)
+ if(S.next_step(user, src))
+ return 1
+ if(istype(W,/obj/item/stack/sheet/mineral/plasma)) //Let's you feed slimes plasma.
+ if (user in Friends)
+ ++Friends[user]
+ else
+ Friends[user] = 1
+ user << "You feed the slime the plasma. It chirps happily."
+ var/obj/item/stack/sheet/mineral/plasma/S = W
+ S.use(1)
+ return
+ if(W.force > 0)
+ attacked += 10
+ if(prob(25))
+ user.do_attack_animation(src)
+ user.changeNext_move(CLICK_CD_MELEE)
+ user << "[W] passes right through [src]!"
+ return
+ if(Discipline && prob(50)) // wow, buddy, why am I getting attacked??
+ Discipline = 0
+ if(W.force >= 3)
+ var/force_effect = 2 * W.force
+ if(is_adult)
+ force_effect = round(W.force/2)
+ if(prob(10 + force_effect))
+ discipline_slime(user)
+ ..()
+
+/mob/living/simple_animal/slime/show_inv(mob/user)
+ return
+
+/mob/living/simple_animal/slime/proc/apply_water()
+ adjustBruteLoss(rand(15,20))
+ if(!client)
+ if(Target) // Like cats
+ Target = null
+ ++Discipline
+ return
+
+/mob/living/simple_animal/slime/getTrail()
+ return null
+
+/mob/living/simple_animal/slime/examine(mob/user)
+
+ var/msg = "*---------*\nThis is \icon[src] \a [src]!\n"
+ if (src.stat == DEAD)
+ msg += "It is limp and unresponsive.\n"
+ else
+ if (src.getBruteLoss())
+ msg += ""
+ if (src.getBruteLoss() < 40)
+ msg += "It has some punctures in its flesh!"
+ else
+ msg += "It has severe punctures and tears in its flesh!"
+ msg += "\n"
+
+ switch(powerlevel)
+
+ if(2 to 3)
+ msg += "It is flickering gently with a little electrical activity.\n"
+
+ if(4 to 5)
+ msg += "It is glowing gently with moderate levels of electrical activity.\n"
+
+ if(6 to 9)
+ msg += "It is glowing brightly with high levels of electrical activity.\n"
+
+ if(10)
+ msg += "It is radiating with massive levels of electrical activity!\n"
+
+ msg += "*---------*"
+ user << msg
+ return
+
+/mob/living/simple_animal/slime/proc/discipline_slime(mob/user)
+
+ if(stat == DEAD)
+ return
+
+ if(prob(80) && !client)
+ Discipline++
+
+ if(!is_adult)
+ if(Discipline == 1)
+ attacked = 0
+
+ if(Victim || Target)
+ Victim = null
+ Target = null
+ anchored = 0
+
+ spawn(0)
+ SStun = 1
+ sleep(rand(20,60))
+ SStun = 0
+
+ spawn(0)
+ canmove = 0
+ if(user)
+ step_away(src,user,15)
+ sleep(3)
+ if(user)
+ step_away(src,user,15)
+ canmove = 1
+
+/mob/living/simple_animal/slime/pet
+ docile = 1
diff --git a/code/modules/mob/living/carbon/slime/subtypes.dm b/code/modules/mob/living/simple_animal/slime/subtypes.dm
similarity index 95%
rename from code/modules/mob/living/carbon/slime/subtypes.dm
rename to code/modules/mob/living/simple_animal/slime/subtypes.dm
index 35d38e31a48..55a6eee734d 100644
--- a/code/modules/mob/living/carbon/slime/subtypes.dm
+++ b/code/modules/mob/living/simple_animal/slime/subtypes.dm
@@ -1,4 +1,4 @@
-proc/mutation_table(var/colour)
+/mob/living/simple_animal/slime/proc/mutation_table(var/colour)
var/list/slime_mutation[4]
switch(colour)
//Tier 1
diff --git a/code/modules/mob/living/simple_animal/slime/update_icons.dm b/code/modules/mob/living/simple_animal/slime/update_icons.dm
new file mode 100644
index 00000000000..14525b1e8a0
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/slime/update_icons.dm
@@ -0,0 +1,4 @@
+//no special icon processing
+
+/mob/living/simple_animal/slime/update_transform() //They're slimes, they don't lie down.
+ return
\ No newline at end of file
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index e3781e4bc3a..308239422d8 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -140,6 +140,7 @@
var/area/lastarea = null
var/digitalcamo = 0 // Can they be tracked by the AI?
+ var/weakeyes = 0 //Are they vulnerable to flashes?
var/has_unlimited_silicon_privilege = 0 // Can they interact with station electronics
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index bf994d1512b..5b9be5c61c9 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -31,7 +31,7 @@
return 0
/proc/isslime(A)
- if(istype(A, /mob/living/carbon/slime))
+ if(istype(A, /mob/living/simple_animal/slime))
return 1
return 0
diff --git a/code/modules/mob/say_readme.dm b/code/modules/mob/say_readme.dm
index 150f58c865d..ddc9f2b148b 100644
--- a/code/modules/mob/say_readme.dm
+++ b/code/modules/mob/say_readme.dm
@@ -52,7 +52,7 @@ global procs
What languages this object speaks/understands. If the languages of the speaker don't match the languages
of the hearer, the message will be modified in the hearer's lang_treat().
- verb_say/verb_ask/verb_yell
+ verb_say/verb_ask/verb_exclaim/verb_yell
These determine what the verb is for their respective action. Used in say_quote().
say(message)
@@ -74,8 +74,12 @@ global procs
Modifies the message by comparing the languages of the speaker with the languages of the hearer.
Called on the hearer.
- say_quote(text, spans)
+ say_quote(input, spans)
Adds a verb and quotes to a message. Also attaches span classes to a message. Verbs are determined by verb_say/verb_ask/verb_yell variables. Called on the speaker.
+
+ get_spans(input, spans)
+ Returns the list of spans that are always applied to messages of this atom.
+ Always return ..() | + youroutput when overriding this proc!
/mob
say_dead(message)
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 4db29adc40f..a261287a103 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -373,18 +373,18 @@
for(var/t in organs)
qdel(t)
- var/mob/living/carbon/slime/new_slime
+ var/mob/living/simple_animal/slime/new_slime
if(reproduce)
var/number = pick(14;2,3,4) //reproduce (has a small chance of producing 3 or 4 offspring)
var/list/babies = list()
for(var/i=1,i<=number,i++)
- var/mob/living/carbon/slime/M = new/mob/living/carbon/slime(loc)
+ var/mob/living/simple_animal/slime/M = new/mob/living/simple_animal/slime(loc)
M.nutrition = round(nutrition/number)
step_away(M,src)
babies += M
new_slime = pick(babies)
else
- new_slime = new /mob/living/carbon/slime(loc)
+ new_slime = new /mob/living/simple_animal/slime(loc)
new_slime.a_intent = "harm"
new_slime.key = key
diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm
index 28934e23b88..13ec3f05463 100644
--- a/code/modules/mob/update_icons.dm
+++ b/code/modules/mob/update_icons.dm
@@ -43,6 +43,9 @@
/mob/proc/update_inv_head()
return
+/mob/proc/update_hair()
+ return
+
/mob/proc/update_inv_gloves()
return
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 5d4d98b84a8..cf006b775cc 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -81,7 +81,7 @@
/obj/item/weapon/paper/attack_self(mob/user)
user.examinate(src)
- if(rigged && (SSevent.holiday == "April Fool's Day"))
+ if(rigged && (SSevent.holidays && SSevent.holidays[APRIL_FOOLS]))
if(spam_flag == 0)
spam_flag = 1
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1)
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index 248f36b8967..a26c0497223 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -47,7 +47,7 @@
papers.Remove(P)
else
P = new /obj/item/weapon/paper
- if(SSevent.holiday == "April Fool's Day")
+ if(SSevent.holidays && SSevent.holidays[APRIL_FOOLS])
if(prob(30))
P.info = "HONK HONK HONK HONK HONK HONK HONK
HOOOOOOOOOOOOOOOOOOOOOONK
APRIL FOOLS"
P.rigged = 1
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index c502e814eff..1d86b12c944 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -42,7 +42,7 @@
user << "Your soul is too far away."
return
makeNewConstruct(/mob/living/simple_animal/construct/harvester, user, null, 1)
- new /obj/effect/effect/sleep_smoke(user.loc)
+ PoolOrNew(/obj/effect/effect/sleep_smoke, user.loc)
/obj/singularity/narsie/process()
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm
index 8793962e77f..5ff242be8aa 100644
--- a/code/modules/projectiles/ammunition.dm
+++ b/code/modules/projectiles/ammunition.dm
@@ -34,6 +34,25 @@
BB = new projectile_type(src)
return
+/obj/item/ammo_casing/attackby(obj/item/ammo_box/box as obj, mob/user as mob, params)
+ if (!istype(box, /obj/item/ammo_box))
+ return
+ if(isturf(src.loc))
+ var/boolets = 0
+ for(var/obj/item/ammo_casing/bullet in src.loc)
+ if (box.stored_ammo.len >= box.max_ammo)
+ break
+ if (bullet.BB)
+ if (box.give_round(bullet, 0))
+ boolets++
+ else
+ continue
+ if (boolets > 0)
+ box.update_icon()
+ user << "You collect [boolets] shell\s. [box] now contains [box.stored_ammo.len] shell\s."
+ else
+ user << "You fail to collect anything."
+
//Boxes of ammo
/obj/item/ammo_box
name = "ammo box (null_reference_exception)"
@@ -55,7 +74,6 @@
var/caliber
var/multiload = 1
-
/obj/item/ammo_box/New()
for(var/i = 1, i <= max_ammo, i++)
stored_ammo += new ammo_type(src)
@@ -72,7 +90,8 @@
return b
/obj/item/ammo_box/proc/give_round(var/obj/item/ammo_casing/R, var/replace_spent = 0)
- if(!R || (R.caliber != caliber))
+ // Boxes don't have a caliber type, magazines do. Not sure if it's intended or not, but if we fail to find a caliber, then we fall back to ammo_type.
+ if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type))
return 0
if (stored_ammo.len < max_ammo)
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index 32e30d6e6f1..e26c9b31e92 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -183,10 +183,14 @@
else
return 0
+/obj/item/ammo_casing/caseless/update_icon()
+ ..()
+ icon_state = "[initial(icon_state)]"
/obj/item/ammo_casing/caseless/a75
desc = "A .75 bullet casing."
caliber = "75"
+ icon_state = "s-casing-live"
projectile_type = /obj/item/projectile/bullet/gyro
/obj/item/ammo_casing/a40mm
@@ -199,8 +203,45 @@
/obj/item/ammo_casing/caseless/magspear
name = "magnetic spear"
desc = "A reusable spear that is typically loaded into kinetic spearguns."
- projectile_type = /obj/item/projectile/bullet/magspear
+ projectile_type = /obj/item/projectile/bullet/reusable/magspear
caliber = "speargun"
icon_state = "magspear"
throwforce = 15 //still deadly when thrown
throw_speed = 3
+
+/obj/item/ammo_casing/caseless/foam_dart
+ name = "foam dart"
+ desc = "Its nerf or nothing! Ages 8 and up."
+ projectile_type = /obj/item/projectile/bullet/reusable/foam_dart
+ caliber = "foam_force"
+ icon = 'icons/obj/guns/toy.dmi'
+ icon_state = "foamdart"
+ var/modified = 0
+
+/obj/item/ammo_casing/caseless/foam_dart/update_icon()
+ ..()
+ if (modified)
+ icon_state = "foamdart_empty"
+ desc = "Its nerf or nothing! ...Although, this one doesn't look too safe."
+
+/obj/item/ammo_casing/caseless/foam_dart/attackby(var/obj/item/A as obj, mob/user as mob, params)
+ ..()
+ if (istype(A, /obj/item/weapon/screwdriver) && !modified)
+ modified = 1
+ BB.damage_type = BRUTE
+ icon_state = "foamdart_empty"
+ desc = "Its nerf or nothing! ...Although, this one doesn't look too safe."
+ user << "You pop the safety cap off of [src]."
+ else if ((istype(A, /obj/item/weapon/pen)) && modified && !BB.contents.len)
+ user.drop_item()
+ A.loc = BB
+ BB.damage = 5
+ BB.nodamage = 0
+ user << "You insert [A] into [src]."
+ return
+
+/obj/item/ammo_casing/caseless/foam_dart/riot
+ name = "riot foam dart"
+ desc = "Who's smart idea was it to use toys as crowd control? Ages 18 and up."
+ projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/riot
+ icon_state = "foamdart_riot"
diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm
index 59076dc6da8..a7d14066c38 100644
--- a/code/modules/projectiles/ammunition/boxes.dm
+++ b/code/modules/projectiles/ammunition/boxes.dm
@@ -47,3 +47,14 @@
ammo_type = /obj/item/ammo_casing/a762
max_ammo = 5
multiple_sprites = 1
+
+/obj/item/ammo_box/foambox
+ name = "ammo box (Foam Darts)"
+ icon = 'icons/obj/guns/toy.dmi'
+ icon_state = "foambox"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ max_ammo = 40
+
+/obj/item/ammo_box/foambox/riot
+ icon_state = "foambox_riot"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
\ No newline at end of file
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index c6f8fbf6eba..aa1e1efa356 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -122,6 +122,14 @@
e_cost = 50
fire_sound = "sound/weapons/taser2.ogg"
+/obj/item/ammo_casing/energy/plasma
+ projectile_type = /obj/item/projectile/plasma
+ select_name = "plasma burst"
+ fire_sound = 'sound/weapons/pulse.ogg'
+
+/obj/item/ammo_casing/energy/plasma/adv
+ projectile_type = /obj/item/projectile/plasma/adv
+
/obj/item/ammo_casing/energy/wormhole
projectile_type = /obj/item/projectile/beam/wormhole
e_cost = 0
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index 6addb24a524..b1296f8b2cf 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -104,6 +104,14 @@
max_ammo = 5
multiload = 1
+/obj/item/ammo_box/magazine/internal/shot/toy
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ caliber = "foam_force"
+ max_ammo = 4
+
+/obj/item/ammo_box/magazine/internal/shot/toy/crossbow
+ max_ammo = 5
+
///////////EXTERNAL MAGAZINES////////////////
/obj/item/ammo_box/magazine/m10mm
@@ -216,3 +224,49 @@ obj/item/ammo_box/magazine/tommygunm45
name = "shotgun magazine (12g dragon's breath)"
icon_state = "m12gf"
ammo_type = /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath
+
+/obj/item/ammo_box/magazine/toy
+ name = "foam force META magazine"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ caliber = "foam_force"
+
+/obj/item/ammo_box/magazine/toy/smg
+ name = "foam force SMG magazine"
+ icon_state = "smg9mm-20"
+ max_ammo = 20
+
+/obj/item/ammo_box/magazine/toy/smg/update_icon()
+ ..()
+ icon_state = "smg9mm-[round(ammo_count(),5)]"
+
+/obj/item/ammo_box/magazine/toy/smg/riot
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
+
+/obj/item/ammo_box/magazine/toy/pistol
+ name = "foam force pistol magazine"
+ icon_state = "9x19p"
+ max_ammo = 8
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/toy/pistol/riot
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
+
+/obj/item/ammo_box/magazine/toy/smgm45
+ name = "donksoft SMG magazine"
+ caliber = "foam_force"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
+ max_ammo = 20
+
+/obj/item/ammo_box/magazine/toy/smgm45/update_icon()
+ ..()
+ icon_state = "c20r45-[round(ammo_count(),2)]"
+
+/obj/item/ammo_box/magazine/toy/m762
+ name = "donksoft box magazine"
+ caliber = "foam_force"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
+ max_ammo = 50
+
+/obj/item/ammo_box/magazine/toy/m762/update_icon()
+ ..()
+ icon_state = "a762-[round(ammo_count(),10)]"
\ No newline at end of file
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 9b14f51bf4d..4139a3e348c 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -17,6 +17,7 @@
throw_range = 5
force = 5.0
origin_tech = "combat=1"
+ needs_permit = 1
attack_verb = list("struck", "hit", "bashed")
var/fire_sound = "gunshot"
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 8f885b321f6..d342e89b0d4 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -9,6 +9,7 @@
var/modifystate = 0
var/list/ammo_type = list(/obj/item/ammo_casing/energy)
var/select = 1 //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next.
+ var/can_charge = 1 //Can it be charged in a recharger?
/obj/item/weapon/gun/energy/emp_act(severity)
power_supply.use(round(power_supply.charge / severity))
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index d255add4028..f1e7f779d14 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -14,6 +14,7 @@
desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice."
ammo_type = list(/obj/item/ammo_casing/energy/laser/practice)
clumsy_check = 0
+ needs_permit = 0
obj/item/weapon/gun/energy/laser/retro
name ="retro laser"
@@ -105,6 +106,7 @@ obj/item/weapon/gun/energy/laser/retro
ammo_type = list(/obj/item/ammo_casing/energy/laser/bluetag)
origin_tech = "combat=1;magnets=2"
clumsy_check = 0
+ needs_permit = 0
var/charge_tick = 0
pin = /obj/item/device/firing_pin/tag/blue
@@ -135,6 +137,7 @@ obj/item/weapon/gun/energy/laser/retro
ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag)
origin_tech = "combat=1;magnets=2"
clumsy_check = 0
+ needs_permit = 0
var/charge_tick = 0
pin = /obj/item/device/firing_pin/tag/red
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 5f374dcfefb..d5011d4e7d5 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -29,6 +29,7 @@
modifystate = 0
can_flashlight = 0
pin = null
+ can_charge = 0
/obj/item/weapon/gun/energy/gun/nuclear/New()
..()
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index 5fc0bbb93d6..d638e39a10b 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -40,6 +40,7 @@
icon_state = "pulse_pistol"
item_state = "gun"
cell_type = "/obj/item/weapon/stock_parts/cell/pulse/pistol"
+ can_charge = 0
/obj/item/weapon/gun/energy/pulse/pistol/loyalpin
pin = /obj/item/device/firing_pin/implant/loyalty
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 96822335fce..9fb83e560f7 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -123,6 +123,7 @@
item_state = "kineticgun"
ammo_type = list(/obj/item/ammo_casing/energy/kinetic)
cell_type = "/obj/item/weapon/stock_parts/cell/emproof"
+ needs_permit = 0 // Aparently these are safe to carry? I'm sure Golliaths would disagree.
var/overheat = 0
var/recent_reload = 1
var/range_add = 0
@@ -207,6 +208,71 @@
ammo_type = list(/obj/item/ammo_casing/energy/bolt/large)
pin = null
+/obj/item/weapon/gun/energy/plasmacutter
+ name = "plasma cutter"
+ desc = "A mining tool capable of expelling concentrated plasma bursts. You could use it to cut limbs off of xenos! Or, you know, mine stuff."
+ icon_state = "plasmacutter"
+ item_state = "plasmacutter"
+ force = 15
+ damtype = "fire"
+ modifystate = -1
+ origin_tech = "combat=1;materials=3;magnets=2;plasmatech=2;engineering=1"
+ ammo_type = list(/obj/item/ammo_casing/energy/plasma)
+ flags = CONDUCT | OPENCONTAINER
+ attack_verb = list("attacked", "slashed", "cut", "sliced")
+ can_charge = 0
+ var/volume = 15
+
+/obj/item/weapon/gun/energy/plasmacutter/New()
+ ..()
+ create_reagents(volume)
+
+/obj/item/weapon/gun/energy/plasmacutter/newshot()
+ if (!ammo_type || !reagents) return
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select]
+
+ var/amount = shot.e_cost / 100
+
+ if(!reagents.get_reagent_amount("plasma") >= amount)
+ return
+
+ reagents.remove_reagent("plasma", amount)
+ chambered = shot
+ chambered.newshot()
+ return
+
+/obj/item/weapon/gun/energy/plasmacutter/examine()
+ ..()
+ usr << "Has [reagents.get_reagent_amount("plasma")] unit\s of plasma left."
+ return
+
+/obj/item/weapon/gun/energy/plasmacutter/attackby(var/obj/item/A, var/mob/user)
+ if(reagents.maximum_volume > reagents.total_volume)
+ if(istype(A, /obj/item/stack/sheet/mineral/plasma))
+ var/obj/item/stack/sheet/S = A
+ S.use(1)
+ reagents.add_reagent("plasma", 20)
+ user << "You refill [src] with [S]. [reagents.get_reagent_amount("plasma")] units of plasma left."
+ if(istype(A, /obj/item/weapon/ore/plasma))
+ qdel(A)
+ reagents.add_reagent("plasma", 10)
+ user << "You refill [src] with [A]. [reagents.get_reagent_amount("plasma")] units of plasma left."
+ if(istype(A, /obj/item/weapon/storage/bag/ore))
+ if(locate(/obj/item/weapon/ore/plasma) in A)
+ attackby(locate(/obj/item/weapon/ore/plasma) in A, user)
+ ..()
+
+/obj/item/weapon/gun/energy/plasmacutter/charged/New()
+ ..()
+ reagents.add_reagent("plasma", volume)
+
+/obj/item/weapon/gun/energy/plasmacutter/adv
+ name = "advanced plasma cutter"
+ icon_state = "adv_plasmacutter"
+ origin_tech = "combat=3;materials=4;magnets=3;plasmatech=3;engineering=2"
+ ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv)
+ volume = 25
+
/obj/item/weapon/gun/energy/disabler
name = "disabler"
desc = "A self-defense weapon that exhausts organic targets, weakening them until they collapse."
@@ -219,6 +285,7 @@
desc = "An integrated disabler that draws from a cyborg's power cell. This weapon contains a limiter to prevent the cyborg's power cell from overheating."
var/charge_tick = 0
var/recharge_time = 2.5
+ can_charge = 0
/obj/item/weapon/gun/energy/disabler/cyborg/New()
..()
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index acce8548cde..1281adc83e5 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -11,7 +11,8 @@
/obj/item/weapon/gun/projectile/New()
..()
- magazine = new mag_type(src)
+ if (!magazine)
+ magazine = new mag_type(src)
chamber_round()
update_icon()
return
@@ -133,7 +134,7 @@
return boolets
/obj/item/weapon/gun/projectile/suicide_act(mob/user)
- if (src.chambered)
+ if (src.chambered && src.chambered.BB && !src.chambered.BB.nodamage)
user.visible_message("[user] is putting the barrel of the [src.name] in \his mouth. It looks like \he's trying to commit suicide.")
sleep(25)
if(user.l_hand == src || user.r_hand == src)
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index b4de0731b06..0baee44780b 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -83,7 +83,7 @@
/obj/item/weapon/gun/projectile/shotgun/riot/attackby(var/obj/item/A as obj, mob/user as mob, params)
..()
- if(istype(A, /obj/item/weapon/circular_saw) || istype(A, /obj/item/weapon/pickaxe/plasmacutter))
+ if(istype(A, /obj/item/weapon/circular_saw) || istype(A, /obj/item/weapon/gun/energy/plasmacutter))
sawoff(user)
if(istype(A, /obj/item/weapon/melee/energy))
var/obj/item/weapon/melee/energy/W = A
@@ -160,7 +160,7 @@
var/obj/item/weapon/melee/energy/W = A
if(W.active)
sawoff(user)
- if(istype(A, /obj/item/weapon/circular_saw) || istype(A, /obj/item/weapon/pickaxe/plasmacutter))
+ if(istype(A, /obj/item/weapon/circular_saw) || istype(A, /obj/item/weapon/gun/energy/plasmacutter))
sawoff(user)
/obj/item/weapon/gun/projectile/revolver/doublebarrel/attack_self(mob/living/user as mob)
diff --git a/code/modules/projectiles/guns/projectile/toy.dm b/code/modules/projectiles/guns/projectile/toy.dm
new file mode 100644
index 00000000000..ed3a7e38e68
--- /dev/null
+++ b/code/modules/projectiles/guns/projectile/toy.dm
@@ -0,0 +1,86 @@
+/obj/item/weapon/gun/projectile/automatic/toy
+ name = "foam force SMG"
+ desc = "A prototype three-round burst toy submachine gun. Ages 8 and up."
+ icon = 'icons/obj/guns/toy.dmi'
+ icon_state = "saber"
+ item_state = "gun"
+ mag_type = /obj/item/ammo_box/magazine/toy/smg
+ fire_sound = 'sound/weapons/Gunshot_smg.ogg'
+ force = 0
+ throwforce = 0
+ burst_size = 3
+ can_suppress = 0
+ clumsy_check = 0
+ needs_permit = 0
+
+/obj/item/weapon/gun/projectile/automatic/toy/process_chamber(var/eject_casing = 0, var/empty_chamber = 1)
+ ..()
+
+/obj/item/weapon/gun/projectile/automatic/toy/pistol
+ name = "foam force pistol"
+ desc = "A small, easily concealable toy handgun. Ages 8 and up."
+ icon_state = "pistol"
+ w_class = 2
+ mag_type = /obj/item/ammo_box/magazine/toy/pistol
+ fire_sound = 'sound/weapons/Gunshot.ogg'
+ can_suppress = 0
+ burst_size = 1
+ fire_delay = 0
+ action_button_name = null
+
+/obj/item/weapon/gun/projectile/automatic/toy/pistol/update_icon()
+ ..()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+/obj/item/weapon/gun/projectile/automatic/toy/pistol/riot/New()
+ magazine = new /obj/item/ammo_box/magazine/toy/pistol/riot(src)
+ ..()
+
+/obj/item/weapon/gun/projectile/shotgun/toy
+ name = "foam force shotgun"
+ desc = "A toy shotgun with wood furniture and a four-shell capacity underneath. Ages 8 and up."
+ icon = 'icons/obj/guns/toy.dmi'
+ force = 0
+ throwforce = 0
+ origin_tech = null
+ mag_type = /obj/item/ammo_box/magazine/internal/shot/toy
+ clumsy_check = 0
+ needs_permit = 0
+
+/obj/item/weapon/gun/projectile/shotgun/toy/process_chamber()
+ ..()
+ if(chambered && !chambered.BB)
+ qdel(chambered)
+
+/obj/item/weapon/gun/projectile/shotgun/toy/crossbow
+ name = "foam force crossbow"
+ desc = "A weapon favored by many overactive children. Ages 8 and up."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "foamcrossbow"
+ item_state = "crossbow"
+ mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/crossbow
+ fire_sound = 'sound/items/syringeproj.ogg'
+ slot_flags = SLOT_BELT
+ w_class = 2
+
+/obj/item/weapon/gun/projectile/automatic/c20r/toy
+ name = "donksoft SMG"
+ desc = "A bullpup two-round burst toy SMG, designated 'C-20r'. Ages 8 and up."
+ icon = 'icons/obj/guns/toy.dmi'
+ can_suppress = 0
+ needs_permit = 0
+ mag_type = /obj/item/ammo_box/magazine/toy/smgm45
+
+/obj/item/weapon/gun/projectile/automatic/c20r/toy/process_chamber(var/eject_casing = 0, var/empty_chamber = 1)
+ ..()
+
+/obj/item/weapon/gun/projectile/automatic/l6_saw/toy
+ name = "donksoft LMG"
+ desc = "A heavily modified toy light machine gun, designated 'L6 SAW'. Ages 8 and up."
+ icon = 'icons/obj/guns/toy.dmi'
+ can_suppress = 0
+ needs_permit = 0
+ mag_type = /obj/item/ammo_box/magazine/toy/m762
+
+/obj/item/weapon/gun/projectile/automatic/l6_saw/toy/process_chamber(var/eject_casing = 0, var/empty_chamber = 1)
+ ..()
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index bf61095ee95..8745de421ff 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -39,7 +39,7 @@
var/stamina = 0
var/jitter = 0
var/forcedodge = 0
-
+ // 1 to pass solid objects, 2 to pass solid turfs (results in bugs, bugs and tons of bugs)
var/range = 0
var/proj_hit = 0
@@ -69,9 +69,10 @@
return 50 //if the projectile doesn't do damage, play its hitsound at 50% volume
/obj/item/projectile/Bump(atom/A)
- if(A == firer)
+ if(A == firer || A == src)
loc = A.loc
return 0 //cannot shoot yourself
+
if(bumped)//Stops multihit projectiles
return 1
bumped = 1
@@ -102,6 +103,7 @@
bumped = 0 // reset bumped variable!
loc = new_loc
permutated.Add(A)
+ Range()
return 0
qdel(src)
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index e6ea51aa92d..4f4edc5dcd7 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -68,4 +68,12 @@
stutter = 5
/obj/item/projectile/energy/bolt/large
- damage = 20
\ No newline at end of file
+ damage = 20
+
+/obj/item/ammo_casing/energy/plasma
+ projectile_type = /obj/item/projectile/plasma
+ select_name = "plasma burst"
+ fire_sound = 'sound/weapons/pulse.ogg'
+
+/obj/item/ammo_casing/energy/plasma/adv
+ projectile_type = /obj/item/projectile/plasma/adv
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index adfb3b75eee..d485784109c 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -164,9 +164,9 @@ proc/wabbajack(mob/living/M)
else
new_mob.languages |= HUMAN
if("slime")
- new_mob = new /mob/living/carbon/slime(M.loc)
+ new_mob = new /mob/living/simple_animal/slime(M.loc)
if(prob(50))
- var/mob/living/carbon/slime/Slime = new_mob
+ var/mob/living/simple_animal/slime/Slime = new_mob
Slime.is_adult = 1
new_mob.languages |= HUMAN
if("xeno")
diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable.dm
new file mode 100644
index 00000000000..0e9d010d3fe
--- /dev/null
+++ b/code/modules/projectiles/projectile/reusable.dm
@@ -0,0 +1,49 @@
+/obj/item/projectile/bullet/reusable
+ name = "reusable bullet"
+ desc = "How do you even reuse a bullet?"
+ var/obj/item/ammo_casing/caseless/ammo_type = /obj/item/ammo_casing/caseless/
+
+/obj/item/projectile/bullet/reusable/on_hit(var/atom/target, var/blocked = 0)
+ if(!proj_hit)
+ proj_hit = 1
+ if (src.contents.len)
+ var/obj/content
+ for(content in src.contents)
+ content.loc = src.loc
+ else
+ new ammo_type(src.loc)
+ ..()
+
+/obj/item/projectile/bullet/reusable/on_range()
+ if(!proj_hit)
+ if (src.contents.len)
+ var/obj/content
+ for(content in src.contents)
+ content.loc = src.loc
+ else
+ new ammo_type(src.loc)
+ ..()
+
+/obj/item/projectile/bullet/reusable/magspear
+ name = "magnetic spear"
+ desc = "WHITE WHALE, HOLY GRAIL"
+ damage = 30 //takes 3 spears to kill a mega carp, one to kill a normal carp
+ icon_state = "magspear"
+ ammo_type = /obj/item/ammo_casing/caseless/magspear
+
+/obj/item/projectile/bullet/reusable/foam_dart
+ name = "foam dart"
+ desc = "I hope you're wearing eye protection."
+ damage = 0 // It's a damn toy.
+ damage_type = OXY
+ nodamage = 1
+ icon = 'icons/obj/guns/toy.dmi'
+ icon_state = "foamdart"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ range = 10
+
+/obj/item/projectile/bullet/reusable/foam_dart/riot
+ name = "riot foam dart"
+ icon_state = "foamdart_riot"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
+ stamina = 25
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index cdcb03031af..689fc678d63 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -199,19 +199,37 @@ obj/item/projectile/kinetic/New()
explosion(target, -1, 0, 1)
return 1
-/obj/item/projectile/bullet/magspear
- name = "magnetic spear"
- desc = "WHITE WHALE, HOLY GRAIL"
- damage = 30 //takes 3 spears to kill a mega carp, one to kill a normal carp
- icon_state = "magspear"
+/obj/item/projectile/plasma
+ name = "plasma blast"
+ icon_state = "plasmacutter"
+ damage_type = BURN
+ damage = 10
+ range = 6
+ var/power = 9
-/obj/item/projectile/bullet/magspear/on_hit(var/atom/target, var/blocked = 0)
- if(!proj_hit)
- proj_hit = 1
- new /obj/item/ammo_casing/caseless/magspear(src.loc)
- ..()
+/obj/item/projectile/plasma/on_hit(var/atom/target)
+ if(istype(target, /turf/simulated/mineral))
+ while(target && target.density && range > 0 && power > 0)
+ power -= 1
+ var/turf/simulated/mineral/M = target
+ M.gets_drilled()
+ if(range > 0 && power > 0)
+ return -1
+ return ..()
-/obj/item/projectile/bullet/magspear/on_range()
- if(!proj_hit)
- new /obj/item/ammo_casing/caseless/magspear(src.loc)
- ..()
+/obj/item/projectile/plasma/adv
+ range = 9
+ power = 12
+ damage = 15
+
+/obj/item/projectile/plasma/adv/on_hit(var/atom/target)
+ if(!ismob(target) && !istype(target, /turf/simulated/mineral))
+ target.ex_act(3)
+ power -= 10
+ if(range > 0 && power > 0 && (!target || !target.density))
+ return -1
+ return ..()
+
+/obj/item/projectile/plasma/adv/mech
+ range = 12
+ power = 18
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm
index 4c596f27033..59ce545d9bc 100644
--- a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm
+++ b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm
@@ -434,7 +434,7 @@ datum/reagent/cryostylane/on_mob_life(var/mob/living/M as mob) //TODO: code free
datum/reagent/cryostylane/reaction_turf(var/turf/simulated/T, var/volume)
if(volume >= 5)
- for(var/mob/living/carbon/slime/M in T)
+ for(var/mob/living/simple_animal/slime/M in T)
M.adjustToxLoss(rand(15,30))
datum/reagent/pyrosium
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 496b6467887..68118cdbcf4 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -575,6 +575,67 @@
desc = "Used to create condiments and other cooking supplies."
condi = 1
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/obj/machinery/chem_master/constructable
+ name = "ChemMaster 2999"
+ desc = "Used to seperate chemicals and distribute them in a variety of forms."
+
+/obj/machinery/chem_master/constructable/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/chem_master(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
+ component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null)
+ component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null)
+
+/obj/machinery/chem_master/constructable/attackby(var/obj/item/B as obj, var/mob/user as mob, params)
+
+ if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0_", B))
+ if(beaker)
+ beaker.loc = src.loc
+ beaker = null
+ reagents.clear_reagents()
+ if(loaded_pill_bottle)
+ loaded_pill_bottle.loc = src.loc
+ loaded_pill_bottle = null
+ return
+
+ if(exchange_parts(user, B))
+ return
+
+ if(panel_open)
+ if(istype(B, /obj/item/weapon/crowbar))
+ default_deconstruction_crowbar(B)
+ return 1
+ else
+ user << "You can't use the [src.name] while it's panel is opened."
+ return 1
+
+ if(istype(B, /obj/item/weapon/reagent_containers/glass))
+ if(src.beaker)
+ user << "A beaker is already loaded into the machine."
+ return
+ src.beaker = B
+ user.drop_item()
+ B.loc = src
+ user << "You add the beaker to the machine!"
+ src.updateUsrDialog()
+ icon_state = "mixer1"
+
+ else if(!condi && istype(B, /obj/item/weapon/storage/pill_bottle))
+ if(src.loaded_pill_bottle)
+ user << "A pill bottle is already loaded into the machine."
+ return
+ src.loaded_pill_bottle = B
+ user.drop_item()
+ B.loc = src
+ user << "You add the pill bottle into the dispenser slot!"
+ src.updateUsrDialog()
+
+ return
+
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm
index 05d8190e3f3..85bc7b597ff 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm
@@ -252,7 +252,7 @@ datum/reagent/water/reaction_turf(var/turf/simulated/T, var/volume)
if(volume >= 10)
T.MakeSlippery()
- for(var/mob/living/carbon/slime/M in T)
+ for(var/mob/living/simple_animal/slime/M in T)
M.apply_water()
var/hotspot = (locate(/obj/effect/hotspot) in T)
@@ -681,7 +681,7 @@ datum/reagent/space_cleaner/reaction_turf(var/turf/T, var/volume)
for(var/obj/effect/decal/cleanable/C in T)
qdel(C)
- for(var/mob/living/carbon/slime/M in T)
+ for(var/mob/living/simple_animal/slime/M in T)
M.adjustToxLoss(rand(5,10))
if(istype(T, /turf/simulated/floor))
var/turf/simulated/floor/F = T
diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm
index 42480f5a7ef..504f23c54c7 100644
--- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm
@@ -100,15 +100,15 @@ datum/reagent/consumable/capsaicin/on_mob_life(var/mob/living/M as mob)
M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT
if(holder.has_reagent("cryostylane"))
holder.remove_reagent("cryostylane", 5)
- if(istype(M, /mob/living/carbon/slime))
+ if(isslime(M))
M.bodytemperature += rand(5,20)
if(15 to 25)
M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(istype(M, /mob/living/carbon/slime))
+ if(isslime(M))
M.bodytemperature += rand(10,20)
if(25 to INFINITY)
M.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(istype(M, /mob/living/carbon/slime))
+ if(isslime(M))
M.bodytemperature += rand(15,20)
..()
return
@@ -125,24 +125,24 @@ datum/reagent/consumable/frostoil/on_mob_life(var/mob/living/M as mob)
M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT
if(holder.has_reagent("capsaicin"))
holder.remove_reagent("capsaicin", 5)
- if(istype(M, /mob/living/carbon/slime))
+ if(isslime(M))
M.bodytemperature -= rand(5,20)
if(15 to 25)
M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(istype(M, /mob/living/carbon/slime))
+ if(isslime(M))
M.bodytemperature -= rand(10,20)
if(25 to INFINITY)
M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT
if(prob(1))
M.emote("shiver")
- if(istype(M, /mob/living/carbon/slime))
+ if(isslime(M))
M.bodytemperature -= rand(15,20)
..()
return
datum/reagent/consumable/frostoil/reaction_turf(var/turf/simulated/T, var/volume)
if(volume >= 5)
- for(var/mob/living/carbon/slime/M in T)
+ for(var/mob/living/simple_animal/slime/M in T)
M.adjustToxLoss(rand(15,30))
//if(istype(T))
// T.atmos_spawn_air(SPAWN_COLD)
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index d96dcc2d6a3..0f99675d8e2 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -433,7 +433,7 @@ datum/chemical_reaction/pestkiller
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
O.show_message(text("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1)
- var/mob/living/carbon/slime/S = new /mob/living/carbon/slime
+ var/mob/living/simple_animal/slime/S = new /mob/living/simple_animal/slime
S.loc = get_turf(holder.my_atom)
/datum/chemical_reaction/slimeinaprov
@@ -755,7 +755,7 @@ datum/chemical_reaction/pestkiller
required_other = 1
/datum/chemical_reaction/slimebloodlust/on_reaction(var/datum/reagents/holder)
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- for(var/mob/living/carbon/slime/slime in viewers(get_turf(holder.my_atom), null))
+ for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null))
slime.rabid = 1
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
O.show_message(text("The [slime] is driven into a frenzy!"), 1)
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 2a5353b3085..5c2928a6556 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -67,12 +67,12 @@
return
if(2.0)
if (prob(50))
- new /obj/effect/effect/water(src.loc)
+ PoolOrNew(/obj/effect/effect/water, src.loc)
qdel(src)
return
if(3.0)
if (prob(5))
- new /obj/effect/effect/water(src.loc)
+ PoolOrNew(/obj/effect/effect/water, src.loc)
qdel(src)
return
else
@@ -80,7 +80,7 @@
/obj/structure/reagent_dispensers/watertank/blob_act()
if(prob(50))
- new /obj/effect/effect/water(src.loc)
+ PoolOrNew(/obj/effect/effect/water, loc)
qdel(src)
/obj/structure/reagent_dispensers/fueltank
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index 13f4a491588..de964360207 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -190,7 +190,7 @@
/obj/item/device/destTagger
name = "destination tagger"
desc = "Used to set the destination of properly wrapped packages."
- icon_state = "forensic0"
+ icon_state = "cargotagger"
var/currTag = 0
//The whole system for the sorttype var is determined based on the order of this list,
//disposals must always be 1, since anything that's untagged will automatically go to disposals, or sorttype = 1 --Superxpdude
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 1afa12a3d0f..520c48354e8 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -136,17 +136,6 @@ datum/design/proc/CalcReliability(var/list/temp_techs)
build_path = /obj/item/weapon/pickaxe/drill
category = list("Mining Designs")
-/datum/design/plasmacutter
- name = "Plasma Cutter"
- desc = "You could use it to cut limbs off of xenos! Or, you know, mine stuff."
- id = "plasmacutter"
- req_tech = list("materials" = 4, "plasmatech" = 3, "engineering" = 3)
- build_type = PROTOLATHE
- materials = list("$metal" = 5000, "$glass" = 1000, "$gold" = 500, "$plasma" = 500)
- reliability = 79
- build_path = /obj/item/weapon/pickaxe/plasmacutter
- category = list("Mining Designs")
-
/datum/design/drill_diamond
name = "Diamond-Tipped Mining Drill"
desc = "Yours is the drill that will pierce the heavens!"
@@ -158,6 +147,28 @@ datum/design/proc/CalcReliability(var/list/temp_techs)
build_path = /obj/item/weapon/pickaxe/drill/diamonddrill
category = list("Mining Designs")
+/datum/design/plasmacutter
+ name = "Plasma Cutter"
+ desc = "You could use it to cut limbs off of xenos! Or, you know, mine stuff."
+ id = "plasmacutter"
+ req_tech = list("materials" = 2, "plasmatech" = 2, "engineering" = 2, "combat" = 1, "magnets" = 2)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 1500, "$glass" = 500, "$plasma" = 200)
+ reliability = 79
+ build_path = /obj/item/weapon/gun/energy/plasmacutter
+ category = list("Mining Designs")
+
+/datum/design/plasmacutter_adv
+ name = "Advanced Plasma Cutter"
+ desc = "It's an advanced plasma cutter, oh my god."
+ id = "plasmacutter_adv"
+ req_tech = list("materials" = 4, "plasmatech" = 3, "engineering" = 3, "combat" = 3, "magnets" = 3)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 3000, "$glass" = 1000, "$plasma" = 1000, "$silver" = 500, "$gold" = 100)
+ reliability = 79
+ build_path = /obj/item/weapon/gun/energy/plasmacutter/adv
+ category = list("Mining Designs")
+
/datum/design/jackhammer
name = "Sonic Jackhammer"
desc = "Essentially a handheld planet-cracker. Can drill through walls with ease as well, but has high power cost for doing so."
@@ -312,9 +323,9 @@ datum/design/proc/CalcReliability(var/list/temp_techs)
name = "Optical Meson Scanners"
desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
id = "mesons"
- req_tech = list("materials" = 3, "magnets" = 3, "engineering" = 3)
+ req_tech = list("materials" = 3, "magnets" = 2, "engineering" = 2)
build_type = PROTOLATHE
- materials = list("$metal" = 200, "$glass" = 300, "$plasma" = 100)
+ materials = list("$metal" = 200, "$glass" = 300)
build_path = /obj/item/clothing/glasses/meson
category = list("Equipement")
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index c6c852b409a..1cf5dc99795 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -386,6 +386,14 @@
build_path = /obj/item/device/assembly/prox_sensor
category = list("initial", "Misc")
+/datum/design/foam_dart
+ name = "Box of Foam Darts"
+ id = "foam_dart"
+ build_type = AUTOLATHE
+ materials = list("$metal" = 500)
+ build_path = /obj/item/ammo_box/foambox
+ category = list("initial", "Misc")
+
//hacked autolathe recipes
/datum/design/flamethrower
name = "Flamethrower"
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index 120963be22c..ee333ef117b 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -111,6 +111,16 @@
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/chem_dispenser
category = list ("Medical Machinery")
+
+/datum/design/chem_master
+ name = "Machine Design (Chem Master Board)"
+ desc = "The circuit board for a Chem Master 2999."
+ id = "chem_master"
+ req_tech = list("biotech" = 1, "materials" = 2, "programming" = 2)
+ build_type = IMPRINTER
+ materials = list("$glass" = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/chem_master
+ category = list ("Medical Machinery")
/datum/design/chem_heater
name = "Machine Design (Chemical Heater Board)"
diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm
index 479c91de938..b0d78c3fb03 100644
--- a/code/modules/research/designs/mecha_designs.dm
+++ b/code/modules/research/designs/mecha_designs.dm
@@ -363,3 +363,14 @@ datum/design/mech_generator_nuclear
materials = list("$metal"=10000,"$glass"=1000,"$silver"=500)
construction_time = 100
category = list("Exosuit Equipment")
+
+datum/design/mech_plasma_cutter
+ name = "Exosuit Module Design (217-D Heavy Plasma Cutter)"
+ desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demolishing solid obstacles."
+ id = "mech_plasma_cutter"
+ build_type = MECHFAB
+ req_tech = list("powerstorage"= 3, "engineering" = 3, "materials" = 3, "combat" = 1, "plasma" = 2)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma
+ materials = list("$metal" = 1500, "$glass" = 500, "$plasma" = 200)
+ construction_time = 100
+ category = list("Exosuit Equipment")
\ No newline at end of file
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
new file mode 100644
index 00000000000..12b76321f27
--- /dev/null
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -0,0 +1,365 @@
+
+/// Slime Extracts ///
+
+/obj/item/slime_extract
+ name = "slime extract"
+ desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"."
+ icon = 'icons/mob/slimes.dmi'
+ icon_state = "grey slime extract"
+ force = 1.0
+ w_class = 1.0
+ throwforce = 0
+ throw_speed = 3
+ throw_range = 6
+ origin_tech = "biotech=4"
+ var/Uses = 1 // uses before it goes inert
+ var/enhanced = 0 //has it been enhanced before?
+
+/obj/item/slime_extract/attackby(obj/item/O as obj, mob/user as mob)
+ if(istype(O, /obj/item/weapon/slimesteroid2))
+ if(enhanced == 1)
+ user << " This extract has already been enhanced!"
+ return ..()
+ if(Uses == 0)
+ user << " You can't enhance a used extract!"
+ return ..()
+ user <<"You apply the enhancer. It now has triple the amount of uses."
+ Uses = 3
+ enhanced = 1
+ qdel(O)
+
+/obj/item/slime_extract/New()
+ ..()
+ create_reagents(100)
+
+/obj/item/slime_extract/grey
+ name = "grey slime extract"
+ icon_state = "grey slime extract"
+
+/obj/item/slime_extract/gold
+ name = "gold slime extract"
+ icon_state = "gold slime extract"
+
+/obj/item/slime_extract/silver
+ name = "silver slime extract"
+ icon_state = "silver slime extract"
+
+/obj/item/slime_extract/metal
+ name = "metal slime extract"
+ icon_state = "metal slime extract"
+
+/obj/item/slime_extract/purple
+ name = "purple slime extract"
+ icon_state = "purple slime extract"
+
+/obj/item/slime_extract/darkpurple
+ name = "dark purple slime extract"
+ icon_state = "dark purple slime extract"
+
+/obj/item/slime_extract/orange
+ name = "orange slime extract"
+ icon_state = "orange slime extract"
+
+/obj/item/slime_extract/yellow
+ name = "yellow slime extract"
+ icon_state = "yellow slime extract"
+
+/obj/item/slime_extract/red
+ name = "red slime extract"
+ icon_state = "red slime extract"
+
+/obj/item/slime_extract/blue
+ name = "blue slime extract"
+ icon_state = "blue slime extract"
+
+/obj/item/slime_extract/darkblue
+ name = "dark blue slime extract"
+ icon_state = "dark blue slime extract"
+
+/obj/item/slime_extract/pink
+ name = "pink slime extract"
+ icon_state = "pink slime extract"
+
+/obj/item/slime_extract/green
+ name = "green slime extract"
+ icon_state = "green slime extract"
+
+/obj/item/slime_extract/lightpink
+ name = "light pink slime extract"
+ icon_state = "light pink slime extract"
+
+/obj/item/slime_extract/black
+ name = "black slime extract"
+ icon_state = "black slime extract"
+
+/obj/item/slime_extract/oil
+ name = "oil slime extract"
+ icon_state = "oil slime extract"
+
+/obj/item/slime_extract/adamantine
+ name = "adamantine slime extract"
+ icon_state = "adamantine slime extract"
+
+/obj/item/slime_extract/bluespace
+ name = "bluespace slime extract"
+ icon_state = "bluespace slime extract"
+
+/obj/item/slime_extract/pyrite
+ name = "pyrite slime extract"
+ icon_state = "pyrite slime extract"
+
+/obj/item/slime_extract/cerulean
+ name = "cerulean slime extract"
+ icon_state = "cerulean slime extract"
+
+/obj/item/slime_extract/sepia
+ name = "sepia slime extract"
+ icon_state = "sepia slime extract"
+
+/obj/item/slime_extract/rainbow
+ name = "rainbow slime extract"
+ icon_state = "rainbow slime extract"
+
+////Pet Slime Creation///
+
+/obj/item/slimepotion
+ name = "docility potion"
+ desc = "A potent chemical mix that nullifies a slime's hunger, causing it to become docile and tame."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle19"
+
+/obj/item/slimepotion/attack(mob/living/simple_animal/slime/M as mob, mob/user as mob)
+ if(!isslime(M))
+ user << "The potion only works on slimes!"
+ return ..()
+ if(M.stat)
+ user << "The slime is dead!"
+ return..()
+
+ M.docile = 1
+ M.nutrition = 700
+ M <<" You absorb the potion and feel your intense desire to feed melt away."
+ user <<" You feed the slime the potion, removing it's hunger and calming it."
+ var/newname = copytext(sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text),1,MAX_NAME_LEN)
+
+ if (!newname)
+ newname = "pet slime"
+ M.name = newname
+ M.real_name = newname
+ qdel(src)
+
+/obj/item/slimepotion2
+ name = "sentience potion"
+ desc = "A miraculous chemical mix that can raise the intelligence of creatures to human levels."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle19"
+ var/list/not_interested = list()
+ var/being_used = 0
+
+/obj/item/slimepotion2/afterattack(mob/living/M as mob, mob/user as mob)
+ if(being_used || !ismob(M))
+ return
+ if( !(isanimal(M) || ismonkey(M)) || M.ckey) //only works on monkeys and animals that aren't player controlled
+ user << "[M] is already too intelligent for this to work!"
+ return ..()
+ if(M.stat)
+ user << "[M] is dead!"
+ return..()
+
+ user << "You begin to apply the potion to [M]..."
+ being_used = 1
+
+ var/list/candidates = get_candidates(BE_ALIEN, ALIEN_AFK_BRACKET)
+
+ shuffle(candidates)
+
+ var/time_passed = world.time
+ var/list/consenting_candidates = list()
+
+ for(var/candidate in candidates)
+
+ if(candidate in not_interested)
+ continue
+
+ spawn(0)
+ switch(alert(candidate, "Would you like to play as [M.name]? Please choose quickly!","Confirmation","Yes","No"))
+ if("Yes")
+ if((world.time-time_passed)>=50 || !src)
+ return
+ consenting_candidates += candidate
+ if("No")
+ if(!src)
+ return
+ not_interested += candidate
+
+ sleep(50)
+
+ if(!src)
+ return
+
+ if(consenting_candidates.len)
+ var/client/C = null
+ C = pick(consenting_candidates)
+ M.key = C.key
+ M.languages |= HUMAN
+ M.faction -= "neutral"
+ M << "All at once it makes sense, you know what you are and who you are! Self awareness is yours!"
+ M << "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost."
+ user << "[M] is suddenly attentive and aware. It worked!"
+ qdel(src)
+ else
+ user << "[M] looks interested for a moment, but then looks back down. Maybe you should try again later..."
+ being_used = 0
+ ..()
+
+/obj/item/weapon/slimesteroid
+ name = "slime steroid"
+ desc = "A potent chemical mix that will cause a slime to generate more extract."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle16"
+
+/obj/item/weapon/slimesteroid/attack(mob/living/simple_animal/slime/M as mob, mob/user as mob)
+ if(!isslime(M))//If target is not a slime.
+ user << " The steroid only works on baby slimes!"
+ return ..()
+ if(M.is_adult) //Can't tame adults
+ user << " Only baby slimes can use the steroid!"
+ return..()
+ if(M.stat)
+ user << " The slime is dead!"
+ return..()
+ if(M.cores == 3)
+ user <<" The slime already has the maximum amount of extract!"
+ return..()
+
+ user <<"You feed the slime the steroid. It now has triple the amount of extract."
+ M.cores = 3
+ qdel(src)
+
+/obj/item/weapon/slimesteroid2
+ name = "extract enhancer"
+ desc = "A potent chemical mix that will give a slime extract three uses."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle17"
+
+ /*afterattack(obj/target, mob/user , flag)
+ if(istype(target, /obj/item/slime_extract))
+ if(target.enhanced == 1)
+ user << " This extract has already been enhanced!"
+ return ..()
+ if(target.Uses == 0)
+ user << " You can't enhance a used extract!"
+ return ..()
+ user <<"You apply the enhancer. It now has triple the amount of uses."
+ target.Uses = 3
+ target.enahnced = 1
+ qdel(src)*/
+
+
+////////Adamantine Golem stuff I dunno where else to put it
+
+// This will eventually be removed.
+
+/obj/item/clothing/under/golem
+ name = "adamantine skin"
+ desc = "a golem's skin"
+ icon_state = "golem"
+ item_state = "golem"
+ item_color = "golem"
+ flags = ABSTRACT | NODROP
+ has_sensor = 0
+
+/obj/item/clothing/suit/golem
+ name = "adamantine shell"
+ desc = "a golem's thick outter shell"
+ icon_state = "golem"
+ item_state = "golem"
+ w_class = 4//bulky item
+ gas_transfer_coefficient = 0.90
+ permeability_coefficient = 0.50
+ body_parts_covered = FULL_BODY
+ flags_inv = HIDEGLOVES | HIDESHOES | HIDEJUMPSUIT
+ flags = ABSTRACT | NODROP
+
+/obj/item/clothing/shoes/golem
+ name = "golem's feet"
+ desc = "sturdy adamantine feet"
+ icon_state = "golem"
+ item_state = null
+ flags = NOSLIP | ABSTRACT | NODROP
+
+
+/obj/item/clothing/mask/breath/golem
+ name = "golem's face"
+ desc = "the imposing face of an adamantine golem"
+ icon_state = "golem"
+ item_state = "golem"
+ siemens_coefficient = 0
+ unacidable = 1
+ flags = ABSTRACT | NODROP
+
+
+/obj/item/clothing/gloves/golem
+ name = "golem's hands"
+ desc = "strong adamantine hands"
+ icon_state = "golem"
+ item_state = null
+ siemens_coefficient = 0
+ flags = ABSTRACT | NODROP
+
+
+/obj/item/clothing/head/space/golem
+ icon_state = "golem"
+ item_state = "dermal"
+ item_color = "dermal"
+ name = "golem's head"
+ desc = "a golem's head"
+ unacidable = 1
+ flags = ABSTRACT | NODROP
+
+/obj/effect/golemrune
+ anchored = 1
+ desc = "a strange rune used to create golems. It glows when spirits are nearby."
+ name = "rune"
+ icon = 'icons/obj/rune.dmi'
+ icon_state = "golem"
+ unacidable = 1
+ layer = TURF_LAYER
+
+ New()
+ ..()
+ SSobj.processing |= src
+
+/obj/effect/golemrune/process()
+ var/mob/dead/observer/ghost
+ for(var/mob/dead/observer/O in src.loc)
+ if(!O.client) continue
+ if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
+ ghost = O
+ break
+ if(ghost)
+ icon_state = "golem2"
+ else
+ icon_state = "golem"
+
+/obj/effect/golemrune/attack_hand(mob/living/user as mob)
+ var/mob/dead/observer/ghost
+ for(var/mob/dead/observer/O in src.loc)
+ if(!O.client) continue
+ if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
+ ghost = O
+ break
+ if(!ghost)
+ user << "The rune fizzles uselessly. There is no spirit nearby."
+ return
+ var/mob/living/carbon/human/G = new /mob/living/carbon/human
+ if(prob(50)) G.gender = "female"
+ hardset_dna(G, null, null, null, null, /datum/species/golem/adamantine)
+
+ G.set_cloned_appearance()
+ G.real_name = text("Adamantine Golem ([rand(1, 1000)])")
+ G.dna.species.auto_equip(G)
+ G.loc = src.loc
+ G.key = ghost.key
+ G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost."
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm
index ea9fda485e7..42c5c7aec40 100644
--- a/code/modules/scripting/Implementations/Telecomms.dm
+++ b/code/modules/scripting/Implementations/Telecomms.dm
@@ -4,6 +4,9 @@
/* --- Traffic Control Scripting Language --- */
// Nanotrasen TCS Language - Made by Doohl
+//Span classes that players are allowed to set in a radio transmission.
+var/list/allowed_custom_spans = list(SPAN_ROBOT,SPAN_YELL,SPAN_ITALICS,SPAN_SANS)
+
/n_Interpreter/TCS_Interpreter
var/datum/TCS_Compiler/Compiler
@@ -96,6 +99,17 @@
interpreter.SetVar("$job" , signal.data["job"])
interpreter.SetVar("$sign" , signal)
interpreter.SetVar("$pass" , !(signal.data["reject"])) // if the signal isn't rejected, pass = 1; if the signal IS rejected, pass = 0
+ interpreter.SetVar("$filters" , signal.data["spans"]) //Important, this is given as a vector! (a list)
+ interpreter.SetVar("$say" , signal.data["verb_say"])
+ interpreter.SetVar("$ask" , signal.data["verb_ask"])
+ interpreter.SetVar("$yell" , signal.data["verb_yell"])
+ interpreter.SetVar("$exclaim" , signal.data["verb_exclaim"])
+
+ //Current allowed span classes
+ interpreter.SetVar("$robot", SPAN_ROBOT) //The font used by silicons!
+ interpreter.SetVar("$loud", SPAN_YELL) //Bolding, applied when ending a message with several exclamation marks.
+ interpreter.SetVar("$emphasis", SPAN_ITALICS) //Italics
+ interpreter.SetVar("$wacky", SPAN_SANS) //Comic sans font, normally seen from the genetics power.
//Language bitflags
interpreter.SetVar("HUMAN" , HUMAN)
@@ -124,9 +138,15 @@
@param content: Message to broadcast
@param frequency: Frequency to broadcast to
@param source: The name of the source you wish to imitate. Must be stored in stored_names list.
- @param job: The name of the job.
+ @param job: The name of the job.
+ @param spans What span classes you want to apply to your message. Must be in the "allowed_custom_spans" list.
+ @param say Say verb used in messages ending in ".".
+ @param ask Say verb used in messages ending in "?".
+ @param yell Say verb used in messages ending in "!!" (or more).
+ @param exclaim Say verb used in messages ending in "!".
+
*/
- interpreter.SetProc("broadcast", "tcombroadcast", signal, list("message", "freq", "source", "job"))
+ interpreter.SetProc("broadcast", "tcombroadcast", signal, list("message", "freq", "source", "job","spans","say","ask","yell","exclaim"))
/*
-> Send a code signal.
@@ -214,9 +234,16 @@
if(signal.data["name"] != setname)
signal.data["realname"] = setname
- signal.data["name"] = setname
- signal.data["job"] = interpreter.GetCleanVar("$job", signal.data["job"])
- signal.data["reject"] = !(interpreter.GetCleanVar("$pass")) // set reject to the opposite of $pass
+ signal.data["name"] = setname
+ signal.data["job"] = interpreter.GetCleanVar("$job", signal.data["job"])
+ signal.data["reject"] = !(interpreter.GetCleanVar("$pass")) // set reject to the opposite of $pass
+ signal.data["verb_say"] = interpreter.GetCleanVar("$say")
+ signal.data["verb_ask"] = interpreter.GetCleanVar("$ask")
+ signal.data["verb_yell"] = interpreter.GetCleanVar("$yell")
+ signal.data["verb_exclaim"] = interpreter.GetCleanVar("$exclaim")
+ var/list/setspans = interpreter.GetCleanVar("$filters") //Save the span vector/list to a holder list
+ setspans &= allowed_custom_spans //Prune out any illegal ones. Go ahead, comment this line out. See the horror you can unleash!
+ signal.data["spans"] = setspans //Apply it to the signal
// If the message is invalid, just don't broadcast it!
if(signal.data["message"] == "" || !signal.data["message"])
@@ -271,7 +298,7 @@ datum/signal
lastsignalers.Add("[time] : [S.id] sent a signal command, which was triggered by NTSL.: [format_frequency(freq)]/[code]")
- proc/tcombroadcast(var/message, var/freq, var/source, var/job)
+ proc/tcombroadcast(var/message, var/freq, var/source, var/job, var/spans, var/say = "says", var/ask = "asks", var/yell = "yells", var/exclaim = "exclaims")
var/datum/signal/newsign = new
var/obj/machinery/telecomms/server/S = data["server"]
@@ -294,6 +321,11 @@ datum/signal
if(!job)
job = "Unknown"
+ if(!islist(spans))
+ spans = list()
+ else
+ spans &= allowed_custom_spans //Removes any spans not on the allowed list. Comment this out if want to let players use ANY span in stylesheet.dm!
+
//SAY REWRITE RELATED CODE.
//This code is a little hacky, but it *should* work. Even though it'll result in a virtual speaker referencing another virtual speaker. vOv
var/atom/movable/virtualspeaker/virt = PoolOrNew(/atom/movable/virtualspeaker,null)
@@ -311,6 +343,11 @@ datum/signal
newsign.data["compression"] = 0
newsign.data["message"] = message
newsign.data["type"] = 2 // artificial broadcast
+ newsign.data["spans"] = spans
+ newsign.data["verb_say"] = say
+ newsign.data["verb_ask"] = ask
+ newsign.data["verb_yell"]= yell
+ newsign.data["verb_exclaim"] = exclaim
if(!isnum(freq))
freq = text2num(freq)
newsign.frequency = freq
diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm
index 0064b7d1541..2f8dff6988f 100644
--- a/code/modules/surgery/core_removal.dm
+++ b/code/modules/surgery/core_removal.dm
@@ -1,7 +1,7 @@
/datum/surgery/core_removal
name = "core removal"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/incise, /datum/surgery_step/extract_core)
- species = list(/mob/living/carbon/slime)
+ species = list(/mob/living/simple_animal/slime)
target_must_be_dead = 1
@@ -14,7 +14,7 @@
user.visible_message("[user] begins to extract a core from [target].")
/datum/surgery_step/extract_core/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- var/mob/living/carbon/slime/slime = target
+ var/mob/living/simple_animal/slime/slime = target
if(slime.cores > 0)
slime.cores--
user.visible_message("[user] successfully extracts a core from [target]!")
diff --git a/code/modules/surgery/xenomorph_removal.dm b/code/modules/surgery/xenomorph_removal.dm
index 9143713034d..98b81efcf5e 100644
--- a/code/modules/surgery/xenomorph_removal.dm
+++ b/code/modules/surgery/xenomorph_removal.dm
@@ -23,7 +23,7 @@
return 1
/datum/surgery_step/xenomorph_removal/proc/remove_xeno(mob/user, mob/living/carbon/target)
- var/obj/item/alien_embryo/A = locate() in target.contents
+ var/obj/item/body_egg/alien_embryo/A = locate() in target.contents
if(A)
user << "You found an unknown alien organism in [target]'s chest!"
if(A.stage < 4)
@@ -38,7 +38,7 @@
/datum/surgery_step/xenomorph_removal/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- var/obj/item/alien_embryo/A = locate() in target.contents
+ var/obj/item/body_egg/alien_embryo/A = locate() in target.contents
if(A)
if(prob(50))
A.AttemptGrow(0)
diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm
index 9249d0c9ccd..7c64352ca8f 100644
--- a/code/modules/telesci/bscrystal.dm
+++ b/code/modules/telesci/bscrystal.dm
@@ -18,7 +18,7 @@
/obj/item/bluespace_crystal/attack_self(var/mob/user)
user.visible_message("[user] crushes [src]!")
- new /obj/effect/effect/sparks(src.loc)
+ PoolOrNew(/obj/effect/effect/sparks, loc)
playsound(src.loc, "sparks", 50, 1)
blink_mob(user)
user.drop_item()
@@ -30,7 +30,7 @@
/obj/item/bluespace_crystal/throw_impact(atom/hit_atom)
..()
visible_message("[src] fizzles and disappears upon impact!")
- new /obj/effect/effect/sparks(src.loc)
+ PoolOrNew(/obj/effect/effect/sparks, loc)
playsound(src.loc, "sparks", 50, 1)
if(isliving(hit_atom))
blink_mob(hit_atom)
diff --git a/config/admins.txt b/config/admins.txt
index aff7eb7fb37..ceced3eb60e 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -79,4 +79,5 @@ dannno = Game Master
allura = Game Master
lo6a4evskiy = Game Master
vekter = Game Master
-Ahammer18 = Game Master
\ No newline at end of file
+Ahammer18 = Game Master
+ACCount12 = Game Master
\ No newline at end of file
diff --git a/config/game_options.txt b/config/game_options.txt
index 84b6750c697..683ec17b46b 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -234,4 +234,12 @@ STARLIGHT
MIDROUND_ANTAG_TIME_CHECK 60
## A ratio of living to total crew members, the lower this is, the more people will have to die in order for midround antag to be skipped
-MIDROUND_ANTAG_LIFE_CHECK 0.7
\ No newline at end of file
+MIDROUND_ANTAG_LIFE_CHECK 0.7
+
+###Limit Spell Choices##
+## Uncomment to disallow wizards from using certain spells that may be too chaotic/fun for your playerbase
+
+#NO_SUMMON_GUNS
+#NO_SUMMON_MAGIC
+#NO_SUMMON_EVENTS
+
diff --git a/html/changelog.html b/html/changelog.html
index bdc2c467dd7..9a06efc9c18 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,82 @@
-->
+
30 March 2015
+
AnturK updated:
+
+ - Added new wizard spell : Lightning Bolt
+
+
Dannno updated:
+
+ - Added a hammer and gavel. Court is now in session.
+
+
Iamgoofball updated:
+
+ - You can now *flip.
+ - Objects now spin when thrown. Please report any oddities.
+
+
RemieRichards updated:
+
+ - Monkeys can now wear ANY mask, not just ones they had specific icons for.
+ - Monkeys can now wear HATS, That's right, Monkey Hats!
+
+
Szunti updated:
+
+ - Mining mobs vision adapted to darkness of the asteroids.
+
+
phil235 updated:
+
+ - All slimes are now simple animals instead of carbon life forms.
+ - Remove crit status from brain and slimes.
+ - Simple animal aliens can now see in the dark like regular aliens.
+
+
pudl updated:
+
+ - The detective's forensic scanner has been resprited.
+ - So has the cargo tagger.
+ - And the RPED.
+
+
tedward1337 updated:
+
+ - Admins now have a button to use Bluespace Artillery at their will.
+
+
xxalpha updated:
+
+ - You will no longer be slowed down by anything if you use a jetpack in zero gravity.
+ - Engineering hardsuits come with an inbuilt jetpack. Requires an internals tank in suit storage and is slower than a normal jetpack.
+
+
+
25 March 2015
+
AnturK updated:
+
+ - Added an arrow graffiti, made arrow and body graffiti face the same way as the user
+ - New changeling ability : Last Resort : Explode and infect corpses if the situation looks grim
+
+
Fayrik updated:
+
+ - Deleted the toy crossbow that wasn't a gun, but flung projectiles like a gun. Why was that even a thing?
+ - Added an abstract new type of reusable ammo.
+ - Added three new foam force guns and a foam force crossbow, all of which take the new foam dart ammo.
+ - Added foam force dart boxes to the autolathe, and two crates orderable from cargo containing the new guns.
+ - Added two new donksoft guns, the syndicate's own brand of Foam Force. Available in all good uplinks!
+ - New crossbow can be won as an arcade prize.
+ - All kinds of ammo containers can now be used to rapidly collect live ammunition on the ground.
+ - Speedloaders and traditional ammo boxes can now be restocked.
+ - Security bots now react to being shot.
+
+
MrPerson updated:
+
+ - Added a preference toggle for hearing instruments play as suggested by PKPenguin321.
+
+
Pennwick updated:
+
+ - Added a buildable Chem Master, board is in Circuit Imprinter.
+
+
Wjohnston updated:
+
+ - Finally fixed the gulag shuttle missing a redemption console.
+
+
24 March 2015
Cheridan updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index f3ceda62d29..adb0d03ffb0 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -1933,3 +1933,59 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
assembly may be pried off with a crowbar. The assembly is also compatible with
analyzer upgrades for scanning through the station's structure, and EMP shielding
is possible by applying a sheet of plasma.
+2015-03-25:
+ AnturK:
+ - rscadd: Added an arrow graffiti, made arrow and body graffiti face the same way
+ as the user
+ - rscadd: 'New changeling ability : Last Resort : Explode and infect corpses if
+ the situation looks grim'
+ Fayrik:
+ - rscdel: Deleted the toy crossbow that wasn't a gun, but flung projectiles like
+ a gun. Why was that even a thing?
+ - rscadd: Added an abstract new type of reusable ammo.
+ - rscadd: Added three new foam force guns and a foam force crossbow, all of which
+ take the new foam dart ammo.
+ - rscadd: Added foam force dart boxes to the autolathe, and two crates orderable
+ from cargo containing the new guns.
+ - rscadd: Added two new donksoft guns, the syndicate's own brand of Foam Force.
+ Available in all good uplinks!
+ - tweak: New crossbow can be won as an arcade prize.
+ - tweak: All kinds of ammo containers can now be used to rapidly collect live ammunition
+ on the ground.
+ - tweak: Speedloaders and traditional ammo boxes can now be restocked.
+ - bugfix: Security bots now react to being shot.
+ MrPerson:
+ - rscadd: Added a preference toggle for hearing instruments play as suggested by
+ PKPenguin321.
+ Pennwick:
+ - rscadd: Added a buildable Chem Master, board is in Circuit Imprinter.
+ Wjohnston:
+ - bugfix: Finally fixed the gulag shuttle missing a redemption console.
+2015-03-30:
+ AnturK:
+ - rscadd: 'Added new wizard spell : Lightning Bolt'
+ Dannno:
+ - rscadd: Added a hammer and gavel. Court is now in session.
+ Iamgoofball:
+ - rscadd: You can now *flip.
+ - experiment: Objects now spin when thrown. Please report any oddities.
+ RemieRichards:
+ - rscadd: Monkeys can now wear ANY mask, not just ones they had specific icons for.
+ - rscadd: Monkeys can now wear HATS, That's right, Monkey Hats!
+ Szunti:
+ - rscadd: Mining mobs vision adapted to darkness of the asteroids.
+ phil235:
+ - tweak: All slimes are now simple animals instead of carbon life forms.
+ - rscdel: Remove crit status from brain and slimes.
+ - rscadd: Simple animal aliens can now see in the dark like regular aliens.
+ pudl:
+ - rscadd: The detective's forensic scanner has been resprited.
+ - rscadd: So has the cargo tagger.
+ - rscadd: And the RPED.
+ tedward1337:
+ - rscadd: Admins now have a button to use Bluespace Artillery at their will.
+ xxalpha:
+ - tweak: You will no longer be slowed down by anything if you use a jetpack in zero
+ gravity.
+ - rscadd: Engineering hardsuits come with an inbuilt jetpack. Requires an internals
+ tank in suit storage and is slower than a normal jetpack.
diff --git a/html/changelogs/ACCount12-mining.yml b/html/changelogs/ACCount12-mining.yml
new file mode 100644
index 00000000000..d2188ec7e52
--- /dev/null
+++ b/html/changelogs/ACCount12-mining.yml
@@ -0,0 +1,12 @@
+author: ACCount
+
+delete-after: True
+
+changes:
+ - rscadd: "The plasma cutter is now a gun that comes in the mining vending machine. Use it to mine fast but expensively."
+ - tweak: "It's also cheaper in RnD, and there's an advanced version of it there too. Yay!"
+ - tweak: "Ripleys and Firefighters have been buffed significantly. Go wild."
+ - tweak: "Precious mesons are cheaper in RnD."
+ - rscadd: "Now you can mine bluespace crystals. They are extremely rare."
+ - rscadd: "You can make remote bombs out of gibtonite. Figure out how."
+ - tweak: "Gibtonite is a bit less stable. Do not hit it with anything heavy."
\ No newline at end of file
diff --git a/html/changelogs/Fayrik-CentcomExpansionTwo.yml b/html/changelogs/Fayrik-CentcomExpansionTwo.yml
new file mode 100644
index 00000000000..2fa8bfa76a5
--- /dev/null
+++ b/html/changelogs/Fayrik-CentcomExpansionTwo.yml
@@ -0,0 +1,13 @@
+author: Fayrik
+
+delete-after: True
+
+changes:
+ - rscadd: "Added a bowman headset for death squads and ERTs."
+ - tweak: "Deathsquad radio channel is now called the Centcom radio channel."
+ - bugfix: "Fixed the admin buttons not spawning ERT Medic gear properly."
+ - tweak: "Expanded Emergency Shuttle dock to allow for more round end griff."
+ - bugfix: "All 7 ERT members now spawn geared, not just the first 4."
+ - bugfix: "Spawning an ERT or Deathsquad no longer stops a second ERT or Deathsquad from being spawned."
+ - tweak: "Pulse rifles now have 80 shots, not 40."
+ - tweak: "Deathsquads now use loyalty pinned Pulse rifles."
\ No newline at end of file
diff --git a/html/changelogs/Gun_Hog_NTSL_Expansion.yml b/html/changelogs/Gun_Hog_NTSL_Expansion.yml
new file mode 100644
index 00000000000..967b8d001fc
--- /dev/null
+++ b/html/changelogs/Gun_Hog_NTSL_Expansion.yml
@@ -0,0 +1,8 @@
+author: Gun Hog
+
+delete-after: True
+
+changes:
+
+ - rscadd: "NTSL has been updated! It can now read and modify verbs (says, yells, asks)! You can set your own using $say, $yell, $ask, and $exclaim variables in your scripts."
+ - rscadd: "NTSL can now also modify the font, italics, and bolding of radio messages in four ways! In a script, place $loud, $wacky, $emphasis, and/or $robot in a vector to $filters.
\ No newline at end of file
diff --git a/html/changelogs/Jordie0608 pp.yml b/html/changelogs/Jordie0608 pp.yml
new file mode 100644
index 00000000000..23a673a3668
--- /dev/null
+++ b/html/changelogs/Jordie0608 pp.yml
@@ -0,0 +1,6 @@
+author: Jordie0608
+
+delete-after: True
+
+changes:
+ - rscdel: "The admin's old player panel has been removed and the new one has taken it's name."
\ No newline at end of file
diff --git a/html/changelogs/NikNakFlak-PR-8604.yml b/html/changelogs/NikNakFlak-PR-8604.yml
new file mode 100644
index 00000000000..83c7f69ef3e
--- /dev/null
+++ b/html/changelogs/NikNakFlak-PR-8604.yml
@@ -0,0 +1,6 @@
+author: NikNakFlak
+
+delete-after: True
+
+changes:
+ - rscadd: "Adds the ability to shave corgis."
diff --git a/html/changelogs/Xhuis-Ambience.yml b/html/changelogs/Xhuis-Ambience.yml
new file mode 100644
index 00000000000..45f4263d6b5
--- /dev/null
+++ b/html/changelogs/Xhuis-Ambience.yml
@@ -0,0 +1,5 @@
+author: Xhuis
+delete-after: true
+
+changes:
+ - tweak: "Area ambience and ship ambience are now separate toggles. If you want one type of ambience but not the other, you only need to switch off the type you don't want."
\ No newline at end of file
diff --git a/html/changelogs/Xhuis-CigarCases.yml b/html/changelogs/Xhuis-CigarCases.yml
new file mode 100644
index 00000000000..29197d8555d
--- /dev/null
+++ b/html/changelogs/Xhuis-CigarCases.yml
@@ -0,0 +1,5 @@
+author: Xhuis
+delete-after: true
+
+changes:
+ - rscadd: "Added cigar cases. They come in three flavors and can be bought from cigarette machines."
diff --git a/icons/effects/crayondecal.dmi b/icons/effects/crayondecal.dmi
index 21331ed175a..e22bf5c64b9 100644
Binary files a/icons/effects/crayondecal.dmi and b/icons/effects/crayondecal.dmi differ
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index d2bad4aa9dc..0b9074d181b 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi
index a9e3295149e..96687396a37 100644
Binary files a/icons/mecha/mecha_equipment.dmi and b/icons/mecha/mecha_equipment.dmi differ
diff --git a/icons/mob/Easter.dmi b/icons/mob/Easter.dmi
new file mode 100644
index 00000000000..f2c97d95ebc
Binary files /dev/null and b/icons/mob/Easter.dmi differ
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 43e9e41da87..672d83db4da 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/ears.dmi b/icons/mob/ears.dmi
index fe9e2b691e7..f87713f7a1f 100644
Binary files a/icons/mob/ears.dmi and b/icons/mob/ears.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 6e4591f320d..b62a5d7b4dc 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi
index 00ef4c6b2f0..7f449152507 100644
Binary files a/icons/mob/inhands/guns_lefthand.dmi and b/icons/mob/inhands/guns_lefthand.dmi differ
diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi
index 6b85b55130c..569aa7a2ded 100644
Binary files a/icons/mob/inhands/guns_righthand.dmi and b/icons/mob/inhands/guns_righthand.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index ed3c4def4d4..56503f0210d 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 4263a4a40a6..86ee365b5c8 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/monkey.dmi b/icons/mob/monkey.dmi
index d1872d6aaff..fd2ca052740 100644
Binary files a/icons/mob/monkey.dmi and b/icons/mob/monkey.dmi differ
diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi
index 8179f08d362..466ca058d4a 100644
Binary files a/icons/mob/pets.dmi and b/icons/mob/pets.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index ecb9091597f..af783f10da5 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 00fdce1a431..6b1fab51883 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/cigarettes.dmi b/icons/obj/cigarettes.dmi
index 5bf0a0fc687..8a22d33423e 100644
Binary files a/icons/obj/cigarettes.dmi and b/icons/obj/cigarettes.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index e369d7668e3..9e67d990c48 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 76792769010..ccda4d6b1cd 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 2ea63e08ba0..e501b24f404 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi
index 0af45366d2b..89112e632d9 100644
Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index c71080e4e91..69b070367be 100644
Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ
diff --git a/icons/obj/guns/toy.dmi b/icons/obj/guns/toy.dmi
new file mode 100644
index 00000000000..e3700ae841a
Binary files /dev/null and b/icons/obj/guns/toy.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index ab9b69c469f..f0a2daed423 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index 4b2073c171b..e734afbf63d 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index d723b6d6286..52619ce1640 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ
diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi
index a7d44844008..44ad56c7cac 100644
Binary files a/icons/obj/radio.dmi and b/icons/obj/radio.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index ee4ae2f82cf..98aa12253ce 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/turf/mining.dmi b/icons/turf/mining.dmi
new file mode 100644
index 00000000000..f409dc179e5
Binary files /dev/null and b/icons/turf/mining.dmi differ
diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi
index d3fecdcf5d6..d129a462dff 100644
Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ
diff --git a/interface/interface.dm b/interface/interface.dm
index d8b7cc4613c..ffaeadc5776 100644
--- a/interface/interface.dm
+++ b/interface/interface.dm
@@ -66,7 +66,7 @@
var/adminhotkeys = {"
Admin:
\tF5 = Aghost (admin-ghost)
-\tF6 = player-panel-new
+\tF6 = player-panel
\tF7 = admin-pm
\tF8 = Invisimin
"}
diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm
index 98df3b72e06..824d72b31a1 100644
--- a/interface/stylesheet.dm
+++ b/interface/stylesheet.dm
@@ -35,7 +35,7 @@ em {font-style: normal; font-weight: bold;}
.suppradio {color: #a8732b;}
.servradio {color: #6eaa2c;}
.syndradio {color: #6d3f40;}
-.dsquadradio {color: #686868;}
+.centcomradio {color: #686868;}
.aiprivradio {color: #ff00ff;}
.yell { font-weight: bold;}
diff --git a/sound/items/gavel.ogg b/sound/items/gavel.ogg
new file mode 100644
index 00000000000..751eb0ea219
Binary files /dev/null and b/sound/items/gavel.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 8d9ffe9653d..a9aced7f420 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -134,6 +134,7 @@
#include "code\controllers\subsystem\machines.dm"
#include "code\controllers\subsystem\mobs.dm"
#include "code\controllers\subsystem\nanoUI.dm"
+#include "code\controllers\subsystem\npcpool.dm"
#include "code\controllers\subsystem\objects.dm"
#include "code\controllers\subsystem\pai.dm"
#include "code\controllers\subsystem\pipenets.dm"
@@ -152,8 +153,6 @@
#include "code\datums\datacore.dm"
#include "code\datums\datumvars.dm"
#include "code\datums\gas_mixture.dm"
-#include "code\datums\goon_mutations_disabilities.dm"
-#include "code\datums\goon_mutations_powers.dm"
#include "code\datums\hud.dm"
#include "code\datums\mind.dm"
#include "code\datums\mixed.dm"
@@ -229,6 +228,7 @@
#include "code\datums\spells\genetic.dm"
#include "code\datums\spells\inflict_handler.dm"
#include "code\datums\spells\knock.dm"
+#include "code\datums\spells\lightning.dm"
#include "code\datums\spells\mime.dm"
#include "code\datums\spells\mind_transfer.dm"
#include "code\datums\spells\projectile.dm"
@@ -304,6 +304,7 @@
#include "code\game\gamemodes\changeling\powers\fakedeath.dm"
#include "code\game\gamemodes\changeling\powers\fleshmend.dm"
#include "code\game\gamemodes\changeling\powers\glands.dm"
+#include "code\game\gamemodes\changeling\powers\headcrab.dm"
#include "code\game\gamemodes\changeling\powers\hivemind.dm"
#include "code\game\gamemodes\changeling\powers\humanform.dm"
#include "code\game\gamemodes\changeling\powers\lesserform.dm"
@@ -539,6 +540,7 @@
#include "code\game\objects\effects\spawners\vaultspawner.dm"
#include "code\game\objects\items\apc_frame.dm"
#include "code\game\objects\items\blueprints.dm"
+#include "code\game\objects\items\body_egg.dm"
#include "code\game\objects\items\bodybag.dm"
#include "code\game\objects\items\candle.dm"
#include "code\game\objects\items\crayons.dm"
@@ -601,6 +603,7 @@
#include "code\game\objects\items\weapons\cigs_lighters.dm"
#include "code\game\objects\items\weapons\clown_items.dm"
#include "code\game\objects\items\weapons\cosmetics.dm"
+#include "code\game\objects\items\weapons\courtroom.dm"
#include "code\game\objects\items\weapons\defib.dm"
#include "code\game\objects\items\weapons\dice.dm"
#include "code\game\objects\items\weapons\dna_injector.dm"
@@ -787,6 +790,7 @@
#include "code\modules\admin\verbs\adminpm.dm"
#include "code\modules\admin\verbs\adminsay.dm"
#include "code\modules\admin\verbs\atmosdebug.dm"
+#include "code\modules\admin\verbs\bluespacearty.dm"
#include "code\modules\admin\verbs\BrokenInhands.dm"
#include "code\modules\admin\verbs\buildmode.dm"
#include "code\modules\admin\verbs\cinematic.dm"
@@ -993,6 +997,8 @@
#include "code\modules\food&drinks\recipes\tablecraft\recipes_sandwich.dm"
#include "code\modules\food&drinks\recipes\tablecraft\recipes_soup.dm"
#include "code\modules\food&drinks\recipes\tablecraft\recipes_spaghetti.dm"
+#include "code\modules\holiday\easter.dm"
+#include "code\modules\holiday\holidays.dm"
#include "code\modules\hydroponics\biogenerator.dm"
#include "code\modules\hydroponics\grown.dm"
#include "code\modules\hydroponics\growninedible.dm"
@@ -1042,6 +1048,7 @@
#include "code\modules\mob\living\damage_procs.dm"
#include "code\modules\mob\living\death.dm"
#include "code\modules\mob\living\emote.dm"
+#include "code\modules\mob\living\life.dm"
#include "code\modules\mob\living\living.dm"
#include "code\modules\mob\living\living_defense.dm"
#include "code\modules\mob\living\living_defines.dm"
@@ -1122,16 +1129,6 @@
#include "code\modules\mob\living\carbon\monkey\login.dm"
#include "code\modules\mob\living\carbon\monkey\monkey.dm"
#include "code\modules\mob\living\carbon\monkey\update_icons.dm"
-#include "code\modules\mob\living\carbon\slime\death.dm"
-#include "code\modules\mob\living\carbon\slime\emote.dm"
-#include "code\modules\mob\living\carbon\slime\examine.dm"
-#include "code\modules\mob\living\carbon\slime\life.dm"
-#include "code\modules\mob\living\carbon\slime\login.dm"
-#include "code\modules\mob\living\carbon\slime\powers.dm"
-#include "code\modules\mob\living\carbon\slime\say.dm"
-#include "code\modules\mob\living\carbon\slime\slime.dm"
-#include "code\modules\mob\living\carbon\slime\subtypes.dm"
-#include "code\modules\mob\living\carbon\slime\update_icons.dm"
#include "code\modules\mob\living\silicon\death.dm"
#include "code\modules\mob\living\silicon\laws.dm"
#include "code\modules\mob\living\silicon\login.dm"
@@ -1183,7 +1180,6 @@
#include "code\modules\mob\living\simple_animal\friendly\lizard.dm"
#include "code\modules\mob\living\simple_animal\friendly\mouse.dm"
#include "code\modules\mob\living\simple_animal\friendly\pug.dm"
-#include "code\modules\mob\living\simple_animal\friendly\slime.dm"
#include "code\modules\mob\living\simple_animal\friendly\drone\_drone.dm"
#include "code\modules\mob\living\simple_animal\friendly\drone\drones_as_items.dm"
#include "code\modules\mob\living\simple_animal\friendly\drone\extra_drone_types.dm"
@@ -1200,6 +1196,7 @@
#include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm"
#include "code\modules\mob\living\simple_animal\hostile\faithless.dm"
#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm"
+#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm"
#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm"
#include "code\modules\mob\living\simple_animal\hostile\hostile.dm"
#include "code\modules\mob\living\simple_animal\hostile\killertomato.dm"
@@ -1214,6 +1211,14 @@
#include "code\modules\mob\living\simple_animal\hostile\retaliate\bat.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm"
+#include "code\modules\mob\living\simple_animal\slime\death.dm"
+#include "code\modules\mob\living\simple_animal\slime\emote.dm"
+#include "code\modules\mob\living\simple_animal\slime\life.dm"
+#include "code\modules\mob\living\simple_animal\slime\powers.dm"
+#include "code\modules\mob\living\simple_animal\slime\say.dm"
+#include "code\modules\mob\living\simple_animal\slime\slime.dm"
+#include "code\modules\mob\living\simple_animal\slime\subtypes.dm"
+#include "code\modules\mob\living\simple_animal\slime\update_icons.dm"
#include "code\modules\mob\new_player\login.dm"
#include "code\modules\mob\new_player\logout.dm"
#include "code\modules\mob\new_player\new_player.dm"
@@ -1325,10 +1330,12 @@
#include "code\modules\projectiles\guns\projectile\pistol.dm"
#include "code\modules\projectiles\guns\projectile\revolver.dm"
#include "code\modules\projectiles\guns\projectile\shotgun.dm"
+#include "code\modules\projectiles\guns\projectile\toy.dm"
#include "code\modules\projectiles\projectile\beams.dm"
#include "code\modules\projectiles\projectile\bullets.dm"
#include "code\modules\projectiles\projectile\energy.dm"
#include "code\modules\projectiles\projectile\magic.dm"
+#include "code\modules\projectiles\projectile\reusable.dm"
#include "code\modules\projectiles\projectile\special.dm"
#include "code\modules\reagents\Chemistry-Colours.dm"
#include "code\modules\reagents\Chemistry-Goon-420BlazeIt.dm"
@@ -1388,6 +1395,7 @@
#include "code\modules\research\designs\stock_parts_designs.dm"
#include "code\modules\research\designs\telecomms_designs.dm"
#include "code\modules\research\designs\weapon_designs.dm"
+#include "code\modules\research\xenobiology\xenobiology.dm"
#include "code\modules\scripting\Errors.dm"
#include "code\modules\scripting\IDE.dm"
#include "code\modules\scripting\Options.dm"