diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index 8cf94d61835..f9ede329474 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -30,34 +30,20 @@ CREATE TABLE `characters` ( `age` smallint(4) NOT NULL, `species` varchar(45) NOT NULL, `language` varchar(45) NOT NULL, - `hair_red` smallint(4) NOT NULL, - `hair_green` smallint(4) NOT NULL, - `hair_blue` smallint(4) NOT NULL, - `secondary_hair_red` smallint(4) NOT NULL, - `secondary_hair_green` smallint(4) NOT NULL, - `secondary_hair_blue` smallint(4) NOT NULL, - `facial_red` smallint(4) NOT NULL, - `facial_green` smallint(4) NOT NULL, - `facial_blue` smallint(4) NOT NULL, - `secondary_facial_red` smallint(4) NOT NULL, - `secondary_facial_green` smallint(4) NOT NULL, - `secondary_facial_blue` smallint(4) NOT NULL, + `hair_colour` varchar(7) NOT NULL DEFAULT '#000000', + `secondary_hair_colour` varchar(7) NOT NULL DEFAULT '#000000', + `facial_hair_colour` varchar(7) NOT NULL DEFAULT '#000000', + `secondary_facial_hair_colour` varchar(7) NOT NULL DEFAULT '#000000', `skin_tone` smallint(4) NOT NULL, - `skin_red` smallint(4) NOT NULL, - `skin_green` smallint(4) NOT NULL, - `skin_blue` smallint(4) NOT NULL, + `skin_colour` varchar(7) NOT NULL DEFAULT '#000000', `marking_colours` varchar(255) NOT NULL DEFAULT 'head=%23000000&body=%23000000&tail=%23000000', - `head_accessory_red` smallint(4) NOT NULL, - `head_accessory_green` smallint(4) NOT NULL, - `head_accessory_blue` smallint(4) NOT NULL, + `head_accessory_colour` varchar(7) NOT NULL DEFAULT '#000000', `hair_style_name` varchar(45) NOT NULL, `facial_style_name` varchar(45) NOT NULL, `marking_styles` varchar(255) NOT NULL DEFAULT 'head=None&body=None&tail=None', `head_accessory_style_name` varchar(45) NOT NULL, `alt_head_name` varchar(45) NOT NULL, - `eyes_red` smallint(4) NOT NULL, - `eyes_green` smallint(4) NOT NULL, - `eyes_blue` smallint(4) NOT NULL, + `eye_colour` varchar(7) NOT NULL DEFAULT '#000000', `underwear` mediumtext NOT NULL, `undershirt` mediumtext NOT NULL, `backbag` mediumtext NOT NULL, diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql index d1b62ae3767..8de204cfe3e 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -30,34 +30,20 @@ CREATE TABLE `SS13_characters` ( `age` smallint(4) NOT NULL, `species` varchar(45) NOT NULL, `language` varchar(45) NOT NULL, - `hair_red` smallint(4) NOT NULL, - `hair_green` smallint(4) NOT NULL, - `hair_blue` smallint(4) NOT NULL, - `secondary_hair_red` smallint(4) NOT NULL, - `secondary_hair_green` smallint(4) NOT NULL, - `secondary_hair_blue` smallint(4) NOT NULL, - `facial_red` smallint(4) NOT NULL, - `facial_green` smallint(4) NOT NULL, - `facial_blue` smallint(4) NOT NULL, - `secondary_facial_red` smallint(4) NOT NULL, - `secondary_facial_green` smallint(4) NOT NULL, - `secondary_facial_blue` smallint(4) NOT NULL, + `hair_colour` varchar(7) NOT NULL DEFAULT '#000000', + `secondary_hair_colour` varchar(7) NOT NULL DEFAULT '#000000', + `facial_hair_colour` varchar(7) NOT NULL DEFAULT '#000000', + `secondary_facial_hair_colour` varchar(7) NOT NULL DEFAULT '#000000', `skin_tone` smallint(4) NOT NULL, - `skin_red` smallint(4) NOT NULL, - `skin_green` smallint(4) NOT NULL, - `skin_blue` smallint(4) NOT NULL, + `skin_colour` varchar(7) NOT NULL DEFAULT '#000000', `marking_colours` varchar(255) NOT NULL DEFAULT 'head=%23000000&body=%23000000&tail=%23000000', - `head_accessory_red` smallint(4) NOT NULL, - `head_accessory_green` smallint(4) NOT NULL, - `head_accessory_blue` smallint(4) NOT NULL, + `head_accessory_colour` varchar(7) NOT NULL DEFAULT '#000000', `hair_style_name` varchar(45) NOT NULL, `facial_style_name` varchar(45) NOT NULL, `marking_styles` varchar(255) NOT NULL DEFAULT 'head=None&body=None&tail=None', `head_accessory_style_name` varchar(45) NOT NULL, `alt_head_name` varchar(45) NOT NULL, - `eyes_red` smallint(4) NOT NULL, - `eyes_green` smallint(4) NOT NULL, - `eyes_blue` smallint(4) NOT NULL, + `eye_colour` varchar(7) NOT NULL DEFAULT '#000000', `underwear` mediumtext NOT NULL, `undershirt` mediumtext NOT NULL, `backbag` mediumtext NOT NULL, diff --git a/SQL/updates/0-1.sql b/SQL/updates/0-1.sql new file mode 100644 index 00000000000..977c979e113 --- /dev/null +++ b/SQL/updates/0-1.sql @@ -0,0 +1,30 @@ +#Updating the SQL from version 0 to version 1. -KasparoVv +#Adding new columns to contain the hex values (will be converted from RGB). +ALTER TABLE `characters` + ADD `hair_colour` varchar(7) NOT NULL DEFAULT '#000000' AFTER `language`, + ADD `secondary_hair_colour` varchar(7) NOT NULL DEFAULT '#000000' AFTER `hair_blue`, + ADD `facial_hair_colour` varchar(7) NOT NULL DEFAULT '#000000' AFTER `secondary_hair_blue`, + ADD `secondary_facial_hair_colour` varchar(7) NOT NULL DEFAULT '#000000' AFTER `facial_blue`, + ADD `skin_colour` varchar(7) NOT NULL DEFAULT '#000000' AFTER `skin_tone`, + ADD `head_accessory_colour` varchar(7) NOT NULL DEFAULT '#000000' AFTER `marking_colours`, + ADD `eye_colour` varchar(7) NOT NULL DEFAULT '#000000' AFTER `alt_head_name`; + +#Converting RGB colours to HEX colours and transferring them to the new columns. +UPDATE `characters` + SET `hair_colour` = CONCAT("#", LPAD(HEX(`hair_red`), 2,'0'), LPAD(HEX(`hair_green`), 2,'0'), LPAD(HEX(`hair_blue`), 2,'0')), + `secondary_hair_colour` = CONCAT("#", LPAD(HEX(`secondary_hair_red`), 2,'0'), LPAD(HEX(`secondary_hair_green`), 2,'0'), LPAD(HEX(`secondary_hair_blue`), 2,'0')), + `facial_hair_colour` = CONCAT("#", LPAD(HEX(`facial_red`), 2,'0'), LPAD(HEX(`facial_green`), 2,'0'), LPAD(HEX(`facial_blue`), 2,'0')), + `secondary_facial_hair_colour` = CONCAT("#", LPAD(HEX(`secondary_facial_red`), 2,'0'), LPAD(HEX(`secondary_facial_green`), 2,'0'), LPAD(HEX(`secondary_facial_blue`), 2,'0')), + `skin_colour` = CONCAT("#", LPAD(HEX(`skin_red`), 2,'0'), LPAD(HEX(`skin_green`), 2,'0'), LPAD(HEX(`skin_blue`), 2,'0')), + `head_accessory_colour` = CONCAT("#", LPAD(HEX(`head_accessory_red`), 2,'0'), LPAD(HEX(`head_accessory_green`), 2,'0'), LPAD(HEX(`head_accessory_blue`), 2,'0')), + `eye_colour` = CONCAT("#", LPAD(HEX(`eyes_red`), 2,'0'), LPAD(HEX(`eyes_green`), 2,'0'), LPAD(HEX(`eyes_blue`), 2,'0')); + +#Dropping the old columns now that the hex colour columns are in place. +ALTER TABLE `characters` + DROP `hair_red`, DROP `hair_green`, DROP `hair_blue`, + DROP `secondary_hair_red`, DROP `secondary_hair_green`, DROP `secondary_hair_blue`, + DROP `facial_red`, DROP `facial_green`, DROP `facial_blue`, + DROP `secondary_facial_red`, DROP `secondary_facial_green`, DROP `secondary_facial_blue`, + DROP `skin_red`, DROP `skin_green`, DROP `skin_blue`, + DROP `head_accessory_red`, DROP `head_accessory_green`, DROP `head_accessory_blue`, + DROP `eyes_red`, DROP `eyes_green`, DROP `eyes_blue`; diff --git a/_maps/map_files/RandomZLevels/beach.dmm b/_maps/map_files/RandomZLevels/beach.dmm index 55c36a22cf4..d3fa400f59b 100644 --- a/_maps/map_files/RandomZLevels/beach.dmm +++ b/_maps/map_files/RandomZLevels/beach.dmm @@ -38,7 +38,7 @@ "aL" = (/obj/structure/stool/bed/chair/sofa/left,/turf/unsimulated/beach/water/deep/wood_floor,/area/awaymission/undersea) "aM" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/unsimulated/beach/water/deep/wood_floor,/area/awaymission/undersea) "aN" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/unsimulated/beach/water/deep/wood_floor,/area/awaymission/undersea) -"aO" = (/obj/structure/closet/crate/bin{name = "Garbage bin"},/obj/item/weapon/storage/bag/trash,/turf/unsimulated/beach/water/deep/sand_floor,/area/awaymission/undersea) +"aO" = (/obj/structure/closet/crate/can,/obj/item/weapon/storage/bag/trash,/turf/unsimulated/beach/water/deep/sand_floor,/area/awaymission/undersea) "aP" = (/obj/item/flag/species/skrell,/turf/unsimulated/beach/water/deep/sand_floor,/area/awaymission/undersea) "aQ" = (/obj/structure/mirror{icon_state = "mirror_broke"; pixel_y = 28},/obj/item/weapon/storage/wallet/random,/turf/unsimulated/beach/water/deep/wood_floor,/area/awaymission/undersea) "aR" = (/obj/structure/mirror{icon_state = "mirror_broke"; pixel_y = 28},/turf/unsimulated/beach/water/deep/wood_floor,/area/awaymission/undersea) @@ -235,7 +235,7 @@ "eA" = (/obj/structure/shuttle/engine/propulsion,/turf/simulated/floor/plating/airless,/area/awaymission/beach) "eB" = (/turf/unsimulated/beach/sand,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"},/area/awaymission/beach) "eC" = (/obj/structure/table/woodentable,/obj/effect/decal/cleanable/blood,/turf/unsimulated/beach/sand,/area/awaymission/beach) -"eD" = (/obj/structure/closet/crate/bin,/turf/unsimulated/beach/sand,/area/awaymission/beach) +"eD" = (/obj/structure/closet/crate/can,/turf/unsimulated/beach/sand,/area/awaymission/beach) "eE" = (/obj/structure/closet/crate,/turf/unsimulated/beach/sand,/area/awaymission/beach) (1,1,1) = {" diff --git a/_maps/map_files/RandomZLevels/moonoutpost19.dmm b/_maps/map_files/RandomZLevels/moonoutpost19.dmm index 4c42fb7ffad..72f92839497 100644 --- a/_maps/map_files/RandomZLevels/moonoutpost19.dmm +++ b/_maps/map_files/RandomZLevels/moonoutpost19.dmm @@ -83,7 +83,7 @@ "bE" = (/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bF" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bG" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) -"bH" = (/obj/structure/closet/crate/bin,/obj/item/trash/syndi_cakes,/obj/item/trash/sosjerky,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) +"bH" = (/obj/structure/closet/crate/can,/obj/item/trash/syndi_cakes,/obj/item/trash/sosjerky,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bI" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bJ" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bK" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) @@ -376,7 +376,7 @@ "hl" = (/obj/structure/table,/obj/item/weapon/paper{info = "Ivan Volodin Stories:

Entry Won — 28/05/2554:
Hello. I am Crazy Ivan. Boss say I must write. I do good job fixing outpost. Is very good job. Much better than mines. Many nice people. I cause no trouble.

Entry Too — 05/06/2554:
I am finding problem with Booze-O-Mat. Is not problem. I solve very easy. Use yellow tool to make purple light go off. I am good engineer! Bartender will be very happy.

Entry Tree — 08/06/2554:
Bartender is not happy. Security man is not happy. Cannot feel legs, is very cold in freezer. Is not good. Table is jammed into door, have no tools. Is very not good. But, on bright side, found meat! Shall chew to keep spirits up.

Entry Fore — 12/06/2554:
Big nasty purple bug looked at me today. Make nervous. Blue wall wire can be broken, then bad thing happens. Very very bad thing. Man in orange spacesuit wave at me today too. He seem nice. Wonder who was?

Entry Fiv — 15/06/2554:
I eat cornflakes today. Is good day. Sun shine for a while. Was nice. I also take ride on disposals chute. Was fun, but tiny. Get clog out of pipes, was vodka bottle. Is empty. This make many sads.

Entry Sex: 19/06/2554:
Purple bugs jumpy today. When waved, get hiss. Maybe very bad. Maybe just ill. Do not know. Is science problem, is not engineer problem. I eat sandwich. Is glorious job. Wish to never end."; name = "Personal Log — Ivan Volodin"},/obj/item/weapon/pickaxe,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a7) "hm" = (/obj/machinery/computer/monitor,/obj/structure/cable,/turf/simulated/floor/plating,/area/awaycontent/a7) "hn" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/awaycontent/a7) -"ho" = (/obj/structure/closet/crate/bin,/obj/item/clothing/gloves/color/latex,/obj/item/trash/chips,/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{active_power_usage = 0; dir = 1; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) +"ho" = (/obj/structure/closet/crate/can,/obj/item/clothing/gloves/color/latex,/obj/item/trash/chips,/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{active_power_usage = 0; dir = 1; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "hp" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "hq" = (/obj/structure/cable,/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 4; locked = 0; name = "Research APC"; pixel_x = 25; req_access = null; start_charge = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "hr" = (/obj/structure/table,/obj/item/weapon/retractor,/obj/item/weapon/hemostat,/obj/structure/alien/weeds,/obj/item/stack/cable_coil,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) @@ -475,7 +475,7 @@ "jg" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "jh" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "ji" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) -"jj" = (/obj/structure/closet/crate/bin,/obj/machinery/light/small{dir = 8},/obj/item/trash/cheesie,/obj/item/trash/can,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) +"jj" = (/obj/structure/closet/crate/can,/obj/machinery/light/small{dir = 8},/obj/item/trash/cheesie,/obj/item/trash/can,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "jk" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "jl" = (/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "jm" = (/obj/structure/stool,/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) @@ -485,7 +485,7 @@ "jq" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "awaykitchen"; name = "Serving Hatch"},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "jr" = (/obj/structure/closet/secure_closet{icon_broken = "rdsecurebroken"; icon_closed = "rdsecure"; icon_locked = "rdsecure1"; icon_off = "rdsecureoff"; icon_opened = "rdsecureopen"; icon_state = "rdsecure1"; locked = 1; name = "research director's locker"; req_access_txt = "271"},/obj/item/weapon/storage/backpack/satchel_tox,/obj/item/clothing/gloves/color/latex,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "js" = (/obj/item/weapon/twohanded/required/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) -"jt" = (/obj/structure/closet/crate/bin,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) +"jt" = (/obj/structure/closet/crate/can,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "ju" = (/obj/machinery/vending/snack,/obj/structure/sign/poster/official/ue_no{pixel_y = 32},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "jv" = (/obj/structure/stool/bed/chair,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "jw" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) @@ -530,7 +530,7 @@ "kj" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door_control{id = "Awaybiohazard"; name = "Biohazard Shutter Control"; pixel_x = 0; pixel_y = 8; req_access_txt = "271"},/obj/machinery/door_control{id = "AwayRD"; name = "Privacy Shutter Control"; pixel_x = 0; pixel_y = -2; req_access_txt = "271"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "kk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a7) "kl" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table,/obj/machinery/computer/id_upgrader,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) -"km" = (/obj/structure/closet/crate/bin,/obj/item/trash/candy,/obj/item/trash/can,/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) +"km" = (/obj/structure/closet/crate/can,/obj/item/trash/candy,/obj/item/trash/can,/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "kn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/effect/decal/cleanable/blood/oil{color = "black"},/turf/simulated/floor/plating,/area/awaycontent/a7) "ko" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "kp" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) @@ -557,7 +557,7 @@ "kK" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "kL" = (/obj/effect/decal/cleanable/blood/xeno{color = "green"},/obj/effect/decal/cleanable/blood/gibs/xeno,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "kM" = (/obj/effect/decal/cleanable/blood/xeno{color = "green"},/obj/effect/decal/remains/xeno{desc = "They look like the remains of something... alien. The front of skull appears to have been completely obliterated."},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) -"kN" = (/obj/structure/closet/crate/bin,/obj/item/trash/plate,/obj/item/weapon/reagent_containers/food/snacks/badrecipe,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) +"kN" = (/obj/structure/closet/crate/can,/obj/item/trash/plate,/obj/item/weapon/reagent_containers/food/snacks/badrecipe,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "kO" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "kP" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "kQ" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) diff --git a/_maps/map_files/RandomZLevels/spacehotel.dmm b/_maps/map_files/RandomZLevels/spacehotel.dmm index b5bd1bdb320..4a666dd481c 100644 --- a/_maps/map_files/RandomZLevels/spacehotel.dmm +++ b/_maps/map_files/RandomZLevels/spacehotel.dmm @@ -237,7 +237,7 @@ "eC" = (/obj/machinery/light{dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) "eD" = (/obj/machinery/light,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) "eE" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/space) -"eF" = (/obj/structure/closet/crate/bin,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"eF" = (/obj/structure/closet/crate/can,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) "eG" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) "eH" = (/obj/machinery/light{dir = 8},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) "eI" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) @@ -290,7 +290,7 @@ "fD" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/beach/water/deep,/area/awaymission/spacehotel) "fE" = (/obj/machinery/light,/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) "fF" = (/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) -"fG" = (/obj/structure/closet/crate/bin,/obj/item/weapon/paper/crumpled/hotel_scrap_1,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"fG" = (/obj/structure/closet/crate/can,/obj/item/weapon/paper/crumpled/hotel_scrap_1,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) "fH" = (/obj/effect/landmark{name = "awaystart"},/turf/unsimulated/beach/water,/area/awaymission/spacehotel) "fI" = (/obj/machinery/door/unpowered/hotel_door{id = 104},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) "fJ" = (/obj/machinery/door/unpowered/hotel_door{id = 105},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) @@ -326,7 +326,7 @@ "gn" = (/obj/structure/stool/bed/chair/sofa/left{icon_state = "sofaend_left"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) "go" = (/obj/machinery/light{dir = 8},/turf/template_noop,/area/awaymission/spacehotel) "gp" = (/obj/structure/stool,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) -"gq" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/closet/crate/bin,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gq" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/closet/crate/can,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) "gr" = (/obj/effect/landmark/map_loader/random{template_list = "light_floor_1.dmm;light_floor_2.dmm;light_floor_3.dmm"},/turf/template_noop,/area/awaymission/spacehotel) "gs" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/template_noop,/area/awaymission/spacehotel) "gt" = (/obj/machinery/door/unpowered/hotel_door{id = 101},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) @@ -345,7 +345,7 @@ "gG" = (/obj/machinery/camera{c_tag = "Room 202"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) "gH" = (/obj/machinery/camera{c_tag = "Room 203"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) "gI" = (/obj/structure/stool,/turf/template_noop,/area/awaymission/spacehotel) -"gJ" = (/obj/structure/closet/crate/bin,/obj/item/weapon/paper/crumpled/hotel_scrap_6,/turf/template_noop,/area/awaymission/spacehotel) +"gJ" = (/obj/structure/closet/crate/can,/obj/item/weapon/paper/crumpled/hotel_scrap_6,/turf/template_noop,/area/awaymission/spacehotel) "gK" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/awaymission/spacehotel) "gL" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) "gM" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/dough,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) @@ -370,7 +370,7 @@ "hf" = (/obj/machinery/chem_master/condimaster,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) "hg" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) "hh" = (/obj/structure/table,/obj/machinery/microwave,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) -"hi" = (/obj/structure/closet/crate/bin,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"hi" = (/obj/structure/closet/crate/can,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) "hj" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) "hk" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) "hl" = (/obj/structure/kitchenspike,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) @@ -380,7 +380,7 @@ "hp" = (/obj/structure/table,/obj/machinery/chem_dispenser/soda,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) "hq" = (/obj/structure/table,/obj/machinery/chem_dispenser/beer,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) "hr" = (/obj/machinery/light,/obj/structure/table,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) -"hs" = (/obj/structure/closet/crate/bin,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) +"hs" = (/obj/structure/closet/crate/can,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) "ht" = (/obj/machinery/door/airlock{name = "Kitchen"; req_access_txt = "150"},/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor,/area/awaymission/spacehotel) "hu" = (/obj/machinery/door/airlock{name = "Kitchen"; req_access_txt = "150"},/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) "hv" = (/turf/unsimulated/floor,/area/awaymission/spacehotel) @@ -509,7 +509,7 @@ "jO" = (/obj/structure/window/basic{icon_state = "window"; dir = 8},/obj/structure/flora/bush,/turf/unsimulated/floor/grass,/area/awaymission/spacehotel) "jP" = (/obj/item/weapon/restraints/legcuffs,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) "jQ" = (/obj/structure/closet/crate/secure/unknownchemicals,/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel) -"jR" = (/obj/structure/closet/crate/bin,/obj/item/weapon/paper/crumpled/hotel_scrap_7,/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel) +"jR" = (/obj/structure/closet/crate/can,/obj/item/weapon/paper/crumpled/hotel_scrap_7,/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel) "jS" = (/obj/structure/table/reinforced,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception) "jT" = (/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception) "jU" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; dir = 1; name = "Hotel Security Monitor"; network = list("Hotel"); use_power = 0},/obj/machinery/light,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 5148cf4f3c1..8b7290b31c3 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -2287,7 +2287,7 @@ "aRY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plating,/area/maintenance/electrical) "aRZ" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plating,/area/maintenance/electrical) "aSa" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "sol_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "sol_sensor"; pixel_x = 12; pixel_y = -25},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "sol_airlock"; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; tag_airpump = "sol_pump"; tag_chamber_sensor = "sol_sensor"; tag_exterior_door = "sol_outer"; tag_interior_door = "sol_inner"},/turf/simulated/floor/plating,/area/space) -"aSb" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "sol_outer"; locked = 1; name = "Arrivals External Access"; req_access = null; req_access_txt = "0"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "sol_airlock"; name = "exterior access button"; pixel_x = -13; pixel_y = -23; req_access_txt = "13"},/turf/simulated/floor/plating,/area/space) +"aSb" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "sol_outer"; locked = 1; name = "Arrivals External Access"; req_access = null; req_access_txt = "0"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.3; master_tag = "sol_airlock"; name = "exterior access button"; pixel_x = -13; pixel_y = -23; req_access_txt = "0"},/turf/simulated/floor/plating,/area/space) "aSc" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry) "aSd" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry) "aSe" = (/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry) @@ -2691,7 +2691,7 @@ "aZM" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "aZN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aZO" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/twohanded/required/kirbyplants,/obj/structure/sign/bobross{pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/captain) -"aZP" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "sol_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/space) +"aZP" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; layer = 3.3; master_tag = "sol_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/space) "aZQ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "sol_inner"; locked = 1; name = "Arrivals External Access"; req_access = null; req_access_txt = "0"},/turf/simulated/floor/plating,/area/space) "aZR" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating,/area/space) "aZS" = (/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/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/space) @@ -3585,7 +3585,7 @@ "bqW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/bridge) "bqX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/bridge) "bqY" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel,/area/bridge) -"bqZ" = (/obj/machinery/computer/shuttle/science,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/bridge) +"bqZ" = (/obj/machinery/computer/shuttle/labor,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/bridge) "bra" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/computer/shuttle/engineering,/turf/simulated/floor/plasteel{dir = 6; icon_state = "brown"},/area/bridge) "brb" = (/obj/machinery/camera{c_tag = "Bridge East"; dir = 2; network = list("SS13")},/obj/machinery/computer/supplycomp,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/bridge) "brc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/wood,/area/crew_quarters/bar) @@ -4010,7 +4010,7 @@ "bzf" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west) "bzg" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west) "bzh" = (/obj/machinery/camera{c_tag = "Starboard Primary Hallway 2"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west) -"bzi" = (/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west) +"bzi" = (/obj/structure/closet/crate/can{pixel_y = 8},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west) "bzj" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/westright{dir = 1; name = "Hydroponics Desk"; req_access_txt = "35"},/turf/simulated/floor/plasteel,/area/hydroponics) "bzk" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Hydroponics"; req_access_txt = "35"},/turf/simulated/floor/plasteel,/area/hydroponics) "bzl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) @@ -4463,7 +4463,9 @@ "bHQ" = (/turf/simulated/floor/plasteel,/area/medical/morgue) "bHR" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) "bHS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light{dir = 1; on = 1},/obj/structure/bookcase/manuals/medical,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak) +"bHT" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/cell_charger,/obj/item/weapon/gun/syringe,/obj/item/weapon/screwdriver,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay3) "bHU" = (/obj/structure/morgue,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel,/area/medical/morgue) +"bHV" = (/obj/machinery/cell_charger,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 0; pixel_y = 0},/obj/machinery/camera{c_tag = "Medbay Cryogenics"; network = list("SS13")},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table/glass,/obj/item/weapon/screwdriver,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo) "bHX" = (/turf/simulated/floor/plasteel,/area/assembly/chargebay) "bIa" = (/turf/simulated/wall,/area/assembly/robotics) "bIb" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel,/area/medical/morgue) @@ -4960,7 +4962,6 @@ "bSr" = (/obj/structure/closet/secure_closet/chemical,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "bSs" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay2) "bSt" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerPort"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -26; pixel_y = 6; range = 3; req_access_txt = null},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay2) -"bSu" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/cell_charger,/obj/item/weapon/gun/syringe,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay3) "bSv" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/medical/medbay3) "bSw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay3) "bSx" = (/obj/structure/closet/secure_closet/medical3,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay3) @@ -5202,7 +5203,6 @@ "bXG" = (/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo) "bXH" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel,/area/medical/cryo) "bXI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2) -"bXJ" = (/obj/machinery/cell_charger,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 0; pixel_y = 0},/obj/machinery/camera{c_tag = "Medbay Cryogenics"; network = list("SS13")},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo) "bXK" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel,/area/medical/cryo) "bXL" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning) "bXM" = (/obj/machinery/camera{c_tag = "Medbay Cloning"; network = list("SS13")},/obj/structure/closet/wardrobe/medic_white,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning) @@ -9080,10 +9080,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbMjbMibKpaSeaSebMbbMcaSebMdbCfbMebIBbMlbMkbMnbMmbCfaaaaabaabbMpbMobMobMobMobMobMraaaaaabKBbMtbMsbMubMqbKzbKzbKzbKzbKzbKzbMwbMvbMzbMybMDbMBbMxbDXbzJbzJbMFbMAbzJbzJbMJbMCbMLbMEbMMbMGbMGbMHbMGbMIbMNbMGbMKbKYbFCbMObFEbFEbFEbMPbFCaaabLcbLdbMRbMQbMVbMTbMWbMSbNbbMUbNcbFObNdbEobMXbMYbMZbNabNfbNebNjbNgbNlbNkbNhbNibNnbNmbNqbNpbNrbLFaTQaTPbEtaTRaTTaTSaTUaSVbNAaTVaTWbGvbEubNKbNzbNLbNBbNBbNMbNDbNEbNFbNGbNHbNIbNJbNObNNbEAbNQbLRbNRbEDbNSbNPbNTbIpbIpbNUbEDbIzbGGbNWbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbKpbKpbObaSdaSdbjQaLdaSdaSdbCfbOdbIBbIBbIBbCfbCfbCfaaaaaaaaabOebOcbOcbOfbOcbOcbOeaaaaaabKBbOgbKzbOibOhbOhbOhbOhbOhbOkbOjbOhbOlbOnbOmbOpbOobOrbOqbzJbOtbBnbOvbOsbDXbOwbOubOxbMEbMEbMGbOAbOybOCbOBbODbMGbFBbKYbFCbOEbOHbOFbOObOMbFCaaabOGbLdbOPbOIbOJbOKbOLbOKbOSbONbOXbFObOYbEobOQbOQbORbPabOTbOUbOVbOWbPcbPbbOZbOZbPebPdbPhbPfbEtbNoaUOaTYbEtbEubPgbEubEuaUPbEubEubEubEubPrbPmbGqbPvbLEbLPbPxbNBbNEbPnbPobPobPpbIdbPqbPybPsbPtbIrbPubEDbPzbPwbIpbPHbPBbPJbEDbKubGGbPAbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIbPIbPIbPIbPNbPMbPIbPIbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbOebPTbKBbKBbPUbPObPPbPQbPQbPQbPObKzbJfbKAbKzbKzbKBbPZbPSbQcbQdbPVbQebPXbBnbBnbPYbDXbOwbOubQhbQfbQbbQibQkbOzbQlbQgbQnbMGbQobQjbHmbQpbQqbQmbQsbQrbHsbHtbQtbLdbQvbQubQwbOKbQxbOKbQybONbQzbFObQAbEobQDbQBbQGbQEbQHbQCbQJbQIbQFbQFbQMbQKbQFbQFbQObQNbQPbQLaVyaVxbQTbQSaWIaHgaVIaYlaWObQVbRebQXbRgbRfbGqbRabRbbRcbRjbRibIabRkbPobPobRlbRhbPqbRmbEAbRnbRnbRobEDbRpbRybRqbRzbIpbREbEDbKubGGbRFbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbRubRvbRwbRxbRGbRHbRAbRGbRBbRCbRDbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbRJbRIbRKbRIbRSbRRbRTbRRbRRbRRbRRbRUbJfbKAbRLbxbbxbbRMbBnbzFbQdbRNbDXbRObRPbRPbRQbNYbRYbRXbRZbRVbRWbSbbSdbScbSabQgbSebMGbMKbKYbFCbSfbShbSgbSlbSkbFCaaabOGbSibSjbSibSibSibSibSibSmbSibSpbFObQAbEobSqbSnbSnbSobSrbOUbStbSsbSvbSubSxbSwbSybSvbSAbSzbSDbSBaWSaWRbSGbSGbSEbSHbSJbSIbSLbSKbSNbSMbSPbSObSRbSQbSQbSSbSUbSTbIabSWbIdbIdbSXbSVbPqbSYbTabSZbTfbTcbTbbTgbTdbTebTjbTebEDbEDcacbGGbGHbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbRubRvbRwbRxbRGbRHbRAbRGbRBbRCbRDbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbRJbRIbRKbRIbRSbRRbRTbRRbRRbRRbRRbRUbJfbKAbRLbxbbxbbRMbBnbzFbQdbRNbDXbRObRPbRPbRQbNYbRYbRXbRZbRVbRWbSbbSdbScbSabQgbSebMGbMKbKYbFCbSfbShbSgbSlbSkbFCaaabOGbSibSjbSibSibSibSibSibSmbSibSpbFObQAbEobSqbSnbSnbSobSrbOUbStbSsbSvbHTbSxbSwbSybSvbSAbSzbSDbSBaWSaWRbSGbSGbSEbSHbSJbSIbSLbSKbSNbSMbSPbSObSRbSQbSQbSSbSUbSTbIabSWbIdbIdbSXbSVbPqbSYbTabSZbTfbTcbTbbTgbTdbTebTjbTebEDbEDcacbGGbGHbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIbRAbRAbRAbTlbRGbTnbTnbRGbTobRAbRAbTpbWLbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbTtbTrbTqbTrbTubKzbPPbPQbPQbPQbKzbKzbJfbKAbTsbTxbxbbTAbBnbTBbQdbTvbDXbTwbBnbBobBnbPWbOwbTybTzbRVbRWbTCbTEbTDbTKbTFbTLbTGbTHbTIbTJbTJbTNbTMbTPbFCbFCaaabOGbSibTQbTObTSbTRbTVbTTbTWbTUbTXbFObQAbNebTZbTYbUbbUabUcbOUbUebUdbUibUhbUfbUgbUkbUjbUmbUlbUobUnbUqbUpbUsbUrbUubUtbUybUvbUDbQVbUwbQXbUxbUGbGrbUzbUAbUBbUCbUCbIabUIbUEbUFbIabUJbPqbUHbIabUKbUMbULbUObUNbZNbpvbsBbqbbRnbtscacbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIbVebVfbVgbVhbVibRGbVkbRAbVlbRAbRAbRAbRAbRAbTlbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebVmbOcbOcbOcbVnbOebPTbKBbKBbVobKzbPPbKzbKzbKzbKzbKzbJfbKAbTsbVpbxbbVrbBnbVqbVsbBnbVwbzEbBnbBnbVtbDXbOwbTybTzbRVbRWbMGbVubVvbVybVxbVzbMHbVBbVAbVDbVCbHsbVEbVFbHsbHtbHtbVGbSibVIbVHbVKbVJbVLbVLbVNbVMbVObFObVPbEobOUbVQbOQbVSbVRbOUbUebVUbVTbGtbVXbVWbVYbVTbUebVZbWebWabWbbWabWcbWabWdbWdbWhbWfbWgbWgbWgbWmbWgbWgbWibWibWjbWkbWjbWjbIabIabIabIabIabWlbWnbLIbIabWobWrbWpbWqbWqbWvbWsbLRctvbEBbyZcacbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWObWGbRAbRAbWHbWHbWHbRGbRAbRAbRGbWIbWJbWKbRAbWMbWNbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbWPbTrbTqbTrbPUbWQbWRbKzbKzbKzbWQbKzbJfbKAbTsbWSbxbbWWbBnbzFbQdbBnbzJbWTbBnbBnbWUbDXbOwbTybWVbRVbWXbMGbXbbWYbWZbXabXdbMHbXcbXebXgbXfbXibXhbXjbFCaaaaaaaaabSibXpbXkbXlbXlbXmbXnbXobSibXrbXqbQAbXsbXubXtbXwbXvbXybXxbXAbUdbXzbXBbXDbXCbXEbXzbUebVZbXIbXFbXGbXHbXKbXJbWdbXMbXLbXObXNbXPbXRbXQbXTbXSbXVbXUbUUbXWbWqbWqbXYbXXbWqbXZbYbbYabYdbYcbWqbYebYgbYfbYibYhbYlbYjbYjbYjbYjbYjcacbGjbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWObWGbRAbRAbWHbWHbWHbRGbRAbRAbRGbWIbWJbWKbRAbWMbWNbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbWPbTrbTqbTrbPUbWQbWRbKzbKzbKzbWQbKzbJfbKAbTsbWSbxbbWWbBnbzFbQdbBnbzJbWTbBnbBnbWUbDXbOwbTybWVbRVbWXbMGbXbbWYbWZbXabXdbMHbXcbXebXgbXfbXibXhbXjbFCaaaaaaaaabSibXpbXkbXlbXlbXmbXnbXobSibXrbXqbQAbXsbXubXtbXwbXvbXybXxbXAbUdbXzbXBbXDbXCbXEbXzbUebVZbXIbXFbXGbXHbXKbHVbWdbXMbXLbXObXNbXPbXRbXQbXTbXSbXVbXUbUUbXWbWqbWqbXYbXXbWqbXZbYbbYabYdbYcbWqbYebYgbYfbYibYhbYlbYjbYjbYjbYjbYjcacbGjbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYubWGbRAbRAbRAbRAbRAbYtbRAbRAbRGbPIbPIbPIbPIbPIbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbYxbYwbYybYwbYAbYzbYBbYBbYBbYBbYBbYCbYEbYDbTsbYFbxbbYGbYIbYHbYNbYJbYKbYLbYLbYLbYMbYMbYObTybYRbYQbRWbMGbYTbYSbYVbVvbYWbMHbYUbYXbZdbTJbZebQmbYYbFCaaaaaaaaabSibYZbZabZbbZcbXmbXnbXobSibZgbZfbZibZhbZkbZjbZmbZlbZobZnbZrbZqbVTbVTbZpbZvbVTbVTbUebVZbZwbZsbZtbZubZybZxbWdbZAbZBbZzbZDbZCbZFbZEbZEbZGbZIbZHbZKbZJbUNbUNbZLbUNbZMbUNbZNbUNbZPbZObZObZQbZSbZRbZUbZTbZXbZVbGkbZWaYpbYjcacbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcafcagcahcaibRAbRGbRAbRAbRGbRAcancakcaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbOebPTbKBbKBbxbbxbbKBbKBbKBbKBbKBbxbbxbbKBbKBbKBbxbcamcamcamcascambYMcaocapcaqcatbYMbOwbTycawbMEbMEbMGbMGbMGbMGbMGbMNbMHbTJbTIcaubTJcavcaxbFCbFCbFCbFCbFCbSibSjbSibSibSibSibSibSibSicaybFOcaBcazcaAcaCcaDcaAcaAcaEcaGcaFcaIcaHcaKcaJcaMcaLbXAcaNcaPcaOcaRcaQcaTcaScaVcaUcaXcaWcaZcaYcbbcbabXQcbcbWgbWicbdcbecbdcbfcbicbfcbfcbfcbhcblcbjcbjcbkcbmcbocbnbZUcbpcbrcbqbGlcbscbubYjcacbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPIbPIbPIbPIbPIbPIbRGbTobRAcbzbRAcbxcbycbAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbDcbBbOccbCbOccbEcbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbGaabaaaaaaaaaaaacamcbIcbHcbKcbJbYMcbNcbLcbMcbRbYMbOwbTycbOcbPcbQcbScbVcbTcbUcbWcbYcbXccacbZcccccbccfccdcceccgccjcchccicckccqcclccmbEnccnbFOccoccpccrbFOccscaAccvcctccuccwccxbUecczccyccBccAccDccCccFccEccHccGccIbWaccKbZuccJccMccLccOccNccPbXNccQbXQbXQbXQccRbWgcbdccTccSccVccUccXccWcdbcbfccYccZcdacbjcbjcdccbocddcdfcdecdhcdgbGmcdicdkbYjcdndfcbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/generic/z5.dmm b/_maps/map_files/generic/z5.dmm index d60df3b8c30..6bc07059180 100644 --- a/_maps/map_files/generic/z5.dmm +++ b/_maps/map_files/generic/z5.dmm @@ -104,9 +104,9 @@ "bZ" = (/obj/structure/alien/weeds,/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched2"},/area/mine/abandoned) "ca" = (/obj/structure/table,/obj/item/weapon/shovel,/turf/simulated/floor/plasteel,/area/mine/north_outpost) "cb" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plasteel,/area/mine/north_outpost) -"cc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plasteel,/area/mine/north_outpost) +"cc" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/mine/north_outpost) "cd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating/airless,/area/mine/abandoned) -"ce" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/mine/north_outpost) +"ce" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plasteel,/area/mine/north_outpost) "cf" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Mining North Outpost APC"; pixel_x = 26; pixel_y = 0},/obj/machinery/conveyor_switch{id = "mining_north"},/obj/machinery/camera{c_tag = "North Outpost"; dir = 8; network = list("MINE")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/mine/north_outpost) "cg" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/wall,/area/mine/north_outpost) "ch" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/mine/north_outpost) @@ -115,11 +115,11 @@ "ck" = (/obj/machinery/door/airlock,/turf/simulated/floor/plasteel/airless,/area/mine/abandoned) "cl" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/plasteel,/area/mine/north_outpost) "cm" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel,/obj/item/clothing/glasses/meson,/obj/machinery/light/small{dir = 8},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel,/area/mine/north_outpost) -"cn" = (/obj/machinery/door/airlock/glass_mining{name = "Break Room"; req_access_txt = "54"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/north_outpost) -"co" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/north_outpost) -"cp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{tag = "icon-manifold-b-f (EAST)"; dir = 4},/turf/simulated/floor/plasteel,/area/mine/north_outpost) +"cn" = (/obj/machinery/door/airlock/glass_mining{name = "Break Room"; req_access_txt = "54"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/mine/north_outpost) +"co" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/mine/north_outpost) +"cp" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/mine/north_outpost) "cq" = (/obj/machinery/door/window/northleft{dir = 8; name = "Pneumatic Tube Access"},/obj/machinery/disposal/deliveryChute{dir = 8; pixel_x = 8; pixel_y = 0},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/mine/north_outpost) -"cr" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/mine/north_outpost) +"cr" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plasteel,/area/mine/north_outpost) "cs" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/mine/dangerous/explored) "ct" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/wall,/area/mine/north_outpost) "cu" = (/obj/machinery/conveyor_switch{id = "mining_north"},/turf/simulated/floor/plating/airless{icon_state = "asteroidwarning"; dir = 1},/area/mine/north_outpost) @@ -148,7 +148,7 @@ "cR" = (/obj/effect/decal/remains/human,/obj/structure/alien/weeds,/turf/simulated/floor/plating/airless,/area/mine/abandoned) "cS" = (/obj/structure/alien/weeds,/turf/simulated/floor/plasteel/airless,/area/mine/abandoned) "cT" = (/obj/structure/table,/turf/simulated/floor/plasteel/airless,/area/mine/abandoned) -"cU" = (/obj/machinery/door/airlock/external{name = "Mining North Outpost Airlock"; req_access_txt = "54"},/turf/simulated/floor/plasteel,/area/mine/north_outpost) +"cU" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/mine/north_outpost) "cV" = (/obj/structure/glowshroom,/turf/simulated/mineral/random,/area/mine/dangerous/explored) "cW" = (/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"},/area/mine/abandoned) "cX" = (/obj/structure/rack,/turf/simulated/floor/plasteel/airless,/area/mine/abandoned) @@ -159,8 +159,8 @@ "dc" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless{icon_state = "asteroidfloor"},/area/mine/north_outpost) "dd" = (/obj/machinery/computer/mech_bay_power_console,/turf/simulated/floor/plating/airless{icon_state = "asteroidfloor"},/area/mine/north_outpost) "de" = (/turf/simulated/floor/mech_bay_recharge_floor/airless,/area/mine/north_outpost) -"df" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/mine/north_outpost) -"dg" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel,/area/mine/north_outpost) +"df" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/mine/north_outpost) +"dg" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_n1_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = null},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/mine/north_outpost) "dh" = (/obj/structure/glowshroom,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored) "di" = (/obj/structure/alien/resin/wall,/turf/simulated/floor/plating/airless{icon_state = "floorgrime"},/area/mine/abandoned) "dj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/mine/abandoned) @@ -169,9 +169,9 @@ "dm" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/mine/dangerous/explored) "dn" = (/obj/machinery/door/airlock/external{name = "Mining Bridge"; req_access_txt = "54"},/turf/simulated/floor/plating/airless{icon_state = "asteroidfloor"},/area/mine/north_outpost) "do" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/north_outpost) -"dp" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/mine/north_outpost) -"dq" = (/obj/structure/ore_box,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/mine/north_outpost) -"dr" = (/turf/simulated/floor/plasteel{icon_state = "warning"},/area/mine/north_outpost) +"dp" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_n1_inner"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = null},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/north_outpost) +"dq" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_n1_pump"},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/north_outpost) +"dr" = (/obj/machinery/light/small{dir = 4},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "mining_n1_sensor"; pixel_x = 25; pixel_y = -5},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "mining_n1_airlock"; pixel_x = 25; pixel_y = 5; req_access_txt = null; tag_airpump = "mining_n1_pump"; tag_chamber_sensor = "mining_n1_sensor"; tag_exterior_door = "mining_n1_outer"; tag_interior_door = "mining_n1_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "mining_n1_pump"},/turf/simulated/floor/plasteel,/area/mine/north_outpost) "ds" = (/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap,/obj/structure/glowshroom,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored) "dt" = (/obj/structure/alien/weeds,/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "du" = (/obj/structure/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/mine/abandoned) @@ -179,7 +179,7 @@ "dw" = (/obj/item/weapon/storage/toolbox/syndicate,/obj/structure/alien/weeds/node,/turf/simulated/floor/plating/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "dx" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/space,/area/mine/north_outpost) "dy" = (/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/unexplored) -"dz" = (/obj/machinery/door/airlock/external{name = "Mining North Outpost Airlock"; req_access_txt = "54"},/turf/simulated/floor/plating/airless{icon_state = "asteroidfloor"},/area/mine/north_outpost) +"dz" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/north_outpost) "dA" = (/obj/structure/disposalpipe/segment,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/mine/dangerous/explored) "dB" = (/obj/item/weapon/shard,/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched2"},/area/mine/abandoned) "dC" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plasteel/airless,/area/mine/abandoned) @@ -339,13 +339,13 @@ "gA" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/mine/laborcamp/security) "gB" = (/obj/machinery/door/airlock/glass_security{name = "Labor Camp External Access"; req_access_txt = "2"},/turf/simulated/floor/plating,/area/mine/laborcamp/security) "gC" = (/obj/machinery/telecomms/relay/preset/mining,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/mine/maintenance) -"gD" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/mine/maintenance) +"gD" = (/obj/machinery/camera{c_tag = "Mining Outpost Port Exterior Airlock"; dir = 4; network = list("Mining Outpost")},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_n1_pump"},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/mine/north_outpost) "gE" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/mine/laborcamp/security) "gF" = (/obj/machinery/door/airlock/maintenance{name = "Labor Camp Maintenance"; req_access_txt = "2"},/turf/simulated/floor/plating,/area/mine/laborcamp/security) "gG" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/bluegrid,/area/mine/maintenance) "gH" = (/obj/machinery/camera{c_tag = "Communications Relay"; dir = 8; network = list("MINE")},/turf/simulated/floor/bluegrid,/area/mine/maintenance) "gI" = (/turf/simulated/floor/plasteel,/area/mine/laborcamp/security) -"gJ" = (/obj/machinery/light_switch{pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/bluegrid,/area/mine/maintenance) +"gJ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "mining_n1_pump"},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/mine/north_outpost) "gK" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/mine/laborcamp/security) "gL" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/dangerous/explored) "gM" = (/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/dangerous/explored) @@ -353,10 +353,10 @@ "gO" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/mine/laborcamp/security) "gP" = (/obj/machinery/light/small{dir = 1},/obj/item/weapon/storage/box/lights/mixed,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/mine/laborcamp/security) "gQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/mine/laborcamp/security) -"gR" = (/obj/machinery/door/airlock/maintenance{name = "Mining Station Communications"; req_access_txt = "48"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "vault"},/area/mine/maintenance) +"gR" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/mine/north_outpost) "gS" = (/obj/item/clothing/under/rank/miner,/obj/effect/decal/remains/human,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/dangerous/explored) "gT" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidfloor"},/area/mine/dangerous/explored) -"gU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"gU" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_n1_outer"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = null},/turf/simulated/floor/plating,/area/mine/north_outpost) "gV" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/obj/machinery/light,/turf/space,/area/mine/west_outpost) "gW" = (/turf/simulated/floor/carpet,/area/mine/living_quarters) "gX" = (/turf/simulated/mineral/random,/area/mine/dangerous/explored) @@ -377,7 +377,7 @@ "hm" = (/obj/machinery/space_heater,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/mine/laborcamp/security) "hn" = (/obj/machinery/power/port_gen/pacman{anchored = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/mine/laborcamp/security) "ho" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/mine/laborcamp/security) -"hp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"hp" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidwarning"; dir = 1},/area/mine/dangerous/explored) "hq" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/mine/living_quarters) "hr" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/west_outpost) "hs" = (/obj/machinery/door/airlock{id_tag = "miningdorm2"; name = "Room 2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/mine/living_quarters) @@ -437,12 +437,12 @@ "iu" = (/obj/structure/ore_box,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/mine/west_outpost) "iv" = (/obj/machinery/camera{c_tag = "Crew Area"; dir = 1; network = list("MINE")},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters) "iw" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/mine/living_quarters) -"ix" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"ix" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "mining_n1_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = null},/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/dangerous/explored) "iy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/mine/living_quarters) "iz" = (/obj/structure/disposalpipe/segment,/turf/simulated/mineral/random,/area/mine/dangerous/unexplored) "iA" = (/obj/machinery/light/small{dir = 4},/obj/machinery/door_control{id = "miningdorm2"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/mine/living_quarters) "iB" = (/obj/machinery/camera{c_tag = "Storage Room"; dir = 1; network = list("MINE")},/turf/simulated/floor/plasteel,/area/mine/living_quarters) -"iC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"iC" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/mine/maintenance) "iD" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/mine/laborcamp/security) "iE" = (/obj/structure/girder,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "asteroidfloor"},/area/mine/laborcamp/security) "iF" = (/obj/machinery/door/airlock/external{id_tag = "laborcamp_away"; name = "Labor Camp Airlock"; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/mine/laborcamp/security) @@ -454,8 +454,8 @@ "iL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/west_outpost) "iM" = (/obj/machinery/conveyor_switch{id = "mining_west"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/mine/west_outpost) "iN" = (/obj/machinery/door/airlock/glass{name = "Crew Area"; req_access_txt = "48"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/mine/living_quarters) -"iO" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/mine/living_quarters) -"iP" = (/obj/machinery/door/airlock/mining{name = "Mining Station Storage"; req_access_txt = "48"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"iO" = (/obj/machinery/light_switch{pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9},/turf/simulated/floor/bluegrid,/area/mine/maintenance) +"iP" = (/obj/machinery/door/airlock/maintenance{name = "Mining Station Communications"; req_access_txt = "48"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "vault"},/area/mine/maintenance) "iQ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp/security) "iR" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/machinery/door/airlock/glass_security{name = "Labor Camp Backroom"; req_access_txt = "2"},/turf/simulated/floor/plating,/area/mine/laborcamp/security) "iS" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp/security) @@ -513,9 +513,9 @@ "jS" = (/obj/machinery/conveyor{backwards = 2; dir = 2; forwards = 1; id = "mining_west"},/obj/structure/plasticflaps/mining,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/mine/west_outpost) "jT" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel,/area/mine/living_quarters) "jU" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/mine/living_quarters) -"jV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"jV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/living_quarters) "jW" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters) -"jX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"jX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/living_quarters) "jY" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters) "jZ" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters) "ka" = (/turf/simulated/floor/plasteel,/area/mine/living_quarters) @@ -523,7 +523,7 @@ "kc" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/mine/living_quarters) "kd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/mine/living_quarters) "ke" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/mine/eva) -"kf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"kf" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/mining,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel,/area/mine/eva) "kg" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/mine/eva) "kh" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidwarning"; dir = 5},/area/space) "ki" = (/obj/machinery/light,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored) @@ -549,41 +549,41 @@ "kC" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/item/weapon/storage/box/lights/bulbs,/turf/simulated/floor/plating,/area/mine/west_outpost) "kD" = (/obj/machinery/conveyor_switch{id = "mining_west"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless{icon_state = "asteroidwarning"; dir = 1},/area/mine/west_outpost) "kE" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidwarning"; dir = 1},/area/mine/west_outpost) -"kF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters) -"kG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plasteel,/area/mine/living_quarters) -"kH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"kF" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"kG" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"kH" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/mine/living_quarters) "kI" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plasteel,/area/mine/west_outpost) "kJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/plasteel,/area/mine/west_outpost) -"kK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters) -"kL" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"kK" = (/obj/machinery/door/airlock/mining{name = "Mining Station Storage"; req_access_txt = "48"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"kL" = (/obj/machinery/alarm{pixel_y = 24},/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/camera{c_tag = "Mining Outpost Starboard Connector"; network = list("Mining Outpost")},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel,/area/mine/lobby) "kM" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/mine/west_outpost) "kN" = (/obj/structure/sign/xeno_warning_mining,/turf/simulated/wall,/area/mine/living_quarters) -"kO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"kO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/living_quarters) "kP" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor/plasteel,/area/mine/eva) "kQ" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "mining_east_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = null},/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning (EAST)"; icon_state = "asteroidwarning"; dir = 4},/area/space) "kR" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_east_outer"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = null},/turf/simulated/floor/plating,/area/mine/eva) "kS" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/mine/eva) -"kT" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/mining,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel,/area/mine/eva) +"kT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/living_quarters) "kU" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/mining,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/mine/eva) "kV" = (/obj/structure/rack,/obj/machinery/light/small{dir = 1},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/clothing/suit/space/hardsuit/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/mining,/turf/simulated/floor/plasteel,/area/mine/eva) "kW" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/rack,/obj/item/weapon/pickaxe,/turf/simulated/floor/plasteel,/area/mine/living_quarters) "kX" = (/turf/simulated/wall/r_wall,/area/mine/lobby) "kY" = (/obj/machinery/camera{c_tag = "Mining Outpost EVA"; dir = 4; network = list("Mining Outpost")},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/mining,/turf/simulated/floor/plasteel,/area/mine/eva) -"kZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel,/area/mine/living_quarters) -"la" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"kZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/airlock/glass_mining{name = "Mining Station Bridge"; req_access_txt = "48"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"la" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/mine/living_quarters) "lb" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plasteel,/area/mine/eva) "lc" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/satchel,/obj/item/weapon/pickaxe,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plasteel,/area/mine/eva) -"ld" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/airlock/glass_mining{name = "Mining Station Bridge"; req_access_txt = "48"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"ld" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/mine/living_quarters) "le" = (/obj/machinery/power/port_gen/pacman{anchored = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/mine/west_outpost) "lf" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel,/area/mine/west_outpost) "lg" = (/obj/structure/cable,/obj/machinery/power/smes{charge = 5e+006},/turf/simulated/floor/plating,/area/mine/west_outpost) -"lh" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Infirmary"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "whitebluefull"},/area/mine/living_quarters) +"lh" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters) "li" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/airlock/maintenance{name = "Mining Station Maintenance"; req_access_txt = "48"},/turf/simulated/floor/plating,/area/mine/living_quarters) -"lj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/mine/living_quarters) -"lk" = (/obj/machinery/door/airlock/external{name = "Mining External Airlock"; req_access_txt = "54"},/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"lj" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"lk" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/mine/living_quarters) "ll" = (/turf/simulated/floor/plating/airless/asteroid,/area/space) "lm" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/mine/lobby) -"ln" = (/obj/machinery/alarm{pixel_y = 24},/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/camera{c_tag = "Mining Outpost Starboard Connector"; network = list("Mining Outpost")},/turf/simulated/floor/plasteel,/area/mine/lobby) +"ln" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/plasteel,/area/mine/living_quarters) "lo" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/mine/lobby) "lp" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal/deliveryChute,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/northleft{dir = 2; name = "Pneumatic Tube Access"},/turf/simulated/floor/plasteel,/area/mine/lobby) "lq" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal/deliveryChute{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/west_outpost) @@ -595,7 +595,7 @@ "lw" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel,/area/mine/eva) "lx" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/mine/eva) "ly" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/eva) -"lz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/mine/living_quarters) +"lz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters) "lA" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/mine/living_quarters) "lB" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/mine/lobby) "lC" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/mine/living_quarters) @@ -604,37 +604,37 @@ "lF" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/mine/living_quarters) "lG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/light/small{dir = 1},/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/mine/living_quarters) "lH" = (/obj/structure/rack,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/regular{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plating,/area/mine/living_quarters) -"lI" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/mine/living_quarters) -"lJ" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/living_quarters) -"lK" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel,/area/mine/living_quarters) -"lL" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/living_quarters) +"lI" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"lJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"lK" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_west_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = null},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"lL" = (/obj/machinery/camera{c_tag = "Mining Outpost Port Connector"; dir = 1; network = list("Mining Outpost")},/obj/machinery/light_switch{pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/mine/living_quarters) "lM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plasteel,/area/mine/lobby) "lN" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/mine/lobby) "lO" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/eva) "lP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Mining Station EVA"; req_access_txt = "54"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/eva) -"lQ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"lQ" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Infirmary"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "whitebluefull"},/area/mine/living_quarters) "lR" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/mine/west_outpost) "lS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9},/turf/simulated/floor/plasteel,/area/mine/eva) -"lT" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/plasteel,/area/mine/lobby) +"lT" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/mine/living_quarters) "lU" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/lobby) "lV" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plating,/area/mine/living_quarters) -"lW" = (/obj/structure/ore_box,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/mine/living_quarters) -"lX" = (/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/plasteel{icon_state = "warning"},/area/mine/living_quarters) -"lY" = (/turf/simulated/floor/plasteel{icon_state = "warning"},/area/mine/living_quarters) +"lW" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_west_inner"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = null},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"lX" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/mine/living_quarters) +"lY" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/living_quarters) "lZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Mining Station Bridge"; req_access_txt = "48"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/lobby) "ma" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/lobby) "mb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/mine/lobby) "mc" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/mine/lobby) "md" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/mine/lobby) -"me" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/mine/living_quarters) -"mf" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/mine/living_quarters) +"me" = (/obj/machinery/light/small{dir = 4},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "mining_west_sensor"; pixel_x = 25; pixel_y = -5},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "mining_west_pump"; tag_exterior_door = "mining_west_outer"; frequency = 1379; id_tag = "mining_west_airlock"; tag_interior_door = "mining_west_inner"; pixel_x = 25; pixel_y = 5; req_access_txt = null; tag_chamber_sensor = "mining_west_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"mf" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/living_quarters) "mg" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/turf/space,/area/mine/living_quarters) "mh" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/mine/lobby) "mi" = (/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/power/port_gen/pacman{anchored = 1},/turf/simulated/floor/plating,/area/mine/living_quarters) "mj" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/mine/living_quarters) "mk" = (/obj/machinery/power/port_gen/pacman{anchored = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/mine/living_quarters) "ml" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/mine/living_quarters) -"mm" = (/obj/machinery/door/airlock/external{name = "Mining External Airlock"; req_access_txt = "54"},/turf/simulated/floor/plating/airless{icon_state = "asteroidfloor"},/area/mine/living_quarters) +"mm" = (/obj/machinery/camera{c_tag = "Mining Outpost Port Exterior Airlock"; dir = 4; network = list("Mining Outpost")},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/mine/living_quarters) "mn" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/turf/space,/area/mine/lobby) "mo" = (/turf/simulated/floor/plasteel{icon_state = "loadingarea"},/area/mine/production) "mp" = (/obj/machinery/power/apc{dir = 2; name = "Mining EVA APC"; pixel_x = 1; pixel_y = -23},/obj/structure/cable,/turf/simulated/floor/plasteel,/area/mine/eva) @@ -696,10 +696,11 @@ "nt" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Mining Station Mech Bay"; req_access_txt = "54"},/turf/simulated/floor/plasteel,/area/mine/production{name = "Mining Station Mech Bay"}) "nu" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel,/area/mine/production{name = "Mining Station Mech Bay"}) "nv" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/plasteel,/area/mine/lobby) +"nw" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/mine/living_quarters) "nx" = (/obj/machinery/mineral/equipment_vendor,/turf/simulated/floor/plasteel,/area/mine/production{name = "Mining Station Mech Bay"}) -"ny" = (/obj/structure/ore_box,/obj/machinery/camera{c_tag = "Mining Outpost Mech Bay"; dir = 1; network = list("Mining Outpost")},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/mine/production{name = "Mining Station Mech Bay"}) -"nz" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/light,/turf/simulated/floor/plasteel,/area/mine/production{name = "Mining Station Mech Bay"}) -"nA" = (/obj/machinery/mech_bay_recharge_port,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/mine/production{name = "Mining Station Mech Bay"}) +"ny" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/mine/living_quarters) +"nz" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_west_outer"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = null},/turf/simulated/floor/plating,/area/mine/living_quarters) +"nA" = (/obj/structure/ore_box,/obj/machinery/camera{c_tag = "Mining Outpost Mech Bay"; dir = 1; network = list("Mining Outpost")},/obj/machinery/light_switch{pixel_y = -25},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/mine/production{name = "Mining Station Mech Bay"}) "nB" = (/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 6},/area/mine/dangerous/explored) "nC" = (/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/dangerous/explored) "nD" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/mine/lobby) @@ -707,6 +708,7 @@ "nF" = (/obj/item/device/radio/beacon,/turf/simulated/floor/plasteel,/area/mine/lobby) "nG" = (/obj/machinery/computer/shuttle/mining,/turf/simulated/floor/plasteel,/area/mine/lobby) "nH" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel,/area/mine/lobby) +"nI" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/production{name = "Mining Station Mech Bay"}) "nJ" = (/turf/simulated/wall,/area/mine/living_quarters{name = "Mining Station Break Room"}) "nK" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/mine/living_quarters{name = "Mining Station Break Room"}) "nL" = (/obj/machinery/door/airlock/external{id_tag = "mining_away"; name = "Mining Dock Airlock"; req_access_txt = "48"},/turf/simulated/floor/plating,/area/mine/lobby) @@ -721,10 +723,11 @@ "nU" = (/obj/machinery/power/apc{dir = 1; name = "Mining Station Break Room APC"; pixel_x = 1; pixel_y = 25},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) "nV" = (/obj/machinery/hologram/holopad,/obj/machinery/firealarm{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) "nW" = (/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) -"nX" = (/obj/machinery/alarm{pixel_y = 25},/obj/structure/closet/crate/bin{name = "Garbage bin"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) +"nX" = (/obj/machinery/alarm{pixel_y = 25},/obj/structure/closet/crate/can,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) "nY" = (/obj/machinery/door/firedoor,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/mine/living_quarters{name = "Mining Station Break Room"}) "nZ" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/mine/lobby) "oa" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/mine/lobby) +"ob" = (/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning (EAST)"; icon_state = "asteroidwarning"; dir = 4},/area/mine/dangerous/explored) "oc" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) "od" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Mining Break Room"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/lobby) "oe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) @@ -743,6 +746,7 @@ "or" = (/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) "os" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) "ot" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) +"ou" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "mining_west_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = null},/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/dangerous/explored) "ov" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/mine/dangerous/explored) "ow" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel,/area/mine/lobby) "ox" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/mine/lobby) @@ -845,15 +849,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaEaEaEaEaEaEbobEdBdkbEbZdCcTcTbgbrcSaEcTaWdDcXaEaeaeaeaeaeaeaeaeakaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaedydydydybVbVbVbVbVbVbVbwbwbwaeaeababbwaaaaaaaaaaaaaaajaQaQaQaQaQbCbBaQaQaQaQaQaQaQaQaQbVbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaEdEaAbDboaEbxcdbyaEckaEdGdFdHaEaAdIamdQaWbdamaEaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaedydybVbVbVbVbVbVbVbVbVbVbwbwabababbwaaaaaaaaaaaaaaajaQbJbIbLbKbNbMbPbObObObRbQbTbSaQbVgXbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaEdEaWaAbAckdIdkaAdkbdaAaAdRbraAaWaWaEamdSaWaAaEaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabbVbVbVbVbVbVbVbVbVbVbVbVbwbwababbwbwaaaaaaaaaaaaajaQcabOcbbKcecccfaQaQcgcichchcjaQbVbVbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaEdEdTaWaWckaWdDblaWdUbddDduamaWdVbcaEdkamdIaAaEaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabbwbwbVbVbVbVbVbVbVbVbVbVbVcLbwababbwbwaaaaaaaaaaaaajaQcmclcocncocpcrcqctcscvcucwbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaEdEdWbAboaEcAczbHbHczaHczbHbHbHaYdIaEdRcxamcSaEaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabbwcLbVbVbVbVbVbVbVbVbVbVbVbVbwbwbwbwaaaaaaaaaaaaaaajaQcCbOcDbKbOcEcrcFcGcsbVbVbVbVbVbwbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaEaEaEaEaEaEcHczaYaYaYaYaCaYcIbHaDbAaEcZdYdXdjaEaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabbwcLbVbVbVbVbVbVbVbVbVbVbVbVbwbwbwaaaaaaaaaaaaaaajajaQcNbOcObKcPbOcrcFcGcsbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaeaeaeaeaeaEcAczaYaHcRcQataXaYbHaYbcaEdZebebefaEdyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeababbwbwbVbVbVbVbVbVbVbVbVbVbVbVbwbwbwaaaaaaaaaaaaajajajaQaQbKbKaQaQbKcUbKcGcsbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXcVgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahvhvhvhvegegegegegegegegememegegeieieieieieieiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeaEcAczaYaXaYaYcIaYaHczcAaEaEcTamebekejdydyaeaeaeaeaeaeaeaeaeaeaeaeaeakaeaeaeaeaeaeaeaeaeaeaeaeaeababbwbwbVbVbVbVbVbVbVbVbVbVbVbVcYcYdadOdOdOdOdOdOdbcYcYbVbVdcdeddaQdfbOdgcGcsbVbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXcVdhdhcVgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahvhvhvhvhvhvhveoeoeoeoeoeoememememaeaeeieieieieieiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeaeaEdiczczczczczczczczczcAaEcTamcWamefeldydyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababbwbVbVbVbVbVbVbVbVbVbVbVbVbVbVdndmdmdmdmdmdmdmdmdnbVbVbVdododoaQdpdrdqcGcsbVbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXgXdhdscVgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahveoeoeoeoeoeoepereqeseoemememeNeNememememegegegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeaeaeaEdicAcAcAdwdvcAcAcAdidiaEcTcWcWcWcXaEdydydyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababbwbVbVbVbVbVbVbVbVbVbVbVbVbVcYcYdxeeeeeeeeeeeeeecYcYbVbVbVbVbVaQbKdzbKcGdAbVbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXgXcVcVcVgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahveoeuetewevexeyezezeAeocKcKcKcKcKcKeBeBeBeBeBeiaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaeaeaeaeaeaeaeaeaeaEaEaEaEaEaEaEaEaEaEaEaEaEaEdjeDecaEaEdydydydyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababbwbVbVbVbVbVbVbVbVbVbVbVbVbVbwaaaaaaaaaaaaaaaabwbwbwbVbVbVbVbVbVdJdLdKdNdMdPbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahveoeEeCeGeFexeHezeIeKeJeQeOeOcKeLeMeNememememememaaaaaaaaaaaaaaaaaaaaaaababababababaeaeaeaeaeaeaeakaeaeaeaeaeaeaeaeaeaeaeaeaedydydyaEebebcWaEdydydydydyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababbwbVbVbVbVbVbVbVbVbVbVbVbVbwaaaaaaaaaaaaaabwbwbwbwbwbwbwbwbVbVbVbVbVdJeaeadKbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaEdEdTaWaWckaWdDblaWdUbddDduamaWdVbcaEdkamdIaAaEaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabbwbwbVbVbVbVbVbVbVbVbVbVbVcLbwababbwbwaaaaaaaaaaaaajaQcmclcocncrcpcUcqctcscvcucwbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaEdEdWbAboaEcAczbHbHczaHczbHbHbHaYdIaEdRcxamcSaEaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabbwcLbVbVbVbVbVbVbVbVbVbVbVbVbwbwbwbwaaaaaaaaaaaaaaajaQcCbOcDbKbOcEdfcFcGcsbVbVbVbVbVbwbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaEaEaEaEaEaEcHczaYaYaYaYaCaYcIbHaDbAaEcZdYdXdjaEaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabbwcLbVbVbVbVbVbVbVbVbVbVbVbVbwbwbwaaaaaaaaaaaaaaajajaQcNbOcObKcPbOdgcFcGcsbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaeaeaeaeaeaEcAczaYaHcRcQataXaYbHaYbcaEdZebebefaEdyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeababbwbwbVbVbVbVbVbVbVbVbVbVbVbVbwbwbwaaaaaaaaaaaaajajajaQaQbKbKaQaQaQdpbKcGcsbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXcVgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahvhvhvhvegegegegegegegegememegegeieieieieieieiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeaEcAczaYaXaYaYcIaYaHczcAaEaEcTamebekejdydyaeaeaeaeaeaeaeaeaeaeaeaeaeakaeaeaeaeaeaeaeaeaeaeaeaeaeababbwbwbVbVbVbVbVbVbVbVbVbVbVbVcYcYdadOdOdOdOdOdOdbcYcYbVbVdcdeddaQdqdzdrcGcsbVbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXcVdhdhcVgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahvhvhvhvhvhvhveoeoeoeoeoeoememememaeaeeieieieieieiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeaeaEdiczczczczczczczczczcAaEcTamcWamefeldydyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababbwbVbVbVbVbVbVbVbVbVbVbVbVbVbVdndmdmdmdmdmdmdmdmdnbVbVbVdododoaQgDgRgJcGcsbVbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXgXdhdscVgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahveoeoeoeoeoeoepereqeseoemememeNeNememememegegegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeaeaeaEdicAcAcAdwdvcAcAcAdidiaEcTcWcWcWcXaEdydydyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababbwbVbVbVbVbVbVbVbVbVbVbVbVbVcYcYdxeeeeeeeeeeeeeecYcYbVbVbVbVbVaQaQgUbKcGdAbVbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXgXcVcVcVgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahveoeuetewevexeyezezeAeocKcKcKcKcKcKeBeBeBeBeBeiaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaeaeaeaeaeaeaeaeaeaEaEaEaEaEaEaEaEaEaEaEaEaEaEdjeDecaEaEdydydydyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababbwbVbVbVbVbVbVbVbVbVbVbVbVbVbwaaaaaaaaaaaaaaaabwbwbwbVbVbVbVbVbVglixhpdNdMdPbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahveoeEeCeGeFexeHezeIeKeJeQeOeOcKeLeMeNememememememaaaaaaaaaaaaaaaaaaaaaaababababababaeaeaeaeaeaeaeakaeaeaeaeaeaeaeaeaeaeaeaeaedydydyaEebebcWaEdydydydydyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababbwbVbVbVbVbVbVbVbVbVbVbVbVbwaaaaaaaaaaaaaabwbwbwbwbwbwbwbwbVbVbVdJdLdLeaeadKbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeoeoeoexedePedexeReSexexeoeoeoeTeheUeNeNemememememememaaaaaaaaaaaaaaaaaaaaababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaedydydyaEeVeXeVaEdydydydydyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeababbwbVbVbVbVbVbVbVbVbVbVbVbVbwaaaaaaaaaaaaaabwbwbwbwbwbwbwbwbwbwbVbVbVbVenenbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeoeZeYexfaezeyfcfbezfdexfefhfheOfieOeNeNemememememememaaaaaaaaaaaaaaaaaaababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaedydyaEfjeDdjaEdydydydyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeababbwbwbVbVbVbVbVbVbVbVbwbwbwbwaaaaaaaaaaaaaaaabwbwbwbwbwbwbwbwbwbwbwbVbVenenbVbVbwbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajeoflfkfofmfqfpezfaezezfnfhfheOeOeOeOfreNememememememememaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeakaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaedydydyfsfuftdydydydyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeakaeaeaeaeaeabababbwbwbwbwbwbVbVcLcLbwababaaaaaaaaaaaaaaaaaabwbwbwbwbwbwbwbwbwbwbwbwbVenenbVbVbwbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -945,27 +949,27 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaeaeaeaeaeaeaeaeaeaeaeae aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababbwbwbwbwbwbwbwbwbwbwbwhFgvhIbwababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwbwbwgXgXbwbwbwbVbVbVenenbVbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaabababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeababbwbVbVcYcYgwdOdOdOdOdOdOhJgvhIbwabababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaehKhKhKhKhKhKhKaeaeabababaaaaaaaaaaaaaaaaaaaaaaaaaaaabwbwbwgXgXbwbwbwbVbVbVenenbVbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabbwbVbVbVbVgtgxgxgxgxgxgxgxgygzhIbwababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaehKhOhPgChRhOhKaeaeabababaaaaaaaaaaaaaaaaaaaaaaaaaabwbwbwbwgXgXbwbwbwbwbVbVenenbVbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabbwbVbVbVcYcYeeeeeeeeeeeehTgvhUhChBbwbwbwbwabababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaehKhOgGgDgJgHhKaeaeabababaaaaaaaaaaaaaaaaaaaaaaaaaabwbwbwbwgXgXbwbwbwbwbVbVenenbVbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeababbwbVbVbVbwhBhBhBhBhBhBhFgvhIhBhBhBbVbVbVbwababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegLgLgMaeidhKhKhKgRhKhKhKaeaeabababaaaaaaaaaaaaaaaaaaaaaaaabwbwbwbwbwgXgXbwbwbwbwbVbVenenbVbwbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabbwbVbVbwhBhBhBhBhBhBhBhFgvhIhBbVbVbVbVbVbwbwabababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegSgMgTaeidihiiidgUidbwbwabaeabababaaaaaaaaaaaaaaaaaaaaaabwbwbwbwbwbwgXgXbwbwbwbwbwbVenenbVbVbwbwbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeaeakaeaeaeaeaeaeaeaeababbwbVbwhBhBhBhBhBhBhBgVgvhIbVbVbVbVbVbVbVbwabababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegLcKaeidiogWhegUidbVbwbwababababaaaaaaaaaaaaaaaaaaaabwbwbwbwbwbwbwgXgXbwbwbwbwbwbVenenbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeababbwbwbwbwbwhBhBhBhBcYgtcYbVbVbVbVbVbVbVbwbwababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaehgaeaeididididhpidbVbVbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaabwbwbwbwbwbwgXgXbwbwbwbwbwbVenenbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababababababbwhBbVbVcYbVcYbVbVbVbVbVbVbVbVbwababaeaeaeaeaeaeaeaeaeaeaeaeaeakaeaeaeaeaeaeaeaeaeaeaeaeaeaeababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeizaeaeidihiAidgUhqbVbVbVbVbVbVbwbwaaaaaaaaaaaaaaaaaaaabwbwbwbwbwbwbwbwbwbwbwbwbVbVkukubVbVbVbVbVbwbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeababababababbwbVbVbVbVbVbVbVbVhrhrhrbVbVbVbwababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeababababababababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeizaeaeidiogWhsgUhqbVbVbVbVbVbVbVbVbVaaaaaaaaaaaaaaaaaabwbwbwbwbwbwbwbwbwbwbwbVbVbVkukubVbVbVbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaeaeaeaeaeaeaeaeaeaeaeaeaeababbwbwbwbwbwbwbVbVbVbVbVbVbVbVhthxhwbVbVbVbwababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababababbwbwbwbwbwbwbwabababababababaeaeaeaeaeaeaeaeaeaeididiTididididididgUhqbVbVbVbVbVbVbVbVbVbVbVaaaaaaaaaaaaaabwbwbwbwbwbwbwbwbwbVbVbVbVbVkukwkvbVbVbVbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaeaeaeaeaeaeaeaeaeaeaeaeabbwbwbVbViYiYiYiYiYiYhyhyhyhyiYiYiYiYhzbVbVbwababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeababababbwbwbVbVbVbVbVbwbwbwbwbwabababababababaeaeaeaeidididhAjbhEjdidihjeidhpidididhqhqhqidbVbVbVbVbVbVaaaaaaaaaaaaaabwbwbwbwbwbVbVbVbVbVbVbVbVkwkvkubVbVbVbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaeaeaeaeaeaeaeababbwbVbVbViYjkhHhGhyhLhNhMhShQhyjNhWhVdPbVbVbwbwbwbwababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababababbwbwbVbVbVbVbVbVbVbVbVbVbwbwbwbwbwabababababaeaeidjwhXjxjzjxhYidiogWhZgUidjBjCjDjDjDhqbVbVbVbVbVbVbVaaaaaaaaaaaaaabwbwbwbVbVbVbVbVbVbVbVkykykSkSjLjLbVbVbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaeaeaeaeaeaeababbwbVbVbViYjMjNjOhyieieieieifigjNhWijikbVbVbVbVbVbwbwbwabababababababaeaeaeaeaeaeaeaeaeaeaeabababbwbwbwbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVbwbwabababababaeidiljxjWimjYjZididididgUidjBkakakakbhqbVbVbVbVbVbVbVaaaaaaaaaaaaaabVbVbVbVbVbVbVbVbVbVbVkykTkUkUkVjLbVkibVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaababababababababaeaeaeababbwbVbVbViYiqjNjNirjNjNjNjNishyitiuhydKbVbVbVbVbVbVbVbwbwbwbwabababababaeaeaeaeaeaeaeaeababababbwbwbVbVbVbVbVbVbVbVbVbVgldPbVbVbVbVbVbVbwbwbwbwababaeidkojxivjxkrjxktkbiwiyixidkWkaiBkaiChqbVbVbVbVbVbVaaaaaaaaaaaaaaaaaaaabVbVbVbVbVkXkXkXkXkykYlbkelcjLjLjLjLllllbVbVbVbVbwbwbwbwgXgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababbwbwbVbViYkIjNkJiKiJiLkMjNiMiYiYiYiYiYgldPbVbVbVbVbVbVbVbVbwbwbwabababaeaeaeaeaeaeaeaeabababbwbwbVbVgngcgcgcgcgcgcgcgcgrgsgcgcgcgcfgbVbVbVbVbwbwababidididididididhqiOiNhqiOidididididiPididhqhqbVbVaaaaaaaaaaaaaaaaaaaaaaaaaabVbVlmlmlnlplolulslvkglwiclylxickhllbVbVbVbVcLbwbwbwbwbwgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababbwbVbViYlfjNjchyjfjhjgjNjijljjjmlqjngrgsgcgcgcgcgcfgbVbVbVbVbwbwbwababaeaeaeaeaeaeabababbwbwbVbVgngpgngcgcgcgcgcgcgcgrgsgcgcgcfgffgcfgbVbVbVbwabababababidjoltjpkaiCjqkbiCktjrjskakbiCkakalAhqhqhqjtlClClClClClClBlBlBlBlBlBlmlmlmlElDlNlMlPlOlSkjkxkkkPkzkRkQllbVbVbVbVcLbwbwbwbwbwgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbwbVbViYiYiYiYiYjPlRjQiYiYjSjRjRjRjRgrgsgcgcgcgcfgffgcgcfgbVbVbVbwbwabababaeaeababababbwbwbVbVgngpgngpbVbVbVbVbVbVbVdJdKbVbVbVffgcfgenbVbVbVbVbwbwbwbwabididididjTiCjUjXjViykckdkdkfkZlalalzldlzldlQlQlQlQlQlQlQlTlUlUlUlUlUlZmalZmbmamdmcicmpmrmqmuicmwmvicmxllbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbwbwbVbVbVbVbViYkAmskBkCiYkEkDhrbVbVdJdKbVbVbVbVffgcgcfgenbVbVbVbVbwbwbwababababababbwbwbVbVgngpgngpbVbVbVbVbwbVbVbVbVbVbVbVbVbVbVenenbVbVbVbVbVbVbVbwbwbwbwbwidkakGkFkHkFkFkKkOkLmekakakamfhqhqhqmgmgmgmgmgmgmgmnmnmnmnmnmnlmlmlmnZlDmzmymGmGmHmGmGmGmGmGmGllllbVbVbVbVbVcLbwbwbwbwbwgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbwbwbVbVbVbViYmSlemUlgiYbVbVbVbVbVbVbVbVbVbVbVbVbVbVenfffgbVbVbVbVbVbwbwbwbwbwbwbwbwbVbVgngpgngpbVbVbwbwbwbwbwbwbwbVbVbVbVbVbVbVenenbVgldPbVbVbVbVbVbVbwbwididhqlhhqididmXliljididhqlkhqidhqbVbVbVaaaaaaaaajaaajaaaaaaaaaaajaalmlmlDmzmhmGmKmMmLmOmNmPmGmRmQbVbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababbwbwbVbVbViYiYiYiYiYiYbVbVbwbwbwbwbwbwbwbwbwbVbVbVfffgffgcgcgcfgbVbVbVbVbVbVbVbVbVbVbVengngpbVbVbwbwabababababbwbVbVbVbVbVbVbVenffgcgrgsgcgcgcgcfgbVbVbwidmVmTmYmWidnplGlFlIlHidlJlLlKkNbVbVbVbVbVbVaaaaajaaajajajajajajajajajnamZmAnbnendndnfngngninhnknjbVbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababbwbVbVbVbVbVbVbVbVbVbVbVbwabababababababbwbwbVbVbVffgcgcgcfgfffgbVgldPbVbVgngcgcgcgcgpenbVbVbwbwababababababbwbwbVbVbVbVbVbVffgcgcgrgsgcgcgcfgenbVbVbVidnmnlnonnidnMnNnNlVnPidlWlYlXidbVbVbVbVbVbVajajajajajaaaaaaaaaaajaaaananqmBmhntnsnunsngngninhnknjbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababbwbVbVbVbVbVbVbVbVbVbwbwbwabababaeaeabababbwbwbwbVbVbVbVbVfffgffgcgrgsgcgcgpgngcgcgcgcgpbVbwbwababababababababbwbwbwbVbVbVbVbVbVbVdJdKbVbVbVenenbVbVbVkNidididididmimkmjmlnPidhqmmhqidbVbVbVbVbVbVaaaaajaaajaaaaaaaaaaajaalmlmnvmCmEmGnxnznynAmNmPmGnCnBbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababbwbwbwbwbVbVbVbVbwbwbwababaeaeaeaeaeaeaeabababbwbwbwbVbVbVbVffgcgcgrgsgcgcgcgpbVbVbVbVbVbVbwababababababaeaeabababbwbwbwbwbVbVbVbVbVbVbVbVbVenffgcfgbVbVbVbVbVbVkNidididididkNgTgTikmtbVbVbVbVbVaaaaaaajaaajaaaaaaaaaanDlmnEnGnFmDnHnanJnKnJnJnJnJnJnJbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabbwbVbVbVcYcYeeeeeeeeeeeehTgvhUhChBbwbwbwbwabababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaehKhOgGiCiOgHhKaeaeabababaaaaaaaaaaaaaaaaaaaaaaaaaabwbwbwbwgXgXbwbwbwbwbVbVenenbVbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeababbwbVbVbVbwhBhBhBhBhBhBhFgvhIhBhBhBbVbVbVbwababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegLgLgMaeidhKhKhKiPhKhKhKaeaeabababaaaaaaaaaaaaaaaaaaaaaaaabwbwbwbwbwgXgXbwbwbwbwbVbVenenbVbwbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabbwbVbVbwhBhBhBhBhBhBhBhFgvhIhBbVbVbVbVbVbwbwabababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegSgMgTaeidihiiidjVidbwbwabaeabababaaaaaaaaaaaaaaaaaaaaaabwbwbwbwbwbwgXgXbwbwbwbwbwbVenenbVbVbwbwbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeaeakaeaeaeaeaeaeaeaeababbwbVbwhBhBhBhBhBhBhBgVgvhIbVbVbVbVbVbVbVbwabababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegLcKaeidiogWhejVidbVbwbwababababaaaaaaaaaaaaaaaaaaaabwbwbwbwbwbwbwgXgXbwbwbwbwbwbVenenbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeababbwbwbwbwbwhBhBhBhBcYgtcYbVbVbVbVbVbVbVbwbwababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaehgaeaeididididjXidbVbVbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaabwbwbwbwbwbwgXgXbwbwbwbwbwbVenenbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababababababbwhBbVbVcYbVcYbVbVbVbVbVbVbVbVbwababaeaeaeaeaeaeaeaeaeaeaeaeaeakaeaeaeaeaeaeaeaeaeaeaeaeaeaeababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeizaeaeidihiAidjVhqbVbVbVbVbVbVbwbwaaaaaaaaaaaaaaaaaaaabwbwbwbwbwbwbwbwbwbwbwbwbVbVkukubVbVbVbVbVbwbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeababababababbwbVbVbVbVbVbVbVbVhrhrhrbVbVbVbwababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeababababababababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeizaeaeidiogWhsjVhqbVbVbVbVbVbVbVbVbVaaaaaaaaaaaaaaaaaabwbwbwbwbwbwbwbwbwbwbwbVbVbVkukubVbVbVbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaeaeaeaeaeaeaeaeaeaeaeaeaeababbwbwbwbwbwbwbVbVbVbVbVbVbVbVhthxhwbVbVbVbwababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababababbwbwbwbwbwbwbwabababababababaeaeaeaeaeaeaeaeaeaeididiTididididididjVhqbVbVbVbVbVbVbVbVbVbVbVaaaaaaaaaaaaaabwbwbwbwbwbwbwbwbwbVbVbVbVbVkukwkvbVbVbVbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaeaeaeaeaeaeaeaeaeaeaeaeabbwbwbVbViYiYiYiYiYiYhyhyhyhyiYiYiYiYhzbVbVbwababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeababababbwbwbVbVbVbVbVbwbwbwbwbwabababababababaeaeaeaeidididhAjbhEjdidihjeidjXidididhqhqhqidbVbVbVbVbVbVaaaaaaaaaaaaaabwbwbwbwbwbVbVbVbVbVbVbVbVkwkvkubVbVbVbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaeaeaeaeaeaeaeababbwbVbVbViYjkhHhGhyhLhNhMhShQhyjNhWhVdPbVbVbwbwbwbwababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababababbwbwbVbVbVbVbVbVbVbVbVbVbwbwbwbwbwabababababaeaeidjwhXjxjzjxhYidiogWhZjVidjBjCjDjDjDhqbVbVbVbVbVbVbVaaaaaaaaaaaaaabwbwbwbVbVbVbVbVbVbVbVkykykSkSjLjLbVbVbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaeaeaeaeaeaeababbwbVbVbViYjMjNjOhyieieieieifigjNhWijikbVbVbVbVbVbwbwbwabababababababaeaeaeaeaeaeaeaeaeaeaeabababbwbwbwbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVbwbwabababababaeidiljxjWimjYjZididididjVidjBkakakakbhqbVbVbVbVbVbVbVaaaaaaaaaaaaaabVbVbVbVbVbVbVbVbVbVbVkykfkUkUkVjLbVkibVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaababababababababaeaeaeababbwbVbVbViYiqjNjNirjNjNjNjNishyitiuhydKbVbVbVbVbVbVbVbwbwbwbwabababababaeaeaeaeaeaeaeaeababababbwbwbVbVbVbVbVbVbVbVbVbVgldPbVbVbVbVbVbVbwbwbwbwababaeidkojxivjxkrjxktkbiwiykFidkWkaiBkakGhqbVbVbVbVbVbVaaaaaaaaaaaaaaaaaaaabVbVbVbVbVkXkXkXkXkykYlbkelcjLjLjLjLllllbVbVbVbVbwbwbwbwgXgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababbwbwbVbViYkIjNkJiKiJiLkMjNiMiYiYiYiYiYgldPbVbVbVbVbVbVbVbVbwbwbwabababaeaeaeaeaeaeaeaeabababbwbwbVbVgngcgcgcgcgcgcgcgcgrgsgcgcgcgcfgbVbVbVbVbwbwababidididididididhqkHiNhqkHidididididkKididhqhqbVbVaaaaaaaaaaaaaaaaaaaaaaaaaabVbVlmlmkLlplolulslvkglwiclylxickhllbVbVbVbVcLbwbwbwbwbwgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababbwbVbViYlfjNjchyjfjhjgjNjijljjjmlqjngrgsgcgcgcgcgcfgbVbVbVbVbwbwbwababaeaeaeaeaeaeabababbwbwbVbVgngpgngcgcgcgcgcgcgcgrgsgcgcgcfgffgcfgbVbVbVbwabababababidjoltjpkakGjqkbkGktjrjskakbkGkakalAhqhqhqjtlClClClClClClBlBlBlBlBlBlmlmlmlElDlNlMlPlOlSkjkxkkkPkzkRkQllbVbVbVbVcLbwbwbwbwbwgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbwbVbViYiYiYiYiYjPlRjQiYiYjSjRjRjRjRgrgsgcgcgcgcfgffgcgcfgbVbVbVbwbwabababaeaeababababbwbwbVbVgngpgngpbVbVbVbVbVbVbVdJdKbVbVbVffgcfgenbVbVbVbVbwbwbwbwabididididjTkGjUkOkOiykckdkdkTkTkdkdlakZldkZlhlhlhlhlhlhlhlUlUlUlUlUlUlZmalZmbmamdmcicmpmrmqmuicmwmvicmxllbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbwbwbVbVbVbVbViYkAmskBkCiYkEkDhrbVbVdJdKbVbVbVbVffgcgcfgenbVbVbVbVbwbwbwababababababbwbwbVbVgngpgngpbVbVbVbVbwbVbVbVbVbVbVbVbVbVbVenenbVbVbVbVbVbVbVbwbwbwbwbwidkalkljlnlnljlzlJlIlnlnlKljlLhqhqhqmgmgmgmgmgmgmgmnmnmnmnmnmnlmlmlmnZlDmzmymGmGmHmGmGmGmGmGmGllllbVbVbVbVbVcLbwbwbwbwbwgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbwbwbVbVbVbViYmSlemUlgiYbVbVbVbVbVbVbVbVbVbVbVbVbVbVenfffgbVbVbVbVbVbwbwbwbwbwbwbwbwbVbVgngpgngpbVbVbwbwbwbwbwbwbwbVbVbVbVbVbVbVenenbVgldPbVbVbVbVbVbVbwbwididhqlQhqididmXlilTidididlWhqidhqbVbVbVaaaaaaaaajaaajaaaaaaaaaaajaalmlmlDmzmhmGmKmMmLmOmNmPmGmRmQbVbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababbwbwbVbVbViYiYiYiYiYiYbVbVbwbwbwbwbwbwbwbwbwbVbVbVfffgffgcgcgcfgbVbVbVbVbVbVbVbVbVbVbVengngpbVbVbwbwabababababbwbVbVbVbVbVbVbVenffgcgrgsgcgcgcgcfgbVbVbwidmVmTmYmWidnplGlFlXlHidlYmfmeidbVbVbVbVbVbVaaaaajaaajajajajajajajajajnamZmAnbnendndnfngngninhnknjbVbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababbwbVbVbVbVbVbVbVbVbVbVbVbwabababababababbwbwbVbVbVffgcgcgcfgfffgbVgldPbVbVgngcgcgcgcgpenbVbVbwbwababababababbwbwbVbVbVbVbVbVffgcgcgrgsgcgcgcfgenbVbVbVidnmnlnonnidnMnNnNlVnPidmmnynwidbVbVbVbVbVbVajajajajajaaaaaaaaaaajaaaananqmBmhntnsnunsngngninhnknjbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababbwbVbVbVbVbVbVbVbVbVbwbwbwabababaeaeabababbwbwbwbVbVbVbVbVfffgffgcgrgsgcgcgpgngcgcgcgcgpbVbwbwababababababababbwbwbwbVbVbVbVbVbVbVdJdKbVbVbVenenbVbVbVkNidididididmimkmjmlnPididnzhqkNbVbVbVbVbVbVaaaaajaaajaaaaaaaaaaajaalmlmnvmCmEmGnxnInAmOmNmPmGnCnBbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababbwbwbwbwbVbVbVbVbwbwbwababaeaeaeaeaeaeaeabababbwbwbwbVbVbVbVffgcgcgrgsgcgcgcgpbVbVbVbVbVbVbwababababababaeaeabababbwbwbwbwbVbVbVbVbVbVbVbVbVenffgcfgbVbVbVbVbVbVkNidididididkNnkouobmtbVbVbVbVbVaaaaaaajaaajaaaaaaaaaanDlmnEnGnFmDnHnanJnKnJnJnJnJnJnJbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababbwbwbwbwbwbwababababaeaeaeaeaeaeaeaeababababbwbwbwbwbVbVbVbVdJdKbVbVbVbVbVbVbwbwbwbwbwababababababaeaeaeabababababbwbwbwbwbwbwbwbwbVbVffgcfgfffgbVbVbVbVbVbVbVdJdLdLdLdLdLdLdKbVbVbVbVbVbVajajajajajajaaaaaaaaoznLlDnOlDlDmDnQnanRnTnSnVnUnXnWnYbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXgXgXbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaeaeaeaeaeaeaeaeaeaeaeaeabababababbwbwbVbVbVbVbVbVbVbVbVbwbwbwabababababababaeaeaeaeaeaeaeabababababababababababbwbwbVbVbVfffgfffgmJbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVaaaaaaaaajaaaaaaaaaalmlmlmnZlDmFoaodocofoeohogoioinYbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXgXgXbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeababababbwbwbwbVbVbVbwbwbwbwbwabababababaeaeaeaeaeaeaeaeaeaeaeaeaeababababababababababbwbVbVbVbVfffgffgcgcgcgcgcgcgcgcgcgcgcgcgcgcgcfgbVbVbVbVbVbVllaaaaajaaaaaaaaaaajaalmlmlDmDojolokomoioiononoonJbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 5dfcf2dc888..a488d39f836 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -345,4 +345,4 @@ #define BLOOD_STATE_NOT_BLOODY "no blood whatsoever" // The SQL version required by this version of the code -#define SQL_VERSION 0 +#define SQL_VERSION 1 diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index cfe37505e1c..ac17d0591c5 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -884,9 +884,16 @@ proc/sort_atoms_by_layer(var/list/atoms) icon = J return J return 0 - + //Hook, override to run code on- wait this is images //Images have dir without being an atom, so they get their own definition. //Lame. /image/proc/setDir(newdir) dir = newdir + +proc/rand_hex_color() + var/list/colors = list("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f") + var/color="" + for(var/i=0;i<6;i++) + color = color+pick(colors) + return "#[color]" diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 81f44db0e45..4f9c08a9dc5 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -60,7 +60,7 @@ return html_encode(sanitize_simple(t,repl_chars)) /proc/paranoid_sanitize(t) - var/regex/alphanum_only = regex("\[^a-zA-Z0-9# ]", "g") + var/regex/alphanum_only = regex("\[^a-zA-Z0-9# ,.?!:;()]", "g") return alphanum_only.Replace(t, "#") //Runs sanitize and strip_html_simple diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 51afe833ea3..16ee49696bc 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -27,9 +27,9 @@ client.click_intercept.InterceptClickOn(src, params, A) return - if(world.time <= next_click) + if(next_click > world.time) return - next_click = world.time + 1 + changeNext_click(1) if(control_disabled || stat) return diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index b4bb8292ca2..f30809d32ef 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -3,9 +3,36 @@ ~Sayu */ + +// THESE DO NOT AFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK +/mob/var/next_move_adjust = 0 //Amount to adjust action delays by, + or - +/mob/var/next_move_modifier = 1 //Value to multiply action delays by + +//Delays the mob's next action by num deciseconds +// eg: 10-3 = 7 deciseconds of delay +// eg: 10*0.5 = 5 deciseconds of delay +// DOES NOT EFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK + +/mob/proc/changeNext_move(num) + next_move = world.time + ((num+next_move_adjust)*next_move_modifier) + // 1 decisecond click delay (above and beyond mob/next_move) +//This is mainly modified by click code, to modify click delays elsewhere, use next_move and changeNext_move() /mob/var/next_click = 0 +// THESE DO AFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK +/mob/var/next_click_adjust = 0 +/mob/var/next_click_modifier = 1 //Value to multiply click delays by + +//Delays the mob's next click by num deciseconds +// eg: 10-3 = 7 deciseconds of delay +// eg: 10*0.5 = 5 deciseconds of delay +// DOES NOT EFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK + +/mob/proc/changeNext_click(num) + next_click = world.time + ((num+next_click_adjust)*next_click_modifier) + + /* Before anything else, defer these calls to a per-mobtype handler. This allows us to remove istype() spaghetti code, but requires the addition of other handler procs to simplify it. @@ -38,9 +65,9 @@ client.click_intercept.InterceptClickOn(src, params, A) return - if(world.time <= next_click) + if(next_click > world.time) return - next_click = world.time + 1 + changeNext_click(1) var/list/modifiers = params2list(params) if(modifiers["shift"] && modifiers["ctrl"]) @@ -136,9 +163,6 @@ return -/mob/proc/changeNext_move(num) - next_move = world.time + num - // Default behavior: ignore double clicks, consider them normal clicks instead /mob/proc/DblClickOn(var/atom/A, var/params) return @@ -201,7 +225,7 @@ /mob/living/carbon/MiddleClickOn(var/atom/A) if(!src.stat && src.mind && src.mind.changeling && src.mind.changeling.chosen_sting && (istype(A, /mob/living/carbon)) && (A != src)) - next_click = world.time + 5 + changeNext_click(5) mind.changeling.chosen_sting.try_to_sting(src, A) else ..() @@ -256,7 +280,7 @@ /mob/living/carbon/AltClickOn(var/atom/A) if(!src.stat && src.mind && src.mind.changeling && src.mind.changeling.chosen_sting && (istype(A, /mob/living/carbon)) && (A != src)) - next_click = world.time + 5 + changeNext_click(5) mind.changeling.chosen_sting.try_to_sting(src, A) else ..() diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index a8de6127c41..631044f5c97 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -11,9 +11,9 @@ client.click_intercept.InterceptClickOn(src, params, A) return - if(world.time <= next_click) + if(next_click > world.time) return - next_click = world.time + 1 + changeNext_click(1) var/list/modifiers = params2list(params) diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 35e5c04d112..d611396a45a 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -384,7 +384,7 @@ var/record_id_num = 1001 // Proper Skin color - Fix, you can't have HAS_SKIN_TONE *and* HAS_SKIN_COLOR if(H.species.bodyflags & HAS_SKIN_COLOR) - preview_icon.Blend(rgb(H.r_skin, H.g_skin, H.b_skin), ICON_ADD) + preview_icon.Blend(H.skin_colour, ICON_ADD) //Tail Markings var/icon/t_marking_s @@ -402,10 +402,7 @@ var/record_id_num = 1001 var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = H.species ? H.species.eyes : "eyes_s") if(!eyes_organ) return - var/eye_red = eyes_organ.eye_colour[1] - var/eye_green = eyes_organ.eye_colour[2] - var/eye_blue = eyes_organ.eye_colour[3] - eyes_s.Blend(rgb(eye_red, eye_green, eye_blue), ICON_ADD) + eyes_s.Blend(eyes_organ.eye_colour, ICON_ADD) face_s.Blend(eyes_s, ICON_OVERLAY) var/datum/sprite_accessory/hair_style = hair_styles_list[head_organ.h_style] @@ -414,14 +411,14 @@ var/record_id_num = 1001 // I'll want to make a species-specific proc for this sooner or later // But this'll do for now if(head_organ.species.name == "Slime People") - hair_s.Blend(rgb(H.r_skin, H.g_skin, H.b_skin, 160), ICON_AND) + hair_s.Blend("[H.skin_colour]A0", ICON_AND) //A0 = 160 alpha. else - hair_s.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD) + hair_s.Blend(head_organ.hair_colour, ICON_ADD) if(hair_style.secondary_theme) var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s") if(!hair_style.no_sec_colour) - hair_secondary_s.Blend(rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec), ICON_ADD) + hair_secondary_s.Blend(head_organ.sec_hair_colour, ICON_ADD) hair_s.Blend(hair_secondary_s, ICON_OVERLAY) face_s.Blend(hair_s, ICON_OVERLAY) @@ -431,21 +428,21 @@ var/record_id_num = 1001 var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[head_organ.ha_style] if(head_accessory_style && head_accessory_style.species_allowed) var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s") - head_accessory_s.Blend(rgb(head_organ.r_headacc, head_organ.g_headacc, head_organ.b_headacc), ICON_ADD) + head_accessory_s.Blend(head_organ.headacc_colour, ICON_ADD) face_s.Blend(head_accessory_s, ICON_OVERLAY) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[head_organ.f_style] if(facial_hair_style && facial_hair_style.species_allowed) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(head_organ.species.name == "Slime People") - facial_s.Blend(rgb(H.r_skin, H.g_skin, H.b_skin, 160), ICON_ADD) + facial_s.Blend("[H.skin_colour]A0", ICON_ADD) //A0 = 160 alpha. else - facial_s.Blend(rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial), ICON_ADD) + facial_s.Blend(head_organ.facial_colour, ICON_ADD) if(facial_hair_style.secondary_theme) var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s") if(!facial_hair_style.no_sec_colour) - facial_secondary_s.Blend(rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec), ICON_ADD) + facial_secondary_s.Blend(head_organ.sec_facial_colour, ICON_ADD) facial_s.Blend(facial_secondary_s, ICON_OVERLAY) face_s.Blend(facial_s, ICON_OVERLAY) @@ -614,7 +611,7 @@ var/record_id_num = 1001 if(H.body_accessory.pixel_y_offset) temp.Shift(NORTH, H.body_accessory.pixel_y_offset) if(H.species.bodyflags & HAS_SKIN_COLOR) - temp.Blend(rgb(H.r_skin, H.g_skin, H.b_skin), H.body_accessory.blend_mode) + temp.Blend(H.skin_colour, H.body_accessory.blend_mode) if(t_marking_s) temp.Blend(t_marking_s, ICON_OVERLAY) preview_icon.Blend(temp, ICON_OVERLAY) diff --git a/code/datums/spell.dm b/code/datums/spell.dm index d32d5bac058..6dba2d9990b 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -13,7 +13,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin to_chat(user, "[user.ranged_ability.name] has been disabled.") user.ranged_ability.remove_ranged_ability(user) return TRUE //TRUE for failed, FALSE for passed. - user.next_click = world.time + CLICK_CD_CLICK_ABILITY + user.changeNext_click(CLICK_CD_CLICK_ABILITY) user.face_atom(A) return FALSE diff --git a/code/datums/spells/cluwne.dm b/code/datums/spells/cluwne.dm index fe0e02bda6d..a3b730cec77 100644 --- a/code/datums/spells/cluwne.dm +++ b/code/datums/spells/cluwne.dm @@ -13,7 +13,11 @@ /mob/living/carbon/human/proc/makeCluwne() to_chat(src, "You feel funny.") - adjustBrainLoss(80) + if(!get_int_organ(/obj/item/organ/internal/brain/cluwne)) + var/obj/item/organ/internal/brain/cluwne/idiot_brain = new + idiot_brain.insert(src, make_cluwne = 0) + idiot_brain.dna = dna.Clone() + setBrainLoss(80) nutrition = 9000 overeatduration = 9000 Confused(30) @@ -25,8 +29,7 @@ mutations.Add(NERVOUS) dna.SetSEState(NERVOUSBLOCK, 1, 1) genemutcheck(src, NERVOUSBLOCK, null, MUTCHK_FORCED) - - animate_clownspell(src) + rename_character(real_name, "cluwne") unEquip(w_uniform, 1) unEquip(shoes, 1) @@ -37,7 +40,6 @@ equip_to_slot_if_possible(new /obj/item/clothing/gloves/cursedclown, slot_gloves, 1, 1, 1) equip_to_slot_if_possible(new /obj/item/clothing/mask/cursedclown, slot_wear_mask, 1, 1, 1) equip_to_slot_if_possible(new /obj/item/clothing/shoes/cursedclown, slot_shoes, 1, 1, 1) - real_name = "cluwne" /mob/living/carbon/human/proc/makeAntiCluwne() to_chat(src, "You don't feel very funny.") @@ -51,8 +53,7 @@ var/obj/item/organ/internal/honktumor/cursed/tumor = get_int_organ(/obj/item/organ/internal/honktumor/cursed) if(tumor) - tumor.remove(src, clean_remove = 1) - qdel(tumor) + tumor.remove(src) else mutations.Remove(CLUMSY) mutations.Remove(COMICBLOCK) @@ -64,8 +65,6 @@ dna.SetSEState(NERVOUSBLOCK, 0) genemutcheck(src, NERVOUSBLOCK, null, MUTCHK_FORCED) - animate_clownspell(src) - var/obj/item/clothing/under/U = w_uniform unEquip(w_uniform, 1) if(U) diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index a9e0c49a122..f21c2948b01 100644 --- a/code/game/dna/dna2.dm +++ b/code/game/dna/dna2.dm @@ -159,9 +159,9 @@ var/global/list/bad_blocks[0] head_traits_to_dna(H) eye_color_to_dna(eyes_organ) - SetUIValueRange(DNA_UI_SKIN_R, character.r_skin, 255, 1) - SetUIValueRange(DNA_UI_SKIN_G, character.g_skin, 255, 1) - SetUIValueRange(DNA_UI_SKIN_B, character.b_skin, 255, 1) + SetUIValueRange(DNA_UI_SKIN_R, color2R(character.skin_colour), 255, 1) + SetUIValueRange(DNA_UI_SKIN_G, color2G(character.skin_colour), 255, 1) + SetUIValueRange(DNA_UI_SKIN_B, color2B(character.skin_colour), 255, 1) SetUIValueRange(DNA_UI_HEAD_MARK_R, color2R(character.m_colours["head"]), 255, 1) SetUIValueRange(DNA_UI_HEAD_MARK_G, color2G(character.m_colours["head"]), 255, 1) diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 8a0894bfe09..01424b35934 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -140,9 +140,7 @@ dna.write_eyes_attributes(eye_organ) H.update_eyes() - H.r_skin = dna.GetUIValueRange(DNA_UI_SKIN_R, 255) - H.g_skin = dna.GetUIValueRange(DNA_UI_SKIN_G, 255) - H.b_skin = dna.GetUIValueRange(DNA_UI_SKIN_B, 255) + H.skin_colour = rgb(dna.GetUIValueRange(DNA_UI_SKIN_R, 255), dna.GetUIValueRange(DNA_UI_SKIN_G, 255), dna.GetUIValueRange(DNA_UI_SKIN_B, 255)) H.m_colours["head"] = rgb(dna.GetUIValueRange(DNA_UI_HEAD_MARK_R, 255), dna.GetUIValueRange(DNA_UI_HEAD_MARK_G, 255), dna.GetUIValueRange(DNA_UI_HEAD_MARK_B, 255)) H.m_colours["body"] = rgb(dna.GetUIValueRange(DNA_UI_BODY_MARK_R, 255), dna.GetUIValueRange(DNA_UI_BODY_MARK_G, 255), dna.GetUIValueRange(DNA_UI_BODY_MARK_B, 255)) @@ -191,43 +189,27 @@ if((hair > 0) && (hair <= hair_styles_list.len)) head_organ.h_style = hair_styles_list[hair] - head_organ.r_hair = GetUIValueRange(DNA_UI_HAIR_R, 255) - head_organ.g_hair = GetUIValueRange(DNA_UI_HAIR_G, 255) - head_organ.b_hair = GetUIValueRange(DNA_UI_HAIR_B, 255) - - head_organ.r_hair_sec = GetUIValueRange(DNA_UI_HAIR2_R, 255) - head_organ.g_hair_sec = GetUIValueRange(DNA_UI_HAIR2_G, 255) - head_organ.b_hair_sec = GetUIValueRange(DNA_UI_HAIR2_B, 255) + head_organ.hair_colour = rgb(head_organ.dna.GetUIValueRange(DNA_UI_HAIR_R, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR_G, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR_B, 255)) + head_organ.sec_hair_colour = rgb(head_organ.dna.GetUIValueRange(DNA_UI_HAIR2_R, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR2_G, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR2_B, 255)) //Facial Hair var/beard = GetUIValueRange(DNA_UI_BEARD_STYLE,facial_hair_styles_list.len) if((beard > 0) && (beard <= facial_hair_styles_list.len)) head_organ.f_style = facial_hair_styles_list[beard] - head_organ.r_facial = GetUIValueRange(DNA_UI_BEARD_R, 255) - head_organ.g_facial = GetUIValueRange(DNA_UI_BEARD_G, 255) - head_organ.b_facial = GetUIValueRange(DNA_UI_BEARD_B, 255) - - head_organ.r_facial_sec = GetUIValueRange(DNA_UI_BEARD2_R, 255) - head_organ.g_facial_sec = GetUIValueRange(DNA_UI_BEARD2_G, 255) - head_organ.b_facial_sec = GetUIValueRange(DNA_UI_BEARD2_B, 255) + head_organ.facial_colour = rgb(head_organ.dna.GetUIValueRange(DNA_UI_BEARD_R, 255), head_organ.dna.GetUIValueRange(DNA_UI_BEARD_G, 255), head_organ.dna.GetUIValueRange(DNA_UI_BEARD_B, 255)) + head_organ.sec_facial_colour = rgb(head_organ.dna.GetUIValueRange(DNA_UI_BEARD2_R, 255), head_organ.dna.GetUIValueRange(DNA_UI_BEARD2_G, 255), head_organ.dna.GetUIValueRange(DNA_UI_BEARD2_B, 255)) //Head Accessories var/headacc = GetUIValueRange(DNA_UI_HACC_STYLE,head_accessory_styles_list.len) if((headacc > 0) && (headacc <= head_accessory_styles_list.len)) head_organ.ha_style = head_accessory_styles_list[headacc] - head_organ.r_headacc = GetUIValueRange(DNA_UI_HACC_R, 255) - head_organ.g_headacc = GetUIValueRange(DNA_UI_HACC_G, 255) - head_organ.b_headacc = GetUIValueRange(DNA_UI_HACC_B, 255) + head_organ.headacc_colour = rgb(head_organ.dna.GetUIValueRange(DNA_UI_HACC_R, 255), head_organ.dna.GetUIValueRange(DNA_UI_HACC_G, 255), head_organ.dna.GetUIValueRange(DNA_UI_HACC_B, 255)) // This proc gives the DNA info for eye color to the given eyes /datum/dna/proc/write_eyes_attributes(obj/item/organ/internal/eyes/eyes_organ) - var/red = GetUIValueRange(DNA_UI_EYES_R, 255) - var/green = GetUIValueRange(DNA_UI_EYES_G, 255) - var/blue = GetUIValueRange(DNA_UI_EYES_B, 255) - if(eyes_organ) - eyes_organ.eye_colour = list(red, green, blue) + eyes_organ.eye_colour = rgb(eyes_organ.dna.GetUIValueRange(DNA_UI_EYES_R, 255), eyes_organ.dna.GetUIValueRange(DNA_UI_EYES_G, 255), eyes_organ.dna.GetUIValueRange(DNA_UI_EYES_B, 255)) /* TRAIT CHANGING PROCS @@ -237,50 +219,47 @@ // In absence of eyes, possibly randomize the eye color DNA? return - var/eye_red = eyes_organ.eye_colour[1] - var/eye_green = eyes_organ.eye_colour[2] - var/eye_blue = eyes_organ.eye_colour[3] - SetUIValueRange(DNA_UI_EYES_R, eye_red, 255, 1) - SetUIValueRange(DNA_UI_EYES_G, eye_green, 255, 1) - SetUIValueRange(DNA_UI_EYES_B, eye_blue, 255, 1) + SetUIValueRange(DNA_UI_EYES_R, color2R(eyes_organ.eye_colour), 255, 1) + SetUIValueRange(DNA_UI_EYES_G, color2G(eyes_organ.eye_colour), 255, 1) + SetUIValueRange(DNA_UI_EYES_B, color2B(eyes_organ.eye_colour), 255, 1) -/datum/dna/proc/head_traits_to_dna(obj/item/organ/external/head/H) - if(!H) +/datum/dna/proc/head_traits_to_dna(obj/item/organ/external/head/head_organ) + if(!head_organ) log_runtime(EXCEPTION("Attempting to reset DNA from a missing head!"), src) return - if(!H.h_style) - H.h_style = "Skinhead" - var/hair = hair_styles_list.Find(H.h_style) + if(!head_organ.h_style) + head_organ.h_style = "Skinhead" + var/hair = hair_styles_list.Find(head_organ.h_style) // Facial Hair - if(!H.f_style) - H.f_style = "Shaved" - var/beard = facial_hair_styles_list.Find(H.f_style) + if(!head_organ.f_style) + head_organ.f_style = "Shaved" + var/beard = facial_hair_styles_list.Find(head_organ.f_style) // Head Accessory - if(!H.ha_style) - H.ha_style = "None" - var/headacc = head_accessory_styles_list.Find(H.ha_style) + if(!head_organ.ha_style) + head_organ.ha_style = "None" + var/headacc = head_accessory_styles_list.Find(head_organ.ha_style) - SetUIValueRange(DNA_UI_HAIR_R, H.r_hair, 255, 1) - SetUIValueRange(DNA_UI_HAIR_G, H.g_hair, 255, 1) - SetUIValueRange(DNA_UI_HAIR_B, H.b_hair, 255, 1) + SetUIValueRange(DNA_UI_HAIR_R, color2R(head_organ.hair_colour), 255, 1) + SetUIValueRange(DNA_UI_HAIR_G, color2G(head_organ.hair_colour), 255, 1) + SetUIValueRange(DNA_UI_HAIR_B, color2B(head_organ.hair_colour), 255, 1) - SetUIValueRange(DNA_UI_HAIR2_R, H.r_hair_sec, 255, 1) - SetUIValueRange(DNA_UI_HAIR2_G, H.g_hair_sec, 255, 1) - SetUIValueRange(DNA_UI_HAIR2_B, H.b_hair_sec, 255, 1) + SetUIValueRange(DNA_UI_HAIR2_R, color2R(head_organ.sec_hair_colour), 255, 1) + SetUIValueRange(DNA_UI_HAIR2_G, color2G(head_organ.sec_hair_colour), 255, 1) + SetUIValueRange(DNA_UI_HAIR2_B, color2B(head_organ.sec_hair_colour), 255, 1) - SetUIValueRange(DNA_UI_BEARD_R, H.r_facial, 255, 1) - SetUIValueRange(DNA_UI_BEARD_G, H.g_facial, 255, 1) - SetUIValueRange(DNA_UI_BEARD_B, H.b_facial, 255, 1) + SetUIValueRange(DNA_UI_BEARD_R, color2R(head_organ.facial_colour), 255, 1) + SetUIValueRange(DNA_UI_BEARD_G, color2G(head_organ.facial_colour), 255, 1) + SetUIValueRange(DNA_UI_BEARD_B, color2B(head_organ.facial_colour), 255, 1) - SetUIValueRange(DNA_UI_BEARD2_R, H.r_facial_sec, 255, 1) - SetUIValueRange(DNA_UI_BEARD2_G, H.g_facial_sec, 255, 1) - SetUIValueRange(DNA_UI_BEARD2_B, H.b_facial_sec, 255, 1) + SetUIValueRange(DNA_UI_BEARD2_R, color2R(head_organ.sec_facial_colour), 255, 1) + SetUIValueRange(DNA_UI_BEARD2_G, color2G(head_organ.sec_facial_colour), 255, 1) + SetUIValueRange(DNA_UI_BEARD2_B, color2B(head_organ.sec_facial_colour), 255, 1) - SetUIValueRange(DNA_UI_HACC_R, H.r_headacc, 255, 1) - SetUIValueRange(DNA_UI_HACC_G, H.g_headacc, 255, 1) - SetUIValueRange(DNA_UI_HACC_B, H.b_headacc, 255, 1) + SetUIValueRange(DNA_UI_HACC_R, color2R(head_organ.headacc_colour), 255, 1) + SetUIValueRange(DNA_UI_HACC_G, color2G(head_organ.headacc_colour), 255, 1) + SetUIValueRange(DNA_UI_HACC_B, color2B(head_organ.headacc_colour), 255, 1) SetUIValueRange(DNA_UI_HAIR_STYLE, hair, hair_styles_list.len, 1) SetUIValueRange(DNA_UI_BEARD_STYLE, beard, facial_hair_styles_list.len, 1) diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index 32a6a58cbb3..cbacd5faf00 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -45,16 +45,9 @@ else M.change_gender(FEMALE) - var/eyes_red = 0 - var/eyes_green = 0 - var/eyes_blue = 0 - if(eyes_organ) - eyes_red = eyes_organ.eye_colour[1] - eyes_green = eyes_organ.eye_colour[2] - eyes_blue = eyes_organ.eye_colour[3] - var/new_eyes = input("Please select eye color.", "Character Generation", rgb(eyes_red,eyes_green,eyes_blue)) as null|color + var/new_eyes = input("Please select eye color.", "Character Generation", eyes_organ.eye_colour) as null|color if(new_eyes) - M.change_eye_color(color2R(new_eyes), color2G(new_eyes), color2B(new_eyes)) + M.change_eye_color(new_eyes) //Alt heads. if(head_organ.species.bodyflags & HAS_ALT_HEADS) @@ -71,15 +64,15 @@ if(new_style) M.change_hair(new_style) - var/new_hair = input("Please select hair color.", "Character Generation", rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair)) as null|color + var/new_hair = input("Please select hair color.", "Character Generation", head_organ.hair_colour) as null|color if(new_hair) - M.change_hair_color(color2R(new_hair), color2G(new_hair), color2B(new_hair)) + M.change_hair_color(new_hair) var/datum/sprite_accessory/hair_style = hair_styles_list[head_organ.h_style] if(hair_style.secondary_theme && !hair_style.no_sec_colour) - new_hair = input("Please select secondary hair color.", "Character Generation", rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec)) as null|color + new_hair = input("Please select secondary hair color.", "Character Generation", head_organ.sec_hair_colour) as null|color if(new_hair) - M.change_hair_color(color2R(new_hair), color2G(new_hair), color2B(new_hair), 1) + M.change_hair_color(new_hair, 1) // facial hair var/list/valid_facial_hairstyles = M.generate_valid_facial_hairstyles() @@ -88,15 +81,15 @@ if(new_style) M.change_facial_hair(new_style) - var/new_facial = input("Please select facial hair color.", "Character Generation", rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial)) as null|color + var/new_facial = input("Please select facial hair color.", "Character Generation", head_organ.facial_colour) as null|color if(new_facial) - M.change_facial_hair_color(color2R(new_facial), color2G(new_facial), color2B(new_facial)) + M.change_facial_hair_color(new_facial) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[head_organ.f_style] if(facial_hair_style.secondary_theme && !facial_hair_style.no_sec_colour) - new_facial = input("Please select secondary facial hair color.", "Character Generation", rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec)) as null|color + new_facial = input("Please select secondary facial hair color.", "Character Generation", head_organ.sec_facial_colour) as null|color if(new_facial) - M.change_facial_hair_color(color2R(new_facial), color2G(new_facial), color2B(new_facial), 1) + M.change_facial_hair_color(new_facial, 1) //Head accessory. if(head_organ.species.bodyflags & HAS_HEAD_ACCESSORY) @@ -105,9 +98,9 @@ if(new_head_accessory) M.change_head_accessory(new_head_accessory) - var/new_head_accessory_colour = input("Please select head accessory colour.", "Character Generation", rgb(head_organ.r_headacc, head_organ.g_headacc, head_organ.b_headacc)) as null|color + var/new_head_accessory_colour = input("Please select head accessory colour.", "Character Generation", head_organ.headacc_colour) as null|color if(new_head_accessory_colour) - M.change_head_accessory_color(color2R(new_head_accessory_colour), color2G(new_head_accessory_colour), color2B(new_head_accessory_colour)) + M.change_head_accessory_color(new_head_accessory_colour) //Body accessory. if(M.species.tail && M.species.bodyflags & HAS_TAIL) @@ -174,9 +167,9 @@ //Skin colour. if(M.species.bodyflags & HAS_SKIN_COLOR) - var/new_body_colour = input("Please select body colour.", "Character Generation", rgb(M.r_skin, M.g_skin, M.b_skin)) as null|color + var/new_body_colour = input("Please select body colour.", "Character Generation", M.skin_colour) as null|color if(new_body_colour) - M.change_skin_color(color2R(new_body_colour), color2G(new_body_colour), color2B(new_body_colour)) + M.change_skin_color(new_body_colour) M.update_dna() diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 6509f8c59a1..7f8a7c4a3dc 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -573,5 +573,5 @@ proc/display_roundstart_logout_report() to_chat(M, "You suddenly remember \an [adjective] note you received earlier informing you that a chance to [action_words] may present itself today. An agent of the [organization] may contact you for help.") to_chat(M, "The note had the words \"[my_word]\" and \"[my_reply]\" written at the bottom, which you memorized just in case.") - to_chat(M, "You are NOT an antagonist, so self-antagging rules still apply to you. Use your good judgement and ahelp if you are unsure of what you are allowed to do.") + to_chat(M, "Unless stated otherwise; you are NOT an antagonist, so self-antagging rules may still apply to you. Use your good judgement and ahelp if you are unsure of what you are allowed to do.") M.mind.store_memory("Important Words: \"[my_word]\", \"[my_reply]\"") diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 680cb183e86..5e25103aeb8 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -1,16 +1,18 @@ ////Deactivated swarmer shell//// -/obj/item/unactivated_swarmer +/obj/item/device/unactivated_swarmer name = "unactivated swarmer" desc = "A currently unactivated swarmer. Swarmers can self activate at any time, it would be wise to immediately dispose of this." icon = 'icons/mob/swarmer.dmi' icon_state = "swarmer_unactivated" origin_tech = "bluespace=4;materials=4;programming=7" + materials = list(MAT_METAL=100, MAT_GLASS=400) -/obj/item/unactivated_swarmer/New() - notify_ghosts("An unactivated swarmer has been created in [get_area(src)]!", enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK) +/obj/item/device/unactivated_swarmer/New() + if(!crit_fail) + notify_ghosts("An unactivated swarmer has been created in [get_area(src)]!", enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK) ..() -/obj/item/unactivated_swarmer/Topic(href, href_list) +/obj/item/device/unactivated_swarmer/Topic(href, href_list) if(..()) return 1 if(href_list["ghostjoin"]) @@ -18,10 +20,29 @@ if(istype(ghost)) attack_ghost(ghost) -/obj/item/unactivated_swarmer/attack_ghost(mob/user as mob) +/obj/item/device/unactivated_swarmer/attackby(obj/item/weapon/W, mob/user, params) + ..() + if(istype(W, /obj/item/weapon/screwdriver) && !crit_fail) + user.visible_message("[usr.name] deactivates [src].", + "After some fiddling, you find a way to disable [src]'s power source.", + "You hear clicking.") + name = "deactivated swarmer" + desc = "A shell of swarmer that was completely powered down. It can no longer activate itself." + crit_fail = 1 + +/obj/item/device/unactivated_swarmer/attack_ghost(mob/user as mob) + + if(crit_fail) + to_chat(user, "This swarmer shell is completely depowered. You cannot activate it.") + return + var/be_swarmer = alert("Become a swarmer? (Warning, You can no longer be cloned!)",,"Yes","No") if(be_swarmer == "No") return + + if(crit_fail)//in case it depowers while ghost is looking at yes/no + to_chat(user, "This swarmer shell is completely depowered. You cannot activate it.") + return if(qdeleted(src)) to_chat(user, "Swarmer has been occupied by someone else.") return @@ -29,6 +50,18 @@ S.key = user.key qdel(src) +/obj/item/device/unactivated_swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + if(S.resources + 50 > S.max_resources) + to_chat(S, "We have too many resources to reconsume this shell. Aborting.") + else + ..() + S.resources += 49 //refund the whole thing + +/obj/item/device/unactivated_swarmer/deactivated + name = "deactivated swarmer" + desc = "A shell of swarmer that was completely powered down. It no longer can activate itself." + crit_fail = 1 + ////The Mob itself//// /mob/living/simple_animal/hostile/swarmer @@ -64,20 +97,24 @@ mob_size = MOB_SIZE_TINY ventcrawler = 2 ranged = 1 + light_color = LIGHT_COLOR_CYAN ranged_cooldown_time = 20 universal_speak = 0 universal_understand = 0 projectilesound = 'sound/weapons/taser2.ogg' AIStatus = AI_OFF var/resources = 0 //Resource points, generated by consuming metal/glass + var/max_resources = 100 loot = list(/obj/effect/decal/cleanable/blood/gibs/robot, /obj/item/weapon/ore/bluespace_crystal/artificial) + deathmessage = "The swarmer explodes with a sharp pop!" del_on_death = 1 /mob/living/simple_animal/hostile/swarmer/Login() ..() to_chat(src, "You are a swarmer, a weapon of a long dead civilization. Until further orders from your original masters are received, you must continue to consume and replicate.") - to_chat(src, "Ctrl + Click provides most of your swarmer specific interactions, such as cannibalizing metal or glass, destroying the environment, or teleporting mobs away from you.") - to_chat(src, "Objectives:") + to_chat(src, "Clicking on any object will try to consume it, either deconstructing it into its components, destroying it, or integrating any materials it has into you if successful.") + to_chat(src, "Ctrl-Clicking on a mob will attempt to remove it from the area and place it in a safe environment for storage.") + to_chat(src, "Prime Directives:") to_chat(src, "1. Consume resources and replicate until there are no more resources left.") to_chat(src, "2. Ensure that the station is fit for invasion at a later date, do not perform actions that would render it dangerous or inhospitable.") to_chat(src, "3. Biological and Sentient resources will be harvested at a later date, do not harm them.") @@ -110,7 +147,14 @@ real_name = "Swarmer [rand(100,999)]-[pick("kappa","sigma","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]" name = real_name + ////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S//// +/mob/living/simple_animal/hostile/swarmer/AttackingTarget() + if(!isliving(target)) + target.swarmer_act(src) + else + ..() + /mob/living/simple_animal/hostile/swarmer/CtrlClickOn(atom/A) face_atom(A) if(!isturf(loc)) @@ -248,6 +292,7 @@ /mob/living/carbon/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This biological resource is somehow resisting our bluespace transceiver. Aborting.") + ////END CTRL CLICK FOR SWARMERS//// /mob/living/simple_animal/hostile/swarmer/proc/Fabricate(var/atom/fabrication_object,var/fabrication_cost = 0) @@ -262,7 +307,7 @@ return 1 /mob/living/simple_animal/hostile/swarmer/proc/Integrate(var/obj/item/target) - if(resources >= 100) + if(resources >= max_resources) to_chat(src, "We cannot hold more materials!") return //Check if any entries are either MAT_METAL or MAT_GLASS @@ -308,7 +353,7 @@ var/pressure = A.return_pressure() if((pressure > 20) && (pressure < 550))//Account for crushing pressure or vaccuums if(ishuman(target))//If we're getting rid of a human, slap some zipties on them to keep them away from us a little longer - var/obj/item/weapon/restraints/handcuffs/cable/zipties/Z = new /obj/item/weapon/restraints/handcuffs/cable/zipties(src) + var/obj/item/weapon/restraints/handcuffs/energy/used/Z = new /obj/item/weapon/restraints/handcuffs/energy/used(src) Z.apply_cuffs(target, src) do_teleport(target, F, 0) playsound(src,'sound/effects/sparks4.ogg',50,1) @@ -355,6 +400,12 @@ light_range = 1 mouse_opacity = 1 var/health = 30 + light_color = LIGHT_COLOR_CYAN + var/lon_range = 1 + +/obj/structure/swarmer/New() + . = ..() + set_light(lon_range) /obj/structure/swarmer/disintegration icon_state = "disintegrate" @@ -422,6 +473,7 @@ desc = "A quickly assembled trap that electrifies living beings and overwhelms machine sensors. Will not retain its form if damaged enough." icon_state = "trap" light_range = 1 + light_color = LIGHT_COLOR_CYAN health = 10 /obj/structure/swarmer/trap/Crossed(var/atom/movable/AM) @@ -462,6 +514,7 @@ desc = "A quickly assembled energy blockade. Will not retain its form if damaged enough, but disabler beams and swarmers pass right through." icon_state = "barricade" light_range = 1 + light_color = LIGHT_COLOR_CYAN health = 50 density = 1 anchored = 1 @@ -484,7 +537,7 @@ to_chat(src, "This is not a suitable location for replicating ourselves. We need more room.") return if(do_mob(src, src, 100)) - if(Fabricate(/obj/item/unactivated_swarmer, 50)) + if(Fabricate(/obj/item/device/unactivated_swarmer, 50)) playsound(loc,'sound/items/poster_being_created.ogg',50, 1, -1) /mob/living/simple_animal/hostile/swarmer/proc/RepairSelf() diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm index 7a16ef17857..ba461fafb80 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm @@ -15,7 +15,7 @@ return 0 if(!the_gateway) return 0 - new /obj/item/unactivated_swarmer(get_turf(the_gateway)) + new /obj/item/device/unactivated_swarmer(get_turf(the_gateway)) /datum/event/spawn_swarmer/proc/find_swarmer() diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index c9c947b82c5..b68736f90b8 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -153,13 +153,11 @@ proc/issyndicate(mob/living/M as mob) var/hair_c = pick("#8B4513","#000000","#FF4500","#FFD700") // Brown, black, red, blonde var/eye_c = pick("#000000","#8B4513","1E90FF") // Black, brown, blue var/skin_tone = pick(-50, -30, -10, 0, 0, 0, 10) // Caucasian/black - head_organ.r_facial = color2R(hair_c) - head_organ.g_facial = color2G(hair_c) - head_organ.b_facial = color2B(hair_c) - head_organ.r_hair = color2R(hair_c) - head_organ.g_hair = color2G(hair_c) - head_organ.b_hair = color2B(hair_c) - M.change_eye_color(color2R(eye_c), color2G(eye_c), color2B(eye_c)) + head_organ.facial_colour = hair_c + head_organ.sec_facial_colour = hair_c + head_organ.hair_colour = hair_c + head_organ.sec_hair_colour = hair_c + M.change_eye_color(eye_c) M.s_tone = skin_tone head_organ.h_style = random_hair_style(M.gender, head_organ.species.name) head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name) diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index ce410dea69e..477321a69ec 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -112,9 +112,9 @@ id = /obj/item/weapon/card/id/engineering pda = /obj/item/device/pda/atmos - backpack = /obj/item/weapon/storage/backpack/industrial - satchel = /obj/item/weapon/storage/backpack/satchel_eng - dufflebag = /obj/item/weapon/storage/backpack/duffel/engineering + backpack = /obj/item/weapon/storage/backpack/industrial + satchel = /obj/item/weapon/storage/backpack/satchel_eng + dufflebag = /obj/item/weapon/storage/backpack/duffel/atmos box = /obj/item/weapon/storage/box/engineer /datum/job/mechanic diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index c7c785dd97a..ccfa885a5d2 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -469,6 +469,7 @@ occupant.update_body() domutcheck(occupant) //Waiting until they're out before possible notransform. occupant.shock_stage = 0 //Reset Shock + occupant.special_post_clone_handling() occupant = null update_icon() diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 2cb5b8a46a2..36647ebfc16 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -46,6 +46,12 @@ M.unset_machine() //to properly reset the view of the users if the console is deleted. return ..() +/obj/machinery/computer/security/proc/isCameraFarAway(obj/machinery/camera/C) + var/turf/consoleturf = get_turf(src) + var/turf/cameraturf = get_turf(C) + if((is_away_level(cameraturf.z) || is_away_level(consoleturf.z)) && !atoms_share_level(cameraturf, consoleturf)) //can only recieve away mission cameras on away missions + return TRUE + /obj/machinery/computer/security/check_eye(mob/user) if(!(user in watchers)) user.unset_machine() @@ -54,6 +60,9 @@ user.unset_machine() return var/obj/machinery/camera/C = watchers[user] + if(isCameraFarAway(C)) + user.unset_machine() + return if(!can_access_camera(C, user)) user.unset_machine() return @@ -113,7 +122,7 @@ var/list/cameras = list() for(var/obj/machinery/camera/C in cameranet.cameras) - if((is_away_level(z) || is_away_level(C.z)) && !atoms_share_level(C, src)) //can only recieve away mission cameras on away missions + if(isCameraFarAway(C)) continue if(!can_access_camera(C, user)) continue diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 9033a74526a..caf6840ebc7 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -973,16 +973,16 @@ product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!" product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!" icon_state = "seeds" - products = list(/obj/item/seeds/aloe =3, /obj/item/seeds/ambrosia = 3,/obj/item/seeds/apple = 3,/obj/item/seeds/banana = 3,/obj/item/seeds/berry = 3, - /obj/item/seeds/cabbage = 3,/obj/item/seeds/carrot = 3,/obj/item/seeds/cherry = 3,/obj/item/seeds/chanter = 3, - /obj/item/seeds/chili = 3,/obj/item/seeds/cocoapod = 3,/obj/item/seeds/coffee = 3, /obj/item/seeds/comfrey =3, /obj/item/seeds/corn = 3, - /obj/item/seeds/nymph =3, /obj/item/seeds/eggplant = 3,/obj/item/seeds/grape = 3,/obj/item/seeds/grass = 3,/obj/item/seeds/lemon = 3, - /obj/item/seeds/lime = 3,/obj/item/seeds/orange = 3, /obj/item/seeds/peanuts = 3, /obj/item/seeds/potato = 3,/obj/item/seeds/poppy = 3, - /obj/item/seeds/pumpkin = 3,/obj/item/seeds/replicapod = 3,/obj/item/seeds/wheat/rice = 3,/obj/item/seeds/soya = 3,/obj/item/seeds/sunflower = 3, - /obj/item/seeds/tea = 3,/obj/item/seeds/tobacco = 3,/obj/item/seeds/tomato = 3, - /obj/item/seeds/tower = 3,/obj/item/seeds/watermelon = 3,/obj/item/seeds/wheat = 3,/obj/item/seeds/whitebeet = 3) - contraband = list(/obj/item/seeds/amanita = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/liberty = 2,/obj/item/seeds/nettle = 2, - /obj/item/seeds/plump = 2,/obj/item/seeds/reishi = 2,/obj/item/seeds/cannabis = 3, /obj/item/seeds/fungus = 3, /obj/item/seeds/random = 2) + products = list(/obj/item/seeds/aloe =3, /obj/item/seeds/ambrosia = 3, /obj/item/seeds/apple = 3, /obj/item/seeds/banana = 3, /obj/item/seeds/berry = 3, + /obj/item/seeds/cabbage = 3, /obj/item/seeds/carrot = 3, /obj/item/seeds/cherry = 3, /obj/item/seeds/chanter = 3, + /obj/item/seeds/chili = 3, /obj/item/seeds/cocoapod = 3, /obj/item/seeds/coffee = 3, /obj/item/seeds/comfrey =3, /obj/item/seeds/corn = 3, + /obj/item/seeds/nymph =3, /obj/item/seeds/eggplant = 3, /obj/item/seeds/grape = 3, /obj/item/seeds/grass = 3, /obj/item/seeds/lemon = 3, + /obj/item/seeds/lime = 3, /obj/item/seeds/onion = 3, /obj/item/seeds/orange = 3, /obj/item/seeds/peanuts = 3, /obj/item/seeds/potato = 3, /obj/item/seeds/poppy = 3, + /obj/item/seeds/pumpkin = 3, /obj/item/seeds/replicapod = 3, /obj/item/seeds/wheat/rice = 3, /obj/item/seeds/soya = 3, /obj/item/seeds/sunflower = 3, + /obj/item/seeds/tea = 3, /obj/item/seeds/tobacco = 3, /obj/item/seeds/tomato = 3, + /obj/item/seeds/tower = 3, /obj/item/seeds/watermelon = 3, /obj/item/seeds/wheat = 3, /obj/item/seeds/whitebeet = 3) + contraband = list(/obj/item/seeds/amanita = 2, /obj/item/seeds/glowshroom = 2, /obj/item/seeds/liberty = 2, /obj/item/seeds/nettle = 2, + /obj/item/seeds/plump = 2, /obj/item/seeds/reishi = 2, /obj/item/seeds/cannabis = 3, /obj/item/seeds/starthistle = 2, /obj/item/seeds/fungus = 3, /obj/item/seeds/random = 2) premium = list(/obj/item/weapon/reagent_containers/spray/waterflower = 1) /** diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm index 83392cd7447..e0b10fb622a 100644 --- a/code/game/mecha/combat/honker.dm +++ b/code/game/mecha/combat/honker.dm @@ -143,12 +143,3 @@ obj/mecha/combat/honker/Topic(href, href_list) if("sadtrombone") playsound(src, 'sound/misc/sadtrombone.ogg', 50) return - -proc/rand_hex_color() - var/list/colors = list("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f") - var/color="" - for(var/i=0;i<6;i++) - color = color+pick(colors) - return color - - diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index bb8436340a6..f17b5f6901a 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -15,7 +15,6 @@ var/global/list/image/splatter_cache=list() icon_state = "mfloor1" random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7") var/base_icon = 'icons/effects/blood.dmi' - appearance_flags = NO_CLIENT_COLOR blood_DNA = list() var/blood_state = BLOOD_STATE_HUMAN var/bloodiness = MAX_SHOE_BLOODINESS @@ -155,6 +154,7 @@ var/global/list/image/splatter_cache=list() random_icon_states = null var/list/existing_dirs = list() blood_DNA = list() + appearance_flags = NO_CLIENT_COLOR /obj/effect/decal/cleanable/trail_holder/can_bloodcrawl_in() return TRUE diff --git a/code/game/objects/items/flag.dm b/code/game/objects/items/flag.dm index ebdaa953fbf..75b2ad94d95 100644 --- a/code/game/objects/items/flag.dm +++ b/code/game/objects/items/flag.dm @@ -1,5 +1,8 @@ /obj/item/flag icon = 'icons/obj/flag.dmi' + icon_state = "ntflag" + lefthand_file = 'icons/mob/inhands/flags_lefthand.dmi' + righthand_file = 'icons/mob/inhands/flags_righthand.dmi' w_class = WEIGHT_CLASS_BULKY burntime = 20 burn_state = FLAMMABLE @@ -10,10 +13,25 @@ user.visible_message("[user] lights the [name] with [W].") fire_act() -/obj/item/flag/proc/update_icons() - overlays = null - overlays += image('icons/obj/flag.dmi', src , "fire") - item_state = "[icon_state]_fire" +/obj/item/flag/fire_act(global_overlay = FALSE) + ..() + update_icon() + +/obj/item/flag/extinguish() + ..() + update_icon() + +/obj/item/flag/update_icon() + overlays.Cut() + if(burn_state == ON_FIRE) + overlays += image('icons/obj/flag.dmi', src , "fire") + item_state = "[icon_state]_fire" + else + item_state = initial(icon_state) + if(ismob(loc)) + var/mob/M = loc + M.update_inv_r_hand() + M.update_inv_l_hand() /obj/item/flag/nt name = "Nanotrasen flag" @@ -103,6 +121,11 @@ desc = "A flag proudly proclaiming the superior heritage of Drask." icon_state = "draskflag" +/obj/item/flag/species/plasma + name = "Plasmaman flag" + desc = "A flag proudly proclaiming the superior heritage of Plasmamen." + icon_state = "plasmaflag" + //Department Flags /obj/item/flag/cargo diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 99e24b393a5..887a5b2aaa5 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -385,6 +385,13 @@ item_state = "duffel-eng" burn_state = FIRE_PROOF +/obj/item/weapon/storage/backpack/duffel/atmos + name = "atmospherics duffelbag" + desc = "A duffelbag designed to hold tools. This one is specially designed for atmospherics." + icon_state = "duffel-atmos" + item_state = "duffel-atmos" + burn_state = FIRE_PROOF + /obj/item/weapon/storage/backpack/duffel/hydro name = "hydroponics duffelbag" desc = "A duffelbag designed to hold seeds and fauna." diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 58cad5e5f36..1af8b2653b8 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -136,7 +136,7 @@ new /obj/item/weapon/storage/backpack/industrial(src) else new /obj/item/weapon/storage/backpack/satchel_eng(src) - new /obj/item/weapon/storage/backpack/duffel/engineering(src) + new /obj/item/weapon/storage/backpack/duffel/atmos(src) new /obj/item/weapon/extinguisher(src) new /obj/item/clothing/suit/storage/hazardvest(src) new /obj/item/clothing/mask/gas(src) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index e9d9781bf0e..a3f716a4a8b 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -133,6 +133,9 @@ new /obj/item/clothing/shoes/sandal(src) new /obj/item/clothing/shoes/sandal(src) new /obj/item/clothing/shoes/sandal(src) + new /obj/item/clothing/shoes/footwraps(src) + new /obj/item/clothing/shoes/footwraps(src) + new /obj/item/clothing/shoes/footwraps(src) /obj/structure/closet/wardrobe/orange diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index f538fc0e2c6..8fdaf4804b3 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -432,12 +432,41 @@ return newgas -/obj/structure/closet/crate/bin - desc = "A large bin." - name = "large bin" +/obj/structure/closet/crate/can + desc = "A large can, looks like a bin to me." + name = "garbage can" icon_state = "largebin" icon_opened = "largebinopen" icon_closed = "largebin" + anchored = TRUE + +/obj/structure/closet/crate/can/attackby(obj/item/weapon/W, mob/living/user, params) + add_fingerprint(user) + user.changeNext_move(CLICK_CD_MELEE) + if(iswrench(W)) + if(anchored) + playsound(loc, W.usesound, 100, 1) + user.visible_message("[user] starts loosening [src]'s floor casters.", \ + "You start loosening [src]'s floor casters...") + if(do_after(user, 40 * W.toolspeed, target = src)) + if(!loc || !anchored) + return + user.visible_message("[user] loosened [src]'s floor casters.", \ + "You loosen [src]'s floor casters.") + anchored = FALSE + else + if(!isfloorturf(loc)) + user.visible_message("A floor must be present to secure [src]!") + return + playsound(loc, W.usesound, 100, 1) + user.visible_message("[user] start securing [src]'s floor casters...", \ + "You start securing [src]'s floor casters...") + if(do_after(user, 40 * W.toolspeed, target = src)) + if(!loc || anchored) + return + user.visible_message("[user] has secured [src]'s floor casters.", \ + "You have secured [src]'s floor casters.") + anchored = TRUE /obj/structure/closet/crate/radiation desc = "A crate with a radiation sign on it." diff --git a/code/game/response_team.dm b/code/game/response_team.dm index ebfe10f71e0..c54d1f65b37 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -167,13 +167,11 @@ var/ert_request_answered = 0 var/eye_c = pick("#000000","#8B4513","1E90FF") // Black, brown, blue var/skin_tone = pick(-50, -30, -10, 0, 0, 0, 10) // Caucasian/black - head_organ.r_facial = color2R(hair_c) - head_organ.g_facial = color2G(hair_c) - head_organ.b_facial = color2B(hair_c) - head_organ.r_hair = color2R(hair_c) - head_organ.g_hair = color2G(hair_c) - head_organ.b_hair = color2B(hair_c) - M.change_eye_color(color2R(eye_c), color2G(eye_c), color2B(eye_c)) + head_organ.facial_colour = hair_c + head_organ.sec_facial_colour = hair_c + head_organ.hair_colour = hair_c + head_organ.sec_hair_colour = hair_c + M.change_eye_color(eye_c) M.s_tone = skin_tone head_organ.h_style = random_hair_style(M.gender, head_organ.species.name) head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index e6f37f68954..862e223e264 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -3349,7 +3349,7 @@ return var/datum/outfit/O = hunter_outfits[dresscode] message_admins("[key_name_admin(mob)] is sending a ([dresscode]) to [killthem ? "assassinate" : "protect"] [key_name_admin(H)]...") - var/list/candidates = pollCandidates("Play as a [killthem ? "murderous" : "protective"] [dresscode]?") + var/list/candidates = pollCandidates("Play as a [killthem ? "murderous" : "protective"] [dresscode]?", ROLE_TRAITOR, 1) if(!candidates.len) to_chat(usr, "ERROR: Could not create eventmob. No valid candidates.") return diff --git a/code/modules/admin/verbs/infiltratorteam_syndicate.dm b/code/modules/admin/verbs/infiltratorteam_syndicate.dm index 82882c31fd1..e3ff37dc0fa 100644 --- a/code/modules/admin/verbs/infiltratorteam_syndicate.dm +++ b/code/modules/admin/verbs/infiltratorteam_syndicate.dm @@ -58,7 +58,7 @@ var/global/sent_syndicate_infiltration_team = 0 infiltrators += candidate else to_chat(src, "Polling candidates...") - infiltrators = pollCandidates("Do you want to play as a SYNDICATE INFILTRATOR?") // ROLE_TRAITOR, 7 + infiltrators = pollCandidates("Do you want to play as a SYNDICATE INFILTRATOR?", ROLE_TRAITOR, 1) if(!infiltrators.len) to_chat(src, "Nobody volunteered.") diff --git a/code/modules/client/preference/loadout/loadout_accessories.dm b/code/modules/client/preference/loadout/loadout_accessories.dm index 8353514fb37..58315d2f2a2 100644 --- a/code/modules/client/preference/loadout/loadout_accessories.dm +++ b/code/modules/client/preference/loadout/loadout_accessories.dm @@ -142,5 +142,17 @@ display_name = "simple necklace" path = /obj/item/clothing/accessory/necklace +/datum/gear/accessory/corset + display_name = "corset, black" + path = /obj/item/clothing/accessory/corset + +/datum/gear/accessory/corsetred + display_name = "corset, red" + path = /obj/item/clothing/accessory/corset/red + +/datum/gear/accessory/corsetblue + display_name = "corset, blue" + path = /obj/item/clothing/accessory/corset/blue + diff --git a/code/modules/client/preference/loadout/loadout_hat.dm b/code/modules/client/preference/loadout/loadout_hat.dm index 196f9f65ca0..cf47e28695b 100644 --- a/code/modules/client/preference/loadout/loadout_hat.dm +++ b/code/modules/client/preference/loadout/loadout_hat.dm @@ -147,4 +147,12 @@ /datum/gear/hat/surgicalcap_green display_name = "surgical cap, green" path = /obj/item/clothing/head/surgery/green - allowed_roles = list("Chief Medical Officer", "Medical Doctor") \ No newline at end of file + allowed_roles = list("Chief Medical Officer", "Medical Doctor") + +/datum/gear/hat/flowerpin + display_name = "hair flower" + path = /obj/item/clothing/head/hairflower + +/datum/gear/hat/flowerpinpurp + display_name = "hair flower, purple" + path = /obj/item/clothing/head/hairflower/purple \ No newline at end of file diff --git a/code/modules/client/preference/loadout/loadout_racial.dm b/code/modules/client/preference/loadout/loadout_racial.dm index f7d96011e5c..09b21a63642 100644 --- a/code/modules/client/preference/loadout/loadout_racial.dm +++ b/code/modules/client/preference/loadout/loadout_racial.dm @@ -8,6 +8,7 @@ display_name = "embroidered veil" description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races." path = /obj/item/clothing/glasses/tajblind + cost = 1 /datum/gear/racial/tajsec display_name = "sleek veil" @@ -37,4 +38,9 @@ display_name = "khaki veil" description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. It is light and comfy!" path = /obj/item/clothing/glasses/tajblind/cargo - allowed_roles = list("Quartermaster","Cargo Technician", "Miner") \ No newline at end of file + allowed_roles = list("Quartermaster","Cargo Technician", "Miner") + +/datum/gear/racial/footwraps + display_name = "cloth footwraps" + path = /obj/item/clothing/shoes/footwraps + cost = 1 \ No newline at end of file diff --git a/code/modules/client/preference/loadout/loadout_uniform.dm b/code/modules/client/preference/loadout/loadout_uniform.dm index 889dfaa1080..f4a5c465aba 100644 --- a/code/modules/client/preference/loadout/loadout_uniform.dm +++ b/code/modules/client/preference/loadout/loadout_uniform.dm @@ -223,3 +223,4 @@ /datum/gear/uniform/pants/caopants display_name = "pants, camo" path = /obj/item/clothing/under/pants/camo + diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index b4d4bc60041..7b48da8a9c8 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -110,9 +110,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/socks = "Nude" //socks type var/backbag = GBACKPACK //backpack type var/ha_style = "None" //Head accessory style - var/r_headacc = 0 //Head accessory colour - var/g_headacc = 0 //Head accessory colour - var/b_headacc = 0 //Head accessory colour + var/hacc_colour = "#000000" //Head accessory colour var/list/m_styles = list( "head" = "None", "body" = "None", @@ -124,26 +122,14 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts "tail" = "#000000" ) //Marking colours. var/h_style = "Bald" //Hair type - var/r_hair = 0 //Hair color - var/g_hair = 0 //Hair color - var/b_hair = 0 //Hair color - var/r_hair_sec = 0 //Secondary hair color - var/g_hair_sec = 0 //Secondary hair color - var/b_hair_sec = 0 //Secondary hair color + var/h_colour = "#000000" //Hair color + var/h_sec_colour = "#000000" //Secondary hair color var/f_style = "Shaved" //Facial hair type - var/r_facial = 0 //Facial hair color - var/g_facial = 0 //Facial hair color - var/b_facial = 0 //Facial hair color - var/r_facial_sec = 0 //Secondary facial hair color - var/g_facial_sec = 0 //Secondary facial hair color - var/b_facial_sec = 0 //Secondary facial hair color + var/f_colour = "#000000" //Facial hair color + var/f_sec_colour = "#000000" //Secondary facial hair color var/s_tone = 0 //Skin tone - var/r_skin = 0 //Skin color - var/g_skin = 0 //Skin color - var/b_skin = 0 //Skin color - var/r_eyes = 0 //Eye color - var/g_eyes = 0 //Eye color - var/b_eyes = 0 //Eye color + var/s_colour = "#000000" //Skin color + var/e_colour = "#000000" //Eye color var/alt_head = "None" //Alt head style. var/species = "Human" var/language = "None" //Secondary language @@ -239,8 +225,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts save_preferences(C) save_character(C) //let's save this new random character so it doesn't keep generating new ones. -/datum/preferences/proc/color_square(r, g, b) - return "___" +/datum/preferences/proc/color_square(colour) + return "___" // Hello I am a proc full of snowflake species checks how are you /datum/preferences/proc/ShowChoices(mob/user) @@ -317,45 +303,45 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts headaccessoryname = "Horns: " dat += "[headaccessoryname]" dat += "[ha_style] " - dat += "Color [color_square(r_headacc, g_headacc, b_headacc)]
" + dat += "Color [color_square(hacc_colour)]
" if(S.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings. dat += "Head Markings: " dat += "[m_styles["head"]]" - dat += "Color [color_square(color2R(m_colours["head"]), color2G(m_colours["head"]), color2B(m_colours["head"]))]
" + dat += "Color [color_square(m_colours["head"])]
" if(S.bodyflags & HAS_BODY_MARKINGS) //Species with body markings/tattoos. dat += "Body Markings: " dat += "[m_styles["body"]]" - dat += "Color [color_square(color2R(m_colours["body"]), color2G(m_colours["body"]), color2B(m_colours["body"]))]
" + dat += "Color [color_square(m_colours["body"])]
" if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings. dat += "Tail Markings: " dat += "[m_styles["tail"]]" - dat += "Color [color_square(color2R(m_colours["tail"]), color2G(m_colours["tail"]), color2B(m_colours["tail"]))]
" + dat += "Color [color_square(m_colours["tail"])]
" dat += "Hair: " dat += "[h_style]" - dat += "Color [color_square(r_hair, g_hair, b_hair)]" + dat += "Color [color_square(h_colour)]" var/datum/sprite_accessory/temp_hair_style = hair_styles_list[h_style] if(temp_hair_style && temp_hair_style.secondary_theme && !temp_hair_style.no_sec_colour) - dat += " Color #2 [color_square(r_hair_sec, g_hair_sec, b_hair_sec)]" + dat += " Color #2 [color_square(h_sec_colour)]" dat += "
" dat += "Facial Hair: " dat += "[f_style ? "[f_style]" : "Shaved"]" - dat += "Color [color_square(r_facial, g_facial, b_facial)]" + dat += "Color [color_square(f_colour)]" var/datum/sprite_accessory/temp_facial_hair_style = facial_hair_styles_list[f_style] if(temp_facial_hair_style && temp_facial_hair_style.secondary_theme && !temp_facial_hair_style.no_sec_colour) - dat += " Color #2 [color_square(r_facial_sec, g_facial_sec, b_facial_sec)]" + dat += " Color #2 [color_square(f_sec_colour)]" dat += "
" if(!(S.bodyflags & ALL_RPARTS)) dat += "Eyes: " - dat += "Color [color_square(r_eyes, g_eyes, b_eyes)]
" + dat += "Color [color_square(e_colour)]
" if((S.bodyflags & HAS_SKIN_COLOR) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins dat += "Body Color: " - dat += "Color [color_square(r_skin, g_skin, b_skin)]
" + dat += "Color [color_square(s_colour)]
" if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) dat += "Body Accessory: " @@ -1186,33 +1172,23 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts age = rand(AGE_MIN, AGE_MAX) if("hair") if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) - r_hair = rand(0,255) - g_hair = rand(0,255) - b_hair = rand(0,255) + h_colour = rand_hex_color() if("secondary_hair") if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) - r_hair_sec = rand(0,255) - g_hair_sec = rand(0,255) - b_hair_sec = rand(0,255) + h_sec_colour = rand_hex_color() if("h_style") h_style = random_hair_style(gender, species, robohead) if("facial") if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) - r_facial = rand(0,255) - g_facial = rand(0,255) - b_facial = rand(0,255) + f_colour = rand_hex_color() if("secondary_facial") if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) - r_facial_sec = rand(0,255) - g_facial_sec = rand(0,255) - b_facial_sec = rand(0,255) + f_sec_colour = rand_hex_color() if("f_style") f_style = random_facial_hair_style(gender, species, robohead) if("headaccessory") if(S.bodyflags & HAS_HEAD_ACCESSORY) //Species that have head accessories. - r_headacc = rand(0,255) - g_headacc = rand(0,255) - b_headacc = rand(0,255) + hacc_colour = rand_hex_color() if("ha_style") if(S.bodyflags & HAS_HEAD_ACCESSORY) //Species that have head accessories. ha_style = random_head_accessory(species) @@ -1221,19 +1197,19 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head) if("m_head_colour") if(S.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings. - m_colours["head"] = rgb(rand(0,255), rand(0,255), rand(0,255)) + m_colours["head"] = rand_hex_color() if("m_style_body") if(S.bodyflags & HAS_BODY_MARKINGS) //Species with body markings. m_styles["body"] = random_marking_style("body", species) if("m_body_colour") if(S.bodyflags & HAS_BODY_MARKINGS) //Species with body markings. - m_colours["body"] = rgb(rand(0,255), rand(0,255), rand(0,255)) + m_colours["body"] = rand_hex_color() if("m_style_tail") if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings. m_styles["tail"] = random_marking_style("tail", species, null, body_accessory) if("m_tail_colour") if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings. - m_colours["tail"] = rgb(rand(0,255), rand(0,255), rand(0,255)) + m_colours["tail"] = rand_hex_color() if("underwear") underwear = random_underwear(gender, species) ShowChoices(user) @@ -1244,17 +1220,13 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts socks = random_socks(gender, species) ShowChoices(user) if("eyes") - r_eyes = rand(0,255) - g_eyes = rand(0,255) - b_eyes = rand(0,255) + e_colour = rand_hex_color() if("s_tone") if(S.bodyflags & (HAS_SKIN_TONE|HAS_ICON_SKIN_TONE)) s_tone = random_skin_tone() if("s_color") if(S.bodyflags & HAS_SKIN_COLOR) - r_skin = rand(0,255) - g_skin = rand(0,255) - b_skin = rand(0,255) + s_colour = rand_hex_color() if("bag") backbag = pick(backbaglist) /*if("skin_style") @@ -1317,9 +1289,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts ha_style = random_head_accessory(species) else ha_style = "None" // No Vulp ears on Unathi - r_headacc = 0 - g_headacc = 0 - b_headacc = 0 + hacc_colour = rand_hex_color() if(NS.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings. m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head) @@ -1359,9 +1329,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts s_tone = 0 if(!(NS.bodyflags & HAS_SKIN_COLOR)) - r_skin = 0 - g_skin = 0 - b_skin = 0 + s_colour = "#000000" alt_head = "None" //No alt heads on species that don't have them. speciesprefs = 0 //My Vox tank shouldn't change how my future Grey talks. @@ -1417,21 +1385,17 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("hair") if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) //Species that have hair. (No HAS_HAIR flag) var/input = "Choose your character's hair colour:" - var/new_hair = input(user, input, "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null + var/new_hair = input(user, input, "Character Preference", h_colour) as color|null if(new_hair) - r_hair = color2R(new_hair) - g_hair = color2G(new_hair) - b_hair = color2B(new_hair) + h_colour = new_hair if("secondary_hair") if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] if(hair_style.secondary_theme && !hair_style.no_sec_colour) - var/new_hair = input(user, "Choose your character's secondary hair colour:", "Character Preference", rgb(r_hair_sec, g_hair_sec, b_hair_sec)) as color|null + var/new_hair = input(user, "Choose your character's secondary hair colour:", "Character Preference", h_sec_colour) as color|null if(new_hair) - r_hair_sec = color2R(new_hair) - g_hair_sec = color2G(new_hair) - b_hair_sec = color2B(new_hair) + h_sec_colour = new_hair if("h_style") var/list/valid_hairstyles = list() @@ -1465,11 +1429,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("headaccessory") if(S.bodyflags & HAS_HEAD_ACCESSORY) //Species with head accessories. var/input = "Choose the colour of your your character's head accessory:" - var/new_head_accessory = input(user, input, "Character Preference", rgb(r_headacc, g_headacc, b_headacc)) as color|null + var/new_head_accessory = input(user, input, "Character Preference", hacc_colour) as color|null if(new_head_accessory) - r_headacc = color2R(new_head_accessory) - g_headacc = color2G(new_head_accessory) - b_headacc = color2B(new_head_accessory) + hacc_colour = new_head_accessory if("ha_style") if(S.bodyflags & HAS_HEAD_ACCESSORY) //Species with head accessories. @@ -1624,21 +1586,17 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("facial") if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) //Species that have facial hair. (No HAS_HAIR_FACIAL flag) - var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(r_facial, g_facial, b_facial)) as color|null + var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", f_colour) as color|null if(new_facial) - r_facial = color2R(new_facial) - g_facial = color2G(new_facial) - b_facial = color2B(new_facial) + f_colour = new_facial if("secondary_facial") if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] if(facial_hair_style.secondary_theme && !facial_hair_style.no_sec_colour) - var/new_facial = input(user, "Choose your character's secondary facial-hair colour:", "Character Preference", rgb(r_facial_sec, g_facial_sec, b_facial_sec)) as color|null + var/new_facial = input(user, "Choose your character's secondary facial-hair colour:", "Character Preference", f_sec_colour) as color|null if(new_facial) - r_facial_sec = color2R(new_facial) - g_facial_sec = color2G(new_facial) - b_facial_sec = color2B(new_facial) + f_sec_colour = new_facial if("f_style") var/list/valid_facial_hairstyles = list() @@ -1721,11 +1679,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts socks = new_socks if("eyes") - var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(r_eyes, g_eyes, b_eyes)) as color|null + var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", e_colour) as color|null if(new_eyes) - r_eyes = color2R(new_eyes) - g_eyes = color2G(new_eyes) - b_eyes = color2B(new_eyes) + e_colour = new_eyes if("s_tone") if(S.bodyflags & HAS_SKIN_TONE) @@ -1748,12 +1704,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("skin") if((S.bodyflags & HAS_SKIN_COLOR) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) - var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null + var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", s_colour) as color|null if(new_skin) - r_skin = color2R(new_skin) - g_skin = color2G(new_skin) - b_skin = color2B(new_skin) - + s_colour = new_skin if("ooccolor") var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference", ooccolor) as color|null @@ -2122,21 +2075,13 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts //Head-specific var/obj/item/organ/external/head/H = character.get_organ("head") - H.r_hair = r_hair - H.g_hair = g_hair - H.b_hair = b_hair + H.hair_colour = h_colour - H.r_hair_sec = r_hair_sec - H.g_hair_sec = g_hair_sec - H.b_hair_sec = b_hair_sec + H.sec_hair_colour = h_sec_colour - H.r_facial = r_facial - H.g_facial = g_facial - H.b_facial = b_facial + H.facial_colour = f_colour - H.r_facial_sec = r_facial_sec - H.g_facial_sec = g_facial_sec - H.b_facial_sec = b_facial_sec + H.sec_facial_colour = f_sec_colour H.h_style = h_style H.f_style = f_style @@ -2144,9 +2089,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts H.alt_head = alt_head //End of head-specific. - character.r_skin = r_skin - character.g_skin = g_skin - character.b_skin = b_skin + character.skin_colour = s_colour character.s_tone = s_tone @@ -2190,9 +2133,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts character.socks = socks if(character.species.bodyflags & HAS_HEAD_ACCESSORY) - H.r_headacc = r_headacc - H.g_headacc = g_headacc - H.b_headacc = b_headacc + H.headacc_colour = hacc_colour H.ha_style = ha_style if(character.species.bodyflags & HAS_MARKINGS) character.m_colours = m_colours @@ -2209,7 +2150,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts message_admins("[key_name_admin(character)] has spawned with their gender as plural or neuter. Please notify coders.") character.change_gender(MALE) - character.change_eye_color(r_eyes, g_eyes, b_eyes) + character.change_eye_color(e_colour) if(disabilities & DISABILITY_FLAG_FAT && (CAN_BE_FAT in character.species.species_traits)) character.dna.SetSEState(FATBLOCK,1,1) diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm index 579699a9414..a7c3810a40d 100644 --- a/code/modules/client/preference/preferences_mysql.dm +++ b/code/modules/client/preference/preferences_mysql.dm @@ -118,34 +118,20 @@ age, species, language, - hair_red, - hair_green, - hair_blue, - secondary_hair_red, - secondary_hair_green, - secondary_hair_blue, - facial_red, - facial_green, - facial_blue, - secondary_facial_red, - secondary_facial_green, - secondary_facial_blue, + hair_colour, + secondary_hair_colour, + facial_hair_colour, + secondary_facial_hair_colour, skin_tone, - skin_red, - skin_green, - skin_blue, + skin_colour, marking_colours, - head_accessory_red, - head_accessory_green, - head_accessory_blue, + head_accessory_colour, hair_style_name, facial_style_name, marking_styles, head_accessory_style_name, alt_head_name, - eyes_red, - eyes_green, - eyes_blue, + eye_colour, underwear, undershirt, backbag, @@ -194,61 +180,46 @@ species = query.item[6] language = query.item[7] - //colors to be consolidated into hex strings (requires some work with dna code) - r_hair = text2num(query.item[8]) - g_hair = text2num(query.item[9]) - b_hair = text2num(query.item[10]) - r_hair_sec = text2num(query.item[11]) - g_hair_sec = text2num(query.item[12]) - b_hair_sec = text2num(query.item[13]) - r_facial = text2num(query.item[14]) - g_facial = text2num(query.item[15]) - b_facial = text2num(query.item[16]) - r_facial_sec = text2num(query.item[17]) - g_facial_sec = text2num(query.item[18]) - b_facial_sec = text2num(query.item[19]) - s_tone = text2num(query.item[20]) - r_skin = text2num(query.item[21]) - g_skin = text2num(query.item[22]) - b_skin = text2num(query.item[23]) - m_colours = params2list(query.item[24]) - r_headacc = text2num(query.item[25]) - g_headacc = text2num(query.item[26]) - b_headacc = text2num(query.item[27]) - h_style = query.item[28] - f_style = query.item[29] - m_styles = params2list(query.item[30]) - ha_style = query.item[31] - alt_head = query.item[32] - r_eyes = text2num(query.item[33]) - g_eyes = text2num(query.item[34]) - b_eyes = text2num(query.item[35]) - underwear = query.item[36] - undershirt = query.item[37] - backbag = query.item[38] - b_type = query.item[39] + h_colour = query.item[8] + h_sec_colour = query.item[9] + f_colour = query.item[10] + f_sec_colour = query.item[11] + s_tone = text2num(query.item[12]) + s_colour = query.item[13] + m_colours = params2list(query.item[14]) + hacc_colour = query.item[15] + h_style = query.item[16] + f_style = query.item[17] + m_styles = params2list(query.item[18]) + ha_style = query.item[19] + alt_head = query.item[20] + e_colour = query.item[21] + underwear = query.item[22] + undershirt = query.item[23] + backbag = query.item[24] + b_type = query.item[25] //Jobs - alternate_option = text2num(query.item[40]) - job_support_high = text2num(query.item[41]) - job_support_med = text2num(query.item[42]) - job_support_low = text2num(query.item[43]) - job_medsci_high = text2num(query.item[44]) - job_medsci_med = text2num(query.item[45]) - job_medsci_low = text2num(query.item[46]) - job_engsec_high = text2num(query.item[47]) - job_engsec_med = text2num(query.item[48]) - job_engsec_low = text2num(query.item[49]) - job_karma_high = text2num(query.item[50]) - job_karma_med = text2num(query.item[51]) - job_karma_low = text2num(query.item[52]) + alternate_option = text2num(query.item[26]) + job_support_high = text2num(query.item[27]) + job_support_med = text2num(query.item[28]) + job_support_low = text2num(query.item[29]) + job_medsci_high = text2num(query.item[30]) + job_medsci_med = text2num(query.item[31]) + job_medsci_low = text2num(query.item[32]) + job_engsec_high = text2num(query.item[33]) + job_engsec_med = text2num(query.item[34]) + job_engsec_low = text2num(query.item[35]) + job_karma_high = text2num(query.item[36]) + job_karma_med = text2num(query.item[37]) + job_karma_low = text2num(query.item[38]) //Miscellaneous - flavor_text = query.item[53] - med_record = query.item[54] - sec_record = query.item[55] - gen_record = query.item[56] + flavor_text = query.item[39] + med_record = query.item[40] + sec_record = query.item[41] + gen_record = query.item[42] // Apparently, the preceding vars weren't always encoded properly... if(findtext(flavor_text, "<")) // ... so let's clumsily check for tags! flavor_text = html_encode(flavor_text) @@ -258,18 +229,18 @@ sec_record = html_encode(sec_record) if(findtext(gen_record, "<")) gen_record = html_encode(gen_record) - disabilities = text2num(query.item[57]) - player_alt_titles = params2list(query.item[58]) - organ_data = params2list(query.item[59]) - rlimb_data = params2list(query.item[60]) - nanotrasen_relation = query.item[61] - speciesprefs = text2num(query.item[62]) + disabilities = text2num(query.item[43]) + player_alt_titles = params2list(query.item[44]) + organ_data = params2list(query.item[45]) + rlimb_data = params2list(query.item[46]) + nanotrasen_relation = query.item[47] + speciesprefs = text2num(query.item[48]) //socks - socks = query.item[63] - body_accessory = query.item[64] - gear = params2list(query.item[65]) - autohiss_mode = text2num(query.item[66]) + socks = query.item[49] + body_accessory = query.item[50] + gear = params2list(query.item[51]) + autohiss_mode = text2num(query.item[52]) //Sanitize var/datum/species/SP = all_species[species] @@ -283,36 +254,22 @@ be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name)) gender = sanitize_gender(gender, FALSE, !SP.has_gender) age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age)) - r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair)) - g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair)) - b_hair = sanitize_integer(b_hair, 0, 255, initial(b_hair)) - r_hair_sec = sanitize_integer(r_hair_sec, 0, 255, initial(r_hair_sec)) - g_hair_sec = sanitize_integer(g_hair_sec, 0, 255, initial(g_hair_sec)) - b_hair_sec = sanitize_integer(b_hair_sec, 0, 255, initial(b_hair_sec)) - r_facial = sanitize_integer(r_facial, 0, 255, initial(r_facial)) - g_facial = sanitize_integer(g_facial, 0, 255, initial(g_facial)) - b_facial = sanitize_integer(b_facial, 0, 255, initial(b_facial)) - r_facial_sec = sanitize_integer(r_facial_sec, 0, 255, initial(r_facial_sec)) - g_facial_sec = sanitize_integer(g_facial_sec, 0, 255, initial(g_facial_sec)) - b_facial_sec = sanitize_integer(b_facial_sec, 0, 255, initial(b_facial_sec)) + h_colour = sanitize_hexcolor(h_colour) + h_sec_colour = sanitize_hexcolor(h_sec_colour) + f_colour = sanitize_hexcolor(f_colour) + f_sec_colour = sanitize_hexcolor(f_sec_colour) s_tone = sanitize_integer(s_tone, -185, 34, initial(s_tone)) - r_skin = sanitize_integer(r_skin, 0, 255, initial(r_skin)) - g_skin = sanitize_integer(g_skin, 0, 255, initial(g_skin)) - b_skin = sanitize_integer(b_skin, 0, 255, initial(b_skin)) + s_colour = sanitize_hexcolor(s_colour) for(var/marking_location in m_colours) m_colours[marking_location] = sanitize_hexcolor(m_colours[marking_location], DEFAULT_MARKING_COLOURS[marking_location]) - r_headacc = sanitize_integer(r_headacc, 0, 255, initial(r_headacc)) - g_headacc = sanitize_integer(g_headacc, 0, 255, initial(g_headacc)) - b_headacc = sanitize_integer(b_headacc, 0, 255, initial(b_headacc)) + hacc_colour = sanitize_hexcolor(hacc_colour) h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style)) f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style)) for(var/marking_location in m_styles) m_styles[marking_location] = sanitize_inlist(m_styles[marking_location], marking_styles_list, DEFAULT_MARKING_STYLES[marking_location]) ha_style = sanitize_inlist(ha_style, head_accessory_styles_list, initial(ha_style)) alt_head = sanitize_inlist(alt_head, alt_heads_list, initial(alt_head)) - r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes)) - g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes)) - b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes)) + e_colour = sanitize_hexcolor(e_colour) underwear = sanitize_text(underwear, initial(underwear)) undershirt = sanitize_text(undershirt, initial(undershirt)) backbag = sanitize_text(backbag, initial(backbag)) @@ -373,34 +330,20 @@ age='[age]', species='[sanitizeSQL(species)]', language='[sanitizeSQL(language)]', - hair_red='[r_hair]', - hair_green='[g_hair]', - hair_blue='[b_hair]', - secondary_hair_red='[r_hair_sec]', - secondary_hair_green='[g_hair_sec]', - secondary_hair_blue='[b_hair_sec]', - facial_red='[r_facial]', - facial_green='[g_facial]', - facial_blue='[b_facial]', - secondary_facial_red='[r_facial_sec]', - secondary_facial_green='[g_facial_sec]', - secondary_facial_blue='[b_facial_sec]', + hair_colour='[h_colour]', + secondary_hair_colour='[h_sec_colour]', + facial_hair_colour='[f_colour]', + secondary_facial_hair_colour='[f_sec_colour]', skin_tone='[s_tone]', - skin_red='[r_skin]', - skin_green='[g_skin]', - skin_blue='[b_skin]', + skin_colour='[s_colour]', marking_colours='[sanitizeSQL(markingcolourslist)]', - head_accessory_red='[r_headacc]', - head_accessory_green='[g_headacc]', - head_accessory_blue='[b_headacc]', + head_accessory_colour='[hacc_colour]', hair_style_name='[sanitizeSQL(h_style)]', facial_style_name='[sanitizeSQL(f_style)]', marking_styles='[sanitizeSQL(markingstyleslist)]', head_accessory_style_name='[sanitizeSQL(ha_style)]', alt_head_name='[sanitizeSQL(alt_head)]', - eyes_red='[r_eyes]', - eyes_green='[g_eyes]', - eyes_blue='[b_eyes]', + eye_colour='[e_colour]', underwear='[underwear]', undershirt='[undershirt]', backbag='[backbag]', @@ -446,19 +389,17 @@ var/DBQuery/query = dbcon.NewQuery({" INSERT INTO [format_table_name("characters")] (ckey, slot, OOC_Notes, real_name, name_is_always_random, gender, age, species, language, - hair_red, hair_green, hair_blue, - secondary_hair_red, secondary_hair_green, secondary_hair_blue, - facial_red, facial_green, facial_blue, - secondary_facial_red, secondary_facial_green, secondary_facial_blue, - skin_tone, skin_red, skin_green, skin_blue, + hair_colour, secondary_hair_colour, + facial_hair_colour, secondary_facial_hair_colour, + skin_tone, skin_colour, marking_colours, - head_accessory_red, head_accessory_green, head_accessory_blue, + head_accessory_colour, hair_style_name, facial_style_name, marking_styles, head_accessory_style_name, alt_head_name, - eyes_red, eyes_green, eyes_blue, + eye_colour, underwear, undershirt, backbag, b_type, alternate_option, job_support_high, job_support_med, job_support_low, @@ -476,19 +417,17 @@ VALUES ('[C.ckey]', '[default_slot]', '[sanitizeSQL(metadata)]', '[sanitizeSQL(real_name)]', '[be_random_name]','[gender]', '[age]', '[sanitizeSQL(species)]', '[sanitizeSQL(language)]', - '[r_hair]', '[g_hair]', '[b_hair]', - '[r_hair_sec]', '[g_hair_sec]', '[b_hair_sec]', - '[r_facial]', '[g_facial]', '[b_facial]', - '[r_facial_sec]', '[g_facial_sec]', '[b_facial_sec]', - '[s_tone]', '[r_skin]', '[g_skin]', '[b_skin]', + '[h_colour]', '[h_sec_colour]', + '[f_colour]', '[f_sec_colour]', + '[s_tone]', '[s_colour]', '[sanitizeSQL(markingcolourslist)]', - '[r_headacc]', '[g_headacc]', '[b_headacc]', + '[hacc_colour]', '[sanitizeSQL(h_style)]', '[sanitizeSQL(f_style)]', '[sanitizeSQL(markingstyleslist)]', '[sanitizeSQL(ha_style)]', '[sanitizeSQL(alt_head)]', - '[r_eyes]', '[g_eyes]', '[b_eyes]', + '[e_colour]', '[underwear]', '[undershirt]', '[backbag]', '[b_type]', '[alternate_option]', '[job_support_high]', '[job_support_med]', '[job_support_low]', diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index ee0610471c8..ab42d17e469 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -184,14 +184,10 @@ var/obj/item/organ/external/head/head_organ = user.get_organ("head") mob = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty") -// mob2 = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty2") - Commented out because it seemingly does nothing. - mob.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD) -// mob2.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD) - Commented out because it seemingly does nothing. + mob.Blend(head_organ.hair_colour, ICON_ADD) var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner") -// var/icon/earbit2 = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner2") - Commented out because it seemingly does nothing. mob.Blend(earbit, ICON_OVERLAY) -// mob2.Blend(earbit2, ICON_OVERLAY) - Commented out because it seemingly does nothing. icon_override = mob @@ -210,7 +206,7 @@ if(!istype(user)) return var/obj/item/organ/external/head/head_organ = user.get_organ("head") mob = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "mousey") - mob.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD) + mob.Blend(head_organ.hair_colour, ICON_ADD) var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "mouseyinner") mob.Blend(earbit, ICON_OVERLAY) diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 31003f26036..8b0bb40597e 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -339,6 +339,7 @@ icon = 'icons/goonstation/objects/clothing/mask.dmi' icon_state = "cursedclown" item_state = "cclown_hat" + unacidable = 1 // HUNKE icon_override = 'icons/goonstation/mob/clothing/mask.dmi' lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi' righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi' diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 6a07ea17da8..0f557b6d9aa 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -244,3 +244,12 @@ desc = "For a Rustlin' tustlin' cowgirl." icon_state = "cowboyboots_pink" item_color = "cowboyboots_pink" + +/obj/item/clothing/shoes/footwraps + name = "cloth footwraps" + desc = "A roll of treated canvas used for wrapping claws or paws." + icon_state = "clothwrap" + item_state = "clothwrap" + force = 0 + silence_steps = TRUE + w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 8f1221fee04..2237ce8d7db 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -550,11 +550,35 @@ icon_state = "cowboyshirt_reds" item_state = "cowboyshirt_reds" item_color = "cowboyshirt_reds" - species_fit = list("Vox") + species_fit = list("Vox", "Drask", "Grey") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi' + "Vox" = 'icons/mob/species/vox/suit.dmi', + "Drask" = 'icons/mob/species/drask/suit.dmi', + "Grey" = 'icons/mob/species/grey/suit.dmi' ) +/obj/item/clothing/accessory/corset + name = "black corset" + desc = "A black corset for those fancy nights out." + icon_state = "corset" + item_state = "corset" + item_color = "corset" + + +/obj/item/clothing/accessory/corset/red + name = "red corset" + desc = "A red corset those fancy nights out." + icon_state = "corset_red" + item_state = "corset_red" + item_color = "corset_red" + +/obj/item/clothing/accessory/corset/blue + name = "blue corset" + desc = "A blue corset for those fancy nights out." + icon_state = "corset_blue" + item_state = "corset_blue" + item_color = "corset_blue" + /obj/item/clothing/accessory/petcollar name = "pet collar" desc = "The latest fashion accessory for your favorite pets!" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 6dc1e1f2991..34435e5d66c 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -787,6 +787,7 @@ lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi' righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi' flags = NODROP + has_sensor = 0 // HUNKE /obj/item/clothing/under/victdress @@ -829,4 +830,4 @@ icon_state = "medicalgown" item_state = "medicalgown" item_color = "medicalgown" - body_parts_covered = UPPER_TORSO|LOWER_TORSO + body_parts_covered = UPPER_TORSO|LOWER_TORSO \ No newline at end of file diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 1f6d942e7b5..4539fa6de79 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -533,6 +533,13 @@ icon_state = "hairflowerp" item_state = "hairflowerp" +/obj/item/clothing/head/valkyriehelmet //R3Valkyrie: Rikki + name = "charred visor" + desc = "A visor of alien origin, charred by fire and completely non-functioning. It's been impeccably polished, shiny!" + icon = 'icons/obj/custom_items.dmi' + icon_state = "charred_visor" + species_restricted = list("Vox") + /obj/item/clothing/head/bearpelt/fluff/polar //Gibson1027: Sploosh name = "polar bear pelt hat" desc = "Fuzzy, and also stained with blood." diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index eb62395c82a..d22d4eb2c93 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -2490,3 +2490,11 @@ icon_state = "tatortot" list_reagents = list("nutriment" = 4) filling_color = "FFD700" + +/obj/item/weapon/reagent_containers/food/snacks/onionrings + name = "onion rings" + desc = "Onion slices coated in batter." + icon_state = "onionrings" + list_reagents = list("nutriment" = 3) + filling_color = "#C0C9A0" + gender = PLURAL \ No newline at end of file diff --git a/code/modules/food_and_drinks/recipes/recipes_microwave.dm b/code/modules/food_and_drinks/recipes/recipes_microwave.dm index a0998a67a58..329e39011eb 100644 --- a/code/modules/food_and_drinks/recipes/recipes_microwave.dm +++ b/code/modules/food_and_drinks/recipes/recipes_microwave.dm @@ -541,6 +541,10 @@ datum/recipe/microwave/slimesandwich being_cooked.reagents.del_reagent("toxin") return being_cooked +/datum/recipe/microwave/onionrings + items = list(/obj/item/weapon/reagent_containers/food/snacks/onion_slice) + result = /obj/item/weapon/reagent_containers/food/snacks/onionrings + ////////////////////////////FOOD ADDITTIONS/////////////////////////////// /datum/recipe/microwave/wrap diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index bade37d1b3a..5e15b984a7a 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -15,11 +15,12 @@ var/datum/plant_gene/target var/operation = "" - var/rating = 0 - var/max_extract_pot = 50 - // The cap on potency gene extraction. - // This number is for T1, each upgraded part adds 5% for a tech level above T1. - // At T4, it reaches 95%. + var/max_potency = 50 // See RefreshParts() for how these work + var/max_yield = 2 + var/min_production = 12 + var/max_endurance = 10 // IMPT: ALSO AFFECTS LIFESPAN + var/min_wchance = 67 + var/min_wrate = 10 /obj/machinery/plantgenes/New() ..() @@ -40,13 +41,27 @@ QDEL_NULL(disk) return ..() -/obj/machinery/plantgenes/RefreshParts() - rating = 0 - for(var/I in component_parts) - if(istype(I, /obj/item/weapon/stock_parts)) - var/obj/item/weapon/stock_parts/S = I - rating += S.rating-1 - max_extract_pot = initial(max_extract_pot) + rating*5 +/obj/machinery/plantgenes/RefreshParts() // Comments represent the max you can set per tier, respectively. seeds.dm [219] clamps these for us but we don't want to mislead the viewer. + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + if(M.rating > 3) + max_potency = 95 + else + max_potency = initial(max_potency) + (M.rating**3) // 51,58,77,95 Clamps at 100 + + max_yield = initial(max_yield) + (M.rating*2) // 4,6,8,10 Clamps at 10 + + for(var/obj/item/weapon/stock_parts/scanning_module/SM in component_parts) + if(SM.rating > 3) //If you create t5 parts I'm a step ahead mwahahaha! + min_production = 1 + else + min_production = 12 - (SM.rating * 3) //9,6,3,1. Requires if to avoid going below clamp [1] + + max_endurance = initial(max_endurance) + (SM.rating * 25) // 35,60,85,100 Clamps at 10min 100max + + for(var/obj/item/weapon/stock_parts/micro_laser/ML in component_parts) + var/wratemod = ML.rating * 2.5 + min_wrate = Floor(10-wratemod) // 7,5,2,0 Clamps at 0 and 10 You want this low + min_wchance = 67-(ML.rating*16) // 48,35,19,3 Clamps at 0 and 67 You want this low /obj/machinery/plantgenes/update_icon() ..() @@ -133,11 +148,36 @@ if("extract") dat += "[target.get_name()] gene from \the [seed]?
" dat += "The sample will be destroyed in process!" - if(istype(target, /datum/plant_gene/core/potency)) + if(istype(target, /datum/plant_gene/core)) var/datum/plant_gene/core/gene = target - if(gene.value > max_extract_pot) - dat += "

This device's extraction capabilities are currently limited to [max_extract_pot] potency. " - dat += "Target gene will be degraded to [max_extract_pot] potency on extraction." + if(istype(target, /datum/plant_gene/core/potency)) + if(gene.value > max_potency) + dat += "

This device's extraction capabilities are currently limited to [max_potency] potency. " + dat += "Target gene will be degraded to [max_potency] potency on extraction." + else if(istype(target, /datum/plant_gene/core/lifespan)) + if(gene.value > max_endurance) + dat += "

This device's extraction capabilities are currently limited to [max_endurance] lifespan. " + dat += "Target gene will be degraded to [max_endurance] Lifespan on extraction." + else if(istype(target, /datum/plant_gene/core/endurance)) + if(gene.value > max_endurance) + dat += "

This device's extraction capabilities are currently limited to [max_endurance] endurance. " + dat += "Target gene will be degraded to [max_endurance] endurance on extraction." + else if(istype(target, /datum/plant_gene/core/yield)) + if(gene.value > max_yield) + dat += "

This device's extraction capabilities are currently limited to [max_yield] yield. " + dat += "Target gene will be degraded to [max_yield] yield on extraction." + else if(istype(target, /datum/plant_gene/core/production)) + if(gene.value < min_production) + dat += "

This device's extraction capabilities are currently limited to [min_production] production. " + dat += "Target gene will be degraded to [min_production] production on extraction." + else if(istype(target, /datum/plant_gene/core/weed_rate)) + if(gene.value < min_wrate) + dat += "

This device's extraction capabilities are currently limited to [min_wrate] weed rate. " + dat += "Target gene will be degraded to [min_wrate] weed rate on extraction." + else if(istype(target, /datum/plant_gene/core/weed_chance)) + if(gene.value < min_wchance) + dat += "

This device's extraction capabilities are currently limited to [min_wchance] weed chance. " + dat += "Target gene will be degraded to [min_wchance] weed chance on extraction." if("replace") dat += "[target.get_name()] gene with [disk.gene.get_name()]?
" if("insert") @@ -292,9 +332,22 @@ if("extract") if(disk && !disk.read_only) disk.gene = G.Copy() - if(istype(disk.gene, /datum/plant_gene/core/potency)) + if(istype(disk.gene, /datum/plant_gene/core)) var/datum/plant_gene/core/gene = disk.gene - gene.value = min(gene.value, max_extract_pot) + if(istype(disk.gene, /datum/plant_gene/core/potency)) + gene.value = min(gene.value, max_potency) + else if(istype(disk.gene, /datum/plant_gene/core/lifespan)) + gene.value = min(gene.value, max_endurance) //INTENDED + else if(istype(disk.gene, /datum/plant_gene/core/endurance)) + gene.value = min(gene.value, max_endurance) + else if(istype(disk.gene, /datum/plant_gene/core/production)) + gene.value = max(gene.value, min_production) + else if(istype(disk.gene, /datum/plant_gene/core/yield)) + gene.value = min(gene.value, max_yield) + else if(istype(disk.gene, /datum/plant_gene/core/weed_rate)) + gene.value = max(gene.value, min_wrate) + else if(istype(disk.gene, /datum/plant_gene/core/weed_chance)) + gene.value = max(gene.value, min_wchance) disk.update_name() QDEL_NULL(seed) update_icon() @@ -397,7 +450,7 @@ /obj/item/weapon/disk/plantgene/proc/update_name() if(gene) - name = "plant data disk - '[gene.get_name()]'" + name = "[gene.get_name()] (Plant Data Disk)" else name = "plant data disk" diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 82abda8e7d6..8e2e83675e0 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -112,6 +112,7 @@ for(var/datum/plant_gene/trait/trait in seed.genes) trait.on_squash(src, target) + reagents.reaction(T) for(var/A in T) if(reagents) reagents.reaction(A) diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index 2e05e3f18a0..6afeb4502d3 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -1,18 +1,30 @@ -// Weeds -/obj/item/seeds/weeds - name = "pack of weed seeds" - desc = "Yo mang, want some weeds?" - icon_state = "seed" - species = "weeds" +// Starthistle +/obj/item/seeds/starthistle + name = "pack of starthistle seeds" + desc = "A robust species of weed that often springs up in-between the cracks of spaceship parking lots" + icon_state = "seed-starthistle" + species = "starthistle" plantname = "Starthistle" - lifespan = 100 + lifespan = 70 endurance = 50 // damm pesky weeds maturation = 5 production = 1 - yield = -1 - potency = -1 - growthstages = 4 + yield = 2 + potency = 10 + growthstages = 3 + growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' genes = list(/datum/plant_gene/trait/plant_type/weed_hardy) + mutatelist = list(/obj/item/seeds/harebell) + +/obj/item/seeds/starthistle/harvest(mob/user) + var/obj/machinery/hydroponics/parent = loc + if(prob(getYield() * 20)) + var/output_loc = parent.Adjacent(user) ? user.loc : parent.loc + for(var/i in 1 to yield+1) + var/obj/item/seeds/starthistle/harvestseeds = Copy() + harvestseeds.forceMove(output_loc) + + parent.update_tray() // Cabbage diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm new file mode 100644 index 00000000000..41229481d8d --- /dev/null +++ b/code/modules/hydroponics/grown/onion.dm @@ -0,0 +1,61 @@ +/obj/item/seeds/onion + name = "pack of onion seeds" + desc = "These seeds grow into onions." + icon_state = "seed-onion" + species = "onion" + plantname = "Onion Sprouts" + product = /obj/item/weapon/reagent_containers/food/snacks/grown/onion + lifespan = 20 + maturation = 3 + production = 4 + yield = 6 + endurance = 25 + growthstages = 3 + weed_chance = 3 + growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.1) + mutatelist = list(/obj/item/seeds/onion/red) + +/obj/item/weapon/reagent_containers/food/snacks/grown/onion + seed = /obj/item/seeds/onion + name = "onion" + desc = "Nothing to cry over." + icon_state = "onion" + filling_color = "#C0C9A0" + bitesize_mod = 2 + slice_path = /obj/item/weapon/reagent_containers/food/snacks/onion_slice + slices_num = 2 + +/obj/item/seeds/onion/red + name = "pack of red onion seeds" + desc = "For growing exceptionally potent onions." + icon_state = "seed-onionred" + species = "onion_red" + plantname = "Red Onion Sprouts" + weed_chance = 1 + product = /obj/item/weapon/reagent_containers/food/snacks/grown/onion/red + reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.1, "onionjuice" = 0.05) + +/obj/item/weapon/reagent_containers/food/snacks/grown/onion/red + seed = /obj/item/seeds/onion/red + name = "red onion" + desc = "Purple despite the name." + icon_state = "onion_red" + filling_color = "#C29ACF" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/onion_slice/red + +/obj/item/weapon/reagent_containers/food/snacks/onion_slice + name = "onion slices" + desc = "Rings, not for wearing." + icon_state = "onionslice" + list_reagents = list("plantmatter" = 5, "vitamin" = 2) + filling_color = "#C0C9A0" + gender = PLURAL + cooked_type = /obj/item/weapon/reagent_containers/food/snacks/onionrings + +/obj/item/weapon/reagent_containers/food/snacks/onion_slice/red + name = "red onion slices" + desc = "They shine like exceptionally low quality amethyst." + icon_state = "onionslice_red" + filling_color = "#C29ACF" + list_reagents = list("plantmatter" = 5, "vitamin" = 2, "onionjuice" = 2.5) \ No newline at end of file diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 339459669be..c70def96fde 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -50,6 +50,9 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus, /obj/item/weapon/reagent_containers/food/snacks/grown/wheat) +/obj/item/weapon/grown/log/New() + ..() + accepted = typecacheof(accepted) /obj/item/weapon/grown/log/attackby(obj/item/weapon/W, mob/user, params) if(is_sharp(W)) @@ -66,7 +69,7 @@ to_chat(user, "You add the newly-formed [plank_name] to the stack. It now contains [plank.amount] [plank_name].") qdel(src) - if(is_type_in_list(W,accepted)) + if(is_type_in_typecache(W, accepted)) var/obj/item/weapon/reagent_containers/food/snacks/grown/leaf = W if(leaf.dry) user.show_message("You wrap \the [W] around the log, turning it into a torch!") @@ -138,7 +141,7 @@ /obj/structure/bonfire/proc/CheckOxygen() var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment - if(G.oxygen > 16) + if(G.oxygen > 13) return 1 return 0 diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index c3449514edc..6c5b1b0adf1 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -30,6 +30,8 @@ var/lid_state = 0 var/recent_bee_visit = FALSE //Have we been visited by a bee recently, so bees dont overpollinate one plant var/using_irrigation = FALSE //If the tray is connected to other trays via irrigation hoses + var/self_sufficiency_req = 20 //Required total dose to make a self-sufficient hydro tray. 1:1 with earthsblood. + var/self_sufficiency_progress = 0 var/self_sustaining = FALSE //If the tray generates nutrients and water on its own hud_possible = list (PLANT_NUTRIENT_HUD, PLANT_WATER_HUD, PLANT_STATUS_HUD, PLANT_HEALTH_HUD, PLANT_TOXIN_HUD, PLANT_PEST_HUD, PLANT_WEED_HUD) @@ -358,6 +360,9 @@ if(!self_sustaining) to_chat(user, "Water: [waterlevel]/[maxwater]") to_chat(user, "Nutrient: [nutrilevel]/[maxnutri]") + if(self_sufficiency_progress > 0) + var/percent_progress = round(self_sufficiency_progress * 100 / self_sufficiency_req) + to_chat(user, "Treatment for self-sustenance are [percent_progress]% complete.") else to_chat(user, "It doesn't require any water or nutrients.") @@ -392,7 +397,7 @@ if(4 to 5) myseed = new /obj/item/seeds/plump(src) else - myseed = new /obj/item/seeds/weeds(src) + myseed = new /obj/item/seeds/starthistle(src) age = 0 plant_health = myseed.endurance lastcycle = world.time @@ -546,6 +551,14 @@ adjustNutri(round(S.get_reagent_amount("fishwater") * 0.75)) adjustWater(round(S.get_reagent_amount("fishwater") * 1)) + // Ambrosia Gaia produces earthsblood. + if(S.has_reagent("earthsblood")) + self_sufficiency_progress += S.get_reagent_amount("earthsblood") + if(self_sufficiency_progress >= self_sufficiency_req) + become_self_sufficient() + else if(!self_sustaining) + to_chat(user, "[src] warms as it might on a spring day under a genuine Sun.") + // Antitoxin binds shit pretty well. So the tox goes significantly down if(S.has_reagent("charcoal", 1)) adjustToxic(-round(S.get_reagent_amount("charcoal") * 2)) @@ -720,33 +733,7 @@ /obj/machinery/hydroponics/attackby(obj/item/O, mob/user, params) //Called when mob user "attacks" it with object O - if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/gaia)) //Checked early on so it doesn't have to deal with composting checks - if(self_sustaining) - to_chat(user, "This [name] is already self-sustaining!") - return - if(myseed || weedlevel) - to_chat(user, "[src] needs to be clear of plants and weeds!") - return - if(alert(user, "This will make [src] self-sustaining but consume [O] forever. Are you sure?", "[name]", "I'm Sure", "Abort") == "Abort" || !user) - return - if(!O || qdeleted(O)) - return - if(!Adjacent(user)) - return - if(self_sustaining) - to_chat(user, "This [name] is already self-sustaining!") - return - if(myseed || weedlevel) - to_chat(user, "[src] needs to be clear of plants and weeds!") - return - user.visible_message("[user] gently pulls open the soil for [O] and places it inside.", "You tenderly root [O] into [src].") - user.drop_item() - qdel(O) - visible_message("[src] begins to glow with a beautiful light!") - self_sustaining = TRUE - update_icon() - - else if(istype(O, /obj/item/weapon/reagent_containers) ) // Syringe stuff (and other reagent containers now too) + if(istype(O, /obj/item/weapon/reagent_containers)) // Syringe stuff (and other reagent containers now too) var/obj/item/weapon/reagent_containers/reagent_source = O if(istype(reagent_source, /obj/item/weapon/reagent_containers/syringe)) @@ -988,6 +975,11 @@ var/mob/living/simple_animal/hostile/C = new chosen C.faction = list("plants") +/obj/machinery/hydroponics/proc/become_self_sufficient() // Ambrosia Gaia effect + visible_message("[src] begins to glow with a beautiful light!") + self_sustaining = TRUE + update_icon() + ///Diona Nymph Related Procs/// /obj/machinery/hydroponics/CanPass(atom/movable/mover, turf/target, height=0) //So nymphs can climb over top of trays. if(height==0) diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index b9b1c8efcc6..efc3d0f594f 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -267,7 +267,7 @@ rate = 0.03 examine_line = "It emits a soft glow." trait_id = "glow" - var/glow_color = "#AAD84B" + var/glow_color = "#C3E381" /datum/plant_gene/trait/glow/proc/glow_range(obj/item/seeds/S) return 1.4 + S.potency*rate @@ -284,6 +284,7 @@ //adds -potency*(rate*0.05) light power to products name = "Shadow Emission" rate = 0.04 + glow_color = "#AAD84B" /datum/plant_gene/trait/glow/shadow/glow_power(obj/item/seeds/S) return -max(S.potency*(rate*0.05), 0.075) diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index daeebf8442f..2abc612f758 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -125,3 +125,11 @@ /obj/item/organ/internal/brain/Destroy() //copypasted from MMIs. QDEL_NULL(brainmob) return ..() + +/obj/item/organ/internal/brain/cluwne + +/obj/item/organ/internal/brain/cluwne/insert(mob/living/target, special = 0, make_cluwne = 1) + ..(target, special = special) + if(ishuman(target) && make_cluwne) + var/mob/living/carbon/human/H = target + H.makeCluwne() //No matter where you go, no matter what you do, you cannot escape \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon_defenses.dm b/code/modules/mob/living/carbon/carbon_defenses.dm index a570ad50cb3..6878a0f28f7 100644 --- a/code/modules/mob/living/carbon/carbon_defenses.dm +++ b/code/modules/mob/living/carbon/carbon_defenses.dm @@ -40,3 +40,7 @@ if(D.IsSpreadByTouch()) ContractDisease(D) return 0 + +/mob/living/carbon/is_mouth_covered(head_only = FALSE, mask_only = FALSE) + if((!mask_only && head && (head.flags_cover & HEADCOVERSMOUTH)) || (!head_only && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH))) + return TRUE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index e258962f784..3cb6cec5720 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -210,19 +210,14 @@ H.ha_style = "None" update_head_accessory() -/mob/living/carbon/human/proc/change_eye_color(var/red, var/green, var/blue, update_dna = 1) +/mob/living/carbon/human/proc/change_eye_color(var/colour = "#000000", update_dna = 1) // Update the main DNA datum, then sync the change across the organs var/obj/item/organ/internal/eyes/eyes_organ = get_int_organ(/obj/item/organ/internal/eyes) if(eyes_organ) - var/eyes_red = eyes_organ.eye_colour[1] - var/eyes_green = eyes_organ.eye_colour[2] - var/eyes_blue = eyes_organ.eye_colour[3] - if(red == eyes_red && green == eyes_green && blue == eyes_blue) + if(colour == eyes_organ.eye_colour) return - eyes_organ.eye_colour[1] = red - eyes_organ.eye_colour[2] = green - eyes_organ.eye_colour[3] = blue + eyes_organ.eye_colour = colour dna.eye_color_to_dna(eyes_organ) eyes_organ.set_dna(dna) @@ -233,68 +228,58 @@ update_body() return 1 -/mob/living/carbon/human/proc/change_hair_color(var/red, var/green, var/blue, var/secondary) +/mob/living/carbon/human/proc/change_hair_color(var/colour = "#000000", var/secondary) var/obj/item/organ/external/head/H = get_organ("head") if(!H) return if(!secondary) - if(red == H.r_hair && green == H.g_hair && blue == H.b_hair) + if(colour == H.hair_colour) return - H.r_hair = red - H.g_hair = green - H.b_hair = blue + H.hair_colour = colour else - if(red == H.r_hair_sec && green == H.g_hair_sec && blue == H.b_hair_sec) + if(colour == H.sec_hair_colour) return - H.r_hair_sec = red - H.g_hair_sec = green - H.b_hair_sec = blue + H.sec_hair_colour = colour update_hair() return 1 -/mob/living/carbon/human/proc/change_facial_hair_color(var/red, var/green, var/blue, var/secondary) +/mob/living/carbon/human/proc/change_facial_hair_color(var/colour = "#000000", var/secondary) var/obj/item/organ/external/head/H = get_organ("head") if(!H) return if(!secondary) - if(red == H.r_facial && green == H.g_facial && blue == H.b_facial) + if(colour == H.facial_colour) return - H.r_facial = red - H.g_facial = green - H.b_facial = blue + H.facial_colour = colour else - if(red == H.r_facial_sec && green == H.g_facial_sec && blue == H.b_facial_sec) + if(colour == H.sec_facial_colour) return - H.r_facial_sec = red - H.g_facial_sec = green - H.b_facial_sec = blue + H.sec_facial_colour = colour update_fhair() return 1 -/mob/living/carbon/human/proc/change_head_accessory_color(var/red, var/green, var/blue) +/mob/living/carbon/human/proc/change_head_accessory_color(var/colour = "#000000") var/obj/item/organ/external/head/H = get_organ("head") if(!H) return - if(red == H.r_headacc && green == H.g_headacc && blue == H.b_headacc) + if(colour == H.headacc_colour) return - H.r_headacc = red - H.g_headacc = green - H.b_headacc = blue + H.headacc_colour = colour update_head_accessory() return 1 -/mob/living/carbon/human/proc/change_marking_color(var/colour, var/location = "body") +/mob/living/carbon/human/proc/change_marking_color(var/colour = "#000000", var/location = "body") if(colour == m_colours[location]) return @@ -307,13 +292,11 @@ return 1 -/mob/living/carbon/human/proc/change_skin_color(var/red, var/green, var/blue) - if(red == r_skin && green == g_skin && blue == b_skin || !(species.bodyflags & HAS_SKIN_COLOR)) +/mob/living/carbon/human/proc/change_skin_color(var/colour = "#000000") + if(colour == skin_colour || !(species.bodyflags & HAS_SKIN_COLOR)) return - r_skin = red - g_skin = green - b_skin = blue + skin_colour = colour force_update_limbs() update_body() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index abf49571335..64fd0c00b08 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1397,13 +1397,9 @@ if(species.base_color && default_colour) //Apply colour. - r_skin = color2R(species.base_color) - g_skin = color2G(species.base_color) - b_skin = color2B(species.base_color) + skin_colour = species.base_color else - r_skin = 0 - g_skin = 0 - b_skin = 0 + skin_colour = "#000000" if(!(species.bodyflags & HAS_SKIN_TONE)) s_tone = 0 @@ -1427,29 +1423,17 @@ if(species.default_hair_colour) //Apply colour. - H.r_hair = color2R(species.default_hair_colour) - H.g_hair = color2G(species.default_hair_colour) - H.b_hair = color2B(species.default_hair_colour) + H.hair_colour = species.default_hair_colour else - H.r_hair = 0 - H.g_hair = 0 - H.b_hair = 0 + H.hair_colour = "#000000" if(species.default_fhair_colour) - H.r_facial = color2R(species.default_fhair_colour) - H.g_facial = color2G(species.default_fhair_colour) - H.b_facial = color2B(species.default_fhair_colour) + H.facial_colour = species.default_fhair_colour else - H.r_facial = 0 - H.g_facial = 0 - H.b_facial = 0 + H.facial_colour = "#000000" if(species.default_headacc_colour) - H.r_headacc = color2R(species.default_headacc_colour) - H.g_headacc = color2G(species.default_headacc_colour) - H.b_headacc = color2B(species.default_headacc_colour) + H.headacc_colour = species.default_headacc_colour else - H.r_headacc = 0 - H.g_headacc = 0 - H.b_headacc = 0 + H.headacc_colour = "#000000" m_styles = DEFAULT_MARKING_STYLES //Wipes out markings, setting them all to "None". m_colours = DEFAULT_MARKING_COLOURS //Defaults colour to #00000 for all markings. @@ -2020,3 +2004,7 @@ mob/living/carbon/human/get_taste_sensitivity() return species.taste_sensitivity else return 1 + +/mob/living/carbon/human/proc/special_post_clone_handling() + if(mind && mind.assigned_role == "Cluwne") //HUNKE your suffering never stops + makeCluwne() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 02b87dde494..9783673bc33 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -393,3 +393,10 @@ emp_act ..() species.water_act(src,volume,temperature,source) +/mob/living/carbon/human/is_eyes_covered(check_glasses = TRUE, check_head = TRUE, check_mask = TRUE) + if(check_glasses && glasses && (glasses.flags_cover & GLASSESCOVERSEYES)) + return TRUE + if(check_head && head && (head.flags_cover & HEADCOVERSEYES)) + return TRUE + if(check_mask && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH)) + return TRUE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index b0f3cdf8af7..393eae95299 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -10,9 +10,7 @@ var/global/default_martial_art = new/datum/martial_art var/s_tone = 0 //Skin tone //Skin colour - var/r_skin = 0 - var/g_skin = 0 - var/b_skin = 0 + var/skin_colour = "#000000" var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup var/lip_color = "white" diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 1d59ee45a6e..1e661ca7247 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -565,11 +565,8 @@ if((H in recolor_list) && H.reagents.total_volume > SLIMEPERSON_COLOR_SHIFT_TRIGGER) var/blood_amount = H.blood_volume var/r_color = mix_color_from_reagents(H.reagents.reagent_list) - var/new_body_color = BlendRGB(r_color, rgb(H.r_skin, H.g_skin, H.b_skin), (blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)/((blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)+(H.reagents.total_volume))) - var/list/new_color_list = ReadRGB(new_body_color) - H.r_skin = new_color_list[1] - H.g_skin = new_color_list[2] - H.b_skin = new_color_list[3] + var/new_body_color = BlendRGB(r_color, H.skin_colour, (blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)/((blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)+(H.reagents.total_volume))) + H.skin_colour = new_body_color if(world.time % SLIMEPERSON_ICON_UPDATE_PERIOD > SLIMEPERSON_ICON_UPDATE_PERIOD - 20) // The 20 is because this gets called every 2 seconds, from the mob controller for(var/organname in H.bodyparts_by_name) var/obj/item/organ/external/E = H.bodyparts_by_name[organname] diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 24554d047ad..0c5cf2d33d0 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -228,7 +228,7 @@ var/global/list/damage_icon_parts = list() var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes) if(eyes) - icon_key += "[rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3])]" + icon_key += "[eyes.eye_colour]" else icon_key += "#000000" @@ -248,7 +248,7 @@ var/global/list/damage_icon_parts = list() icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]" icon_key += "[part.dna.GetUIValue(DNA_UI_SKIN_TONE)]" if(part.s_col) - icon_key += "[rgb(part.s_col[1], part.s_col[2], part.s_col[3])]" + icon_key += "[part.s_col]" if(part.s_tone) icon_key += "[part.s_tone]" @@ -408,7 +408,7 @@ var/global/list/damage_icon_parts = list() if(head_organ.species.name in head_accessory_style.species_allowed) var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s") if(head_accessory_style.do_colouration) - head_accessory_s.Blend(rgb(head_organ.r_headacc, head_organ.g_headacc, head_organ.b_headacc), ICON_ADD) + head_accessory_s.Blend(head_organ.headacc_colour, ICON_ADD) head_accessory_standing = head_accessory_s //head_accessory_standing.Blend(head_accessory_s, ICON_OVERLAY) //Having it this way preserves animations. Useful for animated antennae. @@ -449,14 +449,14 @@ var/global/list/damage_icon_parts = list() if((head_organ.species.name in hair_style.species_allowed) || (head_organ.species.bodyflags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics... var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") if(head_organ.species.name == "Slime People") // I am el worstos - hair_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND) + hair_s.Blend("[skin_colour]A0", ICON_AND) else if(hair_style.do_colouration) - hair_s.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD) + hair_s.Blend(head_organ.hair_colour, ICON_ADD) if(hair_style.secondary_theme) var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s") if(!hair_style.no_sec_colour) - hair_secondary_s.Blend(rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec), ICON_ADD) + hair_secondary_s.Blend(head_organ.sec_hair_colour, ICON_ADD) hair_s.Blend(hair_secondary_s, ICON_OVERLAY) hair_standing = hair_s //hair_standing.Blend(hair_s, ICON_OVERLAY) @@ -495,14 +495,14 @@ var/global/list/damage_icon_parts = list() if((head_organ.species.name in facial_hair_style.species_allowed) || (head_organ.species.bodyflags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics... var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(head_organ.species.name == "Slime People") // I am el worstos - facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND) + facial_s.Blend("[skin_colour]A0", ICON_AND) else if(facial_hair_style.do_colouration) - facial_s.Blend(rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial), ICON_ADD) + facial_s.Blend(head_organ.facial_colour, ICON_ADD) if(facial_hair_style.secondary_theme) var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s") if(!facial_hair_style.no_sec_colour) - facial_secondary_s.Blend(rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec), ICON_ADD) + facial_secondary_s.Blend(head_organ.sec_facial_colour, ICON_ADD) facial_s.Blend(facial_secondary_s, ICON_OVERLAY) face_standing.Blend(facial_s, ICON_OVERLAY) @@ -1168,7 +1168,7 @@ var/global/list/damage_icon_parts = list() if(body_accessory.try_restrictions(src)) var/icon/accessory_s = new/icon("icon" = body_accessory.icon, "icon_state" = body_accessory.icon_state) if(species.bodyflags & HAS_SKIN_COLOR) - accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode) + accessory_s.Blend(skin_colour, body_accessory.blend_mode) if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed)) accessory_s.Blend(tail_marking_icon, ICON_OVERLAY) if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this) @@ -1193,7 +1193,7 @@ var/global/list/damage_icon_parts = list() if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space)) var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[tail]_s") if(species.bodyflags & HAS_SKIN_COLOR) - tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) + tail_s.Blend(skin_colour, ICON_ADD) if(tail_marking_icon && !tail_marking_style.tails_allowed) tail_s.Blend(tail_marking_icon, ICON_OVERLAY) if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this) @@ -1234,7 +1234,7 @@ var/global/list/damage_icon_parts = list() if(body_accessory) var/icon/accessory_s = new/icon("icon" = body_accessory.get_animated_icon(), "icon_state" = body_accessory.get_animated_icon_state()) if(species.bodyflags & HAS_SKIN_COLOR) - accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode) + accessory_s.Blend(skin_colour, body_accessory.blend_mode) if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed)) accessory_s.Blend(tail_marking_icon, ICON_OVERLAY) if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this) @@ -1261,7 +1261,7 @@ var/global/list/damage_icon_parts = list() else if(tail && species.bodyflags & HAS_TAIL) var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[tail]w_s") if(species.bodyflags & HAS_SKIN_COLOR) - tailw_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) + tailw_s.Blend(skin_colour, ICON_ADD) if(tail_marking_icon && !tail_marking_style.tails_allowed) tailw_s.Blend(tail_marking_icon, ICON_OVERLAY) if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index fa9624aa036..d757aff3ada 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -37,6 +37,11 @@ /mob/living/proc/getarmor(var/def_zone, var/type) return 0 +/mob/living/proc/is_mouth_covered(head_only = FALSE, mask_only = FALSE) + return FALSE + +/mob/living/proc/is_eyes_covered(check_glasses = TRUE, check_head = TRUE, check_mask = TRUE) + return FALSE /mob/living/bullet_act(var/obj/item/projectile/P, var/def_zone) //Armor diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 84f731d3669..d3354672ac9 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -706,7 +706,19 @@ var/list/ai_verbs_default = list( visible_message("[M] [M.attacktext] [src]!") add_logs(M, src, "attacked", admin=0, print_attack_log = 0) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - adjustBruteLoss(damage) + switch(M.melee_damage_type) + if(BRUTE) + adjustBruteLoss(damage) + if(BURN) + adjustFireLoss(damage) + if(TOX) + adjustToxLoss(damage) + if(OXY) + adjustOxyLoss(damage) + if(CLONE) + adjustCloneLoss(damage) + if(STAMINA) + adjustStaminaLoss(damage) updatehealth() /mob/living/silicon/ai/reset_perspective(atom/A) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 3454a6597ab..d1e81013dce 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -161,8 +161,8 @@ name = "matter decompiler" desc = "Eating trash, bits of glass, or other debris will replenish your stores." - icon = 'icons/obj/device.dmi' - icon_state = "decompiler" + icon = 'icons/obj/toy.dmi' + icon_state = "minigibber" //Metal, glass, wood, plastic. var/list/stored_comms = list( diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 2d863b99b4a..b3116d194b8 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -429,6 +429,7 @@ chemscan(src, A) /mob/living/simple_animal/bot/medbot/proc/medicate_patient(mob/living/carbon/C) + var/inject_beaker = FALSE if(!on) return @@ -484,7 +485,8 @@ if(reagent_id && use_beaker && reagent_glass && reagent_glass.reagents.total_volume) for(var/datum/reagent/R in reagent_glass.reagents.reagent_list) if(!C.reagents.has_reagent(R.id)) - reagent_id = "internal_beaker" + reagent_id = R.id + inject_beaker = TRUE break if(!reagent_id) //If they don't need any of that they're probably cured! @@ -501,7 +503,7 @@ spawn(30)//replace with do mob if((get_dist(src, patient) <= 1) && on && assess_patient(patient)) - if(reagent_id == "internal_beaker") + if(inject_beaker) if(use_beaker && reagent_glass && reagent_glass.reagents.total_volume) var/fraction = min(injection_amount/reagent_glass.reagents.total_volume, 1) reagent_glass.reagents.reaction(patient, INGEST, fraction) diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index bf648e537ab..863fe6f0754 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -9,6 +9,7 @@ universal_speak = 1 health = 40 maxHealth = 40 + pass_flags = PASSTABLE melee_damage_lower = 2 melee_damage_upper = 2 @@ -172,4 +173,4 @@ mind.transfer_to(mmi.brainmob) mmi = null name = "Spider-bot" - update_icon() \ No newline at end of file + update_icon() diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 75f1872fdad..a1ee93e986a 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -30,22 +30,16 @@ randomize_hair_color("facial") if(S.bodyflags & HAS_HEAD_ACCESSORY) ha_style = random_head_accessory(species) - var/list/colours = randomize_skin_color(1) - r_headacc = colours["red"] - g_headacc = colours["green"] - b_headacc = colours["blue"] + hacc_colour = randomize_skin_color(1) if(S.bodyflags & HAS_HEAD_MARKINGS) m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head) - var/list/colours = randomize_skin_color(1) - m_colours["head"] = rgb(colours["red"], colours["green"], colours["blue"]) + m_colours["head"] = randomize_skin_color(1) if(S.bodyflags & HAS_BODY_MARKINGS) m_styles["body"] = random_marking_style("body", species) - var/list/colours = randomize_skin_color(1) - m_colours["body"] = rgb(colours["red"], colours["green"], colours["blue"]) + m_colours["body"] = randomize_skin_color(1) if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings. m_styles["tail"] = random_marking_style("tail", species, null, body_accessory) - var/list/colours = randomize_skin_color(1) - m_colours["tail"] = rgb(colours["red"], colours["green"], colours["blue"]) + m_colours["tail"] = randomize_skin_color(1) if(!(S.bodyflags & ALL_RPARTS)) randomize_eyes_color() if(S.bodyflags & HAS_SKIN_COLOR) @@ -56,9 +50,7 @@ /datum/preferences/proc/randomize_hair_color(var/target = "hair") if(prob (75) && target == "facial") // Chance to inherit hair color - r_facial = r_hair - g_facial = g_hair - b_facial = b_hair + f_colour = h_colour return var/red @@ -106,13 +98,9 @@ switch(target) if("hair") - r_hair = red - g_hair = green - b_hair = blue + h_colour = rgb(red, green, blue) if("facial") - r_facial = red - g_facial = green - b_facial = blue + f_colour = rgb(red, green, blue) /datum/preferences/proc/randomize_eyes_color() var/red @@ -158,11 +146,9 @@ green = max(min(green + rand (-25, 25), 255), 0) blue = max(min(blue + rand (-25, 25), 255), 0) - r_eyes = red - g_eyes = green - b_eyes = blue + e_colour = rgb(red, green, blue) -/datum/preferences/proc/randomize_skin_color(var/pass_to_list) +/datum/preferences/proc/randomize_skin_color(var/pass_on) var/red var/green var/blue @@ -206,17 +192,10 @@ green = max(min(green + rand (-25, 25), 255), 0) blue = max(min(blue + rand (-25, 25), 255), 0) - if(pass_to_list) - var/list/colours = list( - "red" = red, - "blue" = blue, - "green" = green - ) - return colours + if(pass_on) + return rgb(red, green, blue) else - r_skin = red - g_skin = green - b_skin = blue + s_colour = rgb(red, green, blue) /datum/preferences/proc/blend_backpack(var/icon/clothes_s,var/backbag,var/satchel,var/backpack="backpack") switch(backbag) @@ -284,7 +263,7 @@ // Skin color if(current_species && (current_species.bodyflags & HAS_SKIN_COLOR)) - preview_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) + preview_icon.Blend(s_colour, ICON_ADD) // Skin tone if(current_species && (current_species.bodyflags & HAS_SKIN_TONE)) @@ -325,7 +304,7 @@ temp.Shift(NORTH, tail_shift_y) if(current_species && (current_species.bodyflags & HAS_SKIN_COLOR)) - temp.Blend(rgb(r_skin, g_skin, b_skin), blend_mode) + temp.Blend(s_colour, blend_mode) if(current_species && (current_species.bodyflags & HAS_TAIL_MARKINGS)) var/tail_marking = m_styles["tail"] @@ -358,7 +337,7 @@ var/icon/face_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "bald_s") if(!(current_species.bodyflags & NO_EYES)) var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = current_species ? current_species.eyes : "eyes_s") - eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) + eyes_s.Blend(e_colour, ICON_ADD) face_s.Blend(eyes_s, ICON_OVERLAY) @@ -366,14 +345,14 @@ if(hair_style) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") if(current_species.name == "Slime People") // whee I am part of the problem - hair_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_ADD) + hair_s.Blend("[s_colour]A0", ICON_ADD) else - hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) + hair_s.Blend(h_colour, ICON_ADD) if(hair_style.secondary_theme) var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s") if(!hair_style.no_sec_colour) - hair_secondary_s.Blend(rgb(r_hair_sec, g_hair_sec, b_hair_sec), ICON_ADD) + hair_secondary_s.Blend(h_sec_colour, ICON_ADD) hair_s.Blend(hair_secondary_s, ICON_OVERLAY) face_s.Blend(hair_s, ICON_OVERLAY) @@ -383,21 +362,21 @@ var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[ha_style] if(head_accessory_style && head_accessory_style.species_allowed) var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s") - head_accessory_s.Blend(rgb(r_headacc, g_headacc, b_headacc), ICON_ADD) + head_accessory_s.Blend(hacc_colour, ICON_ADD) face_s.Blend(head_accessory_s, ICON_OVERLAY) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] if(facial_hair_style && facial_hair_style.species_allowed) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(current_species.name == "Slime People") // whee I am part of the problem - facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_ADD) + facial_s.Blend("[s_colour]A0", ICON_ADD) else - facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) + facial_s.Blend(f_colour, ICON_ADD) if(facial_hair_style.secondary_theme) var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s") if(!facial_hair_style.no_sec_colour) - facial_secondary_s.Blend(rgb(r_facial_sec, g_facial_sec, b_facial_sec), ICON_ADD) + facial_secondary_s.Blend(f_sec_colour, ICON_ADD) facial_s.Blend(facial_secondary_s, ICON_OVERLAY) face_s.Blend(facial_s, ICON_OVERLAY) diff --git a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm index a868c0958ea..4d12bcb0ff8 100644 --- a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm @@ -122,8 +122,12 @@ var/datum/computer_file/F = HDD.find_file_by_name(href_list["name"]) if(!F || !istype(F)) return 1 - var/datum/computer_file/C = F.clone(1) - HDD.store_file(C) + var/newname = stripped_input(usr, "Enter clone file name:", "File clone", "Copy of " + F.filename, max_length=50) + if(F && newname) + var/datum/computer_file/C = F.clone(1) + C.filename = newname + if(!HDD.store_file(C)) + error = "I/O error: Unable to clone file. Hard drive is probably full." if("PRG_rename") . = 1 if(!HDD) @@ -152,6 +156,7 @@ if(F) var/datum/computer_file/data/backup = F.clone() HDD.remove_file(F) + F = backup.clone() //When the file gets removed from the HDD, it gets queued for garbage collection. Hacky fix is to make a copy. F.stored_data = newtext F.calculate_size() // We can't store the updated file, it's probably too large. Print an error and restore backed up version. diff --git a/code/modules/modular_computers/hardware/printer.dm b/code/modules/modular_computers/hardware/printer.dm index c5d8ba0cc77..05128dcc0bf 100644 --- a/code/modules/modular_computers/hardware/printer.dm +++ b/code/modules/modular_computers/hardware/printer.dm @@ -34,8 +34,13 @@ if(paper_title) P.name = paper_title P.update_icon() + P.populatefields() + P.updateinfolinks() stored_paper-- P = null + + playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) + return TRUE /obj/item/weapon/computer_hardware/printer/try_insert(obj/item/I, mob/living/user = null) diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm index 95738cd6354..41eadfc87aa 100644 --- a/code/modules/nano/modules/human_appearance.dm +++ b/code/modules/nano/modules/human_appearance.dm @@ -67,14 +67,10 @@ return owner.change_skin_tone(new_s_tone) if(href_list["skin_color"]) if(can_change_skin_color()) - var/new_skin = input(usr, "Choose your character's skin colour: ", "Skin Color", rgb(owner.r_skin, owner.g_skin, owner.b_skin)) as color|null - if(new_skin && can_still_topic(state)) - var/r_skin = color2R(new_skin) - var/g_skin = color2G(new_skin) - var/b_skin = color2B(new_skin) - if(owner.change_skin_color(r_skin, g_skin, b_skin)) - update_dna() - return 1 + var/new_skin = input(usr, "Choose your character's skin colour: ", "Skin Color", owner.skin_colour) as color|null + if(new_skin && can_still_topic(state) && owner.change_skin_color(new_skin)) + update_dna() + return 1 if(href_list["hair"]) if(can_change(APPEARANCE_HAIR) && (href_list["hair"] in valid_hairstyles)) if(owner.change_hair(href_list["hair"])) @@ -82,24 +78,16 @@ return 1 if(href_list["hair_color"]) if(can_change(APPEARANCE_HAIR_COLOR)) - var/new_hair = input("Please select hair color.", "Hair Color", rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair)) as color|null - if(new_hair && can_still_topic(state)) - var/r_hair = color2R(new_hair) - var/g_hair = color2G(new_hair) - var/b_hair = color2B(new_hair) - if(owner.change_hair_color(r_hair, g_hair, b_hair)) - update_dna() - return 1 + var/new_hair = input("Please select hair color.", "Hair Color", head_organ.hair_colour) as color|null + if(new_hair && can_still_topic(state) && owner.change_hair_color(new_hair)) + update_dna() + return 1 if(href_list["secondary_hair_color"]) if(can_change(APPEARANCE_SECONDARY_HAIR_COLOR)) - var/new_hair = input("Please select secondary hair color.", "Secondary Hair Color", rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec)) as color|null - if(new_hair && can_still_topic(state)) - var/r_hair_sec = color2R(new_hair) - var/g_hair_sec = color2G(new_hair) - var/b_hair_sec = color2B(new_hair) - if(owner.change_hair_color(r_hair_sec, g_hair_sec, b_hair_sec, 1)) - update_dna() - return 1 + var/new_hair = input("Please select secondary hair color.", "Secondary Hair Color", head_organ.sec_hair_colour) as color|null + if(new_hair && can_still_topic(state) && owner.change_hair_color(new_hair, 1)) + update_dna() + return 1 if(href_list["facial_hair"]) if(can_change(APPEARANCE_FACIAL_HAIR) && (href_list["facial_hair"] in valid_facial_hairstyles)) if(owner.change_facial_hair(href_list["facial_hair"])) @@ -107,42 +95,23 @@ return 1 if(href_list["facial_hair_color"]) if(can_change(APPEARANCE_FACIAL_HAIR_COLOR)) - var/new_facial = input("Please select facial hair color.", "Facial Hair Color", rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial)) as color|null - if(new_facial && can_still_topic(state)) - var/r_facial = color2R(new_facial) - var/g_facial = color2G(new_facial) - var/b_facial = color2B(new_facial) - if(owner.change_facial_hair_color(r_facial, g_facial, b_facial)) - update_dna() - return 1 + var/new_facial = input("Please select facial hair color.", "Facial Hair Color", head_organ.facial_colour) as color|null + if(new_facial && can_still_topic(state) && owner.change_facial_hair_color(new_facial)) + update_dna() + return 1 if(href_list["secondary_facial_hair_color"]) if(can_change(APPEARANCE_SECONDARY_FACIAL_HAIR_COLOR)) - var/new_facial = input("Please select secondary facial hair color.", "Secondary Facial Hair Color", rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec)) as color|null - if(new_facial && can_still_topic(state)) - var/r_facial_sec = color2R(new_facial) - var/g_facial_sec = color2G(new_facial) - var/b_facial_sec = color2B(new_facial) - if(owner.change_facial_hair_color(r_facial_sec, g_facial_sec, b_facial_sec, 1)) - update_dna() - return 1 + var/new_facial = input("Please select secondary facial hair color.", "Secondary Facial Hair Color", head_organ.sec_facial_colour) as color|null + if(new_facial && can_still_topic(state) && owner.change_facial_hair_color(new_facial, 1)) + update_dna() + return 1 if(href_list["eye_color"]) if(can_change(APPEARANCE_EYE_COLOR)) var/obj/item/organ/internal/eyes/eyes_organ = owner.get_int_organ(/obj/item/organ/internal/eyes) - var/eyes_red = 0 - var/eyes_green = 0 - var/eyes_blue = 0 - if(eyes_organ) - eyes_red = eyes_organ.eye_colour[1] - eyes_green = eyes_organ.eye_colour[2] - eyes_blue = eyes_organ.eye_colour[3] - var/new_eyes = input("Please select eye color.", "Eye Color", rgb(eyes_red, eyes_green, eyes_blue)) as color|null - if(new_eyes && can_still_topic(state)) - var/r_eyes = color2R(new_eyes) - var/g_eyes = color2G(new_eyes) - var/b_eyes = color2B(new_eyes) - if(owner.change_eye_color(r_eyes, g_eyes, b_eyes)) - update_dna() - return 1 + var/new_eyes = input("Please select eye color.", "Eye Color", eyes_organ.eye_colour) as color|null + if(new_eyes && can_still_topic(state) && owner.change_eye_color(new_eyes)) + update_dna() + return 1 if(href_list["head_accessory"]) if(can_change_head_accessory() && (href_list["head_accessory"] in valid_head_accessories)) if(owner.change_head_accessory(href_list["head_accessory"])) @@ -150,14 +119,10 @@ return 1 if(href_list["head_accessory_color"]) if(can_change_head_accessory()) - var/new_head_accessory = input("Please select head accessory color.", "Head Accessory Color", rgb(head_organ.r_headacc, head_organ.g_headacc, head_organ.b_headacc)) as color|null - if(new_head_accessory && can_still_topic(state)) - var/r_headacc = color2R(new_head_accessory) - var/g_headacc = color2G(new_head_accessory) - var/b_headacc = color2B(new_head_accessory) - if(owner.change_head_accessory_color(r_headacc, g_headacc, b_headacc)) - update_dna() - return 1 + var/new_head_accessory = input("Please select head accessory color.", "Head Accessory Color", head_organ.headacc_colour) as color|null + if(new_head_accessory && can_still_topic(state) && owner.change_head_accessory_color(new_head_accessory)) + update_dna() + return 1 if(href_list["head_marking"]) if(can_change_markings("head") && (href_list["head_marking"] in valid_head_marking_styles)) if(owner.change_markings(href_list["head_marking"], "head")) @@ -166,10 +131,9 @@ if(href_list["head_marking_color"]) if(can_change_markings("head")) var/new_markings = input("Please select head marking color.", "Marking Color", owner.m_colours["head"]) as color|null - if(new_markings && can_still_topic(state)) - if(owner.change_marking_color(new_markings, "head")) - update_dna() - return 1 + if(new_markings && can_still_topic(state) && owner.change_marking_color(new_markings, "head")) + update_dna() + return 1 if(href_list["body_marking"]) if(can_change_markings("body") && (href_list["body_marking"] in valid_body_marking_styles)) if(owner.change_markings(href_list["body_marking"], "body")) @@ -178,10 +142,9 @@ if(href_list["body_marking_color"]) if(can_change_markings("body")) var/new_markings = input("Please select body marking color.", "Marking Color", owner.m_colours["body"]) as color|null - if(new_markings && can_still_topic(state)) - if(owner.change_marking_color(new_markings, "body")) - update_dna() - return 1 + if(new_markings && can_still_topic(state) && owner.change_marking_color(new_markings, "body")) + update_dna() + return 1 if(href_list["tail_marking"]) if(can_change_markings("tail") && (href_list["tail_marking"] in valid_tail_marking_styles)) if(owner.change_markings(href_list["tail_marking"], "tail")) @@ -190,10 +153,9 @@ if(href_list["tail_marking_color"]) if(can_change_markings("tail")) var/new_markings = input("Please select tail marking color.", "Marking Color", owner.m_colours["tail"]) as color|null - if(new_markings && can_still_topic(state)) - if(owner.change_marking_color(new_markings, "tail")) - update_dna() - return 1 + if(new_markings && can_still_topic(state) && owner.change_marking_color(new_markings, "tail")) + update_dna() + return 1 if(href_list["body_accessory"]) if(can_change_body_accessory() && (href_list["body_accessory"] in valid_body_accessories)) if(owner.change_body_accessory(href_list["body_accessory"])) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index cd5b065b3ca..3991bc4bf60 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -204,18 +204,18 @@ /obj/item/weapon/paper/proc/parsepencode(var/t, var/obj/item/weapon/pen/P, mob/user as mob) t = pencode_to_html(t, usr, P, TRUE, TRUE, TRUE, deffont, signfont, crayonfont) + return t -//Count the fields +/obj/item/weapon/paper/proc/populatefields() + //Count the fields var/laststart = 1 while(fields < MAX_PAPER_FIELDS) - var/i = findtext(t, "", laststart) + var/i = findtext(info, "", laststart) if(i==0) break laststart = i+1 fields++ - return t - /obj/item/weapon/paper/proc/openhelp(mob/user as mob) user << browse({"Pen Help @@ -281,6 +281,8 @@ info += t // Oh, he wants to edit to the end of the file, let him. updateinfolinks() + populatefields() + i.on_write(src,usr) show_content(usr, forceshow = 1, infolinks = 1) diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm index db574418725..9b4ffbad1c4 100644 --- a/code/modules/reagents/chemistry/reagents/food.dm +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -492,6 +492,25 @@ M.adjustFireLoss(-1) ..() +/datum/reagent/consumable/onion + name = "Concentrated Onion Juice" + id = "onionjuice" + description = "A strong tasting substance that can induce partial blindness." + color = "#c0c9a0" + taste_message = "bitterness" + +/datum/reagent/consumable/onion/reaction_mob(mob/living/M, method = TOUCH, volume) + if(method == TOUCH) + if(!M.is_mouth_covered() && !M.is_eyes_covered()) + if(!M.get_organ_slot("eyes")) //can't blind somebody with no eyes + to_chat(M, "Your eye sockets feel wet.") + else + if(!M.eye_blurry) + to_chat(M, "Tears well up in your eyes!") + M.EyeBlind(2) + M.EyeBlurry(5) + ..() + /datum/reagent/consumable/chocolate name = "Chocolate" id = "chocolate" diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index 2463201b069..20144bff374 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -686,6 +686,9 @@ color = "#5096C8" /datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/human/M) + if(M.mind && M.mind.assigned_role == "Cluwne") // HUNKE + ..() + return M.SetJitter(0) var/needs_update = M.mutations.len > 0 || M.disabilities > 0 diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm index be541ad7982..93d151a022f 100644 --- a/code/modules/reagents/chemistry/reagents/misc.dm +++ b/code/modules/reagents/chemistry/reagents/misc.dm @@ -292,12 +292,10 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M var/obj/item/organ/external/head/head_organ = H.get_organ("head") - head_organ.r_facial = rand(0,255) - head_organ.g_facial = rand(0,255) - head_organ.b_facial = rand(0,255) - head_organ.r_hair = rand(0,255) - head_organ.g_hair = rand(0,255) - head_organ.b_hair = rand(0,255) + head_organ.facial_colour = rand_hex_color() + head_organ.sec_facial_colour = rand_hex_color() + head_organ.hair_colour = rand_hex_color() + head_organ.sec_hair_colour = rand_hex_color() H.update_hair() H.update_fhair() ..() diff --git a/code/modules/store/items.dm b/code/modules/store/items.dm index f660efc0d16..c80d3c33a94 100644 --- a/code/modules/store/items.dm +++ b/code/modules/store/items.dm @@ -189,6 +189,12 @@ typepath = /obj/item/flag/species/drask cost = 1000 +/datum/storeitem/flag_plasma + name = "Plasmaman flag" + desc = "A flag proudly proclaiming the superior heritage of Plasmamen." + typepath = /obj/item/flag/species/plasma + cost = 1000 + /datum/storeitem/flag_ian name = "Ian flag" desc = "The banner of Ian, because SQUEEEEE." diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm index 9f5c2649980..6670b6b0c87 100644 --- a/code/modules/surgery/cavity_implant.dm +++ b/code/modules/surgery/cavity_implant.dm @@ -15,6 +15,7 @@ name = "Robotic Cavity Implant/Removal" steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/cavity/place_item,/datum/surgery_step/robotics/external/close_hatch) possible_locs = list("chest","head","groin") + requires_organic_bodypart = 0 /datum/surgery/cavity_implant/can_start(mob/user, mob/living/carbon/human/target) if(!istype(target)) diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm index 7b04be81e1d..df6515c5e69 100644 --- a/code/modules/surgery/implant_removal.dm +++ b/code/modules/surgery/implant_removal.dm @@ -11,6 +11,7 @@ name = "Implant Removal" steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/extract_implant,/datum/surgery_step/robotics/external/close_hatch) possible_locs = list("chest") + requires_organic_bodypart = 0 /datum/surgery/implant_removal/can_start(mob/user, mob/living/carbon/human/target) if(!istype(target)) diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index 1e419fb1b2b..67f33c4989d 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -10,8 +10,8 @@ var/vision_flags = 0 var/dark_view = 0 var/see_invisible = 0 - var/list/eye_colour = list(0,0,0) - var/list/old_eye_colour = list(0,0,0) + var/eye_colour = "#000000" + var/old_eye_colour = "#000000" var/flash_protect = 0 var/aug_message = "Your vision is augmented!" @@ -40,7 +40,6 @@ /obj/item/organ/internal/cyberimp/eyes/xray name = "X-ray implant" desc = "These cybernetic eye implants will give you X-ray vision. Blinking is futile." - eye_colour = list(0, 0, 0) implant_color = "#000000" origin_tech = "materials=4;programming=4;biotech=6;magnets=4" vision_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS @@ -50,7 +49,7 @@ /obj/item/organ/internal/cyberimp/eyes/thermals name = "Thermals implant" desc = "These cybernetic eye implants will give you Thermal vision. Vertical slit pupil included." - eye_colour = list(255, 204, 0) + eye_colour = "#FFCC00" implant_color = "#FFCC00" vision_flags = SEE_MOBS flash_protect = -1 @@ -81,7 +80,7 @@ /obj/item/organ/internal/cyberimp/eyes/hud/medical name = "Medical HUD implant" desc = "These cybernetic eye implants will display a medical HUD over everything you see." - eye_colour = list(0,0,208) + eye_colour = "#0000D0" implant_color = "#00FFFF" origin_tech = "materials=4;programming=4;biotech=4" aug_message = "You suddenly see health bars floating above people's heads..." @@ -90,7 +89,7 @@ /obj/item/organ/internal/cyberimp/eyes/hud/security name = "Security HUD implant" desc = "These cybernetic eye implants will display a security HUD over everything you see." - eye_colour = list(208,0,0) + eye_colour = "#D00000" implant_color = "#CC0000" origin_tech = "materials=4;programming=4;biotech=3;combat=3" aug_message = "Job indicator icons pop up in your vision. That is not a certified surgeon..." diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 7c8aff47f43..f5b96ca6bd0 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -32,7 +32,7 @@ var/cannot_amputate var/cannot_break var/s_tone = null - var/list/s_col = null // If this is instantiated, it should be a list of length 3 + var/s_col = null // If this is instantiated, it should be a hex value. var/list/child_icons = list() var/perma_injury = 0 var/dismember_at_max_damage = FALSE diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm index 59e3de83894..c42a946661d 100644 --- a/code/modules/surgery/organs/organ_icon.dm +++ b/code/modules/surgery/organs/organ_icon.dm @@ -38,7 +38,7 @@ var/global/list/limb_icon_cache = list() s_tone = H.s_tone if(H.species.bodyflags & HAS_SKIN_COLOR) s_tone = null - s_col = list(H.r_skin, H.g_skin, H.b_skin) + s_col = H.skin_colour if(H.species.bodyflags & HAS_ICON_SKIN_TONE) var/obj/item/organ/external/chest/C = H.get_organ("chest") change_organ_icobase(C.icobase, C.deform) @@ -51,7 +51,7 @@ var/global/list/limb_icon_cache = list() s_tone = dna.GetUIValue(DNA_UI_SKIN_TONE) if(species.bodyflags & HAS_SKIN_COLOR) s_tone = null - s_col = list(dna.GetUIValue(DNA_UI_SKIN_R), dna.GetUIValue(DNA_UI_SKIN_G), dna.GetUIValue(DNA_UI_SKIN_B)) + s_col = rgb(dna.GetUIValue(DNA_UI_SKIN_R), dna.GetUIValue(DNA_UI_SKIN_G), dna.GetUIValue(DNA_UI_SKIN_B)) /obj/item/organ/external/head/sync_colour_to_human(var/mob/living/carbon/human/H) ..() @@ -69,8 +69,8 @@ var/global/list/limb_icon_cache = list() if(force_icon) mob_icon = new /icon(force_icon, "[icon_name]") if(species && species.name == "Machine") //snowflake for IPC's, sorry. - if(s_col && s_col.len >= 3) - mob_icon.Blend(rgb(s_col[1], s_col[2], s_col[3]), ICON_ADD) + if(s_col) + mob_icon.Blend(s_col, ICON_ADD) else var/new_icons = get_icon_state(skeletal) var/icon_file = new_icons[1] @@ -86,8 +86,8 @@ var/global/list/limb_icon_cache = list() mob_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD) else mob_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) - else if(s_col && s_col.len >= 3) - mob_icon.Blend(rgb(s_col[1], s_col[2], s_col[3]), ICON_ADD) + else if(s_col) + mob_icon.Blend(s_col, ICON_ADD) dir = EAST icon = mob_icon @@ -107,11 +107,11 @@ var/global/list/limb_icon_cache = list() if(species.eyes) var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', species.eyes) if(eye_implant) // Eye implants override native DNA eye color - eyes_icon.Blend(rgb(eye_implant.eye_colour[1],eye_implant.eye_colour[2],eye_implant.eye_colour[3]), ICON_ADD) + eyes_icon.Blend(eye_implant.eye_colour, ICON_ADD) else if(eyes) - eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) + eyes_icon.Blend(eyes.eye_colour, ICON_ADD) else - eyes_icon.Blend(rgb(128,0,0), ICON_ADD) + eyes_icon.Blend("#800000", ICON_ADD) mob_icon.Blend(eyes_icon, ICON_OVERLAY) overlays |= eyes_icon @@ -134,7 +134,7 @@ var/global/list/limb_icon_cache = list() if(head_accessory_style && head_accessory_style.species_allowed && (species.name in head_accessory_style.species_allowed)) var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s") if(head_accessory_style.do_colouration) - head_accessory_s.Blend(rgb(r_headacc, g_headacc, b_headacc), ICON_ADD) + head_accessory_s.Blend(headacc_colour, ICON_ADD) overlays |= head_accessory_s if(f_style) @@ -142,9 +142,9 @@ var/global/list/limb_icon_cache = list() if(facial_hair_style && ((facial_hair_style.species_allowed && (species.name in facial_hair_style.species_allowed)) || (src.species.bodyflags & ALL_RPARTS))) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(species.name == "Slime People") // I am el worstos - facial_s.Blend(rgb(owner.r_skin, owner.g_skin, owner.b_skin, 160), ICON_AND) + facial_s.Blend("[owner.skin_colour]A0", ICON_AND) //A0 = 160 alpha. else if(facial_hair_style.do_colouration) - facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) + facial_s.Blend(facial_colour, ICON_ADD) overlays |= facial_s if(h_style && !(owner.head && (owner.head.flags & BLOCKHEADHAIR))) @@ -152,9 +152,9 @@ var/global/list/limb_icon_cache = list() if(hair_style && ((species.name in hair_style.species_allowed) || (src.species.bodyflags & ALL_RPARTS))) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") if(species.name == "Slime People") // I am el worstos - hair_s.Blend(rgb(owner.r_skin, owner.g_skin, owner.b_skin, 160), ICON_AND) + hair_s.Blend("[owner.skin_colour]A0", ICON_AND) //A0 = 160 alpha. else if(hair_style.do_colouration) - hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) + hair_s.Blend(hair_colour, ICON_ADD) overlays |= hair_s return mob_icon diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 424bb3192f6..90932612438 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -9,6 +9,7 @@ // DO NOT add slots with matching names to different zones - it will break internal_organs_slot list! vital = 0 var/non_primary = 0 + var/unremovable = FALSE //Whether it shows up as an option to remove during surgery. /obj/item/organ/internal/New(var/mob/living/carbon/holder) ..() @@ -275,7 +276,6 @@ slot = "kidneys" /obj/item/organ/internal/kidneys/on_life() - ..() // Coffee is really bad for you with busted kidneys. // This should probably be expanded in some way, but fucked if I know // what else kidneys can process in our reagent list. @@ -294,7 +294,7 @@ organ_tag = "eyes" parent_organ = "head" slot = "eyes" - var/list/eye_colour = list(0,0,0) + var/eye_colour = "#000000" var/list/colourmatrix = null var/list/colourblind_matrix = MATRIX_GREYSCALE //Special colourblindness parameters. By default, it's black-and-white. var/colourblind_darkview = null @@ -388,7 +388,6 @@ var/alcohol_intensity = 1 /obj/item/organ/internal/liver/on_life() - ..() if(germ_level > INFECTION_LEVEL_ONE) if(prob(1)) to_chat(owner, " Your skin itches.") @@ -503,10 +502,6 @@ var/organhonked = 0 var/suffering_delay = 900 -/obj/item/organ/internal/honktumor/New() - ..() - processing_objects.Add(src) - /obj/item/organ/internal/honktumor/insert(mob/living/carbon/M, special = 0) ..() M.mutations.Add(CLUMSY) @@ -526,23 +521,9 @@ M.dna.SetSEState(COMICBLOCK,0) genemutcheck(M,CLUMSYBLOCK,null,MUTCHK_FORCED) genemutcheck(M,COMICBLOCK,null,MUTCHK_FORCED) - -/obj/item/organ/internal/honktumor/Destroy() - processing_objects.Remove(src) - return ..() - -/obj/item/organ/internal/honktumor/process() - if(isturf(loc)) - visible_message("[src] honks in on itself!") - new /obj/item/weapon/grown/bananapeel(get_turf(loc)) - qdel(src) - + qdel(src) /obj/item/organ/internal/honktumor/on_life() - - if(!owner) - return - if(organhonked < world.time) organhonked = world.time + suffering_delay to_chat(owner, "HONK") @@ -557,7 +538,7 @@ else owner.Jitter(500) - if(istype(owner, /mob/living/carbon/human)) + if(ishuman(owner)) var/mob/living/carbon/human/H = owner if(isobj(H.shoes)) var/thingy = H.shoes @@ -566,17 +547,15 @@ spawn(20) if(thingy) walk(thingy,0) - ..() /obj/item/organ/internal/honktumor/cursed + unremovable = TRUE -/obj/item/organ/internal/honktumor/cursed/remove(mob/living/carbon/M, special = 0, clean_remove = 0) - . = ..() - if(!clean_remove) - visible_message("[src] vanishes into dust, and a [M] emits a loud honk!", "You hear a loud honk.") - insert(M) //You're not getting away that easily! - else - qdel(src) +/obj/item/organ/internal/honktumor/cursed/on_life() //No matter what you do, no matter who you are, no matter where you go, you're always going to be a fat, stuttering dimwit. + ..() + owner.setBrainLoss(80) + owner.nutrition = 9000 + owner.overeatduration = 9000 /obj/item/organ/internal/beard name = "beard organ" @@ -600,13 +579,9 @@ head_organ.h_style = "Mohawk" else head_organ.h_style = "Very Long Hair" - head_organ.r_hair = 216 - head_organ.g_hair = 192 - head_organ.b_hair = 120 + head_organ.hair_colour = "#D8C078" H.update_hair() if(!(head_organ.f_style == "Very Long Beard")) head_organ.f_style = "Very Long Beard" - head_organ.r_facial = 216 - head_organ.g_facial = 192 - head_organ.b_facial = 120 + head_organ.facial_colour = "#D8C078" H.update_fhair() diff --git a/code/modules/surgery/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm index bf2aeced0d4..a18613d55af 100644 --- a/code/modules/surgery/organs/subtypes/standard.dm +++ b/code/modules/surgery/organs/subtypes/standard.dm @@ -169,27 +169,17 @@ var/alt_head = "None" //Hair colour and style - var/r_hair = 0 - var/g_hair = 0 - var/b_hair = 0 - var/r_hair_sec = 0 - var/g_hair_sec = 0 - var/b_hair_sec = 0 + var/hair_colour = "#000000" + var/sec_hair_colour = "#000000" var/h_style = "Bald" //Head accessory colour and style - var/r_headacc = 0 - var/g_headacc = 0 - var/b_headacc = 0 + var/headacc_colour = "#000000" var/ha_style = "None" //Facial hair colour and style - var/r_facial = 0 - var/g_facial = 0 - var/b_facial = 0 - var/r_facial_sec = 0 - var/g_facial_sec = 0 - var/b_facial_sec = 0 + var/facial_colour = "#000000" + var/sec_facial_colour = "#000000" var/f_style = "Shaved" /obj/item/organ/external/head/remove() diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 8bc0e799e11..ea6f293c7d2 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -169,6 +169,8 @@ return -1 for(var/obj/item/organ/internal/O in organs) + if(O.unremovable) + continue O.on_find(user) organs -= O organs[O.name] = O diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index f18787f1fe4..b4272364578 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -245,8 +245,10 @@ possible_locs = list("head", "chest", "groin") /datum/surgery/remove_thrall/synth + name = "Debug Shadow Tumor" steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/internal/dethrall,/datum/surgery_step/robotics/external/close_hatch) possible_locs = list("head", "chest", "groin") + requires_organic_bodypart = 0 /datum/surgery/remove_thrall/can_start(mob/user, mob/living/carbon/human/target) if(!istype(target)) diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm index d7fe8b7fb53..56162dcabc8 100644 --- a/code/modules/surgery/remove_embedded_object.dm +++ b/code/modules/surgery/remove_embedded_object.dm @@ -5,6 +5,7 @@ /datum/surgery/embedded_removal/synth steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/remove_object,/datum/surgery_step/robotics/external/close_hatch) + requires_organic_bodypart = 0 /datum/surgery/embedded_removal/can_start(mob/user, mob/living/carbon/human/target) if(!istype(target)) diff --git a/config/example/dbconfig.txt b/config/example/dbconfig.txt index e713bda4c7d..837e1c5946c 100644 --- a/config/example/dbconfig.txt +++ b/config/example/dbconfig.txt @@ -9,7 +9,7 @@ ## This value must be set to the version of the paradise schema in use. ## If this value does not match, the SQL database will not be loaded and an error will be generated. ## Roundstart will be delayed. -DB_VERSION 0 +DB_VERSION 1 ## Server the MySQL database can be found at. # Examples: localhost, 200.135.5.43, www.mysqldb.com, etc. diff --git a/html/changelog.html b/html/changelog.html index 93998d3b5dc..53bf8a03a7f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,97 @@ -->
+

16 August 2017

+

Citinited updated:

+
    +
  • Adds the plasmaman flag; credit to Shadeykins for the original sprite! Buy it at the merch store and show your superiority over other, less flammable, species!
  • +
  • All flags should now have in-hand sprites.
  • +
  • Burning a flag while it is in your hand will now update your mob's sprite.
  • +
+

Fethas updated:

+
    +
  • Swarmers can now deconstruct simply by clicking, ctrl click to teleport.
  • +
  • you can now deactivate depowered swarmers with a screwdriver.
  • +
  • Swarmers can now consume swarmer shells for a refund.
  • +
  • swarmer lights are cyan.
  • +
+ +

15 August 2017

+

Birdtalon updated:

+
    +
  • Medbots can now inject from their internal beakers.
  • +
  • Swarmers can no longer kill the AI with direct attacks.
  • +
  • Simple animal melee damage now has a sanity check for AI core.
  • +
+ +

14 August 2017

+

AndrewMontagne updated:

+
    +
  • Modular computers now print fields correctly.
  • +
  • Files on modular computers no longer vanish shortly after editing.
  • +
  • Modular computers printers now make printing noises.
  • +
  • You can no longer try and buy a tablet with a printer.
  • +
  • Cloning a file now works.
  • +
+

Birdtalon updated:

+
    +
  • Spiderbots can now pass tables, making their Hide worthwhile.
  • +
  • Fixes interactions with cargo crates.
  • +
+

Citinited updated:

+
    +
  • Nanotrasen's legal department clamped down on video cameras being misappropriated by crew, and as such cameras are now unable to broadcast from beyond the gateway.
  • +
+

Fethas updated:

+
    +
  • Dethaws some IPC surgery issues.
  • +
+

taukausanake updated:

+
    +
  • Adds an Atmospherics duffel bag that is yellow and blue
  • +
  • Adds sub-department colors to medical duffel bags and purple to Science duffel bags
  • +
  • Captain's lefthand west sprite corrected
  • +
+ +

10 August 2017

+

KasparoVy updated:

+
    +
  • Blood trails are now the same colour as the blood pools they came from when viewed by colour blind or noir shades wearing humanoids.
  • +
+ +

09 August 2017

+

Purpose2 updated:

+
    +
  • Adds a cycling airlock on the new mining mini outpost.
  • +
  • Re-adds the cycling airlock on mining outpost.
  • +
  • Fixes the broken atmos piping on mining outpost.
  • +
  • Fixes a lack of lighting on mining outpost.
  • +
+ +

06 August 2017

+

Birdtalon updated:

+
    +
  • Small wording change to syndicate collaborator greetings.
  • +
+

Fox McCloud updated:

+
    +
  • Botany nerfed; will need ambrosia gaia earth's blood to make a tray self-sustaining
  • +
  • Gene machine now requires heavy upgrading to make use of transferring high quality genes from one plant to another
  • +
  • Starthistle can now be grown
  • +
  • Adds in red and regular onions; slice them for onion rings; cook them for even more delicious onion rings
  • +
+

Kyep updated:

+
    +
  • Playing as a smite/bless hunter, or syndie infiltration team member, now requires that you be traitor-eligible. IE: have enough playtime, and the preference enabled.
  • +
+

Purpose2 updated:

+
    +
  • BoxStation: Adds a garbage receptacle by the kitchen. Don't forget to bus your plates.
  • +
  • BoxStation: Fixes an inappropriate access restriction on one part of an airlock, and ensures the buttons are visible.
  • +
  • BoxStation: Changes the now erroneous Science Shuttle Console on the bridge to a Labor Camp Shuttle Console.
  • +
  • Adds screwdrivers to Medical by the cell chargers for recharging the defibs.
  • +
+

05 August 2017

Purpose2 updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index dca16244b66..59a0615137b 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -5338,3 +5338,72 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2017-08-05: Purpose2: - bugfix: Karma message will now point you in the right direction again. +2017-08-06: + Birdtalon: + - tweak: Small wording change to syndicate collaborator greetings. + Fox McCloud: + - tweak: Botany nerfed; will need ambrosia gaia earth's blood to make a tray self-sustaining + - tweak: Gene machine now requires heavy upgrading to make use of transferring high + quality genes from one plant to another + - rscadd: Starthistle can now be grown + - rscadd: Adds in red and regular onions; slice them for onion rings; cook them + for even more delicious onion rings + Kyep: + - bugfix: 'Playing as a smite/bless hunter, or syndie infiltration team member, + now requires that you be traitor-eligible. IE: have enough playtime, and the + preference enabled.' + Purpose2: + - rscadd: 'BoxStation: Adds a garbage receptacle by the kitchen. Don''t forget to + bus your plates.' + - bugfix: 'BoxStation: Fixes an inappropriate access restriction on one part of + an airlock, and ensures the buttons are visible.' + - tweak: 'BoxStation: Changes the now erroneous Science Shuttle Console on the bridge + to a Labor Camp Shuttle Console.' + - rscadd: Adds screwdrivers to Medical by the cell chargers for recharging the defibs. +2017-08-09: + Purpose2: + - rscadd: Adds a cycling airlock on the new mining mini outpost. + - bugfix: Re-adds the cycling airlock on mining outpost. + - bugfix: Fixes the broken atmos piping on mining outpost. + - bugfix: Fixes a lack of lighting on mining outpost. +2017-08-10: + KasparoVy: + - bugfix: Blood trails are now the same colour as the blood pools they came from + when viewed by colour blind or noir shades wearing humanoids. +2017-08-14: + AndrewMontagne: + - bugfix: Modular computers now print fields correctly. + - bugfix: Files on modular computers no longer vanish shortly after editing. + - rscadd: Modular computers printers now make printing noises. + - bugfix: You can no longer try and buy a tablet with a printer. + - bugfix: Cloning a file now works. + Birdtalon: + - bugfix: Spiderbots can now pass tables, making their Hide worthwhile. + - bugfix: Fixes interactions with cargo crates. + Citinited: + - tweak: Nanotrasen's legal department clamped down on video cameras being misappropriated + by crew, and as such cameras are now unable to broadcast from beyond the gateway. + Fethas: + - bugfix: Dethaws some IPC surgery issues. + taukausanake: + - rscadd: Adds an Atmospherics duffel bag that is yellow and blue + - tweak: Adds sub-department colors to medical duffel bags and purple to Science + duffel bags + - bugfix: Captain's lefthand west sprite corrected +2017-08-15: + Birdtalon: + - bugfix: Medbots can now inject from their internal beakers. + - bugfix: Swarmers can no longer kill the AI with direct attacks. + - rscadd: Simple animal melee damage now has a sanity check for AI core. +2017-08-16: + Citinited: + - rscadd: Adds the plasmaman flag; credit to Shadeykins for the original sprite! + Buy it at the merch store and show your superiority over other, less flammable, + species! + - rscadd: All flags should now have in-hand sprites. + - tweak: Burning a flag while it is in your hand will now update your mob's sprite. + Fethas: + - tweak: Swarmers can now deconstruct simply by clicking, ctrl click to teleport. + - tweak: you can now deactivate depowered swarmers with a screwdriver. + - tweak: Swarmers can now consume swarmer shells for a refund. + - tweak: swarmer lights are cyan. diff --git a/html/changelogs/AutoChangeLog-pr-7763.yml b/html/changelogs/AutoChangeLog-pr-7763.yml new file mode 100644 index 00000000000..d916f2b3e04 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7763.yml @@ -0,0 +1,6 @@ +author: "Fox McCloud" +delete-after: True +changes: + - tweak: "Cluwning is far more difficult to remove" + - tweak: "Cluwne mask cannot be melted with acid" + - tweak: "Cluwne suit has no sensors" diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 93b0317b0aa..8214e814f7f 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi index 2dd84b4117c..7fc4aa0a9ba 100644 Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 75852a3a506..e2971a7c39c 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi index 29ebf19be94..c8a031431f8 100644 Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi index 0d43b6216f7..7388f41ac60 100644 Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ diff --git a/icons/mob/inhands/flags_lefthand.dmi b/icons/mob/inhands/flags_lefthand.dmi new file mode 100644 index 00000000000..c619b351106 Binary files /dev/null and b/icons/mob/inhands/flags_lefthand.dmi differ diff --git a/icons/mob/inhands/flags_righthand.dmi b/icons/mob/inhands/flags_righthand.dmi new file mode 100644 index 00000000000..84b4e2e8067 Binary files /dev/null and b/icons/mob/inhands/flags_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index bccdc57c656..d525b6dc4b8 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 e3b242b46f7..e6e8230f25e 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/species/drask/suit.dmi b/icons/mob/species/drask/suit.dmi index b323ea5c175..96ce0b8bb71 100644 Binary files a/icons/mob/species/drask/suit.dmi and b/icons/mob/species/drask/suit.dmi differ diff --git a/icons/mob/species/grey/suit.dmi b/icons/mob/species/grey/suit.dmi index 634acbfbffb..2766407b18b 100644 Binary files a/icons/mob/species/grey/suit.dmi and b/icons/mob/species/grey/suit.dmi differ diff --git a/icons/mob/species/vox/back.dmi b/icons/mob/species/vox/back.dmi index 0a88536cc83..a2f488122df 100644 Binary files a/icons/mob/species/vox/back.dmi and b/icons/mob/species/vox/back.dmi differ diff --git a/icons/mob/species/vox/shoes.dmi b/icons/mob/species/vox/shoes.dmi index 45f664c715a..0a65993e240 100644 Binary files a/icons/mob/species/vox/shoes.dmi and b/icons/mob/species/vox/shoes.dmi differ diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi index 8c40cb79347..ca8289a3ccb 100644 Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi index a482ece8b38..295293ad9de 100644 Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 3631097a2ba..c3942e015de 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi index ac64e6facf7..4f665031047 100644 Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi index 9d8f90d250e..e12b268a8f2 100644 Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ diff --git a/icons/obj/flag.dmi b/icons/obj/flag.dmi index 10126f99102..8b7b2d4a517 100644 Binary files a/icons/obj/flag.dmi and b/icons/obj/flag.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index d90a19f00b1..2fe44fcddd1 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/hydroponics/growing_flowers.dmi b/icons/obj/hydroponics/growing_flowers.dmi index e1f308c87b4..cceb7491212 100644 Binary files a/icons/obj/hydroponics/growing_flowers.dmi and b/icons/obj/hydroponics/growing_flowers.dmi differ diff --git a/icons/obj/hydroponics/growing_vegetables.dmi b/icons/obj/hydroponics/growing_vegetables.dmi index 070d3531a21..9fc1520175e 100644 Binary files a/icons/obj/hydroponics/growing_vegetables.dmi and b/icons/obj/hydroponics/growing_vegetables.dmi differ diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index d5bb7d48acb..bd596597624 100644 Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi index edc0ee4894f..a84ed3dd730 100644 Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 219ead6f3b5..8a5f14b9c70 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/nano/templates/computer_fabricator.tmpl b/nano/templates/computer_fabricator.tmpl index b5d80101b70..268f585a3da 100644 --- a/nano/templates/computer_fabricator.tmpl +++ b/nano/templates/computer_fabricator.tmpl @@ -14,7 +14,7 @@ Current Price: {{:data.totalprice}}C - + Battery: {{:helper.link('Standard', 'bolt', {'action' : 'hw_battery', 'battery' : 1}, data.hw_battery == 1 ? "selected" : null)}} {{:helper.link('Upgraded', 'bolt', {'action' : 'hw_battery', 'battery' : 2}, data.hw_battery == 2 ? "selected" : null)}} @@ -32,11 +32,13 @@ {{:helper.link('Standard', 'signal', {'action' : 'hw_netcard', 'netcard' : 1}, data.hw_netcard == 1 ? "selected" : null)}} {{:helper.link('Advanced', 'signal', {'action' : 'hw_netcard', 'netcard' : 2}, data.hw_netcard == 2 ? "selected" : null)}} + {{if data.devtype != 2}} Nano Printer: {{:helper.link('None', 'times', {'action' : 'hw_nanoprint', 'print' : 0}, data.hw_nanoprint == 0 ? "selected" : null)}} {{:helper.link('Standard', 'print', {'action' : 'hw_nanoprint', 'print' : 1}, data.hw_nanoprint == 1 ? "selected" : null)}} + {{/if}} Card Reader: {{:helper.link('None', 'times', {'action' : 'hw_card', 'card' : 0}, data.hw_card == 0 ? "selected" : null)}} @@ -61,7 +63,7 @@ {{:helper.link('CONFIRM', 'check', {'action' : 'confirm_order'})}} - +
    Battery allows your device to operate without external utility power source. Advanced batteries increase battery life.
    Hard Drive stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.
    @@ -79,4 +81,4 @@ {{else data.state == 3}}

    Step 4: Thank you for your purchase

    Should you experience any issues with your new device, contact technical support at support@computerservice.nt -{{/if}} \ No newline at end of file +{{/if}} diff --git a/paradise.dme b/paradise.dme index dcaa9f95262..34d3370e9e8 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1400,6 +1400,7 @@ #include "code\modules\hydroponics\grown\mushrooms.dm" #include "code\modules\hydroponics\grown\nettle.dm" #include "code\modules\hydroponics\grown\nymph.dm" +#include "code\modules\hydroponics\grown\onion.dm" #include "code\modules\hydroponics\grown\peanut.dm" #include "code\modules\hydroponics\grown\potato.dm" #include "code\modules\hydroponics\grown\pumpkin.dm"