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/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 8fd85ee88be..f804073d971 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -512,7 +512,7 @@ "ajR" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_y = 3},/turf/simulated/floor/plasteel,/area/security/main) "ajS" = (/obj/structure/stool/bed/chair,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/landmark/start{name = "Detective"},/turf/simulated/floor/plasteel,/area/security/main) "ajT" = (/obj/structure/stool/bed/chair,/obj/machinery/light{dir = 1; on = 1},/obj/effect/landmark/start{name = "Brig Physician"},/turf/simulated/floor/plasteel,/area/security/main) -"ajU" = (/obj/effect/decal/warning_stripes/northwest,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) +"ajU" = (/obj/effect/decal/warning_stripes/northwest,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) "ajV" = (/turf/simulated/floor/carpet,/area/security/hos) "ajW" = (/obj/machinery/door/poddoor{id_tag = "Execution Vent"; name = "Execution Vent Shutter"},/obj/structure/grille{layer = 2.69},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/execution{name = "\improper Prisoner Transfer Center"}) "ajX" = (/obj/structure/rack,/obj/item/weapon/tank/oxygen,/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/security,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/clothing/shoes/magboots,/obj/item/weapon/tank/jetpack/oxygen,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/security/podbay) @@ -558,7 +558,7 @@ "akL" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/multi,/obj/machinery/light{dir = 1; on = 1},/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "akM" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 4},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "akN" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/newscaster{pixel_y = 30},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) -"akO" = (/obj/structure/stool/bed/chair/e_chair{dir = 4},/obj/machinery/light/small{dir = 8},/obj/effect/landmark{name = "revenantspawn"},/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/obj/effect/decal/warning_stripes/west,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) +"akO" = (/obj/structure/stool/bed/chair/e_chair{dir = 4},/obj/effect/landmark{name = "revenantspawn"},/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/obj/effect/decal/warning_stripes/west,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) "akP" = (/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (NORTH)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 1},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox) "akQ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "Execution Shutter"; name = "Execution Decency Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/security/execution{name = "\improper Prisoner Transfer Center"}) "akR" = (/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 2},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox) @@ -606,7 +606,7 @@ "alH" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "alI" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/security/podbay) "alJ" = (/obj/structure/grille,/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/airless,/area/security/podbay) -"alK" = (/obj/machinery/camera{c_tag = "Prison Execution Chamber"; dir = 4; network = list("Prison","SS13")},/obj/effect/decal/warning_stripes/southwest,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_CO2 = 0; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) +"alK" = (/obj/machinery/camera{c_tag = "Prison Execution Chamber"; dir = 1; network = list("Prison","SS13")},/obj/effect/decal/warning_stripes/southwest,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_CO2 = 0; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) "alL" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "Execution Shutter"; name = "Execution Decency Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/security/execution{name = "\improper Prisoner Transfer Center"}) "alM" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/obj/effect/decal/warning_stripes/southeast,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) "alN" = (/obj/machinery/alarm{dir = 1; pixel_y = -24},/obj/machinery/light/small,/obj/machinery/atmospherics/binary/pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) @@ -1338,12 +1338,12 @@ "azL" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "azM" = (/obj/machinery/atmospherics/binary/pump{dir = 8; on = 1},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "azN" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air{filled = 0.1},/turf/simulated/floor/plating,/area/maintenance/fsmaint) -"azO" = (/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/pipe/simple/hidden{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1450; master_tag = "bar_maint"; name = "interior access button"; pixel_x = 25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fsmaint) +"azO" = (/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/pipe/simple/hidden{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1450; master_tag = "dorms_maint"; name = "interior access button"; pixel_x = 25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "azP" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint) -"azQ" = (/obj/machinery/airlock_sensor{frequency = 1450; id_tag = "bar_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1450; id_tag = "bar_maint"; pixel_x = 0; pixel_y = -25; req_access_txt = "13"; tag_airpump = "bar_pump"; tag_chamber_sensor = "bar_sensor"; tag_exterior_door = "bar_maint_outer"; tag_interior_door = "bar_maint_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1450; id_tag = "bar_pump"},/turf/simulated/floor/plating,/area/maintenance/fsmaint) -"azR" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "bar_maint_inner"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint) -"azS" = (/turf/space,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1450; master_tag = "bar_maint"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating/airless/catwalk,/area/space) -"azT" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "bar_maint_outer"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fsmaint) +"azQ" = (/obj/machinery/airlock_sensor{frequency = 1450; id_tag = "dorms_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1450; id_tag = "dorms_maint"; pixel_x = 0; pixel_y = -25; req_access_txt = "13"; tag_airpump = "dorms_pump"; tag_chamber_sensor = "dorms_sensor"; tag_exterior_door = "dorms_maint_outer"; tag_interior_door = "dorms_maint_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1450; id_tag = "dorms_pump"},/turf/simulated/floor/plating,/area/maintenance/fsmaint) +"azR" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "dorms_maint_inner"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint) +"azS" = (/turf/space,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1450; master_tag = "dorms_maint"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating/airless/catwalk,/area/space) +"azT" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "dorms_maint_outer"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "azU" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/solar/auxstarboard) "azV" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/security/prisonershuttle) "azW" = (/obj/machinery/door/window/brigdoor/southleft{req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/unary/vent_pump{dir = 2; layer = 2.4; on = 1},/turf/simulated/floor/plasteel,/area/security/courtroomdandp) @@ -1602,7 +1602,7 @@ "aEP" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation) "aEQ" = (/obj/structure/table/reinforced,/obj/structure/mirror{pixel_x = 28},/obj/item/weapon/razor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) "aER" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_chapel_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "solar_chapel_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "solar_chapel_airlock"; pixel_x = 25; req_access_txt = "13"; tag_airpump = "solar_chapel_pump"; tag_chamber_sensor = "solar_chapel_sensor"; tag_exterior_door = "solar_chapel_outer"; tag_interior_door = "solar_chapel_inner"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) -"aES" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/maintenance/abandonedbar) +"aES" = (/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/maintenance/abandonedbar) "aET" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick/random,/obj/structure/sign/poster/contraband/random{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/abandonedbar) "aEU" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating{dir = 10; icon_regular_floor = "escape"},/area/maintenance/abandonedbar) "aEV" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "escape"},/area/maintenance/abandonedbar) @@ -1662,7 +1662,7 @@ "aFX" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/bananium{name = "Clown's Office"; req_access_txt = "46"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/clownoffice) "aFY" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) "aFZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_chapel_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) -"aGa" = (/obj/item/weapon/stool,/turf/simulated/floor/plating{dir = 10; icon_regular_floor = "purplecorner"},/area/maintenance/abandonedbar) +"aGa" = (/turf/simulated/floor/plating{dir = 10; icon_regular_floor = "purplecorner"},/area/maintenance/abandonedbar) "aGb" = (/obj/structure/table/woodentable,/obj/structure/mirror{pixel_x = -28},/obj/item/weapon/storage/pill_bottle/random_drug_bottle,/turf/simulated/floor/plasteel{dir = 10; icon_state = "purple"},/area/maintenance/abandonedbar) "aGc" = (/obj/structure/mineral_door/wood{name = "Abandoned Bar"},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar) "aGd" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall/rust,/area/maintenance/abandonedbar) @@ -2782,8 +2782,8 @@ "bbz" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/north) "bbA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bbB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/sign/securearea{desc = "Under the painting a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'"; icon_state = "monkey_painting"; name = "Mr. Deempisi portrait"; pixel_x = -28; pixel_y = 4},/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bbC" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint) -"bbD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/maintenance/fsmaint) +"bbC" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint) +"bbD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/hallway/primary/central/north) "bbE" = (/turf/simulated/wall/r_wall,/area/hallway/primary/central/ne) "bbF" = (/turf/simulated/wall,/area/hallway/primary/central/ne) "bbG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "Bar"},/obj/structure/plasticflaps{opacity = 1},/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel,/area/maintenance/fsmaint2) @@ -2882,7 +2882,7 @@ "bdv" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central/north) "bdw" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/item/flag/nt,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/north) "bdx" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central/north) -"bdy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/hallway/primary/central/north) +"bdy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/hallway/primary/central/north) "bdz" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva) "bdA" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/hallway/primary/central/ne) "bdB" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/hallway/primary/central/ne) @@ -2965,7 +2965,7 @@ "bfa" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "bfb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/north) "bfc" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/port) -"bfd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/hallway/primary/central/north) +"bfd" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/north) "bfe" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/gateway) "bff" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "bfg" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) @@ -3063,8 +3063,8 @@ "bgU" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/north) "bgV" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central/nw) "bgW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "L11"},/area/hallway/primary/central/north) -"bgX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/north) -"bgY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{desc = ""; icon_state = "L13"; name = "floor"},/area/hallway/primary/central/north) +"bgX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/floor/plasteel{desc = ""; icon_state = "L13"; name = "floor"},/area/hallway/primary/central/north) +"bgY" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel,/area/engine/break_room) "bgZ" = (/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 4},/area/hallway/primary/central/ne) "bha" = (/turf/simulated/floor/plasteel{icon_state = "L1"},/area/hallway/primary/central/north) "bhb" = (/turf/simulated/floor/plasteel{icon_state = "L3"},/area/hallway/primary/central/north) @@ -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) @@ -4466,7 +4466,10 @@ "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) +"bHW" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room) "bHX" = (/turf/simulated/floor/plasteel,/area/assembly/chargebay) +"bHY" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/equipmentstorage) +"bHZ" = (/obj/machinery/vending/tool,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "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) "bIc" = (/obj/structure/stool/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Roboticist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) @@ -4557,6 +4560,8 @@ "bJJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "bJK" = (/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; name = "Chemistry Cleaner"},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "bJL" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/reception) +"bJM" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/simulated/floor/plating,/area/shuttle/constructionsite) +"bJN" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) "bJP" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Examination Room"; req_access_txt = "5"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/exam_room) "bJT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) "bJW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 12},/turf/simulated/floor/plating,/area/maintenance/genetics) @@ -7477,8 +7482,6 @@ "cPT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/atmos) "cPU" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos) "cPV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/obj/structure/table,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/t_scanner,/turf/simulated/floor/plasteel,/area/engine/break_room) -"cPW" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel,/area/engine/break_room) -"cPX" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel,/area/engine/break_room) "cPY" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/vending/cigarette,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel,/area/engine/break_room) "cPZ" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/atmos/distribution) "cQa" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/atmos) @@ -7521,7 +7524,6 @@ "cQL" = (/obj/machinery/light{dir = 8},/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/warning_stripes/blue/hollow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos) "cQM" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/warning_stripes/blue/hollow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos) "cQN" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/equipmentstorage) -"cQO" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engine/equipmentstorage) "cQP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/atmos) "cQQ" = (/obj/machinery/pipedispenser/disposal,/turf/simulated/floor/plasteel,/area/atmos) "cQR" = (/obj/machinery/atmospherics/binary/volume_pump/on{name = "Waste In"},/turf/simulated/floor/plasteel,/area/atmos/distribution) @@ -7587,11 +7589,9 @@ "cRZ" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/atmos) "cSa" = (/obj/machinery/camera{c_tag = "Engineering Equipment North"; network = list("SS13")},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/vending/engivend,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cSb" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos) -"cSc" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cSd" = (/turf/simulated/floor/plasteel,/area/atmos) "cSe" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/turf/simulated/floor/plasteel,/area/atmos) "cSf" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 8},/turf/simulated/floor/plasteel,/area/atmos/distribution) -"cSg" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/vending/tool,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cSh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cSi" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{level = 2},/turf/simulated/floor/plasteel,/area/atmos/distribution) "cSj" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/decal/warning_stripes/red/hollow,/obj/machinery/camera{c_tag = "Atmospherics North-West"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos) @@ -8362,7 +8362,6 @@ "dhb" = (/turf/simulated/floor/plating{icon_state = "platingdmg3"},/area/maintenance/asmaint2) "dhc" = (/obj/structure/lattice,/obj/structure/lattice,/turf/space,/area/space) "dhd" = (/obj/machinery/computer/shuttle/engineering,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite) -"dhe" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/space,/area/shuttle/constructionsite) "dhf" = (/obj/structure/closet/radiation,/turf/simulated/floor/plating,/area/storage/secure) "dhg" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk6"; icon_state = "catwalk6"},/area/space) "dhh" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/space) @@ -8689,7 +8688,6 @@ "dnt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) "dnu" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/space) "dnv" = (/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) -"dnw" = (/obj/machinery/atmospherics/unary/vent_pump{on = 0},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) "dnx" = (/obj/structure/sign/fire,/turf/simulated/wall/r_wall/coated,/area/maintenance/turbine) "dny" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space) "dnz" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space) @@ -9054,10 +9052,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaVSaVXaVSaVSaVYaVZaVSaVSaVXaWaaVWaLdaToaWbaVcaWdaWcaWfaWeaWhaWgaTuaUuaVeaUqaWjaVeaVeaUuaTuaWkaWlaWiaWnaWmaWoaWqaWraWpaWtaVjaabaUEaWuaWsaWwaWvaWxaUEaabaSuaSzaSAaWzaWAaWyaWCaWBaSAaPiaRwaSBaSCaWEaWDaULaSCaWFaSCaULaWGaSLaSCaSMaRwaSNaFFaWJaEjaMFaLPaISaOhaLNaLPaOiaWHaUQaWKaVEaVEaVEaWLaOlaOkaOmaUSaWQaWPaOxaOtaPgaHPaaaaaaaaaaaaaaaaaaaaaaaaaaaaGXaWVaWUaWXaWWaWYaGXaNhaGYaQIaMkaGYaGXaaaaGXaGYaGYaGYaGYaMkaXbaXaaWZaWZaWZaWZaXcaXeaXdaXhaXiaXfaXiaXgaVTaVTaVUaXkaXjaXlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaWaaVSaXmaXraXsaXtaXuaXvaXwaXxaXyaXzaXpaXnaSdaToaXqaVcaXBaXAaXFaXGaXFaXCaTuaXIaVeaXDaXHaXEaXHaXJaXLaXKaXMaXQaXQaXQaXQaXQaXQaXNaXSaVjaaaaUEaXOaWsaXPaWvaXRaUEaaaaSuaSzaSAaXTaXXaXVaXUaYaaSAaPiaRwaXWaXWaTCaXYaVuaTDaXZaTDaVuaYbaTIaTzaTzaRwaYcaIraYhaEjaMFaLPaLPaLPaLPaLPaPlaPkaPnaPmaPoaUQaUQaUQaUQaUQaUQaUSaPpaZVaPqaUSaOgaYwaHPaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaYnaGXaGXaGXaGXaGYaMkaWVaHNaabaHNaGYaYsaYvaYuaYyaYxaYzaYEaYEaYEaYEaYFaYGaYAaYIaYJaYKaYJaYBaYJaYJaYCaXoaYOaYPaYQaYRaYSaYSaYSaYSaYSaYSaYSaYSaYSafXajcaaaaaaaaaaaaaaaaaaaaaaYDaYUaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXpaYMaYLaYNaXzaYZaXsaYZaXsaYZaXsaYZaXzaYVaYTaSdaToaYWaVcaYYaYXaZfaZaaZhaZbaTuaZjaUraZcaZlaZmaZnaZdaTuaZeaZgaXQaXQaXQaXQaXQaXQaXNaZraVjaabaUEaZkaZiaZpaZoaZqaUEaabaSuaSzaSAaZsaZyaZtaZAaZuaSAaPiaRwaUJaUJaUJaZvaULaSCaUIaSCaULaZwaUJaUJaUJaRwaZxaZFaZGaEjaPtaPsaPsaPsaPsaPuaPxaPvaUQaPyaPzaUQaQmaQfaQnaUQaQoaUSaZDaZVaZEaUSaQpaZKaQqaZNaZNaZKaZXaZWaZWaZWaZWaZWaZZaZYaZWbaabacbabbaebadbagbafbaibahbajbahbalbakaGYaGXbarbambanbaubavbaobaxbaybazbapbazbaBbasbaqbatbaFbaAbawbaIbaCbaEbaDaYPbaMbaNbaObaGbaQbaRbaHbaTbaUbaVaaaaaaaaaaaaaaaaaaaaaaYDbaWbaXbaYaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaZaXsaXsaVXaXzaYZaXsaYZbbaaYZaXsaYZaXzaYVaYTaSdaTobaJaVcaVcbaKaUtbaLaUtaVcaTuaTuaTuaTubaSbaPbbhbbbaTubbjbbcbblaXQaXQbbmaXQbbebbdbbpaVjaaaaUEaUEbbqbbfbbqaUEaUEaaaaSuaSzaSAbbibbgbbkaZAbbnaSAaPiaRwaSBaSCbboaWDaULaSCaUIaSCaULaWGbbxaRwaRwaRwbbrbbzbbtbbsbbCbbDatGatGbbEbbFbbvbbuaUQbbwaVEaUQbbJaUQbbKaUQbbLaQrbbBbbAbbHbbGbbUbbIaQtbbNbbQbbPbbRbbQbbQbbSbbQbbIbbTbbIaXfbbUbbIbbVbbXbbWbbZbbYbcbbcabcdbccbcfbceaXibcmbcgbcobcpbchbcibcsbcjbaybcubckbazbcwbcxbclbczbaFbcAbcBbcCbcDbcnbcFaYPbcqbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYDbaWbcJbcKbcLbaYaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXpbcrbcNaYNaXzaYZaXsaYZaXsaYZaXsaYZaXzaYVaYTaSdaTobcvbctbcEbcybcSbcSaSfbcGbcMbcVbcWbcXbcPbcOaVebcQaTubdbbcRbddbdebcTbdgbdhbdibcUbdkaVjaaaaabaaabcYbcZbcYaaaaabaaaaSuaSzaSAbdcbdabdjbdfbdraSAaPiaRwbdmbdlaTCbdnbdoaTDbdpaTDbdsbdqbdzaRwbdubdtbdvbdDbdxbdwbdybdHaaaaaabbEbdIbdBbdAaUQbdCbdEaVEaVEbdNaVEaVEaVEbdOaUSbdFaUSbdQaUSaUSaQuaUSbdTbdUbdKbdJbdMbdLbdTbdPbeabebbecbebbebbebbebbdSbeebebbefbdVbdWbeibebbdXaGYbaubekbcpbelbembenbeobepbeqberbdYbazbetbeubevbewbdZbcAbcBbcCbcDbaEbedaYPbegbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYUbeAbeBbeCbeBbeDaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabehbejaVSaXmaXzaXsbeGbesaXsaXsbexbeGaXzaXpbeyaSdaTobeEbezbeMbeFbeMbeMbeMbeMbeMbeHaSfaTubePbeQbePaTuaTubeRbeIbeRaViaViaViaVibeRbeJbeUaVjbeLbeKbeKbeNbeObeNbeKbeKbeSaSubfaaSAbeTaSAbeWbeVbfeaSAbffaRwaRwaRwaRwbfgbfhbeXbeYbeXbfhbfgaRwaRwbeZbdDbdDbdDbdDbfbbfdbfnbfobfpbbEbfqbdBbfiaUQaUQaUQaUQaUQaUQaUQaUSaUSbdObfsbftbfkbfjaQvbflaSQbfrbdTbfAbfvbfCbfwbfEbdTbfxbfybfHbfzbfHbfJbfKbfMbfBbfFbfDbfIbfGbfNbfLbebbfObfQbfPbfSbfRbelbfYbfZbeobfTbazbfVbfUbfXbfWbgfbczbczbazbazbcBbcCbcDbcnbggaYPbgabgibgbbgkbgcbgmbaTbaTbgdbaVaaaaaaaaaaaaaaaaYDbaWbgobeCbeCbeCbgpbaYaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabehaVSaVXaVSaVSaVYaVZaVSaVSaVXbejbgeaLdbghbeEaSdbgsbgsbgtbgsbgjaMsbgvbglaSfbgnbfcbgzbgzbgqbgrbgzbgubgzbgzbgzbgDbgzbgzbgwbgFbgAbgCbgBbgEbgCbgHbgCbgCbgCbgCbgIbgMbgJbgzbgzbgKbfcbgQbgxbgSbgLbgObgNbgTbgPbgPbgPbgPbgPbgPbgPbgVbgUbhabhbbhcbhdbhebgWbgYbgXbdDbdDbhfbgZbhgbgZbhgbhhbhjbhibhkbhpbhqaUSbhrbhlbhtbhmbhvbhvaWMbhxaWNbhzbdTbhobhubhsbhsbhwbdTbhAbhCbhBbhEbhDbhDbhFbhHbhGbfMbhIbhJbhPbhQbhRbebbdXaTgbaubhKbhTbhTbhUbhVbhTbhLbazbhXbhNbazbhObhSbczbhWbazbhZbhYbiabcDaYPaYPaYPbibbigbihbiibigbigbigbigaYSafXajcaaaaaaaaaaaabicbikbilbeCbeCbimbinbeCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaZaXsaXsaVXaXzaYZaXsaYZbbaaYZaXsaYZaXzaYVaYTaSdaTobaJaVcaVcbaKaUtbaLaUtaVcaTuaTuaTuaTubaSbaPbbhbbbaTubbjbbcbblaXQaXQbbmaXQbbebbdbbpaVjaaaaUEaUEbbqbbfbbqaUEaUEaaaaSuaSzaSAbbibbgbbkaZAbbnaSAaPiaRwaSBaSCbboaWDaULaSCaUIaSCaULaWGbbxaRwaRwaRwbbrbbzbbtbbsbbCatGatGatGbbEbbFbbvbbuaUQbbwaVEaUQbbJaUQbbKaUQbbLaQrbbBbbAbbHbbGbbUbbIaQtbbNbbQbbPbbRbbQbbQbbSbbQbbIbbTbbIaXfbbUbbIbbVbbXbbWbbZbbYbcbbcabcdbccbcfbceaXibcmbcgbcobcpbchbcibcsbcjbaybcubckbazbcwbcxbclbczbaFbcAbcBbcCbcDbcnbcFaYPbcqbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYDbaWbcJbcKbcLbaYaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXpbcrbcNaYNaXzaYZaXsaYZaXsaYZaXsaYZaXzaYVaYTaSdaTobcvbctbcEbcybcSbcSaSfbcGbcMbcVbcWbcXbcPbcOaVebcQaTubdbbcRbddbdebcTbdgbdhbdibcUbdkaVjaaaaabaaabcYbcZbcYaaaaabaaaaSuaSzaSAbdcbdabdjbdfbdraSAaPiaRwbdmbdlaTCbdnbdoaTDbdpaTDbdsbdqbdzaRwbdubdtbdvbdDbdxbdwbbDbdHaaaaaabbEbdIbdBbdAaUQbdCbdEaVEaVEbdNaVEaVEaVEbdOaUSbdFaUSbdQaUSaUSaQuaUSbdTbdUbdKbdJbdMbdLbdTbdPbeabebbecbebbebbebbebbdSbeebebbefbdVbdWbeibebbdXaGYbaubekbcpbelbembenbeobepbeqberbdYbazbetbeubevbewbdZbcAbcBbcCbcDbaEbedaYPbegbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYUbeAbeBbeCbeBbeDaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabehbejaVSaXmaXzaXsbeGbesaXsaXsbexbeGaXzaXpbeyaSdaTobeEbezbeMbeFbeMbeMbeMbeMbeMbeHaSfaTubePbeQbePaTuaTubeRbeIbeRaViaViaViaVibeRbeJbeUaVjbeLbeKbeKbeNbeObeNbeKbeKbeSaSubfaaSAbeTaSAbeWbeVbfeaSAbffaRwaRwaRwaRwbfgbfhbeXbeYbeXbfhbfgaRwaRwbeZbdDbdDbdDbdDbfbbdybfnbfobfpbbEbfqbdBbfiaUQaUQaUQaUQaUQaUQaUQaUSaUSbdObfsbftbfkbfjaQvbflaSQbfrbdTbfAbfvbfCbfwbfEbdTbfxbfybfHbfzbfHbfJbfKbfMbfBbfFbfDbfIbfGbfNbfLbebbfObfQbfPbfSbfRbelbfYbfZbeobfTbazbfVbfUbfXbfWbgfbczbczbazbazbcBbcCbcDbcnbggaYPbgabgibgbbgkbgcbgmbaTbaTbgdbaVaaaaaaaaaaaaaaaaYDbaWbgobeCbeCbeCbgpbaYaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabehaVSaVXaVSaVSaVYaVZaVSaVSaVXbejbgeaLdbghbeEaSdbgsbgsbgtbgsbgjaMsbgvbglaSfbgnbfcbgzbgzbgqbgrbgzbgubgzbgzbgzbgDbgzbgzbgwbgFbgAbgCbgBbgEbgCbgHbgCbgCbgCbgCbgIbgMbgJbgzbgzbgKbfcbgQbgxbgSbgLbgObgNbgTbgPbgPbgPbgPbgPbgPbgPbgVbgUbhabhbbhcbhdbhebgWbgXbfdbdDbdDbhfbgZbhgbgZbhgbhhbhjbhibhkbhpbhqaUSbhrbhlbhtbhmbhvbhvaWMbhxaWNbhzbdTbhobhubhsbhsbhwbdTbhAbhCbhBbhEbhDbhDbhFbhHbhGbfMbhIbhJbhPbhQbhRbebbdXaTgbaubhKbhTbhTbhUbhVbhTbhLbazbhXbhNbazbhObhSbczbhWbazbhZbhYbiabcDaYPaYPaYPbibbigbihbiibigbigbigbigaYSafXajcaaaaaaaaaaaabicbikbilbeCbeCbimbinbeCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbgyaSdaSdaSdaSdaSdaSdbgyaSdaUZaLdbidbieaSdbirbisbitbitbiuaMsbivbglbifbgGbfcbijbipbiobiqbiqbixbiwbiwbiwbizbiybiybiAbiCbiBbiqbiqbiDbiybiFbiEbiGbiGbiIbiHbiKbiJbiJbiJbiLbfcbgQbgxbgSbgSbgSbgSbiMbgSbgSbgSbgSbgSbgSbiNbiUbiVbiWbiXbiObiZbiQbiPbiRbiVbiVbiVbjdbjebjebjebiSbhqbhqbhqbiYbiTbhqaUSbjabjjbhvbhvbjkbhvaWTbjmaWNbjcbdTbjobjfbjqbjhbjgbdTbjtbjibjvbjwbjxbjybebbebbjzbebbebbebbjBbjlbjBbebbdXaGYbaubjDbcpbcpbcpbjEbcpbjFbazbazbazbazbazbazbazbjnbazbcDbcDbcCbcDbjpbjIaYPbjrbjNbjLblwbgRbjubjsbjAbjRaaaaaaaaaaaaaYDbjCbjGbjCbjCbjCbjHbjCbjJbjCbjGbjCaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabbjQaLdaSdaOQaSdbjTbjSbjVbjUaSdaOQaSdaSdaLdbjWbeEaSdbjXbkcbitbitbiuaMsbkdbglaSfbgGbfcbgzbjZbjYbkgbkgbkabkibkbbkgbkebkgbkfbkgbkhbjPbkgbkgbkgbkgbkgbkjbkkbkgbklbkrbknbkmbgzbgzbkpbkobksbkqbkubktbkubkvbkwbkvbkvbkvbkvbkvbkvbkybkAbkzbkzbkzbkzbkBbkzbkCbkDbkzbkzbkEbkGbkFbkFbkFbkFbkFbkFbkFbkHbhqbhqaUSbkMbkNbkObkPbkPbkIaYdbjmaWNbkKbdTbdTbdTbdTbdTbkLbdTbkQbkRbkWbkSbfHbkYbebbhMbkTbkUblcbkVbleblfblgbebbdXaQLbaublhblibcpbljblkbcpbllbllbaubkXblabkZaYPbldblnblmbcDbcDblpbloaYPblqaYPblrdsfbjLblxblsbltbjKblzbjRaaaaaaaaaaaabicbmXblubmYbmYblDbeCblCblDblAblvblCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaSdbgyaSdaToaSfaSfaTpaSdbgyaSdblyblEblBblFaSdblIblIbgtblIbgjaMsblJbglaSfaMsblKblKblGblMblMblMblMblMblMbkxblHblMblMblMblMblMblMblPblQblRblRblLblRblTblNblVblTblTblWblXblOblKblZblZblSblSblSbmbbmbbmbbmbbmbbmbbmbbmbbmcblUblUblYblUbmabmabmabmabmebmdbmabmcbmibmibmibmibmibmibmibmibmfbmfbmfaUSbmkbmlbmmbmmbmmbmmbmnbmoaYebmqbmrbmgbmjbmhbmtbmsbdTbdTbmubmybmzbmybmybebbmAbmvbmwbmwbmwbmwbmBbmxbebbmCbmHbaubmIbcpbljbljblkbljbcpbmDbaubmEbmGbmFaYPbcDbmJbmObmPbmPbmKbmRbmLbmTbmUbmMbmWboObmNbjMbjKbjKblzbjRbjRbjRbjRbjRbicbBTbDzbDzbDzbmQbeCblCbnbblAbeCbncbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9114,9 +9112,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaaaaabaabaaaaabaabaaaaaaaabaabaabaabaabcLicLicMqcLicLicMrcMvcEYcEYcEYcEYcEYcEYcEYcEYcLicLwcKfcMtcMxcMwcMycMycMycMycMCcMzcMDcLGcMAcLGcLGcMBcLGcMEcMGcMFcMHcLNcnycMLcHQcMPcLOcMIcMJcMKcLOcMQcMRcMNcMOcMScMUcMTcMWcMVcMXcMXcMZcMYcNecNbcNfcNacrecrecNgcsLcNccBPcBPcBPcBPcBPaaaaaaaaaaaacNdcNicNkcNjcHdcNhchfchfcBYcBPcBPcBPcBPcBPaaaaaacBRcJKcJKcJKcNmcNlcNocNncNqcNpcNscNrcxNcNtcNycNxcBRaaaaaacLbcNzcLecNucLecNvcLbbGGbGGcFccMsbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNwaaaalwaaacNFcNEcNMaaacNFcNEcNMaaacNFcNEcNMaaaaaacLicNAcNBcNCcLicNDcNNcLmcLmcLmcLmcLmcLmcLmcLmcLmcNRcKfcNGcLGcMBcNHcLGcLGcLGcNIcLGcNGcNGcLGcLGcLGcLGcNJcNKcMGcNLcHDcNScyEcHQcHQcNTcLOcNOcNPcNQcLOcNUcHVcNVcNZcNWcObcOacNXcsLcNYcpscNYcsLcOdcOccOecOecOecOecOgcOfcOfcOfcOfcOfcOhcBPaaaaaaaaaaaacNdcNicNkcOicOjcsLcxMchfcBYcsLcsLcsLcsKcBPaaaaaacBRcxNcxNcxNcxNcOkcEHcOlcOncOmcOpcOocxNcOqcOtcOrcBRaaaaaacLbcOvcOucOscLecODcLbcOCbGGcFcbGHaabaabaabaabaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaacNFcOFcNMaaacNFcOFcNMaaacNFcOFcNMaaaayicLicNBcNBcNBcLicLicOwcOxcLicLicOxcOxcLicLicOxcOxcLwcKfcNGcOycLGcOzcOAcOBcOBcMAcLGcNGcOGcLGcLGcLGcLGcOHcOEcOJcOIclXcOKcOMcOLcOYcORcLOcNOcOZcONcLOcOOcHVcGKcOPcGHcPbcPacOScOTcOUcOVcOWcOTcOXcOTcOTcOTcBPcBPcBPcBPcBPcBPcBPcBPcPdcBPaaaaaaaaaaaacNdcPecPgcPfcHdcsKcPcchfcPicPhcPhcPkcsLcBPaaaaaacBRcKPcKQcKRcPmcPlcNocPncPjcPocPqcPpcPscPrcPpcPtcBRaaaaaacLbcLbcPycPAcPzcLbcLbbGHbGGcPBcuQcuQcuQbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaayiaabcNFcOFcNMaaacNFcOFcNMaabcNFcOFcNMaaaaabcLicMrcPucNDcLiaaaaabaaaaaaaaaaaaaaaaabaaaaaacOxcLwcKbcPvcLGcPwcPxcPCcPEcPDcPEcPFcPEcPGcPHcLCcPIcNGcNGcNKcPLcPJcPNcPMcPPcPKcPVcPScPWcPOcPXcPQcPRcPYcPTcPUcPUcQacQccQbcQdcPZcQfcQecQhcQgcQjcQicQocQmcQpcQpcQpcQpcQpcQpcQqcBPcPdcQkcQkcQkcQkcQkcQkcQlcQucQlcQncQkcQkcQkcQkcQkcQkcBYcsLcBPaaaaaacBRcJKcKZcJKcQxcMjcEHcQzcQAcQrcQscEHcEHcQtcEHcQBcBRaaaaabaabcLbcLbcQvcLbcLbaaabGHbGGcFccuQcQwcQCbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacNFcOFcNMaabcNFcOFcNMaaacNFcOFcNMaabaaacLicLicOxcLicLiaaaaabaabaaaaabaaaaabaabaaaaaacQycQDcKbcQFcQGcQGcQHcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcJZcQIcJZcQEcJZcFacQKcQJcQOcQNcQNcQNcQUcQScPTcQLcQMcQVcQWcQPcQQcPZcQRcQXcQTcQYcRbcRacRdcRcaabcQZcQZcQZcQZcQZcRecBPcRicRhcRkcRjcRfcRgcQkcRlcRncRmcQkcRocRqcRpcRscRrcQkcBYcsLcBPaaaaaacBRcJKcJKcJKcRDcRwcNocRHcRIcRtcRucRvcRvcRJcEHcRxcBRaabaabaaaaaaaaacRyaaaaaaaaabGHbGGcFccuQbGGbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvayiaaacNFcOFcNMaabcNFcOFcNMaaacNFcOFcNMaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcRzcRAcRAcRAcRAcQycRBcLwcRCcRKcREcREcRFcRGcRMcRLcRLcRLcRLcRNcRPcROcRQcRQcRScRScRQcRTcRVcRUcRRcRRcRYcRWcSccSacSgcRXcRXcShcRZcSjcSbcSkcSdcQPcSecPZcSfcSlcSmcSicSpcSocSrcSqcQpcSncSucSscSwcQZcRecBQcPdcQkcSycSxcStcSzcSvcSCcSFcSDcQkcSIcSAcSBcSAcSMcQkcBYcsLcBPcBPaaacBRcxNcxNcxNcxNcSNcEHcQzcSEcSOcQscEHcSGcSHcSHcSPcSJcSKaabaaaaaaaaaaaaaaaaaaaaabGHbGGcPBbGGbGGcSLbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaayiaabcNFcOFcNMaaacNFcOFcNMaabcNFcOFcNMaaaaabcLicMrcPucNDcLiaaaaabaaaaaaaaaaaaaaaaabaaaaaacOxcLwcKbcPvcLGcPwcPxcPCcPEcPDcPEcPFcPEcPGcPHcLCcPIcNGcNGcNKcPLcPJcPNcPMcPPcPKcPVcPSbgYcPObHWcPQcPRcPYcPTcPUcPUcQacQccQbcQdcPZcQfcQecQhcQgcQjcQicQocQmcQpcQpcQpcQpcQpcQpcQqcBPcPdcQkcQkcQkcQkcQkcQkcQlcQucQlcQncQkcQkcQkcQkcQkcQkcBYcsLcBPaaaaaacBRcJKcKZcJKcQxcMjcEHcQzcQAcQrcQscEHcEHcQtcEHcQBcBRaaaaabaabcLbcLbcQvcLbcLbaaabGHbGGcFccuQcQwcQCbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacNFcOFcNMaabcNFcOFcNMaaacNFcOFcNMaabaaacLicLicOxcLicLiaaaaabaabaaaaabaaaaabaabaaaaaacQycQDcKbcQFcQGcQGcQHcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcJZcQIcJZcQEcJZcFacQKcQJbHYcQNcQNcQNcQUcQScPTcQLcQMcQVcQWcQPcQQcPZcQRcQXcQTcQYcRbcRacRdcRcaabcQZcQZcQZcQZcQZcRecBPcRicRhcRkcRjcRfcRgcQkcRlcRncRmcQkcRocRqcRpcRscRrcQkcBYcsLcBPaaaaaacBRcJKcJKcJKcRDcRwcNocRHcRIcRtcRucRvcRvcRJcEHcRxcBRaabaabaaaaaaaaacRyaaaaaaaaabGHbGGcFccuQbGGbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvayiaaacNFcOFcNMaabcNFcOFcNMaaacNFcOFcNMaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcRzcRAcRAcRAcRAcQycRBcLwcRCcRKcREcREcRFcRGcRMcRLcRLcRLcRLcRNcRPcROcRQcRQcRScRScRQcRTcRVcRUcRRcRRcRYcRWcTecSabHZcRXcRXcShcRZcSjcSbcSkcSdcQPcSecPZcSfcSlcSmcSicSpcSocSrcSqcQpcSncSucSscSwcQZcRecBQcPdcQkcSycSxcStcSzcSvcSCcSFcSDcQkcSIcSAcSBcSAcSMcQkcBYcsLcBPcBPaaacBRcxNcxNcxNcxNcSNcEHcQzcSEcSOcQscEHcSGcSHcSHcSPcSJcSKaabaaaaaaaaaaaaaaaaaaaaabGHbGGcPBbGGbGGcSLbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaabaaaaabaabcSQaabaabaabcSQaabaaaaabcSQaabaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcSRcTacSTcRAcTbcTccNRcRCcRCcSScTdcKbcKbcMvcSUcSUcSUcSUcSVcSWcSXcSWcSWcSWcRRcRRcSYcSZcTfcTicTgcRXcTjcTecRXcRXcRXcRXcTkcPTcTlcThcQVcSdcQPcSdcPZcSfcSlcTncTmcTqcTpcTucTraabcTocTvcSwcTwcQZcRecBQcRicRhcTxcTscSAcTtcQkcTycTAcTzcQkcTCcTDcSAcTFcTEcQkcBYcsLcTBcBPaaacBRcKPcKQcKRcTJcPlcNocTKcTNcTMcTGcTGcTHcTIcTPcTOcBRaabaabaabaaaaaaaaaaaaaaaaaabGHcTLcFcbGHbGHbGHbGHbGHaabaabaabcTQcTQcTQcTQcTQcTQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabcTRcTScTScTUcTTcTVcTVcTVcTTcTVcTVcTVcTTcTVcTVcTVcTWcTScTScTScTScTScTXcTZcTYcUbcUacUecUdcUgcUfcNBcLwcUccRCcKbcKbcKbcUhcMvcSUcUkcUjcUmcUlcUicUncUpcUocUrcUqcUucUscUxcUwcUycUqcUtcUzcTecUvcRXcRXcRXcUAcPTcUCcUCcSdcUEcUDcUGcUFcUIcUHcUKcUJcUPcUNcUScSqcUVcSncUWcSwcSwcQZcRecBQcPdcQkcULcUMcVacQncQkcUOcVbcQncQkcUQcURcVccUTcUTcQkcBYcsLcUUcBPaaacBRcJKcMgcJKcVecMjcEHcVfcUXcUYcEHcUZcVgcxNcxNcxNcBRaaaaaaaabaabaaaaaaaaaaaaaaabGHcJQcFcbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaabaaaaabaabcVkaabaaaaabcVkaabaaaaabcVkaabaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcVlcVdcVmcRAcVncNBcNNcTccTccTccTccVocTccUfcSUcVhcVicVjcVpcVrcVqcVtcVscVvcVucVycVwcVAcVzcVCcVBcUtcTjcTecVxcVDcRXcRXcVFcPTcVGcVHcSdcVIcQPcVJcVEcVLcVKcVOcVMcVQcVPcVQcVRaabcQZcQZcQZcQZcQZcRecBPcPdcQkcVScVNcVUcVTcVWcVVcVYcVXcWbcWacWccSAcWecWdcQkcBYcsLcVZcBPaaacBRcJKcJKcJKcWicWhcWpcWjcWqcWfcEHcEHcEHcEHcWgcWrcWwaaaaaaaaaaabaabaaaaaaaaaaaabGHbGHcFcbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9133,7 +9131,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacXucXudcMdcUdfdaaaaaadardfedfpdcPdcPdfudardfwdfAdfzdfkdfldfmdfndfodfCdfqdfrdfsddpdfodfldfldfldftdfzdfDdfvcSUdbDdfEdaMdfxdfydeQdfFdfGdfBdfIdfHdfKdfJdfNcZedcScSndfOdemdemcQZcRecBPcsLdfQdfTdfRdfgcsKchfcsLcsLcsLcYidfLcsLcXrdfMddHcuQcFcbGHaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabGHbGGbGGbGGcJQdfSdfUcuQdfPbGGbGGbGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfXdfYdfYdfZdfYdfYdgadardfVdcVdcPdcPdgbdardaGdgccSUcSUdfodfodfodfodgddgfdgeddUdgidfodfodfodfocSUcSUdgqdglcSUdbDcZSdgrdgsdfydggdghcSdcSddgtcXWdggcXUdgjcYbdbIcQZcQZcQZcQZcQZcRecBPcTBcsLdgkdgCcsLdgmchfchfdgnchfdgocpscJGdgpchfchfcuQcFcbGHaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaabGHbGHcuQdgAdgycJQdfScacbGGbGGbGGdgBbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgDdgudgvdgwdgvdgxdgFdardgzdgGcMMdcPdgHdarcSUdgIcSUdgJafOdgEdfodfodfodfodgKdfodfodfodfodgEafOdgJcSUdgLcSUcSUdbDcZSdgMdeHdgNdgPdgOdgRdgQdgPdgQdgPdgVdeQdgWdbIdhgdhhdhhdhhdhhdhidgSdgTdgTdgUdhjdgTdgTdgTdhkdgXdgYdgodgZchfdgochfdhacuQcFcbGHbZZbZZbZZbGHbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHbGHbGHbGHbGHbGHbGHbGHbGHbGHcMsbGHcJQcuQdhbbGGcQwdfScaccuQcuQdbhcuQbGHaabdhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgDdgudgvdgwdgwdhddhedardhfdhldcPdcPdhmdardhndhpdhoafOdhqdhrdhrdhrdhrdhrdhtdhrdhrdhrdhrdhrdhuafOdhvdhydhwcSUdhsdaIdhzdhBdhAdhCdhxdhEdhDdhFcSddhHdhGdhJdhIdbIdhKaaaaabaabaaadhMdhLdhOdhNdhTdhSdhVdhUdgTdhYcsLcsLdhPcpsdhQcYicsLcsLcEGdhZdiadiadiadiadiadiadiadiadiadiadiadiadiadiadiediadiadiadiaczLcuQbPAcAUbGGdiccMscuQcuQcuQdbhcuQdfScaccuQdidbGGbGGbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgDdgudgvdgwdgwdhdbJMdardhfdhldcPdcPdhmdardhndhpdhoafOdhqdhrdhrdhrdhrdhrdhtdhrdhrdhrdhrdhrdhuafOdhvdhydhwcSUdhsdaIdhzdhBdhAdhCdhxdhEdhDdhFcSddhHdhGdhJdhIdbIdhKaaaaabaabaaadhMdhLdhOdhNdhTdhSdhVdhUdgTdhYcsLcsLdhPcpsdhQcYicsLcsLcEGdhZdiadiadiadiadiadiadiadiadiadiadiadiadiadiadiediadiadiadiaczLcuQbPAcAUbGGdiccMscuQcuQcuQdbhcuQdfScaccuQdidbGGbGGbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgDdgudgvdhWdgvdhXdifdardfVdcVdcPdcPdigdardihdibdibaaadiiafOafOafOafOafOafOafOafOafOafOafOdiiaaadibdibdihcSUdaGcZSdhIdikdijdipdioditdhIdipdhIcYbdhIcYbdhIdbIdhKaaaalwalwdiudhLdivdiwdildimdindiydixdgTcsLcsLchfdgodiqchfcYicXrdfMdhRdizdiAdiAdiAdiAdiAdiAdiCdiBdiAdiAdiAdiAdiAdiAdiEdiDdiGdiFdiJdiIdiLdiLdiLdiLdiNdiMdiOdiLdiLdiLdiLdiQcjYcuQdfcbGGdiHbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiSdfYdfYdfYdfYdfYdiTdardiKdjgdcPdcPdjjdardjndjpdiPaabdiiafOdjqaaaaaaaaaaaadjqaaaaaadjqafOdiiaaadiRdjudjtcSUdaGcSUaabdiUaabdiVdiWdiXdiYdiZdiYdjadiYdjadjbdjcdhKaaaalwaabdjddgSdjedjfdjwdjhdjidjxdjkdgTdjlcsLcsLcYidjmchfcYicYidjzbGHbGHbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHdjobGGcuQcTLbGGcuQcuQbZZbZZcxScuQdjAbGGdjAcuQdjCcacdjrbGHbGHbGHbGHbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadardjsdjgdcPdcPdjDdardjHdibdjvaaadjIdjLaaaaaaaaaaaaaaadjyaaaaaaaaadjRdjOaaadibdibdjHcSUdaGcSUcQZdjBcTodjBcQZdjBcTodjBcQZdjScTodjUcQZaabdhKaaaalwaabdjEdgSdjFdjfdjGdjVdjidjWdjJdjKdirdjYdjMcYicpscsLdjNdgochfcBPaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaabGHdjXcLhcuQdjPbGGcuQaaaaaaaaaaaacuQbGGbGGdbgdjQdjQdkadkbdjQaaaaabaabaabaabdjTaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9145,7 +9143,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaabcSUdjHdibdmjaaadjIdjLaaaaaaaaaaabaaaaaaaaaaaaaaadjRdjOaaadibdibdjHcSUdmkdmwdmvdaGdmxdmgaabaabaabaabaabaabaabdmoaabaabaabaabaabaabdjEaabaabaabdlYdlmdmydmAdmzdmEaabdmacBPcBQdmtcBQcBPcBPaaaaabaaaaaaaaaaaaaaaaabaabbZZbZZbZZbGHbGHbGHbGGcuQbGHdmubGHbGHdbgbPAcLhbKlcMsbGHaabaaaaaaaaaaabaaadlTdmGdlTaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcSUdmHdmIdiPaabdiiafOdjqaaaaaadjqaaaaaaaaaaaadjqafOdiiaaadiRdmKdmJcSUdmLcSUcSUcSUcSUcSUcSUaaaaaaaabaaaaaaaaadmoaaaaaadmBdmBdmBdmBdmCaaaaaaaabdlYdmDdlmdmOdlmdlmaaaaabaaaaaadmFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaabGHdmbdmMbGHdmNaabbGHbGHbZZbZZcMsbGHaaaaabaaaaaaaaaaabaaaaaadmRaaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUdmSdmUdmTaaadiiafOafOdncafOafOdncafOafOdncafOafOdiiaaadnhdmUdnicSUdmPdmQdnjdnldnkdnmdmVdmWdmWdmXdmWdmWdmWdmYdmWdmWdmZdnadnbdnodmCaaaaaaaabdndaHQdlmdnedlmdnfaabaabaaaaaadngaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaabpaaaaaabGHdnqdnnbGHdnpaabaaaaabaaaaaaaabaaaaaaaabaaaaaaaaaaabaaaaaadnraaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnscSUcSUdntaaadnudhrdhrdnydhrdhrdnydhrdhrdnydhrdhrdnzaaadntcSUcSUcSUdmPdnBdnAdnEdnCdnHdfoaaaaaaaabaaaaaaaaadmodmBdmBdmBbfmdnwdnvdmCaaaaaaaabaabaHQdnxdnIdnxaHQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaaaaaaaaabZZdnJbZZbZZaabdhcaaaaabaaaaaaaabaaaamWamWalwayiaabaabaabaabdnLaabaabaabaabdhcamhamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnscSUcSUdntaaadnudhrdhrdnydhrdhrdnydhrdhrdnydhrdhrdnzaaadntcSUcSUcSUdmPdnBdnAdnEdnCdnHdfoaaaaaaaabaaaaaaaaadmodmBdmBdmBbfmbJNdnvdmCaaaaaaaabaabaHQdnxdnIdnxaHQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaaaaaaaaabZZdnJbZZbZZaabdhcaaaaabaaaaaaaabaaaamWamWalwayiaabaabaabaabdnLaabaabaabaabdhcamhamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcSUcYXdnMdmTaabaabaabaabaaaaaaaaaaaaaaaaabaabaabaabdnhdnNcYXcSUcSUdnDcSUcSUcSUcSUdfocSUaabaabaabaabaabaabbhnbfubjbbhybkJdnGdnFdmCaaaaaaaaaaabaHQaaaaaaaaaaHQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaabZZdnPbZZaaaaaaaaaaaaaabaaaaaaaabaaaamWaaaaaaaabaaaaabaaaaaadnQaaaaaaaabaaaaabaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacSUcSUdnMdnRdnRdnRdnRdnRdnRdnRdnRdnRdnRdnRdnRdnRdnNcSUcSUcSUdnKdnScSUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnTdnWdnVdobdoadofdoeaaaaaaaaaaabaHQaHQaHQaHQaHQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaabZZdogbZZaaaaaaaaaaaaaabaaaaaaaabaaaamWaaadohdohdohdohdohaabdoiaabdohdohdohdohdohaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUaaacSUcSUdnXcSUcSUcSUcSUaaaaaaaaaaaaaaaaaaaaaaaadnYdnZdnZdnZdnZdojdokdocdoddolaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaabZZdombZZaaaaaaaaaaaaaaaaaaaaaaabaaaamWaabdondoodoodoodoodoqdopdosdordordordordotaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/shuttles/emergency_mil.dmm b/_maps/map_files/shuttles/emergency_mil.dmm new file mode 100644 index 00000000000..3bd1fa6a2d7 --- /dev/null +++ b/_maps/map_files/shuttles/emergency_mil.dmm @@ -0,0 +1,105 @@ +"aa" = (/turf/space,/area/space) +"ab" = (/obj/machinery/light/spot,/turf/space,/area/shuttle/escape) +"ac" = (/turf/space,/area/shuttle/escape) +"ad" = (/obj/machinery/porta_turret{check_access = 0; check_arrest = 0; check_weapons = 1; lethal = 1; name = "shuttle turret"},/turf/simulated/floor/plating/airless,/area/shuttle/escape) +"ae" = (/turf/space,/turf/simulated/shuttle/wall{dir = 2; icon_state = "swallc2"},/area/shuttle/escape) +"af" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape) +"ag" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/simulated/floor/plating,/area/shuttle/escape) +"ah" = (/turf/space,/turf/simulated/shuttle/wall{dir = 2; icon_state = "swallc1"},/area/shuttle/escape) +"ai" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/escape) +"aj" = (/turf/simulated/shuttle/wall{icon_state = "swallc4"},/area/shuttle/escape) +"ak" = (/obj/machinery/computer/communications,/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"al" = (/obj/machinery/computer/crew,/turf/simulated/shuttle/floor,/area/shuttle/escape) +"am" = (/obj/structure/table,/turf/simulated/shuttle/floor,/area/shuttle/escape) +"an" = (/obj/machinery/computer/security{network = list("SS13","Telecomms","Research Outpost","Mining Outpost")},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"ao" = (/obj/machinery/computer/emergency_shuttle,/turf/simulated/shuttle/floor,/area/shuttle/escape) +"ap" = (/turf/simulated/shuttle/wall{icon_state = "swallc3"},/area/shuttle/escape) +"aq" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/escape) +"ar" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape) +"as" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor,/area/shuttle/escape) +"at" = (/turf/simulated/shuttle/floor,/area/shuttle/escape) +"au" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"av" = (/obj/structure/stool/bed/chair/comfy/teal{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"aw" = (/obj/structure/stool/bed/chair/comfy/red{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"ax" = (/obj/structure/stool/bed/chair/comfy/blue{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"ay" = (/obj/machinery/computer/robotics,/turf/simulated/shuttle/floor,/area/shuttle/escape) +"az" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"aA" = (/obj/structure/stool/bed/chair/comfy/purp{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"aB" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area/shuttle/escape) +"aC" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/escape) +"aD" = (/obj/machinery/door/airlock/glass_command{name = "Escape Shuttle Cockpit"; req_access_txt = "19"},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"aE" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/escape) +"aF" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape) +"aG" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape) +"aH" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "16"},/turf/simulated/floor/plating,/area/shuttle/escape) +"aI" = (/turf/simulated/floor/plating,/area/shuttle/escape) +"aJ" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/shuttle/escape) +"aK" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/oxygen{name = "Canister: \[O2] (CRYO)"},/obj/item/weapon/wrench,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/shuttle/escape) +"aL" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/shuttle/escape) +"aM" = (/obj/machinery/sleeper,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/shuttle/escape) +"aN" = (/obj/structure/closet/walllocker/emerglocker{pixel_x = -28},/turf/simulated/shuttle/floor4,/area/shuttle/escape) +"aO" = (/turf/simulated/shuttle/floor4,/area/shuttle/escape) +"aP" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "8"},/turf/simulated/floor/plating,/area/shuttle/escape) +"aQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/shuttle/escape) +"aR" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/shuttle/escape) +"aS" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/shuttle/escape) +"aT" = (/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0; req_access_txt = "0"},/obj/machinery/sleeper,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/shuttle/escape) +"aU" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/shuttle/escape) +"aV" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/shuttle/escape) +"aW" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/floor/plating,/area/shuttle/escape) +"aX" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor4,/area/shuttle/escape) +"aY" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/shuttle/escape) +"aZ" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/shuttle/escape) +"ba" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/shuttle/escape) +"bb" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/shuttle/escape) +"bc" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/turf/simulated/floor/plating,/area/shuttle/escape) +"bd" = (/obj/structure/noticeboard,/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape) +"be" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "15"},/turf/simulated/floor/plating,/area/shuttle/escape) +"bf" = (/obj/machinery/door/airlock/glass_command{name = "Escape Shuttle Cockpit"; req_access_txt = "19"},/turf/simulated/floor/plating,/area/shuttle/escape) +"bg" = (/obj/machinery/door/airlock/glass_medical{id_tag = "ShuttleMedbay"; name = "Shuttle Medbay"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/shuttle/escape) +"bh" = (/obj/docking_port/mobile/emergency{dir = 4; dwidth = 11; height = 13; timid = 1; width = 24},/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"bi" = (/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/turf/simulated/floor/plating,/area/shuttle/escape) +"bj" = (/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/shuttle/escape) +"bk" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/shuttle/escape) +"bl" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/shuttle/escape) +"bm" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/floor/plating,/area/shuttle/escape) +"bn" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/shuttle/escape) +"bo" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/shuttle/escape) +"bp" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape) +"bq" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) +"br" = (/mob/living/simple_animal/bot/secbot,/turf/simulated/floor/plating,/area/shuttle/escape) +"bs" = (/obj/machinery/recharge_station,/turf/simulated/floor/plating,/area/shuttle/escape) +"bt" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape) +"bu" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/shuttle/escape) +"bv" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/escape) +"bw" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape) +"bx" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/shuttle/escape) +"by" = (/turf/simulated/floor/plating/airless,/area/shuttle/escape) +"bz" = (/obj/machinery/porta_turret{check_access = 0; check_arrest = 0; check_weapons = 1; lethal = 1; name = "shuttle turret"},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/escape) + +(1,1,1) = {" +aaaaaaaaabacacacabaaaaaaaa +aaabadaeafafagafafahadabaa +aiafafajakalamanaoapafafaq +arasatatauavatawaxatatayar +arazatatatatatatatatataAar +aBafafafafaCaDaCafafafafaE +araFaGaFaFaHaIaHaJaKaLaMar +araNaOaOaOaPaIaPaQaRaSaTar +araOaOaOaOaPaIaPaUaSaSaVar +aWaOaOaXaXaPaIaPaYaZbabbag +aBafbcafbdbebfbeafafbgafaE +bhaIaIaIaIaIaIaIaIaIaIbiar +arbjaIbkblaIaIaIbkblaIbmar +arblaIbkblaIaIaIbkblaIbkar +arblaIbkblaIaIaIbkblaIbkar +arblaIbkblaIaIaIbkblaIbkar +arbnaIbkblaIaIaIbkblaIboar +bpaIaIaIaIaIaIaIaIaIaIbiar +agaIaIbkblaIaIaIbkblaIaIag +bqaIaIbkblaIaIaIbkblaIbrar +arblaIbkblaIbsaIbkblaIbkar +arbnaIbkblaIbsaIbkblaIboar +btaCbubuaCafafafaCbvbvaCbw +aabtbxbxajbybzbyapbxbxbwaa +"} diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm index 6f8bd0feabf..4cbe2a9e5f1 100644 --- a/code/__DEFINES/genetics.dm +++ b/code/__DEFINES/genetics.dm @@ -13,7 +13,12 @@ #define DISABILITY_FLAG_BLIND 16 #define DISABILITY_FLAG_MUTE 32 #define DISABILITY_FLAG_COLOURBLIND 64 - +#define DISABILITY_FLAG_TOURETTES 512 +#define DISABILITY_FLAG_NERVOUS 1024 +#define DISABILITY_FLAG_SWEDISH 2048 +#define DISABILITY_FLAG_SCRAMBLED 4096 // incoherent speech +#define DISABILITY_FLAG_LISP 8192 +#define DISABILITY_FLAG_DIZZY 16384 /////////////////////////////////////// // MUTATIONS /////////////////////////////////////// @@ -134,4 +139,4 @@ #define RADIMMUNE 11 #define NOGUNS 12 #define NOTRANSSTING 13 -#define VIRUSIMMUNE 14 \ No newline at end of file +#define VIRUSIMMUNE 14 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/_globalvars/genetics.dm b/code/_globalvars/genetics.dm index 116aa0797cb..3ff80f3376c 100644 --- a/code/_globalvars/genetics.dm +++ b/code/_globalvars/genetics.dm @@ -66,4 +66,4 @@ var/LOUDBLOCK = 0 var/DIZZYBLOCK = 0 var/list/reg_dna = list( ) //this appears to be a list of UE == real_name correlations -var/list/global_mutations = list() // list of hidden mutation things \ No newline at end of file +var/list/global_mutations = list() // list of hidden mutation things diff --git a/code/datums/action.dm b/code/datums/action.dm index 499570be291..e12bd371a6d 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -209,6 +209,19 @@ button.name = name ..() +/datum/action/item_action/synthswitch + name = "Change Synthesizer Instrument" + desc = "Change the type of instrument your synthesizer is playing as." + +/datum/action/item_action/synthswitch/Trigger() + if(istype(target, /obj/item/device/instrument/piano_synth)) + var/obj/item/device/instrument/piano_synth/synth = target + var/chosen = input("Choose the type of instrument you want to use", "Instrument Selection", "piano") as null|anything in synth.insTypes + if(!synth.insTypes[chosen]) + return + return synth.changeInstrument(chosen) + return ..() + /datum/action/item_action/vortex_recall name = "Vortex Recall" desc = "Recall yourself, and anyone nearby, to an attuned hierophant rune at any time.
If no such rune exists, will produce a rune at your location." @@ -337,6 +350,18 @@ var/image/img = image(button_icon, current_button, "scan_mode") current_button.overlays += img +/datum/action/item_action/instrument + name = "Use Instrument" + desc = "Use the instrument specified" + +/datum/action/item_action/instrument/Trigger() + if(istype(target, /obj/item/device/instrument)) + var/obj/item/device/instrument/I = target + I.interact(usr) + return + return ..() + + /datum/action/item_action/remove_badge name = "Remove Holobadge" 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/shuttles.dm b/code/datums/shuttles.dm index 3d0f877a3aa..d20255bc57c 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -45,6 +45,13 @@ description = "Features include: areas for each department, and a small bar." admin_notes = "Designed to reduce chaos. Each dept requires dept access." +/datum/map_template/shuttle/emergency/military + suffix = "mil" + name = "emergency shuttle (military)" + description = "Troop transport with point defense turrets." + admin_notes = "Designed to ensure a safe evacuation during xeno outbreaks." + + /datum/map_template/shuttle/emergency/clown suffix = "clown" name = "Snappop(tm)!" 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/datums/supplypacks.dm b/code/datums/supplypacks.dm index 739844051f6..20d9cdb2c1e 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -949,7 +949,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine contains = list(/obj/item/pizzabox/margherita, /obj/item/pizzabox/mushroom, /obj/item/pizzabox/meat, - /obj/item/pizzabox/vegetable) + /obj/item/pizzabox/vegetable, + /obj/item/pizzabox/hawaiian) cost = 60 containername = "Pizza crate" @@ -1513,6 +1514,22 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containername = "foam force pistols crate" contraband = 1 +/datum/supply_packs/misc/bigband + name = "Big band instrument collection" + contains = list(/obj/item/device/instrument/violin, + /obj/item/device/instrument/guitar, + /obj/item/device/instrument/eguitar, + /obj/item/device/instrument/glockenspiel, + /obj/item/device/instrument/accordion, + /obj/item/device/instrument/saxophone, + /obj/item/device/instrument/trombone, + /obj/item/device/instrument/recorder, + /obj/item/device/instrument/harmonica, + /obj/item/device/instrument/xylophone, + /obj/structure/piano) + cost = 50 + containername = "Big band musical instruments collection" + /datum/supply_packs/misc/randomised/contraband num_contained = 5 contains = list(/obj/item/weapon/storage/pill_bottle/random_drug_bottle, 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/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index abc8aa8952f..39099fb7d44 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -41,16 +41,13 @@ force = 15 throwforce = 25 embed_chance = 75 - var/cooldown = 0 -/obj/item/weapon/melee/cultblade/dagger/afterattack(atom/target, mob/living/carbon/human/user) +/obj/item/weapon/melee/cultblade/dagger/attack(atom/target, mob/living/carbon/human/user) ..() if(ishuman(target)) var/mob/living/carbon/human/H = target - if(!(cooldown > world.time) && ((H.stat != DEAD) && !(NO_BLOOD in H.species.species_traits))) - user.visible_message("The runes on the blade absorb the blood of [H]!") - H.bleed(5000) - cooldown = world.time + 2400 + if((H.stat != DEAD) && !(NO_BLOOD in H.species.species_traits)) + H.bleed(50) /obj/item/weapon/restraints/legcuffs/bola/cult name = "runed bola" diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index 60b9fcb2c85..10f6b92f517 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -65,6 +65,23 @@ else return ..() +/obj/structure/cult/functional/proc/updatehealth() + if(health <= 0) + destroy_structure() + +/obj/structure/cult/functional/proc/take_damage(damage, damage_type = BRUTE) + if(damage_type == BRUTE || damage_type == BURN) + health -= damage + updatehealth() + +/obj/structure/cult/functional/attackby(obj/item/I, mob/living/user) + ..() + take_damage(I.force, I.damtype) + playsound(loc, I.hitsound, 80, 1) + +/obj/structure/cult/functional/bullet_act(var/obj/item/projectile/P) + take_damage(P.damage, P.damage_type) + /obj/structure/cult/functional/attack_hand(mob/living/user) if(!iscultist(user)) to_chat(user, "[heathen_message]") @@ -142,6 +159,8 @@ C.apply_damage(30, BURN, "head") //30 fire damage because it's FUCKING LAVA head.disfigure("burn") //Your face is unrecognizable because it's FUCKING LAVA return 1 + else + ..() var/list/blacklisted_pylon_turfs = typecacheof(list( /turf/simulated/floor/engine/cult, diff --git a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm index 4f7ad2ade9a..64b77d3b374 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm @@ -11,7 +11,7 @@ var/obj/item/organ/external/affected = H.get_organ(target_zone) if(!affected) return 0 - if(affected.status & ORGAN_ROBOT) //Maybe add in a machine version, later? + if(affected.status & ORGAN_ROBOT) return 0 var/mob/living/carbon/human/H = user // You must either: Be of the abductor species, or contain an abductor implant @@ -64,3 +64,31 @@ var/obj/item/organ/internal/heart/gland/gland = tool gland.insert(target, 2) return 1 + +//IPC Gland Surgery// + +/datum/surgery/organ_extraction/synth + name = "experimental robotic dissection" + steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/internal/extract_organ/synth,/datum/surgery_step/internal/gland_insert,/datum/surgery_step/robotics/external/close_hatch) + possible_locs = list("chest") + requires_organic_bodypart = 0 + +/datum/surgery/organ_extraction/synth/can_start(mob/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery) + if(!ishuman(user)) + return FALSE + if(ishuman(target)) + var/mob/living/carbon/human/H = target + var/obj/item/organ/external/affected = H.get_organ(target_zone) + if(!affected) + return FALSE + if(!(affected.status & ORGAN_ROBOT)) + return FALSE + var/mob/living/carbon/human/H = user + // You must either: Be of the abductor species, or contain an abductor implant + if((H.get_species() == "Abductor" || (locate(/obj/item/weapon/implant/abductor) in H))) + return TRUE + return FALSE + +/datum/surgery_step/internal/extract_organ/synth + name = "remove cell" + organ_types = list(/obj/item/organ/internal/cell) \ No newline at end of file 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 6c28b9ade28..8b0565c432e 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/jobs/job/support.dm b/code/game/jobs/job/support.dm index 6b8a35ce582..573f8e72c94 100644 --- a/code/game/jobs/job/support.dm +++ b/code/game/jobs/job/support.dm @@ -215,17 +215,18 @@ uniform = /obj/item/clothing/under/rank/clown shoes = /obj/item/clothing/shoes/clown_shoes mask = /obj/item/clothing/mask/gas/clown_hat + l_pocket = /obj/item/weapon/bikehorn l_ear = /obj/item/device/radio/headset/headset_service id = /obj/item/weapon/card/id/clown pda = /obj/item/device/pda/clown backpack_contents = list( /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1, - /obj/item/weapon/bikehorn = 1, /obj/item/weapon/stamp/clown = 1, /obj/item/toy/crayon/rainbow = 1, /obj/item/weapon/storage/fancy/crayons = 1, /obj/item/weapon/reagent_containers/spray/waterflower = 1, - /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofbanana = 1 + /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofbanana = 1, + /obj/item/device/instrument/bikehorn = 1 ) backpack = /obj/item/weapon/storage/backpack/clown 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/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index 72dcbb7deb6..c036bedde1c 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -436,8 +436,10 @@ item_state = "claymorered" /obj/item/weapon/holo/esword - desc = "May the force be within you. Sorta" + name = "Holographic Energy Sword" + desc = "This looks like a real energy sword!" icon_state = "sword0" + hitsound = "sound/weapons/blade1.ogg" force = 3.0 throw_speed = 1 throw_range = 5 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/cryopod.dm b/code/game/machinery/cryopod.dm index 0478141abe3..d3cbc93d4f0 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -101,7 +101,7 @@ visible_message("The console beeps happily as it disgorges \the [I].") - I.loc = get_turf(src) + I.forceMove(get_turf(src)) frozen_items -= I else if(href_list["allitems"]) @@ -117,7 +117,7 @@ visible_message("The console beeps happily as it disgorges the desired objects.") for(var/obj/item/I in frozen_items) - I.loc = get_turf(src) + I.forceMove(get_turf(src)) frozen_items -= I updateUsrDialog() @@ -281,7 +281,7 @@ //Drop all items into the pod. for(var/obj/item/W in occupant) occupant.unEquip(W) - W.loc = src + W.forceMove(src) if(W.contents.len) //Make sure we catch anything not handled by qdel() on the items. var/preserve = null @@ -294,7 +294,7 @@ for(var/obj/item/O in W.contents) if(istype(O,/obj/item/weapon/tank)) //Stop eating pockets, you fuck! continue - O.loc = src + O.forceMove(src) for(var/obj/machinery/computer/cloning/cloner in machines) for(var/datum/dna2/record/R in cloner.records) @@ -326,7 +326,7 @@ control_computer.frozen_items += W W.loc = null else - W.loc = loc + W.forceMove(loc) // Skip past any cult sacrifice objective using this person if(GAMEMODE_IS_CULT && is_sacrifice_target(occupant.mind)) @@ -463,9 +463,7 @@ to_chat(user, "\The [src] is in use.") return - M.forceMove(src) - - time_till_despawn = initial(time_till_despawn) / willing + take_occupant(M, willing) else //because why the fuck would you keep going if the mob isn't in the pod to_chat(user, "You stop putting [M] into the cryopod.") @@ -479,23 +477,7 @@ to_chat(M, "[on_enter_occupant_message]") to_chat(M, "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.") - occupant = M - name = "[name] ([occupant.name])" - time_entered = world.time - - if(findtext("[M.key]","@",1,2)) - var/FT = replacetext(M.key, "@", "") - for(var/mob/dead/observer/Gh in respawnable_list) //this may not be foolproof but it seemed like a better option than 'in world' - if(Gh.key == FT) - if(Gh.client && Gh.client.holder) //just in case someone has a byond name with @ at the start, which I don't think is even possible but whatever - to_chat(Gh, "Warning: Your body has entered cryostorage.") - - // Book keeping! - log_admin("[key_name(M)] has entered a stasis pod.") - message_admins("[key_name_admin(M)] has entered a stasis pod. (JMP)") - - //Despawning occurs when process() is called with an occupant without a client. - add_fingerprint(M) + take_occupant(M, willing) /obj/machinery/cryopod/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) @@ -560,38 +542,36 @@ if(occupant) to_chat(user, "\The [src] is in use.") return - L.forceMove(src) - time_till_despawn = initial(time_till_despawn) / willing + take_occupant(L, willing) else to_chat(user, "You stop [L == user ? "climbing into the cryo pod." : "putting [L] into the cryo pod."]") - return - if(orient_right) - icon_state = "[occupied_icon_state]-r" - else - icon_state = occupied_icon_state +/obj/machinery/cryopod/proc/take_occupant(var/mob/living/carbon/E, var/willing_factor = 1) + if(occupant) + return + if(!E) + return + E.forceMove(src) + time_till_despawn = initial(time_till_despawn) / willing_factor + if(orient_right) + icon_state = "[occupied_icon_state]-r" + else + icon_state = occupied_icon_state + to_chat(E, "[on_enter_occupant_message]") + to_chat(E, "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.") + occupant = E + name = "[name] ([occupant.name])" + time_entered = world.time + if(findtext("[E.key]","@",1,2)) + var/FT = replacetext(E.key, "@", "") + for(var/mob/dead/observer/Gh in respawnable_list) //this may not be foolproof but it seemed like a better option than 'in world' + if(Gh.key == FT) + if(Gh.client && Gh.client.holder) //just in case someone has a byond name with @ at the start, which I don't think is even possible but whatever + to_chat(Gh, "Warning: Your body has entered cryostorage.") + log_admin("[key_name(E)] entered a stasis pod.") + message_admins("[key_name_admin(E)] entered a stasis pod. (JMP)") + add_fingerprint(E) - to_chat(L, "[on_enter_occupant_message]") - to_chat(L, "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.") - occupant = L - name = "[name] ([occupant.name])" - time_entered = world.time - - if(findtext("[L.key]","@",1,2)) - var/FT = replacetext(L.key, "@", "") - for(var/mob/dead/observer/Gh in respawnable_list) //this may not be foolproof but it seemed like a better option than 'in world' - if(Gh.key == FT) - if(Gh.client && Gh.client.holder) //just in case someone has a byond name with @ at the start, which I don't think is even possible but whatever - to_chat(Gh, "Warning: Your body has entered cryostorage.") - - // Book keeping! - log_admin("[key_name_admin(L)] has entered a stasis pod. (JMP)") - message_admins("[key_name_admin(L)] has entered a stasis pod.") - - //Despawning occurs when process() is called with an occupant without a client. - add_fingerprint(L) - - return /obj/machinery/cryopod/verb/eject() set name = "Eject Pod" @@ -733,3 +713,18 @@ qdel(R.module) return ..() + +/proc/cryo_ssd(var/mob/living/carbon/person_to_cryo) + if(istype(person_to_cryo.loc, /obj/machinery/cryopod)) + return 0 + var/list/free_cryopods = list() + for(var/obj/machinery/cryopod/P in machines) + if(!P.occupant && istype(get_area(P), /area/crew_quarters/sleep)) + free_cryopods += P + var/obj/machinery/cryopod/target_cryopod = null + if(free_cryopods.len) + target_cryopod = safepick(free_cryopods) + if(target_cryopod.check_occupant_allowed(person_to_cryo)) + target_cryopod.take_occupant(person_to_cryo, 1) + return 1 + return 0 \ No newline at end of file diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index caf6840ebc7..5b1211a7394 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -977,7 +977,7 @@ /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/lime = 3, /obj/item/seeds/onion = 3, /obj/item/seeds/orange = 3, /obj/item/seeds/peanuts = 3, /obj/item/seeds/pineapple = 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) 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/items.dm b/code/game/objects/items.dm index a1a68ff5cf7..d40baf16877 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -202,7 +202,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d to_chat(user, msg) -/obj/item/attack_hand(mob/user as mob) +/obj/item/attack_hand(mob/user as mob, pickupfireoverride = FALSE) if(!user) return 0 if(hasorgans(user)) var/mob/living/carbon/human/H = user @@ -216,7 +216,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d to_chat(user, "You try to move your [temp.name], but cannot!") return 0 - if(burn_state == ON_FIRE) + if(burn_state == ON_FIRE && !pickupfireoverride) var/mob/living/carbon/human/H = user if(istype(H)) if(H.gloves && (H.gloves.max_heat_protection_temperature > 360)) diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm index 3643b197d4c..450dad3d869 100644 --- a/code/game/objects/items/devices/instruments.dm +++ b/code/game/objects/items/devices/instruments.dm @@ -2,14 +2,15 @@ /obj/item/device/instrument name = "generic instrument" icon = 'icons/obj/musician.dmi' + lefthand_file = 'icons/mob/inhands/equipment/instruments_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/instruments_righthand.dmi' burn_state = FLAMMABLE var/datum/song/handheld/song var/instrumentId = "generic" - var/instrumentExt = "ogg" + var/instrumentExt = "mid" /obj/item/device/instrument/New() - song = new(instrumentId, src) - song.instrumentExt = instrumentExt + song = new(instrumentId, src, instrumentExt) ..() /obj/item/device/instrument/Destroy() @@ -44,6 +45,7 @@ desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" icon_state = "violin" item_state = "violin" + instrumentExt = "ogg" force = 10 hitsound = "swing_hit" instrumentId = "violin" @@ -55,11 +57,26 @@ item_state = "golden_violin" burn_state = LAVA_PROOF +/obj/item/device/instrument/piano_synth + name = "synthesizer" + desc = "An advanced electronic synthesizer that can be used as various instruments." + icon_state = "synth" + item_state = "synth" + instrumentId = "piano" + instrumentExt = "ogg" + var/static/list/insTypes = list("accordion" = "mid", "glockenspiel" = "mid", "guitar" = "ogg", "eguitar" = "ogg", "harmonica" = "mid", "piano" = "ogg", "recorder" = "mid", "saxophone" = "mid", "trombone" = "mid", "violin" = "ogg", "xylophone" = "mid") + actions_types = list(/datum/action/item_action/synthswitch) + +/obj/item/device/instrument/piano_synth/proc/changeInstrument(name = "piano") + song.instrumentDir = name + song.instrumentExt = insTypes[name] + /obj/item/device/instrument/guitar name = "guitar" desc = "It's made of wood and has bronze strings." icon_state = "guitar" item_state = "guitar" + instrumentExt = "ogg" force = 10 attack_verb = list("played metal on", "serenaded", "crashed", "smashed") hitsound = 'sound/effects/guitarsmash.ogg' @@ -70,11 +87,79 @@ desc = "Makes all your shredding needs possible." icon_state = "eguitar" item_state = "eguitar" + instrumentExt = "ogg" force = 12 attack_verb = list("played metal on", "shredded", "crashed", "smashed") hitsound = 'sound/weapons/stringsmash.ogg' instrumentId = "eguitar" +/obj/item/device/instrument/glockenspiel + name = "glockenspiel" + desc = "Smooth metal bars perfect for any marching band." + icon_state = "glockenspiel" + item_state = "glockenspiel" + instrumentId = "glockenspiel" + +/obj/item/device/instrument/accordion + name = "accordion" + desc = "Pun-Pun not included." + icon_state = "accordion" + item_state = "accordion" + instrumentId = "accordion" + +/obj/item/device/instrument/saxophone + name = "saxophone" + desc = "This soothing sound will be sure to leave your audience in tears." + icon_state = "saxophone" + item_state = "saxophone" + instrumentId = "saxophone" + +/obj/item/device/instrument/trombone + name = "trombone" + desc = "How can any pool table ever hope to compete?" + icon_state = "trombone" + item_state = "trombone" + instrumentId = "trombone" + +/obj/item/device/instrument/recorder + name = "recorder" + desc = "Just like in school, playing ability and all." + icon_state = "recorder" + item_state = "recorder" + instrumentId = "recorder" + +/obj/item/device/instrument/harmonica + name = "harmonica" + desc = "For when you get a bad case of the space blues." + icon_state = "harmonica" + item_state = "harmonica" + instrumentId = "harmonica" + force = 5 + w_class = WEIGHT_CLASS_SMALL + +/obj/item/device/instrument/xylophone + name = "xylophone" + desc = "a percussion instrument with a bright tone." + icon_state = "xylophone" + item_state = "xylophone" + instrumentId = "xylophone" + +/obj/item/device/instrument/bikehorn + name = "gilded bike horn" + desc = "An exquisitely decorated bike horn, capable of honking in a variety of notes." + icon_state = "bike_horn" + item_state = "bike_horn" + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' + attack_verb = list("beautifully honks") + instrumentId = "bikehorn" + instrumentExt = "ogg" + w_class = WEIGHT_CLASS_TINY + force = 0 + throw_speed = 3 + throw_range = 7 + hitsound = 'sound/items/bikehorn.ogg' + /datum/crafting_recipe/violin name = "Violin" result = /obj/item/device/instrument/violin 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/bee_briefcase.dm b/code/game/objects/items/weapons/bee_briefcase.dm index 229a025a18f..098fdc00549 100644 --- a/code/game/objects/items/weapons/bee_briefcase.dm +++ b/code/game/objects/items/weapons/bee_briefcase.dm @@ -62,14 +62,7 @@ else if(world.time >= next_sound) //This cooldown doesn't prevent us from releasing bees, just stops the sound next_sound = world.time + 90 - //Play sound through the station intercomms, so everyone knows the doom you have wrought. - for(var/O in global_intercoms) - var/obj/item/device/radio/intercom/I = O - if(!is_station_level(I.z)) //Only broadcast to the station intercoms - continue - if(!I.on) //Only broadcast to active intercoms (powered, switched on) - continue - playsound(I, sound_file, 35) + playsound(loc, sound_file, 35) //Release up to 5 bees per use. Without using strange reagent, that means two uses. WITH strange reagent, you can get more if you don't release the last bee for(var/bee = min(5, bees_left), bee > 0, bee--) 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/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 78601c29b74..8fdaf4804b3 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -440,7 +440,7 @@ icon_closed = "largebin" anchored = TRUE -/obj/structure/closet/crate/attackby(obj/item/weapon/W, mob/living/user, params) +/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)) diff --git a/code/game/objects/structures/crates_lockers/walllocker.dm b/code/game/objects/structures/crates_lockers/walllocker.dm index 25a41a8dde7..ec736d4b04a 100644 --- a/code/game/objects/structures/crates_lockers/walllocker.dm +++ b/code/game/objects/structures/crates_lockers/walllocker.dm @@ -17,6 +17,10 @@ //spawns endless (3 sets) amounts of breathmask, emergency oxy tank and crowbar +/obj/structure/closet/walllocker/CtrlClick() + if(ishuman(usr) && Adjacent(usr)) + verb_toggleopen() + /obj/structure/closet/walllocker/emerglocker name = "emergency locker" desc = "A wall mounted locker with emergency supplies" diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index ca7c18c2e4e..1677b776c15 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -14,10 +14,11 @@ var/instrumentExt = "ogg" // the file extension var/obj/instrumentObj = null // the associated obj playing the sound -/datum/song/New(dir, obj) +/datum/song/New(dir, obj, ext = "ogg") tempo = sanitize_tempo(tempo) instrumentDir = dir instrumentObj = obj + instrumentExt = ext /datum/song/Destroy() instrumentObj = null @@ -50,7 +51,7 @@ return // now generate name - var/soundfile = "sound/[instrumentDir]/[ascii2text(note+64)][acc][oct].[instrumentExt]" + var/soundfile = "sound/instruments/[instrumentDir]/[ascii2text(note+64)][acc][oct].[instrumentExt]" soundfile = file(soundfile) // make sure the note exists if(!fexists(soundfile)) @@ -58,7 +59,8 @@ // and play var/turf/source = get_turf(instrumentObj) var/sound/music_played = sound(soundfile) - for(var/mob/M in hearers(15, source)) + for(var/A in hearers(15, source)) + var/mob/M = A if(!M.client || !(M.client.prefs.sound & SOUND_INSTRUMENTS)) continue M.playsound_local(source, null, 100, falloff = 5, S = music_played) @@ -147,6 +149,7 @@ lines = new() tempo = sanitize_tempo(5) // default 120 BPM name = "" + nanomanager.update_uis(src) else if(href_list["import"]) playing = 0 @@ -156,11 +159,11 @@ if(!in_range(instrumentObj, usr)) return - if(lentext(t) >= 3072) + if(lentext(t) >= 12000) var/cont = input(usr, "Your message is too long! Would you like to continue editing it?", "", "yes") in list("yes", "no") if(cont == "no") break - while(lentext(t) > 3072) + while(lentext(t) > 12000) //split into lines spawn() @@ -172,19 +175,21 @@ lines.Cut(1,2) else tempo = sanitize_tempo(5) // default 120 BPM - if(lines.len > 50) + if(lines.len > 200) to_chat(usr, "Too many lines!") - lines.Cut(51) + lines.Cut(201) var/linenum = 1 for(var/l in lines) - if(lentext(l) > 50) + if(lentext(l) > 200) to_chat(usr, "Line [linenum] too long!") lines.Remove(l) else linenum++ + nanomanager.update_uis(src) else if(href_list["help"]) help = !help + nanomanager.update_uis(src) if(href_list["repeat"]) //Changing this from a toggle to a number of repeats to avoid infinite loops. if(playing) @@ -194,9 +199,11 @@ repeat = 0 if(repeat > max_repeat) repeat = max_repeat + nanomanager.update_uis(src) else if(href_list["tempo"]) tempo = sanitize_tempo(tempo + text2num(href_list["tempo"]) * world.tick_lag) + nanomanager.update_uis(src) else if(href_list["play"]) if(playing) @@ -204,6 +211,7 @@ playing = 1 spawn() playsong(usr) + nanomanager.update_uis(src) else if(href_list["insertline"]) var/num = round(text2num(href_list["insertline"])) @@ -213,32 +221,36 @@ var/newline = html_encode(input("Enter your line: ", instrumentObj.name) as text|null) if(!newline || !in_range(instrumentObj, usr)) return - if(lines.len > 50) + if(lines.len > 200) return - if(lentext(newline) > 50) - newline = copytext(newline, 1, 50) + if(lentext(newline) > 200) + newline = copytext(newline, 1, 200) lines.Insert(num, newline) + nanomanager.update_uis(src) else if(href_list["deleteline"]) var/num = round(text2num(href_list["deleteline"])) if(num > lines.len || num < 1) return lines.Cut(num, num + 1) + nanomanager.update_uis(src) else if(href_list["modifyline"]) var/num = round(text2num(href_list["modifyline"])) var/content = html_encode(input("Enter your line: ", instrumentObj.name, lines[num]) as text|null) if(!content || !in_range(instrumentObj, usr)) return - if(lentext(content) > 50) - content = copytext(content, 1, 50) + if(lentext(content) > 200) + content = copytext(content, 1, 200) if(num > lines.len || num < 1) return lines[num] = content + nanomanager.update_uis(src) else if(href_list["stop"]) playing = 0 + nanomanager.update_uis(src) /datum/song/proc/sanitize_tempo(new_tempo) new_tempo = abs(new_tempo) 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/game/turfs/turf.dm b/code/game/turfs/turf.dm index a5e4190d6ea..83de35ea82c 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -157,6 +157,7 @@ return if(!use_preloader && path == type) // Don't no-op if the map loader requires it to be reconstructed return src + set_light(0) var/old_opacity = opacity var/old_dynamic_lighting = dynamic_lighting var/old_affecting_lights = affecting_lights diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 4ddab9ccf2c..d05cc25a476 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1,4 +1,3 @@ - var/global/BSACooldown = 0 var/global/nologevent = 0 @@ -103,9 +102,14 @@ var/global/nologevent = 0 Narrate to | Subtle message "} + if(check_rights(R_EVENT, 0)) body += {" | Bless | Smite"} + if(isLivingSSD(M)) + if(!istype(M.loc, /obj/machinery/cryopod)) + body += {" | Cryo "} + if(M.client) if(!istype(M, /mob/new_player)) body += "

" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 4c9194d1225..004cf77a990 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -79,6 +79,7 @@ var/list/admin_verbs_admin = list( /client/proc/reset_all_tcs, /*resets all telecomms scripts*/ /client/proc/toggle_mentor_chat, /client/proc/toggle_advanced_interaction, /*toggle admin ability to interact with not only machines, but also atoms such as buttons and doors*/ + /client/proc/list_ssds, ) var/list/admin_verbs_ban = list( /client/proc/unban_panel, @@ -346,10 +347,12 @@ var/list/admin_verbs_snpc = list( if(mob.invisibility == INVISIBILITY_OBSERVER) mob.invisibility = initial(mob.invisibility) to_chat(mob, "Invisimin off. Invisibility reset.") + mob.add_to_all_human_data_huds() //TODO: Make some kind of indication for the badmin that they are currently invisible else mob.invisibility = INVISIBILITY_OBSERVER to_chat(mob, "Invisimin on. You are now as invisible as a ghost.") + mob.remove_from_all_data_huds() /client/proc/player_panel() set name = "Player Panel" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 91f2fec4f06..3aabfd3150a 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1950,6 +1950,20 @@ if(logmsg) log_admin("[key_name(owner)] answered [key_name(M)]'s prayer with a smiting: [logmsg]") message_admins("[key_name_admin(owner)] answered [key_name_admin(M)]'s prayer with a smiting: [logmsg]") + else if(href_list["cryossd"]) + if(!check_rights(R_ADMIN)) + return + var/mob/living/carbon/human/H = locateUID(href_list["cryossd"]) + if(!istype(H)) + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return + if(!isLivingSSD(H)) + to_chat(usr, "This can only be used on living, SSD players.") + return + var/success = cryo_ssd(H) + if(success) + log_admin("[key_name(usr)] sent [H.job] [H] to cryo.") + message_admins("[key_name_admin(usr)] sent [H.job] [H] to cryo.") else if(href_list["FaxReplyTemplate"]) if(!check_rights(R_ADMIN)) return diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 4560c7affa9..8651d26f016 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -13,7 +13,22 @@ return var/image/cross = image('icons/obj/storage.dmi',"bible") - msg = "[bicon(cross)] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src)]) (CA) (SC) (BLESS) (SMITE): [msg]" + var/font_color = "purple" + var/prayer_type = "PRAYER" + var/deity + if(usr.job == "Chaplain") + if(ticker && ticker.Bible_deity_name) + deity = ticker.Bible_deity_name + cross = image('icons/obj/storage.dmi',"kingyellow") + font_color = "blue" + prayer_type = "CHAPLAIN PRAYER" + else if(iscultist(usr)) + cross = image('icons/obj/storage.dmi',"tome") + font_color = "red" + prayer_type = "CULTIST PRAYER" + deity = ticker.mode.cultdat.entity_name + + msg = "[bicon(cross)][prayer_type][deity ? " (to [deity])" : ""]:[key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src)]) (CA) (SC) (BLESS) (SMITE): [msg]" for(var/client/X in admins) if(check_rights(R_EVENT,0,X.mob)) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 6b5f6f16249..fdfbdfba6b2 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -882,6 +882,48 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(usr)] blanked all telecomms scripts.") feedback_add_details("admin_verb","RAT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/proc/list_ssds() + set category = "Admin" + set name = "List SSDs" + set desc = "Lists SSD players" + + if(!check_rights(R_ADMIN)) + return + + var/msg = "SSD Report" + msg += "SSD Players:
" + msg += "" + var/mins_ssd + var/job_string + var/key_string + var/role_string + for(var/mob/living/carbon/human/H in living_mob_list) + if(!isLivingSSD(H)) + continue + mins_ssd = round((world.time - H.last_logout) / 600) + if(H.job) + job_string = H.job + else + job_string = "-" + key_string = H.key + if(job_string in command_positions) + job_string = "" + job_string + "" + role_string = "-" + if(H.mind) + if(H.mind.special_role) + role_string = "[H.mind.special_role]" + if(!H.key && H.mind.key) + key_string = H.mind.key + msg += "" + msg += "" + if(istype(H.loc, /obj/machinery/cryopod)) + msg += "" + else + msg += "" + msg += "" + msg += "
KeyReal NameJobMins SSDSpecial RoleAreaPPNCryo
[key_string][H.real_name][job_string][mins_ssd][role_string][get_area(H)]PPIn CryoCryo
" + src << browse(msg, "window=Player_ssd_check") + /client/proc/toggle_ert_calling() set category = "Event" set name = "Toggle ERT" diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index b4d4bc60041..a0a445f59be 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: " @@ -833,13 +819,19 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/HTML = "" HTML += "
" - HTML += ShowDisabilityState(user,DISABILITY_FLAG_NEARSIGHTED,"Needs Glasses") + HTML += ShowDisabilityState(user,DISABILITY_FLAG_NEARSIGHTED,"Needs glasses") HTML += ShowDisabilityState(user,DISABILITY_FLAG_FAT,"Obese") HTML += ShowDisabilityState(user,DISABILITY_FLAG_EPILEPTIC,"Seizures") HTML += ShowDisabilityState(user,DISABILITY_FLAG_DEAF,"Deaf") HTML += ShowDisabilityState(user,DISABILITY_FLAG_BLIND,"Blind") HTML += ShowDisabilityState(user,DISABILITY_FLAG_COLOURBLIND,"Colourblind") HTML += ShowDisabilityState(user,DISABILITY_FLAG_MUTE,"Mute") + HTML += ShowDisabilityState(user,DISABILITY_FLAG_TOURETTES,"Tourettes syndrome") // this will / can not be abused. It also SEVERELY stuns. It's just for fun. + HTML += ShowDisabilityState(user,DISABILITY_FLAG_NERVOUS,"Stutter") + HTML += ShowDisabilityState(user,DISABILITY_FLAG_SWEDISH,"Swedish accent") + HTML += ShowDisabilityState(user,DISABILITY_FLAG_LISP,"Lisp") + HTML += ShowDisabilityState(user,DISABILITY_FLAG_DIZZY,"Dizziness") + HTML += ShowDisabilityState(user,DISABILITY_FLAG_SCRAMBLED,"Can't speak properly") HTML += {" @@ -1186,33 +1178,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 +1203,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 +1226,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 +1295,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 +1335,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 +1391,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 +1435,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 +1592,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 +1685,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 +1710,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 +2081,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 +2095,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 +2139,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 +2156,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) @@ -2233,6 +2180,27 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(disabilities & DISABILITY_FLAG_MUTE) character.dna.SetSEState(MUTEBLOCK,1,1) + if(disabilities & DISABILITY_FLAG_TOURETTES) + character.dna.SetSEState(TWITCHBLOCK,1,1) + + if(disabilities & DISABILITY_FLAG_NERVOUS) + character.dna.SetSEState(NERVOUSBLOCK,1,1) + + if(disabilities & DISABILITY_FLAG_SWEDISH) + character.dna.SetSEState(SWEDEBLOCK,1,1) + + if(disabilities & DISABILITY_FLAG_SCRAMBLED) + character.dna.SetSEState(SCRAMBLEBLOCK,1,1) + + if(disabilities & DISABILITY_FLAG_LISP) + character.dna.SetSEState(LISPBLOCK,1,1) + + if(disabilities & DISABILITY_FLAG_DIZZY) + character.dna.SetSEState(DIZZYBLOCK,1,1) + + if(disabilities & DISABILITY_FLAG_SCRAMBLED) + character.dna.SetSEState(SCRAMBLEBLOCK,1,1) + S.handle_dna(character) if(character.dna.dirtySE) 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/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 0b9e516a222..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 diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 4539fa6de79..d7597797351 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -276,7 +276,39 @@ to_chat(target, "You comb your tail with the [src].") used = 1 -/obj/item/device/fluff/desolate_baton_kit //DesolateG: Michael steampunk_witch +/obj/item/device/fluff/desolate_coat_kit //DesolateG: Michael Smith + name = "armored jacket conversion kit" + desc = "Flaps of dark fabric, probably used to somehow modify some sort of an armored garment. Won't help with protection, though." + icon_state = "modkit" + w_class = WEIGHT_CLASS_SMALL + +/obj/item/device/fluff/desolate_coat_kit/afterattack(atom/target, mob/user, proximity) + if(!proximity || !ishuman(user) || user.incapacitated()) + return + + if(!istype(target, /obj/item/clothing/suit/armor/hos)) + to_chat(user, "You can't modify [target]!") + return + + to_chat(user, "You modify the appearance of [target].") + var/obj/item/clothing/suit/armor/jacket = target + jacket.icon_state = "desolate_coat_open" + jacket.icon = 'icons/obj/custom_items.dmi' + jacket.ignore_suitadjust = 0 + jacket.suit_adjusted = 1 + var/has_action = FALSE + for(var/datum/action/A in jacket.actions) + if(istype(A, /datum/action/item_action/openclose)) + has_action = TRUE + if(!has_action) + new /datum/action/item_action/openclose(jacket)//this actually works + jacket.adjust_flavour = "unbutton" + jacket.species_fit = null + jacket.sprite_sheets = null + user.update_inv_wear_suit() + qdel(src) + +/obj/item/device/fluff/desolate_baton_kit //DesolateG: Michael Smith name = "stun baton converstion kit" desc = "Some sci-fi looking parts for a stun baton." icon = 'icons/obj/custom_items.dmi' @@ -647,6 +679,43 @@ species_fit = null sprite_sheets = null +/obj/item/clothing/suit/jacket/miljacket/patch // sniper_fairy : P.A.T.C.H. + name = "custom purple military jacket" + desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable. This one has a medical patch on it." + icon = 'icons/obj/custom_items.dmi' + icon_state = "shazjacket_purple_open" + ignore_suitadjust = 0 + suit_adjusted = 1 + actions_types = list(/datum/action/item_action/openclose) + adjust_flavour = "unbutton" + +/obj/item/clothing/suit/jacket/miljacket/patch/attack_self(mob/user) + var/list/options = list() + options["purple"] = "shazjacket_purple" + options["yellow"] = "shazjacket_yellow" + options["blue"] = "shazjacket_blue" + options["brown"] = "shazjacket_brown" + options["orange"] = "shazjacket_orange" + options["grey"] = "shazjacket_grey" + options["black"] ="shazjacket_black" + options["red"] ="shazjacket_red" + options["navy"] ="shazjacket_navy" + options["white"] ="shazjacket_white" + + var/choice = input(user, "What color do you wish your jacket to be?", "Change color") as null|anything in options + + if(choice && !user.stat && in_range(user, src)) + if(suit_adjusted) + icon_state = "[options[choice]]_open" + else + icon_state = options[choice] + to_chat(user, "You turn your coat inside out and now it's [choice]!") + name = "custom [choice] military jacket" + user.update_inv_wear_suit() + return 1 + + . = ..() + /obj/item/clothing/suit/fluff/dusty_jacket //ComputerlessCitizen: Screech name = "Dusty Jacket" desc = "A worn leather jacket. Some burn holes have been patched." @@ -730,6 +799,17 @@ /obj/item/clothing/head/hood/fluff/linda //Epic_Charger: Linda Clark icon_state = "greenhood" +/obj/item/clothing/suit/hooded/hoodie/hylo //Hylocereus: Sam Aria + name = "worn assymetrical hoodie" + desc = "A soft, cozy longline hoodie. It looks old and worn, but well cared for. There's no label, but a series of dates and names is penned on a scrap of fabric sewn on the inside of the left side of the chest - 'Sam Aria' is scrawled atop them all, next to the words 'Please Remember'." + icon = 'icons/obj/custom_items.dmi' + icon_state = "sam_hoodie" + hoodtype = /obj/item/clothing/head/hood/hylo + +/obj/item/clothing/head/hood/hylo + icon = 'icons/obj/custom_items.dmi' + icon_state = "sam_hood" + /obj/item/clothing/suit/hooded/fluff/bone //Doru7: Jack Bone name = "skeleton suit" desc = "A spooky full-body suit! This one doesn't glow in the dark." diff --git a/code/modules/food_and_drinks/drinks/drinks/shotglass.dm b/code/modules/food_and_drinks/drinks/drinks/shotglass.dm index 42781cd1e57..e44856951f0 100644 --- a/code/modules/food_and_drinks/drinks/drinks/shotglass.dm +++ b/code/modules/food_and_drinks/drinks/drinks/shotglass.dm @@ -1,3 +1,5 @@ +#define SHOT_FLAME_TEMPERATURE 700 + /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass name = "shot glass" desc = "No glasses were shot in the making of this glass." @@ -5,10 +7,16 @@ amount_per_transfer_from_this = 15 volume = 15 materials = list(MAT_GLASS=100) + var/light_intensity = 2 + light_color = LIGHT_COLOR_LIGHTBLUE /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/on_reagent_change() - overlays.Cut() + if(!isShotFlammable() && burn_state == ON_FIRE) + extinguish() + update_icon() +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/update_icon() + overlays.Cut() if(reagents.total_volume) var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]1") @@ -20,9 +28,77 @@ filling.icon_state = "[icon_state]5" if(80 to INFINITY) filling.icon_state = "[icon_state]12" - filling.icon += mix_color_from_reagents(reagents.reagent_list) overlays += filling name = "shot glass of " + reagents.get_master_reagent_name() //No matter what, the glass will tell you the reagent's name. Might be too abusable in the future. + if(burn_state == ON_FIRE) + overlays += "shotglass_fire" + name = "flaming [name]" else name = "shot glass" + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/proc/clumsilyDrink(mob/living/carbon/human/user) //Clowns beware + if(burn_state != ON_FIRE) + return + user.visible_message("[user] pours [src] all over themself!", "You pour [src] all over yourself!", "You hear a 'whoompf' and a sizzle.") + extinguish(TRUE) + reagents.reaction(user, TOUCH) + reagents.clear_reagents() + user.IgniteMob() + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/proc/isShotFlammable() + var/datum/reagent/R = reagents.get_master_reagent() + if(istype(R, /datum/reagent/consumable/ethanol)) + var/datum/reagent/consumable/ethanol/A = R + if(A.volume >= 5 && A.alcohol_perc >= 0.35) //Only an approximation to if something's flammable but it will do + return TRUE + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/fire_act(global_overlay = FALSE) + if(!isShotFlammable() || burn_state == ON_FIRE) //You can't light a shot that's not flammable! + return + ..() + set_light(light_intensity, null, light_color) + visible_message("[src] begins to burn with a blue hue!") + update_icon() + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/extinguish(silent = FALSE) + ..() + set_light(0) + if(!silent) + visible_message("The dancing flame on [src] dies out.") + update_icon() + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/burn() //Let's override fire deleting the reagents inside the shot + return + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/attack(mob/living/carbon/human/user) + if((CLUMSY in user.mutations) && prob(50) && burn_state == ON_FIRE) + clumsilyDrink(user) + else + ..() + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/attackby(obj/item/W) + ..() + if(is_hot(W) >= 600) + fire_act() + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/attack_hand(mob/user, pickupfireoverride = TRUE) + ..() + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/attack_self(mob/living/carbon/human/user) + ..() + if(burn_state != ON_FIRE) + return + if((CLUMSY in user.mutations) && prob(50)) + clumsilyDrink(user) + else + user.visible_message("[user] places their hand over [src] to put it out!", "You use your hand to extinguish [src]!") + extinguish() + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/MouseDrop(mob/living/carbon/human/user) + if(!ishuman(user)) + return + if((CLUMSY in user.mutations) && prob(50) && burn_state == ON_FIRE) + clumsilyDrink(user) + else + ..() diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index d22d4eb2c93..394bce27908 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -1914,6 +1914,12 @@ icon_state = "watermelonslice" filling_color = "#FF3867" +/obj/item/weapon/reagent_containers/food/snacks/pineappleslice + name = "Pineapple Slices" + desc = "Rings of pineapple." + icon_state = "pineappleslice" + filling_color = "#e5b437" + /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake name = "Apple Cake" desc = "A cake centered with Apple." @@ -2037,6 +2043,20 @@ icon_state = "vegetablepizzaslice" filling_color = "#BAA14C" +/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/hawaiianpizza + name = "Hawaiian Pizza" + desc = "Love it or hate it, this pizza divides opinions. Complete with juicy pineapple." + icon_state = "hawaiianpizza" //NEEDED + slice_path = /obj/item/weapon/reagent_containers/food/snacks/hawaiianpizzaslice + slices_num = 6 + list_reagents = list("protein" = 15, "tomatojuice" = 6, "plantmatter" = 20, "pineapplejuice" = 6, "vitamin" = 5) + +/obj/item/weapon/reagent_containers/food/snacks/hawaiianpizzaslice + name = "Hawaiian pizza slice" + desc = "A slice of polarising pizza." + icon_state = "hawaiianpizzaslice" + filling_color = "#e5b437" + /obj/item/pizzabox name = "pizza box" desc = "A box suited for pizzas." @@ -2210,6 +2230,10 @@ pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza(src) boxtag = "Meatlover's Supreme" +/obj/item/pizzabox/hawaiian/New() + pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/hawaiianpizza(src) + boxtag = "Hawaiian Feast" + ////////////////////////////////FOOD ADDITIONS//////////////////////////////////////////// /obj/item/weapon/reagent_containers/food/snacks/wrap diff --git a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm index edf714d0f21..e3a22e29b2b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm @@ -27,6 +27,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/berries = "berryjuice", /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin = "pumpkinjuice", /obj/item/weapon/reagent_containers/food/snacks/grown/blumpkin = "blumpkinjuice", + /obj/item/weapon/reagent_containers/food/snacks/grown/pineapple = "pineapplejuice" ) /obj/machinery/juicer/New() @@ -182,3 +183,4 @@ new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src) new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src) new/obj/item/weapon/reagent_containers/food/snacks/grown/grapes(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/pineapple(src) diff --git a/code/modules/food_and_drinks/recipes/recipes_oven.dm b/code/modules/food_and_drinks/recipes/recipes_oven.dm index 473641c4cc8..a1b684d9343 100644 --- a/code/modules/food_and_drinks/recipes/recipes_oven.dm +++ b/code/modules/food_and_drinks/recipes/recipes_oven.dm @@ -253,6 +253,17 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza +/datum/recipe/oven/hawaiianpizza + items = list( + /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough, + /obj/item/weapon/reagent_containers/food/snacks/grown/tomato, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, + /obj/item/weapon/reagent_containers/food/snacks/pineappleslice, + /obj/item/weapon/reagent_containers/food/snacks/pineappleslice, + /obj/item/weapon/reagent_containers/food/snacks/meat, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/hawaiianpizza + /datum/recipe/oven/amanita_pie items = list( /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough, diff --git a/code/modules/hydroponics/grown/pineapple.dm b/code/modules/hydroponics/grown/pineapple.dm new file mode 100644 index 00000000000..ed8009ac079 --- /dev/null +++ b/code/modules/hydroponics/grown/pineapple.dm @@ -0,0 +1,27 @@ +/obj/item/seeds/pineapple + name = "pack of pineapple seeds" + desc = "These seeds grow into pineapple plants." + icon_state = "seed-pineapple" //NEEDED + species = "pineapple" + plantname = "Pineapple Plant" + product = /obj/item/weapon/reagent_containers/food/snacks/grown/pineapple + maturation = 6 + lifespan = 55 + endurance = 35 + growthstages = 4 + growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + icon_grow = "pineapple-grow" //NEEDED + icon_dead = "pineapple-dead" //NEEDED + genes = list(/datum/plant_gene/trait/repeated_harvest) + reagents_add = list("water" = 0.1, "vitamin" = 0.03, "sugar" = 0.02, "plantmatter" = 0.2) + +/obj/item/weapon/reagent_containers/food/snacks/grown/pineapple + seed = /obj/item/seeds/pineapple + name = "pineapple" + desc = "A soft sweet interior surrounded by a spiky skin." + slice_path = /obj/item/weapon/reagent_containers/food/snacks/pineappleslice + slices_num = 4 + icon_state = "pineapple" + filling_color = "#e5b437" + w_class = WEIGHT_CLASS_NORMAL + bitesize_mod = 3 \ No newline at end of file diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index a1e7e775e23..fbf14349a53 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -61,6 +61,11 @@ SetCollectBehavior() +/mob/living/simple_animal/hostile/mining_drone/emp_act(severity) + adjustHealth(100 / severity) + to_chat(src, "NOTICE: EMP detected, systems damaged!") + visible_message("[src] crackles and buzzes violently!") + /mob/living/simple_animal/hostile/mining_drone/sentience_act() AIStatus = AI_OFF check_friendly_fire = 0 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/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/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 7083b04ee35..3dc48f3df1a 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -324,8 +324,14 @@ G.affecting.forceMove(oldloc) message = "[src] flips over [G.affecting]!" else - message = "[src] does a flip!" - SpinAnimation(5,1) + if(prob(5)) + message = "[src] attempts a flip and crashes to the floor!" + SpinAnimation(5,1) + sleep(3) + Weaken(2) + else + message = "[src] does a flip!" + SpinAnimation(5,1) if("aflap", "aflaps") if(!restrained()) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 4ed0e47da47..d46918fbe2d 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1432,13 +1432,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 @@ -1462,29 +1458,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. @@ -2055,3 +2039,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_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index ac7153e160a..a7fcc6874a2 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 e9dea804cac..12b10b804fa 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -584,11 +584,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 2d3fab0b2a6..90002196c0f 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/logout.dm b/code/modules/mob/living/logout.dm index 6235aecf2c4..910a72aeca3 100644 --- a/code/modules/mob/living/logout.dm +++ b/code/modules/mob/living/logout.dm @@ -9,3 +9,4 @@ if(mind.active) Sleeping(2) player_logged = 1 + last_logout = world.time 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/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 4d5ea6b983d..e72b484e1e1 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -133,6 +133,7 @@ /obj/item/weapon/robot_module/medical/New() ..() modules += new /obj/item/device/healthanalyzer/advanced(src) + modules += new /obj/item/device/robotanalyzer(src) modules += new /obj/item/device/reagent_scanner/adv(src) modules += new /obj/item/weapon/borg_defib(src) modules += new /obj/item/roller_holder(src) @@ -255,9 +256,7 @@ modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src) modules += new /obj/item/weapon/pen(src) modules += new /obj/item/weapon/razor(src) - modules += new /obj/item/device/instrument/violin(src) - modules += new /obj/item/device/instrument/guitar(src) - modules += new /obj/item/device/instrument/eguitar(src) + modules += new /obj/item/device/instrument/piano_synth(src) var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src) M.matter = 30 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/mob_defines.dm b/code/modules/mob/mob_defines.dm index e275d855328..5031ec9c061 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -188,6 +188,8 @@ var/last_movement = -100 // Last world.time the mob actually moved of its own accord. + var/last_logout = 0 + var/resize = 1 //Badminnery resize var/datum/vision_override/vision_type = null //Vision override datum. 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/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index e16ce690c45..2b736f8b1a4 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -420,6 +420,31 @@ /obj/item/ammo_box/magazine/toy/pistol/riot ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot +/obj/item/ammo_box/magazine/toy/enforcer + name = "Enforcer Foam magazine" + icon_state = "enforcer" + max_ammo = 8 + multiple_sprites = 1 + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot + +/obj/item/ammo_box/magazine/toy/enforcer/update_icon() + ..() + overlays.Cut() + + var/ammo = ammo_count() + if(ammo && is_riot()) + overlays += image('icons/obj/ammo.dmi', icon_state = "enforcer-rd") + else if(ammo) + overlays += image('icons/obj/ammo.dmi', icon_state = "enforcer-bd") + +/obj/item/ammo_box/magazine/toy/enforcer/proc/is_riot()//if the topmost bullet is a riot dart + var/ammo = ammo_count() + if(!ammo) + return 0 + if(istype(contents[contents.len], /obj/item/ammo_casing/caseless/foam_dart/riot)) + return 1 + return 0 + /obj/item/ammo_box/magazine/toy/smgm45 name = "donksoft SMG magazine" ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 3876e067f70..58fd2c0eba8 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -32,6 +32,46 @@ magazine = new /obj/item/ammo_box/magazine/m10mm/empty(src) ..() +/obj/item/weapon/gun/projectile/automatic/pistol/enforcer + name = "Enforcer .45" + desc = "A pistol of modern design." + icon_state = "enforcer_grey" + force = 10 + mag_type = /obj/item/ammo_box/magazine/m45/enforcer45 + can_suppress = TRUE + unique_reskin = TRUE + can_flashlight = TRUE + +/obj/item/weapon/gun/projectile/automatic/pistol/enforcer/update_icon() + ..() + if(current_skin) + icon_state = "[current_skin][chambered ? "" : "-e"]" + else + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + overlays.Cut() + if(suppressed) + overlays += image(icon = icon, icon_state = "enforcer_supp", pixel_x = 4) + if(gun_light) + var/iconF = "Enforcer_light" + if(gun_light.on) + iconF = "Enforcer_light-on" + overlays += image(icon = icon, icon_state = iconF, pixel_x = 0) + +/obj/item/weapon/gun/projectile/automatic/pistol/enforcer/ui_action_click() + toggle_gunlight() + +/obj/item/weapon/gun/projectile/automatic/pistol/enforcer/New() + ..() + options["Grey slide"] = "enforcer_grey" + options["Red slide"] = "enforcer_red" + options["Green slide"] = "enforcer_green" + options["Tan slide"] = "enforcer_tan" + options["Black slide"] = "enforcer_black" + options["Green Handle"] = "enforcer_greengrip" + options["Tan Handle"] = "enforcer_tangrip" + options["Red Handle"] = "enforcer_redgrip" + options["Cancel"] = null + /obj/item/weapon/gun/projectile/automatic/pistol/deagle name = "desert eagle" desc = "A robust .50 AE handgun." @@ -40,14 +80,6 @@ mag_type = /obj/item/ammo_box/magazine/m50 can_suppress = 0 -/obj/item/weapon/gun/projectile/automatic/pistol/enforcer45 - name = "Enforcer .45" - desc = "A pistol of modern design." - icon_state = "enforcer" - force = 10 - mag_type = /obj/item/ammo_box/magazine/m45/enforcer45 - can_suppress = 0 - /obj/item/weapon/gun/projectile/automatic/pistol/deagle/update_icon() ..() icon_state = "[initial(icon_state)][magazine ? "" : "-e"]" diff --git a/code/modules/projectiles/guns/projectile/toy.dm b/code/modules/projectiles/guns/projectile/toy.dm index 8a191f06b97..893844678ee 100644 --- a/code/modules/projectiles/guns/projectile/toy.dm +++ b/code/modules/projectiles/guns/projectile/toy.dm @@ -41,6 +41,25 @@ magazine = new /obj/item/ammo_box/magazine/toy/pistol/riot(src) ..() +/obj/item/weapon/gun/projectile/automatic/toy/pistol/enforcer + name = "Enforcer trainer" + desc = "A foam version of the Enforcer meant to be used for training new caddets who can't be trusted with rubber bullets." + icon_state = "enforcer" + mag_type = /obj/item/ammo_box/magazine/toy/enforcer + can_flashlight = TRUE + +/obj/item/weapon/gun/projectile/automatic/toy/pistol/enforcer/update_icon() + ..() + overlays.Cut() + if(gun_light) + var/iconF = "Enforcer_light" + if(gun_light.on) + iconF = "Enforcer_light-on" + overlays += image(icon = 'icons/obj/guns/projectile.dmi', icon_state = iconF, pixel_x = 0) + +/obj/item/weapon/gun/projectile/automatic/toy/pistol/enforcer/ui_action_click() + toggle_gunlight() + /obj/item/weapon/gun/projectile/shotgun/toy name = "foam force shotgun" desc = "A toy shotgun with wood furniture and a four-shell capacity underneath. Ages 8 and up." diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 839ce9c0a8d..c83a626486a 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -75,6 +75,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/apple = list("applejuice" = 0), /obj/item/weapon/reagent_containers/food/snacks/grown/grapes = list("grapejuice" = 0), /obj/item/weapon/reagent_containers/food/snacks/grown/grapes/green = list("grapejuice" = 0), + /obj/item/weapon/reagent_containers/food/snacks/grown/pineapple = list("pineapplejuice" = 0) ) var/list/dried_items = list( diff --git a/code/modules/reagents/chemistry/reagents/alcohol.dm b/code/modules/reagents/chemistry/reagents/alcohol.dm index 2ba73d2a127..63c8275afea 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol.dm @@ -424,6 +424,18 @@ drink_desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy." taste_message = "the number fourty two" +/datum/reagent/consumable/ethanol/flaming_homer + name = "Flaming Moe" + id = "flamingmoe" + description = "This appears to be a mixture of various alcohols blended with prescription medicine. It is lightly toasted..." + reagent_state = LIQUID + color = "#58447f" //rgb: 88, 66, 127 + alcohol_perc = 0.5 + drink_icon = "flamingmoeglass" + drink_name = "Flaming Moe" + drink_desc = "Happiness is just a Flaming Moe away!" + taste_message = "caramelised booze and sweet, salty medicine" + /datum/reagent/consumable/ethanol/brave_bull name = "Brave Bull" id = "bravebull" diff --git a/code/modules/reagents/chemistry/reagents/drinks.dm b/code/modules/reagents/chemistry/reagents/drinks.dm index 9a524aa377a..cf73e0a5087 100644 --- a/code/modules/reagents/chemistry/reagents/drinks.dm +++ b/code/modules/reagents/chemistry/reagents/drinks.dm @@ -23,6 +23,16 @@ drink_desc = "Are you sure this is tomato juice?" taste_message = "tomato juice" +/datum/reagent/consumable/drink/pineapplejuice + name = "Pineapple Juice" + id = "pineapplejuice" + description = "Pineapples juiced into a liquid. Sweet and sugary." + color = "#e5b437" + drink_icon = "glass_orange" + drink_name = "Glass of pineapple juice" + drink_desc = "A bright drink, sweet and sugary." + taste_message = "pineapple juice" + /datum/reagent/consumable/drink/tomatojuice/on_mob_life(mob/living/M) if(M.getFireLoss() && prob(20)) M.adjustFireLoss(-1) 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/reagents/chemistry/recipes/drinks.dm b/code/modules/reagents/chemistry/recipes/drinks.dm index b8d31e55e1c..c348db060ff 100644 --- a/code/modules/reagents/chemistry/recipes/drinks.dm +++ b/code/modules/reagents/chemistry/recipes/drinks.dm @@ -224,6 +224,16 @@ result_amount = 5 mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' +/datum/chemical_reaction/flaming_homer + name = "Flaming Moe" + id = "flamingmoe" + result = "flamingmoe" + required_reagents = list("vodka" = 1, "gin" = 1, "cognac" = 1, "tequila" = 1, "salglu_solution" = 1) //Close enough + min_temp = 374 //Fire makes it good! + result_amount = 5 + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + mix_message = "The concoction bursts into flame!" + /datum/chemical_reaction/brave_bull name = "Brave Bull" id = "bravebull" diff --git a/code/modules/reagents/chemistry/recipes/food.dm b/code/modules/reagents/chemistry/recipes/food.dm index 02453d44e31..44047f70049 100644 --- a/code/modules/reagents/chemistry/recipes/food.dm +++ b/code/modules/reagents/chemistry/recipes/food.dm @@ -197,4 +197,24 @@ required_reagents = list("beff" = 1, "saltpetre" = 1, "synthflesh" = 1) result_amount = 2 mix_message = "The beff and the synthflesh combine to form a smoky red log." - mix_sound = 'sound/effects/blobattack.ogg' \ No newline at end of file + mix_sound = 'sound/effects/blobattack.ogg' + +/datum/chemical_reaction/enzyme + name = "Universal enzyme" + id = "enzyme" + result = "enzyme" + required_reagents = list("vomit" = 1, "sugar" = 1) + result_amount = 2 + min_temp = 750 + mix_message = "The mixture emits a horrible smell as you heat up the contents. Luckily, enzymes don't stink." + mix_sound = 'sound/goonstation/misc/fuse.ogg' + +/datum/chemical_reaction/enzyme + name = "Universal enzyme" + id = "enzyme" + result = "enzyme" + required_reagents = list("green_vomit" = 1, "sugar" = 1) + result_amount = 2 + min_temp = 750 + mix_message = "The mixture emits a horrible smell as you heat up the contents. Luckily, enzymes don't stink." + mix_sound = 'sound/goonstation/misc/fuse.ogg' diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 6a97d71ed68..7b090fc4f77 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -1276,6 +1276,7 @@ anchored = 1 var/active = 0 var/turf/target // this will be where the output objects are 'thrown' to. + var/obj/structure/disposalpipe/trunk/linkedtrunk var/mode = 0 New() @@ -1285,9 +1286,9 @@ target = get_ranged_target_turf(src, dir, 10) - var/obj/structure/disposalpipe/trunk/trunk = locate() in src.loc - if(trunk) - trunk.linked = src // link the pipe trunk to self + linkedtrunk = locate() in src.loc + if(linkedtrunk) + linkedtrunk.linked = src // expel the contents of the holder object, then delete it // called when the holder exits the outlet @@ -1346,7 +1347,10 @@ to_chat(user, "You need more welding fuel to complete this task.") return - +/obj/structure/disposaloutlet/Destroy() + if(linkedtrunk) + linkedtrunk.linked = null + return ..() // called when movable is expelled from a disposal pipe or outlet // by default does nothing, override for special behaviour diff --git a/code/modules/store/items.dm b/code/modules/store/items.dm index f660efc0d16..11b4f169253 100644 --- a/code/modules/store/items.dm +++ b/code/modules/store/items.dm @@ -93,6 +93,12 @@ typepath = /obj/item/toy/katana cost = 500 +/datum/storeitem/piano_synth + name = "piano synthesizer" + desc = "An advanced electronic synthesizer that can be used as various instruments." + typepath = /obj/item/device/instrument/piano_synth + cost = 1000 + /datum/storeitem/violin name = "space violin" desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" @@ -189,6 +195,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 04bf50b230d..9eccfb6a411 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 @@ -432,6 +432,8 @@ Note that amputating the affected organ does in fact remove the infection from t fracture() /obj/item/organ/external/proc/check_for_internal_bleeding(damage) + if(NO_BLOOD in owner.species.species_traits) + return var/local_damage = brute_dam + damage if(damage > 15 && local_damage > 30 && prob(damage) && !(status & ORGAN_ROBOT)) internal_bleeding = TRUE 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 1070199d598..2446db5a3f3 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) ..() @@ -283,7 +284,6 @@ /obj/item/organ/internal/lungs/on_life() - ..() if(germ_level > INFECTION_LEVEL_ONE) if(prob(5)) owner.emote("cough") //respitory tract infection @@ -305,7 +305,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. @@ -324,7 +323,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 @@ -418,7 +417,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.") @@ -533,10 +531,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) @@ -556,23 +550,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") @@ -587,7 +567,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 @@ -596,17 +576,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" @@ -630,13 +608,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 6e81794dece..a96ba9290cb 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,161 @@ -->
+

05 September 2017

+

Kyep updated:

+
    +
  • Adds alternative military shuttle, NT Navy troop transport.
  • +
+ +

04 September 2017

+

Kyep updated:

+
    +
  • Admins under the effects of 'invisimin' no longer show up on sec huds, medical huds, etc.
  • +
+ +

03 September 2017

+

Birdtalon updated:

+
    +
  • Flip emote has a small chance of a failure and 100% chance of embarrassing yourself.
  • +
+

Citinited updated:

+
    +
  • You can now deconstruct the indestructible stool in the old bar's back room.
  • +
  • Security and bar maintenance airlocks are now decoupled.
  • +
  • The air vent at the fore of AI satellite now starts turned on.
  • +
  • Engineering equipment now only has one air vent, not three.
  • +
  • Added a missing bit of plating underneath the engineering shuttle's window.
  • +
  • Added a missing scrubbers pipe in Central Primary.
  • +
  • The camera and light fixture in the prisoner transfer centre are now wall-mounted instead of being attached to the blast doors.
  • +
  • Adds the Flaming Moe cocktail.
  • +
  • Shot glasses can now be set alight using something hot.
  • +
+ +

02 September 2017

+

Landerlow updated:

+
    +
  • Adds a recipe to create enzymes to cook with.
  • +
+ +

01 September 2017

+

Birdtalon updated:

+
    +
  • Fixed small bug with wall lockers not respecting distance.
  • +
+ +

28 August 2017

+

Birdtalon updated:

+
    +
  • Replaces civilian door remote in the Head of Personnel locker with a brand new remote with additional access to better suit the Head of Personnel's responsibilities.
  • +
  • Nanotrasen Mining Bots are no longer safe from EMPs.
  • +
  • Syndicate bee-case sound now only plays locally when opened.
  • +
  • You can open wall lockers with control click.
  • +
+

Birdtalon & Hylocereus updated:

+
    +
  • Adds pineapples which can be grown in hydroponics, juiced or sliced and made into hawaiian pizza.
  • +
  • Adds hawaiian pizza to the pizza crate.
  • +
+

Fethas updated:

+
    +
  • The cultist dagger has had its special removed, it still cuases small bleed and retains its embed chance.
  • +
  • Prayers now dsiplay the diety set by chaplains (if any) to admins in prayers, or eldergod if a cultist. Prayers are purple for normies, Red for cultist and blue for chaplains
  • +
+

Fox McCloud updated:

+
    +
  • IPCs can now be dissected by adbudctors
  • +
+

Fox Mccloud updated:

+
    +
  • Adds an accordian, glockenspiel, harmonica, recorder, saxaphone, trombone, xylophone, bikehorn, and piano synthesizer
  • +
  • pick up a big band supply pack of instruments at cargo for 50 supply points
  • +
+

Jovaniph updated:

+
    +
  • Holodeck Energy Swords sound was change to simulate being attacked by a real energy sword.
  • +
+

Landerlow updated:

+
    +
  • Adds six additional roundstart disabilities to choose from
  • +
+

matt81093 updated:

+
    +
  • robot analyzer to medical module cyborgs for IPC diagnosing
  • +
+ +

24 August 2017

+

Birdtalon updated:

+
    +
  • Cultist structures can now be destroyed using melee and or projectiles
  • +
+

Fox McCloud updated:

+
    +
  • Fixes Diona, Plasmamen, and other races having internal bleeding
  • +
+ +

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.
  • +
  • Fixes another issue with disposals sending things to nullspace.
  • +
+

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.
  • +
+

Fox McCloud updated:

+
    +
  • Cluwning is far more difficult to remove
  • +
  • Cluwne mask cannot be melted with acid
  • +
  • Cluwne suit has no sensors
  • +
+

Kyep updated:

+
    +
  • Admins now have a 'List SSDs' verb to list SSD players, and the ability to move them to cryo.
  • +
+ +

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:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index f12e29b9cd3..df392575fe4 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -5370,3 +5370,112 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 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. + - bugfix: Fixes another issue with disposals sending things to nullspace. + 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. + Fox McCloud: + - tweak: Cluwning is far more difficult to remove + - tweak: Cluwne mask cannot be melted with acid + - tweak: Cluwne suit has no sensors + Kyep: + - rscadd: Admins now have a 'List SSDs' verb to list SSD players, and the ability + to move them to cryo. +2017-08-24: + Birdtalon: + - rscadd: Cultist structures can now be destroyed using melee and or projectiles + Fox McCloud: + - bugfix: Fixes Diona, Plasmamen, and other races having internal bleeding +2017-08-28: + Birdtalon: + - tweak: Replaces civilian door remote in the Head of Personnel locker with a brand + new remote with additional access to better suit the Head of Personnel's responsibilities. + - tweak: Nanotrasen Mining Bots are no longer safe from EMPs. + - tweak: Syndicate bee-case sound now only plays locally when opened. + - rscadd: You can open wall lockers with control click. + Birdtalon & Hylocereus: + - rscadd: Adds pineapples which can be grown in hydroponics, juiced or sliced and + made into hawaiian pizza. + - tweak: Adds hawaiian pizza to the pizza crate. + Fethas: + - tweak: The cultist dagger has had its special removed, it still cuases small bleed + and retains its embed chance. + - tweak: Prayers now dsiplay the diety set by chaplains (if any) to admins in prayers, + or eldergod if a cultist. Prayers are purple for normies, Red for cultist and + blue for chaplains + Fox McCloud: + - rscadd: IPCs can now be dissected by adbudctors + Fox Mccloud: + - rscadd: Adds an accordian, glockenspiel, harmonica, recorder, saxaphone, trombone, + xylophone, bikehorn, and piano synthesizer + - rscadd: pick up a big band supply pack of instruments at cargo for 50 supply points + Jovaniph: + - tweak: Holodeck Energy Swords sound was change to simulate being attacked by a + real energy sword. + Landerlow: + - rscadd: Adds six additional roundstart disabilities to choose from + matt81093: + - rscadd: robot analyzer to medical module cyborgs for IPC diagnosing +2017-09-01: + Birdtalon: + - bugfix: Fixed small bug with wall lockers not respecting distance. +2017-09-02: + Landerlow: + - rscadd: Adds a recipe to create enzymes to cook with. +2017-09-03: + Birdtalon: + - tweak: Flip emote has a small chance of a failure and 100% chance of embarrassing + yourself. + Citinited: + - bugfix: You can now deconstruct the indestructible stool in the old bar's back + room. + - bugfix: Security and bar maintenance airlocks are now decoupled. + - tweak: The air vent at the fore of AI satellite now starts turned on. + - tweak: Engineering equipment now only has one air vent, not three. + - bugfix: Added a missing bit of plating underneath the engineering shuttle's window. + - bugfix: Added a missing scrubbers pipe in Central Primary. + - tweak: The camera and light fixture in the prisoner transfer centre are now wall-mounted + instead of being attached to the blast doors. + - rscadd: Adds the Flaming Moe cocktail. + - rscadd: Shot glasses can now be set alight using something hot. +2017-09-04: + Kyep: + - bugfix: Admins under the effects of 'invisimin' no longer show up on sec huds, + medical huds, etc. +2017-09-05: + Kyep: + - rscadd: Adds alternative military shuttle, NT Navy troop transport. 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/head.dmi b/icons/mob/head.dmi index e2971a7c39c..f78b0cdd72e 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 b4cb362e298..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 600c9aea661..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/equipment/instruments_lefthand.dmi b/icons/mob/inhands/equipment/instruments_lefthand.dmi new file mode 100644 index 00000000000..197cd61c6c4 Binary files /dev/null and b/icons/mob/inhands/equipment/instruments_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/instruments_righthand.dmi b/icons/mob/inhands/equipment/instruments_righthand.dmi new file mode 100644 index 00000000000..bcda1b18b7f Binary files /dev/null and b/icons/mob/inhands/equipment/instruments_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/fluff_lefthand.dmi b/icons/mob/inhands/fluff_lefthand.dmi index 417ca1bb107..b64993cefed 100644 Binary files a/icons/mob/inhands/fluff_lefthand.dmi and b/icons/mob/inhands/fluff_lefthand.dmi differ diff --git a/icons/mob/inhands/fluff_righthand.dmi b/icons/mob/inhands/fluff_righthand.dmi index 6d4f3a2c76b..6db4d9503de 100644 Binary files a/icons/mob/inhands/fluff_righthand.dmi and b/icons/mob/inhands/fluff_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index bccdc57c656..c398a552667 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..21e2e6c881b 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/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/suit.dmi b/icons/mob/suit.dmi index 89e3eb94136..dea74b81df1 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 57807bee181..2561b88e6be 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi index e12b268a8f2..86707dd34ef 100644 Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 4008e17b3cf..8c75c1bc317 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.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 2fe44fcddd1..3395b112947 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index fdc23ad6da8..2f50b165b1a 100644 Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ diff --git a/icons/obj/guns/toy.dmi b/icons/obj/guns/toy.dmi index c832bb3670a..a0f2a539c54 100644 Binary files a/icons/obj/guns/toy.dmi and b/icons/obj/guns/toy.dmi differ diff --git a/icons/obj/hydroponics/growing_fruits.dmi b/icons/obj/hydroponics/growing_fruits.dmi index ac8adc5a069..8259c77f570 100644 Binary files a/icons/obj/hydroponics/growing_fruits.dmi and b/icons/obj/hydroponics/growing_fruits.dmi differ diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index bd596597624..53033eb8f48 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 a84ed3dd730..a2415a71a8a 100644 Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ diff --git a/icons/obj/musician.dmi b/icons/obj/musician.dmi index c57114abf63..21078c58969 100644 Binary files a/icons/obj/musician.dmi and b/icons/obj/musician.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 7922492f099..dd05488bf3c 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1402,6 +1402,7 @@ #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\pineapple.dm" #include "code\modules\hydroponics\grown\potato.dm" #include "code\modules\hydroponics\grown\pumpkin.dm" #include "code\modules\hydroponics\grown\random.dm" diff --git a/sound/instruments/accordion/Ab2.mid b/sound/instruments/accordion/Ab2.mid new file mode 100644 index 00000000000..0be99493a6c Binary files /dev/null and b/sound/instruments/accordion/Ab2.mid differ diff --git a/sound/instruments/accordion/Ab3.mid b/sound/instruments/accordion/Ab3.mid new file mode 100644 index 00000000000..df3fbb658b2 Binary files /dev/null and b/sound/instruments/accordion/Ab3.mid differ diff --git a/sound/instruments/accordion/Ab4.mid b/sound/instruments/accordion/Ab4.mid new file mode 100644 index 00000000000..81cc7dd887c Binary files /dev/null and b/sound/instruments/accordion/Ab4.mid differ diff --git a/sound/instruments/accordion/Ab5.mid b/sound/instruments/accordion/Ab5.mid new file mode 100644 index 00000000000..8a6f9b63a4c Binary files /dev/null and b/sound/instruments/accordion/Ab5.mid differ diff --git a/sound/instruments/accordion/Ab6.mid b/sound/instruments/accordion/Ab6.mid new file mode 100644 index 00000000000..c636071299e Binary files /dev/null and b/sound/instruments/accordion/Ab6.mid differ diff --git a/sound/instruments/accordion/An2.mid b/sound/instruments/accordion/An2.mid new file mode 100644 index 00000000000..fcae8a3be76 Binary files /dev/null and b/sound/instruments/accordion/An2.mid differ diff --git a/sound/instruments/accordion/An3.mid b/sound/instruments/accordion/An3.mid new file mode 100644 index 00000000000..0eaea1a1fd7 Binary files /dev/null and b/sound/instruments/accordion/An3.mid differ diff --git a/sound/instruments/accordion/An4.mid b/sound/instruments/accordion/An4.mid new file mode 100644 index 00000000000..2ae28df7a3a Binary files /dev/null and b/sound/instruments/accordion/An4.mid differ diff --git a/sound/instruments/accordion/An5.mid b/sound/instruments/accordion/An5.mid new file mode 100644 index 00000000000..c955b7f2d93 Binary files /dev/null and b/sound/instruments/accordion/An5.mid differ diff --git a/sound/instruments/accordion/An6.mid b/sound/instruments/accordion/An6.mid new file mode 100644 index 00000000000..76c44f3bb37 Binary files /dev/null and b/sound/instruments/accordion/An6.mid differ diff --git a/sound/instruments/accordion/Bb2.mid b/sound/instruments/accordion/Bb2.mid new file mode 100644 index 00000000000..8af7ec2a6c5 Binary files /dev/null and b/sound/instruments/accordion/Bb2.mid differ diff --git a/sound/instruments/accordion/Bb3.mid b/sound/instruments/accordion/Bb3.mid new file mode 100644 index 00000000000..2fdaae5d9de Binary files /dev/null and b/sound/instruments/accordion/Bb3.mid differ diff --git a/sound/instruments/accordion/Bb4.mid b/sound/instruments/accordion/Bb4.mid new file mode 100644 index 00000000000..b360ccbc9b7 Binary files /dev/null and b/sound/instruments/accordion/Bb4.mid differ diff --git a/sound/instruments/accordion/Bb5.mid b/sound/instruments/accordion/Bb5.mid new file mode 100644 index 00000000000..d1ed0340d5f Binary files /dev/null and b/sound/instruments/accordion/Bb5.mid differ diff --git a/sound/instruments/accordion/Bb6.mid b/sound/instruments/accordion/Bb6.mid new file mode 100644 index 00000000000..45973b3eef2 Binary files /dev/null and b/sound/instruments/accordion/Bb6.mid differ diff --git a/sound/instruments/accordion/Bn2.mid b/sound/instruments/accordion/Bn2.mid new file mode 100644 index 00000000000..b2dec87c97a Binary files /dev/null and b/sound/instruments/accordion/Bn2.mid differ diff --git a/sound/instruments/accordion/Bn3.mid b/sound/instruments/accordion/Bn3.mid new file mode 100644 index 00000000000..19aa78aded9 Binary files /dev/null and b/sound/instruments/accordion/Bn3.mid differ diff --git a/sound/instruments/accordion/Bn4.mid b/sound/instruments/accordion/Bn4.mid new file mode 100644 index 00000000000..1caba6169c5 Binary files /dev/null and b/sound/instruments/accordion/Bn4.mid differ diff --git a/sound/instruments/accordion/Bn5.mid b/sound/instruments/accordion/Bn5.mid new file mode 100644 index 00000000000..4a41cbbd746 Binary files /dev/null and b/sound/instruments/accordion/Bn5.mid differ diff --git a/sound/instruments/accordion/Bn6.mid b/sound/instruments/accordion/Bn6.mid new file mode 100644 index 00000000000..7d267c4b5ab Binary files /dev/null and b/sound/instruments/accordion/Bn6.mid differ diff --git a/sound/instruments/accordion/Cn2.mid b/sound/instruments/accordion/Cn2.mid new file mode 100644 index 00000000000..dfc8a56b9b0 Binary files /dev/null and b/sound/instruments/accordion/Cn2.mid differ diff --git a/sound/instruments/accordion/Cn3.mid b/sound/instruments/accordion/Cn3.mid new file mode 100644 index 00000000000..494b4114e2f Binary files /dev/null and b/sound/instruments/accordion/Cn3.mid differ diff --git a/sound/instruments/accordion/Cn4.mid b/sound/instruments/accordion/Cn4.mid new file mode 100644 index 00000000000..2ac47a442dc Binary files /dev/null and b/sound/instruments/accordion/Cn4.mid differ diff --git a/sound/instruments/accordion/Cn5.mid b/sound/instruments/accordion/Cn5.mid new file mode 100644 index 00000000000..636502e6295 Binary files /dev/null and b/sound/instruments/accordion/Cn5.mid differ diff --git a/sound/instruments/accordion/Cn6.mid b/sound/instruments/accordion/Cn6.mid new file mode 100644 index 00000000000..57a674e7beb Binary files /dev/null and b/sound/instruments/accordion/Cn6.mid differ diff --git a/sound/instruments/accordion/Db2.mid b/sound/instruments/accordion/Db2.mid new file mode 100644 index 00000000000..602e4523eea Binary files /dev/null and b/sound/instruments/accordion/Db2.mid differ diff --git a/sound/instruments/accordion/Db3.mid b/sound/instruments/accordion/Db3.mid new file mode 100644 index 00000000000..4c32f61c8d0 Binary files /dev/null and b/sound/instruments/accordion/Db3.mid differ diff --git a/sound/instruments/accordion/Db4.mid b/sound/instruments/accordion/Db4.mid new file mode 100644 index 00000000000..99439056170 Binary files /dev/null and b/sound/instruments/accordion/Db4.mid differ diff --git a/sound/instruments/accordion/Db5.mid b/sound/instruments/accordion/Db5.mid new file mode 100644 index 00000000000..b4db898b292 Binary files /dev/null and b/sound/instruments/accordion/Db5.mid differ diff --git a/sound/instruments/accordion/Db6.mid b/sound/instruments/accordion/Db6.mid new file mode 100644 index 00000000000..b0cb648759c Binary files /dev/null and b/sound/instruments/accordion/Db6.mid differ diff --git a/sound/instruments/accordion/Dn2.mid b/sound/instruments/accordion/Dn2.mid new file mode 100644 index 00000000000..a6c30398b12 Binary files /dev/null and b/sound/instruments/accordion/Dn2.mid differ diff --git a/sound/instruments/accordion/Dn3.mid b/sound/instruments/accordion/Dn3.mid new file mode 100644 index 00000000000..b64354f8109 Binary files /dev/null and b/sound/instruments/accordion/Dn3.mid differ diff --git a/sound/instruments/accordion/Dn4.mid b/sound/instruments/accordion/Dn4.mid new file mode 100644 index 00000000000..670b2ec4d35 Binary files /dev/null and b/sound/instruments/accordion/Dn4.mid differ diff --git a/sound/instruments/accordion/Dn5.mid b/sound/instruments/accordion/Dn5.mid new file mode 100644 index 00000000000..aea9116fb80 Binary files /dev/null and b/sound/instruments/accordion/Dn5.mid differ diff --git a/sound/instruments/accordion/Dn6.mid b/sound/instruments/accordion/Dn6.mid new file mode 100644 index 00000000000..84c9e9359ca Binary files /dev/null and b/sound/instruments/accordion/Dn6.mid differ diff --git a/sound/instruments/accordion/Eb2.mid b/sound/instruments/accordion/Eb2.mid new file mode 100644 index 00000000000..9d274b6baf4 Binary files /dev/null and b/sound/instruments/accordion/Eb2.mid differ diff --git a/sound/instruments/accordion/Eb3.mid b/sound/instruments/accordion/Eb3.mid new file mode 100644 index 00000000000..9a32aee1238 Binary files /dev/null and b/sound/instruments/accordion/Eb3.mid differ diff --git a/sound/instruments/accordion/Eb4.mid b/sound/instruments/accordion/Eb4.mid new file mode 100644 index 00000000000..257ed5e9048 Binary files /dev/null and b/sound/instruments/accordion/Eb4.mid differ diff --git a/sound/instruments/accordion/Eb5.mid b/sound/instruments/accordion/Eb5.mid new file mode 100644 index 00000000000..de3edcd18cc Binary files /dev/null and b/sound/instruments/accordion/Eb5.mid differ diff --git a/sound/instruments/accordion/Eb6.mid b/sound/instruments/accordion/Eb6.mid new file mode 100644 index 00000000000..a43a976ffc8 Binary files /dev/null and b/sound/instruments/accordion/Eb6.mid differ diff --git a/sound/instruments/accordion/En2.mid b/sound/instruments/accordion/En2.mid new file mode 100644 index 00000000000..1ebe0e081d8 Binary files /dev/null and b/sound/instruments/accordion/En2.mid differ diff --git a/sound/instruments/accordion/En3.mid b/sound/instruments/accordion/En3.mid new file mode 100644 index 00000000000..b24ef90118f Binary files /dev/null and b/sound/instruments/accordion/En3.mid differ diff --git a/sound/instruments/accordion/En4.mid b/sound/instruments/accordion/En4.mid new file mode 100644 index 00000000000..df0b16b1968 Binary files /dev/null and b/sound/instruments/accordion/En4.mid differ diff --git a/sound/instruments/accordion/En5.mid b/sound/instruments/accordion/En5.mid new file mode 100644 index 00000000000..760c5e1f514 Binary files /dev/null and b/sound/instruments/accordion/En5.mid differ diff --git a/sound/instruments/accordion/En6.mid b/sound/instruments/accordion/En6.mid new file mode 100644 index 00000000000..92639712044 Binary files /dev/null and b/sound/instruments/accordion/En6.mid differ diff --git a/sound/instruments/accordion/Fn2.mid b/sound/instruments/accordion/Fn2.mid new file mode 100644 index 00000000000..31eb932cb7d Binary files /dev/null and b/sound/instruments/accordion/Fn2.mid differ diff --git a/sound/instruments/accordion/Fn3.mid b/sound/instruments/accordion/Fn3.mid new file mode 100644 index 00000000000..c1c2a4a197d Binary files /dev/null and b/sound/instruments/accordion/Fn3.mid differ diff --git a/sound/instruments/accordion/Fn4.mid b/sound/instruments/accordion/Fn4.mid new file mode 100644 index 00000000000..701c5ea46c5 Binary files /dev/null and b/sound/instruments/accordion/Fn4.mid differ diff --git a/sound/instruments/accordion/Fn5.mid b/sound/instruments/accordion/Fn5.mid new file mode 100644 index 00000000000..49d44d3de84 Binary files /dev/null and b/sound/instruments/accordion/Fn5.mid differ diff --git a/sound/instruments/accordion/Fn6.mid b/sound/instruments/accordion/Fn6.mid new file mode 100644 index 00000000000..acb192950bd Binary files /dev/null and b/sound/instruments/accordion/Fn6.mid differ diff --git a/sound/instruments/accordion/Gb2.mid b/sound/instruments/accordion/Gb2.mid new file mode 100644 index 00000000000..4625e867af0 Binary files /dev/null and b/sound/instruments/accordion/Gb2.mid differ diff --git a/sound/instruments/accordion/Gb3.mid b/sound/instruments/accordion/Gb3.mid new file mode 100644 index 00000000000..3ce6d7ba923 Binary files /dev/null and b/sound/instruments/accordion/Gb3.mid differ diff --git a/sound/instruments/accordion/Gb4.mid b/sound/instruments/accordion/Gb4.mid new file mode 100644 index 00000000000..1106ebf9039 Binary files /dev/null and b/sound/instruments/accordion/Gb4.mid differ diff --git a/sound/instruments/accordion/Gb5.mid b/sound/instruments/accordion/Gb5.mid new file mode 100644 index 00000000000..9ff54c7af0f Binary files /dev/null and b/sound/instruments/accordion/Gb5.mid differ diff --git a/sound/instruments/accordion/Gb6.mid b/sound/instruments/accordion/Gb6.mid new file mode 100644 index 00000000000..05b05b9870f Binary files /dev/null and b/sound/instruments/accordion/Gb6.mid differ diff --git a/sound/instruments/accordion/Gn2.mid b/sound/instruments/accordion/Gn2.mid new file mode 100644 index 00000000000..def96a74d17 Binary files /dev/null and b/sound/instruments/accordion/Gn2.mid differ diff --git a/sound/instruments/accordion/Gn3.mid b/sound/instruments/accordion/Gn3.mid new file mode 100644 index 00000000000..4c88ab05076 Binary files /dev/null and b/sound/instruments/accordion/Gn3.mid differ diff --git a/sound/instruments/accordion/Gn4.mid b/sound/instruments/accordion/Gn4.mid new file mode 100644 index 00000000000..b76b5a22c63 Binary files /dev/null and b/sound/instruments/accordion/Gn4.mid differ diff --git a/sound/instruments/accordion/Gn5.mid b/sound/instruments/accordion/Gn5.mid new file mode 100644 index 00000000000..0fb395db34c Binary files /dev/null and b/sound/instruments/accordion/Gn5.mid differ diff --git a/sound/instruments/accordion/Gn6.mid b/sound/instruments/accordion/Gn6.mid new file mode 100644 index 00000000000..b6117319ad5 Binary files /dev/null and b/sound/instruments/accordion/Gn6.mid differ diff --git a/sound/instruments/bikehorn/Ab2.ogg b/sound/instruments/bikehorn/Ab2.ogg new file mode 100644 index 00000000000..cc33da35f45 Binary files /dev/null and b/sound/instruments/bikehorn/Ab2.ogg differ diff --git a/sound/instruments/bikehorn/Ab3.ogg b/sound/instruments/bikehorn/Ab3.ogg new file mode 100644 index 00000000000..b046ed2e74a Binary files /dev/null and b/sound/instruments/bikehorn/Ab3.ogg differ diff --git a/sound/instruments/bikehorn/Ab4.ogg b/sound/instruments/bikehorn/Ab4.ogg new file mode 100644 index 00000000000..ba50324d626 Binary files /dev/null and b/sound/instruments/bikehorn/Ab4.ogg differ diff --git a/sound/instruments/bikehorn/An2.ogg b/sound/instruments/bikehorn/An2.ogg new file mode 100644 index 00000000000..ddfbe21910b Binary files /dev/null and b/sound/instruments/bikehorn/An2.ogg differ diff --git a/sound/instruments/bikehorn/An3.ogg b/sound/instruments/bikehorn/An3.ogg new file mode 100644 index 00000000000..c69e59a8da0 Binary files /dev/null and b/sound/instruments/bikehorn/An3.ogg differ diff --git a/sound/instruments/bikehorn/An4.ogg b/sound/instruments/bikehorn/An4.ogg new file mode 100644 index 00000000000..5b42fe4ae8f Binary files /dev/null and b/sound/instruments/bikehorn/An4.ogg differ diff --git a/sound/instruments/bikehorn/Bb2.ogg b/sound/instruments/bikehorn/Bb2.ogg new file mode 100644 index 00000000000..4a909bdfc53 Binary files /dev/null and b/sound/instruments/bikehorn/Bb2.ogg differ diff --git a/sound/instruments/bikehorn/Bb3.ogg b/sound/instruments/bikehorn/Bb3.ogg new file mode 100644 index 00000000000..2055984a86c Binary files /dev/null and b/sound/instruments/bikehorn/Bb3.ogg differ diff --git a/sound/instruments/bikehorn/Bb4.ogg b/sound/instruments/bikehorn/Bb4.ogg new file mode 100644 index 00000000000..73003e040c1 Binary files /dev/null and b/sound/instruments/bikehorn/Bb4.ogg differ diff --git a/sound/instruments/bikehorn/Bn2.ogg b/sound/instruments/bikehorn/Bn2.ogg new file mode 100644 index 00000000000..17532a6a7c9 Binary files /dev/null and b/sound/instruments/bikehorn/Bn2.ogg differ diff --git a/sound/instruments/bikehorn/Bn3.ogg b/sound/instruments/bikehorn/Bn3.ogg new file mode 100644 index 00000000000..ff36b917093 Binary files /dev/null and b/sound/instruments/bikehorn/Bn3.ogg differ diff --git a/sound/instruments/bikehorn/Bn4.ogg b/sound/instruments/bikehorn/Bn4.ogg new file mode 100644 index 00000000000..6750a931552 Binary files /dev/null and b/sound/instruments/bikehorn/Bn4.ogg differ diff --git a/sound/instruments/bikehorn/Cn3.ogg b/sound/instruments/bikehorn/Cn3.ogg new file mode 100644 index 00000000000..f75ddaa83f2 Binary files /dev/null and b/sound/instruments/bikehorn/Cn3.ogg differ diff --git a/sound/instruments/bikehorn/Cn4.ogg b/sound/instruments/bikehorn/Cn4.ogg new file mode 100644 index 00000000000..e5889f04bce Binary files /dev/null and b/sound/instruments/bikehorn/Cn4.ogg differ diff --git a/sound/instruments/bikehorn/Cn5.ogg b/sound/instruments/bikehorn/Cn5.ogg new file mode 100644 index 00000000000..328a6edf10e Binary files /dev/null and b/sound/instruments/bikehorn/Cn5.ogg differ diff --git a/sound/instruments/bikehorn/Db3.ogg b/sound/instruments/bikehorn/Db3.ogg new file mode 100644 index 00000000000..3c3e8d10305 Binary files /dev/null and b/sound/instruments/bikehorn/Db3.ogg differ diff --git a/sound/instruments/bikehorn/Db4.ogg b/sound/instruments/bikehorn/Db4.ogg new file mode 100644 index 00000000000..35dd47df475 Binary files /dev/null and b/sound/instruments/bikehorn/Db4.ogg differ diff --git a/sound/instruments/bikehorn/Db5.ogg b/sound/instruments/bikehorn/Db5.ogg new file mode 100644 index 00000000000..54c10b54c54 Binary files /dev/null and b/sound/instruments/bikehorn/Db5.ogg differ diff --git a/sound/instruments/bikehorn/Dn3.ogg b/sound/instruments/bikehorn/Dn3.ogg new file mode 100644 index 00000000000..33a863c8426 Binary files /dev/null and b/sound/instruments/bikehorn/Dn3.ogg differ diff --git a/sound/instruments/bikehorn/Dn4.ogg b/sound/instruments/bikehorn/Dn4.ogg new file mode 100644 index 00000000000..bd4c353e625 Binary files /dev/null and b/sound/instruments/bikehorn/Dn4.ogg differ diff --git a/sound/instruments/bikehorn/Dn5.ogg b/sound/instruments/bikehorn/Dn5.ogg new file mode 100644 index 00000000000..11b355b11cf Binary files /dev/null and b/sound/instruments/bikehorn/Dn5.ogg differ diff --git a/sound/instruments/bikehorn/Eb3.ogg b/sound/instruments/bikehorn/Eb3.ogg new file mode 100644 index 00000000000..367cc5456dc Binary files /dev/null and b/sound/instruments/bikehorn/Eb3.ogg differ diff --git a/sound/instruments/bikehorn/Eb4.ogg b/sound/instruments/bikehorn/Eb4.ogg new file mode 100644 index 00000000000..d7344da37c9 Binary files /dev/null and b/sound/instruments/bikehorn/Eb4.ogg differ diff --git a/sound/instruments/bikehorn/Eb5.ogg b/sound/instruments/bikehorn/Eb5.ogg new file mode 100644 index 00000000000..c94b994d199 Binary files /dev/null and b/sound/instruments/bikehorn/Eb5.ogg differ diff --git a/sound/instruments/bikehorn/En2.ogg b/sound/instruments/bikehorn/En2.ogg new file mode 100644 index 00000000000..6c2e4de57dd Binary files /dev/null and b/sound/instruments/bikehorn/En2.ogg differ diff --git a/sound/instruments/bikehorn/En3.ogg b/sound/instruments/bikehorn/En3.ogg new file mode 100644 index 00000000000..37b96d48518 Binary files /dev/null and b/sound/instruments/bikehorn/En3.ogg differ diff --git a/sound/instruments/bikehorn/En4.ogg b/sound/instruments/bikehorn/En4.ogg new file mode 100644 index 00000000000..2a23deabf57 Binary files /dev/null and b/sound/instruments/bikehorn/En4.ogg differ diff --git a/sound/instruments/bikehorn/Fn2.ogg b/sound/instruments/bikehorn/Fn2.ogg new file mode 100644 index 00000000000..3ddbcb90339 Binary files /dev/null and b/sound/instruments/bikehorn/Fn2.ogg differ diff --git a/sound/instruments/bikehorn/Fn3.ogg b/sound/instruments/bikehorn/Fn3.ogg new file mode 100644 index 00000000000..47f8625ea9b Binary files /dev/null and b/sound/instruments/bikehorn/Fn3.ogg differ diff --git a/sound/instruments/bikehorn/Fn4.ogg b/sound/instruments/bikehorn/Fn4.ogg new file mode 100644 index 00000000000..ee330535668 Binary files /dev/null and b/sound/instruments/bikehorn/Fn4.ogg differ diff --git a/sound/instruments/bikehorn/Gb2.ogg b/sound/instruments/bikehorn/Gb2.ogg new file mode 100644 index 00000000000..e78f9430104 Binary files /dev/null and b/sound/instruments/bikehorn/Gb2.ogg differ diff --git a/sound/instruments/bikehorn/Gb3.ogg b/sound/instruments/bikehorn/Gb3.ogg new file mode 100644 index 00000000000..be59509ee92 Binary files /dev/null and b/sound/instruments/bikehorn/Gb3.ogg differ diff --git a/sound/instruments/bikehorn/Gb4.ogg b/sound/instruments/bikehorn/Gb4.ogg new file mode 100644 index 00000000000..fac913aaff4 Binary files /dev/null and b/sound/instruments/bikehorn/Gb4.ogg differ diff --git a/sound/instruments/bikehorn/Gn2.ogg b/sound/instruments/bikehorn/Gn2.ogg new file mode 100644 index 00000000000..80997735440 Binary files /dev/null and b/sound/instruments/bikehorn/Gn2.ogg differ diff --git a/sound/instruments/bikehorn/Gn3.ogg b/sound/instruments/bikehorn/Gn3.ogg new file mode 100644 index 00000000000..1966dfd0e86 Binary files /dev/null and b/sound/instruments/bikehorn/Gn3.ogg differ diff --git a/sound/instruments/bikehorn/Gn4.ogg b/sound/instruments/bikehorn/Gn4.ogg new file mode 100644 index 00000000000..86f81bc1cbb Binary files /dev/null and b/sound/instruments/bikehorn/Gn4.ogg differ diff --git a/sound/eguitar/ab4.ogg b/sound/instruments/eguitar/ab4.ogg similarity index 100% rename from sound/eguitar/ab4.ogg rename to sound/instruments/eguitar/ab4.ogg diff --git a/sound/eguitar/ab5.ogg b/sound/instruments/eguitar/ab5.ogg similarity index 100% rename from sound/eguitar/ab5.ogg rename to sound/instruments/eguitar/ab5.ogg diff --git a/sound/eguitar/ab6.ogg b/sound/instruments/eguitar/ab6.ogg similarity index 100% rename from sound/eguitar/ab6.ogg rename to sound/instruments/eguitar/ab6.ogg diff --git a/sound/eguitar/an4.ogg b/sound/instruments/eguitar/an4.ogg similarity index 100% rename from sound/eguitar/an4.ogg rename to sound/instruments/eguitar/an4.ogg diff --git a/sound/eguitar/an5.ogg b/sound/instruments/eguitar/an5.ogg similarity index 100% rename from sound/eguitar/an5.ogg rename to sound/instruments/eguitar/an5.ogg diff --git a/sound/eguitar/an6.ogg b/sound/instruments/eguitar/an6.ogg similarity index 100% rename from sound/eguitar/an6.ogg rename to sound/instruments/eguitar/an6.ogg diff --git a/sound/eguitar/bb4.ogg b/sound/instruments/eguitar/bb4.ogg similarity index 100% rename from sound/eguitar/bb4.ogg rename to sound/instruments/eguitar/bb4.ogg diff --git a/sound/eguitar/bb5.ogg b/sound/instruments/eguitar/bb5.ogg similarity index 100% rename from sound/eguitar/bb5.ogg rename to sound/instruments/eguitar/bb5.ogg diff --git a/sound/eguitar/bb6.ogg b/sound/instruments/eguitar/bb6.ogg similarity index 100% rename from sound/eguitar/bb6.ogg rename to sound/instruments/eguitar/bb6.ogg diff --git a/sound/eguitar/bn4.ogg b/sound/instruments/eguitar/bn4.ogg similarity index 100% rename from sound/eguitar/bn4.ogg rename to sound/instruments/eguitar/bn4.ogg diff --git a/sound/eguitar/bn5.ogg b/sound/instruments/eguitar/bn5.ogg similarity index 100% rename from sound/eguitar/bn5.ogg rename to sound/instruments/eguitar/bn5.ogg diff --git a/sound/eguitar/bn6.ogg b/sound/instruments/eguitar/bn6.ogg similarity index 100% rename from sound/eguitar/bn6.ogg rename to sound/instruments/eguitar/bn6.ogg diff --git a/sound/eguitar/cn4.ogg b/sound/instruments/eguitar/cn4.ogg similarity index 100% rename from sound/eguitar/cn4.ogg rename to sound/instruments/eguitar/cn4.ogg diff --git a/sound/eguitar/cn5.ogg b/sound/instruments/eguitar/cn5.ogg similarity index 100% rename from sound/eguitar/cn5.ogg rename to sound/instruments/eguitar/cn5.ogg diff --git a/sound/eguitar/cn6.ogg b/sound/instruments/eguitar/cn6.ogg similarity index 100% rename from sound/eguitar/cn6.ogg rename to sound/instruments/eguitar/cn6.ogg diff --git a/sound/eguitar/cn7.ogg b/sound/instruments/eguitar/cn7.ogg similarity index 100% rename from sound/eguitar/cn7.ogg rename to sound/instruments/eguitar/cn7.ogg diff --git a/sound/eguitar/db4.ogg b/sound/instruments/eguitar/db4.ogg similarity index 100% rename from sound/eguitar/db4.ogg rename to sound/instruments/eguitar/db4.ogg diff --git a/sound/eguitar/db5.ogg b/sound/instruments/eguitar/db5.ogg similarity index 100% rename from sound/eguitar/db5.ogg rename to sound/instruments/eguitar/db5.ogg diff --git a/sound/eguitar/db6.ogg b/sound/instruments/eguitar/db6.ogg similarity index 100% rename from sound/eguitar/db6.ogg rename to sound/instruments/eguitar/db6.ogg diff --git a/sound/eguitar/dn4.ogg b/sound/instruments/eguitar/dn4.ogg similarity index 100% rename from sound/eguitar/dn4.ogg rename to sound/instruments/eguitar/dn4.ogg diff --git a/sound/eguitar/dn5.ogg b/sound/instruments/eguitar/dn5.ogg similarity index 100% rename from sound/eguitar/dn5.ogg rename to sound/instruments/eguitar/dn5.ogg diff --git a/sound/eguitar/dn6.ogg b/sound/instruments/eguitar/dn6.ogg similarity index 100% rename from sound/eguitar/dn6.ogg rename to sound/instruments/eguitar/dn6.ogg diff --git a/sound/eguitar/eb4.ogg b/sound/instruments/eguitar/eb4.ogg similarity index 100% rename from sound/eguitar/eb4.ogg rename to sound/instruments/eguitar/eb4.ogg diff --git a/sound/eguitar/eb5.ogg b/sound/instruments/eguitar/eb5.ogg similarity index 100% rename from sound/eguitar/eb5.ogg rename to sound/instruments/eguitar/eb5.ogg diff --git a/sound/eguitar/eb6.ogg b/sound/instruments/eguitar/eb6.ogg similarity index 100% rename from sound/eguitar/eb6.ogg rename to sound/instruments/eguitar/eb6.ogg diff --git a/sound/eguitar/en4.ogg b/sound/instruments/eguitar/en4.ogg similarity index 100% rename from sound/eguitar/en4.ogg rename to sound/instruments/eguitar/en4.ogg diff --git a/sound/eguitar/en5.ogg b/sound/instruments/eguitar/en5.ogg similarity index 100% rename from sound/eguitar/en5.ogg rename to sound/instruments/eguitar/en5.ogg diff --git a/sound/eguitar/en6.ogg b/sound/instruments/eguitar/en6.ogg similarity index 100% rename from sound/eguitar/en6.ogg rename to sound/instruments/eguitar/en6.ogg diff --git a/sound/eguitar/fn4.ogg b/sound/instruments/eguitar/fn4.ogg similarity index 100% rename from sound/eguitar/fn4.ogg rename to sound/instruments/eguitar/fn4.ogg diff --git a/sound/eguitar/fn5.ogg b/sound/instruments/eguitar/fn5.ogg similarity index 100% rename from sound/eguitar/fn5.ogg rename to sound/instruments/eguitar/fn5.ogg diff --git a/sound/eguitar/fn6.ogg b/sound/instruments/eguitar/fn6.ogg similarity index 100% rename from sound/eguitar/fn6.ogg rename to sound/instruments/eguitar/fn6.ogg diff --git a/sound/eguitar/gb4.ogg b/sound/instruments/eguitar/gb4.ogg similarity index 100% rename from sound/eguitar/gb4.ogg rename to sound/instruments/eguitar/gb4.ogg diff --git a/sound/eguitar/gb5.ogg b/sound/instruments/eguitar/gb5.ogg similarity index 100% rename from sound/eguitar/gb5.ogg rename to sound/instruments/eguitar/gb5.ogg diff --git a/sound/eguitar/gb6.ogg b/sound/instruments/eguitar/gb6.ogg similarity index 100% rename from sound/eguitar/gb6.ogg rename to sound/instruments/eguitar/gb6.ogg diff --git a/sound/eguitar/gn4.ogg b/sound/instruments/eguitar/gn4.ogg similarity index 100% rename from sound/eguitar/gn4.ogg rename to sound/instruments/eguitar/gn4.ogg diff --git a/sound/eguitar/gn5.ogg b/sound/instruments/eguitar/gn5.ogg similarity index 100% rename from sound/eguitar/gn5.ogg rename to sound/instruments/eguitar/gn5.ogg diff --git a/sound/eguitar/gn6.ogg b/sound/instruments/eguitar/gn6.ogg similarity index 100% rename from sound/eguitar/gn6.ogg rename to sound/instruments/eguitar/gn6.ogg diff --git a/sound/instruments/glockenspiel/Ab2.mid b/sound/instruments/glockenspiel/Ab2.mid new file mode 100644 index 00000000000..5686905944d Binary files /dev/null and b/sound/instruments/glockenspiel/Ab2.mid differ diff --git a/sound/instruments/glockenspiel/Ab3.mid b/sound/instruments/glockenspiel/Ab3.mid new file mode 100644 index 00000000000..284a1fff4e3 Binary files /dev/null and b/sound/instruments/glockenspiel/Ab3.mid differ diff --git a/sound/instruments/glockenspiel/Ab4.mid b/sound/instruments/glockenspiel/Ab4.mid new file mode 100644 index 00000000000..fa423da6d5b Binary files /dev/null and b/sound/instruments/glockenspiel/Ab4.mid differ diff --git a/sound/instruments/glockenspiel/Ab5.mid b/sound/instruments/glockenspiel/Ab5.mid new file mode 100644 index 00000000000..4f49969b557 Binary files /dev/null and b/sound/instruments/glockenspiel/Ab5.mid differ diff --git a/sound/instruments/glockenspiel/Ab6.mid b/sound/instruments/glockenspiel/Ab6.mid new file mode 100644 index 00000000000..a9900e304d4 Binary files /dev/null and b/sound/instruments/glockenspiel/Ab6.mid differ diff --git a/sound/instruments/glockenspiel/Ab7.mid b/sound/instruments/glockenspiel/Ab7.mid new file mode 100644 index 00000000000..46a3712bc08 Binary files /dev/null and b/sound/instruments/glockenspiel/Ab7.mid differ diff --git a/sound/instruments/glockenspiel/An2.mid b/sound/instruments/glockenspiel/An2.mid new file mode 100644 index 00000000000..225c8d8e677 Binary files /dev/null and b/sound/instruments/glockenspiel/An2.mid differ diff --git a/sound/instruments/glockenspiel/An3.mid b/sound/instruments/glockenspiel/An3.mid new file mode 100644 index 00000000000..4517bccccf1 Binary files /dev/null and b/sound/instruments/glockenspiel/An3.mid differ diff --git a/sound/instruments/glockenspiel/An4.mid b/sound/instruments/glockenspiel/An4.mid new file mode 100644 index 00000000000..b0bfafe19d7 Binary files /dev/null and b/sound/instruments/glockenspiel/An4.mid differ diff --git a/sound/instruments/glockenspiel/An5.mid b/sound/instruments/glockenspiel/An5.mid new file mode 100644 index 00000000000..203f31ec8bf Binary files /dev/null and b/sound/instruments/glockenspiel/An5.mid differ diff --git a/sound/instruments/glockenspiel/An6.mid b/sound/instruments/glockenspiel/An6.mid new file mode 100644 index 00000000000..b3c81f947e2 Binary files /dev/null and b/sound/instruments/glockenspiel/An6.mid differ diff --git a/sound/instruments/glockenspiel/An7.mid b/sound/instruments/glockenspiel/An7.mid new file mode 100644 index 00000000000..5f5d1f2482e Binary files /dev/null and b/sound/instruments/glockenspiel/An7.mid differ diff --git a/sound/instruments/glockenspiel/Bb2.mid b/sound/instruments/glockenspiel/Bb2.mid new file mode 100644 index 00000000000..c847d75145b Binary files /dev/null and b/sound/instruments/glockenspiel/Bb2.mid differ diff --git a/sound/instruments/glockenspiel/Bb3.mid b/sound/instruments/glockenspiel/Bb3.mid new file mode 100644 index 00000000000..1bb96dd7b03 Binary files /dev/null and b/sound/instruments/glockenspiel/Bb3.mid differ diff --git a/sound/instruments/glockenspiel/Bb4.mid b/sound/instruments/glockenspiel/Bb4.mid new file mode 100644 index 00000000000..d96c70754d0 Binary files /dev/null and b/sound/instruments/glockenspiel/Bb4.mid differ diff --git a/sound/instruments/glockenspiel/Bb5.mid b/sound/instruments/glockenspiel/Bb5.mid new file mode 100644 index 00000000000..b8ca38884b8 Binary files /dev/null and b/sound/instruments/glockenspiel/Bb5.mid differ diff --git a/sound/instruments/glockenspiel/Bb6.mid b/sound/instruments/glockenspiel/Bb6.mid new file mode 100644 index 00000000000..b82b11dbf20 Binary files /dev/null and b/sound/instruments/glockenspiel/Bb6.mid differ diff --git a/sound/instruments/glockenspiel/Bb7.mid b/sound/instruments/glockenspiel/Bb7.mid new file mode 100644 index 00000000000..dfcf25c6e3f Binary files /dev/null and b/sound/instruments/glockenspiel/Bb7.mid differ diff --git a/sound/instruments/glockenspiel/Bn2.mid b/sound/instruments/glockenspiel/Bn2.mid new file mode 100644 index 00000000000..c34397b078a Binary files /dev/null and b/sound/instruments/glockenspiel/Bn2.mid differ diff --git a/sound/instruments/glockenspiel/Bn3.mid b/sound/instruments/glockenspiel/Bn3.mid new file mode 100644 index 00000000000..6572ba58a69 Binary files /dev/null and b/sound/instruments/glockenspiel/Bn3.mid differ diff --git a/sound/instruments/glockenspiel/Bn4.mid b/sound/instruments/glockenspiel/Bn4.mid new file mode 100644 index 00000000000..28059d9d39a Binary files /dev/null and b/sound/instruments/glockenspiel/Bn4.mid differ diff --git a/sound/instruments/glockenspiel/Bn5.mid b/sound/instruments/glockenspiel/Bn5.mid new file mode 100644 index 00000000000..acad7d78a4e Binary files /dev/null and b/sound/instruments/glockenspiel/Bn5.mid differ diff --git a/sound/instruments/glockenspiel/Bn6.mid b/sound/instruments/glockenspiel/Bn6.mid new file mode 100644 index 00000000000..28cecdb28e0 Binary files /dev/null and b/sound/instruments/glockenspiel/Bn6.mid differ diff --git a/sound/instruments/glockenspiel/Bn7.mid b/sound/instruments/glockenspiel/Bn7.mid new file mode 100644 index 00000000000..879cdf81a13 Binary files /dev/null and b/sound/instruments/glockenspiel/Bn7.mid differ diff --git a/sound/instruments/glockenspiel/Cn2.mid b/sound/instruments/glockenspiel/Cn2.mid new file mode 100644 index 00000000000..c25e5eb02fa Binary files /dev/null and b/sound/instruments/glockenspiel/Cn2.mid differ diff --git a/sound/instruments/glockenspiel/Cn3.mid b/sound/instruments/glockenspiel/Cn3.mid new file mode 100644 index 00000000000..2e9dc47abd1 Binary files /dev/null and b/sound/instruments/glockenspiel/Cn3.mid differ diff --git a/sound/instruments/glockenspiel/Cn4.mid b/sound/instruments/glockenspiel/Cn4.mid new file mode 100644 index 00000000000..6ebe22570d5 Binary files /dev/null and b/sound/instruments/glockenspiel/Cn4.mid differ diff --git a/sound/instruments/glockenspiel/Cn5.mid b/sound/instruments/glockenspiel/Cn5.mid new file mode 100644 index 00000000000..383cf88b989 Binary files /dev/null and b/sound/instruments/glockenspiel/Cn5.mid differ diff --git a/sound/instruments/glockenspiel/Cn6.mid b/sound/instruments/glockenspiel/Cn6.mid new file mode 100644 index 00000000000..919ba370850 Binary files /dev/null and b/sound/instruments/glockenspiel/Cn6.mid differ diff --git a/sound/instruments/glockenspiel/Cn7.mid b/sound/instruments/glockenspiel/Cn7.mid new file mode 100644 index 00000000000..6d02413f0ae Binary files /dev/null and b/sound/instruments/glockenspiel/Cn7.mid differ diff --git a/sound/instruments/glockenspiel/Db2.mid b/sound/instruments/glockenspiel/Db2.mid new file mode 100644 index 00000000000..e6c4c968b5c Binary files /dev/null and b/sound/instruments/glockenspiel/Db2.mid differ diff --git a/sound/instruments/glockenspiel/Db3.mid b/sound/instruments/glockenspiel/Db3.mid new file mode 100644 index 00000000000..d793ec8c5f1 Binary files /dev/null and b/sound/instruments/glockenspiel/Db3.mid differ diff --git a/sound/instruments/glockenspiel/Db4.mid b/sound/instruments/glockenspiel/Db4.mid new file mode 100644 index 00000000000..1c042478500 Binary files /dev/null and b/sound/instruments/glockenspiel/Db4.mid differ diff --git a/sound/instruments/glockenspiel/Db5.mid b/sound/instruments/glockenspiel/Db5.mid new file mode 100644 index 00000000000..bd0a7712876 Binary files /dev/null and b/sound/instruments/glockenspiel/Db5.mid differ diff --git a/sound/instruments/glockenspiel/Db6.mid b/sound/instruments/glockenspiel/Db6.mid new file mode 100644 index 00000000000..2c25f018b23 Binary files /dev/null and b/sound/instruments/glockenspiel/Db6.mid differ diff --git a/sound/instruments/glockenspiel/Db7.mid b/sound/instruments/glockenspiel/Db7.mid new file mode 100644 index 00000000000..e42abd2921a Binary files /dev/null and b/sound/instruments/glockenspiel/Db7.mid differ diff --git a/sound/instruments/glockenspiel/Dn2.mid b/sound/instruments/glockenspiel/Dn2.mid new file mode 100644 index 00000000000..8b82df85769 Binary files /dev/null and b/sound/instruments/glockenspiel/Dn2.mid differ diff --git a/sound/instruments/glockenspiel/Dn3.mid b/sound/instruments/glockenspiel/Dn3.mid new file mode 100644 index 00000000000..c367cdf2799 Binary files /dev/null and b/sound/instruments/glockenspiel/Dn3.mid differ diff --git a/sound/instruments/glockenspiel/Dn4.mid b/sound/instruments/glockenspiel/Dn4.mid new file mode 100644 index 00000000000..98af4007fe3 Binary files /dev/null and b/sound/instruments/glockenspiel/Dn4.mid differ diff --git a/sound/instruments/glockenspiel/Dn5.mid b/sound/instruments/glockenspiel/Dn5.mid new file mode 100644 index 00000000000..e51591d8879 Binary files /dev/null and b/sound/instruments/glockenspiel/Dn5.mid differ diff --git a/sound/instruments/glockenspiel/Dn6.mid b/sound/instruments/glockenspiel/Dn6.mid new file mode 100644 index 00000000000..7a3723915df Binary files /dev/null and b/sound/instruments/glockenspiel/Dn6.mid differ diff --git a/sound/instruments/glockenspiel/Dn7.mid b/sound/instruments/glockenspiel/Dn7.mid new file mode 100644 index 00000000000..5be8aa77e1f Binary files /dev/null and b/sound/instruments/glockenspiel/Dn7.mid differ diff --git a/sound/instruments/glockenspiel/Eb2.mid b/sound/instruments/glockenspiel/Eb2.mid new file mode 100644 index 00000000000..c50981843db Binary files /dev/null and b/sound/instruments/glockenspiel/Eb2.mid differ diff --git a/sound/instruments/glockenspiel/Eb3.mid b/sound/instruments/glockenspiel/Eb3.mid new file mode 100644 index 00000000000..36354cb7152 Binary files /dev/null and b/sound/instruments/glockenspiel/Eb3.mid differ diff --git a/sound/instruments/glockenspiel/Eb4.mid b/sound/instruments/glockenspiel/Eb4.mid new file mode 100644 index 00000000000..3d08fd703be Binary files /dev/null and b/sound/instruments/glockenspiel/Eb4.mid differ diff --git a/sound/instruments/glockenspiel/Eb5.mid b/sound/instruments/glockenspiel/Eb5.mid new file mode 100644 index 00000000000..25aebfc3274 Binary files /dev/null and b/sound/instruments/glockenspiel/Eb5.mid differ diff --git a/sound/instruments/glockenspiel/Eb6.mid b/sound/instruments/glockenspiel/Eb6.mid new file mode 100644 index 00000000000..62cc1ef0e7f Binary files /dev/null and b/sound/instruments/glockenspiel/Eb6.mid differ diff --git a/sound/instruments/glockenspiel/Eb7.mid b/sound/instruments/glockenspiel/Eb7.mid new file mode 100644 index 00000000000..b60cdad77b5 Binary files /dev/null and b/sound/instruments/glockenspiel/Eb7.mid differ diff --git a/sound/instruments/glockenspiel/En2.mid b/sound/instruments/glockenspiel/En2.mid new file mode 100644 index 00000000000..39758cd85f9 Binary files /dev/null and b/sound/instruments/glockenspiel/En2.mid differ diff --git a/sound/instruments/glockenspiel/En3.mid b/sound/instruments/glockenspiel/En3.mid new file mode 100644 index 00000000000..efc81900312 Binary files /dev/null and b/sound/instruments/glockenspiel/En3.mid differ diff --git a/sound/instruments/glockenspiel/En4.mid b/sound/instruments/glockenspiel/En4.mid new file mode 100644 index 00000000000..99cc66e8ee8 Binary files /dev/null and b/sound/instruments/glockenspiel/En4.mid differ diff --git a/sound/instruments/glockenspiel/En5.mid b/sound/instruments/glockenspiel/En5.mid new file mode 100644 index 00000000000..ad00fdf4193 Binary files /dev/null and b/sound/instruments/glockenspiel/En5.mid differ diff --git a/sound/instruments/glockenspiel/En6.mid b/sound/instruments/glockenspiel/En6.mid new file mode 100644 index 00000000000..f09ef0b2609 Binary files /dev/null and b/sound/instruments/glockenspiel/En6.mid differ diff --git a/sound/instruments/glockenspiel/En7.mid b/sound/instruments/glockenspiel/En7.mid new file mode 100644 index 00000000000..3bcb9da49ff Binary files /dev/null and b/sound/instruments/glockenspiel/En7.mid differ diff --git a/sound/instruments/glockenspiel/Fn2.mid b/sound/instruments/glockenspiel/Fn2.mid new file mode 100644 index 00000000000..f127d40a4ac Binary files /dev/null and b/sound/instruments/glockenspiel/Fn2.mid differ diff --git a/sound/instruments/glockenspiel/Fn3.mid b/sound/instruments/glockenspiel/Fn3.mid new file mode 100644 index 00000000000..2429099d112 Binary files /dev/null and b/sound/instruments/glockenspiel/Fn3.mid differ diff --git a/sound/instruments/glockenspiel/Fn4.mid b/sound/instruments/glockenspiel/Fn4.mid new file mode 100644 index 00000000000..be631cfb219 Binary files /dev/null and b/sound/instruments/glockenspiel/Fn4.mid differ diff --git a/sound/instruments/glockenspiel/Fn5.mid b/sound/instruments/glockenspiel/Fn5.mid new file mode 100644 index 00000000000..a9fa10ed92a Binary files /dev/null and b/sound/instruments/glockenspiel/Fn5.mid differ diff --git a/sound/instruments/glockenspiel/Fn6.mid b/sound/instruments/glockenspiel/Fn6.mid new file mode 100644 index 00000000000..e31280486c7 Binary files /dev/null and b/sound/instruments/glockenspiel/Fn6.mid differ diff --git a/sound/instruments/glockenspiel/Fn7.mid b/sound/instruments/glockenspiel/Fn7.mid new file mode 100644 index 00000000000..d58406a9eb1 Binary files /dev/null and b/sound/instruments/glockenspiel/Fn7.mid differ diff --git a/sound/instruments/glockenspiel/Gb2.mid b/sound/instruments/glockenspiel/Gb2.mid new file mode 100644 index 00000000000..a75712fdcd9 Binary files /dev/null and b/sound/instruments/glockenspiel/Gb2.mid differ diff --git a/sound/instruments/glockenspiel/Gb3.mid b/sound/instruments/glockenspiel/Gb3.mid new file mode 100644 index 00000000000..ce8eb61c040 Binary files /dev/null and b/sound/instruments/glockenspiel/Gb3.mid differ diff --git a/sound/instruments/glockenspiel/Gb4.mid b/sound/instruments/glockenspiel/Gb4.mid new file mode 100644 index 00000000000..d15ee2f97b2 Binary files /dev/null and b/sound/instruments/glockenspiel/Gb4.mid differ diff --git a/sound/instruments/glockenspiel/Gb5.mid b/sound/instruments/glockenspiel/Gb5.mid new file mode 100644 index 00000000000..393b6d76574 Binary files /dev/null and b/sound/instruments/glockenspiel/Gb5.mid differ diff --git a/sound/instruments/glockenspiel/Gb6.mid b/sound/instruments/glockenspiel/Gb6.mid new file mode 100644 index 00000000000..6b0e3aef091 Binary files /dev/null and b/sound/instruments/glockenspiel/Gb6.mid differ diff --git a/sound/instruments/glockenspiel/Gb7.mid b/sound/instruments/glockenspiel/Gb7.mid new file mode 100644 index 00000000000..318a1ea9caa Binary files /dev/null and b/sound/instruments/glockenspiel/Gb7.mid differ diff --git a/sound/instruments/glockenspiel/Gn2.mid b/sound/instruments/glockenspiel/Gn2.mid new file mode 100644 index 00000000000..39d22d66123 Binary files /dev/null and b/sound/instruments/glockenspiel/Gn2.mid differ diff --git a/sound/instruments/glockenspiel/Gn3.mid b/sound/instruments/glockenspiel/Gn3.mid new file mode 100644 index 00000000000..d9494886a1c Binary files /dev/null and b/sound/instruments/glockenspiel/Gn3.mid differ diff --git a/sound/instruments/glockenspiel/Gn4.mid b/sound/instruments/glockenspiel/Gn4.mid new file mode 100644 index 00000000000..00a2f114bac Binary files /dev/null and b/sound/instruments/glockenspiel/Gn4.mid differ diff --git a/sound/instruments/glockenspiel/Gn5.mid b/sound/instruments/glockenspiel/Gn5.mid new file mode 100644 index 00000000000..55205eae3fe Binary files /dev/null and b/sound/instruments/glockenspiel/Gn5.mid differ diff --git a/sound/instruments/glockenspiel/Gn6.mid b/sound/instruments/glockenspiel/Gn6.mid new file mode 100644 index 00000000000..1aebe5ec222 Binary files /dev/null and b/sound/instruments/glockenspiel/Gn6.mid differ diff --git a/sound/instruments/glockenspiel/Gn7.mid b/sound/instruments/glockenspiel/Gn7.mid new file mode 100644 index 00000000000..cd0a43ceac6 Binary files /dev/null and b/sound/instruments/glockenspiel/Gn7.mid differ diff --git a/sound/guitar/Ab3.ogg b/sound/instruments/guitar/Ab3.ogg similarity index 100% rename from sound/guitar/Ab3.ogg rename to sound/instruments/guitar/Ab3.ogg diff --git a/sound/guitar/Ab4.ogg b/sound/instruments/guitar/Ab4.ogg similarity index 100% rename from sound/guitar/Ab4.ogg rename to sound/instruments/guitar/Ab4.ogg diff --git a/sound/guitar/Ab5.ogg b/sound/instruments/guitar/Ab5.ogg similarity index 100% rename from sound/guitar/Ab5.ogg rename to sound/instruments/guitar/Ab5.ogg diff --git a/sound/guitar/Ab6.ogg b/sound/instruments/guitar/Ab6.ogg similarity index 100% rename from sound/guitar/Ab6.ogg rename to sound/instruments/guitar/Ab6.ogg diff --git a/sound/guitar/An3.ogg b/sound/instruments/guitar/An3.ogg similarity index 100% rename from sound/guitar/An3.ogg rename to sound/instruments/guitar/An3.ogg diff --git a/sound/guitar/An4.ogg b/sound/instruments/guitar/An4.ogg similarity index 100% rename from sound/guitar/An4.ogg rename to sound/instruments/guitar/An4.ogg diff --git a/sound/guitar/An5.ogg b/sound/instruments/guitar/An5.ogg similarity index 100% rename from sound/guitar/An5.ogg rename to sound/instruments/guitar/An5.ogg diff --git a/sound/guitar/An6.ogg b/sound/instruments/guitar/An6.ogg similarity index 100% rename from sound/guitar/An6.ogg rename to sound/instruments/guitar/An6.ogg diff --git a/sound/guitar/Bb3.ogg b/sound/instruments/guitar/Bb3.ogg similarity index 100% rename from sound/guitar/Bb3.ogg rename to sound/instruments/guitar/Bb3.ogg diff --git a/sound/guitar/Bb4.ogg b/sound/instruments/guitar/Bb4.ogg similarity index 100% rename from sound/guitar/Bb4.ogg rename to sound/instruments/guitar/Bb4.ogg diff --git a/sound/guitar/Bb5.ogg b/sound/instruments/guitar/Bb5.ogg similarity index 100% rename from sound/guitar/Bb5.ogg rename to sound/instruments/guitar/Bb5.ogg diff --git a/sound/guitar/Bb6.ogg b/sound/instruments/guitar/Bb6.ogg similarity index 100% rename from sound/guitar/Bb6.ogg rename to sound/instruments/guitar/Bb6.ogg diff --git a/sound/guitar/Bn3.ogg b/sound/instruments/guitar/Bn3.ogg similarity index 100% rename from sound/guitar/Bn3.ogg rename to sound/instruments/guitar/Bn3.ogg diff --git a/sound/guitar/Bn4.ogg b/sound/instruments/guitar/Bn4.ogg similarity index 100% rename from sound/guitar/Bn4.ogg rename to sound/instruments/guitar/Bn4.ogg diff --git a/sound/guitar/Bn5.ogg b/sound/instruments/guitar/Bn5.ogg similarity index 100% rename from sound/guitar/Bn5.ogg rename to sound/instruments/guitar/Bn5.ogg diff --git a/sound/guitar/Bn6.ogg b/sound/instruments/guitar/Bn6.ogg similarity index 100% rename from sound/guitar/Bn6.ogg rename to sound/instruments/guitar/Bn6.ogg diff --git a/sound/guitar/Cb4.ogg b/sound/instruments/guitar/Cb4.ogg similarity index 100% rename from sound/guitar/Cb4.ogg rename to sound/instruments/guitar/Cb4.ogg diff --git a/sound/guitar/Cb5.ogg b/sound/instruments/guitar/Cb5.ogg similarity index 100% rename from sound/guitar/Cb5.ogg rename to sound/instruments/guitar/Cb5.ogg diff --git a/sound/guitar/Cb6.ogg b/sound/instruments/guitar/Cb6.ogg similarity index 100% rename from sound/guitar/Cb6.ogg rename to sound/instruments/guitar/Cb6.ogg diff --git a/sound/guitar/Cb7.ogg b/sound/instruments/guitar/Cb7.ogg similarity index 100% rename from sound/guitar/Cb7.ogg rename to sound/instruments/guitar/Cb7.ogg diff --git a/sound/guitar/Cn4.ogg b/sound/instruments/guitar/Cn4.ogg similarity index 100% rename from sound/guitar/Cn4.ogg rename to sound/instruments/guitar/Cn4.ogg diff --git a/sound/guitar/Cn5.ogg b/sound/instruments/guitar/Cn5.ogg similarity index 100% rename from sound/guitar/Cn5.ogg rename to sound/instruments/guitar/Cn5.ogg diff --git a/sound/guitar/Cn6.ogg b/sound/instruments/guitar/Cn6.ogg similarity index 100% rename from sound/guitar/Cn6.ogg rename to sound/instruments/guitar/Cn6.ogg diff --git a/sound/guitar/Db4.ogg b/sound/instruments/guitar/Db4.ogg similarity index 100% rename from sound/guitar/Db4.ogg rename to sound/instruments/guitar/Db4.ogg diff --git a/sound/guitar/Db5.ogg b/sound/instruments/guitar/Db5.ogg similarity index 100% rename from sound/guitar/Db5.ogg rename to sound/instruments/guitar/Db5.ogg diff --git a/sound/guitar/Db6.ogg b/sound/instruments/guitar/Db6.ogg similarity index 100% rename from sound/guitar/Db6.ogg rename to sound/instruments/guitar/Db6.ogg diff --git a/sound/guitar/Dn4.ogg b/sound/instruments/guitar/Dn4.ogg similarity index 100% rename from sound/guitar/Dn4.ogg rename to sound/instruments/guitar/Dn4.ogg diff --git a/sound/guitar/Dn5.ogg b/sound/instruments/guitar/Dn5.ogg similarity index 100% rename from sound/guitar/Dn5.ogg rename to sound/instruments/guitar/Dn5.ogg diff --git a/sound/guitar/Dn6.ogg b/sound/instruments/guitar/Dn6.ogg similarity index 100% rename from sound/guitar/Dn6.ogg rename to sound/instruments/guitar/Dn6.ogg diff --git a/sound/guitar/Eb4.ogg b/sound/instruments/guitar/Eb4.ogg similarity index 100% rename from sound/guitar/Eb4.ogg rename to sound/instruments/guitar/Eb4.ogg diff --git a/sound/guitar/Eb5.ogg b/sound/instruments/guitar/Eb5.ogg similarity index 100% rename from sound/guitar/Eb5.ogg rename to sound/instruments/guitar/Eb5.ogg diff --git a/sound/guitar/Eb6.ogg b/sound/instruments/guitar/Eb6.ogg similarity index 100% rename from sound/guitar/Eb6.ogg rename to sound/instruments/guitar/Eb6.ogg diff --git a/sound/guitar/En3.ogg b/sound/instruments/guitar/En3.ogg similarity index 100% rename from sound/guitar/En3.ogg rename to sound/instruments/guitar/En3.ogg diff --git a/sound/guitar/En4.ogg b/sound/instruments/guitar/En4.ogg similarity index 100% rename from sound/guitar/En4.ogg rename to sound/instruments/guitar/En4.ogg diff --git a/sound/guitar/En5.ogg b/sound/instruments/guitar/En5.ogg similarity index 100% rename from sound/guitar/En5.ogg rename to sound/instruments/guitar/En5.ogg diff --git a/sound/guitar/En6.ogg b/sound/instruments/guitar/En6.ogg similarity index 100% rename from sound/guitar/En6.ogg rename to sound/instruments/guitar/En6.ogg diff --git a/sound/guitar/Fb3.ogg b/sound/instruments/guitar/Fb3.ogg similarity index 100% rename from sound/guitar/Fb3.ogg rename to sound/instruments/guitar/Fb3.ogg diff --git a/sound/guitar/Fb4.ogg b/sound/instruments/guitar/Fb4.ogg similarity index 100% rename from sound/guitar/Fb4.ogg rename to sound/instruments/guitar/Fb4.ogg diff --git a/sound/guitar/Fb5.ogg b/sound/instruments/guitar/Fb5.ogg similarity index 100% rename from sound/guitar/Fb5.ogg rename to sound/instruments/guitar/Fb5.ogg diff --git a/sound/guitar/Fb6.ogg b/sound/instruments/guitar/Fb6.ogg similarity index 100% rename from sound/guitar/Fb6.ogg rename to sound/instruments/guitar/Fb6.ogg diff --git a/sound/guitar/Fn3.ogg b/sound/instruments/guitar/Fn3.ogg similarity index 100% rename from sound/guitar/Fn3.ogg rename to sound/instruments/guitar/Fn3.ogg diff --git a/sound/guitar/Fn4.ogg b/sound/instruments/guitar/Fn4.ogg similarity index 100% rename from sound/guitar/Fn4.ogg rename to sound/instruments/guitar/Fn4.ogg diff --git a/sound/guitar/Fn5.ogg b/sound/instruments/guitar/Fn5.ogg similarity index 100% rename from sound/guitar/Fn5.ogg rename to sound/instruments/guitar/Fn5.ogg diff --git a/sound/guitar/Fn6.ogg b/sound/instruments/guitar/Fn6.ogg similarity index 100% rename from sound/guitar/Fn6.ogg rename to sound/instruments/guitar/Fn6.ogg diff --git a/sound/guitar/Gb3.ogg b/sound/instruments/guitar/Gb3.ogg similarity index 100% rename from sound/guitar/Gb3.ogg rename to sound/instruments/guitar/Gb3.ogg diff --git a/sound/guitar/Gb4.ogg b/sound/instruments/guitar/Gb4.ogg similarity index 100% rename from sound/guitar/Gb4.ogg rename to sound/instruments/guitar/Gb4.ogg diff --git a/sound/guitar/Gb5.ogg b/sound/instruments/guitar/Gb5.ogg similarity index 100% rename from sound/guitar/Gb5.ogg rename to sound/instruments/guitar/Gb5.ogg diff --git a/sound/guitar/Gb6.ogg b/sound/instruments/guitar/Gb6.ogg similarity index 100% rename from sound/guitar/Gb6.ogg rename to sound/instruments/guitar/Gb6.ogg diff --git a/sound/guitar/Gn3.ogg b/sound/instruments/guitar/Gn3.ogg similarity index 100% rename from sound/guitar/Gn3.ogg rename to sound/instruments/guitar/Gn3.ogg diff --git a/sound/guitar/Gn4.ogg b/sound/instruments/guitar/Gn4.ogg similarity index 100% rename from sound/guitar/Gn4.ogg rename to sound/instruments/guitar/Gn4.ogg diff --git a/sound/guitar/Gn5.ogg b/sound/instruments/guitar/Gn5.ogg similarity index 100% rename from sound/guitar/Gn5.ogg rename to sound/instruments/guitar/Gn5.ogg diff --git a/sound/guitar/Gn6.ogg b/sound/instruments/guitar/Gn6.ogg similarity index 100% rename from sound/guitar/Gn6.ogg rename to sound/instruments/guitar/Gn6.ogg diff --git a/sound/instruments/harmonica/Ab2.mid b/sound/instruments/harmonica/Ab2.mid new file mode 100644 index 00000000000..c4c3ddeecd0 Binary files /dev/null and b/sound/instruments/harmonica/Ab2.mid differ diff --git a/sound/instruments/harmonica/Ab3.mid b/sound/instruments/harmonica/Ab3.mid new file mode 100644 index 00000000000..ab6c88ed510 Binary files /dev/null and b/sound/instruments/harmonica/Ab3.mid differ diff --git a/sound/instruments/harmonica/Ab4.mid b/sound/instruments/harmonica/Ab4.mid new file mode 100644 index 00000000000..d511cdb4750 Binary files /dev/null and b/sound/instruments/harmonica/Ab4.mid differ diff --git a/sound/instruments/harmonica/Ab5.mid b/sound/instruments/harmonica/Ab5.mid new file mode 100644 index 00000000000..abab8dc3221 Binary files /dev/null and b/sound/instruments/harmonica/Ab5.mid differ diff --git a/sound/instruments/harmonica/Ab6.mid b/sound/instruments/harmonica/Ab6.mid new file mode 100644 index 00000000000..15ca0f0d8f7 Binary files /dev/null and b/sound/instruments/harmonica/Ab6.mid differ diff --git a/sound/instruments/harmonica/An2.mid b/sound/instruments/harmonica/An2.mid new file mode 100644 index 00000000000..62bb9299352 Binary files /dev/null and b/sound/instruments/harmonica/An2.mid differ diff --git a/sound/instruments/harmonica/An3.mid b/sound/instruments/harmonica/An3.mid new file mode 100644 index 00000000000..20ee9dddcc6 Binary files /dev/null and b/sound/instruments/harmonica/An3.mid differ diff --git a/sound/instruments/harmonica/An4.mid b/sound/instruments/harmonica/An4.mid new file mode 100644 index 00000000000..a791135fa81 Binary files /dev/null and b/sound/instruments/harmonica/An4.mid differ diff --git a/sound/instruments/harmonica/An5.mid b/sound/instruments/harmonica/An5.mid new file mode 100644 index 00000000000..b78f0793c8a Binary files /dev/null and b/sound/instruments/harmonica/An5.mid differ diff --git a/sound/instruments/harmonica/An6.mid b/sound/instruments/harmonica/An6.mid new file mode 100644 index 00000000000..e250b41e9f8 Binary files /dev/null and b/sound/instruments/harmonica/An6.mid differ diff --git a/sound/instruments/harmonica/Bb2.mid b/sound/instruments/harmonica/Bb2.mid new file mode 100644 index 00000000000..610e1f0f380 Binary files /dev/null and b/sound/instruments/harmonica/Bb2.mid differ diff --git a/sound/instruments/harmonica/Bb3.mid b/sound/instruments/harmonica/Bb3.mid new file mode 100644 index 00000000000..79f0966663d Binary files /dev/null and b/sound/instruments/harmonica/Bb3.mid differ diff --git a/sound/instruments/harmonica/Bb4.mid b/sound/instruments/harmonica/Bb4.mid new file mode 100644 index 00000000000..af1eb969c62 Binary files /dev/null and b/sound/instruments/harmonica/Bb4.mid differ diff --git a/sound/instruments/harmonica/Bb5.mid b/sound/instruments/harmonica/Bb5.mid new file mode 100644 index 00000000000..e816d9cbdd0 Binary files /dev/null and b/sound/instruments/harmonica/Bb5.mid differ diff --git a/sound/instruments/harmonica/Bb6.mid b/sound/instruments/harmonica/Bb6.mid new file mode 100644 index 00000000000..ad5b9d2f9e6 Binary files /dev/null and b/sound/instruments/harmonica/Bb6.mid differ diff --git a/sound/instruments/harmonica/Bn2.mid b/sound/instruments/harmonica/Bn2.mid new file mode 100644 index 00000000000..f03c0f95358 Binary files /dev/null and b/sound/instruments/harmonica/Bn2.mid differ diff --git a/sound/instruments/harmonica/Bn3.mid b/sound/instruments/harmonica/Bn3.mid new file mode 100644 index 00000000000..3d078bba8ed Binary files /dev/null and b/sound/instruments/harmonica/Bn3.mid differ diff --git a/sound/instruments/harmonica/Bn4.mid b/sound/instruments/harmonica/Bn4.mid new file mode 100644 index 00000000000..fff2f5e7b80 Binary files /dev/null and b/sound/instruments/harmonica/Bn4.mid differ diff --git a/sound/instruments/harmonica/Bn5.mid b/sound/instruments/harmonica/Bn5.mid new file mode 100644 index 00000000000..b3cf8fe0516 Binary files /dev/null and b/sound/instruments/harmonica/Bn5.mid differ diff --git a/sound/instruments/harmonica/Bn6.mid b/sound/instruments/harmonica/Bn6.mid new file mode 100644 index 00000000000..03b60c6a49a Binary files /dev/null and b/sound/instruments/harmonica/Bn6.mid differ diff --git a/sound/instruments/harmonica/Cn2.mid b/sound/instruments/harmonica/Cn2.mid new file mode 100644 index 00000000000..6501f021d29 Binary files /dev/null and b/sound/instruments/harmonica/Cn2.mid differ diff --git a/sound/instruments/harmonica/Cn3.mid b/sound/instruments/harmonica/Cn3.mid new file mode 100644 index 00000000000..462bc973ef7 Binary files /dev/null and b/sound/instruments/harmonica/Cn3.mid differ diff --git a/sound/instruments/harmonica/Cn4.mid b/sound/instruments/harmonica/Cn4.mid new file mode 100644 index 00000000000..1d4d9ad83b2 Binary files /dev/null and b/sound/instruments/harmonica/Cn4.mid differ diff --git a/sound/instruments/harmonica/Cn5.mid b/sound/instruments/harmonica/Cn5.mid new file mode 100644 index 00000000000..7f0698266e3 Binary files /dev/null and b/sound/instruments/harmonica/Cn5.mid differ diff --git a/sound/instruments/harmonica/Cn6.mid b/sound/instruments/harmonica/Cn6.mid new file mode 100644 index 00000000000..9edc25c6259 Binary files /dev/null and b/sound/instruments/harmonica/Cn6.mid differ diff --git a/sound/instruments/harmonica/Cn7.mid b/sound/instruments/harmonica/Cn7.mid new file mode 100644 index 00000000000..d670d4f07c7 Binary files /dev/null and b/sound/instruments/harmonica/Cn7.mid differ diff --git a/sound/instruments/harmonica/Db2.mid b/sound/instruments/harmonica/Db2.mid new file mode 100644 index 00000000000..dab89a2a1bf Binary files /dev/null and b/sound/instruments/harmonica/Db2.mid differ diff --git a/sound/instruments/harmonica/Db3.mid b/sound/instruments/harmonica/Db3.mid new file mode 100644 index 00000000000..06d826dfc75 Binary files /dev/null and b/sound/instruments/harmonica/Db3.mid differ diff --git a/sound/instruments/harmonica/Db4.mid b/sound/instruments/harmonica/Db4.mid new file mode 100644 index 00000000000..1e9f67c9ad3 Binary files /dev/null and b/sound/instruments/harmonica/Db4.mid differ diff --git a/sound/instruments/harmonica/Db5.mid b/sound/instruments/harmonica/Db5.mid new file mode 100644 index 00000000000..08346dd8389 Binary files /dev/null and b/sound/instruments/harmonica/Db5.mid differ diff --git a/sound/instruments/harmonica/Db6.mid b/sound/instruments/harmonica/Db6.mid new file mode 100644 index 00000000000..2269113e007 Binary files /dev/null and b/sound/instruments/harmonica/Db6.mid differ diff --git a/sound/instruments/harmonica/Dn2.mid b/sound/instruments/harmonica/Dn2.mid new file mode 100644 index 00000000000..652990ac1a4 Binary files /dev/null and b/sound/instruments/harmonica/Dn2.mid differ diff --git a/sound/instruments/harmonica/Dn3.mid b/sound/instruments/harmonica/Dn3.mid new file mode 100644 index 00000000000..e2e3a63d345 Binary files /dev/null and b/sound/instruments/harmonica/Dn3.mid differ diff --git a/sound/instruments/harmonica/Dn4.mid b/sound/instruments/harmonica/Dn4.mid new file mode 100644 index 00000000000..d9a23a5445f Binary files /dev/null and b/sound/instruments/harmonica/Dn4.mid differ diff --git a/sound/instruments/harmonica/Dn5.mid b/sound/instruments/harmonica/Dn5.mid new file mode 100644 index 00000000000..3ff298d3946 Binary files /dev/null and b/sound/instruments/harmonica/Dn5.mid differ diff --git a/sound/instruments/harmonica/Dn6.mid b/sound/instruments/harmonica/Dn6.mid new file mode 100644 index 00000000000..6aa4c5ef434 Binary files /dev/null and b/sound/instruments/harmonica/Dn6.mid differ diff --git a/sound/instruments/harmonica/Eb2.mid b/sound/instruments/harmonica/Eb2.mid new file mode 100644 index 00000000000..d1a8e3fbea2 Binary files /dev/null and b/sound/instruments/harmonica/Eb2.mid differ diff --git a/sound/instruments/harmonica/Eb3.mid b/sound/instruments/harmonica/Eb3.mid new file mode 100644 index 00000000000..c31c6ab6e9f Binary files /dev/null and b/sound/instruments/harmonica/Eb3.mid differ diff --git a/sound/instruments/harmonica/Eb4.mid b/sound/instruments/harmonica/Eb4.mid new file mode 100644 index 00000000000..eabad551599 Binary files /dev/null and b/sound/instruments/harmonica/Eb4.mid differ diff --git a/sound/instruments/harmonica/Eb5.mid b/sound/instruments/harmonica/Eb5.mid new file mode 100644 index 00000000000..8da3b86e483 Binary files /dev/null and b/sound/instruments/harmonica/Eb5.mid differ diff --git a/sound/instruments/harmonica/Eb6.mid b/sound/instruments/harmonica/Eb6.mid new file mode 100644 index 00000000000..db3d2b17b9e Binary files /dev/null and b/sound/instruments/harmonica/Eb6.mid differ diff --git a/sound/instruments/harmonica/En2.mid b/sound/instruments/harmonica/En2.mid new file mode 100644 index 00000000000..48ea2d8bcb9 Binary files /dev/null and b/sound/instruments/harmonica/En2.mid differ diff --git a/sound/instruments/harmonica/En3.mid b/sound/instruments/harmonica/En3.mid new file mode 100644 index 00000000000..d7d2492add0 Binary files /dev/null and b/sound/instruments/harmonica/En3.mid differ diff --git a/sound/instruments/harmonica/En4.mid b/sound/instruments/harmonica/En4.mid new file mode 100644 index 00000000000..b2731141e6e Binary files /dev/null and b/sound/instruments/harmonica/En4.mid differ diff --git a/sound/instruments/harmonica/En5.mid b/sound/instruments/harmonica/En5.mid new file mode 100644 index 00000000000..22026c14c4f Binary files /dev/null and b/sound/instruments/harmonica/En5.mid differ diff --git a/sound/instruments/harmonica/En6.mid b/sound/instruments/harmonica/En6.mid new file mode 100644 index 00000000000..6730a7c5287 Binary files /dev/null and b/sound/instruments/harmonica/En6.mid differ diff --git a/sound/instruments/harmonica/Fn2.mid b/sound/instruments/harmonica/Fn2.mid new file mode 100644 index 00000000000..833662178d0 Binary files /dev/null and b/sound/instruments/harmonica/Fn2.mid differ diff --git a/sound/instruments/harmonica/Fn3.mid b/sound/instruments/harmonica/Fn3.mid new file mode 100644 index 00000000000..7dc41a47c88 Binary files /dev/null and b/sound/instruments/harmonica/Fn3.mid differ diff --git a/sound/instruments/harmonica/Fn4.mid b/sound/instruments/harmonica/Fn4.mid new file mode 100644 index 00000000000..025583e38d3 Binary files /dev/null and b/sound/instruments/harmonica/Fn4.mid differ diff --git a/sound/instruments/harmonica/Fn5.mid b/sound/instruments/harmonica/Fn5.mid new file mode 100644 index 00000000000..710b458d85b Binary files /dev/null and b/sound/instruments/harmonica/Fn5.mid differ diff --git a/sound/instruments/harmonica/Fn6.mid b/sound/instruments/harmonica/Fn6.mid new file mode 100644 index 00000000000..44112e36595 Binary files /dev/null and b/sound/instruments/harmonica/Fn6.mid differ diff --git a/sound/instruments/harmonica/Gb2.mid b/sound/instruments/harmonica/Gb2.mid new file mode 100644 index 00000000000..8edd298ec13 Binary files /dev/null and b/sound/instruments/harmonica/Gb2.mid differ diff --git a/sound/instruments/harmonica/Gb3.mid b/sound/instruments/harmonica/Gb3.mid new file mode 100644 index 00000000000..438a939095a Binary files /dev/null and b/sound/instruments/harmonica/Gb3.mid differ diff --git a/sound/instruments/harmonica/Gb4.mid b/sound/instruments/harmonica/Gb4.mid new file mode 100644 index 00000000000..7844063205c Binary files /dev/null and b/sound/instruments/harmonica/Gb4.mid differ diff --git a/sound/instruments/harmonica/Gb5.mid b/sound/instruments/harmonica/Gb5.mid new file mode 100644 index 00000000000..4139bce10e0 Binary files /dev/null and b/sound/instruments/harmonica/Gb5.mid differ diff --git a/sound/instruments/harmonica/Gb6.mid b/sound/instruments/harmonica/Gb6.mid new file mode 100644 index 00000000000..e6b1a8fb897 Binary files /dev/null and b/sound/instruments/harmonica/Gb6.mid differ diff --git a/sound/instruments/harmonica/Gn2.mid b/sound/instruments/harmonica/Gn2.mid new file mode 100644 index 00000000000..d26e7c83af6 Binary files /dev/null and b/sound/instruments/harmonica/Gn2.mid differ diff --git a/sound/instruments/harmonica/Gn3.mid b/sound/instruments/harmonica/Gn3.mid new file mode 100644 index 00000000000..c741d556c9e Binary files /dev/null and b/sound/instruments/harmonica/Gn3.mid differ diff --git a/sound/instruments/harmonica/Gn4.mid b/sound/instruments/harmonica/Gn4.mid new file mode 100644 index 00000000000..c6e7a3c9bb2 Binary files /dev/null and b/sound/instruments/harmonica/Gn4.mid differ diff --git a/sound/instruments/harmonica/Gn5.mid b/sound/instruments/harmonica/Gn5.mid new file mode 100644 index 00000000000..a9608e9d210 Binary files /dev/null and b/sound/instruments/harmonica/Gn5.mid differ diff --git a/sound/instruments/harmonica/Gn6.mid b/sound/instruments/harmonica/Gn6.mid new file mode 100644 index 00000000000..98f6d32bfc5 Binary files /dev/null and b/sound/instruments/harmonica/Gn6.mid differ diff --git a/sound/piano/Ab1.ogg b/sound/instruments/piano/Ab1.ogg similarity index 100% rename from sound/piano/Ab1.ogg rename to sound/instruments/piano/Ab1.ogg diff --git a/sound/piano/Ab2.ogg b/sound/instruments/piano/Ab2.ogg similarity index 100% rename from sound/piano/Ab2.ogg rename to sound/instruments/piano/Ab2.ogg diff --git a/sound/piano/Ab3.ogg b/sound/instruments/piano/Ab3.ogg similarity index 100% rename from sound/piano/Ab3.ogg rename to sound/instruments/piano/Ab3.ogg diff --git a/sound/piano/Ab4.ogg b/sound/instruments/piano/Ab4.ogg similarity index 100% rename from sound/piano/Ab4.ogg rename to sound/instruments/piano/Ab4.ogg diff --git a/sound/piano/Ab5.ogg b/sound/instruments/piano/Ab5.ogg similarity index 100% rename from sound/piano/Ab5.ogg rename to sound/instruments/piano/Ab5.ogg diff --git a/sound/piano/Ab6.ogg b/sound/instruments/piano/Ab6.ogg similarity index 100% rename from sound/piano/Ab6.ogg rename to sound/instruments/piano/Ab6.ogg diff --git a/sound/piano/Ab7.ogg b/sound/instruments/piano/Ab7.ogg similarity index 100% rename from sound/piano/Ab7.ogg rename to sound/instruments/piano/Ab7.ogg diff --git a/sound/piano/Ab8.ogg b/sound/instruments/piano/Ab8.ogg similarity index 100% rename from sound/piano/Ab8.ogg rename to sound/instruments/piano/Ab8.ogg diff --git a/sound/piano/An1.ogg b/sound/instruments/piano/An1.ogg similarity index 100% rename from sound/piano/An1.ogg rename to sound/instruments/piano/An1.ogg diff --git a/sound/piano/An2.ogg b/sound/instruments/piano/An2.ogg similarity index 100% rename from sound/piano/An2.ogg rename to sound/instruments/piano/An2.ogg diff --git a/sound/piano/An3.ogg b/sound/instruments/piano/An3.ogg similarity index 100% rename from sound/piano/An3.ogg rename to sound/instruments/piano/An3.ogg diff --git a/sound/piano/An4.ogg b/sound/instruments/piano/An4.ogg similarity index 100% rename from sound/piano/An4.ogg rename to sound/instruments/piano/An4.ogg diff --git a/sound/piano/An5.ogg b/sound/instruments/piano/An5.ogg similarity index 100% rename from sound/piano/An5.ogg rename to sound/instruments/piano/An5.ogg diff --git a/sound/piano/An6.ogg b/sound/instruments/piano/An6.ogg similarity index 100% rename from sound/piano/An6.ogg rename to sound/instruments/piano/An6.ogg diff --git a/sound/piano/An7.ogg b/sound/instruments/piano/An7.ogg similarity index 100% rename from sound/piano/An7.ogg rename to sound/instruments/piano/An7.ogg diff --git a/sound/piano/An8.ogg b/sound/instruments/piano/An8.ogg similarity index 100% rename from sound/piano/An8.ogg rename to sound/instruments/piano/An8.ogg diff --git a/sound/piano/Bb1.ogg b/sound/instruments/piano/Bb1.ogg similarity index 100% rename from sound/piano/Bb1.ogg rename to sound/instruments/piano/Bb1.ogg diff --git a/sound/piano/Bb2.ogg b/sound/instruments/piano/Bb2.ogg similarity index 100% rename from sound/piano/Bb2.ogg rename to sound/instruments/piano/Bb2.ogg diff --git a/sound/piano/Bb3.ogg b/sound/instruments/piano/Bb3.ogg similarity index 100% rename from sound/piano/Bb3.ogg rename to sound/instruments/piano/Bb3.ogg diff --git a/sound/piano/Bb4.ogg b/sound/instruments/piano/Bb4.ogg similarity index 100% rename from sound/piano/Bb4.ogg rename to sound/instruments/piano/Bb4.ogg diff --git a/sound/piano/Bb5.ogg b/sound/instruments/piano/Bb5.ogg similarity index 100% rename from sound/piano/Bb5.ogg rename to sound/instruments/piano/Bb5.ogg diff --git a/sound/piano/Bb6.ogg b/sound/instruments/piano/Bb6.ogg similarity index 100% rename from sound/piano/Bb6.ogg rename to sound/instruments/piano/Bb6.ogg diff --git a/sound/piano/Bb7.ogg b/sound/instruments/piano/Bb7.ogg similarity index 100% rename from sound/piano/Bb7.ogg rename to sound/instruments/piano/Bb7.ogg diff --git a/sound/piano/Bb8.ogg b/sound/instruments/piano/Bb8.ogg similarity index 100% rename from sound/piano/Bb8.ogg rename to sound/instruments/piano/Bb8.ogg diff --git a/sound/piano/Bn1.ogg b/sound/instruments/piano/Bn1.ogg similarity index 100% rename from sound/piano/Bn1.ogg rename to sound/instruments/piano/Bn1.ogg diff --git a/sound/piano/Bn2.ogg b/sound/instruments/piano/Bn2.ogg similarity index 100% rename from sound/piano/Bn2.ogg rename to sound/instruments/piano/Bn2.ogg diff --git a/sound/piano/Bn3.ogg b/sound/instruments/piano/Bn3.ogg similarity index 100% rename from sound/piano/Bn3.ogg rename to sound/instruments/piano/Bn3.ogg diff --git a/sound/piano/Bn4.ogg b/sound/instruments/piano/Bn4.ogg similarity index 100% rename from sound/piano/Bn4.ogg rename to sound/instruments/piano/Bn4.ogg diff --git a/sound/piano/Bn5.ogg b/sound/instruments/piano/Bn5.ogg similarity index 100% rename from sound/piano/Bn5.ogg rename to sound/instruments/piano/Bn5.ogg diff --git a/sound/piano/Bn6.ogg b/sound/instruments/piano/Bn6.ogg similarity index 100% rename from sound/piano/Bn6.ogg rename to sound/instruments/piano/Bn6.ogg diff --git a/sound/piano/Bn7.ogg b/sound/instruments/piano/Bn7.ogg similarity index 100% rename from sound/piano/Bn7.ogg rename to sound/instruments/piano/Bn7.ogg diff --git a/sound/piano/Bn8.ogg b/sound/instruments/piano/Bn8.ogg similarity index 100% rename from sound/piano/Bn8.ogg rename to sound/instruments/piano/Bn8.ogg diff --git a/sound/piano/Cn1.ogg b/sound/instruments/piano/Cn1.ogg similarity index 100% rename from sound/piano/Cn1.ogg rename to sound/instruments/piano/Cn1.ogg diff --git a/sound/piano/Cn2.ogg b/sound/instruments/piano/Cn2.ogg similarity index 100% rename from sound/piano/Cn2.ogg rename to sound/instruments/piano/Cn2.ogg diff --git a/sound/piano/Cn3.ogg b/sound/instruments/piano/Cn3.ogg similarity index 100% rename from sound/piano/Cn3.ogg rename to sound/instruments/piano/Cn3.ogg diff --git a/sound/piano/Cn4.ogg b/sound/instruments/piano/Cn4.ogg similarity index 100% rename from sound/piano/Cn4.ogg rename to sound/instruments/piano/Cn4.ogg diff --git a/sound/piano/Cn5.ogg b/sound/instruments/piano/Cn5.ogg similarity index 100% rename from sound/piano/Cn5.ogg rename to sound/instruments/piano/Cn5.ogg diff --git a/sound/piano/Cn6.ogg b/sound/instruments/piano/Cn6.ogg similarity index 100% rename from sound/piano/Cn6.ogg rename to sound/instruments/piano/Cn6.ogg diff --git a/sound/piano/Cn7.ogg b/sound/instruments/piano/Cn7.ogg similarity index 100% rename from sound/piano/Cn7.ogg rename to sound/instruments/piano/Cn7.ogg diff --git a/sound/piano/Cn8.ogg b/sound/instruments/piano/Cn8.ogg similarity index 100% rename from sound/piano/Cn8.ogg rename to sound/instruments/piano/Cn8.ogg diff --git a/sound/piano/Cn9.ogg b/sound/instruments/piano/Cn9.ogg similarity index 100% rename from sound/piano/Cn9.ogg rename to sound/instruments/piano/Cn9.ogg diff --git a/sound/piano/Db1.ogg b/sound/instruments/piano/Db1.ogg similarity index 100% rename from sound/piano/Db1.ogg rename to sound/instruments/piano/Db1.ogg diff --git a/sound/piano/Db2.ogg b/sound/instruments/piano/Db2.ogg similarity index 100% rename from sound/piano/Db2.ogg rename to sound/instruments/piano/Db2.ogg diff --git a/sound/piano/Db3.ogg b/sound/instruments/piano/Db3.ogg similarity index 100% rename from sound/piano/Db3.ogg rename to sound/instruments/piano/Db3.ogg diff --git a/sound/piano/Db4.ogg b/sound/instruments/piano/Db4.ogg similarity index 100% rename from sound/piano/Db4.ogg rename to sound/instruments/piano/Db4.ogg diff --git a/sound/piano/Db5.ogg b/sound/instruments/piano/Db5.ogg similarity index 100% rename from sound/piano/Db5.ogg rename to sound/instruments/piano/Db5.ogg diff --git a/sound/piano/Db6.ogg b/sound/instruments/piano/Db6.ogg similarity index 100% rename from sound/piano/Db6.ogg rename to sound/instruments/piano/Db6.ogg diff --git a/sound/piano/Db7.ogg b/sound/instruments/piano/Db7.ogg similarity index 100% rename from sound/piano/Db7.ogg rename to sound/instruments/piano/Db7.ogg diff --git a/sound/piano/Db8.ogg b/sound/instruments/piano/Db8.ogg similarity index 100% rename from sound/piano/Db8.ogg rename to sound/instruments/piano/Db8.ogg diff --git a/sound/piano/Dn1.ogg b/sound/instruments/piano/Dn1.ogg similarity index 100% rename from sound/piano/Dn1.ogg rename to sound/instruments/piano/Dn1.ogg diff --git a/sound/piano/Dn2.ogg b/sound/instruments/piano/Dn2.ogg similarity index 100% rename from sound/piano/Dn2.ogg rename to sound/instruments/piano/Dn2.ogg diff --git a/sound/piano/Dn3.ogg b/sound/instruments/piano/Dn3.ogg similarity index 100% rename from sound/piano/Dn3.ogg rename to sound/instruments/piano/Dn3.ogg diff --git a/sound/piano/Dn4.ogg b/sound/instruments/piano/Dn4.ogg similarity index 100% rename from sound/piano/Dn4.ogg rename to sound/instruments/piano/Dn4.ogg diff --git a/sound/piano/Dn5.ogg b/sound/instruments/piano/Dn5.ogg similarity index 100% rename from sound/piano/Dn5.ogg rename to sound/instruments/piano/Dn5.ogg diff --git a/sound/piano/Dn6.ogg b/sound/instruments/piano/Dn6.ogg similarity index 100% rename from sound/piano/Dn6.ogg rename to sound/instruments/piano/Dn6.ogg diff --git a/sound/piano/Dn7.ogg b/sound/instruments/piano/Dn7.ogg similarity index 100% rename from sound/piano/Dn7.ogg rename to sound/instruments/piano/Dn7.ogg diff --git a/sound/piano/Dn8.ogg b/sound/instruments/piano/Dn8.ogg similarity index 100% rename from sound/piano/Dn8.ogg rename to sound/instruments/piano/Dn8.ogg diff --git a/sound/piano/Eb1.ogg b/sound/instruments/piano/Eb1.ogg similarity index 100% rename from sound/piano/Eb1.ogg rename to sound/instruments/piano/Eb1.ogg diff --git a/sound/piano/Eb2.ogg b/sound/instruments/piano/Eb2.ogg similarity index 100% rename from sound/piano/Eb2.ogg rename to sound/instruments/piano/Eb2.ogg diff --git a/sound/piano/Eb3.ogg b/sound/instruments/piano/Eb3.ogg similarity index 100% rename from sound/piano/Eb3.ogg rename to sound/instruments/piano/Eb3.ogg diff --git a/sound/piano/Eb4.ogg b/sound/instruments/piano/Eb4.ogg similarity index 100% rename from sound/piano/Eb4.ogg rename to sound/instruments/piano/Eb4.ogg diff --git a/sound/piano/Eb5.ogg b/sound/instruments/piano/Eb5.ogg similarity index 100% rename from sound/piano/Eb5.ogg rename to sound/instruments/piano/Eb5.ogg diff --git a/sound/piano/Eb6.ogg b/sound/instruments/piano/Eb6.ogg similarity index 100% rename from sound/piano/Eb6.ogg rename to sound/instruments/piano/Eb6.ogg diff --git a/sound/piano/Eb7.ogg b/sound/instruments/piano/Eb7.ogg similarity index 100% rename from sound/piano/Eb7.ogg rename to sound/instruments/piano/Eb7.ogg diff --git a/sound/piano/Eb8.ogg b/sound/instruments/piano/Eb8.ogg similarity index 100% rename from sound/piano/Eb8.ogg rename to sound/instruments/piano/Eb8.ogg diff --git a/sound/piano/En1.ogg b/sound/instruments/piano/En1.ogg similarity index 100% rename from sound/piano/En1.ogg rename to sound/instruments/piano/En1.ogg diff --git a/sound/piano/En2.ogg b/sound/instruments/piano/En2.ogg similarity index 100% rename from sound/piano/En2.ogg rename to sound/instruments/piano/En2.ogg diff --git a/sound/piano/En3.ogg b/sound/instruments/piano/En3.ogg similarity index 100% rename from sound/piano/En3.ogg rename to sound/instruments/piano/En3.ogg diff --git a/sound/piano/En4.ogg b/sound/instruments/piano/En4.ogg similarity index 100% rename from sound/piano/En4.ogg rename to sound/instruments/piano/En4.ogg diff --git a/sound/piano/En5.ogg b/sound/instruments/piano/En5.ogg similarity index 100% rename from sound/piano/En5.ogg rename to sound/instruments/piano/En5.ogg diff --git a/sound/piano/En6.ogg b/sound/instruments/piano/En6.ogg similarity index 100% rename from sound/piano/En6.ogg rename to sound/instruments/piano/En6.ogg diff --git a/sound/piano/En7.ogg b/sound/instruments/piano/En7.ogg similarity index 100% rename from sound/piano/En7.ogg rename to sound/instruments/piano/En7.ogg diff --git a/sound/piano/En8.ogg b/sound/instruments/piano/En8.ogg similarity index 100% rename from sound/piano/En8.ogg rename to sound/instruments/piano/En8.ogg diff --git a/sound/piano/Fn1.ogg b/sound/instruments/piano/Fn1.ogg similarity index 100% rename from sound/piano/Fn1.ogg rename to sound/instruments/piano/Fn1.ogg diff --git a/sound/piano/Fn2.ogg b/sound/instruments/piano/Fn2.ogg similarity index 100% rename from sound/piano/Fn2.ogg rename to sound/instruments/piano/Fn2.ogg diff --git a/sound/piano/Fn3.ogg b/sound/instruments/piano/Fn3.ogg similarity index 100% rename from sound/piano/Fn3.ogg rename to sound/instruments/piano/Fn3.ogg diff --git a/sound/piano/Fn4.ogg b/sound/instruments/piano/Fn4.ogg similarity index 100% rename from sound/piano/Fn4.ogg rename to sound/instruments/piano/Fn4.ogg diff --git a/sound/piano/Fn5.ogg b/sound/instruments/piano/Fn5.ogg similarity index 100% rename from sound/piano/Fn5.ogg rename to sound/instruments/piano/Fn5.ogg diff --git a/sound/piano/Fn6.ogg b/sound/instruments/piano/Fn6.ogg similarity index 100% rename from sound/piano/Fn6.ogg rename to sound/instruments/piano/Fn6.ogg diff --git a/sound/piano/Fn7.ogg b/sound/instruments/piano/Fn7.ogg similarity index 100% rename from sound/piano/Fn7.ogg rename to sound/instruments/piano/Fn7.ogg diff --git a/sound/piano/Fn8.ogg b/sound/instruments/piano/Fn8.ogg similarity index 100% rename from sound/piano/Fn8.ogg rename to sound/instruments/piano/Fn8.ogg diff --git a/sound/piano/Gb1.ogg b/sound/instruments/piano/Gb1.ogg similarity index 100% rename from sound/piano/Gb1.ogg rename to sound/instruments/piano/Gb1.ogg diff --git a/sound/piano/Gb2.ogg b/sound/instruments/piano/Gb2.ogg similarity index 100% rename from sound/piano/Gb2.ogg rename to sound/instruments/piano/Gb2.ogg diff --git a/sound/piano/Gb3.ogg b/sound/instruments/piano/Gb3.ogg similarity index 100% rename from sound/piano/Gb3.ogg rename to sound/instruments/piano/Gb3.ogg diff --git a/sound/piano/Gb4.ogg b/sound/instruments/piano/Gb4.ogg similarity index 100% rename from sound/piano/Gb4.ogg rename to sound/instruments/piano/Gb4.ogg diff --git a/sound/piano/Gb5.ogg b/sound/instruments/piano/Gb5.ogg similarity index 100% rename from sound/piano/Gb5.ogg rename to sound/instruments/piano/Gb5.ogg diff --git a/sound/piano/Gb6.ogg b/sound/instruments/piano/Gb6.ogg similarity index 100% rename from sound/piano/Gb6.ogg rename to sound/instruments/piano/Gb6.ogg diff --git a/sound/piano/Gb7.ogg b/sound/instruments/piano/Gb7.ogg similarity index 100% rename from sound/piano/Gb7.ogg rename to sound/instruments/piano/Gb7.ogg diff --git a/sound/piano/Gb8.ogg b/sound/instruments/piano/Gb8.ogg similarity index 100% rename from sound/piano/Gb8.ogg rename to sound/instruments/piano/Gb8.ogg diff --git a/sound/piano/Gn1.ogg b/sound/instruments/piano/Gn1.ogg similarity index 100% rename from sound/piano/Gn1.ogg rename to sound/instruments/piano/Gn1.ogg diff --git a/sound/piano/Gn2.ogg b/sound/instruments/piano/Gn2.ogg similarity index 100% rename from sound/piano/Gn2.ogg rename to sound/instruments/piano/Gn2.ogg diff --git a/sound/piano/Gn3.ogg b/sound/instruments/piano/Gn3.ogg similarity index 100% rename from sound/piano/Gn3.ogg rename to sound/instruments/piano/Gn3.ogg diff --git a/sound/piano/Gn4.ogg b/sound/instruments/piano/Gn4.ogg similarity index 100% rename from sound/piano/Gn4.ogg rename to sound/instruments/piano/Gn4.ogg diff --git a/sound/piano/Gn5.ogg b/sound/instruments/piano/Gn5.ogg similarity index 100% rename from sound/piano/Gn5.ogg rename to sound/instruments/piano/Gn5.ogg diff --git a/sound/piano/Gn6.ogg b/sound/instruments/piano/Gn6.ogg similarity index 100% rename from sound/piano/Gn6.ogg rename to sound/instruments/piano/Gn6.ogg diff --git a/sound/piano/Gn7.ogg b/sound/instruments/piano/Gn7.ogg similarity index 100% rename from sound/piano/Gn7.ogg rename to sound/instruments/piano/Gn7.ogg diff --git a/sound/piano/Gn8.ogg b/sound/instruments/piano/Gn8.ogg similarity index 100% rename from sound/piano/Gn8.ogg rename to sound/instruments/piano/Gn8.ogg diff --git a/sound/instruments/recorder/Ab2.mid b/sound/instruments/recorder/Ab2.mid new file mode 100644 index 00000000000..2fb39fa140b Binary files /dev/null and b/sound/instruments/recorder/Ab2.mid differ diff --git a/sound/instruments/recorder/Ab3.mid b/sound/instruments/recorder/Ab3.mid new file mode 100644 index 00000000000..7a04ef76019 Binary files /dev/null and b/sound/instruments/recorder/Ab3.mid differ diff --git a/sound/instruments/recorder/Ab4.mid b/sound/instruments/recorder/Ab4.mid new file mode 100644 index 00000000000..93e51322a02 Binary files /dev/null and b/sound/instruments/recorder/Ab4.mid differ diff --git a/sound/instruments/recorder/Ab5.mid b/sound/instruments/recorder/Ab5.mid new file mode 100644 index 00000000000..ad91ee6e0a3 Binary files /dev/null and b/sound/instruments/recorder/Ab5.mid differ diff --git a/sound/instruments/recorder/Ab6.mid b/sound/instruments/recorder/Ab6.mid new file mode 100644 index 00000000000..3376b0c0ee6 Binary files /dev/null and b/sound/instruments/recorder/Ab6.mid differ diff --git a/sound/instruments/recorder/An2.mid b/sound/instruments/recorder/An2.mid new file mode 100644 index 00000000000..d9e9c0e4c3c Binary files /dev/null and b/sound/instruments/recorder/An2.mid differ diff --git a/sound/instruments/recorder/An3.mid b/sound/instruments/recorder/An3.mid new file mode 100644 index 00000000000..91aa5c253c7 Binary files /dev/null and b/sound/instruments/recorder/An3.mid differ diff --git a/sound/instruments/recorder/An4.mid b/sound/instruments/recorder/An4.mid new file mode 100644 index 00000000000..bbfba81a4a7 Binary files /dev/null and b/sound/instruments/recorder/An4.mid differ diff --git a/sound/instruments/recorder/An5.mid b/sound/instruments/recorder/An5.mid new file mode 100644 index 00000000000..ab73190d684 Binary files /dev/null and b/sound/instruments/recorder/An5.mid differ diff --git a/sound/instruments/recorder/An6.mid b/sound/instruments/recorder/An6.mid new file mode 100644 index 00000000000..8417f2916ff Binary files /dev/null and b/sound/instruments/recorder/An6.mid differ diff --git a/sound/instruments/recorder/Bb2.mid b/sound/instruments/recorder/Bb2.mid new file mode 100644 index 00000000000..9ec20e3d2f3 Binary files /dev/null and b/sound/instruments/recorder/Bb2.mid differ diff --git a/sound/instruments/recorder/Bb3.mid b/sound/instruments/recorder/Bb3.mid new file mode 100644 index 00000000000..bd6fc036e99 Binary files /dev/null and b/sound/instruments/recorder/Bb3.mid differ diff --git a/sound/instruments/recorder/Bb4.mid b/sound/instruments/recorder/Bb4.mid new file mode 100644 index 00000000000..48f9db73fa0 Binary files /dev/null and b/sound/instruments/recorder/Bb4.mid differ diff --git a/sound/instruments/recorder/Bb5.mid b/sound/instruments/recorder/Bb5.mid new file mode 100644 index 00000000000..20ffe453eba Binary files /dev/null and b/sound/instruments/recorder/Bb5.mid differ diff --git a/sound/instruments/recorder/Bb6.mid b/sound/instruments/recorder/Bb6.mid new file mode 100644 index 00000000000..954c1c20793 Binary files /dev/null and b/sound/instruments/recorder/Bb6.mid differ diff --git a/sound/instruments/recorder/Bn2.mid b/sound/instruments/recorder/Bn2.mid new file mode 100644 index 00000000000..ca1e63c25b4 Binary files /dev/null and b/sound/instruments/recorder/Bn2.mid differ diff --git a/sound/instruments/recorder/Bn3.mid b/sound/instruments/recorder/Bn3.mid new file mode 100644 index 00000000000..11b0c2fe374 Binary files /dev/null and b/sound/instruments/recorder/Bn3.mid differ diff --git a/sound/instruments/recorder/Bn4.mid b/sound/instruments/recorder/Bn4.mid new file mode 100644 index 00000000000..5b11df50ffd Binary files /dev/null and b/sound/instruments/recorder/Bn4.mid differ diff --git a/sound/instruments/recorder/Bn5.mid b/sound/instruments/recorder/Bn5.mid new file mode 100644 index 00000000000..b353150df85 Binary files /dev/null and b/sound/instruments/recorder/Bn5.mid differ diff --git a/sound/instruments/recorder/Bn6.mid b/sound/instruments/recorder/Bn6.mid new file mode 100644 index 00000000000..cf69ce6d21d Binary files /dev/null and b/sound/instruments/recorder/Bn6.mid differ diff --git a/sound/instruments/recorder/Cn2.mid b/sound/instruments/recorder/Cn2.mid new file mode 100644 index 00000000000..858ec955afd Binary files /dev/null and b/sound/instruments/recorder/Cn2.mid differ diff --git a/sound/instruments/recorder/Cn3.mid b/sound/instruments/recorder/Cn3.mid new file mode 100644 index 00000000000..2c65b49f741 Binary files /dev/null and b/sound/instruments/recorder/Cn3.mid differ diff --git a/sound/instruments/recorder/Cn4.mid b/sound/instruments/recorder/Cn4.mid new file mode 100644 index 00000000000..9fc1fd5b5a8 Binary files /dev/null and b/sound/instruments/recorder/Cn4.mid differ diff --git a/sound/instruments/recorder/Cn5.mid b/sound/instruments/recorder/Cn5.mid new file mode 100644 index 00000000000..6a86a7e06f1 Binary files /dev/null and b/sound/instruments/recorder/Cn5.mid differ diff --git a/sound/instruments/recorder/Cn6.mid b/sound/instruments/recorder/Cn6.mid new file mode 100644 index 00000000000..43355e27c31 Binary files /dev/null and b/sound/instruments/recorder/Cn6.mid differ diff --git a/sound/instruments/recorder/Cn7.mid b/sound/instruments/recorder/Cn7.mid new file mode 100644 index 00000000000..ff5e08b0e5d Binary files /dev/null and b/sound/instruments/recorder/Cn7.mid differ diff --git a/sound/instruments/recorder/Db2.mid b/sound/instruments/recorder/Db2.mid new file mode 100644 index 00000000000..1ac1299e6dd Binary files /dev/null and b/sound/instruments/recorder/Db2.mid differ diff --git a/sound/instruments/recorder/Db3.mid b/sound/instruments/recorder/Db3.mid new file mode 100644 index 00000000000..7a45bdc91b8 Binary files /dev/null and b/sound/instruments/recorder/Db3.mid differ diff --git a/sound/instruments/recorder/Db4.mid b/sound/instruments/recorder/Db4.mid new file mode 100644 index 00000000000..6dca8557091 Binary files /dev/null and b/sound/instruments/recorder/Db4.mid differ diff --git a/sound/instruments/recorder/Db5.mid b/sound/instruments/recorder/Db5.mid new file mode 100644 index 00000000000..5d83733262a Binary files /dev/null and b/sound/instruments/recorder/Db5.mid differ diff --git a/sound/instruments/recorder/Db6.mid b/sound/instruments/recorder/Db6.mid new file mode 100644 index 00000000000..3f45f77bcd2 Binary files /dev/null and b/sound/instruments/recorder/Db6.mid differ diff --git a/sound/instruments/recorder/Db7.mid b/sound/instruments/recorder/Db7.mid new file mode 100644 index 00000000000..d326ab7bd1a Binary files /dev/null and b/sound/instruments/recorder/Db7.mid differ diff --git a/sound/instruments/recorder/Dn2.mid b/sound/instruments/recorder/Dn2.mid new file mode 100644 index 00000000000..8ddef0e0d04 Binary files /dev/null and b/sound/instruments/recorder/Dn2.mid differ diff --git a/sound/instruments/recorder/Dn3.mid b/sound/instruments/recorder/Dn3.mid new file mode 100644 index 00000000000..b11ff85aab5 Binary files /dev/null and b/sound/instruments/recorder/Dn3.mid differ diff --git a/sound/instruments/recorder/Dn4.mid b/sound/instruments/recorder/Dn4.mid new file mode 100644 index 00000000000..ae877932997 Binary files /dev/null and b/sound/instruments/recorder/Dn4.mid differ diff --git a/sound/instruments/recorder/Dn5.mid b/sound/instruments/recorder/Dn5.mid new file mode 100644 index 00000000000..440da3c7781 Binary files /dev/null and b/sound/instruments/recorder/Dn5.mid differ diff --git a/sound/instruments/recorder/Dn6.mid b/sound/instruments/recorder/Dn6.mid new file mode 100644 index 00000000000..d96623529fd Binary files /dev/null and b/sound/instruments/recorder/Dn6.mid differ diff --git a/sound/instruments/recorder/Eb2.mid b/sound/instruments/recorder/Eb2.mid new file mode 100644 index 00000000000..5e5b8385f96 Binary files /dev/null and b/sound/instruments/recorder/Eb2.mid differ diff --git a/sound/instruments/recorder/Eb3.mid b/sound/instruments/recorder/Eb3.mid new file mode 100644 index 00000000000..8a907f6ebfe Binary files /dev/null and b/sound/instruments/recorder/Eb3.mid differ diff --git a/sound/instruments/recorder/Eb4.mid b/sound/instruments/recorder/Eb4.mid new file mode 100644 index 00000000000..4cf1c0ed28c Binary files /dev/null and b/sound/instruments/recorder/Eb4.mid differ diff --git a/sound/instruments/recorder/Eb5.mid b/sound/instruments/recorder/Eb5.mid new file mode 100644 index 00000000000..ea7c8983d38 Binary files /dev/null and b/sound/instruments/recorder/Eb5.mid differ diff --git a/sound/instruments/recorder/Eb6.mid b/sound/instruments/recorder/Eb6.mid new file mode 100644 index 00000000000..0c477b65fdc Binary files /dev/null and b/sound/instruments/recorder/Eb6.mid differ diff --git a/sound/instruments/recorder/En2.mid b/sound/instruments/recorder/En2.mid new file mode 100644 index 00000000000..ff9a551a8e0 Binary files /dev/null and b/sound/instruments/recorder/En2.mid differ diff --git a/sound/instruments/recorder/En3.mid b/sound/instruments/recorder/En3.mid new file mode 100644 index 00000000000..fd192ab704f Binary files /dev/null and b/sound/instruments/recorder/En3.mid differ diff --git a/sound/instruments/recorder/En4.mid b/sound/instruments/recorder/En4.mid new file mode 100644 index 00000000000..77c01ec6471 Binary files /dev/null and b/sound/instruments/recorder/En4.mid differ diff --git a/sound/instruments/recorder/En5.mid b/sound/instruments/recorder/En5.mid new file mode 100644 index 00000000000..be74f3f0972 Binary files /dev/null and b/sound/instruments/recorder/En5.mid differ diff --git a/sound/instruments/recorder/En6.mid b/sound/instruments/recorder/En6.mid new file mode 100644 index 00000000000..95365e9a264 Binary files /dev/null and b/sound/instruments/recorder/En6.mid differ diff --git a/sound/instruments/recorder/Fn2.mid b/sound/instruments/recorder/Fn2.mid new file mode 100644 index 00000000000..3a2563ea2ce Binary files /dev/null and b/sound/instruments/recorder/Fn2.mid differ diff --git a/sound/instruments/recorder/Fn3.mid b/sound/instruments/recorder/Fn3.mid new file mode 100644 index 00000000000..3114cce6d81 Binary files /dev/null and b/sound/instruments/recorder/Fn3.mid differ diff --git a/sound/instruments/recorder/Fn4.mid b/sound/instruments/recorder/Fn4.mid new file mode 100644 index 00000000000..012754e474c Binary files /dev/null and b/sound/instruments/recorder/Fn4.mid differ diff --git a/sound/instruments/recorder/Fn5.mid b/sound/instruments/recorder/Fn5.mid new file mode 100644 index 00000000000..83a83cc62e9 Binary files /dev/null and b/sound/instruments/recorder/Fn5.mid differ diff --git a/sound/instruments/recorder/Fn6.mid b/sound/instruments/recorder/Fn6.mid new file mode 100644 index 00000000000..9e7fbf85280 Binary files /dev/null and b/sound/instruments/recorder/Fn6.mid differ diff --git a/sound/instruments/recorder/Gb2.mid b/sound/instruments/recorder/Gb2.mid new file mode 100644 index 00000000000..639ea8a2d00 Binary files /dev/null and b/sound/instruments/recorder/Gb2.mid differ diff --git a/sound/instruments/recorder/Gb3.mid b/sound/instruments/recorder/Gb3.mid new file mode 100644 index 00000000000..b5b10b4993a Binary files /dev/null and b/sound/instruments/recorder/Gb3.mid differ diff --git a/sound/instruments/recorder/Gb4.mid b/sound/instruments/recorder/Gb4.mid new file mode 100644 index 00000000000..4fdf67d9b99 Binary files /dev/null and b/sound/instruments/recorder/Gb4.mid differ diff --git a/sound/instruments/recorder/Gb5.mid b/sound/instruments/recorder/Gb5.mid new file mode 100644 index 00000000000..233260ecc17 Binary files /dev/null and b/sound/instruments/recorder/Gb5.mid differ diff --git a/sound/instruments/recorder/Gb6.mid b/sound/instruments/recorder/Gb6.mid new file mode 100644 index 00000000000..d594ae7c956 Binary files /dev/null and b/sound/instruments/recorder/Gb6.mid differ diff --git a/sound/instruments/recorder/Gn2.mid b/sound/instruments/recorder/Gn2.mid new file mode 100644 index 00000000000..2786935b6d2 Binary files /dev/null and b/sound/instruments/recorder/Gn2.mid differ diff --git a/sound/instruments/recorder/Gn3.mid b/sound/instruments/recorder/Gn3.mid new file mode 100644 index 00000000000..d1aae368ab4 Binary files /dev/null and b/sound/instruments/recorder/Gn3.mid differ diff --git a/sound/instruments/recorder/Gn4.mid b/sound/instruments/recorder/Gn4.mid new file mode 100644 index 00000000000..3308c871d48 Binary files /dev/null and b/sound/instruments/recorder/Gn4.mid differ diff --git a/sound/instruments/recorder/Gn5.mid b/sound/instruments/recorder/Gn5.mid new file mode 100644 index 00000000000..a46440992c8 Binary files /dev/null and b/sound/instruments/recorder/Gn5.mid differ diff --git a/sound/instruments/recorder/Gn6.mid b/sound/instruments/recorder/Gn6.mid new file mode 100644 index 00000000000..0f84be6cdc7 Binary files /dev/null and b/sound/instruments/recorder/Gn6.mid differ diff --git a/sound/instruments/saxophone/Ab2.mid b/sound/instruments/saxophone/Ab2.mid new file mode 100644 index 00000000000..3408aba1316 Binary files /dev/null and b/sound/instruments/saxophone/Ab2.mid differ diff --git a/sound/instruments/saxophone/Ab3.mid b/sound/instruments/saxophone/Ab3.mid new file mode 100644 index 00000000000..e469c51b65b Binary files /dev/null and b/sound/instruments/saxophone/Ab3.mid differ diff --git a/sound/instruments/saxophone/Ab4.mid b/sound/instruments/saxophone/Ab4.mid new file mode 100644 index 00000000000..6ee2a9e41be Binary files /dev/null and b/sound/instruments/saxophone/Ab4.mid differ diff --git a/sound/instruments/saxophone/Ab5.mid b/sound/instruments/saxophone/Ab5.mid new file mode 100644 index 00000000000..40b60e31715 Binary files /dev/null and b/sound/instruments/saxophone/Ab5.mid differ diff --git a/sound/instruments/saxophone/Ab6.mid b/sound/instruments/saxophone/Ab6.mid new file mode 100644 index 00000000000..d38a8a6c714 Binary files /dev/null and b/sound/instruments/saxophone/Ab6.mid differ diff --git a/sound/instruments/saxophone/An2.mid b/sound/instruments/saxophone/An2.mid new file mode 100644 index 00000000000..d481ec5a450 Binary files /dev/null and b/sound/instruments/saxophone/An2.mid differ diff --git a/sound/instruments/saxophone/An3.mid b/sound/instruments/saxophone/An3.mid new file mode 100644 index 00000000000..744579fb4b6 Binary files /dev/null and b/sound/instruments/saxophone/An3.mid differ diff --git a/sound/instruments/saxophone/An4.mid b/sound/instruments/saxophone/An4.mid new file mode 100644 index 00000000000..1885ad32228 Binary files /dev/null and b/sound/instruments/saxophone/An4.mid differ diff --git a/sound/instruments/saxophone/An5.mid b/sound/instruments/saxophone/An5.mid new file mode 100644 index 00000000000..23cf20713cf Binary files /dev/null and b/sound/instruments/saxophone/An5.mid differ diff --git a/sound/instruments/saxophone/An6.mid b/sound/instruments/saxophone/An6.mid new file mode 100644 index 00000000000..0c94d822557 Binary files /dev/null and b/sound/instruments/saxophone/An6.mid differ diff --git a/sound/instruments/saxophone/Bb2.mid b/sound/instruments/saxophone/Bb2.mid new file mode 100644 index 00000000000..d30855aaee1 Binary files /dev/null and b/sound/instruments/saxophone/Bb2.mid differ diff --git a/sound/instruments/saxophone/Bb3.mid b/sound/instruments/saxophone/Bb3.mid new file mode 100644 index 00000000000..2354e4c3e87 Binary files /dev/null and b/sound/instruments/saxophone/Bb3.mid differ diff --git a/sound/instruments/saxophone/Bb4.mid b/sound/instruments/saxophone/Bb4.mid new file mode 100644 index 00000000000..5ac9de9585d Binary files /dev/null and b/sound/instruments/saxophone/Bb4.mid differ diff --git a/sound/instruments/saxophone/Bb5.mid b/sound/instruments/saxophone/Bb5.mid new file mode 100644 index 00000000000..347560269eb Binary files /dev/null and b/sound/instruments/saxophone/Bb5.mid differ diff --git a/sound/instruments/saxophone/Bb6.mid b/sound/instruments/saxophone/Bb6.mid new file mode 100644 index 00000000000..335a8df26c3 Binary files /dev/null and b/sound/instruments/saxophone/Bb6.mid differ diff --git a/sound/instruments/saxophone/Bn2.mid b/sound/instruments/saxophone/Bn2.mid new file mode 100644 index 00000000000..9f215b5c7ce Binary files /dev/null and b/sound/instruments/saxophone/Bn2.mid differ diff --git a/sound/instruments/saxophone/Bn3.mid b/sound/instruments/saxophone/Bn3.mid new file mode 100644 index 00000000000..1d28aca7076 Binary files /dev/null and b/sound/instruments/saxophone/Bn3.mid differ diff --git a/sound/instruments/saxophone/Bn4.mid b/sound/instruments/saxophone/Bn4.mid new file mode 100644 index 00000000000..5c8bdf9775e Binary files /dev/null and b/sound/instruments/saxophone/Bn4.mid differ diff --git a/sound/instruments/saxophone/Bn5.mid b/sound/instruments/saxophone/Bn5.mid new file mode 100644 index 00000000000..e74f1f7415c Binary files /dev/null and b/sound/instruments/saxophone/Bn5.mid differ diff --git a/sound/instruments/saxophone/Bn6.mid b/sound/instruments/saxophone/Bn6.mid new file mode 100644 index 00000000000..59d6e12a145 Binary files /dev/null and b/sound/instruments/saxophone/Bn6.mid differ diff --git a/sound/instruments/saxophone/Cn2.mid b/sound/instruments/saxophone/Cn2.mid new file mode 100644 index 00000000000..7a816e603b8 Binary files /dev/null and b/sound/instruments/saxophone/Cn2.mid differ diff --git a/sound/instruments/saxophone/Cn3.mid b/sound/instruments/saxophone/Cn3.mid new file mode 100644 index 00000000000..1a575b087dc Binary files /dev/null and b/sound/instruments/saxophone/Cn3.mid differ diff --git a/sound/instruments/saxophone/Cn4.mid b/sound/instruments/saxophone/Cn4.mid new file mode 100644 index 00000000000..56377f1aed9 Binary files /dev/null and b/sound/instruments/saxophone/Cn4.mid differ diff --git a/sound/instruments/saxophone/Cn5.mid b/sound/instruments/saxophone/Cn5.mid new file mode 100644 index 00000000000..cc023521272 Binary files /dev/null and b/sound/instruments/saxophone/Cn5.mid differ diff --git a/sound/instruments/saxophone/Cn6.mid b/sound/instruments/saxophone/Cn6.mid new file mode 100644 index 00000000000..ed149684846 Binary files /dev/null and b/sound/instruments/saxophone/Cn6.mid differ diff --git a/sound/instruments/saxophone/Db2.mid b/sound/instruments/saxophone/Db2.mid new file mode 100644 index 00000000000..3ccbf59863c Binary files /dev/null and b/sound/instruments/saxophone/Db2.mid differ diff --git a/sound/instruments/saxophone/Db3.mid b/sound/instruments/saxophone/Db3.mid new file mode 100644 index 00000000000..0d10fa08d80 Binary files /dev/null and b/sound/instruments/saxophone/Db3.mid differ diff --git a/sound/instruments/saxophone/Db4.mid b/sound/instruments/saxophone/Db4.mid new file mode 100644 index 00000000000..2684d9bd02d Binary files /dev/null and b/sound/instruments/saxophone/Db4.mid differ diff --git a/sound/instruments/saxophone/Db5.mid b/sound/instruments/saxophone/Db5.mid new file mode 100644 index 00000000000..8380516db07 Binary files /dev/null and b/sound/instruments/saxophone/Db5.mid differ diff --git a/sound/instruments/saxophone/Db6.mid b/sound/instruments/saxophone/Db6.mid new file mode 100644 index 00000000000..29f95c9e0c8 Binary files /dev/null and b/sound/instruments/saxophone/Db6.mid differ diff --git a/sound/instruments/saxophone/Dn2.mid b/sound/instruments/saxophone/Dn2.mid new file mode 100644 index 00000000000..19cf21557b4 Binary files /dev/null and b/sound/instruments/saxophone/Dn2.mid differ diff --git a/sound/instruments/saxophone/Dn3.mid b/sound/instruments/saxophone/Dn3.mid new file mode 100644 index 00000000000..24077502dd0 Binary files /dev/null and b/sound/instruments/saxophone/Dn3.mid differ diff --git a/sound/instruments/saxophone/Dn4.mid b/sound/instruments/saxophone/Dn4.mid new file mode 100644 index 00000000000..5208e98b43f Binary files /dev/null and b/sound/instruments/saxophone/Dn4.mid differ diff --git a/sound/instruments/saxophone/Dn5.mid b/sound/instruments/saxophone/Dn5.mid new file mode 100644 index 00000000000..cb40d8ca9c2 Binary files /dev/null and b/sound/instruments/saxophone/Dn5.mid differ diff --git a/sound/instruments/saxophone/Dn6.mid b/sound/instruments/saxophone/Dn6.mid new file mode 100644 index 00000000000..f18bcbb6d7a Binary files /dev/null and b/sound/instruments/saxophone/Dn6.mid differ diff --git a/sound/instruments/saxophone/Eb2.mid b/sound/instruments/saxophone/Eb2.mid new file mode 100644 index 00000000000..967622de3f0 Binary files /dev/null and b/sound/instruments/saxophone/Eb2.mid differ diff --git a/sound/instruments/saxophone/Eb3.mid b/sound/instruments/saxophone/Eb3.mid new file mode 100644 index 00000000000..160ed39a06b Binary files /dev/null and b/sound/instruments/saxophone/Eb3.mid differ diff --git a/sound/instruments/saxophone/Eb4.mid b/sound/instruments/saxophone/Eb4.mid new file mode 100644 index 00000000000..f125b54a120 Binary files /dev/null and b/sound/instruments/saxophone/Eb4.mid differ diff --git a/sound/instruments/saxophone/Eb5.mid b/sound/instruments/saxophone/Eb5.mid new file mode 100644 index 00000000000..7cde98bb88f Binary files /dev/null and b/sound/instruments/saxophone/Eb5.mid differ diff --git a/sound/instruments/saxophone/Eb6.mid b/sound/instruments/saxophone/Eb6.mid new file mode 100644 index 00000000000..f1804b61657 Binary files /dev/null and b/sound/instruments/saxophone/Eb6.mid differ diff --git a/sound/instruments/saxophone/En2.mid b/sound/instruments/saxophone/En2.mid new file mode 100644 index 00000000000..5f8168a3cbd Binary files /dev/null and b/sound/instruments/saxophone/En2.mid differ diff --git a/sound/instruments/saxophone/En3.mid b/sound/instruments/saxophone/En3.mid new file mode 100644 index 00000000000..1762e61de97 Binary files /dev/null and b/sound/instruments/saxophone/En3.mid differ diff --git a/sound/instruments/saxophone/En4.mid b/sound/instruments/saxophone/En4.mid new file mode 100644 index 00000000000..0304e520a0f Binary files /dev/null and b/sound/instruments/saxophone/En4.mid differ diff --git a/sound/instruments/saxophone/En5.mid b/sound/instruments/saxophone/En5.mid new file mode 100644 index 00000000000..40d32ab74ac Binary files /dev/null and b/sound/instruments/saxophone/En5.mid differ diff --git a/sound/instruments/saxophone/En6.mid b/sound/instruments/saxophone/En6.mid new file mode 100644 index 00000000000..5bdd835c5c4 Binary files /dev/null and b/sound/instruments/saxophone/En6.mid differ diff --git a/sound/instruments/saxophone/Fn2.mid b/sound/instruments/saxophone/Fn2.mid new file mode 100644 index 00000000000..9260b884d8a Binary files /dev/null and b/sound/instruments/saxophone/Fn2.mid differ diff --git a/sound/instruments/saxophone/Fn3.mid b/sound/instruments/saxophone/Fn3.mid new file mode 100644 index 00000000000..fb22409dcc8 Binary files /dev/null and b/sound/instruments/saxophone/Fn3.mid differ diff --git a/sound/instruments/saxophone/Fn4.mid b/sound/instruments/saxophone/Fn4.mid new file mode 100644 index 00000000000..fb4ffd3a593 Binary files /dev/null and b/sound/instruments/saxophone/Fn4.mid differ diff --git a/sound/instruments/saxophone/Fn5.mid b/sound/instruments/saxophone/Fn5.mid new file mode 100644 index 00000000000..9b7241e59e3 Binary files /dev/null and b/sound/instruments/saxophone/Fn5.mid differ diff --git a/sound/instruments/saxophone/Fn6.mid b/sound/instruments/saxophone/Fn6.mid new file mode 100644 index 00000000000..c402032321a Binary files /dev/null and b/sound/instruments/saxophone/Fn6.mid differ diff --git a/sound/instruments/saxophone/Gb2.mid b/sound/instruments/saxophone/Gb2.mid new file mode 100644 index 00000000000..2a872b5dec5 Binary files /dev/null and b/sound/instruments/saxophone/Gb2.mid differ diff --git a/sound/instruments/saxophone/Gb3.mid b/sound/instruments/saxophone/Gb3.mid new file mode 100644 index 00000000000..5e5e5322826 Binary files /dev/null and b/sound/instruments/saxophone/Gb3.mid differ diff --git a/sound/instruments/saxophone/Gb4.mid b/sound/instruments/saxophone/Gb4.mid new file mode 100644 index 00000000000..758125de3e6 Binary files /dev/null and b/sound/instruments/saxophone/Gb4.mid differ diff --git a/sound/instruments/saxophone/Gb5.mid b/sound/instruments/saxophone/Gb5.mid new file mode 100644 index 00000000000..4afd8c65c90 Binary files /dev/null and b/sound/instruments/saxophone/Gb5.mid differ diff --git a/sound/instruments/saxophone/Gb6.mid b/sound/instruments/saxophone/Gb6.mid new file mode 100644 index 00000000000..a8f1d2107e4 Binary files /dev/null and b/sound/instruments/saxophone/Gb6.mid differ diff --git a/sound/instruments/saxophone/Gn2.mid b/sound/instruments/saxophone/Gn2.mid new file mode 100644 index 00000000000..750be55f685 Binary files /dev/null and b/sound/instruments/saxophone/Gn2.mid differ diff --git a/sound/instruments/saxophone/Gn4.mid b/sound/instruments/saxophone/Gn4.mid new file mode 100644 index 00000000000..2892048d15e Binary files /dev/null and b/sound/instruments/saxophone/Gn4.mid differ diff --git a/sound/instruments/saxophone/Gn5.mid b/sound/instruments/saxophone/Gn5.mid new file mode 100644 index 00000000000..8ef4ceffe0d Binary files /dev/null and b/sound/instruments/saxophone/Gn5.mid differ diff --git a/sound/instruments/saxophone/Gn6.mid b/sound/instruments/saxophone/Gn6.mid new file mode 100644 index 00000000000..26cbd145668 Binary files /dev/null and b/sound/instruments/saxophone/Gn6.mid differ diff --git a/sound/instruments/trombone/Ab2.mid b/sound/instruments/trombone/Ab2.mid new file mode 100644 index 00000000000..5802027e672 Binary files /dev/null and b/sound/instruments/trombone/Ab2.mid differ diff --git a/sound/instruments/trombone/Ab3.mid b/sound/instruments/trombone/Ab3.mid new file mode 100644 index 00000000000..9e6dc5559f2 Binary files /dev/null and b/sound/instruments/trombone/Ab3.mid differ diff --git a/sound/instruments/trombone/Ab4.mid b/sound/instruments/trombone/Ab4.mid new file mode 100644 index 00000000000..b5bcb5fc93d Binary files /dev/null and b/sound/instruments/trombone/Ab4.mid differ diff --git a/sound/instruments/trombone/Ab5.mid b/sound/instruments/trombone/Ab5.mid new file mode 100644 index 00000000000..e42b8f6f6f1 Binary files /dev/null and b/sound/instruments/trombone/Ab5.mid differ diff --git a/sound/instruments/trombone/Ab6.mid b/sound/instruments/trombone/Ab6.mid new file mode 100644 index 00000000000..40d6d6b7b92 Binary files /dev/null and b/sound/instruments/trombone/Ab6.mid differ diff --git a/sound/instruments/trombone/An2.mid b/sound/instruments/trombone/An2.mid new file mode 100644 index 00000000000..30523e3cc3d Binary files /dev/null and b/sound/instruments/trombone/An2.mid differ diff --git a/sound/instruments/trombone/An3.mid b/sound/instruments/trombone/An3.mid new file mode 100644 index 00000000000..05d4d28e2e4 Binary files /dev/null and b/sound/instruments/trombone/An3.mid differ diff --git a/sound/instruments/trombone/An4.mid b/sound/instruments/trombone/An4.mid new file mode 100644 index 00000000000..99d1a22bc72 Binary files /dev/null and b/sound/instruments/trombone/An4.mid differ diff --git a/sound/instruments/trombone/An5.mid b/sound/instruments/trombone/An5.mid new file mode 100644 index 00000000000..99978bf4bdc Binary files /dev/null and b/sound/instruments/trombone/An5.mid differ diff --git a/sound/instruments/trombone/An6.mid b/sound/instruments/trombone/An6.mid new file mode 100644 index 00000000000..11e6557fe82 Binary files /dev/null and b/sound/instruments/trombone/An6.mid differ diff --git a/sound/instruments/trombone/Bb2.mid b/sound/instruments/trombone/Bb2.mid new file mode 100644 index 00000000000..e1068d551c1 Binary files /dev/null and b/sound/instruments/trombone/Bb2.mid differ diff --git a/sound/instruments/trombone/Bb3.mid b/sound/instruments/trombone/Bb3.mid new file mode 100644 index 00000000000..ce9a57613f0 Binary files /dev/null and b/sound/instruments/trombone/Bb3.mid differ diff --git a/sound/instruments/trombone/Bb4.mid b/sound/instruments/trombone/Bb4.mid new file mode 100644 index 00000000000..5dfdf26ec5d Binary files /dev/null and b/sound/instruments/trombone/Bb4.mid differ diff --git a/sound/instruments/trombone/Bb5.mid b/sound/instruments/trombone/Bb5.mid new file mode 100644 index 00000000000..ea74dc444b9 Binary files /dev/null and b/sound/instruments/trombone/Bb5.mid differ diff --git a/sound/instruments/trombone/Bb6.mid b/sound/instruments/trombone/Bb6.mid new file mode 100644 index 00000000000..e30707df542 Binary files /dev/null and b/sound/instruments/trombone/Bb6.mid differ diff --git a/sound/instruments/trombone/Bn2.mid b/sound/instruments/trombone/Bn2.mid new file mode 100644 index 00000000000..7c89dff091c Binary files /dev/null and b/sound/instruments/trombone/Bn2.mid differ diff --git a/sound/instruments/trombone/Bn3.mid b/sound/instruments/trombone/Bn3.mid new file mode 100644 index 00000000000..df92f0e4e32 Binary files /dev/null and b/sound/instruments/trombone/Bn3.mid differ diff --git a/sound/instruments/trombone/Bn4.mid b/sound/instruments/trombone/Bn4.mid new file mode 100644 index 00000000000..c46cb4d6a78 Binary files /dev/null and b/sound/instruments/trombone/Bn4.mid differ diff --git a/sound/instruments/trombone/Bn5.mid b/sound/instruments/trombone/Bn5.mid new file mode 100644 index 00000000000..f09d981ac05 Binary files /dev/null and b/sound/instruments/trombone/Bn5.mid differ diff --git a/sound/instruments/trombone/Bn6.mid b/sound/instruments/trombone/Bn6.mid new file mode 100644 index 00000000000..c23f2435681 Binary files /dev/null and b/sound/instruments/trombone/Bn6.mid differ diff --git a/sound/instruments/trombone/Cn2.mid b/sound/instruments/trombone/Cn2.mid new file mode 100644 index 00000000000..3a24f39ff91 Binary files /dev/null and b/sound/instruments/trombone/Cn2.mid differ diff --git a/sound/instruments/trombone/Cn3.mid b/sound/instruments/trombone/Cn3.mid new file mode 100644 index 00000000000..d24dd658b66 Binary files /dev/null and b/sound/instruments/trombone/Cn3.mid differ diff --git a/sound/instruments/trombone/Cn4.mid b/sound/instruments/trombone/Cn4.mid new file mode 100644 index 00000000000..756ba0ab8d2 Binary files /dev/null and b/sound/instruments/trombone/Cn4.mid differ diff --git a/sound/instruments/trombone/Cn5.mid b/sound/instruments/trombone/Cn5.mid new file mode 100644 index 00000000000..3d5d0a3446d Binary files /dev/null and b/sound/instruments/trombone/Cn5.mid differ diff --git a/sound/instruments/trombone/Cn6.mid b/sound/instruments/trombone/Cn6.mid new file mode 100644 index 00000000000..605eec24ee1 Binary files /dev/null and b/sound/instruments/trombone/Cn6.mid differ diff --git a/sound/instruments/trombone/Db2.mid b/sound/instruments/trombone/Db2.mid new file mode 100644 index 00000000000..ef959df821c Binary files /dev/null and b/sound/instruments/trombone/Db2.mid differ diff --git a/sound/instruments/trombone/Db3.mid b/sound/instruments/trombone/Db3.mid new file mode 100644 index 00000000000..664d67be67d Binary files /dev/null and b/sound/instruments/trombone/Db3.mid differ diff --git a/sound/instruments/trombone/Db4.mid b/sound/instruments/trombone/Db4.mid new file mode 100644 index 00000000000..2b4e028f409 Binary files /dev/null and b/sound/instruments/trombone/Db4.mid differ diff --git a/sound/instruments/trombone/Db5.mid b/sound/instruments/trombone/Db5.mid new file mode 100644 index 00000000000..2748ba3cd4c Binary files /dev/null and b/sound/instruments/trombone/Db5.mid differ diff --git a/sound/instruments/trombone/Db6.mid b/sound/instruments/trombone/Db6.mid new file mode 100644 index 00000000000..d7737f180ac Binary files /dev/null and b/sound/instruments/trombone/Db6.mid differ diff --git a/sound/instruments/trombone/Dn2.mid b/sound/instruments/trombone/Dn2.mid new file mode 100644 index 00000000000..cddd3ce5bd8 Binary files /dev/null and b/sound/instruments/trombone/Dn2.mid differ diff --git a/sound/instruments/trombone/Dn3.mid b/sound/instruments/trombone/Dn3.mid new file mode 100644 index 00000000000..3555246d9d3 Binary files /dev/null and b/sound/instruments/trombone/Dn3.mid differ diff --git a/sound/instruments/trombone/Dn4.mid b/sound/instruments/trombone/Dn4.mid new file mode 100644 index 00000000000..51f80eb7f03 Binary files /dev/null and b/sound/instruments/trombone/Dn4.mid differ diff --git a/sound/instruments/trombone/Dn5.mid b/sound/instruments/trombone/Dn5.mid new file mode 100644 index 00000000000..d91a461b89a Binary files /dev/null and b/sound/instruments/trombone/Dn5.mid differ diff --git a/sound/instruments/trombone/Dn6.mid b/sound/instruments/trombone/Dn6.mid new file mode 100644 index 00000000000..d2dc6f0e217 Binary files /dev/null and b/sound/instruments/trombone/Dn6.mid differ diff --git a/sound/instruments/trombone/Eb2.mid b/sound/instruments/trombone/Eb2.mid new file mode 100644 index 00000000000..7658c914be6 Binary files /dev/null and b/sound/instruments/trombone/Eb2.mid differ diff --git a/sound/instruments/trombone/Eb3.mid b/sound/instruments/trombone/Eb3.mid new file mode 100644 index 00000000000..5d781dd543d Binary files /dev/null and b/sound/instruments/trombone/Eb3.mid differ diff --git a/sound/instruments/trombone/Eb4.mid b/sound/instruments/trombone/Eb4.mid new file mode 100644 index 00000000000..6ee879de04a Binary files /dev/null and b/sound/instruments/trombone/Eb4.mid differ diff --git a/sound/instruments/trombone/Eb5.mid b/sound/instruments/trombone/Eb5.mid new file mode 100644 index 00000000000..a2278114546 Binary files /dev/null and b/sound/instruments/trombone/Eb5.mid differ diff --git a/sound/instruments/trombone/Eb6.mid b/sound/instruments/trombone/Eb6.mid new file mode 100644 index 00000000000..a9ffc37b89b Binary files /dev/null and b/sound/instruments/trombone/Eb6.mid differ diff --git a/sound/instruments/trombone/En2.mid b/sound/instruments/trombone/En2.mid new file mode 100644 index 00000000000..f47e4460a12 Binary files /dev/null and b/sound/instruments/trombone/En2.mid differ diff --git a/sound/instruments/trombone/En3.mid b/sound/instruments/trombone/En3.mid new file mode 100644 index 00000000000..5f78d13af97 Binary files /dev/null and b/sound/instruments/trombone/En3.mid differ diff --git a/sound/instruments/trombone/En4.mid b/sound/instruments/trombone/En4.mid new file mode 100644 index 00000000000..687a503af0b Binary files /dev/null and b/sound/instruments/trombone/En4.mid differ diff --git a/sound/instruments/trombone/En5.mid b/sound/instruments/trombone/En5.mid new file mode 100644 index 00000000000..134bf651b60 Binary files /dev/null and b/sound/instruments/trombone/En5.mid differ diff --git a/sound/instruments/trombone/En6.mid b/sound/instruments/trombone/En6.mid new file mode 100644 index 00000000000..c852475e1b1 Binary files /dev/null and b/sound/instruments/trombone/En6.mid differ diff --git a/sound/instruments/trombone/Fn2.mid b/sound/instruments/trombone/Fn2.mid new file mode 100644 index 00000000000..f9bc985538c Binary files /dev/null and b/sound/instruments/trombone/Fn2.mid differ diff --git a/sound/instruments/trombone/Fn3.mid b/sound/instruments/trombone/Fn3.mid new file mode 100644 index 00000000000..cd5656da075 Binary files /dev/null and b/sound/instruments/trombone/Fn3.mid differ diff --git a/sound/instruments/trombone/Fn4.mid b/sound/instruments/trombone/Fn4.mid new file mode 100644 index 00000000000..c677ade9b17 Binary files /dev/null and b/sound/instruments/trombone/Fn4.mid differ diff --git a/sound/instruments/trombone/Fn5.mid b/sound/instruments/trombone/Fn5.mid new file mode 100644 index 00000000000..f610ce04c6f Binary files /dev/null and b/sound/instruments/trombone/Fn5.mid differ diff --git a/sound/instruments/trombone/Fn6.mid b/sound/instruments/trombone/Fn6.mid new file mode 100644 index 00000000000..07382533cab Binary files /dev/null and b/sound/instruments/trombone/Fn6.mid differ diff --git a/sound/instruments/trombone/Gb2.mid b/sound/instruments/trombone/Gb2.mid new file mode 100644 index 00000000000..d506f40642b Binary files /dev/null and b/sound/instruments/trombone/Gb2.mid differ diff --git a/sound/instruments/trombone/Gb3.mid b/sound/instruments/trombone/Gb3.mid new file mode 100644 index 00000000000..fe18266802c Binary files /dev/null and b/sound/instruments/trombone/Gb3.mid differ diff --git a/sound/instruments/trombone/Gb4.mid b/sound/instruments/trombone/Gb4.mid new file mode 100644 index 00000000000..7a22419215f Binary files /dev/null and b/sound/instruments/trombone/Gb4.mid differ diff --git a/sound/instruments/trombone/Gb5.mid b/sound/instruments/trombone/Gb5.mid new file mode 100644 index 00000000000..7733d574e84 Binary files /dev/null and b/sound/instruments/trombone/Gb5.mid differ diff --git a/sound/instruments/trombone/Gb6.mid b/sound/instruments/trombone/Gb6.mid new file mode 100644 index 00000000000..3a6e4893b4d Binary files /dev/null and b/sound/instruments/trombone/Gb6.mid differ diff --git a/sound/instruments/trombone/Gn2.mid b/sound/instruments/trombone/Gn2.mid new file mode 100644 index 00000000000..cdebb6bc0a3 Binary files /dev/null and b/sound/instruments/trombone/Gn2.mid differ diff --git a/sound/instruments/trombone/Gn3.mid b/sound/instruments/trombone/Gn3.mid new file mode 100644 index 00000000000..8c915effeb3 Binary files /dev/null and b/sound/instruments/trombone/Gn3.mid differ diff --git a/sound/instruments/trombone/Gn4.mid b/sound/instruments/trombone/Gn4.mid new file mode 100644 index 00000000000..1ddcaa30819 Binary files /dev/null and b/sound/instruments/trombone/Gn4.mid differ diff --git a/sound/instruments/trombone/Gn5.mid b/sound/instruments/trombone/Gn5.mid new file mode 100644 index 00000000000..ba787045f01 Binary files /dev/null and b/sound/instruments/trombone/Gn5.mid differ diff --git a/sound/instruments/trombone/Gn6.mid b/sound/instruments/trombone/Gn6.mid new file mode 100644 index 00000000000..b2e6f3f13d6 Binary files /dev/null and b/sound/instruments/trombone/Gn6.mid differ diff --git a/sound/violin/Ab3.ogg b/sound/instruments/violin/Ab3.ogg similarity index 100% rename from sound/violin/Ab3.ogg rename to sound/instruments/violin/Ab3.ogg diff --git a/sound/violin/Ab4.ogg b/sound/instruments/violin/Ab4.ogg similarity index 100% rename from sound/violin/Ab4.ogg rename to sound/instruments/violin/Ab4.ogg diff --git a/sound/violin/Ab5.ogg b/sound/instruments/violin/Ab5.ogg similarity index 100% rename from sound/violin/Ab5.ogg rename to sound/instruments/violin/Ab5.ogg diff --git a/sound/violin/Ab6.ogg b/sound/instruments/violin/Ab6.ogg similarity index 100% rename from sound/violin/Ab6.ogg rename to sound/instruments/violin/Ab6.ogg diff --git a/sound/violin/An3.ogg b/sound/instruments/violin/An3.ogg similarity index 100% rename from sound/violin/An3.ogg rename to sound/instruments/violin/An3.ogg diff --git a/sound/violin/An4.ogg b/sound/instruments/violin/An4.ogg similarity index 100% rename from sound/violin/An4.ogg rename to sound/instruments/violin/An4.ogg diff --git a/sound/violin/An5.ogg b/sound/instruments/violin/An5.ogg similarity index 100% rename from sound/violin/An5.ogg rename to sound/instruments/violin/An5.ogg diff --git a/sound/violin/An6.ogg b/sound/instruments/violin/An6.ogg similarity index 100% rename from sound/violin/An6.ogg rename to sound/instruments/violin/An6.ogg diff --git a/sound/violin/Bb3.ogg b/sound/instruments/violin/Bb3.ogg similarity index 100% rename from sound/violin/Bb3.ogg rename to sound/instruments/violin/Bb3.ogg diff --git a/sound/violin/Bb4.ogg b/sound/instruments/violin/Bb4.ogg similarity index 100% rename from sound/violin/Bb4.ogg rename to sound/instruments/violin/Bb4.ogg diff --git a/sound/violin/Bb5.ogg b/sound/instruments/violin/Bb5.ogg similarity index 100% rename from sound/violin/Bb5.ogg rename to sound/instruments/violin/Bb5.ogg diff --git a/sound/violin/Bb6.ogg b/sound/instruments/violin/Bb6.ogg similarity index 100% rename from sound/violin/Bb6.ogg rename to sound/instruments/violin/Bb6.ogg diff --git a/sound/violin/Bn3.ogg b/sound/instruments/violin/Bn3.ogg similarity index 100% rename from sound/violin/Bn3.ogg rename to sound/instruments/violin/Bn3.ogg diff --git a/sound/violin/Bn4.ogg b/sound/instruments/violin/Bn4.ogg similarity index 100% rename from sound/violin/Bn4.ogg rename to sound/instruments/violin/Bn4.ogg diff --git a/sound/violin/Bn5.ogg b/sound/instruments/violin/Bn5.ogg similarity index 100% rename from sound/violin/Bn5.ogg rename to sound/instruments/violin/Bn5.ogg diff --git a/sound/violin/Bn6.ogg b/sound/instruments/violin/Bn6.ogg similarity index 100% rename from sound/violin/Bn6.ogg rename to sound/instruments/violin/Bn6.ogg diff --git a/sound/violin/Cn4.ogg b/sound/instruments/violin/Cn4.ogg similarity index 100% rename from sound/violin/Cn4.ogg rename to sound/instruments/violin/Cn4.ogg diff --git a/sound/violin/Cn5.ogg b/sound/instruments/violin/Cn5.ogg similarity index 100% rename from sound/violin/Cn5.ogg rename to sound/instruments/violin/Cn5.ogg diff --git a/sound/violin/Cn6.ogg b/sound/instruments/violin/Cn6.ogg similarity index 100% rename from sound/violin/Cn6.ogg rename to sound/instruments/violin/Cn6.ogg diff --git a/sound/violin/Cn7.ogg b/sound/instruments/violin/Cn7.ogg similarity index 100% rename from sound/violin/Cn7.ogg rename to sound/instruments/violin/Cn7.ogg diff --git a/sound/violin/Db4.ogg b/sound/instruments/violin/Db4.ogg similarity index 100% rename from sound/violin/Db4.ogg rename to sound/instruments/violin/Db4.ogg diff --git a/sound/violin/Db5.ogg b/sound/instruments/violin/Db5.ogg similarity index 100% rename from sound/violin/Db5.ogg rename to sound/instruments/violin/Db5.ogg diff --git a/sound/violin/Db6.ogg b/sound/instruments/violin/Db6.ogg similarity index 100% rename from sound/violin/Db6.ogg rename to sound/instruments/violin/Db6.ogg diff --git a/sound/violin/Db7.ogg b/sound/instruments/violin/Db7.ogg similarity index 100% rename from sound/violin/Db7.ogg rename to sound/instruments/violin/Db7.ogg diff --git a/sound/violin/Dn4.ogg b/sound/instruments/violin/Dn4.ogg similarity index 100% rename from sound/violin/Dn4.ogg rename to sound/instruments/violin/Dn4.ogg diff --git a/sound/violin/Dn5.ogg b/sound/instruments/violin/Dn5.ogg similarity index 100% rename from sound/violin/Dn5.ogg rename to sound/instruments/violin/Dn5.ogg diff --git a/sound/violin/Dn6.ogg b/sound/instruments/violin/Dn6.ogg similarity index 100% rename from sound/violin/Dn6.ogg rename to sound/instruments/violin/Dn6.ogg diff --git a/sound/violin/Dn7.ogg b/sound/instruments/violin/Dn7.ogg similarity index 100% rename from sound/violin/Dn7.ogg rename to sound/instruments/violin/Dn7.ogg diff --git a/sound/violin/Eb4.ogg b/sound/instruments/violin/Eb4.ogg similarity index 100% rename from sound/violin/Eb4.ogg rename to sound/instruments/violin/Eb4.ogg diff --git a/sound/violin/Eb5.ogg b/sound/instruments/violin/Eb5.ogg similarity index 100% rename from sound/violin/Eb5.ogg rename to sound/instruments/violin/Eb5.ogg diff --git a/sound/violin/Eb6.ogg b/sound/instruments/violin/Eb6.ogg similarity index 100% rename from sound/violin/Eb6.ogg rename to sound/instruments/violin/Eb6.ogg diff --git a/sound/violin/En4.ogg b/sound/instruments/violin/En4.ogg similarity index 100% rename from sound/violin/En4.ogg rename to sound/instruments/violin/En4.ogg diff --git a/sound/violin/En5.ogg b/sound/instruments/violin/En5.ogg similarity index 100% rename from sound/violin/En5.ogg rename to sound/instruments/violin/En5.ogg diff --git a/sound/violin/En6.ogg b/sound/instruments/violin/En6.ogg similarity index 100% rename from sound/violin/En6.ogg rename to sound/instruments/violin/En6.ogg diff --git a/sound/violin/Fn4.ogg b/sound/instruments/violin/Fn4.ogg similarity index 100% rename from sound/violin/Fn4.ogg rename to sound/instruments/violin/Fn4.ogg diff --git a/sound/violin/Fn5.ogg b/sound/instruments/violin/Fn5.ogg similarity index 100% rename from sound/violin/Fn5.ogg rename to sound/instruments/violin/Fn5.ogg diff --git a/sound/violin/Fn6.ogg b/sound/instruments/violin/Fn6.ogg similarity index 100% rename from sound/violin/Fn6.ogg rename to sound/instruments/violin/Fn6.ogg diff --git a/sound/violin/Gb4.ogg b/sound/instruments/violin/Gb4.ogg similarity index 100% rename from sound/violin/Gb4.ogg rename to sound/instruments/violin/Gb4.ogg diff --git a/sound/violin/Gb5.ogg b/sound/instruments/violin/Gb5.ogg similarity index 100% rename from sound/violin/Gb5.ogg rename to sound/instruments/violin/Gb5.ogg diff --git a/sound/violin/Gb6.ogg b/sound/instruments/violin/Gb6.ogg similarity index 100% rename from sound/violin/Gb6.ogg rename to sound/instruments/violin/Gb6.ogg diff --git a/sound/violin/Gn3.ogg b/sound/instruments/violin/Gn3.ogg similarity index 100% rename from sound/violin/Gn3.ogg rename to sound/instruments/violin/Gn3.ogg diff --git a/sound/violin/Gn4.ogg b/sound/instruments/violin/Gn4.ogg similarity index 100% rename from sound/violin/Gn4.ogg rename to sound/instruments/violin/Gn4.ogg diff --git a/sound/violin/Gn5.ogg b/sound/instruments/violin/Gn5.ogg similarity index 100% rename from sound/violin/Gn5.ogg rename to sound/instruments/violin/Gn5.ogg diff --git a/sound/violin/Gn6.ogg b/sound/instruments/violin/Gn6.ogg similarity index 100% rename from sound/violin/Gn6.ogg rename to sound/instruments/violin/Gn6.ogg diff --git a/sound/instruments/xylophone/Ab2.mid b/sound/instruments/xylophone/Ab2.mid new file mode 100644 index 00000000000..f8d08b5995a Binary files /dev/null and b/sound/instruments/xylophone/Ab2.mid differ diff --git a/sound/instruments/xylophone/Ab3.mid b/sound/instruments/xylophone/Ab3.mid new file mode 100644 index 00000000000..f34de3dcd6b Binary files /dev/null and b/sound/instruments/xylophone/Ab3.mid differ diff --git a/sound/instruments/xylophone/Ab4.mid b/sound/instruments/xylophone/Ab4.mid new file mode 100644 index 00000000000..ecca495a6ae Binary files /dev/null and b/sound/instruments/xylophone/Ab4.mid differ diff --git a/sound/instruments/xylophone/Ab5.mid b/sound/instruments/xylophone/Ab5.mid new file mode 100644 index 00000000000..4d277c9e0c7 Binary files /dev/null and b/sound/instruments/xylophone/Ab5.mid differ diff --git a/sound/instruments/xylophone/Ab6.mid b/sound/instruments/xylophone/Ab6.mid new file mode 100644 index 00000000000..b13d6aacdd7 Binary files /dev/null and b/sound/instruments/xylophone/Ab6.mid differ diff --git a/sound/instruments/xylophone/An2.mid b/sound/instruments/xylophone/An2.mid new file mode 100644 index 00000000000..cf6be5cf199 Binary files /dev/null and b/sound/instruments/xylophone/An2.mid differ diff --git a/sound/instruments/xylophone/An3.mid b/sound/instruments/xylophone/An3.mid new file mode 100644 index 00000000000..196be155a63 Binary files /dev/null and b/sound/instruments/xylophone/An3.mid differ diff --git a/sound/instruments/xylophone/An4.mid b/sound/instruments/xylophone/An4.mid new file mode 100644 index 00000000000..f7236042a6a Binary files /dev/null and b/sound/instruments/xylophone/An4.mid differ diff --git a/sound/instruments/xylophone/An5.mid b/sound/instruments/xylophone/An5.mid new file mode 100644 index 00000000000..c44d8a43aa4 Binary files /dev/null and b/sound/instruments/xylophone/An5.mid differ diff --git a/sound/instruments/xylophone/An6.mid b/sound/instruments/xylophone/An6.mid new file mode 100644 index 00000000000..c94d839e673 Binary files /dev/null and b/sound/instruments/xylophone/An6.mid differ diff --git a/sound/instruments/xylophone/Bb2.mid b/sound/instruments/xylophone/Bb2.mid new file mode 100644 index 00000000000..ad96c63e5d1 Binary files /dev/null and b/sound/instruments/xylophone/Bb2.mid differ diff --git a/sound/instruments/xylophone/Bb3.mid b/sound/instruments/xylophone/Bb3.mid new file mode 100644 index 00000000000..96e4eabfd3f Binary files /dev/null and b/sound/instruments/xylophone/Bb3.mid differ diff --git a/sound/instruments/xylophone/Bb4.mid b/sound/instruments/xylophone/Bb4.mid new file mode 100644 index 00000000000..5a9b40b71dd Binary files /dev/null and b/sound/instruments/xylophone/Bb4.mid differ diff --git a/sound/instruments/xylophone/Bb5.mid b/sound/instruments/xylophone/Bb5.mid new file mode 100644 index 00000000000..74817b705a7 Binary files /dev/null and b/sound/instruments/xylophone/Bb5.mid differ diff --git a/sound/instruments/xylophone/Bb6.mid b/sound/instruments/xylophone/Bb6.mid new file mode 100644 index 00000000000..7a998a857b7 Binary files /dev/null and b/sound/instruments/xylophone/Bb6.mid differ diff --git a/sound/instruments/xylophone/Bn2.mid b/sound/instruments/xylophone/Bn2.mid new file mode 100644 index 00000000000..7bc2a1bb76d Binary files /dev/null and b/sound/instruments/xylophone/Bn2.mid differ diff --git a/sound/instruments/xylophone/Bn3.mid b/sound/instruments/xylophone/Bn3.mid new file mode 100644 index 00000000000..c7375e6577c Binary files /dev/null and b/sound/instruments/xylophone/Bn3.mid differ diff --git a/sound/instruments/xylophone/Bn4.mid b/sound/instruments/xylophone/Bn4.mid new file mode 100644 index 00000000000..dfdcc32f5f9 Binary files /dev/null and b/sound/instruments/xylophone/Bn4.mid differ diff --git a/sound/instruments/xylophone/Bn5.mid b/sound/instruments/xylophone/Bn5.mid new file mode 100644 index 00000000000..f51313d527f Binary files /dev/null and b/sound/instruments/xylophone/Bn5.mid differ diff --git a/sound/instruments/xylophone/Bn6.mid b/sound/instruments/xylophone/Bn6.mid new file mode 100644 index 00000000000..6dcbc8cd6a1 Binary files /dev/null and b/sound/instruments/xylophone/Bn6.mid differ diff --git a/sound/instruments/xylophone/Cn2.mid b/sound/instruments/xylophone/Cn2.mid new file mode 100644 index 00000000000..6ae074d342d Binary files /dev/null and b/sound/instruments/xylophone/Cn2.mid differ diff --git a/sound/instruments/xylophone/Cn3.mid b/sound/instruments/xylophone/Cn3.mid new file mode 100644 index 00000000000..bdc7d688ee4 Binary files /dev/null and b/sound/instruments/xylophone/Cn3.mid differ diff --git a/sound/instruments/xylophone/Cn4.mid b/sound/instruments/xylophone/Cn4.mid new file mode 100644 index 00000000000..956e93f460e Binary files /dev/null and b/sound/instruments/xylophone/Cn4.mid differ diff --git a/sound/instruments/xylophone/Cn5.mid b/sound/instruments/xylophone/Cn5.mid new file mode 100644 index 00000000000..b88f09ea41a Binary files /dev/null and b/sound/instruments/xylophone/Cn5.mid differ diff --git a/sound/instruments/xylophone/Cn6.mid b/sound/instruments/xylophone/Cn6.mid new file mode 100644 index 00000000000..fd1e01d0e5f Binary files /dev/null and b/sound/instruments/xylophone/Cn6.mid differ diff --git a/sound/instruments/xylophone/Db2.mid b/sound/instruments/xylophone/Db2.mid new file mode 100644 index 00000000000..d6c6250abf5 Binary files /dev/null and b/sound/instruments/xylophone/Db2.mid differ diff --git a/sound/instruments/xylophone/Db3.mid b/sound/instruments/xylophone/Db3.mid new file mode 100644 index 00000000000..22ad1728373 Binary files /dev/null and b/sound/instruments/xylophone/Db3.mid differ diff --git a/sound/instruments/xylophone/Db4.mid b/sound/instruments/xylophone/Db4.mid new file mode 100644 index 00000000000..19d2b5acd6a Binary files /dev/null and b/sound/instruments/xylophone/Db4.mid differ diff --git a/sound/instruments/xylophone/Db5.mid b/sound/instruments/xylophone/Db5.mid new file mode 100644 index 00000000000..bc747935ec7 Binary files /dev/null and b/sound/instruments/xylophone/Db5.mid differ diff --git a/sound/instruments/xylophone/Db6.mid b/sound/instruments/xylophone/Db6.mid new file mode 100644 index 00000000000..6b5e16cf66f Binary files /dev/null and b/sound/instruments/xylophone/Db6.mid differ diff --git a/sound/instruments/xylophone/Dn2.mid b/sound/instruments/xylophone/Dn2.mid new file mode 100644 index 00000000000..caf81563c16 Binary files /dev/null and b/sound/instruments/xylophone/Dn2.mid differ diff --git a/sound/instruments/xylophone/Dn3.mid b/sound/instruments/xylophone/Dn3.mid new file mode 100644 index 00000000000..b98e10291e8 Binary files /dev/null and b/sound/instruments/xylophone/Dn3.mid differ diff --git a/sound/instruments/xylophone/Dn4.mid b/sound/instruments/xylophone/Dn4.mid new file mode 100644 index 00000000000..cb1b295f359 Binary files /dev/null and b/sound/instruments/xylophone/Dn4.mid differ diff --git a/sound/instruments/xylophone/Dn5.mid b/sound/instruments/xylophone/Dn5.mid new file mode 100644 index 00000000000..53061570639 Binary files /dev/null and b/sound/instruments/xylophone/Dn5.mid differ diff --git a/sound/instruments/xylophone/Dn6.mid b/sound/instruments/xylophone/Dn6.mid new file mode 100644 index 00000000000..79459d4b156 Binary files /dev/null and b/sound/instruments/xylophone/Dn6.mid differ diff --git a/sound/instruments/xylophone/Eb2.mid b/sound/instruments/xylophone/Eb2.mid new file mode 100644 index 00000000000..efd033ea415 Binary files /dev/null and b/sound/instruments/xylophone/Eb2.mid differ diff --git a/sound/instruments/xylophone/Eb3.mid b/sound/instruments/xylophone/Eb3.mid new file mode 100644 index 00000000000..16cfc8f32be Binary files /dev/null and b/sound/instruments/xylophone/Eb3.mid differ diff --git a/sound/instruments/xylophone/Eb4.mid b/sound/instruments/xylophone/Eb4.mid new file mode 100644 index 00000000000..cc4333d5579 Binary files /dev/null and b/sound/instruments/xylophone/Eb4.mid differ diff --git a/sound/instruments/xylophone/Eb5.mid b/sound/instruments/xylophone/Eb5.mid new file mode 100644 index 00000000000..b25d5fded35 Binary files /dev/null and b/sound/instruments/xylophone/Eb5.mid differ diff --git a/sound/instruments/xylophone/Eb6.mid b/sound/instruments/xylophone/Eb6.mid new file mode 100644 index 00000000000..7418778e66a Binary files /dev/null and b/sound/instruments/xylophone/Eb6.mid differ diff --git a/sound/instruments/xylophone/En2.mid b/sound/instruments/xylophone/En2.mid new file mode 100644 index 00000000000..ee49b6d26d7 Binary files /dev/null and b/sound/instruments/xylophone/En2.mid differ diff --git a/sound/instruments/xylophone/En3.mid b/sound/instruments/xylophone/En3.mid new file mode 100644 index 00000000000..8cc2fc4514a Binary files /dev/null and b/sound/instruments/xylophone/En3.mid differ diff --git a/sound/instruments/xylophone/En4.mid b/sound/instruments/xylophone/En4.mid new file mode 100644 index 00000000000..12e688e309a Binary files /dev/null and b/sound/instruments/xylophone/En4.mid differ diff --git a/sound/instruments/xylophone/En5.mid b/sound/instruments/xylophone/En5.mid new file mode 100644 index 00000000000..1608556bb59 Binary files /dev/null and b/sound/instruments/xylophone/En5.mid differ diff --git a/sound/instruments/xylophone/En6.mid b/sound/instruments/xylophone/En6.mid new file mode 100644 index 00000000000..2b728aa02f6 Binary files /dev/null and b/sound/instruments/xylophone/En6.mid differ diff --git a/sound/instruments/xylophone/Fn2.mid b/sound/instruments/xylophone/Fn2.mid new file mode 100644 index 00000000000..2d329eafab0 Binary files /dev/null and b/sound/instruments/xylophone/Fn2.mid differ diff --git a/sound/instruments/xylophone/Fn3.mid b/sound/instruments/xylophone/Fn3.mid new file mode 100644 index 00000000000..262398bd647 Binary files /dev/null and b/sound/instruments/xylophone/Fn3.mid differ diff --git a/sound/instruments/xylophone/Fn4.mid b/sound/instruments/xylophone/Fn4.mid new file mode 100644 index 00000000000..d0103d46f0a Binary files /dev/null and b/sound/instruments/xylophone/Fn4.mid differ diff --git a/sound/instruments/xylophone/Fn5.mid b/sound/instruments/xylophone/Fn5.mid new file mode 100644 index 00000000000..2fb0d481d7e Binary files /dev/null and b/sound/instruments/xylophone/Fn5.mid differ diff --git a/sound/instruments/xylophone/Fn6.mid b/sound/instruments/xylophone/Fn6.mid new file mode 100644 index 00000000000..851cc387df7 Binary files /dev/null and b/sound/instruments/xylophone/Fn6.mid differ diff --git a/sound/instruments/xylophone/Gb2.mid b/sound/instruments/xylophone/Gb2.mid new file mode 100644 index 00000000000..1429339b866 Binary files /dev/null and b/sound/instruments/xylophone/Gb2.mid differ diff --git a/sound/instruments/xylophone/Gb3.mid b/sound/instruments/xylophone/Gb3.mid new file mode 100644 index 00000000000..2e7ffcc7317 Binary files /dev/null and b/sound/instruments/xylophone/Gb3.mid differ diff --git a/sound/instruments/xylophone/Gb4.mid b/sound/instruments/xylophone/Gb4.mid new file mode 100644 index 00000000000..dcb800e3af8 Binary files /dev/null and b/sound/instruments/xylophone/Gb4.mid differ diff --git a/sound/instruments/xylophone/Gb5.mid b/sound/instruments/xylophone/Gb5.mid new file mode 100644 index 00000000000..9bfd1db08e9 Binary files /dev/null and b/sound/instruments/xylophone/Gb5.mid differ diff --git a/sound/instruments/xylophone/Gb6.mid b/sound/instruments/xylophone/Gb6.mid new file mode 100644 index 00000000000..2329d70b8f0 Binary files /dev/null and b/sound/instruments/xylophone/Gb6.mid differ diff --git a/sound/instruments/xylophone/Gn2.mid b/sound/instruments/xylophone/Gn2.mid new file mode 100644 index 00000000000..67e8ff80b15 Binary files /dev/null and b/sound/instruments/xylophone/Gn2.mid differ diff --git a/sound/instruments/xylophone/Gn3.mid b/sound/instruments/xylophone/Gn3.mid new file mode 100644 index 00000000000..416b3603110 Binary files /dev/null and b/sound/instruments/xylophone/Gn3.mid differ diff --git a/sound/instruments/xylophone/Gn4.mid b/sound/instruments/xylophone/Gn4.mid new file mode 100644 index 00000000000..81c84e8ae96 Binary files /dev/null and b/sound/instruments/xylophone/Gn4.mid differ diff --git a/sound/instruments/xylophone/Gn5.mid b/sound/instruments/xylophone/Gn5.mid new file mode 100644 index 00000000000..34b94805a5e Binary files /dev/null and b/sound/instruments/xylophone/Gn5.mid differ diff --git a/sound/instruments/xylophone/Gn6.mid b/sound/instruments/xylophone/Gn6.mid new file mode 100644 index 00000000000..2ea9104e419 Binary files /dev/null and b/sound/instruments/xylophone/Gn6.mid differ