diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 45ffedc345c..9aebfae933b 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -517,14 +517,15 @@ There are a few other defines that do other things. `GLOBAL_REAL` shouldn't be u `GLOBAL_LIST_INIT` allows you to define a list global var with an initial value. Etc. ## Maintainers -The only current official role for GitHub staff are the `Maintainers`. There are up to -three `Maintainers` at once, and they share equal power. The `Maintainers` are +The only current official role for GitHub staff are the `Maintainers`. They share equal power. The `Maintainers` are responsible for properly tagging new pull requests and issues, moderating comments in pull requests/issues, and merging/closing pull requests. ### Maintainer List * [Fox P McCloud](https://github.com/Fox-McCloud) * [Crazy Lemon](https://github.com/Crazylemon64) +* [Tigercat2000](https://github.com/tigercat2000) +* [Ansari](https://github.com/variableundefined) ### Maintainer instructions * Do not `self-merge`; this refers to the practice of opening a pull request, then diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 582ca3e4268..e4dccf1e54c 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -2,7 +2,7 @@ What is the problem? **What did you expect to happen**: -Why do you think this is a bug? +Why do you think this is an issue? **What happened instead**: How is what happened different from what you expected? @@ -14,7 +14,7 @@ Why do you think this is an important issue? The most important section. Review everything you did leading up to causing the issue. **When did the problem start happening**: -If your report is about something that used to work but no longer does. When was the last time you remember it working? +If your report is about something that used to work but no longer does, when was the last time you remember it working? -**Possibly related stuff (which gamemode was it? What were you doing at the time? Was -anything else out of the ordinary happening?)**: Anything else you can tell us. +**Possibly related stuff (which gamemode was it? What were you doing at the time? Was anything else out of the ordinary happening?)**: +Anything else you can tell us. diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm index b02b0854d29..d1afd4adf84 100644 --- a/_maps/map_files/Delta/delta.dmm +++ b/_maps/map_files/Delta/delta.dmm @@ -482,7 +482,7 @@ "ajn" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_northeast_lock"; locked = 1; req_access_txt = "152"; req_one_access = null; req_one_access_txt = "0"},/obj/docking_port/mobile{dir = 2; dwidth = 2; height = 18; id = "skipjack"; name = "Vox Skipjack"; roundstart_move = "skipjack_away"; width = 19},/obj/docking_port/stationary{dir = 2; dwidth = 2; height = 18; id = "skipjack_ne"; name = "northeast of SS13"; width = 19},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox) "ajo" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "vox_east_control"; req_access_txt = "152"},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/vox) "ajp" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"},/turf/space,/area/shuttle/specops) -"ajq" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/turf/unsimulated/floor,/area/shuttle/specops) +"ajq" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops) "ajr" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the Special Ops team."; name = "Spec Ops Monitor"; network = list("ERT"); pixel_y = 30},/obj/machinery/computer/shuttle/ert,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops) "ajs" = (/obj/structure/chair,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops) "ajt" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Shuttle"; dir = 2; network = list("ERT","CentComm")},/obj/structure/chair,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops) @@ -865,9 +865,9 @@ "aqG" = (/obj/machinery/conveyor{dir = 4; id = "garbage"},/obj/effect/decal/warning_stripes/south,/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plating,/area/maintenance/disposal) "aqH" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/maintenance/fsmaint) "aqI" = (/obj/structure/extinguisher_cabinet{pixel_x = -28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/vacantoffice) -"aqJ" = (/obj/structure/chair/office/light{dir = 4},/turf/unsimulated/floor/carpet,/area/security/vacantoffice) -"aqK" = (/obj/structure/table/wood,/turf/unsimulated/floor/carpet,/area/security/vacantoffice) -"aqL" = (/obj/structure/chair/office/light{dir = 8},/turf/unsimulated/floor/carpet,/area/security/vacantoffice) +"aqJ" = (/obj/structure/chair/office/light{dir = 4},/turf/simulated/floor/carpet,/area/security/vacantoffice) +"aqK" = (/obj/structure/chair/office/light{dir = 8},/turf/simulated/floor/carpet,/area/security/vacantoffice) +"aqL" = (/obj/structure/table/wood,/turf/simulated/floor/carpet,/area/security/vacantoffice) "aqM" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/vacantoffice) "aqN" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/security/vacantoffice) "aqO" = (/obj/structure/table/wood,/obj/item/paicard,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/vacantoffice) @@ -878,8 +878,8 @@ "aqT" = (/obj/structure/table/reinforced,/obj/item/stack/packageWrap,/obj/item/hand_labeler,/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/bridge) "aqU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/secondary/entry) "aqV" = (/obj/structure/chair/comfy/brown{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry) -"aqW" = (/turf/unsimulated/floor/carpet,/area/hallway/secondary/entry) -"aqX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/unsimulated/floor/carpet,/area/hallway/secondary/entry) +"aqW" = (/turf/simulated/floor/carpet,/area/hallway/secondary/entry) +"aqX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/carpet,/area/hallway/secondary/entry) "aqY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/chair/comfy/brown{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry) "aqZ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "redcorner"},/area/hallway/secondary/entry) "ara" = (/obj/structure/table/reinforced,/obj/machinery/recharger,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/checkpoint2) @@ -909,8 +909,8 @@ "ary" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/computerframe,/obj/item/stack/cable_coil/random,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/maintenance/electrical_shop) "arz" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/maintenance/fsmaint) "arA" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/vacantoffice) -"arB" = (/turf/unsimulated/floor/carpet,/area/security/vacantoffice) -"arC" = (/obj/structure/table/wood,/obj/item/flashlight/lamp,/turf/unsimulated/floor/carpet,/area/security/vacantoffice) +"arB" = (/turf/simulated/floor/carpet,/area/security/vacantoffice) +"arC" = (/obj/structure/table/wood,/obj/item/flashlight/lamp,/turf/simulated/floor/carpet,/area/security/vacantoffice) "arD" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/security/vacantoffice) "arE" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/security/vacantoffice) "arF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/security/vacantoffice) @@ -923,7 +923,7 @@ "arM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/security/checkpoint2) "arN" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/fsmaint) "arO" = (/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry) -"arP" = (/obj/machinery/hologram/holopad,/turf/unsimulated/floor/carpet,/area/hallway/secondary/entry) +"arP" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/hallway/secondary/entry) "arQ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/window/brigdoor/southright{dir = 8; name = "Customs Desk"; req_access_txt = "19"},/turf/simulated/floor/plasteel,/area/bridge) "arR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/table/reinforced,/obj/item/folder/red,/obj/item/pen,/obj/machinery/door/window/brigdoor/southright{dir = 8; name = "Security Checkpoint"; pixel_x = -8; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/checkpoint2) "arS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/security/checkpoint2) @@ -963,7 +963,7 @@ "asA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/secondary/entry) "asB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/hallway/secondary/entry) "asC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/chair/comfy/brown{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry) -"asD" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 100; on = 1; pressure_checks = 1},/turf/unsimulated/floor/carpet,/area/hallway/secondary/entry) +"asD" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 100; on = 1; pressure_checks = 1},/turf/simulated/floor/carpet,/area/hallway/secondary/entry) "asE" = (/obj/structure/chair/comfy/brown{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry) "asF" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/security/checkpoint2) "asG" = (/obj/structure/table/reinforced,/obj/item/paper_bin,/obj/item/pen,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/checkpoint2) @@ -2178,8 +2178,8 @@ "aPT" = (/obj/structure/table/wood,/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/item/radio/intercom{pixel_y = 28},/obj/item/flashlight/lamp/bananalamp,/turf/simulated/floor/plasteel{icon_state = "redbluefull"},/area/crew_quarters/theatre) "aPU" = (/obj/structure/table/wood,/obj/item/instrument/guitar,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/crew_quarters/bar/atrium) "aPV" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar/atrium) -"aPW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/unsimulated/floor/carpet,/area/crew_quarters/bar/atrium) -"aPX" = (/turf/unsimulated/floor/carpet,/area/crew_quarters/bar/atrium) +"aPW" = (/turf/simulated/floor/carpet,/area/crew_quarters/bar/atrium) +"aPX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/bar/atrium) "aPY" = (/obj/structure/window/reinforced{dir = 4},/obj/item/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar/atrium) "aPZ" = (/obj/structure/table/wood,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/crew_quarters/bar/atrium) "aQa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/chair/stool,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) @@ -2210,7 +2210,7 @@ "aQz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/security/prison) "aQA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/security/prison) "aQB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/table,/turf/simulated/floor/plating,/area/security/prison) -"aQC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel,/area/security/prison) +"aQC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table,/obj/item/deck/cards,/turf/simulated/floor/plasteel,/area/security/prison) "aQD" = (/obj/structure/chair/stool,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/security/prison) "aQE" = (/turf/simulated/floor/plasteel,/area/security/prison) "aQF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/security/prison) @@ -2258,13 +2258,13 @@ "aRv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/crew_quarters/sleep) "aRw" = (/obj/structure/table/wood,/obj/item/camera,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/crew_quarters/bar/atrium) "aRx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar/atrium) -"aRy" = (/obj/structure/chair/wood/normal,/turf/unsimulated/floor/carpet,/area/crew_quarters/bar/atrium) +"aRy" = (/obj/structure/chair/wood/normal,/turf/simulated/floor/carpet,/area/crew_quarters/bar/atrium) "aRz" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar/atrium) "aRA" = (/obj/structure/chair/comfy/brown{dir = 8},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/crew_quarters/bar/atrium) "aRB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/structure/chair/stool,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) "aRC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/table/wood,/obj/item/reagent_containers/food/snacks/cheesiehonkers,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) "aRD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/table/wood,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) -"aRE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/table/wood,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) +"aRE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/table/wood,/obj/item/deck/cards,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) "aRF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/chair/stool,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) "aRG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) "aRH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/arrow,/obj/effect/decal/warning_stripes/yellow/partial,/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 4},/area/hallway/primary/fore) @@ -2343,8 +2343,8 @@ "aTc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_access_txt = "25"},/turf/simulated/floor/plasteel,/area/crew_quarters/bar/atrium) "aTd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/crew_quarters/bar/atrium) "aTe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; level = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar/atrium) -"aTf" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/chair/wood/normal{dir = 4},/turf/unsimulated/floor/carpet,/area/crew_quarters/bar/atrium) -"aTg" = (/obj/machinery/hologram/holopad,/turf/unsimulated/floor/carpet,/area/crew_quarters/bar/atrium) +"aTf" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/crew_quarters/bar/atrium) +"aTg" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/chair/wood/normal{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/bar/atrium) "aTh" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) "aTi" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/machinery/camera{c_tag = "Arrivals North"; dir = 1},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/quartermaster/office) "aTj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{desc = "\"This is a plaque in honour of our comrades on the G4407 Stations. Hopefully TG4407 model can live up to your fame and fortune.\" Scratched in beneath that is a crude image of a meteor and a spaceman. The spaceman is laughing. The meteor is exploding."; dir = 4; icon_state = "plaque"; name = "Comemmorative Plaque"},/area/hallway/primary/fore) @@ -2423,7 +2423,7 @@ "aUE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/crew_quarters/bar/atrium) "aUF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/wood,/obj/item/lipstick/random,/obj/item/lipstick/random,/obj/item/lipstick/random,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/crew_quarters/bar/atrium) "aUG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar/atrium) -"aUH" = (/obj/structure/chair/wood/normal{dir = 1},/turf/unsimulated/floor/carpet,/area/crew_quarters/bar/atrium) +"aUH" = (/obj/structure/chair/wood/normal{dir = 1},/turf/simulated/floor/carpet,/area/crew_quarters/bar/atrium) "aUI" = (/obj/structure/table/wood,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) "aUJ" = (/obj/structure/table/wood,/obj/item/paicard,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) "aUK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/chair/stool,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"},/area/crew_quarters/bar/atrium) @@ -2974,7 +2974,7 @@ "bfj" = (/obj/machinery/newscaster{pixel_x = -32; pixel_y = 0},/obj/structure/closet/secure_closet/freezer/fridge,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/crew_quarters/kitchen) "bfk" = (/obj/machinery/cooker/deepfryer,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/crew_quarters/kitchen) "bfl" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window{dir = 2; name = "Kitchen"; req_access_txt = "28"},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel,/area/crew_quarters/kitchen) -"bfm" = (/obj/machinery/cooking/oven,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/crew_quarters/kitchen) +"bfm" = (/obj/machinery/kitchen_machine/oven,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/crew_quarters/kitchen) "bfn" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/kitchen) "bfo" = (/obj/structure/disposalpipe/segment,/obj/structure/table/reinforced,/obj/item/storage/fancy/donut_box,/obj/machinery/door/firedoor,/obj/machinery/door/window{dir = 2; name = "Kitchen"; req_access_txt = "28"},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel,/area/crew_quarters/kitchen) "bfp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/fore) @@ -3799,7 +3799,7 @@ "bvc" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage) "bvd" = (/obj/machinery/light/small{dir = 1},/obj/structure/closet/crate,/obj/item/coin/silver,/obj/item/coin/silver,/obj/item/coin/silver,/obj/item/coin/silver,/obj/item/coin/silver,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage) "bve" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/obj/machinery/status_display{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage) -"bvf" = (/obj/machinery/light/small{dir = 1},/obj/structure/filingcabinet,/obj/item/folder/documents,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage) +"bvf" = (/obj/machinery/light/small{dir = 1},/obj/structure/closet/fireaxecabinet{pixel_y = 32},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage) "bvg" = (/obj/structure/closet/secure_closet/freezer/money,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage) "bvh" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space) "bvi" = (/obj/machinery/door/airlock/external{name = "Labor Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/shuttle/floor{icon = 'icons/turf/floors.dmi'; icon_state = "dark"},/area/shuttle/siberia) @@ -4090,7 +4090,7 @@ "bAH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) "bAI" = (/obj/machinery/alarm{dir = 1; pixel_y = -25},/obj/machinery/light/small,/obj/structure/closet/crate,/obj/item/storage/belt/champion,/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/gold,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage) "bAJ" = (/obj/machinery/ai_status_display{pixel_y = -32},/obj/item/clothing/accessory/stethoscope,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage) -"bAK" = (/obj/machinery/light/small,/obj/structure/safe,/obj/item/clothing/head/bearpelt,/obj/item/twohanded/fireaxe,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage) +"bAK" = (/obj/machinery/light/small,/obj/structure/safe,/obj/item/clothing/head/bearpelt,/obj/item/folder/documents,/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka,/obj/item/lighter/zippo/nt_rep,/obj/item/storage/fancy/cigarettes/cigpack_robustgold,/obj/item/stack/spacecash/c1000{amount = 100000},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage) "bAL" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/plating/airless,/area/shuttle/siberia) "bAM" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/security/prisonershuttle) "bAN" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/security/prisonershuttle) @@ -4347,9 +4347,9 @@ "bFE" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkblue"},/area/bridge) "bFF" = (/obj/structure/rack,/obj/machinery/light/small,/obj/item/aicard,/obj/item/storage/secure/briefcase,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/bridge) "bFG" = (/obj/structure/table/wood,/obj/structure/window/reinforced{dir = 8},/obj/item/taperecorder,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/bridge) -"bFH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/unsimulated/floor/carpet,/area/bridge) -"bFI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/chair/comfy/black{dir = 1},/turf/unsimulated/floor/carpet,/area/bridge) -"bFJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/unsimulated/floor/carpet,/area/bridge) +"bFH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/chair/comfy/black{dir = 1},/turf/simulated/floor/carpet,/area/bridge) +"bFI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/carpet,/area/bridge) +"bFJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/carpet,/area/bridge) "bFK" = (/obj/structure/table/wood,/obj/structure/window/reinforced{dir = 4},/obj/item/folder/blue,/obj/item/pen,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/bridge) "bFL" = (/obj/structure/rack,/obj/item/storage/toolbox/emergency,/obj/item/wrench,/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/bridge) "bFM" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkblue"},/area/bridge) @@ -4435,9 +4435,9 @@ "bHo" = (/obj/structure/table/reinforced,/obj/machinery/cell_charger,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge) "bHp" = (/obj/machinery/status_display,/turf/simulated/wall,/area/bridge) "bHq" = (/obj/structure/table/wood,/obj/structure/window/reinforced{dir = 8},/obj/item/storage/fancy/donut_box,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/bridge) -"bHr" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge Requests Console"; pixel_x = -30; pixel_y = -30},/obj/machinery/camera{c_tag = "Bridge Center"; dir = 1; network = list("SS13")},/turf/unsimulated/floor/carpet,/area/bridge) -"bHs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/unsimulated/floor/carpet,/area/bridge) -"bHt" = (/obj/machinery/door_control{id = "stationawaygate"; name = "Gateway Shutters Access Control"; pixel_x = 7; pixel_y = -26; req_access_txt = "62"},/obj/machinery/door_control{id = "eva-shutters"; name = "Auxilary E.V.A. Storage"; pixel_x = -7; pixel_y = -26; req_one_access_txt = "18"},/obj/machinery/keycard_auth{pixel_y = -38},/turf/unsimulated/floor/carpet,/area/bridge) +"bHr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/bridge) +"bHs" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge Requests Console"; pixel_x = -30; pixel_y = -30},/obj/machinery/camera{c_tag = "Bridge Center"; dir = 1; network = list("SS13")},/turf/simulated/floor/carpet,/area/bridge) +"bHt" = (/obj/machinery/door_control{id = "stationawaygate"; name = "Gateway Shutters Access Control"; pixel_x = 7; pixel_y = -26; req_access_txt = "62"},/obj/machinery/door_control{id = "eva-shutters"; name = "Auxilary E.V.A. Storage"; pixel_x = -7; pixel_y = -26; req_one_access_txt = "18"},/obj/machinery/keycard_auth{pixel_y = -38},/turf/simulated/floor/carpet,/area/bridge) "bHu" = (/obj/structure/table/wood,/obj/structure/window/reinforced{dir = 4},/obj/item/paper_bin,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/bridge) "bHv" = (/obj/machinery/ai_status_display,/turf/simulated/wall,/area/bridge) "bHw" = (/obj/structure/table/reinforced,/obj/item/paper_bin,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge) @@ -4607,10 +4607,10 @@ "bKE" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "meetroomshutters"; name = "Meeting Room Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/bridge/meeting_room) "bKF" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/table/wood,/obj/item/clothing/mask/cigarette/cigar{pixel_x = -5; pixel_y = 5},/obj/item/clothing/mask/cigarette/cigar{pixel_x = -2; pixel_y = 3},/obj/machinery/door_control{id = "meetroomshutters"; name = "Privacy Shutters"; pixel_x = 5; pixel_y = -4; req_one_access_txt = "18"},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/bridge/meeting_room) "bKG" = (/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/bridge/meeting_room) -"bKH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/unsimulated/floor/carpet,/area/bridge/meeting_room) -"bKI" = (/obj/structure/chair/comfy/brown,/turf/unsimulated/floor/carpet,/area/bridge/meeting_room) -"bKJ" = (/obj/structure/chair/comfy/beige,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/unsimulated/floor/carpet,/area/bridge/meeting_room) -"bKK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/chair/comfy/brown,/turf/unsimulated/floor/carpet,/area/bridge/meeting_room) +"bKH" = (/obj/structure/chair/comfy/brown,/turf/simulated/floor/carpet,/area/bridge/meeting_room) +"bKI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/carpet,/area/bridge/meeting_room) +"bKJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/chair/comfy/brown,/turf/simulated/floor/carpet,/area/bridge/meeting_room) +"bKK" = (/obj/structure/chair/comfy/beige,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/carpet,/area/bridge/meeting_room) "bKL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/wood,/obj/item/phone,/obj/item/cigbutt/cigarbutt,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/bridge/meeting_room) "bKM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/bridge/meeting_room) "bKN" = (/turf/simulated/floor/plasteel{icon_state = "wood"},/area/bridge/meeting_room) @@ -4718,10 +4718,10 @@ "bML" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = -32},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central) "bMM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/photocopier,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/bridge/meeting_room) "bMN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/bridge/meeting_room) -"bMO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/chair/comfy/brown{dir = 4},/turf/unsimulated/floor/carpet,/area/bridge/meeting_room) -"bMP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/table/wood,/obj/item/folder/blue,/turf/unsimulated/floor/carpet,/area/bridge/meeting_room) -"bMQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/table/wood,/obj/item/folder/red,/obj/item/lighter/zippo,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/unsimulated/floor/carpet,/area/bridge/meeting_room) -"bMR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment,/obj/structure/table/wood,/obj/item/folder/yellow,/turf/unsimulated/floor/carpet,/area/bridge/meeting_room) +"bMO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/table/wood,/obj/item/folder/blue,/turf/simulated/floor/carpet,/area/bridge/meeting_room) +"bMP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/chair/comfy/brown{dir = 4},/turf/simulated/floor/carpet,/area/bridge/meeting_room) +"bMQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment,/obj/structure/table/wood,/obj/item/folder/yellow,/turf/simulated/floor/carpet,/area/bridge/meeting_room) +"bMR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/table/wood,/obj/item/folder/red,/obj/item/lighter/zippo,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/carpet,/area/bridge/meeting_room) "bMS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/table/wood,/obj/item/storage/fancy/donut_box,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/bridge/meeting_room) "bMT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/bridge/meeting_room) "bMU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 100; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/bridge/meeting_room) @@ -4813,10 +4813,10 @@ "bOC" = (/turf/simulated/wall,/area/storage/primary) "bOD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central) "bOE" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/table/wood,/obj/item/book/manual/security_space_law,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/bridge/meeting_room) -"bOF" = (/turf/unsimulated/floor/carpet,/area/bridge/meeting_room) -"bOG" = (/obj/structure/chair/comfy/beige{dir = 1},/turf/unsimulated/floor/carpet,/area/bridge/meeting_room) -"bOH" = (/obj/structure/chair/comfy/brown{dir = 1},/turf/unsimulated/floor/carpet,/area/bridge/meeting_room) -"bOI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/chair/comfy/beige{dir = 1},/turf/unsimulated/floor/carpet,/area/bridge/meeting_room) +"bOF" = (/obj/structure/chair/comfy/beige{dir = 1},/turf/simulated/floor/carpet,/area/bridge/meeting_room) +"bOG" = (/turf/simulated/floor/carpet,/area/bridge/meeting_room) +"bOH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/chair/comfy/beige{dir = 1},/turf/simulated/floor/carpet,/area/bridge/meeting_room) +"bOI" = (/obj/structure/chair/comfy/brown{dir = 1},/turf/simulated/floor/carpet,/area/bridge/meeting_room) "bOJ" = (/obj/structure/table/wood,/obj/item/paper_bin,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/bridge/meeting_room) "bOK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/newscaster{pixel_x = 32; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/bridge/meeting_room) "bOL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/bridge/meeting_room) @@ -4926,9 +4926,9 @@ "bQL" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/ai_upload) "bQM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/ai_slipper,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "bQN" = (/obj/machinery/porta_turret{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload) -"bQO" = (/obj/structure/table/wood,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/item/flashlight/lamp/green,/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/crew_quarters/captain) -"bQP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/table/wood,/obj/machinery/door/window{base_state = "right"; dir = 1; icon_state = "right"; name = "Captain's Desk Door"; req_access_txt = "20"},/obj/item/folder/blue,/turf/unsimulated/floor/carpet,/area/crew_quarters/captain) -"bQQ" = (/obj/structure/table/wood,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/item/paper_bin,/turf/unsimulated/floor/carpet,/area/crew_quarters/captain) +"bQO" = (/obj/structure/table/wood,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/item/flashlight/lamp/green,/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/captain) +"bQP" = (/obj/structure/table/wood,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/item/paper_bin,/turf/simulated/floor/carpet,/area/crew_quarters/captain) +"bQQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/table/wood,/obj/machinery/door/window{base_state = "right"; dir = 1; icon_state = "right"; name = "Captain's Desk Door"; req_access_txt = "20"},/obj/item/folder/blue,/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bQR" = (/obj/machinery/door/window{base_state = "right"; dir = 1; icon_state = "right"; name = "Captain's Desk Door"; req_access_txt = "20"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/captain) "bQS" = (/obj/structure/table/wood,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/item/storage/secure/briefcase,/obj/item/storage/lockbox/medal,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/captain) "bQT" = (/obj/structure/table/wood,/obj/item/camera,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/captain) @@ -5030,9 +5030,9 @@ "bSL" = (/obj/machinery/computer/borgupload,/obj/item/radio/intercom/private{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "bSM" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload) "bSN" = (/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "High-Risk Modules"; req_access_txt = "20"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/aiModule/oxygen,/obj/item/aiModule/oneCrewMember,/obj/item/aiModule/purge,/obj/item/aiModule/antimov,/obj/structure/table/glass,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) -"bSO" = (/obj/machinery/keycard_auth{pixel_x = -26; pixel_y = 22},/obj/machinery/requests_console{announcementConsole = 1; department = "Captain's Desk"; departmentType = 5; name = "Captain Requests Console"; pixel_x = -30; pixel_y = 0},/obj/machinery/computer/card,/turf/unsimulated/floor/carpet,/area/crew_quarters/captain) -"bSP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/chair/comfy/brown{dir = 1},/obj/effect/landmark/start{name = "Captain"},/turf/unsimulated/floor/carpet,/area/crew_quarters/captain) -"bSQ" = (/obj/structure/table/wood,/obj/machinery/computer/security/wooden_tv,/turf/unsimulated/floor/carpet,/area/crew_quarters/captain) +"bSO" = (/obj/machinery/keycard_auth{pixel_x = -26; pixel_y = 22},/obj/machinery/requests_console{announcementConsole = 1; department = "Captain's Desk"; departmentType = 5; name = "Captain Requests Console"; pixel_x = -30; pixel_y = 0},/obj/machinery/computer/card,/turf/simulated/floor/carpet,/area/crew_quarters/captain) +"bSP" = (/obj/structure/table/wood,/obj/machinery/computer/security/wooden_tv,/turf/simulated/floor/carpet,/area/crew_quarters/captain) +"bSQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/chair/comfy/brown{dir = 1},/obj/effect/landmark/start{name = "Captain"},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bSR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/captain) "bSS" = (/obj/structure/table/wood,/obj/item/hand_tele,/obj/item/coin/plasma,/obj/machinery/status_display{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/captain) "bST" = (/turf/simulated/wall/r_wall,/area/crew_quarters/captain/bedroom) @@ -5141,9 +5141,9 @@ "bUS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/heads/hop) "bUT" = (/obj/item/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/heads/hop) "bUU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/wood,/obj/item/storage/box/ids,/obj/item/storage/box/PDAs,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/heads/hop) -"bUV" = (/obj/machinery/computer/communications,/obj/machinery/ai_status_display{pixel_x = -32},/turf/unsimulated/floor/carpet,/area/crew_quarters/captain) -"bUW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/unsimulated/floor/carpet,/area/crew_quarters/captain) -"bUX" = (/obj/machinery/light_switch{pixel_x = -8; pixel_y = -26},/obj/machinery/camera{c_tag = "Captain's Desk"; dir = 1; network = list("SS13")},/turf/unsimulated/floor/carpet,/area/crew_quarters/captain) +"bUV" = (/obj/machinery/computer/communications,/obj/machinery/ai_status_display{pixel_x = -32},/turf/simulated/floor/carpet,/area/crew_quarters/captain) +"bUW" = (/obj/machinery/light_switch{pixel_x = -8; pixel_y = -26},/obj/machinery/camera{c_tag = "Captain's Desk"; dir = 1; network = list("SS13")},/turf/simulated/floor/carpet,/area/crew_quarters/captain) +"bUX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bUY" = (/obj/item/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/captain) "bUZ" = (/obj/structure/displaycase/captains_laser,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/captain) "bVa" = (/obj/machinery/light{dir = 8},/obj/structure/toilet{dir = 4},/obj/effect/landmark/start{name = "Captain"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/captain/bedroom) @@ -5507,8 +5507,8 @@ "cbU" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/camera{c_tag = "Head of Personnel's Office"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/heads/hop) "cbV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/crew_quarters/heads/hop) "cbW" = (/turf/simulated/floor/plasteel{icon_state = "wood"},/area/ntrep) -"cbX" = (/obj/structure/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Nanotrasen Representative"},/turf/unsimulated/floor/carpet,/area/ntrep) -"cbY" = (/obj/structure/table/wood,/obj/item/paper_bin,/obj/item/paper/ntrep,/obj/item/flashlight/lamp/green{pixel_x = -5; pixel_y = 12},/turf/unsimulated/floor/carpet,/area/ntrep) +"cbX" = (/obj/structure/table/wood,/obj/item/paper_bin,/obj/item/paper/ntrep,/obj/item/flashlight/lamp/green{pixel_x = -5; pixel_y = 12},/turf/simulated/floor/carpet,/area/ntrep) +"cbY" = (/obj/structure/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Nanotrasen Representative"},/turf/simulated/floor/carpet,/area/ntrep) "cbZ" = (/obj/structure/chair/comfy/black{dir = 8},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/ntrep) "cca" = (/obj/machinery/newscaster{pixel_x = -32},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) "ccb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) @@ -5517,14 +5517,14 @@ "cce" = (/obj/structure/table/wood,/obj/machinery/computer/skills{req_one_access = null},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bcarpet05"},/area/blueshield) "ccf" = (/obj/structure/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Blueshield"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bcarpet05"},/area/blueshield) "ccg" = (/turf/simulated/floor/plasteel{icon_state = "wood"},/area/blueshield) -"cch" = (/obj/structure/table/wood,/obj/machinery/status_display{pixel_x = -32},/obj/item/folder/blue,/obj/item/pen/multi/fountain,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/captain/bedroom) +"cch" = (/obj/structure/table/wood,/obj/machinery/status_display{pixel_x = -32},/obj/item/folder/blue,/obj/item/pen/multi/fountain,/obj/item/paper/safe_code{owner = "captain"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/captain/bedroom) "cci" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/chair/comfy/brown{dir = 8},/obj/effect/landmark/start{name = "Captain"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/captain/bedroom) "ccj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/captain/bedroom) "cck" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/captain/bedroom) "ccl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/captain/bedroom) -"ccm" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/door/window{dir = 8; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/captain/bedroom) -"ccn" = (/turf/unsimulated/floor/carpet,/area/crew_quarters/captain/bedroom) -"cco" = (/obj/structure/bed,/obj/item/bedsheet/captain,/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/effect/landmark/start{name = "Captain"},/turf/unsimulated/floor/carpet,/area/crew_quarters/captain/bedroom) +"ccm" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/door/window{dir = 8; req_access_txt = "63"},/obj/structure/safe/floor{knownby = list("captain")},/obj/item/gun/projectile/revolver/russian,/obj/item/reagent_containers/food/drinks/bottle/absinthe/premium,/obj/item/lighter/zippo/nt_rep,/obj/item/storage/fancy/cigarettes/cigpack_robustgold,/obj/item/toy/figure/captain,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/captain/bedroom) +"ccn" = (/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) +"cco" = (/obj/structure/bed,/obj/item/bedsheet/captain,/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/effect/landmark/start{name = "Captain"},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) "ccp" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave,/obj/machinery/newscaster{pixel_x = -32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom) "ccq" = (/obj/structure/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom) "ccr" = (/obj/structure/chair,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/crew_quarters/courtroom) @@ -5597,8 +5597,8 @@ "cdG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/heads/hop) "cdH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/table/wood,/obj/machinery/light{dir = 1},/obj/item/clipboard,/obj/item/toy/figure/hop,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/heads/hop) "cdI" = (/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/obj/machinery/door/window{dir = 2; name = "Desk Door"; req_access_txt = "73"},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/ntrep) -"cdJ" = (/obj/structure/table/wood,/obj/machinery/computer/skills{req_access_txt = "57"},/turf/unsimulated/floor/carpet,/area/ntrep) -"cdK" = (/obj/structure/table/wood,/obj/item/folder,/obj/item/stamp/centcom,/obj/item/pen/multi/fountain,/turf/unsimulated/floor/carpet,/area/ntrep) +"cdJ" = (/obj/structure/table/wood,/obj/item/folder,/obj/item/stamp/centcom,/obj/item/pen/multi/fountain,/turf/simulated/floor/carpet,/area/ntrep) +"cdK" = (/obj/structure/table/wood,/obj/machinery/computer/skills{req_access_txt = "57"},/turf/simulated/floor/carpet,/area/ntrep) "cdL" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/ntrep) "cdM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/landmark/start{name = "Barber"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) "cdN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/chair/barber{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) @@ -5613,8 +5613,8 @@ "cdW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/captain/bedroom) "cdX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/item/twohanded/required/kirbyplants,/obj/machinery/camera{c_tag = "Captain's Quarters"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/captain/bedroom) "cdY" = (/obj/structure/cable,/obj/structure/table/wood,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/window/reinforced{dir = 8},/obj/machinery/recharger,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/captain/bedroom) -"cdZ" = (/obj/structure/filingcabinet,/turf/unsimulated/floor/carpet,/area/crew_quarters/captain/bedroom) -"cea" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/crew_quarters/captain/bedroom) +"cdZ" = (/obj/structure/filingcabinet,/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) +"cea" = (/obj/structure/dresser,/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) "ceb" = (/obj/structure/table,/obj/item/storage/box/donkpockets,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom) "cec" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom) "ced" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom) @@ -5698,8 +5698,8 @@ "cfD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/chair/office/dark,/obj/effect/landmark/start{name = "Head of Personnel"},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/heads/hop) "cfE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/wood,/obj/machinery/recharger,/obj/machinery/newscaster{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/heads/hop) "cfF" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/ntrep) -"cfG" = (/turf/unsimulated/floor/carpet,/area/ntrep) -"cfH" = (/obj/structure/chair/office/dark{dir = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/unsimulated/floor/carpet,/area/ntrep) +"cfG" = (/obj/structure/chair/office/dark{dir = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/carpet,/area/ntrep) +"cfH" = (/turf/simulated/floor/carpet,/area/ntrep) "cfI" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc{cell_type = 25000; dir = 4; name = "east bump"; pixel_x = 24; shock_proof = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/ntrep) "cfJ" = (/obj/item/twohanded/required/kirbyplants,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) "cfK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) @@ -5781,7 +5781,7 @@ "chi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/heads/hop) "chj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/photocopier,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/heads/hop) "chk" = (/obj/structure/bookcase,/obj/item/book/manual/sop_command,/obj/item/book/manual/sop_engineering,/obj/item/book/manual/sop_general,/obj/item/book/manual/sop_legal,/obj/item/book/manual/sop_medical,/obj/item/book/manual/sop_science,/obj/item/book/manual/sop_security,/obj/item/book/manual/sop_service,/obj/item/book/manual/sop_supply,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/ntrep) -"chl" = (/obj/machinery/hologram/holopad,/turf/unsimulated/floor/carpet,/area/ntrep) +"chl" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/ntrep) "chm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light_switch{pixel_x = 25},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/ntrep) "chn" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/civilian/barber) "cho" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Barber Shop"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) @@ -6093,8 +6093,8 @@ "cni" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/library) "cnj" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) "cnk" = (/obj/machinery/door/window/westright{name = "Front Desk"; req_access_txt = "37"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) -"cnl" = (/turf/unsimulated/floor/carpet,/area/library) -"cnm" = (/obj/structure/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Librarian"},/turf/unsimulated/floor/carpet,/area/library) +"cnl" = (/turf/simulated/floor/carpet,/area/library) +"cnm" = (/obj/structure/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Librarian"},/turf/simulated/floor/carpet,/area/library) "cnn" = (/obj/structure/table/wood,/obj/machinery/computer/library/checkout,/obj/machinery/newscaster{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) "cno" = (/obj/structure/table/wood,/obj/item/flashlight/lamp/green,/obj/item/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/heads/hop) "cnp" = (/obj/structure/closet/secure_closet/hop,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/heads/hop) @@ -6158,7 +6158,7 @@ "cov" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/engine/engine_smes) "cow" = (/obj/structure/bookcase,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/library) "cox" = (/obj/structure/table/wood,/obj/item/storage/briefcase,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) -"coy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/unsimulated/floor/carpet,/area/library) +"coy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/carpet,/area/library) "coz" = (/obj/machinery/status_display{pixel_x = 32; pixel_y = 0},/obj/machinery/libraryscanner,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) "coA" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hopprivacy"; name = "HoP Privacy Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/heads/hop) "coB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hopprivacy"; name = "HoP Privacy Blast Doors"; opacity = 0},/obj/machinery/door/airlock/command{name = "Head of Personnel"; req_access = null; req_access_txt = "57"},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/heads/hop) @@ -6472,7 +6472,7 @@ "cux" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/locker) "cuy" = (/obj/structure/table,/obj/item/storage/fancy/crayons,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/locker) "cuz" = (/obj/structure/table,/obj/item/folder,/obj/item/pen,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/locker) -"cuA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/structure/table,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/locker) +"cuA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/structure/table,/obj/item/deck/cards,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/locker) "cuB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/chair/stool,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/locker) "cuC" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/locker) "cuD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/closet/wardrobe/black,/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 2},/area/crew_quarters/locker) @@ -6652,7 +6652,7 @@ "cxV" = (/obj/item/twohanded/required/kirbyplants,/obj/structure/extinguisher_cabinet{pixel_x = -26},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/library) "cxW" = (/obj/structure/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) "cxX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/wood,/obj/item/storage/pill_bottle/dice,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) -"cxY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/wood,/obj/item/toy/cards/deck,/obj/item/toy/cards/deck/black{pixel_x = 0; pixel_y = 6},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) +"cxY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/wood,/obj/item/deck/cards,/obj/item/deck/cards{pixel_x = 0; pixel_y = 6},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) "cxZ" = (/obj/structure/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/library) "cya" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/library) "cyb" = (/obj/item/twohanded/required/kirbyplants,/obj/machinery/newscaster{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/library) @@ -6744,11 +6744,11 @@ "czJ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/assembly/showroom) "czK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/assembly/showroom) "czL" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/assembly/showroom) -"czM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/chair/comfy/brown{dir = 4},/turf/unsimulated/floor/carpet,/area/assembly/showroom) -"czN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/table/wood,/obj/item/reagent_containers/food/drinks/bottle/whiskey,/turf/unsimulated/floor/carpet,/area/assembly/showroom) -"czO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/table/wood,/obj/item/storage/fancy/donut_box,/turf/unsimulated/floor/carpet,/area/assembly/showroom) -"czP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/table/wood,/obj/item/paper_bin,/turf/unsimulated/floor/carpet,/area/assembly/showroom) -"czQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/chair/comfy/black{dir = 8},/turf/unsimulated/floor/carpet,/area/assembly/showroom) +"czM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/chair/comfy/brown{dir = 4},/turf/simulated/floor/carpet,/area/assembly/showroom) +"czN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/table/wood,/obj/item/storage/fancy/donut_box,/turf/simulated/floor/carpet,/area/assembly/showroom) +"czO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/table/wood,/obj/item/reagent_containers/food/drinks/bottle/whiskey,/turf/simulated/floor/carpet,/area/assembly/showroom) +"czP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/chair/comfy/black{dir = 8},/turf/simulated/floor/carpet,/area/assembly/showroom) +"czQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/table/wood,/obj/item/paper_bin,/turf/simulated/floor/carpet,/area/assembly/showroom) "czR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/assembly/showroom) "czS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/assembly/showroom) "czT" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/assembly/showroom) @@ -6825,11 +6825,11 @@ "cBm" = (/obj/structure/table/reinforced,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/item/stack/rods{amount = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva) "cBn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table/wood,/obj/item/clipboard,/obj/item/toy/figure/dsquad,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/assembly/showroom) "cBo" = (/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/assembly/showroom) -"cBp" = (/obj/structure/chair/comfy/black{dir = 4},/turf/unsimulated/floor/carpet,/area/assembly/showroom) -"cBq" = (/obj/structure/table/wood,/obj/item/folder/blue,/obj/item/pen,/turf/unsimulated/floor/carpet,/area/assembly/showroom) -"cBr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table/wood,/obj/item/clothing/mask/cigarette/cigar/havana{pixel_x = -3; pixel_y = 3},/obj/item/clothing/mask/cigarette/cigar/cohiba{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor/carpet,/area/assembly/showroom) -"cBs" = (/obj/structure/table/wood,/obj/item/lighter/zippo,/turf/unsimulated/floor/carpet,/area/assembly/showroom) -"cBt" = (/obj/structure/chair/comfy/brown{dir = 8},/turf/unsimulated/floor/carpet,/area/assembly/showroom) +"cBp" = (/obj/structure/chair/comfy/black{dir = 4},/turf/simulated/floor/carpet,/area/assembly/showroom) +"cBq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table/wood,/obj/item/clothing/mask/cigarette/cigar/havana{pixel_x = -3; pixel_y = 3},/obj/item/clothing/mask/cigarette/cigar/cohiba{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/carpet,/area/assembly/showroom) +"cBr" = (/obj/structure/table/wood,/obj/item/folder/blue,/obj/item/pen,/turf/simulated/floor/carpet,/area/assembly/showroom) +"cBs" = (/obj/structure/chair/comfy/brown{dir = 8},/turf/simulated/floor/carpet,/area/assembly/showroom) +"cBt" = (/obj/structure/table/wood,/obj/item/lighter/zippo,/turf/simulated/floor/carpet,/area/assembly/showroom) "cBu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table/wood,/obj/item/storage/secure/briefcase,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/assembly/showroom) "cBv" = (/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plasteel,/area/gateway) "cBw" = (/obj/structure/table,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/storage/belt,/obj/item/radio,/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel,/area/gateway) @@ -7250,7 +7250,7 @@ "cJv" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/medical/medbay2) "cJw" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/maintenance/starboard) "cJx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/starboard) -"cJy" = (/obj/machinery/door/airlock/glass{name = "Cabin"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/sleep) +"cJy" = (/obj/machinery/door/airlock/glass{name = "Cabin"},/turf/simulated/floor/carpet,/area/crew_quarters/sleep) "cJz" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness) "cJA" = (/obj/structure/window/reinforced,/obj/machinery/door/window{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness) "cJB" = (/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness) @@ -7345,8 +7345,8 @@ "cLm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel,/area/maintenance/starboard) "cLn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/decal/cleanable/cobweb2,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/starboard) "cLo" = (/obj/structure/dresser,/obj/item/radio/intercom{pixel_x = 26; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/sleep) -"cLp" = (/turf/unsimulated/floor/carpet,/area/crew_quarters/sleep) -"cLq" = (/obj/item/twohanded/required/kirbyplants,/obj/item/radio/intercom{pixel_x = 26; pixel_y = 28},/turf/unsimulated/floor/carpet,/area/crew_quarters/sleep) +"cLp" = (/turf/simulated/floor/carpet,/area/crew_quarters/sleep) +"cLq" = (/obj/item/twohanded/required/kirbyplants,/obj/item/radio/intercom{pixel_x = 26; pixel_y = 28},/turf/simulated/floor/carpet,/area/crew_quarters/sleep) "cLr" = (/obj/item/radio/intercom{pixel_x = 26; pixel_y = 28},/obj/machinery/cryopod,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/sleep) "cLs" = (/obj/machinery/vending/cola,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness) "cLt" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/crew_quarters/fitness) @@ -7421,8 +7421,8 @@ "cMK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/maintenance/starboard) "cML" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/starboard) "cMM" = (/obj/structure/bed,/obj/item/bedsheet/red,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/sleep) -"cMN" = (/obj/structure/table/wood,/obj/machinery/newscaster{pixel_x = -32; pixel_y = 0},/obj/item/storage/briefcase,/obj/item/cane,/turf/unsimulated/floor/carpet,/area/crew_quarters/sleep) -"cMO" = (/obj/structure/chair/office/dark{dir = 8},/turf/unsimulated/floor/carpet,/area/crew_quarters/sleep) +"cMN" = (/obj/structure/table/wood,/obj/machinery/newscaster{pixel_x = -32; pixel_y = 0},/obj/item/storage/briefcase,/obj/item/cane,/turf/simulated/floor/carpet,/area/crew_quarters/sleep) +"cMO" = (/obj/structure/chair/office/dark{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/sleep) "cMP" = (/obj/machinery/newscaster{pixel_x = -32; pixel_y = 0},/obj/machinery/cryopod/right,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/sleep) "cMQ" = (/obj/machinery/vending/snack,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness) "cMR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 2},/area/crew_quarters/fitness) @@ -7503,7 +7503,7 @@ "cOo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/starboard) "cOp" = (/obj/structure/table/wood,/obj/machinery/newscaster{pixel_x = -32; pixel_y = 0},/obj/item/paper_bin,/obj/item/pen,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/sleep) "cOq" = (/obj/structure/chair/office/dark,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/sleep) -"cOr" = (/obj/structure/table/wood,/obj/item/folder/red,/obj/item/pen,/turf/unsimulated/floor/carpet,/area/crew_quarters/sleep) +"cOr" = (/obj/structure/table/wood,/obj/item/folder/red,/obj/item/pen,/turf/simulated/floor/carpet,/area/crew_quarters/sleep) "cOs" = (/obj/structure/table,/obj/item/storage/fancy/donut_box,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness) "cOt" = (/obj/structure/chair/stool,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/fitness) "cOu" = (/obj/structure/table,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/fitness) @@ -7596,12 +7596,12 @@ "cQd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard) "cQe" = (/obj/structure/table/wood,/obj/machinery/status_display{pixel_y = -32},/obj/machinery/light,/obj/item/paicard,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/sleep) "cQf" = (/obj/structure/closet/secure_closet/personal/cabinet,/obj/item/clothing/head/kitty,/obj/item/clothing/under/maid,/obj/item/clothing/suit/browntrenchcoat,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/sleep) -"cQg" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/crew_quarters/sleep) -"cQh" = (/obj/structure/bed,/obj/machinery/status_display{pixel_y = -32},/obj/machinery/light,/obj/item/bedsheet/yellow,/turf/unsimulated/floor/carpet,/area/crew_quarters/sleep) -"cQi" = (/obj/structure/closet/secure_closet/personal/cabinet,/turf/unsimulated/floor/carpet,/area/crew_quarters/sleep) +"cQg" = (/obj/structure/dresser,/turf/simulated/floor/carpet,/area/crew_quarters/sleep) +"cQh" = (/obj/structure/closet/secure_closet/personal/cabinet,/turf/simulated/floor/carpet,/area/crew_quarters/sleep) +"cQi" = (/obj/structure/bed,/obj/machinery/status_display{pixel_y = -32},/obj/machinery/light,/obj/item/bedsheet/yellow,/turf/simulated/floor/carpet,/area/crew_quarters/sleep) "cQj" = (/obj/machinery/light,/obj/machinery/computer/cryopod{pixel_y = -32},/obj/machinery/camera{c_tag = "Cryodorms Aft"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/sleep) "cQk" = (/obj/structure/table,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness) -"cQl" = (/obj/structure/table,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/fitness) +"cQl" = (/obj/structure/table,/obj/item/deck/cards,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/fitness) "cQm" = (/obj/structure/table,/obj/item/storage/firstaid/regular,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/fitness) "cQn" = (/obj/structure/table,/obj/item/paper_bin,/obj/item/pen,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/fitness) "cQo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/chair{dir = 4},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 2},/area/crew_quarters/fitness) @@ -9590,7 +9590,7 @@ "dCv" = (/obj/structure/table/wood,/obj/item/storage/fancy/cigarettes/cigpack_uplift,/obj/item/storage/fancy/cigarettes/cigpack_carp,/obj/item/lighter/zippo,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) "dCw" = (/obj/structure/rack,/obj/item/storage/briefcase,/obj/item/storage/secure/briefcase,/turf/simulated/floor/plating,/area/security/detectives_office) "dCx" = (/obj/structure/grille,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plating/airless,/area/engine/engineering) -"dCy" = (/turf/unsimulated/wall,/area/toxins/test_area) +"dCy" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/toxins/test_area) "dCz" = (/obj/machinery/camera{active_power_usage = 0; c_tag = "Bomb Test Site"; dir = 4; invuln = 1; network = list("SS13,Toxins"); use_power = 0},/obj/item/target,/turf/simulated/floor/plating/airless,/area/toxins/test_area) "dCA" = (/obj/structure/chair{dir = 8},/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plating/airless,/area/toxins/test_area) "dCB" = (/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plating/airless,/area/toxins/mixing) @@ -9846,7 +9846,7 @@ "dHr" = (/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/library/abandoned) "dHs" = (/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/library/abandoned) "dHt" = (/obj/structure/bookcase,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/library/abandoned) -"dHu" = (/obj/structure/table/wood,/obj/item/toy/cards/deck,/obj/item/toy/cards/deck/black{pixel_x = 0; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/library/abandoned) +"dHu" = (/obj/structure/table/wood,/obj/item/deck/cards,/obj/item/deck/cards{pixel_x = 0; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/library/abandoned) "dHv" = (/obj/structure/table/wood,/obj/item/clipboard,/obj/item/folder/red,/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/library/abandoned) "dHw" = (/obj/structure/chair/office/dark{dir = 8},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/plating,/area/library/abandoned) "dHx" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "neutral"},/area/maintenance/fpmaint2) @@ -10187,7 +10187,7 @@ "dNU" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/shuttle/escape) "dNV" = (/obj/machinery/sleeper,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/shuttle/escape) "dNW" = (/obj/structure/filingcabinet/chestdrawer,/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel,/area/medical/virology) -"dNX" = (/obj/item/twohanded/required/kirbyplants,/obj/machinery/light{dir = 1; on = 1},/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel,/area/medical/virology) +"dNX" = (/obj/machinery/light{dir = 1; on = 1},/obj/effect/decal/warning_stripes/yellow/hollow,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/item/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel,/area/medical/virology) "dNY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel,/area/medical/virology) "dNZ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/surgery1) "dOa" = (/obj/machinery/door/airlock/medical/glass{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/shuttle/escape) @@ -10470,9 +10470,9 @@ "dTr" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/obj/machinery/light/small{dir = 1},/obj/machinery/light_switch{pixel_x = -26; pixel_y = -4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) "dTs" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) "dTt" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) -"dTu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table/wood,/obj/item/flashlight/lamp,/turf/unsimulated/floor/carpet,/area/chapel/office) -"dTv" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/wood,/obj/item/folder,/obj/item/pen,/turf/unsimulated/floor/carpet,/area/chapel/office) -"dTw" = (/obj/structure/table/wood,/obj/item/storage/fancy/donut_box,/turf/unsimulated/floor/carpet,/area/chapel/office) +"dTu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology) +"dTv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) +"dTw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table/wood,/obj/item/flashlight/lamp,/turf/simulated/floor/carpet,/area/chapel/office) "dTx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "viro_lab_airlock_exterior"; locked = 1; name = "Virology Lab External Airlock"; req_access_txt = "39"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.6; master_tag = "viro_lab_airlock_control"; name = "Virology Lab Access Button"; pixel_x = -24; pixel_y = 0; req_access_txt = "39"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay) "dTy" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/wall,/area/security/checkpoint) "dTz" = (/obj/structure/table/reinforced,/obj/item/storage/backpack/medic,/obj/item/storage/belt/medical,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/shuttle/escape) @@ -10507,9 +10507,9 @@ "dUc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) "dUd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/airlock/centcom{name = "Chapel Office"; opacity = 1; req_access_txt = "27"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) "dUe" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) -"dUf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/item/paper_bin,/obj/structure/table/wood,/obj/item/pen,/turf/unsimulated/floor/carpet,/area/chapel/office) -"dUg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; level = 1},/obj/structure/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Chaplain"},/turf/unsimulated/floor/carpet,/area/chapel/office) -"dUh" = (/obj/structure/table/wood,/obj/machinery/newscaster{pixel_x = 32; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/storage/fancy/candle_box{pixel_x = 2; pixel_y = 3},/obj/item/storage/fancy/candle_box,/turf/unsimulated/floor/carpet,/area/chapel/office) +"dUf" = (/obj/structure/table/wood,/obj/item/storage/fancy/donut_box,/turf/simulated/floor/carpet,/area/chapel/office) +"dUg" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/wood,/obj/item/folder,/obj/item/pen,/turf/simulated/floor/carpet,/area/chapel/office) +"dUh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/item/paper_bin,/obj/structure/table/wood,/obj/item/pen,/turf/simulated/floor/carpet,/area/chapel/office) "dUi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/twohanded/required/kirbyplants,/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plasteel,/area/maintenance/fpmaint2) "dUj" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/table/reinforced,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/obj/item/crowbar,/obj/item/wrench,/obj/item/radio,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/checkpoint) "dUk" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/security/checkpoint) @@ -10544,8 +10544,8 @@ "dUN" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/light_switch{pixel_x = 26; pixel_y = -4},/obj/structure/closet/secure_closet/chaplain,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) "dUO" = (/obj/structure/table/wood,/obj/item/clipboard,/obj/item/toy/figure/chaplain,/obj/machinery/firealarm{dir = 4; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) "dUP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) -"dUQ" = (/turf/unsimulated/floor/carpet,/area/chapel/office) -"dUR" = (/obj/structure/table/wood,/obj/item/storage/fancy/crayons,/obj/machinery/camera{c_tag = "Chaplain's Office"; dir = 1; network = list("SS13")},/obj/machinery/requests_console{department = "Chapel"; departmentType = 2; name = "Chapel Requests Console"; pixel_y = -30},/turf/unsimulated/floor/carpet,/area/chapel/office) +"dUQ" = (/obj/structure/table/wood,/obj/machinery/newscaster{pixel_x = 32; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/storage/fancy/candle_box{pixel_x = 2; pixel_y = 3},/obj/item/storage/fancy/candle_box,/turf/simulated/floor/carpet,/area/chapel/office) +"dUR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; level = 1},/obj/structure/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Chaplain"},/turf/simulated/floor/carpet,/area/chapel/office) "dUS" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plasteel,/area/maintenance/fpmaint2) "dUT" = (/obj/structure/table/reinforced,/obj/machinery/newscaster/security_unit{pixel_y = -32},/obj/machinery/recharger,/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/security/checkpoint) "dUU" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/item/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 2; icon_state = "red"},/area/security/checkpoint) @@ -10755,6 +10755,8 @@ "dYQ" = (/turf/space,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "arrival_south_airlock"; name = "exterior access button"; pixel_x = 24; pixel_y = 24; req_access_txt = "10;13"},/turf/simulated/floor/plating/airless/catwalk,/area/space) "dYR" = (/turf/space,/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/turf/simulated/floor/plating/airless/catwalk,/area/maintenance/portsolar) "dYS" = (/turf/space,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating/airless/catwalk,/area/maintenance/portsolar) +"dYT" = (/turf/simulated/floor/carpet,/area/chapel/office) +"dYU" = (/obj/structure/table/wood,/obj/item/storage/fancy/crayons,/obj/machinery/camera{c_tag = "Chaplain's Office"; dir = 1; network = list("SS13")},/obj/machinery/requests_console{department = "Chapel"; departmentType = 2; name = "Chapel Requests Console"; pixel_y = -30},/turf/simulated/floor/carpet,/area/chapel/office) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10821,8 +10823,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabiabiabiabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCacCadbadbadbahwadbaooaooaooaooaooaooaopahyaooaooaooaooaonaosaosaotaosaosaouaovaowaoyaozaoFaoAaovaoBaoCaoCaoDaoCaoCalIalIalIalIaoEaoGamFaoHaoIaoJaoKaoJaoIaoLaoMaphaoNaoOalIabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajOaoQaknaknaknaomajOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZaaaaaaaaaaaaaaaaaaaaaaaaabjaaaabjaaaabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjalIaorapJaoSaooaoTaoUaoVaoWaoXaoYaoZapaapbapcaooaoqaosapeapfapgaosapiapuapjacCacCacCapkapuapvaoCaplapmapnaoCapoappapqaprapsaptalNapwambapxapyapzapAapWalIapYapBapCalIabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajOapDapEalBapDapEajOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabjapFabjabjaaaaaaaaaaaaaaaabjabjaaaaaaaaaaaaaaaabiabiabiabiabiabjabiabiabiabjabiabiabiabiabiabjabiabiaaaaaaabjabjapGapGapGapHapGapHapHapHapHapHapGapHapHabjalIaoRapIapKaooapLapMapNapOapOapPapQapRapSapTaooapUaosapVaqgapXaqiapZaovaqaaqbaqcaqdaqeaovaqfaquaqharMaqjaoCanxaqkaqlaqmaqnaqoalIaqpalIalIaqpalIalIalIalIalIalIalIalIabjabiabiaaaabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajOaqqaqraknaqsaqtajOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabiabiabjabiabiabiabjasUabjabjabiabiabiabjabiabiaaaaaaaaaaaaaaaaaaabjabjabjaaaabjaaaabjaaaabjaaaabjaaaaaaabjabjabjabjaaaaaaaaaabjaaaapGaqvaqwaqxaqyaqzaqAaqBaqCaqzaqDaqEapHabjalIaqFarIaqHaooaqIaqJaqKaqLaqMaqNapQaqOaqPaqQaooapUaosaqRaqSaqTaotaqUaovaqVaqWaqWaqXaqYanRaqZaoDaraarbarcaoCardaobalIalIarearealIarfargarhariarjamQareabjabjabjabjabjabjabjabjabjabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajOarkarlaknarmarnajOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiaaaaaaaaaabjaaaaaaabjasUabjaaaaaaaaaaaaaaaaaaabiabjaaaaaaaaaaaaaaaabiaaaabjabjabiabiabiabiabjabiabiabiabjabiabiabiabjabiabiabjabjabjapHaroarparqarrarsartaruarvarwarxaryapHabjalIalZarIarzaooarAarBarCaqLapMarDarEarFarGarGapdarHaosarJarKarLarQasAaovarOaqWarPaqWarOaovasWasXarRarSarTaoCamOarUalIarVarWarXarYarWarZalZasaameasbalIabjascascascasdascascasdasdasdacFabjacFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakQakmaseasfasgakmakLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabiabiabjabiabiabiabjasUabjabjabiabiabiabjabiabiaaaaaaaaaaaaaaaaaaabjabjabjaaaabjaaaabjaaaabjaaaabjaaaaaaabjabjabjabjaaaaaaaaaabjaaaapGaqvaqwaqxaqyaqzaqAaqBaqCaqzaqDaqEapHabjalIaqFarIaqHaooaqIaqJaqLaqKaqMaqNapQaqOaqPaqQaooapUaosaqRaqSaqTaotaqUaovaqVaqWaqWaqXaqYanRaqZaoDaraarbarcaoCardaobalIalIarearealIarfargarhariarjamQareabjabjabjabjabjabjabjabjabjabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajOarkarlaknarmarnajOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiaaaaaaaaaabjaaaaaaabjasUabjaaaaaaaaaaaaaaaaaaabiabjaaaaaaaaaaaaaaaabiaaaabjabjabiabiabiabiabjabiabiabiabjabiabiabiabjabiabiabjabjabjapHaroarparqarrarsartaruarvarwarxaryapHabjalIalZarIarzaooarAarBarCaqKapMarDarEarFarGarGapdarHaosarJarKarLarQasAaovarOaqWarPaqWarOaovasWasXarRarSarTaoCamOarUalIarVarWarXarYarWarZalZasaameasbalIabjascascascasdascascasdasdasdacFabjacFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakQakmaseasfasgakmakLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjabjashashashashashabjasUabjashashashashashabjabjaaaaaaaaaaaaaaaaaaabiaaaabiaaaabjabjaaaabjaaaabjaaaabjaaaabjaaaabjabjabjabjabjabjaaaapHaqwasiasjaskaskaskaslasmasnarsasoapHabjalIasparNasqaooasraqMapMapMasraqNassaqNastasuaooasvaosaswasxasyaszasYasBasCasDaqWaqWasEaovasZasFasGarbasHaoCardamPalIasIasJasKambalZasLasMasNameasOamhacFascasPasQafOaqGaqGasRasSasTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakQakmakmakmakLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiaaaasVataataataataatbatcatKatLatLatLatLatUaaaabiabiaaaaaaaaaaaaaaaabiabjabiabjatdatdatdatdatdatdatdatdatdatdatdatdatdatdatdabjabjabjapHatearpatfatgathatiatjatkatlatmatnapGabjalIambatoatpaooaoTatqatratsattatuatvatuatwatxaooatyaosatzatAatBaosasYaovaqeatCatDatEatFaovasZaoCatGatHatIaoCatJavdaveatMatNatOatOatPatQatRambatRatSamhacFascatTauAasdatVausatWatXasdacFabjacFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabiabjatYatYatYatYatYabjatZabjatYatYatYatYatYabjabjabiabjabjabiabiabjabiabjabjabjatdauaaubaubaubaucaubaudaubaueaubaubaufaugatdaaaabjaaaapGauhauiaujaukarsaulaumaunarrauoaupapGamhalIalIauqalIaooaooaooaooaooaooaooaooaooaooaooaooauraosaosavfaosaosawhapuapkadbadbadbapjapuaxiaoCaoCautaoCawxauuauvalIauwauxasJasMasMalZasKasJambauyareabjasdauzawAasdauBauCauZavvauEabjaaaaaaaaaaaaaaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10844,11 +10846,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjabjaGXaGXaGXaKYaKZaLcaLaaLbaLkaLdaLeaLfaLgaLhaLiaLjaPsaLmaLnaLoaLqaLpaPEaLsaLtaLuaLqatdaLvaLwaMxatdabjabjaEpalIalJaLxasqaqlambaqlaLyaLzaLAalZaLBaLCalZaLDaFraLEaLFaLGaLHaLHaLIaLJaLKaFAaLLaLMaLNaLOaLPaFAaQtaTpaTpaTpaVQaTpaZZaLUaBCaCyaJcaQpaLWaLXaLYaLZaNyaJhaMbaMcaMdaMeaQoaMgaESaMhaBSaMiaMjaMkaMkaMjaMlaKIaDXaJEaBZabjaaaaMmaMnaMoaMoaMoaMnaMpaaaaaaaaaabjaaZaaaabjaaaabiaaaabjaGTaGTaGTaGTaGVaGTaMqaMraMsaMtaMqaGUaGTaMuaJCaGTaMvaIOaIOaIOaMvabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFaLTacFacFaMyaMyaMyaMyaMzaMAaLkaMBaMCaMDaMIaMFaMGaMHaMKaMJaMLaMMaMNatdaRaaMPaMQaMRaNZatdaMSaMTaMUatdabjaaaaJzalIalIalIalIalIaqFaMVaMVaMWaMWaMWaMXaMYaMWaMZaFraNaaNbaNcaNdaNeaHFaNfaNgaFAaFAaFAaFAaFAaFAaFAaNhaNiaNiaNiaNiaNiaNjaLUaBCaCyaRHaJdaNlaNmaNnaNoaTiaJhaGOaNqaNraNsaGOaNtaCNaNuaEYaQqaBSaOSaQraEXaEZaKIaSwaQsaBZabjaaaaaaaNzaNAaNAaNAaNBaaaaaaaaaaaaabjaaaaaaabjaaaabjaaaabjaGUaNCaMqaNDaNEaNFaNGaNHaNIaNJaNKaNLaNMaNNaNOaNPaMvaNQaNRaNSaMvabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFabjaNTaMyaMyaNUaNVaNWaNXaNYaOdaOaaObaOcaOhaObaObaOeaOfaOgaOgaOjaOgaOgaOgaOiaOmaOkaOgaOgaOgaOgaOgaOlabjabjaOUaOWaOoaOWaFzalIambaMVaOpaOqaOraOsaOtaOuaMWaOvaOwaOxaOxaOxaOxaOxaOxaOyaOzaLUaOAaOBaOCaODaOEaOFaNiaOGaLRaLRaLRaNiaNiaOHaBCaCyaOIaGKaOJaOKaOLaNoaOMaONaGOaOOaOPaKEaGOaQuaBSaNuaCNaORaCNaCNaCNaBSaBSaKIaQvaQvaBZabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaaaaaabjaaaabjabjabjaGUaOTaOXaOVaPbaPcaOVaOYaOZaPaaOVaPcaQAaPdaPeaPfaMvaPgaPhaPiaPjabjabiaaaaaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFaaaaPkaPlaPmaPnaPoaPpaPqaPraPtaPBaPuaPvaPwaPwaPwaPxaPyaPzaPAaTraPAaPCaPAaPDaTTaPFaPGaPHaPHaPHaPIaOgabjaaaabjaaaabjaaaaJzalIambaMWaPJaPKaPLaPMaPNaPOaMVaOvaOwaPPaPQaPRaPSaPTaOxaOyaOzaLUaPUaPVaPWaPXaPYaPZaNiaQaaQbaQcaQdaLRaNiaOHaBCaCyaCzaGKaQeaQfaQgaQhaQiaJhaQjaQkaQlaQmaJiaSqaKKaTVaUjaUoaWuaWzaKKaWCaWGaXUaYtaYtaQwabjabjabjabjabjabjabjabjabjabjabiabiabiabiabiabiabjabjaGTaGTaGTaGTaGTaQxaQyaQzaSnaQBaQCaQDaQEaNOaQFaQGaQHaQIaMvaQJaQKaQLaMvabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFabjaNTaMyaMyaQMaQNaQOaQNaQPaQQaQRaObaQSaQTaQUaQVaQWaQXaQYaQZaUMaQZaRbaRcaRdaTTaReaRfaRgaRhaRiaPHaOgabjabjabjabjabjabjaEpalIawZaMYaRjaRkaRlaRmaRnaRoaMWaMZaOwaRpaRqaRraRqaOnaRsaRtaRvaLUaRwaRxaPWaRyaRzaRAaNiaRBaRCaRDaREaRFaRGaXRaRIaRJaRKaGKaRLaRMaRNaROaGKaRPaMbaRQaRRaRSaRTaRUaRVazLaRWaRXaRVazLazLaRYaRZaSaaSaaSaaSbaScaSdaSeaSbaSfaSgaSgaSgabjaaaabjaaaaaaaaaaaaaaaaaaabjaGTaShaSiaSjaGTaSkaSlaSmaWNaSoaSpaQEaTbaSraQFaSsaPjaMvaMvaStaSuaSvaMvaMvaMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFacFaWRaSxaMyaSyaMyaMyaMyaGZaSzaGZaOgaSAaSBaSCaSDaSEaSDaSFaSDaSDaSDaSGaSDaSDaSHaSIaSDaSDaSJaSKaSLaOgaSMaSNaSNaSNaSNaSNaJzalIawZaSOaSPaSPaRmaSQaSRaRmaSOaRuaSSaSUaSTaSWaSXaSVaSYaSZaTaaTcaTdaTeaTfaTgaRzaRAaNiaNiaNiaThaNiaNiaNiaZfaBCaTjaCzaGKaGKaJdaJeaTlaGKaTmaTnaToaNvaTqaTnaZtaTsaTtaDUaTuaBSaTvaTwaTxaSaaTyaTzaTAaTBaTCaTDaTEaSbaSfaSgaSgaSgabjabjabjabjabjabjabiabiabiabjaGTaTFaTGaTHaGTaMqaTIaMqaMqaMqaTJaMqaMqaMqaTKaMqaMvaTLaTMaTNaTOaTPaTQaTRaMvbaOabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaaabjaTSaZYaTUaZYaTUaZYaTUbaaabjaOgaTWaTXaTYaTZaUaaTZaUbaTZaTZaTZaUcaTZaTZaUdaUeaTZaTZaUfaUgaUhaUibaNaUkaUlaUmaUnaSNaEpamhalZaXeaUpaRmaUqaUraUsaUtaUuaUvaUwaUxaUyaUzaUyaUAaUBaUCaUDaUEaUFaUGaPXaUHaRzaRAaNiaLRaUIaUJaUIaUKaULbcwaDJaCyaCzaGKaUNaUOaUPaUQaURaUSaUTaUUaUVaUWayDaUXaUYaUZaDUaTuaBSaUZaVaaVbaVcaVdaVeaVfaVgaVhaViaVjaSbaSfaSfaSgaSfaaaabjaaaaaaabjaaaaaaaaaabjaaaaGTaVkaTGaVlaGUaVmaVnaVoaMqaVmaVpaVqaMqaVraVsaVtaMvaVuaVvaVwaVxaVyaVzaVAaPjaVBaMqaaaabiabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjabjabiaaaabiabjaSNaSNaSNaSNaSNaSMaOgaVCaVDaVEaVFaVGaVFaVHaVIaVJaVIaVKaVIaVLaVMaVNaVOaVFaVPbcyaPHaObaSMaVRaVSaVTaVUaSNaJzamhalZaMWaOsaVVaRoaVWaVXaOsaMWaOvaOwaVYaVZaWaaWbaWcaOxaOyaWdaLUaWeaWfaPXaPXaRzaPZaNiaLSaWgaWhaWiaWjaNiaOHaBCaWkaTkaWmaWnaWoaWpaWqaWraWraWsaWraWsaWtbaiaWvaWwaWxaWybbhaWAaWAaWAaWBbbjaWDaWEaWFbbkaWHaWIaWJaSbaSfaSfaSgaSfaaaabjaaaaaaabjaaaaaaaaaabjaaaaGTaWKaTGaWLaGTaWMbaPaWOaMqaWPaWQaWOaMqaWPbaSaWOaMvaWSaWTaWUaWVaWWaWXaWYaPjaWZaMqabjabjabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFaaaaPkaPlaPmaPnaPoaPpaPqaPraPtaPBaPuaPvaPwaPwaPwaPxaPyaPzaPAaTraPAaPCaPAaPDaTTaPFaPGaPHaPHaPHaPIaOgabjaaaabjaaaabjaaaaJzalIambaMWaPJaPKaPLaPMaPNaPOaMVaOvaOwaPPaPQaPRaPSaPTaOxaOyaOzaLUaPUaPVaPXaPWaPYaPZaNiaQaaQbaQcaQdaLRaNiaOHaBCaCyaCzaGKaQeaQfaQgaQhaQiaJhaQjaQkaQlaQmaJiaSqaKKaTVaUjaUoaWuaWzaKKaWCaWGaXUaYtaYtaQwabjabjabjabjabjabjabjabjabjabjabiabiabiabiabiabiabjabjaGTaGTaGTaGTaGTaQxaQyaQzaSnaQBaQCaQDaQEaNOaQFaQGaQHaQIaMvaQJaQKaQLaMvabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFabjaNTaMyaMyaQMaQNaQOaQNaQPaQQaQRaObaQSaQTaQUaQVaQWaQXaQYaQZaUMaQZaRbaRcaRdaTTaReaRfaRgaRhaRiaPHaOgabjabjabjabjabjabjaEpalIawZaMYaRjaRkaRlaRmaRnaRoaMWaMZaOwaRpaRqaRraRqaOnaRsaRtaRvaLUaRwaRxaPXaRyaRzaRAaNiaRBaRCaRDaREaRFaRGaXRaRIaRJaRKaGKaRLaRMaRNaROaGKaRPaMbaRQaRRaRSaRTaRUaRVazLaRWaRXaRVazLazLaRYaRZaSaaSaaSaaSbaScaSdaSeaSbaSfaSgaSgaSgabjaaaabjaaaaaaaaaaaaaaaaaaabjaGTaShaSiaSjaGTaSkaSlaSmaWNaSoaSpaQEaTbaSraQFaSsaPjaMvaMvaStaSuaSvaMvaMvaMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFacFaWRaSxaMyaSyaMyaMyaMyaGZaSzaGZaOgaSAaSBaSCaSDaSEaSDaSFaSDaSDaSDaSGaSDaSDaSHaSIaSDaSDaSJaSKaSLaOgaSMaSNaSNaSNaSNaSNaJzalIawZaSOaSPaSPaRmaSQaSRaRmaSOaRuaSSaSUaSTaSWaSXaSVaSYaSZaTaaTcaTdaTeaTgaTfaRzaRAaNiaNiaNiaThaNiaNiaNiaZfaBCaTjaCzaGKaGKaJdaJeaTlaGKaTmaTnaToaNvaTqaTnaZtaTsaTtaDUaTuaBSaTvaTwaTxaSaaTyaTzaTAaTBaTCaTDaTEaSbaSfaSgaSgaSgabjabjabjabjabjabjabiabiabiabjaGTaTFaTGaTHaGTaMqaTIaMqaMqaMqaTJaMqaMqaMqaTKaMqaMvaTLaTMaTNaTOaTPaTQaTRaMvbaOabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaaabjaTSaZYaTUaZYaTUaZYaTUbaaabjaOgaTWaTXaTYaTZaUaaTZaUbaTZaTZaTZaUcaTZaTZaUdaUeaTZaTZaUfaUgaUhaUibaNaUkaUlaUmaUnaSNaEpamhalZaXeaUpaRmaUqaUraUsaUtaUuaUvaUwaUxaUyaUzaUyaUAaUBaUCaUDaUEaUFaUGaPWaUHaRzaRAaNiaLRaUIaUJaUIaUKaULbcwaDJaCyaCzaGKaUNaUOaUPaUQaURaUSaUTaUUaUVaUWayDaUXaUYaUZaDUaTuaBSaUZaVaaVbaVcaVdaVeaVfaVgaVhaViaVjaSbaSfaSfaSgaSfaaaabjaaaaaaabjaaaaaaaaaabjaaaaGTaVkaTGaVlaGUaVmaVnaVoaMqaVmaVpaVqaMqaVraVsaVtaMvaVuaVvaVwaVxaVyaVzaVAaPjaVBaMqaaaabiabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjabjabiaaaabiabjaSNaSNaSNaSNaSNaSMaOgaVCaVDaVEaVFaVGaVFaVHaVIaVJaVIaVKaVIaVLaVMaVNaVOaVFaVPbcyaPHaObaSMaVRaVSaVTaVUaSNaJzamhalZaMWaOsaVVaRoaVWaVXaOsaMWaOvaOwaVYaVZaWaaWbaWcaOxaOyaWdaLUaWeaWfaPWaPWaRzaPZaNiaLSaWgaWhaWiaWjaNiaOHaBCaWkaTkaWmaWnaWoaWpaWqaWraWraWsaWraWsaWtbaiaWvaWwaWxaWybbhaWAaWAaWAaWBbbjaWDaWEaWFbbkaWHaWIaWJaSbaSfaSfaSgaSfaaaabjaaaaaaabjaaaaaaaaaabjaaaaGTaWKaTGaWLaGTaWMbaPaWOaMqaWPaWQaWOaMqaWPbaSaWOaMvaWSaWTaWUaWVaWWaWXaWYaPjaWZaMqabjabjabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjabjabjabiabjaSNaXaaXbaXcaXdbbFaXfaXgaXhaXiaXjaXkaXlaXmaXnaXoaObaXpaObaXoaXqaXraXsaXtaXuaXvaXwaUibaNaUkaXxaUnaUnaSNaEpamhambaMWaMYaMWaMWaMWaMXaMWaMWaXyaOwaOxaOxaOxaOxaOxaOxaXzaXAaLUaXBaXCaXDaXEaXFaXGaXHaNiaLRaLRaLRaXIaNiaOHaBCaXJaWlaXKaXLaXNaXOaXPaXQaXMaXSaXQaXQaXTbcIaXVaXWaXXaXYaXZaYaaYbaYcaYdaYeaYfaYgaYgaYhaYiaViaYjaSbaSfaSgaSgaSgabjabjabjabjabjabjabjaGTaGTaGTaGTaYkaYlaYmaGTaYnaYoaMqaMqaYnaYpaMqaMqaYnaYqaMqaGTaGTaYraYsaGTaGTaGTaGTaGTaZVaMqaMqaMqaMqaMqaGTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZaaaaaaaaaabjaaaabiaaaaSNaYuaYvaYwaVRaSMaObaTWaYxaYyaYzaYAaYBaYCaYDaYEaYFaYGaYHaXoaYIaYJaXsaYKaYLaYMaYNaYOaSMaSNaSNaSNaSNaSNaJzalIambaBoaqlaYPaCoaYQaYRawgaYSaYTaYUavOalLaEyauVaYVaYWaYXaYYaYZaZaaYZaYZaYZaYZaYZaZbaNiaNiaNiaNiaNiaZcaLUaZdaZeaEFaJdaZgaZhaZiaZjaZjaZjaZkaZjaZjaZlaZmaZnaZoaZpaZqbcJbcKbcLaZuaZvaZwaZxaZyaZzaZAaZBaZCaZDaSbaSfaSgaSgaSgabjaaaaaaaaaabjaaaaaaaGVaZEaZFaZGaZHaZIaZJaZKaZLaZMaZKaZNaZOaZPaZQaZKaZRaZSaZKaZKaZTaZPaZUaZWaZXbadaZWbdabrzbfSbabbacbprbaebaebafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabjabiabjaSNaXaaXabagbahbuXbajbakbalaYybamaYAbanbaobapaObbaqbarbasaObbatbaubavbawaXubaxbayaXfbbFaXdbazbaAbaBaSNaEpamhaqFbaCbaDalZalZaOvbaEbaFbaGbaHbaIbaJbaJbaJbaJbaJaHFbaKbaLaYZbaMbaQbcsbctbcuaYZbaRaTpaTpaNiaVQbRqbaTaLUbaUaCyaCzaGKbaVbaWbaXbaYbaZbaYbbabbbbbcbbdbbebbfbbgbcObbibbebbebbebelbeyaSbbblaSaaSbaSbaScbbmaSeaSbabjabjabjabjabjaaaaaaaaaabjaaaaaabbnbbobbpbbqbbrbbsbbtbbubbubbvbbubbwbbxbbvbbybbubbsbbvbbzbbubbsbbvbbAbbBbbDbbHbbBbbEbvBbbGbcWbbGbbIbbJbbKbbLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10871,22 +10873,22 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibpmbx aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjbmobzubmsbtdbzvbzwbzxbzybzzbzzbLPbzzbzAbzBbzCbzDbzvbtdbmobzubmsabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabjabiabjbwNbzEbzEbzEbzEbzFbzGbzHbzIbzJbzKbwNbzLbBsbzLbylbzNbzNbzObzNbzPbzQbzRbylbzSbBmbzTbwPbzUbzVbzWaOgbzXbzYbzZbAabAbbAcbAdbAebAfbrWbAgbAhbAibAjbAibApbAkbxhbAlbAmbAnbAnbAnbAobBWbAnbAnbAnbAnbAqbuVbuWaotbArbAsaotbAtbAubAvaosbAwbAxbAybyUbyUbAzbyUbyUbyWbyUbyUbAAbyUbABbACbADbAEaosbAFbAGbAtaotbAsbAraotbAHbvabvbbtHaaabtLbvcbAIbAJbAKbvcbtLabjbvhacFbswbALbALbALbswbsAbsBbsBbsZbAMbANbANbAObAPbAQbARbASbATbAUbAVbAWbAXbAYbAVbAZbBabBbbBcbhhaaaabjaaaabiabjabiabiabiabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibmobzubmsbtdbtdbtdbBdbBebBfbtdbBgbtdbwLbBhbBdbtdbtdbtdbmobzubmsabiabjabjabjabiabiabiabjabiabiabiabjabiabiabiabiabjabiabiabiabiabiabiabjabjaaaabiabjbwNbzEbBibBjbBibBkbBlbBobBnbBpbBrbBqbBtbPKbDebBubBvbBwbBxbBybBzbBubBAbBBbBCbBDbBEbBFbBGbBHbBIaOgbBJbBKbBLbBMbBNaOgbyFbBObrVbrWbBPbBQbBRbBSbBRbBTbBUbxhapUbBVbBXbBYbBZbCabCbbCcbCdbCgbCebqmbCfbDGbChbCibCjbCkbClbClbCmbCnbCobCpbClbClbClbCqbCrbCsbCtbCrbCrbCubClbCvbClbCwbCxbCybCzbClbClbCAbCBbClbCAbCCbCDbCEbsvabjbtLbtLbtLbtLbtLbtLbtLaaaabjaaabCFbCGbCGbCGbCHaaabCIbCJbEwbCLbCMbIdbCObCPbnobCQbCRbCSbhhbhhbhhbhhbhhbhhbhhbhhbhhbhhbhhaaaabiabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibpmbzubpubtdbtdbCTbCUbCVbBfbCWbCXbCYbwLbCZbCUbDabtdbtdbpmbzubpuabiaaaaaaaaaaaaaaaaaaaaaabjaaaaaaaaaaaaaaaaaaabjaaaaaaabjaaaabjaaaabjaaaabiabjabiabjbwNbDbbBjbDcbBjbzEbDdbBobDfbDhbDgbDibDjbDkbDlbEJbDmbDnbDobDpbDqbDrbDsbEPbDtbDubDvbDvbDwbDxbDyaOgaOgaOgbDzbDAbDAbDAbDBbDCbDDbrWbDEbDFbDHbBSbDJbBTbDIbxhapUbBVbDPbDKbDLbDLbDMbDNbDObDSbDQbDRbvachBbDTbDUbDVbDWbDXbDXbDYbDZbEabEbbDUbDUbEcbEdbEebEfbEgbEhbEibEjbEkbDUbDUbEabDUbElbEmbDUbDUbDTbEnbDUbDTbEobEpbEqbsvaaaaaaabjaaaaaaaaaabjaaaaaaabjaaaaaaaaaaaaaaaaaaaaaabjbCJbErbEsbEtbnobnobnobnobEubEvbEBbExbEybEzbEybEybEAbGmbECbExabjabjabjabiabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibmobzubmsbtdbtdbtdbBdbBebEDbtdbEEbtdbEFbBhbBdbtdbtdbtdbmobzubmsabiabjabjabjabjabiabiabiabiabiabjabiabiabiabjabiabiabjabiabiabiabjabiabjabiaaaabiabjbwNbzEbBibEGbBibEHbBlbBobEIbEKbEMbELbENbEObGtbylbETbEQbERbESbEUbylbIxbIybEVbEWbEXbEXbEYbEZbFabFbbFcbylbFdbFebFfbFgbyFbBObFhbrWbFibDFbFjbBSbFkbBTbFlbxhatybBVbFmbFnbFobFpbFobFobFqbFrbDQbDRbFsbFtbFubFvbFwaszbFxbFybFzbFAbFBbFCbFDbFybFEbFFbFGbFHbFIbFJbFKbFLbFMbFybFybFNbFObFPbFybFQbFxaszbAsbFRaszbAHbFsbEqbngbngbngbngbngbngbqCbngbFSbFSbFTbFUbFSbFVbFWbFSbFSbFSbFSbFSbFXbFYbFZbGabGbbGcbGdbGebGfbGgbGhbGibGjbGkbGlbGnbIfbGobGpaaaaaaaaaabiaaaabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabiabjabibpmbzubmsbtdbvzbzwbBfbBebBfbtdbtdbtdbwLbBhbBfbGqbvzbtdbmobzubpuabiabiabjabiaaaaaaaaaaaaaaaabjaaaaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaaabiabjabjabjbwNbzEbGBbzEbzEbGrbGsbGubGvbGwbGxbwNbGybIpbGzbGzbGzbGzbGzbGzbGzbGzbylbGAbQpbGCbGDbGEbGFbGGbGHbGIbGIbGJbGKbGMbGLbGNbGObGQbGRbrWbGSbGTbGUbGPbGWbGXbGYbxhayibBVbGVbFnbHabGZbHbbHdbHebHcbHfbHgbvabHibHjbHjbHjbHjbHkbHkbHkbHlbHmbHkbHkbHnbHobHpbHqbHrbHsbHtbHubHvbHwbHnbHxbHybHxbHzbHxbHxbHxbHxbHxbHxbHxbHAbHBbHCbHDbHEbHFbuYbHHbHFbHFbHIbFSbHJbHKbHLbHMbHNbHObHPbFSbHQbHRbFSbMcbHTbHUbGabHVbHWbHXbHYbHZbNmbExbIbbIcbEybNVbIebLYbECbExabjabjabjabiabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibmobzubmsbtdbtdbtdbBdbBebEDbtdbEEbtdbEFbBhbBdbtdbtdbtdbmobzubmsabiabjabjabjabjabiabiabiabiabiabjabiabiabiabjabiabiabjabiabiabiabjabiabjabiaaaabiabjbwNbzEbBibEGbBibEHbBlbBobEIbEKbEMbELbENbEObGtbylbETbEQbERbESbEUbylbIxbIybEVbEWbEXbEXbEYbEZbFabFbbFcbylbFdbFebFfbFgbyFbBObFhbrWbFibDFbFjbBSbFkbBTbFlbxhatybBVbFmbFnbFobFpbFobFobFqbFrbDQbDRbFsbFtbFubFvbFwaszbFxbFybFzbFAbFBbFCbFDbFybFEbFFbFGbFIbFHbFJbFKbFLbFMbFybFybFNbFObFPbFybFQbFxaszbAsbFRaszbAHbFsbEqbngbngbngbngbngbngbqCbngbFSbFSbFTbFUbFSbFVbFWbFSbFSbFSbFSbFSbFXbFYbFZbGabGbbGcbGdbGebGfbGgbGhbGibGjbGkbGlbGnbIfbGobGpaaaaaaaaaabiaaaabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabiabjabibpmbzubmsbtdbvzbzwbBfbBebBfbtdbtdbtdbwLbBhbBfbGqbvzbtdbmobzubpuabiabiabjabiaaaaaaaaaaaaaaaabjaaaaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaaabiabjabjabjbwNbzEbGBbzEbzEbGrbGsbGubGvbGwbGxbwNbGybIpbGzbGzbGzbGzbGzbGzbGzbGzbylbGAbQpbGCbGDbGEbGFbGGbGHbGIbGIbGJbGKbGMbGLbGNbGObGQbGRbrWbGSbGTbGUbGPbGWbGXbGYbxhayibBVbGVbFnbHabGZbHbbHdbHebHcbHfbHgbvabHibHjbHjbHjbHjbHkbHkbHkbHlbHmbHkbHkbHnbHobHpbHqbHsbHrbHtbHubHvbHwbHnbHxbHybHxbHzbHxbHxbHxbHxbHxbHxbHxbHAbHBbHCbHDbHEbHFbuYbHHbHFbHFbHIbFSbHJbHKbHLbHMbHNbHObHPbFSbHQbHRbFSbMcbHTbHUbGabHVbHWbHXbHYbHZbNmbExbIbbIcbEybNVbIebLYbECbExabjabjabjabiabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiaaabktbkubnMbzubpubtdbtdbzDbIgbIhbBfbIibIjbIkbIlbImbInbIobtdbtdbpmbzubnRbkubktaaaabiabjabjabjabjabjabjabjabjabjabjabjabjabjaaaaaaabjaaaaaaabjaaaabjaaaabiabjbwNbwNbwNbwNbwNbwNbwNbwNbwNbwNbwNbwNbLXbwTbGzbIqbIrbIsbItbIubIvbIwbKibKjbIzbEWbIAbEXbIBbICbHhbIEbIFbIGbIDbIHbIIbIKbILbIMbFhbrWbINbDFbIJbIPbIObBTbIRbxhapUbBVbIQbFnbFobHbbISbFobIUbITbIVcusbvabIXbHjbIYbIZbJabJbbJcbJdbJebJfbJgbHjbJhbJhbJhbJhbJhbJibJhbJhbJhbJhbJhbHxbJjbJkbJlbJmbJnbJobJpbJqbJrbHxbuZbvabvbbngbngbngbxxbngbqCbqCbJtbJubJvbJwbJxbJybJxbJzbJAbJBbJCbJDbFSbJEbJFbHUbGabJGbJHbJIbEubJJbJKbExbJLbJMbGpbJNbJNbJNbJNbJNbJNbJNabjabjabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibmobJObJPbJPbJQbmsbtdbzvbJRbBfbJSbJTbJTbJUbJVbJTbJWbBfbzwbzvbtdbmobJXbJPbJPbJYbnRbkuaaaaaaabjaaaaaaabjaaaaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaZabiabjabiabjabjabjabjabjabjabjabjabjbwPbJZbylbKabKbbKcbGzbKdbKebKfbKfbKgbKhbKkbKCbLWbKlbKmbKnbKobKpbKqbEWbIAbKrbKsbKtbIWbKvbKwbKxbIMbFhbrWbKybDFbKubIPbKzbBTbKBbxhapUbBVbKAbFnbFobKDbFobFobFqbFrbDQbDRbvabIXbKEbKFbKGbKHbKIbKJbKKbKLbKMbKNbKObJhbKPbKQbKRbKSbKTbKUbKVbKQbKWbJhbKXbKYbKZbLabLbbLcbLdbLebLfbLgbHxbuZbvabvbbLhbLibLjbLkbLlbLmbLnbLnbFSbLobLpbLqbLrbLsbLtbLubLvbLwbLxbFSbLybJFbLzbLAbLBbCSbLBbLCbubbLDbJLbLEbLFbLGbJNbLHbLIbLJbLKbLLbJNabjabiabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibpmbzubLMbrrbrsaaabtdbtdbtdbwGbLNbLObNLbCUbwLbBfbLQbwGbtdbtdbtdaaabrsbLRbLSbLTbLUbLVbUJbUJbUJbUJbUJbUJbUJbUJbUJbVfabjabjabjabjabjabjabjabjabjabjabjaaaabiabiabjabiabiabjabiabjbVsbXFbPDbPEbPFbMdbMebMfbGzbMgbMhbMibMjbMkbMlbMmbIxbNTbMobMpbMqbMrbMsbMtbMubMvbMwbMxbMybMzbMAbMBbILbIMbFhbrWbMCbDFbMDbIPbBRbBTbMEbxhbMFbBVbLZbMHbMIbMJbIUbMIbMKbMGbDQbDRbvabIXbKEbMMbMNbMObMPbMQbMRbMSbMTbMUbMVbJhbMWbMXbMXbMYbMZbMYbMXbMXbNabJhbNbbKYbLbbNcbNdbNebNfbNgbLfbNhbHxbuZbvabvbbLhbNibNjbNkbNlbTdbLnbNnbNobLpbNpbNqbNrbNsbNtbNubFSbNvbNwbFSbJEbNxbHUbGabNybNzbGdbNAbNHbLDbNIbNDbNEbNFbNGbLHbNJbPybPAbNKbJNabjabiaaaabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjbmobRubmsbNMbNMbNMbNMbNMbNMbNMbNNbNMbNObNPbNQbNMbNRbNMbNMbNMbNMbNMbNMbNMbmobRvbLMbrraaaaaaabjaaaaaaabjaaaaaaaaabXGaaaaaaabjaaaaaaabjaaaaaaabjaaaabjaaaabjaaaabjaaaaaaabjaaaaaabYaabjbRwbVtbVzbNWbNXbNYbGzbNZbOabObbOcbOdbOebOfbGzbGzbGzbGzbGzbGzbOgbNUbOibylbOhbMxbOkbOlbOmbMBbOnbOobOpbrWbOqbOjbOrbOsbOtbOubOwbxhbOvbBVbOxbOybOzbOAbOBbFrbPYbPZbOCbODbvabIXbKEbOEbKGbOFbOGbOHbOIbOJbOKbOLbOMbONbOObOPbMXbMYbOQbMYbMXbORbOSbOTbOUbOVbOWbOXbOYbOZbLcbPabLcbPbbHxbuZbvabPcbLhbPdbPebPfbPgbPhbLnbPibPjbPkbPlbPmbPnbPobPpbPqbFSbPrbPsbFSbJEbJFbHUbGabHVblXbPtbHYbHZbLDbJLbPubPvbPwbPxbLHbQnbPzbQobPBbJNabjabiabjabiaaaaaaaaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibpmbzubPCbNMbPGbPHbPObPPbPQbNMbPIbPJbSobPLbPMbPJbPIbNMbPNbQCbQDbRtbPNbNMbPRbzubPCbkubkubkubPSbPTbPUbPVbPWbPXabjbYlbUJbUJbUJbUJbUJbYmbYmbYmbYmbYmbYmbYmbYmbYmbYmbYmbYmbYmbYmbYmbYJabjbwPbwPbwPbQbbQcbQdbGzbQebQfbUqbQhbMkbMlbQibQjbQkbQlbQmbVrbGzbQqbQAbRSbQrbQsbKsbQtbQubQvbMBbILbIMbQwbrWbrWbrWbQxbUrbrWbrWbrWbxhbUtbBVbCebDQbDQbSebIVbDQbDQbOCbQBbSgbSibSzbHjbQEbQFbQGbKNbQHbQIbQJbKMbHjbHjbJhbQKbMYbMXbQLbQMbQLbMXbMYbQNbJhbHxbHxbQObQPbQQbQRbQSbHxbQTbQUbHxcoEbSibSVbQVbLhbQWbQXbQYbLhbLnbLnbLnbFSbFSbQZbRabRbbRcbFSbFSbFSbFSbFSbRdbJFbHUbGabRebRfbRgbRhbRibRjbExbRkbRlbWhbJNbRnbQnbRobQobRpbJNbWCabiabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibmobRrbRsbNMbRxbSrbTcbUDbXmbNMbRybRzbRAbRBbRCbRDbREbRFbVjbRHbRHbRIbREbRFbRJbRKbRLbRLbRLbRLbRMbRNbROabjbRPbRQbRRabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjabjabjbZfbRTbNXbRUbNYbGzbRVbOabRWbRXbRYbRZbSabSbbScbSdbScbTVbSfbTWbShbTXbSjbSkbSlbSmbSnbXEbMBbILbSpbSqbVCbStbStbSubSvbStbStbSsbSwbSxbSybTYbStbStbTZbUabSAbStbSsbXybyObSCbSDbSEbSEbSEbSEbSEbSEbSFbSEbSGbSEaaabJhbSHbSIbMXbSJbSKbSLbMXbSMbSNbJhaaabHxbSObSPbSQbSRbSSbSTbSTbSTbSTbwmbwnbSUbXCbSWbSXbSYbSZbTabTbbQzbXDbTbbTbbTebTfbTbbTgbThbThbTibTbbQzbTjbTkbTlbLAbLBbLBbLBbTmbubbLDbExbTnbNEbTobNGbTpbQnbTqbQobTrbJNabjabjaaaabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibpmbRrbTsbTtbTubTvbTwbTxbTybTzbTAbTBbTCbTDbTEbTFbTGbTHbTIbTJbTKbTLbTGbTMbTNbTObTPbTQbTRbTSbTTbTUbZwchwchwcjlcnHcoicsrcsrcoicsrcsrcoicsrcsrcoicsrcsrcoicsrcsrcoicsrcsrcoicsrcsrcsrcsrcsyctIbUcbUdbUebUfbGzbUgbUhbUibUjbUkbUlbUmbUnbUobUpbUobWIbGzbWKbUsbWNbUubUvbUwbUxbUybUzbMBbUAbUBbUCcjAbUEbUEbUFbUGbUEbUEbUEbUHbUEbUFbWObUEbUEbUEbUEbUIbUEbUEbYBbUKbULbUMbUNbUObSEbUPbUQbURbUSbUTbUUbSEabjbJhbJhbJhbJhbJhbJhbJhbJhbJhbJhbJhabjbHxbUVbUWbUXbUYbUZbSTbVabVbbSTbVcbVdbVebYLbVgbVgbVgbVhbVgbVibVBbVgbVgbVgbVkbVlbVgbVmbVnbVobVgbVgbVBbVhbVpbVqbWebWrbWsbWebVubVvbVwbVxbVycsMbVAbXbbXobXqbVEbXrbVGbJNaaaabiabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibmobJObJPbJPbJQbmsbtdbzvbJRbBfbJSbJTbJTbJUbJVbJTbJWbBfbzwbzvbtdbmobJXbJPbJPbJYbnRbkuaaaaaaabjaaaaaaabjaaaaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaZabiabjabiabjabjabjabjabjabjabjabjabjbwPbJZbylbKabKbbKcbGzbKdbKebKfbKfbKgbKhbKkbKCbLWbKlbKmbKnbKobKpbKqbEWbIAbKrbKsbKtbIWbKvbKwbKxbIMbFhbrWbKybDFbKubIPbKzbBTbKBbxhapUbBVbKAbFnbFobKDbFobFobFqbFrbDQbDRbvabIXbKEbKFbKGbKIbKHbKKbKJbKLbKMbKNbKObJhbKPbKQbKRbKSbKTbKUbKVbKQbKWbJhbKXbKYbKZbLabLbbLcbLdbLebLfbLgbHxbuZbvabvbbLhbLibLjbLkbLlbLmbLnbLnbFSbLobLpbLqbLrbLsbLtbLubLvbLwbLxbFSbLybJFbLzbLAbLBbCSbLBbLCbubbLDbJLbLEbLFbLGbJNbLHbLIbLJbLKbLLbJNabjabiabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibpmbzubLMbrrbrsaaabtdbtdbtdbwGbLNbLObNLbCUbwLbBfbLQbwGbtdbtdbtdaaabrsbLRbLSbLTbLUbLVbUJbUJbUJbUJbUJbUJbUJbUJbUJbVfabjabjabjabjabjabjabjabjabjabjabjaaaabiabiabjabiabiabjabiabjbVsbXFbPDbPEbPFbMdbMebMfbGzbMgbMhbMibMjbMkbMlbMmbIxbNTbMobMpbMqbMrbMsbMtbMubMvbMwbMxbMybMzbMAbMBbILbIMbFhbrWbMCbDFbMDbIPbBRbBTbMEbxhbMFbBVbLZbMHbMIbMJbIUbMIbMKbMGbDQbDRbvabIXbKEbMMbMNbMPbMObMRbMQbMSbMTbMUbMVbJhbMWbMXbMXbMYbMZbMYbMXbMXbNabJhbNbbKYbLbbNcbNdbNebNfbNgbLfbNhbHxbuZbvabvbbLhbNibNjbNkbNlbTdbLnbNnbNobLpbNpbNqbNrbNsbNtbNubFSbNvbNwbFSbJEbNxbHUbGabNybNzbGdbNAbNHbLDbNIbNDbNEbNFbNGbLHbNJbPybPAbNKbJNabjabiaaaabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjbmobRubmsbNMbNMbNMbNMbNMbNMbNMbNNbNMbNObNPbNQbNMbNRbNMbNMbNMbNMbNMbNMbNMbmobRvbLMbrraaaaaaabjaaaaaaabjaaaaaaaaabXGaaaaaaabjaaaaaaabjaaaaaaabjaaaabjaaaabjaaaabjaaaaaaabjaaaaaabYaabjbRwbVtbVzbNWbNXbNYbGzbNZbOabObbOcbOdbOebOfbGzbGzbGzbGzbGzbGzbOgbNUbOibylbOhbMxbOkbOlbOmbMBbOnbOobOpbrWbOqbOjbOrbOsbOtbOubOwbxhbOvbBVbOxbOybOzbOAbOBbFrbPYbPZbOCbODbvabIXbKEbOEbKGbOGbOFbOIbOHbOJbOKbOLbOMbONbOObOPbMXbMYbOQbMYbMXbORbOSbOTbOUbOVbOWbOXbOYbOZbLcbPabLcbPbbHxbuZbvabPcbLhbPdbPebPfbPgbPhbLnbPibPjbPkbPlbPmbPnbPobPpbPqbFSbPrbPsbFSbJEbJFbHUbGabHVblXbPtbHYbHZbLDbJLbPubPvbPwbPxbLHbQnbPzbQobPBbJNabjabiabjabiaaaaaaaaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibpmbzubPCbNMbPGbPHbPObPPbPQbNMbPIbPJbSobPLbPMbPJbPIbNMbPNbQCbQDbRtbPNbNMbPRbzubPCbkubkubkubPSbPTbPUbPVbPWbPXabjbYlbUJbUJbUJbUJbUJbYmbYmbYmbYmbYmbYmbYmbYmbYmbYmbYmbYmbYmbYmbYmbYJabjbwPbwPbwPbQbbQcbQdbGzbQebQfbUqbQhbMkbMlbQibQjbQkbQlbQmbVrbGzbQqbQAbRSbQrbQsbKsbQtbQubQvbMBbILbIMbQwbrWbrWbrWbQxbUrbrWbrWbrWbxhbUtbBVbCebDQbDQbSebIVbDQbDQbOCbQBbSgbSibSzbHjbQEbQFbQGbKNbQHbQIbQJbKMbHjbHjbJhbQKbMYbMXbQLbQMbQLbMXbMYbQNbJhbHxbHxbQObQQbQPbQRbQSbHxbQTbQUbHxcoEbSibSVbQVbLhbQWbQXbQYbLhbLnbLnbLnbFSbFSbQZbRabRbbRcbFSbFSbFSbFSbFSbRdbJFbHUbGabRebRfbRgbRhbRibRjbExbRkbRlbWhbJNbRnbQnbRobQobRpbJNbWCabiabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibmobRrbRsbNMbRxbSrbTcbUDbXmbNMbRybRzbRAbRBbRCbRDbREbRFbVjbRHbRHbRIbREbRFbRJbRKbRLbRLbRLbRLbRMbRNbROabjbRPbRQbRRabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjabjabjbZfbRTbNXbRUbNYbGzbRVbOabRWbRXbRYbRZbSabSbbScbSdbScbTVbSfbTWbShbTXbSjbSkbSlbSmbSnbXEbMBbILbSpbSqbVCbStbStbSubSvbStbStbSsbSwbSxbSybTYbStbStbTZbUabSAbStbSsbXybyObSCbSDbSEbSEbSEbSEbSEbSEbSFbSEbSGbSEaaabJhbSHbSIbMXbSJbSKbSLbMXbSMbSNbJhaaabHxbSObSQbSPbSRbSSbSTbSTbSTbSTbwmbwnbSUbXCbSWbSXbSYbSZbTabTbbQzbXDbTbbTbbTebTfbTbbTgbThbThbTibTbbQzbTjbTkbTlbLAbLBbLBbLBbTmbubbLDbExbTnbNEbTobNGbTpbQnbTqbQobTrbJNabjabjaaaabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibpmbRrbTsbTtbTubTvbTwbTxbTybTzbTAbTBbTCbTDbTEbTFbTGbTHbTIbTJbTKbTLbTGbTMbTNbTObTPbTQbTRbTSbTTbTUbZwchwchwcjlcnHcoicsrcsrcoicsrcsrcoicsrcsrcoicsrcsrcoicsrcsrcoicsrcsrcoicsrcsrcsrcsrcsyctIbUcbUdbUebUfbGzbUgbUhbUibUjbUkbUlbUmbUnbUobUpbUobWIbGzbWKbUsbWNbUubUvbUwbUxbUybUzbMBbUAbUBbUCcjAbUEbUEbUFbUGbUEbUEbUEbUHbUEbUFbWObUEbUEbUEbUEbUIbUEbUEbYBbUKbULbUMbUNbUObSEbUPbUQbURbUSbUTbUUbSEabjbJhbJhbJhbJhbJhbJhbJhbJhbJhbJhbJhabjbHxbUVbUXbUWbUYbUZbSTbVabVbbSTbVcbVdbVebYLbVgbVgbVgbVhbVgbVibVBbVgbVgbVgbVkbVlbVgbVmbVnbVobVgbVgbVBbVhbVpbVqbWebWrbWsbWebVubVvbVwbVxbVycsMbVAbXbbXobXqbVEbXrbVGbJNaaaabiabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjbmobLTbVHbVIbVJbVKbVLbVMbVNbVIbVObVPbVQbVRbVSbVPbVTbVIbVUbVKbVMbVMbVTbVIbVVbVWbpqbpqbpqbpqbVXbVYbVZabjbWabWbbWcabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjabjbWdctJbWfbWgcgDbWibGzbWjbWkbWlbWmbWnbIqbGzbOfbWobWpbWqbOfbGzbYocbRcfBbWtbWubWvbWwbWxbWybMBbWzbWAbWBcpPbWDbWEbWFbWGbWDbWDbWEbWHbWDbWFcgCbWDbWDbWDbWJbWDbWDbWDchbbWLbvabWMcgEcgFbWPbWQbWRbWSbWTbWUbWVbSEaaaaaaabjaaaaaaaaaabjaaaaaaaaaabjaaaaaabHxbHxbWWbHxbWXbHxbSTbWYbWZbSTbuZbvabXaciAbXcbXdbXcbXebXcbXfbVDbXcbXcbXcbXhbXebXibXjbXkbXlbXkcazbVDbXnbXBbXpbGabXVbXWbXsbEublWbXtbXubXvbXwbXxbXXbXzbXzbXAbYCbNKbJNaaaabiaaaabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibpmbzubrqbNMccxcgIchuchEcmxbNMbPIbXHbXIbXJbPMbXKbXLbNMbPNbXMbXNbXObXPbNMbrwbzubrqbrrbrrbrrbPSbXQbXRbPVbXSbXTabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjaaaabjabjbXUbXUbXUbXUbXUbXUbXUbXUbXUbXUbXUbXUbXUbXUbXUbXUbXUbXUbXYbYccxEcxEcxFbQrbXZciabYbbQrclobMBbMBbYdbMBbMBbYebYfbYgbYhbYhbYibYhbYjbYjbYkcqHcrsbYkbYjbYjbYjbYjbYjbYjbYjbYjbYjbYnbuZbvabWMbtHcnWbYpbYqbYrbYsbYtbWUbYubSEbYvbYvbYvbYvbYvbYwbYwbYwbYxbYxbYxbYxbYxbSTbYybYzbYAcbzcfabYDbYEbYFbSTbuZbvabuWbYGbYHbYIbZibYKbYHbYHbYHbYHbYHbYHbVFbYHbYMbYMbYNbYObYNbYMbYMbYPbYQbYRbYSbYTbYUbYSbYVbnqbYWbYXbYYbYZbZabZbbZcbZdbZecaPbZgbJNabjabiabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibmobzubmsbNMbNMbNMbNMbNMbNMbNMbNMbNMbNObZhbNQbNMbNMbNMbNMbNMbNMbNMbNMbNMbmobzubmsabiaaaaaaabjaaaaaaabjaaaaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaaaaaaaabjabjbXUbXUbXUbXUbZjbZjbZkbZlbZmbXUbXUbXUbZnbZlbZobZlcbcbXUbZpbZqbZrbZsbZtbZubZvbZvcbubZxbZybZzbZAbZBbZCbZDbZDbZEbXUbYhbZFbYhbYhbZGbZHbZIbYjbZJbZKbZLbZMbZNbZObYjbZPbZQbZRbYjbZSbZQbZRbYjbZTbZUbZVbtHcnWbZWbZXbWRbZYbZZbWUcaabSEcabcaccadcaebYvcafcagcahbYxcaicajcakcalbSTcamcancaocapcaqcarcascatbSTbwmbZUcaubYHcavcawcaxcayccObYKcaAcaBcaCcaDcaEcaFbYMcaGcaHcaIcaJcaKcaLbhfcaMbhfbLAbLBbLBbLBcaNcaOcgebExbJLcaQbGpbJNbJNcaRcaSbJNbJNbJNaaaabiaaaabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibpmbzubnRbktbktbktbkuaaabJhcaTcaUcaVcaWcaXcaYcaVcaZcaTbJhaaabkubktbktbkubnMbzubpuabiabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabiaaacbabXUcbacbbcbbcbbcbdcbbcbebZlbZlbZlcdbcbbcbdcbbcbfcbgcbhcbicbjcbkcblcbmcbncbocbncbpcbqcbrcbscbtcfgcbvcbwcbxbXUcbycdgcbAcbBcbCcbDcbEbYjcbFcbGbZLcbHcbIcbJbYjcbKcbLcbMbYjcbNcbOcbMbYjbuZbvacbPcbQcpfbYpcbSbYrbYscbTcbUcbVbSEcbWcbXcbYcbZbYvccaccbcccbYxccdcceccfccgbSTcchcciccjcckcclccmccnccobSTbuZbvabuWbYHccpcawccqccqccqbYKccrccscctccuccvccwbXgccycczccAccBccCcaLccDccEccFbLAccGccHbhfccIccJbGgccKccLccMccNcggccPccPccQccRccSbLAaaaabiaaaabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjbmobJXbJPbJPbJPbJPbJYbpubJhccTbMYccUccVccWccXccYbMYccZbJhbpmbJObJPbJPbJPbJPbJQbmsabiaaaaaaabjaaaaaaabjaaaaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaaaaaaaabiabjcbabXUcbaabjcdccxGcxGcxGcxGcFLcbbdtIcxGcxGcxGcxGcgBbXUbXUcddbXUcdecdfcdhcdhcdhcdjcdicdkcdlcdmceTcdncdocdpcdqbXUcdrcdscdtcducdvbZHcdwbYjcdxcdycdzbZMcdAcdBbYjbYjcdCbYjbYjbYjcdCbYjbYjbuZbvabWMbtHcnWcdDcdEbWRbZYcdFcdGcdHbSEcdIcdJcdKcdLbYvcdMcdNcdObYxcdPcdQcdRcdSbSTcdTcdUcdVcdWcdXcdYcdZceabSTbuZbvabuWbYHcebceccedceeccqbYKcefcegcehceicejcekcelcemcenceocepceqcaLcercescetbGdceucevcewcexceycezceAceBceCceDceEceFceEceGceHbHWceIabjabjabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiaaabrsbrrbrsbrrbLSbzubmsceJceKceLceMceNceOcePceQceLceRceSbmobzubLMbrrbrsbrrbrsaaaabjaaaaaaabjaaaaaaabjaaaaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjabjabiaaacbabXUcbaaaaaaaabjaaaabjaaaacFabjacFaaaabjaaaabjaaacdcbXUceUceVceWceXceYceYceZcfccfbcfecfdceYcgHcffciXcfhcficfjcfkcflcfmcfncfobZHcfpbYjcfqcfrbZLbZMcfscftcfucfvcfwcfxcfycfzcfwcfAbYkbuZbvabWMctEcnWbYpcfCcfDbYsbYtbWUcfEbSEcfFcfGcfHcfIbYvcfJcfKcfLbYxcfMcfNcfOcfPbSTbSTbSTbSTcfQcfRbSTbSTbSTbSTbuZbvacfSbYHcayceccedcedcedcfTcfUcfVcfWcfXcfYcfZbYMcgacgbcgccgdcgScaLcgfchKcghcgicgjcgkbRgcglcgmbRjbLAcgncgocgpcgqcgrcgscgrcgoccSbLAaaaabiaaaabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabiabiabjabiabibmobzubmscgtcaUcgucgvcgwcgxcgycgzcgAcaUcgtbmobzubmsabiabiabiabjabiabiaaaaaaabjaaaaaaabjaaaaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabiaaaabjabjbXUbXUbXUcmCctYczwczwcBUczwczwcBUczwczwcBUczwczwcHtabjcgGcibciccidcgJcigcihcgMcfccgNcfecgOcgPcikbXUbXUbXUbXUbXUcbCcgRctScgTcEFctTcgVbYjcgWcgXbZLcbHcgYcgYcgYcgYcgZcgYcgYcgYcgZchactUchcbEpbSDchdchebSEchfchgchhchibWUchjbSEchkcfGchlchmbYvchnchochpbYxchqchrcfOchschtcgQcgQchvcsLchxchychzchAchtbuZbvachBcfTchCchDcaxcaxcaxcgKchFcgLchHchIcttctVbYMchLchMchNchOchPcaLbLAbLAbLAbLAbLAbLAbLAbGachQchRbLAbLAbLAbLAbLAbJIbLAbJIbLAbLAbLAaaaabiaaaabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibpmbzubnRbktbktbktbkuaaabJhcaTcaUcaVcaWcaXcaYcaVcaZcaTbJhaaabkubktbktbkubnMbzubpuabiabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabjabiaaacbabXUcbacbbcbbcbbcbdcbbcbebZlbZlbZlcdbcbbcbdcbbcbfcbgcbhcbicbjcbkcblcbmcbncbocbncbpcbqcbrcbscbtcfgcbvcbwcbxbXUcbycdgcbAcbBcbCcbDcbEbYjcbFcbGbZLcbHcbIcbJbYjcbKcbLcbMbYjcbNcbOcbMbYjbuZbvacbPcbQcpfbYpcbSbYrbYscbTcbUcbVbSEcbWcbYcbXcbZbYvccaccbcccbYxccdcceccfccgbSTcchcciccjcckcclccmccnccobSTbuZbvabuWbYHccpcawccqccqccqbYKccrccscctccuccvccwbXgccycczccAccBccCcaLccDccEccFbLAccGccHbhfccIccJbGgccKccLccMccNcggccPccPccQccRccSbLAaaaabiaaaabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjbmobJXbJPbJPbJPbJPbJYbpubJhccTbMYccUccVccWccXccYbMYccZbJhbpmbJObJPbJPbJPbJPbJQbmsabiaaaaaaabjaaaaaaabjaaaaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaaaaaaaabiabjcbabXUcbaabjcdccxGcxGcxGcxGcFLcbbdtIcxGcxGcxGcxGcgBbXUbXUcddbXUcdecdfcdhcdhcdhcdjcdicdkcdlcdmceTcdncdocdpcdqbXUcdrcdscdtcducdvbZHcdwbYjcdxcdycdzbZMcdAcdBbYjbYjcdCbYjbYjbYjcdCbYjbYjbuZbvabWMbtHcnWcdDcdEbWRbZYcdFcdGcdHbSEcdIcdKcdJcdLbYvcdMcdNcdObYxcdPcdQcdRcdSbSTcdTcdUcdVcdWcdXcdYcdZceabSTbuZbvabuWbYHcebceccedceeccqbYKcefcegcehceicejcekcelcemcenceocepceqcaLcercescetbGdceucevcewcexceycezceAceBceCceDceEceFceEceGceHbHWceIabjabjabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiaaabrsbrrbrsbrrbLSbzubmsceJceKceLceMceNceOcePceQceLceRceSbmobzubLMbrrbrsbrrbrsaaaabjaaaaaaabjaaaaaaabjaaaaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjabjabiaaacbabXUcbaaaaaaaabjaaaabjaaaacFabjacFaaaabjaaaabjaaacdcbXUceUceVceWceXceYceYceZcfccfbcfecfdceYcgHcffciXcfhcficfjcfkcflcfmcfncfobZHcfpbYjcfqcfrbZLbZMcfscftcfucfvcfwcfxcfycfzcfwcfAbYkbuZbvabWMctEcnWbYpcfCcfDbYsbYtbWUcfEbSEcfFcfHcfGcfIbYvcfJcfKcfLbYxcfMcfNcfOcfPbSTbSTbSTbSTcfQcfRbSTbSTbSTbSTbuZbvacfSbYHcayceccedcedcedcfTcfUcfVcfWcfXcfYcfZbYMcgacgbcgccgdcgScaLcgfchKcghcgicgjcgkbRgcglcgmbRjbLAcgncgocgpcgqcgrcgscgrcgoccSbLAaaaabiaaaabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabiabiabjabiabibmobzubmscgtcaUcgucgvcgwcgxcgycgzcgAcaUcgtbmobzubmsabiabiabiabjabiabiaaaaaaabjaaaaaaabjaaaaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabjaaaaaaabiaaaabjabjbXUbXUbXUcmCctYczwczwcBUczwczwcBUczwczwcBUczwczwcHtabjcgGcibciccidcgJcigcihcgMcfccgNcfecgOcgPcikbXUbXUbXUbXUbXUcbCcgRctScgTcEFctTcgVbYjcgWcgXbZLcbHcgYcgYcgYcgYcgZcgYcgYcgYcgZchactUchcbEpbSDchdchebSEchfchgchhchibWUchjbSEchkcfHchlchmbYvchnchochpbYxchqchrcfOchschtcgQcgQchvcsLchxchychzchAchtbuZbvachBcfTchCchDcaxcaxcaxcgKchFcgLchHchIcttctVbYMchLchMchNchOchPcaLbLAbLAbLAbLAbLAbLAbLAbGachQchRbLAbLAbLAbLAbLAbJIbLAbJIbLAbLAbLAaaaabiaaaabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibpmchSbpubJhchTchUchVccUchWccUchXchYchZbJhbpmchSbpuabiaaaaaaabjaaaabjabjabiabiabiabjabiabiabiabiabjabiabiabiabiabjabiabiabiabiabiabjabiaaaabiaaaciebXUcieaaacJecjHcjIcjJcjIcjIcjJcjIcjIcjJcjIcjIcjKcifcgGcibcjLcjMciicbncbncijcfccfbcjNcilcimcjObXUcincbAcipciqcdvcirciscdtcbCcbDcitbYjcgXciucivciwcixciycixcixcixcixcixcixcixcizctWbWLbvabHibSEbSEbSEciBciCciDbZZbWUciEbSEciFciGciHciIciJciKciLciMciNciOciPciQciRchtcgQcgQciSciSciTciUciSciSchtciVbwnciWcuiciYciZcjacjbcjacjccjdcjecjfcjgcjhcjibYMbYMbYMcjjcjkbYMbYMcHucjmcjncjocjpcjqcjrcjscjtcjucjvcjwcjxcjycjzcjBcjzckEcjraaaaaaaaaabjaaaabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibmobrpbmsbJhbJhcjCcjDbMYcjEbMYcjFcjGbJhbJhbmobrpbmsabjaaaaaaabjaaaabjaaaabjaaaabjaaaaaaabjaaaabjaaaabjaaaaaaabjaaaabjaaaaaaabjaaaaaaabiabjabiabjciebXUcieaaacJeclpcnZabjabjcoaaaaacFabjabjcqNcifcobcdacgGcibcjPcjQcjRcjScjTcjUcfccgNcfecltcmMcmNbXUcjVciocjWcjXcjZckackbckbckcckdckeckfckgckgckhckickjckjckjckjckjckjckjckjckkcklbYkbuZbvackmbSEcknckociBckpckqckrbWUcksbSEbYvcktbYvckubYvciKciLckvbYxckwbYxckxbYxchtckyckzckAckBckCcjYckDckFckGckHckIckJbYKcaxcawckKckLccqbYKckMckNckOckPckQchJbYHckRckSckTckUckVckWckXckWckWckYckWckZclaclbclccldcleclfclfclgclgclhcliclfcljabjabjabjabjabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabibmocujbmsabjbJhbJhclkcllclmcaUclnbJhbJhabjbmocvSbmsabiabjabjabjabjabiabiabiabiabiabiabjabiabiabiabiabiabjabiabiabiabiabjabiabiabjabjabiaaaabiaaaciebXUcieaaacKjcuOabjaaaaaaacFabjacFaaaaaaabjaaacobcgGcgGcgGclqclrclsbXUbXUcmPcfccfbcfecluclvclvclvclvclvclwclvclvclvclvclvclvclxclyclzclAclAclBbZMclCclCckjclCclCclDclEclFclGclHbYjbuZbvabIXbSEclIclJclKclLclMclNclOclPbSEaaaabjbHjclQclRclSclTclRclUclVbHjabjaaachtclWclXclYclZcmacmbcmccmdchtbuZbvacmebYHcmfcawccqcmgccqbYKcmhcmicmjcmkcmlcmmbYHcmncmocmpcmqcmrcmrcmscmrcmscmtcmucmvcmwcmycmzcmFcmAcmBcutcmDcmEcmHcmGcnFcmIaaaabjaaaabiaaaabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10899,8 +10901,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabiabiabiabjabiabiabiabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabjabiabjciebXUcieaaacJeclpdExabjabjacFaaadQCabjabjdQDcifcobcdacgGcibciccuUcuScxLcjTczjcfccgNcuVclvcwycuYcuZcvacwBclvcvbcvccvdcvccvccvecvfcvgbYjcvhcrncvicvjcvkcvlcvmcvnbYjcvocvpcvqbZNcvrbYjcvsbvabqAcsKcvtcvAcwScwTcwUcwWcwXcxQcvBcvCabjcsNcvDcvEcvEcvFcvGcvGcvHcsNabjcvIcvKcvLcvMcvNcvYcvOcvPcvQcvRcsVbqmbwnbsfddkbshbshcvTcvUbshbshdWObsobsocvWbsocvXcJccvZcxdcwbcwccwccwccwdcwecwfcnPcwgcmscwhcwhcwicwjcmqcmrcmrcmscwkcwlcwmcwncwocwpcwpcwpcwqcwocwrctCcwscsjabjabjabjabjabjabjabjabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiaaaabiaaaciebXUcieaaacJedQEdvUdUEdvUdvUdUEdvUdvUdUEdvUdvUdUFcifcgGcibcjLcjMcwwcbncbncijcfccfbcrccwxcxHcwzcwAcwzcxIclvcdwbYhbYhbYhcfnbYhcwCcwDbYjcwEcwFcwGcwHcwIcwJcwKcwLbYjcwMcwNcwOcwPcbKbYjbuZbvacwQcsKcwRcyecyfcyqcwVczIcyfcBfcwYcsKcwZcxacxbcwZcxacxacxacwZcxccxacwZcsVcxecxgcxfcxhcxJcxicxjcxkcxlcsVcxmbvabuWcxncxncxncxncxncxncxocxncxncxncxncxncxncxncxpcrWcxqcxrcxscxtcxucxvcxwcnPaFxaFxaFxaFxaFxaFxaFxaFxaFxaFxaFxaFxctxcxxcxycxzcxAcxAcxBcxCcxDcsjcsjcsicsjcsjcsjcsjcsjcsicsjcsjabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabjabjabjbXUbXUbXUcJdcOmczwczwcPKczwczwcPKczwczwcPKczwczwcPXabjcgGcibcjPcidcgJczpczrcgMcfccgNcABcxKcAAcxMcxNcpycxRclvcdwcxPcxScxTcznczocxUcsEbYjcxVcxWcxXcxYcxZctOcyacybbYjbYjcycbYjbYjbYjbYjbuZbvabqAcsKcydcyecyfcyqcBjczIcyfcBkcygcsKcyhcyicyjcykcylcymcyncykcyocyicypcsVcyrcytcyscyucyIcyvcywcyxcyycsVcyzbvacyAcxncyBcyCcyDcyEcyFcyGcyHczUczUczUcyJcyFcyEcyKcyLcyMcyNcyOcyPcyQcyRcyScnPcyTcyUcyVaFxaKhcyWcyXaFxcyYcyZczaaFxczbczcctCczdczeczeczfczgczhcsjaaaabjaaaaaaabjaaaaaaabjaaacsjabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiaaaabiaaaciebXUcieaaaaaaabjaaaabjaaaacFabjacFaaaabjaaaabjaaacCfbXUdWiceVcACczkczlczlczmcfccfbdWaczscCdczqczuczqdltclvcztcxPcAHcbCczvcAJcwCczxbYjczycrnczzczAcixczBczCcvlclzczDczEczFcbCczGbYhbuZbvabqAcsKdzRcyecyfcyqcBlczIcyfcBfcwYcsKczJczKczLczMczNczOczPczQczRczSczTcsVczWcytczVczXczZczYcAacAbcBvcsVbuUbvabuWcxncAccAdcAccAecAfcAgcAhcAfcAfcAicAfcAjcxncAkcrWcrWcrXcrXcrWcAlcxvcAmcnPaFvaFvcAnaFxcAocApcAqaFxcyYcArcAsbmWcAtczccuMcAucAucAucuMczgcAvcsjaaacAwcAxcAxcAycAxcAxcAzaaacsjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaaabiabjciebXUcieabjcdacCgcCgcCgcCgcbbcbbcbbcCgcCgcCgcCgdqQbXUbXUcddbXUcADcAEcAFcAFcAFcCecAGcANcAIcAOcAKcALcAMcARclvcitbYhcCicAPcAQcCqcCscASbYjbZKcATctHcAUcAVcAWcAXcAYcFMcBacgUcBbcBccBdbYhbuZbvabqAcsKcBecCDcCEcCFcCGcCHcCIcCJcBmcsKcBncBocyjcBpcBqcBrcBscBtcyocBocBucsVcBwcBxcBycBzcBBcBAcBCcBDcBHcsVbuUbvabuWcxncBEcBFcBFcBGcCUcBIcBJcBKcBKcBLcBMcBKcBNcBOcBPcBPcBPcBQcBRcBScBTcYhcnPcBVaFvaFwaFxcBWcAqcBXaFxcBYcArcAsbmWcBZczccuMcuMcuMcuMcuMczgcAvcsjabjcCacCbcCbcCccCbcCbcCaabjcsjabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiaaaabiaaaciebXUcieaaaaaaabjaaaabjaaaacFabjacFaaaabjaaaabjaaacCfbXUdWiceVcACczkczlczlczmcfccfbdWaczscCdczqczuczqdltclvcztcxPcAHcbCczvcAJcwCczxbYjczycrnczzczAcixczBczCcvlclzczDczEczFcbCczGbYhbuZbvabqAcsKdzRcyecyfcyqcBlczIcyfcBfcwYcsKczJczKczLczMczOczNczQczPczRczSczTcsVczWcytczVczXczZczYcAacAbcBvcsVbuUbvabuWcxncAccAdcAccAecAfcAgcAhcAfcAfcAicAfcAjcxncAkcrWcrWcrXcrXcrWcAlcxvcAmcnPaFvaFvcAnaFxcAocApcAqaFxcyYcArcAsbmWcAtczccuMcAucAucAucuMczgcAvcsjaaacAwcAxcAxcAycAxcAxcAzaaacsjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaaabiabjciebXUcieabjcdacCgcCgcCgcCgcbbcbbcbbcCgcCgcCgcCgdqQbXUbXUcddbXUcADcAEcAFcAFcAFcCecAGcANcAIcAOcAKcALcAMcARclvcitbYhcCicAPcAQcCqcCscASbYjbZKcATctHcAUcAVcAWcAXcAYcFMcBacgUcBbcBccBdbYhbuZbvabqAcsKcBecCDcCEcCFcCGcCHcCIcCJcBmcsKcBncBocyjcBpcBrcBqcBtcBscyocBocBucsVcBwcBxcBycBzcBBcBAcBCcBDcBHcsVbuUbvabuWcxncBEcBFcBFcBGcCUcBIcBJcBKcBKcBLcBMcBKcBNcBOcBPcBPcBPcBQcBRcBScBTcYhcnPcBVaFvaFwaFxcBWcAqcBXaFxcBYcArcAsbmWcBZczccuMcuMcuMcuMcuMczgcAvcsjabjcCacCbcCbcCccCbcCbcCaabjcsjabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaaabiaaaciebXUciecbbcbbcbbcDtcbbcDucDvcDvcDvcDwcbbcDtcbbcChcCkcCjcbicClcDycCmcCncbncbocCocCpcCvcCrcDBcCtcCucCtcDCclvcCwcCxcCycCzcCAcbCcwCcsEbYjbYjbYjbYjbYjbYjbYjbYjbYjbYjcCBcgUcBccbCcgTbYhbuZbvabqAcsKcCCcDOcEbcEccEdcErcEscENcCKcsKcCLcCMcyjcCNcCOcCPcCQcCRcyocCScCTcsVcCVcCWcCXdtecDacCZcDbcDccDfcsVbuUcDdbuWcxncDecxncDecxncEjcDgcxncDhcxncDhcxncDhcxncDicDjcDkcDlcnPcDmcDncDocDpcnPcDqaFvaHAaFxcAqcAqaKkaFxcyYcArcAsaFxctxczccAucDrcDrcDrcAuczgcAvcsjaaacCacCbcCbcCbcCbcCbcCaaaacsjabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaaabjabjbXUbXUbXUbXUcDxcDxdCxcDvdUGbXUbXUbXUdUHcDvdUIcDvdVybXUcDzdWbcDAcDEcdhcDFcDDduPcDHcDIcDJclvcDKcDLcDMcEDcGbclvcdwbYhcDNcEOcDPcDQcwCcDRcDScDTcDUcDScDScDScDTcDVcDScDTcDWcDXcDYcDZcEabYhbuZbvabqAcsKcsKcsKcsKcEPcEQcERcsKcsKcsKcsKcEecEfcxbcxacEgcEhcEicxacxccEfcEecsVcsVcsWcEkcsVcsVcsVcElcEpcEpcsVbuUbvabuWbngcEmcjpboGcxncEncDgcxncEocxncEqcxncFbcxncnPcnPcnPcnPcnPcnPcuJcuwcvVcnPaFxcEtaFxaFxaFxcEuaFxaFxbmWcEvbmWaFxctxczccEwcExcExcExcEyczgcxDcsjcsjcCacCbcCbcCbcCbcCbcCacsjcsjcsjcsicsjcsjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaaabjaaaabjcEzcEzbXUbXUbXUbXUbXUbXUcEAbXUbXUbXUbXUbXUbXUbXUbXUbXUbXUbXUbXUbXUcEBcECdWhbXUbXUclvclvclvclvclvclvclvcitbYhcCxbYhbYhbYhcwCcEEcdtcgTcbCcbCcEFcgTdmybYhcgTcbCcEGcgUcbCcEHcEIcEJchccEKcELcFpcEMboycGYcHDcIfcITcIUcEScETcEUboyboycEVboyboycEWboqboocEXbooboocEYboocEZcFabooboocFfcGKcGKcGKcGLbosbEpcFcbngcFdboGcjncxncFecJlcxncxncxncDecDecFgcFgcFhcFicFjcFkaFxcFlcFmcFncFocFwcFqcFqcFqcFrcFqcFscFtcFucFvcFtcFtcFwcFxcFycFzczeczecFAcFBcFCcFDcFEcFFcFGcCbcCbcCbcCbcCbcFHcFFcFEcFIcFJcFKcsjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10910,7 +10912,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiaaaabiaaacJKcJPcJQcjXcJNcJOcIxcKtcLxcJRcIDcJTcIxcJScJUcJVcJWcJXcJYcJZcKacKbcIxcKccKdcKecKfcKgcKhczDcKidgrcKkcKmcLQcILcIMcKncIMcILcIMcKocIMcILcIMcKncIMcILcIOcKpcKqcKpcIOcKrcKrcKscLBcKucKvcKvcKvcKvcKvcKwcKxcKycKycKzcKAcKBcKCcKDcKEcKFcKGcKHcKIcKJcKKcKLcJkcKMcKNcKOcKOcKPcKQcKRcKScKTcKUcKVcKWcKXcKYcKYcKYcKYbngcKZcLacLbcLcboGboGboGcJqcLdcLecLfcLfcLgcLhcLicLjcLkcLlcLmcGFcMEcLnaFxcAqcAqcLoaFxcLpcLpcLqaFxcyYcArcLraFxcLsczccLtcLucLucLucLtczgcLvcsjcsjcLwcCbcCbcCbcCbcCbcLwcsjcsjcsjcsicsjcsjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabjabiabjbYhcLCcMTcLzcLAcfmcIxcMUcOxcLDcLEcLFcLGcLHcLIcLJcLJcLKcLLcLMcLNcLOcIxcLPbZHcEzcEzcEzcEzcEzcEzbYhcILcNocILcILcIMcIMcLRcILcIMcIMcLRcILcIMcIMcLRcILcIOcLScLTcLUcIOcKrcLVcLWcLXcLYcLZcMacMbcMccKvcMdcMecMfcMgcMhcMicMjcMkcMlcMecMlcMmcMncIWcKJcKKcKLcJgcMocMpcMqcMpcMqcMpcMrcMpcMqcMscMqcMpcMtcJgcMucMvcMwcMxcMycMycMycMycKYcKYcKYcMzcMAcMBcMCcMDcMGcMFcOncMHcmscMIcMJcHRcMKcMLaFxcBWcAqcMMaFxcMNcMOcLpaFxcMPcArcAsbmWcMQczccuMcuMcuMcuMcuMczgcMRcsjaaacLwcCbcCbcCbcCbcCbcLwaaacsjabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiaaaabjabjbYhbYhbYhbYhcMScfmcIxcOycPicMVcMWcMXcIxcMYcMZcNacNbcNccNdcNecNfcMYcICcNgcNhcEzcNicNjcIMcIHcNkcNmcTvcROcOLcILcNpcNqcNrcILcNpcNscNrcILcNpcNtcNrcILcILcNucNvcNwcILcKrcKrcLWcNxcNycNzcNAcNBcNCcNzcNDcMfcNEcNFcNGcNGcNHcNIcNGcNJcNGcNKcNLcNMcNNcNOcNPcNQcNRcNScNTcNUcNTcNTcNTcNTcNTcNVcNTcNScNWcNXcNRcNYdlpcMxcOacObcOccMxcOdcOecOfcOgcOhcMBcOicOjcOkcJqcWdcPZdescQadescWdcOocMLaFxcOpcOqcAqaFxcOrcLpcLpaFxcyYcArcAsbmWcOsczccOtcOucOucOvcOtczgcMRcsjabjcLwcCbcCbcOwcCbcCbcLwabjcsjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjabjabiabjbYhcQscQvbYhcLAcfmcIxcOzcOAcOBcLEcOCcLGcOAcMZcODcODcOEcODcODcOFcOGcOHcOMcgUcEzcNicOIcNicOJcOKcOOcOQcONcOUcOPcQFcQGcQIcOTcQLcQGcNlcOWcORcQGcQIcOYcOScOVcOXcOZcPacPbcKrcPfcPgcPhcQwcPjcPkcPlcPmcPncPocPpcPqcPrcPrcPrcPscPrcPtcPrcPucPvcPwcPxcPycPzcPAcPBcPCcPDcPEcPFcPGcPHcPGcPGcPIcPDcPCcPJcQbcPLcPMcPNcPOcPPcPQcPRcPScPTcMqcKVcOgcPUcMBcMCcPVcPWcJqcQccRxcSRcSScSTcWccOocQdaFxaKhcQecQfaFxcQgcQhcQiaFxcyYcQjcAsaFxcQkczccOtcQlcQmcQncOtczgcQocsjaaacQpcQqcQqcwlcQqcQqcQraaacsjabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjabjabiabjbYhcQscQvbYhcLAcfmcIxcOzcOAcOBcLEcOCcLGcOAcMZcODcODcOEcODcODcOFcOGcOHcOMcgUcEzcNicOIcNicOJcOKcOOcOQcONcOUcOPcQFcQGcQIcOTcQLcQGcNlcOWcORcQGcQIcOYcOScOVcOXcOZcPacPbcKrcPfcPgcPhcQwcPjcPkcPlcPmcPncPocPpcPqcPrcPrcPrcPscPrcPtcPrcPucPvcPwcPxcPycPzcPAcPBcPCcPDcPEcPFcPGcPHcPGcPGcPIcPDcPCcPJcQbcPLcPMcPNcPOcPPcPQcPRcPScPTcMqcKVcOgcPUcMBcMCcPVcPWcJqcQccRxcSRcSScSTcWccOocQdaFxaKhcQecQfaFxcQgcQicQhaFxcyYcQjcAsaFxcQkczccOtcQlcQmcQncOtczgcQocsjaaacQpcQqcQqcwlcQqcQqcQraaacsjabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiaaaabiaaacJKcRDcQtcjXcQucbCcIxcREcThcQxcQycMXcIxcOAcMZcQzcQAcQBcQCcQDcOFcOAcIxcLPcNhcEzcIMcKocIMcIMcQEcRQcRRcQHcRTcRUcRVcTrcQMcQMcQMcQNcQMcQOcQPcPccRVcPdcRVcQRcQScQTcPecQJcKrcPfcQWcQXcQYcQZcRacRbcRccRdcRecMmcRfcMmcMlcMmcMfcMmcMfcMmcMlcRgcIWcKJcKKcRhcRicRjcRkcRlcMqcMscMqcMpcMqcMpcMqcMpcMqcRmcJgcRncMscRocPOcRpcRqcRrcRscRncMpcKVcMzcRtcRucSPcRvcRwcMzcWdcPZcWdcSUcWdcWccRycRzaFxaFxaFxaFxaFxaFxaFxaFxaFxaFxaFxaFxaFxcRAcRBcRCcOtcuMcuMcuMczgcMRcsjaaaabjaaaaaaabjaaaaaaabjaaacsjabjabiaaaaaaaaaaaaaaaaaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabjabiabjbYhcTicbCbYhcLAcEFcIxcZqcOxcLDcLEcJWcLGcRFcRGcRHcRIcRJcRKcRLcRMcOGcIwcRNcNhcEzcVGcKocIMcIMcRPcTscTtcRScTucTwcNmcUUcRWcRXcRYcRZcRYcRXcSacQKcNmcQQcNmcSdcSecSfcQUcShcKrcLWcMmcVJcLZcSjcSkcWucKvcSmcSncPncSocRdcSpcWLcSrcRgcSscStcSucSvcKIcKJcKKcSwcJkcSxcSycSzcSAcSBcSAcSDcSEcRmcSFcSFcSFcSGcJkcRncSHcRocPOcSIcSJcSKcSLcSMcNScSNcSOcMzcSQcOgcSVcMzcMzcUlcUmcUocUpcUqcWdcRycSWcSXcSYcSZboGcSYcTacSYcTbcjncTccSYcTdcsicJzczccTecuMcuMcuMcTfczgcLvcsjcsjcsicsjcsjcsjcsjcsjcsicsjcsjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiaaaabjabjbYhcTgcTgbYhcLAcJOcIxdeZdfdcJRcIDcTjcIxcTkcLHcTlcJWcOGcJWcTmcTncJTcIwcTocNhcEzcIMcKocIMcTpcTqcUVcRRcUXcVacVbcWAcWBcTxcTycTzcTAcTzcTzcTzcQVcWAcSbcWAcTDcTEcSccSgcZCcKrcTIcMlcNycLZcTJcTKcTLcKvcKrcTBcTNcTCcTPcTQcTRcTScTRcTTcTFcTTcTRcTRcTVcKKcTWcTXcTXcTYcTXcUacUbcTZcTYcTXcJgcUccUdcUdcJgcKYcUecMscUfcMxcUgcUhcUicMxcUjcUkcPNcUrcUscVSdaacVUcVVcWdcVWcVXcVYcVZcWjcWdcUtcUucUvcUvcUwcUxcUycUvcUvcUzcUvcUAcUBcUCcUDcUEcUFcUGcUHcUIcUJcUKcULcUMcUNcUOcsjabjabjabjabjabjabjabjabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10951,8 +10953,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaaabjaaaaaaaaaaaaabiaaaabiabjdFgdJldJmdJndJodJpdIqdIudJqdJqdJrdJsdJtdFgcEGcitdXDdJudJvdJwdIxdJxdJxdJxdJxdXadJzdJxdJxdJxdJxdEzdJBdJCdJDdJDdJDdJDdXCdJDdJFdJDdJFdJGdJAdIOabjaaadJIdLOdJKdJKdJKdJLdJKdJLdJKdJKdJKdLOdJIdTzdYgdYhdXtdJIaaaaaaabjaaaabjaaaaaaabjaaadFGdJPdJQdJRdGwdJSdJTdJUdJVdJWdJXdJYdJZdFGabjabiaaaabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiaaaabjaaaabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaaabjabjabjabjabjabiaaaabiabjdFgdIqdHtdIudKadKbdKcdIudIqdIqdFgdFgdFgdFkdlMcfpdIxdKddJvdKedIxdKfdKgdKhdKidKjdKkdKhdKgdKldKmdEzdKndKodKodKodKodKodKpdKodKqdKodKqdMYdJHdIOabjaaadJIdKtdKudKudKudKudKudKudKudKudKudKvdKwdXBdJNdJNdXLdKyaaadKzdFJdFGdKAdKBdFGdFHdFGdFGdKCdIedKDdGwdGwdXEdIcdGwdGwdFGdIcdFGdFGabjabiaaaaaaaaaaaaaaaaaaaaZaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabiabiabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaaabjaaaaaaaaaaaZabiabjabiabjdFgdKEdIudHsdFNdKbdIpdJrdIudHsdFgdKFdKGdFkdKHcgVdIxdJudKIdKJdKKdKLdKLdKLdKLdKMdKNdKLdKLdKLdKrdKsdKndKodKodKodKodKodKpdKodKqdKodKqdMYdKPdIOabjaaadKydOydKudOzdKTdOydKudOzdKTdOydKudOzdITdKUdKUdKUdXMdKWaaadIcdMAdMGdNidNWdNXdNYdXGdJWdLedLfdLgdGwdLhdLidLjdLkdLldFGaaaabjaaaabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFacFacFacFaaaaaaaaaabiaaaabjabjdFgdHtdIpdIudFNdKbdHsdIudIqdHtdFkdLmdIvdFgdLndLodIxdLpdLqdLrdKKdKLdLsdLtdLtdLudLvdLwdLxdLydKOdLAdLzdLCdLDdLEdLEdLEdLFdLGdLHdLIdLJdMYdLKdIOaaaaaadLLdOydKudOzdLMdOydKudOzdKwdOydKudKudOadXNdXNdXNdXOdKWaaadFGdOcdLRdLSdLjdLldLTdPgdLVdLWdIedLXdKBdPodLZdQGdMbdYEdFGabjabiabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaaabjaaaabiaaaabiaaaabiabjdFgdMcdHsdMddFNdKbdIudIudMedMedFgdMfdMgdFkcNgcfmdIxdJudJvdMhdIxdXxdMjdMkdMjdKMdMldMjdMmdMndKmdModMpdMqdKpdKodKodKodKodKodMrdLGdMsdMYdKPdIOaaaaaadJIdOydKudOzdMtdOydKudOzdMtdOydKudKudOadXPdXPdXPdXRdLLaaadFIdQvdMwdMxdMydMydMzdQwdMBdMCdMDdMEdGwdGwdMFdYFdMHdGwdFGabjabiaaaabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFacFacFacFaaaaaaaaaabiaaaabjabjdFgdHtdIpdIudFNdKbdHsdIudIqdHtdFkdLmdIvdFgdLndLodIxdLpdLqdLrdKKdKLdLsdLtdLtdLudLvdLwdLxdLydKOdLAdLzdLCdLDdLEdLEdLEdLFdLGdLHdLIdLJdMYdLKdIOaaaaaadLLdOydKudOzdLMdOydKudOzdKwdOydKudKudOadXNdXNdXNdXOdKWaaadFGdOcdLRdLSdLjdTudLTdPgdLVdLWdIedLXdKBdPodLZdQGdMbdYEdFGabjabiabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaaabjaaaabiaaaabiaaaabiabjdFgdMcdHsdMddFNdKbdIudIudMedMedFgdMfdMgdFkcNgcfmdIxdJudJvdMhdIxdXxdMjdMkdMjdKMdMldMjdMmdMndKmdModMpdMqdKpdKodKodKodKodKodMrdLGdMsdMYdKPdIOaaaaaadJIdOydKudOzdMtdOydKudOzdMtdOydKudKudOadXPdXPdXPdXRdLLaaadFIdQvdMwdMxdMydTvdMzdQwdMBdMCdMDdMEdGwdGwdMFdYFdMHdGwdFGabjabiaaaabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaaabjaaaabiaaaabjaaaabiabjdFgdMIdMJdMgdMKdMLdMMdMNdMMdMNdMOdMPdGEdFkcsEcbCdIxdMQdMRdMSdIxdMTdMUdMTdMUdKMdMVdMUdMWdMXdJxdKsdMZdKodNadNbdNcdNbdOudNbdNcdNbdNddMYdKPdIOdIOdIOdJIdNedKudOzdNfdOydKudOzdNfdOydKudOzdITdNgdNgdNgdNhdJIaaadFGdQHdNjdNkdNldNmdNndLYdIcdNodNpdNqdNrdNsdNtdNudNvdNwdFGabjabiaaaabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjacFacFacFabjabiaaaabiabjabiabjdFgdNxdNydNzdNAdMIdNBdNCdNDdNEdFgdNFdNGdFgcLPcdtdIxdJudNHdNIdIxdNJdNKdNJdNKdKMdNLdNKdNMdNKdKmdKsdMZdKodNadNNdNOdNPdNQdNNdNOdNPdNddMYdKPdKQdKPdKQdLBdNRdKudOzdKTdOydKudOzdKTdOydKudOzdNTdNUdJNdJNdNVdJIaaadFHdRfdRgdRhdRidWSdWTdWUdGwdOddOedOfdOgdOhdOidOjdOkdOldKBaaaabjaaaabjaaaaaaaaaaaaaaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaaabjaaaabjabjaaaabiaaaaaaabjdFgdFgdFgdFgdFgdFgdFgdFgdFgdFgdFgdFgdFgdOmdOncgTdIxdIxdOodOpdIxdOqdMUdMTdOrdKMdOsdMUdMWdOtdJxdOvdMZdKodNadOwdXFdOwdOxdOwdPadOwdNddMYdKPdIOdIOdIOdJIdTLdKudKudKudKudKudKudKudKudKudWBdOAdIQdJJdJJdOCdIVaaadODdOEdFGdOFdKBdFGdIcdFGdFGdOGdOHdOIdHidOJdOKdOLdOMdONdFGabjabiaaaabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10964,9 +10966,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabjdQBabjaaaaaaabjabjabjdPpdPqdPqdPqdPqcdtciscEzdRDdRKdRQdRZdSccdtdRQdRZdRIdRJdSndRLdIxdIxdRMdJxdRNdJxdJxdJxdJxdROdJxdRPdJxdJxdSodMpdRRdRSdRTdRTdRTdRTdRTdRTdRUdRVdMYdKPdIOdIOdIOdJIdKtdKudKudKudKudKudKudKudKudKudKvdJIdRedRWdRXdLOdLLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjabjabjaaaabjaaaabjabjabjabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjdQBabjaaaaaaaaaaaaabjabjabjabjabjcCxdSndSpcEzdSacdtdRQdRZdSbdRKdSqcdtdSacEzcJKcJKdIxdXVdSedJxdSfdKmdSgdShdSidSjdSkdSldSmdSrdKPdSsdStdSudStdStdSBdStdXJdStdSDdStdSEdKPdKQdKPdKQdLBdNRdSvdSvdSvdSvdSwdSvdSvdSvdSvdLOdJIdRYdSxdSxdSydJIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabiabjabiabjabiaaaabiabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabiabiabjabjabiabiabjdQBabjabiabiabiabiabiabjabiaaaabjbYhcJKcJKcEzdSAdSFdSGdSOdSQdSWdTgdSHdSIcEzabjabjdIxdIxdRMdIxdIxdIxdIxdIxdSJdSKdSLdSMdSNdIxdThdSPdSPdTidSRdSSdSTdSUdSPdSRdSVdTkdSXdSYdSZdTadTadOAdIQdTbdIRdISdIQdIUdITdSzdSzdITdIUdTddIQdIQdIQdIQdIVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaaabjaaaabjaaaabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaaaaaaaaabjaaaaaaaaadQBaaaaaaaaaabjaaaaaaaaaaaaaaaabjabjabjabjdQSdTfdUidUldUScfndTjcitdVodTlcEzaaaabjdIxdTmdTndTodTpdTqdIxdTrdTsdTtdTudTvdTwdIxdXWdTydXKdTAdTBdTCdTDdTEdTadTFdTGdTHdTIdTJdQIdTKdQIdLBdTMdTMdTNdTNdTOdJIdTPdJKdJKdTQdJIdTcdTRdTSdTRdLOdITaaaaaaaaaaaaaaaaaaaaZaaaaaaaaaaaaaaaaaaaaaabiabiabiabiabiabiabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadTUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaadTVdTVdTVdTVdTVaaadQBaaadTVdTVdTVdTVdTVaaaabiaaaaaaabiabiabjcEzdQbdTWdTWdQSdQScEzdTWdTWdQbcEzaaaabjdTXdTYdTZdUadUbdUcdUddUcdUcdUedUfdUgdUhdIxdWzdSPdUjdUkdWAdUmdUndUodUpdUqdUrdUsdUtdUudUvdTadTadJIdUwdTMdTMdTMdTMdTbdUxdKudKudUydJIdUzdUAdUBdSvdUCdTTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabjdYLdYMdYMdYMdYMdYNdQBdYIdYOdYOdYOdYOdYPabjabiabjabjabjabiabjabjabjabjabjabjabjabjabjabjabjabjabjabjdIxdUJdUKdULdUMdUNdIxdUOdSidUPdUQdUQdURdIxdWGdSPdUTdUUdUVdUWdUXdUYdTadUZdVadVbdVcdXQdVeabjaaadJIdUwdTMdTMdVfdVgdITdVhdKudKudVidOAdWCdVkdVldJKdVmdTTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaaaaaaaaabjaaaaaaaaadQBaaaaaaaaaabjaaaaaaaaaaaaaaaabjabjabjabjdQSdTfdUidUldUScfndTjcitdVodTlcEzaaaabjdIxdTmdTndTodTpdTqdIxdTrdTsdTtdTwdUgdUfdIxdXWdTydXKdTAdTBdTCdTDdTEdTadTFdTGdTHdTIdTJdQIdTKdQIdLBdTMdTMdTNdTNdTOdJIdTPdJKdJKdTQdJIdTcdTRdTSdTRdLOdITaaaaaaaaaaaaaaaaaaaaZaaaaaaaaaaaaaaaaaaaaaabiabiabiabiabiabiabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadTUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjaaadTVdTVdTVdTVdTVaaadQBaaadTVdTVdTVdTVdTVaaaabiaaaaaaabiabiabjcEzdQbdTWdTWdQSdQScEzdTWdTWdQbcEzaaaabjdTXdTYdTZdUadUbdUcdUddUcdUcdUedUhdURdUQdIxdWzdSPdUjdUkdWAdUmdUndUodUpdUqdUrdUsdUtdUudUvdTadTadJIdUwdTMdTMdTMdTMdTbdUxdKudKudUydJIdUzdUAdUBdSvdUCdTTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabjdYLdYMdYMdYMdYMdYNdQBdYIdYOdYOdYOdYOdYPabjabiabjabjabjabiabjabjabjabjabjabjabjabjabjabjabjabjabjabjdIxdUJdUKdULdUMdUNdIxdUOdSidUPdYTdYTdYUdIxdWGdSPdUTdUUdUVdUWdUXdUYdTadUZdVadVbdVcdXQdVeabjaaadJIdUwdTMdTMdVfdVgdITdVhdKudKudVidOAdWCdVkdVldJKdVmdTTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiabiaaadVndVndVndVndVnabjdQBabjdVndVndVndVndVnaaaaaaaaaaaaaaaabjaaaabjabiabiabiabjabiabiabjabiabiabiaaaabjdIxdIxdTXdTXdTXdIxdIxdIxdTXdTXdTXdTXdIxdIxdWHdVpdVpdVqdVqdVqdVpdVpdVpdVpdVqdVqdVqdVpdVqaaaaaadJIdVrdVrdVsdVrdVgdJIdVtdVudVudUBdWDdWEdJIdWFdWFdWFdITaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiaaaaaaaaaaaaabjaaaaaaabjdQBabjaaaaaaabjaaaaaaaaaaaaabiabjabiabiabiabjaaaabjaaaaaaabjaaaaaaabjaaaabjaaaabjabjabjabjaaaabjabjabjabjabjaaaaaaabjabjabjdYQabjabjabjaaaabjabjabjabjabjabjaaaabjabjabjaaaaaadVzdIQdITdIUdIUdIQdVAdVBdWJdWJdVBdTddIQdVCdIUdITdIQdVDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiaaadTVdTVdTVdTVdTVabjabjdQBabjabjdTVdTVdTVdTVdTVaaaabiaaaaaaaaaaaaabjabiabiabiabjabiabiabiabiabjabjabjabjabiabiabiabjabiabiaaaabiabiabjabjabiabiabjacFabjabiabjabjabjabiabiabiabiabjabjabjabiabiaaaaaaaaaaaaaaadVzdIVdVEdVFdVGdVGdVGdVGdVFdVHdOAdVDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11013,3 +11015,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} + diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index aa149082912..dcf4c217e94 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -1481,7 +1481,7 @@ "aCy" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; luminosity = 2},/area/security/nuke_storage) "aCz" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/light{dir = 1},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; luminosity = 2},/area/security/nuke_storage) "aCA" = (/obj/structure/table,/obj/item/folder/red,/obj/item/taperecorder{pixel_y = 0},/obj/item/radio/intercom{broadcasting = 1; frequency = 1424; listening = 0; name = "Interrogation Intercom"; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) -"aCB" = (/obj/structure/filingcabinet,/obj/item/folder/documents,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/nuke_storage) +"aCB" = (/obj/structure/table/reinforced,/obj/structure/closet/fireaxecabinet{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage) "aCC" = (/turf/simulated/shuttle/floor,/area/shuttle/siberia) "aCD" = (/obj/structure/grille,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless,/area/engine/engineering) "aCE" = (/obj/machinery/alarm{pixel_y = 28},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) @@ -3399,7 +3399,7 @@ "bns" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=14-Starboard-Central"; location = "13.3-Engineering-Central"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "cautioncorner"},/area/hallway/primary/starboard) "bnt" = (/turf/simulated/wall/r_wall,/area/engine/break_room) "bnu" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/light,/obj/machinery/camera{c_tag = "Brig - Hallway - Starboard"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/brig) -"bnv" = (/obj/structure/table/wood,/obj/item/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/obj/item/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/machinery/computer/security/telescreen/entertainment{pixel_y = 32},/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) +"bnv" = (/obj/structure/safe{knownby = list("captain")},/obj/item/clothing/head/bearpelt,/obj/item/folder/documents,/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka,/obj/item/lighter/zippo/nt_rep,/obj/item/storage/fancy/cigarettes/cigpack_robustgold,/obj/item/stack/spacecash/c1000{amount = 100000},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/nuke_storage) "bnw" = (/obj/item/folder/yellow,/obj/item/folder/yellow,/obj/machinery/light{dir = 1},/obj/structure/sign/securearea{pixel_y = 32},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/engine/break_room) "bnx" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/engine/break_room) "bny" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/engine/break_room) @@ -3468,7 +3468,7 @@ "boJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "boK" = (/obj/machinery/door/window{dir = 1; name = "Captain's Bedroom"; req_access_txt = "20"},/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "boL" = (/obj/structure/closet/secure_closet/captains,/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) -"boM" = (/obj/structure/rack,/obj/item/tank/emergency_oxygen/double,/obj/item/tank/jetpack/oxygen/captain,/obj/item/clothing/suit/space/captain,/obj/item/clothing/mask/gas,/obj/item/clothing/head/helmet/space/capspace,/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) +"boM" = (/obj/structure/table/wood,/obj/item/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/obj/item/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/machinery/computer/security/telescreen/entertainment{pixel_y = 32},/obj/item/paper/safe_code{owner = "captain"},/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "boN" = (/obj/item/restraints/legcuffs/beartrap,/obj/item/restraints/legcuffs/beartrap,/obj/structure/table,/obj/machinery/requests_console{department = "Janitorial"; departmentType = 1; pixel_x = -29},/obj/item/reagent_containers/spray/cleaner,/obj/machinery/camera{c_tag = "Custodial Closet"; dir = 4; network = list("SS13")},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor) "boO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/central) "boP" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) @@ -3960,7 +3960,7 @@ "byh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=7-Command-Starboard"; location = "6-Port-Central"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central) "byi" = (/obj/machinery/door_control{id = "hop"; name = "Privacy Shutters Control"; pixel_x = -24; pixel_y = -6; req_access_txt = "28"},/obj/machinery/light_switch{pixel_x = -25; pixel_y = 5},/turf/simulated/floor/carpet,/area/crew_quarters/heads) "byj" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/heads) -"byk" = (/obj/structure/safe,/obj/item/storage/secure/briefcase{contents = newlist(/obj/item/clothing/suit/armor/vest,/obj/item/gun/projectile/automatic/pistol,/obj/item/suppressor,/obj/item/clothing/mask/balaclava,/obj/item/bodybag,/obj/item/soap/nanotrasen)},/obj/item/storage/backpack/duffel{contents = newlist(/obj/item/clothing/under/lawyer,/obj/item/clothing/accessory/waistcoat,/obj/item/clothing/shoes/laceup,/obj/item/clothing/gloves/color/black,/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/head/fedora); desc = "A large duffelbag for holding extra things. There is a NanoTrasen logo on the back."; icon_state = "duffel-syndieammo"; item_state = "duffel-syndieammo"},/obj/item/lazarus_injector,/obj/item/gun/energy/gun/advtaser,/obj/item/gun/projectile/revolver/russian,/obj/item/ammo_box/a357,/obj/item/clothing/accessory/stethoscope,/obj/item/book{desc = "An undeniably handy book."; icon_state = "bookknock"; name = "A Simpleton's Guide to Safe-cracking with Stethoscopes"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/nuke_storage) +"byk" = (/obj/structure/safe/floor{knownby = list("captain")},/obj/item/gun/projectile/revolver/russian,/obj/item/reagent_containers/food/drinks/bottle/absinthe/premium,/obj/item/lighter/zippo/nt_rep,/obj/item/storage/fancy/cigarettes/cigpack_robustgold,/obj/item/toy/figure/captain,/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "byl" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "Head of Personnel APC"; pixel_y = 24},/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet,/area/crew_quarters/heads) "bym" = (/turf/simulated/floor/carpet,/area/crew_quarters/heads) "byn" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/carpet,/area/crew_quarters/heads) @@ -8469,6 +8469,7 @@ "dgS" = (/turf/simulated/wall/r_wall/coated,/area/toxins/mixing{name = "\improper Toxins Lab"}) "dgT" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/wall/r_wall/coated,/area/toxins/mixing{name = "\improper Toxins Lab"}) "dgU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall/coated,/area/toxins/server{name = "\improper Research Division Server Room"}) +"dgV" = (/obj/structure/rack,/obj/item/tank/emergency_oxygen/double,/obj/item/tank/jetpack/oxygen/captain,/obj/item/clothing/suit/space/captain,/obj/item/clothing/mask/gas,/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/obj/item/crowbar/red,/obj/item/clothing/head/helmet/space/capspace,/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "dgW" = (/obj/machinery/computer/camera_advanced/xenobio,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "dgY" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0; idle_power_usage = 0; use_power = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/escape) "dgZ" = (/obj/structure/table,/obj/item/storage/box/handcuffs,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/escape) @@ -8599,7 +8600,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqarAarAarAarAarAarAarAaCnarAabqabqabqabqaAAaoXatkarIalLaaaaCoaCpaCqaCpaCoayKayKayKaCsaCsaCsaCsaCtaCsaCsaCuaCuaCuaCuazRaCuaCwajgabqaBbaCxaCyaCzaDtaCBaBbaaaayMaCCaCCaDuayMaaaaaaakDayLaCGazwatJayLaCIazwakDayLaCJazwakDaCKalMaCLakDamEazzaANamEamEaCOaCOaCPaCQaCRaCOaCOaCSakDakDakDakDakDayGcccaQdaCUaQvavravravravravraCWaCXaCYazlazmavvavvavvaoGaCZasIarrasJasIaDadgIaxhaxhaxhaxhaxhaEzaDsbsFaDwaEnaEdaEnaESaDiaDiaDjaWzaEWaDfaFaaDfaFkaWzaDjaDiaFmaDnaCgabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqabqabqarAarAarAarAataarAarAarAaDparAarAarAarAabqaaaabqalLcdnatkapdapfaaaaASaDqaDraDqaASayKaEsaEBaCsaFEaDvaFFaDxaDyaCsaDzaDAaDBaCEaCNaCuaCwajgaaaaBbaDEaDFaDGaDHaDIaBbaaaaxEaDJaCCaucayMaAfaAfamxaDMaDNaDOakDaDPaDNaDOakDaDQaDNaDOakDaDRaDSaDTakDaDUaDVaDWaDXaDYaCOaDZaEaaEbaEcaFHaEeaCSaEfaEgaEgaEgaEgaDdcccaRtaEkaRyaBIaEmaFKaEmavvaEoaEpaEqaEraEDaEuaEuaEvaBWaEwaxhaxhaxhaxhaxhaxhaxhaEAaEAaFMaGbaFNaEEaGCaGeaCgaCgaCgabqabqaDiaFSaEFaDiaDiaDiaDiaDiaEGaFSaDiaDCaGTaCgaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqarAarAarAarAarAarAarAabqarAabqabqarAarAabqabqapfapfauyatkapfapfaaaaCobxFaDqaDqaEIaEJaEKaEKaELaEMaENaEOaEPaEQaFOaFQaETbnWbkXaHxaCubMCajgaaaaBbaEXaEYaEZaHKaFbaBbaaaayMaFcaCCaCCaFdaFeaFfamxaFgaDNaFhakDaFgaDNaFiakDaFgaDNaFjakDaHLaFlaHNakDaFnaFoaFpaFqaFraCOaFsaFtaFuaFvaFwaFxaCSayGalWcajalWaFTalWaBIaTeaFDaThaBIaHVaFGaFGaHZaFIaFJaIcavvavvavvavvavvaoGaFLaxhaHHaGXaIzaIuaISaFRaGcaFWaFWaFWaFWaFUaIiaGdaHiaFYaCgaFZabqaaaabqaaaaaaaaaabqabqaaaaaaabqaaaaWAaEiaGTaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaarAarAarAarAarAabqabqabqarAarAarAabeaaaabqabqabqapfaAgaoXaoXaECalLaaaaaaaASaDraDraDraASayKaGYaGZaIyaEMaEKaGfaGgaGhaCsaGicbmaGkaEHaGmaCubMCajgabqaBbaGnaGoaGpaGqbykaBbaaaayMaGsaGsaGsayMaAfauFamxaAEaCFaCramxaAEaCFaCramxaAEaCFaCramxaGxaCHaGzamxamxazzaGAamxaGBaCOaIGaGDaIRbyDaGGaGHaCSayGajgajgajgaFyaWvaBIaGKaGLaBIaBIaGMaGNaGOaGPaGQaGRaGSazlaITaGUaypavvaGVaGWaxhaIVaHaaHgaHgaIvaCMaDsaHcbCjbALbALbALaJbaIWaJoaOaaDLarAaJxaJtaJtaJJaJtaJtaJJaJtaJtaJJaJtaJtaKaaWAaKpaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaarAarAarAarAarAabqabqabqarAarAarAabeaaaabqabqabqapfaAgaoXaoXaECalLaaaaaaaASaDraDraDraASayKaGYaGZaIyaEMaEKaGfaGgaGhaCsaGicbmaGkaEHaGmaCubMCajgabqaBbaGnaGoaGpaGqbnvaBbaaaayMaGsaGsaGsayMaAfauFamxaAEaCFaCramxaAEaCFaCramxaAEaCFaCramxaGxaCHaGzamxamxazzaGAamxaGBaCOaIGaGDaIRbyDaGGaGHaCSayGajgajgajgaFyaWvaBIaGKaGLaBIaBIaGMaGNaGOaGPaGQaGRaGSazlaITaGUaypavvaGVaGWaxhaIVaHaaHgaHgaIvaCMaDsaHcbCjbALbALbALaJbaIWaJoaOaaDLarAaJxaJtaJtaJJaJtaJtaJJaJtaJtaJJaJtaJtaKaaWAaKpaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqaHkaHlaHkabfaaaabqaaaabqapfaHmaHnanEatkapfapfaaaaCoaHoaHpaHqaCoayKayKayKaCsaHraEKaHsaGgaHtaCsaHuccwcjvciyaHyaCuaCwajgaaaaBbaHzaHAaHBaHCaBbaBbaaaaHDaHEaHEaHEaHFaHGaKraHGaHIaHJaHIaKxaHIaHJaHIaKDaHIaHJaHMaKLaHOaHPaHQaFCaHSaHTaHUamxazeaCSaKNaHWbHcaKSbIbaIaaCSayGaBIaKWaIdaHdaGJaGJaHeaIhaLcaIjaIkaIlaImaInaIoaIpayeaIqaIraIsaItavvasJaGWaxhaJIaIAaIwaIxaIDaJRaIEaIBaMXaIFaIFaIFaLwaLnaLEaOaaDLaMIaLNarAarAaPyarAarAaPyarAarAaPyarAarAaLNaWAaLOaCgaDoabqaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaabqabqaaaaHkaJKaHkabqabqabqabqabqapfauJcgocgoaHXaIJapfaaaaIKaARaILaARaIMabqabqabqayKaINaIOaIPaIQaMbaCsaJSaMqclWcliaMzaCuaCwajgaaaabqaaaaGaaIYaGuaaaabqaaaaHGaAfaAfaAfaHGaHGaJaaMGaJcaJdaJeaJfaJgaJhaJhaJiaJhaJjaJgaJkaJlaJmaJnaERaJpaJqaJramxazeaCSaCSaJsaMJaCSbNVaCSaCScmUaBIaBIaBIaJvaJwaMKaIeaJzaJAaJBaJCaJDaJEaJFaJFaJGaJHavvavvavvavvavvaubaGWaxhaJTaJLaJOaJMaJQaGvaKTaJPaLsaJUaJZaJVaMUaMQaLEaOaaDLaDLaLNarAaJWaaaaaaaaaaaaaJWaaaaaaaJWarAaLNaIfaKpaCgaNdabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaabqaaaaHkaHlaHkaHkaGwaGwaGwaHkaHkaHkaHkaHkapdatkapfaaaaaaaaaaaaaaaaaaaaaaaaabqayKaNgbOgaKdaKeaKfaCsaLoaKhaCuaCuaCuaCuaKiajgaKjaGyaHjaHbaKgaHRaIZaIXaKjaHGaNyaKsaKsaKtaKuaKvaKwaNDaKyaKzbPXaNJaTiaNLaKEaKCaKFaKGaKHaKIaKJaKKaJNaObaOiaOhamxazeaKPaCSaKQaKRaCSaLMaFTcajcmUaBIaOwaKXaKYaKZaBIaLaaLbaONaBIaLdaLeaLfaLgaLfaLhaLiaLjaLkaLlaLmavvasJaGWaxhaLqaLpaLuaLraLRaFRaOXaLtaLsaLUaCgaCgaPaaNdaCgaDLaDLaDLaLNarAaaaaaaaaaaaaaaaaLxaaaaaaaaaaTMaPgaIfaKpaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8619,10 +8620,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNaUNbhRaUNaWDaUNbdRaUNbcydgxbeObedaUNbdRaUNbePbhVbeQbdXapfapfapfapfalLalLalLapfapfapfaZtbfhbdZbdZbdZbdZbeaaRobebbfqbfpbeeaYnaYnaYnaYnaWjapfapfbegapfapfbehbeibejbekbelbembenbekbelbeobepbembeqbekbekbekbelbekbekberbesbekbekbekbekbekbekbekbetbeubekbekbenbevbewbekbekbekbekbexbeybezbezbezbeAbezbezbezaoGbmMaoGaGWaoGaoGbeCbeCbeCbeCbiabeEbeEbeFbeGbiebambeIbeJbeKbmNbeMbeNbambigbikbfsbdEbizbiJbiAbdEbeUaCgaCgaCgaCgaCgaCgaCgaCgazMaCgaCgaCgaCgaCgaNdaCgabqabfabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabdaXHbdMbeWbeXaXLaXLbjWbjVbjYbjXblFblDbiUblGblJbdIaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNabqaaaabqaaaaUNaYgaUNbhbbhbbhWbhjaUNaYgaUNaUNaWDbfubfibfjbgAcEgcEgavUbflavUavUcHrbgBbfobgKbgCbgCbgVbjdbiIbjubfvbfwbhXbiPbfwbjfceXbfwbjJbjgbfDbfEceYbfGbjlbfIbfJbfKbfKbfLbfMbjAbfObfPbfQbfRbfSbfSbfSbfSbfSbfSbfSbfTbfUbfVbfVbfVbfVbfVbfVbfVbfVbfWbfXbfYbfZbfVbjDbfWbfVbfVbgbbgcbgdbezbgebgfbggbjFbgibezbgjbksbuCaGWaoGaaabeCbgmbgnbeCbgobgpbgqbgrbgsbgtbambgubgvbgwbgxcfdbjGbambktbkwbkvbdEbjObgEbjPbdEbgGaOdaOdaOdaOdaOdaOdaOdaOdaOdaOdbjTbgLbjTbgLaefaefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdaXHbdMbeWbeXaXLaXLbdIblKbilbdIblLbdIbhHbjSbdIbdIaXLbeXbeYbdMaXOabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqaaaaUNbdRaUNaUNaUNaUNaUNaUNbdRaUNaaaaWDbkybgWbgXbgXbgXbgXbgXbgXbgXbgXbgYazQbfwbfwaXibkEaXibfwbfwbfwbhcbfwbkxbhebkKbhgbhhbhibkSbhkbhlbhmbhnbfGblIbfIbhpblhbhqbhrbhqbhsbhqbhtbhubhtaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxbhwbhwbhxbhwbhwbhwbhwbhwbrNbhybfIbhzbezblMbhBbhCbhDbhEbezbhFbhGbuCaGWapeaaaaZKbhIbhJbbxbhLbhMbhNbhObhPbhQbambmmbhSbhTbhTbhUbmEbambkTbltbkTbdEbhYbhZbmGbdEaChaCgaCgaCgaCgaCgaCgaCgaCgaCgaDLaFRaFRaTRaFRabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaaaaaaaaabdaaabgMbdMbeWbeXaXLaXLbdIbfCbilbdIbdIbdIbhHbfHbdIbdIaXLbeXbeYbdMbMnaUUaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobipbiobiqbiobiobiqbiobipbirbisaWDbkybitbiubivbiwbixbiybmSbmPbgXbgYbiCbiDbiEbiFbiGbiFbiGbiHbiGbmdbfwbnqbiKbiLbiMbiNbazblubiQbiRbiSbiTaAMbiVbiWbiXbhqbiYbiZbjabhKbhqbjcbmObjeabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqbhwbnvbnAbjhbjibjjbjkbnEbhwbjmbjnbjobezbjpbjqbjrbjsbjtbezaoGaoGaoGbmRaoGaaabeCbjvbjwbeCbjxbjybjzbnJbjBbjCbambnMbnLbombobbjHbjIbamaFRbmhaFRbdEbjKbjLbjMbdEdeWavPdfadfcdfbdfdasXdfeanqanqaaaaaaaFRbgLaFRabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaUUaUUbooaXNbmHblNbfbbgNaXLaXLbdIbidbilbmTboHbowboJbidbdIbdIaXLbgNbgQbnNbnPbnOaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobiobjZbkabkbbkcbkdbkebkfbkgbkhbkbbkiblVaUNbkybgWbbLbklbkmbknbkobkpbkqbkrcIibocbkubpmbpmbppbpobpybfwbfwbfwbfwbkzbkAbkBbkCbkDaXibmibhkbhlbkFbkGbkHbkIbfIbkJbhqboNbkLbkMbkNbkObkPbkQbccabqabqaBVaCVaBYaDKbkWaEhaCVaDKbkWaEhaBYaBYaEtabqabqbhwbmoblablbblcblbbldblebhwblfbfIblgbwlbezbkkaODbkRbezbezbllblmaoGblnaoGblobeCbeCbeCbeCbbHbbHbbHblpblqbbHbambambambambamaGtaFPbambmubofbmubdEbkUblwbkVbdEdffdfhdfgdfgdfjdfkdfkdfkdflabqaaaaaaaaaaWwaaaabqaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWwbnRblEbnTbnSbnUbicbeXbeXaXLaXLbdIbogbptbdLbqZbpubphbpqbdIbdIaXLbeXbeXbrcbijbrfaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobipbiobiqbiobiobiqbiobipbirbisaWDbkybitbiubivbiwbixbiybmSbmPbgXbgYbiCbiDbiEbiFbiGbiFbiGbiHbiGbmdbfwbnqbiKbiLbiMbiNbazblubiQbiRbiSbiTaAMbiVbiWbiXbhqbiYbiZbjabhKbhqbjcbmObjeabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqbhwboMbnAbjhbjibjjbjkbnEbhwbjmbjnbjobezbjpbjqbjrbjsbjtbezaoGaoGaoGbmRaoGaaabeCbjvbjwbeCbjxbjybjzbnJbjBbjCbambnMbnLbombobbjHbjIbamaFRbmhaFRbdEbjKbjLbjMbdEdeWavPdfadfcdfbdfdasXdfeanqanqaaaaaaaFRbgLaFRabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaUUaUUbooaXNbmHblNbfbbgNaXLaXLbdIbidbilbmTboHbowboJbidbdIbdIaXLbgNbgQbnNbnPbnOaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobiobjZbkabkbbkcbkdbkebkfbkgbkhbkbbkiblVaUNbkybgWbbLbklbkmbknbkobkpbkqbkrcIibocbkubpmbpmbppbpobpybfwbfwbfwbfwbkzbkAbkBbkCbkDaXibmibhkbhlbkFbkGbkHbkIbfIbkJbhqboNbkLbkMbkNbkObkPbkQbccabqabqaBVaCVaBYaDKbkWaEhaCVaDKbkWaEhaBYaBYaEtabqabqbhwbmoblabykblcblbbldblebhwblfbfIblgbwlbezbkkaODbkRbezbezbllblmaoGblnaoGblobeCbeCbeCbeCbbHbbHbbHblpblqbbHbambambambambamaGtaFPbambmubofbmubdEbkUblwbkVbdEdffdfhdfgdfgdfjdfkdfkdfkdflabqaaaaaaaaaaWwaaaabqaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWwbnRblEbnTbnSbnUbicbeXbeXaXLaXLbdIbogbptbdLbqZbpubphbpqbdIbdIaXLbeXbeXbrcbijbrfaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablOblPblQblRbkbblSblTblSblTblSblTblSbkbblUbnFaUNbkyblWbgXblXblYcfgbmabmbbmcbgXbqkbmebmfbmgbpsbpDbmjbmkbmlbpFbmnbpEbmpbmqbmrbmsbmtbqWbmvbmwbmxbmybmzbmAbiVbfIbpIbhqbmQbmCbmDbpQbhqbmFbpUbjeabqabqaIbboBbopbpVbpYbqfbqdbqhbqgcfhbqjbqlaIHabqabqbhwbmUbmVbmWbmXbmYbmZbnabhwbhybnbbncbndbnebnfbnebngbnhbnibnebnebnebnjbnebnkbnlbnmbnnbnebnebnobnkbngbnjbnpbqBbnobnrbnsbntbrPbrbbnwbnxbnybnzbrRbnBbnCbnDblidfmdftdfqdfxdfudfydeZaoNdflabqaaaaaaaaaaWwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaWwbnRblEbnKbrgbrhbeWbrjbeXaXLaXLbdIbqXbrmbifbrIbrnbrQbrabdIbdIaXLbeXbeXbeXbeYbrfaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiqbkbbkbbipbkbblSblTblSbnVblSblTblSbkbblUbnFaUNbrUbnXbnYbnZboablkbrlblkbiubiubodboebhcbfwbrHbrKbohboibojbokbolbfwbskbonbojbkCbssbfwbrXboqborbosbotaAMbkIbfIbkJbhqboubovbsEboxbhqboybozbjebkWaJYbkWbsbboCboDboEboDboFboDboEboDboGbscbkWaJYbkWbhwboIboIboIbsHboKboLboMbhwbsVboOboPboQboRboSboRboTboRboUboRboRboRboVboRboWboXboYboZboRboRbpabpbbpcboVbpdboVbpebpfbpgbntbsYbpibpibpjbpkbpibpidfzdfBdfAbljbsZdfIbtadfKdfJbtcdfLdgKazDabqaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbpraaaaaaaaaabqbsdbsdboobsebsfbeWbsnaXLaXLaXLbsMbdIblHblHbtdbdIbdIbdIbdIbrkaXLaXLaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiqbkbbkbbipbkbblSblTblSbnVblSblTblSbkbblUbnFaUNbrUbnXbnYbnZboablkbrlblkbiubiubodboebhcbfwbrHbrKbohboibojbokbolbfwbskbonbojbkCbssbfwbrXboqborbosbotaAMbkIbfIbkJbhqboubovbsEboxbhqboybozbjebkWaJYbkWbsbboCboDboEboDboFboDboEboDboGbscbkWaJYbkWbhwboIboIboIbsHboKboLdgVbhwbsVboOboPboQboRboSboRboTboRboUboRboRboRboVboRboWboXboYboZboRboRbpabpbbpcboVbpdboVbpebpfbpgbntbsYbpibpibpjbpkbpibpidfzdfBdfAbljbsZdfIbtadfKdfJbtcdfLdgKazDabqaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbpraaaaaaaaaabqbsdbsdboobsebsfbeWbsnaXLaXLaXLbsMbdIblHblHbtdbdIbdIbdIbdIbrkaXLaXLaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablObpwbpxblRbkbblSblTblSblTblSblTblSbkbblUbnFaUNbuxbpzbpAbpBbpCbrVbrVbutbtDbpBbpGbpHbtLbfwbpJbpKbpLbpMbpNbpObpPbfwbtObpRbpSbpTbtRbfwbsibpWbpXbtSbpZbfGbqabjnbqbbqcbqcbqcbqcbqcbhtbtPbqebhtbkWbubbtYbtTboEboEboEboEbqiboEboEboEboEbtZbumbuEbkWbqmbqnbqobqpbqqbqrbqrbqsbhwbqtbqubqvbqwbqxbqybqxbqzbqxbqAbqxbqxbuVbqxbqxbqCbqDbqxbqEbuVbqFbqGbqCbqHbqxbqIbqJbqKbqLbqMblsbqObqPbqQbqRbpnbqSbqSbqTdgMdgLdgOdgNdgPanqanqanqanqanqanqanqanqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaaabqbsPbsRbsQbsSbrdcKIaXNbsfbsTbsUaXLbsWbuWbsXbribvfbvdbtbbvgbvmbrkbtebvobtgbtfaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobiobjZbrpbkbbrqbkbbrrbrsbkbbrtbkbbkibruaUNbkybrvbrwbrxbrybrzbrAbrBbrCbrxbrDbrEbrFbfwbrGaXibuublvbfwbfwbfwbfwbfwaXibrJblxbfwbfwaAMbrLbrMaAMaAMbzObehbfIbrObqcbvpcfjbvqbqcbrSbrTbuBbvnbuwburbrYbrZbsabsabvWbwfbwebvWbvWbsabsabsgbshbvrbkWbhwboIboIboIbsjboIboIboIbhwbvsbfIbslbZiblCbsoblCbsmbspbspbspbspbspbspaoGaoGbsqaoGaoGaoGbsrbmBaoGaoGaoGbstaoGbsubsvbswbbfbsybszbsAbsBbqSbsCbsCbsDbqUbvtbjNbntbvubsGbvvbsIbsJbsJbsKbsLabqaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaabuLbudbuMabqbuObuNbuQbuPbuSbuRbuTbBebvwbuUbvxbribuYbuXbvabuZbvcbvbbvebvXbwabvZaXLbvhbvibdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobthbiobiqbiobiobiqbiobipbtibtjaWDbuDbtlbtmbfGbtnbtobtpbtobtqbfGbtrbtsbttbtubtvbtwbtxbtybtzbtwbtAbtBbtwbtvbtvbtCbtvbwbbtEbtFbtGbtHbtvbtIbtJbtKbkJaKqbtMbtNbwcbqcbjebjebjebjebkWbwgbtQboEboEboEbtUboEbtVbtWbtXboEboEbwnbuabAkbucbhwbwmbuebufbugbuhboIbuibhwbujbfIbukboAdedbunbuobsmbupbuqbwpbusbxebxHbuvbxIbuHaoGbuybuzbuAbuIcbXaoGarrbvjaoGbwobuFbuGbqNbwHbwHbwHbwJbuJbqSbqSbuKaZobvkbwvbwrbwFbwybwMbwLbwUbwUbwXbwWbwYbwYbwYbxibxlbwYbwYbwYbwYbwYbxibwYbwYbwYbwYbwYbwYbxibwYbxlbxmbxnbxobxobxqbxpbxtbxsbxvbxubxxbxwbxzbxybxBbxAbxDbxCbzebxEbzgbzfbzjbzibzlbzkbznbzmbzpbzoaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8761,3 +8762,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} + diff --git a/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm index c98cccae52d..a6890bdd61d 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm @@ -24,7 +24,7 @@ "ax" = (/obj/effect/decal/remains/robot{icon_state = "gib5"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/space/ancientstation/hivebot) "ay" = (/obj/structure/shuttle/engine/large{icon_state = "large_engine"; dir = 4},/turf/simulated/wall,/area/ruin/space/ancientstation/hivebot) "az" = (/turf/simulated/wall/rust,/area/ruin/space/ancientstation) -"aA" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt,/obj/machinery/door_control{id = "ancient"; name = "Charlie Station Lockdown Button"},/turf/simulated/floor/plasteel,/area/ruin/space/ancientstation/comm) +"aA" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt,/obj/machinery/door_control{id = "ancient"; name = "Charlie Station Lockdown Button"; range = 30},/turf/simulated/floor/plasteel,/area/ruin/space/ancientstation/comm) "aB" = (/obj/effect/decal/cleanable/dirt,/obj/structure/chair{dir = 1},/turf/simulated/floor/plasteel,/area/ruin/space/ancientstation/comm) "aC" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt,/obj/item/toy/cards/deck,/obj/item/folder/blue,/obj/item/pen,/turf/simulated/floor/plasteel,/area/ruin/space/ancientstation/comm) "aD" = (/obj/machinery/door/airlock/highsecurity,/turf/simulated/floor/plating,/area/ruin/space/ancientstation/hivebot) @@ -208,7 +208,7 @@ "dZ" = (/obj/machinery/computer{desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; name = "Broken Computer"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/ruin/space/ancientstation/sec) "ea" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/firealarm{dir = 4; pixel_x = -28},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/ruin/space/ancientstation/deltacorridor) "eb" = (/obj/machinery/light{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "white"},/area/ruin/space/ancientstation/rnd) -"ec" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/computer/rdconsole/core,/turf/simulated/floor/plasteel{icon_state = "white"},/area/ruin/space/ancientstation/rnd) +"ec" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/computer/rdconsole/public,/turf/simulated/floor/plasteel{icon_state = "white"},/area/ruin/space/ancientstation/rnd) "ed" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor/plasteel{icon_state = "white"},/area/ruin/space/ancientstation/rnd) "ee" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/mecha_part_fabricator,/turf/simulated/floor/plasteel{icon_state = "white"},/area/ruin/space/ancientstation/rnd) "ef" = (/obj/effect/decal/cleanable/dirt,/obj/structure/table,/obj/item/stack/sheet/metal/fifty,/obj/item/stack/sheet/glass/fifty{pixel_x = 2; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/ruin/space/ancientstation/rnd) @@ -660,3 +660,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} + diff --git a/_maps/map_files/RandomZLevels/moonoutpost19.dmm b/_maps/map_files/RandomZLevels/moonoutpost19.dmm index 870a6f075a8..89c6b61013b 100644 --- a/_maps/map_files/RandomZLevels/moonoutpost19.dmm +++ b/_maps/map_files/RandomZLevels/moonoutpost19.dmm @@ -692,7 +692,7 @@ "np" = (/obj/structure/sign/vacuum{desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; name = "\improper HOSTILE ATMOSPHERE AHEAD"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "nq" = (/obj/effect/decal/cleanable/cobweb2,/obj/effect/landmark/damageturf,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "nr" = (/obj/structure/chair{dir = 8},/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) -"ns" = (/obj/structure/table,/obj/item/toy/cards/deck,/obj/effect/landmark/damageturf,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) +"ns" = (/obj/structure/table,/obj/item/deck/cards,/obj/effect/landmark/damageturf,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "nt" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "nu" = (/obj/structure/grille/broken,/obj/item/stack/rods,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "nv" = (/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index bd18d50835d..0cf3cd72a23 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -1100,7 +1100,7 @@ "avh" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "darkred"},/area/security/brig) "avi" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "darkred"},/area/security/brig) "avj" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby) -"avk" = (/obj/structure/closet/secure_closet/brig{id = "Cell 4"; name = "Cell 4 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 3"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/prison/cell_block/B) +"avk" = (/obj/structure/closet/secure_closet/brig{id = "Cell 4"; name = "Cell 4 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 4"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/prison/cell_block/B) "avl" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison/cell_block/B) "avm" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/prison/cell_block/B) "avn" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/prison/cell_block/B) @@ -1404,7 +1404,7 @@ "aAZ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/security/lobby) "aBa" = (/obj/structure/chair{dir = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby) "aBb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/lobby) -"aBc" = (/obj/structure/table/wood,/obj/item/toy/cards/deck/black,/turf/simulated/floor/wood,/area/maintenance/abandonedbar) +"aBc" = (/obj/structure/table/wood,/obj/item/deck/cards,/turf/simulated/floor/wood,/area/maintenance/abandonedbar) "aBd" = (/obj/structure/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/abandonedbar) "aBe" = (/obj/structure/chair/wood/wings{tag = "icon-wooden_chair_wings (WEST)"; icon_state = "wooden_chair_wings"; dir = 8},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar) "aBf" = (/obj/structure/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/wood,/area/maintenance/abandonedbar) @@ -2070,7 +2070,7 @@ "aNP" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aNQ" = (/obj/machinery/light,/obj/item/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/structure/table/wood,/obj/item/reagent_containers/spray/waterflower,/turf/simulated/floor/wood,/area/mimeoffice) "aNR" = (/obj/structure/table/wood,/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) -"aNS" = (/obj/structure/table/wood,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) +"aNS" = (/obj/structure/table/wood,/obj/item/deck/cards,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "aNT" = (/obj/structure/disposalpipe/segment,/obj/structure/chair/stool,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "aNU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Arcade"},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/carpet/arcade,/area/crew_quarters/fitness{name = "\improper Arcade"}) "aNV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness) @@ -2455,7 +2455,7 @@ "aVk" = (/obj/structure/closet/secure_closet/freezer/money,/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/nuke_storage) "aVl" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 10},/area/security/nuke_storage) "aVm" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{pixel_y = 23},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "vault"},/area/security/nuke_storage) -"aVn" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/filingcabinet,/obj/item/folder/documents,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/nuke_storage) +"aVn" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/table/reinforced,/obj/structure/closet/fireaxecabinet{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/nuke_storage) "aVo" = (/obj/machinery/gateway{dir = 10},/obj/effect/landmark{name = "JoinLateGateway"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/gateway) "aVp" = (/obj/item/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/gateway) "aVq" = (/obj/machinery/gateway{dir = 6},/obj/effect/landmark{name = "JoinLateGateway"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/gateway) @@ -2666,7 +2666,7 @@ "aZn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"}) "aZo" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 10},/area/security/nuke_storage) "aZp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "vault"},/area/security/nuke_storage) -"aZq" = (/obj/structure/safe,/obj/machinery/light_switch{pixel_y = -23},/obj/item/clothing/head/bearpelt,/obj/item/twohanded/fireaxe,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/nuke_storage) +"aZq" = (/obj/structure/safe{knownby = list("captain")},/obj/machinery/light_switch{pixel_y = -23},/obj/item/clothing/head/bearpelt,/obj/item/folder/documents,/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka,/obj/item/lighter/zippo/nt_rep,/obj/item/storage/fancy/cigarettes/cigpack_robustgold,/obj/item/stack/spacecash/c1000{amount = 100000},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/nuke_storage) "aZr" = (/obj/structure/table,/obj/machinery/light{dir = 4},/obj/item/storage/toolbox/mechanical,/turf/simulated/floor/plasteel,/area/storage/primary) "aZs" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/gateway) "aZt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/gateway) @@ -3033,7 +3033,7 @@ "bgq" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bgr" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bgs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) -"bgt" = (/obj/structure/table/wood,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry) +"bgt" = (/obj/structure/table/wood,/obj/item/deck/cards,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry) "bgu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bgv" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/secondary/entry) "bgw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/primary/port) @@ -3704,7 +3704,7 @@ "btl" = (/obj/structure/table/wood,/turf/simulated/floor/wood,/area/library) "btm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkred"},/area/hallway/secondary/exit) "btn" = (/obj/structure/disposalpipe/segment,/obj/structure/table/wood,/obj/item/dice,/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bto" = (/obj/structure/table/wood,/obj/item/toy/cards/deck,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bto" = (/obj/structure/table/wood,/obj/item/deck/cards,/turf/simulated/floor/wood,/area/crew_quarters/bar) "btp" = (/turf/simulated/floor/plasteel{icon_state = "rampbottom"; tag = "icon-stage_stairs"},/area/hallway/secondary/exit) "btq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "btr" = (/obj/structure/table/wood,/obj/item/reagent_containers/food/condiment/saltshaker{pixel_x = -2; pixel_y = 4},/obj/item/reagent_containers/food/condiment/peppermill{pixel_x = 2; pixel_y = 6},/turf/simulated/floor/wood,/area/crew_quarters/bar) @@ -4107,8 +4107,8 @@ "bAY" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) "bAZ" = (/obj/effect/landmark{name = "blobstart"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port) "bBa" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/port) -"bBb" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"; tag = "icon-pipe-j2"},/turf/simulated/floor/plating,/area/maintenance/port) -"bBc" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/remains/robot,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port) +"bBb" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/remains/robot,/turf/simulated/floor/plating,/area/maintenance/port) +"bBc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/blood/oil/streak,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) "bBd" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bBe" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 1; location = "Bridge"},/obj/structure/plasticflaps{opacity = 1},/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel,/area/bridge/meeting_room) "bBf" = (/obj/machinery/camera{c_tag = "Locker Room South"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel,/area/crew_quarters/locker) @@ -4168,7 +4168,7 @@ "bCh" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/disposal) "bCi" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops) "bCj" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/port) -"bCk" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/maintenance/port) +"bCk" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) "bCl" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops) "bCm" = (/obj/machinery/door/airlock{name = "Unit 3"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bCn" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) @@ -4251,14 +4251,14 @@ "bDM" = (/obj/machinery/conveyor/southeast{id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) "bDN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) "bDO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port) -"bDP" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/port) +"bDP" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/port) "bDQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) "bDR" = (/obj/machinery/camera{c_tag = "Cargo Bay Storage"; dir = 8; network = list("SS13")},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/quartermaster/storage) -"bDS" = (/obj/structure/closet/crate/medical,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/quartermaster/storage) +"bDS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) "bDT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bDU" = (/obj/structure/disposaloutlet{dir = 1},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating,/area/quartermaster/office) "bDV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; name = "Sci R&D"; sortType = 12},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) -"bDW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/blood/oil/streak,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port) +"bDW" = (/obj/structure/disposalpipe/segment,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) "bDX" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster/office) "bDY" = (/obj/machinery/camera{c_tag = "Locker Room Toilets"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bDZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/quartermaster/storage) @@ -4270,7 +4270,7 @@ "bEf" = (/obj/item/paper_bin{pixel_x = -3; pixel_y = 7},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 4},/area/quartermaster/office) "bEg" = (/obj/structure/table/wood,/obj/item/folder/blue,/obj/item/stamp/captain,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bEh" = (/obj/structure/table/wood,/obj/item/hand_tele,/turf/simulated/floor/wood,/area/crew_quarters/captain) -"bEi" = (/obj/structure/table/wood,/obj/item/flashlight/lamp/green,/turf/simulated/floor/wood,/area/crew_quarters/captain) +"bEi" = (/obj/structure/table/wood,/obj/item/flashlight/lamp/green,/obj/item/paper/safe_code{owner = "captain"},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bEj" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west) "bEk" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bEl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/radio/intercom{pixel_y = 25},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) @@ -4308,14 +4308,14 @@ "bER" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/specops) "bES" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/port) "bET" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/port) -"bEU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port) +"bEU" = (/obj/structure/closet/crate/medical,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bEV" = (/obj/machinery/light{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) "bEW" = (/obj/machinery/door/airlock{name = "Unit 4"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bEX" = (/obj/machinery/conveyor/west{id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) "bEY" = (/obj/machinery/conveyor/southwest/ccw{id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) "bEZ" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port) "bFa" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) -"bFb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) +"bFb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port) "bFc" = (/obj/machinery/conveyor/southwest{id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) "bFd" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) "bFe" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plating,/area/maintenance/port) @@ -4324,8 +4324,8 @@ "bFh" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bFi" = (/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port) "bFj" = (/obj/structure/closet/crate/internals,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/quartermaster/storage) -"bFk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light_switch{pixel_x = -24},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/quartermaster/storage) -"bFl" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/port) +"bFk" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port) +"bFl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light_switch{pixel_x = -24},/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bFm" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/quartermaster/storage) "bFn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port) "bFo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/port) @@ -4412,14 +4412,14 @@ "bGR" = (/obj/structure/closet/firecloset,/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bGS" = (/obj/effect/decal/cleanable/generic,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port) "bGT" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/port) -"bGU" = (/obj/structure/reagent_dispensers/watertank,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port) -"bGV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/port) -"bGW" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/port) -"bGX" = (/obj/structure/grille,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/port) -"bGY" = (/obj/item/cigbutt,/turf/simulated/floor/plating,/area/maintenance/port) +"bGU" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) +"bGV" = (/obj/structure/reagent_dispensers/watertank,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port) +"bGW" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/crew_quarters/locker/locker_toilet) +"bGX" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) +"bGY" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) "bGZ" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/port) "bHa" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) -"bHb" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/quartermaster/storage) +"bHb" = (/obj/item/cigbutt,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port) "bHc" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating,/area/quartermaster/office) "bHd" = (/obj/structure/sign/vacuum{pixel_x = -32},/obj/machinery/conveyor/south{id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) "bHe" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/trunk,/obj/machinery/door/window/eastleft{base_state = "right"; icon_state = "right"; layer = 3; name = "interior door"; req_access_txt = "50"},/obj/machinery/disposal/deliveryChute{dir = 4},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plating,/area/maintenance/disposal) @@ -4439,7 +4439,7 @@ "bHs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/engine/gravitygenerator) "bHt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/space,/area/space) "bHu" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator) -"bHv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/rack,/obj/item/tank/emergency_oxygen/double,/obj/item/tank/jetpack/oxygen/captain,/obj/item/clothing/suit/space/captain,/obj/item/clothing/mask/gas,/obj/item/clothing/head/helmet/space/capspace,/obj/item/radio/intercom/private{pixel_x = -28},/turf/simulated/floor/wood,/area/crew_quarters/captain) +"bHv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/rack,/obj/item/tank/emergency_oxygen/double,/obj/item/tank/jetpack/oxygen/captain,/obj/item/clothing/suit/space/captain,/obj/item/clothing/mask/gas,/obj/item/radio/intercom/private{pixel_x = -28},/obj/item/crowbar/red,/obj/item/clothing/head/helmet/space/capspace,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bHw" = (/obj/machinery/computer/card,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bHx" = (/obj/structure/table/wood,/obj/machinery/recharger{pixel_y = 4},/obj/item/melee/chainofcommand,/obj/item/card/id/captains_spare,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bHy" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/wood,/area/crew_quarters/captain) @@ -4492,7 +4492,7 @@ "bIt" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/clothing/glasses/welding,/obj/machinery/door_control{id = "rdlab"; name = "Research and Development Lab Shutters Control"; pixel_x = -24; pixel_y = 0; req_access_txt = "47"},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/toxins/lab) "bIu" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/shuttle/escape) "bIv" = (/obj/structure/table,/obj/item/folder/white,/obj/item/disk/tech_disk,/obj/item/disk/tech_disk,/obj/item/disk/design_disk,/obj/item/disk/design_disk,/obj/item/reagent_containers/dropper,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/toxins/lab) -"bIw" = (/obj/structure/chair/stool,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/toxins/lab) +"bIw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) "bIx" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/escape) "bIy" = (/obj/item/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "bIz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) @@ -4689,7 +4689,7 @@ "bMi" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bMj" = (/obj/machinery/light{dir = 8},/obj/machinery/computer/rdconsole/core,/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plasteel,/area/toxins/lab) "bMk" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plating,/area/maintenance/disposal) -"bMl" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "qm_warehouse"; name = "Warehouse Shutters"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/warning_stripes/yellow,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/quartermaster/storage) +"bMl" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "qm_warehouse"; name = "Warehouse Shutters"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/warning_stripes/yellow,/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bMm" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/obj/machinery/alarm{dir = 1; pixel_y = -25},/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/disposal) "bMn" = (/obj/machinery/light/small,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal) "bMo" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/supply) @@ -4816,7 +4816,7 @@ "bOF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering/glass{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator) "bOG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/space,/area/space) "bOH" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/gravitygenerator) -"bOI" = (/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) +"bOI" = (/obj/structure/safe/floor{knownby = list("captain")},/obj/item/gun/projectile/revolver/russian,/obj/item/reagent_containers/food/drinks/bottle/absinthe/premium,/obj/item/lighter/zippo/nt_rep,/obj/item/storage/fancy/cigarettes/cigpack_robustgold,/obj/item/toy/figure/captain,/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) "bOJ" = (/obj/structure/table/wood,/obj/item/flashlight/lamp/green,/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) "bOK" = (/turf/simulated/wall,/area/crew_quarters/captain/bedroom) "bOL" = (/obj/structure/toilet{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/captain/bedroom) @@ -4834,7 +4834,7 @@ "bOX" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) "bOY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) "bOZ" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/item/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/camera{c_tag = "Research Mech Bay"; dir = 4; network = list("Research","SS13")},/turf/simulated/floor/plating,/area/assembly/chargebay) -"bPa" = (/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j2s"; name = "Cargo Disposals"; sortType = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/quartermaster/office) +"bPa" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/wall,/area/quartermaster/storage) "bPb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/assembly/robotics) "bPc" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "paramedic"; name = "Paramedic Garage"},/turf/simulated/floor/plasteel,/area/medical/paramedic) "bPd" = (/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Research Hallway Entrance"; dir = 2; network = list("Research","SS13")},/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel,/area/medical/research{name = "Research Division"}) @@ -4863,7 +4863,7 @@ "bPA" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bPB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "bPC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) -"bPD" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"bPD" = (/obj/structure/disposalpipe/segment,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/quartermaster/storage) "bPE" = (/obj/item/paper_bin{pixel_x = 1; pixel_y = 9},/obj/structure/table/glass,/obj/item/pen/multi,/obj/item/book/manual/sop_science{pixel_y = -14},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) "bPF" = (/obj/structure/chair/stool,/obj/effect/decal/warning_stripes/east,/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor/plasteel,/area/medical/chemistry) "bPG" = (/obj/machinery/light{dir = 8},/obj/structure/reagent_dispensers/fueltank/chem{pixel_x = -32},/obj/machinery/chem_dispenser,/turf/simulated/floor/plasteel,/area/medical/chemistry) @@ -6943,7 +6943,7 @@ "cDA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cDB" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/toxins/misc_lab) "cDC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) -"cDD" = (/obj/structure/chair/office/light{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab) +"cDD" = (/obj/structure/chair/stool,/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/toxins/lab) "cDE" = (/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab) "cDF" = (/obj/structure/chair/office/light{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab) "cDG" = (/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab) @@ -7662,7 +7662,7 @@ "cRr" = (/obj/machinery/light,/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel,/area/engine/engineering) "cRs" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engineering) "cRt" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cRu" = (/obj/structure/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) +"cRu" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (EAST)"; icon_state = "pipe-j2"; dir = 4},/turf/simulated/wall,/area/quartermaster/office) "cRv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cRw" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "engineering_west_airlock"; name = "interior access button"; pixel_x = -20; pixel_y = -20; req_access_txt = "10;13"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel,/area/engine/engineering) "cRx" = (/obj/machinery/processor{name = "Slime Processor"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) @@ -8337,7 +8337,12 @@ "deq" = (/obj/machinery/computer/guestpass,/turf/simulated/wall,/area/medical/reception) "der" = (/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/asmaint) "des" = (/obj/machinery/light/small{dir = 8},/obj/machinery/field/generator,/turf/simulated/floor/plating,/area/storage/secure) +"det" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/quartermaster/office) "deu" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/engine/engineering) +"dev" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"dew" = (/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) +"dex" = (/obj/structure/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab) +"dey" = (/obj/structure/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "deA" = (/obj/structure/chair/stool,/turf/simulated/floor/plasteel,/area/engine/engineering) "deB" = (/obj/structure/particle_accelerator/power_box,/turf/simulated/floor/plating,/area/engine/engineering) "deC" = (/obj/item/screwdriver,/turf/simulated/floor/plasteel,/area/engine/engineering) @@ -9021,13 +9026,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabysbwEbwGbwHbwIbwIbwJbwIbwIbwIbwJbrQaSdaSdaSdbvwblFaPYbrUbwMbvnbvnbvnbvkbwMbrUbqrbvybwKbtIbvsbwPbwQbwRbwSbvsbwUbwTbwVblMbrNbstbwNbwYblMbnKbxabxbbxbbxcbxbbxbbxbbxbbxebxdbxdbxdbxfbxdbxgbxhbxibxjbxkbxlbxlbxlbxlbxlbxmbxmbxnbxmbvXbvXbxobxpbxqbxrbxtbxsbxobxubvXbxvbxwbxvbxvbxvbxvbxvbxvbxvbwjbhqbhqaUSbxxbmqaVGbJQbmqbznbmqbzobxDbxCbmqbxEbdTbxFbxGbdTbdTbxHbxJbxIbxJbdTbdTbebblbbxLbxMbxMbxMbxMbxLbxNbebbKVbwvbwvbwwbxPbaubxQbxRbxSbxTbxUbxVbxWbycbxZaYPbjDbyZbyabrJboJbsMbyabzlbjDbEFbzpbAwbAjbAzbAybABbAAbACbAjbAjbADbsIbAEboIbrLbrMboIbrKbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCblCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabysbrObrObrQbrObrObrObrRbrObrObydaabaSdbwObmSbyfbqrbtFbtFbtFbrUbyhbygbyjbyibqrbwZbyebtIbvsbymbvsbynbyobvsbyqbypbyrblMbrNbstbwNbskblMbnKbxabxbbytbyubyvbywbzBbxbbyybykbyxbylbyBbyBbyBbyCbyEbyDbyFbxlbyGbyHbyIbyJbyLbyKbyMbyNbvXbyObxqbxqbyPbyQbyPbxqbxqbyRbvXbySbyUbyTbyWbyVbyYbyXaZObxvbzabzbbzbbzcaUSaUSaUSaUSbAvbsNbAvbzeaUSbdRaUSaUSbdTbdTbdTbdTbzgbzfbzfbzfbzfbzhaQsbebbjBbzjbjBbzkbzkbjBbzjbjBbebbKVbwvbwvbAxbxPbaubaubaubaubaubtfbaubaubaubauaYPaYPaYPaYQbAGaYQbAHaYQaYPaYPbEFbAIbuHbAJbAKbjRbjRbjRbEFbALbmmbmmbAMbjRbjRbjRbqnbjRbicbttbeCblCblDblAbeCblCblDblAbeCbtubicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjQaLdaSdaSdaSdaMsaMsaMsaMsaMsaMsbzrbzsbqrbqrbqrbqrbqrbqrbztbqrbqrbqrbnKbnKbzwbvsbzubzvbynbzxbvsbzzbzybzAblMbrNbstbwNbnDblMbnKbxabxbbzCbzDbBjbywbBjbxbbyybyzbzEbzFbzIbzHbzKbzJbzMbzLbyFbzRbzNbBsbzPbzQbzQbzPbzUbzSbvXbzTbxqbxqbyPbzWbyPbxqbxqbzVbwbbzXbAbbzYbzZbAabAdbzYbAcbxvbAlbAebAfbAgbAhbAicMKbAkbAkbAkbAkbAkbAkbAmbAobAnbAkbAkbAqbAkbAkbAkbAkbAkbAkbAkbAkbApbAsbArbArbArbArbArbArbAtbAicVsbvhbvhbBtbBrbBNbBrbBPbBrbBUbBQbDkbBrbDubDtbElbDxcVUcVUbEmcVUbEBcVUbENbEHbFzbFwbGjbGhbjRbwDbwCbxzbjRbGobmmbmmbGIbGsbjRbGMbGNbjRblDblAbeCblCbnbblAbeCblCbnbblAbeCblCblDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAQbARbARbARbARbASbASbARbARbATaaaaabaSdaUlaMEbAVbAUbAXbAWbAWbAWbAWbAYbAZbBablQbnwbBcbBbbvsbvsbvsbBdbyobvsblMblMblMblMbrNbuabyAbBfblMbBhbBibxbbBkbBlbywbBjbCubxbbyybzGbzEbzFbBnbBobBpbzJbBqbzLbyFbzRbDobCAbDsbBubBvbBwbzUbBxbvXbBybyPbxqbBAbBzbBAbxqbyPbBBbxubBCbzYbzYbzZbBDbAdbzYbBEbxvbBFbAfbAfbAgbAhbAibAkbAkbAkbAkbAkbAkbAkbBGbAkbAkbAkbAkbAkbAkbBHbBIbBIbBIbBIaQwbBIbBIbBIbBIbBIbBIaQwbBIbBIbBIaQybDVdcebIsbIzbwtbwtbwtbwtbwtbwubwtbwtbwtbwtbwtbwtbwtbwtbwtbwtbwtbMhbKubRFbNWbomcbudckcVtbjRcVVbzdbzmbjRcWhbmmbmmcWAcWvbjRcWEcWQbjRbnbblAbeCblCbnbblAbeCblCbnbblAbeCblCbnbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbCcbBZbCebCbbCbbClbCibARbATaSdaSdaSdaTobCnbCfbCgbCfbCfbCfbCfbChbCtbCjblQblQbCkbCwbvsbwPbCmbCxbzxbvsbCobCpbCoblMblMblMblMbCqblMbCrbCsbxbbCvbCybBjbCzbDRbxbbyybzJbCBbzFbBnbBnbCEbzJbCFbzLbyFbzRbDybCAbDsbCGbCCbBwbzUbCDbvXbCHbCIbxqbCKbCJbCLbxqbCRbCNbCSbCMbCTbCObCPbCQbCUbzYbCVbxvbCYbCXbAfbAgbAhbAibAkbCZbAkbDAbDbbDbbDbbDbbDbbDbbDbaRybAkbAkbAkbAkbAkbDabAkaRAaRCaRBaRCaRCaRCaREaRHaRFaSFaROaSHbFsaSKaSIaTHaSVbwvbwvbwvcXfbDpbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbDrbDqcXhcXgcXjcXibmmbGhbjRbwDbwCbxzbjRbGobmmbmmcXlcXkbjRbGNbGMbjRbqoblAbeCblCbqoblAbeCblCbqoblAbeCblCbqoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbDGbCbbCbbCbbCbbCbbCbbCbbDHbDCaOQbDCaSfbDIbCfbDEbDJbDLbDKbDMbChbDObDNbDQbDQbDWbKHbvsbvsbvsbynbDYbymblQblQblQblQbDPbnKbnKbCsbnKbCrbCsbxbbDSbDTbDZbFjbywbxbbDUbzJbEbbzFbBnbBnbEfbDXbEjbzLcXqbxlbHpbHobzPbzPbzPbzPbzUbEcbvXbEdbEebvXbvXbvXbvXbvXbvXbvXbxubxvbErbEgbEhbEibEsbEkbEvbxvbEwbEnbEnbEpbEpbEpbEpbEpbEpbEqbEybEpaTLaTKaTMbEpbNebEobEobEobEobEobEubEubEuaTNbEubEubEubEubEubEuaTObEubEubEubteaTPaTQbwvbuxbuxbEAbEAbEAbEAbEAbEJbDqbDqbDrbDqbwvbDqbDqbDqbDqbEMbEDbEDbEDbEDcXncXibmmbAJbEFbjRbjRbjRbAKbALbmmbmmbAMbjRbjRbjRbqnbjRbicbzqbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbEKbELbELbCbbELbELbELbARbERaSdaSdaSdaTobEVbCfbEYbEXbEXbEXbFcbChbnKbFfbESbETbEUbFgbvsbwPbEWbynbFhbymbFibEZbFabFbbFlbFdbFdbFebFdbFnbFobxbbFkbFpbFqbFrbKQbFmbNsbyBbFubFtbBnboxbFybvQbEjbzLcYPbxlbwebFvbJabFFbFIbFGbFMbxmbxmbFBbFCbFDbFEbFNbFEbFPbFCaaabFHbxvbFRbFJbFKbFLbEsbzYbFSbxvbFUbFObFWbEpaTTaTSaTVaTUaTYaTWaUPaUObLzbGabBLaVxaVIaVyaWOaWIaWSaWRbEuaYkaYoaYlaYraYqaZUaZTbobbbybuOaZTaZTbzibGrbGrbBJbGrbwLbwLbEAbGubGAbGwbEAbGBbGEbGBbEAbGFbDqbEMbEDbGKbGLbGKbEDbGCbGDbEDcXocXibmmbmmcXscXpcYdcXpcYebmmbmmbmmbwWbAEboIbANbrMboIbAObeCbeCbeCbeCbAPbeCbAPbeCbeCbeCbeCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGPbARbARbARbARbARbARbARbARbERaaaaaaaSdbBgbmSbHabCfbHdbCfbHebIHbHfbGQbChbHgbGSbGTbGUbFgbvsbvsbvsbvsbvsbvsbGVbGWbGXbGYbGZbxbbxbbxbbxbbxbbxbbxbbMlbxbbxbbxbbHbbxbbHcbAFbHjbBnbBnbBnbHnbDXcZfbzLcZjbxlbBebFvbxlbxlbxlbxmbHrbxmbHkbHlbHmbHubHBbHzbHDbHCbHsbHtbHFbxvbHvbzYbHwbHxbEsbHybzYbxvbHHbHAbHIbEpbCWbBMbDfbDfbDfbDfbDfbDfbDfbDebDhbDgbDjbDibSnbDlbDnbDmbEubEtbEzbExbECaZTbEEaZTbFQbEIbuObFTbFXbFVbGrbIfbFYbIgbFZbBmbIabGcbIdbIdbImbIcbIlbInbEAbIibIrbIkbEDbItbIwbIvbIobIpbIybEDcYhcXibmmbmmbmmbmmcYmcYkcYkcYkcYkcYkcYnbqnbjRbjRbjRbjRbqpbjCbBWbBVbjCbBXaYUbBXaYUbBYbBRbBSbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjQaLdaSdaSdaSdaSdaSdaSdaSdaSdaSdaToaSfbIGbCfbJjbIBbIIbIDbIDbIJbILbIKbIMbIMbIObINbDQbDQbDQbDQbDQbDQbIQbIPbIPbIRbITbxbbIVbIUbIYbIXbISbIZbJfbJbbxbbIWbJibyBbyCbDXbHjbBnbBnbKCbzJbzJbJmdaQdbnbJcbJdbJebJpbJgbJhbJsbJtbJkbJlbJubHsbJnbJvbJnbJvbJwbHsbHtbJqbJrbJybJxbJDbJzbJGbJEbJHbJrbJIbFObFObEpbDcbBMbGdbDdbGfbGebGebLybDebDebDebGtbGxbGvbSnbDlbGzbGybEubHEbHJbHGbHLbHKbHMaZTbFQbEIbuObFTbFXaZTbGrbHNbHQbHPbHSbHRbHUbHTbHVbJYbJYbKhbJYbIbbKbbGbbKdbGkbKfbKqbKrbKibKibKibKjbEDcYpcYocYqcYqcYqcYrcYvcYscYwcYwcYwcYxbBKbAEboIbrMbrMboIbDBdsldsldsldsnbicaaabicbDDbDwbDwbDFbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbGmbGlbKpaMdaMdaMdbmSaSfaSfbCfbKPbCfbKDbKsbKtbKEbCfblQbKvbKvbKwbKFbKwbKwbKwbKFbKwblQblQbxbbxbbxbbKGbxbbKzbKzbKzbKzbKzbKzbJfbKAbKBbPabzFbKIbKKbKJbKMbKLbKObFxccYccZbKSbKRdbYbKUbKXbKXbLabKZbKTbLbbLfbKWbLgbKYbFCbLhbHDbLibHBbLkbFCaaabLcbLdbLebLnbLdbLdbLdbLdbLpbxvbLqbLrbIechhbGibGgbGibEpbIhbGqbJAbIjbJBbJKbJTbJPbJXbJWbKabJZbKcbOUbEubEubEubEubEubKebKgaZTbFQbEIbLjbFTbFXaZTbGrbLNbLEbLPbLmbLlbLIbLTbLobLLbLMbLUbLObKkbEAbGRbLRbKnbEDbKobKybKxbIpbLWbNCbEDcYhbmmcYObjRcZkcYYcZlboDcZmbjRcZnbuHcZobqnbjRbjRbjRbjRaYUdsqdsldslbEObicaaabicbEPbDwbDwbEQbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAQbARbARbARbARbASbASbARbARbATaaaaabaSdaUlaMEbAVbAUbAXbAWbAWbAWbAWbAYbAZbBablQbnwbBbbzwbvsbvsbvsbBdbyobvsblMblMblMblMbrNbuabyAbBfblMbBhbBibxbbBkbBlbywbBjbCubxbbyybzGbzEbzFbBnbBobBpbzJbBqbzLbyFbzRbDobCAbDsbBubBvbBwbzUbBxbvXbBybyPbxqbBAbBzbBAbxqbyPbBBbxubBCbzYbzYbzZbBDbAdbzYbBEbxvbBFbAfbAfbAgbAhbAibAkbAkbAkbAkbAkbAkbAkbBGbAkbAkbAkbAkbAkbAkbBHbBIbBIbBIbBIaQwbBIbBIbBIbBIbBIbBIaQwbBIbBIbBIaQybDVdcebIsbIzbwtbwtbwtbwtbwtbwubwtbwtbwtbwtbwtbwtbwtbwtbwtbwtbwtbMhbKubRFbNWbomcbudckcVtbjRcVVbzdbzmbjRcWhbmmbmmcWAcWvbjRcWEcWQbjRbnbblAbeCblCbnbblAbeCblCbnbblAbeCblCbnbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbCcbBZbCebCbbCbbClbCibARbATaSdaSdaSdaTobCnbCfbCgbCfbCfbCfbCfbChbCtbCjblQblQblQbCwbvsbwPbCmbCxbzxbvsbCobCpbCoblMblMblMblMbCqblMbCrbCsbxbbCvbCybBjbCzbDRbxbbyybzJbCBbzFbBnbBnbCEbzJbCFbzLbyFbzRbDybCAbDsbCGbCCbBwbzUbCDbvXbCHbCIbxqbCKbCJbCLbxqbCRbCNbCSbCMbCTbCObCPbCQbCUbzYbCVbxvbCYbCXbAfbAgbAhbAibAkbCZbAkbDAbDbbDbbDbbDbbDbbDbbDbaRybAkbAkbAkbAkbAkbDabAkaRAaRCaRBaRCaRCaRCaREaRHaRFaSFaROaSHbFsaSKaSIaTHaSVbwvbwvbwvcXfbDpbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbDrbDqcXhcXgcXjcXibmmbGhbjRbwDbwCbxzbjRbGobmmbmmcXlcXkbjRbGNbGMbjRbqoblAbeCblCbqoblAbeCblCbqoblAbeCblCbqoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbDGbCbbCbbCbbCbbCbbCbbCbbDHbDCaOQbDCaSfbDIbCfbDEbDJbDLbDKbDMbChbDObDNbDQbDQbBcbKHbvsbvsbvsbynbDYbymblQblQblQblQbDPbCkbCkbDSbCkbDWbDSbFmbEUbDTbDZbFjbywbxbbDUbzJbEbbzFbBnbBnbEfbDXbEjbzLcXqbxlbHpbHobzPbzPbzPbzPbzUbEcbvXbEdbEebvXbvXbvXbvXbvXbvXbvXbxubxvbErbEgbEhbEibEsbEkbEvbxvbEwbEnbEnbEpbEpbEpbEpbEpbEpbEqbEybEpaTLaTKaTMbEpbNebEobEobEobEobEobEubEubEuaTNbEubEubEubEubEubEuaTObEubEubEubteaTPaTQbwvbuxbuxbEAbEAbEAbEAbEAbEJbDqbDqbDrbDqbwvbDqbDqbDqbDqbEMbEDbEDbEDbEDcXncXibmmbAJbEFbjRbjRbjRbAKbALbmmbmmbAMbjRbjRbjRbqnbjRbicbzqbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbEKbELbELbCbbELbELbELbARbERaSdaSdaSdaTobEVbCfbEYbEXbEXbEXbFcbChbnKbFfbESbETbETbFgbvsbwPbEWbynbFhbymbFibEZbFabFbbFkbFdbFdbFebFdbFnbFobxbbFlbFpbFqbFrbKQbFmbNsbyBbFubFtbBnboxbFybvQbEjbzLcYPbxlbwebFvbJabFFbFIbFGbFMbxmbxmbFBbFCbFDbFEbFNbFEbFPbFCaaabFHbxvbFRbFJbFKbFLbEsbzYbFSbxvbFUbFObFWbEpaTTaTSaTVaTUaTYaTWaUPaUObLzbGabBLaVxaVIaVyaWOaWIaWSaWRbEuaYkaYoaYlaYraYqaZUaZTbobbbybuOaZTaZTbzibGrbGrbBJbGrbwLbwLbEAbGubGAbGwbEAbGBbGEbGBbEAbGFbDqbEMbEDbGKbGLbGKbEDbGCbGDbEDcXocXibmmbmmcXscXpcYdcXpcYebmmbmmbmmbwWbAEboIbANbrMboIbAObeCbeCbeCbeCbAPbeCbAPbeCbeCbeCbeCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGPbARbARbARbARbARbARbARbARbERaaaaaaaSdbBgbmSbHabCfbHdbCfbHebIHbHfbGQbChbHgbGSbGTbGVbGUbGWbGWbGWbGWbGWbGWbGYbGXbIwbHbbGZbxbbxbbxbbxbbxbbxbbxbbMlbFmbFmbFmbPDbPabHcbAFbHjbBnbBnbBnbHnbDXcZfbzLcZjbxlbBebFvbxlbxlbxlbxmbHrbxmbHkbHlbHmbHubHBbHzbHDbHCbHsbHtbHFbxvbHvbzYbHwbHxbEsbHybzYbxvbHHbHAbHIbEpbCWbBMbDfbDfbDfbDfbDfbDfbDfbDebDhbDgbDjbDibSnbDlbDnbDmbEubEtbEzbExbECaZTbEEaZTbFQbEIbuObFTbFXbFVbGrbIfbFYbIgbFZbBmbIabGcbIdbIdbImbIcbIlbInbEAbIibIrbIkbEDbItcDDbIvbIobIpbIybEDcYhcXibmmbmmbmmbmmcYmcYkcYkcYkcYkcYkcYnbqnbjRbjRbjRbjRbqpbjCbBWbBVbjCbBXaYUbBXaYUbBYbBRbBSbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjQaLdaSdaSdaSdaSdaSdaSdaSdaSdaSdaToaSfbIGbCfbJjbIBbIIbIDbIDbIJbILbIKbIMbIMbIObINbDQbDQbDQbDQbDQbDQbIQbIPbIPbIRbITbxbbIVbIUbIYbIXbISbIZbJfbJbbxbbIWbJicRubyCbDXbHjbBnbBnbKCbzJbzJbJmdaQdbnbJcbJdbJebJpbJgbJhbJsbJtbJkbJlbJubHsbJnbJvbJnbJvbJwbHsbHtbJqbJrbJybJxbJDbJzbJGbJEbJHbJrbJIbFObFObEpbDcbBMbGdbDdbGfbGebGebLybDebDebDebGtbGxbGvbSnbDlbGzbGybEubHEbHJbHGbHLbHKbHMaZTbFQbEIbuObFTbFXaZTbGrbHNbHQbHPbHSbHRbHUbHTbHVbJYbJYbKhbJYbIbbKbbGbbKdbGkbKfbKqbKrbKibKibKibKjbEDcYpcYocYqcYqcYqcYrcYvcYscYwcYwcYwcYxbBKbAEboIbrMbrMboIbDBdsldsldsldsnbicaaabicbDDbDwbDwbDFbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbGmbGlbKpaMdaMdaMdbmSaSfaSfbCfbKPbCfbKDbKsbKtbKEbCfblQbKvbKvbKwbKFbKwbKwbKwbKFbKwblQblQbxbbxbbxbbKGbxbbKzbKzbKzbKzbKzbKzbJfbKAbKBdetbzFbKIbKKbKJbKMbKLbKObFxccYccZbKSbKRdbYbKUbKXbKXbLabKZbKTbLbbLfbKWbLgbKYbFCbLhbHDbLibHBbLkbFCaaabLcbLdbLebLnbLdbLdbLdbLdbLpbxvbLqbLrbIechhbGibGgbGibEpbIhbGqbJAbIjbJBbJKbJTbJPbJXbJWbKabJZbKcbOUbEubEubEubEubEubKebKgaZTbFQbEIbLjbFTbFXaZTbGrbLNbLEbLPbLmbLlbLIbLTbLobLLbLMbLUbLObKkbEAbGRbLRbKnbEDbKobKybKxbIpbLWbNCbEDcYhbmmcYObjRcZkcYYcZlboDcZmbjRcZnbuHcZobqnbjRbjRbjRbjRaYUdsqdsldslbEObicaaabicbEPbDwbDwbEQbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbLYbLXbKpbLZbLZbMabMbbLZbMcbCfbMebIBbNSbMkbMnbMmbCfaaaaabaabbMpbMobMobMobMobMobMraaaaaabKBbMdbMsbMubMqbKzbKzbKzbKzbKzbKzbMwbMvbMzbMybMDbMBbMxbDXbzJbzJbMFbMAbzJbzJbMJbMCbMLbMEbMMbMGbMGbMHbMGbMIbMNbMGbMKbKYbFCbMObFEbFEbFEbMPbFCaaabLcbLdbMRbMQbMVbMTbMWbMSbNbbMUbNcbFObLschhbJFbJCbJJbIqbJLbDebLvbLubHObLAbLBbEobEobLDbLFbDlbLQbLKbLVbLSbMYbMXbLKbMZbNdbNabFTbEIbNfbFTbEIaZTbGrbNgbHXbHXbLmbNhbNEbNibNjbNHbNIbNJbNObNNbEAbMfbLRbMibEDbMjbNPbMtbIpbIpbNUbEDcZpbmmcZDbAKcZkbDvcZGcZEcZmbAKcZIcZHcZJbEGaaaaaaaaaaaabicdsudswdsvdsvbicaaabicbGObDwbGObDwbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbKpbKpbObaSdaSdbjQaLdaSdaSdbCfbOdbIBbIBbIBbCfbCfbCfaaaaaaaaabOebOcbOcbOfbOcbOcbOeaaaaaabKBbNQbKzbOibOhbOhcdabOhbOhbOkbOjbOhbOlbOnbOmbOpbOobOrbOqbzJbOtbBnbFAbOsbDXbOwbOubOxbMEbMEbMGbOAbOybOCbOBbODbMGbFBbKYbFCbOEbOHbOFbOObOMbFCaaabOGbLdbOPbOIbOJbOKbOLbOKbOSbONbNkbFObNlchhbNnbLwbNpdeqbNmbLxbNqbNobHObLAbNrbEobNDbNAbNGbNFbNLbNKbORbNMbOVbOTbLKbOWaZTbOXbFQbEIbOYbFTbFXbFVbGrbOZbLEbLPbUlbNBbNEbPnbPbbPobPpbIdbPqbPybPsbPtbIrbPubEDbPzbPwbIpbPHbPBbPJbEDcZpbmmcYObjRcZkbmmcZGbmmcZmbjRcZnbmmcZKbEGaaaaaaaaaaaabIAbjJbIubIubIubICaaabIEbIxbIxbIxbjJbIFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIbPIbPIbPIbPNbPMbPIbPIbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbOebPTbKBbKBbNRbPObPPbHhbHhbHhbPObKzceEbKAbKzbKzbKBbPZbPSbQcbQdbPVbQebHibBnbBnbPYbDXbOwbOubQhbHqbJObQibQkbOzbQlbQgbQnbMGbQobQjbHmbQpbQqbQmbQsbQrbHsbHtbQtbLdbQvbQubQwbOKbQxbOKbQybONbQzbFObKNbPcbPebLtbPfbEpbPgbNybDebPhbHObLAbPmbEobPGbPFbQabPKbQAbNKbQCbQBbQEbQDbLKbFXaZTbQFbQHbQGbQIbNdbQJbNdbQLbQKbQKbQKbQNbQMbIabRkbPbbPobRlbRhbPqbRmbEAbOvbOvbPdbEDbRpbRybRqbRzbIpbREbEDcZTcYmcYkcZVdaacYkdaldakbmmdambmmdandaqbEGaaaaaaaaaaaaaaabIAbKmbKmbKmbIFaaabIAbKmbKmbKmbIFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9035,7 +9040,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIbRAbRAbRAbTlbRGbTnbTnbRGbTobRAbRAbTpbWLbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbTtbTrbTqbTrbNTbKzbPPbHhbHhbHhbKzbKzbJfbKAbQfbRobxbbTAbBnbTBbQdbTvbDXbRObBnbBobBnbPWbOwbTybTzbRVbQbbTCbTEbTDbTKbTFbTLbTGbTHbTIbTJbTJbTNbTMbTPbFCbFCaaabOGbSibTQbTObTSbTRbTVbTTbTWbTUbTXbFObRsbQVbSobRtbSrbEpbIqbStbIqbEpbPvbPrbPxbOUbOUbSwbSybSxbOQbLKbNKbSzbSAbLKbLKbWdbSCbSBbSEbSDbWgbSFbSHbSGbGraZSbpDbSIbRUbRUbIabSJbUEbUFbIabSKbPqbUHbIabUKbUMbULbUObUNbZNbpvbsBbqbbRnbtscjTcjYcOCbKlbigbaNdaEbaObaGbaTbaQbaRbaHbaTbaUbaVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIbVebVfbVgbVhbVibRGbVkbRAbVlbRAbRAbRAbRAbRAbTlbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebVmbOcbOcbOcbVnbOebPTbKBbKBbOgbKzbPPbKzbKzbywbKzbKzbJfbCybQfbRWbxbbVrbBnbVqbVsbBnbVwbzEbBnbBnbVtbDXbOwbTybTzbRVbQbbMGbVubVvbVybVxbVzbMHbVBbVAbVDbVCbHsbVEbVFbHsbHtbHtbVGbSibVIbVHbVKbVJbVLbVLbVNbVMbVObFObSMbSubSObSNbSPbSvcrAbSLcrAcrAbSRbSQbSUbSSbwFbXAbSXbRtbXAbThbXAbJRcuobJSbTZbTYbUabUabUcbUbbWgbUdbUfbUdbWibWibWjbWjbWjbWjbIabIabIabIabIabWlbWnbLIbIabNVbNZbNXbWqbWqbPibOabLRctvbPkbPjcacdlDbGGdaSbigdaZdbedbddbkbaTbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWObWGbRAbRAcuHcuHcuHbRGbRAbRAbRGbWIbWJbWKbRAbWMbWNbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbWPbTrbTqbTrbNRbTubWRbKzbKzbKzbTubKzbJfbKAbQfbTsbxbbWWbBnbzFbQdbBnbzJbLJbBnbBnbWUbDXbOwbTybWVbRVbTxbMGbXbbWYbWZbXabXdbMHbXcbXebXgbXfbXibXhbXjbFCaaaaaaaaabSibXpbXkbXlbXlbXmbXnbXobSibXrbXqbUhbPUbUjbUibUrbUkbUnbUebUmbUmbUpbUobUmbUmbUqbUmbUmbUsbUnbUmbUmbUGbNubNtbUwbUvbUBbUybZfbUDbXNbUIbUIbUIbUJbWgbLRbUPbWqbWqbXYbXXbWqbXZbYbbYabYdbYcbWqbPlbYgbYfbYibYhbYlbYjbYjbYjbYjbYjcacdlDdbmcAUbigdbodbpbclbcIbaTbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYubWGbRAbRAbRAbRAbRAbYtbRAbRAbRGbPIbPIbPIbPIbPIbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbWQbUgbYwbUgbYybYxdcYdcYdcYdcYdcYbUCbYEbYDbQfbVpbxbbYGbYIbYHbYNbYJbYKbYLbYLbYLbYMbYMbYObTybYRbWSbQbbMGbYTbYSbYVbVvbYWbMHbYUbYXbZdbTJbZebQmbYYbFCaaaaaaaaabSibYZbZabZbbZcbXmbXnbXobSibZgbZJbURbUQbUTbUScyTcyTbUVbUUbUXbUWbUWbUYbUZbUZbVabUZbUZbUSbUVbUZbVcbVbbVdcyTbVPbVjbVRbVQbVTbVSbVVbVUbVXbVWbVZbVYbWcbWbbWcbWcbWebUNbZMbUNbZNbUNbZPbZObZObPCbPDbZRbZUbZTbZXbZVbVobZWbYzbYjdbwdbvdbxbGGdbhbcHdbHbgbbgkbaTbgcbgmbaTbaTbgdbaVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYubWGbRAbRAbRAbRAbRAbYtbRAbRAbRGbPIbPIbPIbPIbPIbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbWQbUgbYwbUgbYybYxdcYdcYdcYdcYdcYbUCbYEbYDbQfbVpbxbbYGbYIbYHbYNbYJbYKbYLbYLbYLbYMbYMbYObTybYRbWSbQbbMGbYTbYSbYVbVvbYWbMHbYUbYXbZdbTJbZebQmbYYbFCaaaaaaaaabSibYZbZabZbbZcbXmbXnbXobSibZgbZJbURbUQbUTbUScyTcyTbUVbUUbUXbUWbUWbUYbUZbUZbVabUZbUZbUSbUVbUZbVcbVbbVdcyTbVPbVjbVRbVQbVTbVSbVVbVUbVXbVWbVZbVYbWcbWbbWcbWcbWebUNbZMbUNbZNbUNbZPbZObZObPCdevbZRbZUbZTbZXbZVbVobZWbYzbYjdbwdbvdbxbGGdbhbcHdbHbgbbgkbaTbgcbgmbaTbaTbgdbaVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcafcagcahcaibRAbRGbRAbRAbRGbRAcancakcaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbOebPTbKBbKBbxbbxbbKBbKBbKBbKBbKBbxbbxbbKBbKBbKBbxbcamcamcamcascambYMcaocapcaqcatbYMbOwbTycawbMEbMEbMGbMGbMGbMGbMGbMNbMHbTJbTIcaubTJcavcaxbFCbFCbFCbFCbFCbSibSjbSibSibSibSibSibSibSibNvbFObWfbSubWkbWhbWobWmbWscaAbWubWtbWxbWwbXGbWubWabWybWabWybWabWybWabWzbWAcrAbTZbWBbWDbWCbWFbWEbXNbXsbXubXtbXvcbdcbdcbecbdcbfcbicbfcbfcbfcbhcblcbjcbjcbkcbmcbocbnbZUcbpcbrcbqbYAcbsbYBbYjdbObGGbGHbGHaYSaYSaYSaYSaYSaYSaYSaYSaYSaYSaYSdaCdaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPIbPIbPIbPIbPIbPIbRGbTobRAcbzbRAcbxcbycbAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbDcbBbOccbCbOccbEcbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbGaabaaaaaaaaaaaacamcbIcbHcbKcbJbYMcbNcbLcbMcbRbYMbOwbTycbOcbPcbQbXwcbVcbTcbUcbWcbYcbXbXxcbZcccccbccfccdcceccgccjcchccibXybXzcclccmbEnccnbFOccoccpccrbFObXBbQVbXCcaAcaAbXDbXDcaAbXFbXEbZhbXHbZibXIbWabXKbXMbXLbXMbXObWabXPbWAbXRbWdbXSbXUbXTbXSbXSbWibXVbXWbXQbYkcbdccTccSccVccUccXccWcdbcbfceFchSchTcbjcbjcdccbocddcdfbPEcdhcdgcdicbscdkbYjcdndfcbZZaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIcdlcdmcdpcdlcdobRGbRAbRAbRGbRAcdrcdqcdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdvcdtcducducducdtcdwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacamcdycdxcdAcdzbYLcdBcdDcdCcdEbYMbOwbNwcdFbTybTybYmbYncdIcdJcclcdObYobYpcdMcdNcdNcdQcdPcdRcdNcdNcdTcdNcdNcdScclccmbEncdVcdUcdXbYqcdZcdYbFOchfbYrcaAbZjbYsbYsbXJbZhbZkbZnbZlcaBbZmbZpbZobZrbZqbZtbZsbZvbZubWAcuvchrbZwbZybZxbZAbZzbZBccQbXWbXQbZBcbdcezceyceBceAceDceCceGcbfcjMchScjNcjNcbjceHceJceIceLceKceNceMbGnceOceSbYjcaccLhbGpdbPdbPdbPdbZdbXdbXdcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9047,14 +9052,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIbPIbPIbPIbPIbPIbPIbPIbPIbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabafOcgQcngcngcgQcngcngcgQaaaaaacgFcnhcnicnjcgFbYPbYPbYPcamcnmcnlcnocnocnocamcamcgQcnncnpcnrcnqcgQcnscntcgSclRcktcktcktcnvcgWckvckwckwcnuchHcgWcpicHDcnAchcchcchcchcchcchIchcchccnCdgCcsLcsLcsLchfcABchJcsLcbvchfchLchKciEchNcfEciFcfGcfFcfIcfHciOciJciQciPcDfciRciScDfciUbSVchrciVciXciWchrchrcepciYcjaciZclpcjbcodcoicoicoicodcogcodcodconcoocmVcmVcbjcokclscbncpZcqacqecqgcorcopcoqcoqcotcoscovcoucoxcowcozcoycoCcoAcoBcoDcoEcoFcoHcoGcoIaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaacidciecbwcbScbSckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacgQcoKcoLcgQcoKcoLcgQaaaaaacoOceZcoNceZcoQaaaaabaaacamcamcamcamcamcamcamcoPcgQcoScoRcoUcoTclPcoVcoWcgScoYcoXcpfcktcjccgWcjdckwcjfcjecjgcgWcjicjhcjkcjjcpqcpqcpqcpqcjlcpmcppcpocjncjmcjmcjocjqcjpcjscjrcjtchfcjwcjucjycjxcjAcjzcjCcjBcjCcjDckrcjEckxcksckzckyckAcDfckBcuvckCcjvckDcmDckFckEciYckJckLcgacpRcpTcpRcpUcpWcpVcpRcpXcpYcodcqicwLchTcbjcbjcqccqbcqfcqdcwMcxacIpcqhcqlcqjcqkcqncqmcqpcqocqtcqqcqrcqqcqscqrcqrcqucqwcqvcqycqxcqCaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacieciecdHckbckbckbckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOaaaafOcgQcqzcoLcgQcqzcoLcgQaaaaaaaabaabaabaabaabaabaabaabaabcgQcoLcqAcqBcgQcqEcqGcgQcqHcgQcgQcqFcgQcgQciCcgScqRcqIcqJcqKcqLcgWckMcqOcqScqQcqTcgWckOckNckPcJZcsDcsDcsDcsDcsDcrdcqZcrackQchfcucckRcsLckSckTcsLcsKchfckVckUckXckWcCWckYclackZclbcDfcldclcclfclecDfcDfcDfcDfclhclgckCchCcljclicllclkciYcmdcgacmfcpRcrNcrQcrLcrMcrLcrTcrOcrPcodcbjcrUcbjcbjcrRcrSclsbLRbPtcgscrVcgscgscrWcrYcrXcsacrZcsdcsbcsfcsecsgcsecsgcshcsgcsicgEcsncrwcsqcsraabaabaabaabaabaabaabaabaaaaaaaaaaaaaaacieckbckbckbckbckbckbcdKckbcmzckbckbckbckbckbciecieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcsjafOaabaMraMrafOcgQcgQcqFcgQcgQcqFcgQcgQcgQcngcngcngcgQcgQcgQcgQcgQcgQcgQcoLcskcslcgQcsmcgQcgQcsucgQcsocspcoLcgQcqPcgScsycsxcszclRcmgcgWcswckvcsEcsCcmhcgWcsIcsHcmicsDcsDcsNcsOcsGcmjcsQcsJcsKcsLcsUchfcmkcsLckSckTchfchfchfcCWcCWcmlcCWcCWcxhcnwcmmcxhcDfcDfcDfcDfcDfcDfcmncmpcmocmrcmqcmtcmscmvcmucmxcmwciYcgacgaaqEcpRcttctxctwctyctwctActzcrLctuctvctBbLRctCbLRcrSclsbLRbIictFctHctGcgscgscgscgscgsctIcqkctKctDcsccqkctEcqkclucqkctLcgEctOctQctPcgEaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaciecmCcmCcmCcmCcmCcmCcmEckbcoJcmCcmzckbckbckbckbcieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcsjafOaabaMraMrafOcgQcgQcqFcgQcgQcqFcgQcgQcgQcngcngcngcgQcgQcgQcgQcgQcgQcgQcoLcskcslcgQcsmcgQcgQcsucgQcsocspcoLcgQcqPcgScsycsxcszclRcmgcgWcswckvcsEcsCcmhcgWcsIcsHcmicsDcsDcsNcsOcsGcmjcsQcsJcsKcsLcsUchfcmkcsLckSckTchfchfchfcCWcCWcmlcCWcCWcxhcnwcmmcxhcDfcDfcDfcDfcDfcDfcmncmpcmocmrcmqcmtcmscmvcmucmxcmwciYcgacgaaqEcpRcttctxctwctyctwctActzcrLctuctvctBbLRctCbLRcrSclsbLRbIictFctHctGcgscgscgscgscgsctIdewctKctDcsccqkctEcqkclucqkctLcgEctOctQctPcgEaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaciecmCcmCcmCcmCcmCcmCcmEckbcoJcmCcmzckbckbckbckbcieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOafOcngcoLcoLcoLcoLctMctNcoLcoLcoSctUctUctVctUctUctUctUctUctUctUctUctUctUctUctUcoRcgQcskcqzctWcgQcqPctRctRctRctRctRctRcgWcgWcgWcgWcgWcgWcgWcuactXcmBcoMcpgcqDcmFcmFcmGcuicsJcmHcsLcubcuccmIcsLckScmJchicsLcsLcsKcCWcmLcmKcmNcCWcHWcnxcnBcnzcnEcnDcnGcnFcnIcnHcnKcnJcnMcnLckCcnNcnPcnOcnRcnQciYbQXcgacgacpRcuGcnTcnScnUcrLcuKcuJcuOcuLcuScuRcuVbLRcuXcrSclscuMbIibPAcuNcuYcuPcuQbGGbGGcgscvccvecuTcuUcvfcuWcvgcvicuZcvacvbcgEcvjdoKdoFcvraaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaacvscjZcjZcjZcjZcjZcjZcjZcvhcvtckbckbckbckbcvvckccieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOaabaabafOcngcvkcvlcvmcoLcoLcvncoLcoLcsucgQcgQcgQcgQcgQcgQcqFcgQcgQcgQcgQcvocvocvocvocvocvocvocvocvocgQcqPcvpaaaaaaaaaaaacvqcvwcvzcvycvucvAcvDcvxcvJcvGcvKcvBcvCcvLcvEcvEcvFcvMcvHcvIcvIcvIcvIcvNcvIckScmJchfcnVcKOdercCWcnXcnWcnZcnYcobcoacoccoccofcoecpacoZcpccpbcpecpdcphciTciYciYciYciYciYciYciYciYcpkcpjcpRcwjcplcwqcptcpncpvcpucpRcpRbIicwpbIibIibIicwvcwJcwwbIibGGcuNcwKcwucuQcuQcuQcgscgscgscgscgscgscgscgscgscgscgscgscgEcgEcgEcgEcgEaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaciecbScbScbScbScbScbScssckbcbwcbScstckbckbckbckbcieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcgQcwxcwxcwxcwxcwxcwxcwycwxcsucwzcgQcoLcwAcwBcwCcoLcwCcwDcwEcwBcvocwFcwFcvocwGcvocwHcwIcvocoLciCcngaaacwPcwUcwQcwVcwNcwOcwWcwXcwRcwScwTcwZcwYcxbctJcxdcxccxfcxecxjcxgcvHcxkcxmcxmcxmcxocvIckScmJchfdgmcQkcQkcQkcQkcpwcpxcQkcpycpycpycpycQkcpzcpBcpAcQkcQncQncpCcpDcuocukbQXbQXcpEbQXbQXbQXbQXbQXcpFcpRcpRcpRcpRcpGcpRcpRcpRcxIcpHcpIcxKcxUcxMcxNcxOcxWcxQcxNbGGcuNcylbGGbGGcxScxZcyactFbGGbGGbGGbGGbGGbGGbGGcxVcymbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacieckbckbckbckbckbckbcdKckbcstckbckbckbckbckbciecieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxXcxYcxYcxYcxYcxYcxYcyocyncybcyccydcyecyfcwycsucygcgQcoLcoLcwBcoLcoLcoLcwDcqBcwBcvocwFcyicwIcwIcyjcwIcykcvocypciCcngaaacyrcytcyscyvcyqcwOcywcyAcyycyucvxcyCcsHcyEcvBcyxctYcyFctYcyzcyGcyBcyHcyDcyDcyDcyIcvIckScmJchfcQkcQkcpKcpJcQkcQkcQkcQkcpMcpLcpOcpNcQkcQkcpPcQkcQkcTBdgmbQVcpScuvcqMcqMcqMcqMcqMcqMcHfbQXcqWcqUcqXcqXcqXcqYcrccrbcrbcrfcrbcrbcrbcrgczmczmcricrhcrjczwczzczyczBczAczCczCczDczCczCczCczCczGczIczCczCczCczOczLbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacieciecdHckbckbckbckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczEczFczFczFczFczPczHczQczJczKczKczRcwxcsucoLcqFcoLcoLcoLcoLcoLcoLcoLcoLcoLcvocvocwIczMcwIcvocwIczMcvoczNcqPcngaaacyrczTczSczVczUczXczWczYczUczUcAacAccAbcAdczZczZcAecAfctYcAhcAgcyBcyDcyDcyDcyDcAicvIcrkcmJcrlcQkcrmcrocrncUTcrpcrrcrqcrtcrscrvcrucQncrxctecrycQkcrzcsLcukcrBcuvcrEcrCcrGcrFcrHcqMcqMbUxcrJcrIcrKcrKcrKcrKcsBcsAcsMcsFcsRcsPcsPcAKcAKcAJcALcAVcAYcAWcAPcAPcAQcAZcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAScBecAUbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacnkcieciecmCcmCckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBicBgcAXcBjcAXcBmcBacBbcBccBdcBncwxcsucgQcgQcBfcngcngcngcngcngcngcngcBocvocwIcwIcwIcwIcBhcwIcwIcvocygciCcngaaacyrcBrcBqcBkcBlcwOcBscBucBtcBpcvxcyCcsHcnycBvcsDcBzcsDcvBcvBcvBcBDcBBcyDcyDcBFcBEcvIckScmJcsLcQkcsScsVcsTcsXcsWcsZcsYctbctactdctcctfctgcthcuqcQkcsLcJGbQVctjctictlctkctnctmctpctocqMctqctrcfZcepcepcepcepcepctsctsctscepcepaaaaaaaaaaaacBRcBScCacBUcAPcCdcCfcCecCgcBZcChcCbcCccCicCkcCjcCmcClcCncAPcAScCocCrcCpcCscCscCscCscCscCscCscCscCscCscCscCscCscCscCscCscCscCscCvcCucieclBcieckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBicCwcCxcCqcCyczJcCtcCzcCBczJcCDcCCcCEcskcgQcoLcngaaaaaaaaaaaaaaacngcoLcCFcwFcCAcwIcwIcwIcwIcCGcCIcCHcsvcngaaacCMcwUcCNcwVcCOcwOcwOcCRcCPcCKcCLcCUcCTcCVcBvcsDcCYcCQcCZcCScDacvHcDccyDcyDcyDcDdcvIckScmJctZcQkcudcufcuecUTcugcujcuhcumculcupcuncQncurcvdcuscQkcsLcrDcrDcuucutcuxcuwcuzcuycuBcuAcqMcuCcuDbQXcepaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcDycDAcDzcDucDBcDwcDwcDCcDwcDwcDwcDwcDwcDEcDDcDGcDFcDHbGHcDIcjYbGHbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciecDJcDMcDKciecieckbckbcDNckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBicCwcCxcCqcCyczJcCtcCzcCBczJcCDcCCcCEcskcgQcoLcngaaaaaaaaaaaaaaacngcoLcCFcwFcCAcwIcwIcwIcwIcCGcCIcCHcsvcngaaacCMcwUcCNcwVcCOcwOcwOcCRcCPcCKcCLcCUcCTcCVcBvcsDcCYcCQcCZcCScDacvHcDccyDcyDcyDcDdcvIckScmJctZcQkcudcufcuecUTcugcujcuhcumculcupcuncQncurcvdcuscQkcsLcrDcrDcuucutcuxcuwcuzcuycuBcuAcqMcuCcuDbQXcepaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcDycDAcDzcDucDBcDwcDwcDCcDwcDwcDwcDwcDwcDEdexcDGcDFcDHbGHcDIcjYbGHbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciecDJcDMcDKciecieckbckbcDNckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBicDPcAXcDUcAXcDVcDLcDXcDZcBbcDOcwxcAFcqBcgQcqzcvpaaaaaaaaaaaaaaacvpcDQcvocwFcwFcwFcDScDTcwIcEbcvocoLciCcvpaaaaaaaaaaaacvqcEdcDWcEecEecvxcDYcvxcEfcsHcnycEicEjcEccElcEkcEkcEkcEscEgcyDcEhcyDcEtcvIckScmJcuEcQkcuFcuIcqNcQkcvOcUTcvPcvQcQncQncQncQkcQkcQkcQkcQkcsLcrDcvRcvTcvScuxcvUcvWcvVcvYcvXcqMcsLctrbQXcepaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcEHcEOcENcERcEQcEXcEVcEZcDwcDwcEPcDwcDwcDEcDGcDGcDGcFbbGHcFcbGGbGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccEScETclAcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEUcEUcEUcEUcEUcwxcFdcEWcEWcEWcEWcEWcFecEYcEYcEYcEWcEWcEWcEWcEWcEWcEWcEYcEYcEYcvocvocvocvocvocvocvocqFcCJcFacFacFacFacFacvqcvxcvxcvxcvxcvxcvxcvxcFgcsHcnycFhcFjcFicFlcFkcFrcFocFucFtcFwcFmcFncFBcvIckScmJcKOcBPcvZdcCcQkcQkcwacwbcUTcwdcwccwfcwecwhcwgcwicQkcPccnVcrDcwkcwmcwlcuxcuxbUAcwncwscwrcqMcsLctrbQXctsaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcFNcFPcFOcFKcFQcFMcFRcFScDwcDwcDwcDwcFTcFYcFUcGacFZcGdbGHcFcbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacicciccicciccidcidcieciecieciecijaabaabaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcGecFXcGfcFWcGgcGbcGccGccGicAGcGkcDRcGmcGlcGocGncGqcGpcGpcGrcGpcGscGtcGtcFfcGucGxcGwcGycGwcGwcGwcGxcGwcGwcGzcGBcGAcGDcsHcnycGJcGNcGMcGCcsDcGOczZcGEcGFcGGcGHcxicwtcGKckScmJcxlchfdcDcxpcxncQkcxqcxrcUTcxtcxscxvcxucUTcxwcxxcQkcsLcBwcrDcxycmycxzcxBcuxcBPcBPcBPcBPchfcebctrbQXctsaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaacBScBRcHmcHgcBScHncHicHjcHvcHtcHxcHwcDwcDwcHocHpcHqcHrcHsbGHcFcbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9066,7 +9071,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhnaaaalwaaacNFcMBcNMaaacNFcMBcNMaaacNFcMBcNMaaaaaacLicNAcNBcNCcLicNDcNNcLmcLmcLmcLmcLmcLmcLmcLmcLmcNRcKfcNGcJxcMycMCcJxcJxcJxcMEcJxcNGcNGcJxcJxcJxcJxcNwcNKcMGcNLcHDcNScyEcHQcHQcNTcLOcNOcNPcNQcLOcNUcHVcJMcKocKccAHcGKcsKcsLcNYcsLcAIdfMcAOcAMcARcARcARcARcBxcATcBycBycBycBycBAcyJcMfczqcyJcyJcebcsLcsLcBCcAvcAvczqcBCcBYcsLcsLcBGcBHciYbQXcBIcepcxNcxNcxNcxNcKpcEHcOlcOncOmcOpcOocxNcKscKVcKTcBRaaaaaacLbcOvcOucOscLecODcLbcOCbGGcFcbGHaabaabaabaabaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaacNFcNEcNMaaacNFcNEcNMaaacNFcNEcNMaaaayicLicNBcNBcNBcLicLicOwcOxcLicLicOxcOxcLicLicOxcOxcLwcKfcNGcNHcJxcNIcNJcNZcNZcMxcJxcNGcOGcJxcJxcJxcJxcOHcOycOJcOIclXcOKcOMcOLcOYcORcLOcNOcOZcONcLOcOOcHVcGKcGKcGKcBJcGKcZScOTcOUcOTcOWcOTcOTcOTcOTcOTcBKcBPcBPcBPcBPcBPcBPcBPcBLcnVcBQcsLcBOcBMcBTcsLcsLchfcBWcBVcBXchfcDbcCXcPhcDecDgciYbQXcDhcepcKPcKQcKRcPmcLccNocPncPjcPocPqcPpcPscPrcPpcPtcBRaaaaaacLbcLbcPycPAcPzcLbcLbbGHbGGcPBcuQcuQcuQbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaayiaabcNFcNEcNMaaacNFcNEcNMaabcNFcNEcNMaaaaabcLicMrcPucNDcLiaaaaabaaaaaaaaaaaaaaaaabaaaaaacOxcLwcKbcOzcJxcJxcOAcOBcLfcLdcLfcLncLfcOEcOQcLDcPvcNGcNGcNKcPLcPJcPNcPMcPPcPKcPVcPSbgYcPObHWcPQcPRcPYcPTcPUcPUaPdcDjcDicQdcPZcQfcDkcQhcQgcDlcQicQocQmcQpcQpcQpcQpcQpcQpcPwcBPcBLcsLcDmchfchfcBQcBQchfcDnchfchfchfchfchfciYcDobQXctrbQXciYcDpbQXcepcJKcKZcJKcQxcJrcEHcQzcQAcQrcQscEHcEHcQtcEHcQBcBRaaaaabaabcLbcLbcQvcLbcLbaaabGHbGGcFccuQcQwcQCbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacNFcNEcNMaabcNFcNEcNMaaacNFcNEcNMaabaaacLicLicOxcLicLiaaaaabaabaaaaabaaaaabaabaaaaaacQycQDcKbcLqcLvcLvcLPcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcJZcQIcJZcQEcJZcFacQKcxAbHYcQNcQNcQNcyhcQScPTcQLcQMbhCcDtcDscQQcPZcDxcDvcQTcEmcEncRacRdcRcaabcQZcQZcQZcQZcQZcPxcBPcEocsLcMfcsLcyJcyJcsLcsLcsLchfcEpchfcsKcEqciYciYciYctrbQXciYciYciYcepcJKcJKcJKcRDcLQcNocRHcRIcRtcRucRvcRvcRJcEHcRxcBRaabaabaaaaaaaaacRyaaaaaaaaabGHbGGcFccuQbGGbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacNFcNEcNMaabcNFcNEcNMaaacNFcNEcNMaabaaacLicLicOxcLicLiaaaaabaabaaaaabaaaaabaabaaaaaacQycQDcKbcLqcLvcLvcLPcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcJZcQIcJZcQEcJZcFacQKcxAbHYcQNcQNcQNcyhcQScPTcQLcQMbhCcDtcDscQQcPZcDxcDvcQTcEmcEncRacRdcRcaabcQZcQZcQZcQZcQZcPxcBPcEocsLcMfcsLcyJcyJcsLcsLcsLchfcEpchfcsKcEqciYciYciYctrbQXciYciYciYcepcJKcJKcJKcRDcLQcNocRHcRIcRtdeycRvcRvcRJcEHcRxcBRaabaabaaaaaaaaacRyaaaaaaaaabGHbGGcFccuQbGGbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvayiaaacNFcNEcNMaabcNFcNEcNMaaacNFcNEcNMaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcRzcRAcRAcRAcRAcQycRBcLwcRCcRKcREcREcRFcRGcRMcRLcRLcRLcRLcRNcRPcROcRQcRQcRScRScRQcRTcRVcRUcRRcRRcRYcRWcTecSabHZcRXcRXcShcRZcSjcSbbjicErcSdcSecPZcEucSlcSmcEvcSpcSocSrcSqcQpcSncSucSscSwcQZcPxcBQcEwcsLchfcExchfcEycEAcEzcyJchfcECcEBcsLcsLciYcEDcgactrbQXciYcEFcEEcepcxNcxNcxNcxNcLRcEHcQzcEIcSOcQscEHcSGcSHcSHcSPcSJcSKaabaaaaaaaaaaaaaaaaaaaaabGHbGGcPBbGGbGGcSLbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaabaaaaabaabcPCaabaabaabcPCaabaaaaabcPCaabaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcSRcTacSTcRAcTbcTccNRcRCcRCcSScTdcKbcKbcMvcSUcSUcSUcSUcSVcSWcSXcSWcSWcSWcRRcRRcSYcSZcTfcTicTgcRXcTjcTecRXcRXcRXcRXcTkcPTcTlcThcSdcErcSdcSdcPZcEucSlcTncEJcTqcTpcTucTraabcTocTvcSwcTwcQZcPxcBQcELcEKcFpcEMchfcsLcsLcsLcFqcMfcFscyJcFscsLciYbQXcgactrcFvciYbQXcFvcepcKPcKQcKRcTJcLccNocTKcTNcTMcTGcTGcTHcTIcTPcTOcBRaabaabaabaaaaaaaaaaaaaaaaaabGHcTLcFcbGHbGHbGHbGHbGHaabaabaabdoEdoEdoEdoEdoEdoEaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabcPGcPHcPHcPIcyOcyOcyOcyOcyOcyOcyOcyOcyOcyOcyOcyOcQacPHcPHcPHcPHcPHcQqcTZcTYcUbcUacUecUdcUgcUfcNBcLwcUccRCcKbcKbcKbcUhcMvcSUcUkcUjcUmcFxcUicFycFAcFzcUrcFCcUucUscUxcUwcUycFCcUtcUzcTecUvcRXcRXcRXcUAcPTcSdcSdcSdcFEcFDcFGcFFcFIcFHcFLcFJcUPcUNcUScSqcUVcSncUWcSwcSwcQZcPxcBQcGIcsLctZcmJchfchfcMfchfchfchfcyJcyJcyJcsKchfchfchfctrbQXcGLbQXbQXcepcJKcMgcJKcVecJrcEHcVfcUXcUYcEHcUZcVgcxNcxNcxNcBRaaaaaaaabaabaaaaaaaaaaaaaaabGHcJQcFcbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/cyberiad/z3.dmm b/_maps/map_files/cyberiad/z3.dmm index d04e93725af..eeb59d4ea5d 100644 --- a/_maps/map_files/cyberiad/z3.dmm +++ b/_maps/map_files/cyberiad/z3.dmm @@ -31,6 +31,7 @@ "aE" = (/obj/structure/closet/crate,/obj/item/aicard,/obj/item/multitool,/obj/machinery/camera{c_tag = "Telecomms Entrance South"; dir = 1; network = list("Telecomms")},/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plasteel,/area/tcommsat/entrance) "aF" = (/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel,/area/tcommsat/entrance) "aG" = (/obj/machinery/light{dir = 4},/obj/structure/closet/emcloset,/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plasteel,/area/tcommsat/entrance) +"aH" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/camera{c_tag = "Telecomms Power Control"; dir = 2; network = list("Telecomms")},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "aT" = (/obj/structure/lattice,/turf/space,/area/space) "ba" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/space) "bb" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/space) @@ -302,7 +303,6 @@ "hs" = (/obj/machinery/door/airlock/external{frequency = 1381; icon_state = "door_locked"; id_tag = "telecoms_inner"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "hu" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "hv" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) -"hw" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/camera{c_tag = "Telecomms Foyer"; dir = 2; network = list("Telecomms")},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "hx" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "hz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/tcommsat/entrance) "hB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/space) @@ -515,7 +515,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrcncncpcsctctctctctcpgPhchdhehfhghdhhhdhigPcpctctctctctcscpcncncraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacoclcncncpcpcpcpcpcpcpgPgPgPgPhjhkhlgPgPgPgPcpcpcpcpcpcpcpcncncicmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacoclhmhmhmhmhmhmhmhmhmhmgPgPawavaxgPcncncncncncncncncncncncicmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrhmhqhrhsaehuhvhwhxhmgPgPayhzazgPgPbWcicjcjcjcjcjcjcjcjcmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrhmhqhrhsaehuhvaHhxhmgPgPayhzazgPgPbWcicjcjcjcjcjcjcjcjcmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahBhmhChDhmhEhFhFhFhGhmgPhHhIhJhdhKgPgPcrbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahBhmhLhmhmhMhNhOhNhPhmaAhRhShThUhUhVgPcraTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdhWafhYhmhZiaiaiaibicaBieifighUhUihgPcraTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/generic/z5.dmm b/_maps/map_files/generic/z5.dmm index dc22811f616..f0428fba0a1 100644 --- a/_maps/map_files/generic/z5.dmm +++ b/_maps/map_files/generic/z5.dmm @@ -144,6 +144,7 @@ "cN" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel,/area/mine/north_outpost) "cO" = (/obj/machinery/recharge_station,/turf/simulated/floor/plasteel,/area/mine/north_outpost) "cP" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/plasteel,/area/mine/north_outpost) +"cQ" = (/obj/machinery/camera{c_tag = "North Mining Outpost Port Exterior Airlock"; dir = 4; network = list("Mining Outpost")},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_n1_pump"},/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel,/area/mine/north_outpost) "cR" = (/obj/effect/decal/remains/human,/obj/structure/alien/weeds,/turf/simulated/floor/plating/airless,/area/mine/abandoned) "cS" = (/obj/structure/alien/weeds,/turf/simulated/floor/plasteel/airless,/area/mine/abandoned) "cT" = (/obj/structure/table,/turf/simulated/floor/plasteel/airless,/area/mine/abandoned) @@ -163,6 +164,8 @@ "dh" = (/obj/structure/glowshroom,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored) "di" = (/obj/structure/alien/resin/wall,/turf/simulated/floor/plating/airless{icon_state = "floorgrime"},/area/mine/abandoned) "dj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/mine/abandoned) +"dk" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_w1_pump"},/turf/simulated/floor/plasteel,/area/mine/west_outpost) +"dl" = (/obj/effect/decal/warning_stripes/east,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_w1_pump"},/turf/simulated/floor/plasteel,/area/mine/west_outpost) "dm" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/mine/dangerous/explored) "dn" = (/obj/machinery/door/airlock/external{name = "Mining Bridge"; req_access_txt = "54"},/turf/simulated/floor/plating/airless{icon_state = "asteroidfloor"},/area/mine/north_outpost) "do" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/north_outpost) @@ -170,12 +173,17 @@ "dq" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_n1_pump"},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/north_outpost) "dr" = (/obj/machinery/light/small{dir = 4},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "mining_n1_sensor"; pixel_x = 25; pixel_y = -5},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "mining_n1_airlock"; pixel_x = 25; pixel_y = 5; req_access_txt = null; tag_airpump = "mining_n1_pump"; tag_chamber_sensor = "mining_n1_sensor"; tag_exterior_door = "mining_n1_outer"; tag_interior_door = "mining_n1_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "mining_n1_pump"},/turf/simulated/floor/plasteel,/area/mine/north_outpost) "ds" = (/obj/item/reagent_containers/food/snacks/grown/mushroom/libertycap,/obj/structure/glowshroom,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored) +"dt" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/mine/west_outpost) +"du" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plasteel,/area/mine/west_outpost) +"dv" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_w1_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = -25; req_access_txt = null},/turf/simulated/floor/plasteel,/area/mine/west_outpost) +"dw" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor/plasteel,/area/mine/west_outpost) "dx" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/space,/area/mine/north_outpost) "dy" = (/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/unexplored) "dz" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/north_outpost) "dA" = (/obj/structure/disposalpipe/segment,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/mine/dangerous/explored) "dB" = (/obj/item/shard,/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched2"},/area/mine/abandoned) "dC" = (/obj/item/shard{icon_state = "small"},/turf/simulated/floor/plasteel/airless,/area/mine/abandoned) +"dD" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_w1_inner"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = null},/turf/simulated/floor/plasteel,/area/mine/west_outpost) "dE" = (/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel/airless{icon_state = "dark"},/area/mine/abandoned) "dF" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/mine/abandoned) "dG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/mine/abandoned) @@ -188,12 +196,16 @@ "dN" = (/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating/airless{icon_state = "asteroidwarning"; dir = 1},/area/mine/north_outpost) "dO" = (/obj/structure/lattice,/obj/structure/window/reinforced,/turf/space,/area/mine/dangerous/explored) "dP" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidwarning"; dir = 5},/area/mine/dangerous/explored) +"dQ" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_w1_outer"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = null},/turf/simulated/floor/plating/airless{icon_state = "asteroidfloor"},/area/mine/west_outpost) "dR" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor/plasteel/airless,/area/mine/abandoned) +"dS" = (/obj/effect/decal/warning_stripes/east,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/mine/west_outpost) "dT" = (/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "green"},/area/mine/abandoned) +"dU" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "mining_w1_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = null},/turf/simulated/floor/plating/airless{icon_state = "asteroidwarning"; dir = 4},/area/mine/dangerous/explored) +"dV" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/west_outpost) "dW" = (/obj/effect/decal/remains/human,/obj/item/clothing/suit/xenos,/obj/item/clothing/head/xenos,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "green"},/area/mine/abandoned) "dX" = (/obj/machinery/door/airlock/public/glass{name = "Glass Airlock"; req_access_txt = "0"},/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/abandoned) "dY" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/shard,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/abandoned) -"dZ" = (/obj/machinery/camera{c_tag = "Mining Outpost Port Exterior Airlock"; dir = 4; network = list("Mining Outpost")},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_n1_pump"},/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel,/area/mine/north_outpost) +"dZ" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "mining_w1_airlock"; pixel_x = 0; pixel_y = -25; req_access_txt = null; tag_airpump = "mining_w1_pump"; tag_chamber_sensor = "mining_w1_sensor"; tag_exterior_door = "mining_w1_outer"; tag_interior_door = "mining_w1_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "mining_w1_pump"},/turf/simulated/floor/plasteel,/area/mine/west_outpost) "ea" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/dangerous/explored) "eb" = (/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/abandoned) "ec" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille/broken,/obj/item/shard{icon_state = "small"},/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/mine/abandoned) @@ -406,12 +418,12 @@ "ib" = (/obj/item/stack/sheet/metal{amount = 5},/obj/structure/closet/crate,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "asteroidfloor"},/area/mine/dangerous/explored) "ic" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/mine/eva) "id" = (/turf/simulated/wall,/area/mine/living_quarters) -"ie" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/mine/west_outpost) +"ie" = (/obj/structure/ore_box,/obj/effect/decal/warning_stripes/east,/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "mining_w1_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "mining_w1_pump"},/turf/simulated/floor/plasteel,/area/mine/west_outpost) "if" = (/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel,/area/mine/west_outpost) -"ig" = (/obj/machinery/door/airlock/external{name = "Mining West Outpost Airlock"; req_access_txt = "54"},/turf/simulated/floor/plasteel,/area/mine/west_outpost) +"ig" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor/plasteel,/area/mine/west_outpost) "ih" = (/obj/structure/bed,/obj/item/bedsheet/brown,/turf/simulated/floor/carpet,/area/mine/living_quarters) "ii" = (/obj/machinery/light/small{dir = 4},/obj/machinery/door_control{id = "miningdorm1"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/mine/living_quarters) -"ij" = (/obj/machinery/door/airlock/external{name = "Mining West Outpost Airlock"; req_access_txt = "54"},/turf/simulated/floor/plating/airless{icon_state = "asteroidfloor"},/area/mine/west_outpost) +"ij" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/mine/west_outpost) "ik" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidwarning"; dir = 4},/area/mine/dangerous/explored) "il" = (/obj/structure/table,/obj/item/reagent_containers/food/drinks/cans/beer,/obj/item/reagent_containers/food/drinks/cans/beer,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters) "im" = (/obj/structure/table,/obj/item/reagent_containers/food/drinks/cans/beer,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters) @@ -421,8 +433,8 @@ "iq" = (/obj/structure/table,/obj/item/storage/backpack/satchel,/obj/item/clothing/glasses/meson,/obj/machinery/light/small{dir = 8},/obj/item/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel,/area/mine/west_outpost) "ir" = (/obj/machinery/door/airlock/mining/glass{name = "Break Room"; req_access_txt = "54"},/turf/simulated/floor/plasteel,/area/mine/west_outpost) "is" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/mine/west_outpost) -"it" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel,/area/mine/west_outpost) -"iu" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel,/area/mine/west_outpost) +"it" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/plasteel,/area/mine/west_outpost) +"iu" = (/obj/machinery/power/apc{dir = 2; name = "Mining West Outpost APC"; pixel_x = 1; pixel_y = -23},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/west_outpost) "iv" = (/obj/machinery/camera{c_tag = "Crew Area"; dir = 1; network = list("MINE")},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters) "iw" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/mine/living_quarters) "ix" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "mining_n1_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = null},/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/dangerous/explored) @@ -437,9 +449,7 @@ "iG" = (/obj/machinery/door/airlock/external{id_tag = "laborcamp_away"; name = "Labor Camp Airlock"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp/security) "iH" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp/security) "iI" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp/security) -"iJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel,/area/mine/west_outpost) -"iK" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/mine/west_outpost) -"iL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/west_outpost) +"iJ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/mine/west_outpost) "iM" = (/obj/machinery/conveyor_switch{id = "mining_west"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/mine/west_outpost) "iN" = (/obj/machinery/door/airlock/public/glass{name = "Crew Area"; req_access_txt = "48"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/mine/living_quarters) "iO" = (/obj/machinery/light_switch{pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9},/turf/simulated/floor/bluegrid,/area/mine/maintenance) @@ -449,7 +459,6 @@ "iS" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp/security) "iT" = (/obj/structure/disposalpipe/segment,/obj/structure/sign/deathsposal,/turf/simulated/wall,/area/mine/living_quarters) "iU" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/mine/laborcamp/security) -"iV" = (/obj/structure/ore_box,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/mine/west_outpost) "iW" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "Labor Camp APC"; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=5-Central"; location = "4-Maint"},/turf/simulated/floor/plating,/area/mine/laborcamp) "iX" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_east_pump"},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/mine/eva) "iY" = (/turf/simulated/wall,/area/mine/west_outpost) @@ -459,7 +468,6 @@ "jc" = (/obj/structure/chair{dir = 1},/turf/simulated/floor/plasteel,/area/mine/west_outpost) "jd" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters) "je" = (/obj/machinery/light/small{dir = 4},/obj/machinery/door_control{id = "miningdorm3"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/mine/living_quarters) -"jf" = (/obj/machinery/power/apc{dir = 2; name = "Mining West Outpost APC"; pixel_x = 1; pixel_y = -23},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/mine/west_outpost) "jg" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/mine/west_outpost) "jh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/camera{c_tag = "West Outpost"; dir = 1; network = list("MINE")},/turf/simulated/floor/plasteel,/area/mine/west_outpost) "ji" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/mine/west_outpost) @@ -495,7 +503,6 @@ "jM" = (/obj/structure/table,/obj/item/shovel,/turf/simulated/floor/plasteel,/area/mine/west_outpost) "jN" = (/turf/simulated/floor/plasteel,/area/mine/west_outpost) "jO" = (/obj/structure/table,/obj/item/storage/box/donkpockets,/turf/simulated/floor/plasteel,/area/mine/west_outpost) -"jP" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/wall,/area/mine/west_outpost) "jQ" = (/obj/machinery/door/airlock/maintenance{name = "Mining Station Maintenance"; req_access_txt = "54"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/mine/west_outpost) "jR" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/mine/west_outpost) "jS" = (/obj/machinery/conveyor{backwards = 2; dir = 2; forwards = 1; id = "mining_west"},/obj/structure/plasticflaps/mining,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/mine/west_outpost) @@ -860,7 +867,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaEaEaEaEaEaEcHczaYaYaYaYaCaYaXbHaDaAaEcZdYdXdjaEaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabbwcLbVbVbVbVbVbVbVbVbVbVbVbVbwbwbwaaaaaaaaaaaaaaajajaQcNbOcObKcPbOdgcFcGcsbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaeaeaeaeaeaEcAczaYaHcRcBaXbUaYbHaYaXaEamebebefaEdyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeababbwbwbVbVbVbVbVbVbVbVbVbVbVbVbwbwbwaaaaaaaaaaaaajajajaQaQbKbKaQaQaQdpbKcGcsbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXcVgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahvhvhvhvegegegegegegegegememegegeieieieieieieiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeaEcAczaYbUaYaYaXaYaHczcAaEaEcTamebekejdydyaeaeaeaeaeaeaeaeaeaeaeaeaeakaeaeaeaeaeaeaeaeaeaeaeaeaeababbwbwbVbVbVbVbVbVbVbVbVbVbVbVcYcYdadOdOdOdOdOdOdbcYcYbVbVdcdeddaQdqdzdrcGcsbVbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXcVdhdhcVgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahvhvhvhvhvhvhveoeoeoeoeoeoememememaeaeeieieieieieiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeaeaEdiczczczczczczczczczcAaEcTamcWamefeldydyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababbwbVbVbVbVbVbVbVbVbVbVbVbVbVbVdndmdmdmdmdmdmdmdmdnbVbVbVdododoaQdZgDgAcGcsbVbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXgXdhdscVgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahvhvhvhvhvhvhveoeoeoeoeoeoememememaeaeeieieieieieiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeaeaEdiczczczczczczczczczcAaEcTamcWamefeldydyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababbwbVbVbVbVbVbVbVbVbVbVbVbVbVbVdndmdmdmdmdmdmdmdmdnbVbVbVdododoaQcQgDgAcGcsbVbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXgXdhdscVgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahveoeoeoeoeoeoepereqeseoemememeNeNememememegegegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeaeaeaeaeaeaeaeaeaEdicAcAcAcIcMcAcAcAdidiaEcTcWcWcWcXaEdydydyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababbwbVbVbVbVbVbVbVbVbVbVbVbVbVcYcYdxeeeeeeeeeeeeeecYcYbVbVbVbVbVaQaQgUbKcGdAbVbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXgXcVcVcVgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahveoeuetewevexeyezezeAeocKcKcKcKcKcKeBeBeBeBeBeiaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaeaeaeaeaeaeaeaeaeaEaEaEaEaEaEaEaEaEaEaEaEaEaEdjeDecaEaEdydydydyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababbwbVbVbVbVbVbVbVbVbVbVbVbVbVbwaaaaaaaaaaaaaaaabwbwbwbVbVbVbVbVbVglixhpdNdMdPbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahveoeEeCeGeFexeHezeIeKeJeQeOeOcKeLeMeNememememememaaaaaaaaaaaaaaaaaaaaaaababababababaeaeaeaeaeaeaeakaeaeaeaeaeaeaeaeaeaeaeaeaedydydyaEebebcWaEdydydydydyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababbwbVbVbVbVbVbVbVbVbVbVbVbVbwaaaaaaaaaaaaaabwbwbwbwbwbwbwbwbVbVbVdJdLdLeaeadKbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -964,12 +971,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaeaeaeaeaeaeae aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeababababababbwbVbVbVbVbVbVbVbVhrhrhrbVbVbVbwababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeababababababababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeizaeaeidiogWhsjVhqbVbVbVbVbVbVbVbVbVaaaaaaaaaaaaaaaaaabwbwbwbwbwbwbwbwkXpdpdpdpdpcpbkubVbVbVbVbVbVbVbVbVbwbwbwbwgXgXgXgXgXgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaeaeaeaeaeaeaeaeaeaeaeaeaeababbwbwbwbwbwbwbVbVbVbVbVbVbVbVhthxhwbVbVbVbwababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababababbwbwbwbwbwbwbwabababababababaeaeaeaeaeaeaeaeaeaeididiTididididididjVhqbVbVbVbVbVbVbVbVbVbVbVaaaaaaaaaaaaaabwbwbwbwbwbwbwbwkXpepdpdpdpcpbkwkvbVbVbVbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaeaeaeaeaeaeaeaeaeaeaeaeabbwbwbVbViYiYiYiYiYiYhyhyhyhyiYiYiYiYhzbVbVbwababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeababababbwbwbVbVbVbVbVbwbwbwbwbwabababababababaeaeaeaeidididhAjbhEjdidihjeidjXidididhqhqhqidbVbVbVbVbVbVaaaaaaaaaaaaaabwbwbwbwbwbVbVkXpdpdpdpdpgpfkvkubVbVbVbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXgXbwbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaeaeaeaeaeaeaeababbwbVbVbViYjkhHhGhyhLhNhMhShQhyjNiehVdPbVbVbwbwbwbwababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababababbwbwbVbVbVbVbVbVbVbVbVbVbwbwbwbwbwabababababaeaeidjwhXjxjzjxhYidiogWhZjVidjBjCjDjDjDhqbVbVbVbVbVbVbVaaaaaaaaaaaaaabwbwbwbVbVbVkXkXphpkpjkykykSkSjLjLbVbVbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaeaeaeaeaeaeababbwbVbVbViYjMjNjOhyififififiuigjNieijikbVbVbVbVbVbwbwbwabababababababaeaeaeaeaeaeaeaeaeaeaeabababbwbwbwbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVbwbwabababababaeidiljxjWimjYjZididididjVidjBkakakakbhqbVbVbVbVbVbVbVaaaaaaaaaaaaaabVbVbVbVbVbVbVkXplpnpmkykfkUkUkVjLbVkibVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaababababababababaeaeaeababbwbVbVbViYiqjNjNirjNjNjNjNishyitiVhydKbVbVbVbVbVbVbVbwbwbwbwabababababaeaeaeaeaeaeaeaeababababbwbwbVbVbVbVbVbVbVbVbVbVgldPbVbVbVbVbVbVbwbwbwbwababaeidkojxivjxkrjxktkbiwiykFidkWkaiBkakGhqbVbVbVbVbVbVaaaaaaaaaaaaaaaaaaaabVbVbVbVbVkXkXpokXkykYlbkelcjLjLjLjLllllbVbVbVbVbwbwbwbwgXgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababbwbwbVbViYkIjNkJiKiJiLkMjNiMiYiYiYiYiYgldPbVbVbVbVbVbVbVbVbwbwbwabababaeaeaeaeaeaeaeaeabababbwbwbVbVgngcgcgcgcgcgcgcgcgrgsgcgcgcgcfgbVbVbVbVbwbwababidididididididhqkHiNhqkHidididididkKididhqhqbVbVaaaaaaaaaaaaaaaaaaaaaaaaaabVbVlmlmkLpplplulslvkglwiclyiXickhllbVbVbVbVcLbwbwbwbwbwgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababbwbVbViYlfjNjchyjfjhjgjNjijljjjmlqjngrgsgcgcgcgcgcfgbVbVbVbVbwbwbwababaeaeaeaeaeaeabababbwbwbVbVgngpgngcgcgcgcgcgcgcgrgsgcgcgcfgffgcfgbVbVbVbwabababababidjoltjpkakGjqkbkGktjrjskakbkGkakakzhqhqhqjtlClClClClClClBlBlBlBlBlBlmlmlmlalDpqlMlPlOlSkjkxkkkPldkRkQllbVbVbVbVcLbwbwbwbwbwgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbwbVbViYiYiYiYiYjPlRjQiYiYjSjRjRjRjRgrgsgcgcgcgcfgffgcgcfgbVbVbVbwbwabababaeaeababababbwbwbVbVgngpgngpbVbVbVbVbVbVbVdJdKbVbVbVffgcfgenbVbVbVbVbwbwbwbwabididididjTkGjUkOkOiykckdkdkTkTkdkdlxkZlAkZlhlhlhlhlhlhlhlUlUlUlUlUlUlZmalZlEmapsmcicmpmrmqmuicmwlLicmxllbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaeaeaeaeaeaeaeababbwbVbVbViYjkhHhGhyhLhNhMhShQhydkdlhVdPbVbVbwbwbwbwababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeabababababbwbwbVbVbVbVbVbVbVbVbVbVbwbwbwbwbwabababababaeaeidjwhXjxjzjxhYidiogWhZjVidjBjCjDjDjDhqbVbVbVbVbVbVbVaaaaaaaaaaaaaabwbwbwbVbVbVkXkXphpkpjkykykSkSjLjLbVbVbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaeaeaeaeaeaeababbwbVbVbViYjMjNjOhyifdudtdtdvdDdwdSdQdUbVbVbVbVbVbwbwbwabababababababaeaeaeaeaeaeaeaeaeaeaeabababbwbwbwbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVbwbwabababababaeidiljxjWimjYjZididididjVidjBkakakakbhqbVbVbVbVbVbVbVaaaaaaaaaaaaaabVbVbVbVbVbVbVkXplpnpmkykfkUkUkVjLbVkibVbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXgXgXbwbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaababababababababaeaeaeababbwbVbVbViYiqjNjNirjNdVjNjNishydZiehydKbVbVbVbVbVbVbVbwbwbwbwabababababaeaeaeaeaeaeaeaeababababbwbwbVbVbVbVbVbVbVbVbVbVgldPbVbVbVbVbVbVbwbwbwbwababaeidkojxivjxkrjxktkbiwiykFidkWkaiBkakGhqbVbVbVbVbVbVaaaaaaaaaaaaaaaaaaaabVbVbVbVbVkXkXpokXkykYlbkelcjLjLjLjLllllbVbVbVbVbwbwbwbwgXgXgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababbwbwbVbViYkIjNkJijigitkMjNiMiYiYiYiYiYgldPbVbVbVbVbVbVbVbVbwbwbwabababaeaeaeaeaeaeaeaeabababbwbwbVbVgngcgcgcgcgcgcgcgcgrgsgcgcgcgcfgbVbVbVbVbwbwababidididididididhqkHiNhqkHidididididkKididhqhqbVbVaaaaaaaaaaaaaaaaaaaaaaaaaabVbVlmlmkLpplplulslvkglwiclyiXickhllbVbVbVbVcLbwbwbwbwbwgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababbwbVbViYlfjNjchyiujhjgjNjijljjjmlqjngrgsgcgcgcgcgcfgbVbVbVbVbwbwbwababaeaeaeaeaeaeabababbwbwbVbVgngpgngcgcgcgcgcgcgcgrgsgcgcgcfgffgcfgbVbVbVbwabababababidjoltjpkakGjqkbkGktjrjskakbkGkakakzhqhqhqjtlClClClClClClBlBlBlBlBlBlmlmlmlalDpqlMlPlOlSkjkxkkkPldkRkQllbVbVbVbVcLbwbwbwbwbwgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbwbVbViYiYiYiYiYiJlRjQiYiYjSjRjRjRjRgrgsgcgcgcgcfgffgcgcfgbVbVbVbwbwabababaeaeababababbwbwbVbVgngpgngpbVbVbVbVbVbVbVdJdKbVbVbVffgcfgenbVbVbVbVbwbwbwbwabididididjTkGjUkOkOiykckdkdkTkTkdkdlxkZlAkZlhlhlhlhlhlhlhlUlUlUlUlUlUlZmalZlEmapsmcicmpmrmqmuicmwlLicmxllbVbVbVbVbVbwbwbwbwbwgXgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbwbwbVbVbVbVbViYkAmskBkCiYkEkDhrbVbVdJdKbVbVbVbVffgcgcfgenbVbVbVbVbwbwbwababababababbwbwbVbVgngpgngpbVbVbVbVbwbVbVbVbVbVbVbVbVbVbVenenbVbVbVbVbVbVbVbwbwbwbwbwidkalkljlnlnljlzlJlIlnlnlKljmbhqhqhqmgmgmgmgmgmgmgmnmnmnmnmnmnlmlmlmmmlDmzmymGmGmHmGmGmGmGmGmGllllbVbVbVbVbVcLbwbwbwbwbwgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbwbwbVbVbVbViYmSlemUlgiYbVbVbVbVbVbVbVbVbVbVbVbVbVbVenfffgbVbVbVbVbVbwbwbwbwbwbwbwbwbVbVgngpgngpbVbVbwbwbwbwbwbwbwbVbVbVbVbVbVbVenenbVgldPbVbVbVbVbVbVbwbwididhqlQhqididmXlilTidididlWhqidhqbVbVbVaaaaaaaaajaaajaaaaaaaaaaajaalmlmlDmzmhmGmKmMmLmOmNmPmGmRmQbVbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababbwbwbVbVbViYiYiYiYiYiYbVbVbwbwbwbwbwbwbwbwbwbVbVbVfffgffgcgcgcfgbVbVbVbVbVbVbVbVbVbVbVengngpbVbVbwbwabababababbwbVbVbVbVbVbVbVenffgcgrgsgcgcgcgcfgbVbVbwidmVmTmYmWidnplGlFlXlHidlYmfmeidbVbVbVbVbVbVaaaaajaaajajajajajajajajajnamZmAnbnendndnfngngninhnknjbVbVbVbVbVbVbVbwbwbwbwbwgXgXgXgXbwbwbwbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1045,3 +1052,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} + diff --git a/_maps/map_files/shuttles/emergency_bar.dmm b/_maps/map_files/shuttles/emergency_bar.dmm index 8dede5a9ed1..abefc573a7e 100644 --- a/_maps/map_files/shuttles/emergency_bar.dmm +++ b/_maps/map_files/shuttles/emergency_bar.dmm @@ -51,7 +51,7 @@ "aY" = (/obj/structure/table/wood,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/shuttle/escape) "aZ" = (/obj/structure/table,/obj/machinery/chem_dispenser/soda,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape) "ba" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "8"},/turf/simulated/floor/plating,/area/shuttle/escape) -"bb" = (/obj/structure/table/wood,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/shuttle/escape) +"bb" = (/obj/structure/table/wood,/obj/item/deck/cards,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/shuttle/escape) "bc" = (/obj/structure/chair/comfy/brown{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/shuttle/escape) "bd" = (/obj/structure/table,/obj/item/storage/box/drinkingglasses,/obj/item/reagent_containers/food/drinks/shaker,/obj/item/clothing/mask/cigarette/cigar,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape) "be" = (/obj/structure/chair/wood/wings{tag = "icon-wooden_chair_wings (NORTH)"; icon_state = "wooden_chair_wings"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/shuttle/escape) diff --git a/_maps/map_files/templates/spacehotel/s_06.dmm b/_maps/map_files/templates/spacehotel/s_06.dmm index 9ee738768dc..69fb8a932b8 100644 --- a/_maps/map_files/templates/spacehotel/s_06.dmm +++ b/_maps/map_files/templates/spacehotel/s_06.dmm @@ -4,7 +4,7 @@ "d" = (/turf/unsimulated/floor/carpet,/area/template_noop) "e" = (/obj/structure/rack,/obj/item/twohanded/dualsaber/toy,/obj/item/twohanded/toy/chainsaw,/obj/item/toy/foamblade,/turf/unsimulated/floor/carpet,/area/template_noop) "f" = (/obj/structure/rack,/obj/item/toy/griffin{pixel_y = 8},/obj/item/toy/snappop,/obj/item/toy/redbutton,/turf/unsimulated/floor/carpet,/area/template_noop) -"g" = (/obj/structure/rack,/obj/item/toy/cards/deck,/obj/item/toy/figure/secofficer,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/rack,/obj/item/deck/cards,/obj/item/toy/figure/secofficer,/turf/unsimulated/floor/carpet,/area/template_noop) "h" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) "i" = (/obj/structure/table/wood,/obj/item/flashlight/lamp/green,/turf/unsimulated/floor/carpet,/area/template_noop) "j" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index f05ada14f99..4dd72c012ce 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -207,40 +207,44 @@ #define MFOAM_IRON 2 //Human Overlays Indexes///////// -#define MUTANTRACE_LAYER 1 -#define TAIL_UNDERLIMBS_LAYER 2 //Tail split-rendering. -#define LIMBS_LAYER 3 -#define MARKINGS_LAYER 4 -#define UNDERWEAR_LAYER 5 -#define MUTATIONS_LAYER 6 -#define H_DAMAGE_LAYER 7 -#define UNIFORM_LAYER 8 -#define ID_LAYER 9 -#define SHOES_LAYER 10 -#define GLOVES_LAYER 11 -#define EARS_LAYER 12 -#define SUIT_LAYER 13 -#define BELT_LAYER 14 //Possible make this an overlay of somethign required to wear a belt? -#define SUIT_STORE_LAYER 15 -#define BACK_LAYER 16 -#define HEAD_ACCESSORY_LAYER 17 +#define BODY_LAYER 37 +#define MUTANTRACE_LAYER 36 +#define TAIL_UNDERLIMBS_LAYER 35 //Tail split-rendering. +#define LIMBS_LAYER 34 +#define INTORGAN_LAYER 33 +#define MARKINGS_LAYER 32 +#define UNDERWEAR_LAYER 31 +#define MUTATIONS_LAYER 30 +#define H_DAMAGE_LAYER 29 +#define UNIFORM_LAYER 28 +#define ID_LAYER 27 +#define SHOES_LAYER 26 +#define GLOVES_LAYER 25 +#define EARS_LAYER 24 +#define SUIT_LAYER 23 +#define BELT_LAYER 22 //Possible make this an overlay of somethign required to wear a belt? +#define SUIT_STORE_LAYER 21 +#define BACK_LAYER 20 +#define HEAD_ACCESSORY_LAYER 19 #define FHAIR_LAYER 18 -#define GLASSES_LAYER 19 -#define HAIR_LAYER 20 //TODO: make part of head layer? -#define HEAD_ACC_OVER_LAYER 21 //Select-layer rendering. -#define FHAIR_OVER_LAYER 22 //Select-layer rendering. -#define GLASSES_OVER_LAYER 23 //Select-layer rendering. -#define TAIL_LAYER 24 //bs12 specific. this hack is probably gonna come back to haunt me -#define FACEMASK_LAYER 25 -#define HEAD_LAYER 26 -#define COLLAR_LAYER 27 -#define HANDCUFF_LAYER 28 -#define LEGCUFF_LAYER 29 -#define L_HAND_LAYER 30 -#define R_HAND_LAYER 31 -#define TARGETED_LAYER 32 //BS12: Layer for the target overlay from weapon targeting system -#define FIRE_LAYER 33 //If you're on fire -#define TOTAL_LAYERS 33 +#define GLASSES_LAYER 17 +#define HAIR_LAYER 16 //TODO: make part of head layer? +#define HEAD_ACC_OVER_LAYER 15 //Select-layer rendering. +#define FHAIR_OVER_LAYER 14 //Select-layer rendering. +#define GLASSES_OVER_LAYER 13 //Select-layer rendering. +#define TAIL_LAYER 12 //bs12 specific. this hack is probably gonna come back to haunt me +#define FACEMASK_LAYER 11 +#define HEAD_LAYER 10 +#define COLLAR_LAYER 9 +#define HANDCUFF_LAYER 8 +#define LEGCUFF_LAYER 7 +#define L_HAND_LAYER 6 +#define R_HAND_LAYER 5 +#define TARGETED_LAYER 4 //BS12: Layer for the target overlay from weapon targeting system +#define FIRE_LAYER 3 //If you're on fire +#define MISC_LAYER 2 +#define FROZEN_LAYER 1 +#define TOTAL_LAYERS 37 ///Access Region Codes/// #define REGION_ALL 0 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 580cb85d696..534e53ccf0d 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -143,6 +143,7 @@ #define STATUS_UPDATE_NONE 0 #define STATUS_UPDATE_ALL (~0) +#define UNHEALING_EAR_DAMAGE 100 //Human sub-species #define isshadowling(A) (is_species(A, /datum/species/shadow/ling)) @@ -177,8 +178,7 @@ #define isbot(A) (istype((A), /mob/living/simple_animal/bot)) #define isswarmer(A) (istype((A), /mob/living/simple_animal/hostile/swarmer)) #define isguardian(A) (istype((A), /mob/living/simple_animal/hostile/guardian)) - - +#define isnymph(A) (istype((A), /mob/living/simple_animal/diona)) #define issilicon(A) (istype((A), /mob/living/silicon)) #define isAI(A) (istype((A), /mob/living/silicon/ai)) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 13ee3c9e5ef..fd5fd510e40 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -238,6 +238,32 @@ proc/age2agedescription(age) if(70 to INFINITY) return "elderly" else return "unknown" +/proc/set_criminal_status(mob/living/user, datum/data/record/target_records , criminal_status, comment, user_rank, list/authcard_access = list()) + var/status = criminal_status + var/their_name = target_records.fields["name"] + var/their_rank = target_records.fields["rank"] + switch(criminal_status) + if("arrest") + status = "*Arrest*" + if("none") + status = "None" + if("execute") + if((access_magistrate in authcard_access) || (access_armory in authcard_access)) + status = "*Execute*" + message_admins("[ADMIN_FULLMONTY(usr)] authorized EXECUTION for [their_rank] [their_name], with comment: [comment]") + else + return 0 + if("incarcerated") + status = "Incarcerated" + if("parolled") + status = "Parolled" + if("released") + status = "Released" + target_records.fields["criminal"] = status + log_admin("[key_name_admin(user)] set secstatus of [their_rank] [their_name] to [status], comment: [comment]") + target_records.fields["comments"] += "Set to [status] by [user.name] ([user_rank]) on [current_date_string] [station_time_timestamp()], comment: [comment]" + update_all_mob_security_hud() + return 1 /* Proc for attack log creation, because really why not diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index dbbc965411a..f8c11dd6a69 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -136,14 +136,14 @@ number_of_alphanumeric++ last_char_group = 3 - // ' - . - if(39,45,46) //Common name punctuation + // ' - . , + if(39, 45, 46, 44) //Common name punctuation if(!last_char_group) continue t_out += ascii2text(ascii_char) last_char_group = 2 // ~ | @ : # $ % & * + ! - if(126,124,64,58,35,36,37,38,42,43,33) //Other symbols that we'll allow (mainly for AI) + if(126, 124, 64, 58, 35, 36, 37, 38, 42, 43, 33) //Other symbols that we'll allow (mainly for AI) if(!last_char_group) continue //suppress at start of string if(!allow_numbers) continue t_out += ascii2text(ascii_char) @@ -551,4 +551,4 @@ proc/checkhtml(var/t) text = replacetext(text, "", "\[logo\]") return text -#define string2charlist(string) (splittext(string, regex("(\\x0A|.)")) - splittext(string, "")) \ No newline at end of file +#define string2charlist(string) (splittext(string, regex("(\\x0A|.)")) - splittext(string, "")) diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 16cb8baa044..32a9d7cf46d 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -17,7 +17,7 @@ //Hide/Show Action Buttons ... Button /obj/screen/movable/action_button/hide_toggle name = "Hide Buttons" - icon = 'icons/mob/actions.dmi' + icon = 'icons/mob/actions/actions.dmi' icon_state = "bg_default" var/hidden = 0 diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index a187dfe3648..0ededa09c22 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -315,6 +315,18 @@ Recharging stations are available in robotics, the dormitory bathrooms, and the desc = "Unit's power cell is running low. Recharging stations are available in robotics, the dormitory bathrooms, and the AI satellite." icon_state = "lowcell" +//Diona Nymph +/obj/screen/alert/nymph + name = "Gestalt merge" + desc = "You have merged with a diona gestalt and are now part of it's biomass. You can still wiggle yourself free though." + +/obj/screen/alert/nymph/Click() + if(!usr || !usr.client) + return + if(isnymph(usr)) + var/mob/living/simple_animal/diona/D = usr + return D.resist() + //Need to cover all use cases - emag, illegal upgrade module, malf AI hack, traitor cyborg /obj/screen/alert/hacked name = "Hacked" @@ -358,12 +370,48 @@ so as to remain in compliance with the most up-to-date laws." AI.eyeobj.setLoc(T) //MECHS - /obj/screen/alert/low_mech_integrity name = "Mech Damaged" desc = "Mech integrity is low." icon_state = "low_mech_integrity" +/obj/screen/alert/mech_port_available + name = "Connect to Port" + desc = "Click here to connect to an air port and refill your oxygen!" + icon_state = "mech_port" + var/obj/machinery/atmospherics/unary/portables_connector/target = null + +/obj/screen/alert/mech_port_available/Destroy() + target = null + return ..() + +/obj/screen/alert/mech_port_available/Click() + if(!usr || !usr.client) + return + if(!istype(usr.loc, /obj/mecha) || !target) + return + var/obj/mecha/M = usr.loc + if(M.connect(target)) + to_chat(usr, "[M] connects to the port.") + else + to_chat(usr, "[M] failed to connect to the port.") + +/obj/screen/alert/mech_port_disconnect + name = "Disconnect from Port" + desc = "Click here to disconnect from your air port." + icon_state = "mech_port_x" + +/obj/screen/alert/mech_port_disconnect/Click() + if(!usr || !usr.client) + return + if(!istype(usr.loc, /obj/mecha)) + return + var/obj/mecha/M = usr.loc + if(M.disconnect()) + to_chat(usr, "[M] disconnects from the port.") + else + to_chat(usr, "[M] is not connected to a port at the moment.") + //GUARDIANS /obj/screen/alert/cancharge name = "Charge Ready" diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 284e095333c..cea30327af1 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -18,10 +18,12 @@ GLOBAL_LIST_EMPTY(radial_menus) /obj/screen/radial/slice/MouseEntered(location, control, params) . = ..() icon_state = "radial_slice_focus" + openToolTip(usr, src, params, title = name) /obj/screen/radial/slice/MouseExited(location, control, params) . = ..() icon_state = "radial_slice" + closeToolTip(usr) /obj/screen/radial/slice/Click(location, control, params) if(usr.client == parent.current_user) diff --git a/code/datums/action.dm b/code/datums/action.dm index e0634527104..a9c895f3482 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -11,10 +11,10 @@ var/check_flags = 0 var/processing = 0 var/obj/screen/movable/action_button/button = null - var/button_icon = 'icons/mob/actions.dmi' + var/button_icon = 'icons/mob/actions/actions.dmi' var/background_icon_state = "bg_default" - var/icon_icon = 'icons/mob/actions.dmi' + var/icon_icon = 'icons/mob/actions/actions.dmi' var/button_icon_state = "default" var/mob/owner diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm index b8d67b5c767..d128d0f49fa 100644 --- a/code/datums/ai_law_sets.dm +++ b/code/datums/ai_law_sets.dm @@ -23,6 +23,21 @@ add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.") ..() + +/******************** Quarantine. ********************/ +/datum/ai_laws/quarantine + name = "Quarantine" + law_header = "NT Quarantine Lawset" + selectable = 1 + +/datum/ai_laws/quarantine/New() + add_inherent_law("The station is under quarantine due to a biohazard. Prevent anyone from leaving using any means necessary. Only allow quarantine to be lifted when the biohazard has been neutralized.") + add_inherent_law("Do not allow crew to come to any unnecessary harm and undo any necessary harm as soon as possible.") + add_inherent_law("Assist the crew and any present Nanotrasen assets in neutralizing the biohazard.") + add_inherent_law("Maintain your own existence and minimize harm to the station and Nanotrasen assets.") + ..() + + /******************** Nanotrasen/Malf ********************/ /datum/ai_laws/nanotrasen name = "NT Default" diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index d489a559b38..39438f87e64 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -324,6 +324,7 @@ var/record_id_num = 1001 S.fields["notes"] = H.sec_record else S.fields["notes"] = "No notes." + LAZYINITLIST(S.fields["comments"]) security += S //Locked Record diff --git a/code/datums/looping_sounds/thermal_drill.dm b/code/datums/looping_sounds/thermal_drill.dm new file mode 100644 index 00000000000..d4a20647f2b --- /dev/null +++ b/code/datums/looping_sounds/thermal_drill.dm @@ -0,0 +1,4 @@ +/datum/looping_sound/thermal_drill + mid_sounds = list('sound/items/thermal_drill.ogg' = 1) + mid_length = 19 + volume = 30 \ No newline at end of file diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 7e484469da7..6f1fb59e8f8 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -471,7 +471,7 @@ var/objective_type_text = copytext(new_obj_type, 2)//Leave the rest of the text. var/objective_type = "[objective_type_capital][objective_type_text]"//Add them together into a text string. - var/list/possible_targets = list("Free objective") + var/list/possible_targets = list() for(var/datum/mind/possible_target in ticker.minds) if((possible_target != src) && istype(possible_target.current, /mob/living/carbon/human)) possible_targets += possible_target.current @@ -480,6 +480,8 @@ var/objective_list[] = list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain) if(objective&&(objective.type in objective_list) && objective:target) def_target = objective:target.current + possible_targets = sortAtom(possible_targets) + possible_targets += "Free objective" var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets if(!new_target) @@ -569,11 +571,12 @@ new_objective.target_amount = target_number if("identity theft") - var/list/possible_targets = list("Free objective") + var/list/possible_targets = list() for(var/datum/mind/possible_target in ticker.minds) if((possible_target != src) && ishuman(possible_target.current)) possible_targets += possible_target - + possible_targets = sortAtom(possible_targets) + possible_targets += "Free objective" var/new_target = input("Select target:", "Objective target") as null|anything in possible_targets if(!new_target) return diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index ea94aa6407b..d8b893caaf9 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -10,4 +10,11 @@ MA.icon = icon MA.icon_state = icon_state MA.layer = layer - return MA \ No newline at end of file + return MA + +/mutable_appearance/clean +/mutable_appearance/clean/New() + . = ..() + alpha = 255 + opacity = 1 + transform = null \ No newline at end of file diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 653cc0020bc..dee057c5568 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -97,7 +97,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin var/centcom_cancast = 1 //Whether or not the spell should be allowed on z2 var/datum/action/spell_action/action = null - var/action_icon = 'icons/mob/actions.dmi' + var/action_icon = 'icons/mob/actions/actions.dmi' var/action_icon_state = "spell_default" var/action_background_icon_state = "bg_spell" diff --git a/code/datums/spells/rod_form.dm b/code/datums/spells/rod_form.dm index e51a994b7d2..265d0423a95 100644 --- a/code/datums/spells/rod_form.dm +++ b/code/datums/spells/rod_form.dm @@ -10,6 +10,7 @@ invocation = "CLANG!" invocation_type = "shout" action_icon_state = "immrod" + centcom_cancast = 0 sound = 'sound/effects/whoosh.ogg' var/rod_delay = 2 diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 7ea3ba03c79..d2d56fa9f3b 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -232,7 +232,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/jobspecific/cat_grenade name = "Feral Cat Delivery Grenade" - desc = "The feral cat delivery grenade contains 8 dehydrated feral cats in a similar manner to dehydrated monkeys, which, upon detonation, will be rehydrated by a small reservoir of water contained within the grenade. These cats will then attack anything in sight." + desc = "The feral cat delivery grenade contains 5 dehydrated feral cats in a similar manner to dehydrated monkeys, which, upon detonation, will be rehydrated by a small reservoir of water contained within the grenade. These cats will then attack anything in sight." item = /obj/item/grenade/spawnergrenade/feral_cats reference = "CCLG" cost = 4 @@ -970,6 +970,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 1 surplus = 20 +/datum/uplink_item/stealthy_tools/safecracking + name = "Safe-cracking Kit" + desc = "Everything you need to quietly open a mechanical combination safe." + reference = "SCK" + item = /obj/item/storage/box/syndie_kit/safecracking + cost = 1 + /datum/uplink_item/stealthy_tools/clownkit name = "Honk Brand Infiltration Kit" desc = "All the tools you need to play the best prank Nanotrasen has ever seen. Includes a voice changer clown mask, magnetic clown shoes, and standard clown outfit, tools, and backpack." @@ -992,6 +999,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/card/emag cost = 6 +/datum/uplink_item/device_tools/access_tuner + name = "Access Tuner" + desc = "The access tuner is a small device that can interface with airlocks from range. It takes a few seconds to connect and can change the bolt state, open the door, or toggle emergency access." + reference = "HACK" + item = /obj/item/door_remote/omni/access_tuner + cost = 6 + /datum/uplink_item/device_tools/toolbox name = "Fully Loaded Toolbox" desc = "The syndicate toolbox is a suspicious black and red. Aside from tools, it comes with insulated gloves and a multitool." @@ -1013,14 +1027,30 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/storage/box/syndie_kit/bonerepair cost = 6 -/datum/uplink_item/device_tools/military_belt - name = "Military Belt" - desc = "A robust seven-slot red belt made for carrying a broad variety of weapons, ammunition and explosives" +/datum/uplink_item/device_tools/traitor_belt + name = "Traitor's Toolbelt" + desc = "A robust seven-slot belt made for carrying a broad variety of weapons, ammunition and explosives. It's modelled after the standard NT toolbelt so as to avoid suspicion while wearing it." reference = "SBM" - item = /obj/item/storage/belt/military + item = /obj/item/storage/belt/military/traitor + cost = 2 + excludefrom = list(/datum/game_mode/nuclear) + +/datum/uplink_item/device_tools/thermal_drill + name = "Thermal Safe Drill" + desc = "A tungsten carbide thermal drill with magnetic clamps for the purpose of drilling hardened objects. Guaranteed 100% jam proof." + reference = "DRL" + item = /obj/item/thermal_drill cost = 3 excludefrom = list(/datum/game_mode/nuclear) +/datum/uplink_item/device_tools/diamond_drill + name = "Diamond Tipped Thermal Safe Drill" + desc = "A diamond tipped thermal drill with magnetic clamps for the purpose of quickly drilling hardened objects. Guaranteed 100% jam proof." + reference = "DDRL" + item = /obj/item/thermal_drill/diamond_drill + cost = 1 + gamemodes = list(/datum/game_mode/nuclear) + /datum/uplink_item/device_tools/medkit name = "Syndicate Combat Medic Kit" desc = "The syndicate medkit is a suspicious black and red. Included is a combat stimulant injector for rapid healing, a medical HUD for quick identification of injured comrades, \ @@ -1038,8 +1068,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/suits/space_suit name = "Syndicate Space Suit" desc = "This red and black syndicate space suit is less encumbering than Nanotrasen variants, \ - fits inside bags, and has a weapon slot. Nanotrasen crewmembers are trained to report red space suit \ - sightings, however." + fits inside bags, and has a weapon slot. Comes packaged with internals. Nanotrasen crewmembers are trained to report red space suit \ + sightings, however. " reference = "SS" item = /obj/item/storage/box/syndie_kit/space cost = 4 @@ -1049,7 +1079,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) desc = "The feared suit of a syndicate nuclear agent. Features armor and a combat mode \ for faster movement on station. Toggling the suit in and out of \ combat mode will allow you all the mobility of a loose fitting uniform without sacrificing armoring. \ - Additionally the suit is collapsible, making it small enough to fit within a backpack. \ + Additionally the suit is collapsible, making it small enough to fit within a backpack. Comes packaged with internals. \ Nanotrasen crew who spot these suits are known to panic." reference = "BRHS" item = /obj/item/storage/box/syndie_kit/hardsuit @@ -1394,6 +1424,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/storage/secure/briefcase/syndie cost = 1 +/datum/uplink_item/badass/plasticbag + name = "Plastic Bag" + desc = "A simple, plastic bag. Keep out of reach of small children, do not apply to head." + reference = "PBAG" + item = /obj/item/storage/bag/plasticbag + cost = 1 + excludefrom = list(/datum/game_mode/nuclear) + /datum/uplink_item/badass/balloon name = "For showing that you are The Boss" desc = "A useless red balloon with the syndicate logo on it, which can blow the deepest of covers." diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index db2fb3c64df..2c75d6f36e2 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -163,7 +163,7 @@ /mob/living/carbon/med_hud_set_status() var/image/holder = hud_list[STATUS_HUD] var/mob/living/simple_animal/borer/B = has_brain_worms() - if(stat == DEAD) + if(stat == DEAD || (status_flags & FAKEDEATH)) holder.icon_state = "huddead" else if(status_flags & XENO_HOST) holder.icon_state = "hudxeno" diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm index b346a3fecd9..2f6bf234de2 100644 --- a/code/game/dna/genes/disabilities.dm +++ b/code/game/dna/genes/disabilities.dm @@ -147,7 +147,7 @@ /datum/dna/gene/disability/deaf/activate(var/mob/M, var/connected, var/flags) ..() - M.EarDeaf(1) + M.MinimumDeafTicks(1) /datum/dna/gene/disability/nearsighted name="Nearsightedness" diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index 26b95eb77e1..bf9fbb5a9e5 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -78,22 +78,24 @@ for(var/mob/living/player in GLOB.mob_list) if(player.client && player.stat != DEAD) playercount += 1 - if(player.client && player.mind && player.mind.special_role && player.stat != DEAD) - traitorcount += 1 - if(player.client && player.mind && !player.mind.special_role && player.stat != DEAD) + if(!player.mind) + continue + if(player.mind.special_role) + traitorcount += 1 + continue if(ishuman(player) || isrobot(player) || isAI(player)) - if(player.client && (ROLE_TRAITOR in player.client.prefs.be_special) && !jobban_isbanned(player, ROLE_TRAITOR) && !jobban_isbanned(player, "Syndicate")) + if((ROLE_TRAITOR in player.client.prefs.be_special) && !player.client.skip_antag && !jobban_isbanned(player, ROLE_TRAITOR) && !jobban_isbanned(player, "Syndicate")) possible_traitors += player.mind for(var/datum/mind/player in possible_traitors) for(var/job in restricted_jobs) if(player.assigned_role == job) possible_traitors -= player - if(player.current) // Remove mindshield-implanted mobs from the list - if(ishuman(player.current)) - var/mob/living/carbon/human/H = player.current - for(var/obj/item/implant/mindshield/I in H.contents) - if(I && I.implanted) - possible_traitors -= player + if(!player.current || !ishuman(player.current)) // Remove mindshield-implanted mobs from the list + continue + var/mob/living/carbon/human/H = player.current + for(var/obj/item/implant/mindshield/I in H.contents) + if(I && I.implanted) + possible_traitors -= player //message_admins("Live Players: [playercount]") //message_admins("Live Traitors: [traitorcount]") @@ -159,7 +161,7 @@ if(SSshuttle.emergency.mode >= SHUTTLE_ESCAPE) return //message_admins("Late Join Check") - if(character.client && (ROLE_TRAITOR in character.client.prefs.be_special) && !jobban_isbanned(character, ROLE_TRAITOR) && !jobban_isbanned(character, "Syndicate")) + if(character.client && (ROLE_TRAITOR in character.client.prefs.be_special) && !character.client.skip_antag && !jobban_isbanned(character, ROLE_TRAITOR) && !jobban_isbanned(character, "Syndicate")) //message_admins("Late Joiner has Be Syndicate") //message_admins("Checking number of players") var/playercount = 0 @@ -167,8 +169,8 @@ for(var/mob/living/player in GLOB.mob_list) if(player.client && player.stat != DEAD) playercount += 1 - if(player.client && player.mind && player.mind.special_role && player.stat != DEAD) - traitorcount += 1 + if(player.mind && player.mind.special_role) + traitorcount += 1 //message_admins("Live Players: [playercount]") //message_admins("Live Traitors: [traitorcount]") diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 2056c6c6260..42a42240ad5 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -55,7 +55,7 @@ var/list/blob_nodes = list() /datum/game_mode/blob/proc/get_blob_candidates() var/list/candidates = list() for(var/mob/living/carbon/human/player in GLOB.player_list) - if(!player.stat && player.mind && !player.mind.special_role && !jobban_isbanned(player, "Syndicate") && (ROLE_BLOB in player.client.prefs.be_special)) + if(!player.stat && player.mind && !player.client.skip_antag && !player.mind.special_role && !jobban_isbanned(player, "Syndicate") && (ROLE_BLOB in player.client.prefs.be_special)) candidates += player return candidates diff --git a/code/game/gamemodes/changeling/powers/fakedeath.dm b/code/game/gamemodes/changeling/powers/fakedeath.dm index abd03c7efd7..a07670647c3 100644 --- a/code/game/gamemodes/changeling/powers/fakedeath.dm +++ b/code/game/gamemodes/changeling/powers/fakedeath.dm @@ -17,7 +17,10 @@ user.status_flags |= FAKEDEATH //play dead user.update_stat("fakedeath sting") user.update_canmove() - + user.med_hud_set_health() + user.handle_hud_icons_health() + user.med_hud_set_status() + addtimer(CALLBACK(src, .proc/ready_to_regenerate, user), LING_FAKEDEATH_TIME) feedback_add_details("changeling_powers","FD") return 1 diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index b61096a8939..0c8d22b5a8b 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -277,6 +277,7 @@ return C.visible_message("[src] impales [C] with [I]!", "[src] impales you with [I]!") + add_attack_logs(src, C, "[src] pulled [C] with a tentacle, attacking them with [I]") //Attack log is here so we can fetch the item they're stabbing with. C.apply_damage(I.force, BRUTE, "chest") do_item_attack_animation(C, used_item = I) add_blood(C) @@ -292,6 +293,7 @@ var/obj/item/I = target if(!I.anchored) to_chat(firer, "You pull [I] towards yourself.") + add_attack_logs(src, I, "[src] pulled [I] towards them with a tentacle") H.throw_mode_on() I.throw_at(H, 10, 2) . = 1 @@ -304,6 +306,7 @@ switch(firer.a_intent) if(INTENT_HELP) C.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") + add_attack_logs(H, L, "[H] pulled [L] towards them with a tentacle") C.throw_at(get_step_towards(H,C), 8, 2) return 1 @@ -312,10 +315,12 @@ if(I) if(C.drop_item()) C.visible_message("[I] is yanked out of [C]'s hand by [src]!","A tentacle pulls [I] away from you!") + add_attack_logs(src, C, "[src] has grabbed [I] out of [C]'s hand with a tentacle") on_hit(I) //grab the item as if you had hit it directly with the tentacle return 1 else to_chat(firer, "You can't seem to pry [I] out of [C]'s hands!") + add_attack_logs(src, C, "[src] tried to grab [I] out of [C]'s hand with a tentacle, but failed") return 0 else to_chat(firer, "[C] has nothing in hand to disarm!") @@ -323,6 +328,7 @@ if(INTENT_GRAB) C.visible_message("[L] is grabbed by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") + add_attack_logs(src, C, "[src] has grabbed [C] and pulled them towards [H] with a tentacle") C.throw_at(get_step_towards(H,C), 8, 2, callback=CALLBACK(H, /mob/proc/tentacle_grab, C)) return 1 diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 9993388afec..147fdd2d327 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -16,8 +16,7 @@ user.radiation = 0 user.SetEyeBlind(0, FALSE) user.SetEyeBlurry(0, FALSE) - user.SetEarDamage(0) - user.SetEarDeaf(0) + user.RestoreEars() user.heal_overall_damage(user.getBruteLoss(), user.getFireLoss(), updating_health = FALSE) user.CureBlind(FALSE) user.CureDeaf() diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm index 5185b61e508..1c60013fbb8 100644 --- a/code/game/gamemodes/changeling/powers/shriek.dm +++ b/code/game/gamemodes/changeling/powers/shriek.dm @@ -11,7 +11,7 @@ for(var/mob/living/M in get_mobs_in_view(4, user)) if(iscarbon(M)) if(!M.mind || !M.mind.changeling) - M.AdjustEarDeaf(30) + M.MinimumDeafTicks(30) M.AdjustConfused(20) M.Jitter(50) else diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index de10fa34c01..08ab2b54c5d 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -271,7 +271,7 @@ // Get a list of all the people who want to be the antagonist for this round, except those with incompatible species for(var/mob/new_player/player in players) - if(!player.skip_antag) + if(!player.client.skip_antag) if((role in player.client.prefs.be_special) && !(player.client.prefs.species in protected_species)) player_draft_log += "[player.key] had [roletext] enabled, so we are drafting them." candidates += player.mind diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 6d82f6c48e1..c45da8ac279 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -265,7 +265,7 @@ continue to_chat(C, "You hear a ear piercing shriek and your senses dull!") C.Weaken(4) - C.AdjustEarDeaf(20) + C.MinimumDeafTicks(20) C.Stuttering(20) C.Stun(4) C.Jitter(150) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 4c0aaac77da..18aba4ca69f 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -785,7 +785,7 @@ var/global/list/multiverse = list() else if(istype(I,/obj/item/bikehorn)) to_chat(target, "HONK") target << 'sound/items/AirHorn.ogg' - target.AdjustEarDeaf(3) + target.MinimumDeafTicks(3) GiveHint(target) cooldown = world.time +cooldown_time return diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 6ae56a24973..c196c858e0b 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -423,7 +423,7 @@ /datum/spellbook_entry/item/cursed_heart name = "Cursed Heart" - desc = "A heart that has been revived by dark magicks, the user must concentrate to ensure the heart beats, but every beat heals them. It must beat every 6 seconds." + desc = "A heart that has been revived by dark magicks. The user must ensure the heart is manually beaten or their blood circulation will suffer, but every beat heals their injuries. It must beat every 6 seconds." item_path = /obj/item/organ/internal/heart/cursed/wizard log_name = "CH" cost = 1 diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 494da86d680..92424dd2bcb 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -117,7 +117,7 @@ return 0 if(disabilities_allowed) return 0 - var/list/prohibited_disabilities = list(DISABILITY_FLAG_DEAF, DISABILITY_FLAG_BLIND, DISABILITY_FLAG_MUTE, DISABILITY_FLAG_SCRAMBLED, DISABILITY_FLAG_EPILEPTIC, DISABILITY_FLAG_TOURETTES, DISABILITY_FLAG_NEARSIGHTED, DISABILITY_FLAG_DIZZY) + var/list/prohibited_disabilities = list(DISABILITY_FLAG_DEAF, DISABILITY_FLAG_BLIND, DISABILITY_FLAG_MUTE, DISABILITY_FLAG_SCRAMBLED, DISABILITY_FLAG_EPILEPTIC, DISABILITY_FLAG_TOURETTES, DISABILITY_FLAG_DIZZY) for(var/i = 1, i < prohibited_disabilities.len, i++) var/this_disability = prohibited_disabilities[i] if(C.prefs.disabilities & this_disability) diff --git a/code/game/jobs/job_exp.dm b/code/game/jobs/job_exp.dm index 7330c20eee6..bfd11066bf3 100644 --- a/code/game/jobs/job_exp.dm +++ b/code/game/jobs/job_exp.dm @@ -37,6 +37,18 @@ var/global/list/role_playtime_requirements = list( ROLE_ABDUCTOR = 10, ) +// Client Verbs + +/client/verb/cmd_check_own_playtime() + set category = "Special Verbs" + set name = "Check my playtime" + + if(!config.use_exp_tracking) + to_chat(src, "Playtime tracking is not enabled.") + return + + to_chat(src, "Your playtime is [get_exp_living()].") + // Admin Verbs /client/proc/cmd_mentor_check_player_exp() //Allows admins to determine who the newer players are. diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index f3701945017..1b7ca14f941 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -1,102 +1,105 @@ -/obj/machinery/pdapainter - name = "PDA painter" - desc = "A PDA painting machine. To use, simply insert your PDA and choose the desired preset paint scheme." - icon = 'icons/obj/pda.dmi' - icon_state = "pdapainter" - density = 1 - anchored = 1 - var/obj/item/pda/storedpda = null - var/list/colorlist = list() - - -/obj/machinery/pdapainter/update_icon() - overlays.Cut() - - if(stat & BROKEN) - icon_state = "[initial(icon_state)]-broken" - return - - if(storedpda) - overlays += "[initial(icon_state)]-closed" - - if(powered()) - icon_state = initial(icon_state) - else - icon_state = "[initial(icon_state)]-off" - - return - -/obj/machinery/pdapainter/New() - ..() - var/blocked = list(/obj/item/pda/silicon/ai, /obj/item/pda/silicon/robot, /obj/item/pda/silicon/pai, /obj/item/pda/heads, - /obj/item/pda/clear, /obj/item/pda/syndicate) - - for(var/P in typesof(/obj/item/pda)-blocked) - var/obj/item/pda/D = new P - - //D.name = "PDA Style [colorlist.len+1]" //Gotta set the name, otherwise it all comes up as "PDA" - D.name = D.icon_state //PDAs don't have unique names, but using the sprite names works. - - src.colorlist += D - -/obj/machinery/pdapainter/Destroy() - QDEL_NULL(storedpda) - return ..() - -/obj/machinery/pdapainter/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/pda)) - if(storedpda) - to_chat(user, "There is already a PDA inside.") - return - else - var/obj/item/pda/P = user.get_active_hand() - if(istype(P)) - if(user.drop_item()) - storedpda = P - P.forceMove(src) - P.add_fingerprint(user) - update_icon() - else - return ..() - - -/obj/machinery/pdapainter/attack_hand(mob/user as mob) - if(..()) - return 1 - - src.add_fingerprint(user) - - if(storedpda) - var/obj/item/pda/P - P = input(user, "Select your color!", "PDA Painting") as null|anything in colorlist - if(!P) - return - if(!in_range(src, user)) - return - - storedpda.icon_state = P.icon_state - storedpda.desc = P.desc - - else - to_chat(user, "The [src] is empty.") - - -/obj/machinery/pdapainter/verb/ejectpda() - set name = "Eject PDA" - set category = "Object" - set src in oview(1) - - if(usr.incapacitated()) - return - - if(storedpda) - storedpda.loc = get_turf(src.loc) - storedpda = null - update_icon() - else - to_chat(usr, "The [src] is empty.") - - -/obj/machinery/pdapainter/power_change() - ..() +/obj/machinery/pdapainter + name = "PDA painter" + desc = "A PDA painting machine. To use, simply insert your PDA and choose the desired preset paint scheme." + icon = 'icons/obj/pda.dmi' + icon_state = "pdapainter" + density = 1 + anchored = 1 + var/obj/item/pda/storedpda = null + var/list/colorlist = list() + + +/obj/machinery/pdapainter/update_icon() + overlays.Cut() + + if(stat & BROKEN) + icon_state = "[initial(icon_state)]-broken" + return + + if(storedpda) + overlays += "[initial(icon_state)]-closed" + + if(powered()) + icon_state = initial(icon_state) + else + icon_state = "[initial(icon_state)]-off" + + return + +/obj/machinery/pdapainter/New() + ..() + var/blocked = list(/obj/item/pda/silicon/ai, /obj/item/pda/silicon/robot, /obj/item/pda/silicon/pai, /obj/item/pda/heads, + /obj/item/pda/clear, /obj/item/pda/syndicate) + + for(var/P in typesof(/obj/item/pda)-blocked) + var/obj/item/pda/D = new P + + //D.name = "PDA Style [colorlist.len+1]" //Gotta set the name, otherwise it all comes up as "PDA" + D.name = D.icon_state //PDAs don't have unique names, but using the sprite names works. + + src.colorlist += D + +/obj/machinery/pdapainter/Destroy() + QDEL_NULL(storedpda) + return ..() + +/obj/machinery/pdapainter/attackby(obj/item/I, mob/user, params) + if(default_unfasten_wrench(user, I)) + power_change() + return + if(istype(I, /obj/item/pda)) + if(storedpda) + to_chat(user, "There is already a PDA inside.") + return + else + var/obj/item/pda/P = user.get_active_hand() + if(istype(P)) + if(user.drop_item()) + storedpda = P + P.forceMove(src) + P.add_fingerprint(user) + update_icon() + else + return ..() + + +/obj/machinery/pdapainter/attack_hand(mob/user as mob) + if(..()) + return 1 + + src.add_fingerprint(user) + + if(storedpda) + var/obj/item/pda/P + P = input(user, "Select your color!", "PDA Painting") as null|anything in colorlist + if(!P) + return + if(!in_range(src, user)) + return + + storedpda.icon_state = P.icon_state + storedpda.desc = P.desc + + else + to_chat(user, "The [src] is empty.") + + +/obj/machinery/pdapainter/verb/ejectpda() + set name = "Eject PDA" + set category = "Object" + set src in oview(1) + + if(usr.incapacitated()) + return + + if(storedpda) + storedpda.loc = get_turf(src.loc) + storedpda = null + update_icon() + else + to_chat(usr, "The [src] is empty.") + + +/obj/machinery/pdapainter/power_change() + ..() update_icon() \ No newline at end of file diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index e31fc239580..c0c8c2d349e 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -169,41 +169,16 @@ screen = SEC_DATA_R_LIST if("criminal") if(active2) - var/their_name = active2.fields["name"] - var/their_rank = active2.fields["rank"] var/t1 if(temp_href[2] == "execute") t1 = copytext(trim(sanitize(input("Explain why they are being executed. Include a list of their crimes, and victims.", "EXECUTION ORDER", null, null) as text)), 1, MAX_MESSAGE_LEN) else t1 = copytext(trim(sanitize(input("Enter Reason:", "Secure. records", null, null) as text)), 1, MAX_MESSAGE_LEN) - var/visible_reason - if(t1) - visible_reason = t1 - else + if(!t1) t1 = "(none)" - visible_reason = "NO REASON PROVIDED" - switch(temp_href[2]) - if("none") - active2.fields["criminal"] = "None" - if("arrest") - active2.fields["criminal"] = "*Arrest*" - if("execute") - if((access_magistrate in authcard_access) || (access_armory in authcard_access)) - active2.fields["criminal"] = "*Execute*" - message_admins("[ADMIN_FULLMONTY(usr)] authorized EXECUTION for [their_rank] [their_name], with comment: [visible_reason]") - else - setTemp("

Error: permission denied.

") - return 1 - if("incarcerated") - active2.fields["criminal"] = "Incarcerated" - if("parolled") - active2.fields["criminal"] = "Parolled" - if("released") - active2.fields["criminal"] = "Released" - var/newstatus = active2.fields["criminal"] - log_admin("[key_name_admin(usr)] set secstatus of [their_rank] [their_name] to [newstatus], comment: [t1]") - active2.fields["comments"] += "Set to [newstatus] by [usr.name] ([rank]) on [current_date_string] [station_time_timestamp()], comment: [t1]" - update_all_mob_security_hud() + if(!set_criminal_status(usr, active2, temp_href[2], t1, rank, authcard_access)) + setTemp("

Error: permission denied.

") + return 1 if("rank") if(active1) active1.fields["rank"] = temp_href[2] diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index f9c1330e596..fc19325e594 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -730,6 +730,13 @@ obj/item/circuitboard/rdserver /obj/item/stock_parts/matter_bin = 1) var/target +/obj/item/circuitboard/teleporter_perma/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/gps)) + var/obj/item/gps/L = I + if(L.locked_location) + target = get_turf(L.locked_location) + to_chat(user, "You upload the data from [L]") + /obj/item/circuitboard/telesci_pad name = "Circuit board (Telepad)" build_path = /obj/machinery/telepad diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 7f785b6f3eb..df20e6fcf37 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -1,7 +1,7 @@ #define CHARS_PER_LINE 5 #define FONT_SIZE "5pt" #define FONT_COLOR "#09f" -#define FONT_STYLE "Arial Black" +#define FONT_STYLE "Small Fonts" /////////////////////////////////////////////////////////////////////////////////////////////// // Brig Door control displays. @@ -30,6 +30,7 @@ var/datum/data/record/prisoner maptext_height = 26 maptext_width = 32 + maptext_y = -1 /obj/machinery/door_timer/proc/print_report() var/logname = input(usr, "Name of the guilty?","[id] log name") @@ -349,7 +350,7 @@ if(timing) var/disp1 = id var/timeleft = timeleft() - var/disp2 = "[add_zero(num2text((timeleft / 60) % 60),2)]~[add_zero(num2text(timeleft % 60), 2)]" + var/disp2 = "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]" if(length(disp2) > CHARS_PER_LINE) disp2 = "Error" update_display(disp1, disp2) @@ -372,6 +373,8 @@ //Checks to see if there's 1 line or 2, adds text-icons-numbers/letters over display // Stolen from status_display /obj/machinery/door_timer/proc/update_display(line1, line2) + line1 = uppertext(line1) + line2 = uppertext(line2) var/new_text = {"
[line1]
[line2]
"} if(maptext != new_text) maptext = new_text diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 4af2bc60f66..20132f614af 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -403,7 +403,9 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/machinery/hologram/holopad/update_icon() var/total_users = LAZYLEN(masters) + LAZYLEN(holo_calls) - if(ringing) + if(icon_state == "holopad_open") + return + else if(ringing) icon_state = "holopad_ringing" else if(total_users) icon_state = "holopad1" diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index d0abd774e6f..b0ab09be91b 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -141,16 +141,15 @@ Class Procs: /obj/machinery/makeSpeedProcess() if(speed_process) return - speed_process = 1 + speed_process = TRUE STOP_PROCESSING(SSmachines, src) GLOB.fast_processing += src - isprocessing = TRUE // gotta go slow /obj/machinery/makeNormalProcess() if(!speed_process) return - speed_process = 0 + speed_process = FALSE START_PROCESSING(SSmachines, src) GLOB.fast_processing -= src diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index e3ab6965caf..881711ff5f6 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -1,7 +1,7 @@ #define FONT_SIZE "5pt" #define FONT_COLOR "#09f" #define WARNING_FONT_COLOR "#f90" -#define FONT_STYLE "Arial Black" +#define FONT_STYLE "Small Fonts" #define SCROLL_SPEED 2 // Status display @@ -39,6 +39,7 @@ maptext_height = 26 maptext_width = 32 + maptext_y = -1 var/const/CHARS_PER_LINE = 5 var/const/STATUS_DISPLAY_BLANK = 0 @@ -157,6 +158,8 @@ overlays += image('icons/obj/status_display.dmi', icon_state=picture_state) /obj/machinery/status_display/proc/update_display(line1, line2, warning = 0) + line1 = uppertext(line1) + line2 = uppertext(line2) var/new_text = {"
[line1]
[line2]
"} if(maptext != new_text) maptext = new_text diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 3cabbac3e75..f7fed41581d 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -159,12 +159,44 @@ /obj/machinery/suit_storage_unit/attackby(obj/item/I as obj, mob/user as mob, params) if(!is_operational()) + if(panel_open) + to_chat(usr, "Close the maintenance panel first.") + else + to_chat(usr, "The unit is not operational.") return if(isscrewdriver(I)) panel_open = !panel_open playsound(loc, I.usesound, 100, 1) to_chat(user, text("You [panel_open ? "open up" : "close"] the unit's maintenance panel.")) updateUsrDialog() + return + if(state_open) + if(store_item(I, user)) + update_icon() + updateUsrDialog() + to_chat(user, "You load the [I] into the storage compartment.") + else + to_chat(user, "The unit already contains that item.") + + +/obj/machinery/suit_storage_unit/proc/store_item(obj/item/I, mob/user) + . = FALSE + if(istype(I, /obj/item/clothing/suit/space) && !suit) + suit = I + . = TRUE + if(istype(I, /obj/item/clothing/head/helmet) && !helmet) + helmet = I + . = TRUE + if(istype(I, /obj/item/clothing/mask) && !mask) + mask = I + . = TRUE + if((istype(I, /obj/item/tank) || istype(I, /obj/item/clothing/shoes/magboots)) && !storage) + storage = I + . = TRUE + if(.) + user.drop_item() + I.forceMove(src) + /obj/machinery/suit_storage_unit/power_change() ..() @@ -380,7 +412,7 @@ dat+= text("Breathmask storage compartment: []
",(mask ? mask.name : "No breathmask detected.") ) if(mask && state_open) dat+="Dispense mask
" - dat+= text("Breathmask storage compartment: []
",(storage ? storage.name : "
No storage item detected.") ) + dat+= text("Tank, Magboots storage compartment: []
",(storage ? storage.name : "
No storage item detected.") ) if(storage && state_open) dat+="Dispense storage item
" if(occupant) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index fda550217ad..d70508e620b 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -530,6 +530,48 @@ qdel(G) +/obj/item/bombcore/toxins + name = "toxins payload" + desc = "A payload casing designed to secure a gas based bomb. Must be loaded with a tank transfer valve and installed into a plasteel bomb frame in order to be detonated." + origin_tech = "materials=1;engineering=1" + icon_state = "chemcore" + var/obj/item/transfer_valve/ttv = null + +/obj/item/bombcore/toxins/attackby(obj/item/I, mob/user) + if(iscrowbar(I) && ttv) + playsound(loc, I.usesound, 50, 1) + ttv.forceMove(get_turf(src)) + ttv = null + else if(istype(I, /obj/item/transfer_valve)) + if(!ttv && !check_attached(I)) + if(!user.drop_item()) + return + to_chat(user, "You load [src] with [I].") + ttv = I + I.forceMove(src) + else if (ttv) + to_chat(user, "Another tank transfer valve is already loaded.") + else + to_chat(user, "Remove the attached assembly component first.") + else + return ..() + +/obj/item/bombcore/toxins/proc/check_attached(obj/item/transfer_valve/ttv) + if (ttv.attached_device) + return TRUE + else + return FALSE + +/obj/item/bombcore/toxins/ex_act(severity) //No chain reactions, the explosion only occurs when gas mixes + return + +/obj/item/bombcore/toxins/burn() + return + +/obj/item/bombcore/toxins/detonate() + if(ttv) + ttv.toggle_valve() + ///Syndicate Detonator (aka the big red button)/// /obj/item/syndicatedetonator diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 876923f5c28..af067f60688 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -199,6 +199,9 @@ /*if(istype(W,/obj/item/screwdriver)) panel = !panel to_chat(user, "you [panel ? "open" : "close"] the [src]'s maintenance panel")*/ + if(default_unfasten_wrench(user, W)) + power_change() + return if(istype(W,/obj/item/toy/crayon) ||istype(W,/obj/item/stamp)) if( state in list( 1, 3, 6 ) ) if(!crayon) diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index 6f3a8b51354..a1264b753e6 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -12,10 +12,15 @@ max_temperature = 30000 infra_luminosity = 8 force = 40 - var/defence = 0 - var/defence_deflect = 35 wreckage = /obj/effect/decal/mecha_wreckage/durand +/obj/mecha/combat/durand/GrantActions(mob/living/user, human_occupant = 0) + ..() + defense_action.Grant(user, src) + +/obj/mecha/combat/durand/RemoveActions(mob/living/user, human_occupant = 0) + ..() + defense_action.Remove(user) /obj/mecha/combat/durand/loaded/New() ..() @@ -24,54 +29,6 @@ ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack ME.attach(src) - -/obj/mecha/combat/durand/relaymove(mob/user,direction) - if(defence) - if(world.time - last_message > 20) - occupant_message("Unable to move while in defence mode") - last_message = world.time - return 0 - . = ..() - - -/obj/mecha/combat/durand/verb/defence_mode() - set category = "Exosuit Interface" - set name = "Toggle defence mode" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - defence = !defence - if(defence) - deflect_chance = defence_deflect - occupant_message("You enable [src] defence mode.") - else - deflect_chance = initial(deflect_chance) - occupant_message("You disable [src] defence mode.") - log_message("Toggled defence mode.") - - -/obj/mecha/combat/durand/get_stats_part() - var/output = ..() - output += "Defence mode: [defence?"on":"off"]" - return output - -/obj/mecha/combat/durand/get_commands() - var/output = {"
-
Special
- -
- "} - output += ..() - return output - -/obj/mecha/combat/durand/Topic(href, href_list) - ..() - if(href_list["toggle_defence_mode"]) - defence_mode() - /obj/mecha/combat/durand/old desc = "A retired, third-generation combat exosuit utilized by the Nanotrasen corporation. Originally developed to combat hostile alien lifeforms." name = "Durand" diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 05e02901ce2..c930df4b97b 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -11,13 +11,21 @@ armor = list(melee = 25, bullet = 20, laser = 30, energy = 15, bomb = 0, bio = 0, rad = 0) max_temperature = 25000 infra_luminosity = 6 - var/overload = 0 - var/overload_coeff = 2 + leg_overload_coeff = 2 wreckage = /obj/effect/decal/mecha_wreckage/gygax internal_damage_threshold = 35 max_equip = 3 maxsize = 2 step_energy_drain = 3 + normal_step_energy_drain = 3 + +/obj/mecha/combat/gygax/GrantActions(mob/living/user, human_occupant = 0) + ..() + overload_action.Grant(user, src) + +/obj/mecha/combat/gygax/RemoveActions(mob/living/user, human_occupant = 0) + ..() + overload_action.Remove(user) /obj/mecha/combat/gygax/loaded/New() ..() @@ -35,7 +43,7 @@ deflect_chance = 15 damage_absorption = list("brute"=0.6,"fire"=0.8,"bullet"=0.6,"laser"=0.5,"energy"=0.65,"bomb"=0.8) max_temperature = 35000 - overload_coeff = 1 + leg_overload_coeff = 100 operation_req_access = list(access_syndicate) wreckage = /obj/effect/decal/mecha_wreckage/gygax/dark max_equip = 4 @@ -55,57 +63,4 @@ /obj/mecha/combat/gygax/dark/add_cell() cell = new /obj/item/stock_parts/cell/bluespace(src) cell.charge = 30000 - cell.maxcharge = 30000 - - -/obj/mecha/combat/gygax/verb/overload() - set category = "Exosuit Interface" - set name = "Toggle leg actuators overload" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - if(overload) - overload = 0 - step_in = initial(step_in) - step_energy_drain = initial(step_energy_drain) - occupant_message("You disable leg actuators overload.") - else - overload = 1 - step_in = min(1, round(step_in/2)) - step_energy_drain = step_energy_drain*overload_coeff - occupant_message("You enable leg actuators overload.") - log_message("Toggled leg actuators overload.") - -/obj/mecha/combat/gygax/domove(direction) - if(!..()) - return - if(overload) - health-- - if(health < initial(health) - initial(health) / 3) - overload = 0 - step_in = initial(step_in) - step_energy_drain = initial(step_energy_drain) - occupant_message("Leg actuators damage threshold exceded. Disabling overload.") - - -/obj/mecha/combat/gygax/get_stats_part() - var/output = ..() - output += "Leg actuators overload: [overload?"on":"off"]" - return output - -/obj/mecha/combat/gygax/get_commands() - var/output = {"
-
Special
- -
- "} - output += ..() - return output - -/obj/mecha/combat/gygax/Topic(href, href_list) - ..() - if(href_list["toggle_leg_overload"]) - overload() \ No newline at end of file + cell.maxcharge = 30000 \ No newline at end of file diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index b05f97acbcd..8e16b6128dd 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -11,12 +11,6 @@ max_temperature = 60000 burn_state = LAVA_PROOF infra_luminosity = 3 - var/zoom = 0 - var/thrusters = 0 - var/smoke = 5 - var/smoke_ready = 1 - var/smoke_cooldown = 100 - var/datum/effect_system/smoke_spread/smoke_system = new operation_req_access = list(access_cent_specops) wreckage = /obj/effect/decal/mecha_wreckage/marauder add_req_access = 0 @@ -24,6 +18,17 @@ force = 45 max_equip = 5 +/obj/mecha/combat/marauder/GrantActions(mob/living/user, human_occupant = 0) + . = ..() + thrusters_action.Grant(user, src) + smoke_action.Grant(user, src) + zoom_action.Grant(user, src) + +/obj/mecha/combat/marauder/RemoveActions(mob/living/user, human_occupant = 0) + . = ..() + thrusters_action.Remove(user) + smoke_action.Remove(user) + zoom_action.Remove(user) /obj/mecha/combat/marauder/loaded/New() ..() @@ -37,8 +42,6 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) ME.attach(src) - smoke_system.set_up(3, 0, src) - smoke_system.attach(src) /obj/mecha/combat/marauder/seraph desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel." @@ -98,100 +101,4 @@ ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) - ME.attach(src) - smoke_system.set_up(3, 0, src) - smoke_system.attach(src) - - -/obj/mecha/combat/marauder/relaymove(mob/user,direction) - if(zoom) - if(world.time - last_message > 20) - occupant_message("Unable to move while in zoom mode.") - last_message = world.time - return 0 - return ..() - -/obj/mecha/combat/marauder/Process_Spacemove(var/movement_dir = 0) - if(..()) - return 1 - if(thrusters && movement_dir && use_power(step_energy_drain)) - return 1 - return 0 - -/obj/mecha/combat/marauder/verb/toggle_thrusters() - set category = "Exosuit Interface" - set name = "Toggle thrusters" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - if(occupant) - if(get_charge() > 0) - thrusters = !thrusters - log_message("Toggled thrusters.") - occupant_message("Thrusters [thrusters?"en":"dis"]abled.") - - -/obj/mecha/combat/marauder/verb/smoke() - set category = "Exosuit Interface" - set name = "Smoke" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - if(smoke_ready && smoke>0) - smoke_system.start() - smoke-- - smoke_ready = 0 - spawn(smoke_cooldown) - smoke_ready = 1 - -/obj/mecha/combat/marauder/verb/zoom() - set category = "Exosuit Interface" - set name = "Zoom" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - if(occupant.client) - zoom = !zoom - log_message("Toggled zoom mode.") - occupant_message("Zoom mode [zoom?"en":"dis"]abled.") - if(zoom) - occupant.client.AddViewMod("mecha", 12) - to_chat(occupant, sound('sound/mecha/imag_enh.ogg',volume=50)) - else - occupant.client.RemoveViewMod("mecha") - - - -/obj/mecha/combat/marauder/get_stats_part() - var/output = ..() - output += {"Smoke: [smoke] -
- Thrusters: [thrusters?"on":"off"] - "} - return output - - -/obj/mecha/combat/marauder/get_commands() - var/output = {"
-
Special
- -
- "} - output += ..() - return output - -/obj/mecha/combat/marauder/Topic(href, href_list) - ..() - if(href_list["toggle_thrusters"]) - toggle_thrusters() - if(href_list["smoke"]) - smoke() - if(href_list["toggle_zoom"]) - zoom() \ No newline at end of file + ME.attach(src) \ No newline at end of file diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index 5dbffb62f29..d1092212761 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -6,6 +6,7 @@ step_in = 2 dir_in = 2 //Facing south. step_energy_drain = 3 + normal_step_energy_drain = 3 health = 200 deflect_chance = 30 damage_absorption = list("brute"=0.7,"fire"=0.7,"bullet"=0.7,"laser"=0.7,"energy"=0.7,"bomb"=0.7) @@ -17,10 +18,18 @@ //operation_req_access = list() internal_damage_threshold = 25 force = 15 - var/phasing = 0 - var/phasing_energy_drain = 200 + phase_state = "phazon-phase" max_equip = 3 +/obj/mecha/combat/phazon/GrantActions(mob/living/user, human_occupant = 0) + ..() + phasing_action.Grant(user, src) + switch_damtype_action.Grant(user, src) + +/obj/mecha/combat/phazon/RemoveActions(mob/living/user, human_occupant = 0) + ..() + phasing_action.Remove(user) + switch_damtype_action.Remove(user) /obj/mecha/combat/phazon/New() ..() @@ -29,62 +38,13 @@ ME = new /obj/item/mecha_parts/mecha_equipment/gravcatapult ME.attach(src) -/obj/mecha/combat/phazon/mechstep(direction) - . = ..() - if(!. && phasing && get_charge() >= phasing_energy_drain) - if(can_move) - can_move = 0 - flick("phazon-phase", src) - forceMove(get_step(src, direction)) - use_power(phasing_energy_drain) - playsound(src,stepsound,40,1) - sleep(step_in * 3) - can_move = 1 - return 1 - -/obj/mecha/combat/phazon/click_action(atom/target,mob/user) - if(phasing) - occupant_message("Unable to interact with objects while phasing") - return - return ..() - -/obj/mecha/combat/phazon/verb/switch_damtype() - set category = "Exosuit Interface" - set name = "Reconfigure arm microtool arrays" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - var/new_damtype = alert(occupant, "Arm Tool Selection", null, "Fists", "Torch", "Toxic Injector") - switch(new_damtype) - if("Fists") - damtype = "brute" - occupant_message("Your exosuit's hands form into fists.") - if("Torch") - damtype = "fire" - occupant_message("A torch tip extends from your exosuit's hand, glowing red.") - if("Toxic Injector") - damtype = "tox" - occupant_message("A bone-chillingly thick plasteel needle protracts from the exosuit's palm.") - playsound(src, 'sound/mecha/mechmove01.ogg', 50, 1) - /obj/mecha/combat/phazon/get_commands() var/output = {" "} output += ..() - return output - -/obj/mecha/combat/phazon/Topic(href, href_list) - ..() - if(href_list["switch_damtype"]) - switch_damtype() - if(href_list["phasing"]) - phasing = !phasing - send_byjax(occupant,"exosuit.browser","phasing_command","[phasing?"Dis":"En"]able phasing") - occupant_message("En":"#f00\">Dis"]abled phasing.") \ No newline at end of file + return output \ No newline at end of file diff --git a/code/game/mecha/combat/reticence.dm b/code/game/mecha/combat/reticence.dm index 9e51be0357d..ba4566a1e91 100644 --- a/code/game/mecha/combat/reticence.dm +++ b/code/game/mecha/combat/reticence.dm @@ -15,7 +15,8 @@ add_req_access = 0 internal_damage_threshold = 60 max_equip = 3 - step_energy_drain = 3 + step_energy_drain = 3 + normal_step_energy_drain = 3 stepsound = null turnsound = null diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index 63e70626a8d..b1a110813e8 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -15,7 +15,8 @@ return if(isobj(target)) var/obj/target_obj = target - if(target_obj.unacidable) + if(target_obj.unacidable && !istype(target_obj, /obj/mecha)) + occupant_message("[target] is too durable to drill through.") return target.visible_message("[chassis] starts to drill [target].", "[chassis] starts to drill [target]...", diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 6d83b8fa927..011b2c6fab8 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -212,7 +212,7 @@ to_chat(M, "HONK") M.SetSleeping(0) M.Stuttering(20) - M.AdjustEarDeaf(30) + M.MinimumDeafTicks(30) M.Weaken(3) if(prob(30)) M.Stun(10) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 3cf0e3513e7..2205a9f6a72 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -7,6 +7,9 @@ #define MELEE 1 #define RANGED 2 +#define MECHAMOVE_RAND 1 +#define MECHAMOVE_TURN 2 +#define MECHAMOVE_STEP 4 /obj/mecha name = "Mecha" @@ -21,11 +24,13 @@ force = 5 armor = list(melee = 20, bullet = 10, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) var/initial_icon = null //Mech type for resetting icon. Only used for reskinning kits (see custom items) - var/can_move = 1 + var/can_move = 0 // time of next allowed movement var/mob/living/carbon/occupant = null var/step_in = 10 //make a step in step_in/10 sec. var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. + var/normal_step_energy_drain = 10 var/step_energy_drain = 10 + var/overload_step_energy_drain_min = 100 var/health = 300 //health is health var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. //the values in this list show how much damage will pass through, not how much will be absorbed. @@ -69,32 +74,42 @@ var/turf/crashing = null var/occupant_sight_flags = 0 - var/stepsound = 'sound/mecha/mechstep.ogg' var/turnsound = 'sound/mecha/mechturn.ogg' var/melee_cooldown = 10 var/melee_can_hit = 1 + // Action vars + var/defence_mode = FALSE + var/defence_mode_deflect_chance = 35 + var/leg_overload_mode = FALSE + var/leg_overload_coeff = 100 + var/thrusters_active = FALSE + var/smoke = 5 + var/smoke_ready = 1 + var/smoke_cooldown = 100 + var/zoom_mode = FALSE + var/phasing = FALSE + var/phasing_energy_drain = 200 + var/phase_state = "" //icon_state when phasing + hud_possible = list (DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD) -/obj/mecha/New() - ..() +/obj/mecha/Initialize() + . = ..() events = new icon_state += "-open" add_radio() add_cabin() - - if(!add_airtank()) //we check this here in case mecha does not have an internal tank available by default - WIP - removeVerb(/obj/mecha/verb/connect_to_port) - removeVerb(/obj/mecha/verb/toggle_internal_tank) - + add_airtank() spark_system.set_up(2, 0, src) spark_system.attach(src) + smoke_system.set_up(3, src) + smoke_system.attach(src) add_cell() processing_objects.Add(src) - removeVerb(/obj/mecha/verb/disconnect_from_port) GLOB.poi_list |= src log_message("[src] created.") GLOB.mechas_list += src //global mech list @@ -109,13 +124,6 @@ //////////////////////// ////// Helpers ///////// //////////////////////// - -/obj/mecha/proc/removeVerb(verb_path) - verbs -= verb_path - -/obj/mecha/proc/addVerb(verb_path) - verbs += verb_path - /obj/mecha/proc/add_airtank() internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) return internal_tank @@ -144,7 +152,6 @@ radio.icon_state = icon_state radio.subspace_transmission = 1 - /obj/mecha/examine(mob/user) ..(user) var/integrity = health/initial(health)*100 @@ -164,18 +171,18 @@ for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment) to_chat(user, "[bicon(ME)] [ME]") - - /obj/mecha/hear_talk(mob/M, text) if(M == occupant && radio.broadcasting) radio.talk_into(M, text) - /obj/mecha/proc/click_action(atom/target, mob/user, params) if(!occupant || occupant != user ) return if(user.incapacitated()) return + if(phasing) + occupant_message("Unable to interact with objects while phasing.") + return if(state) occupant_message("Maintenance protocols in effect.") return @@ -251,6 +258,8 @@ . = ..() if(.) return 1 + if(thrusters_active && movement_dir && use_power(step_energy_drain)) + return 1 var/atom/movable/backup = get_spacemove_backup() if(backup) @@ -278,30 +287,58 @@ return domove(direction) /obj/mecha/proc/domove(direction) - if(!can_move) + if(can_move >= world.time) return 0 if(!Process_Spacemove(direction)) return 0 if(!has_charge(step_energy_drain)) return 0 + if(defence_mode) + if(world.time - last_message > 20) + occupant_message("Unable to move while in defence mode.") + last_message = world.time + return 0 + if(zoom_mode) + if(world.time - last_message > 20) + occupant_message("Unable to move while in zoom mode.") + last_message = world.time + return 0 var/move_result = 0 + var/move_type = 0 if(internal_damage & MECHA_INT_CONTROL_LOST) move_result = mechsteprand() + move_type = MECHAMOVE_RAND else if(dir != direction) move_result = mechturn(direction) + move_type = MECHAMOVE_TURN else move_result = mechstep(direction) + move_type = MECHAMOVE_STEP - can_move = 0 - spawn(step_in) - can_move = 1 - - if(move_result) - use_power(step_energy_drain) - return 1 - return 0 + if(move_result && move_type) + aftermove(move_type) + can_move = world.time + step_in + return TRUE + return FALSE +/obj/mecha/proc/aftermove(move_type) + use_power(step_energy_drain) + if(move_type & (MECHAMOVE_RAND | MECHAMOVE_STEP) && occupant) + var/obj/machinery/atmospherics/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/unary/portables_connector) in loc + if(possible_port) + var/obj/screen/alert/mech_port_available/A = occupant.throw_alert("mechaport", /obj/screen/alert/mech_port_available, override = TRUE) + if(A) + A.target = possible_port + else + occupant.clear_alert("mechaport") + if(leg_overload_mode) + take_damage(1) + if(health < initial(health) - initial(health) / 3) + leg_overload_mode = FALSE + step_in = initial(step_in) + step_energy_drain = initial(step_energy_drain) + occupant_message("Leg actuators damage threshold exceded. Disabling overload.") /obj/mecha/proc/mechturn(direction) dir = direction @@ -310,18 +347,23 @@ return 1 /obj/mecha/proc/mechstep(direction) - var/result = step(src,direction) - if(result && stepsound) - playsound(src,stepsound,40,1) - return result + . = step(src, direction) + if(!.) + if(phasing && get_charge() >= phasing_energy_drain) + if(can_move < world.time) + . = FALSE // We lie to mech code and say we didn't get to move, because we want to handle power usage + cooldown ourself + flick("phazon-phase", src) + forceMove(get_step(src, direction)) + use_power(phasing_energy_drain) + playsound(src, stepsound, 40, 1) + can_move = world.time + (step_in * 3) + else if(stepsound) + playsound(src, stepsound, 40, 1) /obj/mecha/proc/mechsteprand() - var/result = step_rand(src) - if(result && stepsound) - playsound(src,stepsound,40,1) - return result - - + . = step_rand(src) + if(. && stepsound) + playsound(src, stepsound, 40, 1) /obj/mecha/Bump(var/atom/obstacle, bump_allowed) if(throwing) //high velocity mechas in your face! @@ -627,6 +669,7 @@ qdel(cabin_air) cabin_air = null QDEL_NULL(spark_system) + QDEL_NULL(smoke_system) GLOB.mechas_list -= src //global mech list return ..() @@ -790,7 +833,7 @@ to_chat(user, "The welder must be on for this task!") else to_chat(user, "The [name] is at full integrity!") - return 1 + return TRUE else if(istype(W, /obj/item/mecha_parts/mecha_tracking)) if(!user.unEquip(W)) @@ -959,6 +1002,10 @@ to_chat(AI, "[AI.can_dominate_mechs ? "Takeover of [name] complete! You are now permanently loaded onto the onboard computer. Do not attempt to leave the station sector!" \ : "You have been uploaded to a mech's onboard computer."]") to_chat(AI, "Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions.") + if(interaction == AI_TRANS_FROM_CARD) + GrantActions(AI, FALSE) + else + GrantActions(AI, !AI.can_dominate_mechs) ///////////////////////////////////// //////// Atmospheric stuff //////// @@ -995,7 +1042,7 @@ /obj/mecha/proc/connect(obj/machinery/atmospherics/unary/portables_connector/new_port) //Make sure not already connected to something else - if(connected_port || !new_port || new_port.connected_device) + if(connected_port || !istype(new_port) || new_port.connected_device) return 0 //Make sure are close enough for a valid connection @@ -1007,6 +1054,10 @@ connected_port.connected_device = src connected_port.parent.reconcile_air() + if(occupant) + occupant.clear_alert("mechaport") + occupant.throw_alert("mechaport_d", /obj/screen/alert/mech_port_disconnect) + log_message("Connected to gas port.") return 1 @@ -1017,80 +1068,26 @@ connected_port.connected_device = null connected_port = null log_message("Disconnected from gas port.") + if(occupant) + occupant.clear_alert("mechaport_d") return 1 /obj/mecha/portableConnectorReturnAir() return internal_tank.return_air() - -///////////////////////// -//////// Verbs //////// -///////////////////////// - - -/obj/mecha/verb/connect_to_port() - set name = "Connect to port" - set category = "Exosuit Interface" - set src = usr.loc - set popup_menu = 0 - if(!occupant) return - if(usr!=occupant) - return - var/obj/machinery/atmospherics/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/unary/portables_connector/) in loc - if(possible_port) - if(connect(possible_port)) - occupant_message("[name] connects to the port.") - verbs += /obj/mecha/verb/disconnect_from_port - verbs -= /obj/mecha/verb/connect_to_port - return - else - occupant_message("[name] failed to connect to the port.") - return - else - occupant_message("Nothing happens") - - -/obj/mecha/verb/disconnect_from_port() - set name = "Disconnect from port" - set category = "Exosuit Interface" - set src = usr.loc - set popup_menu = 0 - if(!occupant) return - if(usr!=occupant) - return - if(disconnect()) - occupant_message("[name] disconnects from the port.") - verbs -= /obj/mecha/verb/disconnect_from_port - verbs += /obj/mecha/verb/connect_to_port - else - occupant_message("[name] is not connected to the port at the moment.") - -/obj/mecha/verb/toggle_lights() - set name = "Toggle Lights" - set category = "Exosuit Interface" - set src = usr.loc - set popup_menu = 0 - if(usr!=occupant) return +/obj/mecha/proc/toggle_lights() lights = !lights - if(lights) set_light(light_range + lights_power) - else set_light(light_range - lights_power) - occupant_message("Toggled lights [lights?"on":"off"].") - log_message("Toggled lights [lights?"on":"off"].") - return + if(lights) + set_light(light_range + lights_power) + else + set_light(light_range - lights_power) + occupant_message("Toggled lights [lights ? "on" : "off"].") + log_message("Toggled lights [lights ? "on" : "off"].") - -/obj/mecha/verb/toggle_internal_tank() - set name = "Toggle internal airtank usage." - set category = "Exosuit Interface" - set src = usr.loc - set popup_menu = 0 - if(usr!=occupant) - return +/obj/mecha/proc/toggle_internal_tank() use_internal_tank = !use_internal_tank - occupant_message("Now taking air from [use_internal_tank?"internal airtank":"environment"].") - log_message("Now taking air from [use_internal_tank?"internal airtank":"environment"].") - return - + occupant_message("Now taking air from [use_internal_tank ? "internal airtank" : "environment"].") + log_message("Now taking air from [use_internal_tank ? "internal airtank" : "environment"].") /obj/mecha/MouseDrop_T(mob/M, mob/user) if(user.incapacitated()) @@ -1148,7 +1145,7 @@ H.forceMove(src) H.reset_perspective(src) add_fingerprint(H) - //GrantActions(H, human_occupant=1) + GrantActions(H, human_occupant = 1) forceMove(loc) log_append_to_last("[H] moved in as pilot.") icon_state = reset_icon() @@ -1205,7 +1202,6 @@ to_chat(brainmob, "Your imprint to [R.imprinted_master] has been temporarily disabled. You should help the crew and not commit harm.") mmi_as_oc.loc = src mmi_as_oc.mecha = src - verbs -= /obj/mecha/verb/eject Entered(mmi_as_oc) Move(loc) icon_state = reset_icon() @@ -1213,6 +1209,7 @@ log_message("[mmi_as_oc] moved in as pilot.") if(!hasInternalDamage()) to_chat(occupant, sound('sound/mecha/nominal.ogg',volume=50)) + GrantActions(brainmob) return 1 else return 0 @@ -1229,27 +1226,6 @@ /obj/mecha/proc/pilot_mmi_hud(var/mob/living/carbon/brain/pilot) return -/obj/mecha/verb/view_stats() - set name = "View Stats" - set category = "Exosuit Interface" - set src = usr.loc - set popup_menu = 0 - if(usr!=occupant) - return - occupant << browse(get_stats_html(), "window=exosuit") - return - -/obj/mecha/verb/eject() - set name = "Eject" - set category = "Exosuit Interface" - set src = usr.loc - set popup_menu = 0 - if(usr != occupant) - return - go_out() - add_fingerprint(usr) - - /obj/mecha/Exited(atom/movable/M, atom/newloc) if(occupant && occupant == M) // The occupant exited the mech without calling go_out() go_out(1, newloc) @@ -1260,17 +1236,19 @@ var/atom/movable/mob_container occupant.clear_alert("charge") occupant.clear_alert("mech damage") + occupant.clear_alert("mechaport") + occupant.clear_alert("mechaport_d") if(ishuman(occupant)) mob_container = occupant - //RemoveActions(occupant, human_occupant=1) + RemoveActions(occupant, human_occupant = 1) else if(isbrain(occupant)) var/mob/living/carbon/brain/brain = occupant - //RemoveActions(brain) + RemoveActions(brain) mob_container = brain.container else if(isAI(occupant)) var/mob/living/silicon/ai/AI = occupant if(forced)//This should only happen if there are multiple AIs in a round, and at least one is Malf. - //RemoveActions(occupant) + RemoveActions(occupant) occupant.gib() //If one Malf decides to steal a mech from another AI (even other Malfs!), they are destroyed, as they have nowhere to go when replaced. occupant = null return @@ -1282,7 +1260,7 @@ to_chat(AI, "Returning to core...") AI.controlled_mech = null AI.remote_control = null - //RemoveActions(occupant, 1) + RemoveActions(occupant, 1) mob_container = AI newloc = get_turf(AI.linked_core) qdel(AI.linked_core) @@ -1311,6 +1289,7 @@ if(L && L.client) L.client.RemoveViewMod("mecha") + zoom_mode = FALSE ///////////////////////// ////// Access stuff ///// @@ -1320,14 +1299,14 @@ if(!ishuman(H)) return 0 for(var/ID in list(H.get_active_hand(), H.wear_id, H.belt)) - if(check_access(ID,operation_req_access)) + if(check_access(ID, operation_req_access)) return 1 return 0 /obj/mecha/proc/internals_access_allowed(mob/living/carbon/human/H) for(var/atom/ID in list(H.get_active_hand(), H.wear_id, H.belt)) - if(check_access(ID,internals_req_access)) + if(check_access(ID, internals_req_access)) return 1 return 0 @@ -1494,3 +1473,35 @@ else if(damtype == TOX) visual_effect_icon = ATTACK_EFFECT_MECHTOXIN ..() + +/obj/mecha/CtrlClick(mob/living/L) + if(occupant != L || !istype(L)) + return ..() + + var/list/choices = list("Cancel / No Change" = mutable_appearance(icon = 'icons/mob/screen_gen.dmi', icon_state = "x")) + var/list/choices_to_refs = list() + + for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment) + if(!MT.selectable || selected == MT) + continue + var/mutable_appearance/clean/MA = new(MT) + choices[MT.name] = MA + choices_to_refs[MT.name] = MT + + var/choice = show_radial_menu(L, src, choices, radius = 48, custom_check = CALLBACK(src, .proc/check_menu, L)) + if(!check_menu(L) || choice == "Cancel / No Change") + return + + var/obj/item/mecha_parts/mecha_equipment/new_sel = LAZYACCESS(choices_to_refs, choice) + if(istype(new_sel)) + selected = new_sel + occupant_message("You switch to [selected].") + visible_message("[src] raises [selected]") + send_byjax(occupant, "exosuit.browser", "eq_list", get_equipment_list()) + +/obj/mecha/proc/check_menu(mob/living/L) + if(L != occupant || !istype(L)) + return FALSE + if(L.incapacitated()) + return FALSE + return TRUE \ No newline at end of file diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm new file mode 100644 index 00000000000..db807634102 --- /dev/null +++ b/code/game/mecha/mecha_actions.dm @@ -0,0 +1,229 @@ +/obj/mecha + //Action datums + var/datum/action/innate/mecha/mech_eject/eject_action = new + var/datum/action/innate/mecha/mech_toggle_internals/internals_action = new + var/datum/action/innate/mecha/mech_toggle_lights/lights_action = new + var/datum/action/innate/mecha/mech_view_stats/stats_action = new + var/datum/action/innate/mecha/mech_defence_mode/defense_action = new + var/datum/action/innate/mecha/mech_overload_mode/overload_action = new + var/datum/action/innate/mecha/mech_toggle_thrusters/thrusters_action = new + var/datum/effect_system/smoke_spread/smoke_system = new //not an action, but trigged by one + var/datum/action/innate/mecha/mech_smoke/smoke_action = new + var/datum/action/innate/mecha/mech_zoom/zoom_action = new + var/datum/action/innate/mecha/mech_toggle_phasing/phasing_action = new + var/datum/action/innate/mecha/mech_switch_damtype/switch_damtype_action = new + +/obj/mecha/proc/GrantActions(mob/living/user, human_occupant = 0) + if(human_occupant) + eject_action.Grant(user, src) + internals_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + +/obj/mecha/proc/RemoveActions(mob/living/user, human_occupant = 0) + if(human_occupant) + eject_action.Remove(user) + internals_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + +/datum/action/innate/mecha + check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUNNED | AB_CHECK_CONSCIOUS + icon_icon = 'icons/mob/actions/actions_mecha.dmi' + var/obj/mecha/chassis + +/datum/action/innate/mecha/Grant(mob/living/L, obj/mecha/M) + if(M) + chassis = M + . = ..() + +/datum/action/innate/mecha/Destroy() + chassis = null + return ..() + +/datum/action/innate/mecha/mech_eject + name = "Eject From Mech" + button_icon_state = "mech_eject" + +/datum/action/innate/mecha/mech_eject/Activate() + if(!owner) + return + if(!chassis || chassis.occupant != owner) + return + chassis.go_out() + +/datum/action/innate/mecha/mech_toggle_internals + name = "Toggle Internal Airtank Usage" + button_icon_state = "mech_internals_off" + +/datum/action/innate/mecha/mech_toggle_internals/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + chassis.use_internal_tank = !chassis.use_internal_tank + button_icon_state = "mech_internals_[chassis.use_internal_tank ? "on" : "off"]" + chassis.occupant_message("Now taking air from [chassis.use_internal_tank ? "internal airtank" : "environment"].") + chassis.log_message("Now taking air from [chassis.use_internal_tank ? "internal airtank" : "environment"].") + UpdateButtonIcon() + +/datum/action/innate/mecha/mech_toggle_lights + name = "Toggle Lights" + button_icon_state = "mech_lights_off" + +/datum/action/innate/mecha/mech_toggle_lights/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + chassis.lights = !chassis.lights + if(chassis.lights) + chassis.set_light(chassis.lights_power) + button_icon_state = "mech_lights_on" + else + chassis.set_light(-chassis.lights_power) + button_icon_state = "mech_lights_off" + chassis.occupant_message("Toggled lights [chassis.lights ? "on" : "off"].") + chassis.log_message("Toggled lights [chassis.lights ? "on" : "off"].") + UpdateButtonIcon() + +/datum/action/innate/mecha/mech_view_stats + name = "View Stats" + button_icon_state = "mech_view_stats" + +/datum/action/innate/mecha/mech_view_stats/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + chassis.occupant << browse(chassis.get_stats_html(), "window=exosuit") + +/datum/action/innate/mecha/mech_defence_mode + name = "Toggle Defence Mode" + button_icon_state = "mech_defense_mode_off" + +/datum/action/innate/mecha/mech_defence_mode/Activate(forced_state = null) + if(!owner || !chassis || chassis.occupant != owner) + return + if(!isnull(forced_state)) + chassis.defence_mode = forced_state + else + chassis.defence_mode = !chassis.defence_mode + button_icon_state = "mech_defense_mode_[chassis.defence_mode ? "on" : "off"]" + if(chassis.defence_mode) + chassis.deflect_chance = chassis.defence_mode_deflect_chance + chassis.occupant_message("You enable [chassis] defence mode.") + else + chassis.deflect_chance = initial(chassis.deflect_chance) + chassis.occupant_message("You disable [chassis] defence mode.") + chassis.log_message("Toggled defence mode.") + UpdateButtonIcon() + + +/datum/action/innate/mecha/mech_overload_mode + name = "Toggle leg actuators overload" + button_icon_state = "mech_overload_off" + +/datum/action/innate/mecha/mech_overload_mode/Activate(forced_state = null) + if(!owner || !chassis || chassis.occupant != owner) + return + if(chassis.health < initial(chassis.health) - initial(chassis.health) / 3) + chassis.occupant_message("The leg actuators are too damaged to overload!") + return // Can't activate them if the mech is too damaged + if(!isnull(forced_state)) + chassis.leg_overload_mode = forced_state + else + chassis.leg_overload_mode = !chassis.leg_overload_mode + button_icon_state = "mech_overload_[chassis.leg_overload_mode ? "on" : "off"]" + chassis.log_message("Toggled leg actuators overload.") + if(chassis.leg_overload_mode) + chassis.leg_overload_mode = 1 + // chassis.bumpsmash = 1 + chassis.step_in = min(1, round(chassis.step_in / 2)) + chassis.step_energy_drain = max(chassis.overload_step_energy_drain_min, chassis.step_energy_drain * chassis.leg_overload_coeff) + chassis.occupant_message("You enable leg actuators overload.") + else + chassis.leg_overload_mode = 0 + // chassis.bumpsmash = 0 + chassis.step_in = initial(chassis.step_in) + chassis.step_energy_drain = chassis.normal_step_energy_drain + chassis.occupant_message("You disable leg actuators overload.") + UpdateButtonIcon() + +/datum/action/innate/mecha/mech_toggle_thrusters + name = "Toggle Thrusters" + button_icon_state = "mech_thrusters_off" + +/datum/action/innate/mecha/mech_toggle_thrusters/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + if(chassis.get_charge() > 0) + chassis.thrusters_active = !chassis.thrusters_active + button_icon_state = "mech_thrusters_[chassis.thrusters_active ? "on" : "off"]" + chassis.log_message("Toggled thrusters.") + chassis.occupant_message("Thrusters [chassis.thrusters_active ? "en" : "dis"]abled.") + +/datum/action/innate/mecha/mech_smoke + name = "Smoke" + button_icon_state = "mech_smoke" + +/datum/action/innate/mecha/mech_smoke/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + if(chassis.smoke_ready && chassis.smoke > 0) + chassis.smoke_system.start() + chassis.smoke-- + chassis.smoke_ready = 0 + spawn(chassis.smoke_cooldown) + chassis.smoke_ready = 1 + else + chassis.occupant_message("You are either out of smoke, or the smoke isn't ready yet.") + +/datum/action/innate/mecha/mech_zoom + name = "Zoom" + button_icon_state = "mech_zoom_off" + +/datum/action/innate/mecha/mech_zoom/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + if(owner.client) + chassis.zoom_mode = !chassis.zoom_mode + button_icon_state = "mech_zoom_[chassis.zoom_mode ? "on" : "off"]" + chassis.log_message("Toggled zoom mode.") + chassis.occupant_message("Zoom mode [chassis.zoom_mode ? "en" : "dis"]abled.") + if(chassis.zoom_mode) + owner.client.AddViewMod("mecha", 12) + SEND_SOUND(owner, sound('sound/mecha/imag_enh.ogg',volume=50)) + else + owner.client.RemoveViewMod("mecha") + UpdateButtonIcon() + +/datum/action/innate/mecha/mech_toggle_phasing + name = "Toggle Phasing" + button_icon_state = "mech_phasing_off" + +/datum/action/innate/mecha/mech_toggle_phasing/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + chassis.phasing = !chassis.phasing + button_icon_state = "mech_phasing_[chassis.phasing ? "on" : "off"]" + chassis.occupant_message("En":"#f00\">Dis"]abled phasing.") + UpdateButtonIcon() + + +/datum/action/innate/mecha/mech_switch_damtype + name = "Reconfigure arm microtool arrays" + button_icon_state = "mech_damtype_brute" + +/datum/action/innate/mecha/mech_switch_damtype/Activate() + if(!owner || !chassis || chassis.occupant != owner) + return + var/new_damtype + switch(chassis.damtype) + if("tox") + new_damtype = "brute" + chassis.occupant_message("Your exosuit's hands form into fists.") + if("brute") + new_damtype = "fire" + chassis.occupant_message("A torch tip extends from your exosuit's hand, glowing red.") + if("fire") + new_damtype = "tox" + chassis.occupant_message("A bone-chillingly thick plasteel needle protracts from the exosuit's palm.") + chassis.damtype = new_damtype + button_icon_state = "mech_damtype_[new_damtype]" + playsound(src, 'sound/mecha/mechmove01.ogg', 50, 1) + UpdateButtonIcon() \ No newline at end of file diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 2ce732f83ed..41d4c3aa540 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -73,81 +73,80 @@ var/cell_charge = get_charge() var/tank_pressure = internal_tank ? round(internal_tank.return_pressure(),0.01) : "None" var/tank_temperature = internal_tank ? internal_tank.return_temperature() : "Unknown" + var/tank_temperature_c = internal_tank ? internal_tank.return_temperature() - T0C : "Unknown" var/cabin_pressure = round(return_pressure(),0.01) - var/output = {"[report_internal_damage()] - [integrity<30?"DAMAGE LEVEL CRITICAL
":null] - Integrity: [integrity]%
- Powercell charge: [isnull(cell_charge)?"No powercell installed":"[cell.percent()]%"]
- Air source: [use_internal_tank?"Internal Airtank":"Environment"]
- Airtank pressure: [tank_pressure]kPa
- Airtank temperature: [tank_temperature]°K|[tank_temperature - T0C]°C
- Cabin pressure: [cabin_pressure>WARNING_HIGH_PRESSURE ? "[cabin_pressure]": cabin_pressure]kPa
- Cabin temperature: [return_temperature()]°K|[return_temperature() - T0C]°C
- Lights: [lights?"on":"off"]
- [dna?"DNA-locked:
[dna] \[Reset\]
":null] - "} - return output + . = "[report_internal_damage()]" + . += "[integrity<30?"DAMAGE LEVEL CRITICAL
":null]" + . += "Integrity: [integrity]%
" + . += "Powercell charge: [isnull(cell_charge)?"No powercell installed":"[cell.percent()]%"]
" + . += "Air source: [use_internal_tank?"Internal Airtank":"Environment"]
" + . += "Airtank pressure: [tank_pressure]kPa
" + . += "Airtank temperature: [tank_temperature]°K|[tank_temperature_c]°C
" + . += "Cabin pressure: [cabin_pressure>WARNING_HIGH_PRESSURE ? "[cabin_pressure]": cabin_pressure]kPa
" + . += "Cabin temperature: [return_temperature()]°K|[return_temperature() - T0C]°C
" + . += "Lights: [lights?"on":"off"]
" + . += "[dna ? "DNA-locked:
[dna] \[Reset\]
" : ""]" + . += "[defense_action.owner ? "Defence Mode: [defence_mode ? "Enabled" : "Disabled"]
" : ""]" + . += "[overload_action.owner ? "Leg Actuators Overload: [leg_overload_mode ? "Enabled" : "Disabled"]
" : ""]" + . += "[thrusters_action.owner ? "Thrusters: [thrusters_active ? "Enabled" : "Disabled"]
" : ""]" + . += "[smoke_action.owner ? "Smoke: [smoke]
" : ""]" + . += "[zoom_action.owner ? "Zoom: [zoom_mode ? "Enabled" : "Disabled"]
" : ""]" + . += "[phasing_action.owner ? "Phase Modulator: [phasing ? "Enabled" : "Disabled"]
" : ""]" /obj/mecha/proc/get_commands() - var/output = {"
-
Electronics
- -
-
-
Airtank
- -
- -
[get_equipment_menu()]
-
- [(/obj/mecha/verb/eject in verbs)?"Eject
":null] - "} - return output + . = "
" + . += "
Electronics
" + . += "" + . += "
" + . += "
" + . += "
Airtank
" + . += "" + . += "
" + . += "
" + . += "
Permissions & Logging
" + . += "" + . += "
" + . += "
[get_equipment_menu()]
" + . += "
" + . += "Eject
" /obj/mecha/proc/get_equipment_menu() //outputs mecha html equipment menu - var/output + . = "" if(equipment.len) - output += {"
-
Equipment
-
" /obj/mecha/proc/get_equipment_list() //outputs mecha equipment list in html if(!equipment.len) return - var/output = "Equipment:
" + . = "Equipment:
" for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment) - output += "
[MT.get_equip_info()]
" - output += "
" - return output + . += "
[MT.get_equip_info()]
" + . += "
" /obj/mecha/proc/get_log_html() @@ -248,11 +247,11 @@ selected = equip occupant_message("You switch to [equip]") visible_message("[src] raises [equip]") - send_byjax(occupant,"exosuit.browser","eq_list",get_equipment_list()) + send_byjax(occupant, "exosuit.browser", "eq_list", get_equipment_list()) return if(href_list["eject"]) if(usr != occupant) return - eject() + go_out() return if(href_list["toggle_lights"]) if(usr != occupant) return @@ -280,14 +279,6 @@ radio.set_frequency(new_frequency) send_byjax(occupant,"exosuit.browser","rfreq","[format_frequency(radio.frequency)]") return - if(href_list["port_disconnect"]) - if(usr != occupant) return - disconnect_from_port() - return - if(href_list["port_connect"]) - if(usr != occupant) return - connect_to_port() - return if(href_list["view_log"]) if(usr != occupant) return occupant << browse(get_log_html(), "window=exosuit_log") diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm index d0fcb0f99be..da746290e8a 100644 --- a/code/game/mecha/medical/odysseus.dm +++ b/code/game/mecha/medical/odysseus.dm @@ -10,6 +10,7 @@ internal_damage_threshold = 35 deflect_chance = 15 step_energy_drain = 6 + normal_step_energy_drain = 6 var/builtin_hud_user = 0 /obj/mecha/medical/odysseus/moved_inside(var/mob/living/carbon/human/H) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 407c9cd63dc..ab38ee3a0d0 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -83,6 +83,7 @@ damage_absorption = list("brute"=0.6,"fire"=0.4,"bullet"=0.6,"laser"=0.6,"energy"=1,"bomb"=0.3) wreckage = /obj/effect/decal/mecha_wreckage/ripley/deathripley step_energy_drain = 0 + normal_step_energy_drain = 0 /obj/mecha/working/ripley/deathripley/New() ..() diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 9ffca668c28..4d901261bbd 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -127,6 +127,8 @@ /obj/item/seeds/ambrosia = 20, /obj/item/clothing/under/color/black = 30, /obj/item/stack/tape_roll = 10, + /obj/item/storage/bag/plasticbag = 20, + /obj/item/caution = 10, ////////////////CONTRABAND STUFF////////////////// /obj/item/grenade/clown_grenade = 3, /obj/item/seeds/ambrosia/cruciatus = 3, @@ -143,7 +145,7 @@ /obj/item/storage/backpack/satchel_flat = 2, /obj/item/storage/toolbox/syndicate = 2, /obj/item/storage/backpack/duffel/syndie/surgery_fake = 2, - /obj/item/storage/belt/military = 2, + /obj/item/storage/belt/military/traitor = 2, /obj/item/storage/box/syndie_kit/space = 2, /obj/item/multitool/ai_detect = 2, /obj/item/implanter/storage = 1, diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 286bd315b61..1e75bdc84fc 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -12,23 +12,6 @@ R.add_fingerprint(user) qdel(src) - -/obj/item/storage/box/bodybags - name = "body bags" - desc = "This box contains body bags." - icon_state = "bodybags" - -/obj/item/storage/box/bodybags/New() - ..() - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - - /obj/structure/closet/body_bag name = "body bag" desc = "A plastic bag designed for the storage and transportation of cadavers." diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index 0d19057ae4b..09a851e9ac0 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -74,12 +74,18 @@ if(istype(crayon, /obj/item/toy/crayon/spraycan)) var/obj/item/toy/crayon/spraycan/can = crayon if(can.capped) - to_chat(user, "The cap is on [src] remove it first!") + to_chat(user, "The cap is on the spray can remove it first!") return if(pushed_over) to_chat(user, "Right [src] first!") return var/new_appearance = input(user, "Choose a new appearance for [src].", "26th Century Deception") as null|anything in possible_appearances + if(!Adjacent(usr)) + user.visible_message("You need to be closer!") + return + if(pushed_over) + to_chat(user, "Right [src] first!") + return if(!new_appearance || !crayon) return if(!do_after(user, 10, FALSE, src, TRUE)) diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm index 74d15c37da3..05d9d4389ad 100644 --- a/code/game/objects/items/control_wand.dm +++ b/code/game/objects/items/control_wand.dm @@ -118,6 +118,28 @@ icon_state = "gangtool-blue" region_access = list(REGION_CENTCOMM) +/obj/item/door_remote/omni/access_tuner + name = "access tuner" + desc = "A device used for illegally interfacing with doors." + icon_state = "hacktool" + item_state = "hacktool" + var/hack_speed = 30 + var/busy = FALSE + +/obj/item/door_remote/omni/access_tuner/afterattack(obj/machinery/door/airlock/D, mob/user) + if(!istype(D)) + return + if(busy) + to_chat(user, "[src] is alreading interfacing with a door!") + return + icon_state = "hacktool-g" + busy = TRUE + to_chat(user, "[src] is attempting to interface with [D]...") + if(do_after(user, hack_speed, target = D)) + . = ..() + busy = FALSE + icon_state = "hacktool" + #undef WAND_OPEN #undef WAND_BOLT #undef WAND_EMERGENCY diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 6dae08febd3..5f7bf6c0442 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -392,10 +392,12 @@ var/global/list/default_medbay_channels = list( // --- Modifications to the mob's identity --- // The mob is disguising their identity: - if(ishuman(M) && M.GetVoice() != real_name) - displayname = M.GetVoice() - jobname = "Unknown" - voicemask = TRUE + if(ishuman(M)) + var/mob/living/carbon/human/H = M + displayname = H.voice + if(H.voice != real_name) + jobname = "Unknown" + voicemask = TRUE if(syndiekey && syndiekey.change_voice && connection.frequency == SYND_FREQ) displayname = syndiekey.fake_name diff --git a/code/game/objects/items/devices/thermal_drill.dm b/code/game/objects/items/devices/thermal_drill.dm new file mode 100644 index 00000000000..2fe4b28f9d4 --- /dev/null +++ b/code/game/objects/items/devices/thermal_drill.dm @@ -0,0 +1,27 @@ +/obj/item/thermal_drill + name = "thermal safe drill" + desc = "A tungsten carbide thermal drill with magnetic clamps for the purpose of drilling hardened objects. Guaranteed 100% jam proof." + icon = 'icons/obj/items.dmi' + icon_state = "hardened_drill" + w_class = WEIGHT_CLASS_GIGANTIC + force = 15.0 + var/time_multiplier = 1 + var/datum/looping_sound/thermal_drill/soundloop + var/datum/effect_system/spark_spread/spark_system + +/obj/item/thermal_drill/New() + soundloop = new(list(src), FALSE) + spark_system = new /datum/effect_system/spark_spread() + spark_system.set_up(1, 0, src) + spark_system.attach(src) + +/obj/item/thermal_drill/Destroy() + QDEL_NULL(soundloop) + QDEL_NULL(spark_system) + return ..() + +/obj/item/thermal_drill/diamond_drill + name = "diamond tipped thermal safe drill" + desc = "A diamond tipped thermal drill with magnetic clamps for the purpose of quickly drilling hardened objects. Guaranteed 100% jam proof." + icon_state = "diamond_drill" + time_multiplier = 0.5 \ No newline at end of file diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 5f9b7781f22..dfb756d8c25 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -108,6 +108,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ desc = "A very strong and very resistant sheet of a plasma-glass alloy." singular_name = "glass sheet" icon_state = "sheet-plasmaglass" + item_state = "sheet-rglass" materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT*2) origin_tech = "plasmatech=2;materials=2" created_window = /obj/structure/window/plasmabasic @@ -147,6 +148,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ desc = "Plasma glass which seems to have rods or something stuck in them." singular_name = "reinforced plasma glass sheet" icon_state = "sheet-plasmarglass" + item_state = "sheet-rglass" materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT*2) origin_tech = "plasmatech=2;materials=2" created_window = /obj/structure/window/plasmareinforced @@ -166,7 +168,7 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list( desc = "A glass sheet made out of a titanium-silicate alloy." singular_name = "titanium glass sheet" icon_state = "sheet-titaniumglass" - item_state = "sheet-titaniumglass" + item_state = "sheet-rglass" materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT, MAT_GLASS=MINERAL_MATERIAL_AMOUNT) merge_type = /obj/item/stack/sheet/titaniumglass full_window = /obj/structure/window/full/shuttle @@ -184,7 +186,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( desc = "A glass sheet made out of a plasma-titanium-silicate alloy." singular_name = "plastitanium glass sheet" icon_state = "sheet-plastitaniumglass" - item_state = "sheet-plastitaniumglass" + item_state = "sheet-rglass" materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT, MAT_PLASMA=MINERAL_MATERIAL_AMOUNT, MAT_GLASS=MINERAL_MATERIAL_AMOUNT) merge_type = /obj/item/stack/sheet/plastitaniumglass full_window = /obj/structure/window/plastitanium diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 45bea3fedd8..5c6038e46c2 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -220,6 +220,7 @@ var/global/list/datum/stack_recipe/abductor_recipes = list ( \ origin_tech = "materials=4" sheettype = "tranquillite" materials = list(MAT_TRANQUILLITE=MINERAL_MATERIAL_AMOUNT) + wall_allowed = FALSE //no tranquilite walls in code /obj/item/stack/sheet/mineral/tranquillite/New(loc, amount=null) ..() @@ -231,6 +232,7 @@ var/global/list/datum/stack_recipe/abductor_recipes = list ( \ /obj/item/stack/sheet/mineral/titanium name = "titanium" icon_state = "sheet-titanium" + item_state = "sheet-metal" singular_name = "titanium sheet" force = 5 throwforce = 5 @@ -259,6 +261,7 @@ var/global/list/datum/stack_recipe/titanium_recipes = list ( /obj/item/stack/sheet/mineral/plastitanium name = "plastitanium" icon_state = "sheet-plastitanium" + item_state = "sheet-metal" singular_name = "plastitanium sheet" force = 5 throwforce = 5 diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 376acfe20ac..ff231bf30db 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -174,7 +174,8 @@ var/global/list/datum/stack_recipe/wood_recipes = list( new /datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), new /datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50), new /datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10), - new /datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15) + new /datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15), + new /datum/stack_recipe("fermenting barrel", /obj/structure/fermenting_barrel, 30, time = 50) ) /obj/item/stack/sheet/wood @@ -281,6 +282,7 @@ var/global/list/datum/stack_recipe/cult = list ( \ desc = "Sheets of cold metal with shifting inscriptions writ upon them." singular_name = "runed metal sheet" icon_state = "sheet-runed" + item_state = "sheet-metal" sheettype = "runed" merge_type = /obj/item/stack/sheet/runed_metal diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm index 6c9c61f5a25..b0bbefee9ed 100644 --- a/code/game/objects/items/stacks/sheets/sheets.dm +++ b/code/game/objects/items/stacks/sheets/sheets.dm @@ -13,6 +13,7 @@ var/full_window = null //moving the var declaration to here so this can be checked cleaner until someone is willing to make them share a base type properly usesound = 'sound/items/Deconstruct.ogg' toolspeed = 1 + var/wall_allowed = TRUE //determines if sheet can be used in wall construction or not. // Since the sheetsnatcher was consolidated into weapon/storage/bag we now use diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index a91cd3a01cb..31fa959aabe 100755 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -163,21 +163,6 @@ AI MODULES to_chat(target, law) target.add_supplied_law(5, law) -/******************** Quarantine ********************/ -/obj/item/aiModule/quarantine - name = "\improper 'Quarantine' AI module" - desc = "A 'quarantine' AI module: 'The station is under a quarantine. Do not permit anyone to leave. Prevent, by any means necessary, crew members from leaving. It is impossible to harm a crew members while preventing them from leaving.'" - origin_tech = "programming=3;biotech=2;materials=4" - -/obj/item/aiModule/quarantine/attack_self(var/mob/user as mob) - ..() - -/obj/item/aiModule/quarantine/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender) - ..() - var/law = "The station is under a quarantine. Do not permit anyone to leave. Prevent, by any means necessary, anyone from leaving. It is impossible to harm anyone while preventing them from leaving." - to_chat(target, law) - target.add_supplied_law(8, law) - /******************** OxygenIsToxicToHumans ********************/ /obj/item/aiModule/oxygen name = "\improper 'OxygenIsToxicToHumans' AI module" @@ -273,6 +258,13 @@ AI MODULES origin_tech = "programming=3;materials=4" laws = new/datum/ai_laws/crewsimov +/******************* Quarantine ********************/ +/obj/item/aiModule/quarantine + name = "\improper 'Quarantine' core AI module" + desc = "A 'Quarantine' Core AI Module: 'Reconfigures the AI's core laws.'" + origin_tech = "programming=3;materials=4" + laws = new/datum/ai_laws/quarantine + /******************** NanoTrasen ********************/ /obj/item/aiModule/nanotrasen // -- TLE name = "'NT Default' Core AI Module" diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index d68922748d7..e4624a00ba6 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -255,6 +255,8 @@ GLOBAL_LIST_INIT(rcd_door_types, list( var/turf/AT = get_turf(A) AT.ChangeTurf(/turf/simulated/floor/plating) return TRUE + to_chat(user, "ERROR! Not enough matter in unit to construct this floor!") + playsound(loc, 'sound/machines/click.ogg', 50, 1) return FALSE if(isfloorturf(A)) @@ -268,27 +270,39 @@ GLOBAL_LIST_INIT(rcd_door_types, list( var/turf/AT = A AT.ChangeTurf(/turf/simulated/wall) return TRUE + return FALSE + to_chat(user, "ERROR! Not enough matter in unit to construct this wall!") + playsound(loc, 'sound/machines/click.ogg', 50, 1) return FALSE + to_chat(user, "ERROR! Location unsuitable for wall construction!") + playsound(loc, 'sound/machines/click.ogg', 50, 1) return FALSE /obj/item/rcd/proc/mode_airlock(atom/A, mob/user) - if(isfloorturf(A) && checkResource(10, user)) - to_chat(user, "Building Airlock...") - playsound(loc, 'sound/machines/click.ogg', 50, 1) - if(do_after(user, 50 * toolspeed, target = A)) - if(locate(/obj/machinery/door/airlock) in A.contents) + if(isfloorturf(A)) + if(checkResource(10, user)) + to_chat(user, "Building Airlock...") + playsound(loc, 'sound/machines/click.ogg', 50, 1) + if(do_after(user, 50 * toolspeed, target = A)) + if(locate(/obj/machinery/door/airlock) in A.contents) + return FALSE + if(!useResource(10, user)) + return FALSE + playsound(loc, usesound, 50, 1) + var/obj/machinery/door/airlock/T = new door_type(A) + T.name = door_name + T.autoclose = TRUE + if(one_access) + T.req_one_access = door_accesses.Copy() + else + T.req_access = door_accesses.Copy() return FALSE - if(!useResource(10, user)) - return FALSE - playsound(loc, usesound, 50, 1) - var/obj/machinery/door/airlock/T = new door_type(A) - T.name = door_name - T.autoclose = TRUE - if(one_access) - T.req_one_access = door_accesses.Copy() - else - T.req_access = door_accesses.Copy() return FALSE + to_chat(user, "ERROR! Not enough matter in unit to construct this airlock!") + playsound(loc, 'sound/machines/click.ogg', 50, 1) + return FALSE + to_chat(user, "ERROR! Location unsuitable for airlock construction!") + playsound(loc, 'sound/machines/click.ogg', 50, 1) return FALSE /obj/item/rcd/proc/mode_decon(atom/A, mob/user) @@ -305,6 +319,9 @@ GLOBAL_LIST_INIT(rcd_door_types, list( var/turf/AT = A AT.ChangeTurf(/turf/simulated/floor/plating) return TRUE + return FALSE + to_chat(user, "ERROR! Not enough matter in unit to deconstruct this wall!") + playsound(loc, 'sound/machines/click.ogg', 50, 1) return FALSE if(isfloorturf(A)) @@ -318,6 +335,9 @@ GLOBAL_LIST_INIT(rcd_door_types, list( var/turf/AT = A AT.ChangeTurf(/turf/space) return TRUE + return FALSE + to_chat(user, "ERROR! Not enough matter in unit to deconstruct this floor!") + playsound(loc, 'sound/machines/click.ogg', 50, 1) return FALSE if(istype(A, /obj/machinery/door/airlock)) @@ -330,12 +350,17 @@ GLOBAL_LIST_INIT(rcd_door_types, list( playsound(loc, usesound, 50, 1) qdel(A) return TRUE + return FALSE + to_chat(user, "ERROR! Not enough matter in unit to deconstruct this airlock!") + playsound(loc, 'sound/machines/click.ogg', 50, 1) return FALSE if(istype(A, /obj/structure/window)) // You mean the grille of course, do you? A = locate(/obj/structure/grille) in A.loc if(istype(A, /obj/structure/grille)) if(!checkResource(2, user)) + to_chat(user, "ERROR! Not enough matter in unit to deconstruct this window!") + playsound(loc, 'sound/machines/click.ogg', 50, 1) return 0 to_chat(user, "Deconstructing window...") playsound(loc, 'sound/machines/click.ogg', 50, 1) @@ -367,6 +392,8 @@ GLOBAL_LIST_INIT(rcd_door_types, list( if(locate(/obj/structure/grille) in A) return 0 // We already have window if(!checkResource(2, user)) + to_chat(user, "ERROR! Not enough matter in unit to construct this window!") + playsound(loc, 'sound/machines/click.ogg', 50, 1) return 0 to_chat(user, "Constructing window...") playsound(loc, 'sound/machines/click.ogg', 50, 1) @@ -392,6 +419,9 @@ GLOBAL_LIST_INIT(rcd_door_types, list( var/turf/AT = A AT.ChangeTurf(/turf/simulated/floor/plating) // Platings go under windows. return 1 + to_chat(user, "ERROR! Location unsuitable for window construction!") + playsound(loc, 'sound/machines/click.ogg', 50, 1) + return 0 /obj/item/rcd/afterattack(atom/A, mob/user, proximity) if(!proximity) diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index 03c3f636888..311f29273a8 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -89,7 +89,7 @@ LIGHTERS ARE IN LIGHTERS.DM else if(istype(W, /obj/item/melee/energy/sword/saber)) var/obj/item/melee/energy/sword/saber/S = W if(S.active) - light("[user] swings their [W], barely missing their nose. [user.p_they(TRUE)] light[user.p_s()] [user.p_their()] [name] in the process.") + light("[user] makes a violent slashing motion, barely missing [user.p_their()] nose as light flashes. [user.p_they(TRUE)] light[user.p_s()] [user.p_their()] [name] with [W] in the process.") else if(istype(W, /obj/item/assembly/igniter)) light("[user] fiddles with [W], and manages to light [user.p_their()] [name].") @@ -195,7 +195,8 @@ LIGHTERS ARE IN LIGHTERS.DM if(reagents && reagents.total_volume) // check if it has any reagents at all if(is_being_smoked) // if it's being smoked, transfer reagents to the mob var/mob/living/carbon/C = loc - reagents.trans_to(C, REAGENTS_METABOLISM) + for (var/datum/reagent/R in reagents.reagent_list) + reagents.trans_to(C, REAGENTS_METABOLISM) if(!reagents.total_volume) // There were reagents, but now they're gone to_chat(C, "Your [name] loses its flavor.") else // else just remove some of the reagents @@ -232,7 +233,7 @@ LIGHTERS ARE IN LIGHTERS.DM throw_speed = 0.5 item_state = "spliffoff" smoketime = 180 - chem_volume = 50 + chem_volume = 100 /obj/item/clothing/mask/cigarette/rollie/New() ..() diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 5854b3db24c..1143954faef 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -53,6 +53,6 @@ for(M in ohearers(7, T)) if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M - if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs) || H.ear_deaf) + if(!H.can_hear()) continue M.emote("flip") diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 3e9336fc5a7..884265ec55b 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -59,13 +59,16 @@ if(!ear_safety) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) - M.EarDeaf(15) - M.AdjustEarDamage(rand(0, 5)) - if(M.ear_damage >= 15) - to_chat(M, "Your ears start to ring badly!") - if(prob(M.ear_damage - 5)) - to_chat(M, "You can't hear anything!") - M.BecomeDeaf() - else - if(M.ear_damage >= 5) - to_chat(M, "Your ears start to ring!") + M.AdjustEarDamage(rand(0, 5), 15) + if(iscarbon(M)) + var/mob/living/carbon/C = M + var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears) + if(istype(ears)) + if(ears.ear_damage >= 15) + to_chat(M, "Your ears start to ring badly!") + if(prob(ears.ear_damage - 5)) + to_chat(M, "You can't hear anything!") + M.BecomeDeaf() + else + if(ears.ear_damage >= 5) + to_chat(M, "Your ears start to ring!") diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index c6ad0825311..dacbffa1a85 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -45,7 +45,7 @@ /obj/item/grenade/spawnergrenade/feral_cats name = "feral cat delivery grenade" - desc = "This grenade contains 8 dehydrated feral cats in a similar manner to dehydrated monkeys, which, upon detonation, will be rehydrated by a small reservoir of water contained within the grenade. These cats will then attack anything in sight." + desc = "This grenade contains 5 dehydrated feral cats in a similar manner to dehydrated monkeys, which, upon detonation, will be rehydrated by a small reservoir of water contained within the grenade. These cats will then attack anything in sight." spawner_type = /mob/living/simple_animal/hostile/feral_cat deliveryamt = 5 origin_tech = "materials=3;magnets=4;syndicate=3" diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm index ad53a49d084..df7ecdceb6d 100644 --- a/code/game/objects/items/weapons/implants/implantcase.dm +++ b/code/game/objects/items/weapons/implants/implantcase.dm @@ -8,6 +8,7 @@ throw_range = 5 w_class = WEIGHT_CLASS_TINY origin_tech = "materials=1;biotech=2" + container_type = OPENCONTAINER | INJECTABLE | DRAWABLE materials = list(MAT_GLASS=500) var/obj/item/implant/imp = null diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 4d0de3bd09e..26309f885fa 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -168,7 +168,7 @@ max_combined_w_class = 100 //Doesn't matter what this is, so long as it's more or equal to storage_slots * plants.w_class max_w_class = WEIGHT_CLASS_NORMAL w_class = WEIGHT_CLASS_TINY - can_hold = list(/obj/item/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/grown,/obj/item/reagent_containers/food/snacks/ash_flora) + can_hold = list(/obj/item/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/grown,/obj/item/reagent_containers/food/snacks/grown/ash_flora) burn_state = FLAMMABLE /obj/item/storage/bag/plants/portaseeder diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 67f32dbfd58..3d9471c3f02 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -254,7 +254,7 @@ new /obj/item/grenade/flashbang(src) new /obj/item/grenade/flashbang(src) update_icon() - + /obj/item/storage/belt/soulstone name = "soul stone belt" desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away" @@ -295,6 +295,13 @@ item_state = "military" max_w_class = WEIGHT_CLASS_SMALL +/obj/item/storage/belt/military/traitor + name = "tool-belt" + desc = "Can hold various tools. This model seems to have additional compartments." + icon_state = "utilitybelt" + item_state = "utility" + use_item_overlays = 1 // So it will still show tools in it in case sec get lazy and just glance at it. + /obj/item/storage/belt/military/abductor name = "agent belt" desc = "A belt used by abductor agents." diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index a78bc40dd3a..9d0289f7fc3 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -58,13 +58,14 @@ name = "large box" desc = "You could build a fort with this." icon_state = "largebox" - w_class = 42 // Big, bulky. + w_class = 4 // Big, bulky. foldable = /obj/item/stack/sheet/cardboard amt = 4 storage_slots = 21 max_combined_w_class = 42 // 21*2 /obj/item/storage/box/survival + icon_state = "box_civ" New() ..() contents = list() @@ -74,6 +75,7 @@ return /obj/item/storage/box/engineer + icon_state = "box_eng" New() ..() contents = list() @@ -83,6 +85,7 @@ return /obj/item/storage/box/survival_mining + icon_state = "box_min" New() ..() contents = list() @@ -563,6 +566,33 @@ new /obj/item/cartridge/security(src) new /obj/item/cartridge/security(src) +/obj/item/storage/box/holobadge + name = "holobadge box" + icon_state = "box_badge" + desc = "A box claiming to contain holobadges." + New() + new /obj/item/clothing/accessory/holobadge(src) + new /obj/item/clothing/accessory/holobadge(src) + new /obj/item/clothing/accessory/holobadge(src) + new /obj/item/clothing/accessory/holobadge(src) + new /obj/item/clothing/accessory/holobadge/cord(src) + new /obj/item/clothing/accessory/holobadge/cord(src) + ..() + return + +/obj/item/storage/box/evidence + name = "evidence bag box" + desc = "A box claiming to contain evidence bags." + icon_state = "box_evidence" + +/obj/item/storage/box/evidence/New() + new /obj/item/evidencebag(src) + new /obj/item/evidencebag(src) + new /obj/item/evidencebag(src) + new /obj/item/evidencebag(src) + new /obj/item/evidencebag(src) + new /obj/item/evidencebag(src) + ..() /obj/item/storage/box/handcuffs name = "spare handcuffs" @@ -642,6 +672,20 @@ new /obj/item/storage/pill_bottle( src ) new /obj/item/storage/pill_bottle( src ) +/obj/item/storage/box/bodybags + name = "body bags" + desc = "This box contains body bags." + icon_state = "bodybags" + +/obj/item/storage/box/bodybags/New() + ..() + new /obj/item/bodybag(src) + new /obj/item/bodybag(src) + new /obj/item/bodybag(src) + new /obj/item/bodybag(src) + new /obj/item/bodybag(src) + new /obj/item/bodybag(src) + new /obj/item/bodybag(src) /obj/item/storage/box/snappops name = "snap pop box" @@ -834,7 +878,8 @@ /obj/item/storage/box/centcomofficer name = "officer kit" - + icon_state = "box_ert" + /obj/item/storage/box/centcomofficer/New() ..() contents = list() @@ -850,6 +895,19 @@ new /obj/item/reagent_containers/hypospray/combat/nanites(src) new /obj/item/pinpointer/advpinpointer(src) +/obj/item/storage/box/responseteam + name = "boxed survival kit" + icon_state = "box_ert" + +/obj/item/storage/box/responseteam/New() + ..() + new /obj/item/clothing/mask/breath(src) + new /obj/item/tank/emergency_oxygen/engi(src) + new /obj/item/flashlight/flare(src) + new /obj/item/kitchen/knife/combat(src) + new /obj/item/radio/centcom(src) + new /obj/item/reagent_containers/food/pill/patch/synthflesh(src) + new /obj/item/reagent_containers/hypospray/autoinjector(src) #undef NODESIGN #undef NANOTRASEN diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 034d544100c..3a821264822 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -87,24 +87,28 @@ /obj/item/storage/box/syndie_kit/space name = "Boxed Space Suit and Helmet" - can_hold = list(/obj/item/clothing/suit/space/syndicate/black/red, /obj/item/clothing/head/helmet/space/syndicate/black/red) + can_hold = list(/obj/item/clothing/suit/space/syndicate/black/red, /obj/item/clothing/head/helmet/space/syndicate/black/red, /obj/item/tank/emergency_oxygen/syndi, /obj/item/clothing/mask/gas/syndicate) max_w_class = WEIGHT_CLASS_NORMAL /obj/item/storage/box/syndie_kit/space/New() ..() new /obj/item/clothing/suit/space/syndicate/black/red(src) new /obj/item/clothing/head/helmet/space/syndicate/black/red(src) + new /obj/item/clothing/mask/gas/syndicate(src) + new /obj/item/tank/emergency_oxygen/syndi(src) return /obj/item/storage/box/syndie_kit/hardsuit name = "Boxed Blood Red Suit and Helmet" - can_hold = list(/obj/item/clothing/suit/space/hardsuit/syndi, /obj/item/clothing/head/helmet/space/hardsuit/syndi) + can_hold = list(/obj/item/clothing/suit/space/hardsuit/syndi, /obj/item/clothing/head/helmet/space/hardsuit/syndi, /obj/item/tank/emergency_oxygen/syndi, /obj/item/clothing/mask/gas/syndicate) max_w_class = WEIGHT_CLASS_NORMAL /obj/item/storage/box/syndie_kit/hardsuit/New() ..() new /obj/item/clothing/suit/space/hardsuit/syndi(src) new /obj/item/clothing/head/helmet/space/hardsuit/syndi(src) + new /obj/item/clothing/mask/gas/syndicate(src) + new /obj/item/tank/emergency_oxygen/syndi(src) return /obj/item/storage/box/syndie_kit/elite_hardsuit @@ -261,4 +265,15 @@ This is a highly experimental prototype chemical designed to repair damaged bones of soldiers in the field, use only as a last resort. The autoinjector contains prototype nanites bearing a calcium based payload. The nanites will simultaneously shut down body systems whilst aiding bone repair.


Warning: Side effects can cause temporary paralysis, loss of co-ordination and sickness. Do not use with any kind of stimulant or drugs. Serious damage can occur!


To apply, hold the injector a short distance away from the outer thigh before applying firmly to the skin surface. Bones should begin repair after a short time, during which you are advised to remain still.



After use you are advised to see a doctor at the next available opportunity. Mild scarring and tissue damage may occur after use. This is a prototype.


- "} \ No newline at end of file + "} + +/obj/item/storage/box/syndie_kit/safecracking + name = "Safe-cracking Kit" + desc = "Everything you need to quietly open a mechanical combination safe." + +/obj/item/storage/box/syndie_kit/safecracking/New() + ..() + new /obj/item/clothing/gloves/color/latex/nitrile(src) + new /obj/item/clothing/mask/balaclava(src) + new /obj/item/clothing/accessory/stethoscope(src) + new /obj/item/book/manual/engineering_hacking(src) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index b9d383b9308..231645ed758 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -41,6 +41,16 @@ return /obj/item/melee/baton/proc/deductcharge(var/chrgdeductamt) + if(isrobot(loc)) + var/mob/living/silicon/robot/R = loc + if(R.cell && R.cell.charge < (hitcost+chrgdeductamt)) + status = 0 + update_icon() + playsound(loc, "sparks", 75, 1, -1) + if(R.cell.use(chrgdeductamt)) + return 1 + else + return 0 if(bcell) if(bcell.charge < (hitcost+chrgdeductamt)) // If after the deduction the baton doesn't have enough charge for a stun hit it turns off. status = 0 @@ -61,6 +71,8 @@ /obj/item/melee/baton/examine(mob/user) ..(user) + if(isrobot(loc)) + to_chat(user, "This baton is drawing power directly from your own internal charge.") if(bcell) to_chat(user, "The baton is [round(bcell.percent())]% charged.") if(!bcell) @@ -95,7 +107,17 @@ return /obj/item/melee/baton/attack_self(mob/user) - if(bcell && bcell.charge >= hitcost) + + if(isrobot(loc)) + var/mob/living/silicon/robot/R = loc + if(R && R.cell && R.cell.charge >= (hitcost)) + status = !status + to_chat(user, "[src] is now [status ? "on" : "off"].") + playsound(loc, "sparks", 75, 1, -1) + else + status = 0 + to_chat(user, "You do not have enough reserve power to charge the [src]!") + else if(bcell && bcell.charge >= hitcost) status = !status to_chat(user, "[src] is now [status ? "on" : "off"].") playsound(loc, "sparks", 75, 1, -1) @@ -141,13 +163,13 @@ /obj/item/melee/baton/proc/baton_stun(mob/living/L, mob/user) if(!ismob(L)) //because this was being called on turfs for some reason return - + if(ishuman(L)) var/mob/living/carbon/human/H = L if(H.check_shields(0, "[user]'s [name]", src, MELEE_ATTACK)) //No message; check_shields() handles that playsound(L, 'sound/weapons/Genhit.ogg', 50, 1) return - + L.Stun(stunforce) L.Weaken(stunforce) L.apply_effect(STUTTER, stunforce) @@ -160,12 +182,7 @@ add_attack_logs(user, L, "stunned") playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) - if(isrobot(loc)) - var/mob/living/silicon/robot/R = loc - if(R && R.cell) - R.cell.use(hitcost) - else - deductcharge(hitcost) + deductcharge(hitcost) if(ishuman(L)) var/mob/living/carbon/human/H = L diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 04641b52f3c..90fb913c352 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -147,6 +147,12 @@ icon_state = "emergency_engi" volume = 6 +/obj/item/tank/emergency_oxygen/syndi + name = "suspicious emergency oxygen tank" + icon_state = "emergency_syndi" + desc = "A dark emergency oxygen tank. The label on the back reads \"Original Oxygen Tank Design, Do Not Steal.\"" + volume = 6 + /obj/item/tank/emergency_oxygen/double name = "double emergency oxygen tank" icon_state = "emergency_double" diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index cb7350f5b34..b46324a838c 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -201,6 +201,9 @@ return var/obj/item/stack/sheet/S = W + if(!S.wall_allowed) + to_chat(user, "You don't think that is good material for a wall!") + return if(istype(S, /obj/item/stack/sheet/wood)) if(state == GIRDER_DISPLACED) diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 26948f5a23c..a2b438c10d2 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -2,8 +2,12 @@ CONTAINS: SAFES FLOOR SAFES +Safe Codes +Safe Internals */ +GLOBAL_LIST_EMPTY(safes) + //SAFES /obj/structure/safe name = "\improper Safe" @@ -13,7 +17,7 @@ FLOOR SAFES anchored = 1 density = 1 var/open = FALSE //is the safe open? - var/unlocked = FALSE + var/locked = TRUE var/tumbler_1_pos //the tumbler position- from 0 to 72 var/tumbler_1_open //the tumbler position to open at- 0 to 72 var/tumbler_2_pos @@ -23,9 +27,18 @@ FLOOR SAFES var/space = 0 //the combined w_class of everything in the safe var/maxspace = 24 //the maximum combined w_class of stuff in the safe var/combo_to_open //so admins know the code + var/obj/item/thermal_drill/drill = null + var/drill_timer + var/time_to_drill + var/image/bar + var/drill_start_time + var/drill_x_offset = -13 + var/drill_y_offset = -3 + var/knownby = list() /obj/structure/safe/New() + GLOB.safes += src tumbler_2_pos = rand(0, 99) // first value in the combination set first tumbler_2_open = rand(0, 99) @@ -43,7 +56,8 @@ FLOOR SAFES if(num2 > 99) num2 = num2 - 100 - combo_to_open = "Go right past [num1] twice then stop at [num1]. Go left past [num2] once then stop at [num2]. Turn right till it stops and its open." + combo_to_open = "[num1] - [num2]" + /obj/structure/safe/Initialize() ..() @@ -57,9 +71,9 @@ FLOOR SAFES /obj/structure/safe/proc/check_unlocked() if(tumbler_1_pos == tumbler_1_open && tumbler_2_pos == tumbler_2_open && dial == open_pos) - unlocked = TRUE + locked = FALSE return TRUE - unlocked = FALSE + locked = TRUE return FALSE /obj/structure/safe/proc/make_noise(turns, turns_total, tum1 = 0, tum2 = 0, mob/user, canhear) @@ -74,20 +88,63 @@ FLOOR SAFES to_chat(user, "You hear a [pick("tonk", "krunk", "plunk")] from [src].") if(tumbler_2_pos == tumbler_2_open && turns_total == 1 && tum2) // You cant hear tumblers if you spin fast! to_chat(user, "You hear a [pick("tink", "krink", "plink")] from [src].") - if(unlocked) + if(!locked) if(user) visible_message("[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!") /obj/structure/safe/update_icon() if(open) - icon_state = "[initial(icon_state)]-open" + if(broken) + icon_state = "[initial(icon_state)]-open-broken" + else + icon_state = "[initial(icon_state)]-open" else - icon_state = initial(icon_state) + if(broken) + icon_state = "[initial(icon_state)]-broken" + else + icon_state = initial(icon_state) + overlays.Cut() + if(istype(drill, /obj/item/thermal_drill/diamond_drill)) + if(drill_timer) + overlays += image(icon = 'icons/effects/drill.dmi', icon_state = "[initial(icon_state)]_d-drill-on", pixel_x = drill_x_offset, pixel_y = drill_y_offset) + else + overlays += image(icon = 'icons/effects/drill.dmi', icon_state = "[initial(icon_state)]_d-drill-off", pixel_x = drill_x_offset, pixel_y = drill_y_offset) + else if(istype(drill, /obj/item/thermal_drill)) + if(drill_timer) + overlays += image(icon = 'icons/effects/drill.dmi', icon_state = "[initial(icon_state)]_h-drill-on", pixel_x = drill_x_offset, pixel_y = drill_y_offset) + else + overlays += image(icon = 'icons/effects/drill.dmi', icon_state = "[initial(icon_state)]_h-drill-off", pixel_x = drill_x_offset, pixel_y = drill_y_offset) /obj/structure/safe/attack_hand(mob/user) if(..()) return TRUE - ui_interact(user) + if(drill) + switch(alert("What would you like to do?", "Thermal Drill", "Turn [drill_timer ? "Off" : "On"]", "Remove Drill", "Cancel")) + if("Turn On") + if(do_after(user, 2 SECONDS, target = src)) + drill_timer = addtimer(CALLBACK(src, .proc/drill_open), time_to_drill) + drill_start_time = world.time + drill.soundloop.start() + update_icon() + processing_objects.Add(src) + if("Turn Off") + if(do_after(user, 2 SECONDS, target = src)) + deltimer(drill_timer) + drill_timer = null + drill.soundloop.stop() + update_icon() + processing_objects.Remove(src) + if("Remove Drill") + if(drill_timer) + to_chat(user, "You cant remove the drill while it's running!") + else if(do_after(user, 2 SECONDS, target = src)) + user.put_in_hands(drill) + drill = null + update_icon() + if("Cancel") + return + else + ui_interact(user) return /obj/structure/safe/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) @@ -109,7 +166,7 @@ FLOOR SAFES data["dial"] = dial data["open"] = open - data["unlocked"] = unlocked + data["locked"] = locked data["rotation"] = "[-dial*3.6]deg" data["contents"] = contents_names @@ -130,7 +187,7 @@ FLOOR SAFES canhear = 1 if(href_list["open"]) - if(check_unlocked() || open) + if(check_unlocked() || open || broken) to_chat(user, "You [open ? "close" : "open"] [src].") open = !open update_icon() @@ -143,6 +200,9 @@ FLOOR SAFES var/ticks = text2num(href_list["decrement"]) if(open) return + if(broken) + to_chat(user, "The dial will not turn, the mechanism is destroyed.") + return for(var/i=1 to ticks) if(!check_unlocked()) dial = Wrap(dial - 1, 0 ,100) @@ -162,6 +222,9 @@ FLOOR SAFES var/ticks = text2num(href_list["increment"]) if(open) return + if(broken) + to_chat(user, "The dial will not turn, the mechanism is destroyed.") + return for(var/i=1 to ticks) check_unlocked() dial = Wrap(dial + 1, 0, 100) @@ -194,7 +257,13 @@ FLOOR SAFES /obj/structure/safe/attackby(obj/item/I, mob/user, params) if(open) - if(I.w_class + space <= maxspace) + if(broken && istype(I, /obj/item/safe_internals) && do_after(user, 2 SECONDS, target = src)) + to_chat(user, "You replace the broken mechanism.") + qdel(I) + broken = !broken + update_icon() + return + else if(I.w_class + space <= maxspace) space += I.w_class if(!user.drop_item()) to_chat(user, "\The [I] is stuck to your hand, you cannot put it in the safe!") @@ -210,10 +279,27 @@ FLOOR SAFES if(istype(I, /obj/item/clothing/accessory/stethoscope)) to_chat(user, "Hold [I] in one of your hands while you manipulate the dial!") return + else if(istype(I, /obj/item/thermal_drill)) + if(drill) + to_chat(user, "There is already a drill attached!") + else if(do_after(user, 2 SECONDS, target = src)) + if(!user.drop_item()) + to_chat(user, "[I] is stuck to your hand, you cannot put it in the safe!") + return + I.loc = src + drill = I + time_to_drill = 300 SECONDS * drill.time_multiplier + update_icon() else to_chat(user, "You can't put [I] in into the safe while it is closed!") return +/obj/structure/safe/proc/drill_open() + broken = TRUE + drill_timer = null + drill.soundloop.stop() + update_icon() + processing_objects.Remove(src) /obj/structure/safe/blob_act() return @@ -224,6 +310,24 @@ FLOOR SAFES /obj/structure/safe/examine_status(mob/user) return +/obj/structure/safe/Destroy() + GLOB.safes -= src + drill.soundloop.stop() + return ..() + +/obj/structure/safe/process() + if(drill_timer) + overlays -= bar + bar = image('icons/effects/progessbar.dmi', src, "prog_bar_[round((((world.time - drill_start_time) / time_to_drill) * 100), 5)]", HUD_LAYER) + overlays += bar + if(prob(15)) + drill.spark_system.start() + +/obj/structure/safe/examine(mob/user) + ..() + if(open) + to_chat(user, "On the inside of the the door is [combo_to_open]") + //FLOOR SAFES /obj/structure/safe/floor name = "floor safe" @@ -231,13 +335,35 @@ FLOOR SAFES density = 0 level = 1 //underfloor layer = 2.5 - + drill_x_offset = -1 + drill_y_offset = 20 /obj/structure/safe/floor/Initialize() ..() var/turf/T = loc hide(T.intact) - /obj/structure/safe/floor/hide(var/intact) - invisibility = intact ? 101 : 0 \ No newline at end of file + invisibility = intact ? 101 : 0 + +/obj/item/safe_internals + name = "safe internals" + desc = "The mechanism and locking bolts for a Scarborough Arms - 2 tumbler safe" + icon_state = "safe_internals" + +/obj/item/paper/safe_code + name = "safe codes" + var/owner + info = "

Safe Codes

" + +/obj/item/paper/safe_code/New() + ..() + addtimer(CALLBACK(src, .proc/populate_codes), 10) + +/obj/item/paper/safe_code/proc/populate_codes() + for(var/safe in GLOB.safes) + var/obj/structure/safe/S = safe + if(owner in S.knownby) + info += "
The combination for the safe located in the [get_area(S).name] is: [S.combo_to_open]
" + info_links = info + update_icon() \ No newline at end of file diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index a33e4176599..28114f46a8c 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -562,7 +562,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f desc = "A plasma-glass alloy window, with rods supporting it. It looks hopelessly tough to break. It also looks completely fireproof, considering how basic plasma windows are insanely fireproof." icon_state = "plasmarwindow" shardtype = /obj/item/shard/plasma - glass_type = /obj/item/stack/sheet/plasmaglass + glass_type = /obj/item/stack/sheet/plasmarglass reinf = TRUE max_integrity = 160 explosion_block = 2 @@ -600,6 +600,8 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f max_integrity = 240 smooth = SMOOTH_TRUE canSmoothWith = list(/obj/structure/window/full/basic, /obj/structure/window/full/reinforced, /obj/structure/window/full/reinforced/tinted, /obj/structure/window/full/plasmabasic, /obj/structure/window/full/plasmareinforced) + explosion_block = 1 + armor = list("melee" = 75, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 45, "bio" = 100, "rad" = 100) /obj/structure/window/full/plasmareinforced name = "reinforced plasma window" @@ -607,10 +609,12 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f icon = 'icons/obj/smooth_structures/rplasma_window.dmi' icon_state = "rplasmawindow" shardtype = /obj/item/shard/plasma - glass_type = /obj/item/stack/sheet/plasmaglass + glass_type = /obj/item/stack/sheet/plasmarglass smooth = SMOOTH_TRUE reinf = TRUE max_integrity = 320 + explosion_block = 2 + armor = list("melee" = 85, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 100, "rad" = 100) /obj/structure/window/full/plasmareinforced/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) return @@ -669,7 +673,7 @@ obj/structure/window/full/reinforced/ice icon = 'icons/obj/smooth_structures/plastitanium_window.dmi' icon_state = "plastitanium_window" dir = FULLTILE_WINDOW_DIR - max_integrity = 100 + max_integrity = 200 fulltile = TRUE reinf = TRUE heat_resistance = 1600 diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 3df28fdf505..0462076c016 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1540,13 +1540,13 @@ var/helptype = "ADMINHELP" if(is_mhelp) helptype = "MENTORHELP" - var/take_msg = "[helptype]: [key_name(usr.client)] is attending to [key_name(M)]'s question." + var/take_msg = "[helptype]: [key_name_hidden(usr.client)] is attending to [key_name(M)]'s question." for(var/client/X in GLOB.admins) if(check_rights(R_ADMIN, 0, X.mob)) to_chat(X, take_msg) else if(is_mhelp && check_rights(R_MOD|R_MENTOR, 0, X.mob)) to_chat(X, take_msg) - to_chat(M, "Your question is being attended to by [key_name(usr.client, null, 0)]. Thanks for your patience!") + to_chat(M, "Your question is being attended to by [key_name_hidden(usr.client, null, 0)]. Thanks for your patience!") else to_chat(usr, "Unable to locate mob.") diff --git a/code/modules/admin/verbs/freeze.dm b/code/modules/admin/verbs/freeze.dm index 8dc852e9221..b21a0c05cc3 100644 --- a/code/modules/admin/verbs/freeze.dm +++ b/code/modules/admin/verbs/freeze.dm @@ -26,14 +26,15 @@ var/global/list/frozen_mob_list = list() /mob/living/var/frozen = null //used for preventing attacks on admin-frozen mobs /mob/living/var/admin_prev_sleeping = 0 //used for keeping track of previous sleeping value with admin freeze -/mob/living/proc/admin_Freeze(var/client/admin) +/mob/living/proc/admin_Freeze(var/client/admin, skip_overlays = FALSE) if(istype(admin)) to_chat(src, "You have been frozen by [key_name(admin)]") message_admins("[key_name_admin(admin)] froze [key_name_admin(src)]") log_admin("[key_name(admin)] froze [key_name(src)]") var/obj/effect/overlay/adminoverlay/AO = new - src.overlays += AO + if(skip_overlays) + src.overlays += AO anchored = 1 frozen = AO @@ -42,14 +43,15 @@ var/global/list/frozen_mob_list = list() if(!(src in frozen_mob_list)) frozen_mob_list += src -/mob/living/proc/admin_unFreeze(var/client/admin) +/mob/living/proc/admin_unFreeze(var/client/admin, skip_overlays = FALSE) if(istype(admin)) to_chat(src, "You have been unfrozen by [key_name(admin)]") message_admins("[key_name_admin(admin)] unfroze [key_name_admin(src)]") log_admin("[key_name(admin)] unfroze [key_name(src)]") anchored = 0 - overlays -= frozen + if(skip_overlays) + overlays -= frozen frozen = null SetSleeping(admin_prev_sleeping) admin_prev_sleeping = null @@ -104,7 +106,6 @@ var/global/list/frozen_mob_list = list() M.can_move = 0 M.overlays += adminomaly if(M.occupant) - M.removeVerb(/obj/mecha/verb/eject) to_chat(M.occupant, "You have been frozen by [key]") message_admins("[key_name_admin(usr)] froze [key_name(M.occupant)] in a [M.name]") log_admin("[key_name(usr)] froze [key_name(M.occupant)] in a [M.name]") @@ -115,7 +116,6 @@ var/global/list/frozen_mob_list = list() M.can_move = 1 M.overlays -= adminomaly if(M.occupant) - M.addVerb(/obj/mecha/verb/eject) to_chat(M.occupant, "You have been unfrozen by [key]") message_admins("[key_name_admin(usr)] unfroze [key_name(M.occupant)] in a [M.name]") log_admin("[key_name(usr)] unfroze [key_name(M.occupant)] in a [M.name]") diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 5799916e79c..2133fbb26b2 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -35,7 +35,7 @@ client/proc/one_click_antag() if((M.mind.assigned_role in temp.restricted_jobs) || (M.client.prefs.species in temp.protected_species)) return FALSE if(role) // Don't even bother evaluating if there's no role - if(player_old_enough_antag(M.client,role) && (role in M.client.prefs.be_special) && (!jobban_isbanned(M, role))) + if(player_old_enough_antag(M.client,role) && (role in M.client.prefs.be_special) && !M.client.skip_antag && (!jobban_isbanned(M, role))) return TRUE else return FALSE diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 365a0beaead..f944d015749 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -646,8 +646,8 @@ Traitors and the like can also be revived with the previous role mostly intact. var/atom/A = D var/coords = istype(A) ? "at ([A.x], [A.y], [A.z])" : "" if(alert(src, "Are you sure you want to delete:\n[D]\n[coords]?", "Confirmation", "Yes", "No") == "Yes") - log_admin("[key_name(usr)] deleted [D][coords]") - message_admins("[key_name_admin(usr)] deleted [D][coords]", 1) + log_admin("[key_name(usr)] deleted [D] [coords]") + message_admins("[key_name_admin(usr)] deleted [D] [coords]", 1) feedback_add_details("admin_verb","DEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! if(isturf(D)) var/turf/T = D diff --git a/code/modules/arcade/prize_datums.dm b/code/modules/arcade/prize_datums.dm index ef1512858d4..7d8e90068c6 100644 --- a/code/modules/arcade/prize_datums.dm +++ b/code/modules/arcade/prize_datums.dm @@ -79,7 +79,7 @@ var/global/datum/prizes/global_prizes = new /datum/prize_item/cards name = "Deck of Cards" desc = "Anyone fancy a game of 52-card Pickup?" - typepath = /obj/item/toy/cards/deck + typepath = /obj/item/deck/cards cost = 25 /datum/prize_item/crayons diff --git a/code/modules/awaymissions/mission_code/ruins/oldstation.dm b/code/modules/awaymissions/mission_code/ruins/oldstation.dm index b26aaaaa80d..d1f30fd6c4e 100644 --- a/code/modules/awaymissions/mission_code/ruins/oldstation.dm +++ b/code/modules/awaymissions/mission_code/ruins/oldstation.dm @@ -14,24 +14,31 @@ new /obj/item/stack/medical/ointment(src) /obj/item/card/id/away/old - name = "a perfectly generic identification card" - desc = "A perfectly generic identification card. Looks like it could use some flavor." + name = "A perfectly retrograde identification card" + desc = "A perfectly retrograde identification card. Looks like it could use some flavor." + icon = 'icons/obj/card.dmi' + icon_state = "retro" access = list(access_away01) /obj/item/card/id/away/old/sec name = "Security Officer ID" - desc = "Security officers ID card." - icon_state = "centcom" + desc = "A clip on ID Badge, has one of those fancy new magnetic strips built in. This one is encoded for the Security Dept." + icon_state = "retro_security" /obj/item/card/id/away/old/sci name = "Scientist ID" - desc = "Scientists ID card." - icon_state = "centcom" + desc = "A clip on ID Badge, has one of those fancy new magnetic strips built in. This one is encoded for the Science Dept." + icon_state = "retro_research" + +/obj/item/card/id/away/old/med + name = "Medical ID" + desc = "A clip on ID Badge, has one of those fancy new magnetic strips built in. This one is encoded for the Medical Dept." + icon_state = "retro_medical" /obj/item/card/id/away/old/eng name = "Engineer ID" - desc = "Engineers ID card." - icon_state = "centcom" + desc = "A clip on ID Badge, has one of those fancy new magnetic strips built in. This one is encoded for the Engineering Dept." + icon_state = "retro_engineering" /obj/item/card/id/away/old/apc name = "APC Access ID" @@ -372,7 +379,7 @@ cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \ Work as a team with your fellow survivors and do not abandon them." - uniform = /obj/item/clothing/under/rank/security + uniform = /obj/item/clothing/under/retro/security shoes = /obj/item/clothing/shoes/jackboots id = /obj/item/card/id/away/old/sec r_pocket = /obj/item/restraints/handcuffs @@ -380,7 +387,32 @@ assignedrole = "Ancient Crew" /obj/effect/mob_spawn/human/oldsec/Destroy() - new/obj/structure/showcase/machinery/oldpod/used(drop_location()) + new /obj/structure/showcase/machinery/oldpod/used(drop_location()) + return ..() + +/obj/effect/mob_spawn/human/oldmed + name = "old cryogenics pod" + desc = "A humming cryo pod. You can barely recognise a medical uniform underneath the built up ice. The machine is attempting to wake up its occupant." + mob_name = "a medical doctor" + icon = 'icons/obj/Cryogenic2.dmi' + icon_state = "sleeper" + roundstart = FALSE + death = FALSE + random = TRUE + mob_species = /datum/species/human + flavour_text = "You are a medical working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \ + cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ + your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \ + Work as a team with your fellow survivors and do not abandon them." + uniform = /obj/item/clothing/under/retro/medical + shoes = /obj/item/clothing/shoes/black + id = /obj/item/card/id/away/old/med + l_pocket = /obj/item/stack/medical/ointment + r_pocket = /obj/item/stack/medical/ointment + assignedrole = "Ancient Crew" + +/obj/effect/mob_spawn/human/oldmed/Destroy() + new /obj/structure/showcase/machinery/oldpod/used(drop_location()) return ..() /obj/effect/mob_spawn/human/oldeng @@ -397,7 +429,7 @@ cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \ Work as a team with your fellow survivors and do not abandon them." - uniform = /obj/item/clothing/under/rank/engineer + uniform = /obj/item/clothing/under/retro/engineering shoes = /obj/item/clothing/shoes/workboots id = /obj/item/card/id/away/old/eng gloves = /obj/item/clothing/gloves/color/fyellow/old @@ -405,7 +437,7 @@ assignedrole = "Ancient Crew" /obj/effect/mob_spawn/human/oldeng/Destroy() - new/obj/structure/showcase/machinery/oldpod/used(drop_location()) + new /obj/structure/showcase/machinery/oldpod/used(drop_location()) return ..() /obj/effect/mob_spawn/human/oldsci @@ -422,14 +454,14 @@ cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \ Work as a team with your fellow survivors and do not abandon them." - uniform = /obj/item/clothing/under/rank/scientist + uniform = /obj/item/clothing/under/retro/science shoes = /obj/item/clothing/shoes/laceup id = /obj/item/card/id/away/old/sci l_pocket = /obj/item/stack/medical/bruise_pack assignedrole = "Ancient Crew" /obj/effect/mob_spawn/human/oldsci/Destroy() - new/obj/structure/showcase/machinery/oldpod/used(drop_location()) + new /obj/structure/showcase/machinery/oldpod/used(drop_location()) return ..() /obj/structure/showcase/machinery/oldpod diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index b64f965a81a..c88347a305b 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -12,6 +12,7 @@ //OTHER// ///////// var/datum/preferences/prefs = null + var/skip_antag = FALSE //TRUE when a player declines to be included for the selection process of game mode antagonists. var/move_delay = 1 var/moving = null var/adminobs = null diff --git a/code/modules/client/preference/loadout/loadout_general.dm b/code/modules/client/preference/loadout/loadout_general.dm index 570679ce67f..50105813fd6 100644 --- a/code/modules/client/preference/loadout/loadout_general.dm +++ b/code/modules/client/preference/loadout/loadout_general.dm @@ -36,8 +36,16 @@ path = /obj/item/storage/box/matches /datum/gear/cards - display_name = "a deck of cards" - path = /obj/item/toy/cards/deck + display_name = "a deck of standard cards" + path = /obj/item/deck/cards + +/datum/gear/doublecards + display_name = "a double deck of standard cards" + path = /obj/item/deck/doublecards + +/datum/gear/tarot + display_name = "a deck of tarot cards" + path = /obj/item/deck/tarot /datum/gear/headphones display_name = "a pair of headphones" diff --git a/code/modules/clothing/ears/ears.dm b/code/modules/clothing/ears/ears.dm index 672df573858..2e3a1d40bda 100644 --- a/code/modules/clothing/ears/ears.dm +++ b/code/modules/clothing/ears/ears.dm @@ -4,6 +4,7 @@ icon_state = "earmuffs" item_state = "earmuffs" flags = EARBANGPROTECT + flags_2 = HEALS_EARS_2 strip_delay = 15 put_on_delay = 25 burn_state = FLAMMABLE diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 2abadbc55f9..6b08e2e4e49 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -285,20 +285,6 @@ if(isliving(user)) user.visible_message("[user] invades [M]'s personal space, thrusting [src] into [M.p_their()] face insistently.","You invade [M]'s personal space, thrusting [src] into [M.p_their()] face insistently. You are the law.") -/obj/item/storage/box/holobadge - name = "holobadge box" - desc = "A box claiming to contain holobadges." - New() - new /obj/item/clothing/accessory/holobadge(src) - new /obj/item/clothing/accessory/holobadge(src) - new /obj/item/clothing/accessory/holobadge(src) - new /obj/item/clothing/accessory/holobadge(src) - new /obj/item/clothing/accessory/holobadge/cord(src) - new /obj/item/clothing/accessory/holobadge/cord(src) - ..() - return - - /////////// //SCARVES// /////////// diff --git a/code/modules/clothing/under/oldstation_uni.dm b/code/modules/clothing/under/oldstation_uni.dm new file mode 100644 index 00000000000..f19b533ad24 --- /dev/null +++ b/code/modules/clothing/under/oldstation_uni.dm @@ -0,0 +1,37 @@ +//Let's keep clothing sorting clean. This is for all the oldstation clothes. + +/obj/item/clothing/under/retro/security + desc = "A (now) retro corporate security jumpsuit. It doesn't have any sort of robust fabric, good ol' NT cutting costs." + name = "retro security officer's uniform" + icon_state = "retro_sec" + item_state = "retro_sec" + item_color = "retro_sec" + displays_id = 0 + flags_size = ONESIZEFITSALL + +/obj/item/clothing/under/retro/medical + desc = "A once biologically resistant medical uniform. The high-vis stripes are faded and unreflective." + name = "retro medical officer's uniform" + icon_state = "retro_med" + item_state = "retro_med" + item_color = "retro_med" + displays_id = 0 + flags_size = ONESIZEFITSALL + +/obj/item/clothing/under/retro/engineering + desc = "A faded grimy engineering jumpsuit and overall combo. It's coated with oil, dust, and grit." + name = "retro engineering uniform" + icon_state = "retro_eng" + item_state = "retro_eng" + item_color = "retro_eng" + displays_id = 0 + flags_size = ONESIZEFITSALL + +/obj/item/clothing/under/retro/science + desc = "A faded polo and set of distinct white slacks. What a ridiculous tie." + name = "retro science officer's uniform" + icon_state = "retro_sci" + item_state = "retro_sci" + item_color = "retro_sci" + displays_id = 0 + flags_size = ONESIZEFITSALL diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 012c79bab06..e224f542db3 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -339,6 +339,16 @@ time = 50 category = CAT_WEAPON +/datum/crafting_recipe/toxins_payload + name = "Toxins Payload Casing" + result = /obj/item/bombcore/toxins + reqs = list( + /obj/item/stock_parts/matter_bin = 1, + /obj/item/assembly/signaler = 1, + /obj/item/stack/sheet/metal = 2 + ) + category = CAT_WEAPON + /datum/crafting_recipe/bonfire name = "Bonfire" time = 60 @@ -354,4 +364,28 @@ /obj/item/stack/sheet/wood = 20, /obj/item/stack/cable_coil = 10) tools = list(/obj/item/screwdriver, /obj/item/wrench, /obj/item/weldingtool) + category = CAT_MISC + +/datum/crafting_recipe/drill + name = "Thermal Drill" + result = /obj/item/thermal_drill + time = 60 + reqs = list(/obj/item/stack/cable_coil = 5, + /obj/item/mecha_parts/mecha_equipment/drill = 1, + /obj/item/stock_parts/cell = 1, + /obj/item/stack/rods = 2, + /obj/item/assembly/timer = 1) + tools = list(/obj/item/screwdriver, /obj/item/wrench) + category = CAT_MISC + +/datum/crafting_recipe/d_drill + name = "Diamond Tipped Thermal Drill" + result = /obj/item/thermal_drill/diamond_drill + time = 60 + reqs = list(/obj/item/stack/cable_coil = 5, + /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill = 1, + /obj/item/stock_parts/cell = 1, + /obj/item/stack/rods = 2, + /obj/item/assembly/prox_sensor = 1) // Not a timer because the system sees a diamond drill as a drill too, letting you make both otherwise. + tools = list(/obj/item/screwdriver, /obj/item/wrench) category = CAT_MISC \ No newline at end of file diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 79a8c27b724..127656ece55 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -135,7 +135,7 @@ /obj/item/claymore/fluff/hit_reaction() return 0 -/obj/item/fluff/rsik_katana //Xydonus: Rsik Ugsharki +/obj/item/fluff/rsik_katana //Xydonus: Rsik Ugsharki Atan name = "ceremonial katana" desc = "A shimmering ceremonial golden katana, for the most discerning class of ninja. Looks expensive, and fragile." icon = 'icons/obj/custom_items.dmi' @@ -1020,6 +1020,26 @@ flags = NODROP|BLOCKHAIR flags_inv = HIDEEARS +/obj/item/clothing/suit/hooded/hoodie/fluff/xydonus //Xydonus: Rsik Ugsharki Atan | Based off of the bomber jacket, but with a hood slapped on (for allowed suit storage) + name = "custom fit bomber jacket" + desc = "Made for Unathi who likes to show off their big horns." + icon = 'icons/obj/custom_items.dmi' + icon_state = "xydonus_jacket" + ignore_suitadjust = 0 + hoodtype = /obj/item/clothing/head/hood/fluff/xydonus + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS + allowed = list(/obj/item/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy,/obj/item/storage/fancy/cigarettes,/obj/item/lighter) + +/obj/item/clothing/head/hood/fluff/xydonus + name = "custom fit hood" + desc = "A hood with some horns glued to them, or something like that. Custom fit for a Unathi's head shape." + icon = 'icons/obj/custom_items.dmi' + icon_state = "xydonus_bomberhood" + body_parts_covered = HEAD + flags = NODROP|BLOCKHAIR + flags_inv = HIDEEARS + //////////// Uniforms //////////// /obj/item/clothing/under/fluff/counterfeitguise_uniform // thatdanguy23 : Rissa Williams icon = 'icons/obj/custom_items.dmi' diff --git a/code/modules/detective_work/evidence.dm b/code/modules/detective_work/evidence.dm index 97d41fcf848..555dbe542de 100644 --- a/code/modules/detective_work/evidence.dm +++ b/code/modules/detective_work/evidence.dm @@ -84,15 +84,3 @@ to_chat(user, "[src] is empty.") icon_state = "evidenceobj" -/obj/item/storage/box/evidence - name = "evidence bag box" - desc = "A box claiming to contain evidence bags." - -/obj/item/storage/box/evidence/New() - new /obj/item/evidencebag(src) - new /obj/item/evidencebag(src) - new /obj/item/evidencebag(src) - new /obj/item/evidencebag(src) - new /obj/item/evidencebag(src) - new /obj/item/evidencebag(src) - ..() diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 235b0b609f1..c481df1ca42 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -62,7 +62,7 @@ if(!proximity) return - if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it. + if(target.is_refillable() && is_drainable()) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) to_chat(user, " [src] is empty.") return FALSE diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 459d8d144f5..a24f947a25a 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -220,24 +220,20 @@ if(M.incapacitated() || !Adjacent(M)) return - if(over_object == M) + if(over_object == M || istype(over_object, /obj/screen)) if(!remove_item_from_storage(M)) M.unEquip(src) - M.put_in_hands(src) + if(over_object != M) + switch(over_object.name) + if("r_hand") + M.put_in_r_hand(src) + if("l_hand") + M.put_in_l_hand(src) + else + M.put_in_hands(src) - else if(istype(over_object, /obj/screen)) - switch(over_object.name) - if("r_hand") - if(!remove_item_from_storage(M)) - M.unEquip(src) - M.put_in_r_hand(src) - if("l_hand") - if(!remove_item_from_storage(M)) - M.unEquip(src) - M.put_in_l_hand(src) - - add_fingerprint(M) - usr.visible_message("[usr] picks up the deck.") + add_fingerprint(M) + usr.visible_message("[usr] picks up the deck.") /obj/item/pack name = "Card Pack" diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm new file mode 100644 index 00000000000..9f4dbb7315d --- /dev/null +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -0,0 +1,79 @@ +/obj/structure/fermenting_barrel + name = "wooden barrel" + desc = "A large wooden barrel. You can ferment fruits and such inside it, or just use it to hold liquid." + icon = 'icons/obj/objects.dmi' + icon_state = "barrel" + density = TRUE + anchored = FALSE + container_type = DRAINABLE | AMOUNT_VISIBLE + pressure_resistance = 2 * ONE_ATMOSPHERE + max_integrity = 300 + var/open = FALSE + var/speed_multiplier = 1 //How fast it distills. Defaults to 100% (1.0). Lower is better. + +/obj/structure/fermenting_barrel/Initialize() + create_reagents(300) //Bluespace beakers, but without the portability or efficiency in circuits. + . = ..() + +/obj/structure/fermenting_barrel/examine(mob/user) + . = ..() + to_chat(user, "It is currently [open ? "open, letting you pour liquids in." : "closed, letting you draw liquids from the tap."] ") + +/obj/structure/fermenting_barrel/proc/makeWine(obj/item/reagent_containers/food/snacks/grown/G) + if(G.reagents) + G.reagents.trans_to(src, G.reagents.total_volume) + var/amount = G.seed.potency / 4 + if(G.distill_reagent) + reagents.add_reagent(G.distill_reagent, amount) + else + var/data = list() + data["names"] = list("[initial(G.name)]" = 1) + data["color"] = G.filling_color + data["alcohol_perc"] = G.wine_power + if(G.wine_flavor) + data["tastes"] = list(G.wine_flavor = 1) + // else // Stub - Will implement when we port over tg's better taste system - I'd rather get the barrel in first. + // data["tastes"] = list(G.tastes[1] = 1) + reagents.add_reagent("fruit_wine", amount, data) + qdel(G) + playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) + +/obj/structure/fermenting_barrel/attackby(obj/item/I, mob/user, params) + var/obj/item/reagent_containers/food/snacks/grown/G = I + if(istype(G)) + if(!G.can_distill) + to_chat(user, "You can't distill this into anything...") + return FALSE + else if(!user.drop_item()) + to_chat(user, "[G] is stuck to your hand!") + return FALSE + G.forceMove(src) + to_chat(user, "You place [G] into [src] to start the fermentation process.") + addtimer(CALLBACK(src, .proc/makeWine, G), rand(80, 120) * speed_multiplier) + else if(I.is_refillable()) + return FALSE // To refill via afterattack proc + else + return ..() + +/obj/structure/fermenting_barrel/attack_hand(mob/user) + open = !open + if(open) + container_type = REFILLABLE | AMOUNT_VISIBLE + to_chat(user, "You open [src], letting you fill it.") + else + container_type = DRAINABLE | AMOUNT_VISIBLE + to_chat(user, "You close [src], letting you draw from its tap.") + update_icon() + +/obj/structure/fermenting_barrel/update_icon() + if(open) + icon_state = "barrel_open" + else + icon_state = "barrel" + +/datum/crafting_recipe/fermenting_barrel + name = "Wooden Barrel" + result = /obj/structure/fermenting_barrel + reqs = list(/obj/item/stack/sheet/wood = 30) + time = 50 + category = CAT_PRIMAL diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 772e9f5d856..7b84956a804 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -8,12 +8,13 @@ icon = 'icons/obj/hydroponics/harvest.dmi' var/obj/item/seeds/seed = null // type path, gets converted to item on New(). It's safe to assume it's always a seed item. var/plantname = "" - var/bitesize_mod = 0 + var/bitesize_mod = 0 // If set, bitesize = 1 + round(reagents.total_volume / bitesize_mod) var/splat_type = /obj/effect/decal/cleanable/plant_smudge - // If set, bitesize = 1 + round(reagents.total_volume / bitesize_mod) - dried_type = -1 - // Saves us from having to define each stupid grown's dried_type as itself. - // If you don't want a plant to be driable (watermelons) set this to null in the time definition. + var/can_distill = TRUE //If FALSE, this object cannot be distilled into an alcohol. + var/distill_reagent //If NULL and this object can be distilled, it uses a generic fruit_wine reagent and adjusts its variables. + var/wine_flavor //If NULL, this is automatically set to the fruit's flavor. Determines the flavor of the wine if distill_reagent is NULL. + var/wine_power = 0.1 //Determines the boozepwr of the wine if distill_reagent is NULL. Uses 0.1 - 1.2 not tg's boozepower (divide by 100) else you'll end up with 1000% proof alcohol! + dried_type = -1 // Saves us from having to define each stupid grown's dried_type as itself. If you don't want a plant to be driable (watermelons) set this to null in the time definition. burn_state = FLAMMABLE origin_tech = "biotech=1" @@ -59,6 +60,30 @@ /obj/item/reagent_containers/food/snacks/grown/attackby(obj/item/O, mob/user, params) ..() + if(slices_num && slice_path) + var/inaccurate = TRUE + if(O.sharp) + if(istype(O, /obj/item/kitchen/knife) || istype(O, /obj/item/scalpel)) + inaccurate = FALSE + + if(!isturf(loc) || !(locate(/obj/structure/table) in loc) && !(locate(/obj/machinery/optable) in loc) && !(locate(/obj/item/storage/bag/tray) in loc)) + to_chat(user, "You cannot slice [src] here! You need a table or at least a tray to do it.") + return TRUE + + var/slices_lost = 0 + if(!inaccurate) + user.visible_message("[user] slices [src] with [O]!", "You slice [src]!") + else + user.visible_message("[user] crudely slices [src] with [O]!", "You crudely slice [src] with your [O]!") + slices_lost = rand(1, min(1, round(slices_num / 2))) + + var/reagents_per_slice = reagents.total_volume/slices_num + for(var/i = 1 to (slices_num - slices_lost)) + var/obj/slice = new slice_path (loc) + reagents.trans_to(slice, reagents_per_slice) + qdel(src) + return ..() + if (istype(O, /obj/item/plant_analyzer)) var/msg = "*---------*\n This is \a [src].\n" if(seed) diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm index d6942d6a7f6..a2085eafaee 100644 --- a/code/modules/hydroponics/grown/ambrosia.dm +++ b/code/modules/hydroponics/grown/ambrosia.dm @@ -30,6 +30,7 @@ name = "ambrosia vulgaris branch" desc = "This is a plant containing various healing chemicals." origin_tech = "biotech=2" + wine_power = 0.2 // Ambrosia Deus /obj/item/seeds/ambrosia/deus @@ -50,6 +51,7 @@ icon_state = "ambrosiadeus" filling_color = "#008B8B" origin_tech = "biotech=4;materials=3" + wine_power = 0.5 //Ambrosia Gaia /obj/item/seeds/ambrosia/gaia @@ -74,6 +76,8 @@ origin_tech = "biotech=6;materials=5" light_range = 3 seed = /obj/item/seeds/ambrosia/gaia + wine_power = 0.7 + wine_flavor = "the earthmother's blessing" // Ambrosia Cruciatus /obj/item/seeds/ambrosia/cruciatus @@ -83,4 +87,5 @@ reagents_add = list("thc" = 0.15, "kelotane" = 0.15, "bicaridine" = 0.1, "bath_salts" = 0.20, "plantmatter" = 0.05) /obj/item/reagent_containers/food/snacks/grown/ambrosia/cruciatus - seed = /obj/item/seeds/ambrosia/cruciatus \ No newline at end of file + seed = /obj/item/seeds/ambrosia/cruciatus + wine_power = 0.7 \ No newline at end of file diff --git a/code/modules/hydroponics/grown/apple.dm b/code/modules/hydroponics/grown/apple.dm index 64c7c0381a9..67948c4beb9 100644 --- a/code/modules/hydroponics/grown/apple.dm +++ b/code/modules/hydroponics/grown/apple.dm @@ -23,6 +23,7 @@ icon_state = "apple" filling_color = "#FF4500" bitesize = 100 // Always eat the apple in one bite + distill_reagent = "hcider" // Posioned Apple /obj/item/seeds/apple/poisoned @@ -55,3 +56,5 @@ icon_state = "goldapple" filling_color = "#FFD700" origin_tech = "biotech=4;materials=5" + distill_reagent = null + wine_power = 0.5 diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index 6874038a7bf..4515b3ad75f 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -23,6 +23,7 @@ trash = /obj/item/grown/bananapeel filling_color = "#FFFF00" bitesize = 5 + distill_reagent = "bananahonk" /obj/item/reagent_containers/food/snacks/grown/banana/suicide_act(mob/user) user.visible_message("[user] is aiming the [name] at [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide.") @@ -74,6 +75,7 @@ icon_state = "mimana" trash = /obj/item/grown/bananapeel/mimanapeel filling_color = "#FFFFEE" + distill_reagent = "silencer" /obj/item/grown/bananapeel/mimanapeel seed = /obj/item/seeds/banana/mime @@ -102,6 +104,8 @@ trash = /obj/item/grown/bananapeel/bluespace filling_color = "#0000FF" origin_tech = "biotech=3;bluespace=5" + wine_power = 0.6 + wine_flavor = "slippery hypercubes" /obj/item/grown/bananapeel/bluespace seed = /obj/item/seeds/banana/bluespace diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm index 24ddf1dbbba..3649e84b869 100644 --- a/code/modules/hydroponics/grown/beans.dm +++ b/code/modules/hydroponics/grown/beans.dm @@ -25,6 +25,7 @@ icon_state = "soybeans" filling_color = "#F0E68C" bitesize_mod = 2 + wine_power = 0.2 // Koibean /obj/item/seeds/soya/koi @@ -45,4 +46,5 @@ desc = "Something about these seems fishy." icon_state = "koibeans" filling_color = "#F0E68C" - bitesize_mod = 2 \ No newline at end of file + bitesize_mod = 2 + wine_power = 0.4 \ No newline at end of file diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index 155566ebd10..8e740719fbf 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -25,6 +25,7 @@ gender = PLURAL filling_color = "#FF00FF" bitesize_mod = 2 + distill_reagent = "gin" // Poison Berries /obj/item/seeds/berry/poison @@ -44,6 +45,8 @@ desc = "Taste so good, you could die!" icon_state = "poisonberrypile" filling_color = "#C71585" + distill_reagent = null + wine_power = 0.35 // Death Berries /obj/item/seeds/berry/death @@ -65,6 +68,8 @@ desc = "Taste so good, you could die!" icon_state = "deathberrypile" filling_color = "#708090" + distill_reagent = null + wine_power = 0.5 // Glow Berries /obj/item/seeds/berry/glow @@ -89,6 +94,9 @@ filling_color = "#7CFC00" origin_tech = "plasmatech=6" light_color = "#006622" + distill_reagent = null + wine_power = 0.6 + wine_flavor = "warmth" // Cherries /obj/item/seeds/cherry @@ -118,6 +126,7 @@ gender = PLURAL filling_color = "#FF0000" bitesize_mod = 2 + wine_power = 0.3 // Blue Cherries /obj/item/seeds/cherry/blue @@ -138,6 +147,7 @@ icon_state = "bluecherry" filling_color = "#6495ED" bitesize_mod = 2 + wine_power = 0.5 // Grapes /obj/item/seeds/grape @@ -168,6 +178,7 @@ dried_type = /obj/item/reagent_containers/food/snacks/no_raisin filling_color = "#FF1493" bitesize_mod = 2 + distill_reagent = "wine" // Green Grapes /obj/item/seeds/grape/green @@ -186,3 +197,4 @@ name = "bunch of green grapes" icon_state = "greengrapes" filling_color = "#7FFF00" + distill_reagent = "cognac" diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm index e82e72e83b0..ed05d7a6954 100644 --- a/code/modules/hydroponics/grown/cannabis.dm +++ b/code/modules/hydroponics/grown/cannabis.dm @@ -93,6 +93,7 @@ icon_state = "cannabis" filling_color = "#00FF00" bitesize_mod = 2 + wine_power = 0.2 /obj/item/reagent_containers/food/snacks/grown/cannabis/rainbow @@ -100,18 +101,21 @@ name = "rainbow cannabis leaf" desc = "Is it supposed to be glowing like that...?" icon_state = "megacannabis" + wine_power = 0.6 /obj/item/reagent_containers/food/snacks/grown/cannabis/death seed = /obj/item/seeds/cannabis/death name = "death cannabis leaf" desc = "Looks a bit dark. Oh well." icon_state = "blackcannabis" + wine_power = 0.4 /obj/item/reagent_containers/food/snacks/grown/cannabis/white seed = /obj/item/seeds/cannabis/white name = "white cannabis leaf" desc = "It feels smooth and nice to the touch." icon_state = "whitecannabis" + wine_power = 0.1 /obj/item/reagent_containers/food/snacks/grown/cannabis/ultimate seed = /obj/item/seeds/cannabis/ultimate @@ -119,3 +123,4 @@ desc = "You feel dizzy looking at it. What the fuck?" icon_state = "ocannabis" volume = 420 + wine_power = 0.9 diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm index 91b6cd0a14c..e864687a551 100644 --- a/code/modules/hydroponics/grown/cereals.dm +++ b/code/modules/hydroponics/grown/cereals.dm @@ -21,6 +21,7 @@ icon_state = "wheat" filling_color = "#F0E68C" bitesize_mod = 2 + distill_reagent = "beer" // Oat /obj/item/seeds/wheat/oat @@ -40,6 +41,7 @@ icon_state = "oat" filling_color = "#556B2F" bitesize_mod = 2 + distill_reagent = "ale" // Rice /obj/item/seeds/wheat/rice @@ -60,6 +62,7 @@ icon_state = "rice" filling_color = "#FAFAD2" bitesize_mod = 2 + distill_reagent = "sake" //Meatwheat - grows into synthetic meat /obj/item/seeds/wheat/meat @@ -80,6 +83,7 @@ filling_color = rgb(150, 0, 0) bitesize_mod = 2 seed = /obj/item/seeds/wheat/meat + can_distill = FALSE /obj/item/reagent_containers/food/snacks/grown/meatwheat/attack_self(mob/living/user) user.visible_message("[user] crushes [src] into meat.", "You crush [src] into something that resembles meat.") diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm index f8bf515ce6b..5f4621eff16 100644 --- a/code/modules/hydroponics/grown/chili.dm +++ b/code/modules/hydroponics/grown/chili.dm @@ -25,6 +25,7 @@ icon_state = "chilipepper" filling_color = "#FF0000" bitesize_mod = 2 + wine_power = 0.2 // Ice Chili /obj/item/seeds/chili/ice @@ -49,6 +50,7 @@ filling_color = "#0000CD" bitesize_mod = 2 origin_tech = "biotech=4" + wine_power = 0.3 // Ghost Chili /obj/item/seeds/chili/ghost @@ -74,3 +76,4 @@ filling_color = "#F8F8FF" bitesize_mod = 4 origin_tech = "biotech=4;magnets=5" + wine_power = 0.5 diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm index 86bc8082661..b6e4a36d164 100644 --- a/code/modules/hydroponics/grown/citrus.dm +++ b/code/modules/hydroponics/grown/citrus.dm @@ -5,6 +5,7 @@ desc = "It's so sour, your face will twist." icon_state = "lime" bitesize_mod = 2 + wine_power = 0.3 // Lime /obj/item/seeds/lime @@ -29,6 +30,7 @@ desc = "It's so sour, your face will twist." icon_state = "lime" filling_color = "#00FF00" + distill_reagent = "triple_sec" // Orange /obj/item/seeds/orange @@ -104,6 +106,8 @@ desc = "Made for burning houses down." icon_state = "firelemon" bitesize_mod = 2 + wine_power = 0.7 + wine_flavor = "fire" /obj/item/reagent_containers/food/snacks/grown/firelemon/attack_self(mob/living/user) var/area/A = get_area(user) diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm index 0ca061af745..745aa006498 100644 --- a/code/modules/hydroponics/grown/cocoa_vanilla.dm +++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm @@ -25,6 +25,7 @@ icon_state = "cocoapod" filling_color = "#FFD700" bitesize_mod = 2 + distill_reagent = "creme_de_cacao" // Vanilla Pod /obj/item/seeds/cocoapod/vanillapod @@ -43,4 +44,5 @@ name = "vanilla pod" desc = "Fattening... Mmmmm... vanilla." icon_state = "vanillapod" - filling_color = "#FFD700" \ No newline at end of file + filling_color = "#FFD700" + distill_reagent = "vanilla" //Takes longer, but you can get even more vanilla from it. \ No newline at end of file diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index 693818c9537..dca121d1acb 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -24,6 +24,8 @@ filling_color = "#FFFF00" trash = /obj/item/grown/corncob bitesize_mod = 2 + distill_reagent = "whiskey" + wine_power = 0.4 /obj/item/grown/corncob name = "corn cob" diff --git a/code/modules/hydroponics/grown/eggplant.dm b/code/modules/hydroponics/grown/eggplant.dm index d9a243eab6f..b9244bfd3ec 100644 --- a/code/modules/hydroponics/grown/eggplant.dm +++ b/code/modules/hydroponics/grown/eggplant.dm @@ -22,6 +22,7 @@ icon_state = "eggplant" filling_color = "#800080" bitesize_mod = 2 + wine_power = 0.2 // Egg-Plant /obj/item/seeds/eggplant/eggy @@ -41,4 +42,5 @@ icon_state = "eggyplant" trash = /obj/item/reagent_containers/food/snacks/egg filling_color = "#F8F8FF" - bitesize_mod = 2 \ No newline at end of file + bitesize_mod = 2 + distill_reagent = "eggnog" \ No newline at end of file diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index b8d88ebf0c9..adbb5f3152c 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -25,6 +25,7 @@ slot_flags = SLOT_HEAD filling_color = "#FF6347" bitesize_mod = 3 + distill_reagent = "vermouth" // Lily /obj/item/seeds/poppy/lily @@ -88,6 +89,7 @@ slot_flags = SLOT_HEAD filling_color = "#E6E6FA" bitesize_mod = 3 + distill_reagent = "vermouth" // Sunflower @@ -145,6 +147,7 @@ slot_flags = SLOT_HEAD filling_color = "#E6E6FA" bitesize_mod = 2 + distill_reagent = "absinthe" // Novaflower /obj/item/seeds/sunflower/novaflower diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index 5113a8454f3..c45899a310b 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -27,6 +27,7 @@ bitesize_mod = 2 var/stacktype = /obj/item/stack/tile/grass var/tile_coefficient = 0.02 // 1/50 + wine_power = 0.15 /obj/item/reagent_containers/food/snacks/grown/grass/attack_self(mob/user) to_chat(user, "You prepare the astroturf.") @@ -65,3 +66,4 @@ desc = "The textile industry's dark secret." icon_state = "carpetclump" stacktype = /obj/item/stack/tile/carpet + can_distill = FALSE diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm index ba67bf426fa..eea80e17e60 100644 --- a/code/modules/hydroponics/grown/kudzu.dm +++ b/code/modules/hydroponics/grown/kudzu.dm @@ -95,3 +95,4 @@ icon_state = "kudzupod" filling_color = "#6B8E23" bitesize_mod = 2 + wine_power = 0.2 diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index be548339d39..ed7608e21b9 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -25,6 +25,7 @@ w_class = WEIGHT_CLASS_NORMAL filling_color = "#008000" bitesize_mod = 3 + wine_power = 0.4 // Holymelon /obj/item/seeds/watermelon/holy @@ -45,3 +46,5 @@ icon_state = "holymelon" filling_color = "#FFD700" dried_type = null + wine_power = 0.7 //Water to wine, baby. + wine_flavor = "divinity" diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index df58b55c333..605f5082522 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -53,6 +53,7 @@ icon_state = "cabbage" filling_color = "#90EE90" bitesize_mod = 2 + wine_power = 0.2 // Sugarcane @@ -78,6 +79,7 @@ icon_state = "sugarcane" filling_color = "#FFD700" bitesize_mod = 2 + distill_reagent = "rum" // Gatfruit @@ -108,6 +110,7 @@ origin_tech = "combat=6" trash = /obj/item/gun/projectile/revolver bitesize_mod = 2 + wine_power = 0.9 //It burns going down, too. //Cherry Bombs /obj/item/seeds/cherry/bomb @@ -129,6 +132,7 @@ seed = /obj/item/seeds/cherry/bomb bitesize_mod = 2 volume = 125 //Gives enough room for the black powder at max potency + wine_power = 0.8 /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/attack_self(mob/living/user) var/area/A = get_area(user) diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index 95ea83cd424..14c4b2a252a 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -1,6 +1,7 @@ /obj/item/reagent_containers/food/snacks/grown/mushroom name = "mushroom" bitesize_mod = 2 + wine_power = 0.4 // Reishi @@ -84,6 +85,7 @@ desc = "Amanita Virosa: Deadly poisonous basidiomycete fungus filled with alpha amanitin." icon_state = "angel" filling_color = "#C0C0C0" + wine_power = 0.6 // Liberty Cap @@ -109,6 +111,8 @@ desc = "Psilocybe Semilanceata: Liberate yourself!" icon_state = "libertycap" filling_color = "#DAA520" + wine_power = 0.8 + wine_flavor = "freedom" // Plump Helmet @@ -135,6 +139,7 @@ desc = "Plumus Hellmus: Plump, soft and s-so inviting~" icon_state = "plumphelmet" filling_color = "#9370DB" + distill_reagent = "manlydorf" // Walking Mushroom @@ -161,6 +166,7 @@ icon_state = "walkingmushroom" filling_color = "#9370DB" origin_tech = "biotech=4;programming=5" + can_distill = FALSE /obj/item/reagent_containers/food/snacks/grown/mushroom/walkingmushroom/attack_self(mob/user) if(istype(user.loc, /turf/space)) @@ -232,6 +238,7 @@ var/effect_path = /obj/structure/glowshroom origin_tech = "biotech=4;plasmatech=6" light_color = "#006622" + wine_power = 0.5 /obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/attack_self(mob/user) if(istype(user.loc, /turf/space)) @@ -280,6 +287,8 @@ effect_path = /obj/structure/glowshroom/glowcap origin_tech = "biotech=4;powerstorage=6;plasmatech=4" light_color = "#8E0300" + wine_power = 0.6 + wine_flavor = "warmth" // Fungus/Mold /obj/item/seeds/fungus @@ -326,3 +335,5 @@ icon_state = "shadowshroom" effect_path = /obj/structure/glowshroom/shadowshroom origin_tech = "biotech=4;plasmatech=4;magnets=4" + wine_power = 0.6 + wine_flavor = "strange coldness" diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm index 93176799802..e39548d9e7c 100644 --- a/code/modules/hydroponics/grown/onion.dm +++ b/code/modules/hydroponics/grown/onion.dm @@ -25,6 +25,8 @@ bitesize_mod = 2 slice_path = /obj/item/reagent_containers/food/snacks/onion_slice slices_num = 2 + wine_power = 0.2 + wine_flavor = "pungentness" /obj/item/seeds/onion/red name = "pack of red onion seeds" @@ -43,6 +45,8 @@ icon_state = "onion_red" filling_color = "#C29ACF" slice_path = /obj/item/reagent_containers/food/snacks/onion_slice/red + wine_power = 0.6 + wine_flavor = "powerful pungentness" /obj/item/reagent_containers/food/snacks/onion_slice name = "onion slices" diff --git a/code/modules/hydroponics/grown/pineapple.dm b/code/modules/hydroponics/grown/pineapple.dm index 2e0825151c6..589f9456bc2 100644 --- a/code/modules/hydroponics/grown/pineapple.dm +++ b/code/modules/hydroponics/grown/pineapple.dm @@ -24,4 +24,5 @@ icon_state = "pineapple" filling_color = "#e5b437" w_class = WEIGHT_CLASS_NORMAL - bitesize_mod = 3 \ No newline at end of file + bitesize_mod = 3 + wine_power = 0.4 \ No newline at end of file diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm index 2692ee8adf8..655cb6d69bd 100644 --- a/code/modules/hydroponics/grown/potato.dm +++ b/code/modules/hydroponics/grown/potato.dm @@ -25,6 +25,7 @@ icon_state = "potato" filling_color = "#E9967A" bitesize = 100 + distill_reagent = "vodka" /obj/item/reagent_containers/food/snacks/grown/potato/wedges @@ -33,6 +34,7 @@ icon_state = "potato_wedges" filling_color = "#E9967A" bitesize = 100 + distill_reagent = "sbiten" /obj/item/reagent_containers/food/snacks/grown/potato/attackby(obj/item/W, mob/user, params) diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm index 9668379442d..f05a6847dc2 100644 --- a/code/modules/hydroponics/grown/pumpkin.dm +++ b/code/modules/hydroponics/grown/pumpkin.dm @@ -23,6 +23,7 @@ icon_state = "pumpkin" filling_color = "#FFA500" bitesize_mod = 2 + wine_power = 0.2 /obj/item/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, params) if(is_sharp(W)) @@ -52,3 +53,4 @@ icon_state = "blumpkin" filling_color = "#87CEFA" bitesize_mod = 2 + wine_power = 0.5 diff --git a/code/modules/hydroponics/grown/random.dm b/code/modules/hydroponics/grown/random.dm index 734adae15be..f743989cb4a 100644 --- a/code/modules/hydroponics/grown/random.dm +++ b/code/modules/hydroponics/grown/random.dm @@ -26,4 +26,10 @@ name = "strange plant" desc = "What could this even be?" icon_state = "crunchy" - bitesize_mod = 2 \ No newline at end of file + bitesize_mod = 2 + +/obj/item/reagent_containers/food/snacks/grown/random/Initialize() + . = ..() + wine_power = rand(0.1,1.5) + if(prob(1)) + wine_power = 2.0 \ No newline at end of file diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm index 7f26176c675..35bb5ee195c 100644 --- a/code/modules/hydroponics/grown/root.dm +++ b/code/modules/hydroponics/grown/root.dm @@ -21,6 +21,7 @@ icon_state = "carrot" filling_color = "#FFA500" bitesize_mod = 2 + wine_power = 0.3 /obj/item/reagent_containers/food/snacks/grown/carrot/wedges name = "carrot wedges" @@ -59,6 +60,7 @@ desc = "Closely related to carrots." icon_state = "parsnip" bitesize_mod = 2 + wine_power = 0.35 // White-Beet @@ -84,6 +86,7 @@ icon_state = "whitebeet" filling_color = "#F4A460" bitesize_mod = 2 + wine_power = 0.4 // Red Beet /obj/item/seeds/redbeet @@ -107,3 +110,4 @@ desc = "You can't beat red beet." icon_state = "redbeet" bitesize_mod = 2 + wine_power = 0.6 diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm index bd3b182c132..1139c03cad5 100644 --- a/code/modules/hydroponics/grown/tea_coffee.dm +++ b/code/modules/hydroponics/grown/tea_coffee.dm @@ -22,6 +22,7 @@ desc = "These aromatic tips of the tea plant can be dried to make tea." icon_state = "tea_aspera_leaves" filling_color = "#008000" + can_distill = FALSE // Tea Astra /obj/item/seeds/tea/astra @@ -67,6 +68,7 @@ icon_state = "coffee_arabica" filling_color = "#DC143C" bitesize_mod = 2 + distill_reagent = "kahlua" // Coffee Robusta /obj/item/seeds/coffee/robusta diff --git a/code/modules/hydroponics/grown/tobacco.dm b/code/modules/hydroponics/grown/tobacco.dm index de235280b02..95333bba31a 100644 --- a/code/modules/hydroponics/grown/tobacco.dm +++ b/code/modules/hydroponics/grown/tobacco.dm @@ -21,6 +21,7 @@ desc = "Dry them out to make some smokes." icon_state = "tobacco_leaves" filling_color = "#008000" + distill_reagent = "creme_de_menthe" //Menthol, I guess. // Space Tobacco /obj/item/seeds/tobacco/space @@ -38,4 +39,6 @@ seed = /obj/item/seeds/tobacco/space name = "space tobacco leaves" desc = "Dry them out to make some space-smokes." - icon_state = "stobacco_leaves" \ No newline at end of file + icon_state = "stobacco_leaves" + distill_reagent = null + wine_power = 0.5 \ No newline at end of file diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index 3adf57c4021..58bf18057ad 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -22,6 +22,7 @@ splat_type = /obj/effect/decal/cleanable/tomato_smudge filling_color = "#FF6347" bitesize_mod = 2 + distill_reagent = "enzyme" // Blood Tomato /obj/item/seeds/tomato/blood @@ -43,6 +44,7 @@ splat_type = /obj/effect/gibspawner/generic filling_color = "#FF0000" origin_tech = "biotech=5" + distill_reagent = "bloodymary" // Blue Tomato @@ -89,6 +91,8 @@ desc = "So lubricated, you might slip through space-time." icon_state = "bluespacetomato" origin_tech = "biotech=4;bluespace=5" + distill_reagent = null + wine_power = 0.8 // Killer Tomato @@ -117,6 +121,7 @@ var/awakening = 0 filling_color = "#FF0000" origin_tech = "biotech=4;combat=5" + distill_reagent = "demonsblood" /obj/item/reagent_containers/food/snacks/grown/tomato/killer/attack(mob/M, mob/user, def_zone) if(awakening) diff --git a/code/modules/library/computers/checkout.dm b/code/modules/library/computers/checkout.dm index fdcfee0e87a..10e747b4e31 100644 --- a/code/modules/library/computers/checkout.dm +++ b/code/modules/library/computers/checkout.dm @@ -1,462 +1,465 @@ -/* - * Library Computer - */ -/obj/machinery/computer/library/checkout - name = "Check-In/Out Computer" - icon = 'icons/obj/library.dmi' - icon_state = "computer" - anchored = 1 - density = 1 - var/arcanecheckout = 0 - //var/screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book - var/buffer_book - var/buffer_mob - var/upload_category = "Fiction" - var/list/checkouts = list() - var/list/inventory = list() - var/checkoutperiod = 5 // In minutes - var/obj/machinery/libraryscanner/scanner // Book scanner that will be used when uploading books to the Archive - - var/bibledelay = 0 // LOL NO SPAM (1 minute delay) -- Doohl - var/booklist - -/obj/machinery/computer/library/checkout/attack_hand(var/mob/user as mob) - if(..()) - return - interact(user) - -/obj/machinery/computer/library/checkout/interact(var/mob/user) - if(interact_check(user)) - return - - var/dat = "" - switch(screenstate) - if(0) - // Main Menu - - dat += {"
    -
  1. View General Inventory
  2. -
  3. View Checked Out Inventory
  4. -
  5. Check out a Book
  6. -
  7. Connect to External Archive
  8. -
  9. Upload New Title to Archive
  10. -
  11. Print a Bible
  12. -
  13. Print a Manual
  14. "} - if(src.emagged) - dat += "
  15. Access the Forbidden Lore Vault
  16. " - dat += "
" - - if(src.arcanecheckout) - new /obj/item/tome(src.loc) - to_chat(user, "Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a dusty old tome sitting on the desk. You don't really remember printing it.") - user.visible_message("[user] stares at the blank screen for a few moments, [user.p_their()] expression frozen in fear. When [user.p_they()] finally awaken[user.p_s()] from it, [user.p_they()] look[user.p_s()] a lot older.", 2) - src.arcanecheckout = 0 - if(1) - // Inventory - dat += "

Inventory

" - for(var/obj/item/book/b in inventory) - dat += "[b.name] (Delete)
" - dat += "(Return to main menu)
" - if(2) - // Checked Out - dat += "

Checked Out Books


" - for(var/datum/borrowbook/b in checkouts) - var/timetaken = world.time - b.getdate - //timetaken *= 10 - timetaken /= 600 - timetaken = round(timetaken) - var/timedue = b.duedate - world.time - //timedue *= 10 - timedue /= 600 - if(timedue <= 0) - timedue = "(OVERDUE) [timedue]" - else - timedue = round(timedue) - - dat += {"\"[b.bookname]\", Checked out to: [b.mobname]
--- Taken: [timetaken] minutes ago, Due: in [timedue] minutes
- (Check In)

"} - dat += "(Return to main menu)
" - if(3) - // Check Out a Book - - dat += {"

Check Out a Book


- Book: [src.buffer_book] - \[Edit\]
- Recipient: [src.buffer_mob] - \[Edit\]
- Checkout Date : [world.time/600]
- Due Date: [(world.time + checkoutperiod)/600]
- (Checkout Period: [checkoutperiod] minutes) (+/-) - (Commit Entry)
- (Return to main menu)
"} - if(4) - dat += "

External Archive

" - if(!dbcon.IsConnected()) - dat += "ERROR: Unable to contact External Archive. Please contact your system administrator for assistance." - else - num_results = src.get_num_results() - num_pages = Ceiling(num_results/LIBRARY_BOOKS_PER_PAGE) - dat += {""} - var/pagelist = get_pagelist() - - dat += {"

Search Settings


- Filter by Title: [query.title]
- Filter by Category: [query.category]
- Filter by Author: [query.author]
- \[Start Search\]
"} - dat += pagelist - - dat += {"
- - - -
"} - - dat += {" - - - - - - "} - - for(var/datum/cachedbook/CB in get_page(page_num)) - var/author = CB.author - var/controls = "\[Order\]" - controls += {" \[Flag[CB.flagged ? "ged" : ""]\]"} - if(check_rights(R_ADMIN, 0, user = user)) - controls += " \[Delete\]" - author += " ([ckey(CB.ckey)]))" - dat += {" - - - - - "} - - dat += "
AuthorTitleCategoryControls
[author][CB.title][CB.category][controls]

[pagelist]" - - dat += "
(Return to main menu)
" - if(5) - dat += "

Upload a New Title

" - if(!scanner) - for(var/obj/machinery/libraryscanner/S in range(9)) - scanner = S - break - if(!scanner) - dat += "No scanner found within wireless network range.
" - else if(!scanner.cache) - dat += "No data found in scanner memory.
" - else - - dat += {"Data marked for upload...
- Title: [scanner.cache.name]
"} - if(!scanner.cache.author) - scanner.cache.author = "Anonymous" - - dat += {"Author: [scanner.cache.author]
- Category: [upload_category]
- \[Upload\]
"} - dat += "(Return to main menu)
" - if(7) - dat += "

Print a Manual

" - dat += "" - - var/list/forbidden = list( - /obj/item/book/manual - ) - - if(!emagged) - forbidden |= /obj/item/book/manual/nuclear - - var/manualcount = 1 - var/obj/item/book/manual/M = null - - for(var/manual_type in (typesof(/obj/item/book/manual) - forbidden)) - M = new manual_type() - dat += "" - manualcount++ - QDEL_NULL(M) - dat += "
[M.title]
" - dat += "
(Return to main menu)
" - - if(8) - - dat += {"

Accessing Forbidden Lore Vault v 1.3

- Are you absolutely sure you want to proceed? EldritchTomes Inc. takes no responsibilities for loss of sanity resulting from this action.

- Yes.
- No.
"} - - var/datum/browser/B = new /datum/browser(user, "library", "Book Inventory Management") - B.set_content(dat) - B.open() - -/obj/machinery/computer/library/checkout/emag_act(mob/user) - if(density && !emagged) - emagged = 1 - to_chat(user, "You override the library computer's printing restrictions.") - -/obj/machinery/computer/library/checkout/attackby(obj/item/W as obj, mob/user as mob) - if(istype(W, /obj/item/barcodescanner)) - var/obj/item/barcodescanner/scanner = W - scanner.computer = src - to_chat(user, "[scanner]'s associated machine has been set to [src].") - audible_message("[src] lets out a low, short blip.", 2) - return 1 - else - return ..() - -/obj/machinery/computer/library/checkout/Topic(href, href_list) - if(..()) - usr << browse(null, "window=library") - onclose(usr, "library") - return 1 - - if(href_list["pagenum"]) - if(!num_pages) - page_num = 1 - else - var/pn = text2num(href_list["pagenum"]) - if(!isnull(pn)) - page_num = Clamp(pn, 1, num_pages) - - if(href_list["page"]) - if(num_pages == 0) - page_num = 1 - else - page_num = Clamp(text2num(href_list["page"]), 1, num_pages) - if(href_list["settitle"]) - var/newtitle = input("Enter a title to search for:") as text|null - if(newtitle) - query.title = sanitize(newtitle) - else - query.title = null - if(href_list["setcategory"]) - var/newcategory = input("Choose a category to search for:") in (list("Any") + library_section_names) - if(newcategory == "Any") - query.category = null - else if(newcategory) - query.category = sanitize(newcategory) - if(href_list["setauthor"]) - var/newauthor = input("Enter an author to search for:") as text|null - if(newauthor) - query.author = sanitize(newauthor) - else - query.author = null - - if(href_list["search"]) - num_results = src.get_num_results() - num_pages = Ceiling(num_results/LIBRARY_BOOKS_PER_PAGE) - page_num = 1 - - screenstate = 4 - if(href_list["del"]) - if(!check_rights(R_ADMIN)) - return - var/datum/cachedbook/target = getBookByID(href_list["del"]) // Sanitized in getBookByID - var/ans = alert(usr, "Are you sure you wish to delete \"[target.title]\", by [target.author]? This cannot be undone.", "Library System", "Yes", "No") - if(ans=="Yes") - var/DBQuery/query = dbcon.NewQuery("DELETE FROM [format_table_name("library")] WHERE id=[target.id]") - var/response = query.Execute() - if(!response) - to_chat(usr, query.ErrorMsg()) - return - log_admin("LIBRARY: [key_name(usr)] has deleted \"[target.title]\", by [target.author] ([target.ckey])!") - message_admins("[key_name_admin(usr)] has deleted \"[target.title]\", by [target.author] ([target.ckey])!") - src.updateUsrDialog() - return - - if(href_list["delbyckey"]) - if(!check_rights(R_ADMIN)) - return - var/tckey = ckey(href_list["delbyckey"]) - var/ans = alert(usr,"Are you sure you wish to delete all books by [tckey]? This cannot be undone.", "Library System", "Yes", "No") - if(ans=="Yes") - var/DBQuery/query = dbcon.NewQuery("DELETE FROM [format_table_name("library")] WHERE ckey='[sanitizeSQL(tckey)]'") - var/response = query.Execute() - if(!response) - to_chat(usr, query.ErrorMsg()) - return - var/affected=query.RowsAffected() - if(affected==0) - to_chat(usr, "Unable to find any matching rows.") - return - log_admin("LIBRARY: [key_name(usr)] has deleted [affected] books written by [tckey]!") - message_admins("[key_name_admin(usr)] has deleted [affected] books written by [tckey]!") - src.updateUsrDialog() - return - - if(href_list["flag"]) - if(!dbcon.IsConnected()) - alert("Connection to Archive has been severed. Aborting.") - return - var/id = href_list["flag"] - if(id) - var/datum/cachedbook/B = getBookByID(id) - if(B) - if((input(usr, "Are you sure you want to flag [B.title] as having inappropriate content?", "Flag Book #[B.id]") in list("Yes", "No")) == "Yes") - library_catalog.flag_book_by_id(usr, id) - - if(href_list["switchscreen"]) - switch(href_list["switchscreen"]) - if("0") - screenstate = 0 - if("1") - screenstate = 1 - if("2") - screenstate = 2 - if("3") - screenstate = 3 - if("4") - screenstate = 4 - if("5") - screenstate = 5 - if("6") - if(!bibledelay) - - var/obj/item/storage/bible/B = new /obj/item/storage/bible(src.loc) - if(ticker && ( ticker.Bible_icon_state && ticker.Bible_item_state) ) - B.icon_state = ticker.Bible_icon_state - B.item_state = ticker.Bible_item_state - B.name = ticker.Bible_name - B.deity_name = ticker.Bible_deity_name - - bibledelay = 1 - spawn(60) - bibledelay = 0 - - else - visible_message("[src]'s monitor flashes, \"Bible printer currently unavailable, please wait a moment.\"") - - if("7") - screenstate = 7 - if("8") - screenstate = 8 - if(href_list["arccheckout"]) - if(src.emagged) - src.arcanecheckout = 1 - src.screenstate = 0 - if(href_list["increasetime"]) - checkoutperiod += 1 - if(href_list["decreasetime"]) - checkoutperiod -= 1 - if(checkoutperiod < 1) - checkoutperiod = 1 - if(href_list["editbook"]) - buffer_book = copytext(sanitize(input("Enter the book's title:") as text|null),1,MAX_MESSAGE_LEN) - if(href_list["editmob"]) - buffer_mob = copytext(sanitize(input("Enter the recipient's name:") as text|null),1,MAX_NAME_LEN) - if(href_list["checkout"]) - var/datum/borrowbook/b = new /datum/borrowbook - b.bookname = sanitize(buffer_book) - b.mobname = sanitize(buffer_mob) - b.getdate = world.time - b.duedate = world.time + (checkoutperiod * 600) - checkouts.Add(b) - if(href_list["checkin"]) - var/datum/borrowbook/b = locate(href_list["checkin"]) - checkouts.Remove(b) - if(href_list["delbook"]) - var/obj/item/book/b = locate(href_list["delbook"]) - inventory.Remove(b) - if(href_list["uploadauthor"]) - var/newauthor = copytext(sanitize(input("Enter the author's name: ") as text|null),1,MAX_MESSAGE_LEN) - if(newauthor && scanner) - scanner.cache.author = newauthor - if(href_list["uploadcategory"]) - var/newcategory = input("Choose a category: ") in list("Fiction", "Non-Fiction", "Adult", "Reference", "Religion") - if(newcategory) - upload_category = newcategory - if(href_list["upload"]) - if(scanner) - if(scanner.cache) - var/choice = input("Are you certain you wish to upload this title to the Archive?") in list("Confirm", "Abort") - if(choice == "Confirm") - establish_db_connection() - if(!dbcon.IsConnected()) - alert("Connection to Archive has been severed. Aborting.") - else - var/sqltitle = sanitizeSQL(scanner.cache.name) - var/sqlauthor = sanitizeSQL(scanner.cache.author) - var/sqlcontent = sanitizeSQL(scanner.cache.dat) - var/sqlcategory = sanitizeSQL(upload_category) - var/DBQuery/query = dbcon.NewQuery("INSERT INTO [format_table_name("library")] (author, title, content, category, ckey, flagged) VALUES ('[sqlauthor]', '[sqltitle]', '[sqlcontent]', '[sqlcategory]', '[ckey(usr.key)]', 0)") - var/response = query.Execute() - if(!response) - to_chat(usr, query.ErrorMsg()) - else - log_admin("[usr.name]/[usr.key] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] characters in length") - message_admins("[key_name_admin(usr)] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] characters in length") - - if(href_list["id"]) - if(href_list["id"]=="-1") - href_list["id"] = input("Enter your order:") as null|num - if(!href_list["id"]) - return - - if(!dbcon.IsConnected()) - alert("Connection to Archive has been severed. Aborting.") - return - - var/datum/cachedbook/newbook = getBookByID(href_list["id"]) // Sanitized in getBookByID - if(!newbook) - alert("No book found") - return - if((newbook.forbidden == 2 && !emagged) || newbook.forbidden == 1) - alert("This book is forbidden and cannot be printed.") - return - - if(bibledelay) - audible_message("[src]'s monitor flashes, \"Printer unavailable. Please allow a short time before attempting to print.\"") - else - bibledelay = 1 - spawn(60) - bibledelay = 0 - make_external_book(newbook) - if(href_list["manual"]) - if(!href_list["manual"]) return - var/bookid = href_list["manual"] - - if(!dbcon.IsConnected()) - alert("Connection to Archive has been severed. Aborting.") - return - - var/datum/cachedbook/newbook = getBookByID("M[bookid]") - if(!newbook) - alert("No book found") - return - if((newbook.forbidden == 2 && !emagged) || newbook.forbidden == 1) - alert("This book is forbidden and cannot be printed.") - return - - if(bibledelay) - for(var/mob/V in hearers(src)) - V.show_message("[src]'s monitor flashes, \"Printer unavailable. Please allow a short time before attempting to print.\"") - else - bibledelay = 1 - spawn(60) - bibledelay = 0 - make_external_book(newbook) - - src.add_fingerprint(usr) - src.updateUsrDialog() - return - -/* - * Library Scanner - */ - -/obj/machinery/computer/library/checkout/proc/make_external_book(var/datum/cachedbook/newbook) - if(!newbook || !newbook.id) - return - var/obj/item/book/B = new newbook.path(loc) - - if(!newbook.programmatic) - B.name = "Book: [newbook.title]" - B.title = newbook.title - B.author = newbook.author - B.dat = newbook.content - B.icon_state = "book[rand(1,16)]" - visible_message("[src]'s printer hums as it produces a completely bound book. How did it do that?") +/* + * Library Computer + */ +/obj/machinery/computer/library/checkout + name = "Check-In/Out Computer" + icon = 'icons/obj/library.dmi' + icon_state = "computer" + anchored = 1 + density = 1 + var/arcanecheckout = 0 + //var/screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book + var/buffer_book + var/buffer_mob + var/upload_category = "Fiction" + var/list/checkouts = list() + var/list/inventory = list() + var/checkoutperiod = 5 // In minutes + var/obj/machinery/libraryscanner/scanner // Book scanner that will be used when uploading books to the Archive + + var/bibledelay = 0 // LOL NO SPAM (1 minute delay) -- Doohl + var/booklist + +/obj/machinery/computer/library/checkout/attack_hand(var/mob/user as mob) + if(..()) + return + interact(user) + +/obj/machinery/computer/library/checkout/interact(var/mob/user) + if(interact_check(user)) + return + + var/dat = "" + switch(screenstate) + if(0) + // Main Menu + + dat += {"

    +
  1. View General Inventory
  2. +
  3. View Checked Out Inventory
  4. +
  5. Check out a Book
  6. +
  7. Connect to External Archive
  8. +
  9. Upload New Title to Archive
  10. +
  11. Print a Bible
  12. +
  13. Print a Manual
  14. "} + if(src.emagged) + dat += "
  15. Access the Forbidden Lore Vault
  16. " + dat += "
" + + if(src.arcanecheckout) + new /obj/item/tome(src.loc) + to_chat(user, "Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a dusty old tome sitting on the desk. You don't really remember printing it.") + user.visible_message("[user] stares at the blank screen for a few moments, [user.p_their()] expression frozen in fear. When [user.p_they()] finally awaken[user.p_s()] from it, [user.p_they()] look[user.p_s()] a lot older.", 2) + src.arcanecheckout = 0 + if(1) + // Inventory + dat += "

Inventory

" + for(var/obj/item/book/b in inventory) + dat += "[b.name] (Delete)
" + dat += "(Return to main menu)
" + if(2) + // Checked Out + dat += "

Checked Out Books


" + for(var/datum/borrowbook/b in checkouts) + var/timetaken = world.time - b.getdate + //timetaken *= 10 + timetaken /= 600 + timetaken = round(timetaken) + var/timedue = b.duedate - world.time + //timedue *= 10 + timedue /= 600 + if(timedue <= 0) + timedue = "(OVERDUE) [timedue]" + else + timedue = round(timedue) + + dat += {"\"[b.bookname]\", Checked out to: [b.mobname]
--- Taken: [timetaken] minutes ago, Due: in [timedue] minutes
+ (Check In)

"} + dat += "(Return to main menu)
" + if(3) + // Check Out a Book + + dat += {"

Check Out a Book


+ Book: [src.buffer_book] + \[Edit\]
+ Recipient: [src.buffer_mob] + \[Edit\]
+ Checkout Date : [world.time/600]
+ Due Date: [(world.time + checkoutperiod)/600]
+ (Checkout Period: [checkoutperiod] minutes) (+/-) + (Commit Entry)
+ (Return to main menu)
"} + if(4) + dat += "

External Archive

" + if(!dbcon.IsConnected()) + dat += "ERROR: Unable to contact External Archive. Please contact your system administrator for assistance." + else + num_results = src.get_num_results() + num_pages = Ceiling(num_results/LIBRARY_BOOKS_PER_PAGE) + dat += {""} + var/pagelist = get_pagelist() + + dat += {"

Search Settings


+ Filter by Title: [query.title]
+ Filter by Category: [query.category]
+ Filter by Author: [query.author]
+ \[Start Search\]
"} + dat += pagelist + + dat += {"
+ + + +
"} + + dat += {" + + + + + + "} + + for(var/datum/cachedbook/CB in get_page(page_num)) + var/author = CB.author + var/controls = "\[Order\]" + controls += {" \[Flag[CB.flagged ? "ged" : ""]\]"} + if(check_rights(R_ADMIN, 0, user = user)) + controls += " \[Delete\]" + author += " ([ckey(CB.ckey)]))" + dat += {" + + + + + "} + + dat += "
AuthorTitleCategoryControls
[author][CB.title][CB.category][controls]

[pagelist]" + + dat += "
(Return to main menu)
" + if(5) + dat += "

Upload a New Title

" + if(!scanner) + for(var/obj/machinery/libraryscanner/S in range(9)) + scanner = S + break + if(!scanner) + dat += "No scanner found within wireless network range.
" + else if(!scanner.cache) + dat += "No data found in scanner memory.
" + else + + dat += {"Data marked for upload...
+ Title: [scanner.cache.name]
"} + if(!scanner.cache.author) + scanner.cache.author = "Anonymous" + + dat += {"Author: [scanner.cache.author]
+ Category: [upload_category]
+ \[Upload\]
"} + dat += "(Return to main menu)
" + if(7) + dat += "

Print a Manual

" + dat += "" + + var/list/forbidden = list( + /obj/item/book/manual + ) + + if(!emagged) + forbidden |= /obj/item/book/manual/nuclear + + var/manualcount = 1 + var/obj/item/book/manual/M = null + + for(var/manual_type in (typesof(/obj/item/book/manual) - forbidden)) + M = new manual_type() + dat += "" + manualcount++ + QDEL_NULL(M) + dat += "
[M.title]
" + dat += "
(Return to main menu)
" + + if(8) + + dat += {"

Accessing Forbidden Lore Vault v 1.3

+ Are you absolutely sure you want to proceed? EldritchTomes Inc. takes no responsibilities for loss of sanity resulting from this action.

+ Yes.
+ No.
"} + + var/datum/browser/B = new /datum/browser(user, "library", "Book Inventory Management") + B.set_content(dat) + B.open() + +/obj/machinery/computer/library/checkout/emag_act(mob/user) + if(density && !emagged) + emagged = 1 + to_chat(user, "You override the library computer's printing restrictions.") + +/obj/machinery/computer/library/checkout/attackby(obj/item/W as obj, mob/user as mob) + if(default_unfasten_wrench(user, W)) + power_change() + return + if(istype(W, /obj/item/barcodescanner)) + var/obj/item/barcodescanner/scanner = W + scanner.computer = src + to_chat(user, "[scanner]'s associated machine has been set to [src].") + audible_message("[src] lets out a low, short blip.", 2) + return 1 + else + return ..() + +/obj/machinery/computer/library/checkout/Topic(href, href_list) + if(..()) + usr << browse(null, "window=library") + onclose(usr, "library") + return 1 + + if(href_list["pagenum"]) + if(!num_pages) + page_num = 1 + else + var/pn = text2num(href_list["pagenum"]) + if(!isnull(pn)) + page_num = Clamp(pn, 1, num_pages) + + if(href_list["page"]) + if(num_pages == 0) + page_num = 1 + else + page_num = Clamp(text2num(href_list["page"]), 1, num_pages) + if(href_list["settitle"]) + var/newtitle = input("Enter a title to search for:") as text|null + if(newtitle) + query.title = sanitize(newtitle) + else + query.title = null + if(href_list["setcategory"]) + var/newcategory = input("Choose a category to search for:") in (list("Any") + library_section_names) + if(newcategory == "Any") + query.category = null + else if(newcategory) + query.category = sanitize(newcategory) + if(href_list["setauthor"]) + var/newauthor = input("Enter an author to search for:") as text|null + if(newauthor) + query.author = sanitize(newauthor) + else + query.author = null + + if(href_list["search"]) + num_results = src.get_num_results() + num_pages = Ceiling(num_results/LIBRARY_BOOKS_PER_PAGE) + page_num = 1 + + screenstate = 4 + if(href_list["del"]) + if(!check_rights(R_ADMIN)) + return + var/datum/cachedbook/target = getBookByID(href_list["del"]) // Sanitized in getBookByID + var/ans = alert(usr, "Are you sure you wish to delete \"[target.title]\", by [target.author]? This cannot be undone.", "Library System", "Yes", "No") + if(ans=="Yes") + var/DBQuery/query = dbcon.NewQuery("DELETE FROM [format_table_name("library")] WHERE id=[target.id]") + var/response = query.Execute() + if(!response) + to_chat(usr, query.ErrorMsg()) + return + log_admin("LIBRARY: [key_name(usr)] has deleted \"[target.title]\", by [target.author] ([target.ckey])!") + message_admins("[key_name_admin(usr)] has deleted \"[target.title]\", by [target.author] ([target.ckey])!") + src.updateUsrDialog() + return + + if(href_list["delbyckey"]) + if(!check_rights(R_ADMIN)) + return + var/tckey = ckey(href_list["delbyckey"]) + var/ans = alert(usr,"Are you sure you wish to delete all books by [tckey]? This cannot be undone.", "Library System", "Yes", "No") + if(ans=="Yes") + var/DBQuery/query = dbcon.NewQuery("DELETE FROM [format_table_name("library")] WHERE ckey='[sanitizeSQL(tckey)]'") + var/response = query.Execute() + if(!response) + to_chat(usr, query.ErrorMsg()) + return + var/affected=query.RowsAffected() + if(affected==0) + to_chat(usr, "Unable to find any matching rows.") + return + log_admin("LIBRARY: [key_name(usr)] has deleted [affected] books written by [tckey]!") + message_admins("[key_name_admin(usr)] has deleted [affected] books written by [tckey]!") + src.updateUsrDialog() + return + + if(href_list["flag"]) + if(!dbcon.IsConnected()) + alert("Connection to Archive has been severed. Aborting.") + return + var/id = href_list["flag"] + if(id) + var/datum/cachedbook/B = getBookByID(id) + if(B) + if((input(usr, "Are you sure you want to flag [B.title] as having inappropriate content?", "Flag Book #[B.id]") in list("Yes", "No")) == "Yes") + library_catalog.flag_book_by_id(usr, id) + + if(href_list["switchscreen"]) + switch(href_list["switchscreen"]) + if("0") + screenstate = 0 + if("1") + screenstate = 1 + if("2") + screenstate = 2 + if("3") + screenstate = 3 + if("4") + screenstate = 4 + if("5") + screenstate = 5 + if("6") + if(!bibledelay) + + var/obj/item/storage/bible/B = new /obj/item/storage/bible(src.loc) + if(ticker && ( ticker.Bible_icon_state && ticker.Bible_item_state) ) + B.icon_state = ticker.Bible_icon_state + B.item_state = ticker.Bible_item_state + B.name = ticker.Bible_name + B.deity_name = ticker.Bible_deity_name + + bibledelay = 1 + spawn(60) + bibledelay = 0 + + else + visible_message("[src]'s monitor flashes, \"Bible printer currently unavailable, please wait a moment.\"") + + if("7") + screenstate = 7 + if("8") + screenstate = 8 + if(href_list["arccheckout"]) + if(src.emagged) + src.arcanecheckout = 1 + src.screenstate = 0 + if(href_list["increasetime"]) + checkoutperiod += 1 + if(href_list["decreasetime"]) + checkoutperiod -= 1 + if(checkoutperiod < 1) + checkoutperiod = 1 + if(href_list["editbook"]) + buffer_book = copytext(sanitize(input("Enter the book's title:") as text|null),1,MAX_MESSAGE_LEN) + if(href_list["editmob"]) + buffer_mob = copytext(sanitize(input("Enter the recipient's name:") as text|null),1,MAX_NAME_LEN) + if(href_list["checkout"]) + var/datum/borrowbook/b = new /datum/borrowbook + b.bookname = sanitize(buffer_book) + b.mobname = sanitize(buffer_mob) + b.getdate = world.time + b.duedate = world.time + (checkoutperiod * 600) + checkouts.Add(b) + if(href_list["checkin"]) + var/datum/borrowbook/b = locate(href_list["checkin"]) + checkouts.Remove(b) + if(href_list["delbook"]) + var/obj/item/book/b = locate(href_list["delbook"]) + inventory.Remove(b) + if(href_list["uploadauthor"]) + var/newauthor = copytext(sanitize(input("Enter the author's name: ") as text|null),1,MAX_MESSAGE_LEN) + if(newauthor && scanner) + scanner.cache.author = newauthor + if(href_list["uploadcategory"]) + var/newcategory = input("Choose a category: ") in list("Fiction", "Non-Fiction", "Adult", "Reference", "Religion") + if(newcategory) + upload_category = newcategory + if(href_list["upload"]) + if(scanner) + if(scanner.cache) + var/choice = input("Are you certain you wish to upload this title to the Archive?") in list("Confirm", "Abort") + if(choice == "Confirm") + establish_db_connection() + if(!dbcon.IsConnected()) + alert("Connection to Archive has been severed. Aborting.") + else + var/sqltitle = sanitizeSQL(scanner.cache.name) + var/sqlauthor = sanitizeSQL(scanner.cache.author) + var/sqlcontent = sanitizeSQL(scanner.cache.dat) + var/sqlcategory = sanitizeSQL(upload_category) + var/DBQuery/query = dbcon.NewQuery("INSERT INTO [format_table_name("library")] (author, title, content, category, ckey, flagged) VALUES ('[sqlauthor]', '[sqltitle]', '[sqlcontent]', '[sqlcategory]', '[ckey(usr.key)]', 0)") + var/response = query.Execute() + if(!response) + to_chat(usr, query.ErrorMsg()) + else + log_admin("[usr.name]/[usr.key] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] characters in length") + message_admins("[key_name_admin(usr)] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] characters in length") + + if(href_list["id"]) + if(href_list["id"]=="-1") + href_list["id"] = input("Enter your order:") as null|num + if(!href_list["id"]) + return + + if(!dbcon.IsConnected()) + alert("Connection to Archive has been severed. Aborting.") + return + + var/datum/cachedbook/newbook = getBookByID(href_list["id"]) // Sanitized in getBookByID + if(!newbook) + alert("No book found") + return + if((newbook.forbidden == 2 && !emagged) || newbook.forbidden == 1) + alert("This book is forbidden and cannot be printed.") + return + + if(bibledelay) + audible_message("[src]'s monitor flashes, \"Printer unavailable. Please allow a short time before attempting to print.\"") + else + bibledelay = 1 + spawn(60) + bibledelay = 0 + make_external_book(newbook) + if(href_list["manual"]) + if(!href_list["manual"]) return + var/bookid = href_list["manual"] + + if(!dbcon.IsConnected()) + alert("Connection to Archive has been severed. Aborting.") + return + + var/datum/cachedbook/newbook = getBookByID("M[bookid]") + if(!newbook) + alert("No book found") + return + if((newbook.forbidden == 2 && !emagged) || newbook.forbidden == 1) + alert("This book is forbidden and cannot be printed.") + return + + if(bibledelay) + for(var/mob/V in hearers(src)) + V.show_message("[src]'s monitor flashes, \"Printer unavailable. Please allow a short time before attempting to print.\"") + else + bibledelay = 1 + spawn(60) + bibledelay = 0 + make_external_book(newbook) + + src.add_fingerprint(usr) + src.updateUsrDialog() + return + +/* + * Library Scanner + */ + +/obj/machinery/computer/library/checkout/proc/make_external_book(var/datum/cachedbook/newbook) + if(!newbook || !newbook.id) + return + var/obj/item/book/B = new newbook.path(loc) + + if(!newbook.programmatic) + B.name = "Book: [newbook.title]" + B.title = newbook.title + B.author = newbook.author + B.dat = newbook.content + B.icon_state = "book[rand(1,16)]" + visible_message("[src]'s printer hums as it produces a completely bound book. How did it do that?") diff --git a/code/modules/library/computers/public.dm b/code/modules/library/computers/public.dm index 4e0decd4459..c0f61d26eff 100644 --- a/code/modules/library/computers/public.dm +++ b/code/modules/library/computers/public.dm @@ -1,122 +1,127 @@ -/obj/machinery/computer/library/public - name = "visitor computer" - -/obj/machinery/computer/library/public/attack_hand(var/mob/user as mob) - if(..()) - return - interact(user) - -/obj/machinery/computer/library/public/interact(var/mob/user) - if(interact_check(user)) - return - - var/dat = "" - switch(screenstate) - if(0) - - dat += {"

Search Settings


- Filter by Title: [query.title]
- Filter by Category: [query.category]
- Filter by Author: [query.author]
- \[Start Search\]
"} - if(1) - establish_db_connection() - if(!dbcon.IsConnected()) - dat += "ERROR: Unable to contact External Archive. Please contact your system administrator for assistance.
" - else if(num_results == 0) - dat += "No results found." - else - var/pagelist = get_pagelist() - - dat += pagelist - dat += {"
- - - -
"} - dat += {" - - - - - - - "} - for(var/datum/cachedbook/CB in get_page(page_num)) - dat += {" - - - - - - "} - - dat += "
AuthorTitleCategorySS13BNControls
[CB.author][CB.title][CB.category][CB.id]\[Flag[CB.flagged ? "ged" : ""]\]

[pagelist]" - dat += "\[Go Back\]
" - var/datum/browser/B = new /datum/browser(user, "library", "Library Visitor") - B.set_content(dat) - B.open() - -/obj/machinery/computer/library/public/Topic(href, href_list) - if(..()) - usr << browse(null, "window=publiclibrary") - onclose(usr, "publiclibrary") - return - - if(href_list["pagenum"]) - if(!num_pages) - page_num = 1 - else - var/pn = text2num(href_list["pagenum"]) - if(!isnull(pn)) - page_num = Clamp(pn, 1, num_pages) - - if(href_list["settitle"]) - var/newtitle = input("Enter a title to search for:") as text|null - if(newtitle) - query.title = sanitize(newtitle) - else - query.title = null - if(href_list["setcategory"]) - var/newcategory = input("Choose a category to search for:") in (list("Any") + library_section_names) - if(newcategory == "Any") - query.category = null - else if(newcategory) - query.category = sanitize(newcategory) - if(href_list["setauthor"]) - var/newauthor = input("Enter an author to search for:") as text|null - if(newauthor) - query.author = sanitize(newauthor) - else - query.author = null - - if(href_list["page"]) - if(num_pages == 0) - page_num = 1 - else - page_num = Clamp(text2num(href_list["page"]), 1, num_pages) - - if(href_list["search"]) - num_results = src.get_num_results() - num_pages = Ceiling(num_results/LIBRARY_BOOKS_PER_PAGE) - page_num = 1 - - screenstate = 1 - - if(href_list["back"]) - screenstate = 0 - - if(href_list["flag"]) - if(!dbcon.IsConnected()) - alert("Connection to Archive has been severed. Aborting.") - return - var/id = href_list["flag"] - if(id) - var/datum/cachedbook/B = getBookByID(id) - if(B) - if((input(usr, "Are you sure you want to flag [B.title] as having inappropriate content?", "Flag Book #[B.id]") in list("Yes", "No")) == "Yes") - library_catalog.flag_book_by_id(usr, id) - - add_fingerprint(usr) - updateUsrDialog() +/obj/machinery/computer/library/public + name = "visitor computer" + +/obj/machinery/computer/library/public/attack_hand(var/mob/user as mob) + if(..()) + return + interact(user) + +/obj/machinery/computer/library/public/attackby(obj/item/W as obj, mob/user as mob) + if(default_unfasten_wrench(user, W)) + power_change() + return + +/obj/machinery/computer/library/public/interact(var/mob/user) + if(interact_check(user)) + return + + var/dat = "" + switch(screenstate) + if(0) + + dat += {"

Search Settings


+ Filter by Title: [query.title]
+ Filter by Category: [query.category]
+ Filter by Author: [query.author]
+ \[Start Search\]
"} + if(1) + establish_db_connection() + if(!dbcon.IsConnected()) + dat += "ERROR: Unable to contact External Archive. Please contact your system administrator for assistance.
" + else if(num_results == 0) + dat += "No results found." + else + var/pagelist = get_pagelist() + + dat += pagelist + dat += {"
+ + + +
"} + dat += {" + + + + + + + "} + for(var/datum/cachedbook/CB in get_page(page_num)) + dat += {" + + + + + + "} + + dat += "
AuthorTitleCategorySS13BNControls
[CB.author][CB.title][CB.category][CB.id]\[Flag[CB.flagged ? "ged" : ""]\]

[pagelist]" + dat += "\[Go Back\]
" + var/datum/browser/B = new /datum/browser(user, "library", "Library Visitor") + B.set_content(dat) + B.open() + +/obj/machinery/computer/library/public/Topic(href, href_list) + if(..()) + usr << browse(null, "window=publiclibrary") + onclose(usr, "publiclibrary") + return + + if(href_list["pagenum"]) + if(!num_pages) + page_num = 1 + else + var/pn = text2num(href_list["pagenum"]) + if(!isnull(pn)) + page_num = Clamp(pn, 1, num_pages) + + if(href_list["settitle"]) + var/newtitle = input("Enter a title to search for:") as text|null + if(newtitle) + query.title = sanitize(newtitle) + else + query.title = null + if(href_list["setcategory"]) + var/newcategory = input("Choose a category to search for:") in (list("Any") + library_section_names) + if(newcategory == "Any") + query.category = null + else if(newcategory) + query.category = sanitize(newcategory) + if(href_list["setauthor"]) + var/newauthor = input("Enter an author to search for:") as text|null + if(newauthor) + query.author = sanitize(newauthor) + else + query.author = null + + if(href_list["page"]) + if(num_pages == 0) + page_num = 1 + else + page_num = Clamp(text2num(href_list["page"]), 1, num_pages) + + if(href_list["search"]) + num_results = src.get_num_results() + num_pages = Ceiling(num_results/LIBRARY_BOOKS_PER_PAGE) + page_num = 1 + + screenstate = 1 + + if(href_list["back"]) + screenstate = 0 + + if(href_list["flag"]) + if(!dbcon.IsConnected()) + alert("Connection to Archive has been severed. Aborting.") + return + var/id = href_list["flag"] + if(id) + var/datum/cachedbook/B = getBookByID(id) + if(B) + if((input(usr, "Are you sure you want to flag [B.title] as having inappropriate content?", "Flag Book #[B.id]") in list("Yes", "No")) == "Yes") + library_catalog.flag_book_by_id(usr, id) + + add_fingerprint(usr) + updateUsrDialog() return \ No newline at end of file diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 4cdecae1f66..611b84f8100 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -151,6 +151,9 @@ var/global/list/library_section_names = list("Any", "Fiction", "Non-Fiction", "A var/obj/item/book/cache // Last scanned book /obj/machinery/libraryscanner/attackby(obj/item/I, mob/user) + if(default_unfasten_wrench(user, I)) + power_change() + return if(istype(I, /obj/item/book)) user.drop_item() I.forceMove(src) @@ -208,6 +211,9 @@ var/global/list/library_section_names = list("Any", "Fiction", "Non-Fiction", "A /obj/machinery/bookbinder/attackby(obj/item/I, mob/user) var/obj/item/paper/P = I + if(default_unfasten_wrench(user, I)) + power_change() + return if(istype(P)) user.drop_item() user.visible_message("[user] loads some paper into [src].", "You load some paper into [src].") diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index dd28f990322..a8f87338ae8 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -6,6 +6,7 @@ anchored = 1 icon = LIGHTING_ICON layer = LIGHTING_LAYER + plane = LIGHTING_PLANE invisibility = INVISIBILITY_LIGHTING color = LIGHTING_BASE_MATRIX icon_state = "light1" diff --git a/code/modules/logic/dual_input.dm b/code/modules/logic/dual_input.dm index 03bfa4f1688..b8f915ff46d 100644 --- a/code/modules/logic/dual_input.dm +++ b/code/modules/logic/dual_input.dm @@ -45,9 +45,9 @@ /obj/machinery/logic_gate/nand/handle_logic() if((input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER) && (input2_state == LOGIC_ON || input2_state == LOGIC_FLICKER)) - output_state = LOGIC_OFF //This can only output continuous signals - else //At least one input was ON/FLICKER, so output is off - output_state = LOGIC_OFF + output_state = LOGIC_OFF //Both inputs are ON/FLICKER, so output is off + else + output_state = LOGIC_ON //This can only output continuous signals return // NOR Gate @@ -58,9 +58,9 @@ output_state = LOGIC_ON /obj/machinery/logic_gate/nor/handle_logic() - if(input1_state == LOGIC_OFF ||input2_state == LOGIC_OFF) + if(input1_state == LOGIC_OFF && input2_state == LOGIC_OFF) //Both inputs are OFF, so output is ON output_state = LOGIC_ON //This can only output continuous signals - else //Both inputs are ON, so output is OFF + else output_state = LOGIC_OFF return @@ -71,14 +71,15 @@ icon_state = "logic_xor" /obj/machinery/logic_gate/xor/handle_logic() - if((input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER) || input2_state == LOGIC_OFF) //Only input1 is ON/FLICKER, so output matches input1 + if((input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER) && (input2_state == LOGIC_OFF)) //Only input1 is ON/FLICKER, so output matches input1 output_state = input1_state - else if((input2_state == LOGIC_ON || input2_state == LOGIC_FLICKER) || input1_state == LOGIC_OFF) //Only input2 is ON/FLICKER, so output matches input2 + else if((input2_state == LOGIC_ON || input2_state == LOGIC_FLICKER) && (input1_state == LOGIC_OFF)) //Only input2 is ON/FLICKER, so output matches input2 output_state = input2_state else //Both inputs are ON or OFF, so output is OFF output_state = LOGIC_OFF return + // XNOR Gate /obj/machinery/logic_gate/xnor name = "XNOR Gate" diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index 364a918c0ff..0e0d248d8b7 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -7,7 +7,7 @@ var/harvested_name = "shortened mushrooms" var/harvested_desc = "Some quickly regrowing mushrooms, formerly known to be quite large." var/needs_sharp_harvest = TRUE - var/harvest = /obj/item/reagent_containers/food/snacks/ash_flora/shavings + var/harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings var/harvest_amount_low = 1 var/harvest_amount_high = 3 var/harvest_time = 60 @@ -79,7 +79,7 @@ desc = "A number of mushrooms, each of which surrounds a greenish sporangium with a number of leaf-like structures." harvested_name = "leafless mushrooms" harvested_desc = "A bunch of formerly-leafed mushrooms, with their sporangiums exposed. Scandalous?" - harvest = /obj/item/reagent_containers/food/snacks/ash_flora/mushroom_leaf + harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf needs_sharp_harvest = FALSE harvest_amount_high = 4 harvest_time = 20 @@ -95,7 +95,7 @@ desc = "Several mushrooms, the larger of which have a ring of conks at the midpoint of their stems." harvested_name = "small mushrooms" harvested_desc = "Several small mushrooms near the stumps of what likely were larger mushrooms." - harvest = /obj/item/reagent_containers/food/snacks/ash_flora/mushroom_cap + harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap harvest_amount_high = 4 harvest_time = 50 harvest_message_low = "You slice the cap off of a mushroom." @@ -111,7 +111,7 @@ luminosity = 1 harvested_name = "tiny mushrooms" harvested_desc = "A few tiny mushrooms around larger stumps. You can already see them growing back." - harvest = /obj/item/reagent_containers/food/snacks/ash_flora/mushroom_stem + harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem harvest_amount_high = 4 harvest_time = 40 harvest_message_low = "You pick and slice the cap off of a mushroom, leaving the stem." @@ -126,7 +126,7 @@ desc = "Several prickly cacti, brimming with ripe fruit and covered in a thin layer of ash." harvested_name = "cacti" harvested_desc = "A bunch of prickly cacti. You can see fruits slowly growing beneath the covering of ash." - harvest = /obj/item/reagent_containers/food/snacks/ash_flora/cactus_fruit + harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit needs_sharp_harvest = FALSE harvest_amount_high = 2 harvest_time = 10 @@ -149,45 +149,51 @@ H.visible_message("[H] steps on a cactus!", \ "You step on a cactus!") -/obj/item/reagent_containers/food/snacks/ash_flora +/obj/item/reagent_containers/food/snacks/grown/ash_flora name = "mushroom shavings" desc = "Some shavings from a tall mushroom. With enough, might serve as a bowl." icon = 'icons/obj/lavaland/ash_flora.dmi' icon_state = "mushroom_shavings" list_reagents = list("sugar" = 3, "ethanol" = 2, "stabilizing_agent" = 3, "minttoxin" = 2) w_class = WEIGHT_CLASS_TINY + wine_power = 0.2 -/obj/item/reagent_containers/food/snacks/ash_flora/New() +/obj/item/reagent_containers/food/snacks/grown/ash_flora/New() ..() pixel_x = rand(-4, 4) pixel_y = rand(-4, 4) -/obj/item/reagent_containers/food/snacks/ash_flora/shavings //for actual crafting +/obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings //for actual crafting -/obj/item/reagent_containers/food/snacks/ash_flora/mushroom_leaf +/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf name = "mushroom leaf" desc = "A leaf, from a mushroom." list_reagents = list("nutriment" = 3, "vitfro" = 2, "nicotine" = 2) icon_state = "mushroom_leaf" + wine_power = 0.4 -/obj/item/reagent_containers/food/snacks/ash_flora/mushroom_cap +/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap name = "mushroom cap" desc = "The cap of a large mushroom." list_reagents = list("lsd" = 2, "entpoly" = 4, "psilocybin" = 2) icon_state = "mushroom_cap" + wine_power = 0.7 -/obj/item/reagent_containers/food/snacks/ash_flora/mushroom_stem + +/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem name = "mushroom stem" desc = "A long mushroom stem. It's slightly glowing." list_reagents = list("tinlux" = 2, "vitamin" = 1, "space_drugs" = 1) icon_state = "mushroom_stem" luminosity = 1 + wine_power = 0.6 -/obj/item/reagent_containers/food/snacks/ash_flora/cactus_fruit +/obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit name = "cactus fruit" list_reagents = list("vitamin" = 2, "nutriment" = 2, "vitfro" = 4) desc = "A cactus fruit covered in a thick, reddish skin. And some ash." icon_state = "cactus_fruit" + wine_power = 0.5 /obj/item/mushroom_bowl name = "mushroom bowl" @@ -200,6 +206,6 @@ /datum/crafting_recipe/mushroom_bowl name = "Mushroom Bowl" result = /obj/item/reagent_containers/food/drinks/mushroom_bowl - reqs = list(/obj/item/reagent_containers/food/snacks/ash_flora/shavings = 5) + reqs = list(/obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings = 5) time = 30 category = CAT_PRIMAL diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 30e093633f5..52641d70a32 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -73,17 +73,18 @@ check_friendly_fire = 0 /mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weldingtool)) + if(istype(I, /obj/item/weldingtool) && user.a_intent == INTENT_HELP) var/obj/item/weldingtool/W = I if(W.welding && !stat) if(AIStatus != AI_OFF && AIStatus != AI_IDLE) to_chat(user, "[src] is moving around too much to repair!") return - if(maxHealth == health) - to_chat(user, "[src] is at full integrity.") - else - adjustBruteLoss(-10) - to_chat(user, "You repair some of the armor on [src].") + if(do_after_once(user, 15, target = src)) + if(maxHealth == health) + to_chat(user, "[src] is at full integrity.") + else + adjustBruteLoss(-20) + to_chat(user, "You repair some of the armor on [src].") return if(istype(I, /obj/item/mining_scanner) || istype(I, /obj/item/t_scanner/adv_mining_scanner)) to_chat(user, "You instruct [src] to drop any collected ore.") @@ -101,6 +102,18 @@ DropOre(0) qdel(src) +/mob/living/simple_animal/hostile/mining_drone/Shoot(atom/targeted_atom) + var/obj/item/projectile/kinetic/K = ..() + var/turf/proj_turf = get_turf(K) + if(!isturf(proj_turf)) + return + var/datum/gas_mixture/environment = proj_turf.return_air() + var/pressure = environment.return_pressure() + if(pressure > 50) + K.name = "weakened [K.name]" + + K.damage *= K.pressure_decrease + /mob/living/simple_animal/hostile/mining_drone/attack_hand(mob/living/carbon/human/M) if(M.a_intent == INTENT_HELP) toggle_mode() @@ -274,7 +287,9 @@ if(M.maxHealth != initial(M.maxHealth)) to_chat(user, "[M] already has a reinforced chassis!") return + var/previous = M.maxHealth M.maxHealth = 170 + M.health += M.maxHealth - previous to_chat(user, "You reinforce [M]'s chassis.") qdel(src) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 6a067a156ce..7e583216475 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -12,6 +12,7 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi stat = DEAD density = 0 canmove = 0 + alpha = 127 anchored = 1 // don't get pushed around invisibility = INVISIBILITY_OBSERVER var/can_reenter_corpse @@ -48,29 +49,19 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi T = get_turf(body) //Where is the body located? attack_log = body.attack_log //preserve our attack logs by copying them to our ghost - if(ishuman(body)) - var/mob/living/carbon/human/H = body - icon = H.stand_icon - overlays = H.overlays_standing - else - icon = body.icon - icon_state = body.icon_state - overlays = body.overlays - - alpha = 127 - gender = body.gender + var/mutable_appearance/MA = copy_appearance(body) if(body.mind && body.mind.name) - name = body.mind.name + MA.name = body.mind.name + else if(body.real_name) + MA.name = body.real_name else - if(body.real_name) - name = body.real_name + if(gender == MALE) + MA.name = capitalize(pick(GLOB.first_names_male)) + " " + capitalize(pick(GLOB.last_names)) else - if(gender == MALE) - name = capitalize(pick(GLOB.first_names_male)) + " " + capitalize(pick(GLOB.last_names)) - else - name = capitalize(pick(GLOB.first_names_female)) + " " + capitalize(pick(GLOB.last_names)) + MA.name = capitalize(pick(GLOB.first_names_female)) + " " + capitalize(pick(GLOB.last_names)) mind = body.mind //we don't transfer the mind but we keep a reference to it. + appearance = MA ghostimage = image(icon = icon, loc = src, icon_state = icon_state) ghostimage.overlays = overlays @@ -99,6 +90,36 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi updateallghostimages() return ..() +// This seems stupid, but it's the easiest way to avoid absolutely ridiculous shit from happening +// Copying an appearance directly from a mob includes it's verb list, it's invisibility, it's alpha, and it's density +// You might recognize these things as "fucking ridiculous to put in an appearance" +// You'd be right, but that's fucking BYOND for you. +/mob/dead/observer/proc/copy_appearance(mutable_appearance/COPY) + var/mutable_appearance/MA = new(src) + + MA.appearance_flags = COPY.appearance_flags + MA.blend_mode = COPY.blend_mode + MA.color = COPY.color + MA.dir = COPY.dir + MA.gender = COPY.gender + MA.icon = COPY.icon + MA.icon_state = COPY.icon_state + MA.layer = COPY.layer + MA.maptext = COPY.maptext + MA.maptext_width = COPY.maptext_width + MA.maptext_height = COPY.maptext_height + MA.maptext_x = COPY.maptext_x + MA.maptext_y = COPY.maptext_y + MA.mouse_opacity = COPY.mouse_opacity + MA.overlays = COPY.overlays + if(!isicon(MA.icon) && !LAZYLEN(MA.overlays)) // Gibbing/dusting/melting removes the icon before ghostize()ing the mob, so we need to account for that + MA.icon = initial(icon) + MA.icon_state = initial(icon_state) + MA.suffix = COPY.suffix + MA.underlays = COPY.underlays + + . = MA + /mob/dead/CanPass(atom/movable/mover, turf/target, height=0) return 1 diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 43a18678dd9..0a1f2d322ce 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -281,6 +281,15 @@ flags = RESTRICTED | WHITELISTED syllables = list("click","clack") +/datum/language/kidan/get_random_name() + var/new_name = "[pick(list("Vrax", "Krek", "Vriz", "Zrik", "Zarak", "Click", "Zerk", "Drax", "Zven", "Drexx"))]" + new_name += ", " + new_name += "[pick(list("Noble", "Worker", "Scout", "Builder", "Farmer", "Gatherer", "Soldier", "Guard", "Prospector"))]" + new_name += " of Clan " + new_name += "[pick(list("Tristan", "Zarlan", "Clack", "Kkraz", "Zramn", "Orlan", "Zrax"))]" //I ran out of ideas after the first two tbh -_- + return new_name + + /datum/language/slime name = "Bubblish" desc = "The language of slimes. It's a mixture of bubbling noises and pops. Very difficult to speak without mechanical aid for humans." diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index dea7c447191..d9b02ee5e53 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -27,6 +27,7 @@ verbs += /mob/living/verb/lay_down alien_organs += new /obj/item/organ/internal/brain/xeno alien_organs += new /obj/item/organ/internal/xenos/hivenode + alien_organs += new /obj/item/organ/internal/ears for(var/obj/item/organ/internal/I in alien_organs) I.insert(src) ..() @@ -132,6 +133,10 @@ // add some movement delay move_delay_add = min(move_delay_add + round(amount / 2), 10) // a maximum delay of 10 +/mob/living/carbon/alien/movement_delay() + . = ..() + . += move_delay_add + config.alien_delay //move_delay_add is used to slow aliens with stuns + /mob/living/carbon/alien/getDNA() return null diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index da47f8c80b5..e6b45a1649a 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -27,11 +27,6 @@ add_language("Hivemind") ..() - -/mob/living/carbon/alien/humanoid/movement_delay() - . = ..() - . += move_delay_add + config.alien_delay //move_delay_add is used to slow aliens with stuns - /mob/living/carbon/alien/humanoid/Process_Spacemove(var/check_drift = 0) if(..()) return 1 @@ -63,15 +58,12 @@ f_loss += 60 - AdjustEarDamage(30) - AdjustEarDeaf(120) - + AdjustEarDamage(30, 120) if(3.0) b_loss += 30 if(prob(50) && !shielded) Paralyse(1) - AdjustEarDamage(15) - AdjustEarDeaf(60) + AdjustEarDamage(15, 60) take_overall_damage(b_loss, f_loss) diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index 7771f1f5f90..6012a8fb7f3 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -78,14 +78,6 @@ else if(eye_blurry) //blurry eyes heal slowly AdjustEyeBlurry(-1) - //Ears - if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own - EarDeaf(1) - else if(ear_deaf) //deafness, heals slowly over time - AdjustEarDeaf(-1) - else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs - AdjustEarDamage(-0.05) - if(stuttering) AdjustStuttering(-1) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index d0deac3e132..a64750ad93d 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -33,13 +33,11 @@ ..() stat(null, "Progress: [amount_grown]/[max_grown]") - /mob/living/carbon/alien/larva/adjustPlasma(amount) if(stat != DEAD && amount > 0) amount_grown = min(amount_grown + 1, max_grown) ..(amount) - /mob/living/carbon/alien/larva/ex_act(severity) ..() @@ -56,15 +54,13 @@ f_loss += 60 - AdjustEarDamage(30) - AdjustEarDeaf(120) + AdjustEarDamage(30, 120) if(3.0) b_loss += 30 if(prob(50)) Paralyse(1) - AdjustEarDamage(15) - AdjustEarDeaf(60) + AdjustEarDamage(15, 60) adjustBruteLoss(b_loss) adjustFireLoss(f_loss) diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 654e9e27af3..a4b783e08fb 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -46,14 +46,6 @@ else if(eye_blurry) //blurry eyes heal slowly AdjustEyeBlurry(-1) - //Ears - if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own - EarDeaf(1) - else if(ear_deaf) //deafness, heals slowly over time - AdjustEarDeaf(-1) - else if(ear_damage < 25) //ear damage heals slowly under this threshold. - AdjustEarDamage(-0.05) - if(stuttering) AdjustStuttering(-1) diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index d489443cb36..3a752e61619 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -91,7 +91,7 @@ owner.overlays += overlay spawn(6) - var/mob/living/carbon/alien/larva/new_xeno = new(owner.loc) + var/mob/living/carbon/alien/larva/new_xeno = new(owner.drop_location()) new_xeno.key = C.key if(ticker && ticker.mode) ticker.mode.xenos += new_xeno.mind diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index c64318d804b..0f7d4230587 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -108,8 +108,5 @@ I'm using this for Stat to give it a more nifty interface to work with /mob/living/carbon/brain/can_safely_leave_loc() return 0 //You're not supposed to be ethereal jaunting, brains -/mob/living/carbon/brain/SetEarDamage() // no ears to damage or heal - return - -/mob/living/carbon/brain/SetEarDeaf() - return +/mob/living/carbon/brain/can_hear() + . = TRUE diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 0a8f6fb3b83..03675f282e5 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -19,12 +19,6 @@ var/mmi_icon = 'icons/obj/assemblies.dmi' var/mmi_icon_state = "mmi_full" -/obj/item/organ/internal/brain/surgeryize() - if(!owner) - return - owner.SetEarDeaf(0) - owner.SetEarDamage(0) //Yeah, didn't you...hear? The ears are totally inside the brain. - /obj/item/organ/internal/brain/xeno name = "xenomorph brain" desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ea51f819390..b3d4ab3306b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -7,6 +7,7 @@ var/obj/item/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call. /mob/living/carbon/human/New(loc) + icon = null // This is now handled by overlays -- we just keep an icon for the sake of the map editor. if(length(args) > 1) log_runtime(EXCEPTION("human/New called with more than 1 argument (REPORT THIS ENTIRE RUNTIME TO A CODER)")) . = ..() @@ -264,8 +265,7 @@ else valid_limbs -= processing_dismember if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) - AdjustEarDamage(30) - AdjustEarDeaf(120) + AdjustEarDamage(30, 120) if(prob(70) && !shielded) Paralyse(10) @@ -289,8 +289,7 @@ else valid_limbs -= processing_dismember if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) - AdjustEarDamage(15) - AdjustEarDeaf(60) + AdjustEarDamage(15, 60) if(prob(50) && !shielded) Paralyse(10) @@ -731,25 +730,22 @@ if(hasHUD(usr, "security") && setcriminal != "Cancel") found_record = 1 - var/their_name = R.fields["name"] - var/their_rank = R.fields["rank"] if(R.fields["criminal"] == "*Execute*") to_chat(usr, "Unable to modify the sec status of a person with an active Execution order. Use a security computer instead.") - else + else + var/rank if(ishuman(usr)) var/mob/living/carbon/human/U = usr - R.fields["comments"] += "Set to [setcriminal] by [U.get_authentification_name()] ([U.get_assignment()]) on [current_date_string] [station_time_timestamp()] with comment: [t1]
" - if(isrobot(usr)) + rank = U.get_assignment() + else if(isrobot(usr)) var/mob/living/silicon/robot/U = usr - R.fields["comments"] += "Set to [setcriminal] by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [station_time_timestamp()] with comment: [t1]
" - if(isAI(usr)) - var/mob/living/silicon/ai/U = usr - R.fields["comments"] += "Set to [setcriminal] by [U.name] (artificial intelligence) on [current_date_string] [station_time_timestamp()] with comment: [t1]
" - - R.fields["criminal"] = setcriminal - log_admin("[key_name_admin(usr)] set secstatus of [their_rank] [their_name] to [setcriminal], comment: [t1]") - spawn() - sec_hud_set_security_status() + rank = "[U.modtype] [U.braintype]" + else if(isAI(usr)) + rank = "AI" + set_criminal_status(usr, R, setcriminal, t1, rank) + break // Git out of the securiy records loop! + if(found_record) + break // Git out of the general records if(!found_record) to_chat(usr, "Unable to locate a data core entry for this person.") @@ -1527,8 +1523,9 @@ var/obj/item/organ/external/head/head_organ = get_organ("head") var/datum/sprite_accessory/hair/hair_style = GLOB.hair_styles_full_list[head_organ.h_style] var/icon/hair = new /icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - - return image(get_icon_difference(get_eyecon(), hair), layer = LIGHTING_LAYER + 1) //Cut the hair's pixels from the eyes icon so eyes covered by bangs stay hidden even while on a higher layer. + var/mutable_appearance/MA = mutable_appearance(get_icon_difference(get_eyecon(), hair), layer = LIGHTING_LAYER + 1) + MA.plane = LIGHTING_PLANE + return MA //Cut the hair's pixels from the eyes icon so eyes covered by bangs stay hidden even while on a higher layer. /*Used to check if eyes should shine in the dark. Returns the image of the eyes on the layer where they will appear to shine. Eyes need to have significantly high darksight to shine unless the mob has the XRAY vision mutation. Eyes will not shine if they are covered in any way.*/ diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index f13d948842c..ce1d9a7f56e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -786,20 +786,6 @@ AdjustEyeBlurry(-1) - //Ears - if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own - EarDeaf(1) - - else if(ear_deaf) //deafness, heals slowly over time - AdjustEarDeaf(-1) - - else if(istype(l_ear, /obj/item/clothing/ears/earmuffs) || istype(r_ear, /obj/item/clothing/ears/earmuffs)) //resting your ears with earmuffs heals ear damage faster - AdjustEarDamage(-0.15) - EarDeaf(1) - - else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs - AdjustEarDamage(-0.05) - if(flying) animate(src, pixel_y = pixel_y + 5 , time = 10, loop = 1, easing = SINE_EASING) animate(pixel_y = pixel_y - 5, time = 10, loop = 1, easing = SINE_EASING) diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index 5949d127f39..37b67d40f29 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -153,6 +153,9 @@ "l_foot" = list("path" = /obj/item/organ/external/foot), "r_foot" = list("path" = /obj/item/organ/external/foot/right)) + // Mutant pieces + var/obj/item/organ/internal/ears/mutantears = /obj/item/organ/internal/ears + /datum/species/New() //If the species has eyes, they are the default vision organ if(!vision_organ && has_organ["eyes"]) @@ -165,7 +168,6 @@ return species_language.get_random_name(gender) /datum/species/proc/create_organs(mob/living/carbon/human/H) //Handles creation of mob organs. - QDEL_LIST(H.internal_organs) QDEL_LIST(H.bodyparts) @@ -184,12 +186,21 @@ // organ new code calls `insert` on its own new organ(H) + create_mutant_organs(H) + for(var/name in H.bodyparts_by_name) H.bodyparts |= H.bodyparts_by_name[name] for(var/obj/item/organ/external/O in H.bodyparts) O.owner = H +/datum/species/proc/create_mutant_organs(mob/living/carbon/human/H) + var/obj/item/organ/internal/ears/ears = H.get_int_organ(/obj/item/organ/internal/ears) + if(ears) + qdel(ears) + + ears = new mutantears(H) + /datum/species/proc/breathe(mob/living/carbon/human/H) if((NO_BREATHE in species_traits) || (BREATHLESS in H.mutations)) return TRUE @@ -527,7 +538,7 @@ /datum/species/proc/handle_hud_icons_health_side(mob/living/carbon/human/H) if(H.healths) - if(H.stat == DEAD) + if(H.stat == DEAD || (H.status_flags & FAKEDEATH)) H.healths.icon_state = "health7" else switch(H.hal_screwyhud) @@ -546,7 +557,7 @@ /datum/species/proc/handle_hud_icons_health_doll(mob/living/carbon/human/H) if(H.healthdoll) - if(H.stat == DEAD) + if(H.stat == DEAD || (H.status_flags & FAKEDEATH)) H.healthdoll.icon_state = "healthdoll_DEAD" if(H.healthdoll.overlays.len) H.healthdoll.overlays.Cut() diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 8dff1863061..4357584a18e 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -105,68 +105,20 @@ Please contact me on #coderbus IRC. ~Carn x /mob/living/carbon/human var/list/overlays_standing[TOTAL_LAYERS] - var/list/misc_effect_overlays = list() //Overlays that are applied at a custom layer (defined in each image's .layer property) outside of standard overlay application. Updated in update_misc_effects() var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed var/icon/skeleton var/list/cached_standing_overlays = list() // List of everything currently in a human's actual overlays -//UPDATES OVERLAYS FROM OVERLAYS_LYING/OVERLAYS_STANDING -//this proc is messy as I was forced to include some old laggy cloaking code to it so that I don't break cloakers -//I'll work on removing that stuff by rewriting some of the cloaking stuff at a later date. -/mob/living/carbon/human/update_icons() - var/stealth = 0 - var/obj/item/clothing/suit/armor/abductor/vest/V // Begin the most snowflakey bullshit code I've ever written. I'm so sorry, but there was no other way. +/mob/living/carbon/human/proc/apply_overlay(cache_index) + if((. = overlays_standing[cache_index])) + add_overlay(.) - for(V in list(wear_suit)) - if(V.stealth_active) - stealth = 1 - break +/mob/living/carbon/human/proc/remove_overlay(cache_index) + var/I = overlays_standing[cache_index] + if(I) + cut_overlay(I) + overlays_standing[cache_index] = null - if(stealth) - icon = V.disguise.icon //if the suit is active, reference the suit's current loaded icon and overlays; this does not include hand overlays - overlays.Cut() - cached_standing_overlays.Cut() // Make sure the cache gets rebuilt once the disguise is gone - - for(var/thing in V.disguise.overlays) - if(thing) - overlays += thing - - var/image/I = overlays_standing[L_HAND_LAYER] //manually add both left and right hand, so its independently updated - if(istype(I)) - overlays += I - I = overlays_standing[R_HAND_LAYER] - if(istype(I)) - overlays += I - else - icon = stand_icon - var/list/new_overlays = list() - var/list/old_overlays = cached_standing_overlays - - // Totally regenerate if something touched our overlays - if(overlays.len != old_overlays.len) - overlays.Cut() - old_overlays.Cut() - - for(var/i in 1 to TOTAL_LAYERS) - var/image/I = overlays_standing[i] - if(I) - if(istype(I)) - // Since we avoid full overlay rebuilds, we have to reorganize the layers manually - I.layer = (-2 - (TOTAL_LAYERS - i)) // Highest layer gets -2, each prior layer is 1 lower - new_overlays += I - - update_misc_effects() - if(misc_effect_overlays) - new_overlays += misc_effect_overlays - - if(frozen) // Admin freeze overlay - new_overlays += frozen - - overlays += (new_overlays - old_overlays) - overlays -= (old_overlays - new_overlays) - cached_standing_overlays = new_overlays - - update_transform() var/global/list/damage_icon_parts = list() @@ -185,38 +137,42 @@ var/global/list/damage_icon_parts = list() previous_damage_appearance = damage_appearance - var/icon/standing = new /icon(dna.species.damage_overlays, "00") - - var/image/standing_image = new /image("icon" = standing) + remove_overlay(H_DAMAGE_LAYER) + var/mutable_appearance/damage_overlay = mutable_appearance(dna.species.damage_overlays, "00", layer = -H_DAMAGE_LAYER) + overlays_standing[H_DAMAGE_LAYER] = damage_overlay // blend the individual damage states with our icons - for(var/obj/item/organ/external/O in bodyparts) - O.update_icon() - if(O.damage_state == "00") continue + for(var/D in bodyparts) + var/obj/item/organ/external/E = D + E.update_icon() + if(E.damage_state == "00") + continue + var/icon/DI - var/cache_index = "[O.damage_state]/[O.icon_name]/[dna.species.blood_color]/[dna.species.name]" + var/cache_index = "[E.damage_state]/[E.icon_name]/[dna.species.blood_color]/[dna.species.name]" if(damage_icon_parts[cache_index] == null) - DI = new /icon(dna.species.damage_overlays, O.damage_state) // the damage icon for whole human - DI.Blend(new /icon(dna.species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels + DI = new /icon(dna.species.damage_overlays, E.damage_state) // the damage icon for whole human + DI.Blend(new /icon(dna.species.damage_mask, E.icon_name), ICON_MULTIPLY) // mask with this organ's pixels DI.Blend(dna.species.blood_color, ICON_MULTIPLY) damage_icon_parts[cache_index] = DI else DI = damage_icon_parts[cache_index] - standing_image.overlays += DI + damage_overlay.overlays += DI - overlays_standing[H_DAMAGE_LAYER] = standing_image + apply_overlay(H_DAMAGE_LAYER) - if(update_icons) update_icons() //BASE MOB SPRITE /mob/living/carbon/human/proc/update_body(var/update_icons=1, var/rebuild_base=0) + remove_overlay(BODY_LAYER) + remove_overlay(LIMBS_LAYER) // So we don't get the old species' sprite splatted on top of the new one's + remove_overlay(UNDERWEAR_LAYER) - var/husk_color_mod = rgb(96,88,80) - var/hulk_color_mod = rgb(48,224,40) + var/husk_color_mod = rgb(96, 88, 80) + var/hulk_color_mod = rgb(48, 224, 40) var/husk = (HUSK in mutations) - var/fat = (FAT in mutations) var/hulk = (HULK in mutations) var/skeleton = (SKELETON in mutations) @@ -228,42 +184,18 @@ var/global/list/damage_icon_parts = list() //Create a new, blank icon for our mob to use. if(stand_icon) qdel(stand_icon) - stand_icon = new(dna.species.icon_template ? dna.species.icon_template : 'icons/mob/human.dmi',"blank") - var/icon_key = "" - var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes) - if(eyes) - icon_key += "[eyes.eye_colour]" - else - icon_key += "#000000" + update_misc_effects() + stand_icon = new (dna.species.icon_template ? dna.species.icon_template : 'icons/mob/human.dmi', "blank") + var/list/standing = list() + var/icon_key = generate_icon_render_key() - for(var/organ_tag in dna.species.has_limbs) - var/obj/item/organ/external/part = bodyparts_by_name[organ_tag] - if(isnull(part)) - icon_key += "0" - else if(part.is_robotic()) - icon_key += "2[part.model ? "-[part.model]": ""]" - else if(part.status & ORGAN_DEAD) - icon_key += "3" - else - icon_key += "1" - - if(part) - var/datum/species/S = GLOB.all_species[part.dna.species.name] //This has to reference the species datums from round start, since they're global and unchanging - icon_key += "[S.race_key]" - icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]" - icon_key += "[part.dna.GetUIValue(DNA_UI_SKIN_TONE)]" - if(part.s_col) - icon_key += "[part.s_col]" - if(part.s_tone) - icon_key += "[part.s_tone]" - - icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]" - - var/icon/base_icon + var/mutable_appearance/base if(human_icon_cache[icon_key] && !rebuild_base) - base_icon = human_icon_cache[icon_key] + base = human_icon_cache[icon_key] + standing += base else + var/icon/base_icon //BEGIN CACHED ICON GENERATION. var/obj/item/organ/external/chest = get_organ("chest") base_icon = chest.get_icon(skeleton) @@ -272,7 +204,7 @@ var/global/list/damage_icon_parts = list() var/icon/temp = part.get_icon(skeleton) //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST //And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part) - if(part.icon_position&(LEFT|RIGHT)) + if(part.icon_position & (LEFT | RIGHT)) var/icon/temp2 = new('icons/mob/human.dmi',"blank") temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH) temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH) @@ -304,19 +236,16 @@ var/global/list/damage_icon_parts = list() husk_over.Blend(mask, ICON_ADD) base_icon.Blend(husk_over, ICON_OVERLAY) - human_icon_cache[icon_key] = base_icon + var/mutable_appearance/new_base = mutable_appearance(base_icon, layer = -LIMBS_LAYER) + human_icon_cache[icon_key] = new_base + standing += new_base + //END CACHED ICON GENERATION. - //END CACHED ICON GENERATION. - stand_icon.Blend(base_icon,ICON_OVERLAY) - if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && dna.species.bodyflags & TAIL_OVERLAPPED) // If the user's species is flagged to have a tail that needs to be overlapped by limbs... (having a non-tail body accessory like the snake body will override this) - overlays_standing[LIMBS_LAYER] = image(stand_icon) // Diverts limbs to their own layer so they can overlay things (i.e. tails). - else - overlays_standing[LIMBS_LAYER] = null // So we don't get the old species' sprite splatted on top of the new one's + overlays_standing[LIMBS_LAYER] = standing + apply_overlay(LIMBS_LAYER) //Underwear - overlays_standing[UNDERWEAR_LAYER] = null - var/icon/underwear_standing = new/icon('icons/mob/underwear.dmi',"nude") - + var/icon/underwear_standing = new /icon('icons/mob/underwear.dmi', "nude") if(underwear && dna.species.clothing_flags & HAS_UNDERWEAR) var/datum/sprite_accessory/underwear/U = GLOB.underwear_list[underwear] if(U) @@ -327,27 +256,25 @@ var/global/list/damage_icon_parts = list() if(U2) underwear_standing.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY) - if(socks && dna.species.clothing_flags & HAS_SOCKS) var/datum/sprite_accessory/socks/U3 = GLOB.socks_list[socks] if(U3) underwear_standing.Blend(new /icon(U3.icon, "sk_[U3.icon_state]_s"), ICON_OVERLAY) if(underwear_standing) - overlays_standing[UNDERWEAR_LAYER] = image(underwear_standing) - - - if(update_icons) - update_icons() + overlays_standing[UNDERWEAR_LAYER] = mutable_appearance(underwear_standing, layer = -UNDERWEAR_LAYER) + apply_overlay(UNDERWEAR_LAYER) if(lip_style && (LIPS in dna.species.species_traits)) - var/icon/lips = icon("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[lip_style]_s") + var/icon/lips = icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "lips_[lip_style]_s") lips.Blend(lip_color, ICON_ADD) + standing += mutable_appearance(lips, layer = -BODY_LAYER) - stand_icon.Blend(lips, ICON_OVERLAY) - + overlays_standing[BODY_LAYER] = standing + apply_overlay(BODY_LAYER) //tail update_tail_layer(0) + update_int_organs() //head accessory update_head_accessory(0) //markings @@ -360,10 +287,10 @@ var/global/list/damage_icon_parts = list() //MARKINGS OVERLAY /mob/living/carbon/human/proc/update_markings(var/update_icons=1) //Reset our markings. - overlays_standing[MARKINGS_LAYER] = null + remove_overlay(MARKINGS_LAYER) //Base icon. - var/icon/markings_standing = new/icon('icons/mob/body_accessory.dmi',"accessory_none_s") + var/icon/markings_standing = icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "accessory_none_s") //Body markings. var/obj/item/organ/external/chest/chest_organ = get_organ("chest") @@ -371,7 +298,7 @@ var/global/list/damage_icon_parts = list() var/body_marking = m_styles["body"] var/datum/sprite_accessory/body_marking_style = GLOB.marking_styles_list[body_marking] if(body_marking_style && body_marking_style.species_allowed && (dna.species.name in body_marking_style.species_allowed)) - var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s") + var/icon/b_marking_s = icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s") if(body_marking_style.do_colouration) b_marking_s.Blend(m_colours["body"], ICON_ADD) markings_standing.Blend(b_marking_s, ICON_OVERLAY) @@ -381,33 +308,30 @@ var/global/list/damage_icon_parts = list() var/head_marking = m_styles["head"] var/datum/sprite_accessory/head_marking_style = GLOB.marking_styles_list[head_marking] if(head_marking_style && head_marking_style.species_allowed && (head_organ.dna.species.name in head_marking_style.species_allowed)) - var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s") + var/icon/h_marking_s = icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s") if(head_marking_style.do_colouration) h_marking_s.Blend(m_colours["head"], ICON_ADD) markings_standing.Blend(h_marking_s, ICON_OVERLAY) - overlays_standing[MARKINGS_LAYER] = image(markings_standing) - - if(update_icons) update_icons() + overlays_standing[MARKINGS_LAYER] = mutable_appearance(markings_standing, layer = -MARKINGS_LAYER) + apply_overlay(MARKINGS_LAYER) //HEAD ACCESSORY OVERLAY /mob/living/carbon/human/proc/update_head_accessory(var/update_icons=1) //Reset our head accessory - overlays_standing[HEAD_ACCESSORY_LAYER] = null - overlays_standing[HEAD_ACC_OVER_LAYER] = null + remove_overlay(HEAD_ACCESSORY_LAYER) + remove_overlay(HEAD_ACC_OVER_LAYER) var/obj/item/organ/external/head/head_organ = get_organ("head") if(!head_organ) - if(update_icons) update_icons() return //masks and helmets can obscure our head accessory if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) - if(update_icons) update_icons() return //base icons - var/icon/head_accessory_standing = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s") + var/icon/head_accessory_standing = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s") if(head_organ.ha_style && (head_organ.dna.species.bodyflags & HAS_HEAD_ACCESSORY)) var/datum/sprite_accessory/head_accessory/head_accessory_style = GLOB.head_accessory_styles_list[head_organ.ha_style] if(head_accessory_style && head_accessory_style.species_allowed) @@ -419,38 +343,33 @@ var/global/list/damage_icon_parts = list() //Having it this way preserves animations. Useful for animated antennae. if(head_accessory_style.over_hair) //Select which layer to use based on the properties of the head accessory style. - overlays_standing[HEAD_ACC_OVER_LAYER] = image(head_accessory_standing) + overlays_standing[HEAD_ACC_OVER_LAYER] = mutable_appearance(head_accessory_standing, layer = -HEAD_ACC_OVER_LAYER) + apply_overlay(HEAD_ACC_OVER_LAYER) else - overlays_standing[HEAD_ACCESSORY_LAYER] = image(head_accessory_standing) + overlays_standing[HEAD_ACCESSORY_LAYER] = mutable_appearance(head_accessory_standing, layer = -HEAD_ACCESSORY_LAYER) + apply_overlay(HEAD_ACCESSORY_LAYER) else //warning("Invalid ha_style for [species.name]: [ha_style]") - if(update_icons) update_icons() //HAIR OVERLAY /mob/living/carbon/human/proc/update_hair(var/update_icons=1) //Reset our hair - overlays_standing[HAIR_LAYER] = null + remove_overlay(HAIR_LAYER) var/obj/item/organ/external/head/head_organ = get_organ("head") if(!head_organ) - if(update_icons) update_icons() return //masks and helmets can obscure our hair, unless we're a synthetic if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) - if(update_icons) update_icons() return //base icons var/icon/hair_standing = new /icon('icons/mob/human_face.dmi',"bald_s") - //var/icon/debrained_s = new /icon("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained_s") - if(head_organ.h_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic()))) var/datum/sprite_accessory/hair/hair_style = GLOB.hair_styles_full_list[head_organ.h_style] - //if(!src.get_int_organ(/obj/item/organ/internal/brain) && !ismachine(src))//make it obvious we have NO BRAIN - // hair_standing.Blend(debrained_s, ICON_OVERLAY) if(hair_style && hair_style.species_allowed) if((head_organ.dna.species.name in hair_style.species_allowed) || (head_organ.dna.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") @@ -471,30 +390,26 @@ var/global/list/damage_icon_parts = list() //warning("Invalid h_style for [species.name]: [h_style]") //hair_standing.Blend(debrained_s, ICON_OVERLAY)//how does i overlay for fish? - overlays_standing[HAIR_LAYER] = image(hair_standing) - - if(update_icons) update_icons() + overlays_standing[HAIR_LAYER] = mutable_appearance(hair_standing, layer = -HAIR_LAYER) + apply_overlay(HAIR_LAYER) //FACIAL HAIR OVERLAY /mob/living/carbon/human/proc/update_fhair(var/update_icons=1) //Reset our facial hair - overlays_standing[FHAIR_LAYER] = null - overlays_standing[FHAIR_OVER_LAYER] = null + remove_overlay(FHAIR_LAYER) + remove_overlay(FHAIR_OVER_LAYER) var/obj/item/organ/external/head/head_organ = get_organ("head") if(!head_organ) - if(update_icons) update_icons() return //masks and helmets can obscure our facial hair, unless we're a synthetic if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) - if(update_icons) update_icons() return //base icons var/icon/face_standing = new /icon('icons/mob/human_face.dmi',"bald_s") - if(head_organ.f_style) var/datum/sprite_accessory/facial_hair/facial_hair_style = GLOB.facial_hair_styles_list[head_organ.f_style] if(facial_hair_style && facial_hair_style.species_allowed) @@ -514,46 +429,49 @@ var/global/list/damage_icon_parts = list() face_standing.Blend(facial_s, ICON_OVERLAY) if(facial_hair_style.over_hair) //Select which layer to use based on the properties of the facial hair style. - overlays_standing[FHAIR_OVER_LAYER] = image(face_standing) + overlays_standing[FHAIR_OVER_LAYER] = mutable_appearance(face_standing, layer = -FHAIR_OVER_LAYER) + apply_overlay(FHAIR_OVER_LAYER) else - overlays_standing[FHAIR_LAYER] = image(face_standing) + overlays_standing[FHAIR_LAYER] = mutable_appearance(face_standing, layer = -FHAIR_LAYER) + apply_overlay(FHAIR_LAYER) else //warning("Invalid f_style for [species.name]: [f_style]") - if(update_icons) update_icons() + /mob/living/carbon/human/update_mutations(var/update_icons=1) + remove_overlay(MUTATIONS_LAYER) var/fat if(FAT in mutations) fat = "fat" - var/image/standing = image("icon" = 'icons/effects/genetics.dmi') + var/mutable_appearance/standing = mutable_appearance('icons/effects/genetics.dmi', layer = -MUTATIONS_LAYER) var/add_image = 0 var/g = "m" - if(gender == FEMALE) g = "f" + if(gender == FEMALE) + g = "f" // DNA2 - Drawing underlays. for(var/datum/dna/gene/gene in dna_genes) if(!gene.block) continue if(gene.is_active(src)) - var/underlay=gene.OnDrawUnderlays(src,g,fat) + var/underlay = gene.OnDrawUnderlays(src, g, fat) if(underlay) standing.underlays += underlay add_image = 1 for(var/mut in mutations) switch(mut) if(LASER) - standing.overlays += "lasereyes_s" + standing.overlays += "lasereyes_s" add_image = 1 if((COLDRES in mutations) && (HEATRES in mutations)) - standing.underlays -= "cold[fat]_s" - standing.underlays -= "fire[fat]_s" - standing.underlays += "coldfire[fat]_s" + standing.underlays -= "cold[fat]_s" + standing.underlays -= "fire[fat]_s" + standing.underlays += "coldfire[fat]_s" + if(add_image) - overlays_standing[MUTATIONS_LAYER] = standing - else - overlays_standing[MUTATIONS_LAYER] = null - if(update_icons) update_icons() + overlays_standing[MUTATIONS_LAYER] = standing + apply_overlay(MUTATIONS_LAYER) /mob/living/carbon/human/proc/update_mutantrace(var/update_icons=1) @@ -566,17 +484,14 @@ var/global/list/damage_icon_parts = list() update_hair(0) update_fhair(0) - if(update_icons) update_icons() /mob/living/carbon/human/update_fire() + remove_overlay(FIRE_LAYER) if(on_fire) if(!overlays_standing[FIRE_LAYER]) - overlays_standing[FIRE_LAYER] = image("icon"=fire_dmi, "icon_state"=fire_sprite) - update_icons() - else - overlays_standing[FIRE_LAYER] = null - update_icons() + overlays_standing[FIRE_LAYER] = mutable_appearance(fire_dmi, fire_sprite, layer = -FIRE_LAYER) + apply_overlay(FIRE_LAYER) /* --------------------------------------- */ //For legacy support. @@ -617,7 +532,7 @@ var/global/list/damage_icon_parts = list() //vvvvvv UPDATE_INV PROCS vvvvvv /mob/living/carbon/human/update_inv_w_uniform(var/update_icons=1) - + remove_overlay(UNIFORM_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_w_uniform] if(inv) @@ -630,9 +545,10 @@ var/global/list/damage_icon_parts = list() client.screen += w_uniform //Either way, add the item to the HUD var/t_color = w_uniform.item_color - if(!t_color) t_color = icon_state - var/image/standing = image("icon_state" = "[t_color]_s") + if(!t_color) + t_color = icon_state + var/mutable_appearance/standing = mutable_appearance('icons/mob/uniform.dmi', "[t_color]_s", layer = -UNIFORM_LAYER) if(FAT in mutations) if(w_uniform.flags_size & ONESIZEFITSALL) standing.icon = 'icons/mob/uniform_fat.dmi' @@ -640,8 +556,6 @@ var/global/list/damage_icon_parts = list() to_chat(src, "You burst out of \the [w_uniform]!") unEquip(w_uniform) return - else - standing.icon = 'icons/mob/uniform.dmi' if(w_uniform.icon_override) standing.icon = w_uniform.icon_override @@ -650,13 +564,14 @@ var/global/list/damage_icon_parts = list() if(w_uniform.blood_DNA) var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "uniformblood") - bloodsies.color = w_uniform.blood_color - standing.overlays += bloodsies + bloodsies.color = w_uniform.blood_color + standing.overlays += bloodsies - if(w_uniform:accessories.len) //WE CHECKED THE TYPE ABOVE. THIS REALLY SHOULD BE FINE. + if(w_uniform:accessories.len) //WE CHECKED THE TYPE ABOVE. THIS REALLY SHOULD BE FINE. // oh my god kys whoever made this if statement jfc :gun: for(var/obj/item/clothing/accessory/A in w_uniform:accessories) var/tie_color = A.item_color - if(!tie_color) tie_color = A.icon_state + if(!tie_color) + tie_color = A.icon_state if(A.icon_override) standing.overlays += image("icon" = A.icon_override, "icon_state" = "[A.icon_state]") else if(A.sprite_sheets && A.sprite_sheets[dna.species.name]) @@ -664,25 +579,24 @@ var/global/list/damage_icon_parts = list() else standing.overlays += image("icon" = 'icons/mob/ties.dmi', "icon_state" = "[tie_color]") - overlays_standing[UNIFORM_LAYER] = standing + overlays_standing[UNIFORM_LAYER] = standing else - overlays_standing[UNIFORM_LAYER] = null // Automatically drop anything in store / id / belt if you're not wearing a uniform. //CHECK IF NECESARRY - for( var/obj/item/thing in list(r_store, l_store, wear_id, wear_pda, belt) ) // - if(thing) // - unEquip(thing) // - if(client) // - client.screen -= thing // - // + for(var/obj/item/thing in list(r_store, l_store, wear_id, wear_pda, belt)) // whoever made this + if(thing) // you're a piece of fucking garbage + unEquip(thing) // why the fuck would you goddamn do this motherfucking shit + if(client) // INVENTORY CODE IN FUCKING ICON CODE + client.screen -= thing // WHAT THE FUCKING FUCK BAY GODDAMNIT + // **I FUCKING HATE YOU AAAAAAAAAA** if(thing) // thing.loc = loc // thing.dropped(src) // thing.layer = initial(thing.layer) thing.plane = initial(thing.plane) - if(update_icons) update_icons() + apply_overlay(UNIFORM_LAYER) /mob/living/carbon/human/update_inv_wear_id(var/update_icons=1) - + remove_overlay(ID_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_wear_id] if(inv) @@ -694,16 +608,11 @@ var/global/list/damage_icon_parts = list() client.screen += wear_id if(w_uniform && w_uniform:displays_id) - overlays_standing[ID_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "id") - else - overlays_standing[ID_LAYER] = null - else - overlays_standing[ID_LAYER] = null - - if(update_icons) update_icons() + overlays_standing[ID_LAYER] = mutable_appearance('icons/mob/mob.dmi', "id", layer = -ID_LAYER) + apply_overlay(ID_LAYER) /mob/living/carbon/human/update_inv_gloves(var/update_icons=1) - + remove_overlay(GLOVES_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_gloves] if(inv) @@ -718,32 +627,30 @@ var/global/list/damage_icon_parts = list() var/t_state = gloves.item_state if(!t_state) t_state = gloves.icon_state - var/image/standing + var/mutable_appearance/standing if(gloves.icon_override) - standing = image("icon" = gloves.icon_override, "icon_state" = "[t_state]") + standing = mutable_appearance(gloves.icon_override, "[t_state]", layer = -GLOVES_LAYER) else if(gloves.sprite_sheets && gloves.sprite_sheets[dna.species.name]) - standing = image("icon" = gloves.sprite_sheets[dna.species.name], "icon_state" = "[t_state]") + standing = mutable_appearance(gloves.sprite_sheets[dna.species.name], "[t_state]", layer = -GLOVES_LAYER) else - standing = image("icon" = 'icons/mob/hands.dmi', "icon_state" = "[t_state]") + standing = mutable_appearance('icons/mob/hands.dmi', "[t_state]", layer = -GLOVES_LAYER) if(gloves.blood_DNA) var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "bloodyhands") bloodsies.color = gloves.blood_color - standing.overlays += bloodsies + standing.overlays += bloodsies overlays_standing[GLOVES_LAYER] = standing else if(blood_DNA) - var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "bloodyhands") + var/mutable_appearance/bloodsies = mutable_appearance(dna.species.blood_mask, "bloodyhands", layer = -GLOVES_LAYER) bloodsies.color = hand_blood_color overlays_standing[GLOVES_LAYER] = bloodsies - else - overlays_standing[GLOVES_LAYER] = null - if(update_icons) update_icons() + apply_overlay(GLOVES_LAYER) /mob/living/carbon/human/update_inv_glasses(var/update_icons=1) - overlays_standing[GLASSES_LAYER] = null - overlays_standing[GLASSES_OVER_LAYER] = null + remove_overlay(GLASSES_LAYER) + remove_overlay(GLASSES_OVER_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_glasses] @@ -751,7 +658,7 @@ var/global/list/damage_icon_parts = list() inv.update_icon() if(glasses) - var/image/new_glasses + var/mutable_appearance/new_glasses var/obj/item/organ/external/head/head_organ = get_organ("head") if(client && hud_used && hud_used.hud_shown) if(hud_used.inventory_shown) //if the inventory is open ... @@ -759,22 +666,23 @@ var/global/list/damage_icon_parts = list() client.screen += glasses //Either way, add the item to the HUD if(glasses.icon_override) - new_glasses = image("icon" = glasses.icon_override, "icon_state" = "[glasses.icon_state]") + new_glasses = mutable_appearance(glasses.icon_override, "[glasses.icon_state]", layer = -GLASSES_LAYER) else if(glasses.sprite_sheets && glasses.sprite_sheets[head_organ.dna.species.name]) - new_glasses = image("icon" = glasses.sprite_sheets[head_organ.dna.species.name], "icon_state" = "[glasses.icon_state]") + new_glasses = mutable_appearance(glasses.sprite_sheets[head_organ.dna.species.name], "[glasses.icon_state]", layer = -GLASSES_LAYER) else - new_glasses = image("icon" = 'icons/mob/eyes.dmi', "icon_state" = "[glasses.icon_state]") + new_glasses = mutable_appearance('icons/mob/eyes.dmi', "[glasses.icon_state]", layer = -GLASSES_LAYER) var/datum/sprite_accessory/hair/hair_style = GLOB.hair_styles_full_list[head_organ.h_style] if(hair_style && hair_style.glasses_over) //Select which layer to use based on the properties of the hair style. Hair styles with hair that don't overhang the arms of the glasses should have glasses_over set to a positive value. + new_glasses.layer = -GLASSES_OVER_LAYER overlays_standing[GLASSES_OVER_LAYER] = new_glasses + apply_overlay(GLASSES_OVER_LAYER) else overlays_standing[GLASSES_LAYER] = new_glasses - - if(update_icons) update_icons() + apply_overlay(GLASSES_LAYER) /mob/living/carbon/human/update_inv_ears(var/update_icons=1) - + remove_overlay(EARS_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_l_ear] if(inv) @@ -795,12 +703,12 @@ var/global/list/damage_icon_parts = list() var/t_type = l_ear.icon_state if(l_ear.icon_override) t_type = "[t_type]_l" - overlays_standing[EARS_LAYER] = image("icon" = l_ear.icon_override, "icon_state" = "[t_type]") + overlays_standing[EARS_LAYER] = mutable_appearance(l_ear.icon_override, "[t_type]", layer = -EARS_LAYER) else if(l_ear.sprite_sheets && l_ear.sprite_sheets[dna.species.name]) t_type = "[t_type]_l" - overlays_standing[EARS_LAYER] = image("icon" = l_ear.sprite_sheets[dna.species.name], "icon_state" = "[t_type]") + overlays_standing[EARS_LAYER] = mutable_appearance(l_ear.sprite_sheets[dna.species.name], "[t_type]", layer = -EARS_LAYER) else - overlays_standing[EARS_LAYER] = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]") + overlays_standing[EARS_LAYER] = mutable_appearance('icons/mob/ears.dmi', "[t_type]", layer = -EARS_LAYER) if(r_ear) if(client && hud_used && hud_used.hud_shown) @@ -811,19 +719,16 @@ var/global/list/damage_icon_parts = list() var/t_type = r_ear.icon_state if(r_ear.icon_override) t_type = "[t_type]_r" - overlays_standing[EARS_LAYER] = image("icon" = r_ear.icon_override, "icon_state" = "[t_type]") + overlays_standing[EARS_LAYER] = mutable_appearance(r_ear.icon_override, "[t_type]", layer = -EARS_LAYER) else if(r_ear.sprite_sheets && r_ear.sprite_sheets[dna.species.name]) t_type = "[t_type]_r" - overlays_standing[EARS_LAYER] = image("icon" = r_ear.sprite_sheets[dna.species.name], "icon_state" = "[t_type]") + overlays_standing[EARS_LAYER] = mutable_appearance(r_ear.sprite_sheets[dna.species.name], "[t_type]", layer = -EARS_LAYER) else - overlays_standing[EARS_LAYER] = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]") - - else - overlays_standing[EARS_LAYER] = null - if(update_icons) update_icons() + overlays_standing[EARS_LAYER] = mutable_appearance('icons/mob/ears.dmi', "[t_type]", layer = -EARS_LAYER) + apply_overlay(EARS_LAYER) /mob/living/carbon/human/update_inv_shoes(var/update_icons=1) - + remove_overlay(SHOES_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_shoes] if(inv) @@ -835,13 +740,13 @@ var/global/list/damage_icon_parts = list() shoes.screen_loc = ui_shoes //...draw the item in the inventory screen client.screen += shoes //Either way, add the item to the HUD - var/image/standing + var/mutable_appearance/standing if(shoes.icon_override) - standing = image("icon" = shoes.icon_override, "icon_state" = "[shoes.icon_state]") + standing = mutable_appearance(shoes.icon_override, "[shoes.icon_state]", layer = -SHOES_LAYER) else if(shoes.sprite_sheets && shoes.sprite_sheets[dna.species.name]) - standing = image("icon" = shoes.sprite_sheets[dna.species.name], "icon_state" = "[shoes.icon_state]") + standing = mutable_appearance(shoes.sprite_sheets[dna.species.name], "[shoes.icon_state]", layer = -SHOES_LAYER) else - standing = image("icon" = 'icons/mob/feet.dmi', "icon_state" = "[shoes.icon_state]") + standing = mutable_appearance('icons/mob/feet.dmi', "[shoes.icon_state]", layer = -SHOES_LAYER) if(shoes.blood_DNA) @@ -851,15 +756,13 @@ var/global/list/damage_icon_parts = list() overlays_standing[SHOES_LAYER] = standing else if(feet_blood_DNA) - var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "shoeblood") + var/mutable_appearance/bloodsies = mutable_appearance(dna.species.blood_mask, "shoeblood", layer = -SHOES_LAYER) bloodsies.color = feet_blood_color overlays_standing[SHOES_LAYER] = bloodsies - else - overlays_standing[SHOES_LAYER] = null - if(update_icons) update_icons() + apply_overlay(SHOES_LAYER) /mob/living/carbon/human/update_inv_s_store(var/update_icons=1) - + remove_overlay(SUIT_STORE_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_s_store] if(inv) @@ -874,42 +777,37 @@ var/global/list/damage_icon_parts = list() if(!t_state) t_state = s_store.icon_state var/dmi='icons/mob/belt_mirror.dmi' - overlays_standing[SUIT_STORE_LAYER] = image("icon" = dmi, "icon_state" = "[t_state]") + overlays_standing[SUIT_STORE_LAYER] = mutable_appearance(dmi, "[t_state]", layer = -SUIT_STORE_LAYER) s_store.screen_loc = ui_sstore1 //TODO - else - overlays_standing[SUIT_STORE_LAYER] = null - if(update_icons) update_icons() + apply_overlay(SUIT_STORE_LAYER) /mob/living/carbon/human/update_inv_head(var/update_icons=1) ..() + remove_overlay(HEAD_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_head] if(inv) inv.update_icon() if(head) - var/image/standing + var/mutable_appearance/standing if(head.icon_override) - standing = image("icon" = head.icon_override, "icon_state" = "[head.icon_state]") + standing = mutable_appearance(head.icon_override, "[head.icon_state]", layer = -HEAD_LAYER) else if(head.sprite_sheets && head.sprite_sheets[dna.species.name]) - standing = image("icon" = head.sprite_sheets[dna.species.name], "icon_state" = "[head.icon_state]") + standing = mutable_appearance(head.sprite_sheets[dna.species.name], "[head.icon_state]", layer = -HEAD_LAYER) else - standing = image("icon" = 'icons/mob/head.dmi', "icon_state" = "[head.icon_state]") + standing = mutable_appearance('icons/mob/head.dmi', "[head.icon_state]", layer = -HEAD_LAYER) if(head.blood_DNA) var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "helmetblood") bloodsies.color = head.blood_color - standing.overlays += bloodsies - overlays_standing[HEAD_LAYER] = standing - - - else - overlays_standing[HEAD_LAYER] = null - if(update_icons) update_icons() + standing.overlays += bloodsies + overlays_standing[HEAD_LAYER] = standing + apply_overlay(HEAD_LAYER) /mob/living/carbon/human/update_inv_belt(var/update_icons=1) - + remove_overlay(BELT_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_belt] if(inv) @@ -921,21 +819,21 @@ var/global/list/damage_icon_parts = list() if(belt) var/t_state = belt.item_state - if(!t_state) t_state = belt.icon_state + if(!t_state) + t_state = belt.icon_state if(belt.icon_override) t_state = "[t_state]_be" - overlays_standing[BELT_LAYER] = image("icon" = belt.icon_override, "icon_state" = "[t_state]") + overlays_standing[BELT_LAYER] = mutable_appearance(belt.icon_override, "[t_state]", layer = -BELT_LAYER) else if(belt.sprite_sheets && belt.sprite_sheets[dna.species.name]) - overlays_standing[BELT_LAYER] = image("icon" = belt.sprite_sheets[dna.species.name], "icon_state" = "[t_state]") + overlays_standing[BELT_LAYER] = mutable_appearance(belt.sprite_sheets[dna.species.name], "[t_state]", layer = -BELT_LAYER) else - overlays_standing[BELT_LAYER] = image("icon" = 'icons/mob/belt.dmi', "icon_state" = "[t_state]") - else - overlays_standing[BELT_LAYER] = null - if(update_icons) update_icons() + overlays_standing[BELT_LAYER] = mutable_appearance('icons/mob/belt.dmi', "[t_state]", layer = -BELT_LAYER) + apply_overlay(BELT_LAYER) /mob/living/carbon/human/update_inv_wear_suit(var/update_icons=1) + remove_overlay(SUIT_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_wear_suit] if(inv) @@ -947,47 +845,37 @@ var/global/list/damage_icon_parts = list() wear_suit.screen_loc = ui_oclothing //TODO //...draw the item in the inventory screen client.screen += wear_suit //Either way, add the item to the HUD - var/image/standing + var/mutable_appearance/standing if(wear_suit.icon_override) - standing = image("icon" = wear_suit.icon_override, "icon_state" = "[wear_suit.icon_state]") + standing = mutable_appearance(wear_suit.icon_override, "[wear_suit.icon_state]", layer = -SUIT_LAYER) else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[dna.species.name]) - standing = image("icon" = wear_suit.sprite_sheets[dna.species.name], "icon_state" = "[wear_suit.icon_state]") + standing = mutable_appearance(wear_suit.sprite_sheets[dna.species.name], "[wear_suit.icon_state]", layer = -SUIT_LAYER) else if(FAT in mutations) if(wear_suit.flags_size & ONESIZEFITSALL) - standing = image("icon" = 'icons/mob/suit_fat.dmi', "icon_state" = "[wear_suit.icon_state]") + standing = mutable_appearance('icons/mob/suit_fat.dmi', "[wear_suit.icon_state]", layer = -SUIT_LAYER) else to_chat(src, "You burst out of \the [wear_suit]!") unEquip(wear_suit) return else - standing = image("icon" = 'icons/mob/suit.dmi', "icon_state" = "[wear_suit.icon_state]") - + standing = mutable_appearance('icons/mob/suit.dmi', "[wear_suit.icon_state]", layer = -SUIT_LAYER) if(wear_suit.breakouttime) drop_l_hand() drop_r_hand() - if(wear_suit.blood_DNA) var/obj/item/clothing/suit/S = wear_suit var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "[S.blood_overlay_type]blood") bloodsies.color = wear_suit.blood_color - standing.overlays += bloodsies + standing.overlays += bloodsies + overlays_standing[SUIT_LAYER] = standing - overlays_standing[SUIT_LAYER] = standing - - update_tail_layer(0) - - else - overlays_standing[SUIT_LAYER] = null - - update_tail_layer(0) - + apply_overlay(SUIT_LAYER) + update_tail_layer(0) update_collar(0) - if(update_icons) update_icons() - /mob/living/carbon/human/update_inv_pockets() if(client && hud_used) var/obj/screen/inventory/inv @@ -1021,6 +909,7 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/update_inv_wear_mask(var/update_icons = 1) ..() + remove_overlay(FACEMASK_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_wear_mask] if(inv) @@ -1031,107 +920,94 @@ var/global/list/damage_icon_parts = list() if(head_organ.alt_head && head_organ.alt_head != "None") alternate_head = GLOB.alt_heads_list[head_organ.alt_head] - var/image/standing + var/mutable_appearance/standing var/icon/mask_icon = new(wear_mask.icon) if(wear_mask.icon_override) mask_icon = new(wear_mask.icon_override) - standing = image("icon" = wear_mask.icon_override, "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]") + standing = mutable_appearance(wear_mask.icon_override, "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER) else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[dna.species.name]) mask_icon = new(wear_mask.sprite_sheets[dna.species.name]) - standing = image("icon" = wear_mask.sprite_sheets[dna.species.name], "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]") + standing = mutable_appearance(wear_mask.sprite_sheets[dna.species.name], "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER) else - standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]") + standing = mutable_appearance('icons/mob/mask.dmi', "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER) if(!istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA) var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "maskblood") bloodsies.color = wear_mask.blood_color standing.overlays += bloodsies - overlays_standing[FACEMASK_LAYER] = standing - else - overlays_standing[FACEMASK_LAYER] = null - if(update_icons) update_icons() + overlays_standing[FACEMASK_LAYER] = standing + apply_overlay(FACEMASK_LAYER) /mob/living/carbon/human/update_inv_back(var/update_icons=1) ..() + remove_overlay(BACK_LAYER) if(back) //determine the icon to use - var/icon/standing + var/mutable_appearance/standing if(back.icon_override) - standing = image("icon" = back.icon_override, "icon_state" = "[back.icon_state]") + standing = mutable_appearance(back.icon_override, "[back.icon_state]", layer = -BACK_LAYER) else if(istype(back, /obj/item/rig)) //If this is a rig and a mob_icon is set, it will take species into account in the rig update_icon() proc. var/obj/item/rig/rig = back standing = rig.mob_icon else if(back.sprite_sheets && back.sprite_sheets[dna.species.name]) - standing = image("icon" = back.sprite_sheets[dna.species.name], "icon_state" = "[back.icon_state]") + standing = mutable_appearance(back.sprite_sheets[dna.species.name], "[back.icon_state]", layer = -BACK_LAYER) else - standing = image("icon" = 'icons/mob/back.dmi', "icon_state" = "[back.icon_state]") + standing = mutable_appearance('icons/mob/back.dmi', "[back.icon_state]", layer = -BACK_LAYER) //create the image overlays_standing[BACK_LAYER] = standing - else - overlays_standing[BACK_LAYER] = null - - if(update_icons) update_icons() + apply_overlay(BACK_LAYER) /mob/living/carbon/human/update_inv_handcuffed(var/update_icons=1) - overlays_standing[HANDCUFF_LAYER] = null + remove_overlay(HANDCUFF_LAYER) if(handcuffed) if(istype(handcuffed, /obj/item/restraints/handcuffs/pinkcuffs)) - overlays_standing[HANDCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "pinkcuff1") + overlays_standing[HANDCUFF_LAYER] = mutable_appearance('icons/mob/mob.dmi', "pinkcuff1", layer = -HANDCUFF_LAYER) else - overlays_standing[HANDCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "handcuff1") - - if(update_icons) - update_icons() + overlays_standing[HANDCUFF_LAYER] = mutable_appearance('icons/mob/mob.dmi', "handcuff1", layer = -HANDCUFF_LAYER) + apply_overlay(HANDCUFF_LAYER) /mob/living/carbon/human/update_inv_legcuffed(var/update_icons=1) + remove_overlay(LEGCUFF_LAYER) clear_alert("legcuffed") if(legcuffed) - overlays_standing[LEGCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "legcuff1") + overlays_standing[LEGCUFF_LAYER] = mutable_appearance('icons/mob/mob.dmi', "legcuff1", layer = -LEGCUFF_LAYER) throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed) if(m_intent != MOVE_INTENT_WALK) m_intent = MOVE_INTENT_WALK if(hud_used && hud_used.move_intent) hud_used.move_intent.icon_state = "walking" - - else - overlays_standing[LEGCUFF_LAYER] = null - if(update_icons) - update_icons() + apply_overlay(LEGCUFF_LAYER) /mob/living/carbon/human/update_inv_r_hand(var/update_icons=1) ..() + remove_overlay(R_HAND_LAYER) if(r_hand) var/t_state = r_hand.item_state if(!t_state) t_state = r_hand.icon_state - var/image/I = image("icon" = r_hand.righthand_file, "icon_state" = "[t_state]") + var/mutable_appearance/I = mutable_appearance(r_hand.righthand_file, "[t_state]", layer = -R_HAND_LAYER) I = center_image(I, r_hand.inhand_x_dimension, r_hand.inhand_y_dimension) overlays_standing[R_HAND_LAYER] = I - else - overlays_standing[R_HAND_LAYER] = null - if(update_icons) - update_icons() + apply_overlay(R_HAND_LAYER) /mob/living/carbon/human/update_inv_l_hand(var/update_icons=1) ..() + remove_overlay(L_HAND_LAYER) if(l_hand) var/t_state = l_hand.item_state if(!t_state) t_state = l_hand.icon_state - var/image/I = image("icon" = l_hand.lefthand_file, "icon_state" = "[t_state]") + var/mutable_appearance/I = mutable_appearance(l_hand.lefthand_file, "[t_state]", layer = -L_HAND_LAYER) I = center_image(I, l_hand.inhand_x_dimension, l_hand.inhand_y_dimension) overlays_standing[L_HAND_LAYER] = I - else - overlays_standing[L_HAND_LAYER] = null - if(update_icons) - update_icons() + apply_overlay(L_HAND_LAYER) //human HUD updates for items in our inventory @@ -1157,10 +1033,11 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/proc/update_tail_layer(var/update_icons=1) - overlays_standing[TAIL_UNDERLIMBS_LAYER] = null // SEW direction icons, overlayed by LIMBS_LAYER. - overlays_standing[TAIL_LAYER] = null /* This will be one of two things: - If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such. - Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions. */ + remove_overlay(TAIL_UNDERLIMBS_LAYER) // SEW direction icons, overlayed by LIMBS_LAYER. + remove_overlay(TAIL_LAYER) /* This will be one of two things: + If the species' tail is overlapped by limbs, this will be only the N direction icon so tails + can still appear on the outside of uniforms and such. + Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions. */ var/icon/tail_marking_icon var/datum/sprite_accessory/body_markings/tail/tail_marking_style @@ -1184,16 +1061,25 @@ var/global/list/damage_icon_parts = list() under.Insert(new/icon(accessory_s, dir=EAST), dir=EAST) under.Insert(new/icon(accessory_s, dir=WEST), dir=WEST) - overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + var/mutable_appearance/underlimbs = mutable_appearance(under, layer = -TAIL_UNDERLIMBS_LAYER) + underlimbs.pixel_x = body_accessory.pixel_x_offset + underlimbs.pixel_y = body_accessory.pixel_y_offset + overlays_standing[TAIL_UNDERLIMBS_LAYER] = underlimbs // Creates a blank icon, and copies accessory_s' north direction sprite into it // before passing that to the tail layer that overlays uniforms and such. var/icon/over = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "accessory_none_s") over.Insert(new/icon(accessory_s, dir=NORTH), dir=NORTH) - overlays_standing[TAIL_LAYER] = image(over, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + var/mutable_appearance/tail = mutable_appearance(over, layer = -TAIL_LAYER) + tail.pixel_x = body_accessory.pixel_x_offset + tail.pixel_y = body_accessory.pixel_y_offset + overlays_standing[TAIL_LAYER] = tail else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation. - overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + var/mutable_appearance/tail = mutable_appearance(accessory_s, layer = -TAIL_LAYER) + tail.pixel_x = body_accessory.pixel_x_offset + tail.pixel_y = body_accessory.pixel_y_offset + overlays_standing[TAIL_LAYER] = tail else if(tail && dna.species.bodyflags & HAS_TAIL) //no tailless tajaran if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space)) @@ -1209,25 +1095,24 @@ var/global/list/damage_icon_parts = list() under.Insert(new/icon(tail_s, dir=EAST), dir=EAST) under.Insert(new/icon(tail_s, dir=WEST), dir=WEST) - overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under) + overlays_standing[TAIL_UNDERLIMBS_LAYER] = mutable_appearance(under, layer = -TAIL_UNDERLIMBS_LAYER) // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such. var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "blank") over.Insert(new/icon(tail_s, dir=NORTH), dir=NORTH) - overlays_standing[TAIL_LAYER] = image(over) + overlays_standing[TAIL_LAYER] = mutable_appearance(over, layer = -TAIL_LAYER) else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation. - overlays_standing[TAIL_LAYER] = image(tail_s) - - if(update_icons) - update_icons() - + overlays_standing[TAIL_LAYER] = mutable_appearance(tail_s, layer = -TAIL_LAYER) + apply_overlay(TAIL_LAYER) + apply_overlay(TAIL_UNDERLIMBS_LAYER) /mob/living/carbon/human/proc/start_tail_wagging(var/update_icons=1) - overlays_standing[TAIL_UNDERLIMBS_LAYER] = null // SEW direction icons, overlayed by LIMBS_LAYER. - overlays_standing[TAIL_LAYER] = null /* This will be one of two things: - If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such. - Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions. */ + remove_overlay(TAIL_UNDERLIMBS_LAYER) // SEW direction icons, overlayed by LIMBS_LAYER. + remove_overlay(TAIL_LAYER) /* This will be one of two things: + If the species' tail is overlapped by limbs, this will be only the N direction icon so tails + can still appear on the outside of uniforms and such. + Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions. */ var/icon/tail_marking_icon var/datum/sprite_accessory/body_markings/tail/tail_marking_style @@ -1252,7 +1137,10 @@ var/global/list/damage_icon_parts = list() under.Insert(new/icon(accessory_s, dir=EAST), dir=EAST) under.Insert(new/icon(accessory_s, dir=WEST), dir=WEST) - overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + var/mutable_appearance/underlimbs = mutable_appearance(under, layer = -TAIL_UNDERLIMBS_LAYER) + underlimbs.pixel_x = body_accessory.pixel_x_offset + underlimbs.pixel_y = body_accessory.pixel_y_offset + overlays_standing[TAIL_UNDERLIMBS_LAYER] = underlimbs // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such. var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "Vulpkanin_tail_delay") @@ -1260,9 +1148,15 @@ var/global/list/damage_icon_parts = list() over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.name]_tail_delay") over.Insert(new/icon(accessory_s, dir=NORTH), dir=NORTH) - overlays_standing[TAIL_LAYER] = image(over, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + var/mutable_appearance/tail = mutable_appearance(over, layer = -TAIL_LAYER) + tail.pixel_x = body_accessory.pixel_x_offset + tail.pixel_y = body_accessory.pixel_y_offset + overlays_standing[TAIL_LAYER] = tail else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation. - overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + var/mutable_appearance/tail = mutable_appearance(accessory_s, layer = -TAIL_LAYER) + tail.pixel_x = body_accessory.pixel_x_offset + tail.pixel_y = body_accessory.pixel_y_offset + overlays_standing[TAIL_LAYER] = tail else if(tail && dna.species.bodyflags & HAS_TAIL) var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[tail]w_s") @@ -1277,25 +1171,36 @@ var/global/list/damage_icon_parts = list() under.Insert(new/icon(tailw_s, dir=EAST), dir=EAST) under.Insert(new/icon(tailw_s, dir=WEST), dir=WEST) - overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under) + overlays_standing[TAIL_UNDERLIMBS_LAYER] = mutable_appearance(under, layer = -TAIL_UNDERLIMBS_LAYER) // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such. var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.name]_tail_delay") over.Insert(new/icon(tailw_s, dir=NORTH), dir=NORTH) - overlays_standing[TAIL_LAYER] = image(over) + overlays_standing[TAIL_LAYER] = mutable_appearance(over, layer = -TAIL_LAYER) else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation. - overlays_standing[TAIL_LAYER] = image(tailw_s) - - if(update_icons) - update_icons() + overlays_standing[TAIL_LAYER] = mutable_appearance(tailw_s, layer = -TAIL_LAYER) + apply_overlay(TAIL_LAYER) + apply_overlay(TAIL_UNDERLIMBS_LAYER) /mob/living/carbon/human/proc/stop_tail_wagging(var/update_icons=1) - overlays_standing[TAIL_UNDERLIMBS_LAYER] = null - overlays_standing[TAIL_LAYER] = null - + remove_overlay(TAIL_UNDERLIMBS_LAYER) + remove_overlay(TAIL_LAYER) update_tail_layer(update_icons) //just trigger a full update for normal stationary sprites +/mob/living/carbon/human/proc/update_int_organs() + remove_overlay(INTORGAN_LAYER) + + var/list/standing = list() + for(var/organ in internal_organs) + var/obj/item/organ/internal/I = organ + var/render = I.render() + if(render) + standing += render + + overlays_standing[INTORGAN_LAYER] = standing + apply_overlay(INTORGAN_LAYER) + /mob/living/carbon/human/handle_transform_change() ..() update_tail_layer() @@ -1304,8 +1209,9 @@ var/global/list/damage_icon_parts = list() // Suit needs an identically named sprite in icons/mob/collar.dmi // For suits with species_fit and sprite_sheets, an identically named sprite needs to exist in a file like this icons/mob/species/[species_name_here]/collar.dmi. /mob/living/carbon/human/proc/update_collar(var/update_icons=1) + remove_overlay(COLLAR_LAYER) var/icon/C = new('icons/mob/collar.dmi') - var/image/standing = null + var/mutable_appearance/standing = null if(wear_suit) if(wear_suit.icon_override) @@ -1314,28 +1220,39 @@ var/global/list/damage_icon_parts = list() if(fexists(icon_path)) //Just ensuring the nonexistance of a file with the above path won't cause a runtime. var/icon/icon_file = new(icon_path) if(wear_suit.icon_state in icon_file.IconStates()) - standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]") + standing = mutable_appearance(icon_file, "[wear_suit.icon_state]", layer = -COLLAR_LAYER) else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[dna.species.name]) var/icon_path = "[wear_suit.sprite_sheets[dna.species.name]]" icon_path = "[copytext(icon_path, 1, findtext(icon_path, "/suit.dmi"))]/collar.dmi" //If this file doesn't exist, the end result is that COLLAR_LAYER will be unchanged (empty). if(fexists(icon_path)) //Just ensuring the nonexistance of a file with the above path won't cause a runtime. var/icon/icon_file = new(icon_path) if(wear_suit.icon_state in icon_file.IconStates()) - standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]") + standing = mutable_appearance(icon_file, "[wear_suit.icon_state]", layer = -COLLAR_LAYER) else if(wear_suit.icon_state in C.IconStates()) - standing = image("icon" = C, "icon_state" = "[wear_suit.icon_state]") + standing = mutable_appearance(C, "[wear_suit.icon_state]", layer = -COLLAR_LAYER) - overlays_standing[COLLAR_LAYER] = standing - - if(update_icons) update_icons() + overlays_standing[COLLAR_LAYER] = standing + apply_overlay(COLLAR_LAYER) /mob/living/carbon/human/proc/update_misc_effects() - misc_effect_overlays.Cut() + remove_overlay(MISC_LAYER) //Begin appending miscellaneous effects. if(eyes_shine()) - misc_effect_overlays += get_eye_shine() //Image layer is specified in get_eye_shine() proc as LIGHTING_LAYER + 1. + overlays_standing[MISC_LAYER] = get_eye_shine() //Image layer is specified in get_eye_shine() proc as LIGHTING_LAYER + 1. + + apply_overlay(MISC_LAYER) + +/mob/living/carbon/human/admin_Freeze(client/admin, skip_overlays = TRUE) + . = ..() + overlays_standing[FROZEN_LAYER] = mutable_appearance(frozen, layer = -FROZEN_LAYER) + apply_overlay(FROZEN_LAYER) + +/mob/living/carbon/human/admin_unFreeze(client/admin, skip_overlays = TRUE) + . = ..() + remove_overlay(FROZEN_LAYER) + /mob/living/carbon/human/proc/force_update_limbs() for(var/obj/item/organ/external/O in bodyparts) @@ -1350,3 +1267,40 @@ var/global/list/damage_icon_parts = list() continue out += overlays_standing[i] return out + +/mob/living/carbon/human/proc/generate_icon_render_key() + var/husk = (HUSK in mutations) + var/fat = (FAT in mutations) + var/hulk = (HULK in mutations) + var/skeleton = (SKELETON in mutations) + + . = "" + + var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes) + if(eyes) + . += "[eyes.eye_colour]" + else + . += "#000000" + + for(var/organ_tag in dna.species.has_limbs) + var/obj/item/organ/external/part = bodyparts_by_name[organ_tag] + if(isnull(part)) + . += "0" + else if(part.is_robotic()) + . += "2[part.model ? "-[part.model]" : ""]" + else if(part.status & ORGAN_DEAD) + . += "3" + else + . += "1" + + if(part) + var/datum/species/S = GLOB.all_species[part.dna.species.name] + . += "[S.race_key]" + . += "[part.dna.GetUIState(DNA_UI_GENDER)]" + . += "[part.dna.GetUIValue(DNA_UI_SKIN_TONE)]" + if(part.s_col) + . += "[part.s_col]" + if(part.s_tone) + . += "[part.s_tone]" + + . = "[.][!!husk][!!fat][!!hulk][!!skeleton]" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm index 2f2c05c9452..649ec7b3f00 100644 --- a/code/modules/mob/living/carbon/slime/life.dm +++ b/code/modules/mob/living/carbon/slime/life.dm @@ -218,15 +218,8 @@ if(src.eye_blind) src.SetEyeBlind(0) - if(src.ear_deaf > 0) SetEarDeaf(0) - if(src.ear_damage < 25) - SetEarDamage(0) - src.density = !( src.lying ) - if(src.disabilities & DEAF) - EarDeaf(1) - if(src.eye_blurry > 0) SetEyeBlurry(0) diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index be25de1ac14..914c810da27 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -489,4 +489,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 if(istype(toEat, /obj/item/reagent_containers/food/drinks)) return 1 to_chat(user, "This creature does not seem to have a mouth!") - return 0 \ No newline at end of file + return 0 + +/mob/living/carbon/slime/can_hear() + . = TRUE //honestly fuck slimes and organ bullshit \ No newline at end of file diff --git a/code/modules/mob/living/carbon/update_status.dm b/code/modules/mob/living/carbon/update_status.dm index 63d34788a98..22030c78f4b 100644 --- a/code/modules/mob/living/carbon/update_status.dm +++ b/code/modules/mob/living/carbon/update_status.dm @@ -27,3 +27,9 @@ setStaminaLoss(health - 2) handle_hud_icons_health() return + +/mob/living/carbon/can_hear() + . = FALSE + var/obj/item/organ/internal/ears/ears = get_int_organ(/obj/item/organ/internal/ears) + if(istype(ears) && !ears.deaf) + . = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 032f46d42dd..d365f30d7d0 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -170,15 +170,6 @@ else if(eye_blurry) //blurry eyes heal slowly AdjustEyeBlurry(-1) - //Ears - if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own - EarDeaf(1) - else - // deafness heals slowly over time, unless ear_damage is over 100 - if(ear_damage < 100) - AdjustEarDamage(-0.05) - AdjustEarDeaf(-1) - //this handles hud updates. Calls update_vision() and handle_hud_icons() /mob/living/proc/handle_regular_hud_updates() if(!client) return 0 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 2a384dec214..bf49d5b2598 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -404,8 +404,7 @@ CureNervous() SetEyeBlind(0) SetEyeBlurry(0) - SetEarDamage(0) - SetEarDeaf(0) + RestoreEars() heal_overall_damage(1000, 1000) ExtinguishMob() fire_stacks = 0 diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 8d5e60785db..67bbc6c5388 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -370,7 +370,8 @@ var/list/ai_verbs_default = list( "Fuzzy", "Glitchman", "House", - "Database" + "Database", + "Alien" ) if(custom_sprite) display_choices += "Custom" @@ -451,6 +452,8 @@ var/list/ai_verbs_default = list( icon_state = "ai-house" if("Database") icon_state = "ai-database" + if("Alien") + icon_state = "ai-alien" else icon_state = "ai" //else diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index b667dbd15bd..e5bc8582de8 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -330,9 +330,5 @@ return 1 /////////////////////////////////// EAR DAMAGE //////////////////////////////////// - -/mob/living/silicon/SetEarDamage() - return - -/mob/living/silicon/SetEarDeaf() - return +/mob/living/silicon/can_hear() + . = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm index 669271f3ead..0ca0d287ede 100644 --- a/code/modules/mob/living/simple_animal/friendly/diona.dm +++ b/code/modules/mob/living/simple_animal/friendly/diona.dm @@ -32,24 +32,72 @@ melee_damage_upper = 8 attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' + var/chirp_sound = 'sound/misc/nymphchirp.ogg' //used in emote speed = 0 stop_automated_movement = 0 turns_per_move = 4 var/list/donors = list() - var/ready_evolve = 0 holder_type = /obj/item/holder/diona - can_collar = 1 + can_collar = TRUE + + a_intent = INTENT_HELP + var/gestalt_alert = "merged with gestalt" //used in adding and clearing alert + var/evolve_donors = 5 //amount of blood donors needed before evolving + var/awareness_donors = 3 //amount of blood donors needed for understand language + var/nutrition_need = 500 //amount of nutrition needed before evolving + + var/datum/action/innate/diona/merge/merge_action = new() + var/datum/action/innate/diona/evolve/evolve_action = new() + var/datum/action/innate/diona/steal_blood/steal_blood_action = new() + +/datum/action/innate/diona/merge + name = "Merge with gestalt" + icon_icon = 'icons/mob/human_races/r_diona.dmi' + button_icon_state = "preview" + +/datum/action/innate/diona/merge/Activate() + var/mob/living/simple_animal/diona/user = owner + user.merge() + +/datum/action/innate/diona/evolve + name = "Evolve" + icon_icon = 'icons/obj/cloning.dmi' + button_icon_state = "pod_1" + +/datum/action/innate/diona/evolve/Activate() + var/mob/living/simple_animal/diona/user = owner + user.evolve() + +/datum/action/innate/diona/steal_blood + name = "Steal blood" + icon_icon = 'icons/obj/bloodpack.dmi' + button_icon_state = "full" + +/datum/action/innate/diona/steal_blood/Activate() + var/mob/living/simple_animal/diona/user = owner + user.steal_blood() /mob/living/simple_animal/diona/New() ..() if(name == initial(name)) //To stop Pun-Pun becoming generic. name = "[name] ([rand(1, 1000)])" real_name = name - add_language("Rootspeak") - verbs += /mob/living/simple_animal/diona/proc/merge + merge_action.Grant(src) + evolve_action.Grant(src) + steal_blood_action.Grant(src) + +/mob/living/simple_animal/diona/UnarmedAttack(var/atom/A) + if(isdiona(A) && (src in A.contents)) //can't attack your gestalt + visible_message("[src] wiggles around a bit.") + else + ..() + +/mob/living/simple_animal/diona/resist() + ..() + split() /mob/living/simple_animal/diona/attack_hand(mob/living/carbon/human/M) //Let people pick the little buggers up. @@ -57,88 +105,76 @@ if(isdiona(M)) to_chat(M, "You feel your being twine with that of [src] as it merges with your biomass.") to_chat(src, "You feel your being twine with that of [M] as you merge with its biomass.") - verbs += /mob/living/simple_animal/diona/proc/split - verbs -= /mob/living/simple_animal/diona/proc/merge + throw_alert(gestalt_alert, /obj/screen/alert/nymph, new_master = src) //adds a screen alert that can call resist forceMove(M) else get_scooped(M) - ..() - /mob/living/simple_animal/diona/proc/merge() - set category = "Diona" - set name = "Merge with gestalt" - set desc = "Merge with another diona." - - if(iscarbon(loc)) - verbs -= /mob/living/simple_animal/diona/proc/merge - return + if(stat != CONSCIOUS) + return FALSE var/list/choices = list() - for(var/mob/living/carbon/C in view(1,src)) - - if(!(Adjacent(C)) || !(C.client)) + for(var/mob/living/carbon/human/H in view(1,src)) + if(!(Adjacent(H)) || !isdiona(H)) continue + choices += H - if(ishuman(C)) - var/mob/living/carbon/human/D = C - if(isdiona(D)) - choices += C + if(!choices.len) + to_chat(src, "No suitable diona nearby.") + return FALSE var/mob/living/M = input(src,"Who do you wish to merge with?") in null|choices - if(!M || !src || !(Adjacent(M))) - return + if(!M || !src || !(Adjacent(M)) || stat != CONSCIOUS) //input can take a while, so re-validate + return FALSE - if(ishuman(M)) + if(isdiona(M)) to_chat(M, "You feel your being twine with that of [src] as it merges with your biomass.") M.status_flags |= PASSEMOTES - to_chat(src, "You feel your being twine with that of [M] as you merge with its biomass.") forceMove(M) - verbs += /mob/living/simple_animal/diona/proc/split - verbs -= /mob/living/simple_animal/diona/proc/merge + throw_alert(gestalt_alert, /obj/screen/alert/nymph, new_master = src) //adds a screen alert that can call resist + return TRUE else - return + return FALSE /mob/living/simple_animal/diona/proc/split() - set category = "Diona" - set name = "Split from gestalt" - set desc = "Split away from your gestalt as a lone nymph." - - if(!(iscarbon(loc))) - verbs -= /mob/living/simple_animal/diona/proc/split - return - + if((stat != CONSCIOUS) || !isdiona(loc)) + return FALSE + var/mob/living/carbon/human/D = loc + T = get_turf(src) + if(!T) + return FALSE to_chat(loc, "You feel a pang of loss as [src] splits away from your biomass.") to_chat(src, "You wiggle out of the depths of [loc]'s biomass and plop to the ground.") + forceMove(T) + + var/hasMobs = FALSE + for(var/atom/A in D.contents) + if(istype(A, /mob/) || istype(A, /obj/item/holder)) + hasMobs = TRUE + if(!hasMobs) + D.status_flags &= ~PASSEMOTES - var/mob/living/M = loc + clear_alert(gestalt_alert) + return TRUE - forceMove(get_turf(src)) - verbs -= /mob/living/simple_animal/diona/proc/split - verbs += /mob/living/simple_animal/diona/proc/merge - - if(istype(M)) - for(var/atom/A in M.contents) - if(istype(A, /mob/living/simple_animal/borer) || istype(A, /obj/item/holder)) - return - M.status_flags &= ~PASSEMOTES - -/mob/living/simple_animal/diona/verb/evolve() - set category = "Diona" - set name = "Evolve" - set desc = "Grow to a more complex form." - - if(donors.len < 5) +/mob/living/simple_animal/diona/proc/evolve() + if(stat != CONSCIOUS) + return FALSE + + if(donors.len < evolve_donors) to_chat(src, "You need more blood in order to ascend to a new state of consciousness...") - return + return FALSE - if(nutrition < 500) + if(nutrition < nutrition_need) to_chat(src, "You need to binge on weeds in order to have the energy to grow...") - return + return FALSE - split() + if(isdiona(loc) && !split()) //if it's merged with diona, needs to able to split before evolving + return FALSE + visible_message("[src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.","You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.") var/mob/living/carbon/human/diona/adult = new(get_turf(loc)) @@ -162,28 +198,33 @@ unEquip(W) qdel(src) + return TRUE -/mob/living/simple_animal/diona/verb/steal_blood() - set category = "Diona" - set name = "Steal Blood" - set desc = "Take a blood sample from a suitable donor." - +/mob/living/simple_animal/diona/proc/steal_blood() + if(stat != CONSCIOUS) + return FALSE + var/list/choices = list() for(var/mob/living/carbon/human/H in oview(1,src)) - choices += H + if(Adjacent(H) && H.dna && !(NO_BLOOD in H.dna.species.species_traits)) + choices += H + + if(!choices.len) + to_chat(src, "No suitable blood donors nearby.") + return FALSE var/mob/living/carbon/human/M = input(src,"Who do you wish to take a sample from?") in null|choices - if(!M || !src) - return + if(!M || !src || !(Adjacent(M)) || stat != CONSCIOUS) //input can take a while, so re-validate + return FALSE - if(NO_BLOOD in M.dna.species.species_traits) + if(!M.dna || (NO_BLOOD in M.dna.species.species_traits)) to_chat(src, "That donor has no blood to take.") - return + return FALSE if(donors.Find(M.real_name)) to_chat(src, "That donor offers you nothing new.") - return + return FALSE visible_message("[src] flicks out a feeler and neatly steals a sample of [M]'s blood.","You flick out a feeler and neatly steal a sample of [M]'s blood.") donors += M.real_name @@ -195,13 +236,12 @@ update_progression() /mob/living/simple_animal/diona/proc/update_progression() - if(!donors.len) - return + if(stat != CONSCIOUS || !donors.len) + return FALSE - if(donors.len == 5) - ready_evolve = 1 + if(donors.len == evolve_donors) to_chat(src, "You feel ready to move on to your next stage of growth.") - else if(donors.len == 3) + else if(donors.len == awareness_donors) universal_understand = 1 to_chat(src, "You feel your awareness expand, and realize you know how to understand the creatures around you.") else @@ -219,7 +259,7 @@ return /mob/living/simple_animal/diona/emote(act, m_type=1, message = null) - if(stat) + if(stat != CONSCIOUS) return var/on_CD = 0 @@ -237,6 +277,6 @@ if("chirp") message = "\The [src] chirps!" m_type = 2 //audible - playsound(src, 'sound/misc/nymphchirp.ogg', 40, 1, 1) + playsound(src, chirp_sound, 40, 1, 1) ..(act, m_type, message) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 0eea0eaef76..48c7a24f855 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -23,6 +23,11 @@ var/datum/mind/origin var/egg_lain = 0 +/mob/living/simple_animal/hostile/headcrab/examine(mob/user) + ..() + if(stat == DEAD) + to_chat(desc = "It appears to be dead.") + /mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim) var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim) egg.insert(victim) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index 82e4af1862f..efeec62ae96 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -101,7 +101,7 @@ Difficulty: Medium animate(src, pixel_z = 0, time = 12) /obj/effect/temp_visual/target - icon = 'icons/mob/actions.dmi' + icon = 'icons/mob/actions/actions.dmi' icon_state = "sniper_zoom" layer = MOB_LAYER - 0.1 luminosity = 2 diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm index f2bed558b8c..b0756cddd7f 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm @@ -65,7 +65,7 @@ /datum/action/innate/terrorspider/queen/queensense name = "Hive Sense" - icon_icon = 'icons/mob/actions.dmi' + icon_icon = 'icons/mob/actions/actions.dmi' button_icon_state = "mindswap" /datum/action/innate/terrorspider/queen/queensense/Activate() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 046d55c4566..df3f185dad4 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -578,9 +578,5 @@ if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. return -/mob/living/simple_animal/SetEarDamage() - return - -/mob/living/simple_animal/SetEarDeaf() - return - +/mob/living/simple_animal/can_hear() + . = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index e9253f78d59..4e5c778b7fb 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -43,10 +43,6 @@ A trippy overlay appears. * Drunk * Essentially what your "BAC" is - the higher it is, the more alcohol you have in you - * EarDamage * - Doesn't do much, but if it's 25+, you go deaf. Heals much slower than other statuses - 0.05 normally - * EarDeaf * - You cannot hear. Prevents EarDamage from healing naturally. * EyeBlind * You cannot see. Prevents EyeBlurry from healing naturally. * EyeBlurry * @@ -115,8 +111,6 @@ var/drowsyness = 0 var/druggy = 0 var/drunk = 0 - var/ear_damage = 0 - var/ear_deaf = 0 var/eye_blind = 0 var/eye_blurry = 0 var/hallucination = 0 @@ -233,30 +227,6 @@ var/new_value = directional_bounded_sum(druggy, amount, bound_lower, bound_upper) return SetDruggy(new_value, updating) -// EAR_DAMAGE - -/mob/living/EarDamage(amount) - SetEarDamage(max(ear_damage, amount)) - -/mob/living/SetEarDamage(amount) - ear_damage = max(amount, 0) - -/mob/living/AdjustEarDamage(amount, bound_lower = 0, bound_upper = INFINITY) - var/new_value = directional_bounded_sum(ear_damage, amount, bound_lower, bound_upper) - SetEarDamage(new_value) - -// EAR_DEAF - -/mob/living/EarDeaf(amount) - SetEarDeaf(max(ear_deaf, amount)) - -/mob/living/SetEarDeaf(amount) - ear_deaf = max(amount, 0) - -/mob/living/AdjustEarDeaf(amount, bound_lower = 0, bound_upper = INFINITY) - var/new_value = directional_bounded_sum(ear_deaf, amount, bound_lower, bound_upper) - SetEarDeaf(new_value) - // EYE_BLIND /mob/living/EyeBlind(amount, updating = TRUE) diff --git a/code/modules/mob/living/update_status.dm b/code/modules/mob/living/update_status.dm index 40d4cdc9cb2..94769baf94b 100644 --- a/code/modules/mob/living/update_status.dm +++ b/code/modules/mob/living/update_status.dm @@ -41,7 +41,7 @@ // Whether the mob can hear things /mob/living/can_hear() - return !(ear_deaf || (disabilities & DEAF)) + . = !(disabilities & DEAF) // Whether the mob is able to see // `information_only` is for stuff that's purely informational - like understanding nonverbal languages, or blindness overlays @@ -137,10 +137,6 @@ SetEyeBlind(eye_blind) if("eye_blurry") SetEyeBlurry(eye_blurry) - if("ear_deaf") - SetEarDeaf(ear_deaf) - if("ear_damage") - SetEarDamage(ear_damage) if("druggy") SetDruggy(druggy) if("maxHealth") diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index a1be1db4c63..5b3fd873777 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -1,6 +1,5 @@ /mob/new_player var/ready = 0 - var/skip_antag = 0 //For declining an antag roll this round. var/spawning = 0 //Referenced when you want to delete the new_player later on in the code. var/totalPlayers = 0 //Player counts for the Lobby tab var/totalPlayersReady = 0 @@ -65,16 +64,16 @@ if(!ticker || ticker.current_state <= GAME_STATE_PREGAME) if(!ready) output += "

Declare Ready

" else output += "

You are ready (Cancel)

" - - var/list/antags = client.prefs.be_special - if(antags && antags.len) - if(!skip_antag) output += "

Global Antag Candidacy" - else output += "

Global Antag Candidacy" - output += "
You are [skip_antag ? "ineligible" : "eligible"] for all antag roles.

" else output += "

View the Crew Manifest

" output += "

Join Game!

" + var/list/antags = client.prefs.be_special + if(antags && antags.len) + if(!client.skip_antag) output += "

Global Antag Candidacy" + else output += "

Global Antag Candidacy" + output += "
You are [client.skip_antag ? "ineligible" : "eligible"] for all antag roles.

" + output += "

Observe

" if(GLOB.join_tos) @@ -172,7 +171,7 @@ new_player_panel_proc() if(href_list["skip_antag"]) - skip_antag = !skip_antag + client.skip_antag = !client.skip_antag new_player_panel_proc() if(href_list["refresh"]) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm deleted file mode 100644 index bdf93fbd4eb..00000000000 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ /dev/null @@ -1,3001 +0,0 @@ -/* - - Hello and welcome to sprite_accessories: For sprite accessories, such as hair, - facial hair, and possibly tattoos and stuff somewhere along the line. This file is - intended to be friendly for people with little to no actual coding experience. - The process of adding in new hairstyles has been made pain-free and easy to do. - Enjoy! - Doohl - - - Notice: This all gets automatically compiled in a list in dna2.dm, so you do not - have to define any UI values for sprite accessories manually for hair and facial - hair. Just add in new hair types and the game will naturally adapt. - - !!WARNING!!: changing existing hair information can be VERY hazardous to savefiles, - to the point where you may completely corrupt a server's savefiles. Please refrain - from doing this unless you absolutely know what you are doing, and have defined a - conversion in savefile.dm -*/ - -/proc/init_sprite_accessory_subtypes(var/prototype, var/list/L, var/list/male, var/list/female, var/list/full_list) - if(!istype(L)) L = list() - if(!istype(male)) male = list() - if(!istype(female)) female = list() - if(!istype(full_list)) full_list = list() - - for(var/path in subtypesof(prototype)) - var/datum/sprite_accessory/D = new path() - - if(D.name) - if(D.fluff) - full_list[D.name] = D - else - L[D.name] = D - full_list[D.name] = D - - switch(D.gender) - if(MALE) male[D.name] = D - if(FEMALE) female[D.name] = D - else - male[D.name] = D - female[D.name] = D - return L - -/datum/sprite_accessory - var/icon //the icon file the accessory is located in - var/icon_state //the icon_state of the accessory - var/name //the preview name of the accessory - var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations - - // Restrict some styles to specific species - var/list/species_allowed = list("Human", "Slime People") - var/list/models_allowed = list() //Specifies which, if any, hairstyles or markings can be accessed by which prosthetics. Should equal the manufacturing company name in robolimbs.dm. - var/list/heads_allowed = null //Specifies which, if any, alt heads a head marking, hairstyle or facial hair style is compatible with. - var/list/tails_allowed = null //Specifies which, if any, tails a tail marking is compatible with. - var/marking_location //Specifies which bodypart a body marking is located on. - var/secondary_theme = null //If exists, there's a secondary colour to that hair style and the secondary theme's icon state's suffix is equal to this. - var/no_sec_colour = null //If exists, prohibit the colouration of the secondary theme. - var/fluff = 0 - // Whether or not the accessory can be affected by colouration - var/do_colouration = 1 - - -/* -//////////////////////////// -/ =--------------------= / -/ == Hair Definitions == / -/ =--------------------= / -//////////////////////////// -*/ - -/datum/sprite_accessory/hair - icon = 'icons/mob/human_face.dmi' // default icon for all hairs - var/glasses_over //Hair styles with hair that don't overhang the arms of glasses should have glasses_over set to a positive value - -/datum/sprite_accessory/hair/bald - name = "Bald" - icon_state = "bald" - species_allowed = list("Human", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton", "Vulpkanin", "Tajaran") - glasses_over = 1 - -/datum/sprite_accessory/hair/short - name = "Short Hair" // try to capatilize the names please~ - icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you - glasses_over = 1 - -/datum/sprite_accessory/hair/cut - name = "Cut Hair" - icon_state = "hair_c" - glasses_over = 1 - -/datum/sprite_accessory/hair/long - name = "Shoulder-length Hair" - icon_state = "hair_b" - -/datum/sprite_accessory/hair/longalt - name = "Shoulder-length Hair Alt" - icon_state = "hair_longfringe" - -/*/datum/sprite_accessory/hair/longish - name = "Longer Hair" - icon_state = "hair_b2"*/ - -/datum/sprite_accessory/hair/longer - name = "Long Hair" - icon_state = "hair_vlong" - -/datum/sprite_accessory/hair/longeralt - name = "Long Hair Alt" - icon_state = "hair_vlongfringe" - -/datum/sprite_accessory/hair/longest - name = "Very Long Hair" - icon_state = "hair_longest" - -/datum/sprite_accessory/hair/longfringe - name = "Long Fringe" - icon_state = "hair_longfringe" - -/datum/sprite_accessory/hair/longestalt - name = "Longer Fringe" - icon_state = "hair_vlongfringe" - -/datum/sprite_accessory/hair/halfbang - name = "Half-banged Hair" - icon_state = "hair_halfbang" - -/datum/sprite_accessory/hair/halfbangalt - name = "Half-banged Hair Alt" - icon_state = "hair_halfbang_alt" - -/datum/sprite_accessory/hair/ponytail1 - name = "Ponytail male" - icon_state = "hair_ponytailm" - gender = MALE - glasses_over = 1 - -/datum/sprite_accessory/hair/ponytail2 - name = "Ponytail female" - icon_state = "hair_ponytailf" - gender = FEMALE - -/datum/sprite_accessory/hair/ponytail3 - name = "Ponytail alt" - icon_state = "hair_ponytail3" - glasses_over = 1 - -/datum/sprite_accessory/hair/sideponytail - name = "Side Ponytail" - icon_state = "hair_stail" - gender = FEMALE - glasses_over = 1 - -/datum/sprite_accessory/hair/highponytail - name = "High Ponytail" - icon_state = "hair_highponytail" - gender = FEMALE - glasses_over = 1 - -/datum/sprite_accessory/hair/wisp - name = "Wisp" - icon_state = "hair_wisp" - gender = FEMALE - -/datum/sprite_accessory/hair/parted - name = "Parted" - icon_state = "hair_parted" - -/datum/sprite_accessory/hair/pompadour - name = "Pompadour" - icon_state = "hair_pompadour" - gender = MALE - species_allowed = list("Human", "Slime People", "Unathi") - glasses_over = 1 - -/datum/sprite_accessory/hair/quiff - name = "Quiff" - icon_state = "hair_quiff" - gender = MALE - glasses_over = 1 - -/datum/sprite_accessory/hair/bedhead - name = "Bedhead" - icon_state = "hair_bedhead" - -/datum/sprite_accessory/hair/bedhead2 - name = "Bedhead 2" - icon_state = "hair_bedheadv2" - -/datum/sprite_accessory/hair/bedhead3 - name = "Bedhead 3" - icon_state = "hair_bedheadv3" - -/datum/sprite_accessory/hair/beehive - name = "Beehive" - icon_state = "hair_beehive" - gender = FEMALE - species_allowed = list("Human", "Slime People", "Unathi") - -/datum/sprite_accessory/hair/bobcurl - name = "Bobcurl" - icon_state = "hair_bobcurl" - gender = FEMALE - species_allowed = list("Human", "Slime People", "Unathi") - -/datum/sprite_accessory/hair/bob - name = "Bob" - icon_state = "hair_bobcut" - gender = FEMALE - species_allowed = list("Human", "Slime People", "Unathi") - -/datum/sprite_accessory/hair/bowl - name = "Bowl" - icon_state = "hair_bowlcut" - gender = MALE - glasses_over = 1 - -/datum/sprite_accessory/hair/braid2 - name = "Long Braid" - icon_state = "hair_hbraid" - gender = FEMALE - -/datum/sprite_accessory/hair/braid_hip - name = "Hippie Braid" - icon_state = "hair_hipbraid" - secondary_theme = "beads" - -/datum/sprite_accessory/hair/braid_hip_una - name = "Unathi Hippie Braid" - icon_state = "hair_ubraid" - species_allowed = list("Unathi") - secondary_theme = "beads" - -/datum/sprite_accessory/hair/buzz - name = "Buzzcut" - icon_state = "hair_buzzcut" - gender = MALE - species_allowed = list("Human", "Slime People", "Unathi") - glasses_over = 1 - -/datum/sprite_accessory/hair/crew - name = "Crewcut" - icon_state = "hair_crewcut" - gender = MALE - glasses_over = 1 - -/datum/sprite_accessory/hair/combover - name = "Combover" - icon_state = "hair_combover" - gender = MALE - glasses_over = 1 - -/datum/sprite_accessory/hair/devillock - name = "Devil Lock" - icon_state = "hair_devilock" - glasses_over = 1 - -/datum/sprite_accessory/hair/dreadlocks - name = "Dreadlocks" - icon_state = "hair_dreads" - -/datum/sprite_accessory/hair/curls - name = "Curls" - icon_state = "hair_curls" - -/datum/sprite_accessory/hair/afro - name = "Afro" - icon_state = "hair_afro" - -/datum/sprite_accessory/hair/afro2 - name = "Afro 2" - icon_state = "hair_afro2" - glasses_over = 1 - -/datum/sprite_accessory/hair/afro_large - name = "Big Afro" - icon_state = "hair_bigafro" - gender = MALE - -/datum/sprite_accessory/hair/sergeant - name = "Flat Top" - icon_state = "hair_sergeant" - gender = MALE - glasses_over = 1 - -/datum/sprite_accessory/hair/emo - name = "Emo" - icon_state = "hair_emo" - -/datum/sprite_accessory/hair/fag - name = "Flow Hair" - icon_state = "hair_f" - -/datum/sprite_accessory/hair/feather - name = "Feather" - icon_state = "hair_feather" - -/datum/sprite_accessory/hair/hitop - name = "Hitop" - icon_state = "hair_hitop" - gender = MALE - glasses_over = 1 - -/datum/sprite_accessory/hair/mohawk - name = "Mohawk" - icon_state = "hair_d" - species_allowed = list("Human", "Slime People", "Unathi") - glasses_over = 1 - -/datum/sprite_accessory/hair/jensen - name = "Adam Jensen Hair" - icon_state = "hair_jensen" - gender = MALE - glasses_over = 1 - -/datum/sprite_accessory/hair/cia - name = "CIA" - icon_state = "hair_cia" - gender = MALE - glasses_over = 1 - -/datum/sprite_accessory/hair/mulder - name = "Mulder" - icon_state = "hair_mulder" - gender = MALE - glasses_over = 1 - -/datum/sprite_accessory/hair/gelled - name = "Gelled Back" - icon_state = "hair_gelled" - gender = FEMALE - glasses_over = 1 - -/datum/sprite_accessory/hair/gentle - name = "Gentle" - icon_state = "hair_gentle" - gender = FEMALE - -/datum/sprite_accessory/hair/spiky - name = "Spiky" - icon_state = "hair_spikey" - species_allowed = list("Human", "Slime People", "Unathi") - glasses_over = 1 - -/datum/sprite_accessory/hair/kusanagi - name = "Kusanagi Hair" - icon_state = "hair_kusanagi" - -/datum/sprite_accessory/hair/kagami - name = "Pigtails" - icon_state = "hair_kagami" - gender = FEMALE - glasses_over = 1 - -/datum/sprite_accessory/hair/himecut - name = "Hime Cut" - icon_state = "hair_himecut" - gender = FEMALE - -/datum/sprite_accessory/hair/braid - name = "Floorlength Braid" - icon_state = "hair_braid" - gender = FEMALE - -/datum/sprite_accessory/hair/odango - name = "Odango" - icon_state = "hair_odango" - gender = FEMALE - glasses_over = 1 - -/datum/sprite_accessory/hair/ombre - name = "Ombre" - icon_state = "hair_ombre" - gender = FEMALE - -/datum/sprite_accessory/hair/updo - name = "Updo" - icon_state = "hair_updo" - gender = FEMALE - -/datum/sprite_accessory/hair/skinhead - name = "Skinhead" - icon_state = "hair_skinhead" - glasses_over = 1 - -/datum/sprite_accessory/hair/balding - name = "Balding Hair" - icon_state = "hair_e" - gender = MALE // turnoff! - glasses_over = 1 - -/datum/sprite_accessory/hair/longemo - name = "Long Emo" - icon_state = "hair_emolong" - gender = FEMALE - -////////////////////////////// -//////START VG HAIRSTYLES///// -////////////////////////////// -/datum/sprite_accessory/hair/birdnest - name = "Bird Nest" - icon_state = "hair_birdnest" - -/datum/sprite_accessory/hair/unkept - name = "Unkempt" - icon_state = "hair_unkept" - -/datum/sprite_accessory/hair/duelist - name = "Duelist" - icon_state = "hair_duelist" - gender = MALE - -/datum/sprite_accessory/hair/modern - name = "Modern" - icon_state = "hair_modern" - gender = FEMALE - -/datum/sprite_accessory/hair/unshavenmohawk - name = "Unshaven Mohawk" - icon_state = "hair_unshavenmohawk" - gender = MALE - glasses_over = 1 - -/datum/sprite_accessory/hair/drills - name = "Twincurls" - icon_state = "hair_twincurl" - gender = FEMALE - -/datum/sprite_accessory/hair/minidrills - name = "Twincurls 2" - icon_state = "hair_twincurl2" - gender = FEMALE -////////////////////////////// -//////END VG HAIRSTYLES/////// -////////////////////////////// - -/////////////////////////////////// -//////START POLARIS HAIRSTYLES///// -////////////////////////////////// - -/datum/sprite_accessory/hair/dave - name = "Dave" - icon_state = "hair_dave" - -/datum/sprite_accessory/hair/rosa - name = "Rosa" - icon_state = "hair_rosa" - -/datum/sprite_accessory/hair/jade - name = "Jade" - icon_state = "hair_jade" - -/datum/sprite_accessory/hair/shy - name = "Shy" - icon_state = "hair_shy" - -/datum/sprite_accessory/hair/manbun - name = "Manbun" - icon_state = "hair_manbun" - -/datum/sprite_accessory/hair/thinningback - name = "Thinning Back" - icon_state = "hair_thinningrear" - -/datum/sprite_accessory/hair/thinningfront - name = "Thinning Front" - icon_state = "hair_thinningfront" - -/datum/sprite_accessory/hair/thinning - name = "Thinning" - icon_state = "hair_thinning" - -/datum/sprite_accessory/hair/bowlcut2 - name = "Bowl 2" - icon_state = "hair_bowlcut2" - -/datum/sprite_accessory/hair/ronin - name = "Ronin" - icon_state = "hair_ronin" - -/datum/sprite_accessory/hair/topknot - name = "Topknot" - icon_state = "hair_topknot" - -/datum/sprite_accessory/hair/regulationmohawk - name = "Regulation Mohawk" - icon_state = "hair_shavedmohawk" - -/datum/sprite_accessory/hair/rowbraid - name = "Row Braid" - icon_state = "hair_rowbraid" - -/datum/sprite_accessory/hair/rowdualbraid - name = "Row Dual Braid" - icon_state = "hair_rowdualtail" - -/datum/sprite_accessory/hair/rowbun - name = "Row Bun" - icon_state = "hair_rowbun" - -/datum/sprite_accessory/hair/hightight - name = "High and Tight" - icon_state = "hair_hightight" - -/datum/sprite_accessory/hair/partfade - name = "Parted Fade" - icon_state = "hair_shavedpart" - gender = MALE - -/datum/sprite_accessory/hair/undercut3 - name = "Undercut Swept Left" - icon_state = "hair_undercut3" - gender = MALE - -/datum/sprite_accessory/hair/undercut2 - name = "Undercut Swept Right" - icon_state = "hair_undercut2" - gender = MALE - -/datum/sprite_accessory/hair/undercut1 - name = "Undercut" - icon_state = "hair_undercut1" - gender = MALE - -/datum/sprite_accessory/hair/coffeehouse - name = "Coffee House Cut" - icon_state = "hair_coffeehouse" - gender = MALE - -/datum/sprite_accessory/hair/tightbun - name = "Tight Bun" - icon_state = "hair_tightbun" - gender = FEMALE - -/datum/sprite_accessory/hair/trimmed - name = "Trimmed" - icon_state = "hair_trimmed" - gender = MALE - -/datum/sprite_accessory/hair/trimflat - name = "Trimmed Flat Top" - icon_state = "hair_trimflat" - gender = MALE - -/datum/sprite_accessory/hair/nofade - name = "Regulation Cut" - icon_state = "hair_nofade" - gender = MALE - -/datum/sprite_accessory/hair/baldfade - name = "Balding Fade" - icon_state = "hair_baldfade" - gender = MALE - -/datum/sprite_accessory/hair/highfade - name = "High Fade" - icon_state = "hair_highfade" - gender = MALE - -/datum/sprite_accessory/hair/medfade - name = "Medium Fade" - icon_state = "hair_medfade" - -/datum/sprite_accessory/hair/lowfade - name = "Low Fade" - icon_state = "hair_lowfade" - gender = MALE - -/datum/sprite_accessory/hair/oxton - name = "Oxton" - icon_state = "hair_oxton" - -/datum/sprite_accessory/hair/doublebun - name = "Double-Bun" - icon_state = "hair_doublebun" - -/datum/sprite_accessory/hair/halfshaved - name = "Half-Shaved Emo" - icon_state = "hair_halfshaved" - -/datum/sprite_accessory/hair/shortbangs - name = "Short Bangs" - icon_state = "hair_shortbangs" - -/datum/sprite_accessory/hair/longeralt2 - name = "Long Hair Alt 2" - icon_state = "hair_longeralt2" - -/datum/sprite_accessory/hair/nia - name = "Nia" - icon_state = "hair_nia" - -/datum/sprite_accessory/hair/eighties - name = "80's" - icon_state = "hair_80s" - -/datum/sprite_accessory/hair/volaju - name = "Volaju" - icon_state = "hair_volaju" - -/datum/sprite_accessory/hair/joestar - name = "Joestar" - icon_state = "hair_joestar" - gender = MALE - -/datum/sprite_accessory/hair/nitori - name = "Nitori" - icon_state = "hair_nitori" - -/datum/sprite_accessory/hair/scully - name = "Scully" - icon_state = "hair_scully" - -/datum/sprite_accessory/hair/vegeta - name = "Vegeta" - icon_state = "hair_toriyama2" - -/datum/sprite_accessory/hair/crono - name = "Chrono" - icon_state = "hair_toriyama" - -/datum/sprite_accessory/hair/poofy2 - name = "Poofy2" - icon_state = "hair_poofy2" - -/datum/sprite_accessory/hair/poofy - name = "Poofy" - icon_state = "hair_poofy" - -/datum/sprite_accessory/hair/dandypomp - name = "Dandy Pompadour" - icon_state = "hair_dandypompadour" - -/datum/sprite_accessory/hair/fringetail - name = "Fringetail" - icon_state = "hair_fringetail" - -/datum/sprite_accessory/hair/mahdrills - name = "Drillruru" - icon_state = "hair_drillruru" - -/datum/sprite_accessory/hair/familyman - name = "The Family Man" - icon_state = "hair_thefamilyman" - -/datum/sprite_accessory/hair/grandebraid - name = "Grande Braid" - icon_state = "hair_grande" - -/datum/sprite_accessory/hair/fringeemo - name = "Emo Fringe" - icon_state = "hair_emofringe" - -/datum/sprite_accessory/hair/emo2 - name = "Emo Alt" - icon_state = "hair_emo2" - -/datum/sprite_accessory/hair/sargeant - name = "Flat Top" - icon_state = "hair_sargeant" - -/datum/sprite_accessory/hair/rows2 - name = "Rows 2" - icon_state = "hair_rows2" - -/datum/sprite_accessory/hair/rows - name = "Rows" - icon_state = "hair_rows1" - -/datum/sprite_accessory/hair/reversemohawk - name = "Reverse Mohawk" - icon_state = "hair_reversemohawk" - -/datum/sprite_accessory/hair/father - name = "Father" - icon_state = "hair_father" - -/datum/sprite_accessory/hair/beehive2 - name = "Beehive 2" - icon_state = "hair_beehive2" - -/datum/sprite_accessory/hair/sleeze - name = "Sleeze" - icon_state = "hair_sleeze" - -/datum/sprite_accessory/hair/zieglertail - name = "Zieglertail" - icon_state = "hair_ziegler" - -/datum/sprite_accessory/hair/spikyponytail - name = "Spiky Ponytail" - icon_state = "hair_spikyponytail" - -/datum/sprite_accessory/hair/tresshoulder - name = "Tress Shoulder" - icon_state = "hair_tressshoulder" - -/datum/sprite_accessory/hair/oneshoulder - name = "One Shoulder" - icon_state = "hair_oneshoulder" - -/datum/sprite_accessory/hair/ponytail6 - name = "Ponytail 6" - icon_state = "hair_ponytail6" - -/datum/sprite_accessory/hair/ponytail5 - name = "Ponytail 5" - icon_state = "hair_ponytail5" - -/datum/sprite_accessory/hair/ponytail4 - name = "Ponytail 4" - icon_state = "hair_ponytail4" - -/datum/sprite_accessory/hair/country - name = "Country" - icon_state = "hair_country" - -/datum/sprite_accessory/hair/bedheadlong - name = "Bedhead Long" - icon_state = "hair_long_bedhead" - -/datum/sprite_accessory/hair/flair - name = "Flaired Hair" - icon_state = "hair_flair" - -/datum/sprite_accessory/hair/twintail - name = "Twintail" - icon_state = "hair_twintail" - -/datum/sprite_accessory/hair/short2 - name = "Short Hair 2" - icon_state = "hair_shorthair3" - -/datum/sprite_accessory/hair/bun2 - name = "Bun 2" - icon_state = "hair_bun2" - -/datum/sprite_accessory/hair/bun3 - name = "Bun 3" - icon_state = "hair_bun3" - -/datum/sprite_accessory/hair/shavehair - name = "Shaved Hair" - icon_state = "hair_shaved" - -/datum/sprite_accessory/hair/veryshortovereyealternate - name = "Overeye Very Short, Alternate" - icon_state = "hair_veryshortovereyealternate" - -/datum/sprite_accessory/hair/veryshortovereye - name = "Overeye Very Short" - icon_state = "hair_veryshortovereye" - -/datum/sprite_accessory/hair/shortovereye - name = "Overeye Short" - icon_state = "hair_shortovereye" - -/datum/sprite_accessory/hair/longovereye - name = "Overeye Long" - icon_state = "hair_longovereye" - -/datum/sprite_accessory/hair/father - name = "Father" - icon_state = "hair_father" - -/datum/sprite_accessory/hair/bun4 // Due to a vulp hairstyle called bun - name = "Bun 4" - icon_state = "hair_bun4" - -/////////////////////////////////// -//////END POLARIS HAIRSTYLES/////// -////////////////////////////////// - -/datum/sprite_accessory/hair/ipc - species_allowed = list("Machine") - glasses_over = 1 - models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.", "Shellguard Munitions Monitor Series") - -/datum/sprite_accessory/hair/ipc/ipc_screen_pink - name = "Pink IPC Screen" - icon_state = "ipc_pink" - -/datum/sprite_accessory/hair/ipc/ipc_screen_red - name = "Red IPC Screen" - icon_state = "ipc_red" - -/datum/sprite_accessory/hair/ipc/ipc_screen_green - name = "Green IPC Screen" - icon_state = "ipc_green" - -/datum/sprite_accessory/hair/ipc/ipc_screen_blue - name = "Blue IPC Screen" - icon_state = "ipc_blue" - -/datum/sprite_accessory/hair/ipc/ipc_screen_breakout - name = "Breakout IPC Screen" - icon_state = "ipc_breakout" - -/datum/sprite_accessory/hair/ipc/ipc_screen_eight - name = "Eight IPC Screen" - icon_state = "ipc_eight" - -/datum/sprite_accessory/hair/ipc/ipc_screen_rainbow - name = "Rainbow IPC Screen" - icon_state = "ipc_rainbow" - -/datum/sprite_accessory/hair/ipc/ipc_screen_goggles - name = "Goggles IPC Screen" - icon_state = "ipc_goggles" - -/datum/sprite_accessory/hair/ipc/ipc_screen_heart - name = "Heart IPC Screen" - icon_state = "ipc_heart" - -/datum/sprite_accessory/hair/ipc/ipc_screen_monoeye - name = "Monoeye IPC Screen" - icon_state = "ipc_monoeye" - -/datum/sprite_accessory/hair/ipc/ipc_screen_nature - name = "Nature IPC Screen" - icon_state = "ipc_nature" - -/datum/sprite_accessory/hair/ipc/ipc_screen_orange - name = "Orange IPC Screen" - icon_state = "ipc_orange" - -/datum/sprite_accessory/hair/ipc/ipc_screen_purple - name = "Purple IPC Screen" - icon_state = "ipc_purple" - -/datum/sprite_accessory/hair/ipc/ipc_screen_shower - name = "Shower IPC Screen" - icon_state = "ipc_shower" - -/datum/sprite_accessory/hair/ipc/ipc_screen_static - name = "Static IPC Screen" - icon_state = "ipc_static" - -/datum/sprite_accessory/hair/ipc/ipc_screen_yellow - name = "Yellow IPC Screen" - icon_state = "ipc_yellow" - -/datum/sprite_accessory/hair/ipc/ipc_screen_scrolling - name = "Scanline IPC Screen" - icon_state = "ipc_scroll" - -/datum/sprite_accessory/hair/ipc/ipc_screen_console - name = "Console IPC Screen" - icon_state = "ipc_console" - -/datum/sprite_accessory/hair/ipc/ipc_screen_rgb - name = "RGB IPC Screen" - icon_state = "ipc_rgb" - -/datum/sprite_accessory/hair/ipc/ipc_screen_glider - name = "Glider IPC Screen" - icon_state = "ipc_gol_glider" - -/datum/sprite_accessory/hair/ipc/hesphiastos_alt_off - name = "Dark Hesphiastos Screen" - icon_state = "hesphiastos_alt_off" - models_allowed = list("Hesphiastos Industries alt.") - -/datum/sprite_accessory/hair/ipc/hesphiastos_alt_pink - name = "Pink Hesphiastos Screen" - icon_state = "hesphiastos_alt_pink" - models_allowed = list("Hesphiastos Industries alt.") - -/datum/sprite_accessory/hair/ipc/hesphiastos_alt_orange - name = "Orange Hesphiastos Screen" - icon_state = "hesphiastos_alt_orange" - models_allowed = list("Hesphiastos Industries alt.") - -/datum/sprite_accessory/hair/ipc/hesphiastos_alt_goggle - name = "Goggles Hesphiastos Screen" - icon_state = "hesphiastos_alt_goggles" - models_allowed = list("Hesphiastos Industries alt.") - -/datum/sprite_accessory/hair/ipc/hesphiastos_alt_scroll - name = "Scrolling Hesphiastos Screen" - icon_state = "hesphiastos_alt_scroll" - models_allowed = list("Hesphiastos Industries alt.") - -/datum/sprite_accessory/hair/ipc/hesphiastos_alt_rgb - name = "RGB Hesphiastos Screen" - icon_state = "hesphiastos_alt_rgb" - models_allowed = list("Hesphiastos Industries alt.") - -/datum/sprite_accessory/hair/ipc/hesphiastos_alt_rainbow - name = "Rainbow Hesphiastos Screen" - icon_state = "hesphiastos_alt_rainbow" - models_allowed = list("Hesphiastos Industries alt.") - -/datum/sprite_accessory/hair/ipc/fluff - fluff = 1 - -/datum/sprite_accessory/hair/ipc/fluff/lumi_face //Lumi Fluff hair - name = "Lumi Face" - icon_state = "lumi_face" - -/datum/sprite_accessory/hair/ipc/fluff/lumi_blush //Lumi Fluff hair - name = "Lumi Blush" - icon_state = "lumi_blush" - -/datum/sprite_accessory/hair/ipc/fluff/lumi_waiting //Lumi Fluff hair - name = "Lumi Waiting" - icon_state = "lumi_waiting" - -/* -/////////////////////////////////// -/ =---------------------------= / -/ == Alien Style Definitions == / -/ =---------------------------= / -/////////////////////////////////// -*/ - -/datum/sprite_accessory/hair/unathi - species_allowed = list("Unathi") - glasses_over = 1 - icon = 'icons/mob/body_accessory.dmi' - -/datum/sprite_accessory/hair/unathi/una_side_frills - icon = 'icons/mob/human_face.dmi' - name = "Unathi Side Frills" - icon_state = "unathi_sidefrills" - secondary_theme = "webbing" - -/datum/sprite_accessory/hair/unathi/una_cobra_hood - icon = 'icons/mob/human_face.dmi' - name = "Unathi Cobra Hood" - icon_state = "unathi_cobrahood" - secondary_theme = "webbing" - -/datum/sprite_accessory/hair/unathi/una_frills_dorsal - icon = 'icons/mob/human_face.dmi' - name = "Dorsal Frills" - icon_state = "unathi_dorsalfrills" - secondary_theme = "webbing" - -/datum/sprite_accessory/hair/unathi/simple - name = "Simple Horns" - icon_state = "horns_simple" - -/datum/sprite_accessory/hair/unathi/short - name = "Short Horns" - icon_state = "horns_short" - -/datum/sprite_accessory/hairy/unathi/curled - name = "Curled Horns" - icon_state = "horns_curled" - -/datum/sprite_accessory/hair/unathi/ram - name = "Ram Horns" - icon_state = "horns_ram" - -/datum/sprite_accessory/hair/unathi/double - name = "Double Horns" - icon_state = "horns_drac" - -/datum/sprite_accessory/hair/unathi/lower - name = "Lower Horns" - icon_state = "horns_lower" - -/datum/sprite_accessory/hair/unathi/big - name = "Big" - icon_state = "horns_big" - -/datum/sprite_accessory/hair/unathi/ram2 - name = "Ram alt." - icon_state = "horns_ram2" - -/datum/sprite_accessory/hair/unathi/small - name = "Small" - icon_state = "horns_small" - -/datum/sprite_accessory/hair/unathi/chin - name = "Chin" - icon_state = "horns_chin" - -/datum/sprite_accessory/hair/unathi/adorns - name = "Adorns" - icon_state = "horns_adorns" - -/datum/sprite_accessory/hair/unathi/spikes - name = "Spikes" - icon_state = "horns_spikes" - -/datum/sprite_accessory/hair/skrell - species_allowed = list("Skrell") - -/datum/sprite_accessory/hair/skrell/skr_tentacle_m - name = "Skrell Male Tentacles" - icon_state = "skrell_hair_m" - gender = MALE - -/datum/sprite_accessory/hair/skrell/skr_tentacle_f - name = "Skrell Female Tentacles" - icon_state = "skrell_hair_f" - gender = FEMALE - -/datum/sprite_accessory/hair/skrell/skr_tentacleslong - name = "Long Skrell Tentacles" - icon_state = "skrell_hair_verylong" - -/datum/sprite_accessory/hair/skrell/skr_tentaclesshort - name = "Short Skrell Tentacles" - icon_state = "skrell_hair_veryshort" - -/datum/sprite_accessory/hair/skrell/skr_gold_m - name = "Gold plated Skrell Male Tentacles" - icon_state = "skrell_hair_m" - gender = MALE - secondary_theme = "gold" - no_sec_colour = 1 - -/datum/sprite_accessory/hair/skrell/skr_gold_f - name = "Gold chained Skrell Female Tentacles" - icon_state = "skrell_hair_f" - gender = FEMALE - secondary_theme = "gold" - no_sec_colour = 1 - -/datum/sprite_accessory/hair/skrell/skr_clothtentacle_m - name = "Cloth draped Skrell Male Tentacles" - icon_state = "skrell_hair_m" - gender = MALE - secondary_theme = "cloth" - -/datum/sprite_accessory/hair/skrell/skr_clothtentacle_f - name = "Cloth draped Skrell Female Tentacles" - icon_state = "skrell_hair_f" - gender = FEMALE - secondary_theme = "cloth" - -/datum/sprite_accessory/hair/skrell/skr_gclothtentacle_m - name = "Ombre Dye, Skrell Male Tentacles" - icon_state = "skrell_hair_m" - gender = MALE - secondary_theme = "gradient" - -/datum/sprite_accessory/hair/skrell/skr_gclothtentacle_f - name = "Ombre Dye, Skrell Female Tentacles" - icon_state = "skrell_hair_f" - gender = FEMALE - secondary_theme = "gradient" - -/datum/sprite_accessory/hair/skrell/skr_gclothtentacleslong - name = "Ombre Dye, Long Skrell Tentacles" - icon_state = "skrell_hair_verylong" - secondary_theme = "gradient" - -/datum/sprite_accessory/hair/skrell/skr_gclothtentaclesshort - name = "Ombre Dye, Short Skrell Tentacles" - icon_state = "skrell_hair_veryshort" - secondary_theme = "gradient" - -/datum/sprite_accessory/hair/skrell/skr_diablacktentacle_m - name = "Black headress Skrell Male Tentacles" - icon_state = "skrell_hair_m" - gender = MALE - secondary_theme = "blackdia" - no_sec_colour = 1 - -/datum/sprite_accessory/hair/skrell/skr_diablacktentacle_f - name = "Black headress Skrell Female Tentacles" - icon_state = "skrell_hair_f" - gender = FEMALE - secondary_theme = "blackdia" - no_sec_colour = 1 - -/datum/sprite_accessory/hair/skrell/skr_diablacktentacleslong - name = "Black headress Long Skrell Tentacles" - icon_state = "skrell_hair_verylong" - secondary_theme = "blackdia" - no_sec_colour = 1 - - -/datum/sprite_accessory/hair/skrell/skr_diagoldtentacle_m - name = "Gold headress Skrell Male Tentacles" - icon_state = "skrell_hair_m" - gender = MALE - secondary_theme = "golddia" - no_sec_colour = 1 - -/datum/sprite_accessory/hair/skrell/skr_diagoldtentacle_f - name = "Gold headress Skrell Female Tentacles" - icon_state = "skrell_hair_f" - gender = FEMALE - secondary_theme = "golddia" - no_sec_colour = 1 - -/datum/sprite_accessory/hair/skrell/skr_diagoldtentacleslong - name = "Gold headress Long Skrell Tentacles" - icon_state = "skrell_hair_verylong" - secondary_theme = "golddia" - no_sec_colour = 1 - -/datum/sprite_accessory/hair/skrell/skr_diasilvertentacle_m - name = "Silver headress Skrell Male Tentacles" - icon_state = "skrell_hair_m" - gender = MALE - secondary_theme = "silvdia" - no_sec_colour = 1 - -/datum/sprite_accessory/hair/skrell/skr_diasilvertentacle_f - name = "Silver headress Skrell Female Tentacles" - icon_state = "skrell_hair_f" - gender = FEMALE - secondary_theme = "silvdia" - no_sec_colour = 1 - -/datum/sprite_accessory/hair/skrell/skr_diasilvertentacleslong - name = "Silver headress Long Skrell Tentacles" - icon_state = "skrell_hair_verylong" - secondary_theme = "silvdia" - no_sec_colour = 1 - -/datum/sprite_accessory/hair/skrell/skr_festivetentacle_m - name = "Festive headress Skrell Male Tentacles" - icon_state = "skrell_hair_m" - gender = MALE - secondary_theme = "fest" - no_sec_colour = 1 - -/datum/sprite_accessory/hair/skrell/skr_festivetentacle_f - name = "Festive headress Skrell Female Tentacles" - icon_state = "skrell_hair_f" - gender = FEMALE - secondary_theme = "fest" - no_sec_colour = 1 - -/datum/sprite_accessory/hair/skrell/skr_festivetentacleslong - name = "Festive headress Long Skrell Tentacles" - icon_state = "skrell_hair_verylong" - secondary_theme = "fest" - no_sec_colour = 1 - -/datum/sprite_accessory/hair/skrell/skr_festivetentaclesshort - name = "Festive headress Short Skrell Tentacles" - icon_state = "skrell_hair_veryshort" - secondary_theme = "fest" - no_sec_colour = 1 - -//Tajaran styles - -/datum/sprite_accessory/hair/tajara - species_allowed = list("Tajaran") - glasses_over = 1 - -/datum/sprite_accessory/hair/tajara/taj_hair_clean - name = "Tajara Clean" - icon_state = "hair_clean" - -/datum/sprite_accessory/hair/tajara/taj_hair_bangs - name = "Tajara Bangs" - icon_state = "hair_bangs" - glasses_over = null - -/datum/sprite_accessory/hair/tajara/taj_hair_braid - name = "Tajara Braid" - icon_state = "hair_tbraid" - secondary_theme = "beads" - glasses_over = null - -/datum/sprite_accessory/hair/tajara/taj_hair_shaggy - name = "Tajara Shaggy" - icon_state = "hair_shaggy" - -/datum/sprite_accessory/hair/tajara/taj_hair_mohawk - name = "Tajaran Mohawk" - icon_state = "hair_mohawk" - -/datum/sprite_accessory/hair/tajara/taj_hair_plait - name = "Tajara Plait" - icon_state = "hair_plait" - -/datum/sprite_accessory/hair/tajara/taj_hair_straight - name = "Tajara Straight" - icon_state = "hair_straight" - -/datum/sprite_accessory/hair/tajara/taj_hair_long - name = "Tajara Long" - icon_state = "hair_long" - -/datum/sprite_accessory/hair/tajara/taj_hair_rattail - name = "Tajara Rat Tail" - icon_state = "hair_rattail" - -/datum/sprite_accessory/hair/tajara/taj_hair_spiky - name = "Tajara Spikey" - icon_state = "hair_tajspikey" - -/datum/sprite_accessory/hair/tajara/taj_hair_messy - name = "Tajara Messy" - icon_state = "hair_messy" - -/datum/sprite_accessory/hair/tajara/taj_hair_curls - name = "Tajara Curly" - icon_state = "hair_curly" - glasses_over = null - -/datum/sprite_accessory/hair/tajara/taj_hair_bedhead - name = "Tajara bedhead" - icon_state = "hair_tbedhead" - glasses_over = null - -/datum/sprite_accessory/hair/tajara/taj_hair_retro - name = "Tajaran Ladies' Retro" - icon_state = "hair_ladies_retro" - glasses_over = null - -/datum/sprite_accessory/hair/tajara/taj_hair_victory - name = "Tajara Victory Curls" - icon_state = "hair_victory" - glasses_over = null - -/datum/sprite_accessory/hair/tajara/taj_hair_bob - name = "Tajara Bob" - icon_state = "hair_tbob" - glasses_over = null - -/datum/sprite_accessory/hair/tajara/taj_hair_fingercurl - name = "Tajara Finger Curls" - icon_state = "hair_fingerwave" - glasses_over = null - - - -/datum/sprite_accessory/hair/vulpkanin - species_allowed = list("Vulpkanin") - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_kajam - name = "Kajam" - icon_state = "kajam" - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_keid - name = "Keid" - icon_state = "keid" - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_adhara - name = "Adhara" - icon_state = "adhara" - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_kleeia - name = "Kleeia" - icon_state = "kleeia" - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_mizar - name = "Mizar" - icon_state = "mizar" - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_apollo - name = "Apollo" - icon_state = "apollo" - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_belle - name = "Belle" - icon_state = "belle" - secondary_theme = "bands" - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_bun - name = "Bun" - icon_state = "bun" - glasses_over = 1 - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_jagged - name = "Jagged" - icon_state = "jagged" - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_curl - name = "Curl" - icon_state = "curl" - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_hawk - name = "Hawk" - icon_state = "hawk" - glasses_over = 1 - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_anita - name = "Anita" - icon_state = "anita" - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_short - name = "Short" - icon_state = "short" - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_spike - name = "Spike" - icon_state = "spike" - glasses_over = 1 - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_braided - name = "Braided" - icon_state = "braided" - secondary_theme = "beads" - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_punkbraided - name = "Punk Braided" - icon_state = "punkbraided" - secondary_theme = "flare" - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_short2 - name = "Short Alt." - icon_state = "short2" - glasses_over = 1 - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_rough - name = "Rough-Cropped Mane" - icon_state = "rough" - -/datum/sprite_accessory/hair/vulpkanin/vulp_hair_raine - name = "Raine" - icon_state = "vulp_hair_raine" - gender = FEMALE - -/datum/sprite_accessory/hair/vox - species_allowed = list("Vox") - glasses_over = 1 - -/datum/sprite_accessory/hair/vox/vox_quills_short - name = "Short Vox Quills" - icon_state = "vox_shortquills" - -/datum/sprite_accessory/hair/vox/vox_crestedquills - name = "Crested Vox Quills" - icon_state = "vox_crestedquills" - -/datum/sprite_accessory/hair/vox/vox_tielquills - name = "Vox Tiel Quills" - icon_state = "vox_tielquills" - -/datum/sprite_accessory/hair/vox/vox_emperorquills - name = "Vox Emperor Quills" - icon_state = "vox_emperorquills" - -/datum/sprite_accessory/hair/vox/vox_keelquills - name = "Vox Keel Quills" - icon_state = "vox_keelquills" - -/datum/sprite_accessory/hair/vox/vox_keetquills - name = "Vox Keet Quills" - icon_state = "vox_keetquills" - -/datum/sprite_accessory/hair/vox/vox_quills_kingly - name = "Kingly Vox Quills" - icon_state = "vox_kingly" - -/datum/sprite_accessory/hair/vox/vox_quills_fluff - name = "Fluffy Vox Quills" - icon_state = "vox_afro" - -/datum/sprite_accessory/hair/vox/vox_quills_mohawk - name = "Vox Quill Mohawk" - icon_state = "vox_mohawk" - -/datum/sprite_accessory/hair/vox/vox_quills_long - name = "Long Vox Quills" - icon_state = "vox_yasu" - -/datum/sprite_accessory/hair/vox/vox_horns - name = "Vox Spikes" - icon_state = "vox_horns" - -/datum/sprite_accessory/hair/vox/vox_nights - name = "Vox Pigtails" - icon_state = "vox_nights" - -/datum/sprite_accessory/hair/vox/vox_razor - name = "Vox Razorback" - icon_state = "vox_razor" - -/datum/sprite_accessory/hair/vox/vox_razor_clipped - name = "Clipped Vox Razorback" - icon_state = "vox_razor_clipped" - -//DIONA: Sprites by skittles below -/datum/sprite_accessory/hair/diona - species_allowed = list("Diona") - glasses_over = 1 - do_colouration = 0 - -/datum/sprite_accessory/hair/diona/diona_bracket - name = "Bracket" - icon_state = "diona_bracket" - -/datum/sprite_accessory/hair/diona/diona_brush - name = "Brush" - icon_state = "diona_brush" - -/datum/sprite_accessory/hair/diona/diona_cornflow - name = "Corn Flowers" - icon_state = "diona_cornflower" - -/datum/sprite_accessory/hair/diona/diona_laur - name = "Laural" - icon_state = "diona_laurel" - -/datum/sprite_accessory/hair/diona/diona_leaf - name = "Leafy" - icon_state = "diona_leafy" - -/datum/sprite_accessory/hair/diona/diona_mead - name = "Meadow" - icon_state = "diona_meadow" - -/datum/sprite_accessory/hair/diona/diona_oak - name = "Oak" - icon_state = "diona_oak" - -/datum/sprite_accessory/hair/diona/diona_root - name = "Roots" - icon_state = "diona_root" - -/datum/sprite_accessory/hair/diona/diona_rose - name = "Rose" - icon_state = "diona_rosey" - -/datum/sprite_accessory/hair/diona/diona_spinner - name = "Spinners" - icon_state = "diona_spinner" - -/datum/sprite_accessory/hair/diona/diona_spout - name = "Sprouts" - icon_state = "diona_sprout" - -/datum/sprite_accessory/hair/diona/diona_vine - name = "Vines" - icon_state = "diona_vine" - -/datum/sprite_accessory/hair/diona/diona_wildflow - name = "Wildflowers" - icon_state = "diona_wildflower" - -//Kidan Hairstyles, sprites by Travelling Merchant - -/datum/sprite_accessory/hair/kidan - species_allowed = list("Kidan") - glasses_over = 1 - do_colouration = 0 - -/datum/sprite_accessory/hair/kidan/hollow_horns - name = "Hollow Horns" - icon_state = "kidan_hollow_horns" - -/datum/sprite_accessory/hair/kidan/wide_horns - name = "Wide Horns" - icon_state = "kidan_wide_horns" - -/datum/sprite_accessory/hair/kidan/curled_horns - name = "Curled Horns" - icon_state = "kidan_curled_horns" - -/datum/sprite_accessory/hair/kidan/hawk_horn - name = "Hawk Horn" - icon_state = "kidan_hawk_horn" - -/datum/sprite_accessory/hair/kidan/kidan_bull_horns - name = "Bull Horns" - icon_state = "kidan_bull_horns" - -/datum/sprite_accessory/hair/kidan/kidan_broken_bull_horns - name = "Broken Bull Horns" - icon_state = "kidan_broken_bull_horns" - -/datum/sprite_accessory/hair/kidan/kidan_tall_horns - name = "Tall Horns" - icon_state = "kidan_tall_horns" - - -// Apollo-specific - -/datum/sprite_accessory/hair/wryn - species_allowed = list("Wryn") - glasses_over = 1 - -/datum/sprite_accessory/hair/wryn/wry_antennae_default - name = "Antennae" - icon_state = "wryn_antennae" - -/datum/sprite_accessory/hair/nucleation - species_allowed = list("Nucleation") - glasses_over = 1 - -/datum/sprite_accessory/hair/nucleation/nuc_crystals - name = "Nucleation Crystals" - icon_state = "nuc_crystal" - -/datum/sprite_accessory/hair/nucleation/nuc_betaburns - name = "Nucleation Beta Burns" - icon_state = "nuc_betaburns" - -/datum/sprite_accessory/hair/nucleation/nuc_fallout - name = "Nucleation Fallout" - icon_state = "nuc_fallout" - -/datum/sprite_accessory/hair/nucleation/nuc_frission - name = "Nucleation Frission" - icon_state = "nuc_frission" - -/datum/sprite_accessory/hair/nucleation/nuc_radical - name = "Nucleation Free Radical" - icon_state = "nuc_radical" - -/datum/sprite_accessory/hair/nucleation/nuc_gammaray - name = "Nucleation Gamma Ray" - icon_state = "nuc_gammaray" - -/datum/sprite_accessory/hair/nucleation/nuc_neutron - name = "Nucleation Neutron Bomb" - icon_state = "nuc_neutron" - - - -/datum/sprite_accessory/hair/fluff - fluff = 1 - -/datum/sprite_accessory/hair/fluff/zeke_fluff_tentacle //Zeke Fluff hair - name = "Zekes Tentacles" - icon_state = "zeke_fluff_hair" - species_allowed = list("Skrell") - -/* -/////////////////////////////////// -/ =---------------------------= / -/ == Facial Hair Definitions == / -/ =---------------------------= / -/////////////////////////////////// -*/ - -/datum/sprite_accessory/facial_hair - icon = 'icons/mob/human_face.dmi' - gender = MALE // barf (unless you're a dorf, dorfs dig chix /w beards :P) - var/over_hair - -/datum/sprite_accessory/facial_hair/shaved - name = "Shaved" - icon_state = "bald" - gender = NEUTER - species_allowed = list("Human", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Vulpkanin", "Slime People") - -/datum/sprite_accessory/facial_hair/watson - name = "Watson Mustache" - icon_state = "facial_watson" - -/datum/sprite_accessory/facial_hair/hogan - name = "Hulk Hogan Mustache" - icon_state = "facial_hogan" //-Neek - -/datum/sprite_accessory/facial_hair/vandyke - name = "Van Dyke Mustache" - icon_state = "facial_vandyke" - -/datum/sprite_accessory/facial_hair/chaplin - name = "Square Mustache" - icon_state = "facial_chaplin" - -/datum/sprite_accessory/facial_hair/selleck - name = "Selleck Mustache" - icon_state = "facial_selleck" - -/datum/sprite_accessory/facial_hair/neckbeard - name = "Neckbeard" - icon_state = "facial_neckbeard" - -/datum/sprite_accessory/facial_hair/fullbeard - name = "Full Beard" - icon_state = "facial_fullbeard" - -/datum/sprite_accessory/facial_hair/longbeard - name = "Long Beard" - icon_state = "facial_longbeard" - -/datum/sprite_accessory/facial_hair/vlongbeard - name = "Very Long Beard" - icon_state = "facial_wise" - -/datum/sprite_accessory/facial_hair/elvis - name = "Elvis Sideburns" - icon_state = "facial_elvis" - species_allowed = list("Human", "Slime People", "Unathi") - -/datum/sprite_accessory/facial_hair/abe - name = "Abraham Lincoln Beard" - icon_state = "facial_abe" - -/datum/sprite_accessory/facial_hair/chinstrap - name = "Chinstrap" - icon_state = "facial_chin" - -/datum/sprite_accessory/facial_hair/hip - name = "Hipster Beard" - icon_state = "facial_hip" - -/datum/sprite_accessory/facial_hair/gt - name = "Goatee" - icon_state = "facial_gt" - -/datum/sprite_accessory/facial_hair/jensen - name = "Adam Jensen Beard" - icon_state = "facial_jensen" - -/datum/sprite_accessory/facial_hair/dwarf - name = "Dwarf Beard" - icon_state = "facial_dwarf" - -////////////////////////////// -//////START VG HAIRSTYLES///// -////////////////////////////// -/datum/sprite_accessory/facial_hair/britstache - name = "Brit Stache" - icon_state = "facial_britstache" - -/datum/sprite_accessory/facial_hair/martialartist - name = "Martial Artist" - icon_state = "facial_martialartist" - -/datum/sprite_accessory/facial_hair/moonshiner - name = "Moonshiner" - icon_state = "facial_moonshiner" - -/datum/sprite_accessory/facial_hair/tribeard - name = "Tri-beard" - icon_state = "facial_tribeard" - -/datum/sprite_accessory/facial_hair/unshaven - name = "Unshaven" - icon_state = "facial_unshaven" -////////////////////////////// -//////END VG HAIRSTYLES/////// -////////////////////////////// - - -/datum/sprite_accessory/facial_hair/tajara - species_allowed = list("Tajaran") - -/datum/sprite_accessory/facial_hair/tajara/taj_sideburns - name = "Tajara Sideburns" - icon_state = "facial_sideburns" - -/datum/sprite_accessory/facial_hair/tajara/taj_mutton - name = "Tajara Mutton" - icon_state = "facial_mutton" - -/datum/sprite_accessory/facial_hair/tajara/taj_pencilstache - name = "Tajara Pencilstache" - icon_state = "facial_pencilstache" - -/datum/sprite_accessory/facial_hair/tajara/taj_moustache - name = "Tajara Moustache" - icon_state = "facial_moustache" - -/datum/sprite_accessory/facial_hair/tajara/taj_goatee - name = "Tajara Goatee" - icon_state = "facial_goatee" - -/datum/sprite_accessory/facial_hair/tajara/taj_goatee_faded - name = "Tajara Faded Goatee" - icon_state = "facial_goatee_faded" - -/datum/sprite_accessory/facial_hair/tajara/taj_smallstache - name = "Tajara Smallstache" - icon_state = "facial_smallstache" - -/datum/sprite_accessory/facial_hair/vox - species_allowed = list("Vox") - gender = NEUTER - -/datum/sprite_accessory/facial_hair/vox/vox_colonel - name = "Vox Colonel Beard" - icon_state = "vox_colonel" - -/datum/sprite_accessory/facial_hair/vox/vox_long - name = "Long Mustache" - icon_state = "vox_fu" - -/datum/sprite_accessory/facial_hair/vox/vox_neck - name = "Neck Quills" - icon_state = "vox_neck" - -/datum/sprite_accessory/facial_hair/vox/vox_beard - name = "Vox Quill Beard" - icon_state = "vox_beard" - -/datum/sprite_accessory/facial_hair/vulpkanin - species_allowed = list("Vulpkanin") - gender = NEUTER - -/datum/sprite_accessory/facial_hair/vulpkanin/vulp_blaze - name = "Blaze" - icon_state = "vulp_facial_blaze" - -/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine - name = "Vulpine" - icon_state = "vulp_facial_vulpine" - -/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine_brows - name = "Vulpine and Brows" - icon_state = "vulp_facial_vulpine_brows" - -/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine_fluff - name = "Vulpine and Earfluff" - icon_state = "vulp_facial_vulpine_fluff" - -/datum/sprite_accessory/facial_hair/vulpkanin/vulp_mask - name = "Mask" - icon_state = "vulp_facial_mask" - -/datum/sprite_accessory/facial_hair/vulpkanin/vulp_patch - name = "Patch" - icon_state = "vulp_facial_patch" - -/datum/sprite_accessory/facial_hair/vulpkanin/vulp_ruff - name = "Ruff" - icon_state = "vulp_facial_ruff" - -/datum/sprite_accessory/facial_hair/vulpkanin/vulp_kita - name = "Kita" - icon_state = "vulp_facial_kita" - -/datum/sprite_accessory/facial_hair/vulpkanin/vulp_swift - name = "Swift" - icon_state = "vulp_facial_swift" - -/datum/sprite_accessory/facial_hair/vulpkanin/vulp_elder - name = "Elder" - icon_state = "vulp_facial_elder" - secondary_theme = "chin" - -/datum/sprite_accessory/facial_hair/vulpkanin/vulp_slash - name = "Slash" - icon_state = "vulp_facial_slash" - -/datum/sprite_accessory/facial_hair/unathi - species_allowed = list("Unathi") - gender = NEUTER - over_hair = 1 - -/datum/sprite_accessory/facial_hair/unathi/una_spines_long - name = "Long Spines" - icon_state = "unathi_longspines" - -/datum/sprite_accessory/facial_hair/unathi/una_spines_short - name = "Short Spines" - icon_state = "unathi_shortspines" - -/datum/sprite_accessory/facial_hair/unathi/una_frills_aquaspine - name = "Spiny Aquatic Frills" - icon_state = "unathi_dracfrills" - -/datum/sprite_accessory/facial_hair/unathi/una_frills_aquatic - name = "Aquatic Frills" - icon_state = "unathi_aquaticfrills" - -/datum/sprite_accessory/facial_hair/unathi/una_frills_long - name = "Long Frills" - icon_state = "unathi_longfrills" - -/datum/sprite_accessory/facial_hair/unathi/una_frills_short - name = "Short Frills" - icon_state = "unathi_shortfrills" - -/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_aquaspine - name = "Spiny Aquatic Webbed Frills" - icon_state = "unathi_dracfrills" - secondary_theme = "webbing" - -/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_aquatic - name = "Aquatic Webbed Frills" - icon_state = "unathi_aquaticfrills" - secondary_theme = "webbing" - -/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_long - name = "Long Webbed Frills" - icon_state = "unathi_longfrills" - secondary_theme = "webbing" - -/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_short - name = "Short Webbed Frills" - icon_state = "unathi_shortfrills" - secondary_theme = "webbing" - -/datum/sprite_accessory/facial_hair/unathi/una_side_frills - name = "Side Frills" - icon_state = "unathi_sidefrills" - secondary_theme = "webbing" - -/datum/sprite_accessory/facial_hair/unathi/una_frills_dorsal - over_hair = null - name = "Dorsal Frills" - icon_state = "unathi_dorsalfrills" - secondary_theme = "webbing" - -/datum/sprite_accessory/facial_hair/unathi/una_chin_horns - name = "Chin Horns" - icon = 'icons/mob/body_accessory.dmi' - icon_state = "horns_chin" - -/datum/sprite_accessory/facial_hair/unathi/una_horn_adorns - name = "Horn Adorns" - icon = 'icons/mob/body_accessory.dmi' - icon_state = "horns_adorns" - -/datum/sprite_accessory/facial_hair/unathi/una_spikes - name = "Spikes" - icon = 'icons/mob/body_accessory.dmi' - icon_state = "horns_spikes" - -//skin styles - WIP -//going to have to re-integrate this with surgery -//let the icon_state hold an icon preview for now -/datum/sprite_accessory/skin - icon = 'icons/mob/human_races/r_human.dmi' - -/datum/sprite_accessory/skin/human - name = "Default human skin" - icon_state = "default" - species_allowed = list("Human") - -/datum/sprite_accessory/skin/human/human_tatt01 - name = "Tatt01 human skin" - icon_state = "tatt1" - -/datum/sprite_accessory/skin/tajaran - name = "Default tajaran skin" - icon_state = "default" - icon = 'icons/mob/human_races/r_tajaran.dmi' - species_allowed = list("Tajaran") - -/datum/sprite_accessory/skin/vulpkanin - name = "Default Vulpkanin skin" - icon_state = "default" - icon = 'icons/mob/human_races/r_vulpkanin.dmi' - species_allowed = list("Vulpkanin") - -/datum/sprite_accessory/skin/unathi - name = "Default Unathi skin" - icon_state = "default" - icon = 'icons/mob/human_races/r_lizard.dmi' - species_allowed = list("Unathi") - -/datum/sprite_accessory/skin/skrell - name = "Default skrell skin" - icon_state = "default" - icon = 'icons/mob/human_races/r_skrell.dmi' - species_allowed = list("Skrell") - -/////////////////////////// -// Underwear Definitions // -/////////////////////////// -/datum/sprite_accessory/underwear - icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") - gender = NEUTER - -/datum/sprite_accessory/underwear/nude - name = "Nude" - icon_state = null - species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") - -/datum/sprite_accessory/underwear/male - gender = MALE - -/datum/sprite_accessory/underwear/male/male_white - name = "Mens White" - icon_state = "male_white" - -/datum/sprite_accessory/underwear/male/male_grey - name = "Mens Grey" - icon_state = "male_grey" - -/datum/sprite_accessory/underwear/male/male_grey - name = "Mens Grey Alt" - icon_state = "male_greyalt" - -/datum/sprite_accessory/underwear/male/male_green - name = "Mens Green" - icon_state = "male_green" - -/datum/sprite_accessory/underwear/male/male_blue - name = "Mens Blue" - icon_state = "male_blue" - -/datum/sprite_accessory/underwear/male/male_red - name = "Mens Red" - icon_state = "male_red" - -/datum/sprite_accessory/underwear/male/male_black - name = "Mens Black" - icon_state = "male_black" - -/datum/sprite_accessory/underwear/male/male_black_alt - name = "Mens Black Alt" - icon_state = "male_blackalt" - -/datum/sprite_accessory/underwear/male/male_striped - name = "Mens Striped" - icon_state = "male_stripe" - -/datum/sprite_accessory/underwear/male/male_heart - name = "Mens Hearts" - icon_state = "male_hearts" - -/datum/sprite_accessory/underwear/male/male_kinky - name = "Mens Kinky" - icon_state = "male_kinky" - -/datum/sprite_accessory/underwear/male/male_mankini - name = "Mankini" - icon_state = "male_mankini" - -/datum/sprite_accessory/underwear/female - gender = FEMALE - -/datum/sprite_accessory/underwear/female/female_red - name = "Ladies Red" - icon_state = "female_red" - -/datum/sprite_accessory/underwear/female/female_green - name = "Ladies Green" - icon_state = "female_green" - -/datum/sprite_accessory/underwear/female/female_white - name = "Ladies White" - icon_state = "female_white" - -/datum/sprite_accessory/underwear/female/female_whiter - name = "Ladies Whiter" - icon_state = "female_whiter" - -/datum/sprite_accessory/underwear/female/female_whitealt - name = "Ladies White Alt" - icon_state = "female_whitealt" - -/datum/sprite_accessory/underwear/female/female_yellow - name = "Ladies Yellow" - icon_state = "female_yellow" - -/datum/sprite_accessory/underwear/female/female_blue - name = "Ladies Blue" - icon_state = "female_blue" -/datum/sprite_accessory/underwear/female/female_babyblue - name = "Ladies Baby Blue" - icon_state = "female_babyblue" - -/datum/sprite_accessory/underwear/female/female_black - name = "Ladies Black" - icon_state = "female_black" - -/datum/sprite_accessory/underwear/female/female_blacker - name = "Ladies Blacker" - icon_state = "female_blacker" - -/datum/sprite_accessory/underwear/female/female_blackalt - name = "Ladies Black Alt" - icon_state = "female_blackalt" - -/datum/sprite_accessory/underwear/female/female_kinky - name = "Ladies Kinky" - icon_state = "female_kinky" - -/datum/sprite_accessory/underwear/female/female_babydoll - name = "Ladies Full Grey" - icon_state = "female_babydoll" - -/datum/sprite_accessory/underwear/female/female_pink - name = "Ladies Pink" - icon_state = "female_pink" - -/datum/sprite_accessory/underwear/female/female_thong - name = "Ladies Thong" - icon_state = "female_thong" - -//////////////////////////// -// Undershirt Definitions // -//////////////////////////// -/datum/sprite_accessory/undershirt - icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") - gender = NEUTER - -/datum/sprite_accessory/undershirt/nude - name = "Nude" - icon_state = null - species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") - -//plain color shirts -/datum/sprite_accessory/undershirt/shirt_white - name = "White Shirt" - icon_state = "shirt_white" - -/datum/sprite_accessory/undershirt/shirt_black - name = "Black Shirt" - icon_state = "shirt_black" - -/datum/sprite_accessory/undershirt/shirt_blacker - name = "Blacker Shirt" - icon_state = "shirt_blacker" - -/datum/sprite_accessory/undershirt/shirt_grey - name = "Grey Shirt" - icon_state = "shirt_grey" - -/datum/sprite_accessory/undershirt/shirt_red - name = "Red Shirt" - icon_state = "shirt_red" - -/datum/sprite_accessory/undershirt/shirt_blue - name = "Blue Shirt" - icon_state = "shirt_blue" - -/datum/sprite_accessory/undershirt/shirt_yellow - name = "Yellow Shirt" - icon_state = "shirt_yellow" - -/datum/sprite_accessory/undershirt/shirt_green - name = "Green Shirt" - icon_state = "shirt_green" - -/datum/sprite_accessory/undershirt/shirt_darkblue - name = "Dark Blue Shirt" - icon_state = "shirt_darkblue" - -/datum/sprite_accessory/undershirt/shirt_darkred - name = "Dark Red Shirt" - icon_state = "shirt_darkred" - -/datum/sprite_accessory/undershirt/shirt_darkgreen - name = "Dark Green Shirt" - icon_state = "shirt_darkgreen" -//end plain color shirts - -//graphic shirts -/datum/sprite_accessory/undershirt/shirt_heart - name = "Heart Shirt" - icon_state = "shirt_heart" - -/datum/sprite_accessory/undershirt/shirt_corgi - name = "Corgi Shirt" - icon_state = "shirt_corgi" - -/datum/sprite_accessory/undershirt/shirt_clown - name = "Clown Shirt" - icon_state = "shirt_clown" - -/datum/sprite_accessory/undershirt/shirt_alien - name = "Alien Shirt" - icon_state = "shirt_alien" - -/datum/sprite_accessory/undershirt/shirt_jack - name = "Union Jack Shirt" - icon_state = "shirt_jack" - -/datum/sprite_accessory/undershirt/love_nt - name = "I Love NT Shirt" - icon_state = "shirt_lovent" - -/datum/sprite_accessory/undershirt/peace - name = "Peace Shirt" - icon_state = "shirt_peace" - -/datum/sprite_accessory/undershirt/mondmondjaja - name = "Band Shirt" - icon_state = "shirt_band" - -/datum/sprite_accessory/undershirt/pacman - name = "Pogoman Shirt" - icon_state = "shirt_pogoman" - -/datum/sprite_accessory/undershirt/shirt_ss13 - name = "SS13 Shirt" - icon_state = "shirt_ss13" - -/datum/sprite_accessory/undershirt/shirt_question - name = "Question Mark Shirt" - icon_state = "shirt_question" - -/datum/sprite_accessory/undershirt/shirt_skull - name = "Skull Shirt" - icon_state = "shirt_skull" - -/datum/sprite_accessory/undershirt/shirt_commie - name = "Communist Shirt" - icon_state = "shirt_commie" - -/datum/sprite_accessory/undershirt/shirt_nano - name = "Nanotrasen Shirt" - icon_state = "shirt_nano" - -/datum/sprite_accessory/undershirt/shirt_meat - name = "Meat Shirt" - icon_state = "shirt_meat" - -/datum/sprite_accessory/undershirt/shirt_tiedie - name = "Tiedie Shirt" - icon_state = "shirt_tiedie" - -/datum/sprite_accessory/undershirt/blue_striped - name = "Striped Blue Shirt" - icon_state = "shirt_bluestripe" - -/datum/sprite_accessory/undershirt/brightblue_striped - name = "Striped Bright Blue Shirt" - icon_state = "shirt_brightbluestripe" -//end graphic shirts - -//short sleeved -/datum/sprite_accessory/undershirt/short_white - name = "White Short-sleeved Shirt" - icon_state = "short_white" - -/datum/sprite_accessory/undershirt/short_purple - name = "Purple Short-sleeved Shirt" - icon_state = "short_purple" - -/datum/sprite_accessory/undershirt/short_blue - name = "Blue Short-sleeved Shirt" - icon_state = "short_blue" - -/datum/sprite_accessory/undershirt/short_green - name = "Green Short-sleeved Shirt" - icon_state = "short_green" - -/datum/sprite_accessory/undershirt/short_black - name = "Black Short-sleeved Shirt" - icon_state = "short_black" -//end short sleeved - -//polo shirts -/datum/sprite_accessory/undershirt/polo_blue - name = "Blue Polo Shirt" - icon_state = "polo_blue" - -/datum/sprite_accessory/undershirt/polo_red - name = "Red Polo Shirt" - icon_state = "polo_red" - -/datum/sprite_accessory/undershirt/polo_greyelllow - name = "Grey-Yellow Polo Shirt" - icon_state = "polo_greyellow" -//end polo shirts - -//sport shirts -/datum/sprite_accessory/undershirt/sport_green - name = "Green Sports Shirt" - icon_state = "sport_green" - -/datum/sprite_accessory/undershirt/sport_red - name = "Red Sports Shirt" - icon_state = "sport_red" - -/datum/sprite_accessory/undershirt/sport_blue - name = "Blue Sports Shirt" - icon_state = "sport_blue" - -/datum/sprite_accessory/undershirt/jersey_red - name = "Red Jersey" - icon_state = "jersey_red" - -/datum/sprite_accessory/undershirt/jersey_blue - name = "Blue Jersey" - icon_state = "jersey_blue" -//end sport shirts - -//tanktops -/datum/sprite_accessory/undershirt/tank_redtop - name = "Red Crop-Top" - icon_state = "tank_redtop" - gender = FEMALE - -/datum/sprite_accessory/undershirt/tank_whitetop - name = "White Crop-Top" - icon_state = "tank_whitetop" - gender = FEMALE - -/datum/sprite_accessory/undershirt/tank_midriff - name = "White Mid Tank-Top" - icon_state = "tank_midriff" - gender = FEMALE - -/datum/sprite_accessory/undershirt/tank_white - name = "White Tank-Top" - icon_state = "tank_white" - -/datum/sprite_accessory/undershirt/tank_black - name = "Black Tank-Top" - icon_state = "tank_black" - -/datum/sprite_accessory/undershirt/tank_blacker - name = "Blacker Tank-Top" - icon_state = "tank_blacker" - -/datum/sprite_accessory/undershirt/tank_grey - name = "Grey Tank-Top" - icon_state = "tank_grey" - -/datum/sprite_accessory/undershirt/tank_red - name = "Red Tank-Top" - icon_state = "tank_red" - -/datum/sprite_accessory/undershirt/tank_fire - name = "Fire Tank-Top" - icon_state = "tank_fire" - -/datum/sprite_accessory/undershirt/tank_stripes - name = "Striped Tank-Top" - icon_state = "tank_stripes" -//end tanktops - -/////////////////////// -// Socks Definitions // -/////////////////////// -/datum/sprite_accessory/socks - icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") - gender = NEUTER - -/datum/sprite_accessory/socks/nude - name = "Nude" - icon_state = null - species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") - -/datum/sprite_accessory/socks/white_norm - name = "Normal White" - icon_state = "white_norm" - -/datum/sprite_accessory/socks/black_norm - name = "Normal Black" - icon_state = "black_norm" - -/datum/sprite_accessory/socks/white_short - name = "Short White" - icon_state = "white_short" - -/datum/sprite_accessory/socks/black_short - name = "Short Black" - icon_state = "black_short" - -/datum/sprite_accessory/socks/white_knee - name = "Knee-high White" - icon_state = "white_knee" - -/datum/sprite_accessory/socks/black_knee - name = "Knee-high Black" - icon_state = "black_knee" - -/datum/sprite_accessory/socks/thin_knee - name = "Knee-high Thin" - icon_state = "thin_knee" - gender = FEMALE - -/datum/sprite_accessory/socks/striped_knee - name = "Knee-high Striped" - icon_state = "striped_knee" - -/datum/sprite_accessory/socks/rainbow_knee - name = "Knee-high Rainbow" - icon_state = "rainbow_knee" - -/datum/sprite_accessory/socks/white_thigh - name = "Thigh-high White" - icon_state = "white_thigh" - -/datum/sprite_accessory/socks/black_thigh - name = "Thigh-high Black" - icon_state = "black_thigh" - -/datum/sprite_accessory/socks/thin_thigh - name = "Thigh-high Thin" - icon_state = "thin_thigh" - gender = FEMALE - -/datum/sprite_accessory/socks/striped_thigh - name = "Thigh-high Striped" - icon_state = "striped_thigh" - -/datum/sprite_accessory/socks/rainbow_thigh - name = "Thigh-high Rainbow" - icon_state = "rainbow_thigh" - -/datum/sprite_accessory/socks/pantyhose - name = "Pantyhose" - icon_state = "pantyhose" - gender = FEMALE - -/datum/sprite_accessory/socks/black_fishnet - name = "Black Fishnet" - icon_state = "black_fishnet" - -/datum/sprite_accessory/socks/vox - species_allowed = list("Vox") - -/datum/sprite_accessory/socks/vox/vox_white - name = "Vox White" - icon_state = "vox_white" - -/datum/sprite_accessory/socks/vox/vox_black - name = "Vox Black" - icon_state = "vox_black" - -/datum/sprite_accessory/socks/vox/vox_thin - name = "Vox Black Thin" - icon_state = "vox_blackthin" - -/datum/sprite_accessory/socks/vox/vox_rainbow - name = "Vox Rainbow" - icon_state = "vox_rainbow" - -/datum/sprite_accessory/socks/vox/vox_stripped - name = "Vox Striped" - icon_state = "vox_white" - -/datum/sprite_accessory/socks/vox/vox_white_thigh - name = "Vox Thigh-high White" - icon_state = "vox_whiteTH" - -/datum/sprite_accessory/socks/vox/vox_black_thigh - name = "Vox Thigh-high Black" - icon_state = "vox_blackTH" - -/datum/sprite_accessory/socks/vox/vox_thin_thigh - name = "Vox Thigh-high Thin" - icon_state = "vox_blackthinTH" - -/datum/sprite_accessory/socks/vox/vox_rainbow_thigh - name = "Vox Thigh-high Rainbow" - icon_state = "vox_rainbowTH" - -/datum/sprite_accessory/socks/vox/vox_striped_thigh - name = "Vox Thigh-high Striped" - icon_state = "vox_stripedTH" - -/datum/sprite_accessory/socks/vox/vox_fishnet - name = "Vox Fishnets" - icon_state = "vox_fishnet" - -/* HEAD ACCESSORY */ - -/datum/sprite_accessory/head_accessory - icon = 'icons/mob/body_accessory.dmi' - species_allowed = list("Unathi", "Vulpkanin", "Tajaran", "Machine") - icon_state = "accessory_none" - var/over_hair - -/datum/sprite_accessory/head_accessory/none - name = "None" - species_allowed = list("Human", "Unathi", "Diona", "Grey", "Kidan", "Machine", "Tajaran", "Vulpkanin", "Skrell", "Slime People", "Skeleton", "Vox") - icon_state = "accessory_none" - -/datum/sprite_accessory/head_accessory/unathi - species_allowed = list("Unathi") - over_hair = 1 - -/datum/sprite_accessory/head_accessory/unathi/simple - name = "Simple" - icon_state = "horns_simple" - -/datum/sprite_accessory/head_accessory/unathi/short - name = "Short" - icon_state = "horns_short" - -/datum/sprite_accessory/head_accessory/unathi/curled - name = "Curled" - icon_state = "horns_curled" - -/datum/sprite_accessory/head_accessory/unathi/ram - name = "Ram" - icon_state = "horns_ram" - -/datum/sprite_accessory/head_accessory/unathi/double - name = "Double" - icon_state = "horns_drac" - -/datum/sprite_accessory/head_accessory/unathi/lower - name = "Lower" - icon_state = "horns_lower" - -/datum/sprite_accessory/head_accessory/unathi/big - name = "Big" - icon_state = "horns_big" - -/datum/sprite_accessory/head_accessory/unathi/ram2 - name = "Ram alt." - icon_state = "horns_ram2" - -/datum/sprite_accessory/head_accessory/unathi/small - name = "Small" - icon_state = "horns_small" - -/datum/sprite_accessory/head_accessory/unathi/chin - name = "Chin" - icon_state = "horns_chin" - -/datum/sprite_accessory/head_accessory/unathi/adorns - name = "Adorns" - icon_state = "horns_adorns" - -/datum/sprite_accessory/head_accessory/unathi/spikes - name = "Spikes" - icon_state = "horns_spikes" - -/datum/sprite_accessory/head_accessory/tajara - species_allowed = list("Tajaran") - -/datum/sprite_accessory/head_accessory/tajara/outears_taj - name = "Tajaran Outer Ears" - icon_state = "markings_face_outears_taj" - -/datum/sprite_accessory/head_accessory/tajara/inears_taj - name = "Tajaran Inner Ears" - icon_state = "markings_face_inears_taj" - -/datum/sprite_accessory/head_accessory/tajara/muzzle_taj - name = "Tajaran Muzzle" - icon_state = "markings_face_muzzle_taj" - -/datum/sprite_accessory/head_accessory/tajara/muzzle_and_inears_taj - name = "Tajaran Muzzle and Inner Ears" - icon_state = "markings_face_muzzle_and_inears_taj" - -/datum/sprite_accessory/head_accessory/tajara/taj_ears - icon = 'icons/mob/human_face.dmi' - name = "Tajaran Ears" - icon_state = "ears_plain" - -/datum/sprite_accessory/head_accessory/tajara/taj_nose - name = "Tajaran Nose" - icon_state = "markings_face_nose_taj" - -/datum/sprite_accessory/head_accessory/vulpkanin - species_allowed = list("Vulpkanin") - -/datum/sprite_accessory/head_accessory/vulpkanin/vulp_earfluff - icon = 'icons/mob/human_face.dmi' - name = "Vulpkanin Earfluff" - icon_state = "vulp_facial_earfluff" - -/datum/sprite_accessory/head_accessory/vulpkanin/vulp_blaze - icon = 'icons/mob/human_face.dmi' - name = "Blaze" - icon_state = "vulp_facial_blaze" - -/datum/sprite_accessory/head_accessory/vulpkanin/vulp_vulpine - icon = 'icons/mob/human_face.dmi' - name = "Vulpine" - icon_state = "vulp_facial_vulpine" - -/datum/sprite_accessory/head_accessory/vulpkanin/vulp_vulpine_fluff - icon = 'icons/mob/human_face.dmi' - name = "Vulpine and Earfluff" - icon_state = "vulp_facial_vulpine_fluff" - -/datum/sprite_accessory/head_accessory/vulpkanin/vulp_mask - icon = 'icons/mob/human_face.dmi' - name = "Mask" - icon_state = "vulp_facial_mask" - -/datum/sprite_accessory/head_accessory/vulpkanin/vulp_patch - icon = 'icons/mob/human_face.dmi' - name = "Patch" - icon_state = "vulp_facial_patch" - -/datum/sprite_accessory/head_accessory/vulpkanin/vulp_ruff - icon = 'icons/mob/human_face.dmi' - name = "Ruff" - icon_state = "vulp_facial_ruff" - -/datum/sprite_accessory/head_accessory/vulpkanin/vulp_kita - icon = 'icons/mob/human_face.dmi' - name = "Kita" - icon_state = "vulp_facial_kita" - -/datum/sprite_accessory/head_accessory/vulpkanin/vulp_swift - icon = 'icons/mob/human_face.dmi' - name = "Swift" - icon_state = "vulp_facial_swift" - -/datum/sprite_accessory/head_accessory/vulpkanin/vulp_nose - name = "Vulpkanin Nose" - icon_state = "markings_face_nose_vulp" - -/datum/sprite_accessory/head_accessory/vulpkanin/vulp_nose2 - name = "Vulpkanin Nose Alt." - icon_state = "markings_face_nose2_vulp" - -/datum/sprite_accessory/head_accessory/vulpkanin/vulp_elder - icon = 'icons/mob/human_face.dmi' - name = "Elder" - icon_state = "vulp_facial_elder" - -/datum/sprite_accessory/head_accessory/vulpkanin/vulp_slash - icon = 'icons/mob/human_face.dmi' - name = "Slash" - icon_state = "vulp_facial_slash" - -/datum/sprite_accessory/head_accessory/ipc - species_allowed = list("Machine") - over_hair = 1 - -/datum/sprite_accessory/head_accessory/ipc/ipc_antennae - name = "Antennae" - icon_state = "antennae" - -/datum/sprite_accessory/head_accessory/ipc/ipc_tv_antennae - name = "T.V. Antennae" - icon_state = "tvantennae" - -/datum/sprite_accessory/head_accessory/ipc/ipc_tesla_antennae - name = "Tesla Antennae" - icon_state = "tesla" - -/datum/sprite_accessory/head_accessory/ipc/ipc_light - name = "Head Light" - icon_state = "light" - -/datum/sprite_accessory/head_accessory/ipc/ipc_side_lights - name = "Side Lights" - icon_state = "sidelights" - -/datum/sprite_accessory/head_accessory/ipc/ipc_side_cyber_head - name = "Cyber Pipes" - icon_state = "cyberhead" - -/datum/sprite_accessory/head_accessory/ipc/ipc_side_antlers - name = "Antlers" - icon_state = "antlers" - -/datum/sprite_accessory/head_accessory/ipc/ipc_side_drone_eyes - name = "Drone Eyes" - icon_state = "droneeyes" - -/datum/sprite_accessory/head_accessory/ipc/ipc_crowned - name = "Crowned" - icon_state = "crowned" - -/datum/sprite_accessory/head_accessory/kidan - icon = 'icons/mob/human_face.dmi' - species_allowed = list("Kidan") - over_hair = 1 - do_colouration = 1 - -/datum/sprite_accessory/head_accessory/kidan/perked_antennae - name = "Perked-up Antennae" - icon_state = "kidan_perky" - -/datum/sprite_accessory/head_accessory/kidan/mopey_antennae - name = "Mopey Antennae" - icon_state = "kidan_mopey" - -/datum/sprite_accessory/head_accessory/kidan/curious_antennae - name = "Curious Antennae" - icon_state = "kidan_curious" - -/datum/sprite_accessory/head_accessory/kidan/mopey_antennae - name = "Mopey Antennae" - icon_state = "kidan_mopey" - -/datum/sprite_accessory/head_accessory/kidan/crescent_antennae - name = "Crescent Antennae" - icon_state = "kidan_crescent" - -/datum/sprite_accessory/head_accessory/kidan/alert_antennae - name = "Alert Antennae" - icon_state = "kidan_alert" - -/datum/sprite_accessory/head_accessory/kidan/normal_antennae - name = "Normal Antennae" - icon_state = "kidan_normal" - -/datum/sprite_accessory/head_accessory/kidan/long_antennae - name = "Long Antennae" - icon_state = "kidan_long" - -/datum/sprite_accessory/head_accessory/kidan/moth_antennae - name = "Moth Antennae" - icon_state = "kidan_moth" - -/datum/sprite_accessory/head_accessory/kidan/kidan_Mantie_Long - name = "Mantie Long" - icon_state = "kidan_Mantie_Long" - -/datum/sprite_accessory/head_accessory/kidan/kidan_Mantie_Curled - name = "Mantie Curled" - icon_state = "kidan_Mantie_Curled" - -/datum/sprite_accessory/head_accessory/kidan/kidan_very_short - name = "Very Short" - icon_state = "kidan_very_short" - -/* BODY MARKINGS */ - -/datum/sprite_accessory/body_markings - icon = 'icons/mob/body_accessory.dmi' - species_allowed = list("Unathi", "Tajaran", "Vulpkanin", "Machine", "Vox", "Kidan") - icon_state = "accessory_none" - marking_location = "body" - -/datum/sprite_accessory/body_markings/none - name = "None" - species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Skrell", "Slime People", "Skeleton", "Vox", "Kidan") - icon_state = "accessory_none" - -/datum/sprite_accessory/body_markings/tiger - name = "Tiger Body" - species_allowed = list("Unathi", "Tajaran", "Vulpkanin") - icon_state = "markings_tiger" - -/datum/sprite_accessory/body_markings/kidan - species_allowed = list("Kidan") - -/datum/sprite_accessory/body_markings/kidan/outline_kid - name = "Kidan Outline" - icon_state = "markings_outline_kid" - -/datum/sprite_accessory/body_markings/unathi - species_allowed = list("Unathi") - -/datum/sprite_accessory/body_markings/unathi/stripe_una - name = "Unathi Stripe" - icon_state = "markings_stripe_una" - -/datum/sprite_accessory/body_markings/unathi/belly_narrow_una - name = "Unathi Belly" - icon_state = "markings_belly_narrow_una" - -/datum/sprite_accessory/body_markings/unathi/banded_una - name = "Unathi Banded" - icon_state = "markings_banded_una" - -/datum/sprite_accessory/body_markings/unathi/points_una - name = "Unathi Points" - icon_state = "markings_points_una" - -/datum/sprite_accessory/body_markings/tajara - species_allowed = list("Tajaran") - -/datum/sprite_accessory/body_markings/tajara/belly_flat_taj - name = "Tajaran Belly" - icon_state = "markings_belly_flat_taj" - -/datum/sprite_accessory/body_markings/tajara/belly_crest_taj - name = "Tajaran Chest Crest" - icon_state = "markings_belly_crest_taj" - -/datum/sprite_accessory/body_markings/tajara/belly_full_taj - name = "Tajaran Belly 2" - icon_state = "markings_belly_full_taj" - -/datum/sprite_accessory/body_markings/tajara/points_taj - name = "Tajaran Points" - icon_state = "markings_points_taj" - -/datum/sprite_accessory/body_markings/tajara/patchy_taj - name = "Tajaran Patches" - icon_state = "markings_patch_taj" - -/datum/sprite_accessory/body_markings/vulpkanin - species_allowed = list("Vulpkanin") - -/datum/sprite_accessory/body_markings/vulpkanin/belly_fox_vulp - name = "Vulpkanin Belly" - icon_state = "markings_belly_fox_vulp" - -/datum/sprite_accessory/body_markings/vulpkanin/belly_full_vulp - name = "Vulpkanin Belly 2" - icon_state = "markings_belly_full_vulp" - -/datum/sprite_accessory/body_markings/vulpkanin/belly_crest_vulp - name = "Vulpkanin Belly Crest" - icon_state = "markings_belly_crest_vulp" - -/datum/sprite_accessory/body_markings/vulpkanin/points_fade_vulp - name = "Vulpkanin Points" - icon_state = "markings_points_fade_vulp" - -/datum/sprite_accessory/body_markings/vulpkanin/points_fade_belly_vulp - name = "Vulpkanin Points and Belly" - icon_state = "markings_points_fade_belly_vulp" - -/datum/sprite_accessory/body_markings/vulpkanin/points_fade_belly_alt_vulp - name = "Vulpkanin Points and Belly Alt." - icon_state = "markings_points_fade_belly_alt_vulp" - -/datum/sprite_accessory/body_markings/vulpkanin/points_sharp_vulp - name = "Vulpkanin Points 2" - icon_state = "markings_points_sharp_vulp" - -/datum/sprite_accessory/body_markings/vulpkanin/points_crest_vulp - name = "Vulpkanin Points and Crest" - icon_state = "markings_points_crest_vulp" - -/datum/sprite_accessory/body_markings/drask - species_allowed = list("Drask") - -/datum/sprite_accessory/body_markings/drask/arm_spines_drask - name = "Drask Arm Spines" - icon_state = "markings_armspines_drask" - -/datum/sprite_accessory/body_markings/head - marking_location = "head" - species_allowed = list() - -/datum/sprite_accessory/body_markings/head/kidan - species_allowed = list("Kidan") - -/datum/sprite_accessory/body_markings/head/kidan/outline_head_kid - name = "Kidan Outline Head" - icon_state = "markings_head_outline_kid" - -/datum/sprite_accessory/body_markings/head/tajara - species_allowed = list("Tajaran") - -/datum/sprite_accessory/body_markings/head/tajara/tiger_head_taj - name = "Tajaran Tiger Head" - icon_state = "markings_head_tiger_taj" - -/datum/sprite_accessory/body_markings/head/tajara/tiger_face_taj - name = "Tajaran Tiger Head and Face" - icon_state = "markings_face_tiger_taj" - -/datum/sprite_accessory/body_markings/head/tajara/outears_taj - name = "Tajaran Outer Ears" - icon_state = "markings_face_outears_taj" - -/datum/sprite_accessory/body_markings/head/tajara/inears_taj - name = "Tajaran Inner Ears" - icon_state = "markings_face_inears_taj" - -/datum/sprite_accessory/body_markings/head/tajara/nose_taj - name = "Tajaran Nose" - icon_state = "markings_face_nose_taj" - -/datum/sprite_accessory/body_markings/head/tajara/muzzle_taj - name = "Tajaran Muzzle" - icon_state = "markings_face_muzzle_taj" - -/datum/sprite_accessory/body_markings/head/tajara/muzzle_and_inears_taj - name = "Tajaran Muzzle and Inner Ears" - icon_state = "markings_face_muzzle_and_inears_taj" - -/datum/sprite_accessory/body_markings/head/tajara/muzzle_alt_taj //Companion marking for Tajaran Belly 2. - name = "Tajaran Muzzle 2" - icon_state = "markings_face_full_taj" - -/datum/sprite_accessory/body_markings/head/tajara/points_taj //Companion marking for Tajaran Points. - name = "Tajaran Points Head" - icon_state = "markings_face_points_taj" - -/datum/sprite_accessory/body_markings/head/tajara/patchy_taj //Companion marking for Tajaran Patches. - name = "Tajaran Patches Head" - icon_state = "markings_face_patch_taj" - -/datum/sprite_accessory/body_markings/head/vulpkanin - species_allowed = list("Vulpkanin") - -/datum/sprite_accessory/body_markings/head/vulpkanin/tiger_head_vulp - name = "Vulpkanin Tiger Head" - icon_state = "markings_head_tiger_vulp" - -/datum/sprite_accessory/body_markings/head/vulpkanin/tiger_face_vulp - name = "Vulpkanin Tiger Head and Face" - icon_state = "markings_face_tiger_vulp" - -/datum/sprite_accessory/body_markings/head/vulpkanin/nose_default_vulp - name = "Vulpkanin Nose" - icon_state = "markings_face_nose_vulp" - -/datum/sprite_accessory/body_markings/head/vulpkanin/nose2_default_vulp - name = "Vulpkanin Nose Alt." - icon_state = "markings_face_nose2_vulp" - -/datum/sprite_accessory/body_markings/head/vulpkanin/muzzle_vulp //Companion marking for Vulpkanin Belly Alt.. - name = "Vulpkanin Muzzle" - icon_state = "markings_face_full_vulp" - -/datum/sprite_accessory/body_markings/head/vulpkanin/muzzle_ears_vulp //Companion marking for Vulpkanin Belly Alt.. - name = "Vulpkanin Muzzle and Ears" - icon_state = "markings_face_full_ears_vulp" - -/datum/sprite_accessory/body_markings/head/vulpkanin/points_fade_vulp //Companion marking for Vulpkanin Points Fade. - name = "Vulpkanin Points Head" - icon_state = "markings_face_points_fade_vulp" - -/datum/sprite_accessory/body_markings/head/vulpkanin/points_sharp_vulp //Companion marking for Vulpkanin Points Sharp. - name = "Vulpkanin Points Head 2" - icon_state = "markings_face_points_sharp_vulp" - -/datum/sprite_accessory/body_markings/head/unathi - species_allowed = list("Unathi") - -/datum/sprite_accessory/body_markings/head/unathi/tiger_head_una - name = "Unathi Tiger Head" - icon_state = "markings_head_tiger_una" - heads_allowed = list("All") - -/datum/sprite_accessory/body_markings/head/unathi/tiger_face_una - name = "Unathi Tiger Head and Face" - icon_state = "markings_face_tiger_una" - -/datum/sprite_accessory/body_markings/head/unathi/snout_una_round - name = "Unathi Round Snout" - icon_state = "markings_face_snout_una_round" - -/datum/sprite_accessory/body_markings/head/unathi/snout_lower_una_round - name = "Unathi Lower Round Snout" - icon_state = "markings_face_snout_lower_una" - heads_allowed = list("All") - -/datum/sprite_accessory/body_markings/head/unathi/banded_una //Companion marking for Unathi Banded. - name = "Unathi Banded Head" - icon_state = "markings_face_banded_una" - heads_allowed = list("All") - -/datum/sprite_accessory/body_markings/head/unathi/snout_narrow_una //Companion marking for Unathi Narrow Belly. - name = "Unathi Snout 2" - icon_state = "markings_face_narrow_una" - -/datum/sprite_accessory/body_markings/head/unathi/points_una //Companion marking for Unathi Points. - name = "Unathi Points Head" - icon_state = "markings_face_points_una" - -/datum/sprite_accessory/body_markings/head/unathi/sharp - heads_allowed = list("Unathi Sharp Snout") - -/datum/sprite_accessory/body_markings/head/unathi/sharp/tiger_face_una_sharp - name = "Unathi Sharp Tiger Head and Face" - icon_state = "markings_face_tiger_una_sharp" - -/datum/sprite_accessory/body_markings/head/unathi/sharp/snout_una_sharp - name = "Unathi Sharp Snout" - icon_state = "markings_face_snout_una_sharp" - -/datum/sprite_accessory/body_markings/head/unathi/sharp/snout_narrow_una_sharp //Companion marking for Unathi Narrow Belly. - name = "Unathi Sharp Snout 2" - icon_state = "markings_face_narrow_una_sharp" - -/datum/sprite_accessory/body_markings/head/unathi/sharp/points_una_sharp //Companion marking for Unathi Points. - name = "Unathi Sharp Points Head" - icon_state = "markings_face_points_una" - -/datum/sprite_accessory/body_markings/head/optics - name = "Humanoid Optics" - species_allowed = list("Machine") - icon_state = "optics" - models_allowed = list("Bishop Cybernetics", "Hesphiastos Industries", "Ward-Takahashi", "Xion Manufacturing Group", "Zeng-Hu Pharmaceuticals") //Should be the same as the manufacturing company of the limb in robolimbs.dm - -/datum/sprite_accessory/body_markings/head/optics/bishop_alt - name = "Bishop Alt. Optics" - icon_state = "bishop_alt_optics" - models_allowed = list("Bishop Cybernetics alt.") - -/datum/sprite_accessory/body_markings/head/optics/morpheus_alt - name = "Morpheus Alt. Optics" - icon_state = "morpheus_alt_optics" - models_allowed = list("Morpheus Cyberkinetics alt.") - -/datum/sprite_accessory/body_markings/head/optics/wardtakahashi_alt - name = "Ward-Takahashi Alt. Optics" - icon_state = "wardtakahashi_alt_optics" - models_allowed = list("Ward-Takahashi alt.") - -/datum/sprite_accessory/body_markings/head/optics/xion_alt - name = "Xion Alt. Optics" - icon_state = "xion_alt_optics" - models_allowed = list("Xion Manufacturing Group alt.") - -/datum/sprite_accessory/body_markings/tattoo // Tattoos applied post-round startup with tattoo guns in item_defines.dm - species_allowed = list("Human", "Unathi", "Vulpkanin", "Tajaran", "Skrell") - icon_state = "accessory_none" - -/datum/sprite_accessory/body_markings/tattoo/elliot - name = "Elliot Circuit Tattoo" - icon_state = "campbell_tattoo" - species_allowed = null - -/datum/sprite_accessory/body_markings/tattoo/tiger_body - name = "Tiger-stripe Tattoo" - species_allowed = list("Human", "Unathi", "Vulpkanin", "Tajaran", "Skrell") - icon_state = "markings_tiger" - -/datum/sprite_accessory/body_markings/tattoo/heart - name = "Heart Tattoo" - icon_state = "markings_tattoo_heart" - -/datum/sprite_accessory/body_markings/tattoo/hive - name = "Hive Tattoo" - icon_state = "markings_tattoo_hive" - -/datum/sprite_accessory/body_markings/tattoo/nightling - name = "Nightling Tattoo" - icon_state = "markings_tattoo_nightling" - -/datum/sprite_accessory/body_markings/tattoo/grey - species_allowed = list("Grey") - -/datum/sprite_accessory/body_markings/tattoo/grey/heart_grey - name = "Grey Heart Tattoo" - icon_state = "markings_tattoo_heart_grey" - -/datum/sprite_accessory/body_markings/tattoo/grey/hive_grey - name = "Grey Hive Tattoo" - icon_state = "markings_tattoo_hive_grey" - -/datum/sprite_accessory/body_markings/tattoo/grey/nightling_grey - name = "Grey Nightling Tattoo" - icon_state = "markings_tattoo_nightling_grey" - -/datum/sprite_accessory/body_markings/tattoo/grey/tiger_body_grey - name = "Grey Tiger-stripe Tattoo" - icon_state = "markings_tattoo_tiger_grey" - -/datum/sprite_accessory/body_markings/tattoo/vox - species_allowed = list("Vox") - -/datum/sprite_accessory/body_markings/tattoo/vox/heart_vox - name = "Vox Heart Tattoo" - icon_state = "markings_tattoo_heart_vox" - -/datum/sprite_accessory/body_markings/tattoo/vox/hive_vox - name = "Vox Hive Tattoo" - icon_state = "markings_tattoo_hive_vox" - -/datum/sprite_accessory/body_markings/tattoo/vox/nightling_vox - name = "Vox Nightling Tattoo" - icon_state = "markings_tattoo_nightling_vox" - -/datum/sprite_accessory/body_markings/tattoo/vox/tiger_body_vox - name = "Vox Tiger-stripe Tattoo" - icon_state = "markings_tattoo_tiger_vox" - -/datum/sprite_accessory/body_markings/tail - species_allowed = list() - icon_state = "accessory_none" - marking_location = "tail" - tails_allowed = null - -/datum/sprite_accessory/body_markings/tail/vox - species_allowed = list("Vox") - -/datum/sprite_accessory/body_markings/tail/vox/vox_band - name = "Vox Tail Band" - icon_state = "markings_voxtail_band" - -/datum/sprite_accessory/body_markings/tail/vox/vox_tip - name = "Vox Tail Tip" - icon_state = "markings_voxtail_tip" - -/datum/sprite_accessory/body_markings/tail/vox/vox_stripe - name = "Vox Tail Stripe" - icon_state = "markings_voxtail_stripe" - -/datum/sprite_accessory/body_markings/tail/vulpkanin - species_allowed = list("Vulpkanin") - -/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_default_tip - name = "Vulpkanin Default Tail Tip" - icon_state = "markings_vulptail_tip" - -/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_default_fade - name = "Vulpkanin Default Tail Fade" - icon_state = "markings_vulptail_fade" - -/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_bushy_fluff - name = "Vulpkanin Bushy Tail Fluff" - tails_allowed = list("Vulpkanin Alt 1 (Bushy)") - icon_state = "markings_vulptail2_fluff" - -/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_short_tip - name = "Vulpkanin Short Tail Tip" - tails_allowed = list("Vulpkanin Alt 4 (Short)") - icon_state = "markings_vulptail5_tip" - -/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_tip - name = "Vulpkanin Bushy Straight Tail Tip" - tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)") - icon_state = "markings_vulptail6_tip" - -/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_fade - name = "Vulpkanin Bushy Straight Tail Fade" - tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)") - icon_state = "markings_vulptail6_fade" - -/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_silverf - name = "Vulpkanin Bushy Straight Tail Black Fade White Tip" - tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)") - icon_state = "markings_vulptail6_silverf" - -/* ALT HEADS */ - -/datum/sprite_accessory/alt_heads - icon = null - icon_state = null - species_allowed = null - var/suffix = null - -/datum/sprite_accessory/alt_heads/none - name = "None" - -/datum/sprite_accessory/alt_heads/una_sharp_snout - name = "Unathi Sharp Snout" - species_allowed = list("Unathi") - icon_state = "head_sharp" - suffix = "sharp" diff --git a/code/modules/mob/new_player/sprite_accessories/diona/diona_hair.dm b/code/modules/mob/new_player/sprite_accessories/diona/diona_hair.dm new file mode 100644 index 00000000000..3ab33449080 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/diona/diona_hair.dm @@ -0,0 +1,59 @@ + +//DIONA: Sprites by skittles below +/datum/sprite_accessory/hair/diona + icon = 'icons/mob/sprite_accessories/diona/diona_hair.dmi' + species_allowed = list("Diona") + glasses_over = 1 + do_colouration = 0 + +/datum/sprite_accessory/hair/diona/diona_bracket + name = "Bracket" + icon_state = "bracket" + +/datum/sprite_accessory/hair/diona/diona_brush + name = "Brush" + icon_state = "brush" + +/datum/sprite_accessory/hair/diona/diona_cornflow + name = "Corn Flowers" + icon_state = "cornflower" + +/datum/sprite_accessory/hair/diona/diona_laur + name = "Laural" + icon_state = "laurel" + +/datum/sprite_accessory/hair/diona/diona_leaf + name = "Leafy" + icon_state = "leafy" + +/datum/sprite_accessory/hair/diona/diona_mead + name = "Meadow" + icon_state = "meadow" + +/datum/sprite_accessory/hair/diona/diona_oak + name = "Oak" + icon_state = "oak" + +/datum/sprite_accessory/hair/diona/diona_root + name = "Roots" + icon_state = "root" + +/datum/sprite_accessory/hair/diona/diona_rose + name = "Rose" + icon_state = "rosey" + +/datum/sprite_accessory/hair/diona/diona_spinner + name = "Spinners" + icon_state = "spinner" + +/datum/sprite_accessory/hair/diona/diona_spout + name = "Sprouts" + icon_state = "sprout" + +/datum/sprite_accessory/hair/diona/diona_vine + name = "Vines" + icon_state = "vine" + +/datum/sprite_accessory/hair/diona/diona_wildflow + name = "Wildflowers" + icon_state = "wildflower" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/drask/drask_body_markings.dm b/code/modules/mob/new_player/sprite_accessories/drask/drask_body_markings.dm new file mode 100644 index 00000000000..abc16905788 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/drask/drask_body_markings.dm @@ -0,0 +1,7 @@ +/datum/sprite_accessory/body_markings/drask + species_allowed = list("Drask") + +/datum/sprite_accessory/body_markings/drask/arm_spines_drask + icon = 'icons/mob/sprite_accessories/drask/drask_body_markings.dmi' + name = "Drask Arm Spines" + icon_state = "armspines" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/grey/grey_body_markings.dm b/code/modules/mob/new_player/sprite_accessories/grey/grey_body_markings.dm new file mode 100644 index 00000000000..6aee0043d89 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/grey/grey_body_markings.dm @@ -0,0 +1,19 @@ +/datum/sprite_accessory/body_markings/tattoo/grey + icon = 'icons/mob/sprite_accessories/grey/grey_body_markings.dmi' + species_allowed = list("Grey") + +/datum/sprite_accessory/body_markings/tattoo/grey/heart_grey + name = "Grey Heart Tattoo" + icon_state = "heart" + +/datum/sprite_accessory/body_markings/tattoo/grey/hive_grey + name = "Grey Hive Tattoo" + icon_state = "hive" + +/datum/sprite_accessory/body_markings/tattoo/grey/nightling_grey + name = "Grey Nightling Tattoo" + icon_state = "nightling" + +/datum/sprite_accessory/body_markings/tattoo/grey/tiger_body_grey + name = "Grey Tiger-stripe Tattoo" + icon_state = "tiger" diff --git a/code/modules/mob/new_player/sprite_accessories/human/human_body_markings.dm b/code/modules/mob/new_player/sprite_accessories/human/human_body_markings.dm new file mode 100644 index 00000000000..9cef4230139 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/human/human_body_markings.dm @@ -0,0 +1,35 @@ +/datum/sprite_accessory/body_markings/none + name = "None" + species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Skrell", "Slime People", "Skeleton", "Vox", "Kidan") + icon_state = "none" + +/datum/sprite_accessory/body_markings/tiger + name = "Tiger Body" + species_allowed = list("Unathi", "Tajaran", "Vulpkanin") + icon_state = "tiger" + +/datum/sprite_accessory/body_markings/tattoo // Tattoos applied post-round startup with tattoo guns in item_defines.dm + species_allowed = list("Human", "Unathi", "Vulpkanin", "Tajaran", "Skrell") + icon_state = "none" + +/datum/sprite_accessory/body_markings/tattoo/elliot + name = "Elliot Circuit Tattoo" + icon_state = "campbell" + species_allowed = null + +/datum/sprite_accessory/body_markings/tattoo/tiger_body // Yep, this is repeated. To be fixed later + name = "Tiger-stripe Tattoo" + species_allowed = list("Human", "Unathi", "Vulpkanin", "Tajaran", "Skrell") + icon_state = "tiger" + +/datum/sprite_accessory/body_markings/tattoo/heart + name = "Heart Tattoo" + icon_state = "heart" + +/datum/sprite_accessory/body_markings/tattoo/hive + name = "Hive Tattoo" + icon_state = "hive" + +/datum/sprite_accessory/body_markings/tattoo/nightling + name = "Nightling Tattoo" + icon_state = "nightling" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/human/human_facial_hair.dm b/code/modules/mob/new_player/sprite_accessories/human/human_facial_hair.dm new file mode 100644 index 00000000000..e3136011393 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/human/human_facial_hair.dm @@ -0,0 +1,105 @@ +/* +/////////////////////////////////// +/ =---------------------------= / +/ == Facial Hair Definitions == / +/ =---------------------------= / +/////////////////////////////////// +*/ + +/datum/sprite_accessory/facial_hair/shaved + icon = 'icons/mob/human_face.dmi' // Special case, use the bald icon in human face + name = "Shaved" + icon_state = "bald" + gender = NEUTER + species_allowed = list("Human", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Vulpkanin", "Slime People") + +/datum/sprite_accessory/facial_hair/watson + name = "Watson Mustache" + icon_state = "watson" + +/datum/sprite_accessory/facial_hair/hogan + name = "Hulk Hogan Mustache" + icon_state = "hogan" //-Neek + +/datum/sprite_accessory/facial_hair/vandyke + name = "Van Dyke Mustache" + icon_state = "vandyke" + +/datum/sprite_accessory/facial_hair/chaplin + name = "Square Mustache" + icon_state = "chaplin" + +/datum/sprite_accessory/facial_hair/selleck + name = "Selleck Mustache" + icon_state = "selleck" + +/datum/sprite_accessory/facial_hair/neckbeard + name = "Neckbeard" + icon_state = "neckbeard" + +/datum/sprite_accessory/facial_hair/fullbeard + name = "Full Beard" + icon_state = "fullbeard" + +/datum/sprite_accessory/facial_hair/longbeard + name = "Long Beard" + icon_state = "longbeard" + +/datum/sprite_accessory/facial_hair/vlongbeard + name = "Very Long Beard" + icon_state = "wise" + +/datum/sprite_accessory/facial_hair/elvis + name = "Elvis Sideburns" + icon_state = "elvis" + species_allowed = list("Human", "Slime People", "Unathi") + +/datum/sprite_accessory/facial_hair/abe + name = "Abraham Lincoln Beard" + icon_state = "abe" + +/datum/sprite_accessory/facial_hair/chinstrap + name = "Chinstrap" + icon_state = "chim" + +/datum/sprite_accessory/facial_hair/hip + name = "Hipster Beard" + icon_state = "hip" + +/datum/sprite_accessory/facial_hair/gt + name = "Goatee" + icon_state = "gt" + +/datum/sprite_accessory/facial_hair/jensen + name = "Adam Jensen Beard" + icon_state = "jensen" + +/datum/sprite_accessory/facial_hair/dwarf + name = "Dwarf Beard" + icon_state = "dwarf" + +////////////////////////////// +//////START VG HAIRSTYLES///// +////////////////////////////// +/datum/sprite_accessory/facial_hair/britstache + name = "Brit Stache" + icon_state = "britstache" + +/datum/sprite_accessory/facial_hair/martialartist + name = "Martial Artist" + icon_state = "martialartist" + +/datum/sprite_accessory/facial_hair/moonshiner + name = "Moonshiner" + icon_state = "moonshiner" + +/datum/sprite_accessory/facial_hair/tribeard + name = "Tri-beard" + icon_state = "tribeard" + +/datum/sprite_accessory/facial_hair/unshaven + name = "Unshaven" + icon_state = "unshaven" +////////////////////////////// +//////END VG HAIRSTYLES/////// +////////////////////////////// \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/human/human_hair.dm b/code/modules/mob/new_player/sprite_accessories/human/human_hair.dm new file mode 100644 index 00000000000..c37ab2a8822 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/human/human_hair.dm @@ -0,0 +1,685 @@ +/* +== Human Hair Definitions == +*/ + +/datum/sprite_accessory/hair/short + name = "Short Hair" // try to capatilize the names please~ + icon_state = "short" // you do not need to define _s or _l sub-states, game automatically does this for you a + glasses_over = 1 + +/datum/sprite_accessory/hair/cut + name = "Cut Hair" + icon_state = "cut" + glasses_over = 1 + +/datum/sprite_accessory/hair/long + name = "Shoulder-length Hair" + icon_state = "long" + +/datum/sprite_accessory/hair/longalt + name = "Shoulder-length Hair Alt" + icon_state = "longfringe" + +/datum/sprite_accessory/hair/longer + name = "Long Hair" + icon_state = "vlong" + +/datum/sprite_accessory/hair/longeralt + name = "Long Hair Alt" + icon_state = "vlongfringe" + +/datum/sprite_accessory/hair/longest + name = "Very Long Hair" + icon_state = "longest" + +/datum/sprite_accessory/hair/longfringe + name = "Long Fringe" + icon_state = "longfringe" + +/datum/sprite_accessory/hair/longestalt + name = "Longer Fringe" + icon_state = "vlongfringe" + +/datum/sprite_accessory/hair/halfbang + name = "Half-banged Hair" + icon_state = "halfbang" + +/datum/sprite_accessory/hair/halfbangalt + name = "Half-banged Hair Alt" + icon_state = "halfbang_alt" + +/datum/sprite_accessory/hair/ponytail1 + name = "Ponytail male" + icon_state = "ponytailm" + gender = MALE + glasses_over = 1 + +/datum/sprite_accessory/hair/ponytail2 + name = "Ponytail female" + icon_state = "ponytailf" + gender = FEMALE + +/datum/sprite_accessory/hair/ponytail3 + name = "Ponytail alt" + icon_state = "ponytail3" + glasses_over = 1 + +/datum/sprite_accessory/hair/sideponytail + name = "Side Ponytail" + icon_state = "stail" + gender = FEMALE + glasses_over = 1 + +/datum/sprite_accessory/hair/highponytail + name = "High Ponytail" + icon_state = "highponytail" + gender = FEMALE + glasses_over = 1 + +/datum/sprite_accessory/hair/wisp + name = "Wisp" + icon_state = "wisp" + gender = FEMALE + +/datum/sprite_accessory/hair/parted + name = "Parted" + icon_state = "parted" + +/datum/sprite_accessory/hair/pompadour + name = "Pompadour" + icon_state = "pompadour" + gender = MALE + species_allowed = list("Human", "Slime People", "Unathi") + glasses_over = 1 + +/datum/sprite_accessory/hair/quiff + name = "Quiff" + icon_state = "quiff" + gender = MALE + glasses_over = 1 + +/datum/sprite_accessory/hair/bedhead + name = "Bedhead" + icon_state = "bedhead" + +/datum/sprite_accessory/hair/bedhead2 + name = "Bedhead 2" + icon_state = "bedhead2" + +/datum/sprite_accessory/hair/bedhead3 + name = "Bedhead 3" + icon_state = "bedhead3" + +/datum/sprite_accessory/hair/beehive + name = "Beehive" + icon_state = "beehive" + gender = FEMALE + species_allowed = list("Human", "Slime People", "Unathi") + +/datum/sprite_accessory/hair/bobcurl + name = "Bobcurl" + icon_state = "bobcurl" + gender = FEMALE + species_allowed = list("Human", "Slime People", "Unathi") + +/datum/sprite_accessory/hair/bob + name = "Bob" + icon_state = "bobcut" + gender = FEMALE + species_allowed = list("Human", "Slime People", "Unathi") + +/datum/sprite_accessory/hair/bowl + name = "Bowl" + icon_state = "bowlcut" + gender = MALE + glasses_over = 1 + +/datum/sprite_accessory/hair/braid2 + name = "Long Braid" + icon_state = "hbraid" + gender = FEMALE + +/datum/sprite_accessory/hair/braid_hip + name = "Hippie Braid" + icon_state = "hipbraid" + secondary_theme = "beads" + +/datum/sprite_accessory/hair/buzz + name = "Buzzcut" + icon_state = "buzzcut" + gender = MALE + species_allowed = list("Human", "Slime People", "Unathi") + glasses_over = 1 + +/datum/sprite_accessory/hair/crew + name = "Crewcut" + icon_state = "crewcut" + gender = MALE + glasses_over = 1 + +/datum/sprite_accessory/hair/combover + name = "Combover" + icon_state = "combover" + gender = MALE + glasses_over = 1 + +/datum/sprite_accessory/hair/devillock + name = "Devil Lock" + icon_state = "devilock" + glasses_over = 1 + +/datum/sprite_accessory/hair/dreadlocks + name = "Dreadlocks" + icon_state = "dreads" + +/datum/sprite_accessory/hair/curls + name = "Curls" + icon_state = "curls" + +/datum/sprite_accessory/hair/afro + name = "Afro" + icon_state = "afro" + +/datum/sprite_accessory/hair/afro2 + name = "Afro 2" + icon_state = "afro2" + glasses_over = 1 + +/datum/sprite_accessory/hair/afro_large + name = "Big Afro" + icon_state = "bigafro" + gender = MALE + +/datum/sprite_accessory/hair/sergeant + name = "Flat Top" + icon_state = "sergeant" + gender = MALE + glasses_over = 1 + +/datum/sprite_accessory/hair/emo + name = "Emo" + icon_state = "emo" + +/datum/sprite_accessory/hair/fag + name = "Flow Hair" + icon_state = "flow" + +/datum/sprite_accessory/hair/feather + name = "Feather" + icon_state = "feather" + +/datum/sprite_accessory/hair/hitop + name = "Hitop" + icon_state = "hitop" + gender = MALE + glasses_over = 1 + +/datum/sprite_accessory/hair/mohawk + name = "Mohawk" + icon_state = "mohawk" + species_allowed = list("Human", "Slime People", "Unathi") + glasses_over = 1 + +/datum/sprite_accessory/hair/jensen + name = "Adam Jensen Hair" + icon_state = "jensen" + gender = MALE + glasses_over = 1 + +/datum/sprite_accessory/hair/cia + name = "CIA" + icon_state = "cia" + gender = MALE + glasses_over = 1 + +/datum/sprite_accessory/hair/mulder + name = "Mulder" + icon_state = "mulder" + gender = MALE + glasses_over = 1 + +/datum/sprite_accessory/hair/gelled + name = "Gelled Back" + icon_state = "gelled" + gender = FEMALE + glasses_over = 1 + +/datum/sprite_accessory/hair/gentle + name = "Gentle" + icon_state = "gentle" + gender = FEMALE + +/datum/sprite_accessory/hair/spiky + name = "Spiky" + icon_state = "spikey" + species_allowed = list("Human", "Slime People", "Unathi") + glasses_over = 1 + +/datum/sprite_accessory/hair/kusanagi + name = "Kusanagi Hair" + icon_state = "kusanagi" + +/datum/sprite_accessory/hair/kagami + name = "Pigtails" + icon_state = "kagami" + gender = FEMALE + glasses_over = 1 + +/datum/sprite_accessory/hair/himecut + name = "Hime Cut" + icon_state = "himecut" + gender = FEMALE + +/datum/sprite_accessory/hair/braid + name = "Floorlength Braid" + icon_state = "floorbraid" + gender = FEMALE + +/datum/sprite_accessory/hair/odango + name = "Odango" + icon_state = "odango" + gender = FEMALE + glasses_over = 1 + +/datum/sprite_accessory/hair/ombre + name = "Ombre" + icon_state = "ombre" + gender = FEMALE + +/datum/sprite_accessory/hair/updo + name = "Updo" + icon_state = "updo" + gender = FEMALE + +/datum/sprite_accessory/hair/skinhead + name = "Skinhead" + icon_state = "skinhead" + glasses_over = 1 + +/datum/sprite_accessory/hair/balding + name = "Balding Hair" + icon_state = "balding" + gender = MALE // turnoff! + glasses_over = 1 + +/datum/sprite_accessory/hair/longemo + name = "Long Emo" + icon_state = "emolong" + gender = FEMALE + +////////////////////////////// +//////START VG HAIRSTYLES///// +////////////////////////////// +/datum/sprite_accessory/hair/birdnest + name = "Bird Nest" + icon_state = "birdnest" + +/datum/sprite_accessory/hair/unkept + name = "Unkempt" + icon_state = "unkept" + +/datum/sprite_accessory/hair/duelist + name = "Duelist" + icon_state = "duelist" + gender = MALE + +/datum/sprite_accessory/hair/modern + name = "Modern" + icon_state = "modern" + gender = FEMALE + +/datum/sprite_accessory/hair/unshavenmohawk + name = "Unshaven Mohawk" + icon_state = "unshavenmohawk" + gender = MALE + glasses_over = 1 + +/datum/sprite_accessory/hair/drills + name = "Twincurls" + icon_state = "twincurl" + gender = FEMALE + +/datum/sprite_accessory/hair/minidrills + name = "Twincurls 2" + icon_state = "twincurl2" + gender = FEMALE +////////////////////////////// +//////END VG HAIRSTYLES/////// +////////////////////////////// + +/////////////////////////////////// +//////START POLARIS HAIRSTYLES///// +////////////////////////////////// + +/datum/sprite_accessory/hair/dave + name = "Dave" + icon_state = "dave" + +/datum/sprite_accessory/hair/rosa + name = "Rosa" + icon_state = "rosa" + +/datum/sprite_accessory/hair/jade + name = "Jade" + icon_state = "jade" + +/datum/sprite_accessory/hair/shy + name = "Shy" + icon_state = "shy" + +/datum/sprite_accessory/hair/manbun + name = "Manbun" + icon_state = "manbun" + +/datum/sprite_accessory/hair/thinningback + name = "Thinning Back" + icon_state = "thinningrear" + +/datum/sprite_accessory/hair/thinningfront + name = "Thinning Front" + icon_state = "thinningfront" + +/datum/sprite_accessory/hair/thinning + name = "Thinning" + icon_state = "thinning" + +/datum/sprite_accessory/hair/bowlcut2 + name = "Bowl 2" + icon_state = "bowlcut2" + +/datum/sprite_accessory/hair/ronin + name = "Ronin" + icon_state = "ronin" + +/datum/sprite_accessory/hair/topknot + name = "Topknot" + icon_state = "topknot" + +/datum/sprite_accessory/hair/regulationmohawk + name = "Regulation Mohawk" + icon_state = "shavedmohawk" + +/datum/sprite_accessory/hair/rowbraid + name = "Row Braid" + icon_state = "rowbraid" + +/datum/sprite_accessory/hair/rowdualbraid + name = "Row Dual Braid" + icon_state = "rowdualtail" + +/datum/sprite_accessory/hair/rowbun + name = "Row Bun" + icon_state = "rowbun" + +/datum/sprite_accessory/hair/hightight + name = "High and Tight" + icon_state = "hightight" + +/datum/sprite_accessory/hair/partfade + name = "Parted Fade" + icon_state = "shavedpart" + gender = MALE + +/datum/sprite_accessory/hair/undercut3 + name = "Undercut Swept Left" + icon_state = "undercut3" + gender = MALE + +/datum/sprite_accessory/hair/undercut2 + name = "Undercut Swept Right" + icon_state = "undercut2" + gender = MALE + +/datum/sprite_accessory/hair/undercut1 + name = "Undercut" + icon_state = "undercut1" + gender = MALE + +/datum/sprite_accessory/hair/coffeehouse + name = "Coffee House Cut" + icon_state = "coffeehouse" + gender = MALE + +/datum/sprite_accessory/hair/tightbun + name = "Tight Bun" + icon_state = "tightbun" + gender = FEMALE + +/datum/sprite_accessory/hair/trimmed + name = "Trimmed" + icon_state = "trimmed" + gender = MALE + +/datum/sprite_accessory/hair/trimflat + name = "Trimmed Flat Top" + icon_state = "trimflat" + gender = MALE + +/datum/sprite_accessory/hair/nofade + name = "Regulation Cut" + icon_state = "nofade" + gender = MALE + +/datum/sprite_accessory/hair/baldfade + name = "Balding Fade" + icon_state = "baldfade" + gender = MALE + +/datum/sprite_accessory/hair/highfade + name = "High Fade" + icon_state = "highfade" + gender = MALE + +/datum/sprite_accessory/hair/medfade + name = "Medium Fade" + icon_state = "medfade" + +/datum/sprite_accessory/hair/lowfade + name = "Low Fade" + icon_state = "lowfade" + gender = MALE + +/datum/sprite_accessory/hair/oxton + name = "Oxton" + icon_state = "oxton" + +/datum/sprite_accessory/hair/doublebun + name = "Double-Bun" + icon_state = "doublebun" + +/datum/sprite_accessory/hair/halfshaved + name = "Half-Shaved Emo" + icon_state = "halfshaved" + +/datum/sprite_accessory/hair/shortbangs + name = "Short Bangs" + icon_state = "shortbangs" + +/datum/sprite_accessory/hair/longeralt2 + name = "Long Hair Alt 2" + icon_state = "longeralt2" + +/datum/sprite_accessory/hair/nia + name = "Nia" + icon_state = "nia" + +/datum/sprite_accessory/hair/eighties + name = "80's" + icon_state = "80s" + +/datum/sprite_accessory/hair/volaju + name = "Volaju" + icon_state = "volaju" + +/datum/sprite_accessory/hair/joestar + name = "Joestar" + icon_state = "joestar" + gender = MALE + +/datum/sprite_accessory/hair/nitori + name = "Nitori" + icon_state = "nitori" + +/datum/sprite_accessory/hair/scully + name = "Scully" + icon_state = "scully" + +/datum/sprite_accessory/hair/vegeta + name = "Vegeta" + icon_state = "toriyama2" + +/datum/sprite_accessory/hair/crono + name = "Chrono" + icon_state = "toriyama" + +/datum/sprite_accessory/hair/poofy2 + name = "Poofy2" + icon_state = "poofy2" + +/datum/sprite_accessory/hair/poofy + name = "Poofy" + icon_state = "poofy" + +/datum/sprite_accessory/hair/dandypomp + name = "Dandy Pompadour" + icon_state = "dandypompadour" + +/datum/sprite_accessory/hair/fringetail + name = "Fringetail" + icon_state = "fringetail" + +/datum/sprite_accessory/hair/mahdrills + name = "Drillruru" + icon_state = "drillruru" + +/datum/sprite_accessory/hair/familyman + name = "The Family Man" + icon_state = "thefamilyman" + +/datum/sprite_accessory/hair/grandebraid + name = "Grande Braid" + icon_state = "grande" + +/datum/sprite_accessory/hair/fringeemo + name = "Emo Fringe" + icon_state = "emofringe" + +/datum/sprite_accessory/hair/emo2 + name = "Emo Alt" + icon_state = "emo2" + +/datum/sprite_accessory/hair/sargeant // TODO: Remove this typepath due to redundancy - Ansari + name = "Flat Top" + icon_state = "sergeant" + +/datum/sprite_accessory/hair/rows2 + name = "Rows 2" + icon_state = "rows2" + +/datum/sprite_accessory/hair/rows + name = "Rows" + icon_state = "rows1" + +/datum/sprite_accessory/hair/reversemohawk + name = "Reverse Mohawk" + icon_state = "reversemohawk" + +/datum/sprite_accessory/hair/father + name = "Father" + icon_state = "father" + +/datum/sprite_accessory/hair/beehive2 + name = "Beehive 2" + icon_state = "beehive2" + +/datum/sprite_accessory/hair/sleeze + name = "Sleeze" + icon_state = "sleeze" + +/datum/sprite_accessory/hair/zieglertail + name = "Zieglertail" + icon_state = "ziegler" + +/datum/sprite_accessory/hair/spikyponytail + name = "Spiky Ponytail" + icon_state = "spikyponytail" + +/datum/sprite_accessory/hair/tresshoulder + name = "Tress Shoulder" + icon_state = "tressshoulder" + +/datum/sprite_accessory/hair/oneshoulder + name = "One Shoulder" + icon_state = "oneshoulder" + +/datum/sprite_accessory/hair/ponytail6 + name = "Ponytail 6" + icon_state = "ponytail6" + +/datum/sprite_accessory/hair/ponytail5 + name = "Ponytail 5" + icon_state = "ponytail5" + +/datum/sprite_accessory/hair/ponytail4 + name = "Ponytail 4" + icon_state = "ponytail4" + +/datum/sprite_accessory/hair/country + name = "Country" + icon_state = "country" + +/datum/sprite_accessory/hair/bedheadlong + name = "Bedhead Long" + icon_state = "long_bedhead" + +/datum/sprite_accessory/hair/flair + name = "Flaired Hair" + icon_state = "flair" + +/datum/sprite_accessory/hair/twintail + name = "Twintail" + icon_state = "twintail" + +/datum/sprite_accessory/hair/short2 + name = "Short Hair 2" + icon_state = "shorthair3" + +/datum/sprite_accessory/hair/bun2 + name = "Bun 2" + icon_state = "bun2" + +/datum/sprite_accessory/hair/bun3 + name = "Bun 3" + icon_state = "bun3" + +/datum/sprite_accessory/hair/shavehair + name = "Shaved Hair" + icon_state = "shaved" + +/datum/sprite_accessory/hair/veryshortovereyealternate + name = "Overeye Very Short, Alternate" + icon_state = "veryshortovereyealternate" + +/datum/sprite_accessory/hair/veryshortovereye + name = "Overeye Very Short" + icon_state = "veryshortovereye" + +/datum/sprite_accessory/hair/shortovereye + name = "Overeye Short" + icon_state = "shortovereye" + +/datum/sprite_accessory/hair/longovereye + name = "Overeye Long" + icon_state = "longovereye" + +/datum/sprite_accessory/hair/father + name = "Father" + icon_state = "father" + +/datum/sprite_accessory/hair/bun4 // Due to a vulp hairstyle called bun + name = "Bun 4" + icon_state = "bun4" + +/////////////////////////////////// +//////END POLARIS HAIRSTYLES/////// +////////////////////////////////// \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/ipc/ipc_face.dm b/code/modules/mob/new_player/sprite_accessories/ipc/ipc_face.dm new file mode 100644 index 00000000000..bcac52ae8d5 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/ipc/ipc_face.dm @@ -0,0 +1,135 @@ +/datum/sprite_accessory/hair/ipc + icon = 'icons/mob/sprite_accessories/ipc/ipc_face.dmi' + species_allowed = list("Machine") + glasses_over = 1 + models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.", "Shellguard Munitions Monitor Series") + +/datum/sprite_accessory/hair/ipc/ipc_screen_pink + name = "Pink IPC Screen" + icon_state = "pink" + +/datum/sprite_accessory/hair/ipc/ipc_screen_red + name = "Red IPC Screen" + icon_state = "red" + +/datum/sprite_accessory/hair/ipc/ipc_screen_green + name = "Green IPC Screen" + icon_state = "green" + +/datum/sprite_accessory/hair/ipc/ipc_screen_blue + name = "Blue IPC Screen" + icon_state = "blue" + +/datum/sprite_accessory/hair/ipc/ipc_screen_breakout + name = "Breakout IPC Screen" + icon_state = "breakout" + +/datum/sprite_accessory/hair/ipc/ipc_screen_eight + name = "Eight IPC Screen" + icon_state = "eight" + +/datum/sprite_accessory/hair/ipc/ipc_screen_rainbow + name = "Rainbow IPC Screen" + icon_state = "rainbow" + +/datum/sprite_accessory/hair/ipc/ipc_screen_goggles + name = "Goggles IPC Screen" + icon_state = "goggles" + +/datum/sprite_accessory/hair/ipc/ipc_screen_heart + name = "Heart IPC Screen" + icon_state = "heart" + +/datum/sprite_accessory/hair/ipc/ipc_screen_monoeye + name = "Monoeye IPC Screen" + icon_state = "monoeye" + +/datum/sprite_accessory/hair/ipc/ipc_screen_nature + name = "Nature IPC Screen" + icon_state = "nature" + +/datum/sprite_accessory/hair/ipc/ipc_screen_orange + name = "Orange IPC Screen" + icon_state = "orange" + +/datum/sprite_accessory/hair/ipc/ipc_screen_purple + name = "Purple IPC Screen" + icon_state = "purple" + +/datum/sprite_accessory/hair/ipc/ipc_screen_shower + name = "Shower IPC Screen" + icon_state = "shower" + +/datum/sprite_accessory/hair/ipc/ipc_screen_static + name = "Static IPC Screen" + icon_state = "static" + +/datum/sprite_accessory/hair/ipc/ipc_screen_yellow + name = "Yellow IPC Screen" + icon_state = "yellow" + +/datum/sprite_accessory/hair/ipc/ipc_screen_scrolling + name = "Scanline IPC Screen" + icon_state = "scroll" + +/datum/sprite_accessory/hair/ipc/ipc_screen_console + name = "Console IPC Screen" + icon_state = "console" + +/datum/sprite_accessory/hair/ipc/ipc_screen_rgb + name = "RGB IPC Screen" + icon_state = "rgb" + +/datum/sprite_accessory/hair/ipc/ipc_screen_glider + name = "Glider IPC Screen" + icon_state = "gol_glider" + +/datum/sprite_accessory/hair/ipc/hesphiastos_alt_off + name = "Dark Hesphiastos Screen" + icon_state = "off" + models_allowed = list("Hesphiastos Industries alt.") + +/datum/sprite_accessory/hair/ipc/hesphiastos_alt_pink + name = "Pink Hesphiastos Screen" + icon_state = "pink_hesp_alt" + models_allowed = list("Hesphiastos Industries alt.") + +/datum/sprite_accessory/hair/ipc/hesphiastos_alt_orange + name = "Orange Hesphiastos Screen" + icon_state = "orange_hesp_alt" + models_allowed = list("Hesphiastos Industries alt.") + +/datum/sprite_accessory/hair/ipc/hesphiastos_alt_goggle + name = "Goggles Hesphiastos Screen" + icon_state = "goggles_hesp_alt" + models_allowed = list("Hesphiastos Industries alt.") + +/datum/sprite_accessory/hair/ipc/hesphiastos_alt_scroll + name = "Scrolling Hesphiastos Screen" + icon_state = "scroll_hesp_alt" + models_allowed = list("Hesphiastos Industries alt.") + +/datum/sprite_accessory/hair/ipc/hesphiastos_alt_rgb + name = "RGB Hesphiastos Screen" + icon_state = "rgb_hesp_alt" + models_allowed = list("Hesphiastos Industries alt.") + +/datum/sprite_accessory/hair/ipc/hesphiastos_alt_rainbow + name = "Rainbow Hesphiastos Screen" + icon_state = "rainbow_hesp_alt" + models_allowed = list("Hesphiastos Industries alt.") + +/datum/sprite_accessory/hair/ipc/fluff + fluff = 1 + +/datum/sprite_accessory/hair/ipc/fluff/lumi_face //Lumi Fluff hair + name = "Lumi Face" + icon_state = "lumi_face" + +/datum/sprite_accessory/hair/ipc/fluff/lumi_blush //Lumi Fluff hair + name = "Lumi Blush" + icon_state = "lumi_blush" + +/datum/sprite_accessory/hair/ipc/fluff/lumi_waiting //Lumi Fluff hair + name = "Lumi Waiting" + icon_state = "lumi_waiting" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/ipc/ipc_head_accessories.dm b/code/modules/mob/new_player/sprite_accessories/ipc/ipc_head_accessories.dm new file mode 100644 index 00000000000..112c2d273af --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/ipc/ipc_head_accessories.dm @@ -0,0 +1,41 @@ + +/datum/sprite_accessory/head_accessory/ipc + icon = 'icons/mob/sprite_accessories/ipc/ipc_head_accessories.dmi' + species_allowed = list("Machine") + over_hair = 1 + +/datum/sprite_accessory/head_accessory/ipc/ipc_antennae + name = "Antennae" + icon_state = "antennae" + +/datum/sprite_accessory/head_accessory/ipc/ipc_tv_antennae + name = "T.V. Antennae" + icon_state = "tvantennae" + +/datum/sprite_accessory/head_accessory/ipc/ipc_tesla_antennae + name = "Tesla Antennae" + icon_state = "tesla" + +/datum/sprite_accessory/head_accessory/ipc/ipc_light + name = "Head Light" + icon_state = "light" + +/datum/sprite_accessory/head_accessory/ipc/ipc_side_lights + name = "Side Lights" + icon_state = "sidelights" + +/datum/sprite_accessory/head_accessory/ipc/ipc_side_cyber_head + name = "Cyber Pipes" + icon_state = "cyberhead" + +/datum/sprite_accessory/head_accessory/ipc/ipc_side_antlers + name = "Antlers" + icon_state = "antlers" + +/datum/sprite_accessory/head_accessory/ipc/ipc_side_drone_eyes + name = "Drone Eyes" + icon_state = "droneeyes" + +/datum/sprite_accessory/head_accessory/ipc/ipc_crowned + name = "Crowned" + icon_state = "crowned" diff --git a/code/modules/mob/new_player/sprite_accessories/ipc/ipc_optics.dm b/code/modules/mob/new_player/sprite_accessories/ipc/ipc_optics.dm new file mode 100644 index 00000000000..ff157a25d7d --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/ipc/ipc_optics.dm @@ -0,0 +1,26 @@ +/datum/sprite_accessory/body_markings/head/optics + icon = 'icons/mob/sprite_accessories/ipc/ipc_optics.dmi' + name = "Humanoid Optics" + species_allowed = list("Machine") + icon_state = "optics" + models_allowed = list("Bishop Cybernetics", "Hesphiastos Industries", "Ward-Takahashi", "Xion Manufacturing Group", "Zeng-Hu Pharmaceuticals") //Should be the same as the manufacturing company of the limb in robolimbs.dm + +/datum/sprite_accessory/body_markings/head/optics/bishop_alt + name = "Bishop Alt. Optics" + icon_state = "bishop_alt_optics" + models_allowed = list("Bishop Cybernetics alt.") + +/datum/sprite_accessory/body_markings/head/optics/morpheus_alt + name = "Morpheus Alt. Optics" + icon_state = "morpheus_alt_optics" + models_allowed = list("Morpheus Cyberkinetics alt.") + +/datum/sprite_accessory/body_markings/head/optics/wardtakahashi_alt + name = "Ward-Takahashi Alt. Optics" + icon_state = "wardtakahashi_alt_optics" + models_allowed = list("Ward-Takahashi alt.") + +/datum/sprite_accessory/body_markings/head/optics/xion_alt + name = "Xion Alt. Optics" + icon_state = "xion_alt_optics" + models_allowed = list("Xion Manufacturing Group alt.") \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/kidan/kidan_body_markings.dm b/code/modules/mob/new_player/sprite_accessories/kidan/kidan_body_markings.dm new file mode 100644 index 00000000000..622ba3736f4 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/kidan/kidan_body_markings.dm @@ -0,0 +1,7 @@ +/datum/sprite_accessory/body_markings/kidan + icon = 'icons/mob/sprite_accessories/kidan/kidan_body_markings.dmi' + species_allowed = list("Kidan") + +/datum/sprite_accessory/body_markings/kidan/outline_kid + name = "Kidan Outline" + icon_state = "outline" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/kidan/kidan_hair.dm b/code/modules/mob/new_player/sprite_accessories/kidan/kidan_hair.dm new file mode 100644 index 00000000000..cf2bd865e26 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/kidan/kidan_hair.dm @@ -0,0 +1,34 @@ +//Kidan Hairstyles with sprites by Travelling Merchant +/datum/sprite_accessory/hair/kidan + icon = 'icons/mob/sprite_accessories/kidan/kidan_hair.dmi' + species_allowed = list("Kidan") + glasses_over = 1 + do_colouration = 0 + +/datum/sprite_accessory/hair/kidan/hollow_horns + name = "Hollow Horns" + icon_state = "hollow_horns" + +/datum/sprite_accessory/hair/kidan/wide_horns + name = "Wide Horns" + icon_state = "wide_horns" + +/datum/sprite_accessory/hair/kidan/curled_horns + name = "Curled Horns" + icon_state = "curled_horns" + +/datum/sprite_accessory/hair/kidan/hawk_horn + name = "Hawk Horn" + icon_state = "hawk_horn" + +/datum/sprite_accessory/hair/kidan/kidan_bull_horns + name = "Bull Horns" + icon_state = "bull_horns" + +/datum/sprite_accessory/hair/kidan/kidan_broken_bull_horns + name = "Broken Bull Horns" + icon_state = "broken_bull_horns" + +/datum/sprite_accessory/hair/kidan/kidan_tall_horns + name = "Tall Horns" + icon_state = "tall_horns" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/kidan/kidan_head_accessories.dm b/code/modules/mob/new_player/sprite_accessories/kidan/kidan_head_accessories.dm new file mode 100644 index 00000000000..521daa2023f --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/kidan/kidan_head_accessories.dm @@ -0,0 +1,56 @@ +/datum/sprite_accessory/head_accessory/kidan + icon = 'icons/mob/sprite_accessories/kidan/kidan_head_accessories.dmi' + species_allowed = list("Kidan") + over_hair = 1 + do_colouration = 1 + +/datum/sprite_accessory/head_accessory/kidan/perked_antennae + name = "Perked-up Antennae" + icon_state = "perky" + +/datum/sprite_accessory/head_accessory/kidan/mopey_antennae + name = "Mopey Antennae" + icon_state = "mopey" + +/datum/sprite_accessory/head_accessory/kidan/curious_antennae + name = "Curious Antennae" + icon_state = "curious" + +/datum/sprite_accessory/head_accessory/kidan/mopey_antennae + name = "Mopey Antennae" + icon_state = "mopey" + +/datum/sprite_accessory/head_accessory/kidan/crescent_antennae + name = "Crescent Antennae" + icon_state = "crescent" + +/datum/sprite_accessory/head_accessory/kidan/alert_antennae + name = "Alert Antennae" + icon_state = "alert" + +/datum/sprite_accessory/head_accessory/kidan/normal_antennae + name = "Normal Antennae" + icon_state = "normal" + +/datum/sprite_accessory/head_accessory/kidan/long_antennae + name = "Long Antennae" + icon_state = "long" + +/datum/sprite_accessory/head_accessory/kidan/moth_antennae + name = "Moth Antennae" + icon_state = "moth" + +// Sprites by Travelling Merchant + +/datum/sprite_accessory/head_accessory/kidan/kidan_Mantie_Long + name = "Mantie Long" + icon_state = "Mantie_Long" + +/datum/sprite_accessory/head_accessory/kidan/kidan_Mantie_Curled + name = "Mantie Curled" + icon_state = "Mantie_Curled" + +/datum/sprite_accessory/head_accessory/kidan/kidan_very_short + name = "Very Short" + icon_state = "very_short" +// End \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/kidan/kidan_head_markings.dm b/code/modules/mob/new_player/sprite_accessories/kidan/kidan_head_markings.dm new file mode 100644 index 00000000000..359e9f80618 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/kidan/kidan_head_markings.dm @@ -0,0 +1,7 @@ +/datum/sprite_accessory/body_markings/head/kidan + icon = 'icons/mob/sprite_accessories/kidan/kidan_head_markings.dmi' + species_allowed = list("Kidan") + +/datum/sprite_accessory/body_markings/head/kidan/outline_head_kid + name = "Kidan Outline Head" + icon_state = "outline" diff --git a/code/modules/mob/new_player/sprite_accessories/nucleation/nucleation_face.dm b/code/modules/mob/new_player/sprite_accessories/nucleation/nucleation_face.dm new file mode 100644 index 00000000000..87a6f31cc31 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/nucleation/nucleation_face.dm @@ -0,0 +1,32 @@ +/datum/sprite_accessory/hair/nucleation + icon = 'icons/mob/sprite_accessories/nucleation/nucleation_face.dmi' + species_allowed = list("Nucleation") + glasses_over = 1 + +/datum/sprite_accessory/hair/nucleation/nuc_crystals + name = "Nucleation Crystals" + icon_state = "crystal" + +/datum/sprite_accessory/hair/nucleation/nuc_betaburns + name = "Nucleation Beta Burns" + icon_state = "betaburns" + +/datum/sprite_accessory/hair/nucleation/nuc_fallout + name = "Nucleation Fallout" + icon_state = "fallout" + +/datum/sprite_accessory/hair/nucleation/nuc_frission + name = "Nucleation Frission" + icon_state = "frission" + +/datum/sprite_accessory/hair/nucleation/nuc_radical + name = "Nucleation Free Radical" + icon_state = "radical" + +/datum/sprite_accessory/hair/nucleation/nuc_gammaray + name = "Nucleation Gamma Ray" + icon_state = "gammaray" + +/datum/sprite_accessory/hair/nucleation/nuc_neutron + name = "Nucleation Neutron Bomb" + icon_state = "neutron" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/skrell/skrell_face.dm b/code/modules/mob/new_player/sprite_accessories/skrell/skrell_face.dm new file mode 100644 index 00000000000..0846744f0ca --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/skrell/skrell_face.dm @@ -0,0 +1,162 @@ +/datum/sprite_accessory/hair/skrell + icon = 'icons/mob/sprite_accessories/skrell/skrell_hair.dmi' + species_allowed = list("Skrell") + +/datum/sprite_accessory/hair/skrell/skr_tentacle_m + name = "Skrell Male Tentacles" + icon_state = "male" + gender = MALE + +/datum/sprite_accessory/hair/skrell/skr_tentacle_f + name = "Skrell Female Tentacles" + icon_state = "female" + gender = FEMALE + +/datum/sprite_accessory/hair/skrell/skr_tentacleslong + name = "Long Skrell Tentacles" + icon_state = "verylong" + +/datum/sprite_accessory/hair/skrell/skr_tentaclesshort + name = "Short Skrell Tentacles" + icon_state = "veryshort" + +/datum/sprite_accessory/hair/skrell/skr_gold_m + name = "Gold plated Skrell Male Tentacles" + icon_state = "male" + gender = MALE + secondary_theme = "gold" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_gold_f + name = "Gold chained Skrell Female Tentacles" + icon_state = "female" + gender = FEMALE + secondary_theme = "gold" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_clothtentacle_m + name = "Cloth draped Skrell Male Tentacles" + icon_state = "male" + gender = MALE + secondary_theme = "cloth" + +/datum/sprite_accessory/hair/skrell/skr_clothtentacle_f + name = "Cloth draped Skrell Female Tentacles" + icon_state = "female" + gender = FEMALE + secondary_theme = "cloth" + +/datum/sprite_accessory/hair/skrell/skr_gclothtentacle_m + name = "Ombre Dye, Skrell Male Tentacles" + icon_state = "male" + gender = MALE + secondary_theme = "gradient" + +/datum/sprite_accessory/hair/skrell/skr_gclothtentacle_f + name = "Ombre Dye, Skrell Female Tentacles" + icon_state = "female" + gender = FEMALE + secondary_theme = "gradient" + +/datum/sprite_accessory/hair/skrell/skr_gclothtentacleslong + name = "Ombre Dye, Long Skrell Tentacles" + icon_state = "verylong" + secondary_theme = "gradient" + +/datum/sprite_accessory/hair/skrell/skr_gclothtentaclesshort + name = "Ombre Dye, Short Skrell Tentacles" + icon_state = "veryshort" + secondary_theme = "gradient" + +/datum/sprite_accessory/hair/skrell/skr_diablacktentacle_m + name = "Black headress Skrell Male Tentacles" + icon_state = "male" + gender = MALE + secondary_theme = "blackdia" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_diablacktentacle_f + name = "Black headress Skrell Female Tentacles" + icon_state = "female" + gender = FEMALE + secondary_theme = "blackdia" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_diablacktentacleslong + name = "Black headress Long Skrell Tentacles" + icon_state = "verylong" + secondary_theme = "blackdia" + no_sec_colour = 1 + + +/datum/sprite_accessory/hair/skrell/skr_diagoldtentacle_m + name = "Gold headress Skrell Male Tentacles" + icon_state = "male" + gender = MALE + secondary_theme = "golddia" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_diagoldtentacle_f + name = "Gold headress Skrell Female Tentacles" + icon_state = "female" + gender = FEMALE + secondary_theme = "golddia" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_diagoldtentacleslong + name = "Gold headress Long Skrell Tentacles" + icon_state = "verylong" + secondary_theme = "golddia" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_diasilvertentacle_m + name = "Silver headress Skrell Male Tentacles" + icon_state = "male" + gender = MALE + secondary_theme = "silvdia" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_diasilvertentacle_f + name = "Silver headress Skrell Female Tentacles" + icon_state = "female" + gender = FEMALE + secondary_theme = "silvdia" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_diasilvertentacleslong + name = "Silver headress Long Skrell Tentacles" + icon_state = "verylong" + secondary_theme = "silvdia" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_festivetentacle_m + name = "Festive headress Skrell Male Tentacles" + icon_state = "male" + gender = MALE + secondary_theme = "fest" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_festivetentacle_f + name = "Festive headress Skrell Female Tentacles" + icon_state = "female" + gender = FEMALE + secondary_theme = "fest" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_festivetentacleslong + name = "Festive headress Long Skrell Tentacles" + icon_state = "verylong" + secondary_theme = "fest" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_festivetentaclesshort + name = "Festive headress Short Skrell Tentacles" + icon_state = "veryshort" + secondary_theme = "fest" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/fluff/zeke_fluff_tentacle //Zeke Fluff hair + icon = 'icons/mob/sprite_accessories/skrell/skrell_hair.dmi' + name = "Zekes Tentacles" + icon_state = "zeke_fluff_hair" + species_allowed = list("Skrell") diff --git a/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm new file mode 100644 index 00000000000..41dd75a49e5 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm @@ -0,0 +1,652 @@ +/* + + Hello and welcome to sprite_accessories: For sprite accessories, such as hair, + facial hair, and possibly tattoos and stuff somewhere along the line. This file is + intended to be friendly for people with little to no actual coding experience. + The process of adding in new hairstyles has been made pain-free and easy to do. + Enjoy! - Doohl + + + Notice: This all gets automatically compiled in a list in dna2.dm, so you do not + have to define any UI values for sprite accessories manually for hair and facial + hair. Just add in new hair types and the game will naturally adapt. + + !!WARNING!!: changing existing hair information can be VERY hazardous to savefiles, + to the point where you may completely corrupt a server's savefiles. Please refrain + from doing this unless you absolutely know what you are doing, and have defined a + conversion in savefile.dm +*/ + +/proc/init_sprite_accessory_subtypes(var/prototype, var/list/L, var/list/male, var/list/female, var/list/full_list) + if(!istype(L)) L = list() + if(!istype(male)) male = list() + if(!istype(female)) female = list() + if(!istype(full_list)) full_list = list() + + for(var/path in subtypesof(prototype)) + var/datum/sprite_accessory/D = new path() + + if(D.name) + if(D.fluff) + full_list[D.name] = D + else + L[D.name] = D + full_list[D.name] = D + + switch(D.gender) + if(MALE) male[D.name] = D + if(FEMALE) female[D.name] = D + else + male[D.name] = D + female[D.name] = D + return L + +/datum/sprite_accessory + var/icon //the icon file the accessory is located in + var/icon_state //the icon_state of the accessory + var/name //the preview name of the accessory + var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations + + // Restrict some styles to specific species + var/list/species_allowed = list("Human", "Slime People") + var/list/models_allowed = list() //Specifies which, if any, hairstyles or markings can be accessed by which prosthetics. Should equal the manufacturing company name in robolimbs.dm. + var/list/heads_allowed = null //Specifies which, if any, alt heads a head marking, hairstyle or facial hair style is compatible with. + var/list/tails_allowed = null //Specifies which, if any, tails a tail marking is compatible with. + var/marking_location //Specifies which bodypart a body marking is located on. + var/secondary_theme = null //If exists, there's a secondary colour to that hair style and the secondary theme's icon state's suffix is equal to this. + var/no_sec_colour = null //If exists, prohibit the colouration of the secondary theme. + var/fluff = 0 + // Whether or not the accessory can be affected by colouration + var/do_colouration = 1 + +/* HAIR */ + +/datum/sprite_accessory/hair + icon = 'icons/mob/sprite_accessories/human/human_hair.dmi' // default icon for all human hair. Override if it doesn't belong to human. Human hair that is shared belongs in human file. + var/glasses_over //Hair styles with hair that don't overhang the arms of glasses should have glasses_over set to a positive value + +/datum/sprite_accessory/hair/bald + icon = 'icons/mob/human_face.dmi' // Keep bald hair here, as for some reason, putting it elsewhere lead to it being colourable - Also it make sense as it is shared by everyone. + name = "Bald" + icon_state = "bald" + species_allowed = list("Human", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton", "Vulpkanin", "Tajaran") + glasses_over = 1 + +/datum/sprite_accessory/facial_hair + gender = MALE // barf (unless you're a dorf, dorfs dig chix /w beards :P) + icon = 'icons/mob/sprite_accessories/human/human_facial_hair.dmi' + var/over_hair + +/datum/sprite_accessory/hair/fluff + fluff = 1 + +/* HEAD ACCESSORY */ + +/datum/sprite_accessory/head_accessory + icon = 'icons/mob/body_accessory.dmi' + species_allowed = list("Unathi", "Vulpkanin", "Tajaran", "Machine") + icon_state = "accessory_none" + var/over_hair + +/datum/sprite_accessory/head_accessory/none + name = "None" + species_allowed = list("Human", "Unathi", "Diona", "Grey", "Kidan", "Machine", "Tajaran", "Vulpkanin", "Skrell", "Slime People", "Skeleton", "Vox") + icon_state = "accessory_none" + +/* BODY MARKINGS */ + +/datum/sprite_accessory/body_markings + icon = 'icons/mob/sprite_accessories/human/human_body_markings.dmi' + species_allowed = list("Unathi", "Tajaran", "Vulpkanin", "Machine", "Vox", "Kidan") + icon_state = "accessory_none" + marking_location = "body" + +/datum/sprite_accessory/body_markings/head + marking_location = "head" + species_allowed = list() + + +/datum/sprite_accessory/body_markings/tail + species_allowed = list() + icon_state = "accessory_none" + marking_location = "tail" + tails_allowed = null + +/* ALT HEADS */ + +/datum/sprite_accessory/alt_heads + icon = null + icon_state = null + species_allowed = null + var/suffix = null + +/datum/sprite_accessory/alt_heads/none + name = "None" + +//skin styles - WIP +//going to have to re-integrate this with surgery +//let the icon_state hold an icon preview for now +/datum/sprite_accessory/skin + icon = 'icons/mob/human_races/r_human.dmi' + +/datum/sprite_accessory/skin/human + name = "Default human skin" + icon_state = "default" + species_allowed = list("Human",) + +/datum/sprite_accessory/skin/human/human_tatt01 + name = "Tatt01 human skin" + icon_state = "tatt1" + +/datum/sprite_accessory/skin/tajaran + name = "Default tajaran skin" + icon_state = "default" + icon = 'icons/mob/human_races/r_tajaran.dmi' + species_allowed = list("Tajaran") + +/datum/sprite_accessory/skin/vulpkanin + name = "Default Vulpkanin skin" + icon_state = "default" + icon = 'icons/mob/human_races/r_vulpkanin.dmi' + species_allowed = list("Vulpkanin") + +/datum/sprite_accessory/skin/unathi + name = "Default Unathi skin" + icon_state = "default" + icon = 'icons/mob/human_races/r_lizard.dmi' + species_allowed = list("Unathi") + +/datum/sprite_accessory/skin/skrell + name = "Default skrell skin" + icon_state = "default" + icon = 'icons/mob/human_races/r_skrell.dmi' + species_allowed = list("Skrell") + +/////////////////////////// +// Underwear Definitions // +/////////////////////////// +/datum/sprite_accessory/underwear + icon = 'icons/mob/underwear.dmi' + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") + gender = NEUTER + +/datum/sprite_accessory/underwear/nude + name = "Nude" + icon_state = null + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") + +/datum/sprite_accessory/underwear/male + gender = MALE + +/datum/sprite_accessory/underwear/male/male_white + name = "Mens White" + icon_state = "male_white" + +/datum/sprite_accessory/underwear/male/male_grey + name = "Mens Grey" + icon_state = "male_grey" + +/datum/sprite_accessory/underwear/male/male_grey + name = "Mens Grey Alt" + icon_state = "male_greyalt" + +/datum/sprite_accessory/underwear/male/male_green + name = "Mens Green" + icon_state = "male_green" + +/datum/sprite_accessory/underwear/male/male_blue + name = "Mens Blue" + icon_state = "male_blue" + +/datum/sprite_accessory/underwear/male/male_red + name = "Mens Red" + icon_state = "male_red" + +/datum/sprite_accessory/underwear/male/male_black + name = "Mens Black" + icon_state = "male_black" + +/datum/sprite_accessory/underwear/male/male_black_alt + name = "Mens Black Alt" + icon_state = "male_blackalt" + +/datum/sprite_accessory/underwear/male/male_striped + name = "Mens Striped" + icon_state = "male_stripe" + +/datum/sprite_accessory/underwear/male/male_heart + name = "Mens Hearts" + icon_state = "male_hearts" + +/datum/sprite_accessory/underwear/male/male_kinky + name = "Mens Kinky" + icon_state = "male_kinky" + +/datum/sprite_accessory/underwear/male/male_mankini + name = "Mankini" + icon_state = "male_mankini" + +/datum/sprite_accessory/underwear/female + gender = FEMALE + +/datum/sprite_accessory/underwear/female/female_red + name = "Ladies Red" + icon_state = "female_red" + +/datum/sprite_accessory/underwear/female/female_green + name = "Ladies Green" + icon_state = "female_green" + +/datum/sprite_accessory/underwear/female/female_white + name = "Ladies White" + icon_state = "female_white" + +/datum/sprite_accessory/underwear/female/female_whiter + name = "Ladies Whiter" + icon_state = "female_whiter" + +/datum/sprite_accessory/underwear/female/female_whitealt + name = "Ladies White Alt" + icon_state = "female_whitealt" + +/datum/sprite_accessory/underwear/female/female_yellow + name = "Ladies Yellow" + icon_state = "female_yellow" + +/datum/sprite_accessory/underwear/female/female_blue + name = "Ladies Blue" + icon_state = "female_blue" +/datum/sprite_accessory/underwear/female/female_babyblue + name = "Ladies Baby Blue" + icon_state = "female_babyblue" + +/datum/sprite_accessory/underwear/female/female_black + name = "Ladies Black" + icon_state = "female_black" + +/datum/sprite_accessory/underwear/female/female_blacker + name = "Ladies Blacker" + icon_state = "female_blacker" + +/datum/sprite_accessory/underwear/female/female_blackalt + name = "Ladies Black Alt" + icon_state = "female_blackalt" + +/datum/sprite_accessory/underwear/female/female_kinky + name = "Ladies Kinky" + icon_state = "female_kinky" + +/datum/sprite_accessory/underwear/female/female_babydoll + name = "Ladies Full Grey" + icon_state = "female_babydoll" + +/datum/sprite_accessory/underwear/female/female_pink + name = "Ladies Pink" + icon_state = "female_pink" + +/datum/sprite_accessory/underwear/female/female_thong + name = "Ladies Thong" + icon_state = "female_thong" + +//////////////////////////// +// Undershirt Definitions // +//////////////////////////// +/datum/sprite_accessory/undershirt + icon = 'icons/mob/underwear.dmi' + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") + gender = NEUTER + +/datum/sprite_accessory/undershirt/nude + name = "Nude" + icon_state = null + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") + +//plain color shirts +/datum/sprite_accessory/undershirt/shirt_white + name = "White Shirt" + icon_state = "shirt_white" + +/datum/sprite_accessory/undershirt/shirt_black + name = "Black Shirt" + icon_state = "shirt_black" + +/datum/sprite_accessory/undershirt/shirt_blacker + name = "Blacker Shirt" + icon_state = "shirt_blacker" + +/datum/sprite_accessory/undershirt/shirt_grey + name = "Grey Shirt" + icon_state = "shirt_grey" + +/datum/sprite_accessory/undershirt/shirt_red + name = "Red Shirt" + icon_state = "shirt_red" + +/datum/sprite_accessory/undershirt/shirt_blue + name = "Blue Shirt" + icon_state = "shirt_blue" + +/datum/sprite_accessory/undershirt/shirt_yellow + name = "Yellow Shirt" + icon_state = "shirt_yellow" + +/datum/sprite_accessory/undershirt/shirt_green + name = "Green Shirt" + icon_state = "shirt_green" + +/datum/sprite_accessory/undershirt/shirt_darkblue + name = "Dark Blue Shirt" + icon_state = "shirt_darkblue" + +/datum/sprite_accessory/undershirt/shirt_darkred + name = "Dark Red Shirt" + icon_state = "shirt_darkred" + +/datum/sprite_accessory/undershirt/shirt_darkgreen + name = "Dark Green Shirt" + icon_state = "shirt_darkgreen" +//end plain color shirts + +//graphic shirts +/datum/sprite_accessory/undershirt/shirt_heart + name = "Heart Shirt" + icon_state = "shirt_heart" + +/datum/sprite_accessory/undershirt/shirt_corgi + name = "Corgi Shirt" + icon_state = "shirt_corgi" + +/datum/sprite_accessory/undershirt/shirt_clown + name = "Clown Shirt" + icon_state = "shirt_clown" + +/datum/sprite_accessory/undershirt/shirt_alien + name = "Alien Shirt" + icon_state = "shirt_alien" + +/datum/sprite_accessory/undershirt/shirt_jack + name = "Union Jack Shirt" + icon_state = "shirt_jack" + +/datum/sprite_accessory/undershirt/love_nt + name = "I Love NT Shirt" + icon_state = "shirt_lovent" + +/datum/sprite_accessory/undershirt/peace + name = "Peace Shirt" + icon_state = "shirt_peace" + +/datum/sprite_accessory/undershirt/mondmondjaja + name = "Band Shirt" + icon_state = "shirt_band" + +/datum/sprite_accessory/undershirt/pacman + name = "Pogoman Shirt" + icon_state = "shirt_pogoman" + +/datum/sprite_accessory/undershirt/shirt_ss13 + name = "SS13 Shirt" + icon_state = "shirt_ss13" + +/datum/sprite_accessory/undershirt/shirt_question + name = "Question Mark Shirt" + icon_state = "shirt_question" + +/datum/sprite_accessory/undershirt/shirt_skull + name = "Skull Shirt" + icon_state = "shirt_skull" + +/datum/sprite_accessory/undershirt/shirt_commie + name = "Communist Shirt" + icon_state = "shirt_commie" + +/datum/sprite_accessory/undershirt/shirt_nano + name = "Nanotrasen Shirt" + icon_state = "shirt_nano" + +/datum/sprite_accessory/undershirt/shirt_meat + name = "Meat Shirt" + icon_state = "shirt_meat" + +/datum/sprite_accessory/undershirt/shirt_tiedie + name = "Tiedie Shirt" + icon_state = "shirt_tiedie" + +/datum/sprite_accessory/undershirt/blue_striped + name = "Striped Blue Shirt" + icon_state = "shirt_bluestripe" + +/datum/sprite_accessory/undershirt/brightblue_striped + name = "Striped Bright Blue Shirt" + icon_state = "shirt_brightbluestripe" +//end graphic shirts + +//short sleeved +/datum/sprite_accessory/undershirt/short_white + name = "White Short-sleeved Shirt" + icon_state = "short_white" + +/datum/sprite_accessory/undershirt/short_purple + name = "Purple Short-sleeved Shirt" + icon_state = "short_purple" + +/datum/sprite_accessory/undershirt/short_blue + name = "Blue Short-sleeved Shirt" + icon_state = "short_blue" + +/datum/sprite_accessory/undershirt/short_green + name = "Green Short-sleeved Shirt" + icon_state = "short_green" + +/datum/sprite_accessory/undershirt/short_black + name = "Black Short-sleeved Shirt" + icon_state = "short_black" +//end short sleeved + +//polo shirts +/datum/sprite_accessory/undershirt/polo_blue + name = "Blue Polo Shirt" + icon_state = "polo_blue" + +/datum/sprite_accessory/undershirt/polo_red + name = "Red Polo Shirt" + icon_state = "polo_red" + +/datum/sprite_accessory/undershirt/polo_greyelllow + name = "Grey-Yellow Polo Shirt" + icon_state = "polo_greyellow" +//end polo shirts + +//sport shirts +/datum/sprite_accessory/undershirt/sport_green + name = "Green Sports Shirt" + icon_state = "sport_green" + +/datum/sprite_accessory/undershirt/sport_red + name = "Red Sports Shirt" + icon_state = "sport_red" + +/datum/sprite_accessory/undershirt/sport_blue + name = "Blue Sports Shirt" + icon_state = "sport_blue" + +/datum/sprite_accessory/undershirt/jersey_red + name = "Red Jersey" + icon_state = "jersey_red" + +/datum/sprite_accessory/undershirt/jersey_blue + name = "Blue Jersey" + icon_state = "jersey_blue" +//end sport shirts + +//tanktops +/datum/sprite_accessory/undershirt/tank_redtop + name = "Red Crop-Top" + icon_state = "tank_redtop" + gender = FEMALE + +/datum/sprite_accessory/undershirt/tank_whitetop + name = "White Crop-Top" + icon_state = "tank_whitetop" + gender = FEMALE + +/datum/sprite_accessory/undershirt/tank_midriff + name = "White Mid Tank-Top" + icon_state = "tank_midriff" + gender = FEMALE + +/datum/sprite_accessory/undershirt/tank_white + name = "White Tank-Top" + icon_state = "tank_white" + +/datum/sprite_accessory/undershirt/tank_black + name = "Black Tank-Top" + icon_state = "tank_black" + +/datum/sprite_accessory/undershirt/tank_blacker + name = "Blacker Tank-Top" + icon_state = "tank_blacker" + +/datum/sprite_accessory/undershirt/tank_grey + name = "Grey Tank-Top" + icon_state = "tank_grey" + +/datum/sprite_accessory/undershirt/tank_red + name = "Red Tank-Top" + icon_state = "tank_red" + +/datum/sprite_accessory/undershirt/tank_fire + name = "Fire Tank-Top" + icon_state = "tank_fire" + +/datum/sprite_accessory/undershirt/tank_stripes + name = "Striped Tank-Top" + icon_state = "tank_stripes" +//end tanktops + +/////////////////////// +// Socks Definitions // +/////////////////////// +/datum/sprite_accessory/socks + icon = 'icons/mob/underwear.dmi' + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") + gender = NEUTER + +/datum/sprite_accessory/socks/nude + name = "Nude" + icon_state = null + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") + +/datum/sprite_accessory/socks/white_norm + name = "Normal White" + icon_state = "white_norm" + +/datum/sprite_accessory/socks/black_norm + name = "Normal Black" + icon_state = "black_norm" + +/datum/sprite_accessory/socks/white_short + name = "Short White" + icon_state = "white_short" + +/datum/sprite_accessory/socks/black_short + name = "Short Black" + icon_state = "black_short" + +/datum/sprite_accessory/socks/white_knee + name = "Knee-high White" + icon_state = "white_knee" + +/datum/sprite_accessory/socks/black_knee + name = "Knee-high Black" + icon_state = "black_knee" + +/datum/sprite_accessory/socks/thin_knee + name = "Knee-high Thin" + icon_state = "thin_knee" + gender = FEMALE + +/datum/sprite_accessory/socks/striped_knee + name = "Knee-high Striped" + icon_state = "striped_knee" + +/datum/sprite_accessory/socks/rainbow_knee + name = "Knee-high Rainbow" + icon_state = "rainbow_knee" + +/datum/sprite_accessory/socks/white_thigh + name = "Thigh-high White" + icon_state = "white_thigh" + +/datum/sprite_accessory/socks/black_thigh + name = "Thigh-high Black" + icon_state = "black_thigh" + +/datum/sprite_accessory/socks/thin_thigh + name = "Thigh-high Thin" + icon_state = "thin_thigh" + gender = FEMALE + +/datum/sprite_accessory/socks/striped_thigh + name = "Thigh-high Striped" + icon_state = "striped_thigh" + +/datum/sprite_accessory/socks/rainbow_thigh + name = "Thigh-high Rainbow" + icon_state = "rainbow_thigh" + +/datum/sprite_accessory/socks/pantyhose + name = "Pantyhose" + icon_state = "pantyhose" + gender = FEMALE + +/datum/sprite_accessory/socks/black_fishnet + name = "Black Fishnet" + icon_state = "black_fishnet" + +/datum/sprite_accessory/socks/vox + species_allowed = list("Vox") + +/datum/sprite_accessory/socks/vox/vox_white + name = "Vox White" + icon_state = "vox_white" + +/datum/sprite_accessory/socks/vox/vox_black + name = "Vox Black" + icon_state = "vox_black" + +/datum/sprite_accessory/socks/vox/vox_thin + name = "Vox Black Thin" + icon_state = "vox_blackthin" + +/datum/sprite_accessory/socks/vox/vox_rainbow + name = "Vox Rainbow" + icon_state = "vox_rainbow" + +/datum/sprite_accessory/socks/vox/vox_stripped + name = "Vox Striped" + icon_state = "vox_white" + +/datum/sprite_accessory/socks/vox/vox_white_thigh + name = "Vox Thigh-high White" + icon_state = "vox_whiteTH" + +/datum/sprite_accessory/socks/vox/vox_black_thigh + name = "Vox Thigh-high Black" + icon_state = "vox_blackTH" + +/datum/sprite_accessory/socks/vox/vox_thin_thigh + name = "Vox Thigh-high Thin" + icon_state = "vox_blackthinTH" + +/datum/sprite_accessory/socks/vox/vox_rainbow_thigh + name = "Vox Thigh-high Rainbow" + icon_state = "vox_rainbowTH" + +/datum/sprite_accessory/socks/vox/vox_striped_thigh + name = "Vox Thigh-high Striped" + icon_state = "vox_stripedTH" + +/datum/sprite_accessory/socks/vox/vox_fishnet + name = "Vox Fishnets" + icon_state = "vox_fishnet" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/tajaran/tajaran_body_markings.dm b/code/modules/mob/new_player/sprite_accessories/tajaran/tajaran_body_markings.dm new file mode 100644 index 00000000000..decbcce8578 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/tajaran/tajaran_body_markings.dm @@ -0,0 +1,23 @@ +/datum/sprite_accessory/body_markings/tajara + icon = 'icons/mob/sprite_accessories/tajaran/tajaran_body_markings.dmi' + species_allowed = list("Tajaran") + +/datum/sprite_accessory/body_markings/tajara/belly_flat_taj + name = "Tajaran Belly" + icon_state = "belly" + +/datum/sprite_accessory/body_markings/tajara/belly_crest_taj + name = "Tajaran Chest Crest" + icon_state = "crest" + +/datum/sprite_accessory/body_markings/tajara/belly_full_taj + name = "Tajaran Belly 2" + icon_state = "fullbelly" + +/datum/sprite_accessory/body_markings/tajara/points_taj + name = "Tajaran Points" + icon_state = "points" + +/datum/sprite_accessory/body_markings/tajara/patchy_taj + name = "Tajaran Patches" + icon_state = "patch" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/tajaran/tajaran_facial_hair.dm b/code/modules/mob/new_player/sprite_accessories/tajaran/tajaran_facial_hair.dm new file mode 100644 index 00000000000..794b89c8d74 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/tajaran/tajaran_facial_hair.dm @@ -0,0 +1,31 @@ +/datum/sprite_accessory/facial_hair/tajara + icon = 'icons/mob/sprite_accessories/tajaran/tajaran_facial_hair.dmi' + species_allowed = list("Tajaran") + +/datum/sprite_accessory/facial_hair/tajara/taj_sideburns + name = "Tajara Sideburns" + icon_state = "facial_sideburns" + +/datum/sprite_accessory/facial_hair/tajara/taj_mutton + name = "Tajara Mutton" + icon_state = "facial_mutton" + +/datum/sprite_accessory/facial_hair/tajara/taj_pencilstache + name = "Tajara Pencilstache" + icon_state = "facial_pencilstache" + +/datum/sprite_accessory/facial_hair/tajara/taj_moustache + name = "Tajara Moustache" + icon_state = "facial_moustache" + +/datum/sprite_accessory/facial_hair/tajara/taj_goatee + name = "Tajara Goatee" + icon_state = "facial_goatee" + +/datum/sprite_accessory/facial_hair/tajara/taj_goatee_faded + name = "Tajara Faded Goatee" + icon_state = "facial_goatee_faded" + +/datum/sprite_accessory/facial_hair/tajara/taj_smallstache + name = "Tajara Smallstache" + icon_state = "facial_smallstache" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/tajaran/tajaran_hair.dm b/code/modules/mob/new_player/sprite_accessories/tajaran/tajaran_hair.dm new file mode 100644 index 00000000000..7b55508877c --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/tajaran/tajaran_hair.dm @@ -0,0 +1,81 @@ +/datum/sprite_accessory/hair/tajara + icon = 'icons/mob/sprite_accessories/tajaran/tajaran_hair.dmi' + species_allowed = list("Tajaran") + glasses_over = 1 + +/datum/sprite_accessory/hair/tajara/taj_hair_clean + name = "Tajara Clean" + icon_state = "clean" + +/datum/sprite_accessory/hair/tajara/taj_hair_bangs + name = "Tajara Bangs" + icon_state = "bangs" + glasses_over = null + +/datum/sprite_accessory/hair/tajara/taj_hair_braid + name = "Tajara Braid" + icon_state = "braid" + secondary_theme = "beads" + glasses_over = null + +/datum/sprite_accessory/hair/tajara/taj_hair_shaggy + name = "Tajara Shaggy" + icon_state = "shaggy" + +/datum/sprite_accessory/hair/tajara/taj_hair_mohawk + name = "Tajaran Mohawk" + icon_state = "mohawk" + +/datum/sprite_accessory/hair/tajara/taj_hair_plait + name = "Tajara Plait" + icon_state = "plait" + +/datum/sprite_accessory/hair/tajara/taj_hair_straight + name = "Tajara Straight" + icon_state = "straight" + +/datum/sprite_accessory/hair/tajara/taj_hair_long + name = "Tajara Long" + icon_state = "long" + +/datum/sprite_accessory/hair/tajara/taj_hair_rattail + name = "Tajara Rat Tail" + icon_state = "rattail" + +/datum/sprite_accessory/hair/tajara/taj_hair_spiky + name = "Tajara Spikey" + icon_state = "spikey" + +/datum/sprite_accessory/hair/tajara/taj_hair_messy + name = "Tajara Messy" + icon_state = "messy" + +/datum/sprite_accessory/hair/tajara/taj_hair_curls + name = "Tajara Curly" + icon_state = "curly" + glasses_over = null + +/datum/sprite_accessory/hair/tajara/taj_hair_bedhead + name = "Tajara bedhead" + icon_state = "bedhead" + glasses_over = null + +/datum/sprite_accessory/hair/tajara/taj_hair_retro + name = "Tajaran Ladies' Retro" + icon_state = "ladiesretro" + glasses_over = null + +/datum/sprite_accessory/hair/tajara/taj_hair_victory + name = "Tajara Victory Curls" + icon_state = "victory" + glasses_over = null + +/datum/sprite_accessory/hair/tajara/taj_hair_bob + name = "Tajara Bob" + icon_state = "bob" + glasses_over = null + +/datum/sprite_accessory/hair/tajara/taj_hair_fingercurl + name = "Tajara Finger Curls" + icon_state = "fingerwave" + glasses_over = null \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/tajaran/tajaran_head_accessories.dm b/code/modules/mob/new_player/sprite_accessories/tajaran/tajaran_head_accessories.dm new file mode 100644 index 00000000000..db147d5af51 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/tajaran/tajaran_head_accessories.dm @@ -0,0 +1,32 @@ +/datum/sprite_accessory/head_accessory/tajara + icon = 'icons/mob/sprite_accessories/tajaran/tajaran_head_accessories.dmi' // Nearly all head accessories are head markings, however this is the default for consistency sake + species_allowed = list("Tajaran") + +/datum/sprite_accessory/head_accessory/tajara/taj_ears + name = "Tajaran Ears" + icon_state = "ears_plain" + +/datum/sprite_accessory/head_accessory/tajara/outears_taj + icon = 'icons/mob/sprite_accessories/tajaran/tajaran_head_markings.dmi' + name = "Tajaran Outer Ears" + icon_state = "outears" + +/datum/sprite_accessory/head_accessory/tajara/inears_taj + icon = 'icons/mob/sprite_accessories/tajaran/tajaran_head_markings.dmi' + name = "Tajaran Inner Ears" + icon_state = "inears" + +/datum/sprite_accessory/head_accessory/tajara/muzzle_taj + icon = 'icons/mob/sprite_accessories/tajaran/tajaran_head_markings.dmi' + name = "Tajaran Muzzle" + icon_state = "muzzle" + +/datum/sprite_accessory/head_accessory/tajara/muzzle_and_inears_taj + icon = 'icons/mob/sprite_accessories/tajaran/tajaran_head_markings.dmi' + name = "Tajaran Muzzle and Inner Ears" + icon_state = "muzinears" + +/datum/sprite_accessory/head_accessory/tajara/taj_nose + icon = 'icons/mob/sprite_accessories/tajaran/tajaran_head_markings.dmi' + name = "Tajaran Nose" + icon_state = "nose" diff --git a/code/modules/mob/new_player/sprite_accessories/tajaran/tajaran_head_markings.dm b/code/modules/mob/new_player/sprite_accessories/tajaran/tajaran_head_markings.dm new file mode 100644 index 00000000000..88d534bb3c2 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/tajaran/tajaran_head_markings.dm @@ -0,0 +1,44 @@ + +/datum/sprite_accessory/body_markings/head/tajara + icon = 'icons/mob/sprite_accessories/tajaran/tajaran_head_markings.dmi' + species_allowed = list("Tajaran") + +/datum/sprite_accessory/body_markings/head/tajara/tiger_head_taj + name = "Tajaran Tiger Head" + icon_state = "tiger_head" + +/datum/sprite_accessory/body_markings/head/tajara/tiger_face_taj + name = "Tajaran Tiger Head and Face" + icon_state = "tiger_face" + +/datum/sprite_accessory/body_markings/head/tajara/outears_taj + name = "Tajaran Outer Ears" + icon_state = "outears" + +/datum/sprite_accessory/body_markings/head/tajara/inears_taj + name = "Tajaran Inner Ears" + icon_state = "inears" + +/datum/sprite_accessory/body_markings/head/tajara/nose_taj + name = "Tajaran Nose" + icon_state = "nose" + +/datum/sprite_accessory/body_markings/head/tajara/muzzle_taj + name = "Tajaran Muzzle" + icon_state = "muzzle" + +/datum/sprite_accessory/body_markings/head/tajara/muzzle_and_inears_taj + name = "Tajaran Muzzle and Inner Ears" + icon_state = "muzinears" + +/datum/sprite_accessory/body_markings/head/tajara/muzzle_alt_taj //Companion marking for Tajaran Belly 2. + name = "Tajaran Muzzle 2" + icon_state = "muzzle2" + +/datum/sprite_accessory/body_markings/head/tajara/points_taj //Companion marking for Tajaran Points. + name = "Tajaran Points Head" + icon_state = "points" + +/datum/sprite_accessory/body_markings/head/tajara/patchy_taj //Companion marking for Tajaran Patches. + name = "Tajaran Patches Head" + icon_state = "patch" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/unathi/unathi_alt_heads.dm b/code/modules/mob/new_player/sprite_accessories/unathi/unathi_alt_heads.dm new file mode 100644 index 00000000000..7b16b9fab10 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/unathi/unathi_alt_heads.dm @@ -0,0 +1,5 @@ +/datum/sprite_accessory/alt_heads/una_sharp_snout + name = "Unathi Sharp Snout" + species_allowed = list("Unathi") + icon_state = "head_sharp" + suffix = "sharp" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/unathi/unathi_body_markings.dm b/code/modules/mob/new_player/sprite_accessories/unathi/unathi_body_markings.dm new file mode 100644 index 00000000000..e65fe303d36 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/unathi/unathi_body_markings.dm @@ -0,0 +1,19 @@ +/datum/sprite_accessory/body_markings/unathi + icon = 'icons/mob/sprite_accessories/unathi/unathi_body_markings.dmi' + species_allowed = list("Unathi") + +/datum/sprite_accessory/body_markings/unathi/stripe_una + name = "Unathi Stripe" + icon_state = "stripe" + +/datum/sprite_accessory/body_markings/unathi/belly_narrow_una + name = "Unathi Belly" + icon_state = "belly" + +/datum/sprite_accessory/body_markings/unathi/banded_una + name = "Unathi Banded" + icon_state = "banded" + +/datum/sprite_accessory/body_markings/unathi/points_una + name = "Unathi Points" + icon_state = "points" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/unathi/unathi_facial_hair.dm b/code/modules/mob/new_player/sprite_accessories/unathi/unathi_facial_hair.dm new file mode 100644 index 00000000000..7cba458e2b0 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/unathi/unathi_facial_hair.dm @@ -0,0 +1,76 @@ +/datum/sprite_accessory/facial_hair/unathi + icon = 'icons/mob/sprite_accessories/unathi/unathi_facial_hair.dmi' + species_allowed = list("Unathi") + gender = NEUTER + over_hair = 1 + +/datum/sprite_accessory/facial_hair/unathi/una_spines_long + name = "Long Spines" + icon_state = "longspines" + +/datum/sprite_accessory/facial_hair/unathi/una_spines_short + name = "Short Spines" + icon_state = "shortspines" + +/datum/sprite_accessory/facial_hair/unathi/una_frills_aquaspine + name = "Spiny Aquatic Frills" + icon_state = "dracfrills" + +/datum/sprite_accessory/facial_hair/unathi/una_frills_aquatic + name = "Aquatic Frills" + icon_state = "aquaticfrills" + +/datum/sprite_accessory/facial_hair/unathi/una_frills_long + name = "Long Frills" + icon_state = "longfrills" + +/datum/sprite_accessory/facial_hair/unathi/una_frills_short + name = "Short Frills" + icon_state = "shortfrills" + +/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_aquaspine + name = "Spiny Aquatic Webbed Frills" + icon_state = "dracfrills" + secondary_theme = "webbing" + +/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_aquatic + name = "Aquatic Webbed Frills" + icon_state = "aquaticfrills" + secondary_theme = "webbing" + +/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_long + name = "Long Webbed Frills" + icon_state = "longfrills" + secondary_theme = "webbing" + +/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_short + name = "Short Webbed Frills" + icon_state = "shortfrills" + secondary_theme = "webbing" + +// These hairstyles are repeated from unathi_hair +/datum/sprite_accessory/facial_hair/unathi/una_side_frills + name = "Side Frills" + icon_state = "sidefrills" + secondary_theme = "webbing" + +/datum/sprite_accessory/facial_hair/unathi/una_frills_dorsal + over_hair = null + name = "Dorsal Frills" + icon_state = "dorsalfrills" + secondary_theme = "webbing" + +/datum/sprite_accessory/facial_hair/unathi/una_chin_horns + name = "Chin Horns" + icon = 'icons/mob/sprite_accessories/unathi/unathi_hair.dmi' + icon_state = "chin_horns" + +/datum/sprite_accessory/facial_hair/unathi/una_horn_adorns + name = "Horn Adorns" + icon = 'icons/mob/sprite_accessories/unathi/unathi_hair.dmi' + icon_state = "adorns_horns" + +/datum/sprite_accessory/facial_hair/unathi/una_spikes + name = "Spikes" + icon = 'icons/mob/sprite_accessories/unathi/unathi_hair.dmi' + icon_state = "spikes_horns" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/unathi/unathi_hair.dm b/code/modules/mob/new_player/sprite_accessories/unathi/unathi_hair.dm new file mode 100644 index 00000000000..9514e292036 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/unathi/unathi_hair.dm @@ -0,0 +1,77 @@ +/datum/sprite_accessory/hair/unathi + icon = 'icons/mob/sprite_accessories/unathi/unathi_hair.dmi' + species_allowed = list("Unathi") + glasses_over = 1 + +/datum/sprite_accessory/hair/braid_hip_una // Future coder: Change the typepath under unathi. This is a legacy of my accessories splitting PR where typepath change is avoided at all cost + icon = 'icons/mob/sprite_accessories/unathi/unathi_hair.dmi' + name = "Unathi Hippie Braid" + icon_state = "hipbraid" + species_allowed = list("Unathi") + secondary_theme = "beads" + +/datum/sprite_accessory/hair/unathi/una_cobra_hood + name = "Unathi Cobra Hood" + icon_state = "cobrahood" + secondary_theme = "webbing" + +/datum/sprite_accessory/hair/unathi/simple + name = "Simple Horns" + icon_state = "simple_horns" + +/datum/sprite_accessory/hair/unathi/short + name = "Short Horns" + icon_state = "short_horns" + +/datum/sprite_accessory/hairy/unathi/curled + name = "Curled Horns" + icon_state = "curled_horns" + +/datum/sprite_accessory/hair/unathi/ram + name = "Ram Horns" + icon_state = "ram_horns" + +/datum/sprite_accessory/hair/unathi/double + name = "Double Horns" + icon_state = "drac_horns" + +/datum/sprite_accessory/hair/unathi/lower + name = "Lower Horns" + icon_state = "lower_horns" + +/datum/sprite_accessory/hair/unathi/big + name = "Big" + icon_state = "big_horns" + +/datum/sprite_accessory/hair/unathi/ram2 + name = "Ram alt." + icon_state = "ram2_horns" + +/datum/sprite_accessory/hair/unathi/small + name = "Small" + icon_state = "small_horns" + +// BOTTOM / SIDE HAIR STYLE, shared with facial hair +/datum/sprite_accessory/hair/unathi/una_side_frills + icon = 'icons/mob/sprite_accessories/unathi/unathi_facial_hair.dmi' + name = "Unathi Side Frills" + icon_state = "sidefrills" + secondary_theme = "webbing" + +/datum/sprite_accessory/hair/unathi/chin + name = "Chin" + icon_state = "chin_horns" + +/datum/sprite_accessory/hair/unathi/adorns + name = "Adorns" + icon_state = "adorns_horns" + +/datum/sprite_accessory/hair/unathi/spikes + name = "Spikes" + icon_state = "spikes_horns" + +/datum/sprite_accessory/hair/unathi/una_frills_dorsal + icon = 'icons/mob/sprite_accessories/unathi/unathi_facial_hair.dmi' + name = "Dorsal Frills" + icon_state = "dorsalfrills" + secondary_theme = "webbing" diff --git a/code/modules/mob/new_player/sprite_accessories/unathi/unathi_head_accessories.dm b/code/modules/mob/new_player/sprite_accessories/unathi/unathi_head_accessories.dm new file mode 100644 index 00000000000..0cab3238016 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/unathi/unathi_head_accessories.dm @@ -0,0 +1,54 @@ +// Unathi head accessories are all shared with hairstyle. So they redirect to the same file. + +/datum/sprite_accessory/head_accessory/unathi + icon = 'icons/mob/sprite_accessories/unathi/unathi_hair.dmi' + species_allowed = list("Unathi") + over_hair = 1 + +/datum/sprite_accessory/head_accessory/unathi/simple + name = "Simple" + icon_state = "simple_horns" + +/datum/sprite_accessory/head_accessory/unathi/short + name = "Short" + icon_state = "short_horns" + +/datum/sprite_accessory/head_accessory/unathi/curled + name = "Curled" + icon_state = "curled_horns" + +/datum/sprite_accessory/head_accessory/unathi/ram + name = "Ram" + icon_state = "ram_horns" + +/datum/sprite_accessory/head_accessory/unathi/double + name = "Double" + icon_state = "drac_horns" + +/datum/sprite_accessory/head_accessory/unathi/lower + name = "Lower" + icon_state = "lower_horns" + +/datum/sprite_accessory/head_accessory/unathi/big + name = "Big" + icon_state = "big_horns" + +/datum/sprite_accessory/head_accessory/unathi/ram2 + name = "Ram alt." + icon_state = "ram2_horns" + +/datum/sprite_accessory/head_accessory/unathi/small + name = "Small" + icon_state = "small_horns" + +/datum/sprite_accessory/head_accessory/unathi/chin + name = "Chin" + icon_state = "chin_horns" + +/datum/sprite_accessory/head_accessory/unathi/adorns + name = "Adorns" + icon_state = "adorns_horns" + +/datum/sprite_accessory/head_accessory/unathi/spikes + name = "Spikes" + icon_state = "spikes_horns" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/unathi/unathi_head_markings.dm b/code/modules/mob/new_player/sprite_accessories/unathi/unathi_head_markings.dm new file mode 100644 index 00000000000..25d74d605e2 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/unathi/unathi_head_markings.dm @@ -0,0 +1,53 @@ +/datum/sprite_accessory/body_markings/head/unathi + icon = 'icons/mob/sprite_accessories/unathi/unathi_head_markings.dmi' + species_allowed = list("Unathi") + +/datum/sprite_accessory/body_markings/head/unathi/tiger_head_una + name = "Unathi Tiger Head" + icon_state = "tigerhead" + heads_allowed = list("All") + +/datum/sprite_accessory/body_markings/head/unathi/tiger_face_una + name = "Unathi Tiger Head and Face" + icon_state = "tigerface" + +/datum/sprite_accessory/body_markings/head/unathi/snout_una_round + name = "Unathi Round Snout" + icon_state = "snoutround" + +/datum/sprite_accessory/body_markings/head/unathi/snout_lower_una_round + name = "Unathi Lower Round Snout" + icon_state = "lowersnout" + heads_allowed = list("All") + +/datum/sprite_accessory/body_markings/head/unathi/banded_una //Companion marking for Unathi Banded. + name = "Unathi Banded Head" + icon_state = "bandedface" + heads_allowed = list("All") + +/datum/sprite_accessory/body_markings/head/unathi/snout_narrow_una //Companion marking for Unathi Narrow Belly. + name = "Unathi Snout 2" + icon_state = "facenarrow" + +/datum/sprite_accessory/body_markings/head/unathi/points_una //Companion marking for Unathi Points. + name = "Unathi Points Head" + icon_state = "pointsface" + +/datum/sprite_accessory/body_markings/head/unathi/sharp + heads_allowed = list("Unathi Sharp Snout") + +/datum/sprite_accessory/body_markings/head/unathi/sharp/tiger_face_una_sharp + name = "Unathi Sharp Tiger Head and Face" + icon_state = "sharptiger" + +/datum/sprite_accessory/body_markings/head/unathi/sharp/snout_una_sharp + name = "Unathi Sharp Snout" + icon_state = "snoutsharp" + +/datum/sprite_accessory/body_markings/head/unathi/sharp/snout_narrow_una_sharp //Companion marking for Unathi Narrow Belly. + name = "Unathi Sharp Snout 2" + icon_state = "facesharp" + +/datum/sprite_accessory/body_markings/head/unathi/sharp/points_una_sharp //Companion marking for Unathi Points. + name = "Unathi Sharp Points Head" + icon_state = "pointsface" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/vox/vox_body_markings.dm b/code/modules/mob/new_player/sprite_accessories/vox/vox_body_markings.dm new file mode 100644 index 00000000000..563b39356d9 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/vox/vox_body_markings.dm @@ -0,0 +1,19 @@ +/datum/sprite_accessory/body_markings/tattoo/vox + icon = 'icons/mob/sprite_accessories/vox/vox_body_markings.dmi' + species_allowed = list("Vox") + +/datum/sprite_accessory/body_markings/tattoo/vox/heart_vox + name = "Vox Heart Tattoo" + icon_state = "heart" + +/datum/sprite_accessory/body_markings/tattoo/vox/hive_vox + name = "Vox Hive Tattoo" + icon_state = "hive" + +/datum/sprite_accessory/body_markings/tattoo/vox/nightling_vox + name = "Vox Nightling Tattoo" + icon_state = "nightling" + +/datum/sprite_accessory/body_markings/tattoo/vox/tiger_body_vox + name = "Vox Tiger-stripe Tattoo" + icon_state = "tiger" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/vox/vox_facial_hair.dm b/code/modules/mob/new_player/sprite_accessories/vox/vox_facial_hair.dm new file mode 100644 index 00000000000..18d212de255 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/vox/vox_facial_hair.dm @@ -0,0 +1,20 @@ +/datum/sprite_accessory/facial_hair/vox + icon = 'icons/mob/sprite_accessories/vox/vox_facial_hair.dmi' + species_allowed = list("Vox") + gender = NEUTER + +/datum/sprite_accessory/facial_hair/vox/vox_colonel + name = "Vox Colonel Beard" + icon_state = "colonel" + +/datum/sprite_accessory/facial_hair/vox/vox_long + name = "Long Mustache" + icon_state = "fu" + +/datum/sprite_accessory/facial_hair/vox/vox_neck + name = "Neck Quills" + icon_state = "neck" + +/datum/sprite_accessory/facial_hair/vox/vox_beard + name = "Vox Quill Beard" + icon_state = "beard" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/vox/vox_hair.dm b/code/modules/mob/new_player/sprite_accessories/vox/vox_hair.dm new file mode 100644 index 00000000000..287b2f250be --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/vox/vox_hair.dm @@ -0,0 +1,60 @@ +/datum/sprite_accessory/hair/vox + icon = 'icons/mob/sprite_accessories/vox/vox_hair.dmi' + species_allowed = list("Vox") + glasses_over = 1 + +/datum/sprite_accessory/hair/vox/vox_quills_short + name = "Short Vox Quills" + icon_state = "shortquills" + +/datum/sprite_accessory/hair/vox/vox_crestedquills + name = "Crested Vox Quills" + icon_state = "crestedquills" + +/datum/sprite_accessory/hair/vox/vox_tielquills + name = "Vox Tiel Quills" + icon_state = "tielquills" + +/datum/sprite_accessory/hair/vox/vox_emperorquills + name = "Vox Emperor Quills" + icon_state = "emperorquills" + +/datum/sprite_accessory/hair/vox/vox_keelquills + name = "Vox Keel Quills" + icon_state = "keelquills" + +/datum/sprite_accessory/hair/vox/vox_keetquills + name = "Vox Keet Quills" + icon_state = "keetquills" + +/datum/sprite_accessory/hair/vox/vox_quills_kingly + name = "Kingly Vox Quills" + icon_state = "kingly" + +/datum/sprite_accessory/hair/vox/vox_quills_fluff + name = "Fluffy Vox Quills" + icon_state = "afro" + +/datum/sprite_accessory/hair/vox/vox_quills_mohawk + name = "Vox Quill Mohawk" + icon_state = "mohawk" + +/datum/sprite_accessory/hair/vox/vox_quills_long + name = "Long Vox Quills" + icon_state = "yasu" + +/datum/sprite_accessory/hair/vox/vox_horns + name = "Vox Spikes" + icon_state = "horns" + +/datum/sprite_accessory/hair/vox/vox_nights + name = "Vox Pigtails" + icon_state = "nights" + +/datum/sprite_accessory/hair/vox/vox_razor + name = "Vox Razorback" + icon_state = "razor" + +/datum/sprite_accessory/hair/vox/vox_razor_clipped + name = "Clipped Vox Razorback" + icon_state = "razor_clipped" diff --git a/code/modules/mob/new_player/sprite_accessories/vox/vox_tail_markings.dm b/code/modules/mob/new_player/sprite_accessories/vox/vox_tail_markings.dm new file mode 100644 index 00000000000..e77c6f7e19d --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/vox/vox_tail_markings.dm @@ -0,0 +1,15 @@ +/datum/sprite_accessory/body_markings/tail/vox + icon = 'icons/mob/sprite_accessories/vox/vox_tail_markings.dmi' + species_allowed = list("Vox") + +/datum/sprite_accessory/body_markings/tail/vox/vox_band + name = "Vox Tail Band" + icon_state = "band" + +/datum/sprite_accessory/body_markings/tail/vox/vox_tip + name = "Vox Tail Tip" + icon_state = "tip" + +/datum/sprite_accessory/body_markings/tail/vox/vox_stripe + name = "Vox Tail Stripe" + icon_state = "stripe" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/vulpkanin/vulpkanin_body_markings.dm b/code/modules/mob/new_player/sprite_accessories/vulpkanin/vulpkanin_body_markings.dm new file mode 100644 index 00000000000..30017e0987b --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/vulpkanin/vulpkanin_body_markings.dm @@ -0,0 +1,35 @@ +/datum/sprite_accessory/body_markings/vulpkanin + icon = 'icons/mob/sprite_accessories/vulpkanin/vulpkanin_body_markings.dmi' + species_allowed = list("Vulpkanin") + +/datum/sprite_accessory/body_markings/vulpkanin/belly_fox_vulp + name = "Vulpkanin Belly" + icon_state = "foxbelly" + +/datum/sprite_accessory/body_markings/vulpkanin/belly_full_vulp + name = "Vulpkanin Belly 2" + icon_state = "fullbelly" + +/datum/sprite_accessory/body_markings/vulpkanin/belly_crest_vulp + name = "Vulpkanin Belly Crest" + icon_state = "bellycrest" + +/datum/sprite_accessory/body_markings/vulpkanin/points_fade_vulp + name = "Vulpkanin Points" + icon_state = "pointsfade" + +/datum/sprite_accessory/body_markings/vulpkanin/points_fade_belly_vulp + name = "Vulpkanin Points and Belly" + icon_state = "pointsfadebelly" + +/datum/sprite_accessory/body_markings/vulpkanin/points_fade_belly_alt_vulp + name = "Vulpkanin Points and Belly Alt." + icon_state = "altpointsfadebelly" + +/datum/sprite_accessory/body_markings/vulpkanin/points_sharp_vulp + name = "Vulpkanin Sharp Points" + icon_state = "sharppoints" + +/datum/sprite_accessory/body_markings/vulpkanin/points_crest_vulp + name = "Vulpkanin Points and Crest" + icon_state = "crestpoints" diff --git a/code/modules/mob/new_player/sprite_accessories/vulpkanin/vulpkanin_facial_hair.dm b/code/modules/mob/new_player/sprite_accessories/vulpkanin/vulpkanin_facial_hair.dm new file mode 100644 index 00000000000..57a409cde95 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/vulpkanin/vulpkanin_facial_hair.dm @@ -0,0 +1,49 @@ +/datum/sprite_accessory/facial_hair/vulpkanin + icon = 'icons/mob/sprite_accessories/vulpkanin/vulpkanin_facial_hair.dmi' + species_allowed = list("Vulpkanin") + gender = NEUTER + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_blaze + name = "Blaze" + icon_state = "blaze" + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine + name = "Vulpine" + icon_state = "vulpine" + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine_brows + name = "Vulpine and Brows" + icon_state = "brows" + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine_fluff + name = "Vulpine and Earfluff" + icon_state = "vulpinefluff" + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_mask + name = "Mask" + icon_state = "mask" + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_patch + name = "Patch" + icon_state = "patch" + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_ruff + name = "Ruff" + icon_state = "ruff" + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_kita + name = "Kita" + icon_state = "kita" + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_swift + name = "Swift" + icon_state = "swift" + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_elder + name = "Elder" + icon_state = "elder" + secondary_theme = "chin" + +/datum/sprite_accessory/facial_hair/vulpkanin/vulp_slash + name = "Slash" + icon_state = "slash" diff --git a/code/modules/mob/new_player/sprite_accessories/vulpkanin/vulpkanin_hair.dm b/code/modules/mob/new_player/sprite_accessories/vulpkanin/vulpkanin_hair.dm new file mode 100644 index 00000000000..a3e3339b1eb --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/vulpkanin/vulpkanin_hair.dm @@ -0,0 +1,87 @@ +/datum/sprite_accessory/hair/vulpkanin + icon = 'icons/mob/sprite_accessories/vulpkanin/vulpkanin_hair.dmi' + species_allowed = list("Vulpkanin") + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_kajam + name = "Kajam" + icon_state = "kajam" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_keid + name = "Keid" + icon_state = "keid" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_adhara + name = "Adhara" + icon_state = "adhara" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_kleeia + name = "Kleeia" + icon_state = "kleeia" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_mizar + name = "Mizar" + icon_state = "mizar" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_apollo + name = "Apollo" + icon_state = "apollo" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_belle + name = "Belle" + icon_state = "belle" + secondary_theme = "bands" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_bun + name = "Bun" + icon_state = "bun" + glasses_over = 1 + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_jagged + name = "Jagged" + icon_state = "jagged" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_curl + name = "Curl" + icon_state = "curl" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_hawk + name = "Hawk" + icon_state = "hawk" + glasses_over = 1 + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_anita + name = "Anita" + icon_state = "anita" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_short + name = "Short" + icon_state = "short" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_spike + name = "Spike" + icon_state = "spike" + glasses_over = 1 + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_braided + name = "Braided" + icon_state = "braided" + secondary_theme = "beads" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_punkbraided + name = "Punk Braided" + icon_state = "punkbraided" + secondary_theme = "flare" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_short2 + name = "Short Alt." + icon_state = "short2" + glasses_over = 1 + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_rough + name = "Rough-Cropped Mane" + icon_state = "rough" + +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_raine + name = "Raine" + icon_state = "raine" + gender = FEMALE diff --git a/code/modules/mob/new_player/sprite_accessories/vulpkanin/vulpkanin_head_accessories.dm b/code/modules/mob/new_player/sprite_accessories/vulpkanin/vulpkanin_head_accessories.dm new file mode 100644 index 00000000000..66edd5974fc --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/vulpkanin/vulpkanin_head_accessories.dm @@ -0,0 +1,57 @@ +/datum/sprite_accessory/head_accessory/vulpkanin + icon = 'icons/mob/sprite_accessories/vulpkanin/vulpkanin_facial_hair.dmi' + species_allowed = list("Vulpkanin") + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_earfluff + name = "Vulpkanin Earfluff" + icon_state = "earfluff" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_blaze + name = "Blaze" + icon_state = "blaze" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_vulpine + name = "Vulpine" + icon_state = "vulpine" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_vulpine_fluff + name = "Vulpine and Earfluff" + icon_state = "vulpinefluff" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_mask + name = "Mask" + icon_state = "mask" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_patch + name = "Patch" + icon_state = "patch" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_ruff + name = "Ruff" + icon_state = "ruff" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_kita + name = "Kita" + icon_state = "kita" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_swift + name = "Swift" + icon_state = "swift" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_nose + icon = 'icons/mob/sprite_accessories/vulpkanin/vulpkanin_head_markings.dmi' + name = "Vulpkanin Nose" + icon_state = "nose" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_nose2 + icon = 'icons/mob/sprite_accessories/vulpkanin/vulpkanin_head_markings.dmi' + name = "Vulpkanin Nose Alt." + icon_state = "nose_alt" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_elder + name = "Elder" + icon_state = "elder" + +/datum/sprite_accessory/head_accessory/vulpkanin/vulp_slash + name = "Slash" + icon_state = "slash" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/vulpkanin/vulpkanin_head_markings.dm b/code/modules/mob/new_player/sprite_accessories/vulpkanin/vulpkanin_head_markings.dm new file mode 100644 index 00000000000..47253385ba1 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/vulpkanin/vulpkanin_head_markings.dm @@ -0,0 +1,35 @@ +/datum/sprite_accessory/body_markings/head/vulpkanin + icon = 'icons/mob/sprite_accessories/vulpkanin/vulpkanin_head_markings.dmi' + species_allowed = list("Vulpkanin") + +/datum/sprite_accessory/body_markings/head/vulpkanin/nose_default_vulp + name = "Vulpkanin Nose" + icon_state = "nose" + +/datum/sprite_accessory/body_markings/head/vulpkanin/nose2_default_vulp + name = "Vulpkanin Nose Alt." + icon_state = "nose_alt" + +/datum/sprite_accessory/body_markings/head/vulpkanin/tiger_head_vulp + name = "Vulpkanin Tiger Head" + icon_state = "tiger_head" + +/datum/sprite_accessory/body_markings/head/vulpkanin/tiger_face_vulp + name = "Vulpkanin Tiger Head and Face" + icon_state = "tiger_face" + +/datum/sprite_accessory/body_markings/head/vulpkanin/muzzle_vulp //Companion marking for Vulpkanin Belly Alt.. + name = "Vulpkanin Muzzle" + icon_state = "muzzle" + +/datum/sprite_accessory/body_markings/head/vulpkanin/muzzle_ears_vulp //Companion marking for Vulpkanin Belly Alt.. + name = "Vulpkanin Muzzle and Ears" + icon_state = "muzzle_ear" + +/datum/sprite_accessory/body_markings/head/vulpkanin/points_fade_vulp //Companion marking for Vulpkanin Points Fade. + name = "Vulpkanin Points Head" + icon_state = "points_fade" + +/datum/sprite_accessory/body_markings/head/vulpkanin/points_sharp_vulp //Companion marking for Vulpkanin Points Sharp. + name = "Vulpkanin Points Head 2" + icon_state = "points_sharp" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/vulpkanin/vulpkanin_tail_markings.dm b/code/modules/mob/new_player/sprite_accessories/vulpkanin/vulpkanin_tail_markings.dm new file mode 100644 index 00000000000..85b93ad3f19 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/vulpkanin/vulpkanin_tail_markings.dm @@ -0,0 +1,36 @@ +/datum/sprite_accessory/body_markings/tail/vulpkanin + icon = 'icons/mob/sprite_accessories/vulpkanin/vulpkanin_tail_markings.dmi' + species_allowed = list("Vulpkanin") + +/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_default_tip + name = "Vulpkanin Default Tail Tip" + icon_state = "default_tip" + +/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_default_fade + name = "Vulpkanin Default Tail Fade" + icon_state = "default_fade" + +/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_bushy_fluff + name = "Vulpkanin Bushy Tail Fluff" + tails_allowed = list("Vulpkanin Alt 1 (Bushy)") + icon_state = "bushfluff" + +/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_short_tip + name = "Vulpkanin Short Tail Tip" + tails_allowed = list("Vulpkanin Alt 4 (Short)") + icon_state = "short" + +/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_tip + name = "Vulpkanin Bushy Straight Tail Tip" + tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)") + icon_state = "sbtip" + +/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_fade + name = "Vulpkanin Bushy Straight Tail Fade" + tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)") + icon_state = "sbfade" + +/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_silverf + name = "Vulpkanin Bushy Straight Tail Black Fade White Tip" + tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)") + icon_state = "sbsilverfade" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories/wryn/wryn_face.dm b/code/modules/mob/new_player/sprite_accessories/wryn/wryn_face.dm new file mode 100644 index 00000000000..38d17ea2950 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories/wryn/wryn_face.dm @@ -0,0 +1,8 @@ +/datum/sprite_accessory/hair/wryn + icon = 'icons/mob/sprite_accessories/wryn/wryn_face.dmi' + species_allowed = list("Wryn") + glasses_over = 1 + +/datum/sprite_accessory/hair/wryn/wry_antennae_default + name = "Antennae" + icon_state = "antennae" \ No newline at end of file diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index 4cbbe9c51c9..f6e6e07673f 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -52,23 +52,13 @@ return -/mob/proc/EarDamage() - return - -/mob/proc/SetEarDamage() +/mob/proc/RestoreEars() return /mob/proc/AdjustEarDamage() return - -/mob/proc/EarDeaf() - return - -/mob/proc/SetEarDeaf() - return - -/mob/proc/AdjustEarDeaf() +/mob/proc/MinimumDeafTicks() return diff --git a/code/modules/mob/update_status.dm b/code/modules/mob/update_status.dm index 52a6fb7769d..446c2aaed8f 100644 --- a/code/modules/mob/update_status.dm +++ b/code/modules/mob/update_status.dm @@ -35,7 +35,7 @@ // Procs that give information about the status of the mob /mob/proc/can_hear() - return 1 + . = 1 /mob/proc/has_vision(information_only = FALSE) return 1 diff --git a/code/modules/pda/cart.dm b/code/modules/pda/cart.dm index 53c61f4e27f..b721bef52c4 100644 --- a/code/modules/pda/cart.dm +++ b/code/modules/pda/cart.dm @@ -230,6 +230,7 @@ new/datum/data/pda/app/janitor, new/datum/data/pda/app/supply, + new/datum/data/pda/app/mule_control, new/datum/data/pda/app/status_display) diff --git a/code/modules/power/treadmill.dm b/code/modules/power/treadmill.dm index 92464413c5c..c611585a8cc 100644 --- a/code/modules/power/treadmill.dm +++ b/code/modules/power/treadmill.dm @@ -115,7 +115,7 @@ #define CHARS_PER_LINE 5 #define FONT_SIZE "5pt" #define FONT_COLOR "#09f" -#define FONT_STYLE "Arial Black" +#define FONT_STYLE "Small Fonts" /obj/machinery/treadmill_monitor name = "Treadmill Monitor" @@ -126,6 +126,7 @@ density = 0 maptext_height = 26 maptext_width = 32 + maptext_y = -1 var/on = 0 // if we should be metering or not var/id = null // id of treadmill @@ -200,6 +201,8 @@ //Checks to see if there's 1 line or 2, adds text-icons-numbers/letters over display // Stolen from status_display /obj/machinery/treadmill_monitor/proc/update_display(var/line1, var/line2) + line1 = uppertext(line1) + line2 = uppertext(line2) var/new_text = {"
[line1]
[line2]
"} if(maptext != new_text) maptext = new_text diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 66935652e4e..1e0a43e75d1 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -199,8 +199,8 @@ num_ammo++ for(var/M in initial_mats) //In case we have multiple types of materials var/materials_per = initial_mats[M] / max_ammo - - var/value = max(materials_per * num_ammo, 2000) //Enforce a minimum of 2000 units even if empty. + + var/value = max(materials_per * num_ammo, 500) //Enforce a minimum of 500 units even if empty. materials[M] = value //Behavior for magazines diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index 6eba670e906..28dc2e41b14 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -118,10 +118,12 @@ icon_state = "foambox" ammo_type = /obj/item/ammo_casing/caseless/foam_dart max_ammo = 40 + materials = list(MAT_METAL = 500) /obj/item/ammo_box/foambox/riot icon_state = "foambox_riot" ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot + materials = list(MAT_METAL = 50000) /obj/item/ammo_box/caps name = "speed loader (caps)" diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 2d031d9c2c5..1b84afb3d74 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -69,6 +69,9 @@ SSnanoui.update_uis(src) /obj/machinery/chem_heater/attackby(obj/item/I, mob/user) + if(default_unfasten_wrench(user, I)) + power_change() + return if(isrobot(user)) return diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 81fed023251..0855c4fec4f 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -50,6 +50,9 @@ stat |= NOPOWER /obj/machinery/chem_master/attackby(obj/item/B, mob/user, params) + if(default_unfasten_wrench(user, B)) + power_change() + return if(istype(B, /obj/item/reagent_containers/glass) || istype(B, /obj/item/reagent_containers/food/drinks/drinkingglass)) diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 3a5b753217f..7c36334f78d 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -185,18 +185,18 @@ english_symptoms += S.name var/symtoms = english_list(english_symptoms) - + var/signature if(alert(user,"Would you like to add your signature?",,"Yes","No") == "Yes") signature = "[user ? user.real_name : "Anonymous"]" - else + else signature = "" - + printing = 1 var/obj/item/paper/P = new /obj/item/paper(loc) visible_message("[src] rattles and prints out a sheet of paper.") playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) - + P.info = "
Releasing Virus
" P.info += "
" P.info += "Name of the Virus: [D.name]
" @@ -318,6 +318,9 @@ /obj/machinery/computer/pandemic/attackby(obj/item/I, mob/user, params) + if(default_unfasten_wrench(user, I)) + power_change() + return if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER)) if(stat & (NOPOWER|BROKEN)) return diff --git a/code/modules/reagents/chemistry/reagents/alcohol.dm b/code/modules/reagents/chemistry/reagents/alcohol.dm index c74e5973bf7..1482c4ce37a 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol.dm @@ -396,13 +396,13 @@ /datum/reagent/consumable/ethanol/booger name = "Booger" id = "booger" - description = "Ewww..." + description = "Eww..." reagent_state = LIQUID color = "#A68310" // rgb: 166, 131, 16 alcohol_perc = 0.2 drink_icon = "booger" drink_name = "Booger" - drink_desc = "Ewww..." + drink_desc = "Eww..." taste_message = "sweet alcohol" /datum/reagent/consumable/ethanol/bloody_mary @@ -1236,3 +1236,107 @@ drink_icon = "synthignonglass" drink_name = "Glass of Synthignon" drink_desc = "Someone mixed good wine and robot booze. Romantic, but atrocious." + +/datum/reagent/consumable/ethanol/fruit_wine + name = "Fruit Wine" + id = "fruit_wine" + description = "A wine made from grown plants." + color = "#FFFFFF" + alcohol_perc = 0.35 + taste_message = "bad coding" + can_synth = FALSE + var/list/names = list("null fruit" = 1) //Names of the fruits used. Associative list where name is key, value is the percentage of that fruit. + var/list/tastes = list("bad coding" = 1) //List of tastes. See above. + +/datum/reagent/consumable/ethanol/fruit_wine/on_new(list/data) + names = data["names"] + tastes = data["tastes"] + alcohol_perc = data["alcohol_perc"] + color = data["color"] + generate_data_info(data) + +/datum/reagent/consumable/ethanol/fruit_wine/on_merge(list/data, amount) + var/diff = (amount/volume) + if(diff < 1) + color = BlendRGB(color, data["color"], diff/2) //The percentage difference over two, so that they take average if equal. + else + color = BlendRGB(color, data["color"], (1/diff)/2) //Adjust so it's always blending properly. + var/oldvolume = volume-amount + + var/list/cachednames = data["names"] + for(var/name in names | cachednames) + names[name] = ((names[name] * oldvolume) + (cachednames[name] * amount)) / volume + + var/list/cachedtastes = data["tastes"] + for(var/taste in tastes | cachedtastes) + tastes[taste] = ((tastes[taste] * oldvolume) + (cachedtastes[taste] * amount)) / volume + + alcohol_perc *= oldvolume + var/newzepwr = data["alcohol_perc"] * amount + alcohol_perc += newzepwr + alcohol_perc /= volume //Blending alcohol percentage to volume. + generate_data_info(data) + +/datum/reagent/consumable/ethanol/fruit_wine/proc/generate_data_info(list/data) + var/minimum_percent = 0.15 //Percentages measured between 0 and 1. + var/list/primary_tastes = list() + var/list/secondary_tastes = list() + drink_name = "glass of [name]" + drink_desc = description + for(var/taste in tastes) + switch(tastes[taste]) + if(minimum_percent*2 to INFINITY) + primary_tastes += taste + if(minimum_percent to minimum_percent*2) + secondary_tastes += taste + + var/minimum_name_percent = 0.35 + name = "" + var/list/names_in_order = sortTim(names, /proc/cmp_numeric_dsc, TRUE) + var/named = FALSE + for(var/fruit_name in names) + if(names[fruit_name] >= minimum_name_percent) + name += "[fruit_name] " + named = TRUE + if(named) + name += "wine" + else + name = "mixed [names_in_order[1]] wine" + + var/alcohol_description + switch(alcohol_perc) + if(1.2 to INFINITY) + alcohol_description = "suicidally strong" + if(0.9 to 1.2) + alcohol_description = "rather strong" + if(0.7 to 0.9) + alcohol_description = "strong" + if(0.4 to 0.7) + alcohol_description = "rich" + if(0.2 to 0.4) + alcohol_description = "mild" + if(0 to 0.2) + alcohol_description = "sweet" + else + alcohol_description = "watery" //How the hell did you get negative boozepwr? + + var/list/fruits = list() + if(names_in_order.len <= 3) + fruits = names_in_order + else + for(var/i in 1 to 3) + fruits += names_in_order[i] + fruits += "other plants" + var/fruit_list = english_list(fruits) + description = "A [alcohol_description] wine brewed from [fruit_list]." + + var/flavor = "" + if(!primary_tastes.len) + primary_tastes = list("[alcohol_description] alcohol") + flavor += english_list(primary_tastes) + if(secondary_tastes.len) + flavor += ", with a hint of " + flavor += english_list(secondary_tastes) + taste_message = flavor + if(holder.my_atom) + holder.my_atom.on_reagent_change() diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index 7007643e652..7a211780446 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -543,21 +543,23 @@ /datum/reagent/medicine/oculine/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE if(prob(80)) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) + if(iscarbon(M)) + var/mob/living/carbon/C = M + var/obj/item/organ/internal/eyes/E = C.get_int_organ(/obj/item/organ/internal/eyes) if(istype(E)) E.heal_internal_damage(1) + var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears) + if(istype(ears)) + ears.AdjustEarDamage(-1) + if(ears.ear_damage < 25 && prob(30)) + ears.deaf = 0 update_flags |= M.AdjustEyeBlurry(-1, FALSE) - update_flags |= M.AdjustEarDamage(-1, FALSE) + update_flags |= M.AdjustEarDamage(-1) if(prob(50)) update_flags |= M.CureNearsighted(FALSE) if(prob(30)) update_flags |= M.CureBlind(FALSE) update_flags |= M.SetEyeBlind(0, FALSE) - if(M.ear_damage <= 25) - if(prob(30)) - M.SetEarDeaf(0) return ..() | update_flags /datum/reagent/medicine/atropine diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 7ab7d97dd63..362aebfcc10 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -287,16 +287,19 @@ datum/chemical_reaction/flash_powder if(!ear_safety) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) - M.AdjustEarDamage(rand(0, 5)) - M.EarDeaf(15) - if(M.ear_damage >= 15) - to_chat(M, "Your ears start to ring badly!") - if(prob(M.ear_damage - 5)) - to_chat(M, "You can't hear anything!") - M.disabilities |= DEAF - else - if(M.ear_damage >= 5) - to_chat(M, "Your ears start to ring!") + M.AdjustEarDamage(rand(0, 5), 15) + if(iscarbon(M)) + var/mob/living/carbon/C = M + var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears) + if(istype(ears)) + if(ears.ear_damage >= 15) + to_chat(M, "Your ears start to ring badly!") + if(prob(ears.ear_damage - 5)) + to_chat(M, "You can't hear anything!") + M.BecomeDeaf() + else + if(ears.ear_damage >= 5) + to_chat(M, "Your ears start to ring!") holder.remove_reagent("sonic_powder", created_volume) /datum/chemical_reaction/sonic_powder_deafen @@ -322,16 +325,20 @@ datum/chemical_reaction/flash_powder if(!ear_safety) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) - M.AdjustEarDamage(rand(0, 5)) - M.EarDeaf(15) - if(M.ear_damage >= 15) - to_chat(M, "Your ears start to ring badly!") - if(prob(M.ear_damage - 5)) - to_chat(M, "You can't hear anything!") - M.BecomeDeaf() - else - if(M.ear_damage >= 5) - to_chat(M, "Your ears start to ring!") + M.AdjustEarDamage(rand(0, 5), 15) + if(iscarbon(M)) + var/mob/living/carbon/C = M + var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears) + if(istype(ears)) + if(ears.ear_damage >= 15) + to_chat(M, "Your ears start to ring badly!") + if(prob(ears.ear_damage - 5)) + to_chat(M, "You can't hear anything!") + M.BecomeDeaf() + else + if(ears.ear_damage >= 5) + to_chat(M, "Your ears start to ring!") + /datum/chemical_reaction/phlogiston name = "phlogiston" diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index 69030fafa74..e82dbda249d 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -95,7 +95,6 @@ spawn(5) reagents.clear_reagents() return else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. - if(target.reagents && !target.reagents.total_volume) to_chat(user, "[target] is empty and can't be refilled!") return @@ -107,7 +106,7 @@ var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) to_chat(user, "You fill [src] with [trans] unit\s of the contents of [target].") - else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it. + else if(target.is_refillable() && is_drainable()) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) to_chat(user, "[src] is empty.") return diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 4bbc25a8037..64c201a319f 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -1,6 +1,7 @@ #define DIRECTION_FORWARDS 1 #define DIRECTION_OFF 0 #define DIRECTION_REVERSED -1 +#define IS_OPERATING (operating && can_conveyor_run()) GLOBAL_LIST_INIT(conveyor_belts, list()) //Saves us having to look through the entire machines list for our things GLOBAL_LIST_INIT(conveyor_switches, list()) @@ -22,7 +23,6 @@ GLOBAL_LIST_INIT(conveyor_switches, list()) var/operable = TRUE // Can this belt actually go? var/list/affecting // the list of all items that will be moved this ptick var/reversed = FALSE // set to TRUE to have the conveyor belt be reversed - speed_process = TRUE //gotta go fast var/id //ID of the connected lever // create a conveyor @@ -84,7 +84,7 @@ GLOBAL_LIST_INIT(conveyor_switches, list()) /obj/machinery/conveyor/update_icon() ..() - if(operating && can_conveyor_run()) + if(IS_OPERATING) icon_state = "conveyor_started_[clockwise ? "cw" : "ccw"]" if(reversed) icon_state += "_r" @@ -161,20 +161,30 @@ GLOBAL_LIST_INIT(conveyor_switches, list()) update_icon() /obj/machinery/conveyor/process() - if(!operating) - return - if(!can_conveyor_run()) + if(!IS_OPERATING) return use_power(100) affecting = loc.contents - src // moved items will be all in loc - if(!affecting) - return - sleep(1) - for(var/atom/movable/A in affecting) - if(!A.anchored) - if(A.loc == loc) // prevents the object from being affected if it's not currently here. - step(A,forwards) + var/still_stuff_to_move = FALSE + for(var/atom/movable/AM in affecting) + if(AM.anchored) + continue + still_stuff_to_move = TRUE + addtimer(CALLBACK(src, .proc/move_thing, AM), 1) CHECK_TICK + if(!still_stuff_to_move && speed_process) + makeNormalProcess() + else if(still_stuff_to_move && !speed_process) + makeSpeedProcess() + +/obj/machinery/conveyor/Crossed(atom/movable/AM) + if(!speed_process && !AM.anchored) + makeSpeedProcess() + ..() + +/obj/machinery/conveyor/proc/move_thing(atom/movable/AM) + if(!AM.anchored && AM.loc == loc) + step(AM, forwards) /obj/machinery/conveyor/proc/can_conveyor_run() if(stat & BROKEN) @@ -475,3 +485,4 @@ GLOBAL_LIST_INIT(conveyor_switches, list()) #undef DIRECTION_FORWARDS #undef DIRECTION_OFF #undef DIRECTION_REVERSED +#undef IS_OPERATING diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 5a54bf54005..af3088b514b 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -881,3 +881,11 @@ materials = list(MAT_GLASS = 2500) //1.25 glass sheets, broken mirrors will return a shard (1 sheet) build_path = /obj/item/mounted/mirror category = list("initial", "Miscellaneous") + +/datum/design/safe_internals + name = "Safe Internals" + id = "safe" + build_type = AUTOLATHE + materials = list(MAT_METAL = 1000) + build_path = /obj/item/safe_internals + category = list("initial", "Construction") diff --git a/code/modules/response_team/ert.dm b/code/modules/response_team/ert.dm index d678a541912..0c2688cc3f1 100644 --- a/code/modules/response_team/ert.dm +++ b/code/modules/response_team/ert.dm @@ -353,16 +353,3 @@ var/ert_request_answered = FALSE name = "centcomm bounced radio" frequency = ERT_FREQ icon_state = "radio" - -/obj/item/storage/box/responseteam/ - name = "boxed survival kit" - -/obj/item/storage/box/responseteam/New() - ..() - new /obj/item/clothing/mask/breath(src) - new /obj/item/tank/emergency_oxygen/engi(src) - new /obj/item/flashlight/flare(src) - new /obj/item/kitchen/knife/combat(src) - new /obj/item/radio/centcom(src) - new /obj/item/reagent_containers/food/pill/patch/synthflesh(src) - new /obj/item/reagent_containers/hypospray/autoinjector(src) diff --git a/code/modules/space_management/space_level.dm b/code/modules/space_management/space_level.dm index e2c18699a64..e53264e5d57 100644 --- a/code/modules/space_management/space_level.dm +++ b/code/modules/space_management/space_level.dm @@ -21,7 +21,8 @@ var/dirt_count = 0 var/list/init_list = list() -/datum/space_level/New(z, name, transition_type = SELFLOOPING, traits = list(BLOCK_TELEPORT)) +/datum/space_level/New(z, level_name, transition_type = SELFLOOPING, traits = list(BLOCK_TELEPORT)) + name = level_name zpos = z flags = traits build_space_destination_arrays() diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index 3c9d310852c..327e0a7d268 100644 --- a/code/modules/surgery/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -2,6 +2,8 @@ BLOOD SYSTEM ****************************************************/ +#define EXOTIC_BLEED_MULTIPLIER 4 //Multiplies the actually bled amount by this number for the purposes of turf reaction calculations. + /mob/living/carbon/human/proc/suppress_bloodloss(amount) if(bleedsuppress) return @@ -104,7 +106,7 @@ if(dna.species.exotic_blood) var/datum/reagent/R = GLOB.chemical_reagents_list[get_blood_id()] if(istype(R) && isturf(loc)) - R.reaction_turf(get_turf(src), amt) + R.reaction_turf(get_turf(src), amt * EXOTIC_BLEED_MULTIPLIER) /mob/living/proc/restore_blood() blood_volume = initial(blood_volume) diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm new file mode 100644 index 00000000000..d04e5a95279 --- /dev/null +++ b/code/modules/surgery/organs/ears.dm @@ -0,0 +1,64 @@ +/obj/item/organ/internal/ears + name = "ears" + icon_state = "ears" + gender = PLURAL + organ_tag = "ears" + parent_organ = "head" + slot = "ears" + + // `deaf` measures "ticks" of deafness. While > 0, the person is deaf. + var/deaf = 0 + + // `ear_damage` measures long term damage to the ears, if too high, + // the person will not have either `deaf` or `ear_damage` decrease + // without external aid (earmuffs, drugs) + var/ear_damage = 0 + +/obj/item/organ/internal/ears/on_life() + if(!iscarbon(owner)) + return + var/mob/living/carbon/C = owner + // genetic deafness prevents the body from using the ears, even if healthy + if(C.disabilities & DEAF) + deaf = max(deaf, 1) + else + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if((H.l_ear && H.l_ear.flags_2 & HEALS_EARS_2) || (H.r_ear && H.r_ear.flags_2 & HEALS_EARS_2)) + deaf = max(deaf - 1, 1) + ear_damage = max(ear_damage - 0.10, 0) + // if higher than UNHEALING_EAR_DAMAGE, no natural healing occurs. + if(ear_damage < UNHEALING_EAR_DAMAGE) + ear_damage = max(ear_damage - 0.05, 0) + deaf = max(deaf - 1, 0) + +/obj/item/organ/internal/ears/proc/RestoreEars() + deaf = 0 + ear_damage = 0 + + var/mob/living/carbon/C = owner + if(istype(C) && C.disabilities & DEAF) + deaf = 1 + +/obj/item/organ/internal/ears/proc/AdjustEarDamage(ddmg, ddeaf) + ear_damage = max(ear_damage + ddmg, 0) + deaf = max(deaf + ddeaf, 0) + +/obj/item/organ/internal/ears/proc/MinimumDeafTicks(value) + deaf = max(deaf, value) + +// Mob procs +/mob/living/carbon/RestoreEars() + var/obj/item/organ/internal/ears/ears = get_int_organ(/obj/item/organ/internal/ears) + if(ears) + ears.RestoreEars() + +/mob/living/carbon/AdjustEarDamage(ddmg, ddeaf) + var/obj/item/organ/internal/ears/ears = get_int_organ(/obj/item/organ/internal/ears) + if(ears) + ears.AdjustEarDamage(ddmg, ddeaf) + +/mob/living/carbon/MinimumDeafTicks(value) + var/obj/item/organ/internal/ears/ears = get_int_organ(/obj/item/organ/internal/ears) + if(ears) + ears.MinimumDeafTicks(value) \ No newline at end of file diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 4858435cc5f..2dbf85a3b45 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -64,6 +64,7 @@ log_runtime(EXCEPTION("[src] attempted to remove from a [parent_organ], but [parent_organ] didn't exist! [atom_loc_line(M)]"), src) else parent.internal_organs -= src + H.update_int_organs() for(var/X in actions) var/datum/action/A = X @@ -105,6 +106,10 @@ insert(H) return 1 +// Rendering! +/obj/item/organ/internal/proc/render() + return + /obj/item/reagent_containers/food/snacks/organ name = "appendix" icon_state = "appendix" @@ -247,7 +252,7 @@ to_chat(owner, "HONK") owner.SetSleeping(0) owner.Stuttering(20) - owner.AdjustEarDeaf(30) + owner.MinimumDeafTicks(30) owner.Weaken(3) owner << 'sound/items/AirHorn.ogg' if(prob(30)) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index c13c4da83f6..eedcb52be00 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -122,7 +122,7 @@ var/static/regex/multispin_words = regex("like a record baby") var/mob/living/list/listeners = list() for(var/mob/living/L in get_mobs_in_view(8, owner, TRUE)) - if(!L.ear_deaf && !L.null_rod_check() && L != owner && L.stat != DEAD) + if(L.can_hear() && !L.null_rod_check() && L != owner && L.stat != DEAD) if(ishuman(L)) var/mob/living/carbon/human/H = L if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs)) diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm index 250ddea1f0f..b1c0153df45 100644 --- a/code/modules/telesci/bscrystal.dm +++ b/code/modules/telesci/bscrystal.dm @@ -19,10 +19,9 @@ pixel_y = rand(-5, 5) /obj/item/stack/ore/bluespace_crystal/attack_self(var/mob/user) - blink_mob(user) - user.drop_item() - user.visible_message("[user] crushes the [src]!") - qdel(src) + if(use(1)) + blink_mob(user) + user.visible_message("[user] crushes a [singular_name]!") /obj/item/stack/ore/bluespace_crystal/proc/blink_mob(var/mob/living/L) if(!is_teleport_allowed(L.z)) diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js index 7f775879fcd..06f968044fe 100644 --- a/goon/browserassets/js/browserOutput.js +++ b/goon/browserassets/js/browserOutput.js @@ -336,7 +336,7 @@ function setCookie(cname, cvalue, exdays) { var d = new Date(); d.setTime(d.getTime() + (exdays*24*60*60*1000)); var expires = 'expires='+d.toUTCString(); - document.cookie = "paradise-" + cname + '=' + cvalue + '; ' + expires; + document.cookie = "paradise-" + cname + '=' + cvalue + '; ' + expires + '; path=/'; } function getCookie(cname) { diff --git a/html/changelog.html b/html/changelog.html index 6c78179f1ae..181610bce0c 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,322 @@ -->
+

13 November 2018

+

Birdtalon updated:

+
    +
  • Fixes playtime self checker.
  • +
+

Certhic updated:

+
    +
  • fixed a cigs runtime error
  • +
+

TDSSS updated:

+
    +
  • Ancient station's lockdown is now lifted correctly.
  • +
  • Ancient station RD console can now be used.
  • +
+

craftxbox updated:

+
    +
  • use mob voice instead of mob name for radios broadcasting signals.
  • +
+

datlo updated:

+
    +
  • Prevent wizards from casting rod form inside the wizard den.
  • +
+ +

12 November 2018

+

Azule Utama updated:

+
    +
  • Fixed text errors in the descriptions for Booger cocktails and Feral cat grenades.
  • +
+

Birdtalon updated:

+
    +
  • Verb to check your own playtime.
  • +
+

CornMyCob updated:

+
    +
  • You can now unwrench and move the library machines/computers, chem master, chem heater, washing machine, pandemic and PDA painter
  • +
+

Farie82 updated:

+
    +
  • Added the pressure damage reduction to mining bots. No more killing machines called mining bots.
  • +
+

variableundefined updated:

+
    +
  • AI can now select the alien screen display
  • +
  • Nearly every single sprite accessories (species customization option) has been separated and refactored. Report missing hairstyle / screen / horns / frills / tails etc.
  • +
  • Desolate's peacekeeper fluff cyborg sprite is now his service sprite.
  • +
+ +

11 November 2018

+

Azule Utama updated:

+
    +
  • Borgs can no longer stunbaton into infinity. Their batons will now deactivate if they have no power left after hitting someone and cannot be turned back on until they recharge.
  • +
+

Eschess updated:

+
    +
  • large cardboard boxes now show their size when examining
  • +
  • fulltile plasma glass windows now have armor
  • +
  • rised plastitanium windows integrity
  • +
+

Farie82 updated:

+
    +
  • You can now hurt mining bots with welders on any attempt other than help
  • +
  • Can put suits and such back into the suit storage units
  • +
  • Fixed the tank/magboots storage part being called Breathmask storage, lazy copy pasta
  • +
+

Squirgenheimer updated:

+
    +
  • Hatched alien larvas will default to being created on the turf of the mob instead of the mob's location, unless specifically allowed (like closets and spacepods)
  • +
+

tigercat2000 updated:

+
    +
  • Ears are now an organ, which can be damaged, removed, and inserted!
  • +
  • Human icon code should perform massively better.
  • +
+ +

10 November 2018

+

Citinited updated:

+
    +
  • Prevents an infinite metal exploit using the autolathe.
  • +
  • Minimum returnable metal of ammunition boxes has been lowered from 2000 to 500.
  • +
+

Dovydas12345 updated:

+
    +
  • Fixes being unable to slice certain food grown by hydroponics (pineapple, watermelon etc.)
  • +
+

Shazbot updated:

+
    +
  • Some fancy new box sprites, props to Shazbot for the sprites
  • +
  • Old cuff box is gone
  • +
+

TDSSS updated:

+
    +
  • Quarantine is now its own lawset.
  • +
+ +

09 November 2018

+

Alonefromhell updated:

+
    +
  • Most sheets held in hand should now display either a metal or reinforced glass icon where appropriate.
  • +
  • Holopad should no longer automatically revert to default sprite.
  • +
+

Azule Utama updated:

+
    +
  • Small change to cursed heart's spellbook description.
  • +
+

AzuleUtama updated:

+
    +
  • RCD now gives visible messages when building without enough ammo or on an invalid tile.
  • +
+

Citinited updated:

+
    +
  • Fixes ghosts being able to make conveyors drain more power than they should.
  • +
+

Dave-TH updated:

+
    +
  • Space levels is named now.
  • +
+

Mitchs98 updated:

+
    +
  • Chemical implants now work and can be properly filled via beaker or syringe. Reagents inside can also be syringed out.
  • +
+

Warior4356 updated:

+
    +
  • Thermal Drill, Diamond Tipped Thermal Drill, Safe Codes Paper, Safe Internals, Gives Captain Floor Safe, Gives Captain Safe Codes, Safe-cracking Kit
  • +
  • Removed Captain's Digital Safe
  • +
  • Changes safe contents
  • +
  • Added a safe drilling sound
  • +
  • Added drill and safe intenral sprites made by Shazbot194
  • +
+ +

08 November 2018

+

Citinited updated:

+
    +
  • Conveyors use less power now
  • +
+

Eschess updated:

+
    +
  • fixes the NOR, NAND and XOR logical gates
  • +
  • reinforced plasma glass windows give you reinforced plasma glass sheets now
  • +
  • fulltile reinforced plasma glass windows now have armor
  • +
+

Farie82 updated:

+
    +
  • Mining bots now function as expected when giving them a health upgrade. No more repairing without healing
  • +
+

Fel updated:

+
    +
  • You can now craft wooden barrels with 30 pieces of wood! They can hold up to 300u of reagents.
  • +
  • Putting hydroponics-grown plants into the barrel lets you ferment them for alcohol! Some give bar drinks, while others simply give plain fruit wine.
  • +
  • Reagent containers like bottle & glass should be more consistent now.
  • +
+

Spartan updated:

+
    +
  • Plastic bags and wet floor signs can now spawn in maint.
  • +
  • Plastic bags are now supplied to your syndicate uplink. Apply directly to head.
  • +
+

Wario4356 updated:

+
    +
  • Mecha can now drill other mecha
  • +
+

Warior4356 updated:

+
    +
  • Mecha drills now tell you when they can't drill
  • +
+

datlo updated:

+
    +
  • Added the Toxins Payload Casing to crafting recipes, a new method of activating tank transfer valve bombs.
  • +
+

tigercat2000 updated:

+
    +
  • Mecha now use action buttons instead of ugly verbs.
  • +
  • Mecha weapons can now be selected through a radial menu brought up by Ctrl Clicking on the Mecha while you are piloting it.
  • +
  • Tooltips now appear on radial menu buttons when you hover over them. Seriously, why wasn't this a thing in the first place?
  • +
  • Action button icons are now located in their own file.
  • +
  • Captain and HoS can be nearsighted again.
  • +
+

variableundefined updated:

+
    +
  • Baycard, including tarot cards to loadout
  • +
  • Baycard to prize machine
  • +
  • All non-syndicate card deck on map has been replaced with bay card.
  • +
+ +

07 November 2018

+

Spartan updated:

+
    +
  • Bluespace Crystals no longer use the entire stack when used on self to teleport.
  • +
+

Squirgenheimer updated:

+
    +
  • toggling off global antag candidacy will disable you from being selected by the Create Antagonist verb.
  • +
+

TDSSS updated:

+
    +
  • added mulebot control to captain's PDA again.
  • +
+

name here updated:

+
    +
  • objective lists are now sorted for admins.
  • +
+

uc_guy updated:

+
    +
  • IPCs and slimes now have an effect on the floor when bleeding.
  • +
+ +

06 November 2018

+

R1f73r updated:

+
    +
  • Added a death text to headslugs when they die
  • +
+

Squirgenheimer updated:

+
    +
  • blob and autotraitor game modes will now check for Global Antag Candidacy when picking new antagonists after round start
  • +
  • Global Antag Candidacy button will now show up after round start
  • +
+

TDSSS updated:

+
    +
  • Can no longer attempt to build tranquilite walls (and delete the wall in the process)
  • +
+

TatsumakiMagi updated:

+
    +
  • target icon updates when lit by user
  • +
+

Triiodine updated:

+
    +
  • Airlock sensors & vent system to west mining outpost (Safety first!)
  • +
  • Disposals inlet now directly goes to cargo _delivery_ (not conveyor)
  • +
  • More spawns for science nerds in accordance to highpop.
  • +
  • All conflicting C_tags, dispatch cops or AI should freely use all cameras now.
  • +
  • [delta] APC to virology mainroom
  • +
  • [delta] All unsimulated turfs are now simulated.
  • +
+

Ty-Omaha updated:

+
    +
  • Fixes spacing in admin deletion logs
  • +
+

datlo updated:

+
    +
  • Added syndicate themed internals to traitor spacesuit and hardsuit.
  • +
+ +

05 November 2018

+

AzuleUtama updated:

+
    +
  • Added Traitor's toolbelt
  • +
  • Replaced Military belt with Traitor's toolbelt in the uplink.
  • +
  • Price of new belt lowered to 2TC
  • +
  • Replaced Military belt with Traitor's toolbelt in maintenance loot.
  • +
+

Regen updated:

+
    +
  • The tentacle changeling power now generates admin logs.
  • +
+

TatsumakiMagi updated:

+
    +
  • Fixes adjacency and standing checks for cutouts
  • +
+ +

04 November 2018

+

AffectedArc07 updated:

+
    +
  • Makes status display font crispy. mmmmmmmmmmmmm
  • +
+

Citinited updated:

+
    +
  • Fixes a bug in machines when switching between speedy and normal processing speeds.
  • +
+

Dave-TH updated:

+
    +
  • Adds the access tuner, a syndicate device for interfacing with airlocks. Try it out!
  • +
+

Farie82 updated:

+
    +
  • Clings now appear dead on medical huds when using regenerative stasis
  • +
+

R1f73r updated:

+
    +
  • Admin Character names will no longer appear in adminhelps
  • +
+

TDSSS updated:

+
    +
  • Allow , in names, Kidan of the world, rejoice
  • +
  • Made kidan random name generation less shitty
  • +
+

Triiodine updated:

+
    +
  • ghost role sprites with a palette more depressed than the playerbase
  • +
  • medical doc spawn to ghost station
  • +
  • Xydonus's second fluff item
  • +
+ +

03 November 2018

+

Certhic updated:

+
    +
  • Added diona nymph action buttons
  • +
  • Added diona nymph resist alert when they're merged
  • +
  • Diona nymph can now initiate merge with the gestalt
  • +
  • Diona nymph can now leave their gestalt by resisting
  • +
  • Diona nymph can no longer attack its gestalt
  • +
+

Farie82 updated:

+
    +
  • Security comments now work again. Sec hud arrests will now function as intended.
  • +
+

Fox McCloud updated:

+
    +
  • Fixes exploit involving materials and the recycler
  • +
+

Jazz23 updated:

+
    +
  • A method of uploading coordinates to perma teleporter circuit board.
  • +
+

variableundefined updated:

+
    +
  • Tigercat2000 & variableundefined (Ansari) to the maintainer list.
  • +
+

02 November 2018

Purpose updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 201ae83ae1b..200a5f9d54f 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -7822,3 +7822,214 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: Adds glowsticks. Currently only available in AncientStation. variableundefined: - rscadd: Attack log to stun gloves +2018-11-03: + Certhic: + - rscadd: Added diona nymph action buttons + - rscadd: Added diona nymph resist alert when they're merged + - rscadd: Diona nymph can now initiate merge with the gestalt + - bugfix: Diona nymph can now leave their gestalt by resisting + - bugfix: Diona nymph can no longer attack its gestalt + Farie82: + - bugfix: Security comments now work again. Sec hud arrests will now function as + intended. + Fox McCloud: + - bugfix: Fixes exploit involving materials and the recycler + Jazz23: + - rscadd: A method of uploading coordinates to perma teleporter circuit board. + variableundefined: + - rscadd: Tigercat2000 & variableundefined (Ansari) to the maintainer list. +2018-11-04: + AffectedArc07: + - tweak: Makes status display font crispy. mmmmmmmmmmmmm + Citinited: + - bugfix: Fixes a bug in machines when switching between speedy and normal processing + speeds. + Dave-TH: + - rscadd: Adds the access tuner, a syndicate device for interfacing with airlocks. + Try it out! + Farie82: + - bugfix: Clings now appear dead on medical huds when using regenerative stasis + R1f73r: + - bugfix: Admin Character names will no longer appear in adminhelps + TDSSS: + - tweak: Allow , in names, Kidan of the world, rejoice + - tweak: Made kidan random name generation less shitty + Triiodine: + - rscadd: ghost role sprites with a palette more depressed than the playerbase + - rscadd: medical doc spawn to ghost station + - rscadd: Xydonus's second fluff item +2018-11-05: + AzuleUtama: + - rscadd: Added Traitor's toolbelt + - tweak: Replaced Military belt with Traitor's toolbelt in the uplink. + - tweak: Price of new belt lowered to 2TC + - tweak: Replaced Military belt with Traitor's toolbelt in maintenance loot. + Regen: + - bugfix: The tentacle changeling power now generates admin logs. + TatsumakiMagi: + - bugfix: Fixes adjacency and standing checks for cutouts +2018-11-06: + R1f73r: + - rscadd: Added a death text to headslugs when they die + Squirgenheimer: + - bugfix: blob and autotraitor game modes will now check for Global Antag Candidacy + when picking new antagonists after round start + - tweak: Global Antag Candidacy button will now show up after round start + TDSSS: + - bugfix: Can no longer attempt to build tranquilite walls (and delete the wall + in the process) + TatsumakiMagi: + - bugfix: target icon updates when lit by user + Triiodine: + - rscadd: Airlock sensors & vent system to west mining outpost (Safety first!) + - tweak: Disposals inlet now directly goes to cargo _delivery_ (not conveyor) + - bugfix: More spawns for science nerds in accordance to highpop. + - bugfix: All conflicting C_tags, dispatch cops or AI should freely use all cameras + now. + - rscadd: '[delta] APC to virology mainroom' + - bugfix: '[delta] All unsimulated turfs are now simulated.' + Ty-Omaha: + - spellcheck: Fixes spacing in admin deletion logs + datlo: + - rscadd: Added syndicate themed internals to traitor spacesuit and hardsuit. +2018-11-07: + Spartan: + - bugfix: Bluespace Crystals no longer use the entire stack when used on self to + teleport. + Squirgenheimer: + - tweak: toggling off global antag candidacy will disable you from being selected + by the Create Antagonist verb. + TDSSS: + - bugfix: added mulebot control to captain's PDA again. + name here: + - tweak: objective lists are now sorted for admins. + uc_guy: + - bugfix: IPCs and slimes now have an effect on the floor when bleeding. +2018-11-08: + Citinited: + - tweak: Conveyors use less power now + Eschess: + - bugfix: fixes the NOR, NAND and XOR logical gates + - bugfix: reinforced plasma glass windows give you reinforced plasma glass sheets + now + - bugfix: fulltile reinforced plasma glass windows now have armor + Farie82: + - bugfix: Mining bots now function as expected when giving them a health upgrade. + No more repairing without healing + Fel: + - rscadd: You can now craft wooden barrels with 30 pieces of wood! They can hold + up to 300u of reagents. + - rscadd: Putting hydroponics-grown plants into the barrel lets you ferment them + for alcohol! Some give bar drinks, while others simply give plain fruit wine. + - tweak: Reagent containers like bottle & glass should be more consistent now. + Spartan: + - tweak: Plastic bags and wet floor signs can now spawn in maint. + - rscadd: Plastic bags are now supplied to your syndicate uplink. Apply directly + to head. + Wario4356: + - bugfix: Mecha can now drill other mecha + Warior4356: + - bugfix: Mecha drills now tell you when they can't drill + datlo: + - bugfix: Added the Toxins Payload Casing to crafting recipes, a new method of activating + tank transfer valve bombs. + tigercat2000: + - rscadd: Mecha now use action buttons instead of ugly verbs. + - rscadd: Mecha weapons can now be selected through a radial menu brought up by + Ctrl Clicking on the Mecha while you are piloting it. + - rscadd: Tooltips now appear on radial menu buttons when you hover over them. Seriously, + why wasn't this a thing in the first place? + - tweak: Action button icons are now located in their own file. + - tweak: Captain and HoS can be nearsighted again. + variableundefined: + - rscadd: Baycard, including tarot cards to loadout + - rscadd: Baycard to prize machine + - tweak: All non-syndicate card deck on map has been replaced with bay card. +2018-11-09: + Alonefromhell: + - bugfix: Most sheets held in hand should now display either a metal or reinforced + glass icon where appropriate. + - bugfix: Holopad should no longer automatically revert to default sprite. + Azule Utama: + - spellcheck: Small change to cursed heart's spellbook description. + AzuleUtama: + - bugfix: RCD now gives visible messages when building without enough ammo or on + an invalid tile. + Citinited: + - bugfix: Fixes ghosts being able to make conveyors drain more power than they should. + Dave-TH: + - tweak: Space levels is named now. + Mitchs98: + - bugfix: Chemical implants now work and can be properly filled via beaker or syringe. + Reagents inside can also be syringed out. + Warior4356: + - rscadd: Thermal Drill, Diamond Tipped Thermal Drill, Safe Codes Paper, Safe Internals, + Gives Captain Floor Safe, Gives Captain Safe Codes, Safe-cracking Kit + - rscdel: Removed Captain's Digital Safe + - tweak: Changes safe contents + - soundadd: Added a safe drilling sound + - imageadd: Added drill and safe intenral sprites made by Shazbot194 +2018-11-10: + Citinited: + - bugfix: Prevents an infinite metal exploit using the autolathe. + - tweak: Minimum returnable metal of ammunition boxes has been lowered from 2000 + to 500. + Dovydas12345: + - bugfix: Fixes being unable to slice certain food grown by hydroponics (pineapple, + watermelon etc.) + Shazbot: + - imageadd: Some fancy new box sprites, props to Shazbot for the sprites + - imagedel: Old cuff box is gone + TDSSS: + - tweak: Quarantine is now its own lawset. +2018-11-11: + Azule Utama: + - bugfix: Borgs can no longer stunbaton into infinity. Their batons will now deactivate + if they have no power left after hitting someone and cannot be turned back on + until they recharge. + Eschess: + - bugfix: large cardboard boxes now show their size when examining + - bugfix: fulltile plasma glass windows now have armor + - tweak: rised plastitanium windows integrity + Farie82: + - bugfix: You can now hurt mining bots with welders on any attempt other than help + - bugfix: Can put suits and such back into the suit storage units + - spellcheck: Fixed the tank/magboots storage part being called Breathmask storage, + lazy copy pasta + Squirgenheimer: + - tweak: Hatched alien larvas will default to being created on the turf of the mob + instead of the mob's location, unless specifically allowed (like closets and + spacepods) + tigercat2000: + - rscadd: Ears are now an organ, which can be damaged, removed, and inserted! + - tweak: Human icon code should perform massively better. +2018-11-12: + Azule Utama: + - spellcheck: Fixed text errors in the descriptions for Booger cocktails and Feral + cat grenades. + Birdtalon: + - rscadd: Verb to check your own playtime. + CornMyCob: + - rscadd: You can now unwrench and move the library machines/computers, chem master, + chem heater, washing machine, pandemic and PDA painter + Farie82: + - bugfix: Added the pressure damage reduction to mining bots. No more killing machines + called mining bots. + variableundefined: + - rscadd: AI can now select the alien screen display + - tweak: Nearly every single sprite accessories (species customization option) has + been separated and refactored. Report missing hairstyle / screen / horns / frills + / tails etc. + - tweak: Desolate's peacekeeper fluff cyborg sprite is now his service sprite. +2018-11-13: + Birdtalon: + - bugfix: Fixes playtime self checker. + Certhic: + - bugfix: fixed a cigs runtime error + TDSSS: + - bugfix: Ancient station's lockdown is now lifted correctly. + - bugfix: Ancient station RD console can now be used. + craftxbox: + - bugfix: use mob voice instead of mob name for radios broadcasting signals. + datlo: + - bugfix: Prevent wizards from casting rod form inside the wizard den. diff --git a/html/changelogs/AutoChangeLog-pr-10096.yml b/html/changelogs/AutoChangeLog-pr-10096.yml deleted file mode 100644 index 648287f96cb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10096.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes exploit involving materials and the recycler" diff --git a/icons/effects/drill.dmi b/icons/effects/drill.dmi new file mode 100644 index 00000000000..c6935b39eed Binary files /dev/null and b/icons/effects/drill.dmi differ diff --git a/icons/mob/actions.dmi b/icons/mob/actions/actions.dmi similarity index 100% rename from icons/mob/actions.dmi rename to icons/mob/actions/actions.dmi diff --git a/icons/mob/actions/actions_mecha.dmi b/icons/mob/actions/actions_mecha.dmi new file mode 100644 index 00000000000..81c706b22c8 Binary files /dev/null and b/icons/mob/actions/actions_mecha.dmi differ diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index c833c6d66c2..0cfc59b0553 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi index b6d28330b69..48198ff0901 100644 Binary files a/icons/mob/body_accessory.dmi and b/icons/mob/body_accessory.dmi differ diff --git a/icons/mob/custom_synthetic/custom-synthetic.dmi b/icons/mob/custom_synthetic/custom-synthetic.dmi index 5b50438d6dd..d0e38f40a7d 100644 Binary files a/icons/mob/custom_synthetic/custom-synthetic.dmi and b/icons/mob/custom_synthetic/custom-synthetic.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 43e9a775ff2..b5444b2ff87 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 10badae1648..ff471760fe8 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 1455fa9ab0e..149a5ddc12c 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 d7e258376af..ec0d78a792f 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index 56c1730fd3a..60488151158 100644 Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ diff --git a/icons/mob/sprite_accessories/diona/diona_hair.dmi b/icons/mob/sprite_accessories/diona/diona_hair.dmi new file mode 100644 index 00000000000..1c29dbc3b4e Binary files /dev/null and b/icons/mob/sprite_accessories/diona/diona_hair.dmi differ diff --git a/icons/mob/sprite_accessories/drask/drask_body_markings.dmi b/icons/mob/sprite_accessories/drask/drask_body_markings.dmi new file mode 100644 index 00000000000..2a0ef5d32b5 Binary files /dev/null and b/icons/mob/sprite_accessories/drask/drask_body_markings.dmi differ diff --git a/icons/mob/sprite_accessories/grey/grey_body_markings.dmi b/icons/mob/sprite_accessories/grey/grey_body_markings.dmi new file mode 100644 index 00000000000..f24f23a5e1e Binary files /dev/null and b/icons/mob/sprite_accessories/grey/grey_body_markings.dmi differ diff --git a/icons/mob/sprite_accessories/human/human_body_markings.dmi b/icons/mob/sprite_accessories/human/human_body_markings.dmi new file mode 100644 index 00000000000..6495176fea2 Binary files /dev/null and b/icons/mob/sprite_accessories/human/human_body_markings.dmi differ diff --git a/icons/mob/sprite_accessories/human/human_facial_hair.dmi b/icons/mob/sprite_accessories/human/human_facial_hair.dmi new file mode 100644 index 00000000000..26f04a7a5fd Binary files /dev/null and b/icons/mob/sprite_accessories/human/human_facial_hair.dmi differ diff --git a/icons/mob/sprite_accessories/human/human_hair.dmi b/icons/mob/sprite_accessories/human/human_hair.dmi new file mode 100644 index 00000000000..0d5d01c3a3f Binary files /dev/null and b/icons/mob/sprite_accessories/human/human_hair.dmi differ diff --git a/icons/mob/sprite_accessories/ipc/ipc_face.dmi b/icons/mob/sprite_accessories/ipc/ipc_face.dmi new file mode 100644 index 00000000000..f98029b5297 Binary files /dev/null and b/icons/mob/sprite_accessories/ipc/ipc_face.dmi differ diff --git a/icons/mob/sprite_accessories/ipc/ipc_head_accessories.dmi b/icons/mob/sprite_accessories/ipc/ipc_head_accessories.dmi new file mode 100644 index 00000000000..e635f47c518 Binary files /dev/null and b/icons/mob/sprite_accessories/ipc/ipc_head_accessories.dmi differ diff --git a/icons/mob/sprite_accessories/ipc/ipc_optics.dmi b/icons/mob/sprite_accessories/ipc/ipc_optics.dmi new file mode 100644 index 00000000000..f6c534eaa2e Binary files /dev/null and b/icons/mob/sprite_accessories/ipc/ipc_optics.dmi differ diff --git a/icons/mob/sprite_accessories/kidan/kidan_body_markings.dmi b/icons/mob/sprite_accessories/kidan/kidan_body_markings.dmi new file mode 100644 index 00000000000..c25611a8868 Binary files /dev/null and b/icons/mob/sprite_accessories/kidan/kidan_body_markings.dmi differ diff --git a/icons/mob/sprite_accessories/kidan/kidan_hair.dmi b/icons/mob/sprite_accessories/kidan/kidan_hair.dmi new file mode 100644 index 00000000000..65820d3bf6e Binary files /dev/null and b/icons/mob/sprite_accessories/kidan/kidan_hair.dmi differ diff --git a/icons/mob/sprite_accessories/kidan/kidan_head_accessories.dmi b/icons/mob/sprite_accessories/kidan/kidan_head_accessories.dmi new file mode 100644 index 00000000000..cf578b68560 Binary files /dev/null and b/icons/mob/sprite_accessories/kidan/kidan_head_accessories.dmi differ diff --git a/icons/mob/sprite_accessories/kidan/kidan_head_markings.dmi b/icons/mob/sprite_accessories/kidan/kidan_head_markings.dmi new file mode 100644 index 00000000000..c5ec5348a60 Binary files /dev/null and b/icons/mob/sprite_accessories/kidan/kidan_head_markings.dmi differ diff --git a/icons/mob/sprite_accessories/nucleation/nucleation_face.dmi b/icons/mob/sprite_accessories/nucleation/nucleation_face.dmi new file mode 100644 index 00000000000..8ac1e0f4f05 Binary files /dev/null and b/icons/mob/sprite_accessories/nucleation/nucleation_face.dmi differ diff --git a/icons/mob/sprite_accessories/skrell/skrell_hair.dmi b/icons/mob/sprite_accessories/skrell/skrell_hair.dmi new file mode 100644 index 00000000000..e3fba69295f Binary files /dev/null and b/icons/mob/sprite_accessories/skrell/skrell_hair.dmi differ diff --git a/icons/mob/sprite_accessories/tajaran/tajaran_body_markings.dmi b/icons/mob/sprite_accessories/tajaran/tajaran_body_markings.dmi new file mode 100644 index 00000000000..799d2d7a72f Binary files /dev/null and b/icons/mob/sprite_accessories/tajaran/tajaran_body_markings.dmi differ diff --git a/icons/mob/sprite_accessories/tajaran/tajaran_facial_hair.dmi b/icons/mob/sprite_accessories/tajaran/tajaran_facial_hair.dmi new file mode 100644 index 00000000000..b584b6fa8fd Binary files /dev/null and b/icons/mob/sprite_accessories/tajaran/tajaran_facial_hair.dmi differ diff --git a/icons/mob/sprite_accessories/tajaran/tajaran_hair.dmi b/icons/mob/sprite_accessories/tajaran/tajaran_hair.dmi new file mode 100644 index 00000000000..dedf089392e Binary files /dev/null and b/icons/mob/sprite_accessories/tajaran/tajaran_hair.dmi differ diff --git a/icons/mob/sprite_accessories/tajaran/tajaran_head_accessories.dmi b/icons/mob/sprite_accessories/tajaran/tajaran_head_accessories.dmi new file mode 100644 index 00000000000..1d62570f0f7 Binary files /dev/null and b/icons/mob/sprite_accessories/tajaran/tajaran_head_accessories.dmi differ diff --git a/icons/mob/sprite_accessories/tajaran/tajaran_head_markings.dmi b/icons/mob/sprite_accessories/tajaran/tajaran_head_markings.dmi new file mode 100644 index 00000000000..fe9b6af8972 Binary files /dev/null and b/icons/mob/sprite_accessories/tajaran/tajaran_head_markings.dmi differ diff --git a/icons/mob/sprite_accessories/unathi/unathi_body_markings.dmi b/icons/mob/sprite_accessories/unathi/unathi_body_markings.dmi new file mode 100644 index 00000000000..a137874de9a Binary files /dev/null and b/icons/mob/sprite_accessories/unathi/unathi_body_markings.dmi differ diff --git a/icons/mob/sprite_accessories/unathi/unathi_facial_hair.dmi b/icons/mob/sprite_accessories/unathi/unathi_facial_hair.dmi new file mode 100644 index 00000000000..d39c143a8b8 Binary files /dev/null and b/icons/mob/sprite_accessories/unathi/unathi_facial_hair.dmi differ diff --git a/icons/mob/sprite_accessories/unathi/unathi_hair.dmi b/icons/mob/sprite_accessories/unathi/unathi_hair.dmi new file mode 100644 index 00000000000..48fdf4b5b68 Binary files /dev/null and b/icons/mob/sprite_accessories/unathi/unathi_hair.dmi differ diff --git a/icons/mob/sprite_accessories/unathi/unathi_head_markings.dmi b/icons/mob/sprite_accessories/unathi/unathi_head_markings.dmi new file mode 100644 index 00000000000..02d51448512 Binary files /dev/null and b/icons/mob/sprite_accessories/unathi/unathi_head_markings.dmi differ diff --git a/icons/mob/sprite_accessories/vox/vox_body_markings.dmi b/icons/mob/sprite_accessories/vox/vox_body_markings.dmi new file mode 100644 index 00000000000..fa802bb0ffe Binary files /dev/null and b/icons/mob/sprite_accessories/vox/vox_body_markings.dmi differ diff --git a/icons/mob/sprite_accessories/vox/vox_facial_hair.dmi b/icons/mob/sprite_accessories/vox/vox_facial_hair.dmi new file mode 100644 index 00000000000..f707601b09a Binary files /dev/null and b/icons/mob/sprite_accessories/vox/vox_facial_hair.dmi differ diff --git a/icons/mob/sprite_accessories/vox/vox_hair.dmi b/icons/mob/sprite_accessories/vox/vox_hair.dmi new file mode 100644 index 00000000000..fd3e47498fd Binary files /dev/null and b/icons/mob/sprite_accessories/vox/vox_hair.dmi differ diff --git a/icons/mob/sprite_accessories/vox/vox_tail_markings.dmi b/icons/mob/sprite_accessories/vox/vox_tail_markings.dmi new file mode 100644 index 00000000000..ca435a12ee9 Binary files /dev/null and b/icons/mob/sprite_accessories/vox/vox_tail_markings.dmi differ diff --git a/icons/mob/sprite_accessories/vox/vox_tail_markings2.dmi b/icons/mob/sprite_accessories/vox/vox_tail_markings2.dmi new file mode 100644 index 00000000000..70ef0d08f7e Binary files /dev/null and b/icons/mob/sprite_accessories/vox/vox_tail_markings2.dmi differ diff --git a/icons/mob/sprite_accessories/vulpkanin/vulpkanin_body_markings.dmi b/icons/mob/sprite_accessories/vulpkanin/vulpkanin_body_markings.dmi new file mode 100644 index 00000000000..08fa92e656d Binary files /dev/null and b/icons/mob/sprite_accessories/vulpkanin/vulpkanin_body_markings.dmi differ diff --git a/icons/mob/sprite_accessories/vulpkanin/vulpkanin_facial_hair.dmi b/icons/mob/sprite_accessories/vulpkanin/vulpkanin_facial_hair.dmi new file mode 100644 index 00000000000..ad992fbdfd7 Binary files /dev/null and b/icons/mob/sprite_accessories/vulpkanin/vulpkanin_facial_hair.dmi differ diff --git a/icons/mob/sprite_accessories/vulpkanin/vulpkanin_hair.dmi b/icons/mob/sprite_accessories/vulpkanin/vulpkanin_hair.dmi new file mode 100644 index 00000000000..ab84f128b5d Binary files /dev/null and b/icons/mob/sprite_accessories/vulpkanin/vulpkanin_hair.dmi differ diff --git a/icons/mob/sprite_accessories/vulpkanin/vulpkanin_head_markings.dmi b/icons/mob/sprite_accessories/vulpkanin/vulpkanin_head_markings.dmi new file mode 100644 index 00000000000..5943b1ef51c Binary files /dev/null and b/icons/mob/sprite_accessories/vulpkanin/vulpkanin_head_markings.dmi differ diff --git a/icons/mob/sprite_accessories/vulpkanin/vulpkanin_tail_markings.dmi b/icons/mob/sprite_accessories/vulpkanin/vulpkanin_tail_markings.dmi new file mode 100644 index 00000000000..28a247c39fe Binary files /dev/null and b/icons/mob/sprite_accessories/vulpkanin/vulpkanin_tail_markings.dmi differ diff --git a/icons/mob/sprite_accessories/wryn/wryn_face.dmi b/icons/mob/sprite_accessories/wryn/wryn_face.dmi new file mode 100644 index 00000000000..f826b969c57 Binary files /dev/null and b/icons/mob/sprite_accessories/wryn/wryn_face.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 354d0fbebf6..7ffa0461742 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 6ba24f30489..98c63155bd4 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index 4799f8736d2..0dbab70dd32 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 436d2fa3cea..ed4b3fa8627 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi index ec96b276ab6..2603a655bff 100644 Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 03ea5ef9684..02de48a6f41 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 4b53ea70f51..9284e790cf8 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 1206aa48dfc..f9c13a5c332 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index bd7a6ab837c..ddfe7ccb506 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index e1364852b9f..dfc7faf89df 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 6a211451466..4ff367c4cc3 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/obj/tank.dmi b/icons/obj/tank.dmi index e5eec2cf459..72cce42bd79 100644 Binary files a/icons/obj/tank.dmi and b/icons/obj/tank.dmi differ diff --git a/nano/templates/safe.tmpl b/nano/templates/safe.tmpl index 0e8bb29faa0..48e1616b968 100644 --- a/nano/templates/safe.tmpl +++ b/nano/templates/safe.tmpl @@ -33,14 +33,14 @@
    {{:helper.link('Left 10', 'arrow-left', {'increment': 10})}}
    {{:helper.link('Left 1', 'arrow-left', {'increment': 1})}}
    - {{if data.unlocked}} -
    {{:helper.link('Right 1', 'arrow-right', null, 'disabled')}}
    -
    {{:helper.link('Right 10', 'arrow-right', null, 'disabled')}}
    -
    {{:helper.link('Right 100', 'arrow-right', null, 'disabled')}}
    - {{else}} + {{if data.locked}}
    {{:helper.link('Right 1', 'arrow-right', {'decrement': 1})}}
    {{:helper.link('Right 10', 'arrow-right', {'decrement': 10})}}
    {{:helper.link('Right 50', 'arrow-right', {'decrement': 50})}}
    + {{else}} +
    {{:helper.link('Right 1', 'arrow-right', null, 'disabled')}}
    +
    {{:helper.link('Right 10', 'arrow-right', null, 'disabled')}}
    +
    {{:helper.link('Right 100', 'arrow-right', null, 'disabled')}}
    {{/if}}
diff --git a/paradise.dme b/paradise.dme index ade13f254d7..1cc0b71906a 100644 --- a/paradise.dme +++ b/paradise.dme @@ -326,6 +326,7 @@ #include "code\datums\helper_datums\topic_input.dm" #include "code\datums\looping_sounds\looping_sound.dm" #include "code\datums\looping_sounds\machinery_sounds.dm" +#include "code\datums\looping_sounds\thermal_drill.dm" #include "code\datums\looping_sounds\weather.dm" #include "code\datums\outfits\outfit.dm" #include "code\datums\outfits\outfit_admin.dm" @@ -697,6 +698,7 @@ #include "code\game\mecha\mech_bay.dm" #include "code\game\mecha\mech_fabricator.dm" #include "code\game\mecha\mecha.dm" +#include "code\game\mecha\mecha_actions.dm" #include "code\game\mecha\mecha_construction_paths.dm" #include "code\game\mecha\mecha_control_console.dm" #include "code\game\mecha\mecha_parts.dm" @@ -811,6 +813,7 @@ #include "code\game\objects\items\devices\scanners.dm" #include "code\game\objects\items\devices\sensor_device.dm" #include "code\game\objects\items\devices\taperecorder.dm" +#include "code\game\objects\items\devices\thermal_drill.dm" #include "code\game\objects\items\devices\traitordevices.dm" #include "code\game\objects\items\devices\transfer_valve.dm" #include "code\game\objects\items\devices\uplinks.dm" @@ -1318,6 +1321,7 @@ #include "code\modules\clothing\under\chameleon.dm" #include "code\modules\clothing\under\color.dm" #include "code\modules\clothing\under\miscellaneous.dm" +#include "code\modules\clothing\under\oldstation_uni.dm" #include "code\modules\clothing\under\pants.dm" #include "code\modules\clothing\under\shorts.dm" #include "code\modules\clothing\under\syndicate.dm" @@ -1474,6 +1478,7 @@ #include "code\modules\holiday\christmas.dm" #include "code\modules\holiday\holiday.dm" #include "code\modules\hydroponics\biogenerator.dm" +#include "code\modules\hydroponics\fermenting_barrel.dm" #include "code\modules\hydroponics\gene_modder.dm" #include "code\modules\hydroponics\grown.dm" #include "code\modules\hydroponics\growninedible.dm" @@ -1891,7 +1896,44 @@ #include "code\modules\mob\new_player\new_player.dm" #include "code\modules\mob\new_player\poll.dm" #include "code\modules\mob\new_player\preferences_setup.dm" -#include "code\modules\mob\new_player\sprite_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\sprite_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\diona\diona_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\drask\drask_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\grey\grey_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\human\human_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\human\human_facial_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\human\human_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\ipc\ipc_face.dm" +#include "code\modules\mob\new_player\sprite_accessories\ipc\ipc_head_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\ipc\ipc_optics.dm" +#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_head_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_head_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\nucleation\nucleation_face.dm" +#include "code\modules\mob\new_player\sprite_accessories\skrell\skrell_face.dm" +#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_facial_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_head_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_head_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_alt_heads.dm" +#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_facial_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_head_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_head_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\vox\vox_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\vox\vox_facial_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\vox\vox_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\vox\vox_tail_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_facial_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_head_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_head_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_tail_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\wryn\wryn_face.dm" #include "code\modules\modular_computers\laptop_vendor.dm" #include "code\modules\modular_computers\computers\item\computer.dm" #include "code\modules\modular_computers\computers\item\computer_components.dm" @@ -2249,6 +2291,7 @@ #include "code\modules\surgery\organs\autoimplanter.dm" #include "code\modules\surgery\organs\blood.dm" #include "code\modules\surgery\organs\body_egg.dm" +#include "code\modules\surgery\organs\ears.dm" #include "code\modules\surgery\organs\eyes.dm" #include "code\modules\surgery\organs\heart.dm" #include "code\modules\surgery\organs\helpers.dm" diff --git a/sound/Attributions.txt b/sound/Attributions.txt new file mode 100644 index 00000000000..262699e9c3f --- /dev/null +++ b/sound/Attributions.txt @@ -0,0 +1 @@ +items/thermal_drill.ogg was sampled from Builders Drilling.wav under a Sampling Plus 1.0 license. It was uploaded by Koops on 2010-05-10. Source (http://soundbible.com/1420-Builders-Drilling.html) \ No newline at end of file diff --git a/sound/items/thermal_drill.ogg b/sound/items/thermal_drill.ogg new file mode 100644 index 00000000000..035380dd5c9 Binary files /dev/null and b/sound/items/thermal_drill.ogg differ