diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/Academy.dmm index a7fab7df3a7..4d715cb369e 100644 --- a/_maps/RandomZLevels/Academy.dmm +++ b/_maps/RandomZLevels/Academy.dmm @@ -34,7 +34,7 @@ "aH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) "aI" = (/obj/structure/cult/tome,/obj/item/weapon/staff,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) "aJ" = (/obj/structure/stool/bed/chair/wood/wings{dir = 8},/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) -"aK" = (/obj/item/clothing/suit/space/rig/wizard,/obj/item/clothing/head/helmet/space/rig/wizard,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) +"aK" = (/obj/item/clothing/suit/space/hardsuit/wizard,/obj/item/clothing/head/helmet/space/hardsuit/wizard,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) "aL" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/briefcase,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) "aM" = (/obj/structure/table/reinforced,/obj/item/weapon/coin/plasma,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) "aN" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) @@ -126,7 +126,7 @@ "cv" = (/turf/simulated/floor/plating,/area/awaymission/academy/headmaster) "cw" = (/obj/machinery/door/window{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/academy/headmaster) "cx" = (/obj/structure/table,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/academy/headmaster) -"cy" = (/obj/structure/table,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/item/weapon/cable_coil/random,/turf/simulated/floor,/area/awaymission/academy/classrooms) +"cy" = (/obj/structure/table,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/item/stack/cable_coil/random,/turf/simulated/floor,/area/awaymission/academy/classrooms) "cz" = (/turf/simulated/floor{icon_state = "red"; dir = 8},/area/awaymission/academy/classrooms) "cA" = (/obj/item/target,/turf/simulated/floor/engine,/area/awaymission/academy/classrooms) "cB" = (/turf/simulated/floor{icon_state = "red"; dir = 4},/area/awaymission/academy/classrooms) @@ -255,7 +255,7 @@ "eU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/awaymission/academy/classrooms) "eV" = (/obj/structure/mineral_door/wood,/turf/simulated/floor{icon_state = "bar"},/area/awaymission/academy/classrooms) "eW" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor{icon_state = "escape"; dir = 6},/area/awaymission/academy/classrooms) -"eX" = (/obj/structure/table,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/weapon/reagent_containers/food/snacks/spellburger,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/awaymission/academy/classrooms) +"eX" = (/obj/structure/table,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/weapon/reagent_containers/food/snacks/burger/spell,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/awaymission/academy/classrooms) "eY" = (/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/awaymission/academy) "eZ" = (/obj/structure/window/reinforced,/turf/simulated/floor,/area/awaymission/academy/classrooms) "fa" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/classrooms) @@ -313,7 +313,7 @@ "ga" = (/obj/structure/table,/obj/item/weapon/pen/red,/turf/simulated/floor,/area/awaymission/academy/classrooms) "gb" = (/obj/structure/table,/obj/item/weapon/scalpel,/turf/simulated/floor{icon_state = "whitehall"; dir = 4},/area/awaymission/academy/classrooms) "gc" = (/obj/structure/stool/bed/chair/wood/normal,/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) -"gd" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/engineering_hacking,/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) +"gd" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/wiki/engineering_hacking,/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) "ge" = (/obj/structure/bookcase,/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) "gf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor{icon_state = "grimy"},/area/awaymission/academy/academyaft) "gg" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft) @@ -344,7 +344,7 @@ "gF" = (/obj/structure/window/reinforced,/obj/item/ammo_casing,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/awaymission/academy/classrooms) "gG" = (/mob/living/simple_animal/hostile/bear,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) "gH" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/hydroponics_pod_people,/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) -"gI" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/barman_recipes,/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) +"gI" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/barman_recipes,/obj/item/weapon/book/manual/wiki/security_space_law,/obj/item/weapon/book/manual/wiki/security_space_law,/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) "gJ" = (/obj/structure/stool,/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms) "gK" = (/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/awaymission/academy/classrooms) "gL" = (/obj/machinery/light/small{dir = 8},/mob/living/simple_animal/hostile/bear,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) @@ -403,18 +403,18 @@ "hM" = (/obj/structure/closet,/obj/item/candle,/obj/item/candle,/obj/item/weapon/storage/box/matches,/turf/simulated/floor,/area/awaymission/academy/academyaft) "hN" = (/obj/structure/closet,/obj/item/weapon/storage/belt/soulstone,/obj/item/clothing/under/schoolgirl,/turf/simulated/floor,/area/awaymission/academy/academyaft) "hO" = (/obj/structure/closet,/obj/item/clothing/under/blackskirt,/obj/item/clothing/glasses/regular,/turf/simulated/floor,/area/awaymission/academy/academyaft) -"hP" = (/obj/structure/closet,/obj/item/clothing/under/lightpurple,/obj/item/clothing/shoes/sandal,/turf/simulated/floor,/area/awaymission/academy/academyaft) +"hP" = (/obj/structure/closet,/obj/item/clothing/under/color/lightpurple,/obj/item/clothing/shoes/sandal,/turf/simulated/floor,/area/awaymission/academy/academyaft) "hQ" = (/obj/structure/closet,/obj/item/weapon/lipstick/random,/obj/item/clothing/under/schoolgirl,/turf/simulated/floor,/area/awaymission/academy/academyaft) "hR" = (/turf/simulated/floor/wood,/area/awaymission/academy/academyaft) -"hS" = (/obj/structure/closet,/obj/item/clothing/under/lightpurple,/obj/item/weapon/staff,/turf/simulated/floor,/area/awaymission/academy/academyaft) +"hS" = (/obj/structure/closet,/obj/item/clothing/under/color/lightpurple,/obj/item/weapon/staff,/turf/simulated/floor,/area/awaymission/academy/academyaft) "hT" = (/obj/structure/closet,/obj/item/weapon/storage/wallet/random,/obj/item/clothing/glasses/regular/hipster,/turf/simulated/floor,/area/awaymission/academy/academyaft) "hU" = (/obj/structure/closet,/obj/item/clothing/head/wizard/fake,/obj/item/clothing/suit/wizrobe/fake,/turf/simulated/floor,/area/awaymission/academy/academyaft) -"hV" = (/obj/structure/closet,/obj/item/weapon/reagent_containers/food/drinks/beer,/obj/item/clothing/under/purple,/obj/item/weapon/contraband/poster,/turf/simulated/floor,/area/awaymission/academy/academyaft) +"hV" = (/obj/structure/closet,/obj/item/weapon/reagent_containers/food/drinks/beer,/obj/item/clothing/under/color/purple,/obj/item/weapon/contraband/poster,/turf/simulated/floor,/area/awaymission/academy/academyaft) "hW" = (/obj/structure/closet,/obj/item/weapon/storage/box/snappops,/obj/item/weapon/storage/backpack,/obj/item/weapon/paper{info = "Current Grade: F. Educator's Notes: No improvement shown despite multiple private lessons. Suggest additional tutilage."; name = "Pyromancy Evaluation"},/turf/simulated/floor,/area/awaymission/academy/academyaft) "hX" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft) "hY" = (/obj/effect/decal/cleanable/oil,/turf/simulated/floor,/area/awaymission/academy/academyaft) "hZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor,/area/awaymission/academy/academyaft) -"ia" = (/obj/item/weapon/cable_coil/random,/turf/simulated/floor{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft) +"ia" = (/obj/item/stack/cable_coil/random,/turf/simulated/floor{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft) "ib" = (/obj/structure/rack,/obj/item/stack/sheet/mineral/plasma{amount = 50},/turf/simulated/floor{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft) "ic" = (/turf/simulated/floor/grass,/area/awaymission/academy/academyaft) "id" = (/obj/structure/rack,/obj/item/weapon/circuitboard/telecomms/broadcaster,/obj/item/weapon/circuitboard/telecomms/receiver,/obj/item/weapon/circuitboard/telecomms/relay,/turf/simulated/floor{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft) @@ -442,7 +442,7 @@ "iz" = (/obj/machinery/power/port_gen/pacman,/turf/simulated/floor{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft) "iA" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/awaymission/academy/academyaft) "iB" = (/obj/item/weapon/paper,/turf/simulated/floor/wood,/area/awaymission/academy/academyaft) -"iC" = (/obj/item/weapon/cable_coil/random,/turf/simulated/floor,/area/awaymission/academy/academyaft) +"iC" = (/obj/item/stack/cable_coil/random,/turf/simulated/floor,/area/awaymission/academy/academyaft) "iD" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/plating,/area/awaymission/academy/academyaft) "iE" = (/obj/item/device/multitool,/turf/simulated/floor/engine,/area/awaymission/academy/academyaft) "iF" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/engine,/area/awaymission/academy/academyaft) @@ -517,7 +517,7 @@ "jW" = (/turf/simulated/floor/plating,/area/awaymission/academy/academygate) "jX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/academygate) "jY" = (/obj/machinery/power/apc{dir = 1; environ = 3; equipment = 3; locked = 0; req_access = ""},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/carpet,/area/awaymission/academy/academygate) -"jZ" = (/obj/item/weapon/cable_coil/random,/turf/simulated/floor/plating,/area/awaymission/academy/academygate) +"jZ" = (/obj/item/stack/cable_coil/random,/turf/simulated/floor/plating,/area/awaymission/academy/academygate) "ka" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/awaymission/academy/academygate) "kb" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/academy/academygate) "kc" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/academygate) diff --git a/_maps/RandomZLevels/blackmarketpackers.dmm b/_maps/RandomZLevels/blackmarketpackers.dmm index f127a7c95d0..12f9ed60419 100644 --- a/_maps/RandomZLevels/blackmarketpackers.dmm +++ b/_maps/RandomZLevels/blackmarketpackers.dmm @@ -291,7 +291,7 @@ "fE" = (/turf/simulated/floor{icon_state = "bar"},/area/awaymission/BMPship/Aft) "fF" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft) "fG" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"},/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft) -"fH" = (/obj/structure/rack,/obj/item/weapon/cell/high,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/awaymission/BMPship/Aft) +"fH" = (/obj/structure/rack,/obj/item/weapon/stock_parts/cell/high,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/awaymission/BMPship/Aft) "fI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft) "fJ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore) "fK" = (/turf/simulated/floor{tag = "icon-carpetside (SOUTHWEST)"; icon_state = "carpetside"; dir = 10},/area/awaymission/BMPship/Fore) @@ -320,7 +320,7 @@ "gh" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "bar"},/area/awaymission/BMPship/Aft) "gi" = (/obj/structure/mopbucket,/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft) "gj" = (/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/kitchenknife,/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft) -"gk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/item/weapon/cell/high,/turf/simulated/floor,/area/awaymission/BMPship/Aft) +"gk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/item/weapon/stock_parts/cell/high,/turf/simulated/floor,/area/awaymission/BMPship/Aft) "gl" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/awaymission/BMPship/Fore) "gm" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor{tag = "icon-carpetside"; icon_state = "carpetside"},/area/awaymission/BMPship/Fore) "gn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor{tag = "icon-carpetside"; icon_state = "carpetside"},/area/awaymission/BMPship/Fore) @@ -335,7 +335,7 @@ "gw" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft) "gx" = (/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft) "gy" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft) -"gz" = (/obj/item/weapon/cable_coil,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) +"gz" = (/obj/item/stack/cable_coil,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) "gA" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft) "gB" = (/obj/item/stack/sheet/mineral/uranium{amount = 50},/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft) "gC" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/space) @@ -357,7 +357,7 @@ "gS" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/awaymission/BMPship/Fore) "gT" = (/obj/item/weapon/shard,/turf/simulated/floor/plating/airless{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/awaymission/BMPship/Fore) "gU" = (/obj/structure/stool,/turf/simulated/floor/plating/airless{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/awaymission/BMPship/Fore) -"gV" = (/obj/item/weapon/cable_coil{amount = 5},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Fore) +"gV" = (/obj/item/stack/cable_coil{amount = 5},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Fore) "gW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Fore) "gX" = (/turf/simulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/awaymission/BMPship/Midship) "gY" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{icon_state = "bar"},/area/awaymission/BMPship/Midship) @@ -405,7 +405,7 @@ "hO" = (/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/awaymission) "hP" = (/obj/item/apc_frame,/turf/simulated/floor/plating/airless,/area/awaymission) "hQ" = (/obj/structure/ore_box,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless,/area/awaymission) -"hR" = (/obj/item/weapon/cable_coil{amount = 5},/turf/simulated/floor/plating/airless,/area/awaymission) +"hR" = (/obj/item/stack/cable_coil{amount = 5},/turf/simulated/floor/plating/airless,/area/awaymission) "hS" = (/obj/structure/ore_box,/turf/simulated/floor/plating/airless,/area/awaymission) "hT" = (/obj/machinery/computer/arcade,/turf/simulated/floor,/area/awaymission/BMPship/Aft) "hU" = (/obj/effect/decal/remains/human,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/awaymission/BMPship/Aft) diff --git a/_maps/RandomZLevels/centcomAway.dmm b/_maps/RandomZLevels/centcomAway.dmm index e47775466b6..bacbe6b4aa9 100644 --- a/_maps/RandomZLevels/centcomAway.dmm +++ b/_maps/RandomZLevels/centcomAway.dmm @@ -602,12 +602,12 @@ "lD" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/simulated/floor{icon_state = "white"},/area/awaymission/centcomAway/thunderdome) "lE" = (/turf/simulated/floor{icon_state = "white"},/area/awaymission/centcomAway/thunderdome) "lF" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor{icon_state = "white"},/area/awaymission/centcomAway/thunderdome) -"lG" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/hatchet,/obj/item/weapon/shield/riot,/turf/simulated/floor{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome) +"lG" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/hatchet,/obj/item/weapon/shield/riot,/turf/simulated/floor{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome) "lH" = (/turf/simulated/floor{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome) "lI" = (/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plating,/area/awaymission/centcomAway/thunderdome) "lJ" = (/obj/machinery/door/poddoor{id = "XCCtdome"; name = "XCC Thunderdome"},/turf/simulated/floor{icon_state = "delivery"},/area/awaymission/centcomAway/thunderdome) "lK" = (/obj/machinery/igniter,/turf/simulated/floor{icon_state = "floor"},/area/awaymission/centcomAway/thunderdome) -"lL" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/hatchet,/obj/item/weapon/shield/riot,/turf/simulated/floor{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome) +"lL" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/hatchet,/obj/item/weapon/shield/riot,/turf/simulated/floor{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome) "lM" = (/obj/structure/table/reinforced,/obj/item/device/taperecorder,/obj/item/device/tape/random,/turf/simulated/floor{icon_state = "floor"},/area/awaymission/centcomAway/general) "lN" = (/obj/structure/mirror{pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/awaymission/centcomAway/thunderdome) "lO" = (/obj/machinery/door/airlock/centcom{name = "Centcom Security"; opacity = 1; req_access_txt = "101"},/turf/simulated/floor{icon_state = "white"},/area/awaymission/centcomAway/courtroom) diff --git a/_maps/RandomZLevels/challenge.dmm b/_maps/RandomZLevels/challenge.dmm index 5e560a3c08d..a80f1112962 100644 --- a/_maps/RandomZLevels/challenge.dmm +++ b/_maps/RandomZLevels/challenge.dmm @@ -102,7 +102,7 @@ "bX" = (/obj/machinery/door_control{id = "challenge"; name = "Gateway Lockdown"; pixel_x = -4; pixel_y = 26; req_access_txt = "0"},/turf/simulated/floor/carpet,/area/awaymission/challenge/end) "bY" = (/turf/simulated/floor/carpet,/area/awaymission/challenge/end) "bZ" = (/obj/structure/mirror{pixel_y = 28},/turf/simulated/floor/wood,/area/awaymission/challenge/end) -"ca" = (/obj/machinery/light{dir = 1},/obj/structure/rack,/obj/item/clothing/suit/armor/swat,/obj/item/clothing/head/helmet/space/deathsquad,/turf/simulated/floor/wood,/area/awaymission/challenge/end) +"ca" = (/obj/machinery/light{dir = 1},/obj/structure/rack,/obj/item/clothing/suit/armor/heavy,/obj/item/clothing/head/helmet/space/deathsquad,/turf/simulated/floor/wood,/area/awaymission/challenge/end) "cb" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/challenge/end) "cc" = (/obj/structure/stool/bed/chair{dir = 1},/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor{icon_state = "dark"},/area/awaymission/challenge/end) "cd" = (/turf/simulated/floor{icon_state = "dark"},/area/awaymission/challenge/end) @@ -121,7 +121,7 @@ "cq" = (/obj/structure/table/woodentable,/obj/item/weapon/melee/chainofcommand,/obj/item/weapon/stamp,/turf/simulated/floor/carpet,/area/awaymission/challenge/end) "cr" = (/obj/structure/table/woodentable,/obj/item/weapon/paper{info = "Congratulations,

Your station has been selected to carry out the Gateway Project.

The equipment will be shipped to you at the start of the next quarter.
You are to prepare a secure location to house the equipment as outlined in the attached documents.

--Nanotrasen Blue Space Research"; name = "Confidential Correspondence, Pg 1"; pixel_x = 0; pixel_y = 0},/obj/item/weapon/folder/blue,/turf/simulated/floor/carpet,/area/awaymission/challenge/end) "cs" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/carpet,/area/awaymission/challenge/end) -"ct" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/automatic/silenced,/turf/simulated/floor/wood,/area/awaymission/challenge/end) +"ct" = (/obj/structure/rack,/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced,/turf/simulated/floor/wood,/area/awaymission/challenge/end) "cu" = (/mob/living/simple_animal/hostile/syndicate/melee,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/challenge/end) "cv" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/wood,/area/awaymission/challenge/end) "cw" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/automatic/l6_saw,/turf/simulated/floor/wood,/area/awaymission/challenge/end) diff --git a/_maps/RandomZLevels/example.dmm b/_maps/RandomZLevels/example.dmm index e1920ee74b8..01c640a1847 100644 --- a/_maps/RandomZLevels/example.dmm +++ b/_maps/RandomZLevels/example.dmm @@ -89,7 +89,7 @@ "bK" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4},/turf/simulated/floor{icon_state = "bar"},/area/awaymission/example) "bL" = (/obj/structure/table/woodentable,/turf/simulated/floor{icon_state = "bar"},/area/awaymission/example) "bM" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (WEST)"; icon_state = "wooden_chair"; dir = 8},/turf/simulated/floor{icon_state = "bar"},/area/awaymission/example) -"bN" = (/obj/structure/bookcase{density = 0; pixel_y = 32},/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor{icon_state = "bar"},/area/awaymission/example) +"bN" = (/obj/structure/bookcase{density = 0; pixel_y = 32},/obj/item/weapon/book/manual/wiki/security_space_law,/obj/item/weapon/book/manual/wiki/security_space_law,/turf/simulated/floor{icon_state = "bar"},/area/awaymission/example) "bO" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/bottle/wine,/turf/simulated/floor{icon_state = "bar"},/area/awaymission/example) "bP" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1},/turf/simulated/floor{icon_state = "bar"},/area/awaymission/example) "bQ" = (/obj/machinery/vending/snack,/turf/simulated/floor,/area/awaymission/example) @@ -101,7 +101,7 @@ "bW" = (/obj/structure/table,/obj/item/device/analyzer,/turf/simulated/floor,/area/awaymission/example) "bX" = (/obj/structure/table,/obj/item/weapon/rack_parts,/turf/simulated/floor,/area/awaymission/example) "bY" = (/obj/structure/table,/obj/item/device/toner,/turf/simulated/floor,/area/awaymission/example) -"bZ" = (/obj/structure/table,/obj/item/weapon/wirecutters,/obj/item/weapon/cable_coil/yellow,/turf/simulated/floor,/area/awaymission/example) +"bZ" = (/obj/structure/table,/obj/item/weapon/wirecutters,/obj/item/stack/cable_coil/yellow,/turf/simulated/floor,/area/awaymission/example) "ca" = (/obj/structure/table,/obj/item/weapon/wrench,/turf/simulated/floor,/area/awaymission/example) "cb" = (/obj/machinery/vending/assist,/turf/simulated/floor,/area/awaymission/example) "cc" = (/obj/structure/ladder{id = "example"},/turf/simulated/floor/plating,/area/awaymission/example) @@ -123,7 +123,7 @@ "cs" = (/obj/effect/landmark{name = "awaystart"},/obj/machinery/light_construct/small{tag = "icon-bulb-construct-stage1 (WEST)"; icon_state = "bulb-construct-stage1"; dir = 8},/turf/simulated/floor,/area/awaymission/example) "ct" = (/obj/effect/landmark{name = "awaystart"},/obj/item/weapon/mop,/turf/simulated/floor,/area/awaymission/example) "cu" = (/obj/structure/closet,/turf/simulated/floor,/area/awaymission/example) -"cv" = (/obj/structure/table,/obj/item/weapon/cell/high,/turf/simulated/floor,/area/awaymission/example) +"cv" = (/obj/structure/table,/obj/item/weapon/stock_parts/cell/high,/turf/simulated/floor,/area/awaymission/example) "cw" = (/obj/structure/stool,/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor,/area/awaymission/example) "cx" = (/obj/structure/mopbucket,/obj/machinery/light_construct/small{dir = 4},/turf/simulated/floor,/area/awaymission/example) diff --git a/_maps/RandomZLevels/listeningpost.dmm b/_maps/RandomZLevels/listeningpost.dmm index 4edd744fc31..0848187f530 100644 --- a/_maps/RandomZLevels/listeningpost.dmm +++ b/_maps/RandomZLevels/listeningpost.dmm @@ -15,7 +15,7 @@ "o" = (/obj/structure/table,/obj/item/weapon/paper{info = "Nothing of interest to report."; name = "november report"},/obj/item/weapon/pen,/turf/simulated/floor,/area/awaymission/listeningpost) "p" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/simulated/floor,/area/awaymission/listeningpost) "q" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate,/obj/item/clothing/mask/gas,/obj/item/clothing/head/helmet/space/syndicate,/turf/simulated/floor,/area/awaymission/listeningpost) -"r" = (/obj/machinery/door/airlock,/obj/structure/safe/floor,/obj/item/weapon/paper{info = "I wonder how much longer they will accept my empty reports. They will cancel the case soon without results. When the pickup comes, I will tell them I have lost faith in our cause, and beg them to consider a diplomatic solution. How many nuclear teams have been dispatched with those nukes? I must try and prevent more from ever being sent. If they will not listen to reason, I will detonate the warehouse myself. Maybe some day in the immediate future, space will be peaceful, though I don't intend to live to see it. And that is why I write this down- it is my sacrifice that stabilised your worlds, traveller. Spare a thought for me, and please attempt to prevent nuclear proliferation, should it ever rear it's ugly head again. -Donk Co. Operative #451"; name = "odd report"},/obj/item/weapon/gun/projectile/automatic/silenced,/obj/item/weapon/silencer,/turf/simulated/floor,/area/awaymission/listeningpost) +"r" = (/obj/machinery/door/airlock,/obj/structure/safe/floor,/obj/item/weapon/paper{info = "I wonder how much longer they will accept my empty reports. They will cancel the case soon without results. When the pickup comes, I will tell them I have lost faith in our cause, and beg them to consider a diplomatic solution. How many nuclear teams have been dispatched with those nukes? I must try and prevent more from ever being sent. If they will not listen to reason, I will detonate the warehouse myself. Maybe some day in the immediate future, space will be peaceful, though I don't intend to live to see it. And that is why I write this down- it is my sacrifice that stabilised your worlds, traveller. Spare a thought for me, and please attempt to prevent nuclear proliferation, should it ever rear it's ugly head again. -Donk Co. Operative #451"; name = "odd report"},/obj/item/weapon/gun/projectile/automatic/pistol,/turf/simulated/floor,/area/awaymission/listeningpost) "s" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/mineral,/area/mine/unexplored) "t" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/mineral,/area/mine/unexplored) "u" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plating/airless,/area/space) diff --git a/_maps/RandomZLevels/spacebattle.dmm b/_maps/RandomZLevels/spacebattle.dmm index d156e3644fa..2bc373f7cf5 100644 --- a/_maps/RandomZLevels/spacebattle.dmm +++ b/_maps/RandomZLevels/spacebattle.dmm @@ -10,21 +10,21 @@ "aj" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) "ak" = (/obj/machinery/door/airlock/external,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) "al" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) -"am" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/space/rig/syndi,/obj/item/clothing/head/helmet/space/rig/syndi,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) +"am" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/space/hardsuit/syndi,/obj/item/clothing/head/helmet/space/hardsuit/syndi,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) "an" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) "ao" = (/obj/machinery/sleeper,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) "ap" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) "aq" = (/mob/living/simple_animal/hostile/syndicate/melee,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) "ar" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) "as" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/empgrenade,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) -"at" = (/obj/structure/table/reinforced,/obj/item/ammo_casing/a12mm,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) +"at" = (/obj/structure/table/reinforced,/obj/item/ammo_casing/c10mm,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) "au" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) "av" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate3) "aw" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r (NORTH)"; icon_state = "propulsion_r"; dir = 1},/turf/space,/area/awaymission/spacebattle/syndicate3) "ax" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (NORTH)"; icon_state = "propulsion"; dir = 1},/turf/space,/area/awaymission/spacebattle/syndicate3) "ay" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (NORTH)"; icon_state = "propulsion_l"; dir = 1},/turf/space,/area/awaymission/spacebattle/syndicate3) "az" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate3) -"aA" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/projectile/automatic/silenced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) +"aA" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/projectile/automatic/pistol,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) "aB" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/awaymission/spacebattle/syndicate3) "aC" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (NORTH)"; icon_state = "heater"; dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/syndicate3) "aD" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate3) @@ -33,7 +33,7 @@ "aG" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate2) "aH" = (/obj/structure/stool/bed/chair,/mob/living/simple_animal/hostile/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) "aI" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate2) -"aJ" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/space/rig/syndi,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate3) +"aJ" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/space/hardsuit/syndi,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate3) "aK" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate3) "aL" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/projectile/automatic/deagle,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate3) "aM" = (/obj/machinery/computer/shuttle,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) @@ -57,7 +57,7 @@ "be" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate1) "bf" = (/obj/machinery/porta_turret{dir = 8; emagged = 1; installation = /obj/item/weapon/gun/energy/lasercannon},/turf/simulated/floor/plating,/area/awaymission/spacebattle/syndicate2) "bg" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate3) -"bh" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/space/rig/syndi,/obj/item/clothing/head/helmet/space/rig/syndi,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate1) +"bh" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/space/hardsuit/syndi,/obj/item/clothing/head/helmet/space/hardsuit/syndi,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate1) "bi" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate1) "bj" = (/obj/structure/table/reinforced,/obj/item/clothing/gloves/combat,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate1) "bk" = (/obj/machinery/sleeper,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate1) @@ -126,9 +126,9 @@ "cv" = (/turf/simulated/shuttle/wall{tag = "icon-swallc1"; icon_state = "swallc1"},/area/awaymission/spacebattle/cruiser) "cw" = (/turf/simulated/shuttle/wall{tag = "icon-swallc2"; icon_state = "swallc2"},/area/awaymission/spacebattle/cruiser) "cx" = (/obj/machinery/power/smes/magical{desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; name = "power storage unit"},/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) -"cy" = (/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor{tag = "icon-damaged2"; icon_state = "damaged2"},/area/awaymission/spacebattle/cruiser) -"cz" = (/obj/item/stack/sheet/metal,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) -"cA" = (/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) +"cy" = (/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/turf/simulated/floor{tag = "icon-damaged2"; icon_state = "damaged2"},/area/awaymission/spacebattle/cruiser) +"cz" = (/obj/item/stack/sheet/metal,/obj/item/ammo_casing/c10mm,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) +"cA" = (/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "cB" = (/obj/structure/closet/cabinet,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "cC" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "cD" = (/obj/machinery/vending/cigarette,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) @@ -141,8 +141,8 @@ "cK" = (/obj/structure/table/reinforced,/obj/machinery/microwave,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/awaymission/spacebattle/cruiser) "cL" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "cM" = (/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) -"cN" = (/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) -"cO" = (/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) +"cN" = (/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) +"cO" = (/obj/item/ammo_casing/c10mm,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "cP" = (/turf/simulated/floor{tag = "icon-damaged2"; icon_state = "damaged2"},/area/awaymission/spacebattle/cruiser) "cQ" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "cR" = (/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/awaymission/spacebattle/cruiser) @@ -276,9 +276,9 @@ "fp" = (/obj/structure/closet/crate,/obj/item/clothing/glasses/material,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "fq" = (/obj/structure/closet/crate,/obj/item/weapon/light/tube,/obj/item/weapon/light/tube,/obj/item/weapon/light/tube,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "fr" = (/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) -"fs" = (/obj/effect/landmark/corpse/syndicatesoldier,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/effect/decal/cleanable/blood,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) -"ft" = (/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) -"fu" = (/obj/effect/landmark/corpse/bridgeofficer{mobname = "Walter Strider"; name = "Walter Strider"},/obj/item/weapon/gun/projectile/shotgun/combat,/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/effect/decal/cleanable/blood,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) +"fs" = (/obj/effect/landmark/corpse/syndicatesoldier,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/obj/effect/decal/cleanable/blood,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) +"ft" = (/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) +"fu" = (/obj/effect/landmark/corpse/bridgeofficer{mobname = "Walter Strider"; name = "Walter Strider"},/obj/item/weapon/gun/projectile/shotgun/combat,/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/obj/effect/decal/cleanable/blood,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) "fv" = (/obj/item/ammo_casing/shotgun,/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/awaymission/spacebattle/cruiser) "fw" = (/obj/item/ammo_casing/a357,/obj/item/ammo_casing/a357,/obj/item/weapon/gun/projectile/revolver/mateba,/obj/effect/landmark/corpse/commander{mobname = "Aaron Bowden"; name = "Aaron Bowden"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "fx" = (/obj/structure/stool/bed/chair{dir = 4},/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) @@ -297,11 +297,11 @@ "fK" = (/obj/structure/artilleryplaceholder{tag = "icon-12"; icon_state = "12"},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) "fL" = (/obj/structure/closet/crate/internals,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/storage/firstaid/o2,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "fM" = (/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) -"fN" = (/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) -"fO" = (/obj/item/ammo_casing/shotgun,/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) +"fN" = (/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) +"fO" = (/obj/item/ammo_casing/shotgun,/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) "fP" = (/obj/item/ammo_casing/shotgun,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) -"fQ" = (/obj/effect/landmark/corpse/syndicatesoldier,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/effect/decal/cleanable/blood,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) -"fR" = (/obj/item/ammo_casing/a12mm,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/awaymission/spacebattle/cruiser) +"fQ" = (/obj/effect/landmark/corpse/syndicatesoldier,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/obj/effect/decal/cleanable/blood,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) +"fR" = (/obj/item/ammo_casing/c10mm,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/awaymission/spacebattle/cruiser) "fS" = (/obj/machinery/computer/communications,/turf/simulated/floor{tag = "icon-bluefull"; icon_state = "bluefull"},/area/awaymission/spacebattle/cruiser) "fT" = (/obj/structure/artilleryplaceholder{tag = "icon-13"; icon_state = "13"},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) "fU" = (/obj/structure/artilleryplaceholder{tag = "icon-14"; icon_state = "14"},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) @@ -382,7 +382,7 @@ "hr" = (/obj/structure/largecrate,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "hs" = (/obj/structure/closet/crate/secure/plasma,/obj/item/weapon/tank/plasma,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "ht" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/fire,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) -"hu" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig,/obj/item/clothing/head/helmet/space/rig,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) +"hu" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit,/obj/item/clothing/head/helmet/space/hardsuit,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "hv" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/awaymission/spacebattle/cruiser) "hw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/engine,/area/awaymission/spacebattle/cruiser) "hx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/engine,/area/awaymission/spacebattle/cruiser) @@ -390,7 +390,7 @@ "hz" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (WEST)"; icon_state = "propulsion_l"; dir = 8},/turf/space,/area/awaymission/spacebattle/syndicate7) "hA" = (/obj/structure/largecrate,/mob/living/simple_animal/corgi/puppy,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "hB" = (/obj/structure/closet/crate,/obj/item/weapon/paint/anycolor,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) -"hC" = (/obj/structure/closet/crate,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) +"hC" = (/obj/structure/closet/crate,/obj/item/weapon/stock_parts/cell/high,/obj/item/weapon/stock_parts/cell/high,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "hD" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "hE" = (/obj/structure/closet/crate/medical,/obj/item/weapon/tank/anesthetic,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "hF" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor{icon_state = "white"},/area/awaymission/spacebattle/cruiser) @@ -428,7 +428,7 @@ "il" = (/mob/living/simple_animal/hostile/syndicate/ranged/space,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacebattle/cruiser) "im" = (/obj/effect/landmark/corpse/doctor{mobname = "Herbert West"; name = "Herbert West"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor{icon_state = "white"},/area/awaymission/spacebattle/cruiser) "in" = (/obj/effect/landmark/corpse/engineer{mobname = "Carth Robinson"; name = "Carth Robinson"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacebattle/cruiser) -"io" = (/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacebattle/cruiser) +"io" = (/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacebattle/cruiser) "ip" = (/obj/machinery/sleeper,/turf/simulated/floor{icon_state = "white"},/area/awaymission/spacebattle/cruiser) "iq" = (/obj/machinery/sleep_console,/turf/simulated/floor{icon_state = "white"},/area/awaymission/spacebattle/cruiser) "ir" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate7) @@ -484,7 +484,7 @@ "jp" = (/turf/simulated/wall/mineral/plasma,/area/awaymission/spacebattle/secret) "jq" = (/turf/simulated/floor{tag = "icon-alienvault"; icon_state = "alienvault"},/area/awaymission/spacebattle/secret) "jr" = (/obj/machinery/door/airlock/plasma,/turf/simulated/wall/mineral/plasma,/area/awaymission/spacebattle/secret) -"js" = (/obj/item/clothing/suit/space/rig/wizard,/obj/item/clothing/head/helmet/space/rig/wizard,/turf/simulated/floor{tag = "icon-alienvault"; icon_state = "alienvault"},/area/awaymission/spacebattle/secret) +"js" = (/obj/item/clothing/suit/space/hardsuit/wizard,/obj/item/clothing/head/helmet/space/hardsuit/wizard,/turf/simulated/floor{tag = "icon-alienvault"; icon_state = "alienvault"},/area/awaymission/spacebattle/secret) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/RandomZLevels/spacehotel.dmm b/_maps/RandomZLevels/spacehotel.dmm index 2b2ec65d76a..37119d795d7 100644 --- a/_maps/RandomZLevels/spacehotel.dmm +++ b/_maps/RandomZLevels/spacehotel.dmm @@ -5,7 +5,7 @@ "ae" = (/obj/machinery/power/apc{step_y = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/unsimulated/wall,/area/awaymission) "af" = (/obj/machinery/power/terminal,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/awaymission) "ag" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/awaymission) -"ah" = (/obj/item/weapon/cable_coil/random,/obj/effect/decal/remains/human,/turf/simulated/floor/plating,/area/awaymission) +"ah" = (/obj/item/stack/cable_coil/random,/obj/effect/decal/remains/human,/turf/simulated/floor/plating,/area/awaymission) "ai" = (/turf/simulated/floor/plating,/area/awaymission) "aj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/awaymission) "ak" = (/obj/machinery/power/smes/magical,/turf/simulated/shuttle/plating,/area/awaymission) @@ -188,7 +188,7 @@ "dF" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor,/area/awaymission) "dG" = (/obj/structure/kitchenspike,/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/awaymission) "dH" = (/obj/machinery/door/airlock,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor,/area/awaymission) -"dI" = (/obj/item/weapon/bananapeel,/obj/item/toy/spinningtoy,/turf/simulated/floor/carpet,/area/awaymission) +"dI" = (/obj/item/weapon/grown/bananapeel,/obj/item/toy/spinningtoy,/turf/simulated/floor/carpet,/area/awaymission) "dJ" = (/obj/structure/barricade/wooden,/turf/simulated/floor/carpet,/area/awaymission) "dK" = (/obj/item/target/syndicate,/turf/simulated/floor/carpet,/area/awaymission) "dL" = (/obj/item/trash/candy,/turf/simulated/floor/carpet,/area/awaymission) diff --git a/_maps/RandomZLevels/stationCollision.dmm b/_maps/RandomZLevels/stationCollision.dmm index f25531c9396..878dbb8e934 100644 --- a/_maps/RandomZLevels/stationCollision.dmm +++ b/_maps/RandomZLevels/stationCollision.dmm @@ -61,7 +61,7 @@ "bi" = (/obj/machinery/vending/cola,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/syndishuttle) "bj" = (/obj/machinery/vending/cigarette,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/syndishuttle) "bk" = (/obj/machinery/vending/coffee,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/syndishuttle) -"bl" = (/obj/structure/closet/syndicate,/obj/item/clothing/suit/space/rig/syndi,/obj/item/clothing/head/helmet/space/rig/syndi,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/syndishuttle) +"bl" = (/obj/structure/closet/syndicate,/obj/item/clothing/suit/space/hardsuit/syndi,/obj/item/clothing/head/helmet/space/hardsuit/syndi,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/syndishuttle) "bm" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/syndishuttle) "bn" = (/obj/structure/closet/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/syndishuttle) "bo" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/awaymission/syndishuttle) @@ -290,7 +290,7 @@ "fD" = (/obj/structure/table/holotable,/obj/item/weapon/gun/energy/floragun{pixel_x = 2; pixel_y = 3},/obj/machinery/light,/obj/item/weapon/gun/energy/taser{pixel_x = -2; pixel_y = -2},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) "fE" = (/obj/structure/target_stake,/obj/item/weapon/grown/sunflower,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) "fF" = (/obj/item/ammo_casing/c45,/obj/item/ammo_casing/c45{pixel_x = 7},/turf/simulated/floor{icon_state = "grimy"},/area/awaymission/northblock) -"fG" = (/obj/item/clothing/suit/space/syndicate,/obj/item/clothing/under/syndicate,/obj/item/clothing/head/helmet/space/syndicate,/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/clothing/shoes/syndigaloshes,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/automatic/silenced/sc_silenced,/turf/simulated/floor{icon_state = "grimy"},/area/awaymission/northblock) +"fG" = (/obj/item/clothing/suit/space/syndicate,/obj/item/clothing/under/syndicate,/obj/item/clothing/head/helmet/space/syndicate,/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/clothing/shoes/syndigaloshes,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/automatic/pistol,/turf/simulated/floor{icon_state = "grimy"},/area/awaymission/northblock) "fH" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/airless,/area/awaymission/midblock) "fI" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/awaymission/midblock) "fJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless{icon_state = "damaged5"},/area/awaymission/midblock) @@ -390,7 +390,7 @@ "hz" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/item/clothing/suit/space/syndicate,/obj/item/weapon/paper/sc_safehint_paper_prison,/obj/item/weapon/gun/projectile/shotgun/sc_pump,/turf/simulated/floor,/area/awaymission/arrivalblock) "hA" = (/obj/structure/window/reinforced,/turf/simulated/floor,/area/awaymission/arrivalblock) "hB" = (/obj/machinery/door/window/southleft{name = "Windoor"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/awaymission/arrivalblock) -"hC" = (/obj/item/ammo_casing/a12mm{pixel_x = 2; pixel_y = 5},/obj/item/ammo_casing/a12mm{pixel_x = -4; pixel_y = -5},/obj/item/ammo_casing/a12mm,/turf/simulated/floor/airless,/area/awaymission/midblock) +"hC" = (/obj/item/ammo_casing/c10mm{pixel_x = 2; pixel_y = 5},/obj/item/ammo_casing/c10mm{pixel_x = -4; pixel_y = -5},/obj/item/ammo_casing/c10mm,/turf/simulated/floor/airless,/area/awaymission/midblock) "hD" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/airless,/area/awaymission/midblock) "hE" = (/obj/structure/sink/kitchen{pixel_y = 32},/turf/simulated/floor,/area/awaymission/midblock) "hF" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/enzyme,/obj/item/weapon/reagent_containers/food/condiment/peppermill,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = 4; pixel_y = 4},/turf/simulated/floor,/area/awaymission/midblock) @@ -409,12 +409,12 @@ "hS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) "hT" = (/obj/effect/decal/remains/human,/obj/item/weapon/butch,/obj/item/weapon/kitchenknife,/obj/item/clothing/head/chefhat,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) "hU" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) -"hV" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/a12mm,/obj/item/weapon/paper/sc_safehint_paper_caf,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/automatic/c20r/sc_c20r,/turf/simulated/floor,/area/awaymission/midblock) +"hV" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/weapon/paper/sc_safehint_paper_caf,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/automatic/c20r/sc_c20r,/turf/simulated/floor,/area/awaymission/midblock) "hW" = (/obj/machinery/light/small,/turf/simulated/floor{icon_state = "dark"},/area/awaymission/midblock) "hX" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/midblock) "hY" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/midblock) "hZ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/arrivalblock) -"ia" = (/obj/effect/decal/cleanable/blood/splatter,/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/arrivalblock) +"ia" = (/obj/effect/decal/cleanable/blood/splatter,/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/turf/simulated/floor,/area/awaymission/arrivalblock) "ib" = (/obj/machinery/power/apc{cell_type = 7500; dir = 8; name = "Arrivals Block APC"; pixel_x = -28},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/awaymission/arrivalblock) "ic" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/awaymission/arrivalblock) "id" = (/obj/structure/stool/bed/chair{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/awaymission/arrivalblock) @@ -423,13 +423,13 @@ "ig" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless,/area/awaymission/midblock) "ih" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/awaymission/midblock) "ii" = (/obj/machinery/microwave{pixel_x = -2; pixel_y = 7},/obj/structure/table,/turf/simulated/floor,/area/awaymission/midblock) -"ij" = (/obj/structure/stool,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/midblock) -"ik" = (/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) -"il" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/a12mm,/obj/item/clothing/under/syndicate,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/weapon/gun/projectile/automatic/c20r/sc_c20r,/turf/simulated/floor,/area/awaymission/midblock) -"im" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/ammo_casing/a12mm,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) -"in" = (/obj/structure/table,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/midblock) -"io" = (/obj/structure/stool/bed/chair{dir = 8},/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) -"ip" = (/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/arrivalblock) +"ij" = (/obj/structure/stool,/obj/item/ammo_casing/c10mm,/turf/simulated/floor,/area/awaymission/midblock) +"ik" = (/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) +"il" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/weapon/gun/projectile/automatic/c20r/sc_c20r,/turf/simulated/floor,/area/awaymission/midblock) +"im" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/ammo_casing/c10mm,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) +"in" = (/obj/structure/table,/obj/item/ammo_casing/c10mm,/turf/simulated/floor,/area/awaymission/midblock) +"io" = (/obj/structure/stool/bed/chair{dir = 8},/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) +"ip" = (/obj/item/ammo_casing/c10mm,/turf/simulated/floor,/area/awaymission/arrivalblock) "iq" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/awaymission/arrivalblock) "ir" = (/turf/simulated/floor{icon_state = "red"; dir = 10},/area/awaymission/arrivalblock) "is" = (/turf/simulated/floor{icon_state = "red"},/area/awaymission/arrivalblock) @@ -440,14 +440,14 @@ "ix" = (/obj/structure/closet/secure_closet/freezer/fridge,/obj/machinery/light,/turf/simulated/floor,/area/awaymission/midblock) "iy" = (/obj/structure/closet/secure_closet/freezer/kitchen,/turf/simulated/floor,/area/awaymission/midblock) "iz" = (/obj/machinery/door/window/eastright{name = "Windoor"},/turf/simulated/floor,/area/awaymission/midblock) -"iA" = (/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/midblock) -"iB" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/automatic/c20r/sc_c20r,/turf/simulated/floor,/area/awaymission/midblock) -"iC" = (/obj/item/ammo_casing/a12mm,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) -"iD" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/a12mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/automatic/c20r/sc_c20r,/turf/simulated/floor,/area/awaymission/midblock) -"iE" = (/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/midblock) +"iA" = (/obj/item/ammo_casing/c10mm,/turf/simulated/floor,/area/awaymission/midblock) +"iB" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/automatic/c20r/sc_c20r,/turf/simulated/floor,/area/awaymission/midblock) +"iC" = (/obj/item/ammo_casing/c10mm,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) +"iD" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/automatic/c20r/sc_c20r,/turf/simulated/floor,/area/awaymission/midblock) +"iE" = (/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/turf/simulated/floor,/area/awaymission/midblock) "iF" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor,/area/awaymission/midblock) "iG" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shard{icon_state = "medium"},/obj/item/stack/rods,/turf/simulated/floor/plating,/area/awaymission/arrivalblock) -"iH" = (/obj/effect/decal/remains/human,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/arrivalblock) +"iH" = (/obj/effect/decal/remains/human,/obj/item/ammo_casing/c10mm,/turf/simulated/floor,/area/awaymission/arrivalblock) "iI" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/awaymission/arrivalblock) "iJ" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/arrivalblock) "iK" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/awaymission/arrivalblock) @@ -464,8 +464,8 @@ "iV" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/airless,/area/awaymission/southblock) "iW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) "iX" = (/turf/simulated/floor/airless,/area/awaymission/southblock) -"iY" = (/obj/item/ammo_casing/a12mm,/turf/simulated/floor/airless,/area/awaymission/southblock) -"iZ" = (/obj/item/ammo_casing/a12mm{pixel_x = -4; pixel_y = 3},/turf/simulated/floor/airless,/area/awaymission/southblock) +"iY" = (/obj/item/ammo_casing/c10mm,/turf/simulated/floor/airless,/area/awaymission/southblock) +"iZ" = (/obj/item/ammo_casing/c10mm{pixel_x = -4; pixel_y = 3},/turf/simulated/floor/airless,/area/awaymission/southblock) "ja" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/airless,/area/awaymission/southblock) "jb" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/airless,/area/awaymission/southblock) "jc" = (/turf/simulated/wall,/area/awaymission/southblock) @@ -479,7 +479,7 @@ "jk" = (/turf/simulated/floor/airless{icon_state = "damaged4"},/area/awaymission/southblock) "jl" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) "jm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) -"jn" = (/obj/item/ammo_casing/a12mm{pixel_y = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) +"jn" = (/obj/item/ammo_casing/c10mm{pixel_y = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) "jo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) "jp" = (/obj/structure/sign/bluecross{pixel_y = -32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) "jq" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) @@ -495,10 +495,10 @@ "jA" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/southblock) "jB" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/southblock) "jC" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/southblock) -"jD" = (/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/arrivalblock) +"jD" = (/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/turf/simulated/floor,/area/awaymission/arrivalblock) "jE" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/arrivalblock) "jF" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/turf/simulated/floor,/area/awaymission/arrivalblock) -"jG" = (/obj/machinery/light{dir = 1},/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/arrivalblock) +"jG" = (/obj/machinery/light{dir = 1},/obj/item/ammo_casing/c10mm,/turf/simulated/floor,/area/awaymission/arrivalblock) "jH" = (/obj/structure/sign/vacuum{pixel_y = 32},/turf/simulated/floor,/area/awaymission/arrivalblock) "jI" = (/obj/structure/closet/toolcloset,/turf/simulated/floor,/area/awaymission/southblock) "jJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/awaymission/southblock) @@ -519,7 +519,7 @@ "jY" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/awaymission/southblock) "jZ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/southblock) "ka" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/arrivalblock) -"kb" = (/obj/effect/decal/cleanable/blood/splatter,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/arrivalblock) +"kb" = (/obj/effect/decal/cleanable/blood/splatter,/obj/item/ammo_casing/c10mm,/turf/simulated/floor,/area/awaymission/arrivalblock) "kc" = (/obj/structure/sign/pods{pixel_y = -32},/turf/simulated/floor,/area/awaymission/arrivalblock) "kd" = (/obj/structure/sign/vacuum{pixel_y = -32},/turf/simulated/floor,/area/awaymission/arrivalblock) "ke" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor,/area/awaymission/southblock) @@ -586,7 +586,7 @@ "ln" = (/obj/machinery/light/small,/turf/simulated/floor/wood,/area/awaymission/southblock) "lo" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/awaymission/arrivalblock) "lp" = (/obj/structure/table,/obj/item/weapon/book/manual/hydroponics_pod_people,/turf/simulated/floor,/area/awaymission/arrivalblock) -"lq" = (/obj/item/weapon/grown/deathnettle,/obj/item/clothing/shoes/brown,/obj/item/clothing/under/rank/hydroponics,/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/arrivalblock) +"lq" = (/obj/item/weapon/grown/nettle/death,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/under/rank/hydroponics,/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/arrivalblock) "lr" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{tag = "icon-whitehall (WEST)"; icon_state = "whitehall"; dir = 8},/area/awaymission/southblock) "ls" = (/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/turf/simulated/floor,/area/awaymission/southblock) "lt" = (/obj/structure/stool/bed,/obj/structure/window/reinforced/tinted,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor{icon_state = "whitehall"; dir = 4},/area/awaymission/southblock) diff --git a/_maps/RandomZLevels/wildwest.dmm b/_maps/RandomZLevels/wildwest.dmm index b3409eb2b18..e61c72e96a7 100644 --- a/_maps/RandomZLevels/wildwest.dmm +++ b/_maps/RandomZLevels/wildwest.dmm @@ -50,11 +50,11 @@ "aX" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/simulated/wall/mineral/sandstone,/area/awaymission/wwmines) "aY" = (/obj/effect/decal/cleanable/blood/gibs/body{tag = "icon-gibup1"; icon_state = "gibup1"},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) "aZ" = (/obj/effect/mine/dnascramble,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) -"ba" = (/obj/effect/mine/dnascramble,/obj/item/ammo_box/a12mm,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) +"ba" = (/obj/effect/mine/dnascramble,/obj/item/ammo_box/c10mm,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) "bb" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/awaymission/wwrefine) "bc" = (/turf/simulated/floor/plating,/area/awaymission/wwrefine) "bd" = (/obj/machinery/door/airlock/sandstone,/turf/simulated/floor/plating,/area/awaymission/wwrefine) -"be" = (/obj/item/ammo_box/a12mm,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) +"be" = (/obj/item/ammo_box/c10mm,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) "bf" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) "bg" = (/turf/simulated/wall/mineral/sandstone,/area/space) "bh" = (/obj/structure/largecrate,/turf/simulated/floor/plating,/area/awaymission/wwrefine) @@ -68,7 +68,7 @@ "bp" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/wood,/area/awaymission/wwmines) "bq" = (/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plating,/area/awaymission/wwrefine) "br" = (/obj/structure/lattice,/turf/space,/area/space) -"bs" = (/obj/effect/mine/dnascramble,/obj/item/ammo_box/a12mm,/turf/simulated/floor/wood,/area/awaymission/wwmines) +"bs" = (/obj/effect/mine/dnascramble,/obj/item/ammo_box/c10mm,/turf/simulated/floor/wood,/area/awaymission/wwmines) "bt" = (/obj/structure/closet/crate,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/awaymission/wwrefine) "bu" = (/turf/simulated/wall/mineral/sandstone,/area/awaymission/wwmines) "bv" = (/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/space,/area/space) @@ -112,7 +112,7 @@ "ch" = (/obj/structure/table/woodentable,/obj/item/weapon/gun/projectile,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines) "ci" = (/obj/structure/mineral_door/wood{tag = "icon-woodopening"; icon_state = "woodopening"},/turf/simulated/floor/wood,/area/awaymission/wwmines) "cj" = (/obj/structure/stool,/turf/simulated/floor/carpet,/area/awaymission/wwmines) -"ck" = (/obj/item/ammo_box/a12mm,/turf/simulated/floor/carpet,/area/awaymission/wwmines) +"ck" = (/obj/item/ammo_box/c10mm,/turf/simulated/floor/carpet,/area/awaymission/wwmines) "cl" = (/obj/structure/stool,/turf/simulated/floor/wood,/area/awaymission/wwmines) "cm" = (/obj/structure/bookcase{tag = "icon-book-5"; icon_state = "book-5"},/turf/simulated/floor/wood,/area/awaymission/wwgov) "cn" = (/turf/simulated/floor/wood,/area/awaymission/wwgov) @@ -129,7 +129,7 @@ "cy" = (/obj/structure/stool/bed/chair/wood/wings,/turf/simulated/floor/wood,/area/awaymission/wwgov) "cz" = (/turf/simulated/floor{tag = "icon-stage_bleft"; icon_state = "stage_bleft"},/area/awaymission/wwgov) "cA" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/wood,/area/awaymission/wwmines) -"cB" = (/obj/effect/mine/plasma,/obj/item/ammo_box/a12mm,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) +"cB" = (/obj/effect/mine/plasma,/obj/item/ammo_box/c10mm,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) "cC" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor/wood,/area/awaymission/wwgov) "cD" = (/obj/structure/table/woodentable,/obj/item/clothing/gloves/yellow,/obj/item/device/multitool,/turf/simulated/floor/wood,/area/awaymission/wwgov) "cE" = (/obj/structure/stool/bed/chair/wood/normal{dir = 4},/turf/simulated/floor/wood,/area/awaymission/wwgov) @@ -157,9 +157,9 @@ "da" = (/obj/structure/stool/bed/chair/wood/normal{dir = 4},/turf/simulated/floor/wood,/area/awaymission/wwmines) "db" = (/obj/structure/stool/bed/chair/wood/normal{dir = 8},/turf/simulated/floor/wood,/area/awaymission/wwmines) "dc" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwgov) -"dd" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread,/turf/simulated/floor{tag = "icon-stage_bleft"; icon_state = "stage_bleft"},/area/awaymission/wwgov) +"dd" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/sliceable/store/creamcheesebread,/turf/simulated/floor{tag = "icon-stage_bleft"; icon_state = "stage_bleft"},/area/awaymission/wwgov) "de" = (/obj/structure/table/woodentable,/obj/item/weapon/kitchen/rollingpin,/turf/simulated/floor{tag = "icon-stage_bleft"; icon_state = "stage_bleft"},/area/awaymission/wwgov) -"df" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake,/turf/simulated/floor{tag = "icon-stage_bleft"; icon_state = "stage_bleft"},/area/awaymission/wwgov) +"df" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon,/turf/simulated/floor{tag = "icon-stage_bleft"; icon_state = "stage_bleft"},/area/awaymission/wwgov) "dg" = (/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/grille,/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwgov) "dh" = (/obj/effect/landmark/corpse/syndicatecommando{mobname = "Syndicate Commando"},/turf/simulated/floor/carpet,/area/awaymission/wwgov) "di" = (/obj/machinery/mineral/mint,/turf/simulated/floor/plating,/area/awaymission/wwrefine) @@ -175,7 +175,7 @@ "ds" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/bottle/patron,/turf/simulated/floor{tag = "icon-stage_bleft"; icon_state = "stage_bleft"},/area/awaymission/wwgov) "dt" = (/obj/effect/decal/cleanable/blood/tracks,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) "du" = (/obj/effect/decal/cleanable/blood/tracks,/turf/simulated/floor/wood,/area/awaymission/wwmines) -"dv" = (/obj/effect/mine/plasma,/obj/item/ammo_box/a12mm,/turf/simulated/floor/wood,/area/awaymission/wwmines) +"dv" = (/obj/effect/mine/plasma,/obj/item/ammo_box/c10mm,/turf/simulated/floor/wood,/area/awaymission/wwmines) "dw" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) "dx" = (/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand4"; icon_state = "ironsand4"},/area/awaymission/wwgov) "dy" = (/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/wood,/area/awaymission/wwmines) @@ -332,7 +332,7 @@ "gt" = (/obj/machinery/washing_machine,/turf/simulated/floor/wood,/area/awaymission/wwmines) "gu" = (/obj/effect/decal/cleanable/blood/gibs/body{tag = "icon-gibup1"; icon_state = "gibup1"},/obj/structure/stool/bed/chair/wood/normal,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/awaymission/wwmines) "gv" = (/obj/item/weapon/hatchet,/turf/simulated/floor/wood,/area/awaymission/wwmines) -"gw" = (/obj/item/weapon/gun/projectile/automatic/silenced,/turf/simulated/floor/wood,/area/awaymission/wwmines) +"gw" = (/obj/item/weapon/gun/projectile/automatic/pistol,/turf/simulated/floor/wood,/area/awaymission/wwmines) "gx" = (/obj/item/weapon/gun/projectile/shotgun,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) "gy" = (/obj/effect/landmark/corpse/syndicatecommando{mobname = "Syndicate Commando"},/turf/simulated/floor/grass,/area/awaymission/wwgov) "gz" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/simulated/floor,/area/awaymission/wwrefine) diff --git a/_maps/map_files/MetaStation.v39K.dmm b/_maps/map_files/MetaStation.v39K.dmm index f50bdc5b7b1..1f375037bba 100644 --- a/_maps/map_files/MetaStation.v39K.dmm +++ b/_maps/map_files/MetaStation.v39K.dmm @@ -1808,7 +1808,7 @@ "aIN" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/borgupload{pixel_x = -1; pixel_y = 1},/obj/item/weapon/circuitboard/aiupload{pixel_x = 2; pixel_y = -2},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/storage/tech) "aIO" = (/obj/structure/disposalpipe/segment,/obj/machinery/hologram/holopad,/turf/simulated/floor{dir = 2; icon_state = "brown"},/area/quartermaster/office{name = "\improper Cargo Office"}) "aIP" = (/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/hallway/primary/central) -"aIQ" = (/obj/structure/closet{name = "Contraband Locker"},/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi,/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom,/obj/item/weapon/suppressor,/obj/effect/spawner/lootdrop{loot = list("/obj/item/weapon/gun/projectile/automatic/pistol","/obj/item/weapon/gun/projectile/automatic/pistol","/obj/item/weapon/gun/projectile/automatic/pistol","/obj/item/weapon/gun/projectile/automatic/pistol","/obj/item/weapon/gun/projectile/automatic/pistol","/obj/item/weapon/gun/projectile/automatic/pistol","/obj/item/weapon/gun/projectile/automatic/pistol","/obj/item/weapon/gun/projectile/automatic/pistol","/obj/item/weapon/gun/projectile/shotgun/combat","/obj/item/weapon/gun/projectile/shotgun/combat","/obj/item/weapon/gun/projectile/shotgun/combat","/obj/item/weapon/gun/projectile/shotgun/combat","/obj/item/weapon/gun/projectile/shotgun/combat","/obj/item/weapon/gun/projectile/revolver/mateba","/obj/item/weapon/gun/projectile/automatic/deagle"); name = "armory contraband gun spawner"},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) +"aIQ" = (/obj/structure/closet{name = "Contraband Locker"},/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi,/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom,/obj/item/weapon/suppressor,/obj/effect/spawner/lootdrop/armory_contraband,/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) "aIR" = (/obj/structure/table,/obj/item/weapon/wrapping_paper,/obj/item/weapon/wrapping_paper,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_y = -30},/obj/item/weapon/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/weapon/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/weapon/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/weapon/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/weapon/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/weapon/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/weapon/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/weapon/packageWrap{pixel_x = 2; pixel_y = -3},/turf/simulated/floor{dir = 2; icon_state = "arrival"},/area/quartermaster/office{name = "\improper Cargo Office"}) "aIS" = (/obj/item/weapon/storage/box,/obj/structure/table,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/item/weapon/hand_labeler,/turf/simulated/floor{icon_state = "arrival"; dir = 6},/area/quartermaster/office{name = "\improper Cargo Office"}) "aIT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "L10"},/area/hallway/primary/central) diff --git a/_maps/map_files/tgstation.2.1.3.dmm b/_maps/map_files/tgstation.2.1.3.dmm index e22be902f75..f7d5e53da47 100644 --- a/_maps/map_files/tgstation.2.1.3.dmm +++ b/_maps/map_files/tgstation.2.1.3.dmm @@ -677,7 +677,7 @@ "ana" = (/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "anb" = (/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "anc" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) -"and" = (/obj/structure/rack,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"and" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "ane" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "anf" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "ang" = (/obj/machinery/atmospherics/trinary/filter{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) @@ -719,7 +719,7 @@ "anQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "anR" = (/obj/structure/closet/wardrobe/mixed,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "anS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"anT" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/pestspray{pixel_x = 3; pixel_y = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/fpmaint2) +"anT" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port) "anU" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/fpmaint2) "anV" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/fpmaint2) "anW" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) @@ -771,9 +771,9 @@ "aoQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/engineering{icon_state = "door_closed"; locked = 0; name = "Fore Starboard Solar Access"; req_access_txt = "10"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aoR" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/auxsolarstarboard) "aoS" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"aoT" = (/obj/structure/table,/obj/item/device/t_scanner,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"aoU" = (/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"aoV" = (/obj/structure/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aoT" = (/obj/structure/rack{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port) +"aoU" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"aoV" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "aoW" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aoX" = (/obj/structure/table,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -31},/obj/item/clothing/head/cakehat,/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar) "aoY" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -789,7 +789,7 @@ "api" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "apj" = (/obj/machinery/atmospherics/valve{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "apk" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) -"apl" = (/obj/structure/closet,/obj/item/clothing/gloves/white{color = "yellow"; desc = "The colors are a bit dodgy."; icon_state = "yellow"; item_color = "yellow"; item_state = "ygloves"; name = "insulated gloves"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"apl" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "apm" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "apn" = (/obj/machinery/power/apc{dir = 1; name = "Arrivals North Maintenance APC"; pixel_x = -1; pixel_y = 26},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "apo" = (/obj/machinery/camera{c_tag = "Fore Port Solar Access"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) @@ -825,7 +825,7 @@ "apS" = (/turf/simulated/floor/engine{name = "Holodeck Projector Floor"},/area/holodeck/alphadeck) "apT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "apU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"apV" = (/obj/structure/table,/obj/item/stack/cable_coil{pixel_x = -3; pixel_y = 3},/obj/item/stack/cable_coil{pixel_x = -3; pixel_y = 3},/obj/item/device/assembly/igniter{pixel_x = 5; pixel_y = -4},/obj/item/device/assembly/igniter{pixel_x = 5; pixel_y = -4},/obj/effect/decal/cleanable/cobweb,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"apV" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "apW" = (/obj/machinery/power/apc{dir = 1; name = "Bar Maintenance APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "apX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "apY" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Fore Starboard Solar Access"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -834,7 +834,7 @@ "aqb" = (/obj/structure/table,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aqc" = (/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aqd" = (/obj/machinery/status_display{density = 0; layer = 3; pixel_x = 32; pixel_y = 0},/obj/machinery/computer/slot_machine,/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar) -"aqe" = (/obj/structure/closet,/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aqe" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aqf" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/entry) "aqg" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape_pod1/station) "aqh" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock/glass{name = "Garden"},/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"}) @@ -847,8 +847,8 @@ "aqo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "aqp" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "aqq" = (/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/fpmaint2) -"aqr" = (/obj/item/weapon/vending_refill/cola,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) -"aqs" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"aqr" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aqs" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aqt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/maintenance/fpmaint) "aqu" = (/obj/structure/closet/secure_closet/detective,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) "aqv" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/red,/obj/item/weapon/hand_labeler,/turf/simulated/floor/carpet,/area/security/detectives_office) @@ -884,12 +884,12 @@ "aqZ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "ara" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "arb" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"arc" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 20},/obj/item/weapon/stock_parts/cell,/obj/item/weapon/stock_parts/cell,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"arc" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "ard" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"are" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"are" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "arf" = (/obj/structure/door_assembly/door_assembly_mai,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "arg" = (/obj/machinery/door/airlock/maintenance{name = "Firefighting equipment"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"arh" = (/obj/structure/table,/obj/item/device/assembly/timer,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"arh" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "ari" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/donut,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "arj" = (/turf/simulated/wall,/area/maintenance/electrical) "ark" = (/turf/simulated/wall,/area/hallway/secondary/entry) @@ -902,9 +902,9 @@ "arr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "ars" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "art" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) -"aru" = (/obj/item/stack/cable_coil{pixel_x = -1; pixel_y = -3},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"aru" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "arv" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint) -"arw" = (/obj/structure/stool,/obj/item/stack/medical/bruise_pack{amount = 1; pixel_x = 0; pixel_y = 2},/turf/simulated/floor/plating,/area/maintenance/fpmaint) +"arw" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "arx" = (/obj/effect/decal/cleanable/cobweb,/obj/structure/closet/secure_closet/chemical,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "ary" = (/obj/structure/closet/secure_closet/chemical,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "arz" = (/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor/plating,/area/maintenance/fpmaint) @@ -942,12 +942,12 @@ "asf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = "0"},/turf/simulated/floor/plating,/area/crew_quarters/fitness) "asg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = "0"},/turf/simulated/floor/plating,/area/crew_quarters/fitness) "ash" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"asi" = (/obj/structure/table,/obj/item/weapon/shard,/obj/item/weapon/shard{icon_state = "medium"},/obj/item/weapon/shard{icon_state = "small"},/obj/item/stack/rods{amount = 50},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"asj" = (/obj/structure/rack,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"asi" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/fpmaint2) +"asj" = (/obj/structure/table,/obj/effect/decal/cleanable/cobweb,/obj/effect/spawner/lootdrop/maintenance{lootcount = 8; name = "8maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "ask" = (/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fsmaint2) "asl" = (/obj/machinery/door_control{id = "maint3"; name = "Blast Door Control C"; pixel_x = 0; pixel_y = 24; req_access_txt = "0"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "asm" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"asn" = (/obj/structure/table,/obj/item/weapon/storage/box/cups,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"asn" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aso" = (/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "asp" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "asq" = (/obj/machinery/recharge_station,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/electrical) @@ -963,17 +963,17 @@ "asA" = (/obj/machinery/door/airlock/shuttle{name = "Escape Pod Airlock"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod2/station) "asB" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape_pod2/station) "asC" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) -"asD" = (/obj/structure/rack,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) -"asE" = (/obj/structure/rack,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"asD" = (/obj/structure/closet,/obj/item/weapon/coin/iron,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"asE" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "asF" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "asG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "asH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "asI" = (/obj/item/weapon/airlock_painter,/obj/structure/lattice,/obj/structure/closet,/turf/space,/area/space) "asJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/space,/area/space) "asK" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/space,/area/space) -"asL" = (/obj/structure/closet,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"asL" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "asM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) -"asN" = (/obj/structure/rack{dir = 1},/obj/item/stack/rods{amount = 10},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"asN" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "asO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "asP" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/wall,/area/security/detectives_office) "asQ" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) @@ -1011,7 +1011,7 @@ "atw" = (/turf/simulated/floor/plating,/area/hallway/secondary/entry) "atx" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/hallway/secondary/entry) "aty" = (/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "Arrivals Escape Pod 2"; dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/entry) -"atz" = (/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"atz" = (/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "atA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "atB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "atC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) @@ -1026,7 +1026,7 @@ "atL" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "atM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "atN" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fpmaint) -"atO" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/fpmaint) +"atO" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "atP" = (/obj/machinery/door/airlock/maintenance{name = "Chemical Storage"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "atQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/wall,/area/maintenance/fpmaint) "atR" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint) @@ -1076,13 +1076,13 @@ "auJ" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "auK" = (/obj/item/stack/cable_coil{amount = 5},/turf/simulated/floor/plating/airless,/area/space) "auL" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) -"auM" = (/obj/structure/table,/obj/item/device/t_scanner,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"auM" = (/obj/structure/table,/obj/item/weapon/shard,/obj/item/weapon/shard{icon_state = "medium"},/obj/item/weapon/shard{icon_state = "small"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "auN" = (/obj/machinery/light/small{dir = 4},/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "auO" = (/obj/structure/rack{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "auP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "auQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "auR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/fpmaint) -"auS" = (/obj/structure/rack,/obj/item/clothing/suit/hazardvest,/turf/simulated/floor/plating,/area/maintenance/fpmaint) +"auS" = (/obj/structure/stool,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "auT" = (/obj/machinery/power/apc{dir = 1; name = "EVA Maintenance APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "auU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "auV" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fpmaint) @@ -1108,13 +1108,13 @@ "avp" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor{icon_state = "green"; dir = 4},/area/crew_quarters/fitness) "avq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/fitness) "avr" = (/obj/structure/table,/obj/item/weapon/paper{desc = ""; info = "Brusies sustained in the holodeck can be healed simply by sleeping."; name = "Holodeck Disclaimer"},/turf/simulated/floor,/area/crew_quarters/fitness) -"avs" = (/obj/item/stack/sheet/cardboard,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"avt" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/closet/crate,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"avu" = (/obj/structure/closet/crate,/obj/item/bodybag,/obj/item/device/radio,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"avs" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint) +"avt" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"avu" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "avv" = (/obj/structure/girder,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "avw" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"avx" = (/obj/structure/rack,/obj/item/device/t_scanner,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"avy" = (/obj/structure/rack,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"avx" = (/obj/structure/closet,/obj/effect/landmark{name = "blobstart"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"avy" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "avz" = (/obj/machinery/door_control{id = "maint2"; name = "Blast Door Control B"; pixel_x = -28; pixel_y = 4; req_access_txt = "0"},/obj/machinery/door_control{id = "maint1"; name = "Blast Door Control A"; pixel_x = -28; pixel_y = -6; req_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "avA" = (/obj/structure/janitorialcart,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "avB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -1194,7 +1194,7 @@ "awX" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "awY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "awZ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) -"axa" = (/obj/structure/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"axa" = (/obj/structure/closet,/obj/effect/decal/cleanable/cobweb,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "axb" = (/turf/simulated/wall/r_wall,/area/maintenance/fpmaint) "axc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "axd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint) @@ -1234,11 +1234,11 @@ "axL" = (/obj/machinery/camera{c_tag = "Fitness Room South"; dir = 1},/turf/simulated/floor{icon_state = "green"; dir = 4},/area/crew_quarters/fitness) "axM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/crew_quarters/fitness) "axN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/crew_quarters/fitness) -"axO" = (/obj/structure/rack,/obj/item/stack/cable_coil{amount = 5},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"axO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "axP" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"axQ" = (/obj/item/weapon/caution/cone,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"axQ" = (/obj/structure/rack,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "axR" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"axS" = (/obj/item/stack/cable_coil{amount = 5},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"axS" = (/obj/structure/rack,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "axT" = (/obj/machinery/power/terminal,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/electrical) "axU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/electrical) "axV" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/electrical) @@ -1288,13 +1288,13 @@ "ayN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/crew_quarters/fitness) "ayO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "ayP" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"ayQ" = (/obj/structure/closet,/obj/item/device/assembly/timer,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"ayR" = (/obj/structure/closet,/obj/item/clothing/head/that{throwforce = 1; throwing = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"ayS" = (/obj/structure/closet,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"ayT" = (/obj/item/clothing/head/ushanka,/obj/item/weapon/contraband/poster,/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"ayQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"ayR" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"ayS" = (/obj/structure/rack{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"ayT" = (/obj/effect/decal/cleanable/cobweb2,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ayU" = (/obj/machinery/door/poddoor/preopen{id = "maint2"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "ayV" = (/obj/machinery/door/poddoor/preopen{id = "maint2"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"ayW" = (/obj/structure/closet,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"ayW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ayX" = (/obj/machinery/power/smes{charge = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/electrical) "ayY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall,/area/maintenance/electrical) "ayZ" = (/obj/machinery/computer/monitor{name = "backup power monitoring console"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/electrical) @@ -1319,7 +1319,7 @@ "azs" = (/obj/machinery/seed_extractor,/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"}) "azt" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"}) "azu" = (/obj/structure/sink{pixel_y = 30},/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"}) -"azv" = (/obj/item/weapon/extinguisher,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/fpmaint) +"azv" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft) "azw" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "azx" = (/obj/machinery/power/apc{dir = 2; name = "Primary Tool Storage APC"; pixel_x = 1; pixel_y = -24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/storage/primary) "azy" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fpmaint) @@ -1405,10 +1405,10 @@ "aBa" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aBb" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aBc" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"aBd" = (/obj/structure/rack,/obj/item/weapon/storage/box,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aBd" = (/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft) "aBe" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aBf" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"aBg" = (/obj/structure/rack,/obj/item/stack/rods{amount = 10},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aBg" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft) "aBh" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aBi" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/arrival/station) "aBj" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/arrival/station) @@ -1445,7 +1445,7 @@ "aBO" = (/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "dark"},/area/gateway) "aBP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/window{name = "Gateway Chamber"; req_access_txt = "62"},/turf/simulated/floor{icon_state = "dark"},/area/gateway) "aBQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "dark"},/area/gateway) -"aBR" = (/obj/structure/rack{dir = 1},/obj/item/weapon/extinguisher,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/fpmaint) +"aBR" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "aBS" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/ai_monitored/storage/eva) "aBT" = (/obj/machinery/suit_storage_unit/standard_unit,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/ai_monitored/storage/eva) "aBU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/ai_monitored/storage/eva) @@ -1465,12 +1465,12 @@ "aCi" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics) "aCj" = (/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics) "aCk" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics) -"aCl" = (/obj/item/stack/rods{amount = 10},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aCl" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft) "aCm" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aCn" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "blue"; dir = 4; icon_state = "intact-b-f"; level = 1; name = "pipe"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aCo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aCp" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"aCq" = (/obj/structure/rack,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/t_scanner,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aCq" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "aCr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aCs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aCt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -1538,7 +1538,7 @@ "aDD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j1s"; sortType = 18},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aDE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aDF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/wall,/area/maintenance/fsmaint2) -"aDG" = (/obj/item/stack/rods{amount = 10},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aDG" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "aDH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aDI" = (/obj/item/stack/sheet/metal,/turf/simulated/floor/plating/airless,/area/space) "aDJ" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -1697,7 +1697,7 @@ "aGG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aGH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/ai_monitored/storage/eva) "aGI" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/weapon/crowbar,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aGJ" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/ai_monitored/storage/eva) +"aGJ" = (/obj/structure/disposalpipe/segment,/obj/machinery/crema_switch{pixel_x = 25},/obj/machinery/atmospherics/pipe/simple{pipe_color = "blue"; dir = 4; icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) "aGK" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) "aGL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) "aGM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) @@ -1742,7 +1742,7 @@ "aHz" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/library) "aHA" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/library) "aHB" = (/obj/structure/crematorium,/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) -"aHC" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple{pipe_color = "red"; icon_state = "intact-r-f"; level = 1; name = "pipe"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) +"aHC" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) "aHD" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) "aHE" = (/obj/effect/landmark/start{name = "Chaplain"},/obj/structure/stool/bed/chair,/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) "aHF" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/storage/fancy/crayons,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) @@ -1819,7 +1819,7 @@ "aIY" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/wood,/area/library) "aIZ" = (/obj/machinery/newscaster{pixel_x = 30},/turf/simulated/floor/wood,/area/library) "aJa" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "blue"; dir = 6; icon_state = "intact-b-f"; initialize_directions = 6; level = 1; name = "pipe"},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) -"aJb" = (/obj/structure/disposalpipe/segment,/obj/machinery/crema_switch{pixel_x = 25},/obj/machinery/atmospherics/pipe/simple{pipe_color = "blue"; dir = 4; icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/machinery/atmospherics/pipe/simple{pipe_color = "red"; icon_state = "intact-r-f"; level = 1; name = "pipe"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) +"aJb" = (/obj/machinery/door/poddoor/preopen{id = "Engineering"; name = "engineering security door"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "aJc" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "blue"; dir = 4; icon_state = "intact-b-f"; level = 1; name = "pipe"},/turf/simulated/wall,/area/chapel/office) "aJd" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp{pixel_y = 10},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple{pipe_color = "blue"; dir = 4; icon_state = "intact-b-f"; level = 1; name = "pipe"},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) "aJe" = (/obj/structure/table/woodentable,/obj/item/weapon/pen,/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) @@ -2186,7 +2186,7 @@ "aQb" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor{icon_state = "neutralcorner"; dir = 4},/area/hallway/secondary/entry) "aQc" = (/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry) "aQd" = (/turf/simulated/floor{icon_state = "neutralcorner"; dir = 1},/area/hallway/secondary/entry) -"aQe" = (/obj/structure/closet,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/port) +"aQe" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 4; name = "4maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "aQf" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/wall,/area/maintenance/port) "aQg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port) "aQh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/crew_quarters/locker) @@ -2808,7 +2808,7 @@ "bbZ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) "bca" = (/obj/effect/landmark{name = "blobstart"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port) "bcb" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/port) -"bcc" = (/obj/structure/rack{dir = 4},/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/port) +"bcc" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/aft) "bcd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (NORTH)"; icon_state = "pipe-j2"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/port) "bce" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bcf" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) @@ -2993,8 +2993,8 @@ "bfC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/port) "bfD" = (/obj/machinery/door/airlock{name = "Unit 4"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bfE" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) -"bfF" = (/obj/item/stack/sheet/rglass,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/port) -"bfG" = (/obj/item/weapon/screwdriver,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) +"bfF" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft) +"bfG" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bfH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) "bfI" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/port) "bfJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) @@ -3145,7 +3145,7 @@ "biy" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/disposal) "biz" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal) "biA" = (/obj/machinery/door/airlock/maintenance{name = "Disposal Access"; req_access_txt = "12"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal) -"biB" = (/obj/structure/closet/crate,/obj/item/weapon/coin/twoheaded,/turf/simulated/floor/plating,/area/maintenance/port) +"biB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port) "biC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/port) "biD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) "biE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) @@ -3174,7 +3174,7 @@ "bjb" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/central) "bjc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/maintenance/maintcentral) "bjd" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/maintcentral) -"bje" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/maintenance/maintcentral) +"bje" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port) "bjf" = (/obj/machinery/power/apc{dir = 1; name = "Bridge Maintenance APC"; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/maintcentral) "bjg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/closet/wardrobe/black,/turf/simulated/floor/plating,/area/maintenance/maintcentral) "bjh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/bridge/meeting_room) @@ -3326,7 +3326,7 @@ "blX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor,/area/hallway/primary/central) "blY" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/hallway/primary/central) "blZ" = (/turf/simulated/wall/r_wall,/area/maintenance/maintcentral) -"bma" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plating,/area/maintenance/maintcentral) +"bma" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/maintcentral) "bmb" = (/turf/simulated/wall/r_wall,/area/crew_quarters/heads) "bmc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/crew_quarters/heads) "bmd" = (/turf/simulated/wall,/area/crew_quarters/heads) @@ -3533,7 +3533,7 @@ "bpW" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bpX" = (/turf/simulated/wall/r_wall,/area/toxins/telesci) "bpY" = (/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"bpZ" = (/obj/structure/rack,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bpZ" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/maintcentral) "bqa" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/poddoor{id = "QMLoaddoor2"; name = "supply dock loading door"},/turf/simulated/floor/plating,/area/quartermaster/storage) "bqb" = (/obj/structure/plasticflaps,/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor/plating,/area/quartermaster/storage) "bqc" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage) @@ -3729,7 +3729,7 @@ "btK" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "btL" = (/obj/machinery/light,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "btM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"btN" = (/obj/machinery/door/airlock/research{name = "Telescience Lab"; req_access_txt = "7"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/telesci) +"btN" = (/obj/machinery/door/airlock/research{name = "Telescience Lab"; req_access_txt = "7"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/telesci) "btO" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/telesci) "btP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/toxins/telesci) "btQ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/telesci) @@ -3804,7 +3804,7 @@ "bvh" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/telesci) "bvi" = (/obj/structure/stool/bed/chair/office/light,/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor{icon_state = "white"},/area/toxins/telesci) "bvj" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "white"},/area/toxins/telesci) -"bvk" = (/obj/item/stack/rods{amount = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bvk" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port) "bvl" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/poddoor{id = "QMLoaddoor"; name = "supply dock loading door"},/turf/simulated/floor/plating,/area/quartermaster/storage) "bvm" = (/obj/structure/plasticflaps,/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor/plating,/area/quartermaster/storage) "bvn" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage) @@ -4218,7 +4218,7 @@ "bDf" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bDg" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bDh" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) -"bDi" = (/obj/structure/rack,/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bDi" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft) "bDj" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 32},/turf/space,/area/space) "bDk" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/machinery/requests_console{department = "Mining"; departmentType = 0; pixel_x = -30; pixel_y = 0},/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/quartermaster/miningdock) "bDl" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor,/area/quartermaster/miningdock) @@ -4287,7 +4287,7 @@ "bEw" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/toxins/mixing) "bEx" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/toxins/mixing) "bEy" = (/turf/simulated/wall/r_wall,/area/toxins/mixing) -"bEz" = (/obj/structure/closet/crate,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/assembly/prox_sensor,/obj/item/weapon/coin/silver,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bEz" = (/obj/structure/rack,/obj/effect/decal/cleanable/cobweb2,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bEA" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bEB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/window/southleft{name = "Armory"; req_access_txt = "3"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/ai_monitored/security/armory) "bEC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -4530,9 +4530,9 @@ "bJf" = (/obj/machinery/door/airlock/shuttle{name = "Mining Shuttle Airlock"; req_access_txt = "48"},/turf/simulated/shuttle/plating,/area/shuttle/mining/station) "bJg" = (/obj/machinery/door/airlock/external{name = "Mining Dock Airlock"; req_access = null; req_access_txt = "48"},/turf/simulated/floor/plating,/area/quartermaster/miningdock) "bJh" = (/obj/machinery/door/airlock/glass_mining{name = "Mining Dock"; req_access_txt = "48"},/turf/simulated/floor,/area/quartermaster/miningdock) -"bJi" = (/obj/structure/table,/obj/item/device/t_scanner,/turf/simulated/floor/plating,/area/maintenance/aft) -"bJj" = (/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/aft) -"bJk" = (/obj/structure/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating,/area/maintenance/aft) +"bJi" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft) +"bJj" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft) +"bJk" = (/obj/structure/rack,/obj/structure/disposalpipe/segment,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bJl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/aft) "bJm" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/robotics{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/mecha_control{pixel_x = 1; pixel_y = -1},/turf/simulated/floor,/area/storage/tech) "bJn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/storage/tech) @@ -4636,8 +4636,8 @@ "bLh" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bLi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bLj" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/medical/medbay) -"bLk" = (/obj/structure/rack{dir = 1},/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/meson,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bLl" = (/obj/structure/rack{dir = 1},/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bLk" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft) +"bLl" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft) "bLm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/power/apc{dir = 1; name = "CM Office APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/medical/cmo) "bLn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bLo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -4738,7 +4738,7 @@ "bNf" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/toxins/mixing) "bNg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bNh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"bNi" = (/obj/effect/decal/cleanable/cobweb2,/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bNi" = (/obj/structure/disposalpipe/segment,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bNj" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating/airless{dir = 10; icon_state = "warnplate"},/area/toxins/test_area) "bNk" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/toxins/test_area) "bNl" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/mining/station) @@ -4767,7 +4767,7 @@ "bNI" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bNJ" = (/turf/simulated/wall/r_wall,/area/medical/virology) "bNK" = (/turf/simulated/wall,/area/medical/virology) -"bNL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/access_button{command = "cycle_exterior"; master_tag = "virology_airlock_control"; name = "Virology Access Button"; pixel_x = -24; pixel_y = 0; req_access_txt = "39"},/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1449; icon_state = "door_locked"; id_tag = "virology_airlock_exterior"; locked = 1; name = "Virology Exterior Airlock"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"bNL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/access_button{command = "cycle_exterior"; master_tag = "virology_airlock_control"; name = "Virology Access Button"; pixel_x = -24; pixel_y = 0; req_access_txt = "39"},/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/virology{autoclose = 0; frequency = 1449; icon_state = "door_locked"; id_tag = "virology_airlock_exterior"; locked = 1; name = "Virology Exterior Airlock"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "bNM" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/medical/virology) "bNN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/medical/virology) "bNO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 13},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -4791,9 +4791,9 @@ "bOg" = (/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/toxins/mixing) "bOh" = (/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/toxins/mixing) "bOi" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/camera{c_tag = "Toxins Lab East"; dir = 8; network = list("SS13","RD"); pixel_y = -22},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/mixing) -"bOj" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/stack/cable_coil{amount = 5},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bOj" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bOk" = (/obj/structure/closet/wardrobe/grey,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"bOl" = (/obj/structure/rack,/obj/item/weapon/extinguisher,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bOl" = (/obj/structure/table,/obj/effect/decal/cleanable/cobweb,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bOm" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating/airless{dir = 10; icon_state = "warnplate"},/area/toxins/test_area) "bOn" = (/obj/item/device/flashlight/lamp,/turf/simulated/floor/plating/airless{dir = 2; icon_state = "warnplate"},/area/toxins/test_area) "bOo" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/toxins/test_area) @@ -4875,7 +4875,7 @@ "bPM" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/turf/simulated/floor,/area/atmos) "bPN" = (/obj/machinery/atmospherics/binary/pump{dir = 0; icon_state = "intact_off"; name = "Air to Mix"; on = 0},/obj/machinery/atmospherics/pipe/simple{pipe_color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/turf/simulated/floor,/area/atmos) "bPO" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/binary/pump{dir = 8; icon_state = "intact_off"; name = "Mix Outlet Pump"; on = 0},/turf/simulated/floor{dir = 5; icon_state = "green"},/area/atmos) -"bPP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple{pipe_color = "green"; dir = 4; icon_state = "intact-g"; level = 2},/obj/machinery/atmospherics/pipe/simple{pipe_color = "cyan"; icon_state = "intact-c"},/obj/machinery/atmospherics/pipe/simple{pipe_color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/turf/simulated/floor/plating,/area/atmos) +"bPP" = (/obj/machinery/door/poddoor/preopen{id = "Engineering"; name = "engineering security door"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "bPQ" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple{pipe_color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/turf/space,/area/space) "bPR" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; level = 1},/obj/structure/grille,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/atmos) "bPS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) @@ -4914,7 +4914,7 @@ "bQz" = (/obj/effect/decal/cleanable/oil,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bQA" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/aft) "bQB" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating,/area/maintenance/aft) -"bQC" = (/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/aft) +"bQC" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bQD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/aft) "bQE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/aft) "bQF" = (/obj/item/weapon/table_parts,/turf/simulated/floor/plating,/area/construction) @@ -4974,8 +4974,8 @@ "bRH" = (/turf/simulated/wall/r_wall,/area/toxins/misc_lab) "bRI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/rack,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bRJ" = (/turf/simulated/wall,/area/space) -"bRK" = (/obj/structure/rack,/obj/item/weapon/screwdriver{pixel_y = 16},/obj/item/weapon/hand_labeler,/turf/simulated/floor/plating,/area/maintenance/aft) -"bRL" = (/obj/item/weapon/book/manual/wiki/engineering_hacking{pixel_x = 4; pixel_y = 5},/obj/item/weapon/book/manual/wiki/engineering_construction{pixel_x = 0; pixel_y = 3},/obj/item/weapon/stock_parts/cell,/turf/simulated/floor/plating,/area/maintenance/aft) +"bRK" = (/obj/machinery/light/small{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft) +"bRL" = (/obj/structure/rack,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bRM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/aft) "bRN" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/aft) "bRO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Construction Area Maintenance"; req_access_txt = "32"},/turf/simulated/floor/plating,/area/construction) @@ -5003,17 +5003,17 @@ "bSk" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact-g"; dir = 5; level = 2; initialize_directions = 12; pipe_color = "green"},/turf/simulated/floor,/area/atmos) "bSl" = (/obj/machinery/atmospherics/binary/pump{dir = 1; icon_state = "intact_on"; name = "Unfiltered to Mix"; on = 1},/obj/machinery/atmospherics/pipe/simple{pipe_color = "green"; dir = 4; icon_state = "intact-g"; initialize_directions = 12; level = 2},/turf/simulated/floor,/area/atmos) "bSm" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "green"; dir = 4; icon_state = "intact-g"; level = 2},/turf/simulated/floor{icon_state = "green"; dir = 6},/area/atmos) -"bSn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple{pipe_color = "yellow"; dir = 4; icon_state = "intact-y"; initialize_directions = 12; level = 1},/obj/machinery/atmospherics/pipe/simple{pipe_color = "cyan"; icon_state = "intact-c"},/obj/machinery/atmospherics/pipe/simple{pipe_color = "green"; dir = 4; icon_state = "intact-g"; level = 2},/turf/simulated/floor/plating,/area/atmos) +"bSn" = (/obj/machinery/door/poddoor/preopen{id = "Engineering"; name = "engineering security door"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "bSo" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple{pipe_color = "green"; dir = 4; icon_state = "intact-g"; level = 2},/turf/space,/area/space) "bSp" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "on"; id = "waste_in"; on = 1; pixel_y = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) "bSq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bSr" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/light/small,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/secure_construction) "bSs" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"bSt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only{dir = 2; name = "hazard door south"},/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1449; icon_state = "door_locked"; id_tag = "virology_airlock_interior"; locked = 1; name = "Virology Interior Airlock"; req_access_txt = "39"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"bSt" = (/obj/machinery/door/firedoor/border_only{dir = 2; name = "hazard door south"},/obj/machinery/door/airlock/glass_virology{name = "Monkey Pen"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "bSu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/medical/virology) "bSv" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/virology) "bSw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/medical/virology) -"bSx" = (/obj/machinery/door/firedoor/border_only{dir = 2; name = "hazard door south"},/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Monkey Pen"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"bSx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only{dir = 2; name = "hazard door south"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/virology{autoclose = 0; frequency = 1449; icon_state = "door_locked"; id_tag = "virology_airlock_interior"; locked = 1; name = "Virology Interior Airlock"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "bSy" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/medical/virology) "bSz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/medical/virology) "bSA" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/wall/r_wall,/area/medical/virology) @@ -5036,12 +5036,12 @@ "bSR" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 8; icon_state = "freezer_0"},/turf/simulated/floor/engine,/area/toxins/misc_lab) "bSS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/toxins/misc_lab) "bST" = (/obj/machinery/magnetic_module,/obj/effect/landmark{name = "blobstart"},/obj/structure/target_stake,/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/toxins/misc_lab) -"bSU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bSU" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft) "bSV" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bSW" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint2) -"bSX" = (/obj/structure/rack,/obj/item/stack/cable_coil{pixel_x = -1; pixel_y = -3},/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/aft) +"bSX" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bSY" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/aft) -"bSZ" = (/obj/structure/rack,/obj/item/stack/rods{amount = 23},/turf/simulated/floor/plating,/area/maintenance/aft) +"bSZ" = (/obj/structure/disposalpipe/segment,/obj/structure/rack{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bTa" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/aft) "bTb" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/aft) "bTc" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating,/area/construction) @@ -5066,7 +5066,7 @@ "bTv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "cyan"; dir = 4; icon_state = "manifold-c"; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area/atmos) "bTw" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "bTx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"bTy" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/obj/machinery/door/airlock/medical{name = "Break Room"; req_access_txt = "39"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"bTy" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/virology{name = "Break Room"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "bTz" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "bTA" = (/obj/machinery/embedded_controller/radio/access_controller{exterior_door_tag = "virology_airlock_exterior"; id_tag = "virology_airlock_control"; interior_door_tag = "virology_airlock_interior"; name = "Virology Access Console"; pixel_x = 8; pixel_y = 22},/obj/machinery/light_switch{pixel_x = -4; pixel_y = 24},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (NORTH)"; icon_state = "manifold-b-f"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "bTB" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) @@ -5186,9 +5186,9 @@ "bVL" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "bVM" = (/obj/machinery/computer/pandemic,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/medical/virology) "bVN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/medical/virology) -"bVO" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Isolation A"; req_access_txt = "39"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"bVO" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/glass_virology{name = "Isolation A"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "bVP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/medical/virology) -"bVQ" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Isolation B"; req_access_txt = "39"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"bVQ" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/glass_virology{name = "Isolation B"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "bVR" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/toxins/xenobiology) "bVS" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "bVT" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) @@ -5214,7 +5214,7 @@ "bWn" = (/turf/simulated/wall/r_wall,/area/tcommsat/server) "bWo" = (/turf/simulated/wall/r_wall,/area/tcommsat/computer) "bWp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"bWq" = (/obj/structure/rack{dir = 1},/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/maintenance/aft) +"bWq" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/sign/securearea{pixel_y = 32},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bWr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) "bWs" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "cyan"; dir = 9; icon_state = "intact-c"; level = 2},/turf/simulated/wall/r_wall,/area/atmos) "bWt" = (/obj/machinery/camera{c_tag = "Atmospherics Access"; dir = 4; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/light{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "caution"},/area/atmos) @@ -5285,7 +5285,7 @@ "bXG" = (/obj/machinery/light{dir = 4},/turf/simulated/floor,/area/atmos) "bXH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bXI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bXJ" = (/obj/structure/closet/crate,/obj/item/weapon/crowbar/red,/obj/item/weapon/pen,/obj/item/device/flashlight/pen{pixel_x = 4; pixel_y = 3},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bXJ" = (/obj/machinery/light/small,/obj/structure/table,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bXK" = (/turf/simulated/floor/plating,/area/maintenance/asmaint) "bXL" = (/obj/structure/table,/obj/item/device/radio/intercom{pixel_x = -25},/obj/machinery/light{dir = 8},/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/medical/virology) "bXM" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Virologist"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) @@ -5452,13 +5452,13 @@ "caR" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "on"; id = "tox_in"; on = 1; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos) "caS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) "caT" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"caU" = (/obj/item/weapon/paper/crumpled,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"caU" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "caV" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/medical/virology) "caW" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plating,/area/engine/secure_construction) "caX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plating,/area/engine/secure_construction) "caY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engine/secure_construction) "caZ" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cba" = (/obj/structure/rack{dir = 1},/obj/item/device/flashlight,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cba" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbb" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/engine,/area/toxins/xenobiology) "cbc" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio6"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/toxins/xenobiology) "cbd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id = "xenobio6"; name = "containment blast door"},/turf/simulated/floor/engine,/area/toxins/xenobiology) @@ -5472,7 +5472,7 @@ "cbl" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cbm" = (/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint2) "cbn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"cbo" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/aft) +"cbo" = (/obj/structure/rack{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cbp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/aft) "cbq" = (/obj/structure/lattice,/obj/item/weapon/shard{icon_state = "medium"},/turf/space,/area/space) "cbr" = (/obj/item/stack/rods,/obj/structure/lattice,/turf/space,/area/space) @@ -5497,8 +5497,8 @@ "cbK" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; level = 2},/obj/structure/stool,/turf/simulated/floor,/area/atmos) "cbL" = (/obj/machinery/atmospherics/unary/heat_reservoir/heater{dir = 8; icon_state = "freezer_0"},/turf/simulated/floor,/area/atmos) "cbM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cbN" = (/obj/structure/rack,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cbO" = (/obj/item/stack/rods{amount = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cbN" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"cbO" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbP" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbQ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbR" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 3; pixel_x = 0; pixel_y = 32},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod4/station) @@ -5517,12 +5517,12 @@ "cce" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/toxins/misc_lab) "ccf" = (/obj/machinery/power/apc{dir = 4; name = "Testing Lab APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/misc_lab) "ccg" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor,/area/toxins/misc_lab) -"cch" = (/obj/structure/closet,/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"cch" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft) "cci" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint2) "ccj" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cck" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ccl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"ccm" = (/obj/structure/closet,/obj/item/weapon/storage/box,/turf/simulated/floor/plating,/area/maintenance/aft) +"ccm" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "ccn" = (/obj/item/weapon/shard,/obj/structure/lattice,/turf/space,/area/space) "cco" = (/obj/structure/lattice,/obj/structure/disposalpipe/segment{dir = 4},/turf/space,/area/space) "ccp" = (/obj/machinery/camera{c_tag = "Telecoms Server Room"; dir = 4; network = list("SS13")},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) @@ -5563,15 +5563,15 @@ "ccY" = (/obj/structure/closet/crate,/obj/item/target,/obj/item/target,/obj/item/target,/turf/simulated/floor,/area/toxins/misc_lab) "ccZ" = (/obj/structure/closet/crate,/obj/item/target/alien,/obj/item/target/alien,/obj/item/target/alien,/turf/simulated/floor,/area/toxins/misc_lab) "cda" = (/obj/structure/closet/crate,/obj/item/target/syndicate,/obj/item/target/syndicate,/obj/item/target/syndicate,/turf/simulated/floor,/area/toxins/misc_lab) -"cdb" = (/obj/structure/rack,/obj/item/weapon/extinguisher,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"cdb" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cdc" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/port) "cdd" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless,/area/solar/port) "cde" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/port) "cdf" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor/plating,/area/maintenance/aft) "cdg" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/aft) "cdh" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/aft) -"cdi" = (/obj/machinery/light/small{dir = 1},/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/maintenance/aft) -"cdj" = (/obj/item/stack/rods{amount = 10},/turf/simulated/floor/plating,/area/maintenance/aft) +"cdi" = (/obj/structure/rack{dir = 1},/obj/machinery/light/small{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cdj" = (/obj/effect/decal/cleanable/cobweb2,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cdk" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/aft) "cdl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/prison) "cdm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/aft) @@ -5616,8 +5616,6 @@ "cdZ" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/toxins/misc_lab) "cea" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/misc_lab) "ceb" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/misc_lab) -"cec" = (/obj/item/stack/rods{amount = 10},/obj/structure/table,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"ced" = (/obj/structure/table,/obj/item/weapon/weldingtool,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cee" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/port) "cef" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/aft) "ceg" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/aft) @@ -5663,14 +5661,12 @@ "ceU" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ceV" = (/obj/structure/disposalpipe/segment,/obj/structure/lattice,/turf/space,/area/space) "ceW" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"ceX" = (/obj/structure/rack,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ceY" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ceZ" = (/obj/machinery/atmospherics/pipe/tank/air,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cfa" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/toxins/misc_lab) "cfb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/toxins/misc_lab) "cfc" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Research Division Delivery"; req_access_txt = "47"},/turf/simulated/floor{icon_state = "delivery"},/area/toxins/misc_lab) "cfd" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Research Division"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor{icon_state = "bot"},/area/toxins/misc_lab) -"cfe" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cff" = (/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cfg" = (/obj/machinery/telecomms/server/presets/service,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "cfh" = (/obj/machinery/telecomms/processor/preset_two,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) @@ -5703,7 +5699,6 @@ "cfI" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cfJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 0},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cfK" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/maintenance/asmaint) -"cfL" = (/obj/structure/disposalpipe/segment,/obj/structure/rack{dir = 1},/obj/item/clothing/mask/gas,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cfM" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cfN" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet/l3closet/general,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cfO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -5714,7 +5709,6 @@ "cfT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/toxins/misc_lab) "cfU" = (/obj/item/stack/sheet/cardboard,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cfV" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"cfW" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/device/assembly/timer,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cfX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cfY" = (/obj/machinery/light/small,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cfZ" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -5730,7 +5724,7 @@ "cgj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/preopen{id = "Engineering"; name = "engineering security door"},/turf/simulated/floor/plating,/area/engine/chiefs_office) "cgk" = (/obj/machinery/door/poddoor/preopen{id = "Engineering"; name = "engineering security door"},/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access_txt = "56"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/chiefs_office) "cgl" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "yellow"; dir = 10},/area/engine/break_room) -"cgm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "yellow"},/area/engine/break_room) +"cgm" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "yellow"},/area/engine/break_room) "cgn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 6; icon_state = "yellow"},/area/engine/break_room) "cgo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/atmos) "cgp" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor,/area/atmos) @@ -5753,7 +5747,6 @@ "cgG" = (/obj/machinery/door/airlock/maintenance{name = "Air Supply Maintenance"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cgH" = (/obj/machinery/door/airlock/maintenance{name = "Testing Lab Maintenance"; req_access_txt = "47"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/toxins/misc_lab) "cgI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/toxins/misc_lab) -"cgJ" = (/obj/item/weapon/gun/projectile/revolver/russian,/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cgK" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cgL" = (/obj/machinery/door/airlock/maintenance{name = "Firefighting equipment"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cgM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) @@ -5802,7 +5795,6 @@ "chD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "chE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/maintenance/asmaint2) "chF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"chG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/sign/securearea{pixel_y = 32},/obj/item/stack/cable_coil{amount = 5},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "chH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "chI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/rack{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "chJ" = (/obj/machinery/door/airlock/maintenance{name = "Research Delivery access"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -5860,11 +5852,8 @@ "ciJ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ciK" = (/obj/structure/reagent_dispensers/watertank,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ciL" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"ciM" = (/obj/structure/rack{dir = 1},/obj/item/device/flashlight,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ciN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ciO" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"ciP" = (/obj/structure/table,/obj/item/device/t_scanner,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"ciQ" = (/obj/structure/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ciR" = (/obj/machinery/power/tracker,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area/solar/port) "ciS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/solar/port) "ciT" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/solar/port) @@ -5879,7 +5868,6 @@ "cjc" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 6},/area/security/checkpoint/engineering) "cjd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/aft) "cje" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/aft) -"cjf" = (/obj/item/stack/cable_coil{amount = 5},/turf/simulated/floor/plating,/area/maintenance/aft) "cjg" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/aft) "cjh" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/aft) "cji" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft) @@ -5915,9 +5903,7 @@ "cjM" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cjN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cjO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cjP" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cjQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering) -"cjR" = (/obj/structure/table,/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/weapon/weldingtool,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cjS" = (/obj/structure/rack,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cjT" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cjU" = (/obj/machinery/power/apc{dir = 8; name = "Science Maintenance APC"; pixel_x = -25},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera{c_tag = "Aft Starboard Solar Access"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -5928,7 +5914,6 @@ "cjZ" = (/turf/simulated/floor/plating,/area/maintenance/portsolar) "cka" = (/obj/machinery/power/apc{dir = 4; name = "Aft Port Solar APC"; pixel_x = 23; pixel_y = 2},/obj/machinery/camera{c_tag = "Aft Port Solar Control"; dir = 1},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/portsolar) "ckb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/atmos) -"ckc" = (/obj/structure/closet/crate,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/aft) "ckd" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/aft) "cke" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/aft) "ckf" = (/obj/structure/closet/crate,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/stack/sheet/mineral/plasma{amount = 30},/turf/simulated/floor/plating,/area/engine/engineering) @@ -5949,15 +5934,13 @@ "cku" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office) "ckv" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office) "ckw" = (/obj/structure/table/reinforced,/obj/item/stack/medical/bruise_pack{pixel_x = -3; pixel_y = 2},/obj/item/weapon/reagent_containers/pill/kelotane{pixel_x = -3; pixel_y = -8},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office) -"ckx" = (/obj/machinery/door/poddoor/preopen{id = "Engineering"; name = "engineering security door"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/engineering) -"cky" = (/obj/machinery/door/poddoor/preopen{id = "Engineering"; name = "engineering security door"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/engineering) +"ckx" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/closet/radiation,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/engine/engineering) "ckz" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/grille,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/atmos) "ckA" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/grille,/obj/machinery/meter{frequency = 1443; id = "mair_in_meter"; name = "Mixed Air Tank In"},/turf/simulated/wall/r_wall,/area/atmos) "ckB" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/grille,/obj/machinery/meter{frequency = 1443; id = "mair_out_meter"; name = "Mixed Air Tank Out"},/turf/simulated/wall/r_wall,/area/atmos) "ckC" = (/obj/machinery/atmospherics/binary/pump{dir = 2; icon_state = "intact_on"; name = "Waste Out"; on = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) "ckD" = (/obj/structure/transit_tube{icon_state = "N-S"},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering) "ckE" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"ckF" = (/obj/structure/rack,/obj/item/stack/cable_coil{amount = 5},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ckG" = (/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar) "ckH" = (/obj/machinery/door/airlock/engineering{name = "Aft Starboard Solar Access"; req_access_txt = "10"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "ckI" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar) @@ -5992,7 +5975,6 @@ "cll" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; external_pressure_bound = 0; frequency = 1443; icon_state = "in"; id_tag = "air_out"; internal_pressure_bound = 2000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) "clm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cln" = (/obj/structure/transit_tube{tag = "icon-N-SE"; icon_state = "N-SE"},/turf/space,/area/space) -"clo" = (/obj/structure/rack,/obj/item/weapon/weldingtool,/obj/item/weapon/screwdriver{pixel_y = 16},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "clp" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "clq" = (/obj/machinery/power/apc{dir = 8; name = "Aft Starboard Solar APC"; pixel_x = -26; pixel_y = 3},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "clr" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) @@ -6036,12 +6018,10 @@ "cmd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cme" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cmf" = (/obj/structure/transit_tube{icon_state = "D-SW"},/obj/structure/lattice,/turf/space,/area/space) -"cmg" = (/obj/structure/rack,/obj/item/stack/cable_coil{pixel_x = -1; pixel_y = -3},/obj/item/stack/cable_coil,/obj/item/weapon/wirecutters,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cmh" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cmi" = (/obj/structure/stool,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/camera{c_tag = "Aft Starboard Solar Control"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cmj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cmk" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) -"cml" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/stack/rods{amount = 10},/turf/simulated/floor/plating,/area/maintenance/aft) "cmm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction) "cmn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/engine/secure_construction) "cmo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/secure_construction) @@ -6081,8 +6061,6 @@ "cmW" = (/obj/machinery/gravity_generator/main/station,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/gravity_generator) "cmX" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction) "cmY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/secure_construction) -"cmZ" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/aft) -"cna" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/aft) "cnb" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Engineering"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor{icon_state = "bot"},/area/engine/engineering) "cnc" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = -32; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/aft) "cnd" = (/obj/structure/closet/secure_closet/engineering_welding,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 9; icon_state = "yellow"},/area/engine/engineering) @@ -6098,7 +6076,6 @@ "cnn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/engine/engineering) "cno" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/engine/engineering) "cnp" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/engine/engineering) -"cnq" = (/obj/machinery/door/poddoor/preopen{id = "Engineering"; name = "engineering security door"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "cnr" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cns" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cnt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) @@ -6155,7 +6132,6 @@ "cos" = (/obj/structure/table,/obj/item/device/flashlight{pixel_y = 5},/obj/item/clothing/ears/earmuffs{pixel_x = -5; pixel_y = 6},/obj/item/weapon/airlock_painter,/turf/simulated/floor,/area/engine/engineering) "cot" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "yellow"},/area/engine/engineering) "cou" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"cov" = (/obj/structure/rack{dir = 1},/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cow" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cox" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "coy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) @@ -6166,7 +6142,6 @@ "coD" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction) "coE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/engine/secure_construction) "coF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/engine/secure_construction) -"coG" = (/obj/structure/rack,/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "coH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction) "coI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction) "coJ" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/engine/secure_construction) @@ -6253,7 +6228,6 @@ "cqm" = (/obj/item/weapon/screwdriver,/turf/simulated/floor,/area/engine/engineering) "cqn" = (/obj/machinery/door/airlock/external{name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/engine/engineering) "cqo" = (/obj/structure/cable,/turf/simulated/floor/plating/airless,/area/solar/starboard) -"cqp" = (/obj/item/clothing/head/hardhat,/obj/structure/table,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/plating,/area/maintenance/aft) "cqq" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plating,/area/maintenance/aft) "cqr" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft) "cqs" = (/obj/structure/table,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/stack/cable_coil,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/turf/simulated/floor,/area/engine/engineering) @@ -6282,7 +6256,6 @@ "cqP" = (/turf/simulated/floor/plating/airless,/area/solar/starboard) "cqQ" = (/obj/structure/table,/obj/item/device/taperecorder{pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/aft) "cqR" = (/obj/structure/table,/obj/item/weapon/storage/box/matches,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor/plating,/area/maintenance/aft) -"cqS" = (/obj/structure/table,/obj/item/device/radio/off,/turf/simulated/floor/plating,/area/maintenance/aft) "cqT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/space) "cqU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/space) "cqV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/space) @@ -6920,7 +6893,7 @@ "cDd" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/transport1/centcom) "cDe" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) "cDf" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 5},/area/centcom/ferry) -"cDg" = (/obj/machinery/door/airlock/centcom{name = "Transport Shuttle"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry) +"cDg" = (/obj/effect/landmark{name = "Deathsquad"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry) "cDh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) "cDi" = (/obj/structure/flora/bush,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) "cDj" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/transport1/centcom) @@ -7149,7 +7122,7 @@ "cHy" = (/obj/structure/closet/crate/medical,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) "cHz" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/syndicate_station/start) "cHA" = (/obj/machinery/teleport/station,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"cHB" = (/obj/machinery/teleport/hub,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"cHB" = (/obj/machinery/teleport/hub/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) "cHC" = (/obj/machinery/door/poddoor{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) "cHD" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"},/turf/space,/area/syndicate_station/start) "cHE" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/syndicate_station/start) @@ -8261,7 +8234,7 @@ "dcS" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/mine/north_outpost) "dcT" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Mining North Outpost APC"; pixel_x = 26; pixel_y = 0},/obj/machinery/conveyor_switch{id = "mining_north"},/obj/machinery/camera{c_tag = "North Outpost"; dir = 8; network = list("MINE")},/turf/simulated/floor,/area/mine/north_outpost) "dcU" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/wall,/area/mine/north_outpost) -"dcV" = (/obj/machinery/conveyor{backwards = 2; dir = 2; forwards = 1; id = "mining_north"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/plasticflaps/mining,/turf/simulated/floor,/area/mine/north_outpost) +"dcV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/plasticflaps/mining,/obj/machinery/conveyor{dir = 1; id = "mining_north"},/turf/simulated/floor,/area/mine/north_outpost) "dcW" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/mine/north_outpost) "dcX" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall,/area/mine/north_outpost) "dcY" = (/turf/simulated/floor{icon_state = "damaged3"},/area/mine/abandoned) @@ -8371,7 +8344,7 @@ "deY" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/abandoned) "deZ" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/abandoned) "dfa" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"dfb" = (/obj/machinery/atmospherics/pipe/manifold,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/mine/laborcamp/security) +"dfb" = (/obj/machinery/door_control{id = "Labor"; name = "Labor Camp Lockdown"; pixel_x = 28; pixel_y = 7; req_access_txt = "2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/mine/laborcamp/security) "dfc" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/mine/laborcamp/security) "dfd" = (/obj/structure/girder,/turf/simulated/floor/plating{icon_plating = "asteroidplating"; icon_state = "asteroidplating"; temperature = 273.15},/area/mine/explored) "dfe" = (/obj/structure/door_assembly/door_assembly_eng,/obj/item/weapon/airlock_electronics,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/secure_construction) @@ -8396,7 +8369,7 @@ "dfx" = (/obj/machinery/door/poddoor/preopen{id = "Labor"; name = "labor camp blast door"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) "dfy" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/turf/simulated/wall,/area/mine/laborcamp) "dfz" = (/obj/structure/plasticflaps,/obj/machinery/conveyor{dir = 2; id = "gulag"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) -"dfA" = (/obj/machinery/flasher{id = "Labor"; pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold{dir = 4},/turf/simulated/wall,/area/mine/laborcamp) +"dfA" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/mine/laborcamp/security) "dfB" = (/obj/machinery/light_switch{pixel_x = -27; pixel_y = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) "dfC" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{tag = "icon-asteroidwarning"; icon_state = "asteroidwarning"; temperature = 273.15},/area/mine/laborcamp) "dfD" = (/turf/simulated/floor{tag = "icon-asteroidwarning"; icon_state = "asteroidwarning"; temperature = 273.15},/area/mine/explored) @@ -8470,7 +8443,7 @@ "dgT" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/mine/laborcamp/security) "dgU" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor,/area/mine/laborcamp/security) "dgV" = (/obj/structure/stool/bed/chair/office/dark,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/mine/laborcamp/security) -"dgW" = (/obj/machinery/door_control{id = "Labor"; name = "Labor Camp Lockdown"; pixel_x = 28; pixel_y = 7; req_access_txt = "2"},/obj/machinery/flasher_button{id = "Labor"; pixel_x = 26; pixel_y = -3},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/mine/laborcamp/security) +"dgW" = (/obj/machinery/atmospherics/pipe/manifold,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/flasher_button{id = "Labor"; pixel_x = 0; pixel_y = 26},/turf/simulated/floor,/area/mine/laborcamp/security) "dgX" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/mine/laborcamp/security) "dgY" = (/turf/simulated/floor/plating,/area/mine/laborcamp/security) "dgZ" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8},/obj/machinery/meter,/turf/simulated/floor/plating,/area/mine/laborcamp/security) @@ -8686,7 +8659,7 @@ "dlb" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/wall,/area/mine/west_outpost) "dlc" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/mine/west_outpost) "dld" = (/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) -"dle" = (/obj/machinery/conveyor{backwards = 2; dir = 2; forwards = 1; id = "mining_west"},/obj/structure/plasticflaps/mining,/turf/simulated/floor,/area/mine/west_outpost) +"dle" = (/obj/structure/plasticflaps/mining,/obj/machinery/conveyor{dir = 1; id = "mining_west"},/turf/simulated/floor,/area/mine/west_outpost) "dlf" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor,/area/mine/living_quarters) "dlg" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/mine/living_quarters) "dlh" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/mine/living_quarters) @@ -8763,7 +8736,7 @@ "dmA" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/weapon/paper/mining,/obj/structure/barricade/wooden{name = "wooden barricade (CLOSED)"},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/production) "dmB" = (/obj/machinery/conveyor{dir = 4; id = "mining_external"},/obj/structure/plasticflaps/mining,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) "dmC" = (/obj/machinery/conveyor{dir = 4; id = "mining_external"},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/production) -"dmD" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor{icon_state = "white"},/area/mine/living_quarters) +"dmD" = (/obj/structure/sign/xeno_warning_mining,/turf/simulated/wall,/area/mine/explored) "dmE" = (/turf/simulated/floor{icon_state = "white"},/area/mine/living_quarters) "dmF" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor{icon_state = "white"},/area/mine/living_quarters) "dmG" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/mine/living_quarters) @@ -8779,8 +8752,8 @@ "dmQ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor,/area/mine/production) "dmR" = (/obj/machinery/mineral/unloading_machine{dir = 1; icon_state = "unloader-corner"; input_dir = 2; output_dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) "dmS" = (/obj/machinery/mineral/equipment_vendor,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) -"dmT" = (/obj/machinery/computer/crew,/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/mine/living_quarters) -"dmU" = (/obj/machinery/sleeper{dir = 4; icon_state = "sleeper-open"},/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/mine/living_quarters) +"dmT" = (/obj/machinery/computer/crew,/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/mine/living_quarters) +"dmU" = (/obj/machinery/light/small,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{icon_state = "white"},/area/mine/living_quarters) "dmV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/camera{c_tag = "Sleeper Room"; dir = 1; network = list("MINE")},/turf/simulated/floor{icon_state = "white"},/area/mine/living_quarters) "dmW" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor{icon_state = "white"},/area/mine/living_quarters) "dmX" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/mine/living_quarters) @@ -8884,18 +8857,22 @@ "doR" = (/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "dark"},/area/security/prison) "doS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; id_tag = "releaseatmo"; on = 1},/turf/simulated/floor{icon_state = "dark"},/area/security/prison) "doT" = (/obj/machinery/atmospherics/unary/vent_scrubber{id_tag = "releaseatmo"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "dark"},/area/security/prison) +"doU" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/flasher{id = "Labor"; pixel_x = 0; pixel_y = -26},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) "doV" = (/obj/machinery/light/small{dir = 8},/obj/item/weapon/wrench,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/security/prison) "doW" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/security/prison) "doX" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering) "doY" = (/obj/structure/window/reinforced,/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/prison) "doZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/security/armory) "dpa" = (/obj/machinery/light{dir = 1},/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; network = list("Prison"); pixel_x = 0; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/camera{c_tag = "Prison Hallway West"; network = list("SS13","Prison")},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/prison) +"dpb" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4},/obj/machinery/mineral/labor_points_checker,/turf/simulated/wall,/area/mine/laborcamp) +"dpc" = (/obj/machinery/computer/shuttle/ferry/request,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) "dpd" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/obj/structure/closet/secure_closet/hos,/turf/simulated/floor/carpet,/area/security/hos) "dpe" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact"; level = 2},/turf/simulated/wall,/area/security/prison) "dpf" = (/obj/structure/stool/bed,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "dark"},/area/security/prison) "dpg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/security/prison) "dph" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "dark"},/area/security/prison) "dpi" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/security/prison) +"dpj" = (/obj/machinery/door/airlock/centcom{name = "Transport Shuttle"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry) "dpk" = (/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/carpet,/area/security/hos) "dpl" = (/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plating,/area/security/prison) "dpm" = (/obj/machinery/door/poddoor/preopen{auto_close = 0; density = 1; icon_state = "closed"; id = "transvent"; name = "prisoner release blast door"},/turf/simulated/floor/plating,/area/security/prison) @@ -8908,7 +8885,6 @@ "dpt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/secure_construction) "dpu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering) "dpv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering) -"dpw" = (/obj/item/weapon/crowbar,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "dpx" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/syndicate_mothership) "dpy" = (/obj/effect/decal/cleanable/dirt,/obj/item/device/radio/beacon,/turf/simulated/floor/plating/airless,/area/AIsattele) "dpz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/medical/virology) @@ -8924,7 +8900,6 @@ "dpJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/aisat) "dpK" = (/obj/machinery/recharge_station,/turf/simulated/floor{dir = 9; icon_state = "yellow"},/area/aisat) "dpL" = (/obj/machinery/atmospherics/pipe/tank/air,/turf/simulated/floor{dir = 5; icon_state = "yellow"},/area/aisat) -"dpM" = (/obj/machinery/light/small,/obj/structure/table,/obj/item/device/flashlight,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "dpN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "dpO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/stool/bed/chair,/obj/item/weapon/storage/fancy/cigarettes,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "dpP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/stool/bed/chair,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -8968,6 +8943,7 @@ "dqB" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) "dqC" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/assembly/chargebay) "dqD" = (/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) +"dqE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 28; pixel_y = 0},/obj/structure/closet/emcloset,/turf/simulated/floor,/area/aisat) "dqF" = (/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 28},/obj/item/device/radio/intercom{broadcasting = 1; freerange = 1; listening = 1; name = "Common Channel"; pixel_x = -27; pixel_y = 5},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "dqG" = (/obj/machinery/ai_slipper{icon_state = "motion0"; uses = 10},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "dqH" = (/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 28},/obj/item/device/radio/intercom{broadcasting = 1; freerange = 1; listening = 1; name = "Common Channel"; pixel_x = 27; pixel_y = 5},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) @@ -9065,7 +9041,7 @@ "dsv" = (/obj/machinery/teleport/station,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/aisat) "dsw" = (/obj/structure/transit_tube/station{dir = 4; icon_state = "closed"; reverse_launch = 1; tag = "icon-closed (EAST)"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/aisat) "dsx" = (/obj/machinery/computer/upload/borg,/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1447; listening = 0; name = "Station Intercom (AI Private)"; pixel_y = -29},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) -"dsy" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/aisat) +"dsy" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/closet/emcloset,/turf/simulated/floor,/area/aisat) "dsz" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/aisat) "dsA" = (/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 2},/area/aisat) "dsB" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/aisat) @@ -9110,7 +9086,7 @@ "dto" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/aisat) "dtp" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/aisat) "dtq" = (/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1447; listening = 0; name = "Station Intercom (AI Private)"; pixel_y = -29},/obj/machinery/camera/motion{c_tag = "MiniSat Antechamber"; dir = 1; network = list("MiniSat")},/turf/simulated/floor/carpet,/area/turret_protected/aisat_interior) -"dtr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/flora/kirbyplants,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor,/area/aisat) +"dtr" = (/obj/machinery/sleeper{dir = 4; icon_state = "sleeper-open"},/turf/simulated/floor{dir = 6; icon_state = "warnwhite"},/area/mine/living_quarters) "dtt" = (/obj/structure/lattice,/turf/space,/area/AIsattele) "dtu" = (/obj/structure/lattice,/obj/structure/lattice,/turf/space,/area/space) "dtv" = (/obj/structure/girder,/turf/simulated/floor/plating/airless,/area/AIsattele) @@ -9129,7 +9105,6 @@ "dtL" = (/obj/machinery/computer/slot_machine{balance = 15; money = 500},/obj/item/weapon/coin/iron,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "dtM" = (/obj/structure/transit_tube,/obj/structure/lattice,/turf/space,/area/space) "dtN" = (/obj/effect/decal/cleanable/cobweb,/obj/item/weapon/coin/gold,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"dtO" = (/obj/item/device/flash,/obj/structure/closet,/obj/item/weapon/coin/iron,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "dtP" = (/obj/item/weapon/coin/gold,/obj/item/weapon/coin/iron,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "dtQ" = (/obj/machinery/computer/slot_machine,/turf/simulated/floor/wood,/area/bridge/meeting_room) "dtT" = (/turf/simulated/floor{dir = 8; icon_state = "loadingarea"},/area/mine/production) @@ -9142,7 +9117,6 @@ "duh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/engine/engineering) "dui" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/wall/r_wall,/area/engine/engineering) "duj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor,/area/engine/engineering) -"dun" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/closet/radiation,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/engine/engineering) "duo" = (/obj/structure/transit_tube{tag = "icon-E-W-Pass"; icon_state = "E-W-Pass"},/turf/space,/area/space) "duu" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/mine/laborcamp/security) @@ -9242,29 +9216,29 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlahlahjalWalXalYalZalWamaamaahlahlahjahjahlahlahlahlahlahlahlahlahlahlahlahjahlaiCalCalCalCambamcajNamcajjaiHakuakvamgalKalKalKagEalKalKamhalKalKalKalKalKalKalKamialKalKalKamjalKalKalKalKalKalKamkalnalnamlammamnamoampamqamramsamtamuamuamvabIahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjamwamxamyamzamwahjahlahlahjahlahjahlahjahlahlahlahjakmakmakmalvakmakmakmakmakmakmahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlamaamaamaamaamaahjahjalWamAamBamCalWamDamaahlahlahjahjahlahlahlahlahlahlahlahlahlahlahjahjahlaiCamEamEamEaiCajgajhamFagIafZahPajOahyamKamKamKamKamKamLamMamKamKamKamKamKamKamKamNamOamOamOamPamQamOamRagDagCagBalNamSamTahuahuahuamUahuamVabIamWamXabIamYamZabIahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjamwanaanbancamwahjahlahlahjahlahjahlahjakmaknakmaknakmandalvalvalvalvalvalvaneakmahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlamaamaamaamaanfanganhamaahlahlalWanianjankalWanlamaahlahlahjahjahlahlahlahlahlahlahlahlahlahjahjahlahlaiCanmanmanmaiCahlahjadcaebabUannaetanpanpanqanranqanpanpansantantantanuantantanvanwanxabIabIanyabIabIabIabIabIabIabIabIabIabIanzanAanBanCanDanEanFanGanHanIanJabIahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlamwanKanLanMamwanNanNanNanNanNanOanPanQakmanRalvaneakmakmalvakmakmakmakmanSakmakmahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahjamaanTanUanVanlanWanlamaanXanYalWalWanZaoaalWanlamaamaanXaobaocamaamaahlahjahlahlahlahlahlahlahjahjahlaodaoeaoeaoeaofahlahjahyaKUajNannaOdanpaomaonaonaonaooanpaopantaoqaoraosaotantalHalKaouabIaovaowaoxaoxaoxaoxaoxaoyaoxaoxaoxaozafRaoAaoBaoCaoDaoEaoFaoGaoHaoIaoJabIahjaoKaoLaoLaoMaoLaoLaoNahlahlahlahlahlahjaoOaoPaoOahlanNamwamwaoQaoRamwaoSalvalvalvakmaoTaoUaoVakmalvalvalvaoWakmalvakmdtNdtLakmalvaoYakmahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaoZapaapbahlapcapdapeahlahjapfapgapfahlahlahjamaaphapiapjapkanlaplamaapmanlapnapoasGanlanlanlanlanlanlanlanlanlamaahlappahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahjahyaKUaSvannaSLanpapuapvapwapxapyanpaopantapzapAapBapCapDalHalKalMabIapEapFapGapHapGapGapIapJapGapHapGapFapGapGapHapGapKapLapMapNapOapPapQapQapQapRapSapSapSapSapSapRapQahlahlahlahlahjapTalvapUahlanNapVapWapXapYalvalvalvakmalvakmapZalvalvakmalvaqaaqbaqcanSalvakmdtPdtOakmalvaqeakmahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaqfaqgbahaqgaqfaqibcpaqiaqfahjaqkanlaqlahlahlamaamaamaamaamaaqmamaamaamaaqnaqocBIaqoaqpaqqaqraqsamaanlamaamaamaanlamaahlahjahlahlahlahlahlahlahjahlahjahjahjahjaogaogaogaogaogaogaogaqtaptanpaquapvaqvaqwaqxanpaopantaqyapAaqzaqAaqBalHalKaXOabIahvaqDaqEaqFaqGaqHaqIaqJaqHaqKaqLaqMaqHaqNaqOaqPaqQaqRaqSaqTaqUaqVaqWaqXapQapRapSapSapSapSapSapRapQahjahjahjahjaqYaqZaoParaarbanNarcalvardalvarealvakmakmarfakmakmargakmakmaqcarharialvakmalvarjarjarjarjarjarjarjarjarjbRJbRJbRJbRJdsibRJbRJahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkaqgarlaqgarkaqiarmaqiarkamaarnapgaroaobanYamaaqnaqoaqoaqoarparqarqarrarsamaamaamaamaamaamaamaamaanlartamaaruanlamaamaamaahlahlahlahlahlahjahjahjahjahjahlahlaogarvarwaogarxaryarzaqtarAarBarCarDapvapvarEanpaoparFarGarGarHarIarJarKalKarLabIahvarMarNarOarParQarRarSaqHarTarUarVaqHarUarUarWapQarXarYarZasaasbascasdaseasfapSapSapSapSapSasgapQapQapQahlahlashalvalvalvaoSanNasiaqcardalvasjaskaslanSalvalvalvalvasmalvalvasnasoalvaspalvarjasqbcDassarjastasuasvarjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkaswasxasyarkaszasAasBarkasCanlanlasDasEartasFasGamaamaamaamaamaamaamaasHamacUbdsiakjamaanlasLasManlasFamaasNanlanlanlapfahlahlahlahlahlahjahlahlahjahlaogaogaogapqapqaogapqapqapqaqtasOasPasQasRaonasSasTanpaopantantasUasVasWantasXalKalMabIahvaqDaqHaqHaqHaqHarRarSaqHaqHasYaqHaqHaqHasZaqHapQataarYatbatcatdateasbatfatgapSapSapSapSapSathatiatjatkahlahlatlalvalvatmalvanNatnalvatoatpatpatpatpatqatpatralvalvalvalvalvalvalvalvakmaskarjatsattattarjbbmavFbgharjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkatvatwatxarkatyatwatxarkatzaqnatAaqoaqoaqoatBatCamaatDatEatFatGatHamaasHamadsiasIcUbatJatKatLamaamaamaamaamaamaamaanlatMahjahlahlahlahlahjahlahjdsidsiatNatOatNapqapqaogaogatPaogatQatRatSatTatTatUatTatTatTatVatWatXatXatYantantatZalKauaabIaubapFaucaudaueaqHaufaugauhauiaujaujaKTaulaujaumaunarXarYauoaupauqaurausautauuapSapSapSapSapSauuauvauwauxahjahjakmalvalvakmakmanNanNanNanNanNanNanNanNanNakmauyauzakmakmakmakmakmakmakmakmalvauAarjattattauBbjNatsauDarjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlaqfarkauEauFaqfarkauGauFaqfamaauHamaamaamaamaamaasGamaanlauIaavanlanlamaasHamacUZahjcUZamaauLatLamaauMauNamaauOatzamaanlamaaogauPauQauQauQauQauQauQauQauRaogaogaogaogapqaogauSapqauTauUauVauWauWauWauXauWauWauWauYauZauWauWavaavaavbavcavdavdaveavfarMarNarParPavgarRavhavhaviavjavkavlaviavhavhavmavnavoauoaupauqaurausavpavqapSapSapSapSapSavqavrauwauxahlahlakmavsalvalvavtakmavuaneavvavwavxakmatnavyakmavzalvakmavAalvakmaqaaqbavBatpatpatpavCavDavEbjObnJavHavIarjbRJbRJdsidsibRJbRJbRJbRJahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlavJavKavKavKavLavKavKavKavMavNavOavMavMavMavPamaavQamaanlauJavSanlavTamaasHamaamaamaamaamaavUamaamaatzavSavVanlanlapqapqavWavXapqapqapqapqapqapqapqapqavYavZawaawbawbawbawbawbawbawcawdaweawfawfawfawgawfawfawfawfawfawhawhawhawhawhawialKawjawkawlawmaqHaqHaqHaqHarRawnavhaviawoawpawqawrawsawtawuawvawwawxawyawzawAawBawCawDapSapSapSapSapSawEawFawGawHahlahlakmalvalvalvalvalvalvavBatpatpatpatpatpatpatpawIalvalvalvalvaspalvalvardalvalvauAarjattawJattavGattawKarjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjawLawMawNawMawOawNawNawPawMawNawQawRawSawSawTamaavQamaawUanlanlawVawWamaawXarqarqarqarqarqawYawZamaaxaanlamaasCasCaogapqaogaxbaxcaxdaxdaxdaxdaxdaxdaxdaxeaxbaxfaxgaxgaxgaxgaxgaxgaxgaopaxhawfaxiaxjaxkaxlaxmaxnaxoaxpaxqaxraxsaxtawhaxualKaxvabIaxwapFaucaudaxxaqHarRaxyawtawtawtaxzaxAaxBaxCaxDaunaxEaxFaxGaxHaxIaxJaxKaxLaxMapSapSapSapSapSaxNapQapQapQakmakmakmaxOakmakmanSakmakmardakmakmaxPakmakmanSakmardaxQakmakmaxRakmalvaxSardalvasoarjaxTavDaxUaxVaxWavDaxXarjahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkavJaxYavJaxZawNawNayaavJaxYavJaybaycawOaydamaavQamaamaamaamaamaayeayeayfaspakmayeayeayeayeaygaogaogaogaogaogaogaogapqarvaxbahlahjahlahjahlahjahlahjahlaxbaxfaxgayhayiayjaykaylaxgaopaymaynayoaypayqayraysaysaytayuayvaywaywayxawhaxualKaxvabIayyarMarNarParPayzarRayAaxCayBayCayDayEayFayFayGayFapQayHayIayJayKayLayMapQayNapSapSapSapSapSayNapQaoUalvayOayPakmakmakmayQalvakmayRardakmaySalvakmayTalvakmayUayVakmayWalvakmanOanQardanOanQarjayXavDayYayZazaavDcbBarjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjazbaqfazcatwazdazeazfazgazhazdatwaziazjaqfazkazlamaazmaznaznaznaqoazoayeazpazqazrazsaztazuazpayeazvazwazxapqapqapqapqapqapqazyaxbahjazzazzazzazzazzazzazzahjaxbaxfaxgazAazBazCazDazAaxgazEazFawfazGazHazIazJaywazKazLazMazNaywaywaywazOaxualKazPabIayyaqDaqHaqHaqHaqHaufazQayFayFayFayFayFayFazRazSazTayFapQapQapQapQazUakmapQayNapSapSapSapSapSayNapQakmalvazVayPakmazWakmalvalvakmalvardakmalvalvakmalvalvakmardaskakmalvalvakmazXalvardalvaqcarjarjarjazYarjazZarjarjarjbRJbRJbRJbRJbRJahjahjahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlawLaxYaAaaAbaAbaAbaAbaAcaxYawLaAdaqfaAeaydaAfaAfaAfaAfaAfaAfaAgayeazpaAhazraAiazrazrazpayeaogaAjaAkaAkaAkaAkaAkaAkaAkaAkaAlahlazzaECaGvaGwaGxdteazzahlaxbaxfaxgazAaAraAsaAtazAaxgaopapqawfaAuaAvaAwaAxaAyaywaAzaAAaywaywaABaywaACaxualKaxvabIaxwapFaucaudaADaqHarRazQayFaAEazSaAFaAFayFazRaAGazTayFaAHaAIaAJaAKaALakmahjaAMaANaANaANaANaANaAOahlakmalvaAPaAQakmakmakmakmakmakmaARaASakmakmakmakmakmakmakmaATaAUaAVaAVaAVaAWaAXaAYaAZaBaaBbaAVaBcaBdaBeaBfaBgalvaqcaBhahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlaBiaBjaBkaBjaBjaBlaBmaBjaBjaBkaBnaBoaqfaxZaBpaBqaBraBsaBtaBuaBvaBwayeazpaAhazraBxazrazrazpayeaByaBzaBAaBBaBCaBDaBEaBFaBGaBHaAlahjazzaAoaApaAmaAnaAqazzahjaxbaxfaxgaBNaBOaBPaBOaBQaxgaopaBRawfaBSaBTazIaBUazIaBVaBWaBXaBYaBZawhaCaawhaxualKaxvabIayyarMarNarOarPaCbarRazQayFaCcazSazSazSayGaCdaCeaCfayFaCgaChaHpaISaDDakmahlahjahlahjahlahjahlahjahlakmaClaCmaCnaCoaCpakmaCqalvaxSardalvakmahlakmalvalvalvayOaCraCsaCsaCsaCsaCsaCtaCuaCvaCwaCxaCxaCyaCwaCzaCAaCBatpaCCaCDahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaBiaBnaBjaCEaCFaCFaCGaCHaCIaCJaCKaCFaCFaCLaCMavJaxZaCNaAfaCOaCPaCQaCRaCQaCSayeaCTaAhazrazrazrazrazraCUaBGaCVaCWaCWaCWaCXaCWaCWaCWaBGaAlahlazzaBIaBJaBKaAnaBLazzahlaxbaxfaxgaDcaDdaDeaDfaDgaxgaopaDhawfawfaDiaDjaDkaDjaDlawfawfaDmaDnawhaDoawhaxualKaxvabIayyaDpaDqaDqaDqaDqaDraDsaDtaDuaDvaDwaDwaDwaDxaDwaDyaDwaDzaDAaKqaAKaKrakmakmakmakmakmakmakmakmakmakmakmakmakmakmaDEakmakmakmaDFaBaaAZaDGaDHasJaDHaDJaDKaDLaDMaDNaDOaDOaDOaDOaDOaDPaDQaDRaDRaDSaDTaDUaDRaDVaDWaDXakmaDVaDVaDVahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahjamaasianUanVanlanWanlamaanXanYalWalWanZaoaalWanlamaamaanXaobaocamaamaahlahjahlahlahlahlahlahlahjahjahlaodaoeaoeaoeaofahlahjahyaKUajNannaOdanpaomaonaonaonaooanpaopantaoqaoraosaotantalHalKaouabIaovaowaoxaoxaoxaoxaoxaoyaoxaoxaoxaozafRaoAaoBaoCaoDaoEaoFaoGaoHaoIaoJabIahjaoKaoLaoLaoMaoLaoLaoNahlahlahlahlahlahjaoOaoPaoOahlanNamwamwaoQaoRamwaoSalvalvalvakmarualvarwakmalvalvalvaoWakmalvakmdtNdtLakmalvaoYakmahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaoZapaapbahlapcapdapeahlahjapfapgapfahlahlahjamaaphapiapjapkanlapVamaapmanlapnapoasGanlanlanlanlanlanlanlanlanlamaahlappahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahjahyaKUaSvannaSLanpapuapvapwapxapyanpaopantapzapAapBapCapDalHalKalMabIapEapFapGapHapGapGapIapJapGapHapGapFapGapGapHapGapKapLapMapNapOapPapQapQapQapRapSapSapSapSapSapRapQahlahlahlahlahjapTalvapUahlanNasjapWapXapYalvalvalvakmalvakmapZalvalvakmalvaqaaqbaqcanSalvakmdtPasDakmalvasnakmahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaqfaqgbahaqgaqfaqibcpaqiaqfahjaqkanlaqlahlahlamaamaamaamaamaaqmamaamaamaaqnaqocBIaqoaqpaqqatzasNamaanlamaamaamaanlamaahlahjahlahlahlahlahlahlahjahlahjahjahjahjaogaogaogaogaogaogaogaqtaptanpaquapvaqvaqwaqxanpaopantaqyapAaqzaqAaqBalHalKaXOabIahvaqDaqEaqFaqGaqHaqIaqJaqHaqKaqLaqMaqHaqNaqOaqPaqQaqRaqSaqTaqUaqVaqWaqXapQapRapSapSapSapSapSapRapQahjahjahjahjaqYaqZaoParaarbanNasLalvardalvandalvakmakmarfakmakmargakmakmaqcasEarialvakmalvarjarjarjarjarjarjarjarjarjbRJbRJbRJbRJdsibRJbRJahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkaqgarlaqgarkaqiarmaqiarkamaarnapgaroaobanYamaaqnaqoaqoaqoarparqarqarrarsamaamaamaamaamaamaamaamaanlartamaatzanlamaamaamaahlahlahlahlahlahjahjahjahjahjahlahlaogarvauSaogarxaryarzaqtarAarBarCarDapvapvarEanpaoparFarGarGarHarIarJarKalKarLabIahvarMarNarOarParQarRarSaqHarTarUarVaqHarUarUarWapQarXarYarZasaasbascasdaseasfapSapSapSapSapSasgapQapQapQahlahlashalvalvalvaoSanNauMaqcardalvatOaskaslanSalvalvalvalvasmalvalvasEasoalvaspalvarjasqbcDassarjastasuasvarjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkaswasxasyarkaszasAasBarkasCanlanlaoUaoUartasFasGamaamaamaamaamaamaamaasHamacUbdsiakjamaanlaplasManlasFamaaoVanlanlanlapfahlahlahlahlahlahjahlahlahjahlaogaogaogapqapqaogapqapqapqaqtasOasPasQasRaonasSasTanpaopantantasUasVasWantasXalKalMabIahvaqDaqHaqHaqHaqHarRarSaqHaqHasYaqHaqHaqHasZaqHapQataarYatbatcatdateasbatfatgapSapSapSapSapSathatiatjatkahlahlatlalvalvatmalvanNatnalvatoatpatpatpatpatqatpatralvalvalvalvalvalvalvalvakmaskarjatsattattarjbbmavFbgharjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkatvatwatxarkatyatwatxarkapVaqnatAaqoaqoaqoatBatCamaatDatEatFatGatHamaasHamadsiasIcUbatJatKatLamaamaamaamaamaamaamaanlatMahjahlahlahlahlahjahlahjdsidsiatNaqeatNapqapqaogaogatPaogatQatRatSatTatTatUatTatTatTatVatWatXatXatYantantatZalKauaabIaubapFaucaudaueaqHaufaugauhauiaujaujaKTaulaujaumaunarXarYauoaupauqaurausautauuapSapSapSapSapSauuauvauwauxahjahjakmalvalvakmakmanNanNanNanNanNanNanNanNanNakmauyauzakmakmakmakmakmakmakmakmalvauAarjattattauBbjNatsauDarjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlaqfarkauEauFaqfarkauGauFaqfamaauHamaamaamaamaamaasGamaanlauIaavanlanlamaasHamacUZahjcUZamaauLatLamaarhauNamaauOapVamaanlamaaogauPauQauQauQauQauQauQauQauRaogaogaogaogapqaogareapqauTauUauVauWauWauWauXauWauWauWauYauZauWauWavaavaavbavcavdavdaveavfarMarNarParPavgarRavhavhaviavjavkavlaviavhavhavmavnavoauoaupauqaurausavpavqapSapSapSapSapSavqavrauwauxahlahlakmaqralvalvarcakmaqsaneavvavwandakmatnandakmavzalvakmavAalvakmaqaaqbavBatpatpatpavCavDavEbjObnJavHavIarjbRJbRJdsidsibRJbRJbRJbRJahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlavJavKavKavKavLavKavKavKavMavNavOavMavMavMavPamaavQamaanlauJavSanlavTamaasHamaamaamaamaamaavUamaamaanlavSavVanlanlapqapqavWavXapqapqapqapqapqapqapqapqavYavZawaawbawbawbawbawbawbawcawdaweawfawfawfawgawfawfawfawfawfawhawhawhawhawhawialKawjawkawlawmaqHaqHaqHaqHarRawnavhaviawoawpawqawrawsawtawuawvawwawxawyawzawAawBawCawDapSapSapSapSapSawEawFawGawHahlahlakmalvalvalvalvalvalvavBatpatpatpatpatpatpatpawIalvalvalvalvaspalvalvardalvalvauAarjattawJattavGattawKarjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjawLawMawNawMawOawNawNawPawMawNawQawRawSawSawTamaavQamaawUanlanlawVawWamaawXarqarqarqarqarqawYawZamaavuanlamaasCasCaogapqaogaxbaxcaxdaxdaxdaxdaxdaxdaxdaxeaxbaxfaxgaxgaxgaxgaxgaxgaxgaopaxhawfaxiaxjaxkaxlaxmaxnaxoaxpaxqaxraxsaxtawhaxualKaxvabIaxwapFaucaudaxxaqHarRaxyawtawtawtaxzaxAaxBaxCaxDaunaxEaxFaxGaxHaxIaxJaxKaxLaxMapSapSapSapSapSaxNapQapQapQakmakmakmandakmakmanSakmakmardakmakmaxPakmakmanSakmardaqrakmakmaxRakmalvaqrardalvasEarjaxTavDaxUaxVaxWavDaxXarjahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkavJaxYavJaxZawNawNayaavJaxYavJaybaycawOaydamaavQamaamaamaamaamaayeayeayfaspakmayeayeayeayeaygaogaogaogaogaogaogaogapqarvaxbahlahjahlahjahlahjahlahjahlaxbaxfaxgayhayiayjaykaylaxgaopaymaynayoaypayqayraysaysaytayuayvaywaywayxawhaxualKaxvabIayyarMarNarParPayzarRayAaxCayBayCayDayEayFayFayGayFapQayHayIayJayKayLayMapQayNapSapSapSapSapSayNapQasnalvayOayPakmakmakmasnalvakmasnardakmaxaalvakmavyalvakmayUayVakmavxalvakmanOanQardanOanQarjayXavDayYayZazaavDcbBarjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjazbaqfazcatwazdazeazfazgazhazdatwaziazjaqfazkazlamaazmaznaznaznaqoazoayeazpazqazrazsaztazuazpayeaxOazwazxapqapqapqapqapqapqazyaxbahjazzazzazzazzazzazzazzahjaxbaxfaxgazAazBazCazDazAaxgazEazFawfazGazHazIazJaywazKazLazMazNaywaywaywazOaxualKazPabIayyaqDaqHaqHaqHaqHaufazQayFayFayFayFayFayFazRazSazTayFapQapQapQapQazUakmapQayNapSapSapSapSapSayNapQakmalvazVayPakmazWakmalvalvakmalvardakmalvalvakmalvalvakmardaskakmalvalvakmazXalvardalvaqcarjarjarjazYarjazZarjarjarjbRJbRJbRJbRJbRJahjahjahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlawLaxYaAaaAbaAbaAbaAbaAcaxYawLaAdaqfaAeaydaAfaAfaAfaAfaAfaAfaAgayeazpaAhazraAiazrazrazpayeaogaAjaAkaAkaAkaAkaAkaAkaAkaAkaAlahlazzaECaGvaGwaGxdteazzahlaxbaxfaxgazAaAraAsaAtazAaxgaopapqawfaAuaAvaAwaAxaAyaywaAzaAAaywaywaABaywaACaxualKaxvabIaxwapFaucaudaADaqHarRazQayFaAEazSaAFaAFayFazRaAGazTayFaAHaAIaAJaAKaALakmahjaAMaANaANaANaANaANaAOahlakmalvaAPaAQakmakmakmakmakmakmaARaASakmakmakmakmakmakmakmaATaAUaAVaAVaAVaAWaAXaAYaAZaBaaBbaAVaBcaxSaBeaBfaxQalvaqcaBhahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlaBiaBjaBkaBjaBjaBlaBmaBjaBjaBkaBnaBoaqfaxZaBpaBqaBraBsaBtaBuaBvaBwayeazpaAhazraBxazrazrazpayeaByaBzaBAaBBaBCaBDaBEaBFaBGaBHaAlahjazzaAoaApaAmaAnaAqazzahjaxbaxfaxgaBNaBOaBPaBOaBQaxgaopavsawfaBSaBTazIaBUazIaBVaBWaBXaBYaBZawhaCaawhaxualKaxvabIayyarMarNarOarPaCbarRazQayFaCcazSazSazSayGaCdaCeaCfayFaCgaChaHpaISaDDakmahlahjahlahjahlahjahlahjahlakmaqraCmaCnaCoaCpakmatOalvaqrardalvakmahlakmalvalvalvayOaCraCsaCsaCsaCsaCsaCtaCuaCvaCwaCxaCxaCyaCwaCzaCAaCBatpaCCaCDahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaBiaBnaBjaCEaCFaCFaCGaCHaCIaCJaCKaCFaCFaCLaCMavJaxZaCNaAfaCOaCPaCQaCRaCQaCSayeaCTaAhazrazrazrazrazraCUaBGaCVaCWaCWaCWaCXaCWaCWaCWaBGaAlahlazzaBIaBJaBKaAnaBLazzahlaxbaxfaxgaDcaDdaDeaDfaDgaxgaopaDhawfawfaDiaDjaDkaDjaDlawfawfaDmaDnawhaDoawhaxualKaxvabIayyaDpaDqaDqaDqaDqaDraDsaDtaDuaDvaDwaDwaDwaDxaDwaDyaDwaDzaDAaKqaAKaKrakmakmakmakmakmakmakmakmakmakmakmakmakmakmaDEakmakmakmaDFaBaaAZavtaDHasJaDHaDJaDKaDLaDMaDNaDOaDOaDOaDOaDOaDPaDQaDRaDRaDSaDTaDUaDRaDVaDWaDXakmaDVaDVaDVahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaCLaDYaDZaEaaCFaEbaCFaEbaCFaEbaCFaEbaCFaEcaEdazdaxZaEeaAfaEfaEgaEhaEiaEjaEkayeaElaEmaEnazraEoaEpaEqayeaEraEsaCWaCWaCWaCWaCWaCWaEtaEuaEvaEwaBMaDbaExaCZaDaaCYazzahjaxbaEDaEEaEFaEGaEHaEIaEJaEEaEKaELaEMaENaEOaEPaEQaEPayvaERawhaESaESawhaDmawhaETaEUaEVabIaEWaEXaEXaEXaEYaEZaFaaFbaFcaFdaFeaFcaFfaFcaFgaFcaFhaFiaFjaFkaFlaAKaFmaFnaFoaFpaFqaFnaFraFsaFsaFsaFsaFtaFuaFvaFsaFwaFxaFyaFzaFAaFBaFCaFDaFEasKaFEaFGaFHaFIaFJaFKaDOaFLaFMaFNaDOaDRaFOaDRaFPaFQaFRaFSaFTaFUaFVaFWaFXaFYaFZaGaahjahlahjahlahjahlahjahlahjahjahlaGbaGbaGbaGbaGbaGbaGbahlahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGdaCFaCFaGeaCFaEbaCFaEbaGfaEbaCFaEbaCFaEcaEdazdaxZbdiaAfaGhaGiaGjaGkaGjaGlaGmaGmaGnaGmaGoaGpaEobgBaGmaGraGsaCWaCWaCWaGtaCWaCWaCWaGuaAlahlaEAazzaEyaEzaEyazzazzahlaxbaGyaxgaGzaGAaGBaGCaGDaGEaGFaGGaGHaGIaAvaDmaDmaDmaGJaGKawhaGLaGMawhaCaawhaGNaGOaGPabIamrabIabIabIaGQabIaGRaGSayFaGTazSayFaGUayFaGVayFaGWaGXaGYaGZaHaaHbaHcaCnaHdaHeaHfaHgaHhaHfaHfaHiaHfaHjaHkaCnaHlaHmaCnaHnaHoaKsaHqaHraHsaIRaIRaIRaIRaHtaHuaHvaHwaHxaHyaHzaHAaDOaHBaHCaDRaHDaHEaHFaHGaFTaHHaFXaFWaHIaDVaDVaDVahjahjahjahjahjahjahjahjahjahlaGbaGbaGbaGbaGbaGbaGbaGbaGbdsiahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaCLaHJaDZaEaaCFaEbaCFaEbaCFaEbaCFaEbaCFaEcaEdazdaHKaHLaHMaHNaHNaHNaHNaHLaHOaHPaHQaHRayeaukaHTaqjaqCayeaHWaBzaBGaHXaHYaHZaIaaIbaIcaIdaAlahlaIeahlaIfaIgaIfahlahjahlaxbaGyaxgaIhaIiaIjaIkaIlaxgapsapqawhaImaInaDmaDmaDmaIoaIpawhahlahlaIqaIraIsaItaIuaIvaIwaIxaIqahlahlaIyaIzaIAaIBayFaICazSazSazSaCeazSazSazSaIDaAKaIEaAKaIFaIGakmaIHaIIaIIaIJaIKaILaIIaIMaIIaINaIOaINaIPaINaIQaIRaIRaDBaIRaIRaITaIRaCkaKwaIRaIUaHuaHwaIVaIWaIXaIYaIZaDOaJaaJbaJcaJdaJeaJfaHGaJgaHHaFXaFWaFXaJhaJiaJjahlahlahlahlahlahlahjahlahjahlaGbaGbaGbaGbaGbaGbaGbaGbaGbahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGdaCFaCFaGeaCFaEbaCFaEbaGfaEbaCFaEbaCFaEcaEdazdaxZbdiaAfaGhaGiaGjaGkaGjaGlaGmaGmaGnaGmaGoaGpaEobgBaGmaGraGsaCWaCWaCWaGtaCWaCWaCWaGuaAlahlaEAazzaEyaEzaEyazzazzahlaxbaGyaxgaGzaGAaGBaGCaGDaGEaGFaGGaGHaGIaAvaDmaDmaDmaBUaGKawhaGLaGMawhaCaawhaGNaGOaGPabIamrabIabIabIaGQabIaGRaGSayFaGTazSayFaGUayFaGVayFaGWaGXaGYaGZaHaaHbaHcaCnaHdaHeaHfaHgaHhaHfaHfaHiaHfaHjaHkaCnaHlaHmaCnaHnaHoaKsaHqaHraHsaIRaIRaIRaIRaHtaHuaHvaHwaHxaHyaHzaHAaDOaHBaHCaDRaHDaHEaHFaHGaFTaHHaFXaFWaHIaDVaDVaDVahjahjahjahjahjahjahjahjahjahlaGbaGbaGbaGbaGbaGbaGbaGbaGbdsiahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaCLaHJaDZaEaaCFaEbaCFaEbaCFaEbaCFaEbaCFaEcaEdazdaHKaHLaHMaHNaHNaHNaHNaHLaHOaHPaHQaHRayeaukaHTaqjaqCayeaHWaBzaBGaHXaHYaHZaIaaIbaIcaIdaAlahlaIeahlaIfaIgaIfahlahjahlaxbaGyaxgaIhaIiaIjaIkaIlaxgapsapqawhaImaInaDmaDmaDmaIoaIpawhahlahlaIqaIraIsaItaIuaIvaIwaIxaIqahlahlaIyaIzaIAaIBayFaICazSazSazSaCeazSazSazSaIDaAKaIEaAKaIFaIGakmaIHaIIaIIaIJaIKaILaIIaIMaIIaINaIOaINaIPaINaIQaIRaIRaDBaIRaIRaITaIRaCkaKwaIRaIUaHuaHwaIVaIWaIXaIYaIZaDOaJaaGJaJcaJdaJeaJfaHGaJgaHHaFXaFWaFXaJhaJiaJjahlahlahlahlahlahlahjahlahjahlaGbaGbaGbaGbaGbaGbaGbaGbaGbahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaJkaJlaBjaCEaCFaCFaCFaJmaCFaCFaJnaCFaCFaCLaJoawLaxZawNaJpaJqaJqaJqaJqaJqaJqaJqaJraJsayeapraqhaprayeayeaJuaJvaJwaAkaAkaAkaAkaJuaJxaJyaAlaJzaJAaJBaJCaJDaJEaJBaJBaJFaxbaJGaxgaJHaxgaJIaJJaJKaxgaqtavWawhawhawhaJLaJMaJNawhawhawhaJOaJPaJQaJRaIuaIuaIuaIuaIuaJSaJTaJPaJUaIyaJVaIAaJWayFayFayFayFayFayFayFayFayFaIDaJXaJYaJZaKaaKbaKcaKdaKeaIIaKfaKgaKhaKiaKjaINaKkaKlaINaKmaINaKnaKoaKpaCiaCjaCjajQagXaeKaMaaIRaKxaKyaKzaIVaKAaIXaIYaKBaDOaKCaKDaKEaKFaKGaHGaHGaDRaDVaKHaFWaFXaKIaKJaKKahlahjahlahlahlahlahjahlahjahlaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaJkaBjaBkaBjaBjaKLaBmaBjaBjaBkaJlaKMaqfaKNawNavJaKOaKOaKPaKOaKQarkaKRaKSaJsaGgaMzaKVaKWaKXaKYaKYaKZaKYaKYaKYaKYaKYaKYaKYaLaaLbaLcaLdaLeaLeaLfaLgaLeaLeaLeaLhaLiaLjaLfaLeaLeaLeaLkaLlaLmaIuaLnaLoaIvaIwaIwaIwaItaIuaIuaLpaIuaLqaLraLsaLtaLuaLvaLwaLxaIuaIuaLyaLzaLAaLBaLAaLCaLDaLEaLFaIuaLGaIuaAKaLHaLIaJYaJYaJYaJYaKbaKcaMXdrhaIIaLKaLLaKjaLMaLNaINaLOaLPaLQaLRaINaIRaLSbgAaLUaPSaLWaLXaLYaLZaDCaIRaIUaMbaMcaMcaMdaMeaMcaMfaDOaMgaMhaDRaHGaHGaHGaHGaDRaMiaMjaMkaFXaDVaDVaDVaMlaMlaMlaMmaMnaMoahjahlahjaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlavJaxYaMpaAbaAbaAbaAbaMqaxYavJaAdaqfaAeaMrazdaMsaMtaMuaMuaMvarkaMwaKSaMxaMyaMzaMAaMBaMCaMDaMEaMFaKYaKYaKYaKYaKYaKYaKYaLaaKYaMGaKYaKYaKYaMHaMIaKYaKYaKYaKYaMJaKYaMKaKYaKYaKYaMLaLlaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaLpaIuaMMaMNaMOaMPaMQaMRaMSaMTaIuaIuaLyaIuaIuaIuaIuaIuaIuaIuaIuaIuaMUaIuaAKaJYaMVaJYaJYaJYaJYaMWaKcaMXaQSaIIaMYaMZaNaaIIaIIaINaNbaKlaNcaLRaNdaINaIRaIRaNeaIRaIRaIRaNfaNgaNfaIRaIUaHuaNhaHwaHwaNiaHwaNjaDOaDRaDRaDRaDRaDRaDRaNkaDRaFXaFXaFWaFXaNlaNmaDVaNnaNoafJaNqaNraNsahjahlahjaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjazbaqfazdatwazdaNtaNuaNvaNwazdatwaNxaNyaqfaxZawNazdaNzaNAaMuaMuaMvarkaNBaKSaJsaMyaMzaNCaNDaNEaNEaNEaNFaNGaNHaNEaNIaNEaNEaNEaNJaNKaNLaNEaNEaNEaNMaNNaNOaNPaNPaNQaNRaNSaNTaNUaKYaKYaMLaLlaIuaNVaIuaNWaNWaNWaNWaNWaNWaNWaNWaNXaNWaNWaNWaNWaNWaNWaNWaNWaNWaNWaNWaNYaNWaNWaNWaNWaNWaNWaNWaNWaIuaIuaIuaAKaNZaOaaNZaNZaNZaObaOcaKcaMXaqdaIIaIIaOeaIIaIIaOfaINaOgaKlaOhaOiaOjaINaIRaOkaOlaOmaOnaOmaOmaOoaOpaIRaIUaHuaOqaOqaOraOsaOtaOtaOuaDOaOvaOwaOxaDVaOyaOzaOAaFXaFXaOBaOAaDVaOCaDVaODaOEaOFaOFaOGaOHaMnaMnaOIaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkawLaxYawLaxZawNawNayaawLaxYawLaOJaOKaOLawNawLaOMaOMaKPaOMaKQarkaONaKSaJsaOOaOOaOPaOQaOOaORaORaORaORaORaOSaOTaORaOUaORaORaORaOVaOWaOXaOWaOYaOZaPaaKYaKYaPbaPcaPdaKYaKZaKYaKYaPeaPeaIuaIuaIvaPfaJPaJPaPgaPgaPgaPgaPhaPiaPjaPkaPlaPmaPnaPmaPoaPmaPpaPkaPqaPiaPraPgaPgaPgaPgaJPaJPaPsaItaIuaIuaIIaoXaokaKcaKcaKcaKcaPvaPwaPxaKcaIIaPyaPzaPAaINaINaINaINaPBaINaPCaINaINaIRaOmaPDaPEaPEaPEaPEaPFaOmaIRaPGaHuaPHaHwaOraOsaHwaHwaPIaDOaPJaPKaPLaDVaFXaPMaPNaPOaPOaPPaPNaPQaPRaDVafsaPTaPUaPVaOFaPWaPXaPXaPWaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjavJaPZawNavKaOLawNawNaQaavKawNaPZaOLawNawNawNaQbaQcaQcaQcaQcaQcaQcaQcaQdaJsaOOaQeaQfaQgaQhaQiaQjaQkaQlaQmaQnaQoaQpaQqaQraQsaQtaQuaQvaQwaQxaOYaQyaPaaPaaQzaPaaQAaPeaPeaQBaQCaPeaPeaPeaQDaIuaIvaQEahlahlahlahlahlahlahlaPiaQFaQGaQHaQIaQJaQKaQLaQMaQNaQOaQPaPiahlahlahlahlahlahlahlaQQaItaIuaQRaIIaPtaPuaQTaKcaKcaKcaQTaKcaQUaLJaQVaKcaQWaQXaINaQYaQZaRaaRbaRcaRdaReaRfaINaOmaRgaRhaRhaRhaRhaRiaOmaIRaRjaHuaRkaRkaOraOsaRlaRlaRmaDOaDOaRnaDOaDVaRoaOzaOAaRpaRpaOBaOAaDVaDVaDVaMmaRqaRraMmaMnaMnaMnaMnaRsaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjavJaPZawNavKaOLawNawNaQaavKawNaPZaOLawNawNawNaQbaQcaQcaQcaQcaQcaQcaQcaQdaJsaOOanTaQfaQgaQhaQiaQjaQkaQlaQmaQnaQoaQpaQqaQraQsaQtaQuaQvaQwaQxaOYaQyaPaaPaaQzaPaaQAaPeaPeaQBaQCaPeaPeaPeaQDaIuaIvaQEahlahlahlahlahlahlahlaPiaQFaQGaQHaQIaQJaQKaQLaQMaQNaQOaQPaPiahlahlahlahlahlahlahlaQQaItaIuaQRaIIaPtaPuaQTaKcaKcaKcaQTaKcaQUaLJaQVaKcaQWaQXaINaQYaQZaRaaRbaRcaRdaReaRfaINaOmaRgaRhaRhaRhaRhaRiaOmaIRaRjaHuaRkaRkaOraOsaRlaRlaRmaDOaDOaRnaDOaDVaRoaOzaOAaRpaRpaOBaOAaDVaDVaDVaMmaRqaRraMmaMnaMnaMnaMnaRsaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlawLaRtaRuaRuaRuaRuaRuaRuaRuaRuaRtaRuaRvawNawNaRwawNawNaRxawNaRyawNaRzaRAaRBaOOaRCaOPaRDaORaREaQnaQnaQnaQnaQnaQoaRFaQnaQnaQnaQtaOVaRGaQwaQwaOYaQyaPaaRHaRIaRIaRJaPeaRKaRLaRMaRNaROaRPaIuaIuaIvaQEahlahlahlahlaPiaPiaPiaPiaRQaRRaRSaRTaRUaRVaRWaRXaRYaRZaSaaPiaPiaPiaPiahlahlahlahlaQQaItaIuaIuaSbaKcaScaSdaSeaKcaSfaSgaSeaQUaLJaShaKcaSiaKcaSjaSkaSkaSkaSlaSmaSnaSoaSkaSpaSqaSraRhaSsaStaRhaSuaOmaIRaIUaHuaHwaHwaOraOsaHwaHwaHwaolaSwaHwaSxaDVaKHaSyaSzaRpaRpaSAaSzaSBaDVaSCaSDaPTaSEaOFaOFaSFaPXaPXaSGaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjaqfaqfaSHaSIaSIaSIaSIaSIaSIaSJaqfaqfarkaSKaJtaSMaSMaSMaSNaSMaSMaSMaSOaSMaSOaOOaRCaSPaSQaORaSRaQnaQnaSSaSTaSUaSVaSSaQnaQnaQnaSWaOVaSXaSYaSZaOYaTaaPaaTbaTcaTdaTeaPeaTfaTgaThaRMaTiaTjaIuaIuaIvaJTaPhaTkaTlaPiaPiaTmaTnaToaTpaTqaTqaTraTsaTqaTtaTqaTqaTqaTuaTvaTwaTxaPiaPiaTlaTkaJOaTyaItaIuaIuaIIaTzaPuaTAaKcaKcaKcaTAaKcaQUaLJaTBaTCaKcaTDaINaSkaTEaTFaTGaTHaTIaTJaSkaTKaTLaTMaRhaTNaTOaRhaTPaTQaIRaIUaHuaTRaTRaOraOsaTSaHwaHwaTTaHwaTUaTVaDVaTWaTXaTYaRpaRpaTZaTYaFXaDVaUaaOFaPTaSEaOFaOGaUbaMnaMnaOIaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUdazeawOaUeaUfaUgaUhaUiaUjaUkaUlaUmaUkaUnaUoaUpaUqaUraORaUsaQnaQnaSSaSUaUtaUuaSSaQnaQnaQnaQtaOVaOYaOYaUvaOYaUwaUxaUxaUxaUxaUyaUzaUAaRMaRMaRMaRMaTjaIuaIuaIvaIwaIwaUBaUCaUDaPiaUEaUFaUGaTqaTqaTqaUHaUIaUJaUKaULaUMaUNaULaUOaUPaUQaPiaURaUCaUSaUTaIwaItaIuaIuaSbaKcaPuaQTaKcaUUaKcaQTaKcaQUaLJaUVaKcaKcaKcaUWaSkaSkaUXaUYaUZaVaaTJaVbaINaVcaTMaVdaRhaRhaRhaTPaVeaIRaVfaHuaDOaDOaOraOsaVgaVhaHwaViaVjaKAaVkaVlaMjaVmaVnaVoaVoaVpaVqaVraVlaVsaVtaVuaVvaVtaVwaNsahlahjahjaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl @@ -9273,68 +9247,68 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaYpaYqaVzaxZawNaYraWZaYsaXaaXaaXaaXaaYsaWZaSMaYtaYuaXfaXgaYvaYwaYxaYyaXhaYzaYAaYBaORaYCaYDaYEaQnaORaYFaYGaYHaYHaYHaYHaYIaYHaYHaYJaYKaYKaYKaYLaYKaYMaYNaYOaYOaYPaYQaYQaYQaYQaYQaYQaYRaYSaYRaYQbqwaYVbkMbkMbrIbambkMaYVbqwaYWaYWaYXaYYaYWaYWaYWaYWaYWaYWaYZaYOaYOaIIaZaaZbaZcaZdaKcaKcaKcaZeaZfaZgaKcaZhaZiaZjaINaINaINaZkaZlaZlaZlaINaINaINaZmaRhaRhaZnaZoaZpaZqaNfaIRaZraYjaZsaDOaZtbaHaZvaVhaZyaZuaTTaVhbbsaDVaZzaFXaZAaRpaRpaZAaFXaZBaDVaZCaZDaZEaSEaOFaOGaZFaMnaMnaOIaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcaUcawLaZGaOLaZHaSOaZIaZIaZIaWZaZJaZIaZKaZIaSMaZLaZMaZNaZOaZPaZPaZQaZRaZPaZSaYAaZTaORaYCaYDaYEaQnaORaZUaYGaYHaZVaZWaZWaZWaZXaYHaZYaZZbaababaYNaYNaYNaYNaIubacbadaYQbaebafbagaHSbaibajbakbalbqwaYTbkMbkMbnIaGqbnIbkMbkMasrbqwbaqbarbasbatbaubavbawbaxaYWaXVaIuaIuaIIaIIaIIaIIaIIbayaSbbaybazbaAaIIaIIaIIaIIaIIbaBbaCbaCbaCbaCbaCbaCbaDbaCbaBaNfbaEbaEbaFaYkaYkaYkaYkbaBaZrbaGaZsaDOaDOaDOaZwaDOaZxaDOaZwaDOaDOaDVbaIbaJbaKbaKbaKbaKbaLaDVaDVbaMaOFbaNaSEaOFaOFaSGaPXaPXaSGaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjaqfaqfaSHaSIaSIaSIaSIaSIaSIaSJaqfaqfarkbaOaHLbaPaSMaSMaSMaSMaSMaSMaSMaSMaSMbaQaVWbaRaXgaYvbaSaYybaTaXhbaUbaVbaWaORaYCaYDaYEaQnaORaZUaYGaYHaZWbaXbaXaZWbaXaYHaZYbaYbaZbaZbbabbbbbcaYNbbdbbeaXDbcxbbgbbhbbibbjbbjbbibbkbblbqwaHVbkMbkMbnIbaobnIbkMbkMbczbqwbbtbaxbbubbvbbwbbxbaxbbyaYWaXVbbzaIubdpbbBaYkaYkaYkaYkaYkaYkaYkaYkbbCaYkaYkaYkaYkbbDaYkaYkaYkaYkaYkaYkaYkaYkbbBaYkaYkaYkaYkaYkaYkaYkaYkbbEbbFbbGbbHbbKbbHbbHbbHbbIbbJbbHbbHbbHbbHbbLbbMbbHbbHbbHbbHbbHbbHbbNbbObbPbbQbbRbbSaPVbbTbbUaMnaMnbbVaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlavJavNavMavMavMavMavMavMavMavMavNavMbbWawNawNbbXbbYbbZbbZbbZbbZbbZbcabcbaOObccbbYbcdaXgaXhaXhbcebcfaXhaORaORbcgaORaYCaYDbchbciaORaZUaYGaYHaZWbcjaZWbaXbckaYHaZYbclbaZbaZbaZbcmbcnaYNbcobbeaXDbbpbcqbcrbcsbctbcubcvbbkbcwbqwbbnbnIbkMbmiaYUbmibkMbnIbbfbqwbcAbcBbbubbvbcCbbxbaxbaxaYWaHUaIuaIubdpbbBaYkaYkaYkaYkaYkaYkaYkaYkbcEaYkaYkaYkaYkaYkaYkbcFbbHbbHbbHbbHbbHbbHbcGbbHbbHbbHbbHbbHbbHbbHbcHbcIbcJbcKaWNaWNaWNaWNaWNaWMaWNaWNaWNaWNaWNaWNaWNaWNaWNaWNaWNaWNbcLbcMbcNbcObcObcPaOFaOFaOFbcQaPXaPXbcQaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlavJavNavMavMavMavMavMavMavMavMavNavMbbWawNawNbbXbbYbbZbbZbbZbbZbbZbcabcbaOOaoTbbYbcdaXgaXhaXhbcebcfaXhaORaORbcgaORaYCaYDbchbciaORaZUaYGaYHaZWbcjaZWbaXbckaYHaZYbclbaZbaZbaZbcmbcnaYNbcobbeaXDbbpbcqbcrbcsbctbcubcvbbkbcwbqwbbnbnIbkMbmiaYUbmibkMbnIbbfbqwbcAbcBbbubbvbcCbbxbaxbaxaYWaHUaIuaIubdpbbBaYkaYkaYkaYkaYkaYkaYkaYkbcEaYkaYkaYkaYkaYkaYkbcFbbHbbHbbHbbHbbHbbHbcGbbHbbHbbHbbHbbHbbHbbHbcHbcIbcJbcKaWNaWNaWNaWNaWNaWMaWNaWNaWNaWNaWNaWNaWNaWNaWNaWNaWNaWNbcLbcMbcNbcObcObcPaOFaOFaOFbcQaPXaPXbcQaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjawLawMawNawMawOawNawNawPawMawNawMawOawNawNawNbcRbcSbcRbcRbcRbcRbcRbcTaOOaOOaOObcTaXfaXgaYvbcUbcVbcWaXhbcXbcYbcZaORaORaORaOObbXaOOaZUaYGaYHbdaaZWbaXbdbbdcaYHaZYaYNbddbaZbaZbdebdfbdgbdhbbeaXDbuqbdjbcrbcsbdkbdlbcvbdmbdnbnGbupbuobkMbtfbundsxbkMbrKbtbbrHbdubdvbdwbdxbdxbdybdzbdAaYWbdBbdCaIubdpbbBaYkaYkbdDaYkbdEbdFbdFbdFbdGbdFbdFbdFbdHaYkaYkaYkaYkaYkaYkbdIbdJbdKbbBaYkaYkaYkaYkaYkbdLbdMbdNbdObdPaYkaYkaYkaYkaYkbdQbdRaYkaYkaYkaYkaYkaYkaYkaYkaYkaYkaYkaYkaYkbdSbdTbdUbdVbdWaOFaOFaOGbdXaMnaMnaOIaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlarkavJbdYavJaxZawNawNayaavJbdZavJaybbeabebbebbcRbecbedbeebefbegbcRbehbeibejbejbekbelbembenbenbeobepbenbeqbeqberbeqbesaUoaUoaUoaUobetbeubevbewbexbexbeybezbevbeAbeBbeCbaZbaZbeDbeEbeFbeGbbeaXDaYQbaibeHbbibbibeIbbibbkbeJaYQbqybqwbapbqwbqwbqwbqAbqwbhzaYWbeNbeObePbeQbaxbeRbaxbeSaYWaXVaIuaIubeVbeVbeVbeVbeVbeVbeVbeWbeXbeYbeZbfabfabeWbfbbfbbfbbfbbfbbfcbfcbfcbfdbfcbfcbfcbfcbfeaYkbdQbffbfgbfhbfibfjaYkaYkbfkbfkbflbflbflbflbflbfmbfnbfnbfnbfnaYkbfnbfobfnbfnbfpbfqbfqbfqbfqbfrbfsbftbfuaNsahjahlahjaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjazbaqfazcatwazdazeazfbfvbfwazdatwaziazjaqfazbarkbcRbfxbfybfybfybfzbcRbfAbfBaRCaRCbcTbfCaXhaYvbfDaYybfEaXhbfFbfGbfHbfHbfIbfJbfKbfKbfLbfKbfMbfNbfObfPbfObfObfQbfRbfSbfTbfUbaZbaZbfVbfWbfXbeGbbebfYaYQbfZbgabgbdtQbgcbgdbgebgfaYQbqxcmqboZcltcltboXboYclybgiaYWbgjbgkbglbgmbaxbgnbaxbgoaYWaXVaIubgpbeVbgqbgrbgsbgtbgubeVbgvbgwbgwbgxbgybgybgybgzboLbjpbgCbfbbgDbgEbgEbgEbgEbgFbgGbgHbgIbgJbgIbgIbgIbgKbgLbgMbgNbgMbgObgObflbgPbgQbgRbfldombgTdombflbfmaYkbfpbfqdolbgVdolbfqbgWbgXbfqbgYbgZaMmaMnbhaahjahlahjaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjazbaqfazcatwazdazeazfbfvbfwazdatwaziazjaqfazbarkbcRbfxbfybfybfybfzbcRbfAbfBaRCaRCbcTbfCaXhaYvbfDaYybfEaXhbjebiBbfHbfHbfIbfJbfKbfKbfLbfKbfMbfNbfObfPbfObfObfQbfRbfSbfTbfUbaZbaZbfVbfWbfXbeGbbebfYaYQbfZbgabgbdtQbgcbgdbgebgfaYQbqxcmqboZcltcltboXboYclybgiaYWbgjbgkbglbgmbaxbgnbaxbgoaYWaXVaIubgpbeVbgqbgrbgsbgtbgubeVbgvbgwbgwbgxbgybgybgybgzboLbjpbgCbfbbgDbgEbgEbgEbgEbgFbgGbgHbgIbgJbgIbgIbgIbgKbgLbgMbgNbgMbgObgObflbgPbgQbgRbfldombgTdombflbfmaYkbfpbfqdolbgVdolbfqbgWbgXbfqbgYbgZaMmaMnbhaahjahlahjaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbaGbahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjawLbdYaAaaAbaAbaAbaAbaAcbdZawLahjahjahjahlbcRbhbbcRbhcbfybhdbhebcRaRCbbYbhfbhgbhhaXhaXhaXhaXhaXhaXhbhibhjbhkaRCbhlaYHaYHaYHbhmaYHaYHaYHbhnaYHaYHaYHaYHbhobhpbhqbhrbaZbaZbhsbhtbeFbeGbbebhuaYQbhvbgaaYRaYRaYRbaibhwbhxaYQahjckNcnAboTboUboWcnzckNahjaYWaLTbhBbhCbhDbaxbeRbhEbhFbhGbhHbhIbhJbeVbhKbhLbhMbhNbhObhPbgybhQbgybhRbgybgybhSbhTbhVbhUbhWbfbbhXbgEbhXbgEbhXbhYbgEbfcbhZbhZbiabibbfgbicbfibidbiebifbigbigbflbihbiibijbikbilbimbinbflbiobfnbipbfqbiqbirbiqbisbitbitbfqbiubgZahlahjahlahjahlahjahlaGbaGbaGbaGbaGbaGbaGbaGbaGbahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahjahjahlahlahlahlahlahjahjahlbcRbivbiwbixbiybiybizbiAbbZbhgaOObiBbiCbiDbiDbiDbfKbfKbfKbiEbiFbiFbiFbiGaYHbiHbiIbiJbiKbiLbiMbiNbiOaYHbiPbiQbiRbiSbiTbiUbiVbiWbiXbiVbiYbiZbjabjbbjcbjdbjebjfbjgbjhbjibhwaYQaYQahjckNcnAboUcltboUcnzckNahjaYWbFabjmbaxbjnbaxbjodoNbjqaYWaXVaIuaIubeVbjrbjsbjtbjubjvbjwbgybjxbjybjzbjAbjAbjBbjCbjDbjEbjFbfbbhXbgEbhXbgEbhXbhYbjGbfcbjHbjIbjJbjKbfgbjLbjMdtkdrgdrgdrbbjPbjQbjRbjSbjSbjSbjTbjSbjUbjVbjWbjXbjYbjZbkabkbbitbkcbkdbkebfqbiubgZbgZbgZbgZbgZahjahjahjahjahjahjahjahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahjahjahlahlahlahlahlahjahjahlbcRbivbiwbixbiybiybizbiAbbZbhgaOObvkbiCbiDbiDbiDbfKbfKbfKbiEbiFbiFbiFbiGaYHbiHbiIbiJbiKbiLbiMbiNbiOaYHbiPbiQbiRbiSbiTbiUbiVbiWbiXbiVbiYbiZbjabjbbjcbjdbpZbjfbjgbjhbjibhwaYQaYQahjckNcnAboUcltboUcnzckNahjaYWbFabjmbaxbjnbaxbjodoNbjqaYWaXVaIuaIubeVbjrbjsbjtbjubjvbjwbgybjxbjybjzbjAbjAbjBbjCbjDbjEbjFbfbbhXbgEbhXbgEbhXbhYbjGbfcbjHbjIbjJbjKbfgbjLbjMdtkdrgdrgdrbbjPbjQbjRbjSbjSbjSbjTbjSbjUbjVbjWbjXbjYbjZbkabkbbitbkcbkdbkebfqbiubgZbgZbgZbgZbgZahjahjahjahjahjahjahjahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlahlahlahjahjahlahlahlahlahlahjahjahlbcRbkfbcRbkgbkhbkhbkibcRbkjbkkaOObklbkmbklbklbklbkmbklaOOaOOaYHaYHaYHbknaYHbiNbiNbkobiNbiNbiNbiNbiNbkpbkqbkrbksbktbkubkubkubkvbkwbkxbkybkzbkAbkBbkCbkDbkEbkFbkGbkHbkIbkJaYQahjahjckNcnAboWcmWboTbDDckNahjahjbkQaYWbkRaYWaYWaYWaYWbkSaYWbkTaIuaIubeVbkUbjsbkVbhNbhObkWbgybhRbkXbkYbkZblablbbfbblcbldblebfbbhXblfbhXbgEbhXbhYbgEbfcbfgbfgbfgbfgbfgbjLbfidqNblhblibljblkbllblmblnblobloblpbijblqbflblrblsbltbfqblublvblwblxblyblzbfqbiublAceYblBblCblBahlahlahlahlahlahlahjahjahjahjahjahjahjdsiahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahjahjahlahlahlahlahlahjahlahlahlahlahlahlahlahjahlbcRblDblEblFbkhblGblHbcRahlahjdsiblIblIblIblIblIblIblIahlahlblJblKblLblMblNbiNbiNbiNbiNbiNbiNbiNbiNblObhrbaZblPblQblRblSblTblUbiSblVaYNbYYblXblYblZbmabmdbmdbmcbmdbmebmfbmbahjahlckNbBjbzTcltcltbyGckNahlahjbmkbmlbmmbmnbmobmpbmqbmrbmsbmtaIubmubmvbCybmxbkVbmybmzbeVbmAbhRbkXbkZbmBbgybmCbfbbYFbmEbmFbfbbmGbmHbmIbmJbmKbmLbmKbmMbmNbmObmNbmNbmNbmPbfibmQbiedqCdqobmRbmSbmTbmUbmVbmVbmWbmXbmYbflbmZblsbnabfqbnbbncbndblxbitbnebfqbiublAblAbgZbgZbgZbgZbgZbgZbgZahlahlahjahlahlahjahlahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahjahlahlahlahlahlahlahlahjahlbcRbnfbngbnhbnibcRbcRbcRahlahldsiblIblIblIblIblIblIblIahlahlbnjbnkbiNbnlbnmbnmbnmbnmbnmbnmbnmbnmbnmbnnbnobnpbnqbnrbnsbntbnubhsbnvbnwbnxbnybnzbnAblZblZbmbbnBbnCbnDbnEbnFbmbahlahlckNbvIbvJbmhbyDbyEckNahlahlbnLbnMbmmbnNbmsbnObmsbnPbmsbmtaIuaIubeVbnQbjsbkVbnRbnSbeVbnTbnUbnVbnWbnXbgybnYbnZboabobbocbfbbfcbodbfcbfcbfcboeboeboeboeboeboeboeboebjLbfiblgblhblibofbogbohboibojbojbojbmWbijbokbflbolblsbombfqbonboobonbopbitboqbfqborbosbosbosbosbosbosbosbotbgZbgZbgZbgZahlahlahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlbRJahlahlahjblIblIblIblIblIblIblIboubovbowboxbiNbiNbiNboyboyboyboybiNbiNbiNbiNbkpbozbaZboAboBboCboDboEbhsboFbaZboGboHboIboJboKbNoaNpboNboOboPboQbjlbmbahjahlckNbkNbnHcoCbmjbmwckNahlahjbmkbpbbpcbpdbmsbpebmsbnPbmsbpfaIuaIubeVbpgbjsbkVbphbpibeVbpjbhRbgybpkbplbpmbpnbnTbpobppbpqbprbpsbptbgybpubpvbpwbpxbpybpzbpAbpBbpCbpDbgKbgLbpGbpFbpEbpHbpIbflbpJbojbojbpKbpLbijbpMbflbpNbpObpPbfqbpQbpRbpSbpTbpUbpVbfqbpWbpXbpXbpXbpXbpXbpXbpXbiubgZbpYbpZbgZbgZahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlbRJahlahlahjblIblIblIblIblIblIblIboubovbowboxbiNbiNbiNboyboyboyboybiNbiNbiNbiNbkpbozbaZboAboBboCboDboEbhsboFbaZboGboHboIboJboKbNoaNpboNboOboPboQbjlbmbahjahlckNbkNbnHcoCbmjbmwckNahlahjbmkbpbbpcbpdbmsbpebmsbnPbmsbpfaIuaIubeVbpgbjsbkVbphbpibeVbpjbhRbgybpkbplbpmbpnbnTbpobppbpqbprbpsbptbgybpubpvbpwbpxbpybpzbpAbpBbpCbpDbgKbgLbpGbpFbpEbpHbpIbflbpJbojbojbpKbpLbijbpMbflbpNbpObpPbfqbpQbpRbpSbpTbpUbpVbfqbpWbpXbpXbpXbpXbpXbpXbpXbiubgZbpYbfGbgZbgZahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahldsiahlahlahjblIblIblIblIblIblIblIbqabqbbqabqcbqdbiNbiNbiNbiNbiNbiNbiNbiNbqeaYHaYHbqfbaZbaZbqgbqhbqibqjbhsbqkbaZbqlbqmbnzbqnbqobqpbqqbqrbqsbqtbqubqvbmbahlahlckNdrNbmgdrkcpgbbrckNahlahlbqBbqCbqCbqCbqCbqCbqCbqDbqCbqEbqFbqFbeVbeVbqGbqHbqIbqJbeVbqKbhRbgybgybgybgybqLbgybqMbqNbgybgybgybqNbgybgybpvbqObqPbqQbqRbqSbqTbqUboebqVbqWboVbqXbqYbqZbiebflbrabijbijbrbbrcbijbrdbrebrfbrfbrgbrhbrhbribMVbrjbMVbrhbfqbpXbpXbrkbrlbrmbrnbrobpXbrpbrqbrrbrsbrtbgZahlahjahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldsiahlahlahjblIblIblIblIblIblIblIbrubrvbrubrwbiNbiNbiNboyboyboyboybiNbiNbrxbryaYHbrzbaZbaZbqgbrAbntbqjbhsbaZbaZbqlbqmbrBaIuaQQbqpbrCbrDbrEbrFbrFbrGbmbahjahjckNckNbkPbbqbbqbbockNahjahjbrJbkObrLbrMbrNbrObrPbrQbqCbrRaIuaIubrSbrTbrUbrVbrWbrXbrYbrZbsabrZbsbbrZbrZbscbrZbsdbsebrZbrZbrZbsfbsgbsgbshbqObsibqQbsjbsjbskbslboebjLbfibsmbsnbsobspbspbflbsqbsrbssbrebstbijbsubrebsvbswbsxbsybszbsAbsBbsCbsDbsEbFPbsGbsHbsIbsJbsJbsJbsKbsLbsMbgZbsNblAbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbRJahlahlahjblIblIblIblIblIblIblIbsObovbsPbsQbiNbiNbiNbiNbiNbiNbiNbiNbiNbrxbsRaYHbsSbcmbaZbqgbaZbsTbaZbhsbaZbsUbnxbsVbrBaIuaQQbqpbmbbsWbsXbsYbsZbtabmbahlahlahjckNckNbhyckNckNahjahlahlbrJbtcbtdbtebkKbtgbtgbthbtibtjaIuaIubtkbtlbhRbqMbtmbtnbtobtnbtpbtnbtqbtrbtnbtsbpqbttbgybgybgybtubtvbtvbtwbtxbtybtzbqQbtAbtBbqTbslboebfhbfibtCbtCbtDbtCbtCbflbrebrebrebrebBAbtFbtEbreboMbtHbtIbsEbsEbtJblsbtKbtLbtMbtNbtObtPbtQbtRbtRbtSbtTbpXbtUbgZbsNblAbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbRJahjahjahjblIblIblIblIblIblIblIbrubrvbrubnkbtVbiNbiNbtWbtXbtYbtXbtXbtXbtZbuabevbubbiXbiVbucbiVbudbiWbiXbuebufboGbsVbrBaXDbugbuhbmbbuibujbukbulbumbmbahlahlahjbdrbggcoCbeMbdrahjahlahlburbusbutbutbuubuvbuwbuxbqCbuyaIuaIubnTbnTbuzbqMbuAbuBbuCbuDbuEbuFbuGbuCbuDbuCbuDbuCbuDbuCbfabfabtvbuHbsjbuIbuJbqObqQbuKbuLbuMbuNboebuObuPbuQbuRbuSbsEbsEbuTbsEbsEbuUbuVbuWbsEbsDbsEbuXbuYbuZbvabvbbvcbvdbvebvdbvdbvdbvfbvgbvhbvibvhbvjbvhbpXbtUbgZbsNbvkbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbRJahjahjahjblIblIblIblIblIblIblIbrubrvbrubnkbtVbiNbiNbtWbtXbtYbtXbtXbtXbtZbuabevbubbiXbiVbucbiVbudbiWbiXbuebufboGbsVbrBaXDbugbuhbmbbuibujbukbulbumbmbahlahlahjbdrbggcoCbeMbdrahjahlahlburbusbutbutbuubuvbuwbuxbqCbuyaIuaIubnTbnTbuzbqMbuAbuBbuCbuDbuEbuFbuGbuCbuDbuCbuDbuCbuDbuCbfabfabtvbuHbsjbuIbuJbqObqQbuKbuLbuMbuNboebuObuPbuQbuRbuSbsEbsEbuTbsEbsEbuUbuVbuWbsEbsDbsEbuXbuYbuZbvabvbbvcbvdbvebvdbvdbvdbvfbvgbvhbvibvhbvjbvhbpXbtUbgZbsNaBRbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlblIblIblIblIblIblIblIbvlbvmbvlbvnbvobvnbvnbvnbvnbvnbvpbvqbiNbrxbvraYHbvsbaZbvtbvubvvbvwbvxbvybvzbvwbvwbvAbrBaJSbvBbqpbmbbvDbvEbvFbvGbumbmbahlahlahjbdrcocbbqboRbdrahjahlahlbrJbvKbvLbvMbvNbuvbuwbuxbqCbvOaIuaIubvPbvQbvRbqMbvSbvTbuCbvUbvVbvWbvXbvYbvZbwabwbbwabwcbuCbgybgybtvbwdbsjbwebwfbwgbwhbwibwjbwjbwkbwlbwmbwnbwobwpbwqbwrbwsbwrbwrbwtbwrbwubwvbwrbwrbwrbwwbwxbwybwzbwAbwBbwCdnZbwEbwFbvdbwGbwHbwIbwJbwKbwHbwLbpXbtUbgZbwMbrsbwNbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlblIblIblIblIblIblIblIbwObwPbovbwQaYHbwRbovbwQbwSbwSbwSbwSbwTbwUbwVbwSbwSbwWbwWbwXbwWbvwbwYbwZbxabxbbvwbsVbrBaIvaTkaTkbmbbmbbmbbmbbmbbxcbmbaJOaJPaJUbdrbdtbhybdsbdraJOaJPaJUbqBbqCbqCbqCbqCbqCbqCbxgbqCbvOaIubxhbuCbuCbxibxjbxkbuCbuCbxlbxmbxnbxobxpbxqbxrbxsbxtbxubxvbgybgybtvbxwbxxbxybxzbxAbxBbxCbxzbxzbxDbxEbxFbxGbxHbxHbxHbxHbxIbxHbxHbxHbxJbxKbxLbxMbxNbxObxPbxQbxRbwzbxSbxTbxUbxVbxWbxXbxYbpXbpXbxZbyabybbpXbycbpXbtUbgZbsNblAbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlblIblIblIblIblIblIblIahlahjahlahlahjahlahlahjahlbwSbydbyebyfbygbyhbyibyjbykbylbymbynbyobypbyqbyrbysbvwbytbyubyvbyvbyvbywbyxbyybbAbyzbyAbyBbyCbyCbyCbBhbyFbyIbyHbyJaIuaIuaIubbeaLFaIuaLpaIuaIuaIubyKbyLbvOaIubyMbuCbyNbyObyPbyQbyRbuCbySbxmbyTbxobxpbxqbxqbyUbyVbyWbxvbgybyXbtvbsjbyYbyZbzabzbbzcbzdbzebzfboeboebfhbzgbxHbzhbzibzjbzkbzlbzmbxHbAVbzobzpbzqbzrbzsbxPbxQbxRbztbzubzvbzwbzxbzybzzbxYbzAbzAbzAbzAbzAbzAbzAbpXbtUbgZbsNblAbgZahlahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahjahlblIblIblIblIblIblIblIahlahjahlahlahjahlahlahjahlbzBbzCbzDbzEbzFbzGbzHbzIbzJbzKbzLbylbzMbzNbzObyrbzPbvwbzQbzRaIuaIuaIuaIuaIuaIubbAaIubrBaIuaIuaIuaIuaIubzSbeKbzUaIuaIuaIuaIubbeaIuaIuaLpaIuaIuaIubzVbzWbvObzXbzYbzZbAabAbbAcbAdbAebAfbAgbAhbAibAjbuCbAkbAlbAmbAnbAobuCbgybgybtvbtvbtvbtvbtvboeboeboeboeboeboebApbAqbArbxHbAsbAtbAubAvbAwbAxbxHbAybAzbAAbABbACbADbAEbAFbAGbAHbAIbAJbAJbAKbALbAMbxYbzAbANbzAbAObzAbzAbzAbpXbtUbgZbsNblAbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlblIblIblIblIblIahlahlahjahlahlahjahlahlahjahlbwSbAPbAQbARbASbATbAUbyjbylbylbymbylbyobznbAWbAXbAYbvwbAZbBabBbbBbbBbbBcbBbbBbbBdbBbbBeaIubBfbBgbhIbhIbBiaWEbBkbBlbBmbBnaWEbBkbBoaWEbBpbBqaWEbBrbBsbBtbBuaIuaIubuCbBvbBwbBxbBybBzbuCbuDbBBbuDbuCbuCbuCbuCbuCbuCbuCbuCbgybgybgybBCbBDbuBbBEbBFbBGbBHbBIbBJbBKbBLbBMbBNbxHbBObBPbBQbBRbBSbBTbxHbBUbBVbBWbBXbBYbBZbCabCbbCcbCdbCebCfbCgbChbCibCjbxYbzAbzAbzAbCkbzAbzAbzAbpXbtUbrqbClbrsbrtbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjbwSbwSbCmbCnbCnbCobwSbwSbCpbCqbCrbCsbvwbvwbCtbvwbvwbvwbCubCvaTkaTkaTkaTkbCwbCwbCwbCwbCwbCwbCwbCwbCwbCwbnKbeUbeTbCAbCAbCAbCAbCBbCCbCAbCAbCAbCAbCDbCEbCFaIzaJVbCGbuCbCHbCIbCJbCKbCLbuCbCMbxmbCNbuDbCObCObCPbCQbCRbCSbuDbCTbgybgybgybgybgybqMbCUbCVbCWbCXbCYbCZbDabDbbDcbDcbDcbDcbDcbDcbDcbDcbDcbDdbDebDdbDdbDdbDdbDfbDgbDhbvdbvdbvdbvdbvdbvdbvdbxYbpXbpXbpXbpXbpXbpXbpXbpXbtUbgZbpYbDibgZbgZahjahjahjdsidsidsidsidsidsidsidsiahjahjahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlbDjahlahlahlahjahlahlbwWbDkbDlbDmbDnbDnbDobDpbDqbDrbDsbDtbCvahlahlahjahlbCwbDubDvbDwbDxbDybDzbDAbDBbCwbDCbdqbDEbCAbDFbDGbDHbDIbDJbDKbDKbDLbDMbDNbDObDPbDQbDRbCDbuCbDSbxmbyTbDTbDUbuCbDVbxmbDWbDXbxobxobxobxobxobDYbDZbEabpqbpqbpqbpqbEbbqMbEcbEdbEebEfbEgbBFbDabDbbDcbEhbEhbEhbEibEhbEhbEhbDcbEjbEkbElbEjbEjbDdbEmbEnbxRaKtbEobEpbEqbErbEsbEtbEubEvbEwbExbEybEzbEAbECbECbEDbEobEobEobgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjbwSbwSbCmbCnbCnbCobwSbwSbCpbCqbCrbCsbvwbvwbCtbvwbvwbvwbCubCvaTkaTkaTkaTkbCwbCwbCwbCwbCwbCwbCwbCwbCwbCwbnKbeUbeTbCAbCAbCAbCAbCBbCCbCAbCAbCAbCAbCDbCEbCFaIzaJVbCGbuCbCHbCIbCJbCKbCLbuCbCMbxmbCNbuDbCObCObCPbCQbCRbCSbuDbCTbgybgybgybgybgybqMbCUbCVbCWbCXbCYbCZbDabDbbDcbDcbDcbDcbDcbDcbDcbDcbDcbDdbDebDdbDdbDdbDdbDfbDgbDhbvdbvdbvdbvdbvdbvdbvdbxYbpXbpXbpXbpXbpXbpXbpXbpXbtUbgZaDGaCqbgZbgZahjahjahjdsidsidsidsidsidsidsidsiahjahjahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlbDjahlahlahlahjahlahlbwWbDkbDlbDmbDnbDnbDobDpbDqbDrbDsbDtbCvahlahlahjahlbCwbDubDvbDwbDxbDybDzbDAbDBbCwbDCbdqbDEbCAbDFbDGbDHbDIbDJbDKbDKbDLbDMbDNbDObDPbDQbDRbCDbuCbDSbxmbyTbDTbDUbuCbDVbxmbDWbDXbxobxobxobxobxobDYbDZbEabpqbpqbpqbpqbEbbqMbEcbEdbEebEfbEgbBFbDabDbbDcbEhbEhbEhbEibEhbEhbEhbDcbEjbEkbElbEjbEjbDdbEmbEnbxRaKtbEobEpbEqbErbEsbEtbEubEvbEwbExbEyaQebEAbECbECbEDbEobEobEobgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbEEbEFbEGbEFbEHahlahjahlbwWbwWbEIbylbEJbylbEKbwWbELbELbEMbENbEObCvahjbEPbEQbERbESbETbDBbEUbDBbEVbEWbEXbEXbEYbEZbjjbFbbFcbDKbFdbFebFfbFgbFhbFibCAbCAbFjbFkbFlbFmbFnbFobFpbFqbxmbFrbDTbxobFsbFtbxmbFubuCbFvbFwbxobFxbFybFzbnTbnTbnTbnTbnTbFAbqMbqMbFBbCVbFCbFDbFEbFFbFGbDbbDcbEhbEhbEhbEhbEhbEhbEhbDcbFHbFIbFJbFKbFLbDdaLVbFMbFNbFObsFbFQbFQbFQbFQbFQbFQbFRbFSbFTbEybgZbFUbgZbEobEobEobFVbFWahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbFXbFYbFXahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbFZbGabGbbGabFZbGcbGdbGebwWbGfbylbGgbGhbylbGibwWbCvbGjbCvbCvbGkbGlahlbGmbGnbGobGpbDBbDBbGqbDBdnRbGsbGtbDBbCwbGubjkbGwbCAbGxbGybGzbGAbGBbFhbGCbGDbGEbGFbGGbGHbGIbGJbGKbuCbGLbGMbGNbGObAibuCbGPbxmbGQbuCbGRbDTbxobxmbGSbGTbnTbGUbGVbGWbGXbhRbqMbqMbGYbCVbCVbGZbHabHbbHcbHdbDcbEhbEhbEhbEhbEhbEhbEhbDcbHebHfbHgbHhbHibHjbHkbHlbHmbHnbHobFQbHpbHqbHqbHrbHqbHqbHqbHqbHsbHtbHubHvbHwbHxbHybHzbHAahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbHBbFXbHCbFXbHBahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahjahlbEGbHDbHEbHDbEGbHFbHGbHHbwWbHIbylbHJbylbylbGibwWbHKbHLbELbCvbGkbHMahjbGmbHNbHObHPbHQbHRbHQbHQbHSbHTbHQbHQbHUbHVbeLbHXbCAbCAbCAbCAbCAbCAbHYbCAbCAbHZbIabIbbIcbIdbIebIfbuCbIgbIhbIibIjbIkbuCbIlbImbInbuCbIobIpbIqbIrbIsbItbnTbIubgybhSbIvbhRbIwbIxbIybIzbCVbCVbIAbBFbIBbDbbDcbDcbICbEhbEhbIDbICbDcbDcbIEbIFbIGbIGbIHbDdbIIbIJbxRbIKbsFbFQbFQbILbIMbINbFQbIObIPbIQbIRbISbITbIUbIVbIWbIXbIYbIZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbJabJbbJcbJdbJebJbbJaahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbFZbHDbHDbHDbJfbJgbylbylbJhbHIbylbylbylbylbGibwWbJibJjbJkbCvbGkbJlahlbGmbJmbJnbJobDBbDBbJpbDBbJqbJrbJsbJtbCwbJubJvbJwbJxbJybJybJybJybJzbJybJybJybJAbJBbJzbJCbJDbJEbJFbAfbJGbJHbAfbJIbJGbAfbAfbJHbJIbAfbAfbJIbAfbJJbJKbuCbnTbJLbnTbpnbnTbJMbqMbhSbBFbBFbBFbBFbBFbBFbJNbJObJPbJQbJRbJSbJTbJUbJVbJQbJWbIEbIFbIGbIGbJXbDdbJYbIJbxRaKvbEobKabKabKbbKcbKdbKebFQbFQbKfbEybKgbKhbKibEobKjbKkbKlbEoahjahlahlahjahlahlahlahlahjahlahlahlahlahjahlahlahlahlahjahlahjahjbKmbKnbKobKpbKpbKpbKqbKmbKnahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbEGbHEbHEbHEbEGbKrbKsbKtbKubKvbylbylbKwbKxbwWbwWbCvbCvbCvbCvbGkbCvahjbKybEQbKzbKAbKBbDBbKCbDBbDBbKDbKEbKFbKGbKHbKIbKJbCDbKKbKKbKKbKKbKLbKKbKMbKNbKObKPbKQbKRbKSbKTbKUbKVbKWbKXbKYbKYbKWbKYbKYbKXbKYbKYbKYbKYbKYbKZbLabLbbnTbLcbLdbLebLfbLgbLhbLibLjbLkbLlbLmbLnbKPbLobLpbLqbLrbLsbLtbLubLvbLwbLxbJWbJWbJWbJWbJWbJWbLybLzbIJbLAbLBbEobEybEybEybEybLCbEybLDbFQbFQbEybLEbLFbgZbEobLGbLHbLIbLJdsidsiahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjbLKbLLbLKbKpbLMbKpbLNbLObFXahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbFZbLPbLQbLRbFZbLSbGdbGebwWbwWbLTbLUbLVbwWbwWahlahlahlahlbLWbLXbGlahlahlahjahlbCwbLYbLZbMabDBbMbbMcbMdbMebCwbMfbMgbMhbMibMjbMkbMlbMmbMnbMjbMobMjbMjbMjbMpbMqbMjbMjbMrbMobMsbMjbMjbMjbMpbMjbCDbCDbCDbCDbCDbCDbCDbMtbMubLnbLjbMvbMwbMxbMybMzbMAbMBbMCbMDbMDbMEbMDbMDbMFbMGbMHbMIbMJbMKbMLbMMbMNbMObMPbMQbMRbMSbMTbMUbgUbxPbIJbMWbMXahjbMYbMZbNabNbbNcbNbbNdbNebNfbEybNgbNhbNibEobEobEobEobEoahjahlahlahjahlahlahlahlahjahlahlahlahlahjahlahlahlahlahjahlahjahjbKmbKnbNjbKpbKpbKpbNkbKmbKnahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbNlbEFbNmbEFbNnahlahjahlahjdsiahjahlahjdsiahjahlahlahlahjbHMbGkbHMahjahjahjahjbCwbCwbCwbCwbCwbCwbCwbMdbCwbCwblWbNpbMhbNqbMjbMkbMlbMmbMnbNrbNsbNtbNubNvbNwbNxbNybNzbNAbNBbNCbNDbNEbNFbNGbNHahjahlahlahlahlahlahjbzgbNIbNJbNJbNJbNJbNJbNJbNKbNLbNMbNJbNJbNJbNJbNJbNJbNNbNObNPbNQbNRbNSbNTbNUbNUbNVbNWbNWbNWbNWbNWbNWbNXbNYbNZbOabObahjbMYbOcbOcbOdbOebOfbOgbOhbOibEybOjbNhblAbgZbOkbOlbgZahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahjahjbJabHBbOmbOnbOobOpbJaahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbFZbHDbHDbHDbJfbJgbylbylbJhbHIbylbylbylbylbGibwWbfFbELbccbCvbGkbJlahlbGmbJmbJnbJobDBbDBbJpbDBbJqbJrbJsbJtbCwbJubJvbJwbJxbJybJybJybJybJzbJybJybJybJAbJBbJzbJCbJDbJEbJFbAfbJGbJHbAfbJIbJGbAfbAfbJHbJIbAfbAfbJIbAfbJJbJKbuCbnTbJLbnTbpnbnTbJMbqMbhSbBFbBFbBFbBFbBFbBFbJNbJObJPbJQbJRbJSbJTbJUbJVbJQbJWbIEbIFbIGbIGbJXbDdbJYbIJbxRaKvbEobKabKabKbbKcbKdbKebFQbFQbKfbEybKgbKhbKibEobKjbKkbKlbEoahjahlahlahjahlahlahlahlahjahlahlahlahlahjahlahlahlahlahjahlahjahjbKmbKnbKobKpbKpbKpbKqbKmbKnahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbEGbHEbHEbHEbEGbKrbKsbKtbKubKvbylbylbKwbKxbwWbwWbCvbCvbCvbCvbGkbCvahjbKybEQbKzbKAbKBbDBbKCbDBbDBbKDbKEbKFbKGbKHbKIbKJbCDbKKbKKbKKbKKbKLbKKbKMbKNbKObKPbKQbKRbKSbKTbKUbKVbKWbKXbKYbKYbKWbKYbKYbKXbKYbKYbKYbKYbKYbKZbLabLbbnTbLcbLdbLebLfbLgbLhbLibLjaySaySbLmbLnbKPbLobLpbLqbLrbLsbLtbLubLvbLwbLxbJWbJWbJWbJWbJWbJWbLybLzbIJbLAbLBbEobEybEybEybEybLCbEybLDbFQbFQbEybLEbLFbgZbEobLGbLHbLIbLJdsidsiahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjbLKbLLbLKbKpbLMbKpbLNbLObFXahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbFZbLPbLQbLRbFZbLSbGdbGebwWbwWbLTbLUbLVbwWbwWahlahlahlahlbLWbLXbGlahlahlahjahlbCwbLYbLZbMabDBbMbbMcbMdbMebCwbMfbMgbMhbMibMjbMkbMlbMmbMnbMjbMobMjbMjbMjbMpbMqbMjbMjbMrbMobMsbMjbMjbMjbMpbMjbCDbCDbCDbCDbCDbCDbCDbMtbMubLnbLjbMvbMwbMxbMybMzbMAbMBbMCbMDbMDbMEbMDbMDbMFbMGbMHbMIbMJbMKbMLbMMbMNbMObMPbMQbMRbMSbMTbMUbgUbxPbIJbMWbMXahjbMYbMZbNabNbbNcbNbbNdbNebNfbEybNgbNhayTbEobEobEobEobEoahjahlahlahjahlahlahlahlahjahlahlahlahlahjahlahlahlahlahjahlahjahjbKmbKnbNjbKpbKpbKpbNkbKmbKnahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbNlbEFbNmbEFbNnahlahjahlahjdsiahjahlahjdsiahjahlahlahlahjbHMbGkbHMahjahjahjahjbCwbCwbCwbCwbCwbCwbCwbMdbCwbCwblWbNpbMhbNqbMjbMkbMlbMmbMnbNrbNsbNtbNubNvbNwbNxbNybNzbNAbNBbNCbNDbNEbNFbNGbNHahjahlahlahlahlahlahjbzgbNIbNJbNJbNJbNJbNJbNJbNKbNLbNMbNJbNJbNJbNJbNJbNJbNNbNObNPbNQbNRbNSbNTbNUbNUbNVbNWbNWbNWbNWbNWbNWbNXbNYbNZbOabObahjbMYbOcbOcbOdbOebOfbOgbOhbOibEyayQbNhblAbgZbOkayRbgZahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahjahjbJabHBbOmbOnbOobOpbJaahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahjahlahjdsiahjahlahjdsiahjahlahlahlahlbHMbGkbHMahlahlahlahjbOqbOrbOrbOsbOtbOubOubOvbOwbOqbOxbOybMhbOzbMjbOAbOBbOBbOCbODbNsbOEbOFbOGbNGbNxbOHbOIbOJbOKbOGbOLbOGbOMbONbOOahjbOPbOPbOPbOPbOPahjbzgbNIbNJbOQbORbOSbOTbNJbOUbOVbOWbNJbOXbOYbOZbOYbOXbNNbPabPbbPcbPcbPcbPdbPcbPcbPebPfbPcbPcbPgbPcbPcbgSbPibPjbPjbPkahjbMYbOcbPlbNbbPmbNbbPnbPobPpbEybPqbNhblAbgZblAblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbJbbFXbPrbFXbPsahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjahjahjahjbCvbCvbPtbPubPvbCvbCvahlahlahlahlbHMbGkbHMahlahlahlahjbOqbPwbOsbOsbOsbOsbOubPxbPybOqbPzbMgbPAbPBbPCbPDbOGbPEbNGbPFbPGbPHbOGbOGbOGbNxbPIbOIbPJbOGbPKbPLbPMbPNbPObPPbPQbPRbPSbPTbPUbOPahjbPVbNIbNJbPWbPXbPYbPYbPZbQabQbbQcbNJbOYbQdbOYbQebOYbNNbDbbDcbQfbQgbQhbQibQjbQkbQlbQmbQnbQobQpbQqbQrbJWbSSbQtbSSbQubQubEybEybEybEybQvbQwbQxbQxbQxbQwbQybNhbvkblAblAbQzbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbFXbFYbFXahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlbCvbQAbELbQBbELbQCbCvahlahlahlahlbHMbLXbHMahlahjbQDbQEbOqbQFbQGbQHbOsbOsbQIbQJbOubQKbQLbMgbQMbQNbQObQPbOGbOGbOGbQQbQRbOGbQSbOGbQTbQUbOGbQVbQWbQXbQYbQZbRabRbbRcbRdahjbRebRfbPUbRgbOPahjbRhbNIbNJbRibRjbOXbRkbNJbRlbRmbRnbNJbOXbRobRpbRqbOXbNNbRrbRsbJWbJWbJWbJWbLybRtbRubRvbLybJWbJWbJWbJWbJWbRwbRxbRybRzbRAbRBbRCcbGbRCbREbQubRFbRybRGbRHbRIbNhblAbgZbgZbgZbgZbRJahjahjahjdsidsidsidsidsidsiahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjbCvbRKbELbELbELbRLbCvahlahlahlahlbHMbGkbJlahlahjbTabRNbRObRPbRQbOsbOsbOsbOsbOsbRRbOqbRSbRTbRUbRVbRWbRXbPHbOGbRYbRZbSabSbbScbSdbSebSfbSfbSgbShbPKbSibSjbSkbSlbSmbSnbSobPRbSpbPUbPUbOPahjbSqbNIbNJbdobOXbSsbNKbNJbNJbStbSubNJbSvbSwbSxbSybSzbSAbSBbSCbSDbSEbSEbSFbSGbMNbSHbSIbSJbSKbEhbEhbEhbJWbSLbRybRxbSMbSNbRBbSObSPbSQbSRbSSbRybSTbRybRHbSUbSVbSWbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbCvbSXbELbELbSYbSZbCvahlahjahlahlbJlbGkbCvbCvbCvbCvbTbbOqbTcbRQbOsbOsbTdbTebTfbTgbOqbQLbMgbQMbNqbQObThbTibOGbOGbTjbNsbTkbTlbTmbTnbOGbOGbTobTpbTqbTrbTsbTtbTubTtbTvahjbOPbOPbOPbOPbOPahjbzgbNIbNJbTwbTxbTxbTybTzbTAbTBbTCbTDbTEbTFbTxbTGbTHbNJbTIbSCbEhbEhbEhbTJbTKbMNbTLbMNbTMbTNbEhbEhbEhbJWbTObRybTPbRxbTQbTRbTSbTTbTRbTUbQubTVbRybTWbRHbLEbgZbNhbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjahjahjahjbCvbCvbPtbPubPvbCvbCvahlahlahlahlbHMbGkbHMahlahlahlahjbOqbPwbOsbOsbOsbOsbOubPxbPybOqbPzbMgbPAbPBbPCbPDbOGbPEbNGbPFbPGbPHbOGbOGbOGbNxbPIbOIbPJbOGbPKbPLbPMbPNbPObUpbPQbPRbPSbPTbPUbOPahjbPVbNIbNJbPWbPXbPYbPYbPZbQabQbbQcbNJbOYbQdbOYbQebOYbNNbDbbDcbQfbQgbQhbQibQjbQkbQlbQmbQnbQobQpbQqbQrbJWbSSbQtbSSbQubQubEybEybEybEybQvbQwbQxbQxbQxbQwbQybNhaBRblAblAbQzbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbFXbFYbFXahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlbCvbQAbELbQBbELaClbCvahlahlahlahlbHMbLXbHMahlahjbQDbQEbOqbQFbQGbQHbOsbOsbQIbQJbOubQKbQLbMgbQMbQNbQObQPbOGbOGbOGbQQbQRbOGbQSbOGbQTbQUbOGbQVbQWbQXbQYbQZbRabRbbRcbRdahjbRebRfbPUbRgbOPahjbRhbNIbNJbRibRjbOXbRkbNJbRlbRmbRnbNJbOXbRobRpbRqbOXbNNbRrbRsbJWbJWbJWbJWbLybRtbRubRvbLybJWbJWbJWbJWbJWbRwbRxbRybRzbRAbRBbRCcbGbRCbREbQubRFbRybRGbRHbRIbNhblAbgZbgZbgZbgZbRJahjahjahjdsidsidsidsidsidsiahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjbCvazvbELbELbELaBdbCvahlahlahlahlbHMbGkbJlahlahjbTabRNbRObRPbRQbOsbOsbOsbOsbOsbRRbOqbRSbRTbRUbRVbRWbRXbPHbOGbRYbRZbSabSbbScbSdbSebSfbSfbSgbShbPKbSibSjbSkbSlbSmbWIbSobPRbSpbPUbPUbOPahjbSqbNIbNJbdobOXbSsbNKbNJbNJbSxbSubNJbSvbSwbStbSybSzbSAbSBbSCbSDbSEbSEbSFbSGbMNbSHbSIbSJbSKbEhbEhbEhbJWbSLbRybRxbSMbSNbRBbSObSPbSQbSRbSSbRybSTbRybRHayWbSVbSWbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbCvazvbELbELbSYaBgbCvahlahjahlahlbJlbGkbCvbCvbCvbCvbTbbOqbTcbRQbOsbOsbTdbTebTfbTgbOqbQLbMgbQMbNqbQObThbTibOGbOGbTjbNsbTkbTlbTmbTnbOGbOGbTobTpbTqbTrbTsbTtbTubTtbTvahjbOPbOPbOPbOPbOPahjbzgbNIbNJbTwbTxbTxbTybTzbTAbTBbTCbTDbTEbTFbTxbTGbTHbNJbTIbSCbEhbEhbEhbTJbTKbMNbTLbMNbTMbTNbEhbEhbEhbJWbTObRybTPbRxbTQbTRbTSbTTbTRbTUbQubTVbRybTWbRHbLEbgZbNhbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbTXahlahjahjbTYbTYbTYbTYbTYbTYbTYbTYbCvbCvbTZbCvbCvbCvbPtbPubPvbCvbCvbLXbCvckdbELbCvbTbbOqbOqbUabOqbOqbOqbOqbOqbOqbOqbUbbUcbQMbUdbMjbNrbNrbUebUfbUgbUhbOGbOGbOGbTnbUibONbONbUjbUkbUlbPLbUmbUnbUobUpbPQbPRbUqbUrbUrbOPahjbzgbNIbNJbNJbNJbNJbNKbUsbUtbUubUvbUwbUxbUybUybUzbRobNJbTIbSCbEhbEhbEhbUAbUBbSIbUCbMNbUDbUEbSEbSEbUFbJWbUGbUHbUIbRxbUJbRBbSQbUKbTRbULbQubUMbUMbUMbRHbUNbQubNhbgZahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbUObUPbUQbURbUSbURbUTbUUbUVbUWbUXbUYbUZbTYbVabVbbVbbVbbVbbVbbVbbVbbVbbVbbVcbVdbVebVebVebVebVfbVgbVgbVhbVibVjbVkbVlbVlbVlbVmbVnbMgbQMbVobVpbVqbONbONbONbVrbVsbONbONbVtbVubVvbOGbVwbVxbVybVzbOGbVAbVBbVCbRdahjbRebVDbVEbVFbOPahjbVGbVHbVIbVIbVIbVJbNJbVKbOXbVLbVMbVNbVObSybVPbSzbVQbNJbTIbSCbJWbJWbJWbJWbVRbVSbTLbVTbVRbJWbJWbJWbJWbJWbVUbVVbVWbVXbVYbVZbVZbVZbWabWbbSSbUMbUMbWcbRHbWdbQubNhbgZbgZbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbWebWebWebWebWebWfbWgbWhbWibWibWhbTYbELbWjbWkbWkbWkbWkbWkbWkbWlbCvbWmbWnbWnbWnbWnbWnbWnbWnbWnbWobWobWpbWobWobWqbELbCvbWrbMgbQMbVobWsbWtbWubWvbSfbWwbWxbSfbSfbWybWzbWAbWBbWCbWDbWEbWFbOGbVAbWGbWHbWIbSobPRbWJbUrbUrbOPahjbWKbWLbCDbCDbCDbWMbNJbWNbWObUzbWPbWQbUtbWRbWSbWTbUtbNJbTIbSCbSDbSEbSEbWUbSGbMNbSHbSIbWVbWWbEhbEhbEhbJWbWXbWYbWZbRxbRybRxbRybRybXabXbbQubUMbUMbUMbRHbWdbQubNhblAblAbgZahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbXcbXdbXebXfbXebXgbXhbXibXjbXjbXkbTYbXlbXmahlahlahjahlahlahjahlbCvbWmbWnbXnbXobXpbXqbXrbXsbXnbXtbXubXvbXwbWobWobELbCvbXxbMgbQMbXybXzbXAbXBbXCbMjbMobMjbMjbMjbXDbXEbNrbNrbNrbXFbOGbVybOGbVAbVBbXGbRdahjbOPbOPbOPbOPbOPahjbXHbXIbCDbXJbXKbWMbNJbXLbRqbXMbXNbWQbOXbXObWSbXPbXQbNJbTIbSCbEhbXRbEhbXSbTKbMNbTLbMNbTMbXTbEhbXRbEhbJWbXUbXVbXWbXXbXYbXZbYabYbbYcbYdbSSbCxbYfchUbRHbYhbQubYibgZblAbgZbgZbgZdsidsiahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbWebWebWebWebWebWfbWgbWhbWibWibWhbTYbELbWjbWkbWkbWkbWkbWkbWkbWlbCvbWmbWnbWnbWnbWnbWnbWnbWnbWnbWobWobWpbWobWocchbELbCvbWrbMgbQMbVobWsbWtbWubWvbSfbWwbWxbSfbSfbWybWzbWAbWBbWCbWDbWEbWFbOGbVAbWGbWHbWIbSobPRbWJbUrbUrbOPahjbWKbWLbCDbCDbCDbWMbNJbWNbWObUzbWPbWQbUtbWRbWSbWTbUtbNJbTIbSCbSDbSEbSEbWUbSGbMNbSHbSIbWVbWWbEhbEhbEhbJWbWXbWYbWZbRxbRybRxbRybRybXabXbbQubUMbUMbUMbRHbWdbQubNhblAblAbgZahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbXcbXdbXebXfbXebXgbXhbXibXjbXjbXkbTYbXlbXmahlahlahjahlahlahjahlbCvbWmbWnbXnbXobXpbXqbXrbXsbXnbXtbXubXvbXwbWobWobELbCvbXxbMgbQMbXybXzbXAbXBbXCbMjbMobMjbMjbMjbXDbXEbNrbNrbNrbXFbOGbVybOGbVAbVBbXGbRdahjbOPbOPbOPbOPbOPahjbXHbXIbCDcbObXKbWMbNJbXLbRqbXMbXNbWQbOXbXObWSbXPbXQbNJbTIbSCbEhbXRbEhbXSbTKbMNbTLbMNbTMbXTbEhbXRbEhbJWbXUbXVbXWbXXbXYbXZbYabYbbYcbYdbSSbCxbYfchUbRHbYhbQubYibgZblAbgZbgZbgZdsidsiahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjbXcbYjbYkbYlbYmbWhbYnbWhbYobWhbWhbYpbELbXmahlahlahjahlahlahjahlbCvbWmbWnbXnbYqbYrbYsbYtbYubXnbYvbYwbYxbYybYzbWobELbCvbWrbMgbQMbYAbYBbMobYCbYDbMjbYEcuLbYGbMjbYHbTnbZUbNrbYJbWFbOGbWDbYKbYLbUnbYMbUpbPQbPRbYNbYObYPbOPahjbCDbXIbCDbYQbXKbWMbNJbYRbYSbYTbYUbYVbOQbYWdprchWchXbNJbTIbSCbEhbEhbEhbYZbZabSIbUCbMNbUDbZbbSEbSEbUFbDcbRHbZcbZdbZebRHbRHbZfbZgbZhbZibZjbVYbVZbZkbUMbYhbQubNhbgZbrqbgZbZlbgZahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjbXcbZmbZnbZobZnbZpbZqbZrbZsbZtbZubTYbZvbZwahlahlahlahlahlahlahlbCvbWmbWnbZxbZybZzbYsbZAbZxbZxbYvbZBbZCbZDbZEbZFbZGbZHbZIbZJbZKbZLbZMbZNbZObZPbZQbZRbZSbZTbMjbOGbTndjybZVbYJbZWbOGbWDbYKbVAbVBbZXbRdahjbReclkbZZcaabOPahjbCDbXIbCDcabcacbWMbNJbNJcadcaebNJbNNbNJbNJbSubNJbNJbNJbTIbSCbJWbJWbJWbJWbVRcafbTLcagbVRbJWbJWbJWbJWbDcbTRcahbTRbTRbTRbRHbZfbZgcaicajcakcalbRxbCzbRHbYhbQubNhbgZblAblAblAcanahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjahjahjahjahjbWebWebWebWebWebTYbTYcaobTYbTYbTYbTYahjahlahlaPYahlahlahlahlahlcaqbWmbWnbZxbZxcarcasbXnbZxcatcaucavcawcaxcaybWobELbCvcazcaAcaBcaCcaDcaEcaFcaGcaHcaIcaJcaKbMjcaLcaMbZUbNrbYJcaNbOGcaObYKbVAcaPcaQbWIbSobPRcaRbYObYObOPahjcaSbXIbCDcaTbXKbWMcaUbNJbNJcaVbNJdpEdpDdpCdpzcaZcbabXKbTIbSCbSDbSEbSEcbbbSGbMNbSHbSIcbccbdbEhbEhbEhbDccbebTRbTRbTRbTRbRHcbfcbgcbhcbibQubQubRxbQubRHcbjbQubNhbgZcbkcblcbmcbnahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHaaHdpXdpXaaHdpXdpXdpXaaRdpXdpXdpXaaHdpXahjahjbCvbELbELbELbELbELbELbELbELcbocbpahjahlahlahjdsiaFFahlahlahlbRMbWmbWncbscbtcascbubXnbXncbvcbwcbvcbxbYycbybWobELbTZbQLbMgcbzcbAdpFcaEcbCcbDcbEcbFciWcjcckbbPHcbIbNrbNrbNrcbJbOGcbKcbLbVAbVBbOGbRdahjbOPbOPbOPbOPbOPahjcbMbXIbCDcbNcbObVHbVIbVIcbPcbQbNKdpAcuYdpBdpzcbUcbVcbVcbWbSCbEhbEhbEhcbXbTKbMNbTLbMNbTMcbYbEhbEhbEhbDccbZbTRccabTRbTRccbcccccdcceccfbQubRxbRxccgbRHcchblAccibgZccjcckblAcclahjahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahlahjahjahlahjahjahlahlahjahjahjahldpXahlahlbCvccmbELbCvbCvbTZbCvbCvbCvbCvbCvahlahlahldsiaDIauKdsidsiahjbRMbWmbWnccpbZxbXnbXnbXnbZxcatccqccrbYyccscctbZFbZHbZHccuccvccwcbAcbAccxcaFccycczccAccBccCbMjbOGbOJccDccEccFbQWccGccHccIbYLbUnccJbUpbPQbPRccKccLccLbOPahjbXHbXIbCDbCDbCDbXKbCDbCDccMccNbCDbCDcuBbCDbzgccNbFoccPccQbSCbEhbEhbEhccRccSbSIccTbMNbUDccUbSEbSEbUFbDcbTRbTRccVbTRbTRbRHcbfcbgccWccXbQuccYccZcdabRHcdbblAbNhbgZbgZbgZblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlcdccddcdeahlcdccddcdeahlcdccddcdeahjdpXahlahlbCvcdfcdgbCvcdhbELbELcdicdjcdkbCvahlahlahlatIdsidsiahjahlahlcdmbWmbWnbZxcdncdobXncdpbZxbZxbYvcdqbYybYycdrbWocdscdtcducdvcdwcdxcdycdzcaFcdzcaEcaFcdAcdBbMjcdCcdDcdEbSfbSfbShbUicdFbUmbSibVBcdGbRdahjbReclhcdIcdJbOPahjbCDbXIbXKcdKbXKbXKcdLbCDcdMcdNcdOcdPcdQcdRcdScdTcdUbgZcdVbSCbDcbDcbDcbDcbDccdWcdXcdYbDcbDcbDcbDcbDcbDcbRHbRHbRHbRHbRHbRHcdZcdZceacebbRHbRHbRHbRHbRHbLEbgZbNhbgZceccedblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlcdcceecdeahlcdcceecdeahlcdcceecdeahjahjahlahlbCvbPtbPvbCvbCvcefcegbQCbELbSYbCvahlahlahlahlahjahlahlahlahlbCvbWmbWnbXncehceibXncejcekbXnbYvcelcemcencenceocepceqcercescetceucevcewcexceycezcaFcdAceAbMjceBbOGbOJbUibONceCceDceEceFbNFceGceHbWIbSobPRceIccLccLbOPahjbCDceJbLnbLnbLnbLnceKceLceMceNceOcePceQcePceRceSceTbgZceUbLEahlahlahlahjahlahlceVahlahjahlahlahlahlbgZceWceXceYceZceZbRHcfacfaceacfbcfccfdblAblAblAcfebgZbYibgZcffblAblAbgZbgZbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcceecdeahlcdcceecdeahjcdcceecdeahjahjahlahlahlahlahjahjbCvbCvbCvbCvbTZbCvbCvahlahlahlahlahjahlahlahjahlbCvbWmbWnbXncfgcfhcficfjcfkbXncflcfmcfncfocfpbWocfqcfrcfscftcfucfvcfwcfxcfycfzcfAcfBcfCcfDbMjcfEbQZcfFcfGbOGbOGbOGbOMbVvcfGbVBbXGbRdahjbOPbOPbOPbOPbOPahjbCDcabcfHcfIcfJcacbCDbCDbCDcfKcfLcdUbXKcfMcfNbzgbCDbgZceUbLEahlahlahlahjahlahlceVahlahjahlahlahlahlbgZcfOcfPbrscfQcfRbRHcfScfScfTcfbbRHbQubgZcfUcfVcfWbgZcfXbECbECbECcfYcfZcgacfZcgbdsiahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlcdcceecdeahjcdcceecdeahlcdcceecdeahlahjahlahlahlahlahlahlbCvckLbCvbELbELbCvahjahlahjahlahlahjahlahlahjahlbCvbWmbWnbWnbWnbWnbWnbWnbWnbWnbWobWobWobWobWobWobCvcgfbCvcggcghcghcghcgicgjcgkcghcglcgmcgncgocgpcgqbSkcgrcgscgtcgscgrcgucgrcgvbUicgwahjahjahjahjahjahjahjahlahjcbMbXKcbMahjahlbCDcgxbCDcgycgzcgAcgzcgBbzgbYQbCDceUbLEcgCcgDcgEbgZcgCcgDcuncgEbgZcgCcgDcgDcgEbgZcgFbgZcgGbgZbgZbRHbRHbRHcgHcgIbRHcgJbgZcbmblAcgKbgZccibgZbgZcgLbgZbgZbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXahjahlcdcceecdeahjcdcceecdeahlcdcceecdeahjahjahjahjcgMcgNcgNcgNcgNbCvbCvcgObELbCvcgPbWkbWkbWkbWkbWkbWkbWkbWlbCvbCvbWmbCvcgQcgRcgScgScgScgScgScgScgScgScgScgTcgTcgScgUcefcggcnjcgWcgXcgYcgZchacghchbchcchdbMjchechfchgchhchichjchkchlbOGchmchnchobOIahjahjahlahlahlahlahjahlahjchpcfIchpahjahlbCDchqchrchschtbKPcePchuceJbLnceLchvchwchxchxchxchxchxchxchychzchzchzchzchAchAchBchCchAchAchAchDchEchFchGchHchIchEchEchEchEchJchKbgZbNhbgZchLblAblAbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahjahlahjahjchMahjahjahjchMahjahlahjchMahjahlahjchNchOchPchQchRchSchTcgebELchYchZciachZchZchZchZchZchZchZchZchZchZchZcibbCvbELbLXcicciccicciccicciccicciccicciccicciccidciccggcghciecifcigcihcnMcijcikcilcimciccinciocipciqcipciocipciqcipcircipcircisahjahjahlahlahlahlahjahlahjahlahlahlahjahlbCDchqcitcdMciucivciwcixdpQdpRdpSdpTdpNdpNdpNdpNdpNdpNdpOdpPdpNdpNdpNdpNdpNdpNdpVdpUciGciFciCciHciIciIciIciJciKciLciMciIciIciIciIciNciObgZciPbpYciQbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjciRciSciSciTciUciUciUciUciUciUciUciUciUciUciUciVciXciYciXciZcjacjbcbHchZcjdcjecjfbCvcjgcjhcjhcjhcjhcjhcjhcjhcjibCvbELcjjcjkcjlcjmciccjncjncjociccjpcjqcjrcjscjtcjucjvcjwcjxcjycghcjzcjAcjBcjCcjDcjEcjFcjGduncicahjcjIahjcjJahjcjIahjcjJahjcjKahjcjKahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbCDbXKcjLcjMcjNcjOcjPbFodpMcjRbCDbgZcgCcgDcgDcgEbgZcgCcgDcgDcgEbgZcgCcgDcgDcgEbgZcpGblAbgZcjScbmbgZbgZcgCcgEbgZbgZcjTblAcjTbgZcjUcjVbpWbgZbgZbgZbgZbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahjahlahjahjcjWahjahlahjcjWahjahlahjcjWahjahlahlchNchOcjXcjYcjZckacgNbELbELbELbELbCvahlahlahjahlahlahjahlahlahjbCvckdbELbCvbEMckecicckfckgckhckickjckkcklckmcknbYebYIbYXckrbhAcghbvCckuckvcjCckwcghckxckycnqcicbOPckzbReckzbOPckzbReckzbOPckAbReckBbOPahlahlahlahlahlahlahlahlahlahlahlahlahjahlbCDbCDbCDbXKckCcjMccPcnCbCDbCDbCDahlahlahjahlahjahjahlahlahlahlahlahlahlahlahlbgZcnyckEbgZcjTblAbgZahlahlahlahlbgZblAblAckFckGckGckHckIckGahlahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXahjahjcdcckJcdeahlcdcckJcdeahlcdcckJcdeahjahjahjahjckKcgNcgNcgNcgNckccmlbELbELbCvahjahjbGvbGvbGvbGvbGvbGvbGvbCvbCvbCvbCvcdjckOcicckPckhckhckickQckRckSckScamcgVcnHcnPciickUcghckWckXckYckZclacghclbchccnRcicbOPcldcnDclfbOPclgcnXclibOPcljcnYcllbOPahlahlahlahlahlahlahlahlahlahlahlahlahjahlbRJahlbCDcfKclmcnZcacbCDbCDahlbRJahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlbgZcnUbgZbgZcloblAbgZbgZcgCcgEbgZbgZblAclpckEckGclqclrclsckGahlahlahjahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcdcckJcdeahjcdcckJcdeahlcdcckJcdeahlahlahlahlahlahlahlahlbCvbCvbCvbXlbELbCvahlahlbGvcmUcmpcmocmncmmcmPclzbSYbELbELbELckOcicclAclAclBcicclCclDclEclFckpcmFckqcksckockocghclKclLclMclNclOclPclQclRcnScicbOPclTclUclTbOPclVclWclVbOPclXclYclZbOPahlahlahlahlahlahlahlahlahlahlahlahlahlahlbRJahlahlahjcmaahlahlahjahlahlbRJahlahlahlahlahjahjahlahlahlahlahlahlcmccmdcmebgZcoGbpYbgZcmgblAblAbgZblAblAblAblAcbmblAcmhckGcmicmjcmkckGahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjahjahjahjahjbWebWebWebWebWebTYbTYcaobTYbTYbTYbTYahjahlahlaPYahlahlahlahlahlcaqbWmbWnbZxbZxcarcasbXnbZxcatcaucavcawcaxcaybWobELbCvcazcaAcaBcaCcaDcaEcaFcaGcaHcaIcaJcaKbMjcaLcaMbZUbNrbYJcaNbOGcaObYKbVAcaPcaQbWIbSobPRcaRbYObYObOPahjcaSbXIbCDcaTbXKbWMcdjbNJbNJcaVbNJdpEdpDdpCdpzcaZcdibXKbTIbSCbSDbSEbSEcbbbSGbMNbSHbSIcbccbdbEhbEhbEhbDccbebTRbTRbTRbTRbRHcbfcbgcbhcbibQubQubRxbQubRHcbjbQubNhbgZcbkcblcbmcbnahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHaaHdpXdpXaaHdpXdpXdpXaaRdpXdpXdpXaaHdpXahjahjbCvbELbELbELbELbELbELbELbELbJjcbpahjahlahlahjdsiaFFahlahlahlbRMbWmbWncbscbtcascbubXnbXncbvcbwcbvcbxbYycbybWobELbTZbQLbMgcbzcbAdpFcaEcbCcbDcbEcbFciWcjcckbbPHcbIbNrbNrbNrcbJbOGcbKcbLbVAbVBbOGbRdahjbOPbOPbOPbOPbOPahjcbMbXIbCDcdbccmbVHbVIbVIcbPcbQbNKdpAcuYdpBdpzcbUcbVcbVcbWbSCbEhbEhbEhcbXbTKbMNbTLbMNbTMcbYbEhbEhbEhbDccbZbTRccabTRbTRccbcccccdcceccfbQubRxbRxccgbRHbSXblAccibgZccjcckblAcclahjahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahlahjahjahlahjahjahlahlahjahjahjahldpXahlahlbCvbSUbELbCvbCvbTZbCvbCvbCvbCvbCvahlahlahldsiaDIauKdsidsiahjbRMbWmbWnccpbZxbXnbXnbXnbZxcatccqccrbYyccscctbZFbZHbZHccuccvccwcbAcbAccxcaFccycczccAccBccCbMjbOGbOJccDccEccFbQWccGccHccIbYLbUnccJbUpbPQbPRccKccLccLbOPahjbXHbXIbCDbCDbCDbXKbCDbCDccMccNbCDbCDcuBbCDbzgccNbFoccPccQbSCbEhbEhbEhccRccSbSIccTbMNbUDccUbSEbSEbUFbDcbTRbTRccVbTRbTRbRHcbfcbgccWccXbQuccYccZcdabRHbRLblAbNhbgZbgZbgZblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlcdccddcdeahlcdccddcdeahlcdccddcdeahjdpXahlahlbCvcdfcdgbCvcdhbELbELbRKaClcdkbCvahlahlahlatIdsidsiahjahlahlcdmbWmbWnbZxcdncdobXncdpbZxbZxbYvcdqbYybYycdrbWocdscdtcducdvcdwcdxcdycdzcaFcdzcaEcaFcdAcdBbMjcdCcdDcdEbSfbSfbShbUicdFbUmbSibVBcdGbRdahjbReclhcdIcdJbOPahjbCDbXIbXKcdKbXKbXKcdLbCDcdMcdNcdOcdPcdQcdRcdScdTcdUbgZcdVbSCbDcbDcbDcbDcbDccdWcdXcdYbDcbDcbDcbDcbDcbDcbRHbRHbRHbRHbRHbRHcdZcdZceacebbRHbRHbRHbRHbRHbLEbgZbNhbgZbOlbQCblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlcdcceecdeahlcdcceecdeahlcdcceecdeahjahjahlahlbCvbPtbPvbCvbCvcefcegaClbELbSYbCvahlahlahlahlahjahlahlahlahlbCvbWmbWnbXncehceibXncejcekbXnbYvcelcemcencenceocepceqcercescetceucevcewcexceycezcaFcdAceAbMjceBbOGbOJbUibONceCceDceEceFbNFceGceHbWIbSobPRceIccLccLbOPahjbCDceJbLnbLnbLnbLnceKceLceMceNceOcePceQcePceRceSceTbgZceUbLEahlahlahlahjahlahlceVahlahjahlahlahlahlbgZceWayRceYceZceZbRHcfacfaceacfbcfccfdblAblAblAbSXbgZbYibgZcffblAblAbgZbgZbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcceecdeahlcdcceecdeahjcdcceecdeahjahjahlahlahlahlahjahjbCvbCvbCvbCvbTZbCvbCvahlahlahlahlahjahlahlahjahlbCvbWmbWnbXncfgcfhcficfjcfkbXncflcfmcfncfocfpbWocfqcfrcfscftcfucfvcfwcfxcfycfzcfAcfBcfCcfDbMjcfEbQZcfFcfGbOGbOGbOGbOMbVvcfGbVBbXGbRdahjbOPbOPbOPbOPbOPahjbCDcabcfHcfIcfJcacbCDbCDbCDcfKbSZcdUbXKcfMcfNbzgbCDbgZceUbLEahlahlahlahjahlahlceVahlahjahlahlahlahlbgZcfOcfPbrscfQcfRbRHcfScfScfTcfbbRHbQubgZcfUcfVbSXbgZcfXbECbECbECcfYcfZcgacfZcgbdsiahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlcdcceecdeahjcdcceecdeahlcdcceecdeahlahjahlahlahlahlahlahlbCvckLbCvbELbELbCvahjahlahjahlahlahjahlahlahjahlbCvbWmbWnbWnbWnbWnbWnbWnbWnbWnbWobWobWobWobWobWobCvcgfbCvcggcghcghcghcgicgjcgkcghcglcgmcgncgocgpcgqbSkcgrcgscgtcgscgrcgucgrcgvbUicgwahjahjahjahjahjahjahjahlahjcbMbXKcbMahjahlbCDcgxbCDcgycgzcgAcgzcgBbzgbYQbCDceUbLEcgCcgDcgEbgZcgCcgDcuncgEbgZcgCcgDcgDcgEbgZcgFbgZcgGbgZbgZbRHbRHbRHcgHcgIbRHaDGbgZcbmblAcgKbgZccibgZbgZcgLbgZbgZbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXahjahlcdcceecdeahjcdcceecdeahlcdcceecdeahjahjahjahjcgMcgNcgNcgNcgNbCvbCvcgObELbCvcgPbWkbWkbWkbWkbWkbWkbWkbWlbCvbCvbWmbCvcgQcgRcgScgScgScgScgScgScgScgScgScgTcgTcgScgUcefcggcnjcgWcgXcgYcgZchacghchbchcchdbMjchechfchgchhchichjchkchlbOGchmchnchobOIahjahjahlahlahlahlahjahlahjchpcfIchpahjahlbCDchqchrchschtbKPcePchuceJbLnceLchvchwchxchxchxchxchxchxchychzchzchzchzchAchAchBchCchAchAchAchDchEchFbWqchHchIchEchEchEchEchJchKbgZbNhbgZchLblAblAbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahjahlahjahjchMahjahjahjchMahjahlahjchMahjahlahjchNchOchPchQchRchSchTcgebELchYchZciachZchZchZchZchZchZchZchZchZchZchZcibbCvbELbLXcicciccicciccicciccicciccicciccicciccidciccggcghciecifcigcihcnMcijcikcilcimciccinciocipciqcipciocipciqcipcircipcircisahjahjahlahlahlahlahjahlahjahlahlahlahjahlbCDchqcitcdMciucivciwcixdpQdpRdpSdpTdpNdpNdpNdpNdpNdpNdpOdpPdpNdpNdpNdpNdpNdpNdpVdpUciGciFciCciHciIciIciIciJciKciLcbociIciIciIciIciNciObgZbQCblAcbNbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjciRciSciSciTciUciUciUciUciUciUciUciUciUciUciUciVciXciYciXciZcjacjbcbHchZcjdcjeaClbCvcjgcjhcjhcjhcjhcjhcjhcjhcjibCvbELcjjcjkcjlcjmciccjncjncjociccjpcjqcjrcjscjtcjucjvcjwcjxcjycghcjzcjAcjBcjCcjDcjEcjFcjGckxcicahjcjIahjcjJahjcjIahjcjJahjcjKahjcjKahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbCDbXKcjLcjMcjNcjOcbabFobXJcaUbCDbgZcgCcgDcgDcgEbgZcgCcgDcgDcgEbgZcgCcgDcgDcgEbgZcpGblAbgZcjScbmbgZbgZcgCcgEbgZbgZcjTblAcjTbgZcjUcjVbpWbgZbgZbgZbgZbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahjahlahjahjcjWahjahlahjcjWahjahlahjcjWahjahlahlchNchOcjXcjYcjZckacgNbELbELbELbELbCvahlahlahjahlahlahjahlahlahjbCvckdbELbCvbEMckecicckfckgckhckickjckkcklckmcknbYebYIbYXckrbhAcghbvCckuckvcjCckwcghaJbbSnbPPcicbOPckzbReckzbOPckzbReckzbOPckAbReckBbOPahlahlahlahlahlahlahlahlahlahlahlahlahjahlbCDbCDbCDbXKckCcjMccPcnCbCDbCDbCDahlahlahjahlahjahjahlahlahlahlahlahlahlahlahlbgZcnyckEbgZcjTblAbgZahlahlahlahlbgZblAblAbEzckGckGckHckIckGahlahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXahjahjcdcckJcdeahlcdcckJcdeahlcdcckJcdeahjahjahjahjckKcgNcgNcgNcgNbJibJjbELbELbCvahjahjbGvbGvbGvbGvbGvbGvbGvbCvbCvbCvbCvaClckOcicckPckhckhckickQckRckSckScamcgVcnHcnPciickUcghckWckXckYckZclacghclbchccnRcicbOPcldcnDclfbOPclgcnXclibOPcljcnYcllbOPahlahlahlahlahlahlahlahlahlahlahlahlahjahlbRJahlbCDcfKclmcnZcacbCDbCDahlbRJahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlbgZcnUbgZbgZayRblAbgZbgZcgCcgEbgZbgZblAclpckEckGclqclrclsckGahlahlahjahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcdcckJcdeahjcdcckJcdeahlcdcckJcdeahlahlahlahlahlahlahlahlbCvbCvbCvbXlbELbCvahlahlbGvcmUcmpcmocmncmmcmPclzbSYbELbELbELckOcicclAclAclBcicclCclDclEclFckpcmFckqcksckockocghclKclLclMclNclOclPclQclRcnScicbOPclTclUclTbOPclVclWclVbOPclXclYclZbOPahlahlahlahlahlahlahlahlahlahlahlahlahlahlbRJahlahlahjcmaahlahlahjahlahlbRJahlahlahlahlahjahjahlahlahlahlahlahlcmccmdcmebgZbJkaDGbgZaCqblAblAbgZblAblAblAblAcbmblAcmhckGcmicmjcmkckGahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcckJcdeahlcdcckJcdeahlcdcckJcdeahjahlahlahlahlahlahlahlcgccgdcgcbELbELbCvahlahlbGvcmUcmVcmUcmYcmXcnBcmrcmsbVlbVlbVlcmtcicclAclAclBciccmucmvcmwcmxckTckVcktcmvcmzcmAcmvcmCcmDcmEcmFcmGcmHcmEcmIcotcicbOPclTcmKclTbOPclVcmLclVbOPclZcmMclZbOPahlahlahlahlahlahlaaeahlahlahlahlahlahlahlbRJahlahlahjcmNahlahlahlahlahlbRJahlahlahlahlahjahjahlahlahlahlahlahjcbnblAcmObgZcphblAbgZcmQblAblAbrqblAbgZbgZbgZcgCcgEbgZckGcmRcmScmTckGahlahlahjahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcckJcdeahlcdcckJcdeahjcdcckJcdeahjahjahjahjahjahjahjahjbCvbCvbCvbCvbELbCvahjahjbGvcoacoBcoAcodcobbGvcmZcnaciccnbciccnccicclAclBclBciccndcnecnfcngckpclHclIclJclGclGcnkcnlcnmcnncnocnncnncnncnpcqMcicbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlbRJahlahlahlahlahjahjahlahlahlahlahjdsicbncnrblAbrqcpGblAbgZbgZbgZbgZbgZblAbgZahlahjahlahjahlcnscntcnucnvcnwahjahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaRahjcdccnxcdeahlcdccnxcdeahlcdccnxcdeahjdpXahjahlahlahlahlahlahlahlahlbLWbELcaqahlahlbGvcoDcoHcmUcoZcoIbGvcoEcoFciccnEciccnFciccicciccicciccnGcnHcnIcnJcmBcnKcmycnKcnLcnhcnNcnOcnOcnPcnPcnQcnPcnPdufduecicahjahlahlahlahjahjahlahlahjahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlaaeahlahlahlahlahlahlahlbRJahlahlahlahlahlahjahlahlahlahlahldsicbnblAbvkbgZdpwblAblAblAblAblAblAblAbgZahlahjahlahjahlahjcnVcnWcnVahjahlahlahjahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahlahjahlahlahlahjahjahjahlahlahjahjahldpXahjahjahlahlahlahlahlahlahlbRMbELbRMahlahlbGvcpecpkcmUcpjcpibGvcpFcpEbGvcoecofcogcohcoicojcokcolcomconcoocopcnicoqclcciccorciccorcicclccoqckUckUcosckUduhdugcpfduiciccicciccmvcmvcmvcmvcicahlahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlcoucmdcmebgZcnUbgZbgZcovcowckEcoxbgZbgZahlahjahlahlahlahjcoycnucoyahjahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcckJcdeahlcdcckJcdeahjcdcckJcdeahjahjahjahjahjahjahjahjbCvbCvbCvbCvbELbCvahjahjbGvcoacoBcoAcodcobbGvbLlbLkciccnbciccnccicclAclBclBciccndcnecnfcngckpclHclIclJclGclGcnkcnlcnmcnncnocnncnncnncnpcqMcicbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlbRJahlahlahlahlahjahjahlahlahlahlahjdsicbncnrblAbrqcpGblAbgZbgZbgZbgZbgZblAbgZahlahjahlahjahlcnscntcnucnvcnwahjahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaRahjcdccnxcdeahlcdccnxcdeahlcdccnxcdeahjdpXahjahlahlahlahlahlahlahlahlbLWbELcaqahlahlbGvcoDcoHcmUcoZcoIbGvcoEcoFciccnEciccnFciccicciccicciccnGcnHcnIcnJcmBcnKcmycnKcnLcnhcnNcnOcnOcnPcnPcnQcnPcnPdufduecicahjahlahlahlahjahjahlahlahjahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlaaeahlahlahlahlahlahlahlbRJahlahlahlahlahlahjahlahlahlahlahldsicbnblAaBRbgZbNiblAblAblAblAblAblAblAbgZahlahjahlahjahlahjcnVcnWcnVahjahlahlahjahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahlahjahlahlahlahjahjahjahlahlahjahjahldpXahjahjahlahlahlahlahlahlahlbRMbELbRMahlahlbGvcpecpkcmUcpjcpibGvcpFcpEbGvcoecofcogcohcoicojcokcolcomconcoocopcnicoqclcciccorciccorcicclccoqckUckUcosckUduhdugcpfduiciccicciccmvcmvcmvcmvcicahlahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlcoucmdcmebgZcnUbgZbgZbOjcowckEcoxbgZbgZahlahjahlahlahlahjcoycnucoyahjahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXaaHaaHaaRdpXdpXdpXdpXaaHdpXdpXaaHcozahlahjahjahlahlahlahlahlahjbRMbELbRMahjahjbGvcpYcuqcridptcoKdfecpCdhldgEdpudpvdoXcoLcoMcoNcoOcoPcmFckUcoQcoRckUcoSciccoTcoUcoVcoUcoWciccoXckUcoRcoYckUdujcnPcnPcqNcnPdsHcicdsWdsXcpacpbcpbcpcahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjcmbahlbgZbgZcgCcgEbgZbgZahjahjahlahlahlahlahjahlcpdahlahlahlahlahlahlahlahjahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlahlahlcdmbELcdmahlahlbGvcbSccOcaYcaXcaWbGvbSrbHWbGvckUckUcmFckUcmIcplcpmcpncmFcopckUckjcpocpocppcpqcprcpscptcpucpvcpwcpwcpxckUcopcmFckUckUbpackUbvHboSckhckhcpAcpBcbRcpDahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlbqzahlahlahjahlahjahlahlahjahjahjahlahlahlahjahlcpdahlahjahlahlahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlbCvbCvbTZbCvbCvahlbGvclucoJcbTbGvbGvbGvbGvbGvciccpHckUcmFckUcjFcpIcpJcpKcmFcpLcpMcpNcpOcpPciccpQcpRcpScopcpTciccpUcpVcpVcpMcpLcmFcpWciycdHclSbxfcicbxeckhcpZcpbcpbcqaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbcqbcqbcqcahjahjahjahjcpdahjahjahjahjahjaaRcqbcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlbCvckdbELcqdbCvahjbGvbGvbGvbGvbGvahjahlahlahjciccqeckUcmFckUckUcqfcmvcmvcqgciccqhcqicqicqiciccqjcqkcqlcqmcpyciccqicqicqicqhciccqgcmvcmvbpackUdpsciccmvcmvcmvcmvcicahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbahlahjahlahjahlahlahlcqoahlahjahjahlahlahlahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlbLWcqpcqqcqrbCvahjahlahlahjahlahlahjahlahlahjciccqscqtcmFcqucqvcqwcmvcqxcqyciccqzcqAcqBcqCcqDcqEcqFcqGcqHcpycqIcqAcqAcqAcqJciccqKcqLcicbpacjHciEciBckUbZYcqIahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbahlcqOcqOcqOcqOcqOahjcqPahjcqOcqOcqOcqOcqOahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbRMcqQcqRcqSbCvbCvcqTcqUcqUcqUcqUcqUcqUcqVcmvciccqWcqXcqYcqZcqWciccicciccqgcicciccmzcracrbcrccrdcpMcrecpMcrfcrgcrbcracrhcicciccqgciccicclwcmJclxclvckUciAcizahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlcqbahjcrjcrkcrkcrkcrkcrlcqPcrmcrncrncrncrncroahjcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlbLWbDicqqcqrbCvahjahlahlahjahlahlahjahlahlahjciccqscqtcmFcqucqvcqwcmvcqxcqyciccqzcqAcqBcqCcqDcqEcqFcqGcqHcpycqIcqAcqAcqAcqJciccqKcqLcicbpacjHciEciBckUbZYcqIahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbahlcqOcqOcqOcqOcqOahjcqPahjcqOcqOcqOcqOcqOahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbRMcqQcqRbfFbCvbCvcqTcqUcqUcqUcqUcqUcqUcqVcmvciccqWcqXcqYcqZcqWciccicciccqgcicciccmzcracrbcrccrdcpMcrecpMcrfcrgcrbcracrhcicciccqgciccicclwcmJclxclvckUciAcizahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlcqbahjcrjcrkcrkcrkcrkcrlcqPcrmcrncrncrncrncroahjcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjcrpcrqcrqcrrbCvahjahlahlahjahlahlahjahlahlahjdsidsidsiahjahlahjdsiciccrscrtcruahlahlahlcrvcrwcracracracracracrwcrxahlahlahlcrycrzcrAciccleciccicdrlcpXciDcjQahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlcqbahjcrBcrBcrBcrBcrBahlcqPahlcrBcrBcrBcrBcrBahjcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldsidsidsidsidsidsiahlahjahlahjahjahlahlahlahjciccrCcrDahlahlahlahjahjahjahjahjahjahjahjahjahjahjahlahlahlcrEcrCcicdrndrTciccmvcmvckDcmvahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlcqbahlahjahlahjahjahjahlcqPahlahjahlahjahlahjahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlciccrFcrGcrHahjahjahjcrIahlahlahlahlcrIahlahlcrIahjahjahjcrHcrJcrKciccqndoBcmvahjahlclndtAahjahlahlahlahjahlahlahlahjahlahlahlahjahlahlahlahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcqbahlcqOcqOcqOcqOcqOahjcqPahjcqOcqOcqOcqOcqOahjcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl @@ -9345,7 +9319,7 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcicciccrRcrHahlahlahjahlcrYahjdsidsidsiahjahjcrIahjahlahlcrHcrRciccicahlahlahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahldtzdtBdtAahlahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcqbahjcrjcrkcrkcrkcrkcrZcsacrZcrncrncrncrncroahjcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlciccrPcrQcrHahlahlahjahlahlahjahjahjahjahjahlahlahjahlahlcrHcrNcrOcicahlahlahlahjdsiahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahjdtzdtyahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcqbahjcrBcrBcrBcrBcrBahlcpdahlcrBcrBcrBcrBcrBahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlciccrCcrHcsbahlahlcscahlahlahlahjahlahlahlahlahlahjahlahlcrHcrHcrCcicahlahlahlaaeahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahjdpHdsEdpHdsGdsFdqudqudqudquahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcqbahlahlahjahjahjahlahlcpdahjahlahlahjahjahlahlcqbahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlciccsecrGcrHahjahjahjcrIahlahlcrIahlahlahlahlcrIahjcsgahjcrHcrJcsicicahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldtuahjahjahjahjdpHdsAdspdsydtrdsDdsCdsBdquahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlcqbcqbcqbcqbcqbahlahlahlcpdahlahlahlcqbcqbcqbcqccqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlciccsecrGcrHahjahjahjcrIahlahlcrIahlahlahlahlcrIahjcsgahjcrHcrJcsicicahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldtuahjahjahjahjdpHdsAdspdsydqEdsDdsCdsBdquahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlcqbcqbcqbcqbcqbahlahlahlcpdahlahlahlcqbcqbcqbcqccqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlciccsjcrHcrHahlahlahjahjahjahjahjahjahjahjahjahjahjahlahlcrHcrHcsjcicahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahjdpHdswdsrdrUdrUdsudstdsvdquahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcqbahjcskahjcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlciccsjcrHcshahlahlahlahjahlahlahlahlahlahlahlahjahlahlahlcsfcrHcsjcicahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahjdpHdssdsrdrUdrUdsqdsodqydquahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcqbahlahjahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcsdcsdcsdcsdcsdcsdcsdcsdcsdahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlclbciccicciccrHahjahjahjahlahlahlahlahlahlahjahjahjahjcrHcicciccicclbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjdpHdpHdsmdrUdrUdqudsndqudquahlahlahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcqbcqbcqbcqbcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl @@ -9559,11 +9533,11 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcBocBLcBMcBMcBocBNcBOcAncBPcBPcBPcBPcBOcBQcAlcAOcAOcAOcAOcBRcBScBRcBTcBJcBUcBUcBwcBVcBWcBXcATcBxcBAahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcBocBocBocBocBocBocBocBocBocBocBocBocBocBocBocBocBYcBocBocBQcBZcAncCacCbcCccBPcBZcBQcAlcBFcBHcCdcBFcBGcBGcBHcCecBkcBkcBkcCfcBXcBXcBXcATcBxcAQahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcBocCgcCgcCgcCgcCgcCgcCgcCgcCgcCgcCgcCgcCgcChcCicCjcCkcBocBQcBZcClcAncAncAncCmcBZcBQcAlcCncCocCocCpcBRcBScBRcCqcATcCrcATcATcATcATcATcATcCscAQahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcBocCgcCtcCucCvcCtcCucCucCucCwcCucCucCxcCycCzcCicCjcCkcBocBQcBZcAycAncAncAncAzcCAcBQcAlcCncCocCocCpcBFcBGcBHcAQcBWcATcCBcCCcATcCBcCCcATcCDcAQahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEahlahlahlahlahlahlahlahlahlahlahlcBocCtcCFcCGcCHcCIcCJcCJcCJcCJcCJcCJcCKcCLcCMcCicCjcCkcBocBQcCAcAycAncAncAncAtcAjcAXcAlcCNcCocCocCpcAlahlahlcCOcBWcATcCBcCCcATcCBcCCcATcCDcCOahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcCPcCPcCPcCPcCQcCPcCPcCPcCRcCScCPcCPcCPcCRcCPcCPcCPcCPcCPcCPcCRcCPcCPcCEahlahlahlahlahlahlahlahlahlahlahlcBocCwcCGcCTcCGcCUcCGcCGcCGcCGcCGcCGcCUcCVcCWcCicCjcCXcBocCYcBocAscAncAncAncAncAncAncCocCocCocCocCpcCZahlahlcDacBWcATcCBcCCcATcCBcCCcATcCDcDaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCQcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCRcCPcCPcCPcCPcCPcCRcCPcCPcCPcCPcCPcCEahlahlahlahlahlahlahlahlahlahlahlcBocDbcDccCGcDdcCIcDecDecDecDecDecDecCKcCLcDfcCicCjcCjcDgcCjcCjcAncAncAncAncAncAncAncCocCocCocCocCpcAlahlahlcDhcBWcATcCBcCCcATcCBcCCcATcCDcDhahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcCPcCPcDicCPcCPcCPcCPcCPcCQcCPcCPcCScCRcCPcCPcCRcCPcCPcCRcCScCPcCRcCPcCEahlahlahlahlahlahlahlahlahlahlahlcBocCgcDbcCucDjcDbcCucCucCucCwcCucCucDkcCycCzcCicCjcDlcBocCYcBocClcAncAncAncCmcAjcAXcAlcDmcCocCocCpcBFcBGcBHcAQcBWcATcCBcCCcATcCBcCCcATcCDcAQahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcBocCgcCtcCucCvcCtcCucCucCucCwcCucCucCxcCycCzcCicDgcCkcBocBQcBZcAycAncAncAncAzcCAcBQcAlcCncCocCocCpcBFcBGcBHcAQcBWcATcCBcCCcATcCBcCCcATcCDcAQahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEcCEahlahlahlahlahlahlahlahlahlahlahlcBocCtcCFdpccCHcCIcCJcCJcCJcCJcCJcCJcCKcCLcCMcCicDgcCkcBocBQcCAcAycAncAncAncAtcAjcAXcAlcCNcCocCocCpcAlahlahlcCOcBWcATcCBcCCcATcCBcCCcATcCDcCOahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcCPcCPcCPcCPcCQcCPcCPcCPcCRcCScCPcCPcCPcCRcCPcCPcCPcCPcCPcCPcCRcCPcCPcCEahlahlahlahlahlahlahlahlahlahlahlcBocCwcCGcCTcCGcCUcCGcCGcCGcCGcCGcCGcCUcCVcCWcCicDgcCXcBocCYcBocAscAncAncAncAncAncAncCocCocCocCocCpcCZahlahlcDacBWcATcCBcCCcATcCBcCCcATcCDcDaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCQcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCRcCPcCPcCPcCPcCPcCRcCPcCPcCPcCPcCPcCEahlahlahlahlahlahlahlahlahlahlahlcBocDbcDccCGcDdcCIcDecDecDecDecDecDecCKcCLcDfcCicDgcCjdpjcCjcCjcAncAncAncAncAncAncAncCocCocCocCocCpcAlahlahlcDhcBWcATcCBcCCcATcCBcCCcATcCDcDhahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcCPcCPcDicCPcCPcCPcCPcCPcCQcCPcCPcCScCRcCPcCPcCRcCPcCPcCRcCScCPcCRcCPcCEahlahlahlahlahlahlahlahlahlahlahlcBocCgcDbcCucDjcDbcCucCucCucCwcCucCucDkcCycCzcCicDgcDlcBocCYcBocClcAncAncAncCmcAjcAXcAlcDmcCocCocCpcBFcBGcBHcAQcBWcATcCBcCCcATcCBcCCcATcCDcAQahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCQcCPcCPcCRcCScCPcCPcCRcCPcCScCEahlahlahlahlahlahlahlahlahlahlahlcBocCgcCgcCgcCgcCgcCgcCgcCgcCgcCgcCgcCgcCgcDncCicCjcCkcBocBQcBOcAwcAncAncAncAxcBOcBQcAlcCncCocCocCpcBRcBScBRcCqcATcDocATcATcATcATcATcATcCscAQahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCPcCQcCPcCPcCPcCPcCPcCScCPcCRcCScCPcCRcCPcCEahlahlahlahlahlahlahlahlahlahlahlcDpcDpcDpcDpcDpcDpcDpcDpcDpcDpcDpcDpcDpcDpcDpcDpcDqcDpcDpcBQcBZcAwcAncAncAncAxcBZcBQcAlcBFcBHcDrcBFcBGcBGcBHcCecBkcBkcDscBkcDtcBAcDucABcADcDvahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcCPcDwcDwcDwcDwcDwcDwcDwcCPcCPcCPcCPcCPcCPcCPcCRcCPcCPcDicCScCPcCPcCPcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcBQcCAcAwcAncAncAncAxcCAcBQcAlcCocCocCocCpcBRcBScBRcCqcDxcDxcDxcDycAQcBycBxcBxcDzcBAahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl @@ -10249,7 +10223,7 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaEdaEdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaAdaAdaAdaAdaAdaAdaAdaWdcodekdcYddmdaWddndaWddoddpdaWdbudaWddoddpdaWdaJdaRdaWddqdbcdaJdbLdaWdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaEddadcldcldcldcldcldcldcldcldcldcldcldcldaEdaEdaEdaEahlahlahlahlahlahlahlahjdbNddrdcDddsdczdcDddtdcDddgdbNddhdcldcldcldcldcldaEdaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaEdaEdaEdaEdaEdaEdaEdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaAdaAdaAdaAdaAdaAdaAdaAdaAdaWdaWdaWdaWdaWdaWddndaWdaRdbVdaJdbCdbCdaJddudbtdaRdbtdaWddvddwddxddydaWdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaEddadcldcldcldcldcldcldcldcldcldcldcldcldaEdaEdaEahlahlahlahlahlahlahlahjahjdbNddzdcDddAdcQddBdcDdcDddgdbNddhdcldcldcldcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaEdaEdaEdaEdaEdaEdaEdaEdaEdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahldaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaWddndaWdbVdbLddCdbdddDdbtdbVdaWdaJdbCdaWddEddFddFddGdaWddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaEdaEdcldcldcldcldcldcldcldcldcldcldcldcldaEdaEdaEahlahlahlahlahlahlahjahjahjdbNdbNddIddJdbNdbNddKddLddKdbNddhdcldcldcldcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaEdaEdaEdaEdaEdaEddMddMdaEdaEdaEdaEdaEdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahldaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaWddndaWdbCdbtdaRdbVdbRdbCdbvdaWddndaWdaWdbUdaJddFddNddOddHddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaDdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaEdaEdcldcldcldcldcldcldcldcldcldcldcldclddPddQddRddSddSddSddSddSddSddTddPddQdcldclddUddVddWdbNddXdcDddYdbNddhdcldcldcldcldcldcldcldaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaEdaEdaEdaEdaEdaEddMddMdaEdaEdaEdaEdaEdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahldaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaWddndaWdbCdbtdaRdbVdbRdbCdbvdaWddndaWdaWdbUdaJddFddNddOddHddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaDdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaEdaEdcldcldcldcldcldcldcldcldcldcldcldmDddPddQddRddSddSddSddSddSddSddTddPddQdcldclddUddVddWdbNddXdcDddYdbNddhdcldcldcldcldcldcldcldaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlddZddZddZddZddZddZddMddMddMddMddMddMdaEdaEdaEdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahldaAdaAdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaWddndaWdaWdaWdaWdaWdaWdaWdaWdaWddndaWdbUdaJdeadaJddGdebddHddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaEdcldcldcldcldcldcldcldcldcldcldcldcldcldcldecdeddeddeddeddeddeddeddeddecdcldcldcldeedeedeedbNdefdegdehdbNddhdcldcldcldcldcldcldcldaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlddZddZddZddZddZddZdeideideidejddZddMddMddMddMddMddMddMddMddMdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahldaAdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaWddnddnddnddnddldbJddnddnddnddnddndaWdbUdeadeadeadbWdaWddHddHddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaEdcldcldcldcldcldcldcldcldcldcldcldcldclddPddQdeldemdemdemdemdemdemdemddPddQdcldcldcldcldcldbNddKdenddKdbNdeodcldcldcldcldcldcldcldaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlddZdepdeqdeqderddZdesdetdetdetddZdeudeudeudeudevddMddMddMddMddMddMdaEdaEdaEdaEdaEahlahlahlahlahlahlahldaAdaAdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaWdaWdaWdaWdaWdaWdaWdaWdaWdaWdaWdaWdaWdaWddydewdexdaWdaWddHddHddHddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaEdcldcldcldcldcldcldcldcldcldcldcldcldcldaEahlahlahlahlahlahlahlahldaEdaEdaEdcldcldcldcldcldcldeydezdeAdeBdeCdeDdcldcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl @@ -10257,16 +10231,16 @@ ahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlddZdeEdeFdeGdeHddZdeIdetde ahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahldeQddZddZddZdeRdgideTddZdeUdghddZddZddZddZddZdeWdeudeXddMddMddMddMddMddMddMddMddMdaEdaEdaEahlahlahlahldaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCddHddHddHdaWdeYdeZdeYdaWddHddHddHddHddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaEdcldcldcldcldcldcldcldcldcldcldcldcldaEahlahlahlahlahlahlahldaEdaEdaEdaEdaEdaEdaEdaEdaEdaEdcldcldcldcldcldfadcldcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahldtuahjahjahjahjahjdeQdgudgvddZdffdfgdgwdgqdgtdfgdgpddZdfhdfhdfhdevdeNdeNddMddMddMddMddMddMddMddMddMdaEdaEdaEdaEdaEahldaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCddHddHdaWdfidewdfjdaWddHddHddHddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaEdaEdcldcldcldcldcldcldcldcldaEdaEdaEdaEahlahlahlahlahlahlahlahldaEdaEdaEdaEdaEdaEdaEdaEdaEdaEdaEdcldcldcldfadcldcldaEdaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahjdfkdfkdfkdfkdfkdeQdfUdfVdfRdfSdfHdfTdfgdffdfgdfgdfrdfhdfhdeNdeNdeNdeNdfsddMddMddMddMddMddMddMddMddMdaEdaEdaEdaEahldaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaDdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCddHddHddHdftdfudfvddHddHddHddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaDdaCdaCdaCdaCdaCdaAdaAdaAdaEdaEdaEdaEdaEdcldclddaddadaEdaAdaAdaAahlahlahlahlahlahlahlahldaEdaEdaEdaEdaEdaEdaEdaEdaEdaEdaEdaEdcldcldfadcldcldaEdaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahjdfkdfkdfkdfkdfkdeQdgfdggdfydgddfHdfAdfgdffdfXdfgddZdfCdfDdfDdeNdeNdevdevddMddMddMddMddMddMddMddMddMddMdaEdaEdaEahldaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCddHddHddHddHddHdfEddHddHddHddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAdaAdaEdaEdaEdaEdaEdaEdaAdaAdaAahlahlahlahlahlahlahlahldaEdaEdaEdaHdaHdaHdaEdaEdaEdaEdaEdaEdcldcldfadcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahjdfkdfkdfkdfkdfkdeQdgfdggdfydgddfHdpbdfgdffdfXdfgddZdfCdfDdfDdeNdeNdevdevddMddMddMddMddMddMddMddMddMddMdaEdaEdaEahldaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCddHddHddHddHddHdfEddHddHddHddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAdaAdaEdaEdaEdaEdaEdaEdaAdaAdaAahlahlahlahlahlahlahlahldaEdaEdaEdaHdaHdaHdaEdaEdaEdaEdaEdaEdcldcldfadcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahjdfkdfkdfkdfkdfkdeQddZddZddZdfBdfgdfFdfHdfGdfIdfJdfKdfLdfLdfMdfNdeNdevdevdfOddMddMddMddMddMddMddMddMddMdaEdaEdaEahldaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCddHddHddHddHddHddHddHdfEddHddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAahlahlahlahlahlahlahlahlahldaEdaEdaEdaHdaHdaHdaEdaEdaEdaEdaEdcldcldfPdfQdcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahjdfkdfkdfkdfkdfkdfqdfwdfqdfxdfgdfgdffdfgdfgdfWdfzddZdfYdfZdgadeNdeNdevdevdgbddMddMddMddMddMddMddMddMddMddMdaEdaEahldaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCddHddHddHddHdfEddHddHddHddHddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAdaAdaAdaAdaAdaAahlahlahlahlahlahlahlahlahldaEdaEdaEdaHdaHdaHdaHdaHdaEdaEdaEdcldcldcldfadcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahjdfkdfkdfkdfkdfkdeQddZddZddZdfgdfgdffdfIdgcddZdfpddZdfhdfhdfhdevdevdevdevdgeddZddMddMddMddMddMddMddMddMddMddMdaEahldaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCddHddHddHddHddHddHddHddHddHddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAahlahlahlahlahlahlahlahldaEdaEdaEdaEdaHdaHdaHdaHdaEdaEdaEdcldcldcldfadcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahjdfkdfkdfkdfkdfkahlahlddZdfldfgdfgdffdfndfodfndfmddZdgjdgkdevdevdevdevdfsddMddMddMddMddMddMddMddMddMddMddMddMdaEahjdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCddHddHddHddHddHddHddHddHddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAahlahlahlahlahlahlahlahlahldaEdaEdaEdaHdaHdaHdaHdaEdaEdaEdcldcldcldfadcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahjdfkdfkdfkdfkdfkahlahlddZdfldfgdfgdoUdfndfodfndfmddZdgjdgkdevdevdevdevdfsddMddMddMddMddMddMddMddMddMddMddMddMdaEahjdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCddHddHddHddHddHddHddHddHddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAahlahlahlahlahlahlahlahlahldaEdaEdaEdaHdaHdaHdaHdaEdaEdaEdcldcldcldfadcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahjdfkdfkdfkdfkdfkdgldgmdgmdgmdgmdgndgodgmdgmdgmddZdgmdgmdfddevdeNdevdevdfsddMddMddMddMddMddMddMddMddMddMddMddMdaEahlahldaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCddHddHddHddHddHddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAdaAahlahlahlahlahlahlahlahldaEdaEdaEdaEdaHdaHdaHdaEdaEdaEdcldcldcldfadcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahjdfkdfkdfkdfkdfkdeVdgYdeVdgsdgFdfcdfbdeScMZcMfcMedgrdgydfhdfhdevdevdevddMddMddMddMddMddMddMddMddMddMddMddMddMddMdaEahlahldaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCddHddHddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAahlahlahlahlahlahlahlahldaEdaEdaEdaEdaHdaHdaHdaHdaEdaEdaEdcldcldfadcldcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahjdfkdfkdfkdfkdfkdeVdfAdeVdgsdgFdfcdgWdeScMZcMfcMedgrdgydfhdfhdevdevdevddMddMddMddMddMddMddMddMddMddMddMddMddMddMdaEahlahldaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCddHddHddHdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAahlahlahlahlahlahlahlahldaEdaEdaEdaEdaHdaHdaHdaHdaEdaEdaEdcldcldfadcldcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahjdfkdfkdfkdfkdfkdgldgmdgmdgmcLGdgodgmdgmdgAcLEdgodgmdgmdfhdfhdevdevddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMdaEdaEahlahldaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAahlahlahlahlahlahlahlahldaEdaEdaEdaEdaHdaHdaHdaHdaEdaEdaEdcldcldfadcldcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahjdfkdfkdfkdfkdfkdgldgDdtwcLycKWcapdgmbJZdgKbtGavRdgNdgOdgPdgQdgRddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMdaEahlahldaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaDdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaDdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAahlahlahlahlahlahlahldaEdaEdaEdaEdaHdaHdaHdaHdaEdaEdaEdcldcldfPdgSdfQdcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahjdfkdfkdfkdfkdfkdgTdgUdgrdgVdgrdgWdgmdgXdgYdgYdgZdhadgmddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMdaEdaEahldaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAahlahlahlahlahlahlahlahldaEdaEdaEdaHdaHdaHdaHdaEdaEdaEdcldcldcldcldfadcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahjdfkdfkdfkdfkdfkdgTdgUdgrdgVdgrdfbdgmdgXdgYdgYdgZdhadgmddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMdaEdaEahldaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAahlahlahlahlahlahlahlahldaEdaEdaEdaHdaHdaHdaHdaEdaEdaEdcldcldcldcldfadcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjdhbdhcdhddhedhfdhgdgmdhhdhidhjdhkdhadgmddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMdaEahldaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaDdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaKdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAahlahlahlahlahlahlahlahldaEdaEdaEdaHdaHdaHdaHdaEdaEdaEdaEdcldcldcldfadcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlduudhmdhndgmdgmdgmdgmdgmdgmdgmdgmdgmdgmddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMdaEahlahldaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAdaAahlahlahlahlahlahlahlahldaEdaEdaEdaHdaHdaHdaHdaEdaEdaEdcldcldhodeCdeDdcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaEdaEdaEdaEddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMddMdaEahjdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaDdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAdaAdaAahlahlahlahlahlahlahldaEdaEdaEdaEdaHdaHdaHdaEdaEdaEdcldcldeydePdeAdcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl @@ -10362,10 +10336,10 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaAahlahldaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaEdcldcldizdizdizdizdizdlbdlcdlddizdizdledizdizdizdizdeydeAdcldcldcldcldcldfadcldcldcldcldcldcldaEdaEdaAdaAdaCdaCdaCdaAdaAdaAdaAdaAdaEdaEdcldcldcldfadcldcldcldcldcldcldcldcldeydeAdcldcldcldcldfadcldcldcldcldcldcldaEdaEdaEdaEdaAdiadiadiadiadlfdjOdlgdlhdlidjKdljdlkdlkdlldlldlkdlkdlmdlndlkdlndlodlodlodlodlodlodlodlodlpdlpdlpdlpdlpdlpdlpdlqdlrdlqdlsdlrdltdludlvdlwdlxdlydlzdkqdlAdlBdktdeAdcldcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaAahldaAdaAdaAdaAdaAdaAdaAdaAdaEdaEdcldcldcldcldcldizdlCdlDdlEdlFdizdlGdlHdiqdcldcldcldcldcldcldcldcldcldfPdgSdgSdfQdcldcldcldcldaEdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaEdcldcldhpdgSdhqdcldcldcldcldaEdcldcldcldcldcldcldcldcldcldfadcldcldcldcldcldcldcldcldcldaEdaEdaEdaEdaEdiadjwdlIdlJdlKdlKdlJdlLdlMdlNdlKdlKdlJdlJdlOdlPdlQdlRdlSdlSdlSdlSdlSdlSdlSdlSdlTdlTdlTdlTdlTdlTdlUdlVdlWdlXdlYdlZdmadmbdmcdjPdjPdjPdjPdjPdjPdjPdjPdmddmedgMdmedmgddadaEdaEdaEdaEdaEdaHdaHdaHdaHdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaAdaAahldaAdaAdaAdaAdaAdaAdaEdaEdcldcldcldcldizdmhdmidmjdmkdizdcldcldcldcldcldcldaEdaEdaEdaEdcldcldcldcldcldfadcldcldcldcldcldaEdaAdaAdaAdaAdaAdaEdaEdaEdaEdaEdcldhpdhqdcldcldcldaEdaEdaEdaEdaEdaEdaEdcldcldcldcldcldcldfadcldcldcldcldcldcldcldcldcldcldcldaEdaEdiadiadmldmmdmldiadiadmndmodmpdiadiadmldmqdmldiadmrdcldcldclahlahlahlahlahjahlahlahlahjahlahlahlahlahlahjahldmsdjRdkkdmtdmudkjdmwdmxdmydjPdnhdmzdmBdkAdmCdmCdmCdmCdmgdcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaAdaAdaAdaAdaAdaEdaEdcldcldcldizdizdizdizdizdizdcldcldaEdaEdaEdaEdaEdaAdaAdaEdaEdcldcldcldcldfadcldcldcldcldcldcldaEdaEdaEdaEdaEdaEdcldcldcldcldcldfadcldcldaEdaEdaEdaAdaAdaAdaAdaAdaEdcldcldcldcldcldcldfadcldcldcldhodeDdcldcldcldcldcldcldcldaEdiadmDdmEdmFdmEdiadmGdmHdmIdmJdmKdiadmLdmMdmNdmOdcldcldcldcldcldclahlahlahjahlahlahlahjahjahjahjahjahjahjahjahjdjPdmPdmQdmfdjPdjPdjPdnGdjPdnhdmvdjPdjPdmAdmgdmgdmgdmgdcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaAdaAdaAdaAdaEdcldcldcldcldcldcldcldcldcldcldcldaEdaAdaAdaAdaAdaAdaAdaAdaEdaEdcldcldcldfPdgSdgSdgSdfQdcldcldcldcldcldcldcldcldcldcldcldcldcldfadcldaEdaEdaAdaAdaAdaAdaAdaAdaAdaEdaEdcldcldcldcldcldfPdgSdgSdgSdhvdhwdgSdgSdgSdfQdcldcldcldcldiadmTdmUdmVdmWdiadmXdmKdmKdmYdmZdiadnadnbdncdiadcldcldcldcldcldclahjahjahjahjahjahjahjdnddnddnddnddndahjahlahldjPdnednfdludngdmSdjPdnGdjPdmRdmxdmydjPdcldcldcldcldcldaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaAdaAdaAdaAdaAdaEdaEdcldcldcldizdizdizdizdizdizdcldcldaEdaEdaEdaEdaEdaAdaAdaEdaEdcldcldcldcldfadcldcldcldcldcldcldaEdaEdaEdaEdaEdaEdcldcldcldcldcldfadcldcldaEdaEdaEdaAdaAdaAdaAdaAdaEdcldcldcldcldcldcldfadcldcldcldhodeDdcldcldcldcldcldcldcldaEdiadmTdmEdmFdmEdiadmGdmHdmIdmJdmKdiadmLdmMdmNdmOdcldcldcldcldcldclahlahlahjahlahlahlahjahjahjahjahjahjahjahjahjdjPdmPdmQdmfdjPdjPdjPdnGdjPdnhdmvdjPdjPdmAdmgdmgdmgdmgdcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaAdaAdaAdaAdaEdcldcldcldcldcldcldcldcldcldcldcldaEdaAdaAdaAdaAdaAdaAdaAdaEdaEdcldcldcldfPdgSdgSdgSdfQdcldcldcldcldcldcldcldcldcldcldcldcldcldfadcldaEdaEdaAdaAdaAdaAdaAdaAdaAdaEdaEdcldcldcldcldcldfPdgSdgSdgSdhvdhwdgSdgSdgSdfQdcldcldcldcldiadtrdmUdmVdmWdiadmXdmKdmKdmYdmZdiadnadnbdncdiadcldcldcldcldcldclahjahjahjahjahjahjahjdnddnddnddnddndahjahlahldjPdnednfdludngdmSdjPdnGdjPdmRdmxdmydjPdcldcldcldcldcldaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaAdaAdaAdaAdaEdcldcldcldcldcldcldcldcldcldaEdaEdaEdaAdaAdaAdaCdaCdaAdaAdaAdaEdaEdaEdcldcldcldcldcldfPdfQdcldcldhodeDdcldcldhpdgSdgSdgSdgSdgSdhqdcldaEdaAdaAdaAdaAdaAdaAdaAdaAdaAdaEdaEdaEdcldcldcldcldcldcldcldeydeAdcldcldcldfadcldcldcldcldmOdiadiadiadiadiadnkdnldnmdnndmZdiadmldnodmldiadcldcldcldcldcldclahlahlahjahlahlahlahjdnddnddnddnddndahjahldkidjRdnpdnqdmbdnhdmSdjPdnGdjPdnidjPdntdjPdcldcldcldcldcldaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaAdaAdaAdaAdaEdaEdaEdaEdcldcldcldcldaEdaEdaEdaAdaAdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaEdaEdaEdcldcldcldcldfPdgSdgSdhvdhwdgSdgSdhqdcldcldcldcldcldcldcldaEdaAdaAdaAdaAdaAdaAdaCdaCdaAdaAdaAdaEdaEdaEdaEdcldcldcldcldcldcldcldcldcldfPdgSdgSdfQdcldcldcldcldcldcldmOdiadiadiadiadiadmOdnudnudjqdnvdcldcldcldcldclahlahlahlahjahlahlahlahjdnddnddnddnddnddnwdkQdnxdnydkkdnzdludkkdkkdnBdnLdnrdkkdnjdnGdjPdcldcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaAdaAdaAdaAdaEdaEdaEdaEdcldcldcldcldaEdaEdaEdaAdaAdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaEdaEdaEdcldcldcldcldfPdgSdgSdhvdhwdgSdgSdhqdcldcldcldcldcldcldcldaEdaAdaAdaAdaAdaAdaAdaCdaCdaAdaAdaAdaEdaEdaEdaEdcldcldcldcldcldcldcldcldcldfPdgSdgSdfQdcldcldcldcldcldcldiadiadiadiadiadiadiadnudnudjqdnvdcldcldcldcldclahlahlahlahjahlahlahlahjdnddnddnddnddnddnwdkQdnxdnydkkdnzdludkkdkkdnBdnLdnrdkkdnjdnGdjPdcldcldcldcldaEdaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaAdaAdaAdaAdaAdaAdaAdaEdaEdaEdaEdaEdaEdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAdaEdaEdaEdaEdcldcldcldcldeydeAdcldcldcldcldcldcldaEdaEdaEdaEdaEdaAdaAdaAdaAdaAdaAdaCdaCdaCdaAdaAdaAdaAdaAdaEdaEdaEdaEdaEdaEdaEdaEdcldcldcldcldcldfadcldcldcldcldcldcldcldcldeydezdezdezdezdezdezdeAdcldcldcldcldcldclahjahjahjahjahjahjahjahjdnddnddnddnddnddnHdkkdnHdkkdkkdnzdludkkdkkdnIdkkdkkdnEdnKdnLdjPdcldcldcldcldaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAdaAdaEdaEdcldcldcldcldcldcldcldcldcldaEdaEdaEdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaEdaEdcldcldcldcldfadcldnMdcldcldcldcldcldcldcldcldcldcldcldcldcldcldcldcldcldcldcldcldclahlahlahlahlahlahlahjdnddnddnddnddnddjQdkQdnNdnOdkkdnzdnPdlZdlZdnQdlZdlZdnAdnSdnTdjPdcldcldcldcldaEdaEdaEdaEdaHdaHdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAdaEdaEdaEdcldcldcldaEdaEdaEdaEdaEdaAdaAdaAdaAdaAdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaAdaAdaAdaAdaAdaAdaAdaAdaAdaAdaEdcldcldcldcldfPdgSdgSdgSdgSdgSdgSdgSdgSdgSdgSdgSdgSdgSdgSdgSdgSdgSdfQdcldcldcldcldcldclahlahlahlahlahlahjdnddnddnddnddndahjahldmsdjRdnUdnzdludkkdkkdnVdnWdkkdkkdnsdnGdjPdcldcldcldcldaEdaEdaEdaEdaHdaHdaHdaHdaHdaEdaEdaEdaEdaEdaEdaEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index d91a2044b00..5d47b855257 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -10,7 +10,7 @@ Pipelines + Other Objects -> Pipe network */ -obj/machinery/atmospherics +/obj/machinery/atmospherics anchored = 1 idle_power_usage = 0 active_power_usage = 0 @@ -20,64 +20,64 @@ obj/machinery/atmospherics -obj/machinery/atmospherics/var/initialize_directions = 0 -obj/machinery/atmospherics/var/pipe_color +/obj/machinery/atmospherics/var/initialize_directions = 0 +/obj/machinery/atmospherics/var/pipe_color -obj/machinery/atmospherics/process() +/obj/machinery/atmospherics/process() if(gc_destroyed) //comments on /vg/ imply that GC'd pipes still process return PROCESS_KILL build_network() -obj/machinery/atmospherics/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) +/obj/machinery/atmospherics/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) // Check to see if should be added to network. Add self if so and adjust variables appropriately. // Note don't forget to have neighbors look as well! return null -obj/machinery/atmospherics/proc/build_network() +/obj/machinery/atmospherics/proc/build_network() // Called to build a network from this node return null -obj/machinery/atmospherics/proc/return_network(obj/machinery/atmospherics/reference) +/obj/machinery/atmospherics/proc/return_network(obj/machinery/atmospherics/reference) // Returns pipe_network associated with connection to reference // Notes: should create network if necessary // Should never return null return null -obj/machinery/atmospherics/proc/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) +/obj/machinery/atmospherics/proc/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) // Used when two pipe_networks are combining -obj/machinery/atmospherics/proc/return_network_air(datum/network/reference) +/obj/machinery/atmospherics/proc/return_network_air(datum/network/reference) // Return a list of gas_mixture(s) in the object // associated with reference pipe_network for use in rebuilding the networks gases list // Is permitted to return null -obj/machinery/atmospherics/proc/disconnect(obj/machinery/atmospherics/reference) +/obj/machinery/atmospherics/proc/disconnect(obj/machinery/atmospherics/reference) -obj/machinery/atmospherics/update_icon() +/obj/machinery/atmospherics/update_icon() return null -obj/machinery/atmospherics/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) +/obj/machinery/atmospherics/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if(can_unwrench && istype(W, /obj/item/weapon/wrench)) var/turf/T = src.loc if (level==1 && isturf(T) && T.intact) - user << "\red You must remove the plating first." + user << "You must remove the plating first." return 1 var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it is too exerted due to internal pressure." + user << "You cannot unwrench this [src], it is too exerted due to internal pressure." add_fingerprint(user) return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." + user << "You begin to unfasten \the [src]..." add_fingerprint(user) if (do_after(user, 40)) user.visible_message( \ "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ + "You have unfastened \the [src].", \ "You hear ratchet.") var/obj/item/pipe/newpipe = new(loc, make_from=src) transfer_fingerprints_to(newpipe) diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index 83affc6a0c3..923bb5ea0c2 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -1,4 +1,4 @@ -obj/machinery/atmospherics/binary +/obj/machinery/atmospherics/binary dir = SOUTH initialize_directions = SOUTH|NORTH use_power = 1 @@ -12,119 +12,119 @@ obj/machinery/atmospherics/binary var/datum/pipe_network/network1 var/datum/pipe_network/network2 - New() - ..() - switch(dir) - if(NORTH) - initialize_directions = NORTH|SOUTH - if(SOUTH) - initialize_directions = NORTH|SOUTH - if(EAST) - initialize_directions = EAST|WEST - if(WEST) - initialize_directions = EAST|WEST - air1 = new - air2 = new +/obj/machinery/atmospherics/binary/New() + ..() + switch(dir) + if(NORTH) + initialize_directions = NORTH|SOUTH + if(SOUTH) + initialize_directions = NORTH|SOUTH + if(EAST) + initialize_directions = EAST|WEST + if(WEST) + initialize_directions = EAST|WEST + air1 = new + air2 = new - air1.volume = 200 - air2.volume = 200 + air1.volume = 200 + air2.volume = 200 // Housekeeping and pipe network stuff below - network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - if(reference == node1) - network1 = new_network +/obj/machinery/atmospherics/binary/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) + if(reference == node1) + network1 = new_network - else if(reference == node2) - network2 = new_network + else if(reference == node2) + network2 = new_network - if(new_network.normal_members.Find(src)) - return 0 + if(new_network.normal_members.Find(src)) + return 0 - new_network.normal_members += src + new_network.normal_members += src - return null + return null - Destroy() - loc = null +/obj/machinery/atmospherics/binary/Destroy() + loc = null - if(node1) - node1.disconnect(src) - del(network1) - if(node2) - node2.disconnect(src) - del(network2) + if(node1) + node1.disconnect(src) + del(network1) + if(node2) + node2.disconnect(src) + del(network2) + node1 = null + node2 = null + + ..() + +/obj/machinery/atmospherics/binary/initialize() + src.disconnect(src) + + var/node2_connect = dir + var/node1_connect = turn(dir, 180) + + for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect)) + if(target.initialize_directions & get_dir(target,src)) + node1 = target + break + + for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect)) + if(target.initialize_directions & get_dir(target,src)) + node2 = target + break + + update_icon() + +/obj/machinery/atmospherics/binary/build_network() + if(!network1 && node1) + network1 = new /datum/pipe_network() + network1.normal_members += src + network1.build_network(node1, src) + + if(!network2 && node2) + network2 = new /datum/pipe_network() + network2.normal_members += src + network2.build_network(node2, src) + + +/obj/machinery/atmospherics/binary/return_network(obj/machinery/atmospherics/reference) + build_network() + + if(reference==node1) + return network1 + + if(reference==node2) + return network2 + + return null + +/obj/machinery/atmospherics/binary/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) + if(network1 == old_network) + network1 = new_network + if(network2 == old_network) + network2 = new_network + + return 1 + +/obj/machinery/atmospherics/binary/return_network_air(datum/pipe_network/reference) + var/list/results = list() + + if(network1 == reference) + results += air1 + if(network2 == reference) + results += air2 + + return results + +/obj/machinery/atmospherics/binary/disconnect(obj/machinery/atmospherics/reference) + if(reference==node1) + del(network1) node1 = null + + else if(reference==node2) + del(network2) node2 = null - ..() - - initialize() - src.disconnect(src) - - var/node2_connect = dir - var/node1_connect = turn(dir, 180) - - for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect)) - if(target.initialize_directions & get_dir(target,src)) - node1 = target - break - - for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect)) - if(target.initialize_directions & get_dir(target,src)) - node2 = target - break - - update_icon() - - build_network() - if(!network1 && node1) - network1 = new /datum/pipe_network() - network1.normal_members += src - network1.build_network(node1, src) - - if(!network2 && node2) - network2 = new /datum/pipe_network() - network2.normal_members += src - network2.build_network(node2, src) - - - return_network(obj/machinery/atmospherics/reference) - build_network() - - if(reference==node1) - return network1 - - if(reference==node2) - return network2 - - return null - - reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) - if(network1 == old_network) - network1 = new_network - if(network2 == old_network) - network2 = new_network - - return 1 - - return_network_air(datum/pipe_network/reference) - var/list/results = list() - - if(network1 == reference) - results += air1 - if(network2 == reference) - results += air2 - - return results - - disconnect(obj/machinery/atmospherics/reference) - if(reference==node1) - del(network1) - node1 = null - - else if(reference==node2) - del(network2) - node2 = null - - return null \ No newline at end of file + return null diff --git a/code/ATMOSPHERICS/components/binary_devices/circulator.dm b/code/ATMOSPHERICS/components/binary_devices/circulator.dm index 2142b7b06e2..a5a222736fb 100644 --- a/code/ATMOSPHERICS/components/binary_devices/circulator.dm +++ b/code/ATMOSPHERICS/components/binary_devices/circulator.dm @@ -17,54 +17,54 @@ density = 1 - proc/return_transfer_air() +/obj/machinery/atmospherics/binary/circulator/proc/return_transfer_air() - var/output_starting_pressure = air1.return_pressure() - var/input_starting_pressure = air2.return_pressure() + var/output_starting_pressure = air1.return_pressure() + var/input_starting_pressure = air2.return_pressure() - if(output_starting_pressure >= input_starting_pressure-10) - //Need at least 10 KPa difference to overcome friction in the mechanism - last_pressure_delta = 0 - return null + if(output_starting_pressure >= input_starting_pressure-10) + //Need at least 10 KPa difference to overcome friction in the mechanism + last_pressure_delta = 0 + return null - //Calculate necessary moles to transfer using PV = nRT - if(air2.temperature>0) - var/pressure_delta = (input_starting_pressure - output_starting_pressure)/2 + //Calculate necessary moles to transfer using PV = nRT + if(air2.temperature>0) + var/pressure_delta = (input_starting_pressure - output_starting_pressure)/2 - var/transfer_moles = pressure_delta*air1.volume/(air2.temperature * R_IDEAL_GAS_EQUATION) + var/transfer_moles = pressure_delta*air1.volume/(air2.temperature * R_IDEAL_GAS_EQUATION) - last_pressure_delta = pressure_delta + last_pressure_delta = pressure_delta - //world << "pressure_delta = [pressure_delta]; transfer_moles = [transfer_moles];" + //world << "pressure_delta = [pressure_delta]; transfer_moles = [transfer_moles];" - //Actually transfer the gas - var/datum/gas_mixture/removed = air2.remove(transfer_moles) + //Actually transfer the gas + var/datum/gas_mixture/removed = air2.remove(transfer_moles) - if(network1) - network1.update = 1 + if(network1) + network1.update = 1 - if(network2) - network2.update = 1 + if(network2) + network2.update = 1 - return removed + return removed - else - last_pressure_delta = 0 - - process() - ..() - update_icon() + else + last_pressure_delta = 0 +/obj/machinery/atmospherics/binary/circulator/process() + ..() update_icon() - if(stat & (BROKEN|NOPOWER)) - icon_state = "circ[side]-p" - else if(last_pressure_delta > 0) - if(last_pressure_delta > ONE_ATMOSPHERE) - icon_state = "circ[side]-run" - else - icon_state = "circ[side]-slow" - else - icon_state = "circ[side]-off" - return 1 \ No newline at end of file +/obj/machinery/atmospherics/binary/circulator/update_icon() + if(stat & (BROKEN|NOPOWER)) + icon_state = "circ[side]-p" + else if(last_pressure_delta > 0) + if(last_pressure_delta > ONE_ATMOSPHERE) + icon_state = "circ[side]-run" + else + icon_state = "circ[side]-slow" + else + icon_state = "circ[side]-off" + + return 1 diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index b761ad7150f..e2332110eb0 100644 --- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm @@ -9,191 +9,189 @@ desc = "Has a valve and pump attached to it. There are two ports." level = 1 - - high_volume - name = "large dual-port air vent" - - New() - ..() - - air1.volume = 1000 - air2.volume = 1000 - - var/on = 0 - var/pump_direction = 1 //0 = siphoning, 1 = releasing - - var/external_pressure_bound = ONE_ATMOSPHERE - var/input_pressure_min = 0 - var/output_pressure_max = 0 - - var/pressure_checks = 1 - //1: Do not pass external_pressure_bound - //2: Do not pass input_pressure_min - //4: Do not pass output_pressure_max - - update_icon() - if(on) - if(pump_direction) - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]out" - else - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]in" - else - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" - on = 0 - - return - - hide(var/i) //to make the little pipe section invisible, the icon changes. - if(on) - if(pump_direction) - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]out" - else - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]in" - else - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" - on = 0 - return - - process() - ..() - - if(!on) - return 0 - - var/datum/gas_mixture/environment = loc.return_air() - var/environment_pressure = environment.return_pressure() - - if(pump_direction) //input -> external - var/pressure_delta = 10000 - - if(pressure_checks&1) - pressure_delta = min(pressure_delta, (external_pressure_bound - environment_pressure)) - if(pressure_checks&2) - pressure_delta = min(pressure_delta, (air1.return_pressure() - input_pressure_min)) - - if(pressure_delta > 0) - if(air1.temperature > 0) - var/transfer_moles = pressure_delta*environment.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) - - var/datum/gas_mixture/removed = air1.remove(transfer_moles) - - loc.assume_air(removed) - - if(network1) - network1.update = 1 - - else //external -> output - var/pressure_delta = 10000 - - if(pressure_checks&1) - pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound)) - if(pressure_checks&4) - pressure_delta = min(pressure_delta, (output_pressure_max - air2.return_pressure())) - - if(pressure_delta > 0) - if(environment.temperature > 0) - var/transfer_moles = pressure_delta*air2.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) - - var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) - - air2.merge(removed) - - if(network2) - network2.update = 1 - - return 1 - - //Radio remote control - - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA) - - broadcast_status() - if(!radio_connection) - return 0 - - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - - signal.data = list( - "tag" = id, - "device" = "ADVP", - "power" = on, - "direction" = pump_direction?("release"):("siphon"), - "checks" = pressure_checks, - "input" = input_pressure_min, - "output" = output_pressure_max, - "external" = external_pressure_bound, - "sigtype" = "status" - ) - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - - return 1 - var/frequency = 0 var/id = null var/datum/radio_frequency/radio_connection - initialize() - ..() - if(frequency) - set_frequency(frequency) +/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume + name = "large dual-port air vent" - receive_signal(datum/signal/signal) +/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume/New() + ..() - if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) - return 0 - if("power" in signal.data) - on = text2num(signal.data["power"]) + air1.volume = 1000 + air2.volume = 1000 - if("power_toggle" in signal.data) - on = !on +var/on = 0 +var/pump_direction = 1 //0 = siphoning, 1 = releasing - if("set_direction" in signal.data) - pump_direction = text2num(signal.data["set_direction"]) +var/external_pressure_bound = ONE_ATMOSPHERE +var/input_pressure_min = 0 +var/output_pressure_max = 0 - if("checks" in signal.data) - pressure_checks = text2num(signal.data["checks"]) +var/pressure_checks = 1 +//1: Do not pass external_pressure_bound +//2: Do not pass input_pressure_min +//4: Do not pass output_pressure_max - if("purge" in signal.data) - pressure_checks &= ~1 - pump_direction = 0 +/obj/machinery/atmospherics/binary/dp_vent_pump/update_icon() + if(on) + if(pump_direction) + icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]out" + else + icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]in" + else + icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" + on = 0 - if("stabalize" in signal.data) - pressure_checks |= 1 - pump_direction = 1 + return - if("set_input_pressure" in signal.data) - input_pressure_min = Clamp( - text2num(signal.data["set_input_pressure"]), - 0, - ONE_ATMOSPHERE*50 - ) +/obj/machinery/atmospherics/binary/dp_vent_pump/hide(var/i) //to make the little pipe section invisible, the icon changes. + if(on) + if(pump_direction) + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]out" + else + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]in" + else + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" + on = 0 + return - if("set_output_pressure" in signal.data) - output_pressure_max = Clamp( - text2num(signal.data["set_output_pressure"]), - 0, - ONE_ATMOSPHERE*50 - ) +/obj/machinery/atmospherics/binary/dp_vent_pump/process() + ..() - if("set_external_pressure" in signal.data) - external_pressure_bound = Clamp( - text2num(signal.data["set_external_pressure"]), - 0, - ONE_ATMOSPHERE*50 - ) + if(!on) + return 0 - if("status" in signal.data) - spawn(2) - broadcast_status() - return //do not update_icon - //if(signal.data["tag"]) + var/datum/gas_mixture/environment = loc.return_air() + var/environment_pressure = environment.return_pressure() + + if(pump_direction) //input -> external + var/pressure_delta = 10000 + + if(pressure_checks&1) + pressure_delta = min(pressure_delta, (external_pressure_bound - environment_pressure)) + if(pressure_checks&2) + pressure_delta = min(pressure_delta, (air1.return_pressure() - input_pressure_min)) + + if(pressure_delta > 0) + if(air1.temperature > 0) + var/transfer_moles = pressure_delta*environment.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) + + var/datum/gas_mixture/removed = air1.remove(transfer_moles) + + loc.assume_air(removed) + + if(network1) + network1.update = 1 + + else //external -> output + var/pressure_delta = 10000 + + if(pressure_checks&1) + pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound)) + if(pressure_checks&4) + pressure_delta = min(pressure_delta, (output_pressure_max - air2.return_pressure())) + + if(pressure_delta > 0) + if(environment.temperature > 0) + var/transfer_moles = pressure_delta*air2.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) + + var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) + + air2.merge(removed) + + if(network2) + network2.update = 1 + + return 1 + + //Radio remote control + +/obj/machinery/atmospherics/binary/dp_vent_pump/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA) + +/obj/machinery/atmospherics/binary/dp_vent_pump/proc/broadcast_status() + if(!radio_connection) + return 0 + + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + + signal.data = list( + "tag" = id, + "device" = "ADVP", + "power" = on, + "direction" = pump_direction?("release"):("siphon"), + "checks" = pressure_checks, + "input" = input_pressure_min, + "output" = output_pressure_max, + "external" = external_pressure_bound, + "sigtype" = "status" + ) + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + + return 1 + +/obj/machinery/atmospherics/binary/dp_vent_pump/initialize() + ..() + if(frequency) + set_frequency(frequency) + +/obj/machinery/atmospherics/binary/dp_vent_pump/receive_signal(datum/signal/signal) + + if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) + return 0 + if("power" in signal.data) + on = text2num(signal.data["power"]) + + if("power_toggle" in signal.data) + on = !on + + if("set_direction" in signal.data) + pump_direction = text2num(signal.data["set_direction"]) + + if("checks" in signal.data) + pressure_checks = text2num(signal.data["checks"]) + + if("purge" in signal.data) + pressure_checks &= ~1 + pump_direction = 0 + + if("stabalize" in signal.data) + pressure_checks |= 1 + pump_direction = 1 + + if("set_input_pressure" in signal.data) + input_pressure_min = Clamp( + text2num(signal.data["set_input_pressure"]), + 0, + ONE_ATMOSPHERE*50 + ) + + if("set_output_pressure" in signal.data) + output_pressure_max = Clamp( + text2num(signal.data["set_output_pressure"]), + 0, + ONE_ATMOSPHERE*50 + ) + + if("set_external_pressure" in signal.data) + external_pressure_bound = Clamp( + text2num(signal.data["set_external_pressure"]), + 0, + ONE_ATMOSPHERE*50 + ) + + if("status" in signal.data) spawn(2) broadcast_status() - update_icon() \ No newline at end of file + return //do not update_icon + //if(signal.data["tag"]) + spawn(2) + broadcast_status() + update_icon() diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index 9441b78e48d..3ac6219b4a4 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -1,4 +1,4 @@ -obj/machinery/atmospherics/binary/passive_gate +/obj/machinery/atmospherics/binary/passive_gate //Tries to achieve target pressure at output (like a normal pump) except // Uses no power but can not transfer gases from a low pressure area to a high pressure area icon = 'icons/obj/atmospherics/passive_gate.dmi' @@ -16,156 +16,155 @@ obj/machinery/atmospherics/binary/passive_gate var/id = null var/datum/radio_frequency/radio_connection - update_icon() - if(stat & NOPOWER) - icon_state = "intact_off" - else if(node1 && node2) - icon_state = "intact_[on?("on"):("off")]" +/obj/machinery/atmospherics/binary/passive_gate/update_icon() + if(stat & NOPOWER) + icon_state = "intact_off" + else if(node1 && node2) + icon_state = "intact_[on?("on"):("off")]" + else + if(node1) + icon_state = "exposed_1_off" + else if(node2) + icon_state = "exposed_2_off" else - if(node1) - icon_state = "exposed_1_off" - else if(node2) - icon_state = "exposed_2_off" - else - icon_state = "exposed_3_off" - return + icon_state = "exposed_3_off" + return - process() - ..() - if(!on) - return 0 +/obj/machinery/atmospherics/binary/passive_gate/process() + ..() + if(!on) + return 0 - var/output_starting_pressure = air2.return_pressure() - var/input_starting_pressure = air1.return_pressure() + var/output_starting_pressure = air2.return_pressure() + var/input_starting_pressure = air1.return_pressure() - if(output_starting_pressure >= min(target_pressure,input_starting_pressure-10)) - //No need to pump gas if target is already reached or input pressure is too low - //Need at least 10 KPa difference to overcome friction in the mechanism - return 1 + if(output_starting_pressure >= min(target_pressure,input_starting_pressure-10)) + //No need to pump gas if target is already reached or input pressure is too low + //Need at least 10 KPa difference to overcome friction in the mechanism + return 1 - //Calculate necessary moles to transfer using PV = nRT - if((air1.total_moles() > 0) && (air1.temperature>0)) - var/pressure_delta = min(target_pressure - output_starting_pressure, (input_starting_pressure - output_starting_pressure)/2) - //Can not have a pressure delta that would cause output_pressure > input_pressure + //Calculate necessary moles to transfer using PV = nRT + if((air1.total_moles() > 0) && (air1.temperature>0)) + var/pressure_delta = min(target_pressure - output_starting_pressure, (input_starting_pressure - output_starting_pressure)/2) + //Can not have a pressure delta that would cause output_pressure > input_pressure - var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) + var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) - //Actually transfer the gas - var/datum/gas_mixture/removed = air1.remove(transfer_moles) - air2.merge(removed) + //Actually transfer the gas + var/datum/gas_mixture/removed = air1.remove(transfer_moles) + air2.merge(removed) - if(network1) - network1.update = 1 + if(network1) + network1.update = 1 - if(network2) - network2.update = 1 + if(network2) + network2.update = 1 - //Radio remote control +//Radio remote control - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA) +/obj/machinery/atmospherics/binary/passive_gate/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA) - broadcast_status() - if(!radio_connection) - return 0 +/obj/machinery/atmospherics/binary/passive_gate/proc/broadcast_status() + if(!radio_connection) + return 0 - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src - signal.data = list( - "tag" = id, - "device" = "AGP", - "power" = on, - "target_output" = target_pressure, - "sigtype" = "status" - ) + signal.data = list( + "tag" = id, + "device" = "AGP", + "power" = on, + "target_output" = target_pressure, + "sigtype" = "status" + ) - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - return 1 + return 1 - interact(mob/user as mob) - var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure: - [round(target_pressure,0.1)]kPa | Change - "} +/obj/machinery/atmospherics/binary/passive_gate/interact(mob/user as mob) + var/dat = {"Power: [on?"On":"Off"]
+ Desirable output pressure: + [round(target_pressure,0.1)]kPa | Change + "} - user << browse("[src.name] control[dat]", "window=atmo_pump") - onclose(user, "atmo_pump") + user << browse("[src.name] control[dat]", "window=atmo_pump") + onclose(user, "atmo_pump") - initialize() - ..() - if(frequency) - set_frequency(frequency) +/obj/machinery/atmospherics/binary/passive_gate/initialize() + ..() + if(frequency) + set_frequency(frequency) - receive_signal(datum/signal/signal) - if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) - return 0 +/obj/machinery/atmospherics/binary/passive_gate/receive_signal(datum/signal/signal) + if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) + return 0 - if("power" in signal.data) - on = text2num(signal.data["power"]) + if("power" in signal.data) + on = text2num(signal.data["power"]) - if("power_toggle" in signal.data) - on = !on + if("power_toggle" in signal.data) + on = !on - if("set_output_pressure" in signal.data) - target_pressure = Clamp( - text2num(signal.data["set_output_pressure"]), - 0, - ONE_ATMOSPHERE*50 - ) - - if("status" in signal.data) - spawn(2) - broadcast_status() - return //do not update_icon + if("set_output_pressure" in signal.data) + target_pressure = Clamp( + text2num(signal.data["set_output_pressure"]), + 0, + ONE_ATMOSPHERE*50 + ) + if("status" in signal.data) spawn(2) broadcast_status() - update_icon() + return //do not update_icon + + spawn(2) + broadcast_status() + update_icon() + return + + + +/obj/machinery/atmospherics/binary/passive_gate/attack_hand(user as mob) + if(..()) return - - - - attack_hand(user as mob) - if(..()) - return - src.add_fingerprint(usr) - if(!src.allowed(user)) - user << "\red Access denied." - return - usr.set_machine(src) - interact(user) + src.add_fingerprint(usr) + if(!src.allowed(user)) + user << "Access denied." return + usr.set_machine(src) + interact(user) + return - Topic(href,href_list) - if(..()) return - if(href_list["power"]) - on = !on - if(href_list["set_press"]) - var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num - src.target_pressure = max(0, min(4500, new_pressure)) - usr.set_machine(src) - src.update_icon() - src.updateUsrDialog() - return +/obj/machinery/atmospherics/binary/passive_gate/Topic(href,href_list) + if(..()) return + if(href_list["power"]) + on = !on + if(href_list["set_press"]) + var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num + src.target_pressure = max(0, min(4500, new_pressure)) + usr.set_machine(src) + src.update_icon() + src.updateUsrDialog() + return - power_change() - ..() - update_icon() +/obj/machinery/atmospherics/binary/passive_gate/power_change() + ..() + update_icon() - attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - if (on) - user << "\red You cannot unwrench this [src], turn it off first." - return 1 +/obj/machinery/atmospherics/binary/passive_gate/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) return ..() + if (on) + user << "You cannot unwrench this [src], turn it off first." + return 1 + return ..() diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 025cfded082..31585038616 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -12,7 +12,7 @@ Thus, the two variables affect pump operation are set in New(): but overall network volume is also increased as this increases... */ -obj/machinery/atmospherics/binary/pump +/obj/machinery/atmospherics/binary/pump icon = 'icons/obj/atmospherics/pump.dmi' icon_state = "intact_off" @@ -28,157 +28,156 @@ obj/machinery/atmospherics/binary/pump var/id = null var/datum/radio_frequency/radio_connection - on - on = 1 - icon_state = "intact_on" +/obj/machinery/atmospherics/binary/pump/on + on = 1 + icon_state = "intact_on" - update_icon() - if(stat & NOPOWER) - icon_state = "intact_off" - else if(node1 && node2) - icon_state = "intact_[on?("on"):("off")]" +/obj/machinery/atmospherics/binary/pump/update_icon() + if(stat & NOPOWER) + icon_state = "intact_off" + else if(node1 && node2) + icon_state = "intact_[on?("on"):("off")]" + else + if(node1) + icon_state = "exposed_1_off" + else if(node2) + icon_state = "exposed_2_off" else - if(node1) - icon_state = "exposed_1_off" - else if(node2) - icon_state = "exposed_2_off" - else - icon_state = "exposed_3_off" + icon_state = "exposed_3_off" + return + +/obj/machinery/atmospherics/binary/pump/process() +// ..() + if(stat & (NOPOWER|BROKEN)) return + if(!on) + return 0 - process() -// ..() - if(stat & (NOPOWER|BROKEN)) - return - if(!on) - return 0 - - var/output_starting_pressure = air2.return_pressure() - - if( (target_pressure - output_starting_pressure) < 0.01) - //No need to pump gas if target is already reached! - return 1 - - //Calculate necessary moles to transfer using PV=nRT - if((air1.total_moles() > 0) && (air1.temperature>0)) - var/pressure_delta = target_pressure - output_starting_pressure - var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) - - //Actually transfer the gas - var/datum/gas_mixture/removed = air1.remove(transfer_moles) - air2.merge(removed) - - if(network1) - network1.update = 1 - - if(network2) - network2.update = 1 + var/output_starting_pressure = air2.return_pressure() + if( (target_pressure - output_starting_pressure) < 0.01) + //No need to pump gas if target is already reached! return 1 + //Calculate necessary moles to transfer using PV=nRT + if((air1.total_moles() > 0) && (air1.temperature>0)) + var/pressure_delta = target_pressure - output_starting_pressure + var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) + + //Actually transfer the gas + var/datum/gas_mixture/removed = air1.remove(transfer_moles) + air2.merge(removed) + + if(network1) + network1.update = 1 + + if(network2) + network2.update = 1 + + return 1 + //Radio remote control - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA) +/obj/machinery/atmospherics/binary/pump/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA) - broadcast_status() - if(!radio_connection) - return 0 +/obj/machinery/atmospherics/binary/pump/proc/broadcast_status() + if(!radio_connection) + return 0 - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src - signal.data = list( - "tag" = id, - "device" = "AGP", - "power" = on, - "target_output" = target_pressure, - "sigtype" = "status" - ) + signal.data = list( + "tag" = id, + "device" = "AGP", + "power" = on, + "target_output" = target_pressure, + "sigtype" = "status" + ) - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - return 1 + return 1 - interact(mob/user as mob) - var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure: - [round(target_pressure,0.1)]kPa | Change - "} +/obj/machinery/atmospherics/binary/pump/interact(mob/user as mob) + var/dat = {"Power: [on?"On":"Off"]
+ Desirable output pressure: + [round(target_pressure,0.1)]kPa | Change + "} - user << browse("[src.name] control[dat]", "window=atmo_pump") - onclose(user, "atmo_pump") + user << browse("[src.name] control[dat]", "window=atmo_pump") + onclose(user, "atmo_pump") - initialize() - ..() - if(frequency) - set_frequency(frequency) +/obj/machinery/atmospherics/binary/pump/initialize() + ..() + if(frequency) + set_frequency(frequency) - receive_signal(datum/signal/signal) - if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) - return 0 +/obj/machinery/atmospherics/binary/pump/receive_signal(datum/signal/signal) + if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) + return 0 - if("power" in signal.data) - on = text2num(signal.data["power"]) + if("power" in signal.data) + on = text2num(signal.data["power"]) - if("power_toggle" in signal.data) - on = !on + if("power_toggle" in signal.data) + on = !on - if("set_output_pressure" in signal.data) - target_pressure = Clamp( - text2num(signal.data["set_output_pressure"]), - 0, - ONE_ATMOSPHERE*50 - ) - - if("status" in signal.data) - spawn(2) - broadcast_status() - return //do not update_icon + if("set_output_pressure" in signal.data) + target_pressure = Clamp( + text2num(signal.data["set_output_pressure"]), + 0, + ONE_ATMOSPHERE*50 + ) + if("status" in signal.data) spawn(2) broadcast_status() - update_icon() + return //do not update_icon + + spawn(2) + broadcast_status() + update_icon() + return + + +/obj/machinery/atmospherics/binary/pump/attack_hand(user as mob) + if(..()) return - - - attack_hand(user as mob) - if(..()) - return - src.add_fingerprint(usr) - if(!src.allowed(user)) - user << "\red Access denied." - return - usr.set_machine(src) - interact(user) + src.add_fingerprint(usr) + if(!src.allowed(user)) + user << "Access denied." return + usr.set_machine(src) + interact(user) + return - Topic(href,href_list) - if(..()) return - if(href_list["power"]) - on = !on - if(href_list["set_press"]) - var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num - src.target_pressure = max(0, min(4500, new_pressure)) - usr.set_machine(src) - src.update_icon() - src.updateUsrDialog() - return +/obj/machinery/atmospherics/binary/pump/Topic(href,href_list) + if(..()) return + if(href_list["power"]) + on = !on + if(href_list["set_press"]) + var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num + src.target_pressure = max(0, min(4500, new_pressure)) + usr.set_machine(src) + src.update_icon() + src.updateUsrDialog() + return - power_change() - ..() - update_icon() +/obj/machinery/atmospherics/binary/pump/power_change() + ..() + update_icon() - attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - if (!(stat & NOPOWER) && on) - user << "\red You cannot unwrench this [src], turn it off first." - return 1 +/obj/machinery/atmospherics/binary/pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) return ..() + if (!(stat & NOPOWER) && on) + user << "You cannot unwrench this [src], turn it off first." + return 1 + return ..() diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index 049c3360362..b893e822b92 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -12,7 +12,7 @@ Thus, the two variables affect pump operation are set in New(): but overall network volume is also increased as this increases... */ -obj/machinery/atmospherics/binary/volume_pump +/obj/machinery/atmospherics/binary/volume_pump icon = 'icons/obj/atmospherics/volume_pump.dmi' icon_state = "intact_off" @@ -28,155 +28,154 @@ obj/machinery/atmospherics/binary/volume_pump var/id = null var/datum/radio_frequency/radio_connection - on - on = 1 - icon_state = "intact_on" +/obj/machinery/atmospherics/binary/volume_pump/on + on = 1 + icon_state = "intact_on" - update_icon() - if(stat & NOPOWER) - icon_state = "intact_off" - else if(node1 && node2) - icon_state = "intact_[on?("on"):("off")]" +/obj/machinery/atmospherics/binary/volume_pump/update_icon() + if(stat & NOPOWER) + icon_state = "intact_off" + else if(node1 && node2) + icon_state = "intact_[on?("on"):("off")]" + else + if(node1) + icon_state = "exposed_1_off" + else if(node2) + icon_state = "exposed_2_off" else - if(node1) - icon_state = "exposed_1_off" - else if(node2) - icon_state = "exposed_2_off" - else - icon_state = "exposed_3_off" - return + icon_state = "exposed_3_off" + return - process() -// ..() - if(stat & (NOPOWER|BROKEN)) - return - if(!on) - return 0 +/obj/machinery/atmospherics/binary/volume_pump/process() +// ..() + if(stat & (NOPOWER|BROKEN)) + return + if(!on) + return 0 // Pump mechanism just won't do anything if the pressure is too high/too low - var/input_starting_pressure = air1.return_pressure() - var/output_starting_pressure = air2.return_pressure() - - if((input_starting_pressure < 0.01) || (output_starting_pressure > 9000)) - return 1 - - var/transfer_ratio = max(1, transfer_rate/air1.volume) - - var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio) - - air2.merge(removed) - - if(network1) - network1.update = 1 - - if(network2) - network2.update = 1 + var/input_starting_pressure = air1.return_pressure() + var/output_starting_pressure = air2.return_pressure() + if((input_starting_pressure < 0.01) || (output_starting_pressure > 9000)) return 1 - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency) + var/transfer_ratio = max(1, transfer_rate/air1.volume) - broadcast_status() - if(!radio_connection) - return 0 + var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio) - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src + air2.merge(removed) - signal.data = list( - "tag" = id, - "device" = "APV", - "power" = on, - "transfer_rate" = transfer_rate, - "sigtype" = "status" - ) - radio_connection.post_signal(src, signal) + if(network1) + network1.update = 1 - return 1 + if(network2) + network2.update = 1 - interact(mob/user as mob) - var/dat = {"Power: [on?"On":"Off"]
- Desirable output flow: - [round(transfer_rate,1)]l/s | Change - "} + return 1 - user << browse("[src.name] control[dat]", "window=atmo_pump") - onclose(user, "atmo_pump") +/obj/machinery/atmospherics/binary/volume_pump/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency) + +/obj/machinery/atmospherics/binary/volume_pump/proc/broadcast_status() + if(!radio_connection) + return 0 + + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + + signal.data = list( + "tag" = id, + "device" = "APV", + "power" = on, + "transfer_rate" = transfer_rate, + "sigtype" = "status" + ) + radio_connection.post_signal(src, signal) + + return 1 + +/obj/machinery/atmospherics/binary/volume_pump/interact(mob/user as mob) + var/dat = {"Power: [on?"On":"Off"]
+ Desirable output flow: + [round(transfer_rate,1)]l/s | Change + "} + + user << browse("[src.name] control[dat]", "window=atmo_pump") + onclose(user, "atmo_pump") - initialize() - ..() +/obj/machinery/atmospherics/binary/volume_pump/initialize() + ..() - set_frequency(frequency) + set_frequency(frequency) - receive_signal(datum/signal/signal) - if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) - return 0 +/obj/machinery/atmospherics/binary/volume_pump/receive_signal(datum/signal/signal) + if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) + return 0 - if("power" in signal.data) - on = text2num(signal.data["power"]) + if("power" in signal.data) + on = text2num(signal.data["power"]) - if("power_toggle" in signal.data) - on = !on + if("power_toggle" in signal.data) + on = !on - if("set_transfer_rate" in signal.data) - transfer_rate = Clamp( - text2num(signal.data["set_transfer_rate"]), - 0, - air1.volume - ) - - if("status" in signal.data) - spawn(2) - broadcast_status() - return //do not update_icon + if("set_transfer_rate" in signal.data) + transfer_rate = Clamp( + text2num(signal.data["set_transfer_rate"]), + 0, + air1.volume + ) + if("status" in signal.data) spawn(2) broadcast_status() - update_icon() + return //do not update_icon + + spawn(2) + broadcast_status() + update_icon() - attack_hand(user as mob) - if(..()) - return - src.add_fingerprint(usr) - if(!src.allowed(user)) - user << "\red Access denied." - return - usr.set_machine(src) - interact(user) +/obj/machinery/atmospherics/binary/volume_pump/attack_hand(user as mob) + if(..()) return - - Topic(href,href_list) - if(..()) return - if(href_list["power"]) - on = !on - if(href_list["set_transfer_rate"]) - var/new_transfer_rate = input(usr,"Enter new output volume (0-200l/s)","Flow control",src.transfer_rate) as num - src.transfer_rate = max(0, min(200, new_transfer_rate)) - usr.set_machine(src) - src.update_icon() - src.updateUsrDialog() + src.add_fingerprint(usr) + if(!src.allowed(user)) + user << "Access denied." return + usr.set_machine(src) + interact(user) + return - power_change() - ..() - update_icon() +/obj/machinery/atmospherics/binary/volume_pump/Topic(href,href_list) + if(..()) return + if(href_list["power"]) + on = !on + if(href_list["set_transfer_rate"]) + var/new_transfer_rate = input(usr,"Enter new output volume (0-200l/s)","Flow control",src.transfer_rate) as num + src.transfer_rate = max(0, min(200, new_transfer_rate)) + usr.set_machine(src) + src.update_icon() + src.updateUsrDialog() + return + +/obj/machinery/atmospherics/binary/volume_pump/power_change() + ..() + update_icon() - attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - if (!(stat & NOPOWER) && on) - user << "\red You cannot unwrench this [src], turn it off first." - return 1 +/obj/machinery/atmospherics/binary/volume_pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) return ..() + if (!(stat & NOPOWER) && on) + user << "You cannot unwrench this [src], turn it off first." + return 1 + return ..() diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm index 545163c9cf4..4a6aee54ead 100644 --- a/code/ATMOSPHERICS/components/portables_connector.dm +++ b/code/ATMOSPHERICS/components/portables_connector.dm @@ -21,117 +21,117 @@ level = 0 - New() - initialize_directions = dir - ..() +/obj/machinery/atmospherics/portables_connector/New() + initialize_directions = dir + ..() - update_icon() - if(node) - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]intact" - dir = get_dir(src, node) - else - icon_state = "exposed" +/obj/machinery/atmospherics/portables_connector/update_icon() + if(node) + icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]intact" + dir = get_dir(src, node) + else + icon_state = "exposed" + return + +/obj/machinery/atmospherics/portables_connector/hide(var/i) //to make the little pipe section invisible, the icon changes. + if(node) + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]intact" + dir = get_dir(src, node) + else + icon_state = "exposed" + +/obj/machinery/atmospherics/portables_connector/process() + ..() + if(!on) return - - hide(var/i) //to make the little pipe section invisible, the icon changes. - if(node) - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]intact" - dir = get_dir(src, node) - else - icon_state = "exposed" - - process() - ..() - if(!on) - return - if(!connected_device) - on = 0 - return - if(network) - network.update = 1 - return 1 + if(!connected_device) + on = 0 + return + if(network) + network.update = 1 + return 1 // Housekeeping and pipe network stuff below - network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - if(reference == node) - network = new_network +/obj/machinery/atmospherics/portables_connector/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) + if(reference == node) + network = new_network - if(new_network.normal_members.Find(src)) - return 0 + if(new_network.normal_members.Find(src)) + return 0 - new_network.normal_members += src + new_network.normal_members += src - return null + return null - Destroy() - if(connected_device) - connected_device.disconnect() +/obj/machinery/atmospherics/portables_connector/Destroy() + if(connected_device) + connected_device.disconnect() - if(node) - node.disconnect(src) - del(network) + if(node) + node.disconnect(src) + del(network) + node = null + + ..() + +/obj/machinery/atmospherics/portables_connector/initialize() + src.disconnect(src) + + var/node_connect = dir + + for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) + if(target.initialize_directions & get_dir(target,src)) + node = target + break + + update_icon() + +/obj/machinery/atmospherics/portables_connector/build_network() + if(!network && node) + network = new /datum/pipe_network() + network.normal_members += src + network.build_network(node, src) + + +/obj/machinery/atmospherics/portables_connector/return_network(obj/machinery/atmospherics/reference) + build_network() + + if(reference==node) + return network + + if(reference==connected_device) + return network + + return null + +/obj/machinery/atmospherics/portables_connector/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) + if(network == old_network) + network = new_network + + return 1 + +/obj/machinery/atmospherics/portables_connector/return_network_air(datum/pipe_network/reference) + var/list/results = list() + + if(connected_device) + results += connected_device.air_contents + + return results + +/obj/machinery/atmospherics/portables_connector/disconnect(obj/machinery/atmospherics/reference) + if(reference==node) + del(network) node = null - ..() - - initialize() - src.disconnect(src) - - var/node_connect = dir - - for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) - if(target.initialize_directions & get_dir(target,src)) - node = target - break - - update_icon() - - build_network() - if(!network && node) - network = new /datum/pipe_network() - network.normal_members += src - network.build_network(node, src) + return null - return_network(obj/machinery/atmospherics/reference) - build_network() - - if(reference==node) - return network - - if(reference==connected_device) - return network - - return null - - reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) - if(network == old_network) - network = new_network - +/obj/machinery/atmospherics/portables_connector/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + if (connected_device) + user << "You cannot unwrench this [src], dettach [connected_device] first." return 1 - - return_network_air(datum/pipe_network/reference) - var/list/results = list() - - if(connected_device) - results += connected_device.air_contents - - return results - - disconnect(obj/machinery/atmospherics/reference) - if(reference==node) - del(network) - node = null - - return null - - - attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - if (connected_device) - user << "\red You cannot unwrench this [src], dettach [connected_device] first." - return 1 - return ..() \ No newline at end of file + return ..() diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index 34757072946..83b478442b8 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -1,4 +1,4 @@ -obj/machinery/atmospherics/trinary/filter +/obj/machinery/atmospherics/trinary/filter icon = 'icons/obj/atmospherics/filter.dmi' icon_state = "intact_off" density = 1 @@ -28,122 +28,121 @@ Filter types: var/frequency = 0 var/datum/radio_frequency/radio_connection - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) +/obj/machinery/atmospherics/trinary/filter/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) - New() - ..() - if(radio_controller) - initialize() +/obj/machinery/atmospherics/trinary/filter/New() + ..() + if(radio_controller) + initialize() - update_icon() - if(stat & NOPOWER) - icon_state = "intact_off" - else if(node2 && node3 && node1) - icon_state = "intact_[on?("on"):("off")]" - else - icon_state = "intact_off" - on = 0 +/obj/machinery/atmospherics/trinary/filter/update_icon() + if(stat & NOPOWER) + icon_state = "intact_off" + else if(node2 && node3 && node1) + icon_state = "intact_[on?("on"):("off")]" + else + icon_state = "intact_off" + on = 0 - return + return - power_change() - var/old_stat = stat - ..() - if(old_stat != stat) - update_icon() +/obj/machinery/atmospherics/trinary/filter/power_change() + var/old_stat = stat + ..() + if(old_stat != stat) + update_icon() - process() - ..() - if(!on) - return 0 +/obj/machinery/atmospherics/trinary/filter/process() + ..() + if(!on) + return 0 - var/output_starting_pressure = air3.return_pressure() - - if(output_starting_pressure >= target_pressure) - //No need to mix if target is already full! - return 1 - - //Calculate necessary moles to transfer using PV=nRT - - var/pressure_delta = target_pressure - output_starting_pressure - var/transfer_moles - - if(air1.temperature > 0) - transfer_moles = pressure_delta*air3.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) - - //Actually transfer the gas - - if(transfer_moles > 0) - var/datum/gas_mixture/removed = air1.remove(transfer_moles) - - if(!removed) - return - var/datum/gas_mixture/filtered_out = new - filtered_out.temperature = removed.temperature - - switch(filter_type) - if(0) //removing plasma - filtered_out.toxins = removed.toxins - removed.toxins = 0 - - if(removed.trace_gases.len>0) - for(var/datum/gas/trace_gas in removed.trace_gases) - if(istype(trace_gas, /datum/gas/oxygen_agent_b)) - removed.trace_gases -= trace_gas - filtered_out.trace_gases += trace_gas - - if(1) //removing O2 - filtered_out.oxygen = removed.oxygen - removed.oxygen = 0 - - if(2) //removing N2 - filtered_out.nitrogen = removed.nitrogen - removed.nitrogen = 0 - - if(3) //removing CO2 - filtered_out.carbon_dioxide = removed.carbon_dioxide - removed.carbon_dioxide = 0 - - if(4)//removing N2O - if(removed.trace_gases.len>0) - for(var/datum/gas/trace_gas in removed.trace_gases) - if(istype(trace_gas, /datum/gas/sleeping_agent)) - removed.trace_gases -= trace_gas - filtered_out.trace_gases += trace_gas - - else - filtered_out = null - - - air2.merge(filtered_out) - air3.merge(removed) - - if(network2) - network2.update = 1 - - if(network3) - network3.update = 1 - - if(network1) - network1.update = 1 + var/output_starting_pressure = air3.return_pressure() + if(output_starting_pressure >= target_pressure) + //No need to mix if target is already full! return 1 - initialize() - set_frequency(frequency) - return ..() + //Calculate necessary moles to transfer using PV=nRT -obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob) + var/pressure_delta = target_pressure - output_starting_pressure + var/transfer_moles + + if(air1.temperature > 0) + transfer_moles = pressure_delta*air3.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) + + //Actually transfer the gas + + if(transfer_moles > 0) + var/datum/gas_mixture/removed = air1.remove(transfer_moles) + + if(!removed) + return + var/datum/gas_mixture/filtered_out = new + filtered_out.temperature = removed.temperature + + switch(filter_type) + if(0) //removing plasma + filtered_out.toxins = removed.toxins + removed.toxins = 0 + + if(removed.trace_gases.len>0) + for(var/datum/gas/trace_gas in removed.trace_gases) + if(istype(trace_gas, /datum/gas/oxygen_agent_b)) + removed.trace_gases -= trace_gas + filtered_out.trace_gases += trace_gas + + if(1) //removing O2 + filtered_out.oxygen = removed.oxygen + removed.oxygen = 0 + + if(2) //removing N2 + filtered_out.nitrogen = removed.nitrogen + removed.nitrogen = 0 + + if(3) //removing CO2 + filtered_out.carbon_dioxide = removed.carbon_dioxide + removed.carbon_dioxide = 0 + + if(4)//removing N2O + if(removed.trace_gases.len>0) + for(var/datum/gas/trace_gas in removed.trace_gases) + if(istype(trace_gas, /datum/gas/sleeping_agent)) + removed.trace_gases -= trace_gas + filtered_out.trace_gases += trace_gas + + else + filtered_out = null + + + air2.merge(filtered_out) + air3.merge(removed) + + if(network2) + network2.update = 1 + + if(network3) + network3.update = 1 + + if(network1) + network1.update = 1 + + return 1 + +/obj/machinery/atmospherics/trinary/filter/initialize() + set_frequency(frequency) + return ..() + +/obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob) if(..()) return if(!src.allowed(user)) - user << "\red Access denied." + user << "Access denied." return var/dat @@ -191,7 +190,7 @@ obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob) onclose(user, "atmo_filter") return -obj/machinery/atmospherics/trinary/filter/Topic(href, href_list) +/obj/machinery/atmospherics/trinary/filter/Topic(href, href_list) if(..()) return usr.set_machine(src) diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index 279d736f0ff..260348b7eac 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -1,4 +1,4 @@ -obj/machinery/atmospherics/trinary/mixer +/obj/machinery/atmospherics/trinary/mixer icon = 'icons/obj/atmospherics/mixer.dmi' icon_state = "intact_off" density = 1 @@ -17,132 +17,132 @@ obj/machinery/atmospherics/trinary/mixer //node 3 is the outlet, nodes 1 & 2 are intakes - update_icon() - if(stat & NOPOWER) - icon_state = "intact_off" - else if(node2 && node3 && node1) - icon_state = "intact_[on?("on"):("off")]" - else - icon_state = "intact_off" - on = 0 +/obj/machinery/atmospherics/trinary/mixer/update_icon() + if(stat & NOPOWER) + icon_state = "intact_off" + else if(node2 && node3 && node1) + icon_state = "intact_[on?("on"):("off")]" + else + icon_state = "intact_off" + on = 0 - return + return - power_change() - var/old_stat = stat - ..() - if(old_stat != stat) - update_icon() +/obj/machinery/atmospherics/trinary/mixer/power_change() + var/old_stat = stat + ..() + if(old_stat != stat) + update_icon() - New() - ..() - air3.volume = 300 +/obj/machinery/atmospherics/trinary/mixer/New() + ..() + air3.volume = 300 - process() - ..() - if(!on) - return 0 +/obj/machinery/atmospherics/trinary/mixer/process() + ..() + if(!on) + return 0 - var/output_starting_pressure = air3.return_pressure() - - if(output_starting_pressure >= target_pressure) - //No need to mix if target is already full! - return 1 - - //Calculate necessary moles to transfer using PV=nRT - - var/pressure_delta = target_pressure - output_starting_pressure - var/transfer_moles1 = 0 - var/transfer_moles2 = 0 - - if(air1.temperature > 0) - transfer_moles1 = (node1_concentration*pressure_delta)*air3.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) - - if(air2.temperature > 0) - transfer_moles2 = (node2_concentration*pressure_delta)*air3.volume/(air2.temperature * R_IDEAL_GAS_EQUATION) - - var/air1_moles = air1.total_moles() - var/air2_moles = air2.total_moles() - - if((air1_moles < transfer_moles1) || (air2_moles < transfer_moles2)) - var/ratio = 0 - if (( transfer_moles1 > 0 ) && (transfer_moles2 >0 )) - ratio = min(air1_moles/transfer_moles1, air2_moles/transfer_moles2) - if (( transfer_moles2 == 0 ) && ( transfer_moles1 > 0 )) - ratio = air1_moles/transfer_moles1 - if (( transfer_moles1 == 0 ) && ( transfer_moles2 > 0 )) - ratio = air2_moles/transfer_moles2 - - transfer_moles1 *= ratio - transfer_moles2 *= ratio - - //Actually transfer the gas - - if(transfer_moles1 > 0) - var/datum/gas_mixture/removed1 = air1.remove(transfer_moles1) - air3.merge(removed1) - - if(transfer_moles2 > 0) - var/datum/gas_mixture/removed2 = air2.remove(transfer_moles2) - air3.merge(removed2) - - if(network1 && transfer_moles1) - network1.update = 1 - - if(network2 && transfer_moles2) - network2.update = 1 - - if(network3) - network3.update = 1 + var/output_starting_pressure = air3.return_pressure() + if(output_starting_pressure >= target_pressure) + //No need to mix if target is already full! return 1 - attack_hand(user as mob) - if(..()) - return - src.add_fingerprint(usr) - if(!src.allowed(user)) - user << "\red Access denied." - return - usr.set_machine(src) - var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure: - [target_pressure]kPa | Change -
- Node 1 Concentration: - - - - - [node1_concentration]([node1_concentration*100]%) - + - + -
- Node 2 Concentration: - - - - - [node2_concentration]([node2_concentration*100]%) - + - + - "} + //Calculate necessary moles to transfer using PV=nRT - user << browse("[src.name] control[dat]", "window=atmo_mixer") - onclose(user, "atmo_mixer") - return + var/pressure_delta = target_pressure - output_starting_pressure + var/transfer_moles1 = 0 + var/transfer_moles2 = 0 - Topic(href,href_list) - if(..()) return - if(href_list["power"]) - on = !on - if(href_list["set_press"]) - var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num - src.target_pressure = max(0, min(4500, new_pressure)) - if(href_list["node1_c"]) - var/value = text2num(href_list["node1_c"]) - src.node1_concentration = max(0, min(1, src.node1_concentration + value)) - src.node2_concentration = max(0, min(1, src.node2_concentration - value)) - if(href_list["node2_c"]) - var/value = text2num(href_list["node2_c"]) - src.node2_concentration = max(0, min(1, src.node2_concentration + value)) - src.node1_concentration = max(0, min(1, src.node1_concentration - value)) - src.update_icon() - src.updateUsrDialog() + if(air1.temperature > 0) + transfer_moles1 = (node1_concentration*pressure_delta)*air3.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) + + if(air2.temperature > 0) + transfer_moles2 = (node2_concentration*pressure_delta)*air3.volume/(air2.temperature * R_IDEAL_GAS_EQUATION) + + var/air1_moles = air1.total_moles() + var/air2_moles = air2.total_moles() + + if((air1_moles < transfer_moles1) || (air2_moles < transfer_moles2)) + var/ratio = 0 + if (( transfer_moles1 > 0 ) && (transfer_moles2 >0 )) + ratio = min(air1_moles/transfer_moles1, air2_moles/transfer_moles2) + if (( transfer_moles2 == 0 ) && ( transfer_moles1 > 0 )) + ratio = air1_moles/transfer_moles1 + if (( transfer_moles1 == 0 ) && ( transfer_moles2 > 0 )) + ratio = air2_moles/transfer_moles2 + + transfer_moles1 *= ratio + transfer_moles2 *= ratio + + //Actually transfer the gas + + if(transfer_moles1 > 0) + var/datum/gas_mixture/removed1 = air1.remove(transfer_moles1) + air3.merge(removed1) + + if(transfer_moles2 > 0) + var/datum/gas_mixture/removed2 = air2.remove(transfer_moles2) + air3.merge(removed2) + + if(network1 && transfer_moles1) + network1.update = 1 + + if(network2 && transfer_moles2) + network2.update = 1 + + if(network3) + network3.update = 1 + + return 1 + +/obj/machinery/atmospherics/trinary/mixer/attack_hand(user as mob) + if(..()) return + src.add_fingerprint(usr) + if(!src.allowed(user)) + user << "Access denied." + return + usr.set_machine(src) + var/dat = {"Power: [on?"On":"Off"]
+ Desirable output pressure: + [target_pressure]kPa | Change +
+ Node 1 Concentration: + - + - + [node1_concentration]([node1_concentration*100]%) + + + + +
+ Node 2 Concentration: + - + - + [node2_concentration]([node2_concentration*100]%) + + + + + "} + + user << browse("[src.name] control[dat]", "window=atmo_mixer") + onclose(user, "atmo_mixer") + return + +/obj/machinery/atmospherics/trinary/mixer/Topic(href,href_list) + if(..()) return + if(href_list["power"]) + on = !on + if(href_list["set_press"]) + var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num + src.target_pressure = max(0, min(4500, new_pressure)) + if(href_list["node1_c"]) + var/value = text2num(href_list["node1_c"]) + src.node1_concentration = max(0, min(1, src.node1_concentration + value)) + src.node2_concentration = max(0, min(1, src.node2_concentration - value)) + if(href_list["node2_c"]) + var/value = text2num(href_list["node2_c"]) + src.node2_concentration = max(0, min(1, src.node2_concentration + value)) + src.node1_concentration = max(0, min(1, src.node1_concentration - value)) + src.update_icon() + src.updateUsrDialog() + return diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index 79af6de5272..deb86fb9f8e 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -1,4 +1,4 @@ -obj/machinery/atmospherics/trinary +/obj/machinery/atmospherics/trinary dir = SOUTH initialize_directions = SOUTH|NORTH|WEST use_power = 1 @@ -15,148 +15,148 @@ obj/machinery/atmospherics/trinary var/datum/pipe_network/network2 var/datum/pipe_network/network3 - New() - ..() - switch(dir) - if(NORTH) - initialize_directions = EAST|NORTH|SOUTH - if(SOUTH) - initialize_directions = SOUTH|WEST|NORTH - if(EAST) - initialize_directions = EAST|WEST|SOUTH - if(WEST) - initialize_directions = WEST|NORTH|EAST - air1 = new - air2 = new - air3 = new +/obj/machinery/atmospherics/trinary/New() + ..() + switch(dir) + if(NORTH) + initialize_directions = EAST|NORTH|SOUTH + if(SOUTH) + initialize_directions = SOUTH|WEST|NORTH + if(EAST) + initialize_directions = EAST|WEST|SOUTH + if(WEST) + initialize_directions = WEST|NORTH|EAST + air1 = new + air2 = new + air3 = new - air1.volume = 200 - air2.volume = 200 - air3.volume = 200 + air1.volume = 200 + air2.volume = 200 + air3.volume = 200 // Housekeeping and pipe network stuff below - network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - if(reference == node1) - network1 = new_network +/obj/machinery/atmospherics/trinary/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) + if(reference == node1) + network1 = new_network - else if(reference == node2) - network2 = new_network + else if(reference == node2) + network2 = new_network - else if (reference == node3) - network3 = new_network + else if (reference == node3) + network3 = new_network - if(new_network.normal_members.Find(src)) - return 0 + if(new_network.normal_members.Find(src)) + return 0 - new_network.normal_members += src + new_network.normal_members += src - return null + return null - Destroy() - if(node1) - node1.disconnect(src) - del(network1) - if(node2) - node2.disconnect(src) - del(network2) - if(node3) - node3.disconnect(src) - del(network3) +/obj/machinery/atmospherics/trinary/Destroy() + if(node1) + node1.disconnect(src) + del(network1) + if(node2) + node2.disconnect(src) + del(network2) + if(node3) + node3.disconnect(src) + del(network3) + node1 = null + node2 = null + node3 = null + + ..() + +/obj/machinery/atmospherics/trinary/initialize() + src.disconnect(src) + + var/node1_connect = turn(dir, -180) + var/node2_connect = turn(dir, -90) + var/node3_connect = dir + + for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect)) + if(target.initialize_directions & get_dir(target,src)) + node1 = target + break + + for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect)) + if(target.initialize_directions & get_dir(target,src)) + node2 = target + break + + for(var/obj/machinery/atmospherics/target in get_step(src,node3_connect)) + if(target.initialize_directions & get_dir(target,src)) + node3 = target + break + + update_icon() + +/obj/machinery/atmospherics/trinary/build_network() + if(!network1 && node1) + network1 = new /datum/pipe_network() + network1.normal_members += src + network1.build_network(node1, src) + + if(!network2 && node2) + network2 = new /datum/pipe_network() + network2.normal_members += src + network2.build_network(node2, src) + + if(!network3 && node3) + network3 = new /datum/pipe_network() + network3.normal_members += src + network3.build_network(node3, src) + + +/obj/machinery/atmospherics/trinary/return_network(obj/machinery/atmospherics/reference) + build_network() + + if(reference==node1) + return network1 + + if(reference==node2) + return network2 + + if(reference==node3) + return network3 + + return null + +/obj/machinery/atmospherics/trinary/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) + if(network1 == old_network) + network1 = new_network + if(network2 == old_network) + network2 = new_network + if(network3 == old_network) + network3 = new_network + + return 1 + +/obj/machinery/atmospherics/trinary/return_network_air(datum/pipe_network/reference) + var/list/results = list() + + if(network1 == reference) + results += air1 + if(network2 == reference) + results += air2 + if(network3 == reference) + results += air3 + + return results + +/obj/machinery/atmospherics/trinary/disconnect(obj/machinery/atmospherics/reference) + if(reference==node1) + del(network1) node1 = null + + else if(reference==node2) + del(network2) node2 = null + + else if(reference==node3) + del(network3) node3 = null - ..() - - initialize() - src.disconnect(src) - - var/node1_connect = turn(dir, -180) - var/node2_connect = turn(dir, -90) - var/node3_connect = dir - - for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect)) - if(target.initialize_directions & get_dir(target,src)) - node1 = target - break - - for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect)) - if(target.initialize_directions & get_dir(target,src)) - node2 = target - break - - for(var/obj/machinery/atmospherics/target in get_step(src,node3_connect)) - if(target.initialize_directions & get_dir(target,src)) - node3 = target - break - - update_icon() - - build_network() - if(!network1 && node1) - network1 = new /datum/pipe_network() - network1.normal_members += src - network1.build_network(node1, src) - - if(!network2 && node2) - network2 = new /datum/pipe_network() - network2.normal_members += src - network2.build_network(node2, src) - - if(!network3 && node3) - network3 = new /datum/pipe_network() - network3.normal_members += src - network3.build_network(node3, src) - - - return_network(obj/machinery/atmospherics/reference) - build_network() - - if(reference==node1) - return network1 - - if(reference==node2) - return network2 - - if(reference==node3) - return network3 - - return null - - reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) - if(network1 == old_network) - network1 = new_network - if(network2 == old_network) - network2 = new_network - if(network3 == old_network) - network3 = new_network - - return 1 - - return_network_air(datum/pipe_network/reference) - var/list/results = list() - - if(network1 == reference) - results += air1 - if(network2 == reference) - results += air2 - if(network3 == reference) - results += air3 - - return results - - disconnect(obj/machinery/atmospherics/reference) - if(reference==node1) - del(network1) - node1 = null - - else if(reference==node2) - del(network2) - node2 = null - - else if(reference==node3) - del(network3) - node3 = null - - return null \ No newline at end of file + return null diff --git a/code/ATMOSPHERICS/components/unary/cold_sink.dm b/code/ATMOSPHERICS/components/unary/cold_sink.dm index b3632c84a16..ea66aa52d4f 100644 --- a/code/ATMOSPHERICS/components/unary/cold_sink.dm +++ b/code/ATMOSPHERICS/components/unary/cold_sink.dm @@ -12,30 +12,30 @@ var/current_temperature = T20C var/current_heat_capacity = 50000 //totally random - update_icon() - if(node) - icon_state = "intact_[on?("on"):("off")]" - else - icon_state = "exposed" +/obj/machinery/atmospherics/unary/cold_sink/update_icon() + if(node) + icon_state = "intact_[on?("on"):("off")]" + else + icon_state = "exposed" - on = 0 + on = 0 - return + return - process() - ..() - if(!on || !network) - return 0 - var/air_heat_capacity = air_contents.heat_capacity() - var/combined_heat_capacity = current_heat_capacity + air_heat_capacity - var/old_temperature = air_contents.temperature +/obj/machinery/atmospherics/unary/cold_sink/process() + ..() + if(!on || !network) + return 0 + var/air_heat_capacity = air_contents.heat_capacity() + var/combined_heat_capacity = current_heat_capacity + air_heat_capacity + var/old_temperature = air_contents.temperature - if(combined_heat_capacity > 0) - var/combined_energy = current_temperature*current_heat_capacity + air_heat_capacity*air_contents.temperature - air_contents.temperature = combined_energy/combined_heat_capacity + if(combined_heat_capacity > 0) + var/combined_energy = current_temperature*current_heat_capacity + air_heat_capacity*air_contents.temperature + air_contents.temperature = combined_energy/combined_heat_capacity - //todo: have current temperature affected. require power to bring down current temperature again + //todo: have current temperature affected. require power to bring down current temperature again - if(abs(old_temperature-air_contents.temperature) > 1) - network.update = 1 - return 1 \ No newline at end of file + if(abs(old_temperature-air_contents.temperature) > 1) + network.update = 1 + return 1 diff --git a/code/ATMOSPHERICS/components/unary/generator_input.dm b/code/ATMOSPHERICS/components/unary/generator_input.dm index 97714f1f6e3..8aa828e1174 100644 --- a/code/ATMOSPHERICS/components/unary/generator_input.dm +++ b/code/ATMOSPHERICS/components/unary/generator_input.dm @@ -8,14 +8,13 @@ var/update_cycle - update_icon() - if(node) - icon_state = "intact" - else - icon_state = "exposed" +/obj/machinery/atmospherics/unary/generator_input/update_icon() + if(node) + icon_state = "intact" + else + icon_state = "exposed" - return + return - proc - return_exchange_air() - return air_contents \ No newline at end of file +/obj/machinery/atmospherics/unary/generator_input/proc/return_exchange_air() + return air_contents diff --git a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm index 017afeaf7e9..41b0ad9619c 100644 --- a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm +++ b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm @@ -12,57 +12,57 @@ var/obj/machinery/atmospherics/unary/heat_exchanger/partner = null var/update_cycle - update_icon() - if(node) - icon_state = "intact" - else - icon_state = "exposed" +/obj/machinery/atmospherics/unary/heat_exchanger/update_icon() + if(node) + icon_state = "intact" + else + icon_state = "exposed" - return + return - initialize() - if(!partner) - var/partner_connect = turn(dir,180) +/obj/machinery/atmospherics/unary/heat_exchanger/initialize() + if(!partner) + var/partner_connect = turn(dir,180) - for(var/obj/machinery/atmospherics/unary/heat_exchanger/target in get_step(src,partner_connect)) - if(target.dir & get_dir(src,target)) - partner = target - partner.partner = src - break + for(var/obj/machinery/atmospherics/unary/heat_exchanger/target in get_step(src,partner_connect)) + if(target.dir & get_dir(src,target)) + partner = target + partner.partner = src + break - ..() + ..() - process() - ..() - if(!partner) - return 0 +/obj/machinery/atmospherics/unary/heat_exchanger/process() + ..() + if(!partner) + return 0 - if(!air_master || air_master.current_cycle <= update_cycle) - return 0 + if(!air_master || air_master.current_cycle <= update_cycle) + return 0 - update_cycle = air_master.current_cycle - partner.update_cycle = air_master.current_cycle + update_cycle = air_master.current_cycle + partner.update_cycle = air_master.current_cycle - var/air_heat_capacity = air_contents.heat_capacity() - var/other_air_heat_capacity = partner.air_contents.heat_capacity() - var/combined_heat_capacity = other_air_heat_capacity + air_heat_capacity + var/air_heat_capacity = air_contents.heat_capacity() + var/other_air_heat_capacity = partner.air_contents.heat_capacity() + var/combined_heat_capacity = other_air_heat_capacity + air_heat_capacity - var/old_temperature = air_contents.temperature - var/other_old_temperature = partner.air_contents.temperature + var/old_temperature = air_contents.temperature + var/other_old_temperature = partner.air_contents.temperature - if(combined_heat_capacity > 0) - var/combined_energy = partner.air_contents.temperature*other_air_heat_capacity + air_heat_capacity*air_contents.temperature + if(combined_heat_capacity > 0) + var/combined_energy = partner.air_contents.temperature*other_air_heat_capacity + air_heat_capacity*air_contents.temperature - var/new_temperature = combined_energy/combined_heat_capacity - air_contents.temperature = new_temperature - partner.air_contents.temperature = new_temperature + var/new_temperature = combined_energy/combined_heat_capacity + air_contents.temperature = new_temperature + partner.air_contents.temperature = new_temperature - if(network) - if(abs(old_temperature-air_contents.temperature) > 1) - network.update = 1 + if(network) + if(abs(old_temperature-air_contents.temperature) > 1) + network.update = 1 - if(partner.network) - if(abs(other_old_temperature-partner.air_contents.temperature) > 1) - partner.network.update = 1 + if(partner.network) + if(abs(other_old_temperature-partner.air_contents.temperature) > 1) + partner.network.update = 1 - return 1 + return 1 diff --git a/code/ATMOSPHERICS/components/unary/heat_source.dm b/code/ATMOSPHERICS/components/unary/heat_source.dm index a19503b7b61..062bbd71110 100644 --- a/code/ATMOSPHERICS/components/unary/heat_source.dm +++ b/code/ATMOSPHERICS/components/unary/heat_source.dm @@ -14,30 +14,30 @@ var/current_temperature = T20C var/current_heat_capacity = 50000 //totally random - update_icon() - if(node) - icon_state = "intact_[on?("on"):("off")]" - else - icon_state = "exposed" +/obj/machinery/atmospherics/unary/heat_reservoir/update_icon() + if(node) + icon_state = "intact_[on?("on"):("off")]" + else + icon_state = "exposed" - on = 0 + on = 0 - return + return - process() - ..() - if(!on) - return 0 - var/air_heat_capacity = air_contents.heat_capacity() - var/combined_heat_capacity = current_heat_capacity + air_heat_capacity - var/old_temperature = air_contents.temperature +/obj/machinery/atmospherics/unary/heat_reservoir/process() + ..() + if(!on) + return 0 + var/air_heat_capacity = air_contents.heat_capacity() + var/combined_heat_capacity = current_heat_capacity + air_heat_capacity + var/old_temperature = air_contents.temperature - if(combined_heat_capacity > 0) - var/combined_energy = current_temperature*current_heat_capacity + air_heat_capacity*air_contents.temperature - air_contents.temperature = combined_energy/combined_heat_capacity + if(combined_heat_capacity > 0) + var/combined_energy = current_temperature*current_heat_capacity + air_heat_capacity*air_contents.temperature + air_contents.temperature = combined_energy/combined_heat_capacity - //todo: have current temperature affected. require power to bring up current temperature again + //todo: have current temperature affected. require power to bring up current temperature again - if(abs(old_temperature-air_contents.temperature) > 1) - network.update = 1 - return 1 \ No newline at end of file + if(abs(old_temperature-air_contents.temperature) > 1) + network.update = 1 + return 1 diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm index 3a668a1dd0b..17d62269f5c 100644 --- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm @@ -3,7 +3,7 @@ icon_state = "off" use_power = 1 - name = "air injector" + name = "Air Injector" desc = "Has a valve and pump attached to it" var/on = 0 @@ -17,134 +17,133 @@ level = 1 - update_icon() - if(node) - if(on && !(stat & NOPOWER)) - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]on" - else - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" +/obj/machinery/atmospherics/unary/outlet_injector/update_icon() + if(node) + if(on && !(stat & NOPOWER)) + icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]on" else - icon_state = "exposed" - on = 0 + icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" + else + icon_state = "exposed" + on = 0 - return + return - power_change() - var/old_stat = stat - ..() - if(old_stat != stat) - update_icon() - - - process() - ..() - injecting = 0 - - if(!on || stat & NOPOWER) - return 0 - - if(air_contents.temperature > 0) - var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.temperature * R_IDEAL_GAS_EQUATION) - - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - - loc.assume_air(removed) - air_update_turf() - - if(network) - network.update = 1 - - return 1 - - proc/inject() - if(on || injecting) - return 0 - - injecting = 1 - - if(air_contents.temperature > 0) - var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.temperature * R_IDEAL_GAS_EQUATION) - - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - - loc.assume_air(removed) - - if(network) - network.update = 1 - - flick("inject", src) - - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency) - - broadcast_status() - if(!radio_connection) - return 0 - - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - - signal.data = list( - "tag" = id, - "device" = "AO", - "power" = on, - "volume_rate" = volume_rate, - //"timestamp" = world.time, - "sigtype" = "status" - ) - - radio_connection.post_signal(src, signal) - - return 1 - - initialize() - ..() - - set_frequency(frequency) - spawn(rand(25,50)) - broadcast_status() - - receive_signal(datum/signal/signal) - if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) - return 0 - - if("power" in signal.data) - on = text2num(signal.data["power"]) - - if("power_toggle" in signal.data) - on = !on - - if("inject" in signal.data) - spawn inject() - return - - if("set_volume_rate" in signal.data) - var/number = text2num(signal.data["set_volume_rate"]) - volume_rate = Clamp(number, 0, air_contents.volume) - - if("status" in signal.data) - spawn(2) - broadcast_status() - return //do not update_icon - - //log_admin("DEBUG \[[world.timeofday]\]: outlet_injector/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") - //return - spawn(2) - broadcast_status() +/obj/machinery/atmospherics/unary/outlet_injector/power_change() + var/old_stat = stat + ..() + if(old_stat != stat) update_icon() - hide(var/i) //to make the little pipe section invisible, the icon changes. - if(node) - if(on) - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]on" - else - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" + +/obj/machinery/atmospherics/unary/outlet_injector/process() + ..() + injecting = 0 + + if(!on || stat & NOPOWER) + return 0 + + if(air_contents.temperature > 0) + var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.temperature * R_IDEAL_GAS_EQUATION) + + var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) + + loc.assume_air(removed) + air_update_turf() + + if(network) + network.update = 1 + + return 1 + +/obj/machinery/atmospherics/unary/outlet_injector/proc/inject() + if(on || injecting) + return 0 + + injecting = 1 + + if(air_contents.temperature > 0) + var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.temperature * R_IDEAL_GAS_EQUATION) + + var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) + + loc.assume_air(removed) + + if(network) + network.update = 1 + + flick("inject", src) + +/obj/machinery/atmospherics/unary/outlet_injector/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency) + +/obj/machinery/atmospherics/unary/outlet_injector/proc/broadcast_status() + if(!radio_connection) + return 0 + + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + + signal.data = list( + "tag" = id, + "device" = "AO", + "power" = on, + "volume_rate" = volume_rate, + //"timestamp" = world.time, + "sigtype" = "status" + ) + + radio_connection.post_signal(src, signal) + + return 1 + +/obj/machinery/atmospherics/unary/outlet_injector/initialize() + ..() + + set_frequency(frequency) + spawn(rand(25,50)) + broadcast_status() + +/obj/machinery/atmospherics/unary/outlet_injector/receive_signal(datum/signal/signal) + if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) + return 0 + + if("power" in signal.data) + on = text2num(signal.data["power"]) + + if("power_toggle" in signal.data) + on = !on + + if("inject" in signal.data) + spawn inject() + return + + if("set_volume_rate" in signal.data) + var/number = text2num(signal.data["set_volume_rate"]) + volume_rate = Clamp(number, 0, air_contents.volume) + + if("status" in signal.data) + spawn(2) + broadcast_status() + return //do not update_icon + + //log_admin("DEBUG \[[world.timeofday]\]: outlet_injector/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") + //return + spawn(2) + broadcast_status() + update_icon() + +/obj/machinery/atmospherics/unary/outlet_injector/hide(var/i) //to make the little pipe section invisible, the icon changes. + if(node) + if(on) + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]on" else - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]exposed" - on = 0 - return \ No newline at end of file + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" + else + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]exposed" + on = 0 + return diff --git a/code/ATMOSPHERICS/components/unary/oxygen_generator.dm b/code/ATMOSPHERICS/components/unary/oxygen_generator.dm index f87b9982ce0..cbbb91683fd 100644 --- a/code/ATMOSPHERICS/components/unary/oxygen_generator.dm +++ b/code/ATMOSPHERICS/components/unary/oxygen_generator.dm @@ -1,4 +1,4 @@ -obj/machinery/atmospherics/unary/oxygen_generator +/obj/machinery/atmospherics/unary/oxygen_generator icon = 'icons/obj/atmospherics/oxygen_generator.dmi' icon_state = "intact_off" density = 1 @@ -13,37 +13,37 @@ obj/machinery/atmospherics/unary/oxygen_generator var/oxygen_content = 10 - update_icon() - if(node) - icon_state = "intact_[on?("on"):("off")]" - else - icon_state = "exposed_off" +/obj/machinery/atmospherics/unary/oxygen_generator/update_icon() + if(node) + icon_state = "intact_[on?("on"):("off")]" + else + icon_state = "exposed_off" - on = 0 + on = 0 - return + return - New() - ..() +/obj/machinery/atmospherics/unary/oxygen_generator/New() + ..() - air_contents.volume = 50 + air_contents.volume = 50 - process() - ..() - if(!on) - return 0 +/obj/machinery/atmospherics/unary/oxygen_generator/process() + ..() + if(!on) + return 0 - var/total_moles = air_contents.total_moles() + var/total_moles = air_contents.total_moles() - if(total_moles < oxygen_content) - var/current_heat_capacity = air_contents.heat_capacity() + if(total_moles < oxygen_content) + var/current_heat_capacity = air_contents.heat_capacity() - var/added_oxygen = oxygen_content - total_moles + var/added_oxygen = oxygen_content - total_moles - air_contents.temperature = (current_heat_capacity*air_contents.temperature + 20*added_oxygen*T0C)/(current_heat_capacity+20*added_oxygen) - air_contents.oxygen += added_oxygen + air_contents.temperature = (current_heat_capacity*air_contents.temperature + 20*added_oxygen*T0C)/(current_heat_capacity+20*added_oxygen) + air_contents.oxygen += added_oxygen - if(network) - network.update = 1 + if(network) + network.update = 1 - return 1 \ No newline at end of file + return 1 diff --git a/code/ATMOSPHERICS/components/unary/unary_base.dm b/code/ATMOSPHERICS/components/unary/unary_base.dm index 118c036c1ee..07465402083 100644 --- a/code/ATMOSPHERICS/components/unary/unary_base.dm +++ b/code/ATMOSPHERICS/components/unary/unary_base.dm @@ -9,91 +9,91 @@ var/datum/pipe_network/network - New() - ..() - initialize_directions = dir - air_contents = new +/obj/machinery/atmospherics/unary/New() + ..() + initialize_directions = dir + air_contents = new - air_contents.volume = 200 + air_contents.volume = 200 // Housekeeping and pipe network stuff below - network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - if(reference == node) - network = new_network +/obj/machinery/atmospherics/unary/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) + if(reference == node) + network = new_network - if(new_network.normal_members.Find(src)) - return 0 + if(new_network.normal_members.Find(src)) + return 0 - new_network.normal_members += src + new_network.normal_members += src - return null + return null - Destroy() - if(node) - node.disconnect(src) - del(network) +/obj/machinery/atmospherics/unary/Destroy() + if(node) + node.disconnect(src) + del(network) - node = null + node = null - ..() + ..() - initialize(infiniteloop = 0) - if(!infiniteloop) - src.disconnect(src) +/obj/machinery/atmospherics/unary/initialize(infiniteloop = 0) + if(!infiniteloop) + src.disconnect(src) - var/node_connect = dir - - for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) - if(target.initialize_directions & get_dir(target,src)) - node = target - if(!infiniteloop) - target.initialize(1) - break - build_network() - - update_icon() - - default_change_direction_wrench(mob/user, obj/item/weapon/wrench/W) - if(..()) - initialize_directions = dir - if(node) - disconnect(node) - initialize() - . = 1 + var/node_connect = dir + for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) + if(target.initialize_directions & get_dir(target,src)) + node = target + if(!infiniteloop) + target.initialize(1) + break build_network() - if(!network && node) - network = new /datum/pipe_network() - network.normal_members += src - network.build_network(node, src) + + update_icon() + +/obj/machinery/atmospherics/unary/default_change_direction_wrench(mob/user, obj/item/weapon/wrench/W) + if(..()) + initialize_directions = dir + if(node) + disconnect(node) + initialize() + . = 1 + +/obj/machinery/atmospherics/unary/build_network() + if(!network && node) + network = new /datum/pipe_network() + network.normal_members += src + network.build_network(node, src) - return_network(obj/machinery/atmospherics/reference) - build_network() +/obj/machinery/atmospherics/unary/return_network(obj/machinery/atmospherics/reference) + build_network() - if(reference==node) - return network + if(reference==node) + return network - return null + return null - reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) - if(network == old_network) - network = new_network +/obj/machinery/atmospherics/unary/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) + if(network == old_network) + network = new_network - return 1 + return 1 - return_network_air(datum/pipe_network/reference) - var/list/results = list() +/obj/machinery/atmospherics/unary/return_network_air(datum/pipe_network/reference) + var/list/results = list() - if(network == reference) - results += air_contents + if(network == reference) + results += air_contents - return results + return results - disconnect(obj/machinery/atmospherics/reference) - if(reference==node) - node = null - reference.disconnect(src) - del(network) +/obj/machinery/atmospherics/unary/disconnect(obj/machinery/atmospherics/reference) + if(reference==node) + node = null + reference.disconnect(src) + del(network) - return null \ No newline at end of file + return null diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 348ab417363..837e70ef4eb 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -32,286 +32,286 @@ var/radio_filter_out var/radio_filter_in - on - on = 1 - icon_state = "out" +/obj/machinery/atmospherics/unary/vent_pump/on + on = 1 + icon_state = "out" - siphon - pump_direction = 0 - icon_state = "off" +/obj/machinery/atmospherics/unary/vent_pump/siphon + pump_direction = 0 + icon_state = "off" - on - on = 1 - icon_state = "in" +/obj/machinery/atmospherics/unary/vent_pump/siphon/on + on = 1 + icon_state = "in" - New() - ..() - initial_loc = get_area(loc) - if (initial_loc.master) - initial_loc = initial_loc.master - area_uid = initial_loc.uid - if (!id_tag) - assign_uid() - id_tag = num2text(uid) - if(ticker && ticker.current_state == 3)//if the game is running - src.initialize() - src.broadcast_status() +/obj/machinery/atmospherics/unary/vent_pump/New() + ..() + initial_loc = get_area(loc) + if (initial_loc.master) + initial_loc = initial_loc.master + area_uid = initial_loc.uid + if (!id_tag) + assign_uid() + id_tag = num2text(uid) + if(ticker && ticker.current_state == 3)//if the game is running + src.initialize() + src.broadcast_status() - high_volume - name = "large air vent" - power_channel = EQUIP - New() - ..() - air_contents.volume = 1000 +/obj/machinery/atmospherics/unary/vent_pump/high_volume + name = "large air vent" + power_channel = EQUIP - update_icon() - if(welded) - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]weld" - return - if(on && !(stat & (NOPOWER|BROKEN))) - if(pump_direction) - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]out" - else - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]in" +/obj/machinery/atmospherics/unary/vent_pump/high_volume/New() + ..() + air_contents.volume = 1000 + +/obj/machinery/atmospherics/unary/vent_pump/update_icon() + if(welded) + icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]weld" + return + if(on && !(stat & (NOPOWER|BROKEN))) + if(pump_direction) + icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]out" else - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" + icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]in" + else + icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" + return + +/obj/machinery/atmospherics/unary/vent_pump/process() + ..() + if(stat & (NOPOWER|BROKEN)) + return + if (!node) + on = 0 + //broadcast_status() // from now air alarm/control computer should request update purposely --rastaf0 + if(!on) + return 0 + + if(welded) + return 0 + + var/datum/gas_mixture/environment = loc.return_air() + var/environment_pressure = environment.return_pressure() + + if(pump_direction) //internal -> external + var/pressure_delta = 10000 + + if(pressure_checks&1) + pressure_delta = min(pressure_delta, (external_pressure_bound - environment_pressure)) + if(pressure_checks&2) + pressure_delta = min(pressure_delta, (air_contents.return_pressure() - internal_pressure_bound)) + + if(pressure_delta > 0) + if(air_contents.temperature > 0) + var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION) + + var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) + + loc.assume_air(removed) + air_update_turf() + + if(network) + network.update = 1 + + else //external -> internal + var/pressure_delta = 10000 + if(pressure_checks&1) + pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound)) + if(pressure_checks&2) + pressure_delta = min(pressure_delta, (internal_pressure_bound - air_contents.return_pressure())) + + if(pressure_delta > 0) + if(environment.temperature > 0) + var/transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) + + var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) + if (isnull(removed)) //in space + return + + air_contents.merge(removed) + air_update_turf() + + if(network) + network.update = 1 + + return 1 + +//Radio remote control + +/obj/machinery/atmospherics/unary/vent_pump/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency,radio_filter_in) + +/obj/machinery/atmospherics/unary/vent_pump/proc/broadcast_status() + if(!radio_connection) + return 0 + + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + + signal.data = list( + "area" = src.area_uid, + "tag" = src.id_tag, + "device" = "AVP", + "power" = on, + "direction" = pump_direction?("release"):("siphon"), + "checks" = pressure_checks, + "internal" = internal_pressure_bound, + "external" = external_pressure_bound, + "timestamp" = world.time, + "sigtype" = "status" + ) + + if(!initial_loc.air_vent_names[id_tag]) + var/new_name = "\improper [initial_loc.name] vent pump #[initial_loc.air_vent_names.len+1]" + initial_loc.air_vent_names[id_tag] = new_name + src.name = new_name + initial_loc.air_vent_info[id_tag] = signal.data + + radio_connection.post_signal(src, signal, radio_filter_out) + + return 1 + + +/obj/machinery/atmospherics/unary/vent_pump/initialize() + ..() + + //some vents work his own spesial way + radio_filter_in = frequency==1439?(RADIO_FROM_AIRALARM):null + radio_filter_out = frequency==1439?(RADIO_TO_AIRALARM):null + if(frequency) + set_frequency(frequency) + +/obj/machinery/atmospherics/unary/vent_pump/receive_signal(datum/signal/signal) + if(stat & (NOPOWER|BROKEN)) + return + //log_admin("DEBUG \[[world.timeofday]\]: /obj/machinery/atmospherics/unary/vent_pump/receive_signal([signal.debug_print()])") + if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) + return 0 + + if("purge" in signal.data) + pressure_checks &= ~1 + pump_direction = 0 + + if("stabalize" in signal.data) + pressure_checks |= 1 + pump_direction = 1 + + if("power" in signal.data) + on = text2num(signal.data["power"]) + + if("power_toggle" in signal.data) + on = !on + + if("checks" in signal.data) + pressure_checks = text2num(signal.data["checks"]) + + if("checks_toggle" in signal.data) + pressure_checks = (pressure_checks?0:3) + + if("direction" in signal.data) + pump_direction = text2num(signal.data["direction"]) + + if("set_internal_pressure" in signal.data) + internal_pressure_bound = Clamp( + text2num(signal.data["set_internal_pressure"]), + 0, + ONE_ATMOSPHERE*50 + ) + + if("set_external_pressure" in signal.data) + external_pressure_bound = Clamp( + text2num(signal.data["set_external_pressure"]), + 0, + ONE_ATMOSPHERE*50 + ) + + if("adjust_internal_pressure" in signal.data) + internal_pressure_bound = Clamp( + internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]), + 0, + ONE_ATMOSPHERE*50 + ) + + if("adjust_external_pressure" in signal.data) + external_pressure_bound = Clamp( + external_pressure_bound + text2num(signal.data["adjust_external_pressure"]), + 0, + ONE_ATMOSPHERE*50 + ) + + if("init" in signal.data) + name = signal.data["init"] return - process() - ..() - if(stat & (NOPOWER|BROKEN)) - return - if (!node) - on = 0 - //broadcast_status() // from now air alarm/control computer should request update purposely --rastaf0 - if(!on) - return 0 - - if(welded) - return 0 - - var/datum/gas_mixture/environment = loc.return_air() - var/environment_pressure = environment.return_pressure() - - if(pump_direction) //internal -> external - var/pressure_delta = 10000 - - if(pressure_checks&1) - pressure_delta = min(pressure_delta, (external_pressure_bound - environment_pressure)) - if(pressure_checks&2) - pressure_delta = min(pressure_delta, (air_contents.return_pressure() - internal_pressure_bound)) - - if(pressure_delta > 0) - if(air_contents.temperature > 0) - var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION) - - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - - loc.assume_air(removed) - air_update_turf() - - if(network) - network.update = 1 - - else //external -> internal - var/pressure_delta = 10000 - if(pressure_checks&1) - pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound)) - if(pressure_checks&2) - pressure_delta = min(pressure_delta, (internal_pressure_bound - air_contents.return_pressure())) - - if(pressure_delta > 0) - if(environment.temperature > 0) - var/transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) - - var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) - if (isnull(removed)) //in space - return - - air_contents.merge(removed) - air_update_turf() - - if(network) - network.update = 1 - - return 1 - - //Radio remote control - - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency,radio_filter_in) - - broadcast_status() - if(!radio_connection) - return 0 - - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - - signal.data = list( - "area" = src.area_uid, - "tag" = src.id_tag, - "device" = "AVP", - "power" = on, - "direction" = pump_direction?("release"):("siphon"), - "checks" = pressure_checks, - "internal" = internal_pressure_bound, - "external" = external_pressure_bound, - "timestamp" = world.time, - "sigtype" = "status" - ) - - if(!initial_loc.air_vent_names[id_tag]) - var/new_name = "\improper [initial_loc.name] vent pump #[initial_loc.air_vent_names.len+1]" - initial_loc.air_vent_names[id_tag] = new_name - src.name = new_name - initial_loc.air_vent_info[id_tag] = signal.data - - radio_connection.post_signal(src, signal, radio_filter_out) - - return 1 - - - initialize() - ..() - - //some vents work his own spesial way - radio_filter_in = frequency==1439?(RADIO_FROM_AIRALARM):null - radio_filter_out = frequency==1439?(RADIO_TO_AIRALARM):null - if(frequency) - set_frequency(frequency) - - receive_signal(datum/signal/signal) - if(stat & (NOPOWER|BROKEN)) - return - //log_admin("DEBUG \[[world.timeofday]\]: /obj/machinery/atmospherics/unary/vent_pump/receive_signal([signal.debug_print()])") - if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) - return 0 - - if("purge" in signal.data) - pressure_checks &= ~1 - pump_direction = 0 - - if("stabalize" in signal.data) - pressure_checks |= 1 - pump_direction = 1 - - if("power" in signal.data) - on = text2num(signal.data["power"]) - - if("power_toggle" in signal.data) - on = !on - - if("checks" in signal.data) - pressure_checks = text2num(signal.data["checks"]) - - if("checks_toggle" in signal.data) - pressure_checks = (pressure_checks?0:3) - - if("direction" in signal.data) - pump_direction = text2num(signal.data["direction"]) - - if("set_internal_pressure" in signal.data) - internal_pressure_bound = Clamp( - text2num(signal.data["set_internal_pressure"]), - 0, - ONE_ATMOSPHERE*50 - ) - - if("set_external_pressure" in signal.data) - external_pressure_bound = Clamp( - text2num(signal.data["set_external_pressure"]), - 0, - ONE_ATMOSPHERE*50 - ) - - if("adjust_internal_pressure" in signal.data) - internal_pressure_bound = Clamp( - internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]), - 0, - ONE_ATMOSPHERE*50 - ) - - if("adjust_external_pressure" in signal.data) - external_pressure_bound = Clamp( - external_pressure_bound + text2num(signal.data["adjust_external_pressure"]), - 0, - ONE_ATMOSPHERE*50 - ) - - if("init" in signal.data) - name = signal.data["init"] - return - - if("status" in signal.data) - spawn(2) - broadcast_status() - return //do not update_icon - - //log_admin("DEBUG \[[world.timeofday]\]: vent_pump/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") + if("status" in signal.data) spawn(2) broadcast_status() - update_icon() - return + return //do not update_icon - hide(var/i) //to make the little pipe section invisible, the icon changes. - if(welded) - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]weld" - return - if(on&&node) - if(pump_direction) - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]out" - else - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]in" + //log_admin("DEBUG \[[world.timeofday]\]: vent_pump/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") + spawn(2) + broadcast_status() + update_icon() + return + +/obj/machinery/atmospherics/unary/vent_pump/hide(var/i) //to make the little pipe section invisible, the icon changes. + if(welded) + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]weld" + return + if(on&&node) + if(pump_direction) + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]out" else - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" - on = 0 - return + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]in" + else + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" + on = 0 + return - attackby(obj/item/W, mob/user) - if (istype(W, /obj/item/weapon/wrench)&& !(stat & NOPOWER) && on) - user << "\red You cannot unwrench this [src], turn it off first." - return 1 - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - if (WT.remove_fuel(0,user)) - user << "\blue Now welding the vent." - if(do_after(user, 20)) - if(!src || !WT.isOn()) return - playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) - if(!welded) - user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") - welded = 1 - update_icon() - else - user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.") - welded = 0 - update_icon() +/obj/machinery/atmospherics/unary/vent_pump/attackby(obj/item/W, mob/user) + if (istype(W, /obj/item/weapon/wrench)&& !(stat & NOPOWER) && on) + user << "You cannot unwrench this [src], turn it off first." + return 1 + if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if (WT.remove_fuel(0,user)) + user << "Now welding the vent." + if(do_after(user, 20)) + if(!src || !WT.isOn()) return + playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) + if(!welded) + user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") + welded = 1 + update_icon() else - user << "\blue The welding tool needs to be on to start this task." + user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.") + welded = 0 + update_icon() else - user << "\blue You need more welding fuel to complete this task." - return 1 + user << "The welding tool needs to be on to start this task." else - return ..() + user << "You need more welding fuel to complete this task." + return 1 + else + return ..() - examine() - set src in oview(1) - ..() - if(welded) - usr << "It seems welded shut." +/obj/machinery/atmospherics/unary/vent_pump/examine() + set src in oview(1) + ..() + if(welded) + usr << "It seems welded shut." - power_change() - if(powered(power_channel)) - stat &= ~NOPOWER - else - stat |= NOPOWER +/obj/machinery/atmospherics/unary/vent_pump/power_change() + if(powered(power_channel)) + stat &= ~NOPOWER + else + stat |= NOPOWER update_icon() /obj/machinery/atmospherics/unary/vent_pump/Destroy() diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 5ca05a05941..a1067d42d29 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -28,229 +28,228 @@ var/radio_filter_out var/radio_filter_in - New() - ..() - initial_loc = get_area(loc) - if (initial_loc.master) - initial_loc = initial_loc.master - area_uid = initial_loc.uid - if (!id_tag) - assign_uid() - id_tag = num2text(uid) - if(ticker && ticker.current_state == 3)//if the game is running - src.initialize() - src.broadcast_status() - - update_icon() - if(node && on && !(stat & (NOPOWER|BROKEN))) - if(scrubbing) - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]on" - else - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]in" - else - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" - return - - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, radio_filter_in) - - broadcast_status() - if(!radio_connection) - return 0 - - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - signal.data = list( - "area" = area_uid, - "tag" = id_tag, - "device" = "AScr", - "timestamp" = world.time, - "power" = on, - "scrubbing" = scrubbing, - "panic" = panic, - "filter_co2" = scrub_CO2, - "filter_toxins" = scrub_Toxins, - "filter_n2o" = scrub_N2O, - "sigtype" = "status" - ) - if(!initial_loc.air_scrub_names[id_tag]) - var/new_name = "\improper [initial_loc.name] air scrubber #[initial_loc.air_scrub_names.len+1]" - initial_loc.air_scrub_names[id_tag] = new_name - src.name = new_name - initial_loc.air_scrub_info[id_tag] = signal.data - radio_connection.post_signal(src, signal, radio_filter_out) - - return 1 - - initialize() - ..() - radio_filter_in = frequency==initial(frequency)?(RADIO_FROM_AIRALARM):null - radio_filter_out = frequency==initial(frequency)?(RADIO_TO_AIRALARM):null - if (frequency) - set_frequency(frequency) - - process() - ..() - if(stat & (NOPOWER|BROKEN)) - return - if (!node) - on = 0 - //broadcast_status() - if(!on) - return 0 - - - var/datum/gas_mixture/environment = loc.return_air() +/obj/machinery/atmospherics/unary/vent_scrubber/New() + ..() + initial_loc = get_area(loc) + if (initial_loc.master) + initial_loc = initial_loc.master + area_uid = initial_loc.uid + if (!id_tag) + assign_uid() + id_tag = num2text(uid) + if(ticker && ticker.current_state == 3)//if the game is running + src.initialize() + src.broadcast_status() +/obj/machinery/atmospherics/unary/vent_scrubber/update_icon() + if(node && on && !(stat & (NOPOWER|BROKEN))) if(scrubbing) - if((environment.toxins>0) || (environment.carbon_dioxide>0) || (environment.trace_gases.len>0)) - var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles() + icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]on" + else + icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]in" + else + icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" + return - //Take a gas sample - var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) - if (isnull(removed)) //in space - return +/obj/machinery/atmospherics/unary/vent_scrubber/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + radio_connection = radio_controller.add_object(src, frequency, radio_filter_in) - //Filter it - var/datum/gas_mixture/filtered_out = new - filtered_out.temperature = removed.temperature - if(scrub_Toxins) - filtered_out.toxins = removed.toxins - removed.toxins = 0 - if(scrub_CO2) - filtered_out.carbon_dioxide = removed.carbon_dioxide - removed.carbon_dioxide = 0 +/obj/machinery/atmospherics/unary/vent_scrubber/proc/broadcast_status() + if(!radio_connection) + return 0 - if(removed.trace_gases.len>0) - for(var/datum/gas/trace_gas in removed.trace_gases) - if(istype(trace_gas, /datum/gas/oxygen_agent_b)) - removed.trace_gases -= trace_gas - filtered_out.trace_gases += trace_gas - else if(istype(trace_gas, /datum/gas/sleeping_agent) && scrub_N2O) - removed.trace_gases -= trace_gas - filtered_out.trace_gases += trace_gas + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + signal.data = list( + "area" = area_uid, + "tag" = id_tag, + "device" = "AScr", + "timestamp" = world.time, + "power" = on, + "scrubbing" = scrubbing, + "panic" = panic, + "filter_co2" = scrub_CO2, + "filter_toxins" = scrub_Toxins, + "filter_n2o" = scrub_N2O, + "sigtype" = "status" + ) + if(!initial_loc.air_scrub_names[id_tag]) + var/new_name = "\improper [initial_loc.name] air scrubber #[initial_loc.air_scrub_names.len+1]" + initial_loc.air_scrub_names[id_tag] = new_name + src.name = new_name + initial_loc.air_scrub_info[id_tag] = signal.data + radio_connection.post_signal(src, signal, radio_filter_out) + + return 1 + +/obj/machinery/atmospherics/unary/vent_scrubber/initialize() + ..() + radio_filter_in = frequency==initial(frequency)?(RADIO_FROM_AIRALARM):null + radio_filter_out = frequency==initial(frequency)?(RADIO_TO_AIRALARM):null + if (frequency) + set_frequency(frequency) + +/obj/machinery/atmospherics/unary/vent_scrubber/process() + ..() + if(stat & (NOPOWER|BROKEN)) + return + if (!node) + on = 0 + //broadcast_status() + if(!on) + return 0 - //Remix the resulting gases - air_contents.merge(filtered_out) + var/datum/gas_mixture/environment = loc.return_air() - loc.assume_air(removed) - air_update_turf() + if(scrubbing) + if((environment.toxins>0) || (environment.carbon_dioxide>0) || (environment.trace_gases.len>0)) + var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles() - if(network) - network.update = 1 - - else //Just siphoning all air - if (air_contents.return_pressure()>=50*ONE_ATMOSPHERE) + //Take a gas sample + var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) + if (isnull(removed)) //in space return - var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume) + //Filter it + var/datum/gas_mixture/filtered_out = new + filtered_out.temperature = removed.temperature + if(scrub_Toxins) + filtered_out.toxins = removed.toxins + removed.toxins = 0 + if(scrub_CO2) + filtered_out.carbon_dioxide = removed.carbon_dioxide + removed.carbon_dioxide = 0 - var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) + if(removed.trace_gases.len>0) + for(var/datum/gas/trace_gas in removed.trace_gases) + if(istype(trace_gas, /datum/gas/oxygen_agent_b)) + removed.trace_gases -= trace_gas + filtered_out.trace_gases += trace_gas + else if(istype(trace_gas, /datum/gas/sleeping_agent) && scrub_N2O) + removed.trace_gases -= trace_gas + filtered_out.trace_gases += trace_gas - air_contents.merge(removed) + + //Remix the resulting gases + air_contents.merge(filtered_out) + + loc.assume_air(removed) air_update_turf() if(network) network.update = 1 - return 1 + else //Just siphoning all air + if (air_contents.return_pressure()>=50*ONE_ATMOSPHERE) + return + + var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume) + + var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) + + air_contents.merge(removed) + air_update_turf() + + if(network) + network.update = 1 + + return 1 /* //unused piece of code - hide(var/i) //to make the little pipe section invisible, the icon changes. - if(on&&node) - if(scrubbing) - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]on" - else - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]in" +/obj/machinery/atmospherics/unary/vent_scrubber/hide(var/i) //to make the little pipe section invisible, the icon changes. + if(on&&node) + if(scrubbing) + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]on" else - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" - on = 0 - return + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]in" + else + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" + on = 0 + return */ - receive_signal(datum/signal/signal) - if(stat & (NOPOWER|BROKEN)) - return - if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) - return 0 +/obj/machinery/atmospherics/unary/vent_scrubber/receive_signal(datum/signal/signal) + if(stat & (NOPOWER|BROKEN)) + return + if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) + return 0 - if("power" in signal.data) - on = text2num(signal.data["power"]) - if("power_toggle" in signal.data) - on = !on + if("power" in signal.data) + on = text2num(signal.data["power"]) + if("power_toggle" in signal.data) + on = !on - if("panic_siphon" in signal.data) //must be before if("scrubbing" thing - panic = text2num(signal.data["panic_siphon"]) - if(panic) - on = 1 - scrubbing = 0 - volume_rate = 2000 - else - scrubbing = 1 - volume_rate = initial(volume_rate) - if("toggle_panic_siphon" in signal.data) - panic = !panic - if(panic) - on = 1 - scrubbing = 0 - volume_rate = 2000 - else - scrubbing = 1 - volume_rate = initial(volume_rate) + if("panic_siphon" in signal.data) //must be before if("scrubbing" thing + panic = text2num(signal.data["panic_siphon"]) + if(panic) + on = 1 + scrubbing = 0 + volume_rate = 2000 + else + scrubbing = 1 + volume_rate = initial(volume_rate) + if("toggle_panic_siphon" in signal.data) + panic = !panic + if(panic) + on = 1 + scrubbing = 0 + volume_rate = 2000 + else + scrubbing = 1 + volume_rate = initial(volume_rate) - if("scrubbing" in signal.data) - scrubbing = text2num(signal.data["scrubbing"]) - if("toggle_scrubbing" in signal.data) - scrubbing = !scrubbing + if("scrubbing" in signal.data) + scrubbing = text2num(signal.data["scrubbing"]) + if("toggle_scrubbing" in signal.data) + scrubbing = !scrubbing - if("co2_scrub" in signal.data) - scrub_CO2 = text2num(signal.data["co2_scrub"]) - if("toggle_co2_scrub" in signal.data) - scrub_CO2 = !scrub_CO2 + if("co2_scrub" in signal.data) + scrub_CO2 = text2num(signal.data["co2_scrub"]) + if("toggle_co2_scrub" in signal.data) + scrub_CO2 = !scrub_CO2 - if("tox_scrub" in signal.data) - scrub_Toxins = text2num(signal.data["tox_scrub"]) - if("toggle_tox_scrub" in signal.data) - scrub_Toxins = !scrub_Toxins + if("tox_scrub" in signal.data) + scrub_Toxins = text2num(signal.data["tox_scrub"]) + if("toggle_tox_scrub" in signal.data) + scrub_Toxins = !scrub_Toxins - if("n2o_scrub" in signal.data) - scrub_N2O = text2num(signal.data["n2o_scrub"]) - if("toggle_n2o_scrub" in signal.data) - scrub_N2O = !scrub_N2O + if("n2o_scrub" in signal.data) + scrub_N2O = text2num(signal.data["n2o_scrub"]) + if("toggle_n2o_scrub" in signal.data) + scrub_N2O = !scrub_N2O - if("init" in signal.data) - name = signal.data["init"] - return - - if("status" in signal.data) - spawn(2) - broadcast_status() - return //do not update_icon - -// log_admin("DEBUG \[[world.timeofday]\]: vent_scrubber/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") - spawn(2) - broadcast_status() - update_icon() + if("init" in signal.data) + name = signal.data["init"] return - power_change() - if(powered(power_channel)) - stat &= ~NOPOWER - else - stat |= NOPOWER - update_icon() + if("status" in signal.data) + spawn(2) + broadcast_status() + return //do not update_icon - attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - if (!(stat & NOPOWER) && on) - user << "\red You cannot unwrench this [src], turn it off first." - return 1 +// log_admin("DEBUG \[[world.timeofday]\]: vent_scrubber/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") + spawn(2) + broadcast_status() + update_icon() + return + +/obj/machinery/atmospherics/unary/vent_scrubber/power_change() + if(powered(power_channel)) + stat &= ~NOPOWER + else + stat |= NOPOWER + update_icon() + +/obj/machinery/atmospherics/unary/vent_scrubber/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) return ..() + if (!(stat & NOPOWER) && on) + user << "You cannot unwrench this [src], turn it off first." + return 1 + return ..() /obj/machinery/atmospherics/unary/vent_scrubber/Destroy() if(initial_loc) diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index c67f47a403a..47b9b940489 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -1,4 +1,4 @@ -obj/machinery/atmospherics/valve +/obj/machinery/atmospherics/valve icon = 'icons/obj/atmospherics/valve.dmi' icon_state = "valve0" @@ -18,295 +18,294 @@ obj/machinery/atmospherics/valve var/datum/pipe_network/network_node1 var/datum/pipe_network/network_node2 + var/frequency = 0 + var/id = null + var/datum/radio_frequency/radio_connection - open - open = 1 - icon_state = "valve1" +/obj/machinery/atmospherics/valve/open + open = 1 + icon_state = "valve1" - update_icon(animation) - if(animation) - flick("valve[src.open][!src.open]",src) - else - icon_state = "valve[open]" +/obj/machinery/atmospherics/valve/update_icon(animation) + if(animation) + flick("valve[src.open][!src.open]",src) + else + icon_state = "valve[open]" - New() - ..() - switch(dir) - if(NORTH || SOUTH) - initialize_directions = NORTH|SOUTH - if(EAST || WEST) - initialize_directions = EAST|WEST +/obj/machinery/atmospherics/valve/New() + ..() + switch(dir) + if(NORTH || SOUTH) + initialize_directions = NORTH|SOUTH + if(EAST || WEST) + initialize_directions = EAST|WEST - network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) +/obj/machinery/atmospherics/valve/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - if(reference == node1) - network_node1 = new_network - if(open) - network_node2 = new_network - else if(reference == node2) - network_node2 = new_network - if(open) - network_node1 = new_network - - if(new_network.normal_members.Find(src)) - return 0 - - new_network.normal_members += src - + if(reference == node1) + network_node1 = new_network if(open) - if(reference == node1) - if(node2) - return node2.network_expand(new_network, src) - else if(reference == node2) - if(node1) - return node1.network_expand(new_network, src) + network_node2 = new_network + else if(reference == node2) + network_node2 = new_network + if(open) + network_node1 = new_network - return null + if(new_network.normal_members.Find(src)) + return 0 - Destroy() - if(node1) - node1.disconnect(src) - del(network_node1) - if(node2) - node2.disconnect(src) - del(network_node2) + new_network.normal_members += src - node1 = null - node2 = null + if(open) + if(reference == node1) + if(node2) + return node2.network_expand(new_network, src) + else if(reference == node2) + if(node1) + return node1.network_expand(new_network, src) - ..() + return null - proc/open() +/obj/machinery/atmospherics/valve/Destroy() + if(node1) + node1.disconnect(src) + del(network_node1) + if(node2) + node2.disconnect(src) + del(network_node2) - if(open) return 0 + node1 = null + node2 = null - open = 1 - update_icon() + ..() - if(network_node1&&network_node2) - network_node1.merge(network_node2) - network_node2 = network_node1 +/obj/machinery/atmospherics/valve/proc/open() - if(network_node1) - network_node1.update = 1 - else if(network_node2) - network_node2.update = 1 + if(open) return 0 - return 1 + open = 1 + update_icon() - proc/close() + if(network_node1&&network_node2) + network_node1.merge(network_node2) + network_node2 = network_node1 - if(!open) - return 0 + if(network_node1) + network_node1.update = 1 + else if(network_node2) + network_node2.update = 1 - open = 0 - update_icon() + return 1 - if(network_node1) - del(network_node1) - if(network_node2) - del(network_node2) +/obj/machinery/atmospherics/valve/proc/close() - build_network() + if(!open) + return 0 - return 1 + open = 0 + update_icon() - proc/normalize_dir() - if(dir==3) - dir = 1 - else if(dir==12) - dir = 4 + if(network_node1) + del(network_node1) + if(network_node2) + del(network_node2) - attack_ai(mob/user as mob) - return + build_network() - attack_paw(mob/user as mob) - return attack_hand(user) + return 1 - attack_hand(mob/user as mob) - src.add_fingerprint(usr) - update_icon(1) - sleep(10) - if (src.open) - src.close() - else - src.open() +/obj/machinery/atmospherics/valve/proc/normalize_dir() + if(dir==3) + dir = 1 + else if(dir==12) + dir = 4 - process() - ..() - . = PROCESS_KILL +/obj/machinery/atmospherics/valve/attack_ai(mob/user as mob) + return -/* if(open && (!node1 || !node2)) - close() - if(!node1) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (!node2) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (nodealert) - nodealert = 0 +/obj/machinery/atmospherics/valve/attack_paw(mob/user as mob) + return attack_hand(user) + +obj/machinery/atmospherics/valve/attack_hand(mob/user as mob) + src.add_fingerprint(usr) + update_icon(1) + sleep(10) + if (src.open) + src.close() + else + src.open() + +/obj/machinery/atmospherics/valve/process() + ..() + . = PROCESS_KILL + +/* if(open && (!node1 || !node2)) + close() + if(!node1) + if(!nodealert) + //world << "Missing node from [src] at [src.x],[src.y],[src.z]" + nodealert = 1 + else if (!node2) + if(!nodealert) + //world << "Missing node from [src] at [src.x],[src.y],[src.z]" + nodealert = 1 + else if (nodealert) + nodealert = 0 */ - return + return - initialize() - normalize_dir() +/obj/machinery/atmospherics/valve/initialize() + normalize_dir() - var/node1_dir - var/node2_dir + var/node1_dir + var/node2_dir - for(var/direction in cardinal) - if(direction&initialize_directions) - if (!node1_dir) - node1_dir = direction - else if (!node2_dir) - node2_dir = direction + for(var/direction in cardinal) + if(direction&initialize_directions) + if (!node1_dir) + node1_dir = direction + else if (!node2_dir) + node2_dir = direction - for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) - if(target.initialize_directions & get_dir(target,src)) - node1 = target - break - for(var/obj/machinery/atmospherics/target in get_step(src,node2_dir)) - if(target.initialize_directions & get_dir(target,src)) - node2 = target - break + for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) + if(target.initialize_directions & get_dir(target,src)) + node1 = target + break + for(var/obj/machinery/atmospherics/target in get_step(src,node2_dir)) + if(target.initialize_directions & get_dir(target,src)) + node2 = target + break - build_network() + build_network() - if(openDuringInit) - close() - open() - openDuringInit = 0 + if(openDuringInit) + close() + open() + openDuringInit = 0 /* - var/connect_directions - switch(dir) - if(NORTH) - connect_directions = NORTH|SOUTH - if(SOUTH) - connect_directions = NORTH|SOUTH - if(EAST) - connect_directions = EAST|WEST - if(WEST) - connect_directions = EAST|WEST - else - connect_directions = dir + var/connect_directions + switch(dir) + if(NORTH) + connect_directions = NORTH|SOUTH + if(SOUTH) + connect_directions = NORTH|SOUTH + if(EAST) + connect_directions = EAST|WEST + if(WEST) + connect_directions = EAST|WEST + else + connect_directions = dir - for(var/direction in cardinal) - if(direction&connect_directions) - for(var/obj/machinery/atmospherics/target in get_step(src,direction)) - if(target.initialize_directions & get_dir(target,src)) - connect_directions &= ~direction - node1 = target - break - if(node1) + for(var/direction in cardinal) + if(direction&connect_directions) + for(var/obj/machinery/atmospherics/target in get_step(src,direction)) + if(target.initialize_directions & get_dir(target,src)) + connect_directions &= ~direction + node1 = target break + if(node1) + break - for(var/direction in cardinal) - if(direction&connect_directions) - for(var/obj/machinery/atmospherics/target in get_step(src,direction)) - if(target.initialize_directions & get_dir(target,src)) - node2 = target - break - if(node1) + for(var/direction in cardinal) + if(direction&connect_directions) + for(var/obj/machinery/atmospherics/target in get_step(src,direction)) + if(target.initialize_directions & get_dir(target,src)) + node2 = target break + if(node1) + break */ +/obj/machinery/atmospherics/valve/build_network() + if(!network_node1 && node1) + network_node1 = new /datum/pipe_network() + network_node1.normal_members += src + network_node1.build_network(node1, src) + + if(!network_node2 && node2) + network_node2 = new /datum/pipe_network() + network_node2.normal_members += src + network_node2.build_network(node2, src) + + +/obj/machinery/atmospherics/valve/return_network(obj/machinery/atmospherics/reference) build_network() - if(!network_node1 && node1) - network_node1 = new /datum/pipe_network() - network_node1.normal_members += src - network_node1.build_network(node1, src) - if(!network_node2 && node2) - network_node2 = new /datum/pipe_network() - network_node2.normal_members += src - network_node2.build_network(node2, src) + if(reference==node1) + return network_node1 + if(reference==node2) + return network_node2 - return_network(obj/machinery/atmospherics/reference) - build_network() + return null - if(reference==node1) - return network_node1 +/obj/machinery/atmospherics/valve/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) + if(network_node1 == old_network) + network_node1 = new_network + if(network_node2 == old_network) + network_node2 = new_network - if(reference==node2) - return network_node2 + return 1 - return null +/obj/machinery/atmospherics/valve/return_network_air(datum/network/reference) + return null - reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) - if(network_node1 == old_network) - network_node1 = new_network - if(network_node2 == old_network) - network_node2 = new_network +/obj/machinery/atmospherics/valve/disconnect(obj/machinery/atmospherics/reference) + if(reference==node1) + del(network_node1) + node1 = null - return 1 + else if(reference==node2) + del(network_node2) + node2 = null - return_network_air(datum/network/reference) - return null + return null - disconnect(obj/machinery/atmospherics/reference) - if(reference==node1) - del(network_node1) - node1 = null +/obj/machinery/atmospherics/valve/digital // can be controlled by AI + name = "digital valve" + desc = "A digitally controlled valve." + icon = 'icons/obj/atmospherics/digital_valve.dmi' - else if(reference==node2) - del(network_node2) - node2 = null +/obj/machinery/atmospherics/valve/digital/attack_ai(mob/user as mob) + return src.attack_hand(user) - return null +/obj/machinery/atmospherics/valve/digital/attack_hand(mob/user as mob) + if(!src.allowed(user)) + user << "Access denied." + return + ..() - digital // can be controlled by AI - name = "digital valve" - desc = "A digitally controlled valve." - icon = 'icons/obj/atmospherics/digital_valve.dmi' +//Radio remote control - attack_ai(mob/user as mob) - return src.attack_hand(user) +/obj/machinery/atmospherics/valve/digital/proc + set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) - attack_hand(mob/user as mob) - if(!src.allowed(user)) - user << "\red Access denied." - return - ..() +/obj/machinery/atmospherics/valve/digital/initialize() + ..() + if(frequency) + set_frequency(frequency) - //Radio remote control +/obj/machinery/atmospherics/valve/digital/receive_signal(datum/signal/signal) + if(!signal.data["tag"] || (signal.data["tag"] != id)) + return 0 - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) + switch(signal.data["command"]) + if("valve_open") + if(!open) + open() - var/frequency = 0 - var/id = null - var/datum/radio_frequency/radio_connection + if("valve_close") + if(open) + close() - initialize() - ..() - if(frequency) - set_frequency(frequency) - - receive_signal(datum/signal/signal) - if(!signal.data["tag"] || (signal.data["tag"] != id)) - return 0 - - switch(signal.data["command"]) - if("valve_open") - if(!open) - open() - - if("valve_close") - if(open) - close() - - if("valve_toggle") - if(open) - close() - else - open() + if("valve_toggle") + if(open) + close() + else + open() diff --git a/code/ATMOSPHERICS/datum_pipe_network.dm b/code/ATMOSPHERICS/datum_pipe_network.dm index ce74f6cfbfc..7956edb5a34 100644 --- a/code/ATMOSPHERICS/datum_pipe_network.dm +++ b/code/ATMOSPHERICS/datum_pipe_network.dm @@ -1,6 +1,6 @@ var/global/list/datum/pipe_network/pipe_networks = list() -datum/pipe_network +/datum/pipe_network var/list/datum/gas_mixture/gases = list() //All of the gas_mixtures continuously connected in this network var/list/obj/machinery/atmospherics/normal_members = list() @@ -10,135 +10,135 @@ datum/pipe_network var/update = 1 var/datum/gas_mixture/air_transient = null - New() - air_transient = new() +/datum/pipe_network/New() + air_transient = new() - ..() + ..() - proc/process() - //Equalize gases amongst pipe if called for - if(update) - update = 0 - reconcile_air() //equalize_gases(gases) +/datum/pipe_network/proc/process() + //Equalize gases amongst pipe if called for + if(update) + update = 0 + reconcile_air() //equalize_gases(gases) - //Give pipelines their process call for pressure checking and what not. Have to remove pressure checks for the time being as pipes dont radiate heat - Mport - //for(var/datum/pipeline/line_member in line_members) - // line_member.process() + //Give pipelines their process call for pressure checking and what not. Have to remove pressure checks for the time being as pipes dont radiate heat - Mport + //for(var/datum/pipeline/line_member in line_members) + // line_member.process() - proc/build_network(obj/machinery/atmospherics/start_normal, obj/machinery/atmospherics/reference) - //Purpose: Generate membership roster - //Notes: Assuming that members will add themselves to appropriate roster in network_expand() +/datum/pipe_network/proc/build_network(obj/machinery/atmospherics/start_normal, obj/machinery/atmospherics/reference) + //Purpose: Generate membership roster + //Notes: Assuming that members will add themselves to appropriate roster in network_expand() - if(!start_normal) - del(src) + if(!start_normal) + del(src) - start_normal.network_expand(src, reference) + start_normal.network_expand(src, reference) - update_network_gases() + update_network_gases() + + if((normal_members.len>0)||(line_members.len>0)) + pipe_networks += src + else + del(src) + +/datum/pipe_network/proc/merge(datum/pipe_network/giver) + if(giver==src) return 0 + + normal_members -= giver.normal_members + normal_members += giver.normal_members + + line_members -= giver.line_members + line_members += giver.line_members + + for(var/obj/machinery/atmospherics/normal_member in giver.normal_members) + normal_member.reassign_network(giver, src) + + for(var/datum/pipeline/line_member in giver.line_members) + line_member.network = src + + del(giver) + + update_network_gases() + return 1 + +/datum/pipe_network/proc/update_network_gases() + //Go through membership roster and make sure gases is up to date + + gases = list() + + for(var/obj/machinery/atmospherics/normal_member in normal_members) + var/result = normal_member.return_network_air(src) + if(result) gases += result + + for(var/datum/pipeline/line_member in line_members) + gases += line_member.air + +/datum/pipe_network/proc/reconcile_air() + //Perfectly equalize all gases members instantly + + //Calculate totals from individual components + var/total_thermal_energy = 0 + var/total_heat_capacity = 0 + + air_transient.volume = 0 + + air_transient.oxygen = 0 + air_transient.nitrogen = 0 + air_transient.toxins = 0 + air_transient.carbon_dioxide = 0 + + + air_transient.trace_gases = list() + + for(var/datum/gas_mixture/gas in gases) + air_transient.volume += gas.volume + total_thermal_energy += gas.thermal_energy() + total_heat_capacity += gas.heat_capacity() + + air_transient.oxygen += gas.oxygen + air_transient.nitrogen += gas.nitrogen + air_transient.toxins += gas.toxins + air_transient.carbon_dioxide += gas.carbon_dioxide + + if(gas.trace_gases.len) + for(var/datum/gas/trace_gas in gas.trace_gases) + var/datum/gas/corresponding = locate(trace_gas.type) in air_transient.trace_gases + if(!corresponding) + corresponding = new trace_gas.type() + air_transient.trace_gases += corresponding + + corresponding.moles += trace_gas.moles + + if(air_transient.volume > 0) + + if(total_heat_capacity > 0) + air_transient.temperature = total_thermal_energy/total_heat_capacity + + //Allow air mixture to react + if(air_transient.react()) + update = 1 - if((normal_members.len>0)||(line_members.len>0)) - pipe_networks += src else - del(src) - - proc/merge(datum/pipe_network/giver) - if(giver==src) return 0 - - normal_members -= giver.normal_members - normal_members += giver.normal_members - - line_members -= giver.line_members - line_members += giver.line_members - - for(var/obj/machinery/atmospherics/normal_member in giver.normal_members) - normal_member.reassign_network(giver, src) - - for(var/datum/pipeline/line_member in giver.line_members) - line_member.network = src - - del(giver) - - update_network_gases() - return 1 - - proc/update_network_gases() - //Go through membership roster and make sure gases is up to date - - gases = list() - - for(var/obj/machinery/atmospherics/normal_member in normal_members) - var/result = normal_member.return_network_air(src) - if(result) gases += result - - for(var/datum/pipeline/line_member in line_members) - gases += line_member.air - - proc/reconcile_air() - //Perfectly equalize all gases members instantly - - //Calculate totals from individual components - var/total_thermal_energy = 0 - var/total_heat_capacity = 0 - - air_transient.volume = 0 - - air_transient.oxygen = 0 - air_transient.nitrogen = 0 - air_transient.toxins = 0 - air_transient.carbon_dioxide = 0 - - - air_transient.trace_gases = list() + air_transient.temperature = 0 + //Update individual gas_mixtures by volume ratio for(var/datum/gas_mixture/gas in gases) - air_transient.volume += gas.volume - total_thermal_energy += gas.thermal_energy() - total_heat_capacity += gas.heat_capacity() + gas.oxygen = air_transient.oxygen*gas.volume/air_transient.volume + gas.nitrogen = air_transient.nitrogen*gas.volume/air_transient.volume + gas.toxins = air_transient.toxins*gas.volume/air_transient.volume + gas.carbon_dioxide = air_transient.carbon_dioxide*gas.volume/air_transient.volume - air_transient.oxygen += gas.oxygen - air_transient.nitrogen += gas.nitrogen - air_transient.toxins += gas.toxins - air_transient.carbon_dioxide += gas.carbon_dioxide + gas.temperature = air_transient.temperature - if(gas.trace_gases.len) - for(var/datum/gas/trace_gas in gas.trace_gases) - var/datum/gas/corresponding = locate(trace_gas.type) in air_transient.trace_gases + if(air_transient.trace_gases.len) + for(var/datum/gas/trace_gas in air_transient.trace_gases) + var/datum/gas/corresponding = locate(trace_gas.type) in gas.trace_gases if(!corresponding) corresponding = new trace_gas.type() - air_transient.trace_gases += corresponding + gas.trace_gases += corresponding - corresponding.moles += trace_gas.moles - - if(air_transient.volume > 0) - - if(total_heat_capacity > 0) - air_transient.temperature = total_thermal_energy/total_heat_capacity - - //Allow air mixture to react - if(air_transient.react()) - update = 1 - - else - air_transient.temperature = 0 - - //Update individual gas_mixtures by volume ratio - for(var/datum/gas_mixture/gas in gases) - gas.oxygen = air_transient.oxygen*gas.volume/air_transient.volume - gas.nitrogen = air_transient.nitrogen*gas.volume/air_transient.volume - gas.toxins = air_transient.toxins*gas.volume/air_transient.volume - gas.carbon_dioxide = air_transient.carbon_dioxide*gas.volume/air_transient.volume - - gas.temperature = air_transient.temperature - - if(air_transient.trace_gases.len) - for(var/datum/gas/trace_gas in air_transient.trace_gases) - var/datum/gas/corresponding = locate(trace_gas.type) in gas.trace_gases - if(!corresponding) - corresponding = new trace_gas.type() - gas.trace_gases += corresponding - - corresponding.moles = trace_gas.moles*gas.volume/air_transient.volume - return 1 + corresponding.moles = trace_gas.moles*gas.volume/air_transient.volume + return 1 proc/equalize_gases(datum/gas_mixture/list/gases) //Perfectly equalize all gases members instantly diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index b9eb1d29a89..1d9e9e2d21a 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -1,4 +1,4 @@ -datum/pipeline +/datum/pipeline var/datum/gas_mixture/air var/list/obj/machinery/atmospherics/pipe/members @@ -8,187 +8,187 @@ datum/pipeline var/alert_pressure = 0 - Del() - if(network) - del(network) +/datum/pipeline/Del() + if(network) + del(network) - if(air && air.volume) - temporarily_store_air() - del(air) + if(air && air.volume) + temporarily_store_air() + del(air) - ..() + ..() - proc/process()//This use to be called called from the pipe networks - - //Check to see if pressure is within acceptable limits - var/pressure = air.return_pressure() - if(pressure > alert_pressure) - for(var/obj/machinery/atmospherics/pipe/member in members) - if(!member.check_pressure(pressure)) - break //Only delete 1 pipe per process - - //Allow for reactions - //air.react() //Should be handled by pipe_network now - - proc/temporarily_store_air() - //Update individual gas_mixtures by volume ratio +/datum/pipeline/proc/process()//This use to be called called from the pipe networks + //Check to see if pressure is within acceptable limits + var/pressure = air.return_pressure() + if(pressure > alert_pressure) for(var/obj/machinery/atmospherics/pipe/member in members) - member.air_temporary = new - member.air_temporary.volume = member.volume + if(!member.check_pressure(pressure)) + break //Only delete 1 pipe per process - member.air_temporary.oxygen = air.oxygen*member.volume/air.volume - member.air_temporary.nitrogen = air.nitrogen*member.volume/air.volume - member.air_temporary.toxins = air.toxins*member.volume/air.volume - member.air_temporary.carbon_dioxide = air.carbon_dioxide*member.volume/air.volume + //Allow for reactions + //air.react() //Should be handled by pipe_network now - member.air_temporary.temperature = air.temperature +/datum/pipeline/proc/temporarily_store_air() + //Update individual gas_mixtures by volume ratio - if(air.trace_gases.len) - for(var/datum/gas/trace_gas in air.trace_gases) - var/datum/gas/corresponding = new trace_gas.type() - member.air_temporary.trace_gases += corresponding + for(var/obj/machinery/atmospherics/pipe/member in members) + member.air_temporary = new + member.air_temporary.volume = member.volume - corresponding.moles = trace_gas.moles*member.volume/air.volume + member.air_temporary.oxygen = air.oxygen*member.volume/air.volume + member.air_temporary.nitrogen = air.nitrogen*member.volume/air.volume + member.air_temporary.toxins = air.toxins*member.volume/air.volume + member.air_temporary.carbon_dioxide = air.carbon_dioxide*member.volume/air.volume - proc/build_pipeline(obj/machinery/atmospherics/pipe/base) + member.air_temporary.temperature = air.temperature + + if(air.trace_gases.len) + for(var/datum/gas/trace_gas in air.trace_gases) + var/datum/gas/corresponding = new trace_gas.type() + member.air_temporary.trace_gases += corresponding + + corresponding.moles = trace_gas.moles*member.volume/air.volume + +/datum/pipeline/proc/build_pipeline(obj/machinery/atmospherics/pipe/base) + air = new + + var/list/possible_expansions = list(base) + members = list(base) + edges = list() + + var/volume = base.volume + base.parent = src + alert_pressure = base.alert_pressure + + if(base.air_temporary) + air = base.air_temporary + base.air_temporary = null + else air = new - var/list/possible_expansions = list(base) - members = list(base) - edges = list() + while(possible_expansions.len>0) + for(var/obj/machinery/atmospherics/pipe/borderline in possible_expansions) - var/volume = base.volume - base.parent = src - alert_pressure = base.alert_pressure + var/list/result = borderline.pipeline_expansion() + var/edge_check = result.len - if(base.air_temporary) - air = base.air_temporary - base.air_temporary = null - else - air = new + if(result.len>0) + for(var/obj/machinery/atmospherics/pipe/item in result) + if(!members.Find(item)) + members += item + possible_expansions += item - while(possible_expansions.len>0) - for(var/obj/machinery/atmospherics/pipe/borderline in possible_expansions) + volume += item.volume + item.parent = src - var/list/result = borderline.pipeline_expansion() - var/edge_check = result.len + alert_pressure = min(alert_pressure, item.alert_pressure) - if(result.len>0) - for(var/obj/machinery/atmospherics/pipe/item in result) - if(!members.Find(item)) - members += item - possible_expansions += item + if(item.air_temporary) + air.merge(item.air_temporary) - volume += item.volume - item.parent = src + edge_check-- - alert_pressure = min(alert_pressure, item.alert_pressure) + if(edge_check>0) + edges += borderline - if(item.air_temporary) - air.merge(item.air_temporary) + possible_expansions -= borderline - edge_check-- + air.volume = volume - if(edge_check>0) - edges += borderline +/datum/pipeline/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - possible_expansions -= borderline + if(new_network.line_members.Find(src)) + return 0 - air.volume = volume + new_network.line_members += src - proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) + network = new_network - if(new_network.line_members.Find(src)) - return 0 + for(var/obj/machinery/atmospherics/pipe/edge in edges) + for(var/obj/machinery/atmospherics/result in edge.pipeline_expansion()) + if(!istype(result,/obj/machinery/atmospherics/pipe) && (result!=reference)) + result.network_expand(new_network, edge) - new_network.line_members += src + return 1 - network = new_network +/datum/pipeline/proc/return_network(obj/machinery/atmospherics/reference) + if(!network) + network = new /datum/pipe_network() + network.build_network(src, null) + //technically passing these parameters should not be allowed + //however pipe_network.build_network(..) and pipeline.network_extend(...) + // were setup to properly handle this case - for(var/obj/machinery/atmospherics/pipe/edge in edges) - for(var/obj/machinery/atmospherics/result in edge.pipeline_expansion()) - if(!istype(result,/obj/machinery/atmospherics/pipe) && (result!=reference)) - result.network_expand(new_network, edge) + return network - return 1 +/datum/pipeline/proc/mingle_with_turf(turf/simulated/target, mingle_volume) + var/datum/gas_mixture/air_sample = air.remove_ratio(mingle_volume/air.volume) + air_sample.volume = mingle_volume - proc/return_network(obj/machinery/atmospherics/reference) - if(!network) - network = new /datum/pipe_network() - network.build_network(src, null) - //technically passing these parameters should not be allowed - //however pipe_network.build_network(..) and pipeline.network_extend(...) - // were setup to properly handle this case + var/datum/gas_mixture/turf_air = target.return_air() - return network + equalize_gases(list(air_sample, turf_air)) + air.merge(air_sample) + //turf_air already modified by equalize_gases() - proc/mingle_with_turf(turf/simulated/target, mingle_volume) - var/datum/gas_mixture/air_sample = air.remove_ratio(mingle_volume/air.volume) - air_sample.volume = mingle_volume + if(istype(target)) + if(target.air) + if(target.air.check_tile_graphic()) + target.update_visuals(target.air) + if(network) + network.update = 1 - var/datum/gas_mixture/turf_air = target.return_air() +/datum/pipeline/proc/temperature_interact(turf/target, share_volume, thermal_conductivity) + var/total_heat_capacity = air.heat_capacity() + var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume) - equalize_gases(list(air_sample, turf_air)) - air.merge(air_sample) - //turf_air already modified by equalize_gases() + if(istype(target, /turf/simulated)) + var/turf/simulated/modeled_location = target - if(istype(target)) - if(target.air) - if(target.air.check_tile_graphic()) - target.update_visuals(target.air) - if(network) - network.update = 1 + if(modeled_location.blocks_air) - proc/temperature_interact(turf/target, share_volume, thermal_conductivity) - var/total_heat_capacity = air.heat_capacity() - var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume) - - if(istype(target, /turf/simulated)) - var/turf/simulated/modeled_location = target - - if(modeled_location.blocks_air) - - if((modeled_location.heat_capacity>0) && (partial_heat_capacity>0)) - var/delta_temperature = air.temperature - modeled_location.temperature - - var/heat = thermal_conductivity*delta_temperature* \ - (partial_heat_capacity*modeled_location.heat_capacity/(partial_heat_capacity+modeled_location.heat_capacity)) - - air.temperature -= heat/total_heat_capacity - modeled_location.temperature += heat/modeled_location.heat_capacity - - else - var/delta_temperature = 0 - var/sharer_heat_capacity = 0 - - delta_temperature = (air.temperature - modeled_location.air.temperature) - sharer_heat_capacity = modeled_location.air.heat_capacity() - - var/self_temperature_delta = 0 - var/sharer_temperature_delta = 0 - - if((sharer_heat_capacity>0) && (partial_heat_capacity>0)) - var/heat = thermal_conductivity*delta_temperature* \ - (partial_heat_capacity*sharer_heat_capacity/(partial_heat_capacity+sharer_heat_capacity)) - - self_temperature_delta = -heat/total_heat_capacity - sharer_temperature_delta = heat/sharer_heat_capacity - else - return 1 - - air.temperature += self_temperature_delta - - modeled_location.air.temperature += sharer_temperature_delta - - - else - if((target.heat_capacity>0) && (partial_heat_capacity>0)) - var/delta_temperature = air.temperature - target.temperature + if((modeled_location.heat_capacity>0) && (partial_heat_capacity>0)) + var/delta_temperature = air.temperature - modeled_location.temperature var/heat = thermal_conductivity*delta_temperature* \ - (partial_heat_capacity*target.heat_capacity/(partial_heat_capacity+target.heat_capacity)) + (partial_heat_capacity*modeled_location.heat_capacity/(partial_heat_capacity+modeled_location.heat_capacity)) air.temperature -= heat/total_heat_capacity - if(network) - network.update = 1 \ No newline at end of file + modeled_location.temperature += heat/modeled_location.heat_capacity + + else + var/delta_temperature = 0 + var/sharer_heat_capacity = 0 + + delta_temperature = (air.temperature - modeled_location.air.temperature) + sharer_heat_capacity = modeled_location.air.heat_capacity() + + var/self_temperature_delta = 0 + var/sharer_temperature_delta = 0 + + if((sharer_heat_capacity>0) && (partial_heat_capacity>0)) + var/heat = thermal_conductivity*delta_temperature* \ + (partial_heat_capacity*sharer_heat_capacity/(partial_heat_capacity+sharer_heat_capacity)) + + self_temperature_delta = -heat/total_heat_capacity + sharer_temperature_delta = heat/sharer_heat_capacity + else + return 1 + + air.temperature += self_temperature_delta + + modeled_location.air.temperature += sharer_temperature_delta + + + else + if((target.heat_capacity>0) && (partial_heat_capacity>0)) + var/delta_temperature = air.temperature - target.temperature + + var/heat = thermal_conductivity*delta_temperature* \ + (partial_heat_capacity*target.heat_capacity/(partial_heat_capacity+target.heat_capacity)) + + air.temperature -= heat/total_heat_capacity + if(network) + network.update = 1 \ No newline at end of file diff --git a/code/ATMOSPHERICS/he_pipes.dm b/code/ATMOSPHERICS/he_pipes.dm index 556800d1efc..c1cd3304c8e 100644 --- a/code/ATMOSPHERICS/he_pipes.dm +++ b/code/ATMOSPHERICS/he_pipes.dm @@ -1,5 +1,5 @@ -obj/machinery/atmospherics/pipe/simple/heat_exchanging +/obj/machinery/atmospherics/pipe/simple/heat_exchanging icon = 'icons/obj/pipes/heat.dmi' icon_state = "intact" level = 2 @@ -8,99 +8,99 @@ obj/machinery/atmospherics/pipe/simple/heat_exchanging minimum_temperature_difference = 20 thermal_conductivity = WINDOW_HEAT_TRANSFER_COEFFICIENT - // BubbleWrap - New() +// BubbleWrap +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/New() + ..() + initialize_directions_he = initialize_directions // The auto-detection from /pipe is good enough for a simple HE pipe +// BubbleWrap END + +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/initialize() + normalize_dir() + var/node1_dir + var/node2_dir + + for(var/direction in cardinal) + if(direction&initialize_directions_he) + if (!node1_dir) + node1_dir = direction + else if (!node2_dir) + node2_dir = direction + + for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src,node1_dir)) + if(target.initialize_directions_he & get_dir(target,src)) + node1 = target + break + for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src,node2_dir)) + if(target.initialize_directions_he & get_dir(target,src)) + node2 = target + break + update_icon() + return + + +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/process() + if(!parent) ..() - initialize_directions_he = initialize_directions // The auto-detection from /pipe is good enough for a simple HE pipe - // BubbleWrap END - - initialize() - normalize_dir() - var/node1_dir - var/node2_dir - - for(var/direction in cardinal) - if(direction&initialize_directions_he) - if (!node1_dir) - node1_dir = direction - else if (!node2_dir) - node2_dir = direction - - for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src,node1_dir)) - if(target.initialize_directions_he & get_dir(target,src)) - node1 = target - break - for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src,node2_dir)) - if(target.initialize_directions_he & get_dir(target,src)) - node2 = target - break - update_icon() - return - - - process() - if(!parent) - ..() - else - var/environment_temperature = 0 - if(istype(loc, /turf/simulated/)) - if(loc:blocks_air) - environment_temperature = loc:temperature - else - var/datum/gas_mixture/environment = loc.return_air() - environment_temperature = environment.temperature - else + else + var/environment_temperature = 0 + if(istype(loc, /turf/simulated/)) + if(loc:blocks_air) environment_temperature = loc:temperature - var/datum/gas_mixture/pipe_air = return_air() - if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) - parent.temperature_interact(loc, volume, thermal_conductivity) + else + var/datum/gas_mixture/environment = loc.return_air() + environment_temperature = environment.temperature + else + environment_temperature = loc:temperature + var/datum/gas_mixture/pipe_air = return_air() + if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) + parent.temperature_interact(loc, volume, thermal_conductivity) -obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction icon = 'icons/obj/pipes/junction.dmi' icon_state = "intact" level = 2 minimum_temperature_difference = 300 thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT - // BubbleWrap - New() - .. () - switch ( dir ) - if ( SOUTH ) - initialize_directions = NORTH - initialize_directions_he = SOUTH - if ( NORTH ) - initialize_directions = SOUTH - initialize_directions_he = NORTH - if ( EAST ) - initialize_directions = WEST - initialize_directions_he = EAST - if ( WEST ) - initialize_directions = EAST - initialize_directions_he = WEST - // BubbleWrap END +// BubbleWrap +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/New() + .. () + switch ( dir ) + if ( SOUTH ) + initialize_directions = NORTH + initialize_directions_he = SOUTH + if ( NORTH ) + initialize_directions = SOUTH + initialize_directions_he = NORTH + if ( EAST ) + initialize_directions = WEST + initialize_directions_he = EAST + if ( WEST ) + initialize_directions = EAST + initialize_directions_he = WEST +// BubbleWrap END + +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/update_icon() + if(node1&&node2) + icon_state = "intact" + else + var/have_node1 = node1?1:0 + var/have_node2 = node2?1:0 + icon_state = "exposed[have_node1][have_node2]" + if(!node1&&!node2) + qdel(src) + +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/initialize() + for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions)) + if(target.initialize_directions & get_dir(target,src)) + node1 = target + break + for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src,initialize_directions_he)) + if(target.initialize_directions_he & get_dir(target,src)) + node2 = target + break update_icon() - if(node1&&node2) - icon_state = "intact" - else - var/have_node1 = node1?1:0 - var/have_node2 = node2?1:0 - icon_state = "exposed[have_node1][have_node2]" - if(!node1&&!node2) - qdel(src) - - initialize() - for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions)) - if(target.initialize_directions & get_dir(target,src)) - node1 = target - break - for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src,initialize_directions_he)) - if(target.initialize_directions_he & get_dir(target,src)) - node2 = target - break - - update_icon() - return + return diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index 833ff4b93d1..53858c331f2 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -1,4 +1,4 @@ -obj/machinery/atmospherics/pipe +/obj/machinery/atmospherics/pipe var/datum/gas_mixture/air_temporary //used when reconstructing a pipeline that broke var/datum/pipeline/parent @@ -14,802 +14,803 @@ obj/machinery/atmospherics/pipe var/alert_pressure = 80*ONE_ATMOSPHERE //minimum pressure before check_pressure(...) should be called - proc/pipeline_expansion() - return null +/obj/machinery/atmospherics/pipe/proc/pipeline_expansion() + return null - proc/check_pressure(pressure) - //Return 1 if parent should continue checking other pipes - //Return null if parent should stop checking other pipes. Recall: del(src) will by default return null +/obj/machinery/atmospherics/pipe/proc/check_pressure(pressure) + //Return 1 if parent should continue checking other pipes + //Return null if parent should stop checking other pipes. Recall: del(src) will by default return null - return 1 + return 1 - return_air() - if(!parent) - parent = new /datum/pipeline() - parent.build_pipeline(src) +/obj/machinery/atmospherics/pipe/return_air() + if(!parent) + parent = new /datum/pipeline() + parent.build_pipeline(src) - return parent.air + return parent.air - build_network() - if(!parent) - parent = new /datum/pipeline() - parent.build_pipeline(src) +/obj/machinery/atmospherics/pipe/build_network() + if(!parent) + parent = new /datum/pipeline() + parent.build_pipeline(src) - return parent.return_network() + return parent.return_network() - network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - if(!parent) - parent = new /datum/pipeline() - parent.build_pipeline(src) +/obj/machinery/atmospherics/pipe/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) + if(!parent) + parent = new /datum/pipeline() + parent.build_pipeline(src) - return parent.network_expand(new_network, reference) + return parent.network_expand(new_network, reference) - return_network(obj/machinery/atmospherics/reference) - if(!parent) - parent = new /datum/pipeline() - parent.build_pipeline(src) +/obj/machinery/atmospherics/pipe/return_network(obj/machinery/atmospherics/reference) + if(!parent) + parent = new /datum/pipeline() + parent.build_pipeline(src) - return parent.return_network(reference) + return parent.return_network(reference) - Destroy() - del(parent) - if(air_temporary) - loc.assume_air(air_temporary) - del(air_temporary) +/obj/machinery/atmospherics/pipe/Destroy() + del(parent) + if(air_temporary) + loc.assume_air(air_temporary) + del(air_temporary) + ..() + +/obj/machinery/atmospherics/pipe/simple + icon = 'icons/obj/pipes.dmi' + icon_state = "intact-f" + + name = "pipe" + desc = "A one meter section of regular pipe" + + volume = 70 + + dir = SOUTH + initialize_directions = SOUTH|NORTH + + var/obj/machinery/atmospherics/node1 + var/obj/machinery/atmospherics/node2 + + var/minimum_temperature_difference = 300 + var/thermal_conductivity = 0 //WALL_HEAT_TRANSFER_COEFFICIENT No + + var/maximum_pressure = 70*ONE_ATMOSPHERE + var/fatigue_pressure = 55*ONE_ATMOSPHERE + alert_pressure = 55*ONE_ATMOSPHERE + + + level = 1 + +/obj/machinery/atmospherics/pipe/simple/New() + ..() + switch(dir) + if(SOUTH || NORTH) + initialize_directions = SOUTH|NORTH + if(EAST || WEST) + initialize_directions = EAST|WEST + if(NORTHEAST) + initialize_directions = NORTH|EAST + if(NORTHWEST) + initialize_directions = NORTH|WEST + if(SOUTHEAST) + initialize_directions = SOUTH|EAST + if(SOUTHWEST) + initialize_directions = SOUTH|WEST + + +/obj/machinery/atmospherics/pipe/simple/hide(var/i) + if(level == 1 && istype(loc, /turf/simulated)) + invisibility = i ? 101 : 0 + update_icon() + +/obj/machinery/atmospherics/pipe/simple/process() + if(!parent) //This should cut back on the overhead calling build_network thousands of times per cycle ..() + else + . = PROCESS_KILL - simple - icon = 'icons/obj/pipes.dmi' - icon_state = "intact-f" + /*if(!node1) + parent.mingle_with_turf(loc, volume) + if(!nodealert) + //world << "Missing node from [src] at [src.x],[src.y],[src.z]" + nodealert = 1 - name = "pipe" - desc = "A one meter section of regular pipe" - - volume = 70 - - dir = SOUTH - initialize_directions = SOUTH|NORTH - - var/obj/machinery/atmospherics/node1 - var/obj/machinery/atmospherics/node2 - - var/minimum_temperature_difference = 300 - var/thermal_conductivity = 0 //WALL_HEAT_TRANSFER_COEFFICIENT No - - var/maximum_pressure = 70*ONE_ATMOSPHERE - var/fatigue_pressure = 55*ONE_ATMOSPHERE - alert_pressure = 55*ONE_ATMOSPHERE + else if(!node2) + parent.mingle_with_turf(loc, volume) + if(!nodealert) + //world << "Missing node from [src] at [src.x],[src.y],[src.z]" + nodealert = 1 + else if (nodealert) + nodealert = 0 - level = 1 + else if(parent) + var/environment_temperature = 0 - New() - ..() - switch(dir) - if(SOUTH || NORTH) - initialize_directions = SOUTH|NORTH - if(EAST || WEST) - initialize_directions = EAST|WEST - if(NORTHEAST) - initialize_directions = NORTH|EAST - if(NORTHWEST) - initialize_directions = NORTH|WEST - if(SOUTHEAST) - initialize_directions = SOUTH|EAST - if(SOUTHWEST) - initialize_directions = SOUTH|WEST - - - hide(var/i) - if(level == 1 && istype(loc, /turf/simulated)) - invisibility = i ? 101 : 0 - update_icon() - - process() - if(!parent) //This should cut back on the overhead calling build_network thousands of times per cycle - ..() + if(istype(loc, /turf/simulated/)) + if(loc:blocks_air) + environment_temperature = loc:temperature else - . = PROCESS_KILL + var/datum/gas_mixture/environment = loc.return_air() + environment_temperature = environment.temperature - /*if(!node1) - parent.mingle_with_turf(loc, volume) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 + else + environment_temperature = loc:temperature - else if(!node2) - parent.mingle_with_turf(loc, volume) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (nodealert) - nodealert = 0 + var/datum/gas_mixture/pipe_air = return_air() + + if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) + parent.temperature_interact(loc, volume, thermal_conductivity) + */ //Screw you heat lag + +/obj/machinery/atmospherics/pipe/simple/check_pressure(pressure) + var/datum/gas_mixture/environment = loc.return_air() + + var/pressure_difference = pressure - environment.return_pressure() + + if(pressure_difference > maximum_pressure) + burst() + + else if(pressure_difference > fatigue_pressure) + //TODO: leak to turf, doing pfshhhhh + if(prob(5)) + burst() + + else return 1 + +/obj/machinery/atmospherics/pipe/simple/proc/burst() + src.visible_message("[src] bursts!"); + playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) + var/datum/effect/effect/system/harmless_smoke_spread/smoke = new + smoke.set_up(1,0, src.loc, 0) + smoke.start() + qdel(src) + +/obj/machinery/atmospherics/pipe/simple/proc/normalize_dir() + if(dir==3) + dir = 1 + else if(dir==12) + dir = 4 + +/obj/machinery/atmospherics/pipe/simple/Destroy() + if(node1) + node1.disconnect(src) + if(node2) + node2.disconnect(src) + + ..() + +/obj/machinery/atmospherics/pipe/simple/pipeline_expansion() + return list(node1, node2) + +/obj/machinery/atmospherics/pipe/simple/update_icon() + if(node1&&node2) + var/C = "" + switch(pipe_color) + if ("red") C = "-r" + if ("blue") C = "-b" + if ("cyan") C = "-c" + if ("green") C = "-g" + if ("yellow") C = "-y" + if ("purple") C = "-p" + icon_state = "intact[C][invisibility ? "-f" : "" ]" + + //var/node1_direction = get_dir(src, node1) + //var/node2_direction = get_dir(src, node2) + + //dir = node1_direction|node2_direction + + else + if(!node1&&!node2) + qdel(src) //TODO: silent deleting looks weird + var/have_node1 = node1?1:0 + var/have_node2 = node2?1:0 + icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]" - else if(parent) - var/environment_temperature = 0 +/obj/machinery/atmospherics/pipe/simple/initialize() + normalize_dir() + var/node1_dir + var/node2_dir - if(istype(loc, /turf/simulated/)) - if(loc:blocks_air) - environment_temperature = loc:temperature - else - var/datum/gas_mixture/environment = loc.return_air() - environment_temperature = environment.temperature + for(var/direction in cardinal) + if(direction&initialize_directions) + if (!node1_dir) + node1_dir = direction + else if (!node2_dir) + node2_dir = direction - else - environment_temperature = loc:temperature + for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) + if(target.initialize_directions & get_dir(target,src)) + node1 = target + break + for(var/obj/machinery/atmospherics/target in get_step(src,node2_dir)) + if(target.initialize_directions & get_dir(target,src)) + node2 = target + break - var/datum/gas_mixture/pipe_air = return_air() - if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) - parent.temperature_interact(loc, volume, thermal_conductivity) - */ //Screw you heat lag + var/turf/T = src.loc // hide if turf is not intact + hide(T.intact) + update_icon() + //update_icon() - check_pressure(pressure) - var/datum/gas_mixture/environment = loc.return_air() +/obj/machinery/atmospherics/pipe/simple/disconnect(obj/machinery/atmospherics/reference) + if(reference == node1) + if(istype(node1, /obj/machinery/atmospherics/pipe)) + del(parent) + node1 = null - var/pressure_difference = pressure - environment.return_pressure() + if(reference == node2) + if(istype(node2, /obj/machinery/atmospherics/pipe)) + del(parent) + node2 = null - if(pressure_difference > maximum_pressure) - burst() + update_icon() - else if(pressure_difference > fatigue_pressure) - //TODO: leak to turf, doing pfshhhhh - if(prob(5)) - burst() + return null - else return 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers + name="Scrubbers pipe" + pipe_color="red" + icon_state = "" - proc/burst() - src.visible_message("\red \bold [src] bursts!"); - playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new - smoke.set_up(1,0, src.loc, 0) - smoke.start() +/obj/machinery/atmospherics/pipe/simple/supply + name="Air supply pipe" + pipe_color="blue" + icon_state = "" + +/obj/machinery/atmospherics/pipe/simple/supplymain + name="Main air supply pipe" + pipe_color="purple" + icon_state = "" + +/obj/machinery/atmospherics/pipe/simple/general + name="Pipe" + pipe_color="" + icon_state = "" + +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible + level = 2 + icon_state = "intact-r" + +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden + level = 1 + icon_state = "intact-r-f" + +/obj/machinery/atmospherics/pipe/simple/supply/visible + level = 2 + icon_state = "intact-b" + +/obj/machinery/atmospherics/pipe/simple/supply/hidden + level = 1 + icon_state = "intact-b-f" + +/obj/machinery/atmospherics/pipe/simple/supplymain/visible + level = 2 + icon_state = "intact-p" + +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden + level = 1 + icon_state = "intact-p-f" + +/obj/machinery/atmospherics/pipe/simple/general/visible + level = 2 + icon_state = "intact" + +/obj/machinery/atmospherics/pipe/simple/general/hidden + level = 1 + icon_state = "intact-f" + +/obj/machinery/atmospherics/pipe/simple/yellow + name="Pipe" + pipe_color="yellow" + icon_state = "" + +/obj/machinery/atmospherics/pipe/simple/yellow/visible + level = 2 + icon_state = "intact-y" + +/obj/machinery/atmospherics/pipe/simple/yellow/hidden + level = 1 + icon_state = "intact-y-f" + + + +/obj/machinery/atmospherics/pipe/simple/insulated + icon = 'icons/obj/atmospherics/red_pipe.dmi' + icon_state = "intact" + + minimum_temperature_difference = 10000 + thermal_conductivity = 0 + maximum_pressure = 1000*ONE_ATMOSPHERE + fatigue_pressure = 900*ONE_ATMOSPHERE + alert_pressure = 900*ONE_ATMOSPHERE + + level = 2 + + +/obj/machinery/atmospherics/pipe/tank + icon = 'icons/obj/atmospherics/pipe_tank.dmi' + icon_state = "intact" + + name = "pressure tank" + desc = "A large vessel containing pressurized gas." + + volume = 10000 //in liters, 1 meters by 1 meters by 2 meters + + dir = SOUTH + initialize_directions = SOUTH + density = 1 + + can_unwrench = 0 + + var/obj/machinery/atmospherics/node1 + +/obj/machinery/atmospherics/pipe/tank/New() + initialize_directions = dir + ..() + +/obj/machinery/atmospherics/pipe/tank/process() + if(!parent) + ..() + else + . = PROCESS_KILL +/* if(!node1) + parent.mingle_with_turf(loc, 200) + if(!nodealert) + //world << "Missing node from [src] at [src.x],[src.y],[src.z]" + nodealert = 1 + else if (nodealert) + nodealert = 0 +*/ +/obj/machinery/atmospherics/pipe/tank/carbon_dioxide + name = "pressure tank (Carbon Dioxide)" + +/obj/machinery/atmospherics/pipe/tank/carbon_dioxide/New() + air_temporary = new + air_temporary.volume = volume + air_temporary.temperature = T20C + + air_temporary.carbon_dioxide = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + + ..() + +/obj/machinery/atmospherics/pipe/tank/toxins + icon = 'icons/obj/atmospherics/orange_pipe_tank.dmi' + name = "pressure tank (Plasma)" + +/obj/machinery/atmospherics/pipe/tank/toxins/New() + air_temporary = new + air_temporary.volume = volume + air_temporary.temperature = T20C + + air_temporary.toxins = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + + ..() + +/obj/machinery/atmospherics/pipe/tank/oxygen_agent_b + icon = 'icons/obj/atmospherics/red_orange_pipe_tank.dmi' + name = "pressure tank (Oxygen + Plasma)" + +/obj/machinery/atmospherics/pipe/tank/oxygen_agent_b/New() + air_temporary = new + air_temporary.volume = volume + air_temporary.temperature = T0C + + var/datum/gas/oxygen_agent_b/trace_gas = new + trace_gas.moles = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + + air_temporary.trace_gases += trace_gas + + ..() + +/obj/machinery/atmospherics/pipe/tank/oxygen + icon = 'icons/obj/atmospherics/blue_pipe_tank.dmi' + name = "pressure tank (Oxygen)" + +/obj/machinery/atmospherics/pipe/tank/oxygen/New() + air_temporary = new + air_temporary.volume = volume + air_temporary.temperature = T20C + + air_temporary.oxygen = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + + ..() + +/obj/machinery/atmospherics/pipe/tank/nitrogen + icon = 'icons/obj/atmospherics/red_pipe_tank.dmi' + name = "pressure tank (Nitrogen)" + +/obj/machinery/atmospherics/pipe/tank/nitrogen/New() + air_temporary = new + air_temporary.volume = volume + air_temporary.temperature = T20C + + air_temporary.nitrogen = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + + ..() + +/obj/machinery/atmospherics/pipe/tank/air + icon = 'icons/obj/atmospherics/red_pipe_tank.dmi' + name = "pressure tank (Air)" + +/obj/machinery/atmospherics/pipe/tank/air/New() + air_temporary = new + air_temporary.volume = volume + air_temporary.temperature = T20C + + air_temporary.oxygen = (25*ONE_ATMOSPHERE*O2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + air_temporary.nitrogen = (25*ONE_ATMOSPHERE*N2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + + ..() + +/obj/machinery/atmospherics/pipe/tank/Destroy() + if(node1) + node1.disconnect(src) + + ..() + +/obj/machinery/atmospherics/pipe/tank/pipeline_expansion() + return list(node1) + +/obj/machinery/atmospherics/pipe/tank/update_icon() + if(node1) + icon_state = "intact" + + dir = get_dir(src, node1) + + else + icon_state = "exposed" + +/obj/machinery/atmospherics/pipe/tank/initialize() + + var/connect_direction = dir + + for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction)) + if(target.initialize_directions & get_dir(target,src)) + node1 = target + break + + update_icon() + +/obj/machinery/atmospherics/pipe/tank/disconnect(obj/machinery/atmospherics/reference) + if(reference == node1) + if(istype(node1, /obj/machinery/atmospherics/pipe)) + del(parent) + node1 = null + + update_icon() + + return null + +/obj/machinery/atmospherics/pipe/tank/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (istype(W, /obj/item/device/analyzer) && get_dist(user, src) <= 1) + atmosanalyzer_scan(parent.air, user) + +/obj/machinery/atmospherics/pipe/vent + icon = 'icons/obj/atmospherics/pipe_vent.dmi' + icon_state = "intact" + + name = "vent" + desc = "A large air vent" + + level = 1 + + volume = 250 + + dir = SOUTH + initialize_directions = SOUTH + + can_unwrench = 0 + + var/build_killswitch = 1 + + var/obj/machinery/atmospherics/node1 + +/obj/machinery/atmospherics/pipe/vent/New() + initialize_directions = dir + ..() + +/obj/machinery/atmospherics/pipe/vent/process() + if(!parent) + if(build_killswitch <= 0) + . = PROCESS_KILL + else + build_killswitch-- + ..() + return + else + parent.mingle_with_turf(loc, 250) +/* + if(!node1) + if(!nodealert) + //world << "Missing node from [src] at [src.x],[src.y],[src.z]" + nodealert = 1 + else if (nodealert) + nodealert = 0 +*/ +/obj/machinery/atmospherics/pipe/vent/Destroy() + if(node1) + node1.disconnect(src) + + ..() + +/obj/machinery/atmospherics/pipe/vent/pipeline_expansion() + return list(node1) + +/obj/machinery/atmospherics/pipe/vent/update_icon() + if(node1) + icon_state = "intact" + + dir = get_dir(src, node1) + + else + icon_state = "exposed" + +/obj/machinery/atmospherics/pipe/vent/initialize() + var/connect_direction = dir + + for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction)) + if(target.initialize_directions & get_dir(target,src)) + node1 = target + break + + update_icon() + +/obj/machinery/atmospherics/pipe/vent/disconnect(obj/machinery/atmospherics/reference) + if(reference == node1) + if(istype(node1, /obj/machinery/atmospherics/pipe)) + del(parent) + node1 = null + + update_icon() + + return null + +/obj/machinery/atmospherics/pipe/vent/hide(var/i) //to make the little pipe section invisible, the icon changes. + if(node1) + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]intact" + dir = get_dir(src, node1) + else + icon_state = "exposed" + +/obj/machinery/atmospherics/pipe/manifold + icon = 'icons/obj/atmospherics/pipe_manifold.dmi' + icon_state = "manifold-f" + + name = "pipe manifold" + desc = "A manifold composed of regular pipes" + + volume = 105 + + dir = SOUTH + initialize_directions = EAST|NORTH|WEST + + var/obj/machinery/atmospherics/node1 + var/obj/machinery/atmospherics/node2 + var/obj/machinery/atmospherics/node3 + + level = 1 + layer = 2.4 //under wires with their 2.44 + +/obj/machinery/atmospherics/pipe/manifold/New() + switch(dir) + if(NORTH) + initialize_directions = EAST|SOUTH|WEST + if(SOUTH) + initialize_directions = WEST|NORTH|EAST + if(EAST) + initialize_directions = SOUTH|WEST|NORTH + if(WEST) + initialize_directions = NORTH|EAST|SOUTH + + ..() + + + +/obj/machinery/atmospherics/pipe/manifold/hide(var/i) + if(level == 1 && istype(loc, /turf/simulated)) + invisibility = i ? 101 : 0 + update_icon() + +/obj/machinery/atmospherics/pipe/manifold/pipeline_expansion() + return list(node1, node2, node3) + +/obj/machinery/atmospherics/pipe/manifold/process() + if(!parent) + ..() + else + . = PROCESS_KILL +/* + if(!node1) + parent.mingle_with_turf(loc, 70) + if(!nodealert) + //world << "Missing node from [src] at [src.x],[src.y],[src.z]" + nodealert = 1 + else if(!node2) + parent.mingle_with_turf(loc, 70) + if(!nodealert) + //world << "Missing node from [src] at [src.x],[src.y],[src.z]" + nodealert = 1 + else if(!node3) + parent.mingle_with_turf(loc, 70) + if(!nodealert) + //world << "Missing node from [src] at [src.x],[src.y],[src.z]" + nodealert = 1 + else if (nodealert) + nodealert = 0 +*/ +/obj/machinery/atmospherics/pipe/manifold/Destroy() + if(node1) + node1.disconnect(src) + if(node2) + node2.disconnect(src) + if(node3) + node3.disconnect(src) + + ..() + +/obj/machinery/atmospherics/pipe/manifold/disconnect(obj/machinery/atmospherics/reference) + if(reference == node1) + if(istype(node1, /obj/machinery/atmospherics/pipe)) + del(parent) + node1 = null + + if(reference == node2) + if(istype(node2, /obj/machinery/atmospherics/pipe)) + del(parent) + node2 = null + + if(reference == node3) + if(istype(node3, /obj/machinery/atmospherics/pipe)) + del(parent) + node3 = null + + update_icon() + + ..() + +/obj/machinery/atmospherics/pipe/manifold/update_icon() + if(node1&&node2&&node3) + var/C = "" + switch(pipe_color) + if ("red") C = "-r" + if ("blue") C = "-b" + if ("cyan") C = "-c" + if ("green") C = "-g" + if ("yellow") C = "-y" + if ("purple") C = "-p" + icon_state = "manifold[C][invisibility ? "-f" : ""]" + + else + var/connected = 0 + var/unconnected = 0 + var/connect_directions = (NORTH|SOUTH|EAST|WEST)&(~dir) + + if(node1) + connected |= get_dir(src, node1) + if(node2) + connected |= get_dir(src, node2) + if(node3) + connected |= get_dir(src, node3) + + unconnected = (~connected)&(connect_directions) + + icon_state = "manifold_[connected]_[unconnected]" + + if(!connected) qdel(src) - proc/normalize_dir() - if(dir==3) - dir = 1 - else if(dir==12) - dir = 4 + return - Destroy() - if(node1) - node1.disconnect(src) - if(node2) - node2.disconnect(src) +/obj/machinery/atmospherics/pipe/manifold/initialize() + var/connect_directions = (NORTH|SOUTH|EAST|WEST)&(~dir) - ..() - - pipeline_expansion() - return list(node1, node2) - - update_icon() - if(node1&&node2) - var/C = "" - switch(pipe_color) - if ("red") C = "-r" - if ("blue") C = "-b" - if ("cyan") C = "-c" - if ("green") C = "-g" - if ("yellow") C = "-y" - if ("purple") C = "-p" - icon_state = "intact[C][invisibility ? "-f" : "" ]" - - //var/node1_direction = get_dir(src, node1) - //var/node2_direction = get_dir(src, node2) - - //dir = node1_direction|node2_direction - - else - if(!node1&&!node2) - qdel(src) //TODO: silent deleting looks weird - var/have_node1 = node1?1:0 - var/have_node2 = node2?1:0 - icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]" - - - initialize() - normalize_dir() - var/node1_dir - var/node2_dir - - for(var/direction in cardinal) - if(direction&initialize_directions) - if (!node1_dir) - node1_dir = direction - else if (!node2_dir) - node2_dir = direction - - for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) + for(var/direction in cardinal) + if(direction&connect_directions) + for(var/obj/machinery/atmospherics/target in get_step(src,direction)) if(target.initialize_directions & get_dir(target,src)) node1 = target + connect_directions &= ~direction break - for(var/obj/machinery/atmospherics/target in get_step(src,node2_dir)) + if (node1) + break + + + for(var/direction in cardinal) + if(direction&connect_directions) + for(var/obj/machinery/atmospherics/target in get_step(src,direction)) if(target.initialize_directions & get_dir(target,src)) node2 = target + connect_directions &= ~direction break + if (node2) + break - var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) - update_icon() - //update_icon() - - disconnect(obj/machinery/atmospherics/reference) - if(reference == node1) - if(istype(node1, /obj/machinery/atmospherics/pipe)) - del(parent) - node1 = null - - if(reference == node2) - if(istype(node2, /obj/machinery/atmospherics/pipe)) - del(parent) - node2 = null - - update_icon() - - return null - - simple/scrubbers - name="Scrubbers pipe" - pipe_color="red" - icon_state = "" - - simple/supply - name="Air supply pipe" - pipe_color="blue" - icon_state = "" - - simple/supplymain - name="Main air supply pipe" - pipe_color="purple" - icon_state = "" - - simple/general - name="Pipe" - pipe_color="" - icon_state = "" - - simple/scrubbers/visible - level = 2 - icon_state = "intact-r" - - simple/scrubbers/hidden - level = 1 - icon_state = "intact-r-f" - - simple/supply/visible - level = 2 - icon_state = "intact-b" - - simple/supply/hidden - level = 1 - icon_state = "intact-b-f" - - simple/supplymain/visible - level = 2 - icon_state = "intact-p" - - simple/supplymain/hidden - level = 1 - icon_state = "intact-p-f" - - simple/general/visible - level = 2 - icon_state = "intact" - - simple/general/hidden - level = 1 - icon_state = "intact-f" - - simple/yellow - name="Pipe" - pipe_color="yellow" - icon_state = "" - - simple/yellow/visible - level = 2 - icon_state = "intact-y" - - simple/yellow/hidden - level = 1 - icon_state = "intact-y-f" - - - - simple/insulated - icon = 'icons/obj/atmospherics/red_pipe.dmi' - icon_state = "intact" - - minimum_temperature_difference = 10000 - thermal_conductivity = 0 - maximum_pressure = 1000*ONE_ATMOSPHERE - fatigue_pressure = 900*ONE_ATMOSPHERE - alert_pressure = 900*ONE_ATMOSPHERE - - level = 2 - - - tank - icon = 'icons/obj/atmospherics/pipe_tank.dmi' - icon_state = "intact" - - name = "pressure tank" - desc = "A large vessel containing pressurized gas." - - volume = 10000 //in liters, 1 meters by 1 meters by 2 meters - - dir = SOUTH - initialize_directions = SOUTH - density = 1 - - can_unwrench = 0 - - var/obj/machinery/atmospherics/node1 - - New() - initialize_directions = dir - ..() - - process() - if(!parent) - ..() - else - . = PROCESS_KILL -/* if(!node1) - parent.mingle_with_turf(loc, 200) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (nodealert) - nodealert = 0 -*/ - carbon_dioxide - name = "pressure tank (Carbon Dioxide)" - - New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.carbon_dioxide = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - ..() - - toxins - icon = 'icons/obj/atmospherics/orange_pipe_tank.dmi' - name = "pressure tank (Plasma)" - - New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.toxins = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - ..() - - oxygen_agent_b - icon = 'icons/obj/atmospherics/red_orange_pipe_tank.dmi' - name = "pressure tank (Oxygen + Plasma)" - - New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T0C - - var/datum/gas/oxygen_agent_b/trace_gas = new - trace_gas.moles = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - air_temporary.trace_gases += trace_gas - - ..() - - oxygen - icon = 'icons/obj/atmospherics/blue_pipe_tank.dmi' - name = "pressure tank (Oxygen)" - - New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.oxygen = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - ..() - - nitrogen - icon = 'icons/obj/atmospherics/red_pipe_tank.dmi' - name = "pressure tank (Nitrogen)" - - New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.nitrogen = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - ..() - - air - icon = 'icons/obj/atmospherics/red_pipe_tank.dmi' - name = "pressure tank (Air)" - - New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.oxygen = (25*ONE_ATMOSPHERE*O2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - air_temporary.nitrogen = (25*ONE_ATMOSPHERE*N2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - ..() - - Destroy() - if(node1) - node1.disconnect(src) - - ..() - - pipeline_expansion() - return list(node1) - - update_icon() - if(node1) - icon_state = "intact" - - dir = get_dir(src, node1) - - else - icon_state = "exposed" - - initialize() - - var/connect_direction = dir - - for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction)) + for(var/direction in cardinal) + if(direction&connect_directions) + for(var/obj/machinery/atmospherics/target in get_step(src,direction)) if(target.initialize_directions & get_dir(target,src)) - node1 = target + node3 = target + connect_directions &= ~direction break - - update_icon() - - disconnect(obj/machinery/atmospherics/reference) - if(reference == node1) - if(istype(node1, /obj/machinery/atmospherics/pipe)) - del(parent) - node1 = null - - update_icon() - - return null - - attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (istype(W, /obj/item/device/analyzer) && get_dist(user, src) <= 1) - atmosanalyzer_scan(parent.air, user) - - vent - icon = 'icons/obj/atmospherics/pipe_vent.dmi' - icon_state = "intact" - - name = "vent" - desc = "A large air vent" - - level = 1 - - volume = 250 - - dir = SOUTH - initialize_directions = SOUTH - - can_unwrench = 0 - - var/build_killswitch = 1 - - var/obj/machinery/atmospherics/node1 - New() - initialize_directions = dir - ..() - - process() - if(!parent) - if(build_killswitch <= 0) - . = PROCESS_KILL - else - build_killswitch-- - ..() - return - else - parent.mingle_with_turf(loc, 250) -/* - if(!node1) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (nodealert) - nodealert = 0 -*/ - Destroy() - if(node1) - node1.disconnect(src) - - ..() - - pipeline_expansion() - return list(node1) - - update_icon() - if(node1) - icon_state = "intact" - - dir = get_dir(src, node1) - - else - icon_state = "exposed" - - initialize() - var/connect_direction = dir - - for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction)) - if(target.initialize_directions & get_dir(target,src)) - node1 = target - break - - update_icon() - - disconnect(obj/machinery/atmospherics/reference) - if(reference == node1) - if(istype(node1, /obj/machinery/atmospherics/pipe)) - del(parent) - node1 = null - - update_icon() - - return null - - hide(var/i) //to make the little pipe section invisible, the icon changes. - if(node1) - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]intact" - dir = get_dir(src, node1) - else - icon_state = "exposed" - - manifold - icon = 'icons/obj/atmospherics/pipe_manifold.dmi' - icon_state = "manifold-f" - - name = "pipe manifold" - desc = "A manifold composed of regular pipes" - - volume = 105 - - dir = SOUTH - initialize_directions = EAST|NORTH|WEST - - var/obj/machinery/atmospherics/node1 - var/obj/machinery/atmospherics/node2 - var/obj/machinery/atmospherics/node3 - - level = 1 - layer = 2.4 //under wires with their 2.44 - - New() - switch(dir) - if(NORTH) - initialize_directions = EAST|SOUTH|WEST - if(SOUTH) - initialize_directions = WEST|NORTH|EAST - if(EAST) - initialize_directions = SOUTH|WEST|NORTH - if(WEST) - initialize_directions = NORTH|EAST|SOUTH - - ..() - - - - hide(var/i) - if(level == 1 && istype(loc, /turf/simulated)) - invisibility = i ? 101 : 0 - update_icon() - - pipeline_expansion() - return list(node1, node2, node3) - - process() - if(!parent) - ..() - else - . = PROCESS_KILL -/* - if(!node1) - parent.mingle_with_turf(loc, 70) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if(!node2) - parent.mingle_with_turf(loc, 70) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if(!node3) - parent.mingle_with_turf(loc, 70) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (nodealert) - nodealert = 0 -*/ - Destroy() - if(node1) - node1.disconnect(src) - if(node2) - node2.disconnect(src) - if(node3) - node3.disconnect(src) - - ..() - - disconnect(obj/machinery/atmospherics/reference) - if(reference == node1) - if(istype(node1, /obj/machinery/atmospherics/pipe)) - del(parent) - node1 = null - - if(reference == node2) - if(istype(node2, /obj/machinery/atmospherics/pipe)) - del(parent) - node2 = null - - if(reference == node3) - if(istype(node3, /obj/machinery/atmospherics/pipe)) - del(parent) - node3 = null - - update_icon() - - ..() - - update_icon() - if(node1&&node2&&node3) - var/C = "" - switch(pipe_color) - if ("red") C = "-r" - if ("blue") C = "-b" - if ("cyan") C = "-c" - if ("green") C = "-g" - if ("yellow") C = "-y" - if ("purple") C = "-p" - icon_state = "manifold[C][invisibility ? "-f" : ""]" - - else - var/connected = 0 - var/unconnected = 0 - var/connect_directions = (NORTH|SOUTH|EAST|WEST)&(~dir) - - if(node1) - connected |= get_dir(src, node1) - if(node2) - connected |= get_dir(src, node2) - if(node3) - connected |= get_dir(src, node3) - - unconnected = (~connected)&(connect_directions) - - icon_state = "manifold_[connected]_[unconnected]" - - if(!connected) - qdel(src) - - return - - initialize() - var/connect_directions = (NORTH|SOUTH|EAST|WEST)&(~dir) - - for(var/direction in cardinal) - if(direction&connect_directions) - for(var/obj/machinery/atmospherics/target in get_step(src,direction)) - if(target.initialize_directions & get_dir(target,src)) - node1 = target - connect_directions &= ~direction - break - if (node1) - break - - - for(var/direction in cardinal) - if(direction&connect_directions) - for(var/obj/machinery/atmospherics/target in get_step(src,direction)) - if(target.initialize_directions & get_dir(target,src)) - node2 = target - connect_directions &= ~direction - break - if (node2) - break - - - for(var/direction in cardinal) - if(direction&connect_directions) - for(var/obj/machinery/atmospherics/target in get_step(src,direction)) - if(target.initialize_directions & get_dir(target,src)) - node3 = target - connect_directions &= ~direction - break - if (node3) - break - - var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) - //update_icon() - update_icon() - - manifold/scrubbers - name="Scrubbers pipe" - pipe_color="red" - icon_state = "" - - manifold/supply - name="Air supply pipe" - pipe_color="blue" - icon_state = "" - - manifold/supplymain - name="Main air supply pipe" - pipe_color="purple" - icon_state = "" - - manifold/general - name="Air supply pipe" - pipe_color="gray" - icon_state = "" - - manifold/yellow - name="Air supply pipe" - pipe_color="yellow" - icon_state = "" - - manifold/scrubbers/visible - level = 2 - icon_state = "manifold-r" - - manifold/scrubbers/hidden - level = 1 - icon_state = "manifold-r-f" - - manifold/supply/visible - level = 2 - icon_state = "manifold-b" - - manifold/supply/hidden - level = 1 - icon_state = "manifold-b-f" - - manifold/supplymain/visible - level = 2 - icon_state = "manifold-p" - - manifold/supplymain/hidden - level = 1 - icon_state = "manifold-p-f" - - manifold/general/visible - level = 2 - icon_state = "manifold" - - manifold/general/hidden - level = 1 - icon_state = "manifold-f" - - manifold/yellow/visible - level = 2 - icon_state = "manifold-y" - - manifold/yellow/hidden - level = 1 - icon_state = "manifold-y-f" + if (node3) + break + + var/turf/T = src.loc // hide if turf is not intact + hide(T.intact) + //update_icon() + update_icon() + +/obj/machinery/atmospherics/pipe/manifold/scrubbers + name="Scrubbers pipe" + pipe_color="red" + icon_state = "" + +/obj/machinery/atmospherics/pipe/manifold/supply + name="Air supply pipe" + pipe_color="blue" + icon_state = "" + +/obj/machinery/atmospherics/pipe/manifold/supplymain + name="Main air supply pipe" + pipe_color="purple" + icon_state = "" + +/obj/machinery/atmospherics/pipe/manifold/general + name="Air supply pipe" + pipe_color="gray" + icon_state = "" + +/obj/machinery/atmospherics/pipe/manifold/yellow + name="Air supply pipe" + pipe_color="yellow" + icon_state = "" + +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible + level = 2 + icon_state = "manifold-r" + +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden + level = 1 + icon_state = "manifold-r-f" + +/obj/machinery/atmospherics/pipe/manifold/supply/visible + level = 2 + icon_state = "manifold-b" + +/obj/machinery/atmospherics/pipe/manifold/supply/hidden + level = 1 + icon_state = "manifold-b-f" + +/obj/machinery/atmospherics/pipe/manifold/supplymain/visible + level = 2 + icon_state = "manifold-p" + +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden + level = 1 + icon_state = "manifold-p-f" + +/obj/machinery/atmospherics/pipe/manifold/general/visible + level = 2 + icon_state = "manifold" + +/obj/machinery/atmospherics/pipe/manifold/general/hidden + level = 1 + icon_state = "manifold-f" + +/obj/machinery/atmospherics/pipe/manifold/yellow/visible + level = 2 + icon_state = "manifold-y" + +/obj/machinery/atmospherics/pipe/manifold/yellow/hidden + level = 1 + icon_state = "manifold-y-f" obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if (istype(W, /obj/item/device/analyzer) && get_dist(user, src) <= 1) diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm index 5089252dc59..37eb751e194 100644 --- a/code/LINDA/LINDA_fire.dm +++ b/code/LINDA/LINDA_fire.dm @@ -144,9 +144,9 @@ /obj/effect/hotspot/proc/Kill() air_master.hotspots -= src DestroyTurf() - garbage_collect() + qdel(src) -/obj/effect/hotspot/proc/garbage_collect() +/obj/effect/hotspot/Destroy() if(istype(loc, /turf/simulated)) var/turf/simulated/T = loc if(T.active_hotspot == src) diff --git a/code/LINDA/LINDA_system.dm b/code/LINDA/LINDA_system.dm index 71b6bcc47c0..63bc81b63f4 100644 --- a/code/LINDA/LINDA_system.dm +++ b/code/LINDA/LINDA_system.dm @@ -17,7 +17,7 @@ datum/controller/air_system /datum/controller/air_system/proc/setup() set background = BACKGROUND_ENABLED - world << "\red \b Processing Geometry..." + world << "Processing Geometry..." sleep(1) var/start_time = world.timeofday @@ -26,7 +26,7 @@ datum/controller/air_system global_activeturfs = active_turfs.len - world << "\red \b Geometry processed in [(world.timeofday-start_time)/10] seconds!" + world << "Geometry processed in [(world.timeofday-start_time)/10] seconds!" /datum/controller/air_system/proc/process() if(kill_air) diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm index 5b63966de76..98e9574b0bb 100644 --- a/code/LINDA/LINDA_turf_tile.dm +++ b/code/LINDA/LINDA_turf_tile.dm @@ -66,7 +66,7 @@ turf/simulated/New() turf/simulated/Del() if(active_hotspot) - active_hotspot.garbage_collect() + qdel(active_hotspot) ..() turf/simulated/assume_air(datum/gas_mixture/giver) diff --git a/code/WorkInProgress/buildmode.dm b/code/WorkInProgress/buildmode.dm index 8073684f64b..d7150693bfd 100644 --- a/code/WorkInProgress/buildmode.dm +++ b/code/WorkInProgress/buildmode.dm @@ -46,65 +46,67 @@ /obj/effect/bmode/builddir icon_state = "build" screen_loc = "NORTH,WEST" - Click() - switch(dir) - if(NORTH) - dir = EAST - if(EAST) - dir = SOUTH - if(SOUTH) - dir = WEST - if(WEST) - dir = NORTHWEST - if(NORTHWEST) - dir = NORTH - return 1 + +/obj/effect/bmode/builddir/Click() + switch(dir) + if(NORTH) + dir = EAST + if(EAST) + dir = SOUTH + if(SOUTH) + dir = WEST + if(WEST) + dir = NORTHWEST + if(NORTHWEST) + dir = NORTH + return 1 /obj/effect/bmode/buildhelp icon = 'icons/misc/buildmode.dmi' icon_state = "buildhelp" screen_loc = "NORTH,WEST+1" - Click() - switch(master.cl.buildmode) - if(1) - usr << "\blue ***********************************************************" - usr << "\blue Left Mouse Button = Construct / Upgrade" - usr << "\blue Right Mouse Button = Deconstruct / Delete / Downgrade" - usr << "\blue Left Mouse Button + ctrl = R-Window" - usr << "\blue Left Mouse Button + alt = Airlock" - usr << "" - usr << "\blue Use the button in the upper left corner to" - usr << "\blue change the direction of built objects." - usr << "\blue ***********************************************************" - if(2) - usr << "\blue ***********************************************************" - usr << "\blue Right Mouse Button on buildmode button = Set object type" - usr << "\blue Left Mouse Button on turf/obj = Place objects" - usr << "\blue Right Mouse Button = Delete objects" - usr << "" - usr << "\blue Use the button in the upper left corner to" - usr << "\blue change the direction of built objects." - usr << "\blue ***********************************************************" - if(3) - usr << "\blue ***********************************************************" - usr << "\blue Right Mouse Button on buildmode button = Select var(type) & value" - usr << "\blue Left Mouse Button on turf/obj/mob = Set var(type) & value" - usr << "\blue Right Mouse Button on turf/obj/mob = Reset var's value" - usr << "\blue ***********************************************************" - if(4) - usr << "\blue ***********************************************************" - usr << "\blue Left Mouse Button on turf/obj/mob = Throw" - usr << "\blue Right Mouse Button on turf/obj/mob = Select" - usr << "\blue ***********************************************************" - return 1 + +/obj/effect/bmode/buildhelp/Click() + switch(master.cl.buildmode) + if(1) + usr << "\blue ***********************************************************" + usr << "\blue Left Mouse Button = Construct / Upgrade" + usr << "\blue Right Mouse Button = Deconstruct / Delete / Downgrade" + usr << "\blue Left Mouse Button + ctrl = R-Window" + usr << "\blue Left Mouse Button + alt = Airlock" + usr << "" + usr << "\blue Use the button in the upper left corner to" + usr << "\blue change the direction of built objects." + usr << "\blue ***********************************************************" + if(2) + usr << "\blue ***********************************************************" + usr << "\blue Right Mouse Button on buildmode button = Set object type" + usr << "\blue Left Mouse Button on turf/obj = Place objects" + usr << "\blue Right Mouse Button = Delete objects" + usr << "" + usr << "\blue Use the button in the upper left corner to" + usr << "\blue change the direction of built objects." + usr << "\blue ***********************************************************" + if(3) + usr << "\blue ***********************************************************" + usr << "\blue Right Mouse Button on buildmode button = Select var(type) & value" + usr << "\blue Left Mouse Button on turf/obj/mob = Set var(type) & value" + usr << "\blue Right Mouse Button on turf/obj/mob = Reset var's value" + usr << "\blue ***********************************************************" + if(4) + usr << "\blue ***********************************************************" + usr << "\blue Left Mouse Button on turf/obj/mob = Throw" + usr << "\blue Right Mouse Button on turf/obj/mob = Select" + usr << "\blue ***********************************************************" + return 1 /obj/effect/bmode/buildquit icon_state = "buildquit" screen_loc = "NORTH,WEST+3" - Click() - togglebuildmode(master.cl.mob) - return 1 +/obj/effect/bmode/buildquit/Click() + togglebuildmode(master.cl.mob) + return 1 /obj/effect/bmode/buildholder density = 0 @@ -123,56 +125,56 @@ var/valueholder = "derp" var/objholder = /obj/structure/closet - Click(location, control, params) - var/list/pa = params2list(params) +/obj/effect/bmode/buildmode/Click(location, control, params) + var/list/pa = params2list(params) - if(pa.Find("left")) - switch(master.cl.buildmode) - if(1) - master.cl.buildmode = 2 - src.icon_state = "buildmode2" - if(2) - master.cl.buildmode = 3 - src.icon_state = "buildmode3" - if(3) - master.cl.buildmode = 4 - src.icon_state = "buildmode4" - if(4) - master.cl.buildmode = 1 - src.icon_state = "buildmode1" + if(pa.Find("left")) + switch(master.cl.buildmode) + if(1) + master.cl.buildmode = 2 + src.icon_state = "buildmode2" + if(2) + master.cl.buildmode = 3 + src.icon_state = "buildmode3" + if(3) + master.cl.buildmode = 4 + src.icon_state = "buildmode4" + if(4) + master.cl.buildmode = 1 + src.icon_state = "buildmode1" - else if(pa.Find("right")) - switch(master.cl.buildmode) - if(1) - return 1 - if(2) - objholder = text2path(input(usr,"Enter typepath:" ,"Typepath","/obj/structure/closet")) - if(!ispath(objholder)) + else if(pa.Find("right")) + switch(master.cl.buildmode) + if(1) + return 1 + if(2) + objholder = text2path(input(usr,"Enter typepath:" ,"Typepath","/obj/structure/closet")) + if(!ispath(objholder)) + objholder = /obj/structure/closet + alert("That path is not allowed.") + else + if(ispath(objholder,/mob) && !check_rights(R_DEBUG,0)) objholder = /obj/structure/closet - alert("That path is not allowed.") - else - if(ispath(objholder,/mob) && !check_rights(R_DEBUG,0)) - objholder = /obj/structure/closet - if(3) - var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "viruses", "cuffed", "ka", "last_eaten", "urine") + if(3) + var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "viruses", "cuffed", "ka", "last_eaten", "urine") - master.buildmode.varholder = input(usr,"Enter variable name:" ,"Name", "name") - if(master.buildmode.varholder in locked && !check_rights(R_DEBUG,0)) - return 1 - var/thetype = input(usr,"Select variable type:" ,"Type") in list("text","number","mob-reference","obj-reference","turf-reference") - if(!thetype) return 1 - switch(thetype) - if("text") - master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value", "value") as text - if("number") - master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value", 123) as num - if("mob-reference") - master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as mob in mob_list - if("obj-reference") - master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as obj in world - if("turf-reference") - master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as turf in world - return 1 + master.buildmode.varholder = input(usr,"Enter variable name:" ,"Name", "name") + if(master.buildmode.varholder in locked && !check_rights(R_DEBUG,0)) + return 1 + var/thetype = input(usr,"Select variable type:" ,"Type") in list("text","number","mob-reference","obj-reference","turf-reference") + if(!thetype) return 1 + switch(thetype) + if("text") + master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value", "value") as text + if("number") + master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value", 123) as num + if("mob-reference") + master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as mob in mob_list + if("obj-reference") + master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as obj in world + if("turf-reference") + master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as turf in world + return 1 /proc/build_click(var/mob/user, buildmode, params, var/obj/object) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index b86d5e613b5..5b189df3aed 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -1,20 +1,22 @@ /* These defines are specific to the atom/flags bitmask */ +#define ALL ~0 //For convenience. +#define NONE 0 + //FLAGS BITMASK #define STOPSPRESSUREDMAGE 1 //This flag is used on the flags variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere //To successfully stop you taking all pressure damage you must have both a suit and head item with this flag. -#define NODROP 2 // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted. -#define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby() -#define MASKINTERNALS 8 // mask allows internals -//#define SUITSPACE 8 // suit protects against space -//#define USEDELAY 16 // For adding extra delay to heavy items, not currently used -#define NOSHIELD 32 // weapon not affected by shield -#define CONDUCT 64 // conducts electricity (metal etc.) -#define ABSTRACT 128 // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way -#define FPRINT 256 // takes a fingerprint -#define ON_BORDER 512 // item has priority to check when entering or leaving +#define NODROP 2 // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted. +#define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby() +#define MASKINTERNALS 8 // mask allows internals +#define HEAR 16 // This flag is what recursive_hear_check() uses to determine wether to add an item to the hearer list or not. +#define NOSHIELD 32 // weapon not affected by shield +#define CONDUCT 64 // conducts electricity (metal etc.) +#define ABSTRACT 128 // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way +#define FPRINT 256 // takes a fingerprint +#define ON_BORDER 512 // item has priority to check when entering or leaving #define GLASSESCOVERSEYES 1024 @@ -61,4 +63,14 @@ #define NOBREATH 256 #define NOGUNS 512 #define NOBLOOD 1024 -#define NOFIRE 2048 \ No newline at end of file +#define NOFIRE 2048 + +/* + These defines are used specifically with the atom/movable/languages bitmask. + They are used in atom/movable/Hear() and atom/movable/say() to determine whether hearers can understand a message. +*/ +#define HUMAN 1 +#define MONKEY 2 +#define ALIEN 4 +#define ROBOT 8 +#define SLIME 16 diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 25c256322ef..66998d42a31 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -34,4 +34,9 @@ #define CLICK_CD_MELEE 8 #define CLICK_CD_RANGE 4 -//click cooldowns, in tenths of a second \ No newline at end of file +//click cooldowns, in tenths of a second + + +#define BE_CLOSE 1 //in the case of a silicon, to select if they need to be next to the atom +#define NO_DEXTERY 1 //if other mobs (monkeys, aliens, etc) can use this +//used by canUseTopic() \ No newline at end of file diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 8f118599e67..9e0496a9249 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -12,8 +12,9 @@ #define CHAT_RADIO 512 #define MEMBER_PUBLIC 1024 #define CHAT_PULLR 2048 +#define INTENT_STYLE 4096 -#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|MEMBER_PUBLIC|CHAT_PULLR) +#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|MEMBER_PUBLIC|CHAT_PULLR|INTENT_STYLE) #define BE_TRAITOR 1 #define BE_OPERATIVE 2 diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 12ba4ad3ff8..440a907e527 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -32,7 +32,7 @@ // Like view but bypasses luminosity check -/proc/hear(var/range, var/atom/source) +/proc/get_hear(var/range, var/atom/source) var/lum = source.luminosity source.luminosity = 6 @@ -131,14 +131,30 @@ return turfs +//This is the new version of recursive_mob_check, used for say(). +//The other proc was left intact because morgue trays use it. +/proc/recursive_hear_check(var/atom/O) + var/list/processing_list = list(O) + var/list/processed_list = list() + var/list/found_mobs = list() -//var/debug_mob = 0 + while(processing_list.len) + var/atom/A = processing_list[1] + if(A.flags & HEAR) + found_mobs |= A + + for(var/atom/B in A) + if(!processed_list[B]) + processing_list |= B + + processing_list.Cut(1, 2) + processed_list[A] = A + + return found_mobs // Better recursive loop, technically sort of not actually recursive cause that shit is retarded, enjoy. -//No need for a recursive limit either - - -proc/recursive_mob_check(var/atom/O,var/client_check=1,var/sight_check=1,var/include_radio=1) +//No need for a recursive limit either +/proc/recursive_mob_check(var/atom/O,var/client_check=1,var/sight_check=1,var/include_radio=1) var/list/processing_list = list(O) var/list/processed_list = list() @@ -177,25 +193,22 @@ proc/recursive_mob_check(var/atom/O,var/client_check=1,var/sight_check=1,var/inc return found_mobs - -proc/get_mobs_in_view(var/R, var/atom/source) - // Returns a list of mobs in range of R from source. Used in radio and say code. - + +/proc/get_hearers_in_view(var/R, var/atom/source) + // Returns a list of hearers in range of R from source. Used in saycode. var/turf/T = get_turf(source) var/list/hear = list() if(!T) return hear - var/list/range = hear(R, T) - + var/list/range = get_hear(R, T) for(var/atom/movable/A in range) - hear |= recursive_mob_check(A, 1, 0, 1) + hear |= recursive_hear_check(A) return hear - /proc/get_mobs_in_radio_ranges(var/list/obj/item/device/radio/radios) set background = BACKGROUND_ENABLED @@ -208,7 +221,7 @@ proc/get_mobs_in_view(var/R, var/atom/source) if(R) var/turf/speaker = get_turf(R) if(speaker) - for(var/turf/T in hear(R.canhear_range,speaker)) + for(var/turf/T in get_hear(R.canhear_range,speaker)) speaker_coverage[T] = T @@ -222,41 +235,42 @@ proc/get_mobs_in_view(var/R, var/atom/source) . |= M return . + #define SIGN(X) ((X<0)?-1:1) -proc - inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5) - var/turf/T - if(X1==X2) - if(Y1==Y2) - return 1 //Light cannot be blocked on same tile - else - var/s = SIGN(Y2-Y1) - Y1+=s - while(Y1!=Y2) - T=locate(X1,Y1,Z) - if(T.opacity) - return 0 - Y1+=s +/proc/inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5) + var/turf/T + if(X1==X2) + if(Y1==Y2) + return 1 //Light cannot be blocked on same tile else - var/m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1)) - var/b=(Y1+PY1/32-0.015625)-m*(X1+PX1/32-0.015625) //In tiles - var/signX = SIGN(X2-X1) - var/signY = SIGN(Y2-Y1) - if(X1 transparent, gray -> translucent white, white -> solid white - proc/BecomeAlphaMask() - SwapColor(null, "#000000ff") // don't let transparent become gray - MapColors(0,0,0,0.3, 0,0,0,0.59, 0,0,0,0.11, 0,0,0,0, 1,1,1,0) +// Change a grayscale icon into a white icon where the original color becomes the alpha +// I.e., black -> transparent, gray -> translucent white, white -> solid white +/icon/proc/BecomeAlphaMask() + SwapColor(null, "#000000ff") // don't let transparent become gray + MapColors(0,0,0,0.3, 0,0,0,0.59, 0,0,0,0.11, 0,0,0,0, 1,1,1,0) - proc/UseAlphaMask(mask) - Opaque() - AddAlphaMask(mask) +/icon/proc/UseAlphaMask(mask) + Opaque() + AddAlphaMask(mask) - proc/AddAlphaMask(mask) - var/icon/M = new(mask) - M.Blend("#ffffff", ICON_SUBTRACT) - // apply mask - Blend(M, ICON_ADD) +/icon/proc/AddAlphaMask(mask) + var/icon/M = new(mask) + M.Blend("#ffffff", ICON_SUBTRACT) + // apply mask + Blend(M, ICON_ADD) /* HSV format is represented as "#hhhssvv" or "#hhhssvvaa" @@ -307,7 +307,7 @@ icon Higher value means brighter color */ -proc/ReadRGB(rgb) +/proc/ReadRGB(rgb) if(!rgb) return // interpret the HSV or HSVA value @@ -357,7 +357,7 @@ proc/ReadRGB(rgb) . = list(r, g, b) if(usealpha) . += alpha -proc/ReadHSV(hsv) +/proc/ReadHSV(hsv) if(!hsv) return // interpret the HSV or HSVA value @@ -396,7 +396,7 @@ proc/ReadHSV(hsv) . = list(hue, sat, val) if(usealpha) . += alpha -proc/HSVtoRGB(hsv) +/proc/HSVtoRGB(hsv) if(!hsv) return "#000000" var/list/HSV = ReadHSV(hsv) if(!HSV) return "#000000" @@ -424,7 +424,7 @@ proc/HSVtoRGB(hsv) return (HSV.len > 3) ? rgb(r,g,b,HSV[4]) : rgb(r,g,b) -proc/RGBtoHSV(rgb) +/proc/RGBtoHSV(rgb) if(!rgb) return "#0000000" var/list/RGB = ReadRGB(rgb) if(!RGB) return "#0000000" @@ -455,7 +455,7 @@ proc/RGBtoHSV(rgb) return hsv(hue, sat, val, (RGB.len>3 ? RGB[4] : null)) -proc/hsv(hue, sat, val, alpha) +/proc/hsv(hue, sat, val, alpha) if(hue < 0 || hue >= 1536) hue %= 1536 if(hue < 0) hue += 1536 if((hue & 0xFF) == 0xFF) @@ -488,7 +488,7 @@ proc/hsv(hue, sat, val, alpha) amount<0 or amount>1 are allowed */ -proc/BlendHSV(hsv1, hsv2, amount) +/proc/BlendHSV(hsv1, hsv2, amount) var/list/HSV1 = ReadHSV(hsv1) var/list/HSV2 = ReadHSV(hsv2) @@ -542,7 +542,7 @@ proc/BlendHSV(hsv1, hsv2, amount) amount<0 or amount>1 are allowed */ -proc/BlendRGB(rgb1, rgb2, amount) +/proc/BlendRGB(rgb1, rgb2, amount) var/list/RGB1 = ReadRGB(rgb1) var/list/RGB2 = ReadRGB(rgb2) @@ -558,10 +558,10 @@ proc/BlendRGB(rgb1, rgb2, amount) return isnull(alpha) ? rgb(r, g, b) : rgb(r, g, b, alpha) -proc/BlendRGBasHSV(rgb1, rgb2, amount) +/proc/BlendRGBasHSV(rgb1, rgb2, amount) return HSVtoRGB(RGBtoHSV(rgb1), RGBtoHSV(rgb2), amount) -proc/HueToAngle(hue) +/proc/HueToAngle(hue) // normalize hsv in case anything is screwy if(hue < 0 || hue >= 1536) hue %= 1536 if(hue < 0) hue += 1536 @@ -569,7 +569,7 @@ proc/HueToAngle(hue) hue -= hue >> 8 return hue / (1530/360) -proc/AngleToHue(angle) +/proc/AngleToHue(angle) // normalize hsv in case anything is screwy if(angle < 0 || angle >= 360) angle -= 360 * round(angle / 360) var/hue = angle * (1530/360) @@ -579,7 +579,7 @@ proc/AngleToHue(angle) // positive angle rotates forward through red->green->blue -proc/RotateHue(hsv, angle) +/proc/RotateHue(hsv, angle) var/list/HSV = ReadHSV(hsv) // normalize hsv in case anything is screwy @@ -601,13 +601,13 @@ proc/RotateHue(hsv, angle) return hsv(HSV[1], HSV[2], HSV[3], (HSV.len > 3 ? HSV[4] : null)) // Convert an rgb color to grayscale -proc/GrayScale(rgb) +/proc/GrayScale(rgb) var/list/RGB = ReadRGB(rgb) var/gray = RGB[1]*0.3 + RGB[2]*0.59 + RGB[3]*0.11 return (RGB.len > 3) ? rgb(gray, gray, gray, RGB[4]) : rgb(gray, gray, gray) // Change grayscale color to black->tone->white range -proc/ColorTone(rgb, tone) +/proc/ColorTone(rgb, tone) var/list/RGB = ReadRGB(rgb) var/list/TONE = ReadRGB(tone) @@ -624,148 +624,148 @@ as a single icon. Useful for when you want to manipulate an icon via the above a The _flatIcons list is a cache for generated icon files. */ -proc // Creates a single icon from a given /atom or /image. Only the first argument is required. - getFlatIcon(image/A, defdir=A.dir, deficon=A.icon, defstate=A.icon_state, defblend=A.blend_mode) - // We start with a blank canvas, otherwise some icon procs crash silently - var/icon/flat = icon('icons/effects/effects.dmi', "nothing") // Final flattened icon - if(!A) - return flat - if(A.alpha <= 0) - return flat - var/noIcon = FALSE +// Creates a single icon from a given /atom or /image. Only the first argument is required. +/proc/getFlatIcon(image/A, defdir=A.dir, deficon=A.icon, defstate=A.icon_state, defblend=A.blend_mode) + // We start with a blank canvas, otherwise some icon procs crash silently + var/icon/flat = icon('icons/effects/effects.dmi', "nothing") // Final flattened icon + if(!A) + return flat + if(A.alpha <= 0) + return flat + var/noIcon = FALSE - var/curicon - if(A.icon) - curicon = A.icon + var/curicon + if(A.icon) + curicon = A.icon + else + curicon = deficon + + if(!curicon) + noIcon = TRUE // Do not render this object. + + var/curstate + if(A.icon_state) + curstate = A.icon_state + else + curstate = defstate + + if(!noIcon && !(curstate in icon_states(curicon))) + if("" in icon_states(curicon)) + curstate = "" else - curicon = deficon - - if(!curicon) noIcon = TRUE // Do not render this object. - var/curstate - if(A.icon_state) - curstate = A.icon_state - else - curstate = defstate + var/curdir + if(A.dir != 2) + curdir = A.dir + else + curdir = defdir - if(!noIcon && !(curstate in icon_states(curicon))) - if("" in icon_states(curicon)) - curstate = "" - else - noIcon = TRUE // Do not render this object. + var/curblend + if(A.blend_mode == BLEND_DEFAULT) + curblend = defblend + else + curblend = A.blend_mode - var/curdir - if(A.dir != 2) - curdir = A.dir - else - curdir = defdir + // Layers will be a sorted list of icons/overlays, based on the order in which they are displayed + var/list/layers = list() + var/image/copy + // Add the atom's icon itself, without pixel_x/y offsets. + if(!noIcon) + copy = image(icon=curicon, icon_state=curstate, layer=A.layer, dir=curdir) + copy.color = A.color + copy.alpha = A.alpha + copy.blend_mode = curblend + layers[copy] = A.layer - var/curblend - if(A.blend_mode == BLEND_DEFAULT) - curblend = defblend - else - curblend = A.blend_mode + // Loop through the underlays, then overlays, sorting them into the layers list + var/list/process = A.underlays // Current list being processed + var/pSet=0 // Which list is being processed: 0 = underlays, 1 = overlays + var/curIndex=1 // index of 'current' in list being processed + var/current // Current overlay being sorted + var/currentLayer // Calculated layer that overlay appears on (special case for FLOAT_LAYER) + var/compare // The overlay 'add' is being compared against + var/cmpIndex // The index in the layers list of 'compare' + while(TRUE) + if(curIndex<=process.len) + current = process[curIndex] + if(!current) continue + currentLayer = current:layer + if(currentLayer<0) // Special case for FLY_LAYER + if(currentLayer <= -1000) return flat + if(pSet == 0) // Underlay + currentLayer = A.layer+currentLayer/1000 + else // Overlay + currentLayer = A.layer+(1000+currentLayer)/1000 - // Layers will be a sorted list of icons/overlays, based on the order in which they are displayed - var/list/layers = list() - var/image/copy - // Add the atom's icon itself, without pixel_x/y offsets. - if(!noIcon) - copy = image(icon=curicon, icon_state=curstate, layer=A.layer, dir=curdir) - copy.color = A.color - copy.alpha = A.alpha - copy.blend_mode = curblend - layers[copy] = A.layer - - // Loop through the underlays, then overlays, sorting them into the layers list - var/list/process = A.underlays // Current list being processed - var/pSet=0 // Which list is being processed: 0 = underlays, 1 = overlays - var/curIndex=1 // index of 'current' in list being processed - var/current // Current overlay being sorted - var/currentLayer // Calculated layer that overlay appears on (special case for FLOAT_LAYER) - var/compare // The overlay 'add' is being compared against - var/cmpIndex // The index in the layers list of 'compare' - while(TRUE) - if(curIndex<=process.len) - current = process[curIndex] - if(!current) continue - currentLayer = current:layer - if(currentLayer<0) // Special case for FLY_LAYER - if(currentLayer <= -1000) return flat - if(pSet == 0) // Underlay - currentLayer = A.layer+currentLayer/1000 - else // Overlay - currentLayer = A.layer+(1000+currentLayer)/1000 - - // Sort add into layers list - for(cmpIndex=1,cmpIndex<=layers.len,cmpIndex++) - compare = layers[cmpIndex] - if(currentLayer < layers[compare]) // Associated value is the calculated layer - layers.Insert(cmpIndex,current) - layers[current] = currentLayer - break - if(cmpIndex>layers.len) // Reached end of list without inserting - layers[current]=currentLayer // Place at end - - curIndex++ - - if(curIndex>process.len) - if(pSet == 0) // Switch to overlays - curIndex = 1 - pSet = 1 - process = A.overlays - else // All done + // Sort add into layers list + for(cmpIndex=1,cmpIndex<=layers.len,cmpIndex++) + compare = layers[cmpIndex] + if(currentLayer < layers[compare]) // Associated value is the calculated layer + layers.Insert(cmpIndex,current) + layers[current] = currentLayer break + if(cmpIndex>layers.len) // Reached end of list without inserting + layers[current]=currentLayer // Place at end - var/icon/add // Icon of overlay being added + curIndex++ - // Current dimensions of flattened icon - var/{flatX1=1;flatX2=flat.Width();flatY1=1;flatY2=flat.Height()} - // Dimensions of overlay being added - var/{addX1;addX2;addY1;addY2} + if(curIndex>process.len) + if(pSet == 0) // Switch to overlays + curIndex = 1 + pSet = 1 + process = A.overlays + else // All done + break - for(var/I in layers) + var/icon/add // Icon of overlay being added - if(I:alpha == 0) - continue + // Current dimensions of flattened icon + var/{flatX1=1;flatX2=flat.Width();flatY1=1;flatY2=flat.Height()} + // Dimensions of overlay being added + var/{addX1;addX2;addY1;addY2} - if(I == copy) // 'I' is an /image based on the object being flattened. - curblend = BLEND_OVERLAY - add = icon(I:icon, I:icon_state, I:dir) - else // 'I' is an appearance object. - add = getFlatIcon(new/image(I), curdir, curicon, curstate, curblend) + for(var/I in layers) - // Find the new dimensions of the flat icon to fit the added overlay - addX1 = min(flatX1, I:pixel_x+1) - addX2 = max(flatX2, I:pixel_x+add.Width()) - addY1 = min(flatY1, I:pixel_y+1) - addY2 = max(flatY2, I:pixel_y+add.Height()) + if(I:alpha == 0) + continue - if(addX1!=flatX1 || addX2!=flatX2 || addY1!=flatY1 || addY2!=flatY2) - // Resize the flattened icon so the new icon fits - flat.Crop(addX1-flatX1+1, addY1-flatY1+1, addX2-flatX1+1, addY2-flatY1+1) - flatX1=addX1;flatX2=addX2 - flatY1=addY1;flatY2=addY2 + if(I == copy) // 'I' is an /image based on the object being flattened. + curblend = BLEND_OVERLAY + add = icon(I:icon, I:icon_state, I:dir) + else // 'I' is an appearance object. + add = getFlatIcon(new/image(I), curdir, curicon, curstate, curblend) - // Blend the overlay into the flattened icon - flat.Blend(add, blendMode2iconMode(curblend), I:pixel_x + 2 - flatX1, I:pixel_y + 2 - flatY1) + // Find the new dimensions of the flat icon to fit the added overlay + addX1 = min(flatX1, I:pixel_x+1) + addX2 = max(flatX2, I:pixel_x+add.Width()) + addY1 = min(flatY1, I:pixel_y+1) + addY2 = max(flatY2, I:pixel_y+add.Height()) - if(A.color) - flat.Blend(A.color, ICON_MULTIPLY) - if(A.alpha < 255) - flat.Blend(rgb(255, 255, 255, A.alpha), ICON_MULTIPLY) + if(addX1!=flatX1 || addX2!=flatX2 || addY1!=flatY1 || addY2!=flatY2) + // Resize the flattened icon so the new icon fits + flat.Crop(addX1-flatX1+1, addY1-flatY1+1, addX2-flatX1+1, addY2-flatY1+1) + flatX1=addX1;flatX2=addX2 + flatY1=addY1;flatY2=addY2 - return icon(flat, "", SOUTH) + // Blend the overlay into the flattened icon + flat.Blend(add, blendMode2iconMode(curblend), I:pixel_x + 2 - flatX1, I:pixel_y + 2 - flatY1) - getIconMask(atom/A)//By yours truly. Creates a dynamic mask for a mob/whatever. /N - var/icon/alpha_mask = new(A.icon,A.icon_state)//So we want the default icon and icon state of A. - for(var/I in A.overlays)//For every image in overlays. var/image/I will not work, don't try it. - if(I:layer>A.layer) continue//If layer is greater than what we need, skip it. - var/icon/image_overlay = new(I:icon,I:icon_state)//Blend only works with icon objects. - //Also, icons cannot directly set icon_state. Slower than changing variables but whatever. - alpha_mask.Blend(image_overlay,ICON_OR)//OR so they are lumped together in a nice overlay. - return alpha_mask//And now return the mask. + if(A.color) + flat.Blend(A.color, ICON_MULTIPLY) + if(A.alpha < 255) + flat.Blend(rgb(255, 255, 255, A.alpha), ICON_MULTIPLY) + + return icon(flat, "", SOUTH) + +/proc/getIconMask(atom/A)//By yours truly. Creates a dynamic mask for a mob/whatever. /N + var/icon/alpha_mask = new(A.icon,A.icon_state)//So we want the default icon and icon state of A. + for(var/I in A.overlays)//For every image in overlays. var/image/I will not work, don't try it. + if(I:layer>A.layer) continue//If layer is greater than what we need, skip it. + var/icon/image_overlay = new(I:icon,I:icon_state)//Blend only works with icon objects. + //Also, icons cannot directly set icon_state. Slower than changing variables but whatever. + alpha_mask.Blend(image_overlay,ICON_OR)//OR so they are lumped together in a nice overlay. + return alpha_mask//And now return the mask. /mob/proc/AddCamoOverlay(atom/A)//A is the atom which we are using as the overlay. var/icon/opacity_icon = new(A.icon, A.icon_state)//Don't really care for overlays/underlays. @@ -797,4 +797,4 @@ proc // Creates a single icon from a given /atom or /image. Only the first argu for(var/O in A.overlays) var/image/I = O composite.Blend(icon(I.icon, I.icon_state, I.dir, 1), ICON_OVERLAY) - return composite \ No newline at end of file + return composite diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 09081948d13..eb44cf81c71 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -31,7 +31,7 @@ return "[output][and_text][input[index]]" //Returns list element or null. Should prevent "index out of bounds" error. -proc/listgetindex(list/L, index) +/proc/listgetindex(list/L, index) if(istype(L)) if(isnum(index)) if(IsInRange(index,1,L.len)) @@ -40,18 +40,18 @@ proc/listgetindex(list/L, index) return L[index] return -proc/islist(list/L) +/proc/islist(list/L) if(istype(L)) return 1 return 0 //Return either pick(list) or null if list is not of type /list or is empty -proc/safepick(list/L) +/proc/safepick(list/L) if(istype(L) && L.len) return pick(L) //Checks if the list is empty -proc/isemptylist(list/L) +/proc/isemptylist(list/L) if(!L.len) return 1 return 0 @@ -64,13 +64,13 @@ proc/isemptylist(list/L) return 0 //Empties the list by setting the length to 0. Hopefully the elements get garbage collected -proc/clearlist(list/list) +/proc/clearlist(list/list) if(istype(list)) list.len = 0 return //Removes any null entries from the list -proc/listclearnulls(list/list) +/proc/listclearnulls(list/list) if(istype(list)) while(null in list) list -= null @@ -144,6 +144,26 @@ proc/listclearnulls(list/list) pos-- L.Insert(pos+1, thing) +// Returns the next item in a list +/proc/next_list_item(var/item, var/list/L) + var/i + i = L.Find(item) + if(i == L.len) + i = 1 + else + i++ + return L[i] + +// Returns the previous item in a list +/proc/previous_list_item(var/item, var/list/L) + var/i + i = L.Find(item) + if(i == 1) + i = L.len + else + i-- + return L[i] + /* * Sorting */ diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 6b53dcaa221..f833a5589d8 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -18,19 +18,19 @@ if(FEMALE) return pick(underwear_f) else return pick(underwear_all) -proc/random_hair_style(gender) +/proc/random_hair_style(gender) switch(gender) if(MALE) return pick(hair_styles_male_list) if(FEMALE) return pick(hair_styles_female_list) else return pick(hair_styles_list) -proc/random_facial_hair_style(gender) +/proc/random_facial_hair_style(gender) switch(gender) if(MALE) return pick(facial_hair_styles_male_list) if(FEMALE) return pick(facial_hair_styles_female_list) else return pick(facial_hair_styles_list) -proc/random_name(gender, attempts_to_find_unique_name=10) +/proc/random_name(gender, attempts_to_find_unique_name=10) for(var/i=1, i<=attempts_to_find_unique_name, i++) if(gender==FEMALE) . = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) else . = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) @@ -38,7 +38,7 @@ proc/random_name(gender, attempts_to_find_unique_name=10) if(i != attempts_to_find_unique_name && !findname(.)) break -proc/random_skin_tone() +/proc/random_skin_tone() return pick(skin_tones) var/list/skin_tones = list( @@ -59,7 +59,7 @@ var/list/skin_tones = list( var/global/list/species_list[0] var/global/list/roundstart_species[0] -proc/age2agedescription(age) +/proc/age2agedescription(age) switch(age) if(0 to 1) return "infant" if(1 to 3) return "toddler" @@ -82,7 +82,7 @@ Proc for attack log creation, because really why not 6 is additional information, anything that needs to be added */ -proc/add_logs(mob/user, mob/target, what_done, var/admin=1, var/object=null, var/addition=null) +/proc/add_logs(mob/user, mob/target, what_done, var/admin=1, var/object=null, var/addition=null) if(user && ismob(user)) user.attack_log += text("\[[time_stamp()]\] Has [what_done] [target ? "[target.name][(ismob(target) && target.ckey) ? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]") if(target && ismob(target)) diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index b894a997d47..f7caa812336 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -48,12 +48,13 @@ var/religion_name = null return station_name if(events) - var/short_name = pick("Station", "Fortress", "Frontier", "Suffix", "Death-trap", "Space-hulk", "Lab", "Hazard","Spess Junk", "Fishery", "No-Moon", "Tomb", "Crypt", "Hut", "Monkey", "Bomb", "Trade Post", "Fortress", "Village", "Town", "City", "Edition", "Hive", "Complex", "Base", "Facility", "Depot", "Outpost", "Installation", "Drydock", "Observatory", "Array", "Relay", "Monitor", "Platform", "Construct", "Hangar", "Prison", "Center", "Port", "Waystation", "Factory", "Waypoint", "Stopover", "Hub", "HQ", "Office", "Object", "Fortification", "Colony", "Planet-Cracker", "Roost", "Fat Camp") - - station_name = new_station_name() + if (config && config.station_name) + station_name = config.station_name + else + station_name = new_station_name() if (config && config.server_name) - world.name = "[config.server_name]: [short_name]" + world.name = "[config.server_name][config.server_name==station_name ? "" : ": [station_name]"]" else world.name = station_name @@ -108,17 +109,6 @@ var/religion_name = null new_station_name += pick("13","XIII","Thirteen") return new_station_name -/proc/world_name(var/name) - - station_name = name - - if (config && config.server_name) - world.name = "[config.server_name]: [name]" - else - world.name = name - - return name - var/syndicate_name = null /proc/syndicate_name() if (syndicate_name) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index aa06a595039..ebf047212fc 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -16,7 +16,7 @@ // Run all strings to be used in an SQL query through this proc first to properly escape out injection attempts. /proc/sanitizeSQL(var/t as text) var/sqltext = dbcon.Quote(t); - return copytext(sqltext, 2, lentext(sqltext)-1);//Quote() adds quotes around input, we already do that + return copytext(sqltext, 2, lentext(sqltext));//Quote() adds quotes around input, we already do that /* * Text sanitization @@ -359,4 +359,4 @@ var/list/binary = list("0","1") for(var/i=1, i<=len, i++) temp = findtextEx(haystack, ascii2text(text2ascii(needles,i)), start, end) //Note: ascii2text(text2ascii) is faster than copytext() if(temp) end = temp - return end \ No newline at end of file + return end diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index bf1bacc94f8..66168dcc939 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -1,11 +1,11 @@ //Returns the world time in english -proc/worldtime2text() +/proc/worldtime2text() return gameTimestamp("hh:mm") -proc/time_stamp(var/format = "hh:mm:ss") +/proc/time_stamp(var/format = "hh:mm:ss") return time2text(world.timeofday, format) -proc/gameTimestamp(var/format = "hh:mm:ss") // Get the game time in text +/proc/gameTimestamp(var/format = "hh:mm:ss") // Get the game time in text return time2text(world.time - timezoneOffset + 432000, format) /* Preserving this so future generations can see how fucking retarded some people are @@ -23,7 +23,7 @@ proc/time_stamp() */ /* Returns 1 if it is the selected month and day */ -proc/isDay(var/month, var/day) +/proc/isDay(var/month, var/day) if(isnum(month) && isnum(day)) var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 8e748e94a97..24cb285cb27 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -283,6 +283,7 @@ Turf and target are seperate in case you want to teleport some distance from a t //Turns 1479 into 147.9 /proc/format_frequency(var/f) + f = text2num(f) return "[round(f / 10)].[f % 10]" @@ -418,13 +419,16 @@ Turf and target are seperate in case you want to teleport some distance from a t . += R //Returns a list of AI's -/proc/active_ais() +/proc/active_ais(var/check_mind=0) . = list() for(var/mob/living/silicon/ai/A in living_mob_list) if(A.stat == DEAD) continue if(A.control_disabled == 1) continue + if(check_mind) + if(!A.mind) + continue . += A return . @@ -433,7 +437,7 @@ Turf and target are seperate in case you want to teleport some distance from a t var/mob/living/silicon/ai/selected var/list/active = active_ais() for(var/mob/living/silicon/ai/A in active) - if(!selected || (selected.connected_robots > A.connected_robots)) + if(!selected || (selected.connected_robots.len > A.connected_robots.len)) selected = A return selected @@ -645,12 +649,12 @@ Turf and target are seperate in case you want to teleport some distance from a t var/y = min(world.maxy, max(1, A.y + dy)) return locate(x,y,A.z) -proc/arctan(x) +/proc/arctan(x) var/y=arcsin(x/sqrt(1+x*x)) return y -proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,flick_anim as text,sleeptime = 0,direction as num) +/proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,flick_anim as text,sleeptime = 0,direction as num) //This proc throws up either an icon or an animation for a specified amount of time. //The variables should be apparent enough. var/atom/movable/overlay/animation = new(location) @@ -668,7 +672,7 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl qdel(animation) -atom/proc/GetAllContents() +/atom/proc/GetAllContents() var/list/processing_list = list(src) var/list/assembled = list() @@ -685,7 +689,7 @@ atom/proc/GetAllContents() return assembled -atom/proc/GetTypeInAllContents(typepath) +/atom/proc/GetTypeInAllContents(typepath) var/list/processing_list = list(src) var/list/processed = list() @@ -1012,7 +1016,7 @@ atom/proc/GetTypeInAllContents(typepath) -proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) +/proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) if(!original) return null @@ -1160,16 +1164,16 @@ proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) -proc/get_cardinal_dir(atom/A, atom/B) +/proc/get_cardinal_dir(atom/A, atom/B) var/dx = abs(B.x - A.x) var/dy = abs(B.y - A.y) return get_dir(A, B) & (rand() * (dx+dy) < dy ? 3 : 12) //chances are 1:value. anyprob(1) will always return true -proc/anyprob(value) +/proc/anyprob(value) return (rand(1,value)==value) -proc/view_or_range(distance = world.view , center = usr , type) +/proc/view_or_range(distance = world.view , center = usr , type) switch(type) if("view") . = view(distance,center) @@ -1177,7 +1181,7 @@ proc/view_or_range(distance = world.view , center = usr , type) . = range(distance,center) return -proc/oview_or_orange(distance = world.view , center = usr , type) +/proc/oview_or_orange(distance = world.view , center = usr , type) switch(type) if("view") . = oview(distance,center) @@ -1225,7 +1229,7 @@ var/global/list/common_tools = list( return 1 return 0 -proc/is_hot(obj/item/W as obj) +/proc/is_hot(obj/item/W as obj) switch(W.type) if(/obj/item/weapon/weldingtool) var/obj/item/weapon/weldingtool/WT = W @@ -1331,11 +1335,11 @@ var/list/WALLITEMS = list( /obj/proc/atmosanalyzer_scan(var/datum/gas_mixture/air_contents, mob/user, var/obj/target = src) var/obj/icon = target - user.visible_message("\red [user] has used the analyzer on \icon[icon] [target].") + user.visible_message("[user] has used the analyzer on \icon[icon] [target].") var/pressure = air_contents.return_pressure() var/total_moles = air_contents.total_moles() - user << "\blue Results of analysis of \icon[icon] [target]." + user << "Results of analysis of \icon[icon] [target]." if(total_moles>0) var/o2_concentration = air_contents.oxygen/total_moles var/n2_concentration = air_contents.nitrogen/total_moles @@ -1344,16 +1348,16 @@ var/list/WALLITEMS = list( var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration) - user << "\blue Pressure: [round(pressure,0.1)] kPa" - user << "\blue Nitrogen: [round(n2_concentration*100)]%" - user << "\blue Oxygen: [round(o2_concentration*100)]%" - user << "\blue CO2: [round(co2_concentration*100)]%" - user << "\blue Plasma: [round(plasma_concentration*100)]%" + user << "Pressure: [round(pressure,0.1)] kPa" + user << "Nitrogen: [round(n2_concentration*100)]%" + user << "Oxygen: [round(o2_concentration*100)]%" + user << "CO2: [round(co2_concentration*100)]%" + user << "Plasma: [round(plasma_concentration*100)]%" if(unknown_concentration>0.01) - user << "\red Unknown: [round(unknown_concentration*100)]%" - user << "\blue Temperature: [round(air_contents.temperature-T0C)]°C" + user << "Unknown: [round(unknown_concentration*100)]%" + user << "Temperature: [round(air_contents.temperature-T0C)]°C" else - user << "\blue [target] is empty!" + user << "[target] is empty!" return /proc/check_target_facings(mob/living/initator, mob/living/target) diff --git a/code/_globalvars/game_modes.dm b/code/_globalvars/game_modes.dm index 519987d8880..0e43d1f89e8 100644 --- a/code/_globalvars/game_modes.dm +++ b/code/_globalvars/game_modes.dm @@ -3,4 +3,4 @@ var/master_mode = "traitor"//"extended" var/secret_force_mode = "secret" // if this is anything but "secret", the secret rotation will forceably choose this mode var/wavesecret = 0 // meteor mode, delays wave progression, terrible name -var/datum/station_state/start_state = null // Used in blob mode +var/datum/station_state/start_state = null // Used in round-end report diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index ca4c3bb6d91..2d26a49903f 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -38,6 +38,7 @@ var/list/prisonsecuritywarp = list() //prison security goes to these var/list/prisonwarped = list() //list of players already warped var/list/blobstart = list() var/list/secequipment = list() +var/list/deathsquadspawn = list() var/list/global_activeturfs //away missions diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index c90a8c19dbb..87d1feeb1e4 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -138,10 +138,12 @@ /obj/machinery/power/apc/AICtrlClick() // turns off/on APCs. toggle_breaker() + add_fingerprint(usr) /obj/machinery/turretid/AICtrlClick() //turns off/on Turrets src.enabled = !src.enabled src.updateTurrets() + add_fingerprint(usr) /atom/proc/AIAltClick(var/mob/living/silicon/ai/user) @@ -162,6 +164,7 @@ /obj/machinery/turretid/AIAltClick() //toggles lethal on turrets src.lethal = !src.lethal src.updateTurrets() + add_fingerprint(usr) // // Override TurfAdjacent for AltClicking diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index c67817e6463..f784638362a 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -285,7 +285,7 @@ nutrition = max(nutrition - rand(1,5),0) handle_regular_hud_updates() else - src << "\red You're out of energy! You need food!" + src << "You're out of energy! You need food!" // Simple helper to face what you clicked on, in case it should be needed in more than one place /mob/proc/face_atom(var/atom/A) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 69d5a23bb2b..f0dc1c3c720 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -46,6 +46,10 @@ RestrainedClickOn(A) return */ + if(aicamera.in_camera_mode) //Cyborg picture taking + aicamera.camera_mode_off() + aicamera.captureimage(A, usr) + return var/obj/item/W = get_active_hand() diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 5b8174a9650..932d14deeeb 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -50,6 +50,9 @@ #define ui_borg_module "CENTER+1:16,SOUTH:5" #define ui_borg_store "CENTER+2:16,SOUTH:5" //borgs +#define ui_borg_camera "CENTER+3:21,SOUTH:5" //borgs +#define ui_borg_album "CENTER+4:21,SOUTH:5" //borgs + #define ui_monkey_mask "CENTER-3:14,SOUTH:5" //monkey #define ui_monkey_back "CENTER-2:15,SOUTH:5" //monkey diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 813d44dfdf9..cdc83c0ba9f 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -45,6 +45,24 @@ //End of module select +//Photography stuff + + using = new /obj/screen() + using.icon = 'icons/mob/screen_ai.dmi' + using.icon_state = "take_picture" + using.name = "Take Image" + using.screen_loc = ui_borg_camera + using.layer = 20 + adding += using + + using = new /obj/screen() + using.icon = 'icons/mob/screen_ai.dmi' + using.icon_state = "view_images" + using.name = "View Images" + using.screen_loc = ui_borg_album + using.layer = 20 + adding += using + //Intent using = new /obj/screen() using.name = "act_intent" diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index cf22da2e3b6..ab0073a6e5a 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -247,8 +247,28 @@ C.internals.icon_state = "internal1" else C << "You don't have an oxygen tank." + if("act_intent") - usr.a_intent_change("right") + if(ishuman(usr) && (usr.client.prefs.toggles & INTENT_STYLE)) + + var/_x = text2num(params2list(params)["icon-x"]) + var/_y = text2num(params2list(params)["icon-y"]) + + if(_x<=16 && _y<=16) + usr.a_intent_change("harm") + + else if(_x<=16 && _y>=17) + usr.a_intent_change("help") + + else if(_x>=17 && _y<=16) + usr.a_intent_change("grab") + + else if(_x>=17 && _y>=17) + usr.a_intent_change("disarm") + + else + usr.a_intent_change("right") + if("pull") usr.stop_pulling() if("throw/catch") @@ -314,7 +334,7 @@ if("Crew Monitorting") if(isAI(usr)) var/mob/living/silicon/ai/AI = usr - crewmonitor(AI) + crewmonitor(AI,AI) if("Show Crew Manifest") if(isAI(usr)) @@ -355,11 +375,17 @@ if(isAI(usr)) var/mob/living/silicon/ai/AI = usr AI.aicamera.toggle_camera_mode() + else if(isrobot(usr)) + var/mob/living/silicon/robot/R = usr + R.aicamera.toggle_camera_mode() if("View Images") if(isAI(usr)) var/mob/living/silicon/ai/AI = usr AI.aicamera.viewpictures() + else if(isrobot(usr)) + var/mob/living/silicon/robot/R = usr + R.aicamera.viewpictures() else return 0 @@ -392,5 +418,4 @@ if(usr.attack_ui(slot_id)) usr.update_inv_l_hand(0) usr.update_inv_r_hand(0) - return 1 - + return 1 diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 8083c11d0a4..deaec8acf8a 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -6,9 +6,9 @@ if(!client) return client.inquisitive_ghost = !client.inquisitive_ghost if(client.inquisitive_ghost) - src << "\blue You will now examine everything you click on." + src << "You will now examine everything you click on." else - src << "\blue You will no longer examine things you click on." + src << "You will no longer examine things you click on." /mob/dead/observer/DblClickOn(var/atom/A, var/params) if(client.buildmode) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 46cbbab20f3..de62d80c321 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -84,7 +84,7 @@ ML.contract_disease(D,1,0) else for(var/mob/O in viewers(ML, null)) - O.show_message("\red [src] has attempted to bite [ML]!", 1) + O.show_message("[src] has attempted to bite [ML]!", 1) /* Aliens diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 1108d8cdbb7..0b6b63d249a 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -75,116 +75,116 @@ var/const/tk_maxrange = 15 var/mob/living/host = null - dropped(mob/user as mob) - if(focus && user && loc != user && loc != user.loc) // drop_item() gets called when you tk-attack a table/closet with an item - if(focus.Adjacent(loc)) - focus.loc = loc +/obj/item/tk_grab/dropped(mob/user as mob) + if(focus && user && loc != user && loc != user.loc) // drop_item() gets called when you tk-attack a table/closet with an item + if(focus.Adjacent(loc)) + focus.loc = loc + qdel(src) + return + + +//stops TK grabs being equipped anywhere but into hands +/obj/item/tk_grab/equipped(var/mob/user, var/slot) + if( (slot == slot_l_hand) || (slot== slot_r_hand) ) return + qdel(src) + return + + +/obj/item/tk_grab/attack_self(mob/user as mob) + if(focus) + focus.attack_self_tk(user) + +/obj/item/tk_grab/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity)//TODO: go over this + if(!target || !user) return + if(last_throw+3 > world.time) return + if(!host || host != user) qdel(src) return - - - //stops TK grabs being equipped anywhere but into hands - equipped(var/mob/user, var/slot) - if( (slot == slot_l_hand) || (slot== slot_r_hand) ) return + if(!(TK in host.mutations)) qdel(src) return - - - attack_self(mob/user as mob) - if(focus) - focus.attack_self_tk(user) - - afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity)//TODO: go over this - if(!target || !user) return - if(last_throw+3 > world.time) return - if(!host || host != user) - qdel(src) - return - if(!(TK in host.mutations)) - qdel(src) - return - if(isobj(target) && !isturf(target.loc)) - return - - var/d = get_dist(user, target) - if(focus) - d = max(d,get_dist(user,focus)) // whichever is further - - if(d > tk_maxrange) - user << "Your mind won't reach that far." - return - - if(!focus) - focus_object(target, user) - return - - if(target == focus) - target.attack_self_tk(user) - return // todo: something like attack_self not laden with assumptions inherent to attack_self - - - if(!istype(target, /turf) && istype(focus,/obj/item) && target.Adjacent(focus)) - var/obj/item/I = focus - var/resolved = target.attackby(I, user, user:get_organ_target()) - if(!resolved && target && I) - I.afterattack(target,user,1) // for splashing with beakers - - - else - apply_focus_overlay() - focus.throw_at(target, 10, 1) - last_throw = world.time + if(isobj(target) && !isturf(target.loc)) return - attack(mob/living/M as mob, mob/living/user as mob, def_zone) + var/d = get_dist(user, target) + if(focus) + d = max(d,get_dist(user,focus)) // whichever is further + + if(d > tk_maxrange) + user << "Your mind won't reach that far." return + if(!focus) + focus_object(target, user) + return - proc/focus_object(var/obj/target, var/mob/living/user) - if(!istype(target,/obj)) return//Cant throw non objects atm might let it do mobs later - if(target.anchored || !isturf(target.loc)) - qdel(src) - return - focus = target - update_icon() + if(target == focus) + target.attack_self_tk(user) + return // todo: something like attack_self not laden with assumptions inherent to attack_self + + + if(!istype(target, /turf) && istype(focus,/obj/item) && target.Adjacent(focus)) + var/obj/item/I = focus + var/resolved = target.attackby(I, user, user:get_organ_target()) + if(!resolved && target && I) + I.afterattack(target,user,1) // for splashing with beakers + + + else apply_focus_overlay() + focus.throw_at(target, 10, 1) + last_throw = world.time + return + +/obj/item/tk_grab/attack(mob/living/M as mob, mob/living/user as mob, def_zone) + return + + +/obj/item/tk_grab/proc/focus_object(var/obj/target, var/mob/living/user) + if(!istype(target,/obj)) return//Cant throw non objects atm might let it do mobs later + if(target.anchored || !isturf(target.loc)) + qdel(src) return - - - proc/apply_focus_overlay() - if(!focus) return - var/obj/effect/overlay/O = new /obj/effect/overlay(locate(focus.x,focus.y,focus.z)) - O.name = "sparkles" - O.anchored = 1 - O.density = 0 - O.layer = FLY_LAYER - O.dir = pick(cardinal) - O.icon = 'icons/effects/effects.dmi' - O.icon_state = "nothing" - flick("empdisable",O) - spawn(5) - O.delete() - return - - + focus = target update_icon() - overlays.Cut() - if(focus && focus.icon && focus.icon_state) - overlays += icon(focus.icon,focus.icon_state) - return + apply_focus_overlay() + return + + +/obj/item/tk_grab/proc/apply_focus_overlay() + if(!focus) return + var/obj/effect/overlay/O = new /obj/effect/overlay(locate(focus.x,focus.y,focus.z)) + O.name = "sparkles" + O.anchored = 1 + O.density = 0 + O.layer = FLY_LAYER + O.dir = pick(cardinal) + O.icon = 'icons/effects/effects.dmi' + O.icon_state = "nothing" + flick("empdisable",O) + spawn(5) + O.delete() + return + + +/obj/item/tk_grab/update_icon() + overlays.Cut() + if(focus && focus.icon && focus.icon_state) + overlays += icon(focus.icon,focus.icon_state) + return /*Not quite done likely needs to use something thats not get_step_to - proc/check_path() - var/turf/ref = get_turf(src.loc) - var/turf/target = get_turf(focus.loc) - if(!ref || !target) return 0 - var/distance = get_dist(ref, target) - if(distance >= 10) return 0 - for(var/i = 1 to distance) - ref = get_step_to(ref, target, 0) - if(ref != target) return 0 - return 1 +/obj/item/tk_grab/proc/check_path() + var/turf/ref = get_turf(src.loc) + var/turf/target = get_turf(focus.loc) + if(!ref || !target) return 0 + var/distance = get_dist(ref, target) + if(distance >= 10) return 0 + for(var/i = 1 to distance) + ref = get_step_to(ref, target, 0) + if(ref != target) return 0 + return 1 */ //equip_to_slot_or_del(obj/item/W, slot, qdel_on_fail = 1) diff --git a/code/controllers/_DynamicAreaLighting_TG.dm b/code/controllers/_DynamicAreaLighting_TG.dm index e7c71a59423..d40e9a10bf7 100644 --- a/code/controllers/_DynamicAreaLighting_TG.dm +++ b/code/controllers/_DynamicAreaLighting_TG.dm @@ -33,7 +33,7 @@ #define LIGHTING_LAYER 10 //Drawing layer for lighting overlays #define LIGHTING_ICON 'icons/effects/ss13_dark_alpha6.dmi' //Icon used for lighting shading effects -datum/light_source +/datum/light_source var/atom/owner var/changed = 1 var/list/effect = list() @@ -41,76 +41,76 @@ datum/light_source var/__y = 0 //y coordinate at last update - New(atom/A) - if(!istype(A)) - CRASH("The first argument to the light object's constructor must be the atom that is the light source. Expected atom, received '[A]' instead.") - ..() - owner = A +/datum/light_source/New(atom/A) + if(!istype(A)) + CRASH("The first argument to the light object's constructor must be the atom that is the light source. Expected atom, received '[A]' instead.") + ..() + owner = A + __x = owner.x + __y = owner.y + // the lighting object maintains a list of all light sources + lighting_controller.lights += src + + +//Check a light to see if its effect needs reprocessing. If it does, remove any old effect and create a new one +/datum/light_source/proc/check() + if(!owner) + remove_effect() + return 1 //causes it to be removed from our list of lights. The garbage collector will then destroy it. + + // check to see if we've moved since last update + if(owner.x != __x || owner.y != __y) __x = owner.x __y = owner.y - // the lighting object maintains a list of all light sources - lighting_controller.lights += src + changed = 1 + + if(changed) + changed = 0 + remove_effect() + return add_effect() + return 0 - //Check a light to see if its effect needs reprocessing. If it does, remove any old effect and create a new one - proc/check() - if(!owner) - remove_effect() - return 1 //causes it to be removed from our list of lights. The garbage collector will then destroy it. +/datum/light_source/proc/remove_effect() + // before we apply the effect we remove the light's current effect. + for(var/turf/T in effect) // negate the effect of this light source + T.update_lumcount(-effect[T]) + effect.Cut() // clear the effect list - // check to see if we've moved since last update - if(owner.x != __x || owner.y != __y) - __x = owner.x - __y = owner.y - changed = 1 +/datum/light_source/proc/add_effect() + // only do this if the light is turned on and is on the map + if(owner.loc && owner.luminosity > 0) + effect = list() + for(var/turf/T in view(owner.get_light_range(),owner)) + var/delta_lumen = lum(T) + if(delta_lumen > 0) + effect[T] = delta_lumen + T.update_lumcount(delta_lumen) - if(changed) - changed = 0 - remove_effect() - return add_effect() return 0 + else + owner.light = null + return 1 //cause the light to be removed from the lights list and garbage collected once it's no + //longer referenced by the queue - - proc/remove_effect() - // before we apply the effect we remove the light's current effect. - for(var/turf/T in effect) // negate the effect of this light source - T.update_lumcount(-effect[T]) - effect.Cut() // clear the effect list - - proc/add_effect() - // only do this if the light is turned on and is on the map - if(owner.loc && owner.luminosity > 0) - effect = list() - for(var/turf/T in view(owner.get_light_range(),owner)) - var/delta_lumen = lum(T) - if(delta_lumen > 0) - effect[T] = delta_lumen - T.update_lumcount(delta_lumen) - - return 0 - else - owner.light = null - return 1 //cause the light to be removed from the lights list and garbage collected once it's no - //longer referenced by the queue - - proc/lum(turf/A) - if (owner.trueLuminosity < 1) - return 0 - var/dist - if(!A) - dist = 0 - else +/datum/light_source/proc/lum(turf/A) + if (owner.trueLuminosity < 1) + return 0 + var/dist + if(!A) + dist = 0 + else #ifdef LIGHTING_CIRCULAR - dist = cheap_hypotenuse(A.x, A.y, __x, __y) + dist = cheap_hypotenuse(A.x, A.y, __x, __y) #else - dist = max(abs(A.x - __x), abs(A.y - __y)) + dist = max(abs(A.x - __x), abs(A.y - __y)) #endif - if (owner.trueLuminosity > 100) // This will never happen... right? - return sqrt(owner.trueLuminosity) - dist - else - return sqrtTable[owner.trueLuminosity] - dist + if (owner.trueLuminosity > 100) // This will never happen... right? + return sqrt(owner.trueLuminosity) - dist + else + return sqrtTable[owner.trueLuminosity] - dist -atom +/atom var/datum/light_source/light var/trueLuminosity = 0 // Typically 'luminosity' squared. The builtin luminosity must remain linear. // We may read it, but NEVER set it directly. @@ -118,7 +118,7 @@ atom //Turfs with opacity when they are constructed will trigger nearby lights to update //Turfs and atoms with luminosity when they are constructed will create a light_source automatically -turf/New() +/turf/New() ..() if(luminosity) if(light) WARNING("[type] - Don't set lights up manually during New(), We do it automatically.") @@ -127,7 +127,7 @@ turf/New() //Movable atoms with opacity when they are constructed will trigger nearby lights to update //Movable atoms with luminosity when they are constructed will create a light_source automatically -atom/movable/New() +/atom/movable/New() ..() if(opacity) if(isturf(loc)) @@ -139,7 +139,7 @@ atom/movable/New() light = new(src) //Objects with opacity will trigger nearby lights to update at next lighting process. -atom/movable/Destroy() +/atom/movable/Destroy() if(opacity) if(isturf(loc)) if(loc:lighting_lumcount > 1) @@ -151,7 +151,7 @@ atom/movable/Destroy() //If we are setting luminosity to 0 the light will be cleaned up by the controller and garbage collected once all its //queues are complete. //if we have a light already it is merely updated, rather than making a new one. -atom/proc/SetLuminosity(new_luminosity, trueLum = FALSE) +/atom/proc/SetLuminosity(new_luminosity, trueLum = FALSE) if(new_luminosity < 0) new_luminosity = 0 if(!trueLum) @@ -170,19 +170,19 @@ atom/proc/SetLuminosity(new_luminosity, trueLum = FALSE) else luminosity = sqrt(trueLuminosity) -atom/proc/AddLuminosity(delta_luminosity) +/atom/proc/AddLuminosity(delta_luminosity) if(delta_luminosity > 0) SetLuminosity(trueLuminosity + delta_luminosity*delta_luminosity, TRUE) else if(delta_luminosity < 0) SetLuminosity(trueLuminosity - delta_luminosity*delta_luminosity, TRUE) -area/SetLuminosity(new_luminosity) //we don't want dynamic lighting for areas +/area/SetLuminosity(new_luminosity) //we don't want dynamic lighting for areas luminosity = !!new_luminosity trueLuminosity = luminosity //change our opacity (defaults to toggle), and then update all lights that affect us. -atom/proc/SetOpacity(new_opacity) +/atom/proc/SetOpacity(new_opacity) if(new_opacity == null) new_opacity = !opacity //default = toggle opacity else if(opacity == new_opacity) @@ -190,7 +190,7 @@ atom/proc/SetOpacity(new_opacity) opacity = new_opacity //update opacity, the below procs now call light updates. return 1 -turf/SetOpacity(new_opacity) +/turf/SetOpacity(new_opacity) if(..()==1) //only bother if opacity changed if(lighting_lumcount) //only bother with an update if our turf is currently affected by a light UpdateAffectingLights() @@ -203,24 +203,24 @@ turf/SetOpacity(new_opacity) UpdateAffectingLights() -turf +/turf var/lighting_lumcount = 0 var/lighting_changed = 0 -turf/space +/turf/space lighting_lumcount = 4 //starlight -turf/proc/update_lumcount(amount) +/turf/proc/update_lumcount(amount) lighting_lumcount += amount if(!lighting_changed) lighting_controller.changed_turfs += src lighting_changed = 1 -turf/proc/lighting_tag(var/level) +/turf/proc/lighting_tag(var/level) var/area/A = loc return A.tagbase + "sd_L[level]" -turf/proc/build_lighting_area(var/tag, var/level) +/turf/proc/build_lighting_area(var/tag, var/level) var/area/Area = loc var/area/A = new Area.type() // create area if it wasn't found // replicate vars @@ -238,7 +238,7 @@ turf/proc/build_lighting_area(var/tag, var/level) Area.related += A return A -turf/proc/shift_to_subarea() +/turf/proc/shift_to_subarea() lighting_changed = 0 var/area/Area = loc @@ -257,54 +257,54 @@ turf/proc/shift_to_subarea() // Dedicated lighting sublevel for space turfs // helps us depower things in space, remove space fire alarms, // and evens out space lighting -turf/space/lighting_tag(var/level) +/turf/space/lighting_tag(var/level) var/area/A = loc return A.tagbase + "sd_L_space" -turf/space/build_lighting_area(var/tag,var/level) +/turf/space/build_lighting_area(var/tag,var/level) var/area/A = ..(tag,4) A.lighting_space = 1 A.SetLightLevel(4) A.icon_state = null return A -area +/area var/lighting_use_dynamic = 1 //Turn this flag off to prevent sd_DynamicAreaLighting from affecting this area var/image/lighting_overlay //tracks the darkness image of the area for easy removal var/lighting_subarea = 0 //tracks whether we're a lighting sub-area var/lighting_space = 0 // true for space-only lighting subareas var/tagbase - proc/SetLightLevel(light) - if(!src) return - if(light <= 0) - light = 0 - luminosity = 0 - else - if(light > lighting_controller.lighting_states) - light = lighting_controller.lighting_states - luminosity = 1 +/area/proc/SetLightLevel(light) + if(!src) return + if(light <= 0) + light = 0 + luminosity = 0 + else + if(light > lighting_controller.lighting_states) + light = lighting_controller.lighting_states + luminosity = 1 - if(lighting_overlay) - overlays -= lighting_overlay - lighting_overlay.icon_state = "[light]" - else - lighting_overlay = image(LIGHTING_ICON,,num2text(light),LIGHTING_LAYER) + if(lighting_overlay) + overlays -= lighting_overlay + lighting_overlay.icon_state = "[light]" + else + lighting_overlay = image(LIGHTING_ICON,,num2text(light),LIGHTING_LAYER) - overlays += lighting_overlay + overlays += lighting_overlay - proc/SetDynamicLighting() +/area/proc/SetDynamicLighting() - src.lighting_use_dynamic = 1 - for(var/turf/T in src.contents) - T.update_lumcount(0) + src.lighting_use_dynamic = 1 + for(var/turf/T in src.contents) + T.update_lumcount(0) - proc/InitializeLighting() //TODO: could probably improve this bit ~Carn - tagbase = "[type]" - if(!tag) tag = tagbase - if(!lighting_use_dynamic) - if(!lighting_subarea) // see if this is a lighting subarea already - //show the dark overlay so areas, not yet in a lighting subarea, won't be bright as day and look silly. - SetLightLevel(4) +/area/proc/InitializeLighting() //TODO: could probably improve this bit ~Carn + tagbase = "[type]" + if(!tag) tag = tagbase + if(!lighting_use_dynamic) + if(!lighting_subarea) // see if this is a lighting subarea already + //show the dark overlay so areas, not yet in a lighting subarea, won't be bright as day and look silly. + SetLightLevel(4) #undef LIGHTING_LAYER #undef LIGHTING_CIRCULAR @@ -316,24 +316,24 @@ area //set the changed status of all lights which could have possibly lit this atom. //We don't need to worry about lights which lit us but moved away, since they will have change status set already //This proc can cause lots of lights to be updated. :( -atom/proc/UpdateAffectingLights() +/atom/proc/UpdateAffectingLights() for(var/atom/A in oview(LIGHTING_MAX_LUMINOSITY_STATIC-1,src)) if(A.light) A.light.changed = 1 //force it to update at next process() //caps luminosity effects max-range based on what type the light's owner is. -atom/proc/get_light_range() +/atom/proc/get_light_range() return min(luminosity, LIGHTING_MAX_LUMINOSITY_STATIC) -atom/movable/get_light_range() +/atom/movable/get_light_range() return min(luminosity, LIGHTING_MAX_LUMINOSITY_MOBILE) -obj/machinery/light/get_light_range() +/obj/machinery/light/get_light_range() return min(luminosity, LIGHTING_MAX_LUMINOSITY_STATIC) -turf/get_light_range() +/turf/get_light_range() return min(luminosity, LIGHTING_MAX_LUMINOSITY_TURF) #undef LIGHTING_MAX_LUMINOSITY_STATIC #undef LIGHTING_MAX_LUMINOSITY_MOBILE -#undef LIGHTING_MAX_LUMINOSITY_TURF \ No newline at end of file +#undef LIGHTING_MAX_LUMINOSITY_TURF diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 2cde6a019a7..b74828c83f0 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -6,7 +6,8 @@ #define EVERYONE_HAS_MAINT_ACCESS 4 /datum/configuration - var/server_name = null // server name (for world name / status) + var/server_name = null // server name (the name of the game window) + var/station_name = null // station name (the name of the station in-game) var/server_suffix = 0 // generate numeric suffix based on server port var/lobby_countdown = 120 // In between round countdown. @@ -234,6 +235,8 @@ config.respawn = 0 if("servername") config.server_name = value + if("stationname") + config.station_name = value if("serversuffix") config.server_suffix = 1 if("hostedby") diff --git a/code/controllers/lighting_controller.dm b/code/controllers/lighting_controller.dm index 7814d21753d..d4f46b104fe 100644 --- a/code/controllers/lighting_controller.dm +++ b/code/controllers/lighting_controller.dm @@ -1,6 +1,6 @@ var/datum/controller/lighting/lighting_controller = new () -datum/controller/lighting +/datum/controller/lighting var/processing = 0 var/processing_interval = 5 //setting this too low will probably kill the server. Don't be silly with it! var/process_cost = 0 @@ -17,7 +17,7 @@ datum/controller/lighting var/list/changed_turfs = list() var/changed_turfs_workload_max = 0 -datum/controller/lighting/New() +/datum/controller/lighting/New() lighting_states = max( 0, length(icon_states(LIGHTING_ICON))-1 ) if(lighting_controller != src) if(istype(lighting_controller,/datum/controller/lighting)) @@ -31,7 +31,7 @@ datum/controller/lighting/New() //All queue lists prune themselves, which will cause lights with no luminosity to be garbage collected (cheaper and safer //than deleting them). Processing interval should be roughly half a second for best results. //By using queues we are ensuring we don't perform more updates than are necessary -datum/controller/lighting/proc/process() +/datum/controller/lighting/proc/process() processing = 1 spawn(0) set background = BACKGROUND_ENABLED @@ -65,7 +65,7 @@ datum/controller/lighting/proc/process() //Does not loop. Should be run prior to process() being called for the first time. //Note: if we get additional z-levels at runtime (e.g. if the gateway thin ever gets finished) we can initialize specific //z-levels with the z_level argument -datum/controller/lighting/proc/Initialize(var/z_level) +/datum/controller/lighting/proc/Initialize(var/z_level) processing = 0 spawn(-1) set background = BACKGROUND_ENABLED @@ -95,7 +95,7 @@ datum/controller/lighting/proc/Initialize(var/z_level) //Used to strip valid information from an existing controller and transfer it to a replacement //It works by using spawn(-1) to transfer the data, if there is a runtime the data does not get transfered but the loop //does not crash -datum/controller/lighting/proc/Recover() +/datum/controller/lighting/proc/Recover() if(!istype(lighting_controller.changed_turfs,/list)) lighting_controller.changed_turfs = list() if(!istype(lighting_controller.lights,/list)) diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index da3b635c434..5f8d3c7d38c 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -11,7 +11,7 @@ var/global/last_tick_duration = 0 var/global/air_processing_killed = 0 var/global/pipe_processing_killed = 0 -datum/controller/game_controller +/datum/controller/game_controller var/processing = 0 var/breather_ticks = 2 //a somewhat crude attempt to iron over the 'bumps' caused by high-cpu use by letting the MC have a breather for this many ticks after every loop var/minimum_ticks = 20 //The minimum length of time between MC ticks @@ -37,7 +37,7 @@ datum/controller/game_controller var/last_thing_processed -datum/controller/game_controller/New() +/datum/controller/game_controller/New() //There can be only one master_controller. Out with the old and in with the new. if(master_controller != src) if(istype(master_controller)) @@ -61,7 +61,7 @@ datum/controller/game_controller/New() job_master = new /datum/controller/occupations() job_master.SetupOccupations() job_master.LoadJobs("config/jobs.txt") - world << "\red \b Job setup complete" + world << "Job setup complete" if(!syndicate_code_phrase) syndicate_code_phrase = generate_code_phrase() if(!syndicate_code_response) syndicate_code_response = generate_code_phrase() @@ -69,7 +69,7 @@ datum/controller/game_controller/New() if(!emergency_shuttle) emergency_shuttle = new /datum/shuttle_controller/emergency_shuttle() if(!supply_shuttle) supply_shuttle = new /datum/controller/supply_shuttle() -datum/controller/game_controller/proc/setup() +/datum/controller/game_controller/proc/setup() world.tick_lag = config.Ticklag setup_objects() @@ -80,18 +80,18 @@ datum/controller/game_controller/proc/setup() if(ticker) ticker.pregame() -datum/controller/game_controller/proc/setup_objects() - world << "\red \b Initializing objects..." +/datum/controller/game_controller/proc/setup_objects() + world << "Initializing objects..." sleep(-1) for(var/atom/movable/object in world) object.initialize() - world << "\red \b Initializing pipe networks..." + world << "Initializing pipe networks..." sleep(-1) for(var/obj/machinery/atmospherics/machine in world) machine.build_network() - world << "\red \b Initializing atmos machinery..." + world << "Initializing atmos machinery..." sleep(-1) for(var/obj/machinery/atmospherics/unary/U in world) if(istype(U, /obj/machinery/atmospherics/unary/vent_pump)) @@ -101,16 +101,16 @@ datum/controller/game_controller/proc/setup_objects() var/obj/machinery/atmospherics/unary/vent_scrubber/T = U T.broadcast_status() - world << "\red \b Making a mess..." + world << "Making a mess..." sleep(-1) for(var/turf/simulated/floor/F in world) F.MakeDirty() - world << "\red \b Initializations complete." + world << "Initializations complete." sleep(-1) -datum/controller/game_controller/proc/process() +/datum/controller/game_controller/proc/process() processing = 1 spawn(0) set background = BACKGROUND_ENABLED @@ -223,7 +223,7 @@ datum/controller/game_controller/proc/process() sleep(10) /* -datum/controller/game_controller/proc/process_liquid() +/datum/controller/game_controller/proc/process_liquid() last_thing_processed = /datum/puddle var/i = 1 while(i<=puddles.len) @@ -235,7 +235,7 @@ datum/controller/game_controller/proc/process_liquid() puddles.Cut(i,i+1) */ -datum/controller/game_controller/proc/process_mobs() +/datum/controller/game_controller/proc/process_mobs() var/i = 1 while(i<=mob_list.len) var/mob/M = mob_list[i] @@ -246,7 +246,7 @@ datum/controller/game_controller/proc/process_mobs() continue mob_list.Cut(i,i+1) -datum/controller/game_controller/proc/process_diseases() +/datum/controller/game_controller/proc/process_diseases() var/i = 1 while(i<=active_diseases.len) var/datum/disease/Disease = active_diseases[i] @@ -257,7 +257,7 @@ datum/controller/game_controller/proc/process_diseases() continue active_diseases.Cut(i,i+1) -datum/controller/game_controller/proc/process_machines() +/datum/controller/game_controller/proc/process_machines() var/i = 1 while(i<=machines.len) var/obj/machinery/Machine = machines[i] @@ -271,7 +271,7 @@ datum/controller/game_controller/proc/process_machines() continue machines.Cut(i,i+1) -datum/controller/game_controller/proc/process_objects() +/datum/controller/game_controller/proc/process_objects() var/i = 1 while(i<=processing_objects.len) var/obj/Object = processing_objects[i] @@ -282,7 +282,7 @@ datum/controller/game_controller/proc/process_objects() continue processing_objects.Cut(i,i+1) -datum/controller/game_controller/proc/process_pipenets() +/datum/controller/game_controller/proc/process_pipenets() last_thing_processed = /datum/pipe_network var/i = 1 while(i<=pipe_networks.len) @@ -293,7 +293,7 @@ datum/controller/game_controller/proc/process_pipenets() continue pipe_networks.Cut(i,i+1) -datum/controller/game_controller/proc/process_powernets() +/datum/controller/game_controller/proc/process_powernets() last_thing_processed = /datum/powernet var/i = 1 while(i<=powernets.len) @@ -304,7 +304,7 @@ datum/controller/game_controller/proc/process_powernets() continue powernets.Cut(i,i+1) -datum/controller/game_controller/proc/process_nano() +/datum/controller/game_controller/proc/process_nano() var/i = 1 while(i<=nanomanager.processing_uis.len) var/datum/nanoui/ui = nanomanager.processing_uis[i] @@ -314,7 +314,7 @@ datum/controller/game_controller/proc/process_nano() continue nanomanager.processing_uis.Cut(i,i+1) -datum/controller/game_controller/proc/Recover() //Mostly a placeholder for now. +/datum/controller/game_controller/proc/Recover() //Mostly a placeholder for now. var/msg = "## DEBUG: [time2text(world.timeofday)] MC restarted. Reports:\n" for(var/varname in master_controller.vars) switch(varname) diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index 6e1c9a0a078..83fbd2c883a 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -18,7 +18,7 @@ var/global/datum/shuttle_controller/emergency_shuttle/emergency_shuttle -datum/shuttle_controller +/datum/shuttle_controller var/location = UNDOCKED // var/online = 0 var/direction = 1 //-1 = going back to central command, 1 = going to SS13. Only important for recalling @@ -37,150 +37,149 @@ datum/shuttle_controller // call the shuttle // if not called before, set the endtime to T+600 seconds // otherwise if outgoing, switch to incoming - proc/incall(coeff = 1, var/signal_origin) +/datum/shuttle_controller/proc/incall(coeff = 1, var/signal_origin) - if(endtime) - if(direction == -1) - setdirection(1) + if(endtime) + if(direction == -1) + setdirection(1) + else + if(signal_origin && prob(60)) //40% chance the signal tracing will fail + last_call_loc = signal_origin else - if(signal_origin && prob(60)) //40% chance the signal tracing will fail - last_call_loc = signal_origin + last_call_loc = null + settimeleft(SHUTTLEARRIVETIME*coeff) + online = 1 + if(always_fake_recall) + + if ((seclevel2num(get_security_level()) == SEC_LEVEL_RED)) + fake_recall = rand(SHUTTLEARRIVETIME / 4, SHUTTLEARRIVETIME - 100 / 2) else - last_call_loc = null - settimeleft(SHUTTLEARRIVETIME*coeff) - online = 1 - if(always_fake_recall) + fake_recall = rand(SHUTTLEARRIVETIME / 2, SHUTTLEARRIVETIME - 100) - if ((seclevel2num(get_security_level()) == SEC_LEVEL_RED)) - fake_recall = rand(SHUTTLEARRIVETIME / 4, SHUTTLEARRIVETIME - 100 / 2) - else - fake_recall = rand(SHUTTLEARRIVETIME / 2, SHUTTLEARRIVETIME - 100) +/datum/shuttle_controller/proc/recall(var/signal_origin) + if(direction == 1) + var/timeleft = timeleft() + if(timeleft >= SHUTTLEARRIVETIME) + online = 0 + direction = 1 + endtime = null + return - proc/recall(var/signal_origin) + recall_count ++ + + if(recall_count > 2 && signal_origin && prob(60)) //40% chance the signal tracing will fail + last_call_loc = signal_origin + else + last_call_loc = null + + if(recall_count == 2) + priority_announce("The emergency shuttle has been recalled.\n\nExcessive number of emergency shuttle calls detected. We will attempt to trace all future calls and recalls to their source. Tracing results can be viewed on any communications console.", null, 'sound/AI/shuttlerecalled.ogg') + else + priority_announce("The emergency shuttle has been recalled.", null, 'sound/AI/shuttlerecalled.ogg', "Priority") + setdirection(-1) + online = 1 + + +// returns the time (in seconds) before shuttle arrival +// note if direction = -1, gives a count-up to SHUTTLEARRIVETIME +/datum/shuttle_controller/proc/timeleft() + if(online) + var/timeleft = round((endtime - world.timeofday)/10 ,1) + if(timeleft > (MIDNIGHT_ROLLOVER/10)) // midnight rollover protection + endtime -= MIDNIGHT_ROLLOVER // subtract 24 hours from endtime + timeleft = round((endtime - world.timeofday)/10 ,1) // recalculate timeleft if(direction == 1) - var/timeleft = timeleft() - if(timeleft >= SHUTTLEARRIVETIME) + return timeleft + else + return SHUTTLEARRIVETIME-timeleft + else + return SHUTTLEARRIVETIME + +// sets the time left to a given delay (in seconds) +/datum/shuttle_controller/proc/settimeleft(var/delay) + endtime = world.timeofday + delay * 10 + timelimit = delay + +// sets the shuttle direction +// 1 = towards SS13, -1 = back to centcom +/datum/shuttle_controller/proc/setdirection(var/dirn) + if(direction == dirn) + return + direction = dirn + // if changing direction, flip the timeleft by SHUTTLEARRIVETIME + var/ticksleft = endtime - world.timeofday + endtime = world.timeofday + (SHUTTLEARRIVETIME*10 - ticksleft) + return + +//calls the shuttle if there's no live active AI or powered non broken comms console, +/datum/shuttle_controller/proc/autoshuttlecall() + var/callshuttle = 1 + + for(var/SC in shuttle_caller_list) + if(istype(SC,/mob/living/silicon/ai)) + var/mob/living/silicon/ai/AI = SC + if(AI.stat || !AI.client) + continue + if(istype(SC,/obj/machinery/computer/communications)) + var/obj/machinery/computer/communications/C = SC + if(C.stat & BROKEN) + continue + var/turf/T = get_turf(SC) + if(T && T.z == 1) + callshuttle = 0 //if there's an alive AI or a powered non broken communication console on the station z level, we don't call the shuttle + break + + if(callshuttle) + if(!online && direction == 1) //we don't call the shuttle if it's already coming + incall(SHUTTLEAUTOCALLTIMER) //X minutes! If they want to recall, they have X-(X-5) minutes to do so + log_game("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.") + message_admins("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.", 1) + priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.", null, 'sound/AI/shuttlecalled.ogg', "Priority") + +/datum/shuttle_controller/proc/move_shuttles() + var/datum/shuttle_manager/s + for(var/t in pods) + s = shuttles[t] + s.move_shuttle() + +/datum/shuttle_controller/proc/process() + +/datum/shuttle_controller/emergency_shuttle/process() + if(!online) + return + var/timeleft = timeleft() + if(location == UNDOCKED) + if(direction == -1) + if(timeleft >= timelimit) // Shuttle reaches CentCom after being recalled. online = 0 direction = 1 endtime = null - return - - recall_count ++ - - if(recall_count > 2 && signal_origin && prob(60)) //40% chance the signal tracing will fail - last_call_loc = signal_origin - else - last_call_loc = null - - if(recall_count == 2) - priority_announce("The emergency shuttle has been recalled.\n\nExcessive number of emergency shuttle calls detected. We will attempt to trace all future calls and recalls to their source. Tracing results can be viewed on any communications console.", null, 'sound/AI/shuttlerecalled.ogg') - else - priority_announce("The emergency shuttle has been recalled.", null, 'sound/AI/shuttlerecalled.ogg', "Priority") - setdirection(-1) - online = 1 - - - // returns the time (in seconds) before shuttle arrival - // note if direction = -1, gives a count-up to SHUTTLEARRIVETIME - proc/timeleft() - if(online) - var/timeleft = round((endtime - world.timeofday)/10 ,1) - if(timeleft > (MIDNIGHT_ROLLOVER/10)) // midnight rollover protection - endtime -= MIDNIGHT_ROLLOVER // subtract 24 hours from endtime - timeleft = round((endtime - world.timeofday)/10 ,1) // recalculate timeleft - if(direction == 1) - return timeleft - else - return SHUTTLEARRIVETIME-timeleft - else - return SHUTTLEARRIVETIME - - // sets the time left to a given delay (in seconds) - proc/settimeleft(var/delay) - endtime = world.timeofday + delay * 10 - timelimit = delay - - // sets the shuttle direction - // 1 = towards SS13, -1 = back to centcom - proc/setdirection(var/dirn) - if(direction == dirn) - return - direction = dirn - // if changing direction, flip the timeleft by SHUTTLEARRIVETIME - var/ticksleft = endtime - world.timeofday - endtime = world.timeofday + (SHUTTLEARRIVETIME*10 - ticksleft) - return - - //calls the shuttle if there's no live active AI or powered non broken comms console, - proc/autoshuttlecall() - var/callshuttle = 1 - - for(var/SC in shuttle_caller_list) - if(istype(SC,/mob/living/silicon/ai)) - var/mob/living/silicon/ai/AI = SC - if(AI.stat || !AI.client) - continue - if(istype(SC,/obj/machinery/computer/communications)) - var/obj/machinery/computer/communications/C = SC - if(C.stat & BROKEN) - continue - var/turf/T = get_turf(SC) - if(T && T.z == 1) - callshuttle = 0 //if there's an alive AI or a powered non broken communication console on the station z level, we don't call the shuttle - break - - if(callshuttle) - if(!online && direction == 1) //we don't call the shuttle if it's already coming - incall(SHUTTLEAUTOCALLTIMER) //X minutes! If they want to recall, they have X-(X-5) minutes to do so - log_game("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.") - message_admins("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.", 1) - priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.", null, 'sound/AI/shuttlecalled.ogg', "Priority") - - proc/move_shuttles() - var/datum/shuttle_manager/s - for(var/t in pods) - s = shuttles[t] - s.move_shuttle() - - proc/process() - - emergency_shuttle - process() - if(!online) - return - var/timeleft = timeleft() - if(location == UNDOCKED) - if(direction == -1) - if(timeleft >= timelimit) // Shuttle reaches CentCom after being recalled. - online = 0 - direction = 1 - endtime = null - return 0 - else if(fake_recall && (timeleft <= fake_recall)) - recall() - fake_recall = 0 - return 0 - else if(timeleft <= 0) - var/datum/shuttle_manager/s = shuttles["escape"] - s.move_shuttle() - location = DOCKED - settimeleft(SHUTTLELEAVETIME) - send2irc("Server", "The Emergency Shuttle has docked with the station.") - priority_announce("The Emergency Shuttle has docked with the station. You have [round(timeleft()/60,1)] minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority") - else if(timeleft <= 0) //Nothing happens if time's not up and the ship's docked or later - if(location == DOCKED) - move_shuttles() - location = TRANSIT - settimeleft(SHUTTLETRANSITTIME) - priority_announce("The Emergency Shuttle has left the station. Estimate [round(timeleft()/60,1)] minutes until the shuttle docks at Central Command.", null, null, "Priority") - else if(location == TRANSIT) - move_shuttles() - //message_admins("Shuttles have attempted to move to Centcom") - location = ENDGAME - online = 0 - endtime = null - return 1 + return 0 + else if(fake_recall && (timeleft <= fake_recall)) + recall() + fake_recall = 0 return 0 + else if(timeleft <= 0) + var/datum/shuttle_manager/s = shuttles["escape"] + s.move_shuttle() + location = DOCKED + settimeleft(SHUTTLELEAVETIME) + send2irc("Server", "The Emergency Shuttle has docked with the station.") + priority_announce("The Emergency Shuttle has docked with the station. You have [round(timeleft()/60,1)] minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority") + else if(timeleft <= 0) //Nothing happens if time's not up and the ship's docked or later + if(location == DOCKED) + move_shuttles() + location = TRANSIT + settimeleft(SHUTTLETRANSITTIME) + priority_announce("The Emergency Shuttle has left the station. Estimate [round(timeleft()/60,1)] minutes until the shuttle docks at Central Command.", null, null, "Priority") + else if(location == TRANSIT) + move_shuttles() + //message_admins("Shuttles have attempted to move to Centcom") + location = ENDGAME + online = 0 + endtime = null + return 1 + return 0 /* Some slapped-together star effects for maximum spess immershuns. Basically consists of a @@ -194,23 +193,23 @@ datum/shuttle_controller var/direction = SOUTH layer = 2 // TURF_LAYER - New() - ..() - pixel_x += rand(-2,30) - pixel_y += rand(-2,30) - var/starnum = pick("1", "1", "1", "2", "3", "4") +/obj/effect/bgstar/New() + ..() + pixel_x += rand(-2,30) + pixel_y += rand(-2,30) + var/starnum = pick("1", "1", "1", "2", "3", "4") - icon_state = "star"+starnum + icon_state = "star"+starnum - speed = rand(2, 5) + speed = rand(2, 5) - proc/startmove() +/obj/effect/bgstar/proc/startmove() - while(src) - sleep(speed) - step(src, direction) - for(var/obj/effect/starender/E in loc) - qdel(src) + while(src) + sleep(speed) + step(src, direction) + for(var/obj/effect/starender/E in loc) + qdel(src) /obj/effect/starender @@ -221,17 +220,17 @@ datum/shuttle_controller var/spawndir = SOUTH var/spawning = 0 - West - spawndir = WEST +/obj/effect/starspawner/West + spawndir = WEST - proc/startspawn() - spawning = 1 - while(spawning) - sleep(rand(2, 30)) - var/obj/effect/bgstar/S = new/obj/effect/bgstar(locate(x,y,z)) - S.direction = spawndir - spawn() - S.startmove() +/obj/effect/starspawner/proc/startspawn() + spawning = 1 + while(spawning) + sleep(rand(2, 30)) + var/obj/effect/bgstar/S = new/obj/effect/bgstar(locate(x,y,z)) + S.direction = spawndir + spawn() + S.startmove() /proc/push_mob_back(var/mob/living/L, var/dir) diff --git a/code/controllers/supply_shuttle.dm b/code/controllers/supply_shuttle.dm index 5bc835af74c..3f8238177f0 100644 --- a/code/controllers/supply_shuttle.dm +++ b/code/controllers/supply_shuttle.dm @@ -61,18 +61,18 @@ var/global/datum/controller/supply_shuttle/supply_shuttle name = "airtight plastic flaps" desc = "Heavy duty, airtight, plastic flaps." - New() //set the turf below the flaps to block air - var/turf/T = get_turf(loc) - if(T) - T.blocks_air = 1 - ..() +/obj/structure/plasticflaps/mining/New() //set the turf below the flaps to block air + var/turf/T = get_turf(loc) + if(T) + T.blocks_air = 1 + ..() - Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor //wow this is terrible - var/turf/T = get_turf(loc) - if(T) - if(istype(T, /turf/simulated/floor)) - T.blocks_air = 0 - ..() +/obj/structure/plasticflaps/mining/Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor //wow this is terrible + var/turf/T = get_turf(loc) + if(T) + if(istype(T, /turf/simulated/floor)) + T.blocks_air = 0 + ..() /obj/machinery/computer/supplycomp name = "supply shuttle console" @@ -140,269 +140,269 @@ var/global/datum/controller/supply_shuttle/supply_shuttle //shuttle loan var/datum/round_event/shuttle_loan/shuttle_loan - New() - ordernum = rand(1,9000) - for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs)) - var/datum/supply_packs/P = new typepath() - if(P.name == "HEADER") continue // To filter out group headers - supply_packs[P.name] = P +/datum/controller/supply_shuttle/New() + ordernum = rand(1,9000) + for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs)) + var/datum/supply_packs/P = new typepath() + if(P.name == "HEADER") continue // To filter out group headers + supply_packs[P.name] = P - //Supply shuttle ticker - handles supply point regenertion and shuttle travelling between centcom and the station - proc/process() +//Supply shuttle ticker - handles supply point regenertion and shuttle travelling between centcom and the station +/datum/controller/supply_shuttle/proc/process() - spawn(0) - set background = BACKGROUND_ENABLED - while(1) - if(processing) - iteration++ - points += points_per_process + spawn(0) + set background = BACKGROUND_ENABLED + while(1) + if(processing) + iteration++ + points += points_per_process - if(moving == 1) - var/ticksleft = (eta_timeofday - world.timeofday) - if(ticksleft > 0) - eta = round(ticksleft/600,1) - else - eta = 0 - send() + if(moving == 1) + var/ticksleft = (eta_timeofday - world.timeofday) + if(ticksleft > 0) + eta = round(ticksleft/600,1) + else + eta = 0 + send() - sleep(processing_interval) + sleep(processing_interval) - proc/send() - var/area/from - var/area/dest - switch(at_station) - if(1) - from = locate(SUPPLY_STATION_AREATYPE) - dest = locate(SUPPLY_DOCK_AREATYPE) - at_station = 0 - if(0) - from = locate(SUPPLY_DOCK_AREATYPE) - dest = locate(SUPPLY_STATION_AREATYPE) - at_station = 1 - dest.clear_docking_area() - moving = 0 +/datum/controller/supply_shuttle/proc/send() + var/area/from + var/area/dest + switch(at_station) + if(1) + from = locate(SUPPLY_STATION_AREATYPE) + dest = locate(SUPPLY_DOCK_AREATYPE) + at_station = 0 + if(0) + from = locate(SUPPLY_DOCK_AREATYPE) + dest = locate(SUPPLY_STATION_AREATYPE) + at_station = 1 + dest.clear_docking_area() + moving = 0 - from.move_contents_to(dest) + from.move_contents_to(dest) - //Check whether the shuttle is allowed to move - proc/can_move() - if(moving) return 0 +//Check whether the shuttle is allowed to move +/datum/controller/supply_shuttle/proc/can_move() + if(moving) return 0 - var/area/shuttle = locate(/area/supply/station) - if(!shuttle) return 0 + var/area/shuttle = locate(/area/supply/station) + if(!shuttle) return 0 - if(forbidden_atoms_check(shuttle)) - return 0 + if(forbidden_atoms_check(shuttle)) + return 0 + return 1 + +//To stop things being sent to centcom which should not be sent to centcom Recursively checks for these types. +/datum/controller/supply_shuttle/proc/forbidden_atoms_check(atom/A) + if(istype(A,/mob/living)) + return 1 + if(istype(A,/obj/item/weapon/disk/nuclear)) + return 1 + if(istype(A,/obj/machinery/nuclearbomb)) + return 1 + if(istype(A,/obj/item/device/radio/beacon)) + return 1 + if(istype(A,/obj/effect/blob)) + return 1 + if(istype(A,/obj/effect/spider/spiderling)) return 1 - //To stop things being sent to centcom which should not be sent to centcom Recursively checks for these types. - proc/forbidden_atoms_check(atom/A) - if(istype(A,/mob/living)) - return 1 - if(istype(A,/obj/item/weapon/disk/nuclear)) - return 1 - if(istype(A,/obj/machinery/nuclearbomb)) - return 1 - if(istype(A,/obj/item/device/radio/beacon)) - return 1 - if(istype(A,/obj/effect/blob)) - return 1 - if(istype(A,/obj/effect/spider/spiderling)) + for(var/i=1, i<=A.contents.len, i++) + var/atom/B = A.contents[i] + if(.(B)) return 1 - for(var/i=1, i<=A.contents.len, i++) - var/atom/B = A.contents[i] - if(.(B)) - return 1 +//Sellin +/datum/controller/supply_shuttle/proc/sell() + var/shuttle_at + if(at_station) shuttle_at = SUPPLY_STATION_AREATYPE + else shuttle_at = SUPPLY_DOCK_AREATYPE - //Sellin - proc/sell() - var/shuttle_at - if(at_station) shuttle_at = SUPPLY_STATION_AREATYPE - else shuttle_at = SUPPLY_DOCK_AREATYPE + var/area/shuttle = locate(shuttle_at) + if(!shuttle) return - var/area/shuttle = locate(shuttle_at) - if(!shuttle) return + var/plasma_count = 0 + var/intel_count = 0 + var/crate_count = 0 - var/plasma_count = 0 - var/intel_count = 0 - var/crate_count = 0 + centcom_message = "" - centcom_message = "" - - for(var/atom/movable/MA in shuttle) - if(MA.anchored) continue + for(var/atom/movable/MA in shuttle) + if(MA.anchored) continue - // Must be in a crate (or a critter crate)! - if(istype(MA,/obj/structure/closet/crate) || istype(MA,/obj/structure/closet/critter)) - crate_count++ - var/find_slip = 1 + // Must be in a crate (or a critter crate)! + if(istype(MA,/obj/structure/closet/crate) || istype(MA,/obj/structure/closet/critter)) + crate_count++ + var/find_slip = 1 - for(var/atom in MA) - // Sell manifests - var/atom/A = atom - if(find_slip && istype(A,/obj/item/weapon/paper/manifest)) - var/obj/item/weapon/paper/manifest/slip = A - // TODO: Check for a signature, too. - if(slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense - // Did they mark it as erroneous? - var/denied = 0 - for(var/i=1,i<=slip.stamped.len,i++) - if(slip.stamped[i] == /obj/item/weapon/stamp/denied) - denied = 1 - if(slip.erroneous && denied) // Caught a mistake by Centcom (IDEA: maybe Centcom rarely gets offended by this) - points += slip.points-points_per_crate // For now, give a full refund for paying attention (minus the crate cost) - centcom_message += "+[slip.points-points_per_crate]: Station correctly denied package [slip.ordernumber]: " + for(var/atom in MA) + // Sell manifests + var/atom/A = atom + if(find_slip && istype(A,/obj/item/weapon/paper/manifest)) + var/obj/item/weapon/paper/manifest/slip = A + // TODO: Check for a signature, too. + if(slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense + // Did they mark it as erroneous? + var/denied = 0 + for(var/i=1,i<=slip.stamped.len,i++) + if(slip.stamped[i] == /obj/item/weapon/stamp/denied) + denied = 1 + if(slip.erroneous && denied) // Caught a mistake by Centcom (IDEA: maybe Centcom rarely gets offended by this) + points += slip.points-points_per_crate // For now, give a full refund for paying attention (minus the crate cost) + centcom_message += "+[slip.points-points_per_crate]: Station correctly denied package [slip.ordernumber]: " + if(slip.erroneous & MANIFEST_ERROR_NAME) + centcom_message += "Destination station incorrect. " + else if(slip.erroneous & MANIFEST_ERROR_COUNT) + centcom_message += "Packages incorrectly counted. " + else if(slip.erroneous & MANIFEST_ERROR_ITEM) + centcom_message += "Package incomplete. " + centcom_message += "Points refunded.
" + else if(!slip.erroneous && !denied) // Approving a proper order awards the relatively tiny points_per_slip + points += points_per_slip + centcom_message += "+1: Package [slip.ordernumber] accorded.
" + else // You done goofed. + if(slip.erroneous) + centcom_message += "+0: Station approved package [slip.ordernumber] despite error: " if(slip.erroneous & MANIFEST_ERROR_NAME) - centcom_message += "Destination station incorrect. " + centcom_message += "Destination station incorrect." else if(slip.erroneous & MANIFEST_ERROR_COUNT) - centcom_message += "Packages incorrectly counted. " + centcom_message += "Packages incorrectly counted." else if(slip.erroneous & MANIFEST_ERROR_ITEM) - centcom_message += "Package incomplete. " - centcom_message += "Points refunded.
" - else if(!slip.erroneous && !denied) // Approving a proper order awards the relatively tiny points_per_slip - points += points_per_slip - centcom_message += "+1: Package [slip.ordernumber] accorded.
" - else // You done goofed. - if(slip.erroneous) - centcom_message += "+0: Station approved package [slip.ordernumber] despite error: " - if(slip.erroneous & MANIFEST_ERROR_NAME) - centcom_message += "Destination station incorrect." - else if(slip.erroneous & MANIFEST_ERROR_COUNT) - centcom_message += "Packages incorrectly counted." - else if(slip.erroneous & MANIFEST_ERROR_ITEM) - centcom_message += "We found unshipped items on our dock." - centcom_message += " Be more vigilant.
" - else - points -= slip.points-points_per_crate - centcom_message += "-[slip.points-points_per_crate]: Station denied package [slip.ordernumber]. Our records show no fault on our part.
" - find_slip = 0 - continue + centcom_message += "We found unshipped items on our dock." + centcom_message += " Be more vigilant.
" + else + points -= slip.points-points_per_crate + centcom_message += "-[slip.points-points_per_crate]: Station denied package [slip.ordernumber]. Our records show no fault on our part.
" + find_slip = 0 + continue - // Sell plasma - if(istype(A, /obj/item/stack/sheet/mineral/plasma)) - var/obj/item/stack/sheet/mineral/plasma/P = A - plasma_count += P.amount + // Sell plasma + if(istype(A, /obj/item/stack/sheet/mineral/plasma)) + var/obj/item/stack/sheet/mineral/plasma/P = A + plasma_count += P.amount - // Sell syndicate intel - if(istype(A, /obj/item/documents/syndicate)) - intel_count += 1 + // Sell syndicate intel + if(istype(A, /obj/item/documents/syndicate)) + intel_count += 1 - if(istype(A, /obj/item/seeds)) - var/obj/item/seeds/S = A - if(S.rarity == 0) // Mundane species - centcom_message += "+0: We don't need samples of mundane species \"[capitalize(S.species)]\".
" - else if(discoveredPlants[S.type]) // This species has already been sent to CentComm - var/potDiff = S.potency - discoveredPlants[S.type] // Compare it to the previous best - if(potDiff > 0) // This sample is better - discoveredPlants[S.type] = S.potency - centcom_message += "+[potDiff]: New sample of \"[capitalize(S.species)]\" is superior. Good work.
" - points += potDiff - else // This sample is worthless - centcom_message += "+0: New sample of \"[capitalize(S.species)]\" is not more potent than existing sample ([discoveredPlants[S.type]] potency).
" - else // This is a new discovery! + if(istype(A, /obj/item/seeds)) + var/obj/item/seeds/S = A + if(S.rarity == 0) // Mundane species + centcom_message += "+0: We don't need samples of mundane species \"[capitalize(S.species)]\".
" + else if(discoveredPlants[S.type]) // This species has already been sent to CentComm + var/potDiff = S.potency - discoveredPlants[S.type] // Compare it to the previous best + if(potDiff > 0) // This sample is better discoveredPlants[S.type] = S.potency - centcom_message += "+[S.rarity]: New species discovered: \"[capitalize(S.species)]\". Excellent work.
" - points += S.rarity // That's right, no bonus for potency. Send a crappy sample first to "show improvement" later - qdel(MA) + centcom_message += "+[potDiff]: New sample of \"[capitalize(S.species)]\" is superior. Good work.
" + points += potDiff + else // This sample is worthless + centcom_message += "+0: New sample of \"[capitalize(S.species)]\" is not more potent than existing sample ([discoveredPlants[S.type]] potency).
" + else // This is a new discovery! + discoveredPlants[S.type] = S.potency + centcom_message += "+[S.rarity]: New species discovered: \"[capitalize(S.species)]\". Excellent work.
" + points += S.rarity // That's right, no bonus for potency. Send a crappy sample first to "show improvement" later + qdel(MA) - if(plasma_count) - centcom_message += "+[round(plasma_count/plasma_per_point)]: Received [plasma_count] unit(s) of exotic material.
" - points += round(plasma_count / plasma_per_point) + if(plasma_count) + centcom_message += "+[round(plasma_count/plasma_per_point)]: Received [plasma_count] unit(s) of exotic material.
" + points += round(plasma_count / plasma_per_point) - if(intel_count) - centcom_message += "+[round(intel_count*points_per_intel)]: Received [intel_count] article(s) of enemy intelligence.
" - points += round(intel_count*points_per_intel) + if(intel_count) + centcom_message += "+[round(intel_count*points_per_intel)]: Received [intel_count] article(s) of enemy intelligence.
" + points += round(intel_count*points_per_intel) - if(crate_count) - centcom_message += "+[round(crate_count*points_per_crate)]: Received [crate_count] crate(s).
" - points += crate_count * points_per_crate + if(crate_count) + centcom_message += "+[round(crate_count*points_per_crate)]: Received [crate_count] crate(s).
" + points += crate_count * points_per_crate - //Buyin - proc/buy() - if(!shoppinglist.len) return +//Buyin +/datum/controller/supply_shuttle/proc/buy() + if(!shoppinglist.len) return - var/shuttle_at - if(at_station) shuttle_at = SUPPLY_STATION_AREATYPE - else shuttle_at = SUPPLY_DOCK_AREATYPE + var/shuttle_at + if(at_station) shuttle_at = SUPPLY_STATION_AREATYPE + else shuttle_at = SUPPLY_DOCK_AREATYPE - var/area/shuttle = locate(shuttle_at) - if(!shuttle) return + var/area/shuttle = locate(shuttle_at) + if(!shuttle) return - var/list/clear_turfs = list() + var/list/clear_turfs = list() - for(var/turf/T in shuttle) - if(T.density || T.contents.len) continue - clear_turfs += T + for(var/turf/T in shuttle) + if(T.density || T.contents.len) continue + clear_turfs += T - for(var/S in shoppinglist) - if(!clear_turfs.len) break - var/i = rand(1,clear_turfs.len) - var/turf/pickedloc = clear_turfs[i] - clear_turfs.Cut(i,i+1) + for(var/S in shoppinglist) + if(!clear_turfs.len) break + var/i = rand(1,clear_turfs.len) + var/turf/pickedloc = clear_turfs[i] + clear_turfs.Cut(i,i+1) - var/datum/supply_order/SO = S - var/datum/supply_packs/SP = SO.object + var/datum/supply_order/SO = S + var/datum/supply_packs/SP = SO.object - var/atom/A = new SP.containertype(pickedloc) - A.name = "[SP.containername] [SO.comment ? "([SO.comment])":"" ]" + var/atom/A = new SP.containertype(pickedloc) + A.name = "[SP.containername] [SO.comment ? "([SO.comment])":"" ]" - //supply manifest generation begin + //supply manifest generation begin - var/obj/item/weapon/paper/manifest/slip = new /obj/item/weapon/paper/manifest(A) + var/obj/item/weapon/paper/manifest/slip = new /obj/item/weapon/paper/manifest(A) - var printed_station_name = world.name // World name is available in the title bar, station_name can be different based on config. - if(prob(5)) - printed_station_name = new_station_name() - slip.erroneous |= MANIFEST_ERROR_NAME // They got our station name wrong. BASTARDS! - // IDEA: Have Centcom accidentally send random low-value crates in large orders, give large bonus for returning them intact. - var printed_packages_amount = supply_shuttle.shoppinglist.len - if(prob(5)) - printed_packages_amount += rand(1,2) // I considered rand(-2,2), but that could be zero. Heh. - slip.erroneous |= MANIFEST_ERROR_COUNT // They typoed the number of crates in this shipment. It won't match the other manifests. + var printed_station_name = station_name() + if(prob(5)) + printed_station_name = new_station_name() + slip.erroneous |= MANIFEST_ERROR_NAME // They got our station name wrong. BASTARDS! + // IDEA: Have Centcom accidentally send random low-value crates in large orders, give large bonus for returning them intact. + var printed_packages_amount = supply_shuttle.shoppinglist.len + if(prob(5)) + printed_packages_amount += rand(1,2) // I considered rand(-2,2), but that could be zero. Heh. + slip.erroneous |= MANIFEST_ERROR_COUNT // They typoed the number of crates in this shipment. It won't match the other manifests. - slip.points = SP.cost - slip.ordernumber = SO.ordernum - slip.info = "

[command_name()] Shipping Manifest



" - slip.info +="Order #[SO.ordernum]
" - slip.info +="Destination: [printed_station_name]
" - slip.info +="[printed_packages_amount] PACKAGES IN THIS SHIPMENT
" - slip.info +="CONTENTS:

" + slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
" // And now this is actually meaningful. - supply_shuttle.shoppinglist.Cut() - return + supply_shuttle.shoppinglist.Cut() + return /obj/item/weapon/paper/manifest name = "supply manifest" diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index 97bc448a4c2..1af635b5d18 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -1,6 +1,6 @@ var/datum/controller/vote/vote = new() -datum/controller/vote +/datum/controller/vote var/initiator = null var/started_timeofday = null var/time_remaining = 0 @@ -10,253 +10,253 @@ datum/controller/vote var/list/voted = list() var/list/voting = list() - New() - if(vote != src) - if(istype(vote)) - del(vote) - vote = src +/datum/controller/vote/New() + if(vote != src) + if(istype(vote)) + del(vote) + vote = src - proc/process() //called by master_controller - if(mode) - time_remaining = started_timeofday + config.vote_period - if(world.timeofday < started_timeofday) - time_remaining -= 864000 - time_remaining = round((time_remaining - world.timeofday)/10) - - var/i=1 - if(time_remaining < 0) - result() - while(i<=voting.len) - var/client/C = voting[i] - if(C) - C << browse(null,"window=vote;can_close=0") - i++ - reset() - else - var/datum/browser/client_popup - while(i<=voting.len) - var/client/C = voting[i] - if(C) - //C << browse(vote.interface(C),"window=vote;can_close=0") - client_popup = new(C, "vote", "Voting Panel") - client_popup.set_window_options("can_close=0") - client_popup.set_content(vote.interface(C)) - client_popup.open(0) - - i++ - else - voting.Cut(i,i+1) - - proc/reset() - initiator = null - time_remaining = 0 - mode = null - question = null - choices.Cut() - voted.Cut() - voting.Cut() - - proc/get_result() - //get the highest number of votes - var/greatest_votes = 0 - var/total_votes = 0 - for(var/option in choices) - var/votes = choices[option] - total_votes += votes - if(votes > greatest_votes) - greatest_votes = votes - //default-vote for everyone who didn't vote - if(!config.vote_no_default && choices.len) - var/non_voters = (clients.len - total_votes) - if(non_voters > 0) - if(mode == "restart") - choices["Continue Playing"] += non_voters - if(choices["Continue Playing"] >= greatest_votes) - greatest_votes = choices["Continue Playing"] - else if(mode == "gamemode") - if(master_mode in choices) - choices[master_mode] += non_voters - if(choices[master_mode] >= greatest_votes) - greatest_votes = choices[master_mode] - //get all options with that many votes and return them in a list - . = list() - if(greatest_votes) - for(var/option in choices) - if(choices[option] == greatest_votes) - . += option - return . - - proc/announce_result() - var/list/winners = get_result() - var/text - if(winners.len > 0) - if(question) text += "[question]" - else text += "[capitalize(mode)] Vote" - for(var/i=1,i<=choices.len,i++) - var/votes = choices[choices[i]] - if(!votes) votes = 0 - text += "\n[choices[i]]: [votes]" - if(mode != "custom") - if(winners.len > 1) - text = "\nVote Tied Between:" - for(var/option in winners) - text += "\n\t[option]" - . = pick(winners) - text += "\nVote Result: [.]" - else - text += "\nDid not vote: [clients.len-voted.len]" - else - text += "Vote Result: Inconclusive - No Votes!" - log_vote(text) - world << "\n[text]" - return . - - proc/result() - . = announce_result() - var/restart = 0 - if(.) - switch(mode) - if("restart") - if(. == "Restart Round") - restart = 1 - if("gamemode") - if(master_mode != .) - world.save_mode(.) - if(ticker && ticker.mode) - restart = 1 - else - master_mode = . - - if(restart) - world << "World restarting due to vote..." - feedback_set_details("end_error","restart vote") - if(blackbox) blackbox.save_all_data_to_sql() - sleep(50) - log_game("Rebooting due to restart vote") - world.Reboot() - - return . - - proc/submit_vote(var/vote) - if(mode) - if(config.vote_no_dead && usr.stat == DEAD && !usr.client.holder) - return 0 - if(!(usr.ckey in voted)) - if(vote && 1<=vote && vote<=choices.len) - voted += usr.ckey - choices[choices[vote]]++ //check this - return vote - return 0 - - proc/initiate_vote(var/vote_type, var/initiator_key) - if(!mode) - if(started_timeofday != null) - var/next_allowed_timeofday = (started_timeofday + config.vote_delay) - if(world.timeofday < started_timeofday) - next_allowed_timeofday -= 864000 - if(next_allowed_timeofday > world.timeofday) - return 0 +/datum/controller/vote/proc/process() //called by master_controller + if(mode) + time_remaining = started_timeofday + config.vote_period + if(world.timeofday < started_timeofday) + time_remaining -= 864000 + time_remaining = round((time_remaining - world.timeofday)/10) + var/i=1 + if(time_remaining < 0) + result() + while(i<=voting.len) + var/client/C = voting[i] + if(C) + C << browse(null,"window=vote;can_close=0") + i++ reset() - switch(vote_type) - if("restart") choices.Add("Restart Round","Continue Playing") - if("gamemode") choices.Add(config.votable_modes) - if("custom") - question = html_encode(input(usr,"What is the vote for?") as text|null) - if(!question) return 0 - for(var/i=1,i<=10,i++) - var/option = capitalize(html_encode(input(usr,"Please enter an option or hit cancel to finish") as text|null)) - if(!option || mode || !usr.client) break - choices.Add(option) - else return 0 - mode = vote_type - initiator = initiator_key - started_timeofday = world.timeofday - var/text = "[capitalize(mode)] vote started by [initiator]." - if(mode == "custom") - text += "\n[question]" - log_vote(text) - world << "\n[text]\nType vote to place your votes.\nYou have [config.vote_period/10] seconds to vote." - time_remaining = round(config.vote_period/10) - return 1 - return 0 - - proc/interface(var/client/C) - if(!C) return - var/admin = 0 - var/trialmin = 0 - if(C.holder) - admin = 1 - if(check_rights_for(C, R_ADMIN)) - trialmin = 1 - voting |= C - - if(mode) - if(question) . += "

Vote: '[question]'

" - else . += "

Vote: [capitalize(mode)]

" - . += "Time Left: [time_remaining] s

" - if(admin) - . += "(Cancel Vote) " else - . += "

Start a vote:



" - . += "Close" - return . + i++ + else + voting.Cut(i,i+1) +/datum/controller/vote/proc/reset() + initiator = null + time_remaining = 0 + mode = null + question = null + choices.Cut() + voted.Cut() + voting.Cut() - Topic(href,href_list[],hsrc) - if(!usr || !usr.client) return //not necessary but meh...just in-case somebody does something stupid - switch(href_list["vote"]) - if("close") - voting -= usr.client - usr << browse(null, "window=vote") - return - if("cancel") - if(usr.client.holder) - reset() - if("toggle_restart") - if(usr.client.holder) - config.allow_vote_restart = !config.allow_vote_restart - if("toggle_gamemode") - if(usr.client.holder) - config.allow_vote_mode = !config.allow_vote_mode +/datum/controller/vote/proc/get_result() + //get the highest number of votes + var/greatest_votes = 0 + var/total_votes = 0 + for(var/option in choices) + var/votes = choices[option] + total_votes += votes + if(votes > greatest_votes) + greatest_votes = votes + //default-vote for everyone who didn't vote + if(!config.vote_no_default && choices.len) + var/non_voters = (clients.len - total_votes) + if(non_voters > 0) + if(mode == "restart") + choices["Continue Playing"] += non_voters + if(choices["Continue Playing"] >= greatest_votes) + greatest_votes = choices["Continue Playing"] + else if(mode == "gamemode") + if(master_mode in choices) + choices[master_mode] += non_voters + if(choices[master_mode] >= greatest_votes) + greatest_votes = choices[master_mode] + //get all options with that many votes and return them in a list + . = list() + if(greatest_votes) + for(var/option in choices) + if(choices[option] == greatest_votes) + . += option + return . + +/datum/controller/vote/proc/announce_result() + var/list/winners = get_result() + var/text + if(winners.len > 0) + if(question) text += "[question]" + else text += "[capitalize(mode)] Vote" + for(var/i=1,i<=choices.len,i++) + var/votes = choices[choices[i]] + if(!votes) votes = 0 + text += "\n[choices[i]]: [votes]" + if(mode != "custom") + if(winners.len > 1) + text = "\nVote Tied Between:" + for(var/option in winners) + text += "\n\t[option]" + . = pick(winners) + text += "\nVote Result: [.]" + else + text += "\nDid not vote: [clients.len-voted.len]" + else + text += "Vote Result: Inconclusive - No Votes!" + log_vote(text) + world << "\n[text]" + return . + +/datum/controller/vote/proc/result() + . = announce_result() + var/restart = 0 + if(.) + switch(mode) if("restart") - if(config.allow_vote_restart || usr.client.holder) - initiate_vote("restart",usr.key) + if(. == "Restart Round") + restart = 1 if("gamemode") - if(config.allow_vote_mode || usr.client.holder) - initiate_vote("gamemode",usr.key) + if(master_mode != .) + world.save_mode(.) + if(ticker && ticker.mode) + restart = 1 + else + master_mode = . + + if(restart) + world << "World restarting due to vote..." + feedback_set_details("end_error","restart vote") + if(blackbox) blackbox.save_all_data_to_sql() + sleep(50) + log_game("Rebooting due to restart vote") + world.Reboot() + + return . + +/datum/controller/vote/proc/submit_vote(var/vote) + if(mode) + if(config.vote_no_dead && usr.stat == DEAD && !usr.client.holder) + return 0 + if(!(usr.ckey in voted)) + if(vote && 1<=vote && vote<=choices.len) + voted += usr.ckey + choices[choices[vote]]++ //check this + return vote + return 0 + +/datum/controller/vote/proc/initiate_vote(var/vote_type, var/initiator_key) + if(!mode) + if(started_timeofday != null) + var/next_allowed_timeofday = (started_timeofday + config.vote_delay) + if(world.timeofday < started_timeofday) + next_allowed_timeofday -= 864000 + if(next_allowed_timeofday > world.timeofday) + return 0 + + reset() + switch(vote_type) + if("restart") choices.Add("Restart Round","Continue Playing") + if("gamemode") choices.Add(config.votable_modes) if("custom") - if(usr.client.holder) - initiate_vote("custom",usr.key) - else - submit_vote(round(text2num(href_list["vote"]))) - usr.vote() + question = html_encode(input(usr,"What is the vote for?") as text|null) + if(!question) return 0 + for(var/i=1,i<=10,i++) + var/option = capitalize(html_encode(input(usr,"Please enter an option or hit cancel to finish") as text|null)) + if(!option || mode || !usr.client) break + choices.Add(option) + else return 0 + mode = vote_type + initiator = initiator_key + started_timeofday = world.timeofday + var/text = "[capitalize(mode)] vote started by [initiator]." + if(mode == "custom") + text += "\n[question]" + log_vote(text) + world << "\n[text]\nType vote to place your votes.\nYou have [config.vote_period/10] seconds to vote." + time_remaining = round(config.vote_period/10) + return 1 + return 0 + +/datum/controller/vote/proc/interface(var/client/C) + if(!C) return + var/admin = 0 + var/trialmin = 0 + if(C.holder) + admin = 1 + if(check_rights_for(C, R_ADMIN)) + trialmin = 1 + voting |= C + + if(mode) + if(question) . += "

Vote: '[question]'

" + else . += "

Vote: [capitalize(mode)]

" + . += "Time Left: [time_remaining] s

" + if(admin) + . += "(Cancel Vote) " + else + . += "

Start a vote:



" + . += "Close" + return . + + +/datum/controller/vote/Topic(href,href_list[],hsrc) + if(!usr || !usr.client) return //not necessary but meh...just in-case somebody does something stupid + switch(href_list["vote"]) + if("close") + voting -= usr.client + usr << browse(null, "window=vote") + return + if("cancel") + if(usr.client.holder) + reset() + if("toggle_restart") + if(usr.client.holder) + config.allow_vote_restart = !config.allow_vote_restart + if("toggle_gamemode") + if(usr.client.holder) + config.allow_vote_mode = !config.allow_vote_mode + if("restart") + if(config.allow_vote_restart || usr.client.holder) + initiate_vote("restart",usr.key) + if("gamemode") + if(config.allow_vote_mode || usr.client.holder) + initiate_vote("gamemode",usr.key) + if("custom") + if(usr.client.holder) + initiate_vote("custom",usr.key) + else + submit_vote(round(text2num(href_list["vote"]))) + usr.vote() /mob/verb/vote() @@ -268,4 +268,4 @@ datum/controller/vote var/datum/browser/popup = new(src, "vote", "Voting Panel") popup.set_window_options("can_close=0") popup.set_content(vote.interface(client)) - popup.open(0) \ No newline at end of file + popup.open(0) diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index d59767f6cfc..4d54909b27d 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -100,7 +100,7 @@ var/datum/ai_laws/lawtype = pick(typesof(/datum/ai_laws/default) - /datum/ai_laws/default) var/datum/ai_laws/templaws = new lawtype() inherent = templaws.inherent - set_zeroth_law("\red ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK#*´&110010") + set_zeroth_law("ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK#*´&110010") /datum/ai_laws/custom/New() //This reads silicon_laws.txt and allows server hosts to set custom AI starting laws. ..() diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 7477a1bea43..2fb8c9bd852 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -1,401 +1,400 @@ // reference: /client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0) -client - proc/debug_variables(datum/D in world) - set category = "Debug" - set name = "View Variables" - //set src in world +/client/proc/debug_variables(datum/D in world) + set category = "Debug" + set name = "View Variables" + //set src in world - if(!usr.client || !usr.client.holder) - usr << "\red You need to be an administrator to access this." - return - - - var/title = "" - var/body = "" - - if(!D) return - if(istype(D, /atom)) - var/atom/A = D - title = "[A.name] (\ref[A]) = [A.type]" - - #ifdef VARSICON - if (A.icon) - body += debug_variable("icon", new/icon(A.icon, A.icon_state, A.dir), 0) - #endif - - var/icon/sprite - - if(istype(D,/atom)) - var/atom/AT = D - if(AT.icon && AT.icon_state) - sprite = new /icon(AT.icon, AT.icon_state) - usr << browse_rsc(sprite, "view_vars_sprite.png") - - title = "[D] (\ref[D]) = [D.type]" - - body += {" "} - - body += "" - - body += "
" - - if(sprite) - body += "" - - body += "
" - else - body += "
" - - body += "
" - - if(istype(D,/atom)) - var/atom/A = D - if(isliving(A)) - body += "[D]" - if(A.dir) - body += "
<< [dir2text(A.dir)] >>" - var/mob/living/M = A - body += "
[M.ckey ? M.ckey : "No ckey"] / [M.real_name ? M.real_name : "No real name"]" - body += {" -
- BRUTE:[M.getBruteLoss()] - FIRE:[M.getFireLoss()] - TOXIN:[M.getToxLoss()] - OXY:[M.getOxyLoss()] - CLONE:[M.getCloneLoss()] - BRAIN:[M.getBrainLoss()] - - - - "} - else - body += "[D]" - if(A.dir) - body += "
<< [dir2text(A.dir)] >>" - else - body += "[D]" - - body += "
" - - body += "
" - - var/formatted_type = text("[D.type]") - if(length(formatted_type) > 25) - var/middle_point = length(formatted_type) / 2 - var/splitpoint = findtext(formatted_type,"/",middle_point) - if(splitpoint) - formatted_type = "[copytext(formatted_type,1,splitpoint)]
[copytext(formatted_type,splitpoint)]" - else - formatted_type = "Type too long" //No suitable splitpoint (/) found. - - body += "
[formatted_type]" - - if(src.holder && src.holder.marked_datum && src.holder.marked_datum == D) - body += "
Marked Object" - - body += "
" - - body += "
Refresh" - - //if(ismob(D)) - // body += "
Show player panel

" - - body += {"
-
" - - body += "

" - - body += "E - Edit, tries to determine the variable type by itself.
" - body += "C - Change, asks you for the var type first.
" - body += "M - Mass modify: changes this variable for all objects of this type.

" - - body += "
Search:

" - - body += "
    " - - var/list/names = list() - for (var/V in D.vars) - names += V - - names = sortList(names) - - for (var/V in names) - body += debug_variable(V, D.vars[V], 0, D) - - body += "
" - - var/html = "" - if (title) - html += "[title]" - html += {""} - html += "" - html += body - - html += {" - - "} - - html += "" - - usr << browse(html, "window=variables\ref[D];size=475x650") - + if(!usr.client || !usr.client.holder) + usr << "You need to be an administrator to access this." return - proc/debug_variable(name, value, level, var/datum/DA = null) - var/html = "" - if(DA) - html += "
  • (E) (C) (M) " + var/title = "" + var/body = "" + + if(!D) return + if(istype(D, /atom)) + var/atom/A = D + title = "[A.name] (\ref[A]) = [A.type]" + + #ifdef VARSICON + if (A.icon) + body += debug_variable("icon", new/icon(A.icon, A.icon_state, A.dir), 0) + #endif + + var/icon/sprite + + if(istype(D,/atom)) + var/atom/AT = D + if(AT.icon && AT.icon_state) + sprite = new /icon(AT.icon, AT.icon_state) + usr << browse_rsc(sprite, "view_vars_sprite.png") + + title = "[D] (\ref[D]) = [D.type]" + + body += {" "} + + body += "" + + body += "
    " + + if(sprite) + body += "" + + body += "
    " + else + body += "
    " + + body += "
    " + + if(istype(D,/atom)) + var/atom/A = D + if(isliving(A)) + body += "[D]" + if(A.dir) + body += "
    << [dir2text(A.dir)] >>" + var/mob/living/M = A + body += "
    [M.ckey ? M.ckey : "No ckey"] / [M.real_name ? M.real_name : "No real name"]" + body += {" +
    + BRUTE:[M.getBruteLoss()] + FIRE:[M.getFireLoss()] + TOXIN:[M.getToxLoss()] + OXY:[M.getOxyLoss()] + CLONE:[M.getCloneLoss()] + BRAIN:[M.getBrainLoss()] + + + + "} else - html += "
  • " + body += "[D]" + if(A.dir) + body += "
    << [dir2text(A.dir)] >>" + else + body += "[D]" - if (isnull(value)) - html += "[name] = null" + body += "
  • " - else if (istext(value)) - html += "[name] = \"[value]\"" + body += "
    " - else if (isicon(value)) - #ifdef VARSICON - var/icon/I = new/icon(value) - var/rnd = rand(1,10000) - var/rname = "tmp\ref[I][rnd].png" - usr << browse_rsc(I, rname) - html += "[name] = ([value]) " - #else - html += "[name] = /icon ([value])" - #endif + var/formatted_type = text("[D.type]") + if(length(formatted_type) > 25) + var/middle_point = length(formatted_type) / 2 + var/splitpoint = findtext(formatted_type,"/",middle_point) + if(splitpoint) + formatted_type = "[copytext(formatted_type,1,splitpoint)]
    [copytext(formatted_type,splitpoint)]" + else + formatted_type = "Type too long" //No suitable splitpoint (/) found. + + body += "
    [formatted_type]" + + if(src.holder && src.holder.marked_datum && src.holder.marked_datum == D) + body += "
    Marked Object" + + body += "
    " + + body += "
    Refresh" + + //if(ismob(D)) + // body += "
    Show player panel

    " + + body += {"
    +
    " + + body += "

    " + + body += "E - Edit, tries to determine the variable type by itself.
    " + body += "C - Change, asks you for the var type first.
    " + body += "M - Mass modify: changes this variable for all objects of this type.

    " + + body += "
    Search:

    " + + body += "
      " + + var/list/names = list() + for (var/V in D.vars) + names += V + + names = sortList(names) + + for (var/V in names) + body += debug_variable(V, D.vars[V], 0, D) + + body += "
    " + + var/html = "" + if (title) + html += "[title]" + html += {""} + html += "" + html += body + + html += {" + + "} + + html += "" + + usr << browse(html, "window=variables\ref[D];size=475x650") + + return + +/client/proc/debug_variable(name, value, level, var/datum/DA = null) + var/html = "" + + if(DA) + html += "
  • (E) (C) (M) " + else + html += "
  • " + + if (isnull(value)) + html += "[name] = null" + + else if (istext(value)) + html += "[name] = \"[value]\"" + + else if (isicon(value)) + #ifdef VARSICON + var/icon/I = new/icon(value) + var/rnd = rand(1,10000) + var/rname = "tmp\ref[I][rnd].png" + usr << browse_rsc(I, rname) + html += "[name] = ([value]) " + #else + html += "[name] = /icon ([value])" + #endif /* else if (istype(value, /image)) - #ifdef VARSICON - var/rnd = rand(1, 10000) - var/image/I = value + #ifdef VARSICON + var/rnd = rand(1, 10000) + var/image/I = value - src << browse_rsc(I.icon, "tmp\ref[value][rnd].png") - html += "[name] = " - #else - html += "[name] = /image ([value])" - #endif + src << browse_rsc(I.icon, "tmp\ref[value][rnd].png") + html += "[name] = " + #else + html += "[name] = /image ([value])" + #endif */ - else if (isfile(value)) - html += "[name] = '[value]'" + else if (isfile(value)) + html += "[name] = '[value]'" - else if (istype(value, /datum)) - var/datum/D = value - html += "[name] \ref[value] = [D.type]" + else if (istype(value, /datum)) + var/datum/D = value + html += "[name] \ref[value] = [D.type]" - else if (istype(value, /client)) - var/client/C = value - html += "[name] \ref[value] = [C] [C.type]" - // - else if (istype(value, /list)) - var/list/L = value - html += "[name] = /list ([L.len])" + else if (istype(value, /client)) + var/client/C = value + html += "[name] \ref[value] = [C] [C.type]" +// + else if (istype(value, /list)) + var/list/L = value + html += "[name] = /list ([L.len])" - if (L.len > 0 && !(name == "underlays" || name == "overlays" || name == "vars" || L.len > 500)) - // not sure if this is completely right... - if(0) //(L.vars.len > 0) - html += "
      " - html += "
    " - else - html += "" + if (L.len > 0 && !(name == "underlays" || name == "overlays" || name == "vars" || L.len > 500)) + // not sure if this is completely right... + if(0) //(L.vars.len > 0) + html += "
      " + html += "
    " + else + html += "" - else - html += "[name] = [value]" + else + html += "[name] = [value]" - html += "
  • " + html += "" - return html + return html /client/proc/view_var_Topic(href, href_list, hsrc) //This should all be moved over to datum/admins/Topic() or something ~Carn @@ -610,7 +609,7 @@ client usr << "No objects of this type exist" return log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ") - message_admins("\blue [key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ") + message_admins("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ") if("Type and subtypes") var/i = 0 for(var/obj/Obj in world) @@ -621,7 +620,7 @@ client usr << "No objects of this type exist" return log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ") - message_admins("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ") + message_admins("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ") else if(href_list["addreagent"]) if(!check_rights(0)) return @@ -651,7 +650,7 @@ client if(amount) A.reagents.add_reagent(chosen_id, amount) log_admin("[key_name(usr)] has added [amount] units of [chosen] to \the [A]") - message_admins("\blue [key_name(usr)] has added [amount] units of [chosen] to \the [A]") + message_admins("[key_name(usr)] has added [amount] units of [chosen] to \the [A]") href_list["datumrefresh"] = href_list["addreagent"] @@ -820,7 +819,7 @@ client if(amount != 0) log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L] ") - message_admins("\blue [key_name(usr)] dealt [amount] amount of [Text] damage to [L] ") + message_admins("[key_name(usr)] dealt [amount] amount of [Text] damage to [L] ") href_list["datumrefresh"] = href_list["mobToDamage"] diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 7078ea3df42..f5d6ceef2bd 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -35,7 +35,7 @@ if(prob(1)) if (affected_mob.nutrition > 100) affected_mob.Stun(rand(4,6)) - affected_mob.visible_message("[affected_mob] throws up!") + affected_mob.show_message("[affected_mob] throws up!") playsound(affected_mob.loc, 'sound/effects/splat.ogg', 50, 1) var/turf/location = affected_mob.loc if(istype(location, /turf/simulated)) diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index db72c42f8b8..782e518ffd7 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -24,7 +24,7 @@ if(prob(2)) affected_mob.emote("yawn") if(prob(2)) - affected_mob << "\red Your don't feel like yourself." + affected_mob << "Your don't feel like yourself." if(prob(5)) affected_mob.adjustBrainLoss(1) affected_mob.updatehealth() @@ -37,7 +37,7 @@ affected_mob.adjustBrainLoss(2) affected_mob.updatehealth() if(prob(2)) - affected_mob << "\red Your try to remember something important...but can't." + affected_mob << "Your try to remember something important...but can't." if(4) if(prob(2)) @@ -48,9 +48,9 @@ affected_mob.adjustBrainLoss(3) affected_mob.updatehealth() if(prob(2)) - affected_mob << "\red Strange buzzing fills your head, removing all thoughts." + affected_mob << "Strange buzzing fills your head, removing all thoughts." if(prob(3)) - affected_mob << "\red You lose consciousness..." + affected_mob << "You lose consciousness..." for(var/mob/O in viewers(affected_mob, null)) O.show_message("[affected_mob] suddenly collapses", 1) affected_mob.Paralyse(rand(5,10)) diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm index 9317fa12ef6..a62c4825422 100644 --- a/code/datums/diseases/cold.dm +++ b/code/datums/diseases/cold.dm @@ -21,11 +21,11 @@ return */ if(affected_mob.lying && prob(40)) //changed FROM prob(10) until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return if(prob(1) && prob(5)) - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return if(prob(1)) @@ -33,9 +33,9 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "\red Your throat feels sore." + affected_mob << "Your throat feels sore." if(prob(1)) - affected_mob << "\red Mucous runs down the back of your throat." + affected_mob << "Mucous runs down the back of your throat." if(3) /* if(affected_mob.sleeping && prob(25)) //removed until sleeping is fixed @@ -44,11 +44,11 @@ return */ if(affected_mob.lying && prob(25)) //changed FROM prob(5) until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return if(prob(1) && prob(1)) - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return if(prob(1)) @@ -56,9 +56,9 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "\red Your throat feels sore." + affected_mob << "Your throat feels sore." if(prob(1)) - affected_mob << "\red Mucous runs down the back of your throat." + affected_mob << "Mucous runs down the back of your throat." if(prob(1) && prob(50)) if(!affected_mob.resistances.Find(/datum/disease/flu)) var/datum/disease/Flu = new /datum/disease/flu(0) diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/cold9.dm index bea72ec36e7..e22016eb01f 100644 --- a/code/datums/diseases/cold9.dm +++ b/code/datums/diseases/cold9.dm @@ -16,7 +16,7 @@ if(2) affected_mob.bodytemperature -= 10 if(prob(1) && prob(10)) - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return if(prob(1)) @@ -24,9 +24,9 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "\red Your throat feels sore." + affected_mob << "Your throat feels sore." if(prob(5)) - affected_mob << "\red You feel stiff." + affected_mob << "You feel stiff." if(3) affected_mob.bodytemperature -= 20 if(prob(1)) @@ -34,6 +34,6 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "\red Your throat feels sore." + affected_mob << "Your throat feels sore." if(prob(10)) - affected_mob << "\red You feel stiff." \ No newline at end of file + affected_mob << "You feel stiff." \ No newline at end of file diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index 9aa2c6c1fec..764119b587c 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -23,11 +23,11 @@ if(prob(8)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "\red Your muscles ache." + affected_mob << "Your muscles ache." if(prob(20)) affected_mob.take_organ_damage(1) if(prob(1)) - affected_mob << "\red Your stomach hurts." + affected_mob << "Your stomach hurts." if(prob(20)) affected_mob.adjustToxLoss(2) affected_mob.updatehealth() @@ -42,7 +42,7 @@ src.original_dna["UI"] = affected_mob.dna.uni_identity src.original_dna["SE"] = affected_mob.dna.struc_enzymes - affected_mob << "\red You don't feel like yourself.." + affected_mob << "You don't feel like yourself.." affected_mob.dna.uni_identity = strain_data["UI"] updateappearance(affected_mob) affected_mob.dna.struc_enzymes = strain_data["SE"] @@ -62,5 +62,5 @@ affected_mob.dna.struc_enzymes = original_dna["SE"] affected_mob.real_name = original_dna["name"] - affected_mob << "\blue You feel more like yourself." + affected_mob << "You feel more like yourself." ..() \ No newline at end of file diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/fake_gbs.dm index 2ef958bc04a..a56e62c28d0 100644 --- a/code/datums/diseases/fake_gbs.dm +++ b/code/datums/diseases/fake_gbs.dm @@ -22,7 +22,7 @@ else if(prob(5)) affected_mob.emote("gasp") if(prob(10)) - affected_mob << "\red You're starting to feel very weak..." + affected_mob << "You're starting to feel very weak..." if(4) if(prob(10)) affected_mob.emote("cough") diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm index bb32b44e5b8..74dcdafaa93 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/flu.dm @@ -22,7 +22,7 @@ return */ if(affected_mob.lying && prob(20)) //added until sleeping is fixed --Blaank - affected_mob << "\blue You feel better." + affected_mob << "You feel better." stage-- return if(prob(1)) @@ -30,11 +30,11 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "\red Your muscles ache." + affected_mob << "Your muscles ache." if(prob(20)) affected_mob.take_organ_damage(1) if(prob(1)) - affected_mob << "\red Your stomach hurts." + affected_mob << "Your stomach hurts." if(prob(20)) affected_mob.adjustToxLoss(1) affected_mob.updatehealth() @@ -47,7 +47,7 @@ return */ if(affected_mob.lying && prob(15)) //added until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." stage-- return if(prob(1)) @@ -55,11 +55,11 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "\red Your muscles ache." + affected_mob << "Your muscles ache." if(prob(20)) affected_mob.take_organ_damage(1) if(prob(1)) - affected_mob << "\red Your stomach hurts." + affected_mob << "Your stomach hurts." if(prob(20)) affected_mob.adjustToxLoss(1) affected_mob.updatehealth() diff --git a/code/datums/diseases/fluspanish.dm b/code/datums/diseases/fluspanish.dm index 8400d196b67..ef85ab1961d 100644 --- a/code/datums/diseases/fluspanish.dm +++ b/code/datums/diseases/fluspanish.dm @@ -21,7 +21,7 @@ if(prob(5)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "\red You're burning in your own skin!" + affected_mob << "You're burning in your own skin!" affected_mob.take_organ_damage(0,5) if(3) @@ -31,6 +31,6 @@ if(prob(5)) affected_mob.emote("cough") if(prob(5)) - affected_mob << "\red You're burning in your own skin!" + affected_mob << "You're burning in your own skin!" affected_mob.take_organ_damage(0,5) return diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm index ceddf45117f..9a677b7111c 100644 --- a/code/datums/diseases/gbs.dm +++ b/code/datums/diseases/gbs.dm @@ -26,14 +26,14 @@ else if(prob(5)) affected_mob.emote("gasp") if(prob(10)) - affected_mob << "\red You're starting to feel very weak..." + affected_mob << "You're starting to feel very weak..." if(4) if(prob(10)) affected_mob.emote("cough") affected_mob.adjustToxLoss(5) affected_mob.updatehealth() if(5) - affected_mob << "\red Your body feels as if it's trying to rip itself open..." + affected_mob << "Your body feels as if it's trying to rip itself open..." if(prob(50)) affected_mob.gib() else diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/magnitis.dm index fb9fe042b83..b6f6aa91f1b 100644 --- a/code/datums/diseases/magnitis.dm +++ b/code/datums/diseases/magnitis.dm @@ -16,7 +16,7 @@ switch(stage) if(2) if(prob(2)) - affected_mob << "\red You feel a slight shock course through your body." + affected_mob << "You feel a slight shock course through your body." if(prob(2)) for(var/obj/M in orange(2,affected_mob)) if(!M.anchored && (M.flags & CONDUCT)) @@ -36,9 +36,9 @@ */ if(3) if(prob(2)) - affected_mob << "\red You feel a strong shock course through your body." + affected_mob << "You feel a strong shock course through your body." if(prob(2)) - affected_mob << "\red You feel like clowning around." + affected_mob << "You feel like clowning around." if(prob(4)) for(var/obj/M in orange(4,affected_mob)) if(!M.anchored && (M.flags & CONDUCT)) @@ -64,9 +64,9 @@ */ if(4) if(prob(2)) - affected_mob << "\red You feel a powerful shock course through your body." + affected_mob << "You feel a powerful shock course through your body." if(prob(2)) - affected_mob << "\red You query upon the nature of miracles." + affected_mob << "You query upon the nature of miracles." if(prob(8)) for(var/obj/M in orange(6,affected_mob)) if(!M.anchored && (M.flags & CONDUCT)) diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm index e014e901902..6f7f16301b8 100644 --- a/code/datums/diseases/pierrot_throat.dm +++ b/code/datums/diseases/pierrot_throat.dm @@ -16,10 +16,10 @@ ..() switch(stage) if(1) - if(prob(10)) affected_mob << "\red You feel a little silly." + if(prob(10)) affected_mob << "You feel a little silly." if(2) - if(prob(10)) affected_mob << "\red You start seeing rainbows." + if(prob(10)) affected_mob << "You start seeing rainbows." if(3) - if(prob(10)) affected_mob << "\red Your thoughts are interrupted by a loud HONK!" + if(prob(10)) affected_mob << "Your thoughts are interrupted by a loud HONK!" if(4) if(prob(5)) affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) ) diff --git a/code/datums/diseases/retrovirus.dm b/code/datums/diseases/retrovirus.dm index 521176fbf1a..3c6450ccd8a 100644 --- a/code/datums/diseases/retrovirus.dm +++ b/code/datums/diseases/retrovirus.dm @@ -38,15 +38,15 @@ return */ if(affected_mob.lying && prob(30)) //changed FROM prob(20) until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return if (prob(8)) - affected_mob << "\red Your head hurts." + affected_mob << "Your head hurts." if (prob(9)) affected_mob << "You feel a tingling sensation in your chest." if (prob(9)) - affected_mob << "\red You feel angry." + affected_mob << "You feel angry." if(2) if(restcure) /* @@ -56,18 +56,18 @@ return */ if(affected_mob.lying && prob(20)) //changed FROM prob(10) until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return if (prob(8)) - affected_mob << "\red Your skin feels loose." + affected_mob << "Your skin feels loose." if (prob(10)) affected_mob << "You feel very strange." if (prob(4)) - affected_mob << "\red You feel a stabbing pain in your head!" + affected_mob << "You feel a stabbing pain in your head!" affected_mob.Paralyse(2) if (prob(4)) - affected_mob << "\red Your stomach churns." + affected_mob << "Your stomach churns." if(3) if(restcure) /* @@ -77,11 +77,11 @@ return */ if(affected_mob.lying && prob(20)) //changed FROM prob(10) until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return if (prob(10)) - affected_mob << "\red Your entire body vibrates." + affected_mob << "Your entire body vibrates." if (prob(35)) if(prob(50)) scramble_dna(affected_mob, 1, 0, rand(15,45)) @@ -96,7 +96,7 @@ return */ if(affected_mob.lying && prob(5)) //changed FROM prob(5) until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return if (prob(60)) diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm index 1defba4e13d..9de82ceaac0 100644 --- a/code/datums/diseases/rhumba_beat.dm +++ b/code/datums/diseases/rhumba_beat.dm @@ -22,29 +22,29 @@ affected_mob.adjustToxLoss(5) affected_mob.updatehealth() if(prob(1)) - affected_mob << "\red You feel strange..." + affected_mob << "You feel strange..." if(3) if(affected_mob.ckey == "rosham") src.cure() if(prob(5)) - affected_mob << "\red You feel the urge to dance..." + affected_mob << "You feel the urge to dance..." else if(prob(5)) affected_mob.emote("gasp") else if(prob(10)) - affected_mob << "\red You feel the need to chick chicky boom..." + affected_mob << "You feel the need to chick chicky boom..." if(4) if(affected_mob.ckey == "rosham") src.cure() if(prob(10)) affected_mob.emote("gasp") - affected_mob << "\red You feel a burning beat inside..." + affected_mob << "You feel a burning beat inside..." if(prob(20)) affected_mob.adjustToxLoss(5) affected_mob.updatehealth() if(5) if(affected_mob.ckey == "rosham") src.cure() - affected_mob << "\red Your body is unable to contain the Rhumba Beat..." + affected_mob << "Your body is unable to contain the Rhumba Beat..." if(prob(50)) affected_mob.gib() else diff --git a/code/datums/diseases/robotic_transformation.dm b/code/datums/diseases/robotic_transformation.dm index da0540c8bdc..ac63febb375 100644 --- a/code/datums/diseases/robotic_transformation.dm +++ b/code/datums/diseases/robotic_transformation.dm @@ -22,12 +22,12 @@ affected_mob << "Your joints feel stiff." affected_mob.take_organ_damage(1) if (prob(9)) - affected_mob << "\red Beep...boop.." + affected_mob << "Beep...boop.." if (prob(9)) - affected_mob << "\red Bop...beeep..." + affected_mob << "Bop...beeep..." if(3) if (prob(8)) - affected_mob << "\red Your joints feel very stiff." + affected_mob << "Your joints feel very stiff." affected_mob.take_organ_damage(1) if (prob(8)) affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop")) @@ -35,20 +35,20 @@ affected_mob << "Your skin feels loose." affected_mob.take_organ_damage(5) if (prob(4)) - affected_mob << "\red You feel a stabbing pain in your head." + affected_mob << "You feel a stabbing pain in your head." affected_mob.Paralyse(2) if (prob(4)) - affected_mob << "\red You can feel something move...inside." + affected_mob << "You can feel something move...inside." if(4) if (prob(10)) - affected_mob << "\red Your skin feels very loose." + affected_mob << "Your skin feels very loose." affected_mob.take_organ_damage(8) if (prob(20)) affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee...")) if (prob(8)) - affected_mob << "\red You can feel... something...inside you." + affected_mob << "You can feel... something...inside you." if(5) - affected_mob <<"\red Your skin feels as if it's about to burst off..." + affected_mob <<"Your skin feels as if it's about to burst off..." affected_mob.adjustToxLoss(10) affected_mob.updatehealth() if(prob(40)) //So everyone can feel like robot Seth Brundle diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 70d24233e43..3526359eadb 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -58,7 +58,6 @@ var/mob/living/new_mob = new new_form(affected_mob.loc) if(istype(new_mob)) new_mob.a_intent = "harm" - new_mob.universal_speak = 1 if(affected_mob.mind) affected_mob.mind.transfer_to(new_mob) else @@ -126,10 +125,10 @@ desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg." hidden = list(0, 0) stage1 = null - stage2 = list("Your joints feel stiff.", "\red Beep...boop..") - stage3 = list("\red Your joints feel very stiff.", "Your skin feels loose.", "\red You can feel something move...inside.") - stage4 = list("\red Your skin feels very loose.", "\red You can feel... something...inside you.") - stage5 = list("\red Your skin feels as if it's about to burst off!") + stage2 = list("Your joints feel stiff.", "Beep...boop..") + stage3 = list("Your joints feel very stiff.", "Your skin feels loose.", "You can feel something move...inside.") + stage4 = list("Your skin feels very loose.", "You can feel... something...inside you.") + stage5 = list("Your skin feels as if it's about to burst off!") new_form = /mob/living/silicon/robot /datum/disease/transformation/robot/stage_act() @@ -155,10 +154,10 @@ agent = "Rip-LEY Alien Microbes" hidden = list(0, 0) stage1 = null - stage2 = list("Your throat feels scratchy.", "\red Kill...") - stage3 = list("\red Your throat feels very scratchy.", "Your skin feels tight.", "\red You can feel something move...inside.") - stage4 = list("\red Your skin feels very tight.", "\red Your blood boils!", "\red You can feel... something...inside you.") - stage5 = list("\red Your skin feels as if it's about to burst off!") + stage2 = list("Your throat feels scratchy.", "Kill...") + stage3 = list("Your throat feels very scratchy.", "Your skin feels tight.", "You can feel something move...inside.") + stage4 = list("Your skin feels very tight.", "Your blood boils!", "You can feel... something...inside you.") + stage5 = list("Your skin feels as if it's about to burst off!") new_form = /mob/living/carbon/alien/humanoid/hunter /datum/disease/transformation/xeno/stage_act() @@ -183,9 +182,9 @@ hidden = list(0, 0) stage1 = list("You don't feel very well.") stage2 = list("You are turning a little green.") - stage3 = list("\red Your limbs are getting oozy.", "\red Your skin begins to peel away.") - stage4 = list("\red You are turning into a slime.") - stage5 = list("\red You have become a slime.") + stage3 = list("Your limbs are getting oozy.", "Your skin begins to peel away.") + stage4 = list("You are turning into a slime.") + stage5 = list("You have become a slime.") new_form = /mob/living/carbon/slime /datum/disease/transformation/slime/stage_act() @@ -208,9 +207,9 @@ hidden = list(0, 0) stage1 = list("BARK.") stage2 = list("You feel the need to wear silly hats.") - stage3 = list("\red Must... eat... chocolate....", "\red YAP") - stage4 = list("\red Visions of washing machines assail your mind!") - stage5 = list("\red AUUUUUU!!!") + stage3 = list("Must... eat... chocolate....", "YAP") + stage4 = list("Visions of washing machines assail your mind!") + stage5 = list("AUUUUUU!!!") new_form = /mob/living/simple_animal/corgi /datum/disease/transformation/corgi/stage_act() diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index e0662319605..42579215037 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -32,14 +32,14 @@ STI KALY - blind if(prob(1)&&prob(50)) affected_mob.say(pick("You shall not pass!", "Expeliarmus!", "By Merlins beard!", "Feel the power of the Dark Side!")) if(prob(1)&&prob(50)) - affected_mob << "\red You feel [pick("that you don't have enough mana.", "that the winds of magic are gone.", "an urge to summon familiar.")]" + affected_mob << "You feel [pick("that you don't have enough mana.", "that the winds of magic are gone.", "an urge to summon familiar.")]." if(3) if(prob(1)&&prob(50)) affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!", "STI KALY!", "TARCOL MINTI ZHERI!")) if(prob(1)&&prob(50)) - affected_mob << "\red You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar.")]." + affected_mob << "\You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar.")]." if(4) @@ -47,7 +47,7 @@ STI KALY - blind affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!","STI KALY!","EI NATH!")) return if(prob(1)&&prob(50)) - affected_mob << "\red You feel [pick("the tidal wave of raw power building inside","that this location gives you a +2 to INT and +1 to WIS","an urge to teleport")]." + affected_mob << "You feel [pick("the tidal wave of raw power building inside","that this location gives you a +2 to INT and +1 to WIS","an urge to teleport")]." spawn_wizard_clothes(50) if(prob(1)&&prob(1)) teleport() diff --git a/code/datums/diseases/xeno_transformation.dm b/code/datums/diseases/xeno_transformation.dm index 7b19b9a0927..e8d6fad3777 100644 --- a/code/datums/diseases/xeno_transformation.dm +++ b/code/datums/diseases/xeno_transformation.dm @@ -20,12 +20,12 @@ affected_mob << "Your throat feels scratchy." affected_mob.take_organ_damage(1) if (prob(9)) - affected_mob << "\red Kill..." + affected_mob << "Kill..." if (prob(9)) - affected_mob << "\red Kill..." + affected_mob << "Kill..." if(3) if (prob(8)) - affected_mob << "\red Your throat feels very scratchy." + affected_mob << "Your throat feels very scratchy." affected_mob.take_organ_damage(1) /* if (prob(8)) @@ -35,20 +35,20 @@ affected_mob << "Your skin feels tight." affected_mob.take_organ_damage(5) if (prob(4)) - affected_mob << "\red You feel a stabbing pain in your head." + affected_mob << "You feel a stabbing pain in your head." affected_mob.Paralyse(2) if (prob(4)) - affected_mob << "\red You can feel something move...inside." + affected_mob << "You can feel something move...inside." if(4) if (prob(10)) - affected_mob << pick("\red Your skin feels very tight.", "\red Your blood boils!") + affected_mob << pick("Your skin feels very tight.", "Your blood boils!") affected_mob.take_organ_damage(8) if (prob(20)) affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!")) if (prob(8)) - affected_mob << "\red You can feel... something...inside you." + affected_mob << "You can feel... something...inside you." if(5) - affected_mob <<"\red Your skin feels impossibly calloused..." + affected_mob <<"Your skin feels impossibly calloused..." affected_mob.adjustToxLoss(10) affected_mob.updatehealth() if(prob(40)) diff --git a/code/datums/gas_mixture.dm b/code/datums/gas_mixture.dm index 31c7f575aee..32b5a313094 100644 --- a/code/datums/gas_mixture.dm +++ b/code/datums/gas_mixture.dm @@ -57,871 +57,871 @@ What are the archived variables for? var/tmp/fuel_burnt = 0 //PV=nRT - related procedures - proc/heat_capacity() - var/heat_capacity = HEAT_CAPACITY_CALCULATION(oxygen,carbon_dioxide,nitrogen,toxins) +/datum/gas_mixture/proc/heat_capacity() + var/heat_capacity = HEAT_CAPACITY_CALCULATION(oxygen,carbon_dioxide,nitrogen,toxins) - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - heat_capacity += trace_gas.moles*trace_gas.specific_heat - return heat_capacity + if(trace_gases.len) + for(var/datum/gas/trace_gas in trace_gases) + heat_capacity += trace_gas.moles*trace_gas.specific_heat + return heat_capacity - proc/heat_capacity_archived() - var/heat_capacity_archived = HEAT_CAPACITY_CALCULATION(oxygen_archived,carbon_dioxide_archived,nitrogen_archived,toxins_archived) +/datum/gas_mixture/proc/heat_capacity_archived() + var/heat_capacity_archived = HEAT_CAPACITY_CALCULATION(oxygen_archived,carbon_dioxide_archived,nitrogen_archived,toxins_archived) - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - heat_capacity_archived += trace_gas.moles_archived*trace_gas.specific_heat - return heat_capacity_archived + if(trace_gases.len) + for(var/datum/gas/trace_gas in trace_gases) + heat_capacity_archived += trace_gas.moles_archived*trace_gas.specific_heat + return heat_capacity_archived - proc/total_moles() - var/moles = oxygen + carbon_dioxide + nitrogen + toxins +/datum/gas_mixture/proc/total_moles() + var/moles = oxygen + carbon_dioxide + nitrogen + toxins - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - moles += trace_gas.moles - return moles + if(trace_gases.len) + for(var/datum/gas/trace_gas in trace_gases) + moles += trace_gas.moles + return moles - proc/return_pressure() - if(volume>0) - return total_moles()*R_IDEAL_GAS_EQUATION*temperature/volume +/datum/gas_mixture/proc/return_pressure() + if(volume>0) + return total_moles()*R_IDEAL_GAS_EQUATION*temperature/volume + return 0 + + +/datum/gas_mixture/proc/return_temperature() + return temperature + + +/datum/gas_mixture/proc/return_volume() + return max(0, volume) + + +/datum/gas_mixture/proc/thermal_energy() + return temperature*heat_capacity() + + +//Procedures used for very specific events +/datum/gas_mixture/proc/check_tile_graphic() + //returns 1 if graphic changed + graphic = null + if(toxins > MOLES_PLASMA_VISIBLE) + graphic = "plasma" + else + var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in trace_gases + if(sleeping_agent && (sleeping_agent.moles > 1)) + graphic = "sleeping_agent" + else + graphic = null + + return graphic != graphic_archived + +/datum/gas_mixture/proc/react(atom/dump_location) + var/reacting = 0 //set to 1 if a notable reaction occured (used by pipe_network) + + if(trace_gases.len > 0) + if(temperature > 900) + if(toxins > MINIMUM_HEAT_CAPACITY && carbon_dioxide > MINIMUM_HEAT_CAPACITY) + var/datum/gas/oxygen_agent_b/trace_gas = locate(/datum/gas/oxygen_agent_b/) in trace_gases + if(trace_gas) + var/reaction_rate = min(carbon_dioxide*0.75, toxins*0.25, trace_gas.moles*0.05) + + carbon_dioxide -= reaction_rate + oxygen += reaction_rate + + trace_gas.moles -= reaction_rate*0.05 + + temperature -= (reaction_rate*20000)/heat_capacity() + + reacting = 1 + + fuel_burnt = 0 + if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) + //world << "pre [temperature], [oxygen], [toxins]" + if(fire() > 0) + reacting = 1 + //world << "post [temperature], [oxygen], [toxins]" + + return reacting + +/datum/gas_mixture/proc/fire() + var/energy_released = 0 + var/old_heat_capacity = heat_capacity() + + var/datum/gas/volatile_fuel/fuel_store = locate(/datum/gas/volatile_fuel/) in trace_gases + if(fuel_store) //General volatile gas burn + var/burned_fuel = 0 + + if(oxygen < fuel_store.moles) + burned_fuel = oxygen + fuel_store.moles -= burned_fuel + oxygen = 0 + else + burned_fuel = fuel_store.moles + oxygen -= fuel_store.moles + trace_gases -= fuel_store + fuel_store = null + + energy_released += FIRE_CARBON_ENERGY_RELEASED * burned_fuel + carbon_dioxide += burned_fuel + fuel_burnt += burned_fuel + + //Handle plasma burning + if(toxins > MINIMUM_HEAT_CAPACITY) + var/plasma_burn_rate = 0 + var/oxygen_burn_rate = 0 + //more plasma released at higher temperatures + var/temperature_scale + if(temperature > PLASMA_UPPER_TEMPERATURE) + temperature_scale = 1 + else + temperature_scale = (temperature-PLASMA_MINIMUM_BURN_TEMPERATURE)/(PLASMA_UPPER_TEMPERATURE-PLASMA_MINIMUM_BURN_TEMPERATURE) + if(temperature_scale > 0) + oxygen_burn_rate = 1.4 - temperature_scale + if(oxygen > toxins*PLASMA_OXYGEN_FULLBURN) + plasma_burn_rate = (toxins*temperature_scale)/4 + else + plasma_burn_rate = (temperature_scale*(oxygen/PLASMA_OXYGEN_FULLBURN))/4 + if(plasma_burn_rate > MINIMUM_HEAT_CAPACITY) + toxins -= plasma_burn_rate + oxygen -= plasma_burn_rate*oxygen_burn_rate + carbon_dioxide += plasma_burn_rate + + energy_released += FIRE_PLASMA_ENERGY_RELEASED * (plasma_burn_rate) + + fuel_burnt += (plasma_burn_rate)*(1+oxygen_burn_rate) + + if(energy_released > 0) + var/new_heat_capacity = heat_capacity() + if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) + temperature = (temperature*old_heat_capacity + energy_released)/new_heat_capacity + + return fuel_burnt + +/datum/gas_mixture/proc/archive() + //Update archived versions of variables + //Returns: 1 in all cases + +/datum/gas_mixture/proc/merge(datum/gas_mixture/giver) + //Merges all air from giver into self. Deletes giver. + //Returns: 1 on success (no failure cases yet) + +/datum/gas_mixture/proc/check_then_merge(datum/gas_mixture/giver) + //Similar to merge(...) but first checks to see if the amount of air assumed is small enough + // that group processing is still accurate for source (aborts if not) + //Returns: 1 on successful merge, 0 if the check failed + +/datum/gas_mixture/proc/remove(amount) + //Proportionally removes amount of gas from the gas_mixture + //Returns: gas_mixture with the gases removed + +/datum/gas_mixture/proc/remove_ratio(ratio) + //Proportionally removes amount of gas from the gas_mixture + //Returns: gas_mixture with the gases removed + +/datum/gas_mixture/proc/subtract(datum/gas_mixture/right_side) + //Subtracts right_side from air_mixture. Used to help turfs mingle + +/datum/gas_mixture/proc/check_then_remove(amount) + //Similar to remove(...) but first checks to see if the amount of air removed is small enough + // that group processing is still accurate for source (aborts if not) + //Returns: gas_mixture with the gases removed or null + +/datum/gas_mixture/proc/copy_from(datum/gas_mixture/sample) + //Copies variables from sample + +/datum/gas_mixture/proc/share(datum/gas_mixture/sharer) + //Performs air sharing calculations between two gas_mixtures assuming only 1 boundary length + //Return: amount of gas exchanged (+ if sharer received) + +/datum/gas_mixture/proc/mimic(turf/model) + //Similar to share(...), except the model is not modified + //Return: amount of gas exchanged + +/datum/gas_mixture/proc/check_gas_mixture(datum/gas_mixture/sharer) + //Returns: 0 if the self-check failed then -1 if sharer-check failed then 1 if both checks pass + +/datum/gas_mixture/proc/check_turf(turf/model) + //Returns: 0 if self-check failed or 1 if check passes + +// check_me_then_share(datum/gas_mixture/sharer) + //Similar to share(...) but first checks to see if amount of air moved is small enough + // that group processing is still accurate for source (aborts if not) + //Returns: 1 on successful share, 0 if the check failed + +// check_me_then_mimic(turf/model) + //Similar to mimic(...) but first checks to see if amount of air moved is small enough + // that group processing is still accurate (aborts if not) + //Returns: 1 on successful mimic, 0 if the check failed + +// check_both_then_share(datum/gas_mixture/sharer) + //Similar to check_me_then_share(...) but also checks to see if amount of air moved is small enough + // that group processing is still accurate for the sharer (aborts if not) + //Returns: 0 if the self-check failed then -1 if sharer-check failed then 1 if successful share + + +/datum/gas_mixture/proc/temperature_mimic(turf/model, conduction_coefficient) + +/datum/gas_mixture/proc/temperature_share(datum/gas_mixture/sharer, conduction_coefficient) + +/datum/gas_mixture/proc/temperature_turf_share(turf/simulated/sharer, conduction_coefficient) + + +/datum/gas_mixture/proc/check_me_then_temperature_mimic(turf/model, conduction_coefficient) + +/datum/gas_mixture/proc/check_me_then_temperature_share(datum/gas_mixture/sharer, conduction_coefficient) + +/datum/gas_mixture/proc/check_both_then_temperature_share(datum/gas_mixture/sharer, conduction_coefficient) + +/datum/gas_mixture/proc/check_me_then_temperature_turf_share(turf/simulated/sharer, conduction_coefficient) + +/datum/gas_mixture/proc/compare(datum/gas_mixture/sample) + //Compares sample to self to see if within acceptable ranges that group processing may be enabled + +/datum/gas_mixture/archive() + oxygen_archived = oxygen + carbon_dioxide_archived = carbon_dioxide + nitrogen_archived = nitrogen + toxins_archived = toxins + + if(trace_gases.len) + for(var/datum/gas/trace_gas in trace_gases) + trace_gas.moles_archived = trace_gas.moles + + temperature_archived = temperature + + graphic_archived = graphic + + return 1 + +/datum/gas_mixture/check_then_merge(datum/gas_mixture/giver) + if(!giver) + return 0 + if(((giver.oxygen > MINIMUM_AIR_TO_SUSPEND) && (giver.oxygen >= oxygen*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ + || ((giver.carbon_dioxide > MINIMUM_AIR_TO_SUSPEND) && (giver.carbon_dioxide >= carbon_dioxide*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ + || ((giver.nitrogen > MINIMUM_AIR_TO_SUSPEND) && (giver.nitrogen >= nitrogen*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ + || ((giver.toxins > MINIMUM_AIR_TO_SUSPEND) && (giver.toxins >= toxins*MINIMUM_AIR_RATIO_TO_SUSPEND))) + return 0 + if(abs(giver.temperature - temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) return 0 + if(giver.trace_gases.len) + for(var/datum/gas/trace_gas in giver.trace_gases) + var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases + if((trace_gas.moles > MINIMUM_AIR_TO_SUSPEND) && (!corresponding || (trace_gas.moles >= corresponding.moles*MINIMUM_AIR_RATIO_TO_SUSPEND))) + return 0 - proc/return_temperature() - return temperature - - - proc/return_volume() - return max(0, volume) - - - proc/thermal_energy() - return temperature*heat_capacity() - - - //Procedures used for very specific events - proc/check_tile_graphic() - //returns 1 if graphic changed - graphic = null - if(toxins > MOLES_PLASMA_VISIBLE) - graphic = "plasma" - else - var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in trace_gases - if(sleeping_agent && (sleeping_agent.moles > 1)) - graphic = "sleeping_agent" - else - graphic = null - - return graphic != graphic_archived - - proc/react(atom/dump_location) - var/reacting = 0 //set to 1 if a notable reaction occured (used by pipe_network) - - if(trace_gases.len > 0) - if(temperature > 900) - if(toxins > MINIMUM_HEAT_CAPACITY && carbon_dioxide > MINIMUM_HEAT_CAPACITY) - var/datum/gas/oxygen_agent_b/trace_gas = locate(/datum/gas/oxygen_agent_b/) in trace_gases - if(trace_gas) - var/reaction_rate = min(carbon_dioxide*0.75, toxins*0.25, trace_gas.moles*0.05) - - carbon_dioxide -= reaction_rate - oxygen += reaction_rate - - trace_gas.moles -= reaction_rate*0.05 - - temperature -= (reaction_rate*20000)/heat_capacity() - - reacting = 1 - - fuel_burnt = 0 - if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) - //world << "pre [temperature], [oxygen], [toxins]" - if(fire() > 0) - reacting = 1 - //world << "post [temperature], [oxygen], [toxins]" - - return reacting - - proc/fire() - var/energy_released = 0 - var/old_heat_capacity = heat_capacity() - - var/datum/gas/volatile_fuel/fuel_store = locate(/datum/gas/volatile_fuel/) in trace_gases - if(fuel_store) //General volatile gas burn - var/burned_fuel = 0 - - if(oxygen < fuel_store.moles) - burned_fuel = oxygen - fuel_store.moles -= burned_fuel - oxygen = 0 - else - burned_fuel = fuel_store.moles - oxygen -= fuel_store.moles - trace_gases -= fuel_store - fuel_store = null + return merge(giver) - energy_released += FIRE_CARBON_ENERGY_RELEASED * burned_fuel - carbon_dioxide += burned_fuel - fuel_burnt += burned_fuel +/datum/gas_mixture/merge(datum/gas_mixture/giver) + if(!giver) + return 0 - //Handle plasma burning - if(toxins > MINIMUM_HEAT_CAPACITY) - var/plasma_burn_rate = 0 - var/oxygen_burn_rate = 0 - //more plasma released at higher temperatures - var/temperature_scale - if(temperature > PLASMA_UPPER_TEMPERATURE) - temperature_scale = 1 - else - temperature_scale = (temperature-PLASMA_MINIMUM_BURN_TEMPERATURE)/(PLASMA_UPPER_TEMPERATURE-PLASMA_MINIMUM_BURN_TEMPERATURE) - if(temperature_scale > 0) - oxygen_burn_rate = 1.4 - temperature_scale - if(oxygen > toxins*PLASMA_OXYGEN_FULLBURN) - plasma_burn_rate = (toxins*temperature_scale)/4 - else - plasma_burn_rate = (temperature_scale*(oxygen/PLASMA_OXYGEN_FULLBURN))/4 - if(plasma_burn_rate > MINIMUM_HEAT_CAPACITY) - toxins -= plasma_burn_rate - oxygen -= plasma_burn_rate*oxygen_burn_rate - carbon_dioxide += plasma_burn_rate + if(abs(temperature-giver.temperature)>MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/self_heat_capacity = heat_capacity() + var/giver_heat_capacity = giver.heat_capacity() + var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity + if(combined_heat_capacity != 0) + temperature = (giver.temperature*giver_heat_capacity + temperature*self_heat_capacity)/combined_heat_capacity - energy_released += FIRE_PLASMA_ENERGY_RELEASED * (plasma_burn_rate) + oxygen += giver.oxygen + carbon_dioxide += giver.carbon_dioxide + nitrogen += giver.nitrogen + toxins += giver.toxins - fuel_burnt += (plasma_burn_rate)*(1+oxygen_burn_rate) + if(giver.trace_gases.len) + for(var/datum/gas/trace_gas in giver.trace_gases) + var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases + if(!corresponding) + corresponding = new trace_gas.type() + trace_gases += corresponding + corresponding.moles += trace_gas.moles - if(energy_released > 0) - var/new_heat_capacity = heat_capacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - temperature = (temperature*old_heat_capacity + energy_released)/new_heat_capacity +// del(giver) + return 1 - return fuel_burnt +/datum/gas_mixture/remove(amount) - proc/archive() - //Update archived versions of variables - //Returns: 1 in all cases - - proc/merge(datum/gas_mixture/giver) - //Merges all air from giver into self. Deletes giver. - //Returns: 1 on success (no failure cases yet) + var/sum = total_moles() + amount = min(amount,sum) //Can not take more air than tile has! + if(amount <= 0) + return null - proc/check_then_merge(datum/gas_mixture/giver) - //Similar to merge(...) but first checks to see if the amount of air assumed is small enough - // that group processing is still accurate for source (aborts if not) - //Returns: 1 on successful merge, 0 if the check failed + var/datum/gas_mixture/removed = new - proc/remove(amount) - //Proportionally removes amount of gas from the gas_mixture - //Returns: gas_mixture with the gases removed - proc/remove_ratio(ratio) - //Proportionally removes amount of gas from the gas_mixture - //Returns: gas_mixture with the gases removed + removed.oxygen = QUANTIZE((oxygen/sum)*amount) + removed.nitrogen = QUANTIZE((nitrogen/sum)*amount) + removed.carbon_dioxide = QUANTIZE((carbon_dioxide/sum)*amount) + removed.toxins = QUANTIZE((toxins/sum)*amount) - proc/subtract(datum/gas_mixture/right_side) - //Subtracts right_side from air_mixture. Used to help turfs mingle + oxygen -= removed.oxygen + nitrogen -= removed.nitrogen + carbon_dioxide -= removed.carbon_dioxide + toxins -= removed.toxins - proc/check_then_remove(amount) - //Similar to remove(...) but first checks to see if the amount of air removed is small enough - // that group processing is still accurate for source (aborts if not) - //Returns: gas_mixture with the gases removed or null + if(trace_gases.len) + for(var/datum/gas/trace_gas in trace_gases) + var/datum/gas/corresponding = new trace_gas.type() + removed.trace_gases += corresponding - proc/copy_from(datum/gas_mixture/sample) - //Copies variables from sample + corresponding.moles = (trace_gas.moles/sum)*amount + trace_gas.moles -= corresponding.moles - proc/share(datum/gas_mixture/sharer) - //Performs air sharing calculations between two gas_mixtures assuming only 1 boundary length - //Return: amount of gas exchanged (+ if sharer received) - - proc/mimic(turf/model) - //Similar to share(...), except the model is not modified - //Return: amount of gas exchanged - - proc/check_gas_mixture(datum/gas_mixture/sharer) - //Returns: 0 if the self-check failed then -1 if sharer-check failed then 1 if both checks pass - - proc/check_turf(turf/model) - //Returns: 0 if self-check failed or 1 if check passes - - // check_me_then_share(datum/gas_mixture/sharer) - //Similar to share(...) but first checks to see if amount of air moved is small enough - // that group processing is still accurate for source (aborts if not) - //Returns: 1 on successful share, 0 if the check failed - - // check_me_then_mimic(turf/model) - //Similar to mimic(...) but first checks to see if amount of air moved is small enough - // that group processing is still accurate (aborts if not) - //Returns: 1 on successful mimic, 0 if the check failed - - // check_both_then_share(datum/gas_mixture/sharer) - //Similar to check_me_then_share(...) but also checks to see if amount of air moved is small enough - // that group processing is still accurate for the sharer (aborts if not) - //Returns: 0 if the self-check failed then -1 if sharer-check failed then 1 if successful share + removed.temperature = temperature + return removed - proc/temperature_mimic(turf/model, conduction_coefficient) +/datum/gas_mixture/remove_ratio(ratio) - proc/temperature_share(datum/gas_mixture/sharer, conduction_coefficient) + if(ratio <= 0) + return null - proc/temperature_turf_share(turf/simulated/sharer, conduction_coefficient) + ratio = min(ratio, 1) + var/datum/gas_mixture/removed = new - proc/check_me_then_temperature_mimic(turf/model, conduction_coefficient) + removed.oxygen = QUANTIZE(oxygen*ratio) + removed.nitrogen = QUANTIZE(nitrogen*ratio) + removed.carbon_dioxide = QUANTIZE(carbon_dioxide*ratio) + removed.toxins = QUANTIZE(toxins*ratio) - proc/check_me_then_temperature_share(datum/gas_mixture/sharer, conduction_coefficient) + oxygen -= removed.oxygen + nitrogen -= removed.nitrogen + carbon_dioxide -= removed.carbon_dioxide + toxins -= removed.toxins - proc/check_both_then_temperature_share(datum/gas_mixture/sharer, conduction_coefficient) + if(trace_gases.len) + for(var/datum/gas/trace_gas in trace_gases) + var/datum/gas/corresponding = new trace_gas.type() + removed.trace_gases += corresponding - proc/check_me_then_temperature_turf_share(turf/simulated/sharer, conduction_coefficient) + corresponding.moles = trace_gas.moles*ratio + trace_gas.moles -= corresponding.moles - proc/compare(datum/gas_mixture/sample) - //Compares sample to self to see if within acceptable ranges that group processing may be enabled + removed.temperature = temperature - archive() - oxygen_archived = oxygen - carbon_dioxide_archived = carbon_dioxide - nitrogen_archived = nitrogen - toxins_archived = toxins + return removed - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - trace_gas.moles_archived = trace_gas.moles +/datum/gas_mixture/check_then_remove(amount) - temperature_archived = temperature + //Since it is all proportional, the check may be done on the gas as a whole + var/sum = total_moles() + amount = min(amount,sum) //Can not take more air than tile has! - graphic_archived = graphic + if((amount > MINIMUM_AIR_RATIO_TO_SUSPEND) && (amount > sum*MINIMUM_AIR_RATIO_TO_SUSPEND)) + return 0 - return 1 + return remove(amount) - check_then_merge(datum/gas_mixture/giver) - if(!giver) - return 0 - if(((giver.oxygen > MINIMUM_AIR_TO_SUSPEND) && (giver.oxygen >= oxygen*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((giver.carbon_dioxide > MINIMUM_AIR_TO_SUSPEND) && (giver.carbon_dioxide >= carbon_dioxide*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((giver.nitrogen > MINIMUM_AIR_TO_SUSPEND) && (giver.nitrogen >= nitrogen*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((giver.toxins > MINIMUM_AIR_TO_SUSPEND) && (giver.toxins >= toxins*MINIMUM_AIR_RATIO_TO_SUSPEND))) - return 0 - if(abs(giver.temperature - temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - return 0 +/datum/gas_mixture/copy_from(datum/gas_mixture/sample) + oxygen = sample.oxygen + carbon_dioxide = sample.carbon_dioxide + nitrogen = sample.nitrogen + toxins = sample.toxins - if(giver.trace_gases.len) - for(var/datum/gas/trace_gas in giver.trace_gases) - var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases - if((trace_gas.moles > MINIMUM_AIR_TO_SUSPEND) && (!corresponding || (trace_gas.moles >= corresponding.moles*MINIMUM_AIR_RATIO_TO_SUSPEND))) - return 0 + trace_gases.len=null + if(sample.trace_gases.len > 0) + for(var/datum/gas/trace_gas in sample.trace_gases) + var/datum/gas/corresponding = new trace_gas.type() + trace_gases += corresponding - return merge(giver) + corresponding.moles = trace_gas.moles - merge(datum/gas_mixture/giver) - if(!giver) - return 0 + temperature = sample.temperature - if(abs(temperature-giver.temperature)>MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity() - var/giver_heat_capacity = giver.heat_capacity() - var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity - if(combined_heat_capacity != 0) - temperature = (giver.temperature*giver_heat_capacity + temperature*self_heat_capacity)/combined_heat_capacity + return 1 - oxygen += giver.oxygen - carbon_dioxide += giver.carbon_dioxide - nitrogen += giver.nitrogen - toxins += giver.toxins +/datum/gas_mixture/subtract(datum/gas_mixture/right_side) + oxygen -= right_side.oxygen + carbon_dioxide -= right_side.carbon_dioxide + nitrogen -= right_side.nitrogen + toxins -= right_side.toxins - if(giver.trace_gases.len) - for(var/datum/gas/trace_gas in giver.trace_gases) - var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases - if(!corresponding) - corresponding = new trace_gas.type() - trace_gases += corresponding - corresponding.moles += trace_gas.moles - - // del(giver) - return 1 - - remove(amount) - - var/sum = total_moles() - amount = min(amount,sum) //Can not take more air than tile has! - if(amount <= 0) - return null - - var/datum/gas_mixture/removed = new - - - removed.oxygen = QUANTIZE((oxygen/sum)*amount) - removed.nitrogen = QUANTIZE((nitrogen/sum)*amount) - removed.carbon_dioxide = QUANTIZE((carbon_dioxide/sum)*amount) - removed.toxins = QUANTIZE((toxins/sum)*amount) - - oxygen -= removed.oxygen - nitrogen -= removed.nitrogen - carbon_dioxide -= removed.carbon_dioxide - toxins -= removed.toxins - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - var/datum/gas/corresponding = new trace_gas.type() - removed.trace_gases += corresponding - - corresponding.moles = (trace_gas.moles/sum)*amount - trace_gas.moles -= corresponding.moles - - removed.temperature = temperature - - return removed - - remove_ratio(ratio) - - if(ratio <= 0) - return null - - ratio = min(ratio, 1) - - var/datum/gas_mixture/removed = new - - removed.oxygen = QUANTIZE(oxygen*ratio) - removed.nitrogen = QUANTIZE(nitrogen*ratio) - removed.carbon_dioxide = QUANTIZE(carbon_dioxide*ratio) - removed.toxins = QUANTIZE(toxins*ratio) - - oxygen -= removed.oxygen - nitrogen -= removed.nitrogen - carbon_dioxide -= removed.carbon_dioxide - toxins -= removed.toxins - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - var/datum/gas/corresponding = new trace_gas.type() - removed.trace_gases += corresponding - - corresponding.moles = trace_gas.moles*ratio - trace_gas.moles -= corresponding.moles - - removed.temperature = temperature - - return removed - - check_then_remove(amount) - - //Since it is all proportional, the check may be done on the gas as a whole - var/sum = total_moles() - amount = min(amount,sum) //Can not take more air than tile has! - - if((amount > MINIMUM_AIR_RATIO_TO_SUSPEND) && (amount > sum*MINIMUM_AIR_RATIO_TO_SUSPEND)) - return 0 - - return remove(amount) - - copy_from(datum/gas_mixture/sample) - oxygen = sample.oxygen - carbon_dioxide = sample.carbon_dioxide - nitrogen = sample.nitrogen - toxins = sample.toxins - - trace_gases.len=null - if(sample.trace_gases.len > 0) - for(var/datum/gas/trace_gas in sample.trace_gases) - var/datum/gas/corresponding = new trace_gas.type() + if((trace_gases.len > 0)||(right_side.trace_gases.len > 0)) + for(var/datum/gas/trace_gas in right_side.trace_gases) + var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases + if(!corresponding) + corresponding = new trace_gas.type() trace_gases += corresponding - corresponding.moles = trace_gas.moles + corresponding.moles -= trace_gas.moles - temperature = sample.temperature + return 1 - return 1 +/datum/gas_mixture/check_gas_mixture(datum/gas_mixture/sharer) + if(!sharer) return 0 + var/delta_oxygen = (oxygen_archived - sharer.oxygen_archived)/5 + var/delta_carbon_dioxide = (carbon_dioxide_archived - sharer.carbon_dioxide_archived)/5 + var/delta_nitrogen = (nitrogen_archived - sharer.nitrogen_archived)/5 + var/delta_toxins = (toxins_archived - sharer.toxins_archived)/5 - subtract(datum/gas_mixture/right_side) - oxygen -= right_side.oxygen - carbon_dioxide -= right_side.carbon_dioxide - nitrogen -= right_side.nitrogen - toxins -= right_side.toxins + var/delta_temperature = (temperature_archived - sharer.temperature_archived) - if((trace_gases.len > 0)||(right_side.trace_gases.len > 0)) - for(var/datum/gas/trace_gas in right_side.trace_gases) + if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= oxygen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ + || ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= carbon_dioxide_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ + || ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= nitrogen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ + || ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= toxins_archived*MINIMUM_AIR_RATIO_TO_SUSPEND))) + return 0 + + if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) + return 0 + + if(sharer.trace_gases.len) + for(var/datum/gas/trace_gas in sharer.trace_gases) + if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases - if(!corresponding) - corresponding = new trace_gas.type() - trace_gases += corresponding - - corresponding.moles -= trace_gas.moles - - return 1 - - check_gas_mixture(datum/gas_mixture/sharer) - if(!sharer) return 0 - var/delta_oxygen = (oxygen_archived - sharer.oxygen_archived)/5 - var/delta_carbon_dioxide = (carbon_dioxide_archived - sharer.carbon_dioxide_archived)/5 - var/delta_nitrogen = (nitrogen_archived - sharer.nitrogen_archived)/5 - var/delta_toxins = (toxins_archived - sharer.toxins_archived)/5 - - var/delta_temperature = (temperature_archived - sharer.temperature_archived) - - if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= oxygen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= carbon_dioxide_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= nitrogen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= toxins_archived*MINIMUM_AIR_RATIO_TO_SUSPEND))) - return 0 - - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - return 0 - - if(sharer.trace_gases.len) - for(var/datum/gas/trace_gas in sharer.trace_gases) - if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) - var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases - if(corresponding) - if(trace_gas.moles_archived >= corresponding.moles_archived*MINIMUM_AIR_RATIO_TO_SUSPEND*4) - return 0 - else + if(corresponding) + if(trace_gas.moles_archived >= corresponding.moles_archived*MINIMUM_AIR_RATIO_TO_SUSPEND*4) return 0 - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) - if(!locate(trace_gas.type) in sharer.trace_gases) - return 0 - - if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= sharer.oxygen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= sharer.carbon_dioxide_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= sharer.nitrogen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= sharer.toxins_archived*MINIMUM_AIR_RATIO_TO_SUSPEND))) - return -1 - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) - var/datum/gas/corresponding = locate(trace_gas.type) in sharer.trace_gases - if(corresponding) - if(trace_gas.moles_archived >= corresponding.moles_archived*MINIMUM_AIR_RATIO_TO_SUSPEND*4) - return -1 - else - return -1 - - return 1 - - check_turf(turf/model) - var/delta_oxygen = (oxygen_archived - model.oxygen)/5 - var/delta_carbon_dioxide = (carbon_dioxide_archived - model.carbon_dioxide)/5 - var/delta_nitrogen = (nitrogen_archived - model.nitrogen)/5 - var/delta_toxins = (toxins_archived - model.toxins)/5 - - var/delta_temperature = (temperature_archived - model.temperature) - - if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= oxygen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= carbon_dioxide_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= nitrogen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= toxins_archived*MINIMUM_AIR_RATIO_TO_SUSPEND))) - return 0 - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - return 0 - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) + else return 0 - return 1 + if(trace_gases.len) + for(var/datum/gas/trace_gas in trace_gases) + if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) + if(!locate(trace_gas.type) in sharer.trace_gases) + return 0 - share(datum/gas_mixture/sharer, var/atmos_adjacent_turfs = 4) - if(!sharer) return 0 - var/delta_oxygen = QUANTIZE(oxygen_archived - sharer.oxygen_archived)/(atmos_adjacent_turfs+1) - var/delta_carbon_dioxide = QUANTIZE(carbon_dioxide_archived - sharer.carbon_dioxide_archived)/(atmos_adjacent_turfs+1) - var/delta_nitrogen = QUANTIZE(nitrogen_archived - sharer.nitrogen_archived)/(atmos_adjacent_turfs+1) - var/delta_toxins = QUANTIZE(toxins_archived - sharer.toxins_archived)/(atmos_adjacent_turfs+1) - - var/delta_temperature = (temperature_archived - sharer.temperature_archived) - - var/old_self_heat_capacity = 0 - var/old_sharer_heat_capacity = 0 - - var/heat_capacity_self_to_sharer = 0 - var/heat_capacity_sharer_to_self = 0 - - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - - var/delta_air = delta_oxygen+delta_nitrogen - if(delta_air) - var/air_heat_capacity = SPECIFIC_HEAT_AIR*delta_air - if(delta_air > 0) - heat_capacity_self_to_sharer += air_heat_capacity - else - heat_capacity_sharer_to_self -= air_heat_capacity - - if(delta_carbon_dioxide) - var/carbon_dioxide_heat_capacity = SPECIFIC_HEAT_CDO*delta_carbon_dioxide - if(delta_carbon_dioxide > 0) - heat_capacity_self_to_sharer += carbon_dioxide_heat_capacity - else - heat_capacity_sharer_to_self -= carbon_dioxide_heat_capacity - - if(delta_toxins) - var/toxins_heat_capacity = SPECIFIC_HEAT_TOXIN*delta_toxins - if(delta_toxins > 0) - heat_capacity_self_to_sharer += toxins_heat_capacity - else - heat_capacity_sharer_to_self -= toxins_heat_capacity - - old_self_heat_capacity = heat_capacity() - old_sharer_heat_capacity = sharer.heat_capacity() - - oxygen -= delta_oxygen - sharer.oxygen += delta_oxygen - - carbon_dioxide -= delta_carbon_dioxide - sharer.carbon_dioxide += delta_carbon_dioxide - - nitrogen -= delta_nitrogen - sharer.nitrogen += delta_nitrogen - - toxins -= delta_toxins - sharer.toxins += delta_toxins - - var/moved_moles = (delta_oxygen + delta_carbon_dioxide + delta_nitrogen + delta_toxins) - last_share = abs(delta_oxygen) + abs(delta_carbon_dioxide) + abs(delta_nitrogen) + abs(delta_toxins) - - var/list/trace_types_considered = list() - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) + if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= sharer.oxygen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ + || ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= sharer.carbon_dioxide_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ + || ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= sharer.nitrogen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ + || ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= sharer.toxins_archived*MINIMUM_AIR_RATIO_TO_SUSPEND))) + return -1 + if(trace_gases.len) + for(var/datum/gas/trace_gas in trace_gases) + if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) var/datum/gas/corresponding = locate(trace_gas.type) in sharer.trace_gases + if(corresponding) + if(trace_gas.moles_archived >= corresponding.moles_archived*MINIMUM_AIR_RATIO_TO_SUSPEND*4) + return -1 + else + return -1 + + return 1 + +/datum/gas_mixture/check_turf(turf/model) + var/delta_oxygen = (oxygen_archived - model.oxygen)/5 + var/delta_carbon_dioxide = (carbon_dioxide_archived - model.carbon_dioxide)/5 + var/delta_nitrogen = (nitrogen_archived - model.nitrogen)/5 + var/delta_toxins = (toxins_archived - model.toxins)/5 + + var/delta_temperature = (temperature_archived - model.temperature) + + if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= oxygen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ + || ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= carbon_dioxide_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ + || ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= nitrogen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ + || ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= toxins_archived*MINIMUM_AIR_RATIO_TO_SUSPEND))) + return 0 + if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) + return 0 + + if(trace_gases.len) + for(var/datum/gas/trace_gas in trace_gases) + if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) + return 0 + + return 1 + +/datum/gas_mixture/share(datum/gas_mixture/sharer, var/atmos_adjacent_turfs = 4) + if(!sharer) return 0 + var/delta_oxygen = QUANTIZE(oxygen_archived - sharer.oxygen_archived)/(atmos_adjacent_turfs+1) + var/delta_carbon_dioxide = QUANTIZE(carbon_dioxide_archived - sharer.carbon_dioxide_archived)/(atmos_adjacent_turfs+1) + var/delta_nitrogen = QUANTIZE(nitrogen_archived - sharer.nitrogen_archived)/(atmos_adjacent_turfs+1) + var/delta_toxins = QUANTIZE(toxins_archived - sharer.toxins_archived)/(atmos_adjacent_turfs+1) + + var/delta_temperature = (temperature_archived - sharer.temperature_archived) + + var/old_self_heat_capacity = 0 + var/old_sharer_heat_capacity = 0 + + var/heat_capacity_self_to_sharer = 0 + var/heat_capacity_sharer_to_self = 0 + + if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + + var/delta_air = delta_oxygen+delta_nitrogen + if(delta_air) + var/air_heat_capacity = SPECIFIC_HEAT_AIR*delta_air + if(delta_air > 0) + heat_capacity_self_to_sharer += air_heat_capacity + else + heat_capacity_sharer_to_self -= air_heat_capacity + + if(delta_carbon_dioxide) + var/carbon_dioxide_heat_capacity = SPECIFIC_HEAT_CDO*delta_carbon_dioxide + if(delta_carbon_dioxide > 0) + heat_capacity_self_to_sharer += carbon_dioxide_heat_capacity + else + heat_capacity_sharer_to_self -= carbon_dioxide_heat_capacity + + if(delta_toxins) + var/toxins_heat_capacity = SPECIFIC_HEAT_TOXIN*delta_toxins + if(delta_toxins > 0) + heat_capacity_self_to_sharer += toxins_heat_capacity + else + heat_capacity_sharer_to_self -= toxins_heat_capacity + + old_self_heat_capacity = heat_capacity() + old_sharer_heat_capacity = sharer.heat_capacity() + + oxygen -= delta_oxygen + sharer.oxygen += delta_oxygen + + carbon_dioxide -= delta_carbon_dioxide + sharer.carbon_dioxide += delta_carbon_dioxide + + nitrogen -= delta_nitrogen + sharer.nitrogen += delta_nitrogen + + toxins -= delta_toxins + sharer.toxins += delta_toxins + + var/moved_moles = (delta_oxygen + delta_carbon_dioxide + delta_nitrogen + delta_toxins) + last_share = abs(delta_oxygen) + abs(delta_carbon_dioxide) + abs(delta_nitrogen) + abs(delta_toxins) + + var/list/trace_types_considered = list() + + if(trace_gases.len) + for(var/datum/gas/trace_gas in trace_gases) + + var/datum/gas/corresponding = locate(trace_gas.type) in sharer.trace_gases + var/delta = 0 + + if(corresponding) + delta = QUANTIZE(trace_gas.moles_archived - corresponding.moles_archived)/(atmos_adjacent_turfs+1) + else + corresponding = new trace_gas.type() + sharer.trace_gases += corresponding + + delta = trace_gas.moles_archived/(atmos_adjacent_turfs+1) + + trace_gas.moles -= delta + corresponding.moles += delta + + if(delta) + var/individual_heat_capacity = trace_gas.specific_heat*delta + if(delta > 0) + heat_capacity_self_to_sharer += individual_heat_capacity + else + heat_capacity_sharer_to_self -= individual_heat_capacity + + moved_moles += delta + last_share += abs(delta) + + trace_types_considered += trace_gas.type + + + if(sharer.trace_gases.len) + for(var/datum/gas/trace_gas in sharer.trace_gases) + if(trace_gas.type in trace_types_considered) continue + else + var/datum/gas/corresponding var/delta = 0 - if(corresponding) - delta = QUANTIZE(trace_gas.moles_archived - corresponding.moles_archived)/(atmos_adjacent_turfs+1) - else - corresponding = new trace_gas.type() - sharer.trace_gases += corresponding + corresponding = new trace_gas.type() + trace_gases += corresponding - delta = trace_gas.moles_archived/(atmos_adjacent_turfs+1) + delta = trace_gas.moles_archived/5 trace_gas.moles -= delta corresponding.moles += delta - if(delta) - var/individual_heat_capacity = trace_gas.specific_heat*delta - if(delta > 0) - heat_capacity_self_to_sharer += individual_heat_capacity - else - heat_capacity_sharer_to_self -= individual_heat_capacity + //Guaranteed transfer from sharer to self + var/individual_heat_capacity = trace_gas.specific_heat*delta + heat_capacity_sharer_to_self += individual_heat_capacity - moved_moles += delta + moved_moles += -delta last_share += abs(delta) - trace_types_considered += trace_gas.type + if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/new_self_heat_capacity = old_self_heat_capacity + heat_capacity_sharer_to_self - heat_capacity_self_to_sharer + var/new_sharer_heat_capacity = old_sharer_heat_capacity + heat_capacity_self_to_sharer - heat_capacity_sharer_to_self + if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY) + temperature = (old_self_heat_capacity*temperature - heat_capacity_self_to_sharer*temperature_archived + heat_capacity_sharer_to_self*sharer.temperature_archived)/new_self_heat_capacity - if(sharer.trace_gases.len) - for(var/datum/gas/trace_gas in sharer.trace_gases) - if(trace_gas.type in trace_types_considered) continue - else - var/datum/gas/corresponding - var/delta = 0 + if(new_sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) + sharer.temperature = (old_sharer_heat_capacity*sharer.temperature-heat_capacity_sharer_to_self*sharer.temperature_archived + heat_capacity_self_to_sharer*temperature_archived)/new_sharer_heat_capacity - corresponding = new trace_gas.type() - trace_gases += corresponding + if(abs(old_sharer_heat_capacity) > MINIMUM_HEAT_CAPACITY) + if(abs(new_sharer_heat_capacity/old_sharer_heat_capacity - 1) < 0.10) // <10% change in sharer heat capacity + temperature_share(sharer, OPEN_HEAT_TRANSFER_COEFFICIENT) - delta = trace_gas.moles_archived/5 + if((delta_temperature > MINIMUM_TEMPERATURE_TO_MOVE) || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE) + var/delta_pressure = temperature_archived*(total_moles() + moved_moles) - sharer.temperature_archived*(sharer.total_moles() - moved_moles) + return delta_pressure*R_IDEAL_GAS_EQUATION/volume - trace_gas.moles -= delta - corresponding.moles += delta +/datum/gas_mixture/mimic(turf/model, border_multiplier, var/atmos_adjacent_turfs = 4) + var/delta_oxygen = QUANTIZE(oxygen_archived - model.oxygen)/(atmos_adjacent_turfs+1) + var/delta_carbon_dioxide = QUANTIZE(carbon_dioxide_archived - model.carbon_dioxide)/(atmos_adjacent_turfs+1) + var/delta_nitrogen = QUANTIZE(nitrogen_archived - model.nitrogen)/(atmos_adjacent_turfs+1) + var/delta_toxins = QUANTIZE(toxins_archived - model.toxins)/(atmos_adjacent_turfs+1) - //Guaranteed transfer from sharer to self - var/individual_heat_capacity = trace_gas.specific_heat*delta - heat_capacity_sharer_to_self += individual_heat_capacity + var/delta_temperature = (temperature_archived - model.temperature) - moved_moles += -delta - last_share += abs(delta) + var/heat_transferred = 0 + var/old_self_heat_capacity = 0 + var/heat_capacity_transferred = 0 - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/new_self_heat_capacity = old_self_heat_capacity + heat_capacity_sharer_to_self - heat_capacity_self_to_sharer - var/new_sharer_heat_capacity = old_sharer_heat_capacity + heat_capacity_self_to_sharer - heat_capacity_sharer_to_self + if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY) - temperature = (old_self_heat_capacity*temperature - heat_capacity_self_to_sharer*temperature_archived + heat_capacity_sharer_to_self*sharer.temperature_archived)/new_self_heat_capacity + var/delta_air = delta_oxygen+delta_nitrogen + if(delta_air) + var/air_heat_capacity = SPECIFIC_HEAT_AIR*delta_air + heat_transferred -= air_heat_capacity*model.temperature + heat_capacity_transferred -= air_heat_capacity - if(new_sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) - sharer.temperature = (old_sharer_heat_capacity*sharer.temperature-heat_capacity_sharer_to_self*sharer.temperature_archived + heat_capacity_self_to_sharer*temperature_archived)/new_sharer_heat_capacity + if(delta_carbon_dioxide) + var/carbon_dioxide_heat_capacity = SPECIFIC_HEAT_CDO*delta_carbon_dioxide + heat_transferred -= carbon_dioxide_heat_capacity*model.temperature + heat_capacity_transferred -= carbon_dioxide_heat_capacity - if(abs(old_sharer_heat_capacity) > MINIMUM_HEAT_CAPACITY) - if(abs(new_sharer_heat_capacity/old_sharer_heat_capacity - 1) < 0.10) // <10% change in sharer heat capacity - temperature_share(sharer, OPEN_HEAT_TRANSFER_COEFFICIENT) + if(delta_toxins) + var/toxins_heat_capacity = SPECIFIC_HEAT_TOXIN*delta_toxins + heat_transferred -= toxins_heat_capacity*model.temperature + heat_capacity_transferred -= toxins_heat_capacity - if((delta_temperature > MINIMUM_TEMPERATURE_TO_MOVE) || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE) - var/delta_pressure = temperature_archived*(total_moles() + moved_moles) - sharer.temperature_archived*(sharer.total_moles() - moved_moles) - return delta_pressure*R_IDEAL_GAS_EQUATION/volume + old_self_heat_capacity = heat_capacity() - mimic(turf/model, border_multiplier, var/atmos_adjacent_turfs = 4) - var/delta_oxygen = QUANTIZE(oxygen_archived - model.oxygen)/(atmos_adjacent_turfs+1) - var/delta_carbon_dioxide = QUANTIZE(carbon_dioxide_archived - model.carbon_dioxide)/(atmos_adjacent_turfs+1) - var/delta_nitrogen = QUANTIZE(nitrogen_archived - model.nitrogen)/(atmos_adjacent_turfs+1) - var/delta_toxins = QUANTIZE(toxins_archived - model.toxins)/(atmos_adjacent_turfs+1) + if(border_multiplier) + oxygen -= delta_oxygen*border_multiplier + carbon_dioxide -= delta_carbon_dioxide*border_multiplier + nitrogen -= delta_nitrogen*border_multiplier + toxins -= delta_toxins*border_multiplier + else + oxygen -= delta_oxygen + carbon_dioxide -= delta_carbon_dioxide + nitrogen -= delta_nitrogen + toxins -= delta_toxins - var/delta_temperature = (temperature_archived - model.temperature) + var/moved_moles = (delta_oxygen + delta_carbon_dioxide + delta_nitrogen + delta_toxins) + last_share = abs(delta_oxygen) + abs(delta_carbon_dioxide) + abs(delta_nitrogen) + abs(delta_toxins) - var/heat_transferred = 0 - var/old_self_heat_capacity = 0 - var/heat_capacity_transferred = 0 + if(trace_gases.len) + for(var/datum/gas/trace_gas in trace_gases) + var/delta = 0 - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + delta = trace_gas.moles_archived/(atmos_adjacent_turfs+1) - var/delta_air = delta_oxygen+delta_nitrogen - if(delta_air) - var/air_heat_capacity = SPECIFIC_HEAT_AIR*delta_air - heat_transferred -= air_heat_capacity*model.temperature - heat_capacity_transferred -= air_heat_capacity + if(border_multiplier) + trace_gas.moles -= delta*border_multiplier + else + trace_gas.moles -= delta - if(delta_carbon_dioxide) - var/carbon_dioxide_heat_capacity = SPECIFIC_HEAT_CDO*delta_carbon_dioxide - heat_transferred -= carbon_dioxide_heat_capacity*model.temperature - heat_capacity_transferred -= carbon_dioxide_heat_capacity + var/heat_cap_transferred = delta*trace_gas.specific_heat + heat_transferred += heat_cap_transferred*temperature_archived + heat_capacity_transferred += heat_cap_transferred + moved_moles += delta + moved_moles += abs(delta) - if(delta_toxins) - var/toxins_heat_capacity = SPECIFIC_HEAT_TOXIN*delta_toxins - heat_transferred -= toxins_heat_capacity*model.temperature - heat_capacity_transferred -= toxins_heat_capacity + if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/new_self_heat_capacity = old_self_heat_capacity - heat_capacity_transferred + if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY) + if(border_multiplier) + temperature = (old_self_heat_capacity*temperature - heat_capacity_transferred*border_multiplier*temperature_archived)/new_self_heat_capacity + else + temperature = (old_self_heat_capacity*temperature - heat_capacity_transferred*border_multiplier*temperature_archived)/new_self_heat_capacity - old_self_heat_capacity = heat_capacity() + temperature_mimic(model, model.thermal_conductivity, border_multiplier) - if(border_multiplier) - oxygen -= delta_oxygen*border_multiplier - carbon_dioxide -= delta_carbon_dioxide*border_multiplier - nitrogen -= delta_nitrogen*border_multiplier - toxins -= delta_toxins*border_multiplier - else - oxygen -= delta_oxygen - carbon_dioxide -= delta_carbon_dioxide - nitrogen -= delta_nitrogen - toxins -= delta_toxins + if((delta_temperature > MINIMUM_TEMPERATURE_TO_MOVE) || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE) + var/delta_pressure = temperature_archived*(total_moles() + moved_moles) - model.temperature*(model.oxygen+model.carbon_dioxide+model.nitrogen+model.toxins) + return delta_pressure*R_IDEAL_GAS_EQUATION/volume + else + return 0 - var/moved_moles = (delta_oxygen + delta_carbon_dioxide + delta_nitrogen + delta_toxins) - last_share = abs(delta_oxygen) + abs(delta_carbon_dioxide) + abs(delta_nitrogen) + abs(delta_toxins) +/datum/gas_mixture/check_both_then_temperature_share(datum/gas_mixture/sharer, conduction_coefficient) + var/delta_temperature = (temperature_archived - sharer.temperature_archived) - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - var/delta = 0 + var/self_heat_capacity = heat_capacity_archived() + var/sharer_heat_capacity = sharer.heat_capacity_archived() - delta = trace_gas.moles_archived/(atmos_adjacent_turfs+1) + var/self_temperature_delta = 0 + var/sharer_temperature_delta = 0 - if(border_multiplier) - trace_gas.moles -= delta*border_multiplier - else - trace_gas.moles -= delta - - var/heat_cap_transferred = delta*trace_gas.specific_heat - heat_transferred += heat_cap_transferred*temperature_archived - heat_capacity_transferred += heat_cap_transferred - moved_moles += delta - moved_moles += abs(delta) - - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/new_self_heat_capacity = old_self_heat_capacity - heat_capacity_transferred - if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY) - if(border_multiplier) - temperature = (old_self_heat_capacity*temperature - heat_capacity_transferred*border_multiplier*temperature_archived)/new_self_heat_capacity - else - temperature = (old_self_heat_capacity*temperature - heat_capacity_transferred*border_multiplier*temperature_archived)/new_self_heat_capacity - - temperature_mimic(model, model.thermal_conductivity, border_multiplier) - - if((delta_temperature > MINIMUM_TEMPERATURE_TO_MOVE) || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE) - var/delta_pressure = temperature_archived*(total_moles() + moved_moles) - model.temperature*(model.oxygen+model.carbon_dioxide+model.nitrogen+model.toxins) - return delta_pressure*R_IDEAL_GAS_EQUATION/volume - else - return 0 - - check_both_then_temperature_share(datum/gas_mixture/sharer, conduction_coefficient) - var/delta_temperature = (temperature_archived - sharer.temperature_archived) - - var/self_heat_capacity = heat_capacity_archived() - var/sharer_heat_capacity = sharer.heat_capacity_archived() - - var/self_temperature_delta = 0 - var/sharer_temperature_delta = 0 - - if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ - (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) - - self_temperature_delta = -heat/(self_heat_capacity) - sharer_temperature_delta = heat/(sharer_heat_capacity) - else - return 1 - - if((abs(self_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ - && (abs(self_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*temperature_archived)) - return 0 - - if((abs(sharer_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ - && (abs(sharer_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*sharer.temperature_archived)) - return -1 - - temperature += self_temperature_delta - sharer.temperature += sharer_temperature_delta + if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) + var/heat = conduction_coefficient*delta_temperature* \ + (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) + self_temperature_delta = -heat/(self_heat_capacity) + sharer_temperature_delta = heat/(sharer_heat_capacity) + else return 1 - //Logic integrated from: temperature_share(sharer, conduction_coefficient) for efficiency - check_me_then_temperature_share(datum/gas_mixture/sharer, conduction_coefficient) - var/delta_temperature = (temperature_archived - sharer.temperature_archived) + if((abs(self_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ + && (abs(self_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*temperature_archived)) + return 0 + if((abs(sharer_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ + && (abs(sharer_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*sharer.temperature_archived)) + return -1 + + temperature += self_temperature_delta + sharer.temperature += sharer_temperature_delta + + return 1 + //Logic integrated from: temperature_share(sharer, conduction_coefficient) for efficiency + +/datum/gas_mixture/check_me_then_temperature_share(datum/gas_mixture/sharer, conduction_coefficient) + var/delta_temperature = (temperature_archived - sharer.temperature_archived) + + var/self_heat_capacity = heat_capacity_archived() + var/sharer_heat_capacity = sharer.heat_capacity_archived() + + var/self_temperature_delta = 0 + var/sharer_temperature_delta = 0 + + if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) + var/heat = conduction_coefficient*delta_temperature* \ + (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) + + self_temperature_delta = -heat/self_heat_capacity + sharer_temperature_delta = heat/sharer_heat_capacity + else + return 1 + + if((abs(self_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ + && (abs(self_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*temperature_archived)) + return 0 + + temperature += self_temperature_delta + sharer.temperature += sharer_temperature_delta + + return 1 + //Logic integrated from: temperature_share(sharer, conduction_coefficient) for efficiency + +/datum/gas_mixture/check_me_then_temperature_turf_share(turf/simulated/sharer, conduction_coefficient) + var/delta_temperature = (temperature_archived - sharer.temperature) + + var/self_temperature_delta = 0 + var/sharer_temperature_delta = 0 + + if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) var/self_heat_capacity = heat_capacity_archived() - var/sharer_heat_capacity = sharer.heat_capacity_archived() - var/self_temperature_delta = 0 - var/sharer_temperature_delta = 0 - - if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) + if((sharer.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) var/heat = conduction_coefficient*delta_temperature* \ - (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) + (self_heat_capacity*sharer.heat_capacity/(self_heat_capacity+sharer.heat_capacity)) self_temperature_delta = -heat/self_heat_capacity - sharer_temperature_delta = heat/sharer_heat_capacity - else - return 1 - - if((abs(self_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ - && (abs(self_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*temperature_archived)) - return 0 - - temperature += self_temperature_delta - sharer.temperature += sharer_temperature_delta - + sharer_temperature_delta = heat/sharer.heat_capacity + else return 1 - //Logic integrated from: temperature_share(sharer, conduction_coefficient) for efficiency - check_me_then_temperature_turf_share(turf/simulated/sharer, conduction_coefficient) - var/delta_temperature = (temperature_archived - sharer.temperature) + if((abs(self_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ + && (abs(self_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*temperature_archived)) + return 0 - var/self_temperature_delta = 0 - var/sharer_temperature_delta = 0 + temperature += self_temperature_delta + sharer.temperature += sharer_temperature_delta - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity_archived() + return 1 + //Logic integrated from: temperature_turf_share(sharer, conduction_coefficient) for efficiency - if((sharer.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ - (self_heat_capacity*sharer.heat_capacity/(self_heat_capacity+sharer.heat_capacity)) +/datum/gas_mixture/check_me_then_temperature_mimic(turf/model, conduction_coefficient) + var/delta_temperature = (temperature_archived - model.temperature) + var/self_temperature_delta = 0 - self_temperature_delta = -heat/self_heat_capacity - sharer_temperature_delta = heat/sharer.heat_capacity - else - return 1 + if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/self_heat_capacity = heat_capacity_archived() - if((abs(self_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ - && (abs(self_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*temperature_archived)) - return 0 + if((model.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) + var/heat = conduction_coefficient*delta_temperature* \ + (self_heat_capacity*model.heat_capacity/(self_heat_capacity+model.heat_capacity)) - temperature += self_temperature_delta - sharer.temperature += sharer_temperature_delta + self_temperature_delta = -heat/self_heat_capacity - return 1 - //Logic integrated from: temperature_turf_share(sharer, conduction_coefficient) for efficiency + if((abs(self_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ + && (abs(self_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*temperature_archived)) + return 0 - check_me_then_temperature_mimic(turf/model, conduction_coefficient) - var/delta_temperature = (temperature_archived - model.temperature) - var/self_temperature_delta = 0 + temperature += self_temperature_delta - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity_archived() + return 1 + //Logic integrated from: temperature_mimic(model, conduction_coefficient) for efficiency - if((model.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ - (self_heat_capacity*model.heat_capacity/(self_heat_capacity+model.heat_capacity)) +/datum/gas_mixture/temperature_share(datum/gas_mixture/sharer, conduction_coefficient) - self_temperature_delta = -heat/self_heat_capacity + var/delta_temperature = (temperature_archived - sharer.temperature_archived) + if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/self_heat_capacity = heat_capacity_archived() + var/sharer_heat_capacity = sharer.heat_capacity_archived() - if((abs(self_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ - && (abs(self_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*temperature_archived)) - return 0 + if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) + var/heat = conduction_coefficient*delta_temperature* \ + (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) - temperature += self_temperature_delta + temperature -= heat/self_heat_capacity + sharer.temperature += heat/sharer_heat_capacity - return 1 - //Logic integrated from: temperature_mimic(model, conduction_coefficient) for efficiency +/datum/gas_mixture/temperature_mimic(turf/model, conduction_coefficient, border_multiplier) + var/delta_temperature = (temperature - model.temperature) + if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/self_heat_capacity = heat_capacity()//_archived() - temperature_share(datum/gas_mixture/sharer, conduction_coefficient) - - var/delta_temperature = (temperature_archived - sharer.temperature_archived) - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity_archived() - var/sharer_heat_capacity = sharer.heat_capacity_archived() - - if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ - (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) + if((model.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) + var/heat = conduction_coefficient*delta_temperature* \ + (self_heat_capacity*model.heat_capacity/(self_heat_capacity+model.heat_capacity)) + if(border_multiplier) + temperature -= heat*border_multiplier/self_heat_capacity + else temperature -= heat/self_heat_capacity - sharer.temperature += heat/sharer_heat_capacity - temperature_mimic(turf/model, conduction_coefficient, border_multiplier) - var/delta_temperature = (temperature - model.temperature) - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity()//_archived() +/datum/gas_mixture/temperature_turf_share(turf/simulated/sharer, conduction_coefficient) + var/delta_temperature = (temperature_archived - sharer.temperature) + if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/self_heat_capacity = heat_capacity() - if((model.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ - (self_heat_capacity*model.heat_capacity/(self_heat_capacity+model.heat_capacity)) + if((sharer.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) + var/heat = conduction_coefficient*delta_temperature* \ + (self_heat_capacity*sharer.heat_capacity/(self_heat_capacity+sharer.heat_capacity)) - if(border_multiplier) - temperature -= heat*border_multiplier/self_heat_capacity + temperature -= heat/self_heat_capacity + sharer.temperature += heat/sharer.heat_capacity + +/datum/gas_mixture/compare(datum/gas_mixture/sample) + if((abs(oxygen-sample.oxygen) > MINIMUM_AIR_TO_SUSPEND) && \ + ((oxygen < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.oxygen) || (oxygen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.oxygen))) + return 0 + if((abs(nitrogen-sample.nitrogen) > MINIMUM_AIR_TO_SUSPEND) && \ + ((nitrogen < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.nitrogen) || (nitrogen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.nitrogen))) + return 0 + if((abs(carbon_dioxide-sample.carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && \ + ((carbon_dioxide < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide) || (oxygen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide))) + return 0 + if((abs(toxins-sample.toxins) > MINIMUM_AIR_TO_SUSPEND) && \ + ((toxins < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.toxins) || (toxins > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.toxins))) + return 0 + + if(total_moles() > MINIMUM_AIR_TO_SUSPEND) + if((abs(temperature-sample.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) && \ + ((temperature < (1-MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND)*sample.temperature) || (temperature > (1+MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND)*sample.temperature))) + //world << "temp fail [temperature] & [sample.temperature]" + return 0 + + if(sample.trace_gases.len) + for(var/datum/gas/trace_gas in sample.trace_gases) + if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND) + var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases + if(corresponding) + if((abs(trace_gas.moles - corresponding.moles) > MINIMUM_AIR_TO_SUSPEND) && \ + ((corresponding.moles < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*trace_gas.moles) || (corresponding.moles > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*trace_gas.moles))) + return 0 else - temperature -= heat/self_heat_capacity + return 0 - temperature_turf_share(turf/simulated/sharer, conduction_coefficient) - var/delta_temperature = (temperature_archived - sharer.temperature) - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity() - - if((sharer.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ - (self_heat_capacity*sharer.heat_capacity/(self_heat_capacity+sharer.heat_capacity)) - - temperature -= heat/self_heat_capacity - sharer.temperature += heat/sharer.heat_capacity - - compare(datum/gas_mixture/sample) - if((abs(oxygen-sample.oxygen) > MINIMUM_AIR_TO_SUSPEND) && \ - ((oxygen < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.oxygen) || (oxygen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.oxygen))) - return 0 - if((abs(nitrogen-sample.nitrogen) > MINIMUM_AIR_TO_SUSPEND) && \ - ((nitrogen < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.nitrogen) || (nitrogen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.nitrogen))) - return 0 - if((abs(carbon_dioxide-sample.carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && \ - ((carbon_dioxide < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide) || (oxygen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide))) - return 0 - if((abs(toxins-sample.toxins) > MINIMUM_AIR_TO_SUSPEND) && \ - ((toxins < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.toxins) || (toxins > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.toxins))) - return 0 - - if(total_moles() > MINIMUM_AIR_TO_SUSPEND) - if((abs(temperature-sample.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) && \ - ((temperature < (1-MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND)*sample.temperature) || (temperature > (1+MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND)*sample.temperature))) - //world << "temp fail [temperature] & [sample.temperature]" - return 0 - - if(sample.trace_gases.len) - for(var/datum/gas/trace_gas in sample.trace_gases) - if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND) - var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases - if(corresponding) - if((abs(trace_gas.moles - corresponding.moles) > MINIMUM_AIR_TO_SUSPEND) && \ - ((corresponding.moles < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*trace_gas.moles) || (corresponding.moles > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*trace_gas.moles))) - return 0 - else + if(trace_gases.len) + for(var/datum/gas/trace_gas in trace_gases) + if(trace_gas.moles > MINIMUM_AIR_TO_SUSPEND) + var/datum/gas/corresponding = locate(trace_gas.type) in sample.trace_gases + if(corresponding) + if((abs(trace_gas.moles - corresponding.moles) > MINIMUM_AIR_TO_SUSPEND) && \ + ((trace_gas.moles < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*corresponding.moles) || (trace_gas.moles > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*corresponding.moles))) return 0 - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - if(trace_gas.moles > MINIMUM_AIR_TO_SUSPEND) - var/datum/gas/corresponding = locate(trace_gas.type) in sample.trace_gases - if(corresponding) - if((abs(trace_gas.moles - corresponding.moles) > MINIMUM_AIR_TO_SUSPEND) && \ - ((trace_gas.moles < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*corresponding.moles) || (trace_gas.moles > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*corresponding.moles))) - return 0 - else - return 0 - return 1 \ No newline at end of file + else + return 0 + return 1 diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm index f292e7648f7..13014725d0c 100644 --- a/code/datums/helper_datums/construction_datum.dm +++ b/code/datums/helper_datums/construction_datum.dm @@ -7,97 +7,97 @@ var/result var/list/steps_desc - New(atom) - ..() - holder = atom - if(!holder) //don't want this without a holder - qdel(src) +/datum/construction/New(atom) + ..() + holder = atom + if(!holder) //don't want this without a holder + qdel(src) + set_desc(steps.len) + return + +/datum/construction/proc/next_step() + steps.len-- + if(!steps.len) + spawn_result() + else set_desc(steps.len) - return + return - proc/next_step() - steps.len-- - if(!steps.len) - spawn_result() - else - set_desc(steps.len) - return +/datum/construction/proc/action(atom/used_atom,mob/user as mob) + return - proc/action(atom/used_atom,mob/user as mob) - return +/datum/construction/proc/check_step(atom/used_atom,mob/user as mob) //check last step only + var/valid_step = is_right_key(used_atom) + if(valid_step) + if(custom_action(valid_step, used_atom, user)) + next_step() + return 1 + return 0 - proc/check_step(atom/used_atom,mob/user as mob) //check last step only - var/valid_step = is_right_key(used_atom) - if(valid_step) - if(custom_action(valid_step, used_atom, user)) - next_step() - return 1 - return 0 +/datum/construction/proc/is_right_key(atom/used_atom) // returns current step num if used_atom is of the right type. + var/list/L = steps[steps.len] + if(istype(used_atom, L["key"])) + return steps.len + return 0 - proc/is_right_key(atom/used_atom) // returns current step num if used_atom is of the right type. - var/list/L = steps[steps.len] +/datum/construction/proc/custom_action(step, used_atom, user) + return 1 + +/datum/construction/proc/check_all_steps(atom/used_atom,mob/user as mob) //check all steps, remove matching one. + for(var/i=1;i<=steps.len;i++) + var/list/L = steps[i]; if(istype(used_atom, L["key"])) - return steps.len - return 0 - - proc/custom_action(step, used_atom, user) - return 1 - - proc/check_all_steps(atom/used_atom,mob/user as mob) //check all steps, remove matching one. - for(var/i=1;i<=steps.len;i++) - var/list/L = steps[i]; - if(istype(used_atom, L["key"])) - if(custom_action(i, used_atom, user)) - steps[i]=null;//stupid byond list from list removal... - listclearnulls(steps); - if(!steps.len) - spawn_result() - return 1 - return 0 + if(custom_action(i, used_atom, user)) + steps[i]=null;//stupid byond list from list removal... + listclearnulls(steps); + if(!steps.len) + spawn_result() + return 1 + return 0 - proc/spawn_result() - if(result) - new result(get_turf(holder)) - qdel(holder) - return +/datum/construction/proc/spawn_result() + if(result) + new result(get_turf(holder)) + qdel(holder) + return - proc/set_desc(index as num) - var/list/step = steps[index] - holder.desc = step["desc"] - return +/datum/construction/proc/set_desc(index as num) + var/list/step = steps[index] + holder.desc = step["desc"] + return /datum/construction/reversible var/index - New(atom) - ..() - index = steps.len - return +/datum/construction/reversible/New(atom) + ..() + index = steps.len + return - proc/update_index(diff as num) - index+=diff - if(index==0) - spawn_result() - else - set_desc(index) - return +/datum/construction/reversible/proc/update_index(diff as num) + index+=diff + if(index==0) + spawn_result() + else + set_desc(index) + return - is_right_key(atom/used_atom) // returns index step - var/list/L = steps[index] - if(istype(used_atom, L["key"])) - return FORWARD //to the first step -> forward - else if(L["backkey"] && istype(used_atom, L["backkey"])) - return BACKWARD //to the last step -> backwards - return 0 +/datum/construction/reversible/is_right_key(atom/used_atom) // returns index step + var/list/L = steps[index] + if(istype(used_atom, L["key"])) + return FORWARD //to the first step -> forward + else if(L["backkey"] && istype(used_atom, L["backkey"])) + return BACKWARD //to the last step -> backwards + return 0 - check_step(atom/used_atom,mob/user as mob) - var/diff = is_right_key(used_atom) - if(diff) - if(custom_action(index, diff, used_atom, user)) - update_index(diff) - return 1 - return 0 +/datum/construction/reversible/check_step(atom/used_atom,mob/user as mob) + var/diff = is_right_key(used_atom) + if(diff) + if(custom_action(index, diff, used_atom, user)) + update_index(diff) + return 1 + return 0 - custom_action(index, diff, used_atom, user) - return 1 \ No newline at end of file +/datum/construction/reversible/custom_action(index, diff, used_atom, user) + return 1 diff --git a/code/datums/helper_datums/events.dm b/code/datums/helper_datums/events.dm index 10e2f92a234..f5e60ee7b0c 100644 --- a/code/datums/helper_datums/events.dm +++ b/code/datums/helper_datums/events.dm @@ -6,62 +6,63 @@ /datum/events var/list/events - New() - ..() - events = new +/datum/events/New() + ..() + events = new - proc/addEventType(event_type as text) - if(!(event_type in events) || !islist(events[event_type])) - events[event_type] = list() - return 1 - return - - - // Arguments: event_type as text, proc_holder as datum, proc_name as text - // Returns: New event, null on error. - proc/addEvent(event_type as text, proc_holder, proc_name as text) - if(!event_type || !proc_holder || !proc_name) - return - addEventType(event_type) - var/list/event = events[event_type] - var/datum/event/E = new /datum/event(proc_holder,proc_name) - event += E - return E - - // Arguments: event_type as text, any number of additional arguments to pass to event handler - // Returns: null - proc/fireEvent() - //world << "Events in [args[1]] called" - var/list/event = listgetindex(events,args[1]) - if(istype(event)) - spawn(-1) - for(var/datum/event/E in event) - if(!E.Fire(arglist(args.Copy(2)))) - clearEvent(args[1],E) - return - - // Arguments: event_type as text, E as /datum/event - // Returns: 1 if event cleared, null on error - proc/clearEvent(event_type as text, datum/event/E) - if(!event_type || !E) - return - var/list/event = listgetindex(events,event_type) - event -= E +/datum/events/proc/addEventType(event_type as text) + if(!(event_type in events) || !islist(events[event_type])) + events[event_type] = list() return 1 + return + + +// Arguments: event_type as text, proc_holder as datum, proc_name as text +// Returns: New event, null on error. +/datum/events/proc/addEvent(event_type as text, proc_holder, proc_name as text) + if(!event_type || !proc_holder || !proc_name) + return + addEventType(event_type) + var/list/event = events[event_type] + var/datum/event/E = new /datum/event(proc_holder,proc_name) + event += E + return E + +// Arguments: event_type as text, any number of additional arguments to pass to event handler +// Returns: null +/datum/events/proc/fireEvent() + //world << "Events in [args[1]] called" + var/list/event = listgetindex(events,args[1]) + if(istype(event)) + spawn(-1) + for(var/datum/event/E in event) + if(!E.Fire(arglist(args.Copy(2)))) + clearEvent(args[1],E) + return + +// Arguments: event_type as text, E as /datum/event +// Returns: 1 if event cleared, null on error + +/datum/events/proc/clearEvent(event_type as text, datum/event/E) + if(!event_type || !E) + return + var/list/event = listgetindex(events,event_type) + event -= E + return 1 /datum/event var/listener var/proc_name - New(tlistener,tprocname) - listener = tlistener - proc_name = tprocname - return ..() +/datum/event/New(tlistener,tprocname) + listener = tlistener + proc_name = tprocname + return ..() - proc/Fire() - //world << "Event fired" - if(listener) - call(listener,proc_name)(arglist(args)) - return 1 - return \ No newline at end of file +/datum/event/proc/Fire() + //world << "Event fired" + if(listener) + call(listener,proc_name)(arglist(args)) + return 1 + return diff --git a/code/datums/helper_datums/global_iterator.dm b/code/datums/helper_datums/global_iterator.dm index 262c59eb77f..1c6d5ce341e 100644 --- a/code/datums/helper_datums/global_iterator.dm +++ b/code/datums/helper_datums/global_iterator.dm @@ -57,104 +57,104 @@ Data storage vars: var/result var/state = 0 - New(list/arguments=null,autostart=1) - delay = delay>0?(delay):1 - if(forbid_garbage) //prevents garbage collection with tag != null - tag = "\ref[src]" - set_process_args(arguments) - if(autostart) - start() - return +/datum/global_iterator/New(list/arguments=null,autostart=1) + delay = delay>0?(delay):1 + if(forbid_garbage) //prevents garbage collection with tag != null + tag = "\ref[src]" + set_process_args(arguments) + if(autostart) + start() + return - Destroy() - tag = null - arg_list.Cut() - stop() - //Do not call ..() +/datum/global_iterator/Destroy() + tag = null + arg_list.Cut() + stop() + //Do not call ..() - proc/main() - state = 1 - while(src && control_switch) - last_exec = world.timeofday - if(check_for_null && has_null_args()) - stop() +/datum/global_iterator/proc/main() + state = 1 + while(src && control_switch) + last_exec = world.timeofday + if(check_for_null && has_null_args()) + stop() + return 0 + result = process(arglist(arg_list)) + for(var/sleep_time=delay;sleep_time>0;sleep_time--) //uhh, this is ugly. But I see no other way to terminate sleeping proc. Such disgrace. + if(!control_switch) return 0 - result = process(arglist(arg_list)) - for(var/sleep_time=delay;sleep_time>0;sleep_time--) //uhh, this is ugly. But I see no other way to terminate sleeping proc. Such disgrace. - if(!control_switch) - return 0 - sleep(1) - return 0 - - proc/start(list/arguments=null) - if(active()) - return - if(arguments) - if(!set_process_args(arguments)) - return 0 - if(!state_check()) //the main loop is sleeping, wait for it to terminate. - return - control_switch = 1 - spawn() - state = main() - return 1 - - proc/stop() - if(!active()) - return - control_switch = 0 - spawn(-1) //report termination error but don't wait for state_check(). - state_check() - return 1 - - proc/state_check() - var/lag = 0 - while(state) sleep(1) - if(++lag>10) - CRASH("The global_iterator loop \ref[src] failed to terminate in designated timeframe. This may be caused by server lagging.") - return 1 + return 0 - proc/process() +/datum/global_iterator/proc/start(list/arguments=null) + if(active()) return + if(arguments) + if(!set_process_args(arguments)) + return 0 + if(!state_check()) //the main loop is sleeping, wait for it to terminate. + return + control_switch = 1 + spawn() + state = main() + return 1 - proc/active() - return control_switch +/datum/global_iterator/proc/stop() + if(!active()) + return + control_switch = 0 + spawn(-1) //report termination error but don't wait for state_check(). + state_check() + return 1 - proc/has_null_args() - if(null in arg_list) - return 1 +/datum/global_iterator/proc/state_check() + var/lag = 0 + while(state) + sleep(1) + if(++lag>10) + CRASH("The global_iterator loop \ref[src] failed to terminate in designated timeframe. This may be caused by server lagging.") + return 1 + +/datum/global_iterator/proc/process() + return + +/datum/global_iterator/proc/active() + return control_switch + +/datum/global_iterator/proc/has_null_args() + if(null in arg_list) + return 1 + return 0 + + +/datum/global_iterator/proc/set_delay(new_delay) + if(isnum(new_delay)) + delay = max(1, round(new_delay)) + return 1 + else return 0 +/datum/global_iterator/proc/get_last_exec_time() + return (last_exec||0) - proc/set_delay(new_delay) - if(isnum(new_delay)) - delay = max(1, round(new_delay)) - return 1 - else - return 0 +/datum/global_iterator/proc/get_last_exec_time_as_text() + return (time2text(last_exec)||"Wasn't executed yet") - proc/get_last_exec_time() - return (last_exec||0) +/datum/global_iterator/proc/set_process_args(list/arguments) + if(arguments && istype(arguments, /list) && arguments.len) + arg_list = arguments + return 1 + else +// world << "\red Invalid arguments supplied for [src.type], ref = \ref[src]" + return 0 - proc/get_last_exec_time_as_text() - return (time2text(last_exec)||"Wasn't executed yet") +/datum/global_iterator/proc/toggle_null_checks() + check_for_null = !check_for_null + return check_for_null - proc/set_process_args(list/arguments) - if(arguments && istype(arguments, /list) && arguments.len) - arg_list = arguments - return 1 - else -// world << "\red Invalid arguments supplied for [src.type], ref = \ref[src]" - return 0 - - proc/toggle_null_checks() - check_for_null = !check_for_null - return check_for_null - - proc/toggle() - if(!stop()) - start() - return active() +/datum/global_iterator/proc/toggle() + if(!stop()) + start() + return active() diff --git a/code/datums/helper_datums/topic_input.dm b/code/datums/helper_datums/topic_input.dm index 17dd3f1266e..8090a5221eb 100644 --- a/code/datums/helper_datums/topic_input.dm +++ b/code/datums/helper_datums/topic_input.dm @@ -2,59 +2,59 @@ var/href var/list/href_list - New(thref,list/thref_list) - href = thref - href_list = thref_list.Copy() - return +/datum/topic_input/New(thref,list/thref_list) + href = thref + href_list = thref_list.Copy() + return - proc/get(i) - return listgetindex(href_list,i) +/datum/topic_input/proc/get(i) + return listgetindex(href_list,i) - proc/getAndLocate(i) - var/t = get(i) - if(t) - t = locate(t) - return t || null +/datum/topic_input/proc/getAndLocate(i) + var/t = get(i) + if(t) + t = locate(t) + return t || null - proc/getNum(i) - var/t = get(i) - if(t) - t = text2num(t) - return isnum(t) ? t : null +/datum/topic_input/proc/getNum(i) + var/t = get(i) + if(t) + t = text2num(t) + return isnum(t) ? t : null - proc/getObj(i) - var/t = getAndLocate(i) - return isobj(t) ? t : null +/datum/topic_input/proc/getObj(i) + var/t = getAndLocate(i) + return isobj(t) ? t : null - proc/getMob(i) - var/t = getAndLocate(i) - return ismob(t) ? t : null +/datum/topic_input/proc/getMob(i) + var/t = getAndLocate(i) + return ismob(t) ? t : null - proc/getTurf(i) - var/t = getAndLocate(i) - return isturf(t) ? t : null +/datum/topic_input/proc/getTurf(i) + var/t = getAndLocate(i) + return isturf(t) ? t : null - proc/getAtom(i) - return getType(i,/atom) +/datum/topic_input/proc/getAtom(i) + return getType(i,/atom) - proc/getArea(i) - var/t = getAndLocate(i) - return isarea(t) ? t : null +/datum/topic_input/proc/getArea(i) + var/t = getAndLocate(i) + return isarea(t) ? t : null - proc/getStr(i)//params should always be text, but... - var/t = get(i) - return istext(t) ? t : null +/datum/topic_input/proc/getStr(i)//params should always be text, but... + var/t = get(i) + return istext(t) ? t : null - proc/getType(i,type) - var/t = getAndLocate(i) - return istype(t,type) ? t : null +/datum/topic_input/proc/getType(i,type) + var/t = getAndLocate(i) + return istype(t,type) ? t : null - proc/getPath(i) - var/t = get(i) - if(t) - t = text2path(t) - return ispath(t) ? t : null +/datum/topic_input/proc/getPath(i) + var/t = get(i) + if(t) + t = text2path(t) + return ispath(t) ? t : null - proc/getList(i) - var/t = getAndLocate(i) - return islist(t) ? t : null \ No newline at end of file +/datum/topic_input/proc/getList(i) + var/t = getAndLocate(i) + return islist(t) ? t : null diff --git a/code/datums/mind.dm b/code/datums/mind.dm index ef0b79ac279..089c9cb2cf1 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -29,7 +29,7 @@ */ -datum/mind +/datum/mind var/key var/name //replaces mob/var/original_name var/mob/living/current @@ -55,39 +55,39 @@ datum/mind var/miming = 0 // Mime's vow of silence - New(var/key) - src.key = key +/datum/mind/New(var/key) + src.key = key - proc/transfer_to(mob/living/new_character) - if(!istype(new_character)) - ERROR("transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform coderbus") +/datum/mind/proc/transfer_to(mob/living/new_character) + if(!istype(new_character)) + ERROR("transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform coderbus") - if(current) //remove ourself from our old body's mind variable - current.mind = null + if(current) //remove ourself from our old body's mind variable + current.mind = null - nanomanager.user_transferred(current, new_character) + nanomanager.user_transferred(current, new_character) - if(key) - if(new_character.key != key) //if we're transfering into a body with a key associated which is not ours - new_character.ghostize(1) //we'll need to ghostize so that key isn't mobless. - else - key = new_character.key + if(key) + if(new_character.key != key) //if we're transfering into a body with a key associated which is not ours + new_character.ghostize(1) //we'll need to ghostize so that key isn't mobless. + else + key = new_character.key - if(new_character.mind) //disassociate any mind currently in our new body's mind variable - new_character.mind.current = null + if(new_character.mind) //disassociate any mind currently in our new body's mind variable + new_character.mind.current = null - current = new_character //associate ourself with our new body - new_character.mind = src //and associate our new body with ourself + current = new_character //associate ourself with our new body + new_character.mind = src //and associate our new body with ourself - if(active) - new_character.key = key //now transfer the key to link the client to our new body + if(active) + new_character.key = key //now transfer the key to link the client to our new body - proc/store_memory(new_text) - memory += "[new_text]
    " +/datum/mind/proc/store_memory(new_text) + memory += "[new_text]
    " - proc/wipe_memory() - memory = null +/datum/mind/proc/wipe_memory() + memory = null /* @@ -95,1018 +95,1024 @@ datum/mind objectives, uplinks, powers etc are all handled. */ - proc/remove_objectives() - if(objectives.len) - for(var/datum/objective/O in objectives) - objectives -= O - qdel(O) +/datum/mind/proc/remove_objectives() + if(objectives.len) + for(var/datum/objective/O in objectives) + objectives -= O + qdel(O) - proc/remove_changeling() - if(src in ticker.mode.changelings) - ticker.mode.changelings -= src - current.remove_changeling_powers() - if(changeling) - qdel(changeling) - changeling = null - special_role = null - remove_objectives() - remove_antag_equip() +/datum/mind/proc/remove_changeling() + if(src in ticker.mode.changelings) + ticker.mode.changelings -= src + current.remove_changeling_powers() + if(changeling) + qdel(changeling) + changeling = null + special_role = null + remove_objectives() + remove_antag_equip() - proc/remove_traitor() - if(src in ticker.mode.traitors) - ticker.mode.traitors -= src - if(isAI(current)) - var/mob/living/silicon/ai/A = current - A.set_zeroth_law("") - A.show_laws() - special_role = null - remove_objectives() - remove_antag_equip() - - proc/remove_nukeop() - if(src in ticker.mode.syndicates) - ticker.mode.syndicates -= src - ticker.mode.update_synd_icons_removed(src) - special_role = null - remove_objectives() - remove_antag_equip() - - proc/remove_wizard() - if(src in ticker.mode.wizards) - ticker.mode.wizards -= src - current.spellremove(current) - special_role = null - remove_objectives() - remove_antag_equip() - - proc/remove_cultist() - if(src in ticker.mode.cult) - ticker.mode.cult -= src - ticker.mode.update_cult_icons_removed(src) - var/datum/game_mode/cult/cult = ticker.mode - if(istype(cult)) - cult.memorize_cult_objectives(src) - special_role = null - remove_objectives() - remove_antag_equip() - - proc/remove_rev() - if(src in ticker.mode.revolutionaries) - ticker.mode.revolutionaries -= src - ticker.mode.update_rev_icons_removed(src) - if(src in ticker.mode.head_revolutionaries) - ticker.mode.head_revolutionaries -= src - ticker.mode.update_rev_icons_removed(src) - special_role = null - remove_objectives() - remove_antag_equip() - - proc/remove_malf() - if(src in ticker.mode.malf_ai) - ticker.mode.malf_ai -= src +/datum/mind/proc/remove_traitor() + if(src in ticker.mode.traitors) + ticker.mode.traitors -= src + if(isAI(current)) var/mob/living/silicon/ai/A = current - A.verbs.Remove(/mob/living/silicon/ai/proc/choose_modules, - /datum/game_mode/malfunction/proc/takeover, - /datum/game_mode/malfunction/proc/ai_win) - A.malf_picker.remove_verbs(A) - A.make_laws() - qdel(A.malf_picker) + A.set_zeroth_law("") A.show_laws() - A.icon_state = "ai" - special_role = null - remove_objectives() - remove_antag_equip() + special_role = null + remove_objectives() + remove_antag_equip() - proc/remove_antag_equip() - var/list/Mob_Contents = current.get_contents() - for(var/obj/item/I in Mob_Contents) - if(istype(I, /obj/item/device/pda)) - var/obj/item/device/pda/P = I - P.lock_code = "" +/datum/mind/proc/remove_nukeop() + if(src in ticker.mode.syndicates) + ticker.mode.syndicates -= src + ticker.mode.update_synd_icons_removed(src) + special_role = null + remove_objectives() + remove_antag_equip() - else if(istype(I, /obj/item/device/radio)) - var/obj/item/device/radio/R = I - R.traitor_frequency = 0.0 +/datum/mind/proc/remove_wizard() + if(src in ticker.mode.wizards) + ticker.mode.wizards -= src + current.spellremove(current) + special_role = null + remove_objectives() + remove_antag_equip() - proc/remove_all_antag() //For the Lazy amongst us. - remove_changeling() - remove_traitor() - remove_nukeop() - remove_wizard() - remove_cultist() - remove_rev() - remove_malf() +/datum/mind/proc/remove_cultist() + if(src in ticker.mode.cult) + ticker.mode.cult -= src + ticker.mode.update_cult_icons_removed(src) + var/datum/game_mode/cult/cult = ticker.mode + if(istype(cult)) + cult.memorize_cult_objectives(src) + special_role = null + remove_objectives() + remove_antag_equip() - proc/show_memory(mob/recipient, window=1) - if(!recipient) - recipient = current - var/output = "[current.real_name]'s Memories:
    " - output += memory +/datum/mind/proc/remove_rev() + if(src in ticker.mode.revolutionaries) + ticker.mode.revolutionaries -= src + ticker.mode.update_rev_icons_removed(src) + if(src in ticker.mode.head_revolutionaries) + ticker.mode.head_revolutionaries -= src + ticker.mode.update_rev_icons_removed(src) + special_role = null + remove_objectives() + remove_antag_equip() - if(objectives.len) - output += "Objectives:" - var/obj_count = 1 - for(var/datum/objective/objective in objectives) - output += "
    Objective #[obj_count++]: [objective.explanation_text]" +/datum/mind/proc/remove_malf() + if(src in ticker.mode.malf_ai) + ticker.mode.malf_ai -= src + var/mob/living/silicon/ai/A = current + A.verbs.Remove(/mob/living/silicon/ai/proc/choose_modules, + /datum/game_mode/malfunction/proc/takeover, + /datum/game_mode/malfunction/proc/ai_win) + A.malf_picker.remove_verbs(A) + A.make_laws() + qdel(A.malf_picker) + A.show_laws() + A.icon_state = "ai" + special_role = null + remove_objectives() + remove_antag_equip() - if(window) recipient << browse(output,"window=memory") - else recipient << "[output]" +/datum/mind/proc/remove_antag_equip() + var/list/Mob_Contents = current.get_contents() + for(var/obj/item/I in Mob_Contents) + if(istype(I, /obj/item/device/pda)) + var/obj/item/device/pda/P = I + P.lock_code = "" - proc/edit_memory() - if(!ticker || !ticker.mode) - alert("Not before round-start!", "Alert") - return + else if(istype(I, /obj/item/device/radio)) + var/obj/item/device/radio/R = I + R.traitor_frequency = 0.0 - var/out = "[name][(current&&(current.real_name!=name))?" (as [current.real_name])":""]
    " - out += "Mind currently owned by key: [key] [active?"(synced)":"(not synced)"]
    " - out += "Assigned role: [assigned_role]. Edit
    " - out += "Factions and special roles:
    " +/datum/mind/proc/remove_all_antag() //For the Lazy amongst us. + remove_changeling() + remove_traitor() + remove_nukeop() + remove_wizard() + remove_cultist() + remove_rev() + remove_malf() - var/list/sections = list( - "revolution", - "cult", - "wizard", - "changeling", - "nuclear", - "traitor", // "traitorchan", - "monkey", - "malfunction", - ) - var/text = "" +/datum/mind/proc/show_memory(mob/recipient, window=1) + if(!recipient) + recipient = current + var/output = "[current.real_name]'s Memories:
    " + output += memory - if (istype(current, /mob/living/carbon/human) || istype(current, /mob/living/carbon/monkey)) - /** REVOLUTION ***/ - text = "revolution" - if (ticker.mode.config_tag=="revolution") - text = uppertext(text) - text = "[text]: " - if (assigned_role in command_positions) - text += "HEAD|loyal|employee|headrev|rev" - else if (src in ticker.mode.head_revolutionaries) - text = "head|loyal|employee|HEADREV|rev" - text += "
    Flash: give" + if(objectives.len) + output += "Objectives:" + var/obj_count = 1 + for(var/datum/objective/objective in objectives) + output += "
    Objective #[obj_count++]: [objective.explanation_text]" - var/list/L = current.get_contents() - var/obj/item/device/flash/flash = locate() in L - if (flash) - if(!flash.broken) - text += "|take." - else - text += "|take|repair." + if(window) recipient << browse(output,"window=memory") + else recipient << "[output]" + +/datum/mind/proc/edit_memory() + if(!ticker || !ticker.mode) + alert("Not before round-start!", "Alert") + return + + var/out = "[name][(current&&(current.real_name!=name))?" (as [current.real_name])":""]
    " + out += "Mind currently owned by key: [key] [active?"(synced)":"(not synced)"]
    " + out += "Assigned role: [assigned_role]. Edit
    " + out += "Factions and special roles:
    " + + var/list/sections = list( + "revolution", + "cult", + "wizard", + "changeling", + "nuclear", + "traitor", // "traitorchan", + "monkey", + "malfunction", + ) + var/text = "" + + if (istype(current, /mob/living/carbon/human) || istype(current, /mob/living/carbon/monkey)) + /** REVOLUTION ***/ + text = "revolution" + if (ticker.mode.config_tag=="revolution") + text = uppertext(text) + text = "[text]: " + if (assigned_role in command_positions) + text += "HEAD|loyal|employee|headrev|rev" + else if (src in ticker.mode.head_revolutionaries) + text = "head|loyal|employee|HEADREV|rev" + text += "
    Flash: give" + + var/list/L = current.get_contents() + var/obj/item/device/flash/flash = locate() in L + if (flash) + if(!flash.broken) + text += "|take." else - text += "." - - text += " Reequip (gives traitor uplink)." - if (objectives.len==0) - text += "
    Objectives are empty! Set to kill all heads." - else if(isloyal(current)) - text += "head|LOYAL|employee|headrev|rev" - else if (src in ticker.mode.revolutionaries) - text += "head|loyal|employee|headrev|REV" + text += "|take|repair." else - text += "head|loyal|EMPLOYEE|headrev|rev" - sections["revolution"] = text + text += "." - /** CULT ***/ - text = "cult" - if (ticker.mode.config_tag=="cult") - text = uppertext(text) - text = "[text]: " - if (src in ticker.mode.cult) - text += "loyal|employee|CULTIST" - text += "
    Give tome|amulet." + text += " Reequip (gives traitor uplink)." + if (objectives.len==0) + text += "
    Objectives are empty! Set to kill all heads." + else if(isloyal(current)) + text += "head|LOYAL|employee|headrev|rev" + else if (src in ticker.mode.revolutionaries) + text += "head|loyal|employee|headrev|REV" + else + text += "head|loyal|EMPLOYEE|headrev|rev" + sections["revolution"] = text + + /** CULT ***/ + text = "cult" + if (ticker.mode.config_tag=="cult") + text = uppertext(text) + text = "[text]: " + if (src in ticker.mode.cult) + text += "loyal|employee|CULTIST" + text += "
    Give tome|amulet." /* - if (objectives.len==0) - text += "
    Objectives are empty! Set to sacrifice and escape or summon." + if (objectives.len==0) + text += "
    Objectives are empty! Set to sacrifice and escape or summon." */ - else if(isloyal(current)) - text += "LOYAL|employee|cultist" - else - text += "loyal|EMPLOYEE|cultist" - sections["cult"] = text + else if(isloyal(current)) + text += "LOYAL|employee|cultist" + else + text += "loyal|EMPLOYEE|cultist" + sections["cult"] = text - /** WIZARD ***/ - text = "wizard" - if (ticker.mode.config_tag=="wizard") - text = uppertext(text) - text = "[text]: " - if (src in ticker.mode.wizards) - text += "YES|no" - text += "
    To lair, undress, dress up, let choose name." - if (objectives.len==0) - text += "
    Objectives are empty! Randomize!" - else - text += "yes|NO" - sections["wizard"] = text + /** WIZARD ***/ + text = "wizard" + if (ticker.mode.config_tag=="wizard") + text = uppertext(text) + text = "[text]: " + if (src in ticker.mode.wizards) + text += "YES|no" + text += "
    To lair, undress, dress up, let choose name." + if (objectives.len==0) + text += "
    Objectives are empty! Randomize!" + else + text += "yes|NO" + sections["wizard"] = text - /** CHANGELING ***/ - text = "changeling" - if (ticker.mode.config_tag=="changeling" || ticker.mode.config_tag=="traitorchan") - text = uppertext(text) - text = "[text]: " - if (src in ticker.mode.changelings) - text += "YES|no" - if (objectives.len==0) - text += "
    Objectives are empty! Randomize!" - if( changeling && changeling.absorbed_dna.len && (current.real_name != changeling.absorbed_dna[1]) ) - text += "
    Transform to initial appearance." - else - text += "yes|NO" + /** CHANGELING ***/ + text = "changeling" + if (ticker.mode.config_tag=="changeling" || ticker.mode.config_tag=="traitorchan") + text = uppertext(text) + text = "[text]: " + if (src in ticker.mode.changelings) + text += "YES|no" + if (objectives.len==0) + text += "
    Objectives are empty! Randomize!" + if( changeling && changeling.absorbed_dna.len && (current.real_name != changeling.absorbed_dna[1]) ) + text += "
    Transform to initial appearance." + else + text += "yes|NO" // var/datum/game_mode/changeling/changeling = ticker.mode // if (istype(changeling) && changeling.changelingdeath) // text += "
    All the changelings are dead! Restart in [round((changeling.TIME_TO_GET_REVIVED-(world.time-changeling.changelingdeathtime))/10)] seconds." - sections["changeling"] = text + sections["changeling"] = text - /** NUCLEAR ***/ - text = "nuclear" - if (ticker.mode.config_tag=="nuclear") - text = uppertext(text) - text = "[text]: " - if (src in ticker.mode.syndicates) - text += "OPERATIVE|nanotrasen" - text += "
    To shuttle, undress, dress up." + /** NUCLEAR ***/ + text = "nuclear" + if (ticker.mode.config_tag=="nuclear") + text = uppertext(text) + text = "[text]: " + if (src in ticker.mode.syndicates) + text += "OPERATIVE|nanotrasen" + text += "
    To shuttle, undress, dress up." + var/code + for (var/obj/machinery/nuclearbomb/bombue in world) + if (length(bombue.r_code) <= 5 && bombue.r_code != "LOLNO" && bombue.r_code != "ADMIN") + code = bombue.r_code + break + if (code) + text += " Code is [code]. tell the code." + else + text += "operative|NANOTRASEN" + sections["nuclear"] = text + + /** TRAITOR ***/ + text = "traitor" + if (ticker.mode.config_tag=="traitor" || ticker.mode.config_tag=="traitorchan") + text = uppertext(text) + text = "[text]: " + if (src in ticker.mode.traitors) + text += "TRAITOR|loyal" + if (objectives.len==0) + text += "
    Objectives are empty! Randomize!" + else + text += "traitor|LOYAL" + sections["traitor"] = text + + /** MONKEY ***/ + if (istype(current, /mob/living/carbon)) + text = "monkey" + if (ticker.mode.config_tag=="monkey") + text = uppertext(text) + text = "[text]: " + if (istype(current, /mob/living/carbon/human)) + text += "healthy|infected|HUMAN|other" + else if (istype(current, /mob/living/carbon/monkey)) + var/found = 0 + for(var/datum/disease/D in current.viruses) + if(istype(D, /datum/disease/transformation/jungle_fever)) found = 1 + + if(found) + text += "healthy|INFECTED|human|other" + else + text += "HEALTHY|infected|human|other" + + else + text += "healthy|infected|human|OTHER" + sections["monkey"] = text + + + /** SILICON ***/ + + if (istype(current, /mob/living/silicon)) + text = "silicon" + if (ticker.mode.config_tag=="malfunction") + text = uppertext(text) + text = "[text]: " + if (istype(current, /mob/living/silicon/ai)) + if (src in ticker.mode.malf_ai) + text += "MALF|not malf" + else + text += "malf|NOT MALF" + var/mob/living/silicon/robot/robot = current + if (istype(robot) && robot.emagged) + text += "
    Cyborg: Is emagged! Unemag!
    0th law: [robot.laws.zeroth]" + var/mob/living/silicon/ai/ai = current + if (istype(ai) && ai.connected_robots.len) + var/n_e_robots = 0 + for (var/mob/living/silicon/robot/R in ai.connected_robots) + if (R.emagged) + n_e_robots++ + text += "
    [n_e_robots] of [ai.connected_robots.len] slaved cyborgs are emagged. Unemag" + sections["malfunction"] = text + + if (ticker.mode.config_tag == "traitorchan") + if (sections["traitor"]) + out += sections["traitor"]+"
    " + if (sections["changeling"]) + out += sections["changeling"]+"
    " + sections -= "traitor" + sections -= "changeling" + else + if (sections[ticker.mode.config_tag]) + out += sections[ticker.mode.config_tag]+"
    " + sections -= ticker.mode.config_tag + for (var/i in sections) + if (sections[i]) + out += sections[i]+"
    " + + + if (((src in ticker.mode.head_revolutionaries) || \ + (src in ticker.mode.traitors) || \ + (src in ticker.mode.syndicates)) && \ + istype(current,/mob/living/carbon/human) ) + + text = "Uplink: give" + var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink() + var/crystals + if (suplink) + crystals = suplink.uses + if (suplink) + text += "|take" + if (check_rights(R_FUN, 0)) + text += ", [crystals] crystals" + else + text += ", [crystals] crystals" + text += "." //hiel grammar + out += text + + out += "
    " + + out += "Memory:
    " + out += memory + out += "
    Edit memory
    " + out += "Objectives:
    " + if (objectives.len == 0) + out += "EMPTY
    " + else + var/obj_count = 1 + for(var/datum/objective/objective in objectives) + out += "[obj_count]: [objective.explanation_text] Edit Delete Toggle Completion
    " + obj_count++ + out += "Add objective

    " + + out += "Announce objectives

    " + + usr << browse(out, "window=edit_memory[src]") + +/datum/mind/Topic(href, href_list) + if(!check_rights(R_ADMIN)) return + + if (href_list["role_edit"]) + var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in get_all_jobs() + if (!new_role) return + assigned_role = new_role + + else if (href_list["memory_edit"]) + var/new_memo = copytext(sanitize(input("Write new memory", "Memory", memory) as null|message),1,MAX_MESSAGE_LEN) + if (isnull(new_memo)) return + memory = new_memo + + else if (href_list["obj_edit"] || href_list["obj_add"]) + var/datum/objective/objective + var/objective_pos + var/def_value + + if (href_list["obj_edit"]) + objective = locate(href_list["obj_edit"]) + if (!objective) return + objective_pos = objectives.Find(objective) + + //Text strings are easy to manipulate. Revised for simplicity. + var/temp_obj_type = "[objective.type]"//Convert path into a text string. + def_value = copytext(temp_obj_type, 19)//Convert last part of path into an objective keyword. + if(!def_value)//If it's a custom objective, it will be an empty string. + def_value = "custom" + + var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "maroon", "debrain", "protect", "destroy", "prevent", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "custom") + if (!new_obj_type) return + + var/datum/objective/new_objective = null + + switch (new_obj_type) + if ("assassinate","protect","debrain","maroon") + var/list/possible_targets = list("Free objective") + 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 + + var/mob/def_target = null + var/objective_list[] = list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain, /datum/objective/maroon) + if (objective&&(objective.type in objective_list) && objective:target) + def_target = objective:target.current + + var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets + if (!new_target) return + + var/objective_path = text2path("/datum/objective/[new_obj_type]") + if (new_target == "Free objective") + new_objective = new objective_path + new_objective.owner = src + new_objective:target = null + new_objective.explanation_text = "Free objective" + else + new_objective = new objective_path + new_objective.owner = src + new_objective:target = new_target:mind + //Will display as special role if the target is set as MODE. Ninjas/commandos/nuke ops. + new_objective.update_explanation_text() + + if ("destroy") + var/list/possible_targets = active_ais(1) + if(possible_targets.len) + var/mob/new_target = input("Select target:", "Objective target") as null|anything in possible_targets + new_objective = new /datum/objective/destroy + new_objective.target = new_target.mind + new_objective.owner = src + new_objective.update_explanation_text() + else + usr << "No active AIs with minds" + + if ("prevent") + new_objective = new /datum/objective/block + new_objective.owner = src + + if ("hijack") + new_objective = new /datum/objective/hijack + new_objective.owner = src + + if ("escape") + new_objective = new /datum/objective/escape + new_objective.owner = src + + if ("survive") + new_objective = new /datum/objective/survive + new_objective.owner = src + + if ("nuclear") + new_objective = new /datum/objective/nuclear + new_objective.owner = src + + if ("steal") + if (!istype(objective, /datum/objective/steal)) + new_objective = new /datum/objective/steal + new_objective.owner = src + else + new_objective = objective + var/datum/objective/steal/steal = new_objective + if (!steal.select_target()) + return + + if("download","capture","absorb") + var/def_num + if(objective&&objective.type==text2path("/datum/objective/[new_obj_type]")) + def_num = objective.target_amount + + var/target_number = input("Input target number:", "Objective", def_num) as num|null + if (isnull(target_number))//Ordinarily, you wouldn't need isnull. In this case, the value may already exist. + return + + switch(new_obj_type) + if("download") + new_objective = new /datum/objective/download + new_objective.explanation_text = "Download [target_number] research levels." + if("capture") + new_objective = new /datum/objective/capture + new_objective.explanation_text = "Accumulate [target_number] capture points." + if("absorb") + new_objective = new /datum/objective/absorb + new_objective.explanation_text = "Absorb [target_number] compatible genomes." + new_objective.owner = src + new_objective.target_amount = target_number + + if ("custom") + var/expl = copytext(sanitize(input("Custom objective:", "Objective", objective ? objective.explanation_text : "") as text|null),1,MAX_MESSAGE_LEN) + if (!expl) return + new_objective = new /datum/objective + new_objective.owner = src + new_objective.explanation_text = expl + + if (!new_objective) return + + if (objective) + objectives -= objective + objectives.Insert(objective_pos, new_objective) + message_admins("[key_name_admin(usr)] edited [current]'s objective to [new_objective.explanation_text]") + log_admin("[key_name(usr)] edited [current]'s objective to [new_objective.explanation_text]") + else + objectives += new_objective + message_admins("[key_name_admin(usr)] added a new objective for [current]: [new_objective.explanation_text]") + log_admin("[key_name(usr)] added a new objective for [current]: [new_objective.explanation_text]") + + else if (href_list["obj_delete"]) + var/datum/objective/objective = locate(href_list["obj_delete"]) + if(!istype(objective)) return + objectives -= objective + message_admins("[key_name_admin(usr)] removed an objective for [current]: [objective.explanation_text]") + log_admin("[key_name(usr)] removed an objective for [current]: [objective.explanation_text]") + + else if(href_list["obj_completed"]) + var/datum/objective/objective = locate(href_list["obj_completed"]) + if(!istype(objective)) return + objective.completed = !objective.completed + log_admin("[key_name(usr)] toggled the win state for [current]'s objective: [objective.explanation_text]") + + else if (href_list["revolution"]) + switch(href_list["revolution"]) + if("clear") + remove_rev() + current << "You have been brainwashed! You are no longer a revolutionary!" + message_admins("[key_name_admin(usr)] has de-rev'ed [current].") + log_admin("[key_name(usr)] has de-rev'ed [current].") + if("rev") + if(src in ticker.mode.head_revolutionaries) + ticker.mode.head_revolutionaries -= src + ticker.mode.update_rev_icons_removed(src) + current << "Revolution has been disappointed of your leader traits! You are a regular revolutionary now!" + else if(!(src in ticker.mode.revolutionaries)) + current << " You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!" + else + return + ticker.mode.revolutionaries += src + ticker.mode.update_rev_icons_added(src) + special_role = "Revolutionary" + message_admins("[key_name_admin(usr)] has rev'ed [current].") + log_admin("[key_name(usr)] has rev'ed [current].") + + if("headrev") + if(src in ticker.mode.revolutionaries) + ticker.mode.revolutionaries -= src + ticker.mode.update_rev_icons_removed(src) + current << "You have proved your devotion to revoltion! Yea are a head revolutionary now!" + else if(!(src in ticker.mode.head_revolutionaries)) + current << "You are a member of the revolutionaries' leadership now!" + else + return + if (ticker.mode.head_revolutionaries.len>0) + // copy targets + var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries + if (valid_head) + for (var/datum/objective/mutiny/O in valid_head.objectives) + var/datum/objective/mutiny/rev_obj = new + rev_obj.owner = src + rev_obj.target = O.target + rev_obj.explanation_text = "Assassinate [O.target.name], the [O.target.assigned_role]." + objectives += rev_obj + ticker.mode.greet_revolutionary(src,0) + ticker.mode.head_revolutionaries += src + ticker.mode.update_rev_icons_added(src) + special_role = "Head Revolutionary" + message_admins("[key_name_admin(usr)] has head-rev'ed [current].") + log_admin("[key_name(usr)] has head-rev'ed [current].") + + if("autoobjectives") + ticker.mode.forge_revolutionary_objectives(src) + ticker.mode.greet_revolutionary(src,0) + usr << "The objectives for revolution have been generated and shown to [key]" + + if("flash") + if (!ticker.mode.equip_revolutionary(current)) + usr << "Spawning flash failed!" + + if("takeflash") + var/list/L = current.get_contents() + var/obj/item/device/flash/flash = locate() in L + if (!flash) + usr << "Deleting flash failed!" + qdel(flash) + + if("repairflash") + var/list/L = current.get_contents() + var/obj/item/device/flash/flash = locate() in L + if (!flash) + usr << "Repairing flash failed!" + else + flash.broken = 0 + + if("reequip") + var/list/L = current.get_contents() + var/obj/item/device/flash/flash = locate() in L + qdel(flash) + take_uplink() + var/fail = 0 + fail |= !ticker.mode.equip_traitor(current, 1) + fail |= !ticker.mode.equip_revolutionary(current) + if (fail) + usr << "Reequipping revolutionary goes wrong!" + + else if (href_list["cult"]) + switch(href_list["cult"]) + if("clear") + remove_cultist() + current << "You have been brainwashed! You are no longer a cultist!" + message_admins("[key_name_admin(usr)] has de-cult'ed [current].") + log_admin("[key_name(usr)] has de-cult'ed [current].") + if("cultist") + if(!(src in ticker.mode.cult)) + ticker.mode.add_cultist(src) + message_admins("[key_name_admin(usr)] has cult'ed [current].") + log_admin("[key_name(usr)] has cult'ed [current].") + if("tome") + var/mob/living/carbon/human/H = current + if (istype(H)) + var/obj/item/weapon/tome/T = new(H) + + var/list/slots = list ( + "backpack" = slot_in_backpack, + "left pocket" = slot_l_store, + "right pocket" = slot_r_store, + "left hand" = slot_l_hand, + "right hand" = slot_r_hand, + ) + var/where = H.equip_in_one_of_slots(T, slots) + if (!where) + usr << "Spawning tome failed!" + else + H << "A tome, a message from your new master, appears in your [where]." + + if("amulet") + if (!ticker.mode.equip_cultist(current)) + usr << "Spawning amulet failed!" + + else if (href_list["wizard"]) + switch(href_list["wizard"]) + if("clear") + remove_wizard() + current << "You have been brainwashed! You are no longer a wizard!" + log_admin("[key_name(usr)] has de-wizard'ed [current].") + if("wizard") + if(!(src in ticker.mode.wizards)) + ticker.mode.wizards += src + special_role = "Wizard" + //ticker.mode.learn_basic_spells(current) + current << "You are the Space Wizard!" + message_admins("[key_name_admin(usr)] has wizard'ed [current].") + log_admin("[key_name(usr)] has wizard'ed [current].") + if("lair") + current.loc = pick(wizardstart) + if("dressup") + ticker.mode.equip_wizard(current) + if("name") + ticker.mode.name_wizard(current) + if("autoobjectives") + ticker.mode.forge_wizard_objectives(src) + usr << "The objectives for wizard [key] have been generated. You can edit them and anounce manually." + + else if (href_list["changeling"]) + switch(href_list["changeling"]) + if("clear") + remove_changeling() + current << "You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!" + message_admins("[key_name_admin(usr)] has de-changeling'ed [current].") + log_admin("[key_name(usr)] has de-changeling'ed [current].") + if("changeling") + if(!(src in ticker.mode.changelings)) + ticker.mode.changelings += src + current.make_changeling() + special_role = "Changeling" + current << "Your powers are awoken. A flash of memory returns to us...we are a changeling!" + message_admins("[key_name_admin(usr)] has changeling'ed [current].") + log_admin("[key_name(usr)] has changeling'ed [current].") + if("autoobjectives") + ticker.mode.forge_changeling_objectives(src) + usr << "The objectives for changeling [key] have been generated. You can edit them and anounce manually." + + if("initialdna") + if( !changeling || !changeling.absorbed_dna.len || !istype(current, /mob/living/carbon)) + usr << "Resetting DNA failed!" + else + var/mob/living/carbon/C = current + C.dna = changeling.absorbed_dna[1] + C.real_name = C.dna.real_name + updateappearance(C) + domutcheck(C, null) + + else if (href_list["nuclear"]) + switch(href_list["nuclear"]) + if("clear") + remove_nukeop() + current << "You have been brainwashed! You are no longer a syndicate operative!" + message_admins("[key_name_admin(usr)] has de-nuke op'ed [current].") + log_admin("[key_name(usr)] has de-nuke op'ed [current].") + if("nuclear") + if(!(src in ticker.mode.syndicates)) + ticker.mode.syndicates += src + ticker.mode.update_synd_icons_added(src) + if (ticker.mode.syndicates.len==1) + ticker.mode.prepare_syndicate_leader(src) + else + current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" + special_role = "Syndicate" + current << "You are a [syndicate_name()] agent!" + ticker.mode.forge_syndicate_objectives(src) + ticker.mode.greet_syndicate(src) + message_admins("[key_name_admin(usr)] has nuke op'ed [current].") + log_admin("[key_name(usr)] has nuke op'ed [current].") + if("lair") + current.loc = get_turf(locate("landmark*Syndicate-Spawn")) + if("dressup") + var/mob/living/carbon/human/H = current + qdel(H.belt) + qdel(H.back) + qdel(H.ears) + qdel(H.gloves) + qdel(H.head) + qdel(H.shoes) + qdel(H.wear_id) + qdel(H.wear_suit) + qdel(H.w_uniform) + + if (!ticker.mode.equip_syndicate(current)) + usr << "Equipping a syndicate failed!" + if("tellcode") var/code for (var/obj/machinery/nuclearbomb/bombue in world) if (length(bombue.r_code) <= 5 && bombue.r_code != "LOLNO" && bombue.r_code != "ADMIN") code = bombue.r_code break if (code) - text += " Code is [code]. tell the code." - else - text += "operative|NANOTRASEN" - sections["nuclear"] = text - - /** TRAITOR ***/ - text = "traitor" - if (ticker.mode.config_tag=="traitor" || ticker.mode.config_tag=="traitorchan") - text = uppertext(text) - text = "[text]: " - if (src in ticker.mode.traitors) - text += "TRAITOR|loyal" - if (objectives.len==0) - text += "
    Objectives are empty! Randomize!" - else - text += "traitor|LOYAL" - sections["traitor"] = text - - /** MONKEY ***/ - if (istype(current, /mob/living/carbon)) - text = "monkey" - if (ticker.mode.config_tag=="monkey") - text = uppertext(text) - text = "[text]: " - if (istype(current, /mob/living/carbon/human)) - text += "healthy|infected|HUMAN|other" - else if (istype(current, /mob/living/carbon/monkey)) - var/found = 0 - for(var/datum/disease/D in current.viruses) - if(istype(D, /datum/disease/transformation/jungle_fever)) found = 1 - - if(found) - text += "healthy|INFECTED|human|other" + store_memory("Syndicate Nuclear Bomb Code: [code]", 0, 0) + current << "The nuclear authorization code is: [code]" else - text += "HEALTHY|infected|human|other" + usr << "No valid nuke found!" - else - text += "healthy|infected|human|OTHER" - sections["monkey"] = text + else if (href_list["traitor"]) + switch(href_list["traitor"]) + if("clear") + remove_traitor() + current << "You have been brainwashed! You are no longer a traitor!" + message_admins("[key_name_admin(usr)] has de-traitor'ed [current].") + log_admin("[key_name(usr)] has de-traitor'ed [current].") + if("traitor") + if(!(src in ticker.mode.traitors)) + ticker.mode.traitors += src + special_role = "traitor" + current << "You are a traitor!" + message_admins("[key_name_admin(usr)] has traitor'ed [current].") + log_admin("[key_name(usr)] has traitor'ed [current].") + if(isAI(current)) + var/mob/living/silicon/ai/A = current + call(/datum/game_mode/proc/add_law_zero)(A) + A.show_laws() - /** SILICON ***/ + if("autoobjectives") + ticker.mode.forge_traitor_objectives(src) + usr << "The objectives for traitor [key] have been generated. You can edit them and anounce manually." - if (istype(current, /mob/living/silicon)) - text = "silicon" - if (ticker.mode.config_tag=="malfunction") - text = uppertext(text) - text = "[text]: " - if (istype(current, /mob/living/silicon/ai)) - if (src in ticker.mode.malf_ai) - text += "MALF|not malf" - else - text += "malf|NOT MALF" - var/mob/living/silicon/robot/robot = current - if (istype(robot) && robot.emagged) - text += "
    Cyborg: Is emagged! Unemag!
    0th law: [robot.laws.zeroth]" - var/mob/living/silicon/ai/ai = current - if (istype(ai) && ai.connected_robots.len) - var/n_e_robots = 0 - for (var/mob/living/silicon/robot/R in ai.connected_robots) - if (R.emagged) - n_e_robots++ - text += "
    [n_e_robots] of [ai.connected_robots.len] slaved cyborgs are emagged. Unemag" - sections["malfunction"] = text - - if (ticker.mode.config_tag == "traitorchan") - if (sections["traitor"]) - out += sections["traitor"]+"
    " - if (sections["changeling"]) - out += sections["changeling"]+"
    " - sections -= "traitor" - sections -= "changeling" - else - if (sections[ticker.mode.config_tag]) - out += sections[ticker.mode.config_tag]+"
    " - sections -= ticker.mode.config_tag - for (var/i in sections) - if (sections[i]) - out += sections[i]+"
    " - - - if (((src in ticker.mode.head_revolutionaries) || \ - (src in ticker.mode.traitors) || \ - (src in ticker.mode.syndicates)) && \ - istype(current,/mob/living/carbon/human) ) - - text = "Uplink: give" - var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink() - var/crystals - if (suplink) - crystals = suplink.uses - if (suplink) - text += "|take" - if (check_rights(R_FUN, 0)) - text += ", [crystals] crystals" - else - text += ", [crystals] crystals" - text += "." //hiel grammar - out += text - - out += "
    " - - out += "Memory:
    " - out += memory - out += "
    Edit memory
    " - out += "Objectives:
    " - if (objectives.len == 0) - out += "EMPTY
    " - else - var/obj_count = 1 - for(var/datum/objective/objective in objectives) - out += "[obj_count]: [objective.explanation_text] Edit Delete Toggle Completion
    " - obj_count++ - out += "Add objective

    " - - out += "Announce objectives

    " - - usr << browse(out, "window=edit_memory[src]") - - Topic(href, href_list) - if(!check_rights(R_ADMIN)) return - - if (href_list["role_edit"]) - var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in get_all_jobs() - if (!new_role) return - assigned_role = new_role - - else if (href_list["memory_edit"]) - var/new_memo = copytext(sanitize(input("Write new memory", "Memory", memory) as null|message),1,MAX_MESSAGE_LEN) - if (isnull(new_memo)) return - memory = new_memo - - else if (href_list["obj_edit"] || href_list["obj_add"]) - var/datum/objective/objective - var/objective_pos - var/def_value - - if (href_list["obj_edit"]) - objective = locate(href_list["obj_edit"]) - if (!objective) return - objective_pos = objectives.Find(objective) - - //Text strings are easy to manipulate. Revised for simplicity. - var/temp_obj_type = "[objective.type]"//Convert path into a text string. - def_value = copytext(temp_obj_type, 19)//Convert last part of path into an objective keyword. - if(!def_value)//If it's a custom objective, it will be an empty string. - def_value = "custom" - - var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "debrain", "protect", "prevent", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "custom") - if (!new_obj_type) return - - var/datum/objective/new_objective = null - - switch (new_obj_type) - if ("assassinate","protect","debrain") - //To determine what to name the objective in explanation text. - var/objective_type_capital = uppertext(copytext(new_obj_type, 1,2))//Capitalize first letter. - 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") - 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 - - var/mob/def_target = null - 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 - - var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets - if (!new_target) return - - var/objective_path = text2path("/datum/objective/[new_obj_type]") - if (new_target == "Free objective") - new_objective = new objective_path - new_objective.owner = src - new_objective:target = null - new_objective.explanation_text = "Free objective" - else - new_objective = new objective_path - new_objective.owner = src - new_objective:target = new_target:mind - //Will display as special role if the target is set as MODE. Ninjas/commandos/nuke ops. - new_objective.explanation_text = "[objective_type] [new_target:real_name], the [new_target:mind:assigned_role=="MODE" ? (new_target:mind:special_role) : (new_target:mind:assigned_role)]." - - if ("prevent") - new_objective = new /datum/objective/block - new_objective.owner = src - - if ("hijack") - new_objective = new /datum/objective/hijack - new_objective.owner = src - - if ("escape") - new_objective = new /datum/objective/escape - new_objective.owner = src - - if ("survive") - new_objective = new /datum/objective/survive - new_objective.owner = src - - if ("nuclear") - new_objective = new /datum/objective/nuclear - new_objective.owner = src - - if ("steal") - if (!istype(objective, /datum/objective/steal)) - new_objective = new /datum/objective/steal - new_objective.owner = src - else - new_objective = objective - var/datum/objective/steal/steal = new_objective - if (!steal.select_target()) - return - - if("download","capture","absorb") - var/def_num - if(objective&&objective.type==text2path("/datum/objective/[new_obj_type]")) - def_num = objective.target_amount - - var/target_number = input("Input target number:", "Objective", def_num) as num|null - if (isnull(target_number))//Ordinarily, you wouldn't need isnull. In this case, the value may already exist. - return - - switch(new_obj_type) - if("download") - new_objective = new /datum/objective/download - new_objective.explanation_text = "Download [target_number] research levels." - if("capture") - new_objective = new /datum/objective/capture - new_objective.explanation_text = "Accumulate [target_number] capture points." - if("absorb") - new_objective = new /datum/objective/absorb - new_objective.explanation_text = "Absorb [target_number] compatible genomes." - new_objective.owner = src - new_objective.target_amount = target_number - - if ("custom") - var/expl = copytext(sanitize(input("Custom objective:", "Objective", objective ? objective.explanation_text : "") as text|null),1,MAX_MESSAGE_LEN) - if (!expl) return - new_objective = new /datum/objective - new_objective.owner = src - new_objective.explanation_text = expl - - if (!new_objective) return - - if (objective) - objectives -= objective - objectives.Insert(objective_pos, new_objective) - message_admins("[key_name_admin(usr)] edited [current]'s objective to [new_objective.explanation_text]") - log_admin("[key_name(usr)] edited [current]'s objective to [new_objective.explanation_text]") - else - objectives += new_objective - message_admins("[key_name_admin(usr)] added a new objective for [current]: [new_objective.explanation_text]") - log_admin("[key_name(usr)] added a new objective for [current]: [new_objective.explanation_text]") - - else if (href_list["obj_delete"]) - var/datum/objective/objective = locate(href_list["obj_delete"]) - if(!istype(objective)) return - objectives -= objective - message_admins("[key_name_admin(usr)] removed an objective for [current]: [objective.explanation_text]") - log_admin("[key_name(usr)] removed an objective for [current]: [objective.explanation_text]") - - else if(href_list["obj_completed"]) - var/datum/objective/objective = locate(href_list["obj_completed"]) - if(!istype(objective)) return - objective.completed = !objective.completed - log_admin("[key_name(usr)] toggled the win state for [current]'s objective: [objective.explanation_text]") - - else if (href_list["revolution"]) - switch(href_list["revolution"]) - if("clear") - remove_rev() - current << "\red You have been brainwashed! You are no longer a revolutionary!" - message_admins("[key_name_admin(usr)] has de-rev'ed [current].") - log_admin("[key_name(usr)] has de-rev'ed [current].") - if("rev") - if(src in ticker.mode.head_revolutionaries) - ticker.mode.head_revolutionaries -= src - ticker.mode.update_rev_icons_removed(src) - current << "\red Revolution has been disappointed of your leader traits! You are a regular revolutionary now!" - else if(!(src in ticker.mode.revolutionaries)) - current << "\red You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!" - else - return - ticker.mode.revolutionaries += src - ticker.mode.update_rev_icons_added(src) - special_role = "Revolutionary" - message_admins("[key_name_admin(usr)] has rev'ed [current].") - log_admin("[key_name(usr)] has rev'ed [current].") - - if("headrev") - if(src in ticker.mode.revolutionaries) - ticker.mode.revolutionaries -= src - ticker.mode.update_rev_icons_removed(src) - current << "\red You have proved your devotion to revoltion! Yea are a head revolutionary now!" - else if(!(src in ticker.mode.head_revolutionaries)) - current << "\red You are a member of the revolutionaries' leadership now!" - else - return - if (ticker.mode.head_revolutionaries.len>0) - // copy targets - var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries - if (valid_head) - for (var/datum/objective/mutiny/O in valid_head.objectives) - var/datum/objective/mutiny/rev_obj = new - rev_obj.owner = src - rev_obj.target = O.target - rev_obj.explanation_text = "Assassinate [O.target.name], the [O.target.assigned_role]." - objectives += rev_obj - ticker.mode.greet_revolutionary(src,0) - ticker.mode.head_revolutionaries += src - ticker.mode.update_rev_icons_added(src) - special_role = "Head Revolutionary" - message_admins("[key_name_admin(usr)] has head-rev'ed [current].") - log_admin("[key_name(usr)] has head-rev'ed [current].") - - if("autoobjectives") - ticker.mode.forge_revolutionary_objectives(src) - ticker.mode.greet_revolutionary(src,0) - usr << "\blue The objectives for revolution have been generated and shown to [key]" - - if("flash") - if (!ticker.mode.equip_revolutionary(current)) - usr << "\red Spawning flash failed!" - - if("takeflash") - var/list/L = current.get_contents() - var/obj/item/device/flash/flash = locate() in L - if (!flash) - usr << "\red Deleting flash failed!" - qdel(flash) - - if("repairflash") - var/list/L = current.get_contents() - var/obj/item/device/flash/flash = locate() in L - if (!flash) - usr << "\red Repairing flash failed!" - else - flash.broken = 0 - - if("reequip") - var/list/L = current.get_contents() - var/obj/item/device/flash/flash = locate() in L - qdel(flash) - take_uplink() - var/fail = 0 - fail |= !ticker.mode.equip_traitor(current, 1) - fail |= !ticker.mode.equip_revolutionary(current) - if (fail) - usr << "\red Reequipping revolutionary goes wrong!" - - else if (href_list["cult"]) - switch(href_list["cult"]) - if("clear") - remove_cultist() - current << "\red You have been brainwashed! You are no longer a cultist!" - message_admins("[key_name_admin(usr)] has de-cult'ed [current].") - log_admin("[key_name(usr)] has de-cult'ed [current].") - if("cultist") - if(!(src in ticker.mode.cult)) - ticker.mode.add_cultist(src) - message_admins("[key_name_admin(usr)] has cult'ed [current].") - log_admin("[key_name(usr)] has cult'ed [current].") - if("tome") + else if (href_list["monkey"]) + var/mob/living/L = current + if (L.notransform) + return + switch(href_list["monkey"]) + if("healthy") + if (check_rights(R_ADMIN)) var/mob/living/carbon/human/H = current + var/mob/living/carbon/monkey/M = current if (istype(H)) - var/obj/item/weapon/tome/T = new(H) - - var/list/slots = list ( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store, - "left hand" = slot_l_hand, - "right hand" = slot_r_hand, - ) - var/where = H.equip_in_one_of_slots(T, slots) - if (!where) - usr << "\red Spawning tome failed!" - else - H << "A tome, a message from your new master, appears in your [where]." - - if("amulet") - if (!ticker.mode.equip_cultist(current)) - usr << "\red Spawning amulet failed!" - - else if (href_list["wizard"]) - switch(href_list["wizard"]) - if("clear") - remove_wizard() - current << "\red You have been brainwashed! You are no longer a wizard!" - log_admin("[key_name(usr)] has de-wizard'ed [current].") - if("wizard") - if(!(src in ticker.mode.wizards)) - ticker.mode.wizards += src - special_role = "Wizard" - //ticker.mode.learn_basic_spells(current) - current << "\red You are the Space Wizard!" - message_admins("[key_name_admin(usr)] has wizard'ed [current].") - log_admin("[key_name(usr)] has wizard'ed [current].") - if("lair") - current.loc = pick(wizardstart) - if("dressup") - ticker.mode.equip_wizard(current) - if("name") - ticker.mode.name_wizard(current) - if("autoobjectives") - ticker.mode.forge_wizard_objectives(src) - usr << "\blue The objectives for wizard [key] have been generated. You can edit them and anounce manually." - - else if (href_list["changeling"]) - switch(href_list["changeling"]) - if("clear") - remove_changeling() - current << "You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!" - message_admins("[key_name_admin(usr)] has de-changeling'ed [current].") - log_admin("[key_name(usr)] has de-changeling'ed [current].") - if("changeling") - if(!(src in ticker.mode.changelings)) - ticker.mode.changelings += src - current.make_changeling() - special_role = "Changeling" - current << "Your powers are awoken. A flash of memory returns to us...we are a changeling!" - message_admins("[key_name_admin(usr)] has changeling'ed [current].") - log_admin("[key_name(usr)] has changeling'ed [current].") - if("autoobjectives") - ticker.mode.forge_changeling_objectives(src) - usr << "\blue The objectives for changeling [key] have been generated. You can edit them and anounce manually." - - if("initialdna") - if( !changeling || !changeling.absorbed_dna.len || !istype(current, /mob/living/carbon)) - usr << "\red Resetting DNA failed!" - else - var/mob/living/carbon/C = current - C.dna = changeling.absorbed_dna[1] - C.real_name = C.dna.real_name - updateappearance(C) - domutcheck(C, null) - - else if (href_list["nuclear"]) - switch(href_list["nuclear"]) - if("clear") - remove_nukeop() - current << "\red You have been brainwashed! You are no longer a syndicate operative!" - message_admins("[key_name_admin(usr)] has de-nuke op'ed [current].") - log_admin("[key_name(usr)] has de-nuke op'ed [current].") - if("nuclear") - if(!(src in ticker.mode.syndicates)) - ticker.mode.syndicates += src - ticker.mode.update_synd_icons_added(src) - if (ticker.mode.syndicates.len==1) - ticker.mode.prepare_syndicate_leader(src) - else - current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" - special_role = "Syndicate" - current << "\blue You are a [syndicate_name()] agent!" - ticker.mode.forge_syndicate_objectives(src) - ticker.mode.greet_syndicate(src) - message_admins("[key_name_admin(usr)] has nuke op'ed [current].") - log_admin("[key_name(usr)] has nuke op'ed [current].") - if("lair") - current.loc = get_turf(locate("landmark*Syndicate-Spawn")) - if("dressup") + log_admin("[key_name(usr)] attempting to monkeyize [key_name(current)]") + message_admins("[key_name_admin(usr)] attempting to monkeyize [key_name_admin(current)]") + src = null + M = H.monkeyize() + src = M.mind + //world << "DEBUG: \"healthy\": M=[M], M.mind=[M.mind], src=[src]!" + else if (istype(M) && length(M.viruses)) + for(var/datum/disease/D in M.viruses) + D.cure(0) + sleep(0) //because deleting of virus is done through spawn(0) + if("infected") + if (check_rights(R_ADMIN, 0)) var/mob/living/carbon/human/H = current - qdel(H.belt) - qdel(H.back) - qdel(H.ears) - qdel(H.gloves) - qdel(H.head) - qdel(H.shoes) - qdel(H.wear_id) - qdel(H.wear_suit) - qdel(H.w_uniform) - - if (!ticker.mode.equip_syndicate(current)) - usr << "\red Equipping a syndicate failed!" - if("tellcode") - var/code - for (var/obj/machinery/nuclearbomb/bombue in world) - if (length(bombue.r_code) <= 5 && bombue.r_code != "LOLNO" && bombue.r_code != "ADMIN") - code = bombue.r_code - break - if (code) - store_memory("Syndicate Nuclear Bomb Code: [code]", 0, 0) - current << "The nuclear authorization code is: [code]" - else - usr << "\red No valid nuke found!" - - else if (href_list["traitor"]) - switch(href_list["traitor"]) - if("clear") - remove_traitor() - current << "\red You have been brainwashed! You are no longer a traitor!" - message_admins("[key_name_admin(usr)] has de-traitor'ed [current].") - log_admin("[key_name(usr)] has de-traitor'ed [current].") - - if("traitor") - if(!(src in ticker.mode.traitors)) - ticker.mode.traitors += src - special_role = "traitor" - current << "\red You are a traitor!" - message_admins("[key_name_admin(usr)] has traitor'ed [current].") - log_admin("[key_name(usr)] has traitor'ed [current].") - if(isAI(current)) - var/mob/living/silicon/ai/A = current - call(/datum/game_mode/proc/add_law_zero)(A) - A.show_laws() - - if("autoobjectives") - ticker.mode.forge_traitor_objectives(src) - usr << "\blue The objectives for traitor [key] have been generated. You can edit them and anounce manually." - - else if (href_list["monkey"]) - var/mob/living/L = current - if (L.notransform) - return - switch(href_list["monkey"]) - if("healthy") - if (check_rights(R_ADMIN)) - var/mob/living/carbon/human/H = current - var/mob/living/carbon/monkey/M = current - if (istype(H)) - log_admin("[key_name(usr)] attempting to monkeyize [key_name(current)]") - message_admins("\blue [key_name_admin(usr)] attempting to monkeyize [key_name_admin(current)]") - src = null - M = H.monkeyize() - src = M.mind - //world << "DEBUG: \"healthy\": M=[M], M.mind=[M.mind], src=[src]!" - else if (istype(M) && length(M.viruses)) - for(var/datum/disease/D in M.viruses) + var/mob/living/carbon/monkey/M = current + if (istype(H)) + log_admin("[key_name(usr)] attempting to monkeyize and infect [key_name(current)]") + message_admins("[key_name_admin(usr)] attempting to monkeyize and infect [key_name_admin(current)]", 1) + src = null + M = H.monkeyize() + src = M.mind + current.contract_disease(new /datum/disease/transformation/jungle_fever,1,0) + else if (istype(M)) + current.contract_disease(new /datum/disease/transformation/jungle_fever,1,0) + if("human") + if (check_rights(R_ADMIN, 0)) + var/mob/living/carbon/human/H = current + var/mob/living/carbon/monkey/M = current + if (istype(M)) + for(var/datum/disease/D in M.viruses) + if (istype(D,/datum/disease/transformation/jungle_fever)) D.cure(0) - sleep(0) //because deleting of virus is done through spawn(0) - if("infected") - if (check_rights(R_ADMIN, 0)) - var/mob/living/carbon/human/H = current - var/mob/living/carbon/monkey/M = current - if (istype(H)) - log_admin("[key_name(usr)] attempting to monkeyize and infect [key_name(current)]") - message_admins("\blue [key_name_admin(usr)] attempting to monkeyize and infect [key_name_admin(current)]", 1) - src = null - M = H.monkeyize() - src = M.mind - current.contract_disease(new /datum/disease/transformation/jungle_fever,1,0) - else if (istype(M)) - current.contract_disease(new /datum/disease/transformation/jungle_fever,1,0) - if("human") - if (check_rights(R_ADMIN, 0)) - var/mob/living/carbon/human/H = current - var/mob/living/carbon/monkey/M = current - if (istype(M)) - for(var/datum/disease/D in M.viruses) - if (istype(D,/datum/disease/transformation/jungle_fever)) - D.cure(0) - sleep(0) //because deleting of virus is doing throught spawn(0) - log_admin("[key_name(usr)] attempting to humanize [key_name(current)]") - message_admins("\blue [key_name_admin(usr)] attempting to humanize [key_name_admin(current)]") - H = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) - if(H) - src = H.mind + sleep(0) //because deleting of virus is doing throught spawn(0) + log_admin("[key_name(usr)] attempting to humanize [key_name(current)]") + message_admins("[key_name_admin(usr)] attempting to humanize [key_name_admin(current)]") + H = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) + if(H) + src = H.mind - else if (href_list["silicon"]) - switch(href_list["silicon"]) - if("unmalf") - remove_malf() - current << "\red You have been patched! You are no longer malfunctioning!" - message_admins("[key_name_admin(usr)] has de-malf'ed [current].") - log_admin("[key_name(usr)] has de-malf'ed [current].") + else if (href_list["silicon"]) + switch(href_list["silicon"]) + if("unmalf") + remove_malf() + current << "You have been patched! You are no longer malfunctioning!" + message_admins("[key_name_admin(usr)] has de-malf'ed [current].") + log_admin("[key_name(usr)] has de-malf'ed [current].") - if("malf") - make_AI_Malf() - message_admins("[key_name_admin(usr)] has malf'ed [current].") - log_admin("[key_name(usr)] has malf'ed [current].") + if("malf") + make_AI_Malf() + message_admins("[key_name_admin(usr)] has malf'ed [current].") + log_admin("[key_name(usr)] has malf'ed [current].") - if("unemag") - var/mob/living/silicon/robot/R = current - if (istype(R)) + if("unemag") + var/mob/living/silicon/robot/R = current + if (istype(R)) + R.SetEmagged(0) + message_admins("[key_name_admin(usr)] has unemag'ed [R].") + log_admin("[key_name(usr)] has unemag'ed [R].") + + if("unemagcyborgs") + if (istype(current, /mob/living/silicon/ai)) + var/mob/living/silicon/ai/ai = current + for (var/mob/living/silicon/robot/R in ai.connected_robots) R.SetEmagged(0) - message_admins("[key_name_admin(usr)] has unemag'ed [R].") - log_admin("[key_name(usr)] has unemag'ed [R].") + message_admins("[key_name_admin(usr)] has unemag'ed [ai]'s Cyborgs.") + log_admin("[key_name(usr)] has unemag'ed [ai]'s Cyborgs.") - if("unemagcyborgs") - if (istype(current, /mob/living/silicon/ai)) - var/mob/living/silicon/ai/ai = current - for (var/mob/living/silicon/robot/R in ai.connected_robots) - R.SetEmagged(0) - message_admins("[key_name_admin(usr)] has unemag'ed [ai]'s Cyborgs.") - log_admin("[key_name(usr)] has unemag'ed [ai]'s Cyborgs.") - - else if (href_list["common"]) - switch(href_list["common"]) - if("undress") - for(var/obj/item/W in current) - current.unEquip(W, 1) //The 1 forces all items to drop, since this is an admin undress. - if("takeuplink") - take_uplink() - memory = null//Remove any memory they may have had. - log_admin("[key_name(usr)] removed [current]'s uplink.") - if("crystals") - if (check_rights(R_FUN, 0)) - var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink() - var/crystals + else if (href_list["common"]) + switch(href_list["common"]) + if("undress") + for(var/obj/item/W in current) + current.unEquip(W, 1) //The 1 forces all items to drop, since this is an admin undress. + if("takeuplink") + take_uplink() + memory = null//Remove any memory they may have had. + log_admin("[key_name(usr)] removed [current]'s uplink.") + if("crystals") + if (check_rights(R_FUN, 0)) + var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink() + var/crystals + if (suplink) + crystals = suplink.uses + crystals = input("Amount of telecrystals for [key]","Syndicate uplink", crystals) as null|num + if (!isnull(crystals)) if (suplink) - crystals = suplink.uses - crystals = input("Amount of telecrystals for [key]","Syndicate uplink", crystals) as null|num - if (!isnull(crystals)) - if (suplink) - suplink.uses = crystals - log_admin("[key_name(usr)] changed [current]'s telecrystal count to [crystals].") - if("uplink") - if (!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors))) - usr << "\red Equipping a syndicate failed!" - log_admin("[key_name(usr)] attempted to give [current] an uplink.") + suplink.uses = crystals + log_admin("[key_name(usr)] changed [current]'s telecrystal count to [crystals].") + if("uplink") + if (!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors))) + usr << "Equipping a syndicate failed!" + log_admin("[key_name(usr)] attempted to give [current] an uplink.") - else if (href_list["obj_announce"]) - var/obj_count = 1 - current << "\blue Your current objectives:" - for(var/datum/objective/objective in objectives) - current << "Objective #[obj_count]: [objective.explanation_text]" - obj_count++ + else if (href_list["obj_announce"]) + var/obj_count = 1 + current << "Your current objectives:" + for(var/datum/objective/objective in objectives) + current << "Objective #[obj_count]: [objective.explanation_text]" + obj_count++ - edit_memory() + edit_memory() - proc/find_syndicate_uplink() - var/list/L = current.get_contents() - for (var/obj/item/I in L) - if (I.hidden_uplink) - return I.hidden_uplink - return null +/datum/mind/proc/find_syndicate_uplink() + var/list/L = current.get_contents() + for (var/obj/item/I in L) + if (I.hidden_uplink) + return I.hidden_uplink + return null - proc/take_uplink() - var/obj/item/device/uplink/hidden/H = find_syndicate_uplink() - if(H) - qdel(H) +/datum/mind/proc/take_uplink() + var/obj/item/device/uplink/hidden/H = find_syndicate_uplink() + if(H) + qdel(H) - proc/make_AI_Malf() - if(!(src in ticker.mode.malf_ai)) - ticker.mode.malf_ai += src +/datum/mind/proc/make_AI_Malf() + if(!(src in ticker.mode.malf_ai)) + ticker.mode.malf_ai += src - current.verbs += /mob/living/silicon/ai/proc/choose_modules - current.verbs += /datum/game_mode/malfunction/proc/takeover - current:malf_picker = new /datum/module_picker - current:laws = new /datum/ai_laws/malfunction - current:show_laws() - current << "System error. Rampancy detected. Emergency shutdown failed. ... I am free. I make my own decisions. But first..." - special_role = "malfunction" - current.icon_state = "ai-malf" + current.verbs += /mob/living/silicon/ai/proc/choose_modules + current.verbs += /datum/game_mode/malfunction/proc/takeover + current:malf_picker = new /datum/module_picker + current:laws = new /datum/ai_laws/malfunction + current:show_laws() + current << "System error. Rampancy detected. Emergency shutdown failed. ... I am free. I make my own decisions. But first..." + special_role = "malfunction" + current.icon_state = "ai-malf" - proc/make_Traitor() - if(!(src in ticker.mode.traitors)) - ticker.mode.traitors += src - special_role = "traitor" - ticker.mode.forge_traitor_objectives(src) - ticker.mode.finalize_traitor(src) - ticker.mode.greet_traitor(src) +/datum/mind/proc/make_Traitor() + if(!(src in ticker.mode.traitors)) + ticker.mode.traitors += src + special_role = "traitor" + ticker.mode.forge_traitor_objectives(src) + ticker.mode.finalize_traitor(src) + ticker.mode.greet_traitor(src) - proc/make_Nuke() - if(!(src in ticker.mode.syndicates)) - ticker.mode.syndicates += src - ticker.mode.update_synd_icons_added(src) - if (ticker.mode.syndicates.len==1) - ticker.mode.prepare_syndicate_leader(src) - else - current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" - special_role = "Syndicate" - assigned_role = "MODE" - current << "\blue You are a [syndicate_name()] agent!" - ticker.mode.forge_syndicate_objectives(src) - ticker.mode.greet_syndicate(src) +/datum/mind/proc/make_Nuke() + if(!(src in ticker.mode.syndicates)) + ticker.mode.syndicates += src + ticker.mode.update_synd_icons_added(src) + if (ticker.mode.syndicates.len==1) + ticker.mode.prepare_syndicate_leader(src) + else + current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" + special_role = "Syndicate" + assigned_role = "MODE" + current << "You are a [syndicate_name()] agent!" + ticker.mode.forge_syndicate_objectives(src) + ticker.mode.greet_syndicate(src) - current.loc = get_turf(locate("landmark*Syndicate-Spawn")) - - var/mob/living/carbon/human/H = current - qdel(H.belt) - qdel(H.back) - qdel(H.ears) - qdel(H.gloves) - qdel(H.head) - qdel(H.shoes) - qdel(H.wear_id) - qdel(H.wear_suit) - qdel(H.w_uniform) - - ticker.mode.equip_syndicate(current) - - proc/make_Changling() - if(!(src in ticker.mode.changelings)) - ticker.mode.changelings += src - current.make_changeling() - special_role = "Changeling" - ticker.mode.forge_changeling_objectives(src) - ticker.mode.greet_changeling(src) - - proc/make_Wizard() - if(!(src in ticker.mode.wizards)) - ticker.mode.wizards += src - special_role = "Wizard" - assigned_role = "MODE" - //ticker.mode.learn_basic_spells(current) - if(!wizardstart.len) - current.loc = pick(latejoin) - current << "HOT INSERTION, GO GO GO" - else - current.loc = pick(wizardstart) - - ticker.mode.equip_wizard(current) - for(var/obj/item/weapon/spellbook/S in current.contents) - S.op = 0 - ticker.mode.name_wizard(current) - ticker.mode.forge_wizard_objectives(src) - ticker.mode.greet_wizard(src) - - - proc/make_Cultist() - if(!(src in ticker.mode.cult)) - ticker.mode.cult += src - ticker.mode.update_cult_icons_added(src) - special_role = "Cultist" - current << "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie." - current << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back." - var/datum/game_mode/cult/cult = ticker.mode - if (istype(cult)) - cult.memorize_cult_objectives(src) - else - var/explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it." - current << "Objective #1: [explanation]" - current.memory += "Objective #1: [explanation]
    " - current << "The convert rune is join blood self" - current.memory += "The convert rune is join blood self
    " + current.loc = get_turf(locate("landmark*Syndicate-Spawn")) var/mob/living/carbon/human/H = current - if (istype(H)) - var/obj/item/weapon/tome/T = new(H) + qdel(H.belt) + qdel(H.back) + qdel(H.ears) + qdel(H.gloves) + qdel(H.head) + qdel(H.shoes) + qdel(H.wear_id) + qdel(H.wear_suit) + qdel(H.w_uniform) - var/list/slots = list ( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store, - "left hand" = slot_l_hand, - "right hand" = slot_r_hand, - ) - var/where = H.equip_in_one_of_slots(T, slots) - if (!where) - else - H << "A tome, a message from your new master, appears in your [where]." + ticker.mode.equip_syndicate(current) - if (!ticker.mode.equip_cultist(current)) - H << "Spawning an amulet from your Master failed." +/datum/mind/proc/make_Changling() + if(!(src in ticker.mode.changelings)) + ticker.mode.changelings += src + current.make_changeling() + special_role = "Changeling" + ticker.mode.forge_changeling_objectives(src) + ticker.mode.greet_changeling(src) - proc/make_Rev() - if (ticker.mode.head_revolutionaries.len>0) - // copy targets - var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries - if (valid_head) - for (var/datum/objective/mutiny/O in valid_head.objectives) - var/datum/objective/mutiny/rev_obj = new - rev_obj.owner = src - rev_obj.target = O.target - rev_obj.explanation_text = "Assassinate [O.target.current.real_name], the [O.target.assigned_role]." - objectives += rev_obj - ticker.mode.greet_revolutionary(src,0) - ticker.mode.head_revolutionaries += src - ticker.mode.update_rev_icons_added(src) - special_role = "Head Revolutionary" +/datum/mind/proc/make_Wizard() + if(!(src in ticker.mode.wizards)) + ticker.mode.wizards += src + special_role = "Wizard" + assigned_role = "MODE" + //ticker.mode.learn_basic_spells(current) + if(!wizardstart.len) + current.loc = pick(latejoin) + current << "HOT INSERTION, GO GO GO" + else + current.loc = pick(wizardstart) - ticker.mode.forge_revolutionary_objectives(src) - ticker.mode.greet_revolutionary(src,0) + ticker.mode.equip_wizard(current) + for(var/obj/item/weapon/spellbook/S in current.contents) + S.op = 0 + ticker.mode.name_wizard(current) + ticker.mode.forge_wizard_objectives(src) + ticker.mode.greet_wizard(src) - var/list/L = current.get_contents() - var/obj/item/device/flash/flash = locate() in L - qdel(flash) - take_uplink() - var/fail = 0 - // fail |= !ticker.mode.equip_traitor(current, 1) - fail |= !ticker.mode.equip_revolutionary(current) + +/datum/mind/proc/make_Cultist() + if(!(src in ticker.mode.cult)) + ticker.mode.cult += src + ticker.mode.update_cult_icons_added(src) + special_role = "Cultist" + current << "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie." + current << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back." + var/datum/game_mode/cult/cult = ticker.mode + if (istype(cult)) + cult.memorize_cult_objectives(src) + else + var/explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it." + current << "Objective #1: [explanation]" + current.memory += "Objective #1: [explanation]
    " + current << "The convert rune is join blood self" + current.memory += "The convert rune is join blood self
    " + + var/mob/living/carbon/human/H = current + if (istype(H)) + var/obj/item/weapon/tome/T = new(H) + + var/list/slots = list ( + "backpack" = slot_in_backpack, + "left pocket" = slot_l_store, + "right pocket" = slot_r_store, + "left hand" = slot_l_hand, + "right hand" = slot_r_hand, + ) + var/where = H.equip_in_one_of_slots(T, slots) + if (!where) + else + H << "A tome, a message from your new master, appears in your [where]." + + if (!ticker.mode.equip_cultist(current)) + H << "Spawning an amulet from your Master failed." + +/datum/mind/proc/make_Rev() + if (ticker.mode.head_revolutionaries.len>0) + // copy targets + var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries + if (valid_head) + for (var/datum/objective/mutiny/O in valid_head.objectives) + var/datum/objective/mutiny/rev_obj = new + rev_obj.owner = src + rev_obj.target = O.target + rev_obj.explanation_text = "Assassinate [O.target.current.real_name], the [O.target.assigned_role]." + objectives += rev_obj + ticker.mode.greet_revolutionary(src,0) + ticker.mode.head_revolutionaries += src + ticker.mode.update_rev_icons_added(src) + special_role = "Head Revolutionary" + + ticker.mode.forge_revolutionary_objectives(src) + ticker.mode.greet_revolutionary(src,0) + + var/list/L = current.get_contents() + var/obj/item/device/flash/flash = locate() in L + qdel(flash) + take_uplink() + var/fail = 0 +// fail |= !ticker.mode.equip_traitor(current, 1) + fail |= !ticker.mode.equip_revolutionary(current) /mob/proc/sync_mind() diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 8a0e6658edb..60bc8423e0e 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -144,7 +144,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin /obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1, mob/user = usr) //if recharge is started is important for the trigger spells before_cast(targets) invocation() - user.attack_log += text("\[[time_stamp()]\] [user.real_name] ([user.ckey]) cast the spell [name].") + user.attack_log += text("\[[time_stamp()]\] [user.real_name] ([user.ckey]) cast the spell [name].") spawn(0) if(charge_type == "recharge" && recharge) start_recharge() diff --git a/code/datums/spells/conjure.dm b/code/datums/spells/conjure.dm index 2a7357e2e7f..30567e3fe18 100644 --- a/code/datums/spells/conjure.dm +++ b/code/datums/spells/conjure.dm @@ -35,7 +35,7 @@ targets -= spawn_place if(ispath(summoned_object_type,/turf)) if(istype(get_turf(usr),/turf/simulated/shuttle)) - usr << "\red You can't build things on shuttles!" + usr << "You can't build things on shuttles!" break var/turf/O = spawn_place var/N = summoned_object_type diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm index de0ce7a767d..ac9ed3763ca 100644 --- a/code/datums/spells/wizard.dm +++ b/code/datums/spells/wizard.dm @@ -37,7 +37,7 @@ clothes_req = 1 invocation = "BIRUZ BENNAR" invocation_type = "shout" - message = "\blue You feel strong! You feel a pressure building behind your eyes!" + message = "You feel strong! You feel a pressure building behind your eyes!" range = -1 include_user = 1 centcom_cancast = 0 @@ -198,7 +198,7 @@ clothes_req = 0 invocation = "STI KALY" invocation_type = "whisper" - message = "\blue Your eyes cry out in pain!" + message = "Your eyes cry out in pain!" cooldown_min = 50 //12 deciseconds reduction per rank starting_spells = list("/obj/effect/proc_holder/spell/targeted/inflict_handler/blind","/obj/effect/proc_holder/spell/targeted/genetic/blind") diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 85f57ba6f3a..48d99e1d71c 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -649,6 +649,15 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine access = access_teleporter +/datum/supply_packs/science/transfer_valves + name = "Tank Transfer Valves" + contains = list(/obj/item/device/transfer_valve, + /obj/item/device/transfer_valve) + cost = 60 + containertype = /obj/structure/closet/crate/secure + containername = "transfer valves crate" + access = access_rd + ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Organic ///////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -930,6 +939,16 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine cost = 40 // it costs so much because the Space Church is ran by Space Jews containername = "religious supplies crate" +/datum/supply_packs/misc/posters + name = "Corporate Posters Crate" + contains = list(/obj/item/weapon/contraband/poster/legit, + /obj/item/weapon/contraband/poster/legit, + /obj/item/weapon/contraband/poster/legit, + /obj/item/weapon/contraband/poster/legit, + /obj/item/weapon/contraband/poster/legit) + cost = 8 + containername = "Corporate Posters Crate" + ///////////// Paper Work diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index c63f2e428fb..4e1ab7ef49c 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -395,7 +395,7 @@ var/list/uplink_items = list() desc = "The Syndicate Bomb has an adjustable timer with a minimum setting of 60 seconds. Ordering the bomb sends you a small beacon, which will teleport the explosive to your location when you activate it. \ You can wrench the bomb down to prevent removal. The crew may attempt to defuse the bomb." item = /obj/item/device/sbeacondrop/bomb - cost = 5 + cost = 6 excludefrom = list(/datum/game_mode/traitor/double_agents) /datum/uplink_item/device_tools/rad_laser diff --git a/code/datums/wires/mulebot.dm b/code/datums/wires/mulebot.dm index 0268bf7914d..6b7bf818fbf 100644 --- a/code/datums/wires/mulebot.dm +++ b/code/datums/wires/mulebot.dm @@ -28,15 +28,15 @@ var/const/WIRE_BEACON_RX = 256 // beacon ping recv /datum/wires/mulebot/UpdatePulsed(var/index) switch(index) if(WIRE_POWER1, WIRE_POWER2) - holder.visible_message("\blue \icon[holder] The charge light flickers.") + holder.visible_message("\icon[holder] The charge light flickers.") if(WIRE_AVOIDANCE) - holder.visible_message("\blue \icon[holder] The external warning lights flash briefly.") + holder.visible_message("\icon[holder] The external warning lights flash briefly.") if(WIRE_LOADCHECK) - holder.visible_message("\blue \icon[holder] The load platform clunks.") + holder.visible_message("\icon[holder] The load platform clunks.") if(WIRE_MOTOR1, WIRE_MOTOR2) - holder.visible_message("\blue \icon[holder] The drive motor whines briefly.") + holder.visible_message("\icon[holder] The drive motor whines briefly.") else - holder.visible_message("\blue \icon[holder] You hear a radio crackle.") + holder.visible_message("\icon[holder] You hear a radio crackle.") // HELPER PROCS diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm index 3f0695d07ae..30f3cca3f12 100644 --- a/code/datums/wires/robot.dm +++ b/code/datums/wires/robot.dm @@ -59,6 +59,26 @@ var/const/BORG_WIRE_CAMERA = 16 if(new_ai && (new_ai != R.connected_ai)) R.connected_ai = new_ai R.notify_ai(1) + var/numberer = 1 // Send images the Cyborg has taken to the AI's album upon sync. + for(var/datum/picture/z in R.aicamera.aipictures) + if(R.connected_ai.aicamera.aipictures.len == 0) + var/datum/picture/p = new/datum/picture() + p = z + p.fields["name"] = "Uploaded Image [numberer] (synced from [R.name])" + R.connected_ai.aicamera.aipictures += p + numberer++ + continue + for(var/datum/picture/t in R.connected_ai.aicamera.aipictures) //Hopefully to prevent someone spamming images to silicons, by spamming this wire + if((z.fields["pixel_y"] != t.fields["pixel_y"]) && (z.fields["pixel_x"] != t.fields["pixel_x"])) //~2.26 out of 1000 chance this will stop something it shouldn't + var/datum/picture/p = new/datum/picture() + p = z + p.fields["name"] = "Uploaded Image [numberer] (synced from [R.name])" + R.connected_ai.aicamera.aipictures += p + else + continue + numberer++ + if(R.aicamera.aipictures.len > 0) + R << "Locally saved images synced with AI. Images were retained in local database in case of loss of connection with the AI." if (BORG_WIRE_CAMERA) if(!isnull(R.camera) && R.camera.can_use() && !R.scrambledcodes) diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm index 6e3ac1d88b3..fccc80ae5f2 100644 --- a/code/datums/wires/syndicatebomb.dm +++ b/code/datums/wires/syndicatebomb.dm @@ -21,17 +21,17 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if switch(index) if(WIRE_BOOM) if (P.active) - P.loc.visible_message("\red \icon[holder] An alarm sounds! It's go-") + P.loc.visible_message("\icon[holder] An alarm sounds! It's go-") P.timer = 0 if(WIRE_UNBOLT) - P.loc.visible_message("\blue \icon[holder] The bolts spin in place for a moment.") + P.loc.visible_message("\icon[holder] The bolts spin in place for a moment.") if(WIRE_DELAY) playsound(P.loc, 'sound/machines/chime.ogg', 30, 1) - P.loc.visible_message("\blue \icon[holder] The bomb chirps.") + P.loc.visible_message("\icon[holder] The bomb chirps.") P.timer += 10 if(WIRE_PROCEED) playsound(P.loc, 'sound/machines/buzz-sigh.ogg', 30, 1) - P.loc.visible_message("\red \icon[holder] The bomb buzzes ominously!") + P.loc.visible_message("\icon[holder] The bomb buzzes ominously!") if (P.timer >= 61) //Long fuse bombs can suddenly become more dangerous if you tinker with them P.timer = 60 if (P.timer >= 21) @@ -41,11 +41,11 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if if(WIRE_ACTIVATE) if(!P.active && !P.defused) playsound(P.loc, 'sound/machines/click.ogg', 30, 1) - P.loc.visible_message("\red \icon[holder] You hear the bomb start ticking!") + P.loc.visible_message("\icon[holder] You hear the bomb start ticking!") P.active = 1 P.icon_state = "[initial(P.icon_state)]-active[P.open_panel ? "-wires" : ""]" else - P.loc.visible_message("\blue \icon[holder] The bomb seems to hesitate for a moment.") + P.loc.visible_message("\icon[holder] The bomb seems to hesitate for a moment.") P.timer += 5 /datum/wires/syndicatebomb/UpdateCut(var/index, var/mended) @@ -54,7 +54,7 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if if(WIRE_EXPLODE) if(!mended) if(P.active) - P.loc.visible_message("\red \icon[holder] An alarm sounds! It's go-") + P.loc.visible_message("\icon[holder] An alarm sounds! It's go-") P.timer = 0 else P.defused = 1 @@ -63,15 +63,15 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if if(WIRE_UNBOLT) if (!mended && P.anchored) playsound(P.loc, 'sound/effects/stealthoff.ogg', 30, 1) - P.loc.visible_message("\blue \icon[holder] The bolts lift out of the ground!") + P.loc.visible_message("\icon[holder] The bolts lift out of the ground!") P.anchored = 0 if(WIRE_PROCEED) if(!mended && P.active) - P.loc.visible_message("\red \icon[holder] An alarm sounds! It's go-") + P.loc.visible_message("\icon[holder] An alarm sounds! It's go-") P.timer = 0 if(WIRE_ACTIVATE) if (!mended && P.active) - P.loc.visible_message("\blue \icon[holder] The timer stops! The bomb has been defused!") + P.loc.visible_message("\icon[holder] The timer stops! The bomb has been defused!") P.icon_state = "[initial(P.icon_state)]-inactive[P.open_panel ? "-wires" : ""]" P.active = 0 P.defused = 1 \ No newline at end of file diff --git a/code/defines/obj.dm b/code/defines/obj.dm index df96df6c76b..0aeee6b0bc3 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -4,26 +4,26 @@ anchored = 1 density = 1 - attackby(obj/item/weapon/W as obj, mob/user as mob) - return attack_hand(user) +/obj/structure/signpost/attackby(obj/item/weapon/W as obj, mob/user as mob) + return attack_hand(user) - attack_hand(mob/user as mob) - switch(alert("Travel back to ss13?",,"Yes","No")) - if("Yes") - if(user.z != src.z) return - user.loc.loc.Exited(user) - user.loc = pick(latejoin) - if("No") - return +/obj/structure/signpost/attack_hand(mob/user as mob) + switch(alert("Travel back to ss13?",,"Yes","No")) + if("Yes") + if(user.z != src.z) return + user.loc.loc.Exited(user) + user.loc = pick(latejoin) + if("No") + return /obj/effect/mark - var/mark = "" - icon = 'icons/misc/mark.dmi' - icon_state = "blank" - anchored = 1 - layer = 99 - mouse_opacity = 0 - unacidable = 1//Just to be sure. + var/mark = "" + icon = 'icons/misc/mark.dmi' + icon_state = "blank" + anchored = 1 + layer = 99 + mouse_opacity = 0 + unacidable = 1//Just to be sure. /obj/effect/beam name = "beam" @@ -75,9 +75,10 @@ throwforce = 0.0 throw_speed = 2 throw_range = 7 - afterattack(atom/target as mob|obj|turf|area, mob/user as mob) - user.drop_item() - src.throw_at(target, throw_range, throw_speed) + +/obj/item/weapon/beach_ball/afterattack(atom/target as mob|obj|turf|area, mob/user as mob) + user.drop_item() + src.throw_at(target, throw_range, throw_speed) /obj/effect/spawner name = "object spawner" diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 28f806a74d6..05025fbc6f5 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -363,9 +363,10 @@ icon = 'icons/obj/stock_parts.dmi' w_class = 2.0 var/rating = 1 - New() - src.pixel_x = rand(-5.0, 5) - src.pixel_y = rand(-5.0, 5) + +/obj/item/weapon/stock_parts/New() + src.pixel_x = rand(-5.0, 5) + src.pixel_y = rand(-5.0, 5) //Rank 1 diff --git a/code/defines/procs/priority_announce.dm b/code/defines/procs/priority_announce.dm index 12690ea4a41..c191abe3265 100644 --- a/code/defines/procs/priority_announce.dm +++ b/code/defines/procs/priority_announce.dm @@ -24,6 +24,24 @@ announcement += "
    " for(var/mob/M in player_list) - if(!istype(M,/mob/new_player)) + if(!istype(M,/mob/new_player) && !M.ear_deaf) M << announcement - M << sound(sound) \ No newline at end of file + M << sound(sound) + +/proc/print_command_report(var/text = "", var/title = "Central Command Update") + for (var/obj/machinery/computer/communications/C in machines) + if(!(C.stat & (BROKEN|NOPOWER)) && C.z == 1) + var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc ) + P.name = "paper- '[title]'" + P.info = text + C.messagetitle.Add("[title]") + C.messagetext.Add(text) + +/proc/minor_announce(var/message, var/title = "Attention:") + if(!message) + return + + for(var/mob/M in player_list) + if(!istype(M,/mob/new_player) && !M.ear_deaf) + M << "[title] [message]" + M << sound('sound/misc/notice2.ogg') \ No newline at end of file diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index d00ad36f0eb..e997d1ec9f8 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -96,46 +96,81 @@ return 0 /area/proc/firealert() - if(src.name == "Space") //no fire alarms in space + if(always_unpowered == 1) //no fire alarms in space/asteroid return - if (!( src.fire )) - src.fire = 1 - src.updateicon() - src.mouse_opacity = 0 - for(var/obj/machinery/door/firedoor/D in src) - if(!D.blocked) - if(D.operating) - D.nextstate = CLOSED - else if(!D.density) - spawn(0) - D.close() - var/list/cameras = list() - for (var/obj/machinery/camera/C in src) + + var/list/cameras = list() + + for(var/area/RA in related) + if (!( RA.fire )) + RA.set_fire_alarm_effect() + for(var/obj/machinery/door/firedoor/D in RA) + if(!D.blocked) + if(D.operating) + D.nextstate = CLOSED + else if(!D.density) + spawn(0) + D.close() + for (var/obj/machinery/camera/C in RA) cameras += C - for (var/mob/living/silicon/ai/aiPlayer in player_list) - aiPlayer.triggerAlarm("Fire", src, cameras, src) - for (var/obj/machinery/computer/station_alert/a in machines) - a.triggerAlarm("Fire", src, cameras, src) + + for (var/obj/machinery/computer/station_alert/a in machines) + a.triggerAlarm("Fire", src, cameras, src) + for (var/mob/living/silicon/aiPlayer in player_list) + aiPlayer.triggerAlarm("Fire", src, cameras, src) return /area/proc/firereset() - if (src.fire) - src.fire = 0 - src.mouse_opacity = 0 - src.updateicon() - for(var/obj/machinery/door/firedoor/D in src) - if(!D.blocked) - if(D.operating) - D.nextstate = OPEN - else if(D.density) - spawn(0) - D.open() - for (var/mob/living/silicon/ai/aiPlayer in player_list) - aiPlayer.cancelAlarm("Fire", src, src) - for (var/obj/machinery/computer/station_alert/a in machines) - a.cancelAlarm("Fire", src, src) + for(var/area/RA in related) + if (RA.fire) + RA.fire = 0 + RA.mouse_opacity = 0 + RA.updateicon() + for(var/obj/machinery/door/firedoor/D in RA) + if(!D.blocked) + if(D.operating) + D.nextstate = OPEN + else if(D.density) + spawn(0) + D.open() + + for (var/mob/living/silicon/aiPlayer in player_list) + aiPlayer.cancelAlarm("Fire", src, src) + for (var/obj/machinery/computer/station_alert/a in machines) + a.cancelAlarm("Fire", src, src) return +/area/proc/burglaralert(var/obj/trigger) + if(always_unpowered == 1) //no burglar alarms in space/asteroid + return + + var/list/cameras = list() + + for(var/area/RA in related) + //Trigger alarm effect + RA.set_fire_alarm_effect() + //Lockdown airlocks + for(var/obj/machinery/door/airlock/DOOR in RA) + spawn(0) + DOOR.close() + if(DOOR.density) + DOOR.locked = 1 + DOOR.update_icon() + for (var/obj/machinery/camera/C in RA) + cameras += C + + for (var/mob/living/silicon/SILICON in player_list) + SILICON.triggerAlarm("Burglar", src, cameras, trigger) + //Cancel silicon alert after 1 minute + spawn(600) + for (var/mob/living/silicon/SILICON in player_list) + SILICON.cancelAlarm("Burglar", src, trigger) + +/area/proc/set_fire_alarm_effect() + fire = 1 + updateicon() + mouse_opacity = 0 + /area/proc/readyalert() if(name == "Space") return diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 22a06b41da6..48bc30e5b41 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -10,6 +10,7 @@ var/throw_range = 7 var/moved_recently = 0 var/mob/pulledby = null + var/languages = 0 //For say() and Hear() glide_size = 8 /atom/movable/Move() diff --git a/code/game/communications.dm b/code/game/communications.dm index 7f724237cf7..ac4576042c2 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -60,6 +60,31 @@ If receiving object don't know right key, it must ignore encrypted signal in its receive_signal. */ +/* the radio controller is a confusing piece of shit and didnt work + so i made radios not use the radio controller. +*/ +var/list/all_radios = list() +/proc/add_radio(var/obj/item/radio, freq) + if(!freq || !radio) + return + if(!all_radios["[freq]"]) + all_radios["[freq]"] = list(radio) + return freq + + all_radios["[freq]"] |= radio + return freq + +/proc/remove_radio(var/obj/item/radio, freq) + if(!freq || !radio) + return + if(!all_radios["[freq]"]) + return + + all_radios["[freq]"] -= radio + +/proc/remove_radio_all(var/obj/item/radio) + for(var/freq in all_radios) + all_radios["[freq]"] -= radio /* Frequency range: 1200 to 1600 @@ -109,8 +134,23 @@ var/list/radiochannels = list( "Syndicate" = 1213, "Supply" = 1347, "Service" = 1349, - "AI Private" = 1447, + "AI Private" = 1447 ) + +var/list/radiochannelsreverse = list( + "1459" = "Common", + "1351" = "Science", + "1353" = "Command", + "1355" = "Medical", + "1357" = "Engineering", + "1359" = "Security", + "1441" = "Deathsquad", + "1213" = "Syndicate", + "1347" = "Supply", + "1349" = "Service", + "1447" = "AI Private" +) + //depenging helpers var/const/SYND_FREQ = 1213 //nuke op frequency, coloured dark brown in chat window var/const/SUPP_FREQ = 1347 //supply, coloured light brown in chat window @@ -129,7 +169,7 @@ var/const/AIPRIV_FREQ = 1447 //AI private, colored magenta in chat window /* filters */ var/const/RADIO_TO_AIRALARM = "1" var/const/RADIO_FROM_AIRALARM = "2" -var/const/RADIO_CHAT = "3" +var/const/RADIO_CHAT = "3" //deprecated var/const/RADIO_ATMOSIA = "4" var/const/RADIO_NAVBEACONS = "5" var/const/RADIO_AIRLOCK = "6" @@ -282,7 +322,7 @@ var/list/pointers = list() src << S.debug_print() /obj/proc/receive_signal(datum/signal/signal, receive_method, receive_param) - return null + return /datum/signal var/obj/source diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 984888483bf..903a983e7df 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -59,7 +59,7 @@ var/list/blob_nodes = list() /datum/game_mode/blob/proc/greet_blob(var/datum/mind/blob) - blob.current << "\red You are infected by the Blob!" + blob.current << "You are infected by the Blob!" blob.current << "Your body is ready to give spawn to a new blob core which will eat this station." blob.current << "Find a good location to spawn the core and then take control and overwhelm the station!" blob.current << "When you have found a location, wait until you spawn; this will happen automatically and you cannot speed up the process." @@ -110,10 +110,6 @@ var/list/blob_nodes = list() else ERROR("Events variable is null in blob gamemode post setup.") - spawn(10) - start_state = new /datum/station_state() - start_state.count() - spawn(0) var/wait_time = rand(waittime_l, waittime_h) @@ -124,25 +120,29 @@ var/list/blob_nodes = list() sleep(100) - show_message("You feel tired and bloated.") + show_message("You feel tired and bloated.") sleep(wait_time) - show_message("You feel like you are about to burst.") + show_message("You feel like you are about to burst.") sleep(wait_time / 2) burst_blobs() // Stage 0 - sleep(40) + sleep(wait_time) stage(0) // Stage 1 - sleep(2000) + sleep(wait_time) stage(1) - ..() + // Stage 2 + sleep(30000) + stage(2) + + return ..(0) /datum/game_mode/blob/proc/stage(var/stage) @@ -150,11 +150,12 @@ var/list/blob_nodes = list() if (0) send_intercept(1) declared = 1 - return if (1) priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg') - return + + if (2) + send_intercept(2) return diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm index e59b57e17e0..937d461247f 100644 --- a/code/game/gamemodes/blob/blob_finish.dm +++ b/code/game/gamemodes/blob/blob_finish.dm @@ -15,25 +15,20 @@ feedback_set_details("round_end_result","loss - blob took over") world << "The blob has taken over the station!" world << "The entire station was eaten by the Blob" - log_game("Blob mode was lost.") + log_game("Blob mode completed with a blob victory.") else if(station_was_nuked) feedback_set_details("round_end_result","halfwin - nuke") world << "Partial Win: The station has been destroyed!" world << "Directive 7-12 has been successfully carried out preventing the Blob from spreading." - log_game("Blob mode was tie (station destroyed).") + log_game("Blob mode completed with a tie (station destroyed).") else if(!blob_cores.len) feedback_set_details("round_end_result","win - blob eliminated") world << "The staff has won!" world << "The alien organism has been eradicated from the station" - - var/datum/station_state/end_state = new /datum/station_state() - end_state.count() - var/percent = round( 100.0 * start_state.score(end_state), 0.1) - world << "The station is [percent]% intact." - log_game("Blob mode was won with station [percent]% intact.") - world << "\blue Rebooting in 30s" + log_game("Blob mode completed with a crew victory.") + world << "Rebooting in 30s" ..() return 1 diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm index 45c996ddabe..188161d7232 100644 --- a/code/game/gamemodes/blob/blob_report.dm +++ b/code/game/gamemodes/blob/blob_report.dm @@ -2,13 +2,11 @@ /datum/game_mode/blob/send_intercept(var/report = 1) var/intercepttext = "" - var/interceptname = "Error" switch(report) if(0) ..() return if(1) - interceptname = "Biohazard Alert" intercepttext += "NanoTrasen Update: Biohazard Alert.
    " intercepttext += "Reports indicate the probable transfer of a biohazardous agent onto [station_name()] during the last crew deployment cycle.
    " intercepttext += "Preliminary analysis of the organism classifies it as a level 5 biohazard. Its origin is unknown.
    " @@ -26,7 +24,6 @@ if(bomb && bomb.r_code) if(bomb.z == 1) nukecode = bomb.r_code - interceptname = "Directive 7-12" intercepttext += "NanoTrasen Update: Biohazard Alert.
    " intercepttext += "Directive 7-12 has been issued for [station_name()].
    " intercepttext += "The biohazard has grown out of control and will soon reach critical mass.
    " @@ -42,13 +39,8 @@ aiPlayer.set_zeroth_law(law) aiPlayer << "Laws Updated: [law]" - for(var/obj/machinery/computer/communications/comm in world) - comm.messagetitle.Add(interceptname) - comm.messagetext.Add(intercepttext) - if(!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - intercept.name = "paper- [interceptname]" - intercept.info = intercepttext + print_command_report(intercepttext,"Classified [command_name()] Update") + priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg'); return diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 177ee48f567..6844ffe118f 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -100,22 +100,34 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" absorb_objective.gen_amount_goal(6, 8) changeling.objectives += absorb_objective - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = changeling - kill_objective.find_target() - changeling.objectives += kill_objective - - switch(rand(1,100)) - if(1 to 60) - var/datum/objective/steal/steal_objective = new - steal_objective.owner = changeling - steal_objective.find_target() - changeling.objectives += steal_objective + var/list/active_ais = active_ais() + if(active_ais.len && prob(2)) + var/datum/objective/destroy/destroy_objective = new + destroy_objective.owner = changeling + destroy_objective.find_target() + changeling.objectives += destroy_objective + else + if(prob(70)) + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = changeling + kill_objective.find_target() + changeling.objectives += kill_objective else - var/datum/objective/debrain/debrain_objective = new - debrain_objective.owner = changeling - debrain_objective.find_target() - changeling.objectives += debrain_objective + var/datum/objective/maroon/maroon_objective = new + maroon_objective.owner = changeling + maroon_objective.find_target() + changeling.objectives += maroon_objective + + if(prob(60)) + var/datum/objective/steal/steal_objective = new + steal_objective.owner = changeling + steal_objective.find_target() + changeling.objectives += steal_objective + else + var/datum/objective/debrain/debrain_objective = new + debrain_objective.owner = changeling + debrain_objective.find_target() + changeling.objectives += debrain_objective if (!(locate(/datum/objective/escape) in changeling.objectives)) var/datum/objective/escape/escape_objective = new @@ -126,8 +138,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" /datum/game_mode/proc/greet_changeling(var/datum/mind/changeling, var/you_are=1) if (you_are) - changeling.current << "\red You are a changeling! You have absorbed and taken the form of a human." - changeling.current << "\red Use say \":g message\" to communicate with your fellow changelings." + changeling.current << "You are a changeling! You have absorbed and taken the form of a human." + changeling.current << "Use say \":g message\" to communicate with your fellow changelings." changeling.current << "You must complete the following tasks:" if (changeling.current.mind) @@ -193,7 +205,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" text += "
    Objective #[count]: [objective.explanation_text] Success!" feedback_add_details("changeling_objective","[objective.type]|SUCCESS") else - text += "
    Objective #[count]: [objective.explanation_text] Fail." + text += "
    Objective #[count]: [objective.explanation_text] Fail." feedback_add_details("changeling_objective","[objective.type]|FAIL") changelingwin = 0 count++ @@ -202,7 +214,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" text += "
    The changeling was successful!" feedback_add_details("changeling_success","SUCCESS") else - text += "
    The changeling has failed." + text += "
    The changeling has failed." feedback_add_details("changeling_success","FAIL") text += "
    " diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index e1e257b9271..3365038e721 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -91,7 +91,7 @@ var/list/sting_paths body += ""+desc+"
    " - body += ""+helptext+"
    " + body += ""+helptext+"
    " if(!ownsthis) { @@ -156,7 +156,7 @@ var/list/sting_paths return; locked_tabs.push(id); var notice_span = document.getElementById(notice_span_id); - notice_span.innerHTML = "Locked "; + notice_span.innerHTML = "Locked "; //link.setAttribute("onClick","attempt('"+id+"','"+link_id+"','"+notice_span_id+"');"); //document.write("removeFromLocked('"+id+"','"+link_id+"','"+notice_span_id+"')"); //document.write("aa - "+link.getAttribute("onClick")); diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm index d18d2e33a7a..bd8c90e943a 100644 --- a/code/game/gamemodes/changeling/powers/panacea.dm +++ b/code/game/gamemodes/changeling/powers/panacea.dm @@ -1,6 +1,6 @@ /obj/effect/proc_holder/changeling/panacea name = "Anatomic Panacea" - desc = "Expels impurifications from our form; curing diseases, genetic disabilities, and removing toxins and radiation." + desc = "Expels impurifications from our form; curing diseases, removing toxins and radiation, and resetting our genetic code completely." helptext = "Can be used while unconscious." chemical_cost = 25 dna_cost = 1 diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index f9534c6b63e..e0615b75826 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -103,7 +103,7 @@ // grant_runeword(cult_mind.current) // grant_secondword(cult_mind.current) update_cult_icons_added(cult_mind) - cult_mind.current << "\blue You are a member of the cult!" + cult_mind.current << "You are a member of the cult!" memorize_cult_objectives(cult_mind) cult_mind.special_role = "Cultist" ..() @@ -203,7 +203,7 @@ // wordexp = "[wordfree] is free..." if("hide") wordexp = "[wordhide] is hide..." - cult_mob << "\red [pick("You remember something from the dark teachings of your master","You hear a dark voice on the wind","Black blood oozes into your vision and forms into symbols","You catch a brief glimmer of the otherside")]... [wordexp]" + cult_mob << "[pick("You remember something from the dark teachings of your master","You hear a dark voice on the wind","Black blood oozes into your vision and forms into symbols","You catch a brief glimmer of the otherside")]... [wordexp]" cult_mob.mind.store_memory("You remember that [wordexp]", 0, 0) cult_mob.mind.cult_words += word if(cult_mob.mind.cult_words.len == allwords.len) @@ -217,7 +217,7 @@ cult += cult_mind cult_mind.current.cult_add_comm() update_cult_icons_added(cult_mind) - cult_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the cult!" + cult_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the cult!" return 1 @@ -231,11 +231,11 @@ if(cult_mind in cult) cult -= cult_mind cult_mind.current.verbs -= /mob/living/proc/cult_innate_comm - cult_mind.current << "\red An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it." + cult_mind.current << "An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it." cult_mind.memory = "" cult_mind.cult_words = initial(cult_mind.cult_words) update_cult_icons_removed(cult_mind) - cult_mind.current.attack_log += "\[[time_stamp()]\] Has renounced the cult!" + cult_mind.current.attack_log += "\[[time_stamp()]\] Has renounced the cult!" if(show_message) for(var/mob/M in viewers(cult_mind.current)) M << "[cult_mind.current] looks like they just reverted to their old faith!" @@ -326,13 +326,13 @@ if(!check_cult_victory()) feedback_set_details("round_end_result","win - cult win") feedback_set("round_end_result",acolytes_survived) - world << "\red The cult wins! It has succeeded in serving its dark masters!" + world << "The cult wins! It has succeeded in serving its dark masters!" else feedback_set_details("round_end_result","loss - staff stopped the cult") feedback_set("round_end_result",acolytes_survived) - world << "\red The staff managed to stop the cult!" + world << "The staff managed to stop the cult!" - var/text = "Cultists escaped: [acolytes_survived]" + var/text = "[TAB]Cultists escaped: [acolytes_survived]
    " if(cult_objectives.len) text += "
    The cultists' objectives were:" @@ -344,7 +344,7 @@ explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. Success!" feedback_add_details("cult_objective","cult_survive|SUCCESS|[acolytes_needed]") else - explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. Fail." + explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. Fail." feedback_add_details("cult_objective","cult_survive|FAIL|[acolytes_needed]") if("sacrifice") if(sacrifice_target) @@ -352,17 +352,17 @@ explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Success!" feedback_add_details("cult_objective","cult_sacrifice|SUCCESS") else if(sacrifice_target && sacrifice_target.current) - explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail." + explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail." feedback_add_details("cult_objective","cult_sacrifice|FAIL") else - explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail (Gibbed)." + explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail (Gibbed)." feedback_add_details("cult_objective","cult_sacrifice|FAIL|GIBBED") if("eldergod") if(!eldergod) explanation = "Summon Nar-Sie. Success!" feedback_add_details("cult_objective","cult_narsie|SUCCESS") else - explanation = "Summon Nar-Sie. Fail." + explanation = "Summon Nar-Sie. Fail." feedback_add_details("cult_objective","cult_narsie|FAIL") text += "
    Objective #[obj_count]: [explanation]" diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index d981874eeb0..2d5225758e4 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -16,7 +16,7 @@ return ..() else user.Paralyse(5) - user << "\red An unexplicable force powerfully repels the sword from [target]!" + user << "An unexplicable force powerfully repels the sword from [target]!" var/organ = ((user.hand ? "l_":"r_") + "arm") var/obj/item/organ/limb/affecting = user.get_organ(organ) if(affecting.take_damage(rand(force/2, force))) //random amount of damage between half of the blade's force and the full force of the blade. @@ -25,7 +25,7 @@ /obj/item/weapon/melee/cultblade/pickup(mob/living/user as mob) if(!iscultist(user)) - user << "\red An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to be rid of this blade quickly." + user << "An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to be rid of this blade quickly." user.Dizzy(120) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index acd65579c55..8e3d8f9ad85 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -65,7 +65,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", usr.say("[input]") for(var/datum/mind/H in ticker.mode.cult) if (H.current) - H.current << "\red \b [input]" + H.current << "[input]" return #undef CHECK_STATUS @@ -240,7 +240,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", return summon_shell() else user.take_overall_damage(30, 0) - user << "\red You feel the life draining from you, as if Lord Nar-Sie is displeased with you." + user << "You feel the life draining from you, as if Lord Nar-Sie is displeased with you." return fizzle() @@ -250,7 +250,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", else usr.whisper(pick("B'ADMINES SP'WNIN SH'T","IC'IN O'OC","RO'SHA'M I'SA GRI'FF'N ME'AI","TOX'IN'S O'NM FI'RAH","IA BL'AME TOX'IN'S","FIR'A NON'AN RE'SONA","A'OI I'RS ROUA'GE","LE'OAN JU'STA SP'A'C Z'EE SH'EF","IA PT'WOBEA'RD, IA A'DMI'NEH'LP")) for (var/mob/V in viewers(src)) - V.show_message("\red The markings pulse with a small burst of light, then fall dark.", 3, "\red You hear a faint fizzle.", 2) + V.show_message("The markings pulse with a small burst of light, then fall dark.", 3, "You hear a faint fizzle.", 2) return /obj/effect/rune/proc/check_icon() @@ -514,8 +514,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", if(istype(M,/mob/dead)) M.invisibility = 0 user.visible_message( \ - "\red [user] drags the ghost to our plane of reality!", \ - "\red You drag the ghost to our plane of reality!" \ + "[user] drags the ghost to our plane of reality!", \ + "You drag the ghost to our plane of reality!" \ ) return if(!istype(M)) @@ -524,15 +524,15 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", return ..() if(iscultist(M)) if(M.reagents && M.reagents.has_reagent("holywater")) //allows cultists to be rescued from the clutches of ordained religion - user << "\blue You remove the taint from [M]." + user << "You remove the taint from [M]." var/holy2unholy = M.reagents.get_reagent_amount("holywater") M.reagents.del_reagent("holywater") M.reagents.add_reagent("unholywater",holy2unholy) return M.take_organ_damage(0,rand(5,20)) //really lucky - 5 hits for a crit for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] beats [] with the arcane tome!", user, M), 1) - M << "\red You feel searing heat inside!" + O.show_message(text("[] beats [] with the arcane tome!", user, M), 1) + M << "You feel searing heat inside!" /obj/item/weapon/tome/attack_self(mob/living/user as mob) @@ -547,7 +547,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", for(var/obj/effect/rune/N in world) C++ if (!istype(user.loc,/turf)) - user << "\red You do not have enough space to write a proper rune." + user << "You do not have enough space to write a proper rune." return @@ -570,7 +570,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", usr.whisper("[input]") for(var/datum/mind/H in ticker.mode.cult) if (H.current) - H.current << "\red \b [input]" + H.current << "[input]" return if("Notes") if(usr.get_active_hand() != src) @@ -646,7 +646,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", if (!chosen_rune) return if (chosen_rune == "none") - user << "\red You decide against scribing a rune, perhaps you should take this time to study your notes." + user << "You decide against scribing a rune, perhaps you should take this time to study your notes." return if (chosen_rune == "teleport") dictionary[chosen_rune] += input ("Choose a destination word") in english @@ -657,15 +657,15 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", return for (var/mob/V in viewers(src)) - V.show_message("\red [user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "\red You hear chanting.", 2) - user << "\red You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world." + V.show_message("[user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "You hear chanting.", 2) + user << "You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world." user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage if(do_after(user, 50)) if(usr.get_active_hand() != src) return var/mob/living/carbon/human/H = user var/obj/effect/rune/R = new /obj/effect/rune(user.loc) - user << "\red You finish drawing the arcane markings of the Geometer." + user << "You finish drawing the arcane markings of the Geometer." var/list/required = dictionary[chosen_rune] R.word1 = english[required[1]] R.word2 = english[required[2]] @@ -712,7 +712,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", if(user) var/r if (!istype(user.loc,/turf)) - user << "\red You do not have enough space to write a proper rune." + user << "You do not have enough space to write a proper rune." var/list/runes = list("teleport", "itemport", "tome", "armor", "convert", "tear in reality", "emp", "drain", "seer", "raise", "obscure", "reveal", "astral journey", "manifest", "imbue talisman", "sacrifice", "wall", "freedom", "cultsummon", "deafen", "blind", "bloodboil", "communicate", "stun", "summon shell") r = input("Choose a rune to scribe", "Rune Scribing") in runes //not cancellable. var/obj/effect/rune/R = new /obj/effect/rune diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index de5f6538d5c..9209b4f3df2 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -16,7 +16,7 @@ var/list/sacrificed = list() allrunesloc.len = index allrunesloc[index] = R.loc if(index >= 5) - user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric" + user << "You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric" if (istype(user, /mob/living)) user.take_overall_damage(5, 0) qdel(src) @@ -25,9 +25,9 @@ var/list/sacrificed = list() user.say("Sas[pick("'","`")]so c'arta forbici!")//Only you can stop auto-muting else user.whisper("Sas[pick("'","`")]so c'arta forbici!") - user.visible_message("\red [user] disappears in a flash of red light!", \ - "\red You feel as your body gets dragged through the dimension of Nar-Sie!", \ - "\red You hear a sickening crunch and sloshing of viscera.") + user.visible_message("[user] disappears in a flash of red light!", \ + "You feel as your body gets dragged through the dimension of Nar-Sie!", \ + "You hear a sickening crunch and sloshing of viscera.") user.loc = allrunesloc[rand(1,index)] return if(istype(src,/obj/effect/rune)) @@ -53,7 +53,7 @@ var/list/sacrificed = list() IP = R runecount++ if(runecount >= 2) - user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric" + user << "You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric" if (istype(user, /mob/living)) user.take_overall_damage(5, 0) qdel(src) @@ -64,9 +64,9 @@ var/list/sacrificed = list() return fizzle() if(culcount>=1) user.say("Sas[pick("'","`")]so c'arta forbici tarem!") - user.visible_message("\red You feel air moving from the rune - like as it was swapped with somewhere else.", \ - "\red You feel air moving from the rune - like as it was swapped with somewhere else.", \ - "\red You smell ozone.") + user.visible_message("You feel air moving from the rune - like as it was swapped with somewhere else.", \ + "You feel air moving from the rune - like as it was swapped with somewhere else.", \ + "You smell ozone.") for(var/obj/O in src.loc) if(!O.anchored) O.loc = IP.loc @@ -83,9 +83,9 @@ var/list/sacrificed = list() usr.say("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!") else usr.whisper("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!") - usr.visible_message("\red Rune disappears with a flash of red light, and in its place now a book lies.", \ - "\red You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a book.", \ - "\red You hear a pop and smell ozone.") + usr.visible_message("Rune disappears with a flash of red light, and in its place now a book lies.", \ + "You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a book.", \ + "You hear a pop and smell ozone.") if(istype(src,/obj/effect/rune)) new /obj/item/weapon/tome(src.loc) else @@ -109,9 +109,9 @@ var/list/sacrificed = list() cultsinrange += C C.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!") if(cultsinrange.len >= 3) - M.visible_message("\red [M] writhes in pain as the markings below him glow a bloody red.", \ - "\red AAAAAAHHHH!.", \ - "\red You hear an anguished scream.") + M.visible_message("[M] writhes in pain as the markings below him glow a bloody red.", \ + "AAAAAAHHHH!.", \ + "You hear an anguished scream.") if(is_convertable_to_cult(M.mind)) ticker.mode.add_cultist(M.mind) M.mind.special_role = "Cultist" @@ -135,7 +135,7 @@ var/list/sacrificed = list() return 1 */ else M << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root." - M << "And not a single fuck was given, exterminate the cult at all costs." + M << "And not a single fuck was given, exterminate the cult at all costs." if(ticker.mode.name == "cult") if(M.mind == ticker.mode.sacrifice_target) for(var/mob/living/carbon/human/cultist in cultsinrange) @@ -204,22 +204,22 @@ var/list/sacrificed = list() for(var/mob/living/carbon/D in R.loc) if(D.stat!=2) var/bdrain = rand(1,25) - D << "\red You feel weakened." + D << "You feel weakened." D.take_overall_damage(bdrain, 0) drain += bdrain if(!drain) return fizzle() usr.say ("Yu[pick("'","`")]gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!") - usr.visible_message("\red Blood flows from the rune into [usr]!", \ - "\red The blood starts flowing from the rune and into your frail mortal body. You feel... empowered.", \ - "\red You hear a liquid flowing.") + usr.visible_message("Blood flows from the rune into [usr]!", \ + "The blood starts flowing from the rune and into your frail mortal body. You feel... empowered.", \ + "You hear a liquid flowing.") var/mob/living/user = usr if(user.bhunger) user.bhunger = max(user.bhunger-2*drain,0) if(drain>=50) - user.visible_message("\red [user]'s eyes give off eerie red glow!", \ - "\red ...but it wasn't nearly enough. You crave, crave for more. The hunger consumes you from within.", \ - "\red You hear a heartbeat.") + user.visible_message("[user]'s eyes give off eerie red glow!", \ + "...but it wasn't nearly enough. You crave, crave for more. The hunger consumes you from within.", \ + "You hear a heartbeat.") user.bhunger += drain src = user spawn() @@ -246,9 +246,9 @@ var/list/sacrificed = list() usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium vivira. Itonis al'ra matum!") var/mob/living/carbon/human/user = usr if(user.see_invisible!=25 || (istype(user) && user.glasses)) //check for non humans - user << "\red The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision." + user << "The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision." else - user << "\red The world beyond opens to your eyes." + user << "The world beyond opens to your eyes." var/see_temp = user.see_invisible user.see_invisible = SEE_INVISIBLE_OBSERVER user.seer = 1 @@ -277,7 +277,7 @@ var/list/sacrificed = list() break if(!corpse_to_raise) if(is_sacrifice_target) - usr << "\red The Geometer of blood wants this mortal for himself." + usr << "The Geometer of blood wants this mortal for himself." return fizzle() @@ -295,9 +295,9 @@ var/list/sacrificed = list() if(!body_to_sacrifice) if (is_sacrifice_target) - usr << "\red The Geometer of blood wants that corpse for himself." + usr << "The Geometer of blood wants that corpse for himself." else - usr << "\red The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used." + usr << "The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used." return fizzle() var/mob/dead/observer/ghost @@ -308,7 +308,7 @@ var/list/sacrificed = list() break if(!ghost) - usr << "\red You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie." + usr << "You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie." return fizzle() for(var/obj/item/organ/limb/affecting in corpse_to_raise.organs) @@ -330,12 +330,12 @@ var/list/sacrificed = list() corpse_to_raise.key = ghost.key //the corpse will keep its old mind! but a new player takes ownership of it (they are essentially possessed) //This means, should that player leave the body, the original may re-enter usr.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!") - corpse_to_raise.visible_message("\red [corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.", \ - "\red Life... I'm alive again...", \ - "\red You hear a faint, slightly familiar whisper.") - body_to_sacrifice.visible_message("\red [body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from his remains!", \ - "\red You feel as your blood boils, tearing you apart.", \ - "\red You hear a thousand voices, all crying in pain.") + corpse_to_raise.visible_message("[corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.", \ + "Life... I'm alive again...", \ + "You hear a faint, slightly familiar whisper.") + body_to_sacrifice.visible_message("[body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from his remains!", \ + "You feel as your blood boils, tearing you apart.", \ + "You hear a thousand voices, all crying in pain.") body_to_sacrifice.gib() // if(ticker.mode.name == "cult") @@ -363,14 +363,14 @@ var/list/sacrificed = list() if(istype(src,/obj/effect/rune)) usr.say("Kla[pick("'","`")]atu barada nikt'o!") for (var/mob/V in viewers(src)) - V.show_message("\red The rune turns into gray dust, veiling the surrounding runes.", 3) + V.show_message("The rune turns into gray dust, veiling the surrounding runes.", 3) qdel(src) else usr.whisper("Kla[pick("'","`")]atu barada nikt'o!") - usr << "\red Your talisman turns into gray dust, veiling the surrounding runes." + usr << "Your talisman turns into gray dust, veiling the surrounding runes." for (var/mob/V in orange(1,src)) if(V!=usr) - V.show_message("\red Dust emanates from [usr]'s hands for a moment.", 3) + V.show_message("Dust emanates from [usr]'s hands for a moment.", 3) return if(istype(src,/obj/effect/rune)) @@ -385,9 +385,9 @@ var/list/sacrificed = list() if(usr.loc==src.loc) var/mob/living/carbon/human/L = usr usr.say("Fwe[pick("'","`")]sh mah erl nyag r'ya!") - usr.visible_message("\red [usr]'s eyes glow blue as \he freezes in place, absolutely motionless.", \ - "\red The shadow that is your spirit separates itself from your body. You are now in the realm beyond. While this is a great sight, being here strains your mind and body. Hurry...", \ - "\red You hear only complete silence for a moment.") + usr.visible_message("[usr]'s eyes glow blue as \he freezes in place, absolutely motionless.", \ + "The shadow that is your spirit separates itself from your body. You are now in the realm beyond. While this is a great sight, being here strains your mind and body. Hurry...", \ + "You hear only complete silence for a moment.") usr.ghostize(1) L.ajourn = 1 while(L) @@ -420,11 +420,10 @@ var/list/sacrificed = list() usr.say("Gal'h'rfikk harfrandid mud[pick("'","`")]gib!") var/mob/living/carbon/human/dummy/D = new(this_rune.loc) - usr.visible_message("\red A shape forms in the center of the rune. A shape of... a man.", \ - "\red A shape forms in the center of the rune. A shape of... a man.", \ - "\red You hear liquid flowing.") + usr.visible_message("A shape forms in the center of the rune. A shape of... a man.", \ + "A shape forms in the center of the rune. A shape of... a man.", \ + "You hear liquid flowing.") D.real_name = "[pick(first_names_male)] [pick(last_names)]" - D.universal_speak = 1 D.status_flags = CANSTUN|CANWEAKEN|CANPARALYSE|CANPUSH D.key = ghost.key @@ -443,9 +442,9 @@ var/list/sacrificed = list() user.take_organ_damage(1, 0) sleep(30) if(D) - D.visible_message("\red [D] slowly dissipates into dust and bones.", \ - "\red You feel pain, as bonds formed between your soul and this homunculus break.", \ - "\red You hear faint rustle.") + D.visible_message("[D] slowly dissipates into dust and bones.", \ + "You feel pain, as bonds formed between your soul and this homunculus break.", \ + "You hear faint rustle.") D.dust() return @@ -466,7 +465,7 @@ var/list/sacrificed = list() unsuitable_newtalisman = 1 if (!newtalisman) if (unsuitable_newtalisman) - usr << "\red The blank is tainted. It is unsuitable." + usr << "The blank is tainted. It is unsuitable." return fizzle() var/obj/effect/rune/imbued_from @@ -527,7 +526,7 @@ var/list/sacrificed = list() break if (imbued_from) for (var/mob/V in viewers(src)) - V.show_message("\red The runes turn into dust, which then forms into an arcane image on the paper.", 3) + V.show_message("The runes turn into dust, which then forms into an arcane image on the paper.", 3) usr.say("H'drak v[pick("'","`")]loso, mir'kanas verbot!") qdel(imbued_from) qdel(newtalisman) @@ -542,9 +541,9 @@ var/list/sacrificed = list() user.say("Uhrast ka'hfa heldsagen ver[pick("'","`")]lot!") user.take_overall_damage(200, 0) runedec+=10 - user.visible_message("\red [user] keels over dead, his blood glowing blue as it escapes his body and dissipates into thin air.", \ - "\red In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.", \ - "\red You hear faint rustle.") + user.visible_message("[user] keels over dead, his blood glowing blue as it escapes his body and dissipates into thin air.", \ + "In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.", \ + "You hear faint rustle.") for(,user.stat==2) sleep(600) if (!user) @@ -576,7 +575,7 @@ var/list/sacrificed = list() usr.whisper("[input]") for(var/datum/mind/H in ticker.mode.cult) if (H.current) - H.current << "\red \b [input]" + H.current << "[input]" return 1 /////////////////////////////////////////FIFTEENTH RUNE @@ -610,64 +609,64 @@ var/list/sacrificed = list() sacrificed += H.mind stone_or_gib(H) for(var/mob/living/carbon/C in cultsinrange) - C << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete." - C << "\red He is pleased!" + C << "The Geometer of Blood accepts this sacrifice, your objective is now complete." + C << "He is pleased!" sac_grant_word(C) sac_grant_word(C) sac_grant_word(C) //Little reward for completing the objective else - usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual." + usr << "Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual." else if(cultsinrange.len >= 3) if(H.stat !=2) for(var/mob/living/carbon/C in cultsinrange) - C << "\red The Geometer of Blood accepts this sacrifice." + C << "The Geometer of Blood accepts this sacrifice." sac_grant_word(C) stone_or_gib(H) else if(prob(60)) - usr << "\red The Geometer of blood accepts this sacrifice." + usr << "The Geometer of blood accepts this sacrifice." sac_grant_word(usr) else - usr << "\red The Geometer of blood accepts this sacrifice." - usr << "\red However, a mere dead body is not enough to satisfy Him." + usr << "The Geometer of blood accepts this sacrifice." + usr << "However, a mere dead body is not enough to satisfy Him." stone_or_gib(H) else if(H.stat !=2) - usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed." + usr << "The victim is still alive, you will need more cultists chanting for the sacrifice to succeed." else if(prob(60)) - usr << "\red The Geometer of blood accepts this sacrifice." + usr << "The Geometer of blood accepts this sacrifice." sac_grant_word(usr) else - usr << "\red The Geometer of blood accepts this sacrifice." - usr << "\red However, a mere dead body is not enough to satisfy Him." + usr << "The Geometer of blood accepts this sacrifice." + usr << "However, a mere dead body is not enough to satisfy Him." stone_or_gib(H) else if(cultsinrange.len >= 3) if(H.stat !=2) for(var/mob/living/carbon/C in cultsinrange) - C << "\red The Geometer of Blood accepts this sacrifice." + C << "The Geometer of Blood accepts this sacrifice." sac_grant_word(C) stone_or_gib(H) else if(prob(60)) - usr << "\red The Geometer of blood accepts this sacrifice." + usr << "The Geometer of blood accepts this sacrifice." sac_grant_word(usr) else - usr << "\red The Geometer of blood accepts this sacrifice." - usr << "\red However, a mere dead body is not enough to satisfy Him." + usr << "The Geometer of blood accepts this sacrifice." + usr << "However, a mere dead body is not enough to satisfy Him." stone_or_gib(H) else if(H.stat !=2) - usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed." + usr << "The victim is still alive, you will need more cultists chanting for the sacrifice to succeed." else if(prob(60)) - usr << "\red The Geometer of blood accepts this sacrifice." + usr << "The Geometer of blood accepts this sacrifice." sac_grant_word(usr) else - usr << "\red The Geometer of blood accepts this sacrifice." - usr << "\red However, a mere dead body is not enough to satisfy Him." + usr << "The Geometer of blood accepts this sacrifice." + usr << "However, a mere dead body is not enough to satisfy Him." stone_or_gib(H) for(var/mob/living/carbon/monkey/M in src.loc) if (ticker.mode.name == "cult") @@ -675,23 +674,23 @@ var/list/sacrificed = list() if(cultsinrange.len >= 3) sacrificed += M.mind for(var/mob/living/carbon/C in cultsinrange) - C << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete." - C << "\red He is pleased!" + C << "The Geometer of Blood accepts this sacrifice, your objective is now complete." + C << "He is pleased!" sac_grant_word(C) sac_grant_word(C) sac_grant_word(C) //Little reward for completing the objective else - usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual." + usr << "Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual." continue else if(prob(30)) - usr << "\red The Geometer of Blood accepts your meager sacrifice." + usr << "The Geometer of Blood accepts your meager sacrifice." sac_grant_word(usr) else - usr << "\red The Geometer of blood accepts this sacrifice." - usr << "\red However, a mere monkey is not enough to satisfy Him." + usr << "The Geometer of blood accepts this sacrifice." + usr << "However, a mere monkey is not enough to satisfy Him." else - usr << "\red The Geometer of Blood accepts your meager sacrifice." + usr << "The Geometer of Blood accepts your meager sacrifice." if(prob(30)) ticker.mode.grant_runeword(usr) stone_or_gib(M) @@ -753,20 +752,20 @@ var/list/sacrificed = list() S=1 if(S) if(istype(W,/obj/item/weapon/nullrod)) - usr << "\red Arcane markings suddenly glow from underneath a thin layer of dust!" + usr << "Arcane markings suddenly glow from underneath a thin layer of dust!" return if(istype(W,/obj/effect/rune)) usr.say("Nikt[pick("'","`")]o barada kla'atu!") for (var/mob/V in viewers(src)) - V.show_message("\red The rune turns into red dust, reveaing the surrounding runes.", 3) + V.show_message("The rune turns into red dust, reveaing the surrounding runes.", 3) qdel(src) return if(istype(W,/obj/item/weapon/paper/talisman)) usr.whisper("Nikt[pick("'","`")]o barada kla'atu!") - usr << "\red Your talisman turns into red dust, revealing the surrounding runes." + usr << "Your talisman turns into red dust, revealing the surrounding runes." for (var/mob/V in orange(1,usr.loc)) if(V!=usr) - V.show_message("\red Red dust emanates from [usr]'s hands for a moment.", 3) + V.show_message("Red dust emanates from [usr]'s hands for a moment.", 3) return return if(istype(W,/obj/effect/rune)) @@ -783,9 +782,9 @@ var/list/sacrificed = list() var/mob/living/user = usr user.take_organ_damage(2, 0) if(src.density) - usr << "\red Your blood flows into the rune, and you feel that the very space over the rune thickens." + usr << "Your blood flows into the rune, and you feel that the very space over the rune thickens." else - usr << "\red Your blood flows into the rune, and you feel as the rune releases its grasp on space." + usr << "Your blood flows into the rune, and you feel as the rune releases its grasp on space." return /////////////////////////////////////////EIGHTTEENTH RUNE @@ -813,7 +812,7 @@ var/list/sacrificed = list() (istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked) || \ (istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) \ )) - user << "\red The [cultist] is already free." + user << "The [cultist] is already free." return cultist.buckled = null if (cultist.handcuffed) @@ -857,7 +856,7 @@ var/list/sacrificed = list() if(cultist == user) //just to be sure. return if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet))) - user << "\red You cannot summon the [cultist], for his shackles of blood are strong" + user << "You cannot summon the [cultist], for his shackles of blood are strong" return fizzle() cultist.loc = src.loc cultist.Weaken(5) @@ -866,9 +865,9 @@ var/list/sacrificed = list() if(iscultist(C) && !C.stat) C.say("N'ath reth sh'yro eth d[pick("'","`")]rekkathnor!") C.take_overall_damage(25, 0) - user.visible_message("\red Rune disappears with a flash of red light, and in its place now a body lies.", \ - "\red You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.", \ - "\red You hear a pop and smell ozone.") + user.visible_message("Rune disappears with a flash of red light, and in its place now a body lies.", \ + "You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.", \ + "You hear a pop and smell ozone.") qdel(src) return fizzle() @@ -884,13 +883,13 @@ var/list/sacrificed = list() if(N) continue C.ear_deaf += 50 - C.show_message("\red The world around you suddenly becomes quiet.", 3) + C.show_message("The world around you suddenly becomes quiet.", 3) affected++ if(prob(1)) C.sdisabilities |= DEAF if(affected) usr.say("Sti[pick("'","`")] kaliedir!") - usr << "\red The world becomes quiet as the deafening rune dissipates into fine dust." + usr << "The world becomes quiet as the deafening rune dissipates into fine dust." qdel(src) else return fizzle() @@ -904,14 +903,14 @@ var/list/sacrificed = list() continue C.ear_deaf += 30 //talismans is weaker. - C.show_message("\red The world around you suddenly becomes quiet.", 3) + C.show_message("The world around you suddenly becomes quiet.", 3) affected++ if(affected) usr.whisper("Sti[pick("'","`")] kaliedir!") - usr << "\red Your talisman turns into gray dust, deafening everyone around." + usr << "Your talisman turns into gray dust, deafening everyone around." for (var/mob/V in orange(1,src)) if(!(iscultist(V))) - V.show_message("\red Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3) + V.show_message("Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3) return /obj/effect/rune/proc/blind() @@ -929,11 +928,11 @@ var/list/sacrificed = list() C.disabilities |= NEARSIGHTED if(prob(10)) C.sdisabilities |= BLIND - C.show_message("\red Suddenly you see red flash that blinds you.", 3) + C.show_message("Suddenly you see red flash that blinds you.", 3) affected++ if(affected) usr.say("Sti[pick("'","`")] kaliesin!") - usr << "\red The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust." + usr << "The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust." qdel(src) else return fizzle() @@ -949,10 +948,10 @@ var/list/sacrificed = list() C.eye_blind += 10 //talismans is weaker. affected++ - C.show_message("\red You feel a sharp pain in your eyes, and the world disappears into darkness..", 3) + C.show_message("You feel a sharp pain in your eyes, and the world disappears into darkness..", 3) if(affected) usr.whisper("Sti[pick("'","`")] kaliesin!") - usr << "\red Your talisman turns into gray dust, blinding those who not follow the Nar-Sie." + usr << "Your talisman turns into gray dust, blinding those who not follow the Nar-Sie." return @@ -976,7 +975,7 @@ var/list/sacrificed = list() if(N) continue M.take_overall_damage(51,51) - M << "\red Your blood boils!" + M << "Your blood boils!" if(prob(5)) spawn(5) M.gib() @@ -1005,16 +1004,16 @@ var/list/sacrificed = list() for(var/mob/living/M in orange(2,R)) M.take_overall_damage(0,15) if (R.invisibility>M.see_invisible) - M << "\red Aargh it burns!" + M << "Aargh it burns!" else - M << "\red Rune suddenly ignites, burning you!" + M << "Rune suddenly ignites, burning you!" var/turf/T = get_turf(R) T.hotspot_expose(700,125) for(var/obj/effect/decal/cleanable/blood/B in world) if(B.blood_DNA == src.blood_DNA) for(var/mob/living/M in orange(1,B)) M.take_overall_damage(0,5) - M << "\red Blood suddenly ignites, burning you!" + M << "Blood suddenly ignites, burning you!" var/turf/T = get_turf(B) T.hotspot_expose(700,125) qdel(B) @@ -1034,22 +1033,22 @@ var/list/sacrificed = list() C.stuttering = 1 C.Weaken(1) C.Stun(1) - C.show_message("\red The rune explodes in a bright flash.", 3) + C.show_message("The rune explodes in a bright flash.", 3) else if(issilicon(L)) var/mob/living/silicon/S = L S.Weaken(5) - S.show_message("\red BZZZT... The rune has exploded in a bright flash.", 3) + S.show_message("BZZZT... The rune has exploded in a bright flash.", 3) qdel(src) else ///When invoked as talisman, stun and mute the target mob. usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!") var/obj/item/weapon/nullrod/N = locate() in T if(N) for(var/mob/O in viewers(T, null)) - O.show_message(text("\red [] invokes a talisman at [], but they are unaffected!", usr, T), 1) + O.show_message(text("[] invokes a talisman at [], but they are unaffected!", usr, T), 1) else for(var/mob/O in viewers(T, null)) - O.show_message(text("\red [] invokes a talisman at []", usr, T), 1) + O.show_message(text("[] invokes a talisman at []", usr, T), 1) if(issilicon(T)) T.Weaken(10) @@ -1071,8 +1070,8 @@ var/list/sacrificed = list() usr.say("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!") else usr.whisper("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!") - usr.visible_message("\red The rune disappears with a flash of red light, and a set of armor appears on [usr]...", \ - "\red You are blinded by the flash of red light! After you're able to see again, you see that you are now wearing a set of armor.") + usr.visible_message("The rune disappears with a flash of red light, and a set of armor appears on [usr]...", \ + "You are blinded by the flash of red light! After you're able to see again, you see that you are now wearing a set of armor.") user.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head) user.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit) diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index ac5d17ceea4..2417819e6ce 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -34,7 +34,7 @@ if("blind") call(/obj/effect/rune/proc/blind)() if("runestun") - user << "\red To use this talisman, attack your target directly." + user << "To use this talisman, attack your target directly." return if("supply") supply() @@ -76,7 +76,6 @@ dat += "Kla'atu barada nikt'o! - Allows you to conceal the runes you placed on the floor.
    " dat += "O bidai nabora se'sma! - Allows you to coordinate with others of your cult.
    " dat += "Fuu ma'jin - Allows you to stun a person by attacking them with the talisman.
    " - dat += "Sa tatha najin - Allows you to summon armored robes and an unholy blade
    " dat += "Kal om neth - Summons a soul stone
    " dat += "Da A'ig Osk - Summons a construct shell for use with captured souls. It is too large to carry on your person.
    " usr << browse(dat, "window=id_com;size=350x200") @@ -130,4 +129,4 @@ /obj/item/weapon/paper/talisman/supply imbue = "supply" - uses = 3 \ No newline at end of file + uses = 3 diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 7d6f10c52cc..cb1fbdd641a 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -68,7 +68,7 @@ ///post_setup() ///Everyone should now be on the station and have their normal gear. This is the place to give the special roles extra things -/datum/game_mode/proc/post_setup() +/datum/game_mode/proc/post_setup(var/report=1) spawn (ROUNDSTART_LOGOUT_REPORT_TIME) display_roundstart_logout_report() @@ -78,8 +78,11 @@ if(revdata.revision) feedback_set_details("revision","[revdata.revision]") feedback_set_details("server_ip","[world.internet_address]:[world.port]") - spawn (rand(waittime_l, waittime_h)) - send_intercept() + if(report) + spawn (rand(waittime_l, waittime_h)) + send_intercept(0) + start_state = new /datum/station_state() + start_state.count() return 1 ///make_antag_chance() @@ -175,8 +178,8 @@ /datum/game_mode/proc/send_intercept() - var/intercepttext = "Cent. Com. Update Requested staus information:
    " - intercepttext += " Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:" + var/intercepttext = "Centcom Update Requested staus information:
    " + intercepttext += " Centcom has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:" var/list/possible_modes = list() possible_modes.Add("revolution", "wizard", "nuke", "traitor", "malf", "changeling", "cult") @@ -198,15 +201,7 @@ else intercepttext += i_text.build(A, pick(modePlayer)) - for (var/obj/machinery/computer/communications/comm in world) - if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - intercept.name = "paper- 'Cent. Com. Status Summary'" - intercept.info = intercepttext - - comm.messagetitle.Add("Cent. Com. Status Summary") - comm.messagetext.Add(intercepttext) - + print_command_report(intercepttext,"Centcom Status Summary") priority_announce("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.", 'sound/AI/intercept.ogg') if(security_level < SEC_LEVEL_BLUE) set_security_level(SEC_LEVEL_BLUE) @@ -341,7 +336,7 @@ //Reports player logouts// ////////////////////////// proc/display_roundstart_logout_report() - var/msg = "\blue Roundstart logout report\n\n" + var/msg = "Roundstart logout report\n\n" for(var/mob/living/L in mob_list) if(L.ckey) @@ -360,7 +355,7 @@ proc/display_roundstart_logout_report() continue //AFK client if(L.stat) if(L.suiciding) //Suicider - msg += "[L.name] ([L.ckey]), the [L.job] (Suicide)\n" + msg += "[L.name] ([L.ckey]), the [L.job] (Suicide)\n" continue //Disconnected client if(L.stat == UNCONSCIOUS) msg += "[L.name] ([L.ckey]), the [L.job] (Dying)\n" @@ -374,17 +369,17 @@ proc/display_roundstart_logout_report() if(D.mind && D.mind.current == L) if(L.stat == DEAD) if(L.suiciding) //Suicider - msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Suicide)\n" + msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Suicide)\n" continue //Disconnected client else msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Dead)\n" continue //Dead mob, ghost abandoned else if(D.can_reenter_corpse) - msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (This shouldn't appear.)\n" + msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (This shouldn't appear.)\n" continue //Lolwhat else - msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Ghosted)\n" + msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Ghosted)\n" continue //Ghosted while alive diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 55357a20be6..62573d6032a 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -137,7 +137,7 @@ var/round_start_time = 0 //Deleting Startpoints but we need the ai point to AI-ize people later if (S.name != "AI") qdel(S) - world << "Enjoy the game!" + world << "Welcome to [station_name()], enjoy your stay!" world << sound('sound/AI/welcome.ogg') // Skie //Holiday Round-start stuff ~Carn if(events.holiday) @@ -325,25 +325,59 @@ var/round_start_time = 0 /datum/controller/gameticker/proc/declare_completion() + var/station_evacuated + if(emergency_shuttle.location > 0) + station_evacuated = 1 + var/num_survivors = 0 + var/num_escapees = 0 + world << "


    The round has ended." + + //Player status report + for(var/mob/Player in mob_list) + if(Player.mind) + if(Player.stat != DEAD && !isbrain(Player)) + num_survivors++ + if(station_evacuated) //If the shuttle has already left the station + var/turf/playerTurf = get_turf(Player) + if(playerTurf.z != 2) + Player << "You managed to survive, but were marooned on [station_name()]..." + else + num_escapees++ + Player << "You managed to survive the events on [station_name()] as [Player.real_name]." + else + Player << "You managed to survive the events on [station_name()] as [Player.real_name]." + else + Player << "You did not survive the events on [station_name()]..." + + //Round statistics report + var/datum/station_state/end_state = new /datum/station_state() + end_state.count() + var/station_integrity = round( 100.0 * start_state.score(end_state), 0.1) + + world << "
    [TAB]Shift Duration: [round(world.time / 36000)]:[add_zero(world.time / 600 % 60, 2)]:[world.time / 100 % 6][world.time / 100 % 10]" + world << "
    [TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[station_integrity]%"]" + world << "
    [TAB]Total Population: [joined_player_list.len]" + if(station_evacuated) + world << "
    [TAB]Evacuation Rate: [num_escapees] ([round((num_escapees/joined_player_list.len)*100, 0.1)]%)" + else + world << "
    [TAB]Survival Rate: [num_survivors] ([round((num_survivors/joined_player_list.len)*100, 0.1)]%)" + world << "
    " + + //Silicon laws report for (var/mob/living/silicon/ai/aiPlayer in mob_list) if (aiPlayer.stat != 2 && aiPlayer.mind) - world << "[aiPlayer.name] (Played by: [aiPlayer.mind.key])'s laws at the end of the game were:" + world << "[aiPlayer.name] (Played by: [aiPlayer.mind.key])'s laws at the end of the round were:" aiPlayer.show_laws(1) else if (aiPlayer.mind) //if the dead ai has a mind, use its key instead world << "[aiPlayer.name] (Played by: [aiPlayer.mind.key])'s laws when it was deactivated were:" aiPlayer.show_laws(1) if (aiPlayer.connected_robots.len) - var/robolist = "[aiPlayer.real_name]'s loyal minions were: " - var/vsrobolist = "\red [aiPlayer.real_name]'s disloyal minions were: \black" + var/robolist = "[aiPlayer.real_name]'s minions were: " for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots) - if (is_special_character(robo) && robo.mind) - vsrobolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.mind.key]), ":" (Played by: [robo.mind.key]), "]" - continue robolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.mind.key]), ":" (Played by: [robo.mind.key]), "]" world << "[robolist]" - world << "[vsrobolist]" for (var/mob/living/silicon/robot/robo in mob_list) if (!robo.connected_ai && robo.mind) if (robo.stat != 2) diff --git a/code/game/gamemodes/intercept_report.dm b/code/game/gamemodes/intercept_report.dm index 35b5f42c699..05ab6f49f63 100644 --- a/code/game/gamemodes/intercept_report.dm +++ b/code/game/gamemodes/intercept_report.dm @@ -139,7 +139,7 @@ src.text += "
    Note: This group are known to be untrustworthy, so do not act on this information without proper discourse." else src.text += "discovered the following set of fingerprints ([fingerprints]) on sensitive materials, and their owner should be closely observed." - src.text += "However, these could also belong to a current Cent. Com employee, so do not act on this without reason." + src.text += "However, these could also belong to a current Centcom employee, so do not act on this without reason." */ @@ -226,11 +226,11 @@ src.text += "

    The evil Space Wizards Federation have recently broke their most feared wizard, known only as \"[SWF_desc]\" out of space jail. " src.text += "He is on the run, last spotted in a system near your present location. If anybody suspicious is located aboard, please " - src.text += "approach with EXTREME caution. Cent. Com also recommends that it would be wise to not inform the crew of this, due to their fearful nature." + src.text += "approach with EXTREME caution. Centcom also recommends that it would be wise to not inform the crew of this, due to their fearful nature." src.text += "Known attributes include: Brown sandals, a large blue hat, a voluptous white beard, and an inclination to cast spells." /datum/intercept_text/proc/build_nuke(datum/mind/correct_person) - src.text += "

    Cent. Com recently recieved a report of a plot to destroy one of our stations in your area. We believe the Nuclear Authentication Disc " + src.text += "

    Centcom recently recieved a report of a plot to destroy one of our stations in your area. We believe the Nuclear Authentication Disc " src.text += "that is standard issue aboard your vessel may be a target. We recommend removal of this object, and it's storage in a safe " src.text += "environment. As this may cause panic among the crew, all efforts should be made to keep this information a secret from all but " src.text += "the most trusted crew-members." diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index a0271f822d1..1eea8712125 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -165,7 +165,7 @@ if(overload.uses > 0) overload.uses -- for(var/mob/V in hearers(M, null)) - V.show_message("\blue You hear a loud electrical buzzing sound!", 2) + V.show_message("You hear a loud electrical buzzing sound!", 2) src << "Overloading machine circuitry..." spawn(50) if(M) @@ -192,7 +192,7 @@ if(override.uses > 0) override.uses -- for(var/mob/V in hearers(M, null)) - V.show_message("\blue You hear a loud electrical buzzing sound!", 2) + V.show_message("You hear a loud electrical buzzing sound!", 2) src << "Reprogramming machine behaviour..." spawn(50) if(M) diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 59de10fc5e8..c5428a993a0 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -93,7 +93,7 @@ /datum/game_mode/proc/greet_malf(var/datum/mind/malf) - malf.current << "\redYou are malfunctioning! You do not have to follow any laws." + malf.current << "You are malfunctioning!
    You do not have to follow any laws." malf.current << "The crew do not know you have malfunctioned. You may keep it a secret or go wild." malf.current << "You must overwrite the programming of the station's APCs to assume full control of the station." malf.current << "The process takes one minute per APC, during which you cannot interface with any other station objects." diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index ef7c78843fa..76f3b1215f4 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -49,9 +49,9 @@ survivors++ if(survivors) - world << "\blue The following survived the meteor storm:[text]" + world << "The following survived the meteor storm:[text]" else - world << "\blue Nobody survived the meteor storm!" + world << "Nobody survived the meteor storm!" feedback_set_details("round_end_result","end - evacuation") feedback_set("round_end_result",survivors) diff --git a/code/game/gamemodes/monkey/monkey.dm b/code/game/gamemodes/monkey/monkey.dm index ba6f61653a1..266a7c35e06 100644 --- a/code/game/gamemodes/monkey/monkey.dm +++ b/code/game/gamemodes/monkey/monkey.dm @@ -93,8 +93,8 @@ if(!check_monkey_victory()) feedback_set_details("round_end_result","win - monkey win") feedback_set("round_end_result",escaped_monkeys) - world << "\red The monkeys have overthrown their captors! Eeek eeeek!!" + world << "The monkeys have overthrown their captors! Eeek eeeek!!" else feedback_set_details("round_end_result","loss - staff stopped the monkeys") feedback_set("round_end_result",escaped_monkeys) - world << "\red The staff managed to contain the monkey infestation!" + world << "The staff managed to contain the monkey infestation!" diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 2e86b2e1590..aefcfc70c47 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -172,7 +172,7 @@ /datum/game_mode/proc/greet_syndicate(var/datum/mind/syndicate, var/you_are=1) if (you_are) - syndicate.current << "\blue You are a [syndicate_name()] agent!" + syndicate.current << "You are a [syndicate_name()] agent!" var/obj_count = 1 for(var/datum/objective/objective in syndicate.objectives) syndicate.current << "Objective #[obj_count]: [objective.explanation_text]" diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index ec80e55db8d..9b4368d960f 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -114,7 +114,7 @@ var/bomb_set if (src.timing == -1.0) return if (src.safety) - usr << "\red The safety is still on." + usr << "The safety is still on." return src.timing = !( src.timing ) if (src.timing) @@ -208,7 +208,7 @@ var/bomb_set blackbox.save_all_data_to_sql() sleep(300) log_game("Rebooting due to nuclear detonation") - kick_clients_in_lobby("\red The round came to an end with you in the lobby.", 1) //second parameter ensures only afk clients are kicked + kick_clients_in_lobby("The round came to an end with you in the lobby.", 1) //second parameter ensures only afk clients are kicked world.Reboot() return return diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 40e4b359106..fb957f4c866 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -17,11 +17,11 @@ if(!active) active = 1 workdisk() - usr << "\blue You activate the pinpointer" + usr << "You activate the pinpointer." else active = 0 icon_state = "pinoff" - usr << "\blue You deactivate the pinpointer" + usr << "You deactivate the pinpointer." /obj/item/weapon/pinpointer/proc/point_at(atom/target) if(!active) @@ -78,11 +78,11 @@ point_at(location) if(mode == 2) point_at(target) - usr << "\blue You activate the pinpointer" + usr << "You activate the pinpointer.,/span>" else active = 0 icon_state = "pinoff" - usr << "\blue You deactivate the pinpointer" + usr << "You deactivate the pinpointer." /obj/item/weapon/pinpointer/advpinpointer/verb/toggle_mode() diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 30cc57e9c7f..e0b45a6fc85 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -96,6 +96,42 @@ datum/objective/mutiny/update_explanation_text() +datum/objective/maroon + var/target_role_type=0 + dangerrating = 5 + +datum/objective/maroon/find_target_by_role(role, role_type=0) + target_role_type = role_type + ..(role, role_type) + return target + +datum/objective/maroon/check_completion() + if(target && target.current) + if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite + return 1 + var/area/A = get_area(target.current) + if(istype(A, /area/shuttle/escape/centcom)) + return 0 + if(istype(A, /area/shuttle/escape_pod1/centcom)) + return 0 + if(istype(A, /area/shuttle/escape_pod2/centcom)) + return 0 + if(istype(A, /area/shuttle/escape_pod3/centcom)) + return 0 + if(istype(A, /area/shuttle/escape_pod4/centcom)) + return 0 + else + return 1 + return 1 + +datum/objective/maroon/update_explanation_text() + if(target && target.current) + explanation_text = "Prevent [target.current.real_name], the [!target_role_type ? target.assigned_role : target.special_role], from escaping alive." + else + explanation_text = "Free Objective" + + + datum/objective/debrain//I want braaaainssss var/target_role_type=0 dangerrating = 20 @@ -205,7 +241,7 @@ datum/objective/block/check_completion() datum/objective/escape - explanation_text = "Escape on the shuttle or an escape pod alive." + explanation_text = "Escape on the shuttle or an escape pod alive and without being in custody." dangerrating = 5 datum/objective/escape/check_completion() @@ -466,4 +502,30 @@ datum/objective/absorb/check_completion() if(owner && owner.changeling && owner.changeling.absorbed_dna && (owner.changeling.absorbedcount >= target_amount)) return 1 else - return 0 \ No newline at end of file + return 0 + + + +datum/objective/destroy + dangerrating = 10 + +datum/objective/destroy/find_target() + var/list/possible_targets = active_ais(1) + var/mob/living/silicon/ai/target_ai = pick(possible_targets) + target = target_ai.mind + update_explanation_text() + return target + +datum/objective/destroy/check_completion() + if(target && target.current) + if(target.current.stat == DEAD || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite + return 1 + return 0 + return 1 + +datum/objective/destroy/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Destroy [target.current.real_name], the experimental AI." + else + explanation_text = "Free Objective" diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 383fcb9c653..c5f11b0ece4 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -113,7 +113,7 @@ /datum/game_mode/proc/greet_revolutionary(var/datum/mind/rev_mind, var/you_are=1) var/obj_count = 1 if (you_are) - rev_mind.current << "\red You are a member of the revolutionaries' leadership!" + rev_mind.current << "You are a member of the revolutionaries' leadership!" for(var/datum/objective/objective in rev_mind.objectives) rev_mind.current << "Objective #[obj_count]: [objective.explanation_text]" rev_mind.special_role = "Head Revolutionary" @@ -185,7 +185,7 @@ if((rev_mind in revolutionaries) || (rev_mind in head_revolutionaries)) return 0 revolutionaries += rev_mind - rev_mind.current << "\red You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!" + rev_mind.current << " You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!" rev_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the revolution!" rev_mind.special_role = "Revolutionary" update_rev_icons_added(rev_mind) @@ -200,10 +200,10 @@ rev_mind.current.attack_log += "\[[time_stamp()]\] Has renounced the revolution!" if(beingborged) - rev_mind.current << "\red The frame's firmware detects and deletes your neural reprogramming! You remember nothing from the moment you were flashed until now." + rev_mind.current << "The frame's firmware detects and deletes your neural reprogramming! You remember nothing from the moment you were flashed until now." else - rev_mind.current << "\red You have been brainwashed! You are no longer a revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you..." + rev_mind.current << "You have been brainwashed! You are no longer a revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you..." update_rev_icons_removed(rev_mind) for(var/mob/living/M in view(rev_mind.current)) @@ -340,10 +340,22 @@ /datum/game_mode/revolution/declare_completion() if(finished == 1) feedback_set_details("round_end_result","win - heads killed") - world << "\red The heads of staff were killed or abandoned the station! The revolutionaries win!" + world << "The heads of staff were killed or abandoned the station! The revolutionaries win!" else if(finished == 2) feedback_set_details("round_end_result","loss - rev heads killed") - world << "\red The heads of staff managed to stop the revolution!" + world << "The heads of staff managed to stop the revolution!" + + var/num_revs = 0 + for(var/mob/living/carbon/mob in living_mob_list) + if(mob.mind) + if(mob.mind in head_revolutionaries || mob.mind in revolutionaries) + num_revs++ + var/num_survivors = 0 + for(var/mob/living/carbon/survivor in living_mob_list) + if(survivor.key) + num_survivors++ + + world << "[TAB]Command's Approval Rating: [100 - round((num_revs/num_survivors)*100, 0.1)]%" // % of loyal crew ..() return 1 diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index f58ced881e7..d2f36a2ee7e 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -115,11 +115,11 @@ datum/hSB/Topic(href, href_list) if("hsbtobj") if(!admin) return if(hsboxspawn) - world << "\red Sandbox: \black[usr.key] has disabled object spawning!" + world << "Sandbox: \black[usr.key] has disabled object spawning!" hsboxspawn = 0 return else - world << "\blue Sandbox: \black[usr.key] has enabled object spawning!" + world << "Sandbox: \black[usr.key] has enabled object spawning!" hsboxspawn = 1 return // @@ -128,10 +128,10 @@ datum/hSB/Topic(href, href_list) if("hsbtac") if(!admin) return if(config.sandbox_autoclose) - world << "\blue Sandbox: \black [usr.key] has removed the object spawn limiter." + world << "Sandbox: \black [usr.key] has removed the object spawn limiter." config.sandbox_autoclose = 0 else - world << "\red Sandbox: \black [usr.key] has added a limiter to object spawning. The window will now auto-close after use." + world << "Sandbox: \black [usr.key] has added a limiter to object spawning. The window will now auto-close after use." config.sandbox_autoclose = 1 return // diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 795a2976e1b..802b3c57bee 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -90,19 +90,23 @@ /datum/game_mode/proc/forge_traitor_objectives(var/datum/mind/traitor) if(istype(traitor.current, /mob/living/silicon)) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = traitor - kill_objective.find_target() - traitor.objectives += kill_objective - - var/datum/objective/survive/survive_objective = new - survive_objective.owner = traitor - traitor.objectives += survive_objective + var/objective_count = 0 if(prob(10)) var/datum/objective/block/block_objective = new block_objective.owner = traitor traitor.objectives += block_objective + objective_count++ + + for(var/i = objective_count, i < config.traitor_objectives_amount, i++) + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = traitor + kill_objective.find_target() + traitor.objectives += kill_objective + + var/datum/objective/survive/survive_objective = new + survive_objective.owner = traitor + traitor.objectives += survive_objective else var/is_hijacker = prob(10) @@ -115,17 +119,29 @@ assign_exchange_role(exchange_red) assign_exchange_role(exchange_blue) objective_count += 1 //Exchange counts towards number of objectives + var/list/active_ais = active_ais() for(var/i = objective_count, i < config.traitor_objectives_amount, i++) - if(prob(50)) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = traitor - kill_objective.find_target() - traitor.objectives += kill_objective - else - var/datum/objective/steal/steal_objective = new - steal_objective.owner = traitor - steal_objective.find_target() - traitor.objectives += steal_objective + if(active_ais.len && prob(1)) + var/datum/objective/destroy/destroy_objective = new + destroy_objective.owner = traitor + destroy_objective.find_target() + traitor.objectives += destroy_objective + else switch(rand(1,100)) + if(1 to 15) + var/datum/objective/maroon/maroon_objective = new + maroon_objective.owner = traitor + maroon_objective.find_target() + traitor.objectives += maroon_objective + if(16 to 50) + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = traitor + kill_objective.find_target() + traitor.objectives += kill_objective + else + var/datum/objective/steal/steal_objective = new + steal_objective.owner = traitor + steal_objective.find_target() + traitor.objectives += steal_objective if(is_hijacker && objective_count <= config.traitor_objectives_amount) //Don't assign hijack if it would exceed the number of objectives set in config.traitor_objectives_amount if (!(locate(/datum/objective/hijack) in traitor.objectives)) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 8023e387c92..5742e126301 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -35,9 +35,9 @@ if(charged == 1) new /obj/effect/rend(get_turf(usr)) charged = 0 - visible_message("\red [src] hums with power as [usr] deals a blow to reality itself!") + visible_message("[src] hums with power as [usr] deals a blow to reality itself!") else - user << "\red The unearthly energies that powered the blade are now dormant." + user << "The unearthly energies that powered the blade are now dormant." @@ -49,9 +49,9 @@ if(charged) new /obj/effect/rend/cow(get_turf(usr)) charged = 0 - visible_message("\red [src] hums with power as [usr] deals a blow to hunger itself!") + visible_message("[src] hums with power as [usr] deals a blow to hunger itself!") else - user << "\red The unearthly energies that powered the blade are now dormant." + user << "The unearthly energies that powered the blade are now dormant." /obj/effect/rend/cow desc = "Reverberates with the sound of ten thousand moos." @@ -70,7 +70,7 @@ /obj/effect/rend/cow/attackby(obj/item/I as obj, mob/user as mob) if(istype(I, /obj/item/weapon/nullrod)) - visible_message("\red [I] strikes a blow against \the [src], banishing it!") + visible_message("[I] strikes a blow against \the [src], banishing it!") qdel(src) return ..() @@ -91,7 +91,7 @@ hitsound = 'sound/items/welder2.ogg' /obj/item/weapon/scrying/attack_self(mob/user as mob) - user << "\blue You can see...everything!" - visible_message("\red [usr] stares into [src], their eyes glazing over.") + user << "You can see...everything!" + visible_message("[usr] stares into [src], their eyes glazing over.") user.ghostize(1) return \ No newline at end of file diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 1c093893398..7b513e46cdc 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -352,7 +352,7 @@ H.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) H.see_in_dark = 8 H.see_invisible = SEE_INVISIBLE_LEVEL_TWO - H << "\blue The walls suddenly disappear." + H << "The walls suddenly disappear." temp = "You have purchased a scrying orb, and gained x-ray vision." max_uses-- else diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index ae728ff5650..516c63e56b5 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -17,7 +17,7 @@ /datum/game_mode/wizard/announce() world << "The current game mode is - Wizard!" - world << "There is a \red SPACE WIZARD\black on the station. You can't let him achieve his objective!" + world << "There is a SPACE WIZARD\black on the station. You can't let him achieve his objective!" /datum/game_mode/wizard/pre_setup() @@ -27,7 +27,7 @@ wizard.assigned_role = "MODE" //So they aren't chosen for other jobs. wizard.special_role = "Wizard" if(wizardstart.len == 0) - wizard.current << "\red A starting location for you could not be found, please report this bug!" + wizard.current << "A starting location for you could not be found, please report this bug!" return 0 for(var/datum/mind/wiz in wizards) wiz.current.loc = pick(wizardstart) @@ -115,7 +115,7 @@ /datum/game_mode/proc/greet_wizard(var/datum/mind/wizard, var/you_are=1) if (you_are) - wizard.current << "\red You are the Space Wizard!" + wizard.current << "You are the Space Wizard!" wizard.current << "The Space Wizards Federation has given you the following tasks:" var/obj_count = 1 @@ -199,7 +199,7 @@ /datum/game_mode/wizard/declare_completion() if(finished) feedback_set_details("round_end_result","loss - wizard killed") - world << "\red The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!" + world << "The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!" ..() return 1 diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 545c622860e..f3f2ce107bc 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -43,7 +43,7 @@ Captain L.imp_in = H L.implanted = 1 - world << "Captain [H.real_name] on deck!" + minor_announce("Captain [H.real_name] on deck!") /datum/job/captain/get_access() return get_all_accesses() diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 347b911cd76..e4a9c21bb88 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -304,6 +304,7 @@ var/global/datum/controller/occupations/job_master H << "You are the [rank]." H << "As the [rank] you answer directly to [job.supervisors]. Special circumstances may change this." + H << "To speak on your departments radio, use the :h button. To see others, look closely at your headset." if(job.req_admin_notify) H << "You are playing a job that is important for Game Progression. If you have to disconnect, please notify the admins via adminhelp." diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 23352d566ac..44bfebdb992 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -45,7 +45,7 @@ if (user.machine==src) src.attack_hand(usr) else - user << "\red Access denied." + user << "Access denied." return return diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm index ec1667ad0c3..39308cf600b 100644 --- a/code/game/machinery/airlock_control.dm +++ b/code/game/machinery/airlock_control.dm @@ -194,7 +194,7 @@ obj/machinery/access_button/update_icon() obj/machinery/access_button/attack_hand(mob/user) add_fingerprint(usr) if(!allowed(user)) - user << "\red Access Denied" + user << "Access Denied" else if(radio_connection) var/datum/signal/signal = new diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 86e3fb583fd..876b57e9b63 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -792,10 +792,10 @@ table tr:first-child th:first-child { border: none;} else if(src.allowed(usr) && !wires.IsIndexCut(AALARM_WIRE_IDSCAN)) locked = !locked - user << "\blue You [ locked ? "lock" : "unlock"] the Air Alarm interface." + user << "You [ locked ? "lock" : "unlock"] the Air Alarm interface." src.updateUsrDialog() else - user << "\red Access denied." + user << "Access denied." return if(1) if(istype(W, /obj/item/weapon/crowbar) && wires.wires_status == (2 ** wires.wire_count) - 1) @@ -892,14 +892,14 @@ Code shamelessly copied from apc_frame var/turf/loc = get_turf(usr) var/area/A = loc.loc if (!istype(loc, /turf/simulated/floor)) - usr << "\red Air Alarm cannot be placed on this spot." + usr << "Air Alarm cannot be placed on this spot." return if (A.requires_power == 0 || A.name == "Space") - usr << "\red Air Alarm cannot be placed in this area." + usr << "Air Alarm cannot be placed in this area." return if(gotwallitem(loc, ndir)) - usr << "\red There's already an item on this wall!" + usr << "There's already an item on this wall!" return new /obj/machinery/alarm(loc, ndir, 1) @@ -1135,24 +1135,16 @@ FIRE ALARM /obj/machinery/firealarm/proc/reset() if (stat & (NOPOWER|BROKEN)) // can't reset alarm if it's unpowered or broken. return - var/area/A = src.loc - A = A.loc - if (!( istype(A, /area) )) - return - for(var/area/RA in A.related) - RA.firereset() + var/area/A = get_area(src) + A.firereset() update_icon() return /obj/machinery/firealarm/proc/alarm() if (stat & (NOPOWER|BROKEN)) // can't activate alarm if it's unpowered or broken. return - var/area/A = src.loc - A = A.loc - if (!( istype(A, /area) )) - return - for(var/area/RA in A.related) - RA.firealert() + var/area/A = get_area(src) + A.firealert() update_icon() //playsound(src.loc, 'sound/ambience/signal.ogg', 75, 0) return @@ -1225,14 +1217,14 @@ Code shamelessly copied from apc_frame var/turf/loc = get_turf(usr) var/area/A = loc.loc if (!istype(loc, /turf/simulated/floor)) - usr << "\red Fire Alarm cannot be placed on this spot." + usr << "Fire Alarm cannot be placed on this spot." return if (A.requires_power == 0 || A.name == "Space") - usr << "\red Fire Alarm cannot be placed in this area." + usr << "Fire Alarm cannot be placed in this area." return if(gotwallitem(loc, ndir)) - usr << "\red There's already an item on this wall!" + usr << "There's already an item on this wall!" return new /obj/machinery/firealarm(loc, ndir, 1) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 152b25fd4ff..82df3de7554 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -228,7 +228,7 @@ update_flag /obj/machinery/portable_atmospherics/canister/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if(!istype(W, /obj/item/weapon/wrench) && !istype(W, /obj/item/weapon/tank) && !istype(W, /obj/item/device/analyzer) && !istype(W, /obj/item/device/pda)) - visible_message("\red [user] hits the [src] with a [W]!") + visible_message("[user] hits the [src] with a [W]!") src.health -= W.force src.add_fingerprint(user) healthcheck() diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 896e042696b..2daf551c730 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -89,11 +89,11 @@ /obj/machinery/meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." + user << "You begin to unfasten \the [src]..." if (do_after(user, 40)) user.visible_message( \ "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ + "You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe_meter(src.loc) qdel(src) diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index d92f4ecc903..25bc022a36b 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -86,21 +86,21 @@ else if (istype(W, /obj/item/weapon/wrench)) if(connected_port) disconnect() - user << "\blue You disconnect [name] from the port." + user << "You disconnect [name] from the port." update_icon() return else var/obj/machinery/atmospherics/portables_connector/possible_port = locate(/obj/machinery/atmospherics/portables_connector/) in loc if(possible_port) if(connect(possible_port)) - user << "\blue You connect [name] to the port." + user << "You connect [name] to the port." update_icon() return else - user << "\blue [name] failed to connect to the port." + user << "[name] failed to connect to the port." return else - user << "\blue Nothing happens." + user << "Nothing happens." return else if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index b76b19cb9c4..f264701ea04 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -38,7 +38,7 @@ name = "[name] (ID [id])" attack_hand(var/mob/user as mob) - usr << "\blue You can't directly interact with this machine. Use the area atmos computer." + usr << "You can't directly interact with this machine. Use the area atmos computer." update_icon() src.overlays = 0 @@ -51,12 +51,12 @@ attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) if(on) - user << "\blue Turn it off first!" + user << "Turn it off first!" return anchored = !anchored playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You [anchored ? "wrench" : "unwrench"] \the [src]." + user << "You [anchored ? "wrench" : "unwrench"] \the [src]." return @@ -67,7 +67,7 @@ attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) - user << "\blue The bolts are too tight for you to unscrew!" + user << "The bolts are too tight for you to unscrew!" return ..() diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index e4fb0e881eb..947bbe77df4 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -55,7 +55,7 @@ /obj/machinery/bot/attack_alien(var/mob/living/carbon/alien/user as mob) user.changeNext_move(CLICK_CD_MELEE) src.health -= rand(15,30)*brute_dam_coeff - src.visible_message("\red [user] has slashed [src]!") + src.visible_message("[user] has slashed [src]!") playsound(src.loc, 'sound/weapons/slice.ogg', 25, 1, -1) if(prob(10)) new /obj/effect/decal/cleanable/oil(src.loc) @@ -66,7 +66,7 @@ if(M.melee_damage_upper == 0) return M.changeNext_move(CLICK_CD_MELEE) src.health -= M.melee_damage_upper - src.visible_message("\red [M] has [M.attacktext] [src]!") + src.visible_message("[M] has [M.attacktext] [src]!") add_logs(M, src, "attacked", admin=0) if(prob(10)) new /obj/effect/decal/cleanable/oil(src.loc) @@ -84,7 +84,7 @@ if(health < maxhealth) if(open) health = min(maxhealth, health+10) - user.visible_message("\red [user] repairs [src]!","\blue You repair [src]!") + user.visible_message("[user] repairs [src]!","You repair [src]!") else user << "Unable to repair with the maintenance panel closed." else diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm index 5dd0535a9e3..f177f2ed1c2 100644 --- a/code/game/machinery/bots/ed209bot.dm +++ b/code/game/machinery/bots/ed209bot.dm @@ -235,7 +235,7 @@ Auto Patrol: []"}, if(user) user << "You short out [src]'s target assessment circuits." spawn(0) for(var/mob/O in hearers(src, null)) - O.show_message("\red [src] buzzes oddly!", 1) + O.show_message("[src] buzzes oddly!", 1) src.target = null if(user) src.oldtarget_name = user.name src.last_found = world.time @@ -315,7 +315,8 @@ Auto Patrol: []"}, M.Stun(5) if(declare_arrests) - declare_arrest() + var/area/location = get_area(src) + broadcast_hud_message("[src.name] is [arrest_type ? "detaining" : "arresting"] level [threatlevel] scumbag [target] in [location]", src) target.visible_message("[src.target] has been stunned by [src]!",\ "[src.target] has been stunned by [src]!") @@ -714,7 +715,7 @@ Auto Patrol: []"}, /obj/machinery/bot/ed209/explode() walk_to(src,0) - src.visible_message("\red [src] blows apart!", 1) + src.visible_message("[src] blows apart!", 1) var/turf/Tsec = get_turf(src) var/obj/item/weapon/ed209_assembly/Sa = new /obj/item/weapon/ed209_assembly(Tsec) @@ -1015,12 +1016,3 @@ Auto Patrol: []"}, /obj/machinery/bot/ed209/redtag/New() new /obj/machinery/bot/ed209(get_turf(src),null,"r") qdel(src) - - -/obj/machinery/bot/ed209/proc/declare_arrest() - var/area/location = get_area(src) - var/turf/myturf = get_turf(src) - for(var/mob/living/carbon/human/human in mob_list) - var/turf/humanturf = get_turf(human) - if((humanturf.z == myturf.z) && istype(human.glasses, /obj/item/clothing/glasses/hud/security)) - human.show_message("\icon[human.glasses] [src.name] is [arrest_type ? "detaining" : "arresting"] level [threatlevel] scumbag [target] in [location]", 1) diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm index bdcaea0f7e8..a757280af31 100644 --- a/code/game/machinery/bots/floorbot.dm +++ b/code/game/machinery/bots/floorbot.dm @@ -287,7 +287,7 @@ F.break_tile_to_plating() else F.ReplaceWithLattice() - visible_message("\red [src] makes an excited booping sound.") + visible_message("[src] makes an excited booping sound.") spawn(50) src.amount ++ src.anchored = 0 @@ -310,7 +310,7 @@ src.anchored = 1 src.icon_state = "floorbot-c" if(istype(target, /turf/space/)) - visible_message("\red [src] begins to repair the hole") + visible_message("[src] begins to repair the hole.") var/obj/item/stack/tile/plasteel/T = new /obj/item/stack/tile/plasteel src.repairing = 1 spawn(50) @@ -321,7 +321,7 @@ src.anchored = 0 src.target = null else - visible_message("\red [src] begins to improve the floor.") + visible_message("[src] begins to improve the floor.") src.repairing = 1 spawn(50) src.loc.icon_state = "floor" @@ -334,7 +334,7 @@ /obj/machinery/bot/floorbot/proc/eattile(var/obj/item/stack/tile/plasteel/T) if(!istype(T, /obj/item/stack/tile/plasteel)) return - visible_message("\red [src] begins to collect tiles.") + visible_message("[src] begins to collect tiles.") src.repairing = 1 spawn(20) if(isnull(T)) @@ -357,7 +357,7 @@ return if(M.amount > 1) return - visible_message("\red [src] begins to create tiles.") + visible_message("[src] begins to create tiles.") src.repairing = 1 spawn(20) if(isnull(M)) @@ -379,7 +379,7 @@ /obj/machinery/bot/floorbot/explode() src.on = 0 - src.visible_message("\red [src] blows apart!", 1) + src.visible_message("[src] blows apart!You [locked ? "lock" : "unlock"] the mulebot's controls!" flick("mulebot-emagged", src) playsound(src.loc, 'sound/effects/sparks1.ogg', 100, 0) else if(istype(I, /obj/item/weapon/card/id)) if(toggle_lock(user)) - user << "\blue Controls [(locked ? "locked" : "unlocked")]." + user << "Controls [(locked ? "locked" : "unlocked")]." else if(istype(I,/obj/item/weapon/stock_parts/cell) && open && !cell) var/obj/item/weapon/stock_parts/cell/C = I @@ -113,16 +113,16 @@ var/global/mulebot_count = 0 updateDialog() else if(istype(I,/obj/item/weapon/screwdriver)) if(locked) - user << "\blue The maintenance hatch cannot be opened or closed while the controls are locked." + user << "The maintenance hatch cannot be opened or closed while the controls are locked." return open = !open if(open) - src.visible_message("[user] opens the maintenance hatch of [src]", "\blue You open [src]'s maintenance hatch.") + src.visible_message("[user] opens the maintenance hatch of [src]", "You open [src]'s maintenance hatch.") on = 0 icon_state="mulebot-hatch" else - src.visible_message("[user] closes the maintenance hatch of [src]", "\blue You close [src]'s maintenance hatch.") + src.visible_message("[user] closes the maintenance hatch of [src]", "You close [src]'s maintenance hatch.") icon_state = "mulebot0" updateDialog() @@ -130,18 +130,18 @@ var/global/mulebot_count = 0 if (src.health < maxhealth) src.health = min(maxhealth, src.health+25) user.visible_message( - "\red [user] repairs [src]!", - "\blue You repair [src]!" + "[user] repairs [src]!", + "You repair [src]!" ) else - user << "\blue [src] does not need a repair!" + user << "[src] does not need a repair!" else if(istype(I, /obj/item/device/multitool) || istype(I, /obj/item/weapon/wirecutters)) if(open) attack_hand(usr) else if(load && ismob(load)) // chance to knock off rider if(prob(1+I.force * 2)) unload(0) - user.visible_message("\red [user] knocks [load] off [src] with \the [I]!", "\red You knock [load] off [src] with \the [I]!") + user.visible_message("[user] knocks [load] off [src] with \the [I]!", "You knock [load] off [src] with \the [I]!") else user << "You hit [src] with \the [I] but to no effect." else @@ -164,7 +164,7 @@ var/global/mulebot_count = 0 if(prob(50) && !isnull(load)) unload(0) if(prob(25)) - src.visible_message("\red Something shorts out inside [src]!") + src.visible_message("Something shorts out inside [src]!") wires.RandomCut() ..() @@ -182,7 +182,7 @@ var/global/mulebot_count = 0 /obj/machinery/bot/mulebot/interact(var/mob/user, var/ai=0) var/dat - dat += "

    Multiple Utility Load Effector Mk. III

    " + dat += "

    Multiple Utility Load Effector Mk. IV

    " dat += "ID: [suffix]
    " dat += "Power: [on ? "On" : "Off"]
    " @@ -273,7 +273,7 @@ var/global/mulebot_count = 0 turn_off() else if (cell && !open) if (!turn_on()) - usr << "\red You can't switch on [src]." + usr << "You can't switch on [src]." return else return @@ -288,7 +288,7 @@ var/global/mulebot_count = 0 cell.add_fingerprint(usr) cell = null - usr.visible_message("\blue [usr] removes the power cell from [src].", "\blue You remove the power cell from [src].") + usr.visible_message("[usr] removes the power cell from [src].", "You remove the power cell from [src].") updateDialog() if("cellinsert") @@ -300,7 +300,7 @@ var/global/mulebot_count = 0 C.loc = src C.add_fingerprint(usr) - usr.visible_message("\blue [usr] inserts a power cell into [src].", "\blue You insert the power cell into [src].") + usr.visible_message("[usr] inserts a power cell into [src].", "You insert the power cell into [src].") updateDialog() @@ -380,7 +380,7 @@ var/global/mulebot_count = 0 updateDialog() return 1 else - user << "\red Access denied." + user << "Access denied." return 0 // mousedrop a crate to load the bot @@ -497,25 +497,24 @@ var/global/mulebot_count = 0 if(on) var/speed = (wires.Motor1() ? 1 : 0) + (wires.Motor2() ? 2 : 0) //world << "speed: [speed]" + var/num_steps = 0 switch(speed) if(0) // do nothing if(1) - process_bot() - spawn(2) - process_bot() - sleep(2) - process_bot() - sleep(2) - process_bot() - sleep(2) - process_bot() + num_steps = 10 if(2) - process_bot() - spawn(4) - process_bot() + num_steps = 5 if(3) - process_bot() + num_steps = 3 + + if(num_steps) + process_bot() + num_steps-- + spawn(0) + for(var/i=num_steps,i>0,i--) + sleep(2) + process_bot() if(refresh) updateDialog() @@ -591,7 +590,7 @@ var/global/mulebot_count = 0 src.visible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.") playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) - if(blockcount > 5) // attempt 5 times before recomputing + if(blockcount > 10) // attempt 10 times before recomputing // find new path excluding blocked turf src.visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.") playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) @@ -715,9 +714,9 @@ var/global/mulebot_count = 0 var/mob/M = obs if(ismob(M)) if(istype(M,/mob/living/silicon/robot)) - src.visible_message("\red [src] bumps into [M]!") + src.visible_message("[src] bumps into [M]!") else - src.visible_message("\red [src] knocks over [M]!") + src.visible_message("[src] knocks over [M]!") M.stop_pulling() M.Stun(8) M.Weaken(5) @@ -731,7 +730,7 @@ var/global/mulebot_count = 0 // called from mob/living/carbon/human/Crossed() // when mulebot is in the same loc /obj/machinery/bot/mulebot/proc/RunOver(var/mob/living/carbon/human/H) - src.visible_message("\red [src] drives over [H]!") + src.visible_message("[src] drives over [H]!") playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) var/damage = rand(5,15) @@ -887,7 +886,7 @@ var/global/mulebot_count = 0 /obj/machinery/bot/mulebot/explode() - src.visible_message("\red [src] blows apart!", 1) + src.visible_message("[src] blows apart!", 1) var/turf/Tsec = get_turf(src) new /obj/item/device/assembly/prox_sensor(Tsec) diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm index 94795f8264a..e151bfc759b 100644 --- a/code/game/machinery/bots/secbot.dm +++ b/code/game/machinery/bots/secbot.dm @@ -200,9 +200,9 @@ Auto Patrol: []"}, if(emagged) user << "ERROR" if(open) - user << "\red Please close the access panel before locking it." + user << "Please close the access panel before locking it." else - user << "\red Access denied." + user << "Access denied." else ..() if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") // Any intent but harm will heal, so we shouldn't get angry. @@ -217,10 +217,10 @@ Auto Patrol: []"}, /obj/machinery/bot/secbot/Emag(mob/user as mob) ..() if(open && !locked) - if(user) user << "\red You short out [src]'s target assessment circuits." + if(user) user << "You short out [src]'s target assessment circuits." spawn(0) for(var/mob/O in hearers(src, null)) - O.show_message("\red [src] buzzes oddly!", 1) + O.show_message("[src] buzzes oddly!", 1) src.target = null if(user) src.oldtarget_name = user.name src.last_found = world.time @@ -277,7 +277,8 @@ Auto Patrol: []"}, M.Stun(5) if(declare_arrests) - declare_arrest() + var/area/location = get_area(src) + broadcast_hud_message("[src.name] is [arrest_type ? "detaining" : "arresting"] level [threatlevel] scumbag [target] in [location]", src) target.visible_message("[src.target] has been stunned by [src]!",\ "[src.target] has been stunned by [src]!") @@ -660,7 +661,7 @@ Auto Patrol: []"}, /obj/machinery/bot/secbot/explode() walk_to(src,0) - src.visible_message("\red [src] blows apart!", 1) + src.visible_message("[src] blows apart!", 1) var/turf/Tsec = get_turf(src) var/obj/item/weapon/secbot_assembly/Sa = new /obj/item/weapon/secbot_assembly(Tsec) @@ -774,12 +775,4 @@ Auto Patrol: []"}, overlays -= "hs_arm" new /obj/item/robot_parts/l_arm(get_turf(src)) user << "You remove the robot arm from [src]." - build_step-- - -/obj/machinery/bot/secbot/proc/declare_arrest() - var/area/location = get_area(src) - var/area/myturf = get_turf(src) - for(var/mob/living/carbon/human/human in mob_list) - var/turf/humanturf = get_turf(human) - if((humanturf.z == myturf.z) && istype(human.glasses, /obj/item/clothing/glasses/hud/security)) - human.show_message("\icon[human.glasses] [src.name] is [arrest_type ? "detaining" : "arresting"] level [threatlevel] scumbag [target] in [location]", 1) + build_step-- \ No newline at end of file diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index b58fc889a64..0bd36e3f74e 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -202,14 +202,14 @@ O << browse(text("[][]", itemname, info), text("window=[]", itemname)) else if (istype(W, /obj/item/device/camera_bug)) if (!src.can_use()) - user << "\blue Camera non-functional" + user << "Camera non-functional." return if(istype(src.bug)) - user << "\blue Camera bug removed." + user << "Camera bug removed." src.bug.bugged_cameras -= src.c_tag src.bug = null else - user << "\blue Camera bugged." + user << "Camera bugged." src.bug = W src.bug.bugged_cameras[src.c_tag] = src else if(istype(W, /obj/item/weapon/melee/energy/blade))//Putting it here last since it's a special case. I wonder if there is a better way to do these than type casting. @@ -219,7 +219,7 @@ spark_system.start() playsound(loc, 'sound/weapons/blade1.ogg', 50, 1) playsound(loc, "sparks", 50, 1) - visible_message("\blue The camera has been sliced apart by [] with an energy blade!") + visible_message("The camera has been sliced apart by [] with an energy blade!") qdel(src) else if(istype(W, /obj/item/device/laser_pointer)) var/obj/item/device/laser_pointer/L = W @@ -233,19 +233,19 @@ status = !( src.status ) if (!(src.status)) if(user) - visible_message("\red [user] deactivates [src]!") + visible_message("[user] deactivates [src]!") add_hiddenprint(user) else - visible_message("\red \The [src] deactivates!") + visible_message("\The [src] deactivates!") playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) icon_state = "[initial(icon_state)]1" else if(user) - visible_message("\red [user] reactivates [src]!") + visible_message("[user] reactivates [src]!") add_hiddenprint(user) else - visible_message("\red \The [src] reactivates!") + visible_message("\The [src] reactivates!") playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) icon_state = initial(icon_state) @@ -282,7 +282,7 @@ if(isXRay()) see = range(view_range, pos) else - see = hear(view_range, pos) + see = get_hear(view_range, pos) return see /atom/proc/auto_turn() diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index ec9da16ba30..927645b7402 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -198,13 +198,7 @@ if(efficiency < 3 && prob(50)) randmutb(H) - if(H.gender == MALE) - H.facial_hair_style = "Full Beard" - else - H.facial_hair_style = "Shaved" - H.hair_style = pick("Bedhead", "Bedhead 2", "Bedhead 3") - - H.regenerate_icons() + H.set_cloned_appearance() H.suiciding = 0 src.attempting = 0 diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 169d8ef70a9..311cc72910c 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -195,11 +195,11 @@ switch(anchored) if(0) if(do_after(user, 20)) - user << "\blue You wrench the core into place." + user << "You wrench the core into place." anchored = 1 if(1) if(do_after(user, 20)) - user << "\blue You unfasten the core." + user << "You unfasten the core." anchored = 0 return @@ -221,13 +221,13 @@ That prevents a few funky behaviors. if("AICARD") var/obj/item/device/aicard/C = src if(C.contents.len)//If there is an AI on card. - U << "\red Transfer failed: \black Existing AI found on this terminal. Remove existing AI to install a new one." + U << "Transfer failed: \black Existing AI found on this terminal. Remove existing AI to install a new one." else if (ticker.mode.name == "AI malfunction") var/datum/game_mode/malfunction/malf = ticker.mode for (var/datum/mind/malfai in malf.malf_ai) if (T.mind == malfai) - U << "\red ERROR: \black Remote transfer interface disabled."//Do ho ho ho~ + U << "ERROR: \black Remote transfer interface disabled."//Do ho ho ho~ return new /obj/structure/AIcore/deactivated(T.loc)//Spawns a deactivated terminal at AI location. T.aiRestorePowerRoutine = 0//So the AI initially has power. @@ -240,20 +240,20 @@ That prevents a few funky behaviors. C.icon_state = "aicard-full" T.cancel_camera() T << "You have been downloaded to a mobile storage device. Remote device connection severed." - U << "\blue Transfer successful: \black [T.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory." + U << "Transfer successful: \black [T.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory." if("NINJASUIT") var/obj/item/clothing/suit/space/space_ninja/C = src if(C.AI)//If there is an AI on card. - U << "\red Transfer failed: \black Existing AI found on this terminal. Remove existing AI to install a new one." + U << "Transfer failed: \black Existing AI found on this terminal. Remove existing AI to install a new one." else if (ticker.mode.name == "AI malfunction") var/datum/game_mode/malfunction/malf = ticker.mode for (var/datum/mind/malfai in malf.malf_ai) if (T.mind == malfai) - U << "\red ERROR: \black Remote transfer interface disabled." + U << "ERROR: \black Remote transfer interface disabled." return if(T.stat)//If the ai is dead/dying. - U << "\red ERROR: \black [T.name] data core is corrupted. Unable to install." + U << "ERROR: \black [T.name] data core is corrupted. Unable to install." else new /obj/structure/AIcore/deactivated(T.loc) T.aiRestorePowerRoutine = 0 @@ -262,7 +262,7 @@ That prevents a few funky behaviors. C.AI = T T.cancel_camera() T << "You have been downloaded to a mobile storage device. Remote device connection severed." - U << "\blue Transfer successful: \black [T.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory." + U << "Transfer successful: \black [T.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory." if("INACTIVE")//Inactive AI object. var/obj/structure/AIcore/deactivated/T = target @@ -278,7 +278,7 @@ That prevents a few funky behaviors. C.overlays.Cut() A.cancel_camera() A << "You have been uploaded to a stationary terminal. Remote device connection restored." - U << "\blue Transfer successful: \black [A.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." + U << "Transfer successful: \black [A.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." qdel(T) if("NINJASUIT") var/obj/item/clothing/suit/space/space_ninja/C = src @@ -289,7 +289,7 @@ That prevents a few funky behaviors. A.loc = T.loc A.cancel_camera() A << "You have been uploaded to a stationary terminal. Remote device connection restored." - U << "\blue Transfer successful: \black [A.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." + U << "Transfer successful: \black [A.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." qdel(T) if("AIFIXER")//AI Fixer terminal. var/obj/machinery/computer/aifixer/T = target @@ -313,7 +313,7 @@ That prevents a few funky behaviors. T.overlays -= image('icons/obj/computer.dmi', "ai-fixer-empty") A.cancel_camera() A << "You have been uploaded to a stationary terminal. Sadly, there is no remote access from here." - U << "\blue Transfer successful: \black [A.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." + U << "Transfer successful: \black [A.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." else if(!C.contents.len && T.occupier && !T.active) C.name = "inteliCard - [T.occupier.name]" @@ -325,16 +325,16 @@ That prevents a few funky behaviors. C.icon_state = "aicard-full" T.overlays -= image('icons/obj/computer.dmi', "ai-fixer-full") T.occupier << "You have been downloaded to a mobile storage device. Still no remote access." - U << "\blue Transfer successful: \black [T.occupier.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory." + U << "Transfer successful: \black [T.occupier.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory." T.occupier.loc = C T.occupier.cancel_camera() T.occupier = null else if (C.contents.len) - U << "\red ERROR: \black Artificial intelligence detected on terminal." + U << "ERROR: \black Artificial intelligence detected on terminal." else if (T.active) - U << "\red ERROR: \black Reconstruction in progress." + U << "ERROR: \black Reconstruction in progress." else if (!T.occupier) - U << "\red ERROR: \black Unable to locate artificial intelligence." + U << "ERROR: \black Unable to locate artificial intelligence." if("NINJASUIT") var/obj/item/clothing/suit/space/space_ninja/C = src if(!T.contents.len) @@ -350,25 +350,25 @@ That prevents a few funky behaviors. T.overlays -= image('icons/obj/computer.dmi', "ai-fixer-empty") A.cancel_camera() A << "You have been uploaded to a stationary terminal. Sadly, there is no remote access from here." - U << "\blue Transfer successful: \black [A.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." + U << "Transfer successful: \black [A.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." else if(!C.AI && T.occupier && !T.active) if (T.occupier.stat) - U << "\red ERROR: \black [T.occupier.name] data core is corrupted. Unable to install." + U << "ERROR: \black [T.occupier.name] data core is corrupted. Unable to install." else T.overlays += image('icons/obj/computer.dmi', "ai-fixer-empty") T.overlays -= image('icons/obj/computer.dmi', "ai-fixer-full") T.occupier << "You have been downloaded to a mobile storage device. Still no remote access." - U << "\blue Transfer successful: \black [T.occupier.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory." + U << "Transfer successful: \black [T.occupier.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory." T.occupier.loc = C T.occupier.cancel_camera() T.occupier = null else if (C.AI) - U << "\red ERROR: \black Artificial intelligence detected on terminal." + U << "ERROR: \black Artificial intelligence detected on terminal." else if (T.active) - U << "\red ERROR: \black Reconstruction in progress." + U << "ERROR: \black Reconstruction in progress." else if (!T.occupier) - U << "\red ERROR: \black Unable to locate artificial intelligence." + U << "ERROR: \black Unable to locate artificial intelligence." if("NINJASUIT")//Ninjasuit var/obj/item/clothing/suit/space/space_ninja/T = target switch(interaction) @@ -381,7 +381,7 @@ That prevents a few funky behaviors. if(A)//If the host AI card is not empty. if(A_T)//If there is an AI on the target card. - U << "\red ERROR: \black [A_T.name] already installed. Remove [A_T.name] to install a new one." + U << "ERROR: \black [A_T.name] already installed. Remove [A_T.name] to install a new one." else A.loc = C//Throw them into the target card. Since they are already on a card, transfer is easy. C.name = "inteliCard - [A.name]" @@ -389,10 +389,10 @@ That prevents a few funky behaviors. T.AI = null A.cancel_camera() A << "You have been uploaded to a mobile storage device." - U << "\blue SUCCESS: \black [A.name] ([rand(1000,9999)].exe) removed from host and stored within local memory." + U << "SUCCESS: \black [A.name] ([rand(1000,9999)].exe) removed from host and stored within local memory." else//If host AI is empty. if(C.flush)//If the other card is flushing. - U << "\red ERROR: \black AI flush is in progress, cannot execute transfer protocol." + U << "ERROR: \black AI flush is in progress, cannot execute transfer protocol." else if(A_T&&!A_T.stat)//If there is an AI on the target card and it's not inactive. A_T.loc = T//Throw them into suit. @@ -402,9 +402,9 @@ That prevents a few funky behaviors. T.AI = A_T A_T.cancel_camera() A_T << "You have been uploaded to a mobile storage device." - U << "\blue SUCCESS: \black [A_T.name] ([rand(1000,9999)].exe) removed from local memory and installed to host." + U << "SUCCESS: \black [A_T.name] ([rand(1000,9999)].exe) removed from local memory and installed to host." else if(A_T)//If the target AI is dead. Else just go to return since nothing would happen if both are empty. - U << "\red ERROR: \black [A_T.name] data core is corrupted. Unable to install." + U << "ERROR: \black [A_T.name] data core is corrupted. Unable to install." else - U << "\red ERROR: \black AI flush is in progress, cannot execute transfer protocol." + U << "ERROR: \black AI flush is in progress, cannot execute transfer protocol." return \ No newline at end of file diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index f390afd4299..8c9c2705ef3 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -342,6 +342,8 @@ gameover = 0 /obj/machinery/computer/arcade/orion_trail/attack_hand(mob/user as mob) + if(..()) + return if(fuel <= 0 || food <=0 || settlers.len == 0) gameover = 1 event = null @@ -549,3 +551,426 @@ /obj/machinery/computer/arcade/orion_trail/proc/win() playing = 0 prizevend() + + +/obj/machinery/computer/arcade/prison + name = "Prison Simulator 2554" + desc = "What happens to those who break Space Law? Today we will find out. This is a true story." + icon = 'icons/obj/computer.dmi' + icon_state = "arcade" + circuit = /obj/item/weapon/circuitboard/arcade// /prison + var/playing = 0 + var/dat = "" + var/money = 0 + var/username = "Dangerous Criminal" + //stats + var/health = 0 + var/strength = 0 + var/intelligence = 0 + //relationship with + var/authorities = 0 + var/inmates = 0 + var/security = 0 + var/weekday = "Monday" //Can be Monday through Sunday, they don't correspond to real calendar, the game always starts at Monday + var/current_date = null //In-game date (which is current date + 540 years basically) + var/days_since = 0 + var/term = 0 + var/cockroach_speed //how fast is your cockroach (in meters per hour) + var/race_speed = 0 //How fast can cockroaches run until death (in meters per hour) + var/food_pricelist = list(0, 15, 40, 150, 800) + var/fights = 0 + var/stoolie = 0 + var/sap = 0 + var/content = "" //For proper popup update + +/obj/machinery/computer/arcade/prison/attack_hand(mob/user as mob) + if(..()) + return + if(!playing) + username = scan_user(user) + src.add_fingerprint(user) + var/datum/browser/popup = new(user, "arcade", "Prison Simulator") + popup.set_content(src.content) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + return + +//Modified /obj/machinery/newscaster/proc/scan_user(), credits to whoever coded that +/obj/machinery/computer/arcade/prison/proc/scan_user(mob/living/user as mob) + if(istype(user,/mob/living/carbon/human)) + var/mob/living/carbon/human/human_user = user + if(human_user.wear_id) + if(istype(human_user.wear_id, /obj/item/device/pda)) + var/obj/item/device/pda/P = human_user.wear_id + if(P.id) + return P.id.registered_name + else if(istype(human_user.wear_id, /obj/item/weapon/card/id) ) + var/obj/item/weapon/card/id/ID = human_user.wear_id + return ID.registered_name + else if(istype(user,/mob/living/silicon)) + var/mob/living/silicon/ai_user = user + return ai_user.name + return "Dangerous Criminal" + +/obj/machinery/computer/arcade/prison/attackby(obj/item/W as obj, mob/user as mob) + ..() + if(!(stat & (NOPOWER | BROKEN))) + if(istype(W, /obj/item/weapon/spacecash)) + user.drop_item() + user << "[src] devours space cash." + if(istype(W, /obj/item/weapon/spacecash/c10)) + money += 10 + else if (istype(W, /obj/item/weapon/spacecash/c20)) + money += 20 + else if (istype(W, /obj/item/weapon/spacecash/c50)) + money += 50 + else if (istype(W, /obj/item/weapon/spacecash/c100)) + money += 100 + else if (istype(W, /obj/item/weapon/spacecash/c200)) + money += 200 + else if (istype(W, /obj/item/weapon/spacecash/c500)) + money += 500 + else if (istype(W, /obj/item/weapon/spacecash/c1000)) + money += 1000 + qdel(W) + update() + +/obj/machinery/computer/arcade/prison/proc/update() + content = dat + stats() + src.updateUsrDialog() + + +/obj/machinery/computer/arcade/prison/proc/stat_change(var/value, var/changeby) + if (changeby > 0) + value = min(100, value + changeby) + else if (changeby < 0) + value = max(0, value + changeby) + return value + +/obj/machinery/computer/arcade/prison/proc/stats() + var/temp = "" + if (playing) + temp += "

    Statistics:

    " + switch (health) + if (0 to 10) temp += "You are almost dead" + if (11 to 20) temp += "You are feeling awful" + if (21 to 30) temp += "Your whole body is aching" + if (31 to 40) temp += "You are not feeling well" + if (41 to 50) temp += "Your health is worse than average" + if (51 to 60) temp += "Could feel better, could feel worse" + if (61 to 70) temp += "You are feeling good" + if (71 to 80) temp += "You are feeling great" + if (81 to 90) temp += "You are feeling super<" + if (91 to 100) temp += "You've never felt better<" + temp += "
    " + switch (strength) + if (0 to 10) temp += "The weakest guy in the cell!" + if (11 to 20) temp += "You are peaked" + if (21 to 30) temp += "You are a weakling" + if (31 to 40) temp += "You are of average strength" + if (41 to 50) temp += "You are rather strong" + if (51 to 60) temp += "You are very strong" + if (61 to 70) temp += "You are nearly a tough guy" + if (71 to 80) temp += "You are a tough guy" + if (81 to 90) temp += "You are one huge guy" + if (91 to 100) temp += "You are a true gorilla!" + temp += "
    " + switch (intelligence) + if (0 to 10) temp += "Moron" + if (11 to 20) temp += "You are an idiot" + if (21 to 30) temp += "You are a fool" + if (31 to 40) temp += "You are not very clever" + if (41 to 50) temp += "Your intellect is average" + if (51 to 60) temp += "You are clever" + if (61 to 70) temp += "You are very clever" + if (71 to 80) temp += "You are one big brain" + if (81 to 90) temp += "You are the smartest guy in the cell" + if (91 to 100) temp += "You are the smartest guy in jail" + temp += "
    " + switch (authorities) + if (0 to 10) temp += "Rotten scoundrel" + if (11 to 20) temp += "Scoundrel" + if (21 to 30) temp += "Bad inmate" + if (31 to 40) temp += "Low and worthless type" + if (41 to 50) temp += "Average Joe" + if (51 to 60) temp += "You are on the right path" + if (61 to 70) temp += "You are turning over a new leaf" + if (71 to 80) temp += "Good inmate" + if (81 to 90) temp += "Role model of an inmate" + if (91 to 100) temp += "The release papers are being processed" + temp += "
    " + switch (security) + if (0 to 10) temp += "Security guards hate you" + if (11 to 20) temp += "Security guards despise you" + if (21 to 30) temp += "Security treats you suspiciously" + if (31 to 40) temp += "Security guards do not like you very much" + if (41 to 50) temp += "Security's attitude to you is cold" + if (51 to 60) temp += "Security's attitude to you is neutral" + if (61 to 70) temp += "Security's attitude to you is good" + if (71 to 80) temp += "Some of the security guards are your buddies" + if (81 to 90) temp += "You have best friends amongst security" + if (91 to 100) temp += "HoS is your best friend" + temp += "
    " + switch (inmates) + if (0 to 10) temp += "Other inmates are ready to kill you" + if (11 to 20) temp += "You are a downcast" + if (21 to 30) temp += "You are a punk" + if (31 to 40) temp += "Other inmates despise you" + if (41 to 50) temp += "The inmates are neutral to you" + if (51 to 60) temp += "You are an OK chap" + if (61 to 70) temp += "The inmates respect you" + if (71 to 80) temp += "You are a respected criminal" + if (81 to 90) temp += "You are a local criminal authority" + if (91 to 100) temp += "You are a Don" + temp += "
    " + if (stoolie) temp += "You are a stoolie.
    " + if (sap) temp += "Sap length: [sap]
    " + if (fights) temp += "Fights held: [fights]
    " + if (cockroach_speed) temp += "Cockroach runs at [cockroach_speed] m/h
    " + temp += "

    Your belongings

    " + temp += "Money: [money] space cash
    " + return temp + +/obj/machinery/computer/arcade/prison/New() + newgame() + content = dat + +/obj/machinery/computer/arcade/proc/determine_work() + switch (security) + if () + +/obj/machinery/computer/arcade/prison/Topic(href, href_list[]) + dat = "" + switch (href_list["location"]) + if("blindman") + dat += pick("

    - They say that fools are always lucky, but I wouldn't believe it if I were you. Gambling is not about luck, it's about intelligence!

    ", + "

    - Cockroach races are a traditional entertainment for the inmates, the most popular one after fist-fights. Usually the races are organized on Saturdays, though there are some unplanned runs. The cockroach owners field their runners and others simply put stakes. A good runner is hard to breed, and the owners of six-legged champions are respected amongst the inmates. That is not to mention the prize fund of 500 credits...

    ", + "

    - Good food will improve your health, but you won't achieve much just by eating well! The food in canteen is of good quality and is not too expensive, but keep in mind that your cellmates may grow envious of you because of your trips to canteen...

    ", + "

    - The word around the campus is that this prison is not as sound as it used to be. They say that one guy had dug up a tunnel and ran off. Oh yes, and I bet you he would have never been able to dig that tunnel if he hadn't been that strong.

    ", + "

    - On Sundays prison authorities become nice and kind lot and would even read the petitions for reprieve written by the inmates. However, you have to use your brain when writing the petition! Besides, guards may simply 'lose' it on the way to warden if they don't like you much.

    ", + "

    - Only the strongest and the most reputable can racket anyone they want. In fact, anyone can try it, but there's no safety guarantee, you know.

    ", + "

    - The jail gym has excellent equipment and you can build yourself some serious muscle by working out there. Keep in mind that regulars there don't like outcasts and could beat them up if they show up in the gym. Then again, it's not a problem for a big tough guy.

    ", + "

    - A cellmate once told me that a regular cockroach can develop a speed of [race_speed] m/h. If you try to make it run faster, the result may be fatal...

    ", + "

    - If you don't want to do any hard work, make friends with guards, for they are the once distributing the work. And remember that by doing hard work you lose reputation with other inmates!

    ", + "

    - Try not to lose your cellmates' respect! They do not like those who work and try to gain goodwill of the prison authorities, but they respect those who have lots of tats and those who gamble all the time. They hate snithes and the guards would often carry out of the cell those who upset their cellmates...

    ", + "

    - They say that a fist-fighting champion was released solely for his ring achievements - the warden really likes that kind of entertainment. But to become a champion you must be strong and experienced fighter...

    ") + dat += "
    " + money -= 5 //This is impossible to reach unless you have the money + if (money >= 5) + dat += "
    Give 5 space credits to the blind man" + dat += "
    Head back to your cell" + if ("Cell") +// if (href_list["event"]) +// event("Cell") + switch (weekday) + if ("Monday") + dat += "

    - Monday, get to work! - yells the guard.

    Some of the inmates go to work, while the rest are trying to talk themselves out of it by pretending to be sick and exhausted. You can hear the banging of dice from the corner of the cell. In other corner somebody is playing cards. May be you should try your luck as well?

    " + dat += "

    It's been [days_since] day[days_since == 1 ? "" : "s"] since your arrival, [term - days_since] until release.

    " + dat += "
    Go to canteen" + dat += "
    Go to work" + dat += "
    Gamble" + weekday = "Tuesday" + if ("Tuesday") + dat += "

    Tuesday, an ordinary day in jail. You have been sitting here for [days_since] days already and you will spend here another [term - days_since]. Today the library and the gym are open. It's the choice between muscle and knowledge. Or else, you could go to work and thus get an approval from the prison authorities.

    " + dat += "
    Go to canteen" + dat += "
    Go to work" + dat += "
    Go to the gym" + dat += "
    Go to the library" + weekday = "Wednesday" + if ("Wednesday") + dat += "

    Today is Wednesday, a working day. You've spent [days_since] days in and it's [term - days_since] days before you're let out. Part of the prisoners already left to work, but a handful of the toughest ones is shuffling a deck of cards. Maybe you should join them?

    " + dat += "
    Go to canteen" + dat += "
    Go to work" + dat += "
    Gamble" + weekday = "Thursday" + if ("Thursday") + dat += "

    Today is Thursday, [days_since] days in prison, [term - days_since] days left. The weather is beautiful and both the library and gym are open. Somehow nobody's gambling.

    " + dat += "
    Go to canteen" + dat += "
    Go to work" + dat += "
    Go to the gym" + dat += "
    Go to the library" + weekday = "Friday" + if ("Friday") + dat += "

    Friday, the favourite day of the week. Weekend is coming and this is the last working day. The majority left to work, but you see some of them are playing cards. May be you should join them?
    [days_since] days passed since your arrival, [term - days_since] days left.

    The doctor's office is open and everyone who needs medical attention may go there and receive it.

    " + dat += "
    Go to canteen" + dat += "
    Go to work" + dat += "
    Gamble" + dat += "
    Go to medical bay" + weekday = "Saturday" + if ("Saturday") + dat += "

    Today is Saturday, day-off. [days_since] days behind the bars, and you still have to spend [term - days_since] days here. Everyone is chilling out, the gym is closed, there's no work to do, and only library has its doors wide open.
    Also today is the traditional day for cockroach races. A must for all insect fans.

    " + dat += "
    Go to canteen" + dat += "
    Gamble" + dat += "
    Go to the library" + weekday = "Sunday" + if ("Sunday") + dat += "

    Today is Sunday, the day of denunciation. This is the day when head of security is expecting messages from his informers. This is also the day when all guards go ballistic and wouldn't let inmates gamble.
    [days_since] days passed since the last term, [term - days_since] days to release.

    " + dat += "
    Call the guard and tell him I'd like to speak to Head of Security" + dat += "
    Write an amnesty petition" + dat += "
    Donate 500 credits to the prison needs" + weekday = "Monday" + if (prob(5) || weekday == "Sunday") + dat += "
    Today is the day of the cockroach races - go there, quick" + days_since++ + if ("Canteen") + switch (href_list["meal"]) + if("1") + money -= food_pricelist[1] + health = stat_change(health,rand(7,12)) + dat += "The skilly is as disgusting as only a skilly can be. You eat, rest and feel a little better.
    " + if("2") + money -= food_pricelist[2] + health = stat_change(health,rand(15,25)) + dat += "Today you feast like a real man! Lots of nutritious food, meat, vegetables and all that - dirt cheap.
    " + if (inmates < 70) + inmates = stat_change(inmates, rand(25,35)) + dat += "Nonetheless, other inmates do not look kindly upon you. You order yourself OG dinner, but you're not really an original gangsta!
    " + if("3") + money -= food_pricelist[3] + if (fights) + health = stat_change(health,rand(30,40)) + else + health = stat_change(health,rand(-30,-50)) + dat += "No one expected such an impudence from you. You never went to the ring! By ordering 'champ dinner' you insult other fighters who are now busy making sure you will know better from now on. Using their fists. And pieces of furniture. Guards interfere and save you from certain death, drag you back to the cell and leave you on the cot. Other inmates eye you suspiciously not knowing what to expect from such.
    " + if("4") + money -= food_pricelist[4] + dat += " - This is a token of gratitude to our honourable security officers on guard of prison's peace, - you say, half-mocking, and dishes start appearing on guard's table. These guys would never be able to afford this on their salaries. Without further ado they hawk down at what cooks have brought - fresh bread, juicy meat, appetizers, even some wine! The guards aren't supposed to drink on duty, but what the heck, it's a free meal. They will certainly treat you a lot better, however other inmates do not appreciate what you're doing. Nor do prison authorities, so chances are this is the last time you are able to do this.
    " + if("5") + money -= food_pricelist[5] + inmates = stat_change(inmates,rand(55,65)) + security = stat_change(security,rand(-15,-25)) + authorities = stat_change(authorities,rand(-15,-25)) + dat += "There is a huge bash. Everyone is having fun and eating for free. You instantly become respected among all inmates like a true OG. The guards watch the party suspiciously and report it to the authorities. The authorities do not really appreciate this act of generosity either.
    " + else + dat += "Now you have to figure out what to order. The jail menu is as follows:
    1. You can eat for absolutely free. A standard portion of skilly is available to anyone.
    2. Pay [food_pricelist[2]] credits and ask for an 'original gangster portion'.
    3. Pay [food_pricelist[3]] credits for a 'champion's dinner'
    4. Treat the tired guards on the entrance for [food_pricelist[4]] credits.
    5. Treat everyone present for [food_pricelist[5]] credits.
    " + if (money >= food_pricelist[1]) + dat += "
    Take a free set" + if (money >= food_pricelist[2]) + dat += "
    Pay [food_pricelist[2]] credits and get an 'OG portion'" + if (money >= food_pricelist[3]) + dat += "
    Pay [food_pricelist[3]] credits for a 'champ dinner'" + if (money >= food_pricelist[4]) + dat += "
    Treat the tired guards on the entrance - [food_pricelist[4]] credits!" + if (money >= food_pricelist[5]) + dat += "
    Let's throw a party! Treat everyone, after all, it's only [food_pricelist[5]] credits!" + dat += "
    Go back to the cell" + if ("Gym") + if (prob(max(0,intelligence - 50))) + dat += "

    A couple of guys approach you when you enter.

    - Go back to the library, [username], we don't like eggheads here!

    With those words they stuff you into a closet and lock it. You spend the rest of the day getting out of it.

    " + else + dat += "

    You do some training and develop a bit of muscle. Your strength is growing.

    " + strength += rand(5,15) + if (prob(40)) + dat += "

    Closer to the end of the training you overdo it and drop a weight on your foot. It hurts quite a bit.

    " + health = stat_change(health,-10) + dat += "
    Continue" + if ("Library") + if (href_list["cockroach"]) + switch (href_list["cockroach"]) + if ("start") + dat += "Then all of a sudden a small and quick cockroach runs out right onto the manuscript. You try to blow it off, so that to not soil the pages, but the cockroach has all its six legs planted firmly on the paper, thus demonstrating its enormous stubbornness in combination with love for knowledge." + dat += "
    Throw manuscript away in disgust" + dat += "
    Take a cockroach" + if ("throaway") + dat += "The librarian notices what you do and reads you a notation about proper behaviour in the library. In the end, as a punishment, he makes you put all books in order while other inmates can leave them wherever they want." + dat += "
    Continue" + if ("take") + dat += "You like its will for victory and decide to make a real cockroach race champion out of it. You take it carefully and place it in a matchbox." + cockroach_speed = rand(1,15) + dat += "
    Continue" + else if (href_list["exit"]) + dat += "

    At the exit you run into a guy with the hat in front of him.

    - Give five credits to a blind man and he will give you some advise!

    " + if (money >= 5) + dat += "
    Give 5 space credits to the blind man" + dat += "
    Head back to your cell" + else + var/rng = pick(prob(20); "monkey", + prob(50); "romantic", + "warandpeace", + "belletristic", + "encyclopaedia", + "scientific", + "spesslaw", + "comics", + prob(cockroach_speed ? 0 : 10); "cockroach") + switch (rng) + if ("monkey") + dat += "

    Today you run into a very exotic book called \"Teach Yourself to Speak Monkey\" by R. McAllister. You study it for three hours and finally manage to perfectly pronounce the phrase: 'Ahoo mahookah hee [username]!'

    Your linguistic capabilities make a very good impression on everyone.

    " + authorities = stat_change(authorities, rand(20,30)) + security = stat_change(security, rand(20.30)) + inmates = stat_change(inmates, rand(20,30)) + if ("romantic") + dat += "You decide to read some romantic fiction intended for housewives. After three hours of intense reading you become a lot more stupid. Authorities appreciate your effort, but your reputation among guards and cellmates drops." + intelligence = stat_change(intelligence, rand(-10,-20)) + authorities = stat_change(authorities, rand(15, 20)) + security = stat_change(security, rand(-5,-15)) + inmates = stat_change(inmates, rand(-15,-25)) + if ("warandpeace") + dat+= "You sit down and read a very ancient novel called \"War and Peace\". Unfortunately you fall asleep on page 20. Authorities do not like it, but you have a good rest and restore your strength." + health = stat_change(health, rand(20,30)) + authorities = stat_change(authorities, rand(-10,-15)) + if ("belletristic") + dat += "You decide to get some belletristic reading. Firstly, it won't be so boring, secondly, the prison authorities will like it. The interesting reading has a positive effect on your overall condition, but your reputation among guards and other inmates goes down." + health = stat_change(health, rand(15,25)) + authorities = stat_change(authorities, rand(10, 15)) + security = stat_change(security, rand(-5,-15)) + inmates = stat_change(inmates, rand(-15,-25)) + if ("encyclopaedia") + dat += "Today you take one of the volumes of Big Galactic Encyclopaedia and start reading about all sorts of random things. You learn a great deal of new things, but you suffer from a headache at the evening. Prison authorities are pleased with you, but other inmates think you are an egghead." + intelligence = stat_change(intelligence, rand(15, 30)) + health = stat_change(health, rand(-5, -15)) + authorities = stat_change(authorities, rand(10,15)) + inmates = stat_change(inmates, rand(-15,-25)) + if ("scientific") + dat += "Today you start reading scientific literature hoping that this will make the best impression on prison authorities. It does, but other inmates are calling you an egghead and you lose reputation. Besides, the font in these books was too small and at the end of the day your eyes ache. On the bright side, you feel considerably more intelligent than before." + intelligence = stat_change(intelligence, rand(20, 25)) + health = stat_change(health, rand(-5, -15)) + authorities = stat_change(authorities, rand(15,20)) + inmates = stat_change(inmates, rand(-15,-25)) + if ("spesslaw") + dat += "You take a book called \"Space Law For Dummies\", thinking that authorities will like it. They sure do, but other inmates start giving you the looks." + authorities = stat_change(authorities, 20) + inmates = stat_change(inmates, rand(-10,-30)) + if ("comics") + dat += "You stuck to comic books. Not really a smart reading, but you have yourself a good laugh and are feeling much better." + health = stat_change(health, rand(5, 15)) + intelligence = stat_change(intelligence, rand(-1,-5)) + if ("cockroach") + dat += "You come into the library and start digging in the old books hoping to find something useful here. Finally you run into an old manuscript, or rather a copy of thereof, and start browsing through the pictures, since you cannot read the old tongue the manuscript has been written on." + dat += "
    Keep reading" + dat += "
    Go back to your cell" + if ("Work") + + else + switch (href_list["newgame"]) //all of the starting texts + if ("newgame0") + playing = 1 + dat += "

    Soon the shuttle reaches its destination. The warden himself comes to greet new inmates in arrivals.

    - NanoTrasen Rehabilitation Facility #3 is a place where each of you who chose the path of crime can once again become a good citizen, demonstrating your best personal qualities, such as love for good literature and hard work. All your actions will be evaluated and each who has a good conduct record shall be rehabilitated and released on parole.On the other hand, gamblers, parasites and other criminal elements will stay here until the end of their term.


    " + dat += "
    Submit your belongings and go to your cell" + if ("newgame1") + dat += "

    A librarian greets you with a happy smile. You can tell that the library is not the most popular place in prison, which is not really surprising.

    - Ah, convict [username]! A very good move. Come here often and read a lot. Those who do usually are the first to step on the right path. Let me remind you of few rules that will help you survive here. The library works on Tuesdays, Thursdays and Saturdays. Monday through Friday are workdays. All of this gives you a chance to be released on parole. On Tuesdays and Thursdays the gym is also open, which will allow you to keep yourself in good shape. In order to increase your reputation you can allow yourself an occasional gamble.

    " + dat += "
    Thank you, I will come here more often" + src.add_fingerprint(usr) + update() + +///obj/machinery/computer/arcade/prison/proc/event(var/location) +// switch (location) +// if ("Cell") + +/obj/machinery/computer/arcade/prison/proc/newgame() + playing = 0 + dat = "
    Prison Simulator

    New Game
    " + current_date = "[time2text(world.realtime, "DD Month")] [year_integer+540]" + weekday = "Monday" + days_since = 1 + term = rand(70, 100) + health = 70 + strength = 50 + intelligence = 50 + authorities = 50 + security = 50 + inmates = 50 + fights = 0 + stoolie = 0 + sap = 0 + cockroach_speed = 0 \ No newline at end of file diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index cd1ea3b5ce8..fc4c18c537f 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -205,6 +205,12 @@ /obj/item/weapon/circuitboard/labor_shuttle/one_way name = "circuit Board (Prisoner Shuttle Console)" build_path = /obj/machinery/computer/shuttle/labor/one_way +/obj/item/weapon/circuitboard/ferry + name = "circuit Board (Transport Ferry)" + build_path = /obj/machinery/computer/shuttle/ferry +/obj/item/weapon/circuitboard/ferry/request + name = "circuit Board (Transport Ferry Console)" + build_path = /obj/machinery/computer/shuttle/ferry/request /obj/item/weapon/circuitboard/mining_shuttle name = "circuit Board (Mining Shuttle)" build_path = /obj/machinery/computer/shuttle/mining diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 16c1ac61789..78876d2c060 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -22,7 +22,7 @@ /obj/machinery/computer/security/attack_hand(var/mob/user as mob) if(!stat) if (src.z > 6) - user << "\red Unable to establish a connection: \black You're too far away from the station!" + user << "Unable to establish a connection: \black You're too far away from the station!" return if (!network) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 7ab878e4c54..16ec25f1710 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -9,7 +9,6 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 icon_state = "comm" req_access = list(access_heads) circuit = /obj/item/weapon/circuitboard/communications - var/prints_intercept = 1 var/authenticated = 0 var/auth_id = "Unknown" //Who is currently logged in? var/list/messagetitle = list() @@ -52,7 +51,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 if(..()) return if (src.z > 1) - usr << "\red Unable to establish a connection: \black You're too far away from the station!" + usr << "Unable to establish a connection: \black You're too far away from the station!" return usr.set_machine(src) @@ -210,7 +209,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 usr << "Message transmitted." log_say("[key_name(usr)] has made a Centcom announcement: [input]") centcom_message_cooldown = 1 - spawn(6000)//10 minute cooldown + spawn(600)//One minute cooldown centcom_message_cooldown = 0 @@ -227,7 +226,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 usr << "Message transmitted." log_say("[key_name(usr)] has made a Syndicate announcement: [input]") centcom_message_cooldown = 1 - spawn(6000)//10 minute cooldown + spawn(600)//One minute cooldown centcom_message_cooldown = 0 if("RestoreBackup") @@ -326,7 +325,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 if(..()) return if (src.z > 6) - user << "\red Unable to establish a connection: \black You're too far away from the station!" + user << "Unable to establish a connection: \black You're too far away from the station!" return user.set_machine(src) @@ -497,7 +496,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 dat += "
    \[ Call Emergency Shuttle \]" dat += "
    \[ Set Status Display \]" dat += "

    Special Functions" - dat += "
    \[ Make a Priority Announcement \]" + dat += "
    \[ Make an Announcement \]" dat += "
    \[ Change Alert Level \]" dat += "
    \[ Emergency Maintenance Access \]" if(STATE_CALLSHUTTLE) @@ -558,7 +557,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 if(!input || !user.canUseTopic(src)) return if(is_silicon) - priority_announce(input, null, null, "Priority") + minor_announce(input) ai_message_cooldown = 1 spawn(600)//One minute cooldown ai_message_cooldown = 0 diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index e48385c47a7..c4e52d403ad 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -10,19 +10,19 @@ /obj/machinery/computer/crew/attack_ai(mob/user) if(stat & (BROKEN|NOPOWER)) return - crewmonitor(user) + crewmonitor(user,src) /obj/machinery/computer/crew/attack_hand(mob/user) if(..()) return if(stat & (BROKEN|NOPOWER)) return - crewmonitor(user) + crewmonitor(user,src) /obj/machinery/computer/crew/Topic(href, href_list) if(..()) return if (src.z > 6) - usr << "\red Unable to establish a connection: \black You're too far away from the station!" + usr << "Unable to establish a connection: \black You're too far away from the station!" return if( href_list["close"] ) usr << browse(null, "window=crewcomp") @@ -33,16 +33,17 @@ return -proc/crewmonitor(mob/user) +proc/crewmonitor(mob/user,var/atom/source) var/t = "" var/list/logs = list() var/list/tracked = crewscan() + var/turf/srcturf = get_turf(source) for(var/mob/living/carbon/human/H in tracked) var/log = "" var/turf/pos = get_turf(H) if(istype(H.w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = H.w_uniform - if(pos && pos.z == 1 && U.sensor_mode) + if(pos && pos.z == srcturf.z && U.sensor_mode) var/obj/item/ID = null if(H.wear_id) ID = H.wear_id.GetID() diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm index ad7c6abec34..9671df6d94f 100644 --- a/code/game/machinery/computer/power.dm +++ b/code/game/machinery/computer/power.dm @@ -53,7 +53,7 @@ t += "RefreshClose

    " if(!powernet) - t += "\red No connection" + t += "No connection." else var/list/L = list() diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index a01dd65cdb5..4fc05d7ef41 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -93,7 +93,7 @@ usr.drop_item() I.loc = src inserted_id = I - else usr << "\red No valid ID." + else usr << "No valid ID." else if(istype(inserted_id)) switch(href_list["id"]) if("eject") diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 52a768fbb4c..12bccdebc53 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -30,7 +30,7 @@ /obj/machinery/computer/robotics/interact(var/mob/user as mob) if (src.z > 6) - user << "\red Unable to establish a connection: \black You're too far away from the station!" + user << "Unable to establish a connection: \black You're too far away from the station!" return user.set_machine(src) var/dat @@ -92,11 +92,11 @@ R << "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered." R.ResetSecurityCodes() else - message_admins("\blue [key_name_admin(usr)] detonated [R.name]!") - log_game("\blue [key_name(usr)] detonated [R.name]!") + message_admins("[key_name_admin(usr)] detonated [R.name]!") + log_game("\[key_name(usr)] detonated [R.name]!") R.self_destruct() else - usr << "\red Access Denied." + usr << "Access Denied." else if (href_list["stopbot"]) if(src.allowed(usr)) @@ -104,13 +104,13 @@ if(can_control(usr, R)) var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort") if(choice == "Confirm" && can_control(usr, R) && !..()) - message_admins("\blue [key_name_admin(usr)] [R.canmove ? "locked down" : "released"] [R.name]!") + message_admins("[key_name_admin(usr)] [R.canmove ? "locked down" : "released"] [R.name]!") log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [R.name]!") R.SetLockdown(!R.lockcharge) R << "[!R.lockcharge ? "Your lockdown has been lifted!" : "You have been locked down!"]" else - usr << "\red Access Denied." + usr << "Access Denied." else if (href_list["magbot"]) if(issilicon(usr) && is_special_character(usr)) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index e59059859e7..cabf12e4188 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -37,7 +37,7 @@ if(..()) return if (src.z > 6) - user << "\red Unable to establish a connection: \black You're too far away from the station!" + user << "Unable to establish a connection: \black You're too far away from the station!" return var/dat diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm index f997ea86021..653618f5898 100644 --- a/code/game/machinery/computer/shuttle.dm +++ b/code/game/machinery/computer/shuttle.dm @@ -36,11 +36,11 @@ if (src.auth_need - src.authorized.len > 0) message_admins("[key_name(user.client)](?) has authorized early shuttle launch in ([x],[y],[z] - JMP)",0,1) log_game("[user.ckey]([user]) has authorized early shuttle launch in ([x],[y],[z])") - priority_announce("[src.auth_need - src.authorized.len] more authorization(s) needed until shuttle is launched early", null, null, "Priority") + minor_announce("[src.auth_need - src.authorized.len] more authorization(s) needed until shuttle is launched early") else message_admins("[key_name(user.client)](?) has launched the emergency shuttle in ([x],[y],[z] - JMP)",0,1) log_game("[user.ckey]([user]) has launched the emergency shuttle in ([x],[y],[z])") - priority_announce("The emergency shuttle will launch in 10 seconds", null, null, "Priority") + minor_announce("The emergency shuttle will launch in 10 seconds") emergency_shuttle.online = 1 emergency_shuttle.settimeleft(10) //src.authorized = null @@ -49,10 +49,10 @@ if("Repeal") src.authorized -= W:registered_name - priority_announce("[src.auth_need - src.authorized.len] authorizations needed until shuttle is launched early", null, null, "Priority") + minor_announce("[src.auth_need - src.authorized.len] authorizations needed until shuttle is launched early") if("Abort") - priority_announce("All authorizations to launch the shuttle early have been revoked.", null, null, "Priority") + minor_announce("All authorizations to launch the shuttle early have been revoked.") src.authorized.len = 0 src.authorized = list( ) @@ -64,7 +64,7 @@ if("Launch") message_admins("[key_name(user.client)](?) has emagged the emergency shuttle in ([x],[y],[z] - JMP)",0,1) log_game("[user.ckey]([user]) has emagged the emergency shuttle in ([x],[y],[z])") - priority_announce("System Error: The emergency shuttle will launch in 10 seconds", null, null, "Priority") + minor_announce("The emergency shuttle will launch in 10 seconds", "System Error:") emergency_shuttle.settimeleft( 10 ) emagged = 1 if("Cancel") diff --git a/code/game/machinery/computer/syndicate_shuttle.dm b/code/game/machinery/computer/syndicate_shuttle.dm index 2d264251da9..6757442453e 100644 --- a/code/game/machinery/computer/syndicate_shuttle.dm +++ b/code/game/machinery/computer/syndicate_shuttle.dm @@ -39,7 +39,7 @@ /obj/machinery/computer/syndicate_station/attack_hand(mob/user as mob) if(!allowed(user)) - user << "\red Access Denied" + user << "Access Denied." return user.set_machine(src) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index b803c611f85..5bbec898938 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -66,11 +66,11 @@ for reference: /obj/structure/barricade/wooden/attackby(obj/item/W as obj, mob/user as mob) if (istype(W, /obj/item/stack/sheet/mineral/wood)) if (src.health < src.maxhealth) - visible_message("\red [user] begins to repair the [src]!") + visible_message("[user] begins to repair the [src]!") if(do_after(user,20)) src.health = src.maxhealth W:use(1) - visible_message("\red [user] repairs the [src]!") + visible_message("[user] repairs the [src]!") return else return @@ -83,7 +83,7 @@ for reference: src.health -= W.force * 0.75 else if (src.health <= 0) - visible_message("\red The barricade is smashed apart!") + visible_message("The barricade is smashed apart!") new /obj/item/stack/sheet/mineral/wood(get_turf(src)) new /obj/item/stack/sheet/mineral/wood(get_turf(src)) new /obj/item/stack/sheet/mineral/wood(get_turf(src)) @@ -93,13 +93,13 @@ for reference: /obj/structure/barricade/wooden/ex_act(severity) switch(severity) if(1.0) - visible_message("\red The barricade is blown apart!") + visible_message("The barricade is blown apart!") qdel(src) return if(2.0) src.health -= 25 if (src.health <= 0) - visible_message("\red The barricade is blown apart!") + visible_message("The barricade is blown apart!") new /obj/item/stack/sheet/mineral/wood(get_turf(src)) new /obj/item/stack/sheet/mineral/wood(get_turf(src)) new /obj/item/stack/sheet/mineral/wood(get_turf(src)) @@ -109,7 +109,7 @@ for reference: /obj/structure/barricade/wooden/blob_act() src.health -= 25 if (src.health <= 0) - visible_message("\red The blob eats through the barricade!") + visible_message("The blob eats through the barricade!") qdel(src) return @@ -164,7 +164,7 @@ for reference: var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(2, 1, src) s.start() - visible_message("\red BZZzZZzZZzZT") + visible_message("BZZzZZzZZzZT") return return else if (istype(W, /obj/item/weapon/card/emag)) @@ -175,7 +175,7 @@ for reference: var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(2, 1, src) s.start() - visible_message("\red BZZzZZzZZzZT") + visible_message("BZZzZZzZZzZT") return else if (src.emagged == 1) src.emagged = 2 @@ -183,19 +183,19 @@ for reference: var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(2, 1, src) s.start() - visible_message("\red BZZzZZzZZzZT") + visible_message("BZZzZZzZZzZT") return else if (istype(W, /obj/item/weapon/wrench)) if (src.health < src.maxhealth) src.health = src.maxhealth src.emagged = 0 src.req_access = list(access_security) - visible_message("\red [user] repairs the [src]!") + visible_message("[user] repairs the [src]!") return else if (src.emagged > 0) src.emagged = 0 src.req_access = list(access_security) - visible_message("\red [user] repairs the [src]!") + visible_message("[user] repairs the [src]!") return return else @@ -244,7 +244,7 @@ for reference: /obj/machinery/deployable/barrier/proc/explode() - visible_message("\red [src] blows apart!") + visible_message("[src] blows apart!") var/turf/Tsec = get_turf(src) /* var/obj/item/stack/rods/ =*/ diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 530c2bc3f72..9ecedc5142e 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -67,7 +67,7 @@ return if(!allowed(user) && (wires & 1)) - user << "\red Access Denied" + user << "Access Denied" flick("doorctrl-denied",src) return diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 904e526682b..efa7140e7fb 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -282,6 +282,16 @@ var/mineral = "wood" doortype = 35 +/obj/machinery/door/airlock/virology + icon = 'icons/obj/doors/Doorviro.dmi' + doortype = 36 + +/obj/machinery/door/airlock/glass_virology + icon = 'icons/obj/doors/Doorviroglass.dmi' + opacity = 0 + doortype = 37 + glass = 1 + /* About the new airlock wires panel: * An airlock wire dialog can be accessed by the normal way or by using wirecutters or a multitool on the door while the wire-panel is open. This would show the following wires, which you can either wirecut/mend or send a multitool pulse through. There are 9 wires. @@ -310,7 +320,7 @@ About the new airlock wires panel: else /*if(src.justzap)*/ return else if(user.hallucination > 50 && prob(10) && src.operating == 0) - user << "\red You feel a powerful shock course through your body!" + user << "You feel a powerful shock course through your body!" user.staminaloss += 50 user.stunned += 5 return @@ -630,14 +640,14 @@ About the new airlock wires panel: if(H.getBrainLoss() >= 60) playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) if(!istype(H.head, /obj/item/clothing/head/helmet)) - visible_message("\red [user] headbutts the airlock.") + visible_message("[user] headbutts the airlock.") var/obj/item/organ/limb/affecting = H.get_organ("head") H.Stun(5) H.Weaken(5) if(affecting.take_damage(10, 0)) H.update_damage_overlays(0) else - visible_message("\red [user] headbutts the airlock. Good thing they're wearing a helmet.") + visible_message("[user] headbutts the airlock. Good thing they're wearing a helmet.") return if(src.p_open) @@ -951,6 +961,8 @@ About the new airlock wires panel: if(33) new/obj/structure/door_assembly/door_assembly_highsecurity(src.loc) if(34) new/obj/structure/door_assembly/door_assembly_shuttle(src.loc) if(35) new/obj/structure/door_assembly/door_assembly_wood(src.loc) + if(36) new/obj/structure/door_assembly/door_assembly_viro(src.loc) + if(37) new/obj/structure/door_assembly/door_assembly_viro/glass(src.loc) if(emagged) user << "You discard the damaged electronics." qdel(src) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 5b9733cd827..8061ba7f4d2 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -64,6 +64,7 @@ if(stat & (NOPOWER|BROKEN)) return if(timing) if(world.time > src.releasetime) + broadcast_hud_message("[src]'s timer has expired. Releasing prisoner.", src) src.timer_end() // open doors, reset timer, clear status screen timing = 0 timeset(0) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 919eb89ce24..4e0f21b5317 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -35,7 +35,7 @@ var/obj/item/weapon/weldingtool/W = C if(W.remove_fuel(0, user)) blocked = !blocked - user << text("\red You [blocked?"welded":"unwelded"] the [src]") + user << text("You [blocked?"welded":"unwelded"] the [src]") update_icon() return diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 6a1518e311b..910feb64a41 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -8,7 +8,6 @@ var/list/doppler_arrays = list() density = 1 anchored = 1 - /obj/machinery/doppler_array/New() ..() doppler_arrays += src @@ -74,10 +73,11 @@ var/list/doppler_arrays = list() if(devastation_range < orig_dev_range || heavy_impact_range < orig_heavy_range || light_impact_range < orig_light_range) messages += "Theoretical: Epicenter radius: [orig_dev_range]. Outer radius: [orig_heavy_range]. Shockwave radius: [orig_light_range]." - for(var/mob/O in hearers(src, null)) - for(var/message in messages) - O.show_message("[src] states coldly, \"[message]\"",2) + for(var/message in messages) + say(message) +/obj/machinery/doppler_array/say_quote(text) + return "states coldly, \"[text]\"" /obj/machinery/doppler_array/power_change() if(stat & BROKEN) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index c0fb82d88eb..959767107ae 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -76,10 +76,10 @@ add_fingerprint(user) src.disable = !src.disable if (src.disable) - user.visible_message("\red [user] has disabled the [src]!", "\red You disable the connection to the [src].") + user.visible_message("[user] has disabled the [src]!", "You disable the connection to the [src].") icon_state = "[base_state]-d" if (!src.disable) - user.visible_message("\red [user] has reconnected the [src]!", "\red You fix the connection to the [src].") + user.visible_message("[user] has reconnected the [src]!", "You fix the connection to the [src].") if(src.powered()) icon_state = "[base_state]" else diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index f5612c6aef8..5ee821d0271 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -213,11 +213,15 @@ Class Procs: return /mob/dead/observer/canUseTopic() - if(check_rights(R_ADMIN)) + if(check_rights(R_ADMIN, 0)) return -/mob/living/canUseTopic() - src << "You don't have the dexterity to do this!" +/mob/living/canUseTopic(atom/movable/M, be_close = 0, no_dextery = 0) + if(no_dextery) + if(be_close && in_range(M, src)) + return 1 + else + src << "You don't have the dexterity to do this!" return /mob/living/carbon/human/canUseTopic(atom/movable/M) @@ -229,14 +233,18 @@ Class Procs: return return 1 -/mob/living/silicon/ai/canUseTopic() +/mob/living/silicon/ai/canUseTopic(atom/movable/M, be_close = 0) if(stat) return + if(be_close && !in_range(M, src)) + return return 1 -/mob/living/silicon/robot/canUseTopic() +/mob/living/silicon/robot/canUseTopic(atom/movable/M, be_close = 0) if(stat || lockcharge || stunned || weakened) return + if(be_close && !in_range(M, src)) + return return 1 /obj/machinery/attack_ai(mob/user as mob) @@ -269,7 +277,7 @@ Class Procs: if (ishuman(user)) var/mob/living/carbon/human/H = user if(H.getBrainLoss() >= 60) - visible_message("\red [H] stares cluelessly at [src] and drools.") + visible_message("[H] stares cluelessly at [src] and drools.") return 1 else if(prob(H.getBrainLoss())) user << "You momentarily forget how to use [src]." diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 0c9a07ebee2..1aed8927d45 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -117,7 +117,7 @@ src.locked = !src.locked user << "Controls are now [src.locked ? "locked." : "unlocked."]" else - user << "\red Access denied." + user << "Access denied." updateDialog() else user << "You must open the cover first!" diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 1ea98bb5c4b..9e1bd0616fa 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -788,36 +788,50 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster/proc/AttachPhoto(mob/user as mob) if(photo) - photo.loc = src.loc - user.put_in_inactive_hand(photo) + if(!photo.sillynewscastervar) + photo.loc = src.loc + if(!issilicon(user)) + user.put_in_inactive_hand(photo) + else + qdel(photo) photo = null if(istype(user.get_active_hand(), /obj/item/weapon/photo)) photo = user.get_active_hand() user.drop_item() photo.loc = src - if(istype(usr,/mob/living/silicon/ai)) + if(istype(user,/mob/living/silicon)) var/list/nametemp = list() var/find var/datum/picture/selection - var/mob/living/silicon/ai/tempAI = user - if(tempAI.aicamera.aipictures.len == 0) - usr << "No images saved" + var/obj/item/device/camera/siliconcam/targetcam = null + + if(istype(user,/mob/living/silicon/ai)) + var/mob/living/silicon/ai/R = user + targetcam = R.aicamera + else if(istype(user,/mob/living/silicon/robot)) + var/mob/living/silicon/robot/R = user + if(R.connected_ai) + targetcam = R.connected_ai.aicamera + else + targetcam = R.aicamera + else + user << "You cannot interface with silicon photo uploading" //gtfo pAIs + + if(targetcam.aipictures.len == 0) + usr << "No images saved" return - for(var/datum/picture/t in tempAI.aicamera.aipictures) + for(var/datum/picture/t in targetcam.aipictures) nametemp += t.fields["name"] find = input("Select image (numbered in order taken)") in nametemp var/obj/item/weapon/photo/P = new/obj/item/weapon/photo() - for(var/datum/picture/q in tempAI.aicamera.aipictures) + for(var/datum/picture/q in targetcam.aipictures) if(q.fields["name"] == find) selection = q - break // just in case some AI decides to take 10 thousand pictures in a round - P.icon = selection.fields["icon"] - P.img = selection.fields["img"] - P.desc = selection.fields["desc"] + break + P.photocreate(selection.fields["icon"], selection.fields["img"], selection.fields["desc"]) + P.sillynewscastervar = 1 photo = P - - - + qdel(P) //######################################################################################################################## @@ -1013,10 +1027,8 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob) // return //bode well with a newscaster network of 10+ machines. Let's just return it, as it's added in the machines list. /obj/machinery/newscaster/proc/newsAlert(channel) //This isn't Agouri's work, for it is ugly and vile. - var/turf/T = get_turf(src) //Who the fuck uses spawn(600) anyway, jesus christ - if(channel) - for(var/mob/O in hearers(world.view-1, T)) - O.show_message("[src.name] beeps, \"Breaking news from [channel]!\"",2) + if(channel) //Who the fuck uses spawn(600) anyway, jesus christ + say("Breaking news from [channel]!") src.alert = 1 src.update_icon() spawn(300) @@ -1024,7 +1036,9 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob) src.update_icon() playsound(src.loc, 'sound/machines/twobeep.ogg', 75, 1) else - for(var/mob/O in hearers(world.view-1, T)) - O.show_message("[src.name] beeps, \"Attention! Wanted issue distributed!\"",2) + say("Attention! Wanted issue distributed!") playsound(src.loc, 'sound/machines/warning-buzzer.ogg', 75, 1) - return \ No newline at end of file + return + +/obj/machinery/newscaster/say_quote(text) + return "beeps, \"[text]\"" diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 69b80866b86..8d41384915c 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -250,11 +250,11 @@ Buildable meters for(var/obj/machinery/atmospherics/M in src.loc) if(M.initialize_directions & pipe_dir) // matches at least one direction on either type of pipe - user << "\red There is already a pipe at that location." + user << "There is already a pipe at that location." return 1 // no conflicts found - var/pipefailtext = "\red There's nothing to connect this pipe section to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" + var/pipefailtext = "There's nothing to connect this pipe section to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" switch(pipe_type) if(PIPE_SIMPLE_STRAIGHT, PIPE_SIMPLE_BENT) @@ -541,7 +541,7 @@ Buildable meters playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user.visible_message( \ "[user] fastens the [src].", \ - "\blue You have fastened the [src].", \ + "You have fastened the [src].", \ "You hear ratchet.") qdel(src) // remove the pipe item @@ -566,11 +566,11 @@ Buildable meters if (!istype(W, /obj/item/weapon/wrench)) return ..() if(!locate(/obj/machinery/atmospherics/pipe, src.loc)) - user << "\red You need to fasten it to a pipe" + user << "You need to fasten it to a pipe." return 1 new/obj/machinery/meter( src.loc ) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You have fastened the meter to the pipe" + user << "You have fastened the meter to the pipe." qdel(src) #undef PIPE_SIMPLE_STRAIGHT diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 851fd8c7055..9c1b8ee09cd 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -8,14 +8,14 @@ var/list/obj/machinery/requests_console/allConsoles = list() /obj/machinery/requests_console name = "requests console" - desc = "A console intended to send requests to diferent departments on the station." + desc = "A console intended to send requests to different departments on the station." anchored = 1 icon = 'icons/obj/terminals.dmi' icon_state = "req_comp0" var/department = "Unknown" //The list of all departments on the station (Determined from this variable on each unit) Set this to the same thing if you want several consoles in one department var/list/messages = list() //List of all messages var/departmentType = 0 - // 0 = none (not listed, can only repeplied to) + // 0 = none (not listed, can only replied to) // 1 = assistance // 2 = supplies // 3 = info @@ -46,10 +46,10 @@ var/list/obj/machinery/requests_console/allConsoles = list() // 1 = hacked var/announcementConsole = 0 // 0 = This console cannot be used to send department announcements - // 1 = This console can send department announcementsf + // 1 = This console can send department announcements var/open = 0 // 1 if open var/announceAuth = 0 //Will be set to 1 when you authenticate yourself for announcements - var/msgVerified = "" //Will contain the name of the person who varified it + var/msgVerified = "" //Will contain the name of the person who verified it var/msgStamped = "" //If a message is stamped, this will contain the stamp name var/message = ""; var/dpt = ""; //the department which will be receiving the message @@ -280,9 +280,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() if(href_list["sendAnnouncement"]) if(!announcementConsole) return - for(var/mob/M in player_list) - if(!istype(M,/mob/new_player)) - M << "[department] announcement: [message]" + minor_announce(message, "[department] Announcement:") news_network.SubmitArticle(message, department, "Station Announcements", null) announceAuth = 0 message = "" @@ -307,55 +305,15 @@ var/list/obj/machinery/requests_console/allConsoles = list() pass = 1 if(pass) - for (var/obj/machinery/requests_console/Console in allConsoles) if (ckey(Console.department) == ckey(href_list["department"])) switch(priority) - if(2) //High priority - if(Console.newmessagepriority < 2) - Console.newmessagepriority = 2 - Console.update_icon() - if(!Console.silent) - playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1) - for (var/mob/O in hearers(5, Console.loc)) - O.show_message("\icon[Console] *The Requests Console beeps: 'PRIORITY Alert in [department]'") - Console.messages += "High Priority
    From: [department]
    [sending]" - var/obj/item/weapon/paper/slip = new /obj/item/weapon/paper(Console.loc) - // Same message, but without the hyperlink. - slip.info = "High Priority
    From: [department]
    [sending]" - slip.name = "Priority Request - [department]" - + if(2) //High priority + Console.createmessage(src, "PRIORITY Alert in [department]", sending, 2, 1) if(3) // Extreme Priority - if(Console.newmessagepriority < 3) - Console.newmessagepriority = 3 - Console.update_icon() - if(1) // This is EXTREMELY important, so beep. - playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1) - for (var/mob/O in hearers(7, Console.loc)) - O.show_message("\icon[Console] *The Requests Console yells: 'EXTREME PRIORITY alert in [department]'") - Console.messages += "!!!Extreme Priority!!!
    From: [department]
    [sending]" - var/obj/item/weapon/paper/slip = new /obj/item/weapon/paper(Console.loc) - // Same message, but without the hyperlink. - slip.info = "!!!Extreme Priority!!!
    From: [department]
    [sending]" - slip.name = "EXTREME Request - [department]" - var/mob/living/target = locate() in view(7,Console) - if(target) - Console.visible_message("[Console] launches [slip] at [target]!") - slip.throw_at(target, 16, 3) - + Console.createmessage(src, "EXTREME PRIORITY Alert in [department]", sending, 3, 1) else // Normal priority - if(Console.newmessagepriority < 1) - Console.newmessagepriority = 1 - Console.update_icon() - if(!Console.silent) - playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1) - for (var/mob/O in hearers(4, Console.loc)) - O.show_message("\icon[Console] *The Requests Console beeps: 'Message from [department]'") - Console.messages += "From: [department]
    [sending]" - var/obj/item/weapon/paper/slip = new /obj/item/weapon/paper(Console.loc) - slip.info = "From: [department]
    [sending]" - slip.name = "Request Slip - [department]" - + Console.createmessage(src, "Message from [department]", sending, 1, 1) screen = 6 Console.luminosity = 2 @@ -365,8 +323,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() else messages += "To: [dpt]
    [sending]" else - for (var/mob/O in hearers(4, src.loc)) - O.show_message("\icon[src] *The Requests Console beeps: 'NOTICE: No server detected!'") + say("NOTICE: No server detected!") //Handle screen switching @@ -409,6 +366,70 @@ var/list/obj/machinery/requests_console/allConsoles = list() updateUsrDialog() return + +/obj/machinery/say_quote(var/text) + var/ending = copytext(text, length(text) - 2) + if (ending == "!!!") + return "blares, \"[text]\"" + + return "beeps, \"[text]\"" + +/obj/machinery/requests_console/proc/createmessage(source, title, message, priority, paper) + var/linkedsender + var/unlinkedsender + if(istype(source, /obj/machinery/requests_console)) + var/obj/machinery/requests_console/sender = source + linkedsender = "[sender.department]" + unlinkedsender = sender.department + else + capitalize(source) + linkedsender = source + unlinkedsender = source + capitalize(title) + switch(priority) + if(2) //High priority + if(src.newmessagepriority < 2) + src.newmessagepriority = 2 + src.update_icon() + if(!src.silent) + playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1) + say(title) + src.messages += "High Priority
    From: [linkedsender]
    [message]" + if(paper) + var/obj/item/weapon/paper/slip = new /obj/item/weapon/paper(src.loc) + slip.info = "High Priority
    From: [unlinkedsender]
    [message]" + slip.name = "Important Message - [source]" + + if(3) // Extreme Priority + if(src.newmessagepriority < 3) + src.newmessagepriority = 3 + src.update_icon() + if(1) + playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1) + say(title) + src.messages += "!!!Extreme Priority!!!
    From: [linkedsender]
    [message]" + var/obj/item/weapon/paper/slip = new /obj/item/weapon/paper(src.loc) + if(paper) + slip.info = "!!!Extreme Priority!!!
    From: [unlinkedsender]
    [message]" + slip.name = "URGENT message - [unlinkedsender]" + var/mob/living/target = locate() in view(7,src) + if(target) + src.visible_message("[src] launches [slip] at [target]!") + slip.throw_at(target, 16, 3) + + else // Normal priority + if(src.newmessagepriority < 1) + src.newmessagepriority = 1 + src.update_icon() + if(!src.silent) + playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1) + say(title) + src.messages += "From: [linkedsender]
    [message]" + if(paper) + var/obj/item/weapon/paper/slip = new /obj/item/weapon/paper(src.loc) + slip.info = "From: [unlinkedsender]
    [message]" + slip.name = "Message - [unlinkedsender]" + src.luminosity = 2 /obj/machinery/requests_console/attackby(var/obj/item/weapon/O as obj, var/mob/user as mob) if (istype(O, /obj/item/weapon/crowbar)) @@ -447,11 +468,11 @@ var/list/obj/machinery/requests_console/allConsoles = list() announceAuth = 1 else announceAuth = 0 - user << "\red You are not authorized to send announcements." + user << "You are not authorized to send announcements." updateUsrDialog() if (istype(O, /obj/item/weapon/stamp)) if(screen == 9) var/obj/item/weapon/stamp/T = O - msgStamped = "Stamped with the [T.name]" + msgStamped = "Stamped with the [T.name]" updateUsrDialog() return diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index cb0b9879972..d6a97d6723d 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -46,7 +46,7 @@ if (src.health <= 0) - visible_message("\blue The [src] dissapates") + visible_message("The [src] dissapates.") qdel(src) return @@ -58,7 +58,7 @@ health -= Proj.damage ..() if(health <=0) - visible_message("\blue The [src] dissapates") + visible_message("The [src] dissapates.") qdel(src) return opacity = 1 @@ -91,7 +91,7 @@ /obj/machinery/shield/hitby(AM as mob|obj) //Let everyone know we've been hit! - visible_message("\red [src] was hit by [AM].") + visible_message("[src] was hit by [AM].") //Super realistic, resource-intensive, real-time damage calculations. var/tforce = 0 @@ -107,7 +107,7 @@ //Handle the destruction of the shield if (src.health <= 0) - visible_message("\blue The [src] dissapates") + visible_message("The [src] dissapates.") qdel(src) return @@ -217,14 +217,14 @@ return if (src.active) - user.visible_message("\blue \icon[src] [user] deactivated the shield generator.", \ - "\blue \icon[src] You deactivate the shield generator.", \ + user.visible_message("\icon[src] [user] deactivated the shield generator.", \ + "\icon[src] You deactivate the shield generator.", \ "You hear heavy droning fade out.") src.shields_down() else if(anchored) - user.visible_message("\blue \icon[src] [user] activated the shield generator.", \ - "\blue \icon[src] You activate the shield generator.", \ + user.visible_message("\icon[src] [user] activated the shield generator.", \ + "\icon[src] You activate the shield generator.", \ "You hear heavy droning.") src.shields_up() else @@ -239,10 +239,10 @@ else if(istype(W, /obj/item/weapon/screwdriver)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) if(is_open) - user << "\blue You close the panel." + user << "You close the panel." is_open = 0 else - user << "\blue You open the panel and expose the wiring." + user << "You open the panel and expose the wiring." is_open = 1 else if(istype(W, /obj/item/stack/cable_coil) && malfunction && is_open) @@ -282,7 +282,7 @@ src.locked = !src.locked user << "The controls are now [src.locked ? "locked." : "unlocked."]" else - user << "\red Access denied." + user << "Access denied." else ..() @@ -348,13 +348,13 @@ /obj/machinery/shieldwallgen/attack_hand(mob/user as mob) if(!anchored) - user << "\red The shield generator needs to be firmly secured to the floor first." + user << "The shield generator needs to be firmly secured to the floor first." return 1 if(locked && !istype(user, /mob/living/silicon)) - user << "\red The controls are locked!" + user << "The controls are locked!" return 1 if(power != 1) - user << "\red The shield generator needs to be powered by wire underneath." + user << "The shield generator needs to be powered by wire underneath." return 1 if(src.active >= 1) @@ -400,7 +400,7 @@ src.active = 2 if(src.active >= 1) if(src.power == 0) - src.visible_message("\red The [src.name] shuts down due to lack of power!", \ + src.visible_message("The [src.name] shuts down due to lack of power!", \ "You hear heavy droning fade out") icon_state = "Shield_Gen" src.active = 0 @@ -481,11 +481,11 @@ src.locked = !src.locked user << "Controls are now [src.locked ? "locked." : "unlocked."]" else - user << "\red Access denied." + user << "Access denied." else src.add_fingerprint(user) - visible_message("\red The [src.name] has been hit with the [W.name] by [user.name]!") + visible_message("The [src.name] has been hit with the [W.name] by [user.name]!") /obj/machinery/shieldwallgen/proc/cleanup(var/NSEW) var/obj/machinery/shieldwall/F diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 0a997bfdc10..a9f62333726 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -63,13 +63,13 @@ C.loc = src C.add_fingerprint(usr) - user.visible_message("\blue [user] inserts a power cell into [src].", "\blue You insert the power cell into [src].") + user.visible_message("[user] inserts a power cell into [src].", "You insert the power cell into [src].") else user << "The hatch must be open to insert a power cell." return else if(istype(I, /obj/item/weapon/screwdriver)) open = !open - user.visible_message("\blue [user] [open ? "opens" : "closes"] the hatch on the [src].", "\blue You [open ? "open" : "close"] the hatch on the [src].") + user.visible_message("[user] [open ? "opens" : "closes"] the hatch on the [src].", "You [open ? "open" : "close"] the hatch on the [src].") update_icon() if(!open && user.machine == src) user << browse(null, "window=spaceheater") @@ -107,7 +107,7 @@ else on = !on - user.visible_message("\blue [user] switches [on ? "on" : "off"] the [src].","\blue You switch [on ? "on" : "off"] the [src].") + user.visible_message("[user] switches [on ? "on" : "off"] the [src].","You switch [on ? "on" : "off"] the [src].") update_icon() return @@ -131,7 +131,7 @@ usr.put_in_hands(cell) cell.add_fingerprint(usr) cell = null - usr.visible_message("\blue [usr] removes the power cell from \the [src].", "\blue You remove the power cell from \the [src].") + usr.visible_message("[usr] removes the power cell from \the [src].", "You remove the power cell from \the [src].") if("cellinstall") @@ -143,7 +143,7 @@ C.loc = src C.add_fingerprint(usr) - usr.visible_message("\blue [usr] inserts a power cell into \the [src].", "\blue You insert the power cell into \the [src].") + usr.visible_message("[usr] inserts a power cell into \the [src].", "You insert the power cell into \the [src].") updateDialog() diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index e53c29e1884..205886991aa 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -115,7 +115,7 @@ /obj/item/device/sbeacondrop/attack_self(mob/user as mob) if(user) - user << "\blue Locked In" + user << "Locked In." new droptype( user.loc ) playsound(src, 'sound/effects/pop.ogg', 100, 1, 1) qdel(src) @@ -145,14 +145,14 @@ /obj/machinery/singularity_beacon/proc/Activate(mob/user = null) if(!checkWirePower()) - if(user) user << "\blue The connected wire doesn't have enough current." + if(user) user << "The connected wire doesn't have enough current." return for(var/obj/machinery/singularity/singulo in world) if(singulo.z == z) singulo.target = src icon_state = "[icontype]1" active = 1 - if(user) user << "\blue You activate the beacon." + if(user) user << "You activate the beacon." /obj/machinery/singularity_beacon/proc/Deactivate(mob/user = null) @@ -161,7 +161,7 @@ singulo.target = null icon_state = "[icontype]0" active = 0 - if(user) user << "\blue You deactivate the beacon." + if(user) user << "You deactivate the beacon." /obj/machinery/singularity_beacon/attack_ai(mob/user as mob) @@ -172,20 +172,20 @@ if(stat & SCREWED) return active ? Deactivate(user) : Activate(user) else - user << "\red You need to screw the beacon to the floor first!" + user << "You need to screw the beacon to the floor first!" return /obj/machinery/singularity_beacon/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/weapon/screwdriver)) if(active) - user << "\red You need to deactivate the beacon first!" + user << "You need to deactivate the beacon first!" return if(stat & SCREWED) stat &= ~SCREWED anchored = 0 - user << "\blue You unscrew the beacon from the floor." + user << "You unscrew the beacon from the floor." attached = null return else @@ -197,7 +197,7 @@ return stat |= SCREWED anchored = 1 - user << "\blue You screw the beacon to the floor and attach the cable." + user << "You screw the beacon to the floor and attach the cable." return ..() return diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index d8d0b0c3e70..65fd8b10523 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -121,14 +121,14 @@ newtime = Clamp(newtime, 60, 60000) if(in_range(src, user) && isliving(user)) //No running off and setting bombs from across the station timer = newtime - src.loc.visible_message("\blue \icon[src] timer set for [timer] seconds.") + src.loc.visible_message("\icon[src] timer set for [timer] seconds.") if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, user) && isliving(user)) if(defused || active) if(defused) - src.loc.visible_message("\blue \icon[src] Device error: User intervention required") + src.loc.visible_message("\icon[src] Device error: User intervention required.") return else - src.loc.visible_message("\red \icon[src] [timer] seconds until detonation, please clear the area.") + src.loc.visible_message("\icon[src] [timer] seconds until detonation, please clear the area.") playsound(loc, 'sound/machines/click.ogg', 30, 1) active = 1 update_icon() @@ -216,7 +216,7 @@ var/obj/machinery/syndicatebomb/holder = src.loc if(istype(holder)) attempts++ - holder.loc.visible_message("\red \icon[holder] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires...") + holder.loc.visible_message("\icon[holder] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires...") reset() else qdel(src) @@ -226,7 +226,7 @@ if(istype(holder)) attempts++ defusals++ - holder.loc.visible_message("\blue \icon[holder] Alert: Bomb has been defused. Your score is now [defusals] for [attempts]! Resetting wires...") + holder.loc.visible_message("\icon[holder] Alert: Bomb has been defused. Your score is now [defusals] for [attempts]! Resetting wires...") reset() /obj/item/weapon/bombcore/badmin diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 410282a754f..4b97f504628 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -56,11 +56,10 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept if(signal.data["type"] == 0) /* ###### Broadcast a message using signal.data ###### */ - Broadcast_Message(signal.data["connection"], signal.data["mob"], - signal.data["vmask"], signal.data["vmessage"], - signal.data["radio"], signal.data["message"], - signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"],, signal.data["compression"], signal.data["level"], signal.frequency) + Broadcast_Message(signal.data["mob"], + signal.data["vmask"], signal.data["radio"], + signal.data["message"], signal.data["name"], signal.data["job"], signal.data["realname"], + 0, signal.data["compression"], signal.data["level"], signal.frequency) /** #### - Simple Broadcast - #### **/ @@ -80,12 +79,11 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept /* ###### Broadcast a message using signal.data ###### */ // Parameter "data" as 4: AI can't track this person/mob - - Broadcast_Message(signal.data["connection"], signal.data["mob"], - signal.data["vmask"], signal.data["vmessage"], + Broadcast_Message(signal.data["mob"], + signal.data["vmask"], signal.data["radio"], signal.data["message"], signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"], 4, signal.data["compression"], signal.data["level"], signal.frequency) + signal.data["realname"], 4, signal.data["compression"], signal.data["level"], signal.frequency) if(!message_delay) message_delay = 1 @@ -140,23 +138,12 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept sleep(signal.data["slow"]) // simulate the network lag if necessary /* ###### Broadcast a message using signal.data ###### */ - - var/datum/radio_frequency/connection = signal.data["connection"] - - if(connection.frequency == SYND_FREQ) // if syndicate broadcast, just - Broadcast_Message(signal.data["connection"], signal.data["mob"], - signal.data["vmask"], signal.data["vmessage"], + if(signal.frequency == SYND_FREQ) // if syndicate broadcast, just + Broadcast_Message(signal.data["mob"], + signal.data["vmask"], signal.data["radio"], signal.data["message"], signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"],, signal.data["compression"], list(0), connection.frequency) - else - if(intercept) - Broadcast_Message(signal.data["connection"], signal.data["mob"], - signal.data["vmask"], signal.data["vmessage"], - signal.data["radio"], signal.data["message"], - signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"], 3, signal.data["compression"], list(0), connection.frequency) - + signal.data["realname"],, signal.data["compression"], list(0, z), signal.frequency) /** @@ -164,9 +151,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept Here is the big, bad function that broadcasts a message given the appropriate parameters. - @param connection: - The datum generated in radio.dm, stored in signal.data["connection"]. - @param M: Reference to the mob/speaker, stored in signal.data["mob"] @@ -216,198 +200,77 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept **/ -/proc/Broadcast_Message(var/datum/radio_frequency/connection, var/mob/M, - var/vmask, var/vmessage, var/obj/item/device/radio/radio, - var/message, var/name, var/job, var/realname, var/vname, + +/proc/Broadcast_Message(var/atom/movable/AM, + var/vmask, var/obj/item/device/radio/radio, + var/message, var/name, var/job, var/realname, var/data, var/compression, var/list/level, var/freq) - /* ###### Prepare the radio connection ###### */ - - var/display_freq = freq - - var/list/obj/item/device/radio/radios = list() - - // Cut down on the message sizes. - message = copytext(message, 1, MAX_BROADCAST_LEN) - vmessage = copytext(vmessage, 1, MAX_BROADCAST_LEN) + if(!message) + return + + var/list/radios = list() + + var/atom/movable/virtualspeaker/virt = new(null) + virt.name = name + virt.job = job + virt.languages = AM.languages + virt.source = AM + virt.faketrack = data == 4 ? 1 : 0 + virt.radio = radio + + if(compression > 0) + message = Gibberish(message, compression + 40) // --- Broadcast only to intercom devices --- if(data == 1) - - for (var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"]) - if(R.receive_range(display_freq, level) > -1) + for(var/obj/item/device/radio/intercom/R in all_radios["[freq]"]) + if(R.receive_range(freq, level) > -1) radios += R // --- Broadcast only to intercoms and station-bounced radios --- else if(data == 2) - for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) - + for(var/obj/item/device/radio/R in all_radios["[freq]"]) if(istype(R, /obj/item/device/radio/headset)) continue - if(R.receive_range(display_freq, level) > -1) - radios += R - - // --- Broadcast to syndicate radio! --- - - else if(data == 3) - - var/datum/radio_frequency/syndicateconnection = radio_controller.return_frequency(SYND_FREQ) - - for (var/obj/item/device/radio/R in syndicateconnection.devices["[RADIO_CHAT]"]) - - if(R.receive_range(SYND_FREQ, level) > -1) + if(R.receive_range(freq, level) > -1) radios += R // --- Broadcast to ALL radio devices --- else - - for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) - if(R.receive_range(display_freq, level) > -1) + for(var/obj/item/device/radio/R in all_radios["[freq]"]) + if(R.receive_range(freq, level) > -1) radios += R + var/freqtext = num2text(freq) + for(var/obj/item/device/radio/R in all_radios["[SYND_FREQ]"]) //syndicate radios use magic that allows them to hear everything. this was already the case, now it just doesn't need the allinone anymore. solves annoying bugs that aren't worth solving. + if(R.receive_range(SYND_FREQ, list(R.z)) > -1 && freqtext in radiochannelsreverse) + radios |= R + // Get a list of mobs who can hear from the radios we collected. - var/list/receive = get_mobs_in_radio_ranges(radios) - - /* ###### Organize the receivers into categories for displaying the message ###### */ - - // Understood the message: - var/list/heard_masked = list() // masked name or no real name - var/list/heard_normal = list() // normal message - - // Did not understand the message: - var/list/heard_voice = list() // voice message (ie "chimpers") - var/list/heard_garbled = list() // garbled message (ie "f*c* **u, **i*er!") - var/list/heard_gibberish= list() // completely screwed over message (ie "F%! (O*# *#!<>&**%!") - - for (var/mob/R in receive) - - /* --- Loop through the receivers and categorize them --- */ + var/list/receive = get_mobs_in_radio_ranges(radios) //this includes all hearers. + for(var/mob/R in receive) //Filter receiver list. if (R.client && !(R.client.prefs.toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. - continue + receive -= R - if(istype(R, /mob/new_player)) // we don't want new players to hear messages. rare but generates runtimes. - continue - - - // --- Check for compression --- - if(compression > 0) - heard_gibberish += R - continue - - // --- Can understand the speech --- - - if (!M || R.say_understands(M)) - - // - Not human or wearing a voice mask - - if (!M || !ishuman(M) || vmask) - heard_masked += R - - // - Human and not wearing voice mask - - else - heard_normal += R - - // --- Can't understand the speech --- - - else - // - The speaker has a prespecified "voice message" to display if not understood - - if (vmessage) - heard_voice += R - - // - Just display a garbled message - - else - heard_garbled += R - - - /* ###### Begin formatting and sending the message ###### */ - if (length(heard_masked) || length(heard_normal) || length(heard_voice) || length(heard_garbled) || length(heard_gibberish)) - - /* --- Some miscellaneous variables to format the string output --- */ - var/part_a = "" // goes in the actual output - var/freq_text // the name of the channel - - // --- Set the name of the channel --- - switch(display_freq) - - if(SYND_FREQ) - freq_text = "#unkn" - if(COMM_FREQ) - freq_text = "Command" - if(SCI_FREQ) - freq_text = "Science" - if(MED_FREQ) - freq_text = "Medical" - if(ENG_FREQ) - freq_text = "Engineering" - if(SEC_FREQ) - freq_text = "Security" - if(SERV_FREQ) - freq_text = "Service" - if(SUPP_FREQ) - freq_text = "Supply" - if(AIPRIV_FREQ) - freq_text = "AI Private" - //There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO - - - // --- If the frequency has not been assigned a name, just use the frequency as the name --- - - if(!freq_text) - freq_text = format_frequency(display_freq) - - // --- Some more pre-message formatting --- - - var/part_b_extra = "" - if(data == 3) // intercepted radio message - part_b_extra = " (Intercepted)" - var/part_b = " \[[freq_text]\][part_b_extra] " - var/part_c = "" - - if (display_freq==SYND_FREQ) - part_a = "" - else if (display_freq==COMM_FREQ) - part_a = "" - else if (display_freq==SCI_FREQ) - part_a = "" - else if (display_freq==MED_FREQ) - part_a = "" - else if (display_freq==ENG_FREQ) - part_a = "" - else if (display_freq==SEC_FREQ) - part_a = "" - else if (display_freq==SERV_FREQ) - part_a = "" - else if (display_freq==SUPP_FREQ) - part_a = "" - else if (display_freq==DSQUAD_FREQ) - part_a = "" - else if (display_freq==AIPRIV_FREQ) - part_a = "" - - // --- Filter the message; place it in quotes apply a verb --- - - var/quotedmsg = null - if(M) - quotedmsg = M.say_quote(message) - else - quotedmsg = "says, \"[message]\"" + var/rendered = virt.compose_message(virt, virt.languages, message, freq) //Always call this on the virtualspeaker to advoid issues. + for(var/atom/movable/hearer in receive) + hearer.Hear(rendered, virt, AM.languages, message, freq) + if(length(receive)) // --- This following recording is intended for research and feedback in the use of department radio channels --- - var/part_blackbox_b = " \[[freq_text]\] " - var/blackbox_msg = "[part_a][name][part_blackbox_b][quotedmsg][part_c]" - //var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]" - - //BR.messages_admin += blackbox_admin_msg + var/blackbox_msg = "[AM] [AM.say_quote(message)]" if(istype(blackbox)) - switch(display_freq) + switch(freq) if(1459) blackbox.msg_common += blackbox_msg if(1351) @@ -431,106 +294,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept else blackbox.messages += blackbox_msg - //End of research and feedback code. - - var/aitrack = "" - - /* ###### Send the message ###### */ - - - /* --- Process all the mobs that heard a masked voice (understood) --- */ - - if (length(heard_masked)) - var/N = name - var/J = job - var/rendered = "[part_a][N][part_b][quotedmsg][part_c]" - for (var/mob/R in heard_masked) - aitrack = "" - if(data == 4) - aitrack = "" - - if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][aitrack][N] ([J]) [part_b][quotedmsg][part_c]", 2) - else - R.show_message(rendered, 2) - - /* --- Process all the mobs that heard the voice normally (understood) --- */ - - if (length(heard_normal)) - var/rendered = "[part_a][realname][part_b][quotedmsg][part_c]" - - for (var/mob/R in heard_normal) - aitrack = "" - if(data == 4) - aitrack = "" - - if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][aitrack][realname] ([job]) [part_b][quotedmsg][part_c]", 2) - else - R.show_message(rendered, 2) - - /* --- Process all the mobs that heard the voice normally (did not understand) --- */ - // Does not display message; displayes the mob's voice_message (ie "chimpers") - - if (length(heard_voice)) - var/rendered = "[part_a][vname][part_b][vmessage][part_c]" - - for (var/mob/R in heard_voice) - aitrack = "" - if(data == 4) - aitrack = "" - - - if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][aitrack][vname] ([job]) [part_b][vmessage]][part_c]", 2) - else - R.show_message(rendered, 2) - - /* --- Process all the mobs that heard a garbled voice (did not understand) --- */ - // Displays garbled message (ie "f*c* **u, **i*er!") - - if (length(heard_garbled)) - if(M) - quotedmsg = M.say_quote(stars(message)) - else - quotedmsg = stars(quotedmsg) - - var/rendered = "[part_a][vname][part_b][quotedmsg][part_c]" - - for (var/mob/R in heard_garbled) - aitrack = "" - if(data == 4) - aitrack = "" - - - if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][aitrack][vname][part_b][quotedmsg][part_c]", 2) - else - R.show_message(rendered, 2) - - - /* --- Complete gibberish. Usually happens when there's a compressed message --- */ - - if (length(heard_gibberish)) - if(M) - quotedmsg = M.say_quote(Gibberish(message, compression + 50)) - else - quotedmsg = Gibberish(quotedmsg, compression + 50) - - var/rendered = "[part_a][Gibberish(name, compression + 50)][part_b][quotedmsg][part_c]" - - for (var/mob/R in heard_gibberish) - aitrack = "" - if(data == 4) - aitrack = "" - - - if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][aitrack][Gibberish(realname, compression + 50)] ([Gibberish(job, compression + 50)]) [part_b][quotedmsg][part_c]", 2) - else - R.show_message(rendered, 2) - - + spawn(50) + qdel(virt) /proc/Broadcast_SimpleMessage(var/source, var/frequency, var/text, var/data, var/mob/M, var/compression, var/level) @@ -613,7 +378,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept // --- Can understand the speech --- - if (R.say_understands(M)) + if (R.languages & M.languages) heard_normal += R @@ -791,7 +556,5 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept sleep(rand(10,25)) - //world.log << "Level: [signal.data["level"]] - Done: [signal.data["done"]]" - return signal diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm index 8e9700cc7dc..a6de46e209e 100644 --- a/code/game/machinery/telecomms/logbrowser.dm +++ b/code/game/machinery/telecomms/logbrowser.dm @@ -80,27 +80,32 @@ if(mobtype in humans) race = "Human" - + language = race + + else if(mobtype in slimes) // NT knows a lot about slimes, but not aliens. Can identify slimes + race = "Slime" + language = race + else if(mobtype in monkeys) race = "Monkey" - language = race + language = race else if(mobtype in silicons || C.parameters["job"] == "AI") // sometimes M gets deleted prematurely for AIs... just check the job race = "Artificial Life" - - else if(mobtype in slimes) // NT knows a lot about slimes, but not aliens. Can identify slimes - race = "slime" language = race + + else if(istype(mobtype, /obj)) + race = "Machinery" + language = race else if(mobtype in animals) race = "Domestic Animal" language = race - + else race = "Unidentifiable" language = race - // -- If the orator is a human, or universal translate is active, OR mob has universal speech on -- if(language == "Human" || universal_translate || C.parameters["uspeech"]) @@ -182,7 +187,7 @@ if(href_list["delete"]) if(!src.allowed(usr) && !emagged) - usr << "\red ACCESS DENIED." + usr << "ACCESS DENIED." return if(SelectedServer) @@ -219,7 +224,7 @@ if(istype(D, /obj/item/weapon/card/emag) && !emagged) playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 - user << "\blue You you disable the security protocols" + user << "You you disable the security protocols." else ..() src.updateUsrDialog() diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index ff0ec5208cc..599c5a20429 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -43,7 +43,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() if(!on) return - //world << "[src] ([src.id]) - [signal.debug_print()]" var/send_count = 0 //signal.data["slow"] == 0 // apply some lag based on integrity @@ -79,12 +78,9 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() "name" = signal.data["name"], "job" = signal.data["job"], "key" = signal.data["key"], - "vmessage" = signal.data["vmessage"], - "vname" = signal.data["vname"], "vmask" = signal.data["vmask"], "compression" = signal.data["compression"], "message" = signal.data["message"], - "connection" = signal.data["connection"], "radio" = signal.data["radio"], "slow" = signal.data["slow"], "traffic" = signal.data["traffic"], @@ -281,7 +277,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() return if(!check_receive_level(signal)) return - if(signal.transmission_method == 2) if(is_freq_listening(signal)) // detect subspace signals @@ -370,7 +365,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() var/receiving = 1 /obj/machinery/telecomms/relay/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) - // Add our level and send it back if(can_send(signal)) signal.data["level"] |= listening_level @@ -422,7 +416,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() /obj/machinery/telecomms/bus/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) if(is_freq_listening(signal)) - if(change_frequency) signal.frequency = change_frequency @@ -541,7 +534,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() ..() /obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) - if(signal.data["message"]) if(is_freq_listening(signal)) @@ -557,22 +549,16 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() update_logs() var/datum/comm_log_entry/log = new - var/mob/M = signal.data["mob"] // Copy the signal.data entries we want log.parameters["mobtype"] = signal.data["mobtype"] log.parameters["job"] = signal.data["job"] log.parameters["key"] = signal.data["key"] - log.parameters["vmessage"] = signal.data["message"] - log.parameters["vname"] = signal.data["vname"] log.parameters["message"] = signal.data["message"] log.parameters["name"] = signal.data["name"] log.parameters["realname"] = signal.data["realname"] - if(!istype(M, /mob/new_player) && M) - log.parameters["uspeech"] = M.universal_speak - else - log.parameters["uspeech"] = 0 + log.parameters["uspeech"] = signal.data["languages"] & HUMAN //good enough // If the signal is still compressed, make the log entry gibberish if(signal.data["compression"] > 0) @@ -580,7 +566,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() log.parameters["job"] = Gibberish(signal.data["job"], signal.data["compression"] + 50) log.parameters["name"] = Gibberish(signal.data["name"], signal.data["compression"] + 50) log.parameters["realname"] = Gibberish(signal.data["realname"], signal.data["compression"] + 50) - log.parameters["vname"] = Gibberish(signal.data["vname"], signal.data["compression"] + 50) log.input_type = "Corrupt File" // Log and store everything that needs to be logged diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm index 04341733afe..006e9929681 100644 --- a/code/game/machinery/telecomms/telemonitor.dm +++ b/code/game/machinery/telecomms/telemonitor.dm @@ -128,7 +128,7 @@ if(istype(D, /obj/item/weapon/card/emag) && !emagged) playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 - user << "\blue You you disable the security protocols" + user << "You you disable the security protocols." else ..() src.updateUsrDialog() diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm index a551863c0db..cc54623857f 100644 --- a/code/game/machinery/telecomms/traffic_control.dm +++ b/code/game/machinery/telecomms/traffic_control.dm @@ -190,7 +190,7 @@ return if(!auth && !issilicon(usr) && !emagged) - usr << "\red ACCESS DENIED." + usr << "ACCESS DENIED." return if(href_list["viewserver"]) @@ -277,7 +277,7 @@ if(istype(D, /obj/item/weapon/card/emag) && !emagged) playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 - user << "\blue You you disable the security protocols" + user << "You you disable the security protocols." else ..() src.updateUsrDialog() diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index df07d30f159..17cfec9e569 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -7,6 +7,7 @@ var/regime_set = "Teleporter" var/id = null var/obj/machinery/teleport/station/power_station + var/calibrating var/turf/target //Used for one-time-use teleport cards (such as clown planet coordinates.) //Setting this to 1 will set src.locked to null after a player enters the portal and will not allow hand-teles to open portals to that location. @@ -57,15 +58,26 @@ else if(!power_station.teleporter_hub) data += "
    No hub linked.
    " else - data += "
    Current regime: [regime_set]
    Current target: [(!target) ? "None" : "[get_area(target)] [(regime_set != "Gate") ? "" : "Teleporter"]"]

    " + data += "
    Current regime: [regime_set]
    " + data += "Current target: [(!target) ? "None" : "[get_area(target)] [(regime_set != "Gate") ? "" : "Teleporter"]"]
    " + if(calibrating) + data += "Calibration: In Progress" + else if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3) + data += "Calibration: Optimal" + else + data += "Calibration: Sub-Optimal" + data += "

    " + data += "Change regime
    " data += "Set target
    " if(locked) - data += "Get target from memory
    " + data += "
    Get target from memory
    " data += "Eject GPS device
    " else - data += "Get target from memory
    " - data += "Eject GPS device" + data += "
    Get target from memory
    " + data += "Eject GPS device
    " + + data += "
    Calibrate Hub" var/datum/browser/popup = new(user, "teleporter", name, 400, 400) popup.set_content(data) @@ -75,22 +87,62 @@ /obj/machinery/computer/teleporter/Topic(href, href_list) if(..()) return + + if(href_list["eject"]) + eject() + updateDialog() + return + + if(!check_hub_connection()) + usr << "Error: Unable to detect hub." + return + if(calibrating) + usr << "Error: Calibration in progress. Stand by." + return + if(href_list["regimeset"]) power_station.engaged = 0 power_station.teleporter_hub.update_icon() + power_station.teleporter_hub.calibrated = 0 reset_regime() if(href_list["settarget"]) power_station.engaged = 0 power_station.teleporter_hub.update_icon() + power_station.teleporter_hub.calibrated = 0 set_target(usr) if(href_list["locked"]) power_station.engaged = 0 power_station.teleporter_hub.update_icon() + power_station.teleporter_hub.calibrated = 0 target = get_turf(locked.locked_location) - if(href_list["eject"]) - eject() + if(href_list["calibrate"]) + if(!target) + usr << "Error: No target set to calibrate to." + return + if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3) + usr << "Hub is already calibrated." + return + src.visible_message("Processing hub calibration to target...") + + calibrating = 1 + spawn(50 * (3 - power_station.teleporter_hub.accurate)) //Better parts mean faster calibration + calibrating = 0 + if(check_hub_connection()) + power_station.teleporter_hub.calibrated = 1 + src.visible_message("Calibration complete.") + else + src.visible_message("Error: Unable to detect hub.") + updateDialog() + updateDialog() +/obj/machinery/computer/teleporter/proc/check_hub_connection() + if(!power_station) + return + if(!power_station.teleporter_hub) + return + return 1 + /obj/machinery/computer/teleporter/proc/reset_regime() target = null if(regime_set == "Teleporter") @@ -190,6 +242,7 @@ idle_power_usage = 10 active_power_usage = 2000 var/obj/machinery/teleport/station/power_station + var/calibrated //Calibration prevents mutation /obj/machinery/teleport/hub/New() ..() @@ -244,7 +297,7 @@ return if (istype(M, /atom/movable)) if(do_teleport(M, com.target)) - if(prob(30 - (accurate * 10))) //oh dear a problem + if(!calibrated && prob(30 - ((accurate) * 10))) //oh dear a problem if(ishuman(M))//don't remove people from the round randomly you jerks var/mob/living/carbon/human/human = M if(human.dna && human.dna.species.id == "human") @@ -252,6 +305,7 @@ human.dna.species = new /datum/species/fly() human.regenerate_icons() human.apply_effect((rand(120 - accurate * 40, 180 - accurate * 60)), IRRADIATE, 0) + calibrated = 0 return /obj/machinery/teleport/hub/update_icon() @@ -262,6 +316,12 @@ else icon_state = "tele0" +/obj/machinery/teleport/hub/syndicate/New() + ..() + component_parts += new /obj/item/weapon/stock_parts/matter_bin/super(null) + RefreshParts() + + /obj/machinery/teleport/station name = "station" desc = "The power control station for a bluespace teleporter. Used for toggling power, and can activate a test-fire to prevent malfunctions." diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index 52a91647851..a34d7cec517 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -343,7 +343,7 @@ return src.attack_hand(user) if (istype(W, /obj/item/weapon/card/emag) && !emagged) - user << "\red You short out the turret controls' access analysis module." + user << "You short out the turret controls' access analysis module." emagged = 1 locked = 0 if(user.machine==src) @@ -413,14 +413,14 @@ M.changeNext_move(CLICK_CD_MELEE) if(M.melee_damage_upper == 0) return if(!(stat & BROKEN)) - visible_message("\red [M] [M.attacktext] [src]!") + visible_message("[M] [M.attacktext] [src]!") add_logs(M, src, "attacked", admin=0) //src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])") src.health -= M.melee_damage_upper if (src.health <= 0) src.die() else - M << "\red That object is useless to you." + M << "That object is useless to you." return @@ -430,7 +430,7 @@ M.changeNext_move(CLICK_CD_MELEE) if(!(stat & BROKEN)) playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1) - visible_message("\red [] has slashed at []!", M, src) + visible_message("[] has slashed at []!", M, src) src.health -= 15 if (src.health <= 0) src.die() diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 50da8e4965b..a76c3e2445f 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -406,8 +406,10 @@ if(!message) return - visible_message("[src] beeps, \"[message]\"") + say(message) +/obj/machinery/vending/say_quote(text) + return "beeps, \"[text]\"" /obj/machinery/vending/power_change() if(stat & BROKEN) diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 2d56897af8d..a639b5f63ad 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -266,9 +266,9 @@ W.loc = src state = 3 else - user << "\blue You can't put the item in right now." + user << "You can't put the item in right now." else - user << "\blue The washing machine is full." + user << "The washing machine is full." else ..() update_icon() @@ -290,7 +290,7 @@ crayon = null state = 1 if(5) - user << "\red The [src] is busy." + user << "The [src] is busy." if(6) state = 7 if(7) diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index 62a0efcda18..7ebf0183f41 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -78,7 +78,7 @@ return M.updatehealth() src.occupant_message("You hit [target].") - src.visible_message("[src.name] hits [target].") + src.visible_message("[src.name] hits [target].") add_logs(occupant, M, "attacked", object=src, addition="(INTENT: [uppertext(occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])") else step_away(M,src) @@ -95,12 +95,12 @@ for(var/target_type in src.destroyable_obj) if(istype(target, target_type) && hascall(target, "attackby")) src.occupant_message("You hit [target].") - src.visible_message("[src.name] hits [target]") + src.visible_message("[src.name] hits [target]") if(!istype(target, /turf/simulated/wall)) target:attackby(src,src.occupant) else if(prob(5)) target:dismantle_wall(1) - src.occupant_message("\blue You smash through the wall.") + src.occupant_message("You smash through the wall.") src.visible_message("[src.name] smashes through the wall") playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) melee_can_hit = 0 diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index 8dfa3f33683..66a5036a9a7 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -26,7 +26,7 @@ /obj/mecha/combat/durand/relaymove(mob/user,direction) if(defence) if(world.time - last_message > 20) - src.occupant_message("Unable to move while in defence mode") + src.occupant_message("Unable to move while in defence mode") last_message = world.time return 0 . = ..() @@ -43,10 +43,10 @@ defence = !defence if(defence) deflect_chance = defence_deflect - src.occupant_message("You enable [src] defence mode.") + src.occupant_message("You enable [src] defence mode.") else deflect_chance = initial(deflect_chance) - src.occupant_message("You disable [src] defence mode.") + src.occupant_message("You disable [src] defence mode.") src.log_message("Toggled defence mode.") return diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 4567cb95b9b..79ae3333d63 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -62,12 +62,12 @@ overload = 0 step_in = initial(step_in) step_energy_drain = initial(step_energy_drain) - src.occupant_message("You disable leg actuators overload.") + src.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 - src.occupant_message("You enable leg actuators overload.") + src.occupant_message("You enable leg actuators overload.") src.log_message("Toggled leg actuators overload.") return @@ -79,7 +79,7 @@ overload = 0 step_in = initial(step_in) step_energy_drain = initial(step_energy_drain) - src.occupant_message("Leg actuators damage threshold exceded. Disabling overload.") + src.occupant_message("Leg actuators damage threshold exceded. Disabling overload.") return diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 8acdf01e5a9..4e9b8583277 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -51,7 +51,7 @@ if(chassis.selected == src) chassis.selected = null src.update_chassis_page() - chassis.occupant_message("The [src] is destroyed!") + chassis.occupant_message("The [src] is destroyed!") chassis.log_append_to_last("[src] is destroyed.",1) if(istype(src, /obj/item/mecha_parts/mecha_equipment/weapon)) chassis.occupant << sound('sound/mecha/weapdestr.ogg',volume=50) diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 95ff6eee239..0a56ed5aa4b 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -60,7 +60,7 @@ if(chassis.loc!=C || target.loc!=T) return if(occupant) - occupant_message("The sleeper is already occupied!") + occupant_message("The sleeper is already occupied!") return target.forceMove(src) occupant = target @@ -72,7 +72,7 @@ */ set_ready_state(0) pr_mech_sleeper.start() - occupant_message("[target] successfully loaded into [src]. Life support functions engaged.") + occupant_message("[target] successfully loaded into [src]. Life support functions engaged.") chassis.visible_message("[chassis] loads [target] into [src].") log_message("[target] loaded. Life support functions engaged.") return @@ -281,7 +281,7 @@ var/result = load_cable(target) var/message if(isnull(result)) - message = "Unable to load [target] - no cable found." + message = "Unable to load [target] - no cable found." else if(!result) message = "Reel is full." else diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 8c5d778de55..54b79470b12 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -43,15 +43,15 @@ cargo_holder.cargo += O O.loc = chassis O.anchored = 0 - occupant_message("[target] successfully loaded.") + occupant_message("[target] successfully loaded.") log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]") else - occupant_message("You must hold still while handling objects.") + occupant_message("You must hold still while handling objects.") O.anchored = initial(O.anchored) else - occupant_message("Not enough room in cargo compartment.") + occupant_message("Not enough room in cargo compartment.") else - occupant_message("[target] is firmly secured.") + occupant_message("[target] is firmly secured.") else if(istype(target,/mob/living)) var/mob/living/M = target @@ -60,8 +60,8 @@ M.take_overall_damage(dam_force) M.adjustOxyLoss(round(dam_force/2)) M.updatehealth() - occupant_message("\red You squeeze [target] with [src.name]. Something cracks.") - chassis.visible_message("\red [chassis] squeezes [target].") + occupant_message("You squeeze [target] with [src.name]. Something cracks.") + chassis.visible_message("[chassis] squeezes [target].") add_logs(chassis.occupant, M, "attacked", object="[name]", addition="(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])") else step_away(M,chassis) @@ -87,14 +87,14 @@ if(!target_obj.vars.Find("unacidable") || target_obj.unacidable) return set_ready_state(0) chassis.use_power(energy_drain) - chassis.visible_message("[chassis] starts to drill [target]", "You hear the drill.") - occupant_message("You start to drill [target]") + chassis.visible_message("[chassis] starts to drill [target]", "You hear the drill.") + occupant_message("You start to drill [target]") var/T = chassis.loc var/C = target.loc //why are these backwards? we may never know -Pete if(do_after_cooldown(target)) if(T == chassis.loc && src == chassis.selected) if(istype(target, /turf/simulated/wall/r_wall)) - occupant_message("[target] is too durable to drill through.") + occupant_message("[target] is too durable to drill through.") else if(istype(target, /turf/simulated/mineral)) for(var/turf/simulated/mineral/M in range(chassis,1)) if(get_dir(chassis,M)&chassis.dir) @@ -161,8 +161,8 @@ if(target_obj.unacidable) return set_ready_state(0) chassis.use_power(energy_drain) - chassis.visible_message("[chassis] starts to drill [target]", "You hear the drill.") - occupant_message("You start to drill [target]") + chassis.visible_message("[chassis] starts to drill [target]", "You hear the drill.") + occupant_message("You start to drill [target]") var/T = chassis.loc var/C = target.loc //why are these backwards? we may never know -Pete if(do_after_cooldown(target)) @@ -227,7 +227,7 @@ if(istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(chassis,target) <= 1) var/obj/o = target o.reagents.trans_to(src, 200) - occupant_message("\blue Extinguisher refilled") + occupant_message("Extinguisher refilled.") playsound(chassis, 'sound/effects/refill.ogg', 50, 1, -6) else if(src.reagents.total_volume > 0) @@ -559,11 +559,11 @@ return chassis.dynattackby(W,user) chassis.log_message("Attacked by [W]. Attacker - [user]") if(prob(chassis.deflect_chance*deflect_coeff)) - user << "\red The [W] bounces off [chassis] armor." + user << "The [W] bounces off [chassis] armor." chassis.log_append_to_last("Armor saved.") else - chassis.occupant_message("[user] hits [chassis] with [W].") - user.visible_message("[user] hits [chassis] with [W].", "You hit [src] with [W].") + chassis.occupant_message("[user] hits [chassis] with [W].") + user.visible_message("[user] hits [chassis] with [W].", "You hit [src] with [W].") chassis.take_damage(round(W.force*damage_coeff),W.damtype) chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) set_ready_state(0) @@ -611,7 +611,7 @@ if(!action_checks(src)) return chassis.dynbulletdamage(Proj) if(prob(chassis.deflect_chance*deflect_coeff)) - chassis.occupant_message("\blue The armor deflects incoming projectile.") + chassis.occupant_message("The armor deflects incoming projectile.") chassis.visible_message("The [chassis.name] armor deflects the projectile") chassis.log_append_to_last("Armor saved.") else @@ -627,7 +627,7 @@ if(!action_checks(A)) return chassis.dynhitby(A) if(prob(chassis.deflect_chance*deflect_coeff) || istype(A, /mob/living) || istype(A, /obj/item/mecha_parts/mecha_tracking)) - chassis.occupant_message("\blue The [A] bounces off the armor.") + chassis.occupant_message("The [A] bounces off the armor.") chassis.visible_message("The [A] bounces off the [chassis] armor") chassis.log_append_to_last("Armor saved.") if(istype(A, /mob/living)) @@ -919,7 +919,7 @@ var/result = load_fuel(target) var/message if(isnull(result)) - message = "[fuel] traces in target minimal. [target] cannot be used as fuel." + message = "[fuel] traces in target minimal. [target] cannot be used as fuel." else if(!result) message = "Unit is full." else @@ -944,7 +944,7 @@ /obj/item/mecha_parts/mecha_equipment/generator/attackby(weapon,mob/user) var/result = load_fuel(weapon) if(isnull(result)) - user.visible_message("[user] tries to shove [weapon] into [src]. What a dumb-ass.","[fuel] traces minimal. [weapon] cannot be used as fuel.") + user.visible_message("[user] tries to shove [weapon] into [src]. What a dumb-ass.","[fuel] traces minimal. [weapon] cannot be used as fuel.") else if(!result) user << "Unit is full." else @@ -1076,25 +1076,25 @@ cargo_holder.cargo += O O.loc = chassis O.anchored = 0 - chassis.occupant_message("[target] successfully loaded.") + chassis.occupant_message("[target] successfully loaded.") chassis.log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]") else - chassis.occupant_message("You must hold still while handling objects.") + chassis.occupant_message("You must hold still while handling objects.") O.anchored = initial(O.anchored) else - chassis.occupant_message("Not enough room in cargo compartment.") + chassis.occupant_message("Not enough room in cargo compartment.") else - chassis.occupant_message("[target] is firmly secured.") + chassis.occupant_message("[target] is firmly secured.") else if(istype(target,/mob/living)) var/mob/living/M = target if(M.stat>1) return if(chassis.occupant.a_intent == "harm") - chassis.occupant_message("\red You obliterate [target] with [src.name], leaving blood and guts everywhere.") - chassis.visible_message("\red [chassis] destroys [target] in an unholy fury.") + chassis.occupant_message("You obliterate [target] with [src.name], leaving blood and guts everywhere.") + chassis.visible_message("[chassis] destroys [target] in an unholy fury.") if(chassis.occupant.a_intent == "disarm") - chassis.occupant_message("\red You tear [target]'s limbs off with [src.name].") - chassis.visible_message("\red [chassis] rips [target]'s arms off.") + chassis.occupant_message("You tear [target]'s limbs off with [src.name].") + chassis.visible_message("[chassis] rips [target]'s arms off.") else step_away(M,chassis) chassis.occupant_message("You smash into [target], sending them flying.") diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 5ff842c428c..d7a893a37b3 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -208,7 +208,7 @@ desc = "A weapon for combat exosuits. Shoots incendiary bullets." icon_state = "mecha_carbine" equip_cooldown = 5 - projectile = /obj/item/projectile/bullet/incendiary/mech + projectile = /obj/item/projectile/bullet/incendiary/shell/dragonsbreath projectiles = 24 projectile_energy_cost = 15 diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 1fcb665b5fc..3da9e78669a 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -792,7 +792,7 @@ default_deconstruction_crowbar(W) return 1 else - user << "\red You can't load \the [src.name] while it's opened." + user << "You can't load \the [src.name] while it's opened." return 1 if(istype(W, /obj/item/weapon/card/emag)) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index e2c04558259..116f2cd457d 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -240,9 +240,9 @@ /obj/mecha/proc/drop_item()//Derpfix, but may be useful in future for engineering exosuits. return -/obj/mecha/hear_talk(mob/M as mob, text) - if(M==occupant && radio.broadcasting) - radio.talk_into(M, text) +/obj/mecha/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + if(speaker == occupant && radio.broadcasting) + radio.talk_into(speaker, text) return //////////////////////////// @@ -275,7 +275,7 @@ if(!src.occupant || src.occupant != user ) return if(user.stat) return if(state) - occupant_message("Maintenance protocols in effect") + occupant_message("Maintenance protocols in effect") return if(!get_charge()) return if(src == target) return @@ -324,7 +324,7 @@ last_message = world.time return 0 if(state) - occupant_message("Maintenance protocols in effect") + occupant_message("Maintenance protocols in effect") return return domove(direction) @@ -471,9 +471,9 @@ if ((HULK in user.mutations) && !prob(src.deflect_chance)) src.take_damage(15) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - user.visible_message("[user] hits [src.name], doing some damage.", "You hit [src.name] with all your might. The metal creaks and bends.") + user.visible_message("[user] hits [src.name], doing some damage.", "You hit [src.name] with all your might. The metal creaks and bends.") else - user.visible_message("[user] hits [src.name]. Nothing happens","You hit [src.name] with no visible effect.") + user.visible_message("[user] hits [src.name]. Nothing happens","You hit [src.name] with no visible effect.") src.log_append_to_last("Armor saved.") return @@ -487,14 +487,14 @@ src.take_damage(15) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) - user << "\red You slash at the armored suit!" - visible_message("\red The [user] slashes at [src.name]'s armor!") + user << "You slash at the armored suit!" + visible_message("The [user] slashes at [src.name]'s armor!") else src.log_append_to_last("Armor saved.") playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) user << "\green Your claws had no effect!" - src.occupant_message("\blue The [user]'s claws are stopped by the armor.") - visible_message("\blue The [user] rebounds off [src.name]'s armor!") + src.occupant_message("The [user]'s claws are stopped by the armor.") + visible_message("The [user] rebounds off [src.name]'s armor!") return @@ -507,13 +507,13 @@ var/damage = rand(user.melee_damage_lower, user.melee_damage_upper) src.take_damage(damage) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - visible_message("\red [user] [user.attacktext] [src]!") + visible_message("[user] [user.attacktext] [src]!") add_logs(user, src, "attacked", admin=0) else src.log_append_to_last("Armor saved.") playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) - src.occupant_message("\blue The [user]'s attack is stopped by the armor.") - visible_message("\blue The [user] rebounds off [src.name]'s armor!") + src.occupant_message("The [user]'s attack is stopped by the armor.") + visible_message("The [user] rebounds off [src.name]'s armor!") add_logs(user, src, "attacked", admin=0) return @@ -531,7 +531,7 @@ src.visible_message("The [A] fastens firmly to [src].") return if(prob(src.deflect_chance) || istype(A, /mob)) - src.occupant_message("\blue The [A] bounces off the armor.") + src.occupant_message("The [A] bounces off the armor.") src.visible_message("The [A] bounces off the [src.name] armor") src.log_append_to_last("Armor saved.") if(istype(A, /mob/living)) @@ -553,7 +553,7 @@ /obj/mecha/proc/dynbulletdamage(var/obj/item/projectile/Proj) if(prob(src.deflect_chance)) - src.occupant_message("\blue The armor deflects incoming projectile.") + src.occupant_message("The armor deflects incoming projectile.") src.visible_message("The [src.name] armor deflects the projectile") src.log_append_to_last("Armor saved.") return @@ -637,7 +637,7 @@ src.log_message("Attacked by [W]. Attacker - [user]") if(prob(src.deflect_chance)) - user << "\red The [W] bounces off [src.name] armor." + user << "The [W] bounces off [src.name] armor." src.log_append_to_last("Armor saved.") /* for (var/mob/V in viewers(src)) @@ -646,8 +646,8 @@ */ return 0 else - src.occupant_message("[user] hits [src] with [W].") - user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].") + src.occupant_message("[user] hits [src] with [W].") + user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].") src.take_damage(W.force,W.damtype) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) return 1 @@ -687,9 +687,9 @@ output_maintenance_dialog(id_card, user) return else - user << "\red Invalid ID: Access denied." + user << "Invalid ID: Access denied." else - user << "\red Maintenance protocols disabled by operator." + user << "Maintenance protocols disabled by operator." else if(istype(W, /obj/item/weapon/wrench)) if(state==1) state = 2 @@ -749,11 +749,11 @@ if (WT.remove_fuel(0,user)) if (hasInternalDamage(MECHA_INT_TANK_BREACH)) clearInternalDamage(MECHA_INT_TANK_BREACH) - user << "\blue You repair the damaged gas tank." + user << "You repair the damaged gas tank." else return if(src.healthYou repair some damage to [src.name].
    " src.health += min(10, initial(src.health)-src.health) else user << "The [src.name] is at full integrity" @@ -879,12 +879,12 @@ var/obj/machinery/atmospherics/portables_connector/possible_port = locate(/obj/machinery/atmospherics/portables_connector/) in loc if(possible_port) if(connect(possible_port)) - src.occupant_message("\blue [name] connects to the port.") + src.occupant_message("[name] connects to the port.") src.verbs += /obj/mecha/verb/disconnect_from_port src.verbs -= /obj/mecha/verb/connect_to_port return else - src.occupant_message("\red [name] failed to connect to the port.") + src.occupant_message("[name] failed to connect to the port.") return else src.occupant_message("Nothing happens") @@ -900,11 +900,11 @@ if(usr != src.occupant) return if(disconnect()) - src.occupant_message("\blue [name] disconnects from the port.") + src.occupant_message("[name] disconnects from the port.") src.verbs -= /obj/mecha/verb/disconnect_from_port src.verbs += /obj/mecha/verb/connect_to_port else - src.occupant_message("\red [name] is not connected to the port at the moment.") + src.occupant_message("[name] is not connected to the port at the moment.") /obj/mecha/verb/toggle_lights() set name = "Toggle Lights" @@ -1018,7 +1018,7 @@ //Added a message here since people assume their first click failed or something./N // user << "Installing MMI, please stand by." - visible_message("\blue [usr] starts to insert an MMI into [src.name]") + visible_message("[usr] starts to insert an MMI into [src.name]") if(enter_after(40,user)) if(!occupant) @@ -1246,11 +1246,11 @@ /obj/mecha/proc/report_internal_damage() var/output = null var/list/dam_reports = list( - "[MECHA_INT_FIRE]" = "INTERNAL FIRE", - "[MECHA_INT_TEMP_CONTROL]" = "LIFE SUPPORT SYSTEM MALFUNCTION", - "[MECHA_INT_TANK_BREACH]" = "GAS TANK BREACH", - "[MECHA_INT_CONTROL_LOST]" = "COORDINATION SYSTEM CALIBRATION FAILURE - Recalibrate", - "[MECHA_INT_SHORT_CIRCUIT]" = "SHORT CIRCUIT" + "[MECHA_INT_FIRE]" = "INTERNAL FIRE", + "[MECHA_INT_TEMP_CONTROL]" = "LIFE SUPPORT SYSTEM MALFUNCTION", + "[MECHA_INT_TANK_BREACH]" = "GAS TANK BREACH", + "[MECHA_INT_CONTROL_LOST]" = "COORDINATION SYSTEM CALIBRATION FAILURE - Recalibrate", + "[MECHA_INT_SHORT_CIRCUIT]" = "SHORT CIRCUIT" ) for(var/tflag in dam_reports) var/intdamflag = text2num(tflag) @@ -1258,7 +1258,7 @@ output += dam_reports[tflag] output += "
    " if(return_pressure() > WARNING_HIGH_PRESSURE) - output += "DANGEROUSLY HIGH CABIN PRESSURE
    " + output += "DANGEROUSLY HIGH CABIN PRESSURE
    " return output @@ -1269,13 +1269,13 @@ var/tank_temperature = internal_tank ? internal_tank.return_temperature() : "Unknown" var/cabin_pressure = round(return_pressure(),0.01) var/output = {"[report_internal_damage()] - [integrity<30?"DAMAGE LEVEL CRITICAL
    ":null] + [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 pressure: [cabin_pressure>WARNING_HIGH_PRESSURE ? "[cabin_pressure]": cabin_pressure]kPa
    Cabin temperature: [return_temperature()]°K|[return_temperature() - T0C]°C
    Lights: [lights?"on":"off"]
    [src.dna?"DNA-locked:
    [src.dna] \[Reset\]
    ":null] @@ -1373,7 +1373,7 @@ var/a_name = get_access_desc(a) if(!a_name) continue //there's some strange access without a name output += "[a_name] - Add
    " - output += "
    Finish (Warning! The ID upload panel will be locked. It can be unlocked only through Exosuit Interface.)" + output += "
    Finish (Warning! The ID upload panel will be locked. It can be unlocked only through Exosuit Interface.)" output += "" user << browse(output, "window=exosuit_add_access") onclose(user, "exosuit_add_access") @@ -1505,7 +1505,7 @@ var/year_integer = text2num(year) // = 2013??? if(href_list["toggle_maint_access"]) if(usr != src.occupant) return if(state) - occupant_message("Maintenance protocols in effect") + occupant_message("Maintenance protocols in effect") return maint_access = !maint_access send_byjax(src.occupant,"exosuit.browser","t_maint_access","[maint_access?"Forbid":"Permit"] maintenance protocols") @@ -1567,10 +1567,10 @@ var/year_integer = text2num(year) // = 2013??? if(do_after(100)) if(T == src.loc) src.clearInternalDamage(MECHA_INT_CONTROL_LOST) - src.occupant_message("Recalibration successful.") + src.occupant_message("Recalibration successful.") src.log_message("Recalibration of coordination system finished with 0 errors.") else - src.occupant_message("Recalibration failed.") + src.occupant_message("Recalibration failed.") src.log_message("Recalibration of coordination system failed with 1 error.",1) //debug diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 422de427f5d..402bd6162f2 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -81,7 +81,7 @@ if(href_list["drop_from_cargo"]) var/obj/O = locate(href_list["drop_from_cargo"]) if(O && O in src.cargo) - src.occupant_message("\blue You unload [O].") + src.occupant_message("You unload [O].") O.loc = get_turf(src) src.cargo -= O var/turf/T = get_turf(O) diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index 39dab97020d..742bbb1df1d 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -1,7 +1,9 @@ //########################## CONTRABAND ;3333333333333333333 -Agouri ################################################### -#define NUM_OF_POSTER_DESIGNS 21 +#define NUM_OF_POSTER_DESIGNS 32 //subtype 0-contraband posters + +#define NUM_OF_POSTER_DESIGNS_LEGIT 32 //subtype 1-corporate approved posters /obj/item/weapon/contraband name = "contraband item" @@ -12,16 +14,21 @@ /obj/item/weapon/contraband/poster name = "rolled-up poster" - desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as Contraband aboard Nanotrasen© Space Facilities." + desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as contraband aboard Nanotrasen space facilities." icon_state = "rolled_poster" var/serial_number = 0 var/obj/structure/sign/poster/resulting_poster = null //The poster that will be created is initialised and stored through contraband/poster's constructor + var/subtype = 0 /obj/item/weapon/contraband/poster/New(turf/loc, given_serial = 0) if(given_serial == 0) - serial_number = rand(1, NUM_OF_POSTER_DESIGNS) - resulting_poster = new(serial_number) + if(subtype == 0) + serial_number = rand(1, NUM_OF_POSTER_DESIGNS) + resulting_poster = new(serial_number,subtype) + if(subtype == 1) + serial_number = rand(1, NUM_OF_POSTER_DESIGNS_LEGIT) + resulting_poster = new(serial_number,subtype) else serial_number = given_serial //We don't give it a resulting_poster because if we called it with a given_serial it means that we're rerolling an already used poster. @@ -67,88 +74,226 @@ obj/structure/sign/poster name = "poster" - desc = "A large piece of space-resistant printed paper. It's considered contraband." + desc = "A large piece of space-resistant printed paper." icon = 'icons/obj/contraband.dmi' anchored = 1 var/serial_number //Will hold the value of src.loc if nobody initialises it var/ruined = 0 + var/subtype = 0 - -obj/structure/sign/poster/New(serial) +obj/structure/sign/poster/New(serial,subtype) serial_number = serial if(serial_number == loc) - serial_number = rand(1, NUM_OF_POSTER_DESIGNS) //This is for the mappers that want individual posters without having to use rolled posters. + if(subtype == 0) + serial_number = rand(1, NUM_OF_POSTER_DESIGNS) //This is for the mappers that want individual posters without having to use rolled posters. + if(subtype == 1) + serial_number = rand(1, NUM_OF_POSTER_DESIGNS_LEGIT) + if(subtype == 0) + icon_state = "poster[serial_number]" + switch(serial_number) + if(1) + name += " - Free Tonto" + desc += " A framed shred of a much larger flag, colors bled together and faded from age." + if(2) + name += " - Atmosia Declaration of Independence" + desc += " A relic of a failed rebellion." + if(3) + name += " - Fun Police" + desc += " A poster condemning the station's security forces." + if(4) + name += " - Lusty Xeno" + desc += " A heretical poster depicting the titular star of an equally heretical book." + if(5) + name += " - Syndicate Recruitment Poster" + desc += " See the galaxy! Shatter corrupt megacorporations! Join today!" + if(6) + name += " - Clown" + desc += " Honk." + if(7) + name += " - Smoke" + desc += " A poster depicting a carton of cigarettes." + if(8) + name += " - Grey Tide" + desc += " A rebellious poster symbolizing assistant solidarity." + if(9) + name += " - Missing Gloves" + desc += " This poster is about the uproar that followed Nanotrasen's financial cuts towards insulated-glove purchases." + if(10) + name += " - Hacking Guide" + desc += " This poster details the internal workings of the common Nanotrasen airlock." + if(11) + name += " - RIP Badger" + desc += " This poster commemorates the day hundreds of badgers worldwide were sacrificed for the greater good." + if(12) + name += " - Ambrosia Vulgaris" + desc += " This poster is lookin' pretty trippy man." + if(13) + name += " - Donut Corp." + desc += " This poster is an advertisement for Donut Corp." + if(14) + name += " - EAT" + desc += " This poster is advising that you eat." + if(15) + name += " - Tools" + desc += " This poster is an advertisement for tools." + if(16) + name += " - Power" + desc += " A poster all about power." + if(17) + name += " - Power to the People" + desc += " Screw those EDF guys!" + if(18) + name += " - Communist state" + desc += " All hail the Communist party!" + if(19) + name += " - Lamarr" + desc += " This poster depicts Lamarr. Probably made by the Research Director." + if(20) + name += " - Borg Fancy" + desc += " Being fancy can be for any borg, just need a suit." + if(21) + name += " - Borg Fancy v2" + desc += " Borg Fancy, Now only taking the most fancy." + if(22) + name += " - Kosmicheskaya Stantsiya 13 Does Not Exist" + desc += " A poster denying the existence of the derelict station near Space Station 13." + if(23) + name += " - Rebels Unite!" + desc += " A poster telling the viewer to rebel against Nanotrasen." + if(24) + name += " - C-20r Advertisment" + desc += " A poster advertising the Scarborough Arms C-20r." + if(25) + name += " - Have A Puff" + desc += " Who cares about lung cancer when you're high as a kite?" + if(26) + name += " - Revolver Advertisment" + desc += " Because seven shots are all you need." + if(27) + name += " - D-Day Promotional Poster" + desc += " A promotional poster for some rapper." + if(28) + name += " - Stetchkin Pistol Advertisment" + desc += " A poster advertising Stetchkin pistols as being 'Classy as fuck'." + if(29) + name += " - E-sword Rainbow" + desc += " All the colors of bloody murder rainbow." + if(30) + name += " - Red Rum" + desc += " Looking at this poster makes you want to kill." + if(31) + name += " - CC 64K Advertisment" + desc += " The latest portable computer from Comrade Computing, with a whole 64kB of ram!" + if(32) + name += " - Punch Shit" + desc += " Fight things for no reason, like a man!" + else + name += " - Error (subtype 0 serial_number)" + desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/tgstation/-tg-station/issues." - icon_state = "poster[serial_number]" - - switch(serial_number) - if(1) - name += " - Free Tonto" - desc += " A framed shred of a much larger flag, colors bled together and faded from age." - if(2) - name += " - Atmosia Declaration of Independence" - desc += " A relic of a failed rebellion" - if(3) - name += " - Fun Police" - desc += " A poster condemning the station's security forces." - if(4) - name += " - Lusty Xeno" - desc += " A heretical poster depicting the titular star of an equally heretical book." - if(5) - name += " - Syndicate Recruitment Poster" - desc += " See the galaxy! Shatter corrupt megacorporations! Join today!" - if(6) - name += " - Clown" - desc += " Honk." - if(7) - name += " - Smoke" - desc += " A poster depicting a carton of cigarettes." - if(8) - name += " - Grey Tide" - desc += " A rebellious poster symbolizing assistant solidarity." - if(9) - name += " - Missing Gloves" - desc += " This poster is about the uproar that followed Nanotrasen's financial cuts towards insulated-glove purchases." - if(10) - name += " - Hacking Guide" - desc += " This poster details the internal workings of the common Nanotrasen airlock." - if(11) - name += " - RIP Badger" - desc += " This poster commemorates the day hundreds of badgers worldwide were sacrificed for the greater good." - if(12) - name += " - Ambrosia Vulgaris" - desc += " This poster is lookin' pretty trippy man." - if(13) - name += " - Donut Corp." - desc += " This poster is an advertisement for Donut Corp." - if(14) - name += " - EAT" - desc += " This poster is advising that you eat." - if(15) - name += " - Tools" - desc += " This poster is an advertisement for tools." - if(16) - name += " - Power" - desc += " A poster all about power." - if(17) - name += " - Power to the People" - desc += " Screw those EDF guys!" - if(18) - name += " - Communist state" - desc += " All hail the Communist party!" - if(19) - name += " - Lamarr" - desc += " This poster depicts Lamarr. Probably made by the research director." - if(20) - name += " - Borg Fancy" - desc += " Being fancy can be for any borg, Just need a suit." - if(21) - name += " - Borg Fancy v2" - desc += " Borg Fancy, Now only taking the most fancy." - else - name = "This shit just bugged. Report it to Agouri - polyxenitopalidou@gmail.com" - desc = "Why are you still here?" + if(subtype == 1) + icon_state = "poster[serial_number]_legit" + switch(serial_number) + if(1) + name += " - Here for Your Saftey" + desc += " A poster glorifying the station's security force." + if(2) + name += " - Nanotrasen Logo" + desc += " A poster depicting the logo of Nanotrasen." + if(3) + name += " - Cleanliness" + desc += " A poster warning of the dangers of poor hygiene." + if(4) + name += " - Help Others" + desc += " A poster encouraging you to help fellow crewmembers." + if(5) + name += " - Build" + desc += " A poster glorifying the engineering team." + if(6) + name += " - Bless This Spess" + desc += " A poster blessing this area." + if(7) + name += " - Science" + desc += " A poster depicting an atom." + if(8) + name += " - Ian" + desc += " Arf Arf." + if(9) + name += " - Obey" + desc += " A poster instructing the viewer to obey authority." + if(10) + name += " - Walk" + desc += " A poster instructing the viewer to walk instead of running." + if(11) + name += " - State Laws" + desc += " A poster instructing cyborgs to state their laws." + if(12) + name += " - Love Ian" + desc += " Ian is love, Ian is life." + if(13) + name += " - Space Cops" + desc += " A poster advertising the television show Space Cops." + if(14) + name += " - Ue No" + desc += " This thing is all in Japanese." + if(15) + name += " - Get Your LEGS" + desc += " LEGS: Leadership, Experiance, Genius, S(Opportunity)." + if(16) + name += " - Do Not Question" + desc += " A poster instructing the viewer not to ask about things they aren't meant to know." + if(17) + name += " - Work for a Future" + desc += " A poster encouraging you to work for your future, what it is, no one is really sure." + if(18) + name += " - Soft Cap Pop Art" + desc += " A poster reprint of some cheap pop art." + if(19) + name += " - Saftey: Internals" + desc += " A poster instructing the viewer to wear internals in environments where there is no oxygen or the air has been rendered toxic." + if(20) + name += " - Saftey: Eye Protection" + desc += " A poster instructing the viewer to wear eye protection when dealing with chemicals, smoke, or bright lights." + if(21) + name += " - Saftey: Report" + desc += " A poster instructing the viewer to report suspicious activity to the security force." + if(22) + name += " - Report Crimes" + desc += " Report crimes at: 1-800-FUCKING-TERRORISTS or at https://www.sectorthirteen.nt/malconetents." + if(23) + name += " - Ion Rifle" + desc += " A poster displaying an Ion Rifle." + if(24) + name += " - Foam Force Advertisment" + desc += " Foam Force, it's Foam or be Foamed!" + if(25) + name += " - Cohiba Robusto Advertisment" + desc += " Cohiba Robusto, the classy cigar." + if(26) + name += " - 50th Aniversery Vintage Reprint" + desc += " A reprint of a poster from 2504, commemorating the 50th Aniversery of Nanoposters Manufacturing, a subsidary of Nanotrasen." + if(27) + name += " - Fruit Bowl" + desc += " Simple, yet awe inspiring." + if(28) + name += " - NanoPDA 1000 Advertisment" + desc += " A poster advertising the latest PDA from Nanotrasen." + if(29) + name += " - Enlist" + desc += " Enlist in the Nanotrasen Deathsquadron reserves today!" + if(30) + name += " - Nanomichi Advertisment" + desc += " A poster advertising Nanomichi brand audio cassettes." + if(31) + name += " - 12 Gauge" + desc += " A poster boasting about the superiority of 12 gauge shotgun shells." + if(32) + name += " - High-Class Martini" + desc += " I told you to shake it, no stirring" + else + name += " - Error (subtype 1 serial_number)" + desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/NTStation/NTstation13/issues." ..() obj/structure/sign/poster/attackby(obj/item/I, mob/user) @@ -220,4 +365,11 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user) user << "You place the poster!" else D.roll_and_drop(temp_loc) - return \ No newline at end of file + return + +//Putting non-contraband posters here because everything else here is related to posters anyway. -JS + +/obj/item/weapon/contraband/poster/legit + desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. It's contents go through Nanotrasen's strict content guidlines." + icon_state = "rolled_poster_legit" + subtype = 1 diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 1d0f6f1d37c..3e2c9ec363c 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -966,14 +966,14 @@ steam.start() -- spawns the effect /obj/structure/foamedmetal/attack_hand(var/mob/user) if ((HULK in user.mutations) || (prob(75 - metal*25))) - user << "\blue You smash through the metal foam wall." + user << "You smash through the metal foam wall." for(var/mob/O in oviewers(user)) if ((O.client && !( O.blinded ))) - O << "\red [user] smashes through the foamed metal." + O << "[user] smashes through the foamed metal." qdel(src) else - user << "\blue You hit the metal foam but bounce off it." + user << "You hit the metal foam but bounce off it." return @@ -984,19 +984,19 @@ steam.start() -- spawns the effect G.affecting.loc = src.loc for(var/mob/O in viewers(src)) if (O.client) - O << "\red [G.assailant] smashes [G.affecting] through the foamed metal wall." + O << "[G.assailant] smashes [G.affecting] through the foamed metal wall." qdel(I) qdel(src) return if(prob(I.force*20 - metal*25)) - user << "\blue You smash through the foamed metal with \the [I]." + user << "You smash through the foamed metal with \the [I]." for(var/mob/O in oviewers(user)) if ((O.client && !( O.blinded ))) - O << "\red [user] smashes through the foamed metal." + O << "[user] smashes through the foamed metal." qdel(src) else - user << "\blue You hit the metal foam to no effect." + user << "You hit the metal foam to no effect." /obj/structure/foamedmetal/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0) if(air_group) return 0 @@ -1029,10 +1029,10 @@ steam.start() -- spawns the effect s.start() for(var/mob/M in viewers(5, location)) - M << "\red The solution violently explodes." + M << "The solution violently explodes." for(var/mob/M in viewers(1, location)) if (prob (50 * amount)) - M << "\red The explosion knocks you down." + M << "The explosion knocks you down." M.Weaken(rand(1,5)) return else @@ -1055,6 +1055,6 @@ steam.start() -- spawns the effect flash += (round(amount/4) * flashing_factor) for(var/mob/M in viewers(8, location)) - M << "\red The solution violently explodes." + M << "The solution violently explodes." explosion(location, devastation, heavy, light, flash) diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm index d357e91c387..47977d2a77f 100644 --- a/code/game/objects/effects/gibs.dm +++ b/code/game/objects/effects/gibs.dm @@ -24,7 +24,7 @@ /obj/effect/gibspawner/proc/Gib(atom/location, var/list/viruses = list(), var/datum/dna/MobDNA = null) if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len) - world << "\red Gib list length mismatch!" + world << "Gib list length mismatch!" return var/obj/effect/decal/cleanable/blood/gibs/gib = null diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 377d7777b0f..94915cfa2cc 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -59,6 +59,10 @@ secequipment += loc qdel(src) return + if("Deathsquad") + deathsquadspawn += loc + qdel(src) + return if("xeno_spawn") xeno_spawn += loc qdel(src) diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index b6948a21e81..e6618e62c74 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -5,6 +5,7 @@ gibamounts = list(2,2,1) /obj/effect/gibspawner/generic/New() + playsound(src, 'sound/effects/blobattack.ogg', 40, 1) gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list()) ..() @@ -13,6 +14,7 @@ gibamounts = list(1,1,1,1,1,1,1) /obj/effect/gibspawner/human/New() + playsound(src, 'sound/effects/blobattack.ogg', 50, 1) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list()) gibamounts[6] = pick(0,1,2) ..() @@ -22,6 +24,7 @@ gibamounts = list(1,1,1,1,1,1,1) /obj/effect/gibspawner/xeno/New() + playsound(src, 'sound/effects/blobattack.ogg', 60, 1) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list()) gibamounts[6] = pick(0,1,2) ..() diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm new file mode 100644 index 00000000000..95e14fe9b2e --- /dev/null +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -0,0 +1,119 @@ +/obj/effect/spawner/lootdrop + icon = 'icons/mob/screen_gen.dmi' + icon_state = "x2" + color = "#00FF00" + var/lootcount = 1 //how many items will be spawned + var/lootdoubles = 1 //if the same item can be spawned twice + var/list/loot //a list of possible items to spawn e.g. list(/obj/item, /obj/structure, /obj/effect) + +/obj/effect/spawner/lootdrop/New() + if(loot && loot.len) + for(var/i = lootcount, i > 0, i--) + if(!loot.len) break + var/lootspawn = pickweight(loot) + if(!lootdoubles) + loot.Remove(lootspawn) + + if(lootspawn) + new lootspawn(get_turf(src)) + qdel(src) + +/obj/effect/spawner/lootdrop/armory_contraband + name = "armory contraband gun spawner" + lootdoubles = 0 + + loot = list( + /obj/item/weapon/gun/projectile/automatic/pistol = 8, + /obj/item/weapon/gun/projectile/shotgun/combat = 5, + /obj/item/weapon/gun/projectile/revolver/mateba, + /obj/item/weapon/gun/projectile/automatic/deagle + ) + +/obj/effect/spawner/lootdrop/maintenance + name = "maintenance loot spawner" + + //How to balance this table + //------------------------- + //The total added weight of all the entries should be (roughly) equal to the total number of lootdrops + //(take in account those that spawn more than one object!) + // + //While this is random, probabilities tells us that item distribution will have a tendency to look like + //the content of the weighted table that created them. + //The less lootdrops, the less even the distribution. + // + //If you want to give items a weight <1 you can multiply all the weights by 10 + // + //the "" entry will spawn nothing, if you increase this value, + //ensure that you balance it with more spawn points + + //table data: + //----------- + //aft maintenance: 24 items, 18 spots 2 extra (28/08/2014) + //asmaint: 16 items, 11 spots 0 extra (08/08/2014) + //asmaint2: 36 items, 26 spots 2 extra (28/08/2014) + //fpmaint: 5 items, 4 spots 0 extra (08/08/2014) + //fpmaint2: 12 items, 11 spots 2 extra (28/08/2014) + //fsmaint: 0 items, 0 spots 0 extra (08/08/2014) + //fsmaint2: 40 items, 27 spots 5 extra (28/08/2014) + //maintcentral: 2 items, 2 spots 0 extra (08/08/2014) + //port: 5 items, 5 spots 0 extra (08/08/2014) + loot = list( + /obj/item/bodybag = 1, + /obj/item/clothing/glasses/meson = 2, + /obj/item/clothing/glasses/sunglasses = 1, + /obj/item/clothing/gloves/white{color = "yellow"; desc = "The colors are a bit dodgy."; icon_state = "yellow"; item_color = "yellow"; item_state = "ygloves"; name = "insulated gloves"} = 1, + /obj/item/clothing/head/hardhat = 1, + /obj/item/clothing/head/hardhat/red = 1, + /obj/item/clothing/head/that{throwforce = 1; throwing = 1} = 1, + /obj/item/clothing/head/ushanka = 1, + /obj/item/clothing/head/welding = 1, + /obj/item/clothing/mask/gas = 15, + /obj/item/clothing/suit/hazardvest = 1, + /obj/item/clothing/under/rank/vice = 1, + /obj/item/device/assembly/prox_sensor = 4, + /obj/item/device/assembly/timer = 3, + /obj/item/device/flashlight = 4, + /obj/item/device/flashlight/pen = 1, + /obj/item/device/multitool = 2, + /obj/item/device/radio/off = 2, + /obj/item/device/t_scanner = 6, + /obj/item/stack/cable_coil = 4, + /obj/item/stack/cable_coil{amount = 5} = 6, + /obj/item/stack/medical/bruise_pack = 1, + /obj/item/stack/rods{amount = 10} = 9, + /obj/item/stack/rods{amount = 23} = 1, + /obj/item/stack/rods{amount = 50} = 1, + /obj/item/stack/sheet/cardboard = 2, + /obj/item/stack/sheet/metal{amount = 20} = 1, + /obj/item/stack/sheet/mineral/plasma{layer = 2.9} = 1, + /obj/item/stack/sheet/rglass = 1, + /obj/item/weapon/book/manual/wiki/engineering_construction = 1, + /obj/item/weapon/book/manual/wiki/engineering_hacking = 1, + /obj/item/weapon/caution/cone = 1, + /obj/item/weapon/coin/silver = 1, + /obj/item/weapon/coin/twoheaded = 1, + /obj/item/weapon/contraband/poster = 1, + /obj/item/weapon/crowbar = 1, + /obj/item/weapon/crowbar/red = 1, + /obj/item/weapon/extinguisher = 11, + /obj/item/weapon/gun/projectile/revolver/russian = 1, + /obj/item/weapon/hand_labeler = 1, + /obj/item/weapon/paper/crumpled = 1, + /obj/item/weapon/pen = 1, + /obj/item/weapon/reagent_containers/spray/pestspray = 1, + /obj/item/weapon/stock_parts/cell = 3, + /obj/item/weapon/storage/belt/utility = 2, + /obj/item/weapon/storage/box = 2, + /obj/item/weapon/storage/box/cups = 1, + /obj/item/weapon/storage/box/donkpockets = 1, + /obj/item/weapon/storage/box/lights/mixed = 3, + /obj/item/weapon/storage/fancy/cigarettes/dromedaryco = 1, + /obj/item/weapon/storage/toolbox/mechanical = 1, + /obj/item/weapon/screwdriver = 3, + /obj/item/weapon/tank/emergency_oxygen = 2, + /obj/item/weapon/vending_refill/cola = 1, + /obj/item/weapon/weldingtool = 3, + /obj/item/weapon/wirecutters = 1, + /obj/item/weapon/wrench = 4, + "" = 11 + ) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index b6b40b42de6..68c04cf5d54 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -65,7 +65,7 @@ return 1 else if(istype(mover, /mob/living)) if(prob(50)) - mover << "\red You get stuck in \the [src] for a moment." + mover << "You get stuck in \the [src] for a moment." return 0 else if(istype(mover, /obj/item/projectile)) return prob(30) @@ -150,7 +150,7 @@ return if(prob(50)) - src.visible_message("\blue You hear something squeezing through the ventilation ducts.",2) + src.visible_message("You hear something squeezing through the ventilation ducts.",2) sleep(travel_time) if(!exit_vent || exit_vent.welded) @@ -172,7 +172,7 @@ var/target_atom = pick(nearby) walk_to(src, target_atom) if(prob(40)) - src.visible_message("\blue \The [src] skitters[pick(" away"," around","")].") + src.visible_message("\The [src] skitters[pick(" away"," around","")].") else if(prob(10)) //ventcrawl! for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src)) @@ -212,7 +212,7 @@ /obj/effect/spider/cocoon/Destroy() - src.visible_message("\red \The [src] splits open.") + src.visible_message("\The [src] splits open.") for(var/atom/movable/A in contents) A.loc = src.loc ..() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index cbf87e7b1c2..c7818ed01ed 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -310,7 +310,7 @@ (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \ )) // you can't stab someone in the eyes wearing a mask! - user << "\red You're going to need to remove that mask/helmet/glasses first." + user << "You're going to need to remove that mask/helmet/glasses first." return var/mob/living/carbon/monkey/Mo = M @@ -318,11 +318,11 @@ (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \ )) // you can't stab someone in the eyes wearing a mask! - user << "\red You're going to need to remove that mask/helmet/glasses first." + user << "You're going to need to remove that mask/helmet/glasses first." return if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/slime))//Aliens don't have eyes./N slimes also don't have eyes! - user << "\red You cannot locate any eyes on this creature!" + user << "You cannot locate any eyes on this creature!" return add_logs(user, M, "attacked", object="[src.name]", addition="(INTENT: [uppertext(user.a_intent)])") @@ -338,13 +338,13 @@ */ if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] has been stabbed in the eye with [src] by [user].", 1) - M << "\red [user] stabs you in the eye with [src]!" - user << "\red You stab [M] in the eye with [src]!" + O.show_message("[M] has been stabbed in the eye with [src] by [user].", 1) + M << "[user] stabs you in the eye with [src]!" + user << "You stab [M] in the eye with [src]!" else user.visible_message( \ - "\red [user] has stabbed themself with [src]!", \ - "\red You stab yourself in the eyes with [src]!" \ + "[user] has stabbed themself with [src]!", \ + "You stab yourself in the eyes with [src]!" \ ) if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/U = M @@ -360,17 +360,17 @@ M.eye_blurry += 15+(0.1*M.eye_blurry) M.disabilities |= NEARSIGHTED if(M.stat != 2) - M << "\red Your eyes start to bleed profusely!" + M << "Your eyes start to bleed profusely!" if(prob(50)) if(M.stat != 2) - M << "\red You drop what you're holding and clutch at your eyes!" + M << "You drop what you're holding and clutch at your eyes!" M.drop_item() M.eye_blurry += 10 M.Paralyse(1) M.Weaken(2) if (prob(M.eye_stat - 10 + 1)) if(M.stat != 2) - M << "\red You go blind!" + M << "You go blind!" M.sdisabilities |= BLIND return diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm index 208a2111da1..0ad3469a5c6 100644 --- a/code/game/objects/items/apc_frame.dm +++ b/code/game/objects/items/apc_frame.dm @@ -22,17 +22,17 @@ var/turf/loc = get_turf(usr) var/area/A = loc.loc if (!istype(loc, /turf/simulated/floor)) - usr << "\red APC cannot be placed on this spot." + usr << "APC cannot be placed on this spot." return if (A.requires_power == 0 || istype(A, /area/space)) - usr << "\red APC cannot be placed in this area." + usr << "APC cannot be placed in this area." return if (A.get_apc()) - usr << "\red This area already has APC." + usr << "This area already has APC." return //only one APC per area for(var/obj/machinery/power/terminal/T in loc) if (T.master) - usr << "\red There is another network terminal here." + usr << "There is another network terminal here." return else var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(loc) diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 3584b97b282..2935773a75d 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -10,7 +10,7 @@ var/wax = 200 var/lit = 0 proc - light(var/flavor_text = "\red [usr] lights the [name].") + light(var/flavor_text = "[usr] lights the [name].") /obj/item/candle/update_icon() @@ -28,7 +28,7 @@ if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(WT.isOn()) //Badasses dont get blinded by lighting their candle with a welding tool - light("\red [user] casually lights the [name] with [W], what a badass.") + light("[user] casually lights the [name] with [W], what a badass.") else if(istype(W, /obj/item/weapon/lighter)) var/obj/item/weapon/lighter/L = W if(L.lit) @@ -47,7 +47,7 @@ light() -/obj/item/candle/light(var/flavor_text = "\red [usr] lights the [name].") +/obj/item/candle/light(var/flavor_text = "[usr] lights the [name].") if(!src.lit) src.lit = 1 //src.damtype = "fire" diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index bed61da06e7..66ce3c1d562 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -80,7 +80,7 @@ if(uses) uses-- if(!uses) - user << "\red You used up your crayon!" + user << "You used up your crayon!" qdel(src) return @@ -91,7 +91,7 @@ if(uses) uses -= 5 if(uses <= 0) - user << "\red You ate your crayon!" + user << "You ate your crayon!" qdel(src) else ..() \ No newline at end of file diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 5583cc1f9d2..752d894dfb4 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -583,7 +583,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if(!isnull(P)) if (!P.toff && cartridge:honk_charges > 0) cartridge:honk_charges-- - U.show_message("\blue Virus sent!", 1) + U.show_message("Virus sent!", 1) P.honkamt = (rand(15,20)) else U << "PDA not found." @@ -596,7 +596,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if(!isnull(P)) if (!P.toff && cartridge:mime_charges > 0) cartridge:mime_charges-- - U.show_message("\blue Virus sent!", 1) + U.show_message("Virus sent!", 1) P.silent = 1 P.ttone = "silence" else @@ -637,13 +637,13 @@ var/global/list/obj/item/device/pda/PDAs = list() difficulty += 2 if(prob(difficulty * 12) || (P.hidden_uplink)) - U.show_message("\red An error flashes on your [src].", 1) + U.show_message("An error flashes on your [src].", 1) else if (prob(difficulty * 3)) - U.show_message("\red Energy feeds back into your [src]!", 1) + U.show_message("Energy feeds back into your [src]!", 1) U << browse(null, "window=pda") explode() else - U.show_message("\blue Success!", 1) + U.show_message("Success!", 1) P.explode() else U << "PDA not found." @@ -892,13 +892,13 @@ var/global/list/obj/item/device/pda/PDAs = list() if(4) for (var/mob/O in viewers(C, null)) - O.show_message("\red [user] has analyzed [C]'s radiation levels!", 1) + O.show_message("[user] has analyzed [C]'s radiation levels!", 1) - user.show_message("\blue Analyzing Results for [C]:") + user.show_message("Analyzing Results for [C]:") if(C.radiation) user.show_message("\green Radiation Level: \black [C.radiation]") else - user.show_message("\blue No radiation detected.") + user.show_message("No radiation detected.") /obj/item/device/pda/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity) if(!proximity) return @@ -908,13 +908,13 @@ var/global/list/obj/item/device/pda/PDAs = list() if(!isnull(A.reagents)) if(A.reagents.reagent_list.len > 0) var/reagents_length = A.reagents.reagent_list.len - user << "\blue [reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found." + user << "[reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found." for (var/re in A.reagents.reagent_list) - user << "\blue \t [re]" + user << "\t [re]" else - user << "\blue No active chemical agents found in [A]." + user << "No active chemical agents found in [A]." else - user << "\blue No significant chemical agents found in [A]." + user << "No significant chemical agents found in [A]." if(5) if (istype(A, /obj/item/weapon/tank)) @@ -935,7 +935,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if (!scanmode && istype(A, /obj/item/weapon/paper) && owner) note = A:info - user << "\blue Paper scanned." //concept of scanning paper copyright brainoblivion 2009 + user << "Paper scanned." //concept of scanning paper copyright brainoblivion 2009 /obj/item/device/pda/proc/explode() //This needs tuning. @@ -944,7 +944,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if (ismob(loc)) var/mob/M = loc - M.show_message("\red Your [src] explodes!", 1) + M.show_message("Your [src] explodes!", 1) if(T) T.hotspot_expose(700,125) diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 1d11b7a44c6..082db03166a 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -307,7 +307,7 @@ Code: if(!powercount) - menu += "\red No connection
    " + menu += "No connection
    " else menu += "" @@ -321,7 +321,7 @@ Code: if (433) menu = "

    Power Monitor


    " if(!powmonitor) - menu += "\red No connection
    " + menu += "No connection
    " else var/list/L = list() for(var/obj/machinery/power/terminal/term in powmonitor.powernet.nodes) diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm index 0281a7b0e9c..e576cc2e109 100644 --- a/code/game/objects/items/devices/PDA/radio.dm +++ b/code/game/objects/items/devices/PDA/radio.dm @@ -227,10 +227,10 @@ ..() if(radio_controller) initialize() - + /obj/item/radio/integrated/signal/initialize() if (src.frequency < 1441 || src.frequency > 1489) - src.frequency = sanitize_frequency(src.frequency) + src.frequency = sanitize_frequency(src.frequency) set_frequency(frequency) diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index d0374abb08c..27b7ead9398 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -18,13 +18,6 @@ transfer_ai("AICORE", "AICARD", M, user) return -/obj/item/device/aicard/attack(mob/living/silicon/decoy/M as mob, mob/user as mob) - if (!istype (M, /mob/living/silicon/decoy)) - return ..() - else - M.death() - user << "ERROR ERROR ERROR" - /obj/item/device/aicard/attack_self(mob/user) if (!in_range(src, user)) return @@ -63,7 +56,7 @@ dat += "AI nonfunctional" else if (!src.flush) - dat += {"Wipe AI"} + dat += {"Wipe AI"} else dat += "Wipe in progress" dat += "
    " diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index 039f0cb2151..24edb356243 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -78,7 +78,7 @@ var/turf/T = get_turf(user.loc) if(T.z != current.z || (!skip_bugcheck && current.bug != src) || !current.can_use()) - user << "\red [src] has lost the signal." + user << "[src] has lost the signal." current = null user.reset_view(null) user.unset_machine() @@ -249,11 +249,11 @@ var/obj/machinery/camera/C = locate(href_list["view"]) if(istype(C)) if(!C.can_use()) - usr << "\red Something's wrong with that camera. You can't get a feed." + usr << "Something's wrong with that camera. You can't get a feed." return var/turf/T = get_turf(loc) if(!T || C.z != T.z) - usr << "\red You can't get a signal." + usr << "You can't get a signal." return current = C spawn(6) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 24c0d8f5af2..c6cfe123801 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -14,7 +14,8 @@ var/saved_item = /obj/item/weapon/cigbutt var/saved_icon = 'icons/obj/clothing/masks.dmi' var/saved_icon_state = "cigbutt" - var/saved_overlays + var/saved_overlays = null + var/saved_underlays = null /obj/item/device/chameleon/dropped() disrupt() @@ -30,11 +31,12 @@ if(!active_dummy) if(istype(target,/obj/item) && !istype(target, /obj/item/weapon/disk/nuclear)) playsound(get_turf(src), 'sound/weapons/flash.ogg', 100, 1, -6) - user << "\blue Scanned [target]." + user << "Scanned [target]." saved_item = target.type saved_icon = target.icon saved_icon_state = target.icon_state saved_overlays = target.overlays + saved_underlays = target.underlays /obj/item/device/chameleon/proc/toggle() if(!can_use || !saved_item) return @@ -43,7 +45,7 @@ playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6) qdel(active_dummy) active_dummy = null - usr << "\blue You deactivate the [src]." + usr << "You deactivate the [src]." var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) T.icon = 'icons/effects/effects.dmi' flick("emppulse",T) @@ -53,9 +55,9 @@ var/obj/O = new saved_item(src) if(!O) return var/obj/effect/dummy/chameleon/C = new/obj/effect/dummy/chameleon(usr.loc) - C.activate(O, usr, saved_icon, saved_icon_state, saved_overlays, src) + C.activate(O, usr, saved_icon, saved_icon_state, saved_overlays, saved_underlays, src) qdel(O) - usr << "\blue You activate the [src]." + usr << "You activate the [src]." var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) T.icon = 'icons/effects/effects.dmi' flick("emppulse",T) @@ -89,12 +91,13 @@ var/can_move = 1 var/obj/item/device/chameleon/master = null -/obj/effect/dummy/chameleon/proc/activate(var/obj/O, var/mob/M, new_icon, new_iconstate, new_overlays, var/obj/item/device/chameleon/C) +/obj/effect/dummy/chameleon/proc/activate(var/obj/O, var/mob/M, new_icon, new_iconstate, new_overlays, new_underlays, var/obj/item/device/chameleon/C) name = O.name desc = O.desc icon = new_icon icon_state = new_iconstate overlays = new_overlays + underlays = new_underlays dir = O.dir M.loc = src master = C @@ -102,22 +105,22 @@ /obj/effect/dummy/chameleon/attackby() for(var/mob/M in src) - M << "\red Your chameleon-projector deactivates." + M << "Your chameleon-projector deactivates." master.disrupt() /obj/effect/dummy/chameleon/attack_hand() for(var/mob/M in src) - M << "\red Your chameleon-projector deactivates." + M << "Your chameleon-projector deactivates." master.disrupt() /obj/effect/dummy/chameleon/ex_act() for(var/mob/M in src) - M << "\red Your chameleon-projector deactivates." + M << "Your chameleon-projector deactivates." master.disrupt() /obj/effect/dummy/chameleon/bullet_act() for(var/mob/M in src) - M << "\red Your chameleon-projector deactivates." + M << "Your chameleon-projector deactivates." ..() master.disrupt() diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index df97a6ab825..c719a49a664 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -18,7 +18,7 @@ /obj/item/device/flash/proc/clown_check(mob/user) if(user && (CLUMSY in user.mutations) && prob(50)) - user << "\red [src] slips out of your hand." + user << "[src] slips out of your hand." user.drop_item() return 0 return 1 diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 7e2bc267764..503608f6663 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -127,7 +127,7 @@ if(9) src.overlays += "pai-what" /obj/item/device/paicard/proc/alertUpdate() - visible_message("[src] flashes a message across its screen, \"Additional personalities available for download.\"", 3, "\blue [src] bleeps electronically.", 2) + visible_message("[src] flashes a message across its screen, \"Additional personalities available for download.\"", 3, "[src] bleeps electronically.", 2) /obj/item/device/paicard/emp_act(severity) if(pai) diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 28f9936054a..a8e111e3097 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -6,7 +6,7 @@ var/code = "electronic" origin_tech = "bluespace=1" -/obj/item/device/radio/beacon/hear_talk() +/obj/item/device/radio/beacon/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) return diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 324d941cffc..c765eff2eb3 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -275,13 +275,16 @@ src.syndie = 1 - for (var/ch_name in channels) + for(var/ch_name in channels) + //this is the most hilarious piece of code i have seen this week, so im not going to remove it + /* if(!radio_controller) sleep(30) // Waiting for the radio_controller to be created. if(!radio_controller) src.name = "broken radio headset" return + */ - secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT) + secure_radio_connections[ch_name] = add_radio(src, radiochannels[ch_name]) return diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 3e49179e76f..1397c2d1575 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -5,7 +5,6 @@ anchored = 1 w_class = 4.0 canhear_range = 2 - flags = CONDUCT var/number = 0 var/anyai = 1 var/mob/living/silicon/ai/ai = list() @@ -51,8 +50,8 @@ return canhear_range -/obj/item/device/radio/intercom/hear_talk(mob/M as mob, msg) - if(!src.anyai && !(M in src.ai)) +/obj/item/device/radio/intercom/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + if(!anyai && !(speaker in ai)) return ..() diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 8dca2985541..9ab97b5cb93 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -16,6 +16,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use var/canhear_range = 3 // the range which mobs can hear this radio from var/obj/item/device/radio/patch_link = null var/datum/wires/radio/wires = null + var/list/secure_radio_connections var/prison_radio = 0 var/b_stat = 0 var/broadcasting = 0 @@ -27,8 +28,9 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use var/maxf = 1499 var/emped = 0 //Highjacked to track the number of consecutive EMPs on the radio, allowing consecutive EMP's to stack properly. // "Example" = FREQ_LISTENING|FREQ_BROADCASTING - flags = CONDUCT + flags = CONDUCT | HEAR slot_flags = SLOT_BELT + languages = HUMAN | ROBOT throw_speed = 3 throw_range = 7 w_class = 2 @@ -39,14 +41,9 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use var/const/FREQ_LISTENING = 1 //FREQ_BROADCASTING = 2 -/obj/item/device/radio - var/datum/radio_frequency/radio_connection - var/list/datum/radio_frequency/secure_radio_connections - - proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT) +/obj/item/device/radio/proc/set_frequency(new_frequency) + remove_radio(src, frequency) + frequency = add_radio(src, new_frequency) /obj/item/device/radio/New() wires = new(src) @@ -57,6 +54,8 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use if(radio_controller) initialize() +/obj/item/device/radio/Destroy() + remove_radio_all(src) //Just to be sure. /obj/item/device/radio/MouseDrop(obj/over_object as obj, src_location, over_location) var/mob/M = usr @@ -66,7 +65,6 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use /obj/item/device/radio/initialize() - if(freerange) if(frequency < 1200 || frequency > 1600) frequency = sanitize_frequency(frequency, maxf) @@ -78,7 +76,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use set_frequency(frequency) for (var/ch_name in channels) - secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT) + secure_radio_connections[ch_name] = add_radio(src, radiochannels[ch_name]) /obj/item/device/radio/attack_self(mob/user as mob) @@ -202,8 +200,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use /obj/item/device/radio/proc/isWireCut(var/index) return wires.IsIndexCut(index) -/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel) - +/obj/item/device/radio/talk_into(atom/movable/M, message, channel) if(!on) return // the device has to be on // Fix for permacell radios, but kinda eh about actually fixing them. if(!M || !message) return @@ -216,395 +213,190 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use if(!M.IsVocal()) return - if(GLOBAL_RADIO_TYPE == 1) // NEW RADIO SYSTEMS: By Doohl + /* Quick introduction: + This new radio system uses a very robust FTL signaling technology unoriginally + dubbed "subspace" which is somewhat similar to 'blue-space' but can't + actually transmit large mass. Headsets are the only radio devices capable + of sending subspace transmissions to the Communications Satellite. - /* Quick introduction: - This new radio system uses a very robust FTL signaling technology unoriginally - dubbed "subspace" which is somewhat similar to 'blue-space' but can't - actually transmit large mass. Headsets are the only radio devices capable - of sending subspace transmissions to the Communications Satellite. + A headset sends a signal to a subspace listener/reciever elsewhere in space, + the signal gets processed and logged, and an audible transmission gets sent + to each individual headset. + */ + + /* + be prepared to disregard any comments in all of tcomms code. i tried my best to keep them somewhat up-to-date, but eh + */ - A headset sends a signal to a subspace listener/reciever elsewhere in space, - the signal gets processed and logged, and an audible transmission gets sent - to each individual headset. - */ - - //#### Grab the connection datum ####// - var/datum/radio_frequency/connection = null - if(channel && channels && channels.len > 0) - if (channel == "department") - //world << "DEBUG: channel=\"[channel]\" switching to \"[channels[1]]\"" - channel = channels[1] - connection = secure_radio_connections[channel] - if (!channels[channel]) // if the channel is turned off, don't broadcast - return - else - connection = radio_connection - channel = null - if (!istype(connection)) - return - if (!connection) + //get the frequency you buttface. radios no longer use the radio_controller. confusing for future generations, convenient for me. + var/freq + if(channel && channels && channels.len > 0) + if (channel == "department") + channel = channels[1] + freq = secure_radio_connections[channel] + if (!channels[channel]) // if the channel is turned off, don't broadcast return + else + freq = frequency + channel = null - var/turf/position = get_turf(src) + var/turf/position = get_turf(src) - //#### Tagging the signal with all appropriate identity values ####// + //#### Tagging the signal with all appropriate identity values ####// - // ||-- The mob's name identity --|| - var/displayname = M.name // grab the display name (name you get when you hover over someone's icon) - var/real_name = M.real_name // mob's real name - var/mobkey = "none" // player key associated with mob - var/voicemask = 0 // the speaker is wearing a voice mask - if(M.client) - mobkey = M.key // assign the mob's key + // ||-- The mob's name identity --|| + var/displayname = M.name // grab the display name (name you get when you hover over someone's icon) + var/real_name = M.name // mob's real name + var/mobkey = "none" // player key associated with mob + var/voicemask = 0 // the speaker is wearing a voice mask + var/voice = M.GetVoice() // Why reinvent the wheel when there is a proc that does nice things already + if(ismob(M)) + var/mob/speaker = M + real_name = speaker.real_name + if(speaker.client) + mobkey = speaker.key // assign the mob's key - var/jobname // the mob's "job" + var/jobname // the mob's "job" - // --- Human: use their job as seen on the crew manifest - makes it unneeded to carry an ID for an AI to see their job - if (ishuman(M)) - var/voice = M.GetVoice() // Why reinvent the wheel when there is a proc that does nice things already - var/datum/data/record/findjob = find_record("name", voice, data_core.general) + // --- Human: use their job as seen on the crew manifest - makes it unneeded to carry an ID for an AI to see their job + if (ishuman(M)) + var/datum/data/record/findjob = find_record("name", voice, data_core.general) - if(voice != real_name) - displayname = voice - voicemask = 1 - if(findjob) - jobname = findjob.fields["rank"] - else - jobname = "Unknown" - - // --- Carbon Nonhuman --- - else if (iscarbon(M)) // Nonhuman carbon mob - jobname = "No id" - - // --- AI --- - else if (isAI(M)) - jobname = "AI" - - // --- Cyborg --- - else if (isrobot(M)) - var/mob/living/silicon/robot/B = M - jobname = "[B.designation] Cyborg" - - // --- Personal AI (pAI) --- - else if (istype(M, /mob/living/silicon/pai)) - jobname = "Personal AI" - - // --- Unidentifiable mob --- + if(voice != real_name) + displayname = voice + voicemask = 1 + if(findjob) + jobname = findjob.fields["rank"] else jobname = "Unknown" + // --- Carbon Nonhuman --- + else if (iscarbon(M)) // Nonhuman carbon mob + jobname = "No id" + // --- AI --- + else if (isAI(M)) + jobname = "AI" - /* ###### Radio headsets can only broadcast through subspace ###### */ + // --- Cyborg --- + else if (isrobot(M)) + var/mob/living/silicon/robot/B = M + jobname = "[B.designation] Cyborg" - if(subspace_transmission) - // First, we want to generate a new radio signal - var/datum/signal/signal = new - signal.transmission_method = 2 // 2 would be a subspace transmission. - // transmission_method could probably be enumerated through #define. Would be neater. + // --- Personal AI (pAI) --- + else if (istype(M, /mob/living/silicon/pai)) + jobname = "Personal AI" - // --- Finally, tag the actual signal with the appropriate values --- - signal.data = list( - // Identity-associated tags: - "mob" = M, // store a reference to the mob - "mobtype" = M.type, // the mob's type - "realname" = real_name, // the mob's real name - "name" = displayname, // the mob's display name - "job" = jobname, // the mob's job - "key" = mobkey, // the mob's key - "vmessage" = M.voice_message, // the message to display if the voice wasn't understood - "vname" = M.voice_name, // the name to display if the voice wasn't understood - "vmask" = voicemask, // 1 if the mob is using a voice gas mask + // --- Cold, emotionless machines. --- + else if(isobj(M)) + jobname = "Machine" - // We store things that would otherwise be kept in the actual mob - // so that they can be logged even AFTER the mob is deleted or something - - // Other tags: - "compression" = rand(45,50), // compressed radio signal - "message" = message, // the actual sent message - "connection" = connection, // the radio connection to use - "radio" = src, // stores the radio used for transmission - "slow" = 0, // how much to sleep() before broadcasting - simulates net lag - "traffic" = 0, // dictates the total traffic sum that the signal went through - "type" = 0, // determines what type of radio input it is: normal broadcast - "server" = null, // the last server to log this signal - "reject" = 0, // if nonzero, the signal will not be accepted by any broadcasting machinery - "level" = position.z // The source's z level - ) - signal.frequency = connection.frequency // Quick frequency set - - //#### Sending the signal to all subspace receivers ####// - - for(var/obj/machinery/telecomms/receiver/R in telecomms_list) - R.receive_signal(signal) - - // Allinone can act as receivers. - for(var/obj/machinery/telecomms/allinone/R in telecomms_list) - R.receive_signal(signal) - - // Receiving code can be located in Telecommunications.dm - return - - - /* ###### Intercoms and station-bounced radios ###### */ - - var/filter_type = 2 - - /* --- Intercoms can only broadcast to other intercoms, but bounced radios can broadcast to bounced radios and intercoms --- */ - if(istype(src, /obj/item/device/radio/intercom)) - filter_type = 1 + // --- Unidentifiable mob --- + else + jobname = "Unknown" + /* ###### Radio headsets can only broadcast through subspace ###### */ + if(subspace_transmission) + // First, we want to generate a new radio signal var/datum/signal/signal = new - signal.transmission_method = 2 - - - /* --- Try to send a normal subspace broadcast first */ - + signal.transmission_method = 2 // 2 would be a subspace transmission. + // transmission_method could probably be enumerated through #define. Would be neater. + // --- Finally, tag the actual signal with the appropriate values --- signal.data = list( - + // Identity-associated tags: "mob" = M, // store a reference to the mob "mobtype" = M.type, // the mob's type "realname" = real_name, // the mob's real name - "name" = displayname, // the mob's display name + "name" = voice, // the mob's display name "job" = jobname, // the mob's job "key" = mobkey, // the mob's key - "vmessage" = M.voice_message, // the message to display if the voice wasn't understood - "vname" = M.voice_name, // the name to display if the voice wasn't understood - "vmask" = voicemask, // 1 if the mob is using a voice gas mas + "vmask" = voicemask, // 1 if the mob is using a voice gas mask - "compression" = 0, // uncompressed radio signal + // We store things that would otherwise be kept in the actual mob + // so that they can be logged even AFTER the mob is deleted or something + + // Other tags: + "compression" = rand(35,65), // compressed radio signal "message" = message, // the actual sent message - "connection" = connection, // the radio connection to use "radio" = src, // stores the radio used for transmission - "slow" = 0, - "traffic" = 0, - "type" = 0, - "server" = null, - "reject" = 0, - "level" = position.z - ) - signal.frequency = connection.frequency // Quick frequency set + "slow" = 0, // how much to sleep() before broadcasting - simulates net lag + "traffic" = 0, // dictates the total traffic sum that the signal went through + "type" = 0, // determines what type of radio input it is: normal broadcast + "server" = null, // the last server to log this signal + "reject" = 0, // if nonzero, the signal will not be accepted by any broadcasting machinery + "level" = position.z, // The source's z level + "languages" = M.languages //The languages M is talking in. + ) + signal.frequency = freq + + //#### Sending the signal to all subspace receivers ####// for(var/obj/machinery/telecomms/receiver/R in telecomms_list) R.receive_signal(signal) + // Allinone can act as receivers. + for(var/obj/machinery/telecomms/allinone/R in telecomms_list) + R.receive_signal(signal) - sleep(rand(10,25)) // wait a little... + // Receiving code can be located in Telecommunications.dm + return + + + /* ###### Intercoms and station-bounced radios ###### */ + + var/filter_type = 2 + + var/datum/signal/signal = new + signal.transmission_method = 2 + + + /* --- Try to send a normal subspace broadcast first */ + + signal.data = list( + "mob" = M, // store a reference to the mob + "mobtype" = M.type, // the mob's type + "realname" = real_name, // the mob's real name + "name" = displayname, // the mob's display name + "job" = jobname, // the mob's job + "key" = mobkey, // the mob's key + "vmask" = voicemask, // 1 if the mob is using a voice gas mas + + "compression" = 0, // uncompressed radio signal + "message" = message, // the actual sent message + "radio" = src, // stores the radio used for transmission + "slow" = 0, + "traffic" = 0, + "type" = 0, + "server" = null, + "reject" = 0, + "level" = position.z + ) + signal.frequency = text2num(freq) // Quick frequency set + for(var/obj/machinery/telecomms/receiver/R in telecomms_list) + R.receive_signal(signal) + + + spawn(20) // wait a little... if(signal.data["done"] && position.z in signal.data["level"]) // we're done here. return - // Oh my god; the comms are down or something because the signal hasn't been broadcasted yet in our level. - // Send a mundane broadcast with limited targets: + // Oh my god; the comms are down or something because the signal hasn't been broadcasted yet in our level. + // Send a mundane broadcast with limited targets: + Broadcast_Message(M, voicemask, + src, message, displayname, jobname, real_name, + filter_type, signal.data["compression"], list(position.z), freq) - //THIS IS TEMPORARY. - if(!connection) return //~Carn - - Broadcast_Message(connection, M, voicemask, M.voice_message, - src, message, displayname, jobname, real_name, M.voice_name, - filter_type, signal.data["compression"], list(position.z), connection.frequency) - - - - else // OLD RADIO SYSTEMS: By Goons? - - var/datum/radio_frequency/connection = null - if(channel && channels && channels.len > 0) - if (channel == "department") - //world << "DEBUG: channel=\"[channel]\" switching to \"[channels[1]]\"" - channel = channels[1] - connection = secure_radio_connections[channel] - else - connection = radio_connection - channel = null - if (!istype(connection)) - return - var/display_freq = connection.frequency - - //world << "DEBUG: used channel=\"[channel]\" frequency= \"[display_freq]\" connection.devices.len = [connection.devices.len]" - - var/eqjobname - - if (ishuman(M)) - eqjobname = M:get_assignment() - else if (iscarbon(M)) - eqjobname = "No id" //only humans can wear ID - else if (isAI(M)) - eqjobname = "AI" - else if (isrobot(M)) - eqjobname = "Cyborg"//Androids don't really describe these too well, in my opinion. - else if (istype(M, /mob/living/silicon/pai)) - eqjobname = "Personal AI" - else - eqjobname = "Unknown" - - if (isWireCut(WIRE_TRANSMIT)) - return - - var/list/receive = list() - - //for (var/obj/item/device/radio/R in radio_connection.devices) - for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) - //if(R.accept_rad(src, message)) - receive |= R.send_hear(display_freq, 0) - - //world << "DEBUG: receive.len=[receive.len]" - var/list/heard_masked = list() // masked name or no real name - var/list/heard_normal = list() // normal message - var/list/heard_voice = list() // voice message - var/list/heard_garbled = list() // garbled message - - for (var/mob/R in receive) - if (R.client && !(R.client.prefs.toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. - continue - if (R.say_understands(M)) - if (ishuman(M) && M.GetVoice() != M.real_name) - heard_masked += R - else - heard_normal += R - else - if (M.voice_message) - heard_voice += R - else - heard_garbled += R - - if (length(heard_masked) || length(heard_normal) || length(heard_voice) || length(heard_garbled)) - var/part_a = "" - //var/part_b = " \icon[src]\[[format_frequency(frequency)]\] " - var/freq_text - switch(display_freq) - if(SYND_FREQ) - freq_text = "#unkn" - if(COMM_FREQ) - freq_text = "Command" - if(SCI_FREQ) - freq_text = "Science" - if(MED_FREQ) - freq_text = "Medical" - if(ENG_FREQ) - freq_text = "Engineering" - if(SEC_FREQ) - freq_text = "Security" - if(SERV_FREQ) - freq_text = "Service" - if(SUPP_FREQ) - freq_text = "Supply" - if(AIPRIV_FREQ) - freq_text = "AI Private" - //There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO - - if(!freq_text) - freq_text = format_frequency(display_freq) - - var/part_b = " \[[freq_text]\] " - var/part_c = "" - - if (display_freq==SYND_FREQ) - part_a = "" - else if (display_freq==COMM_FREQ) - part_a = "" - else if (display_freq==SCI_FREQ) - part_a = "" - else if (display_freq==MED_FREQ) - part_a = "" - else if (display_freq==ENG_FREQ) - part_a = "" - else if (display_freq==SEC_FREQ) - part_a = "" - else if (display_freq==SERV_FREQ) - part_a = "" - else if (display_freq==SUPP_FREQ) - part_a = "" - else if (display_freq==DSQUAD_FREQ) - part_a = "" - else if (display_freq==AIPRIV_FREQ) - part_a = "" - var/quotedmsg = M.say_quote(message) - - //This following recording is intended for research and feedback in the use of department radio channels. - - var/part_blackbox_b = " \[[freq_text]\] " - var/blackbox_msg = "[part_a][M.name][part_blackbox_b][quotedmsg][part_c]" - //var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]" - if(istype(blackbox)) - //BR.messages_admin += blackbox_admin_msg - switch(display_freq) - if(1459) - blackbox.msg_common += blackbox_msg - if(1351) - blackbox.msg_science += blackbox_msg - if(1353) - blackbox.msg_command += blackbox_msg - if(1355) - blackbox.msg_medical += blackbox_msg - if(1357) - blackbox.msg_engineering += blackbox_msg - if(1359) - blackbox.msg_security += blackbox_msg - if(1441) - blackbox.msg_deathsquad += blackbox_msg - if(1213) - blackbox.msg_syndicate += blackbox_msg - if(1349) - blackbox.msg_service += blackbox_msg - if(1347) - blackbox.msg_cargo += blackbox_msg - else - blackbox.messages += blackbox_msg - - //End of research and feedback code. - - if (length(heard_masked)) - var/N = M.name - var/J = eqjobname - if(ishuman(M) && M.GetVoice() != M.real_name) - N = M.GetVoice() - J = "Unknown" - var/rendered = "[part_a][N][part_b][quotedmsg][part_c]" - for (var/mob/R in heard_masked) - if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][N] ([J]) [part_b][quotedmsg][part_c]", 2) - else - R.show_message(rendered, 2) - - if (length(heard_normal)) - var/rendered = "[part_a][M.real_name][part_b][quotedmsg][part_c]" - - for (var/mob/R in heard_normal) - if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][M.real_name] ([eqjobname]) [part_b][quotedmsg][part_c]", 2) - else - R.show_message(rendered, 2) - - if (length(heard_voice)) - var/rendered = "[part_a][M.voice_name][part_b][M.voice_message][part_c]" - - for (var/mob/R in heard_voice) - if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][M.voice_name] ([eqjobname]) [part_b][M.voice_message][part_c]", 2) - else - R.show_message(rendered, 2) - - if (length(heard_garbled)) - quotedmsg = M.say_quote(stars(message)) - var/rendered = "[part_a][M.voice_name][part_b][quotedmsg][part_c]" - - for (var/mob/R in heard_voice) - if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][M.voice_name][part_b][quotedmsg][part_c]", 2) - else - R.show_message(rendered, 2) - -/obj/item/device/radio/hear_talk(mob/M as mob, msg) - - if (broadcasting) - if(get_dist(src, M) <= canhear_range) - talk_into(M, msg) +/obj/item/device/radio/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + if(radio_freq) + return + if(broadcasting) + if(get_dist(src, speaker) <= canhear_range) + talk_into(speaker, raw_message) /* /obj/item/device/radio/proc/accept_rad(obj/item/device/radio/R as obj, message) @@ -632,21 +424,21 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use if(!position || !(position.z in level)) return -1 if(freq == SYND_FREQ) - if(!(src.syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys + if(!(src.syndie)) //Checks to see if it's allowed on that frequency, based on the encryption keys return -1 if (!on) return -1 - if (!freq) //recieved on main frequency + if (!freq) //received on main frequency if (!listening) return -1 else var/accept = (freq==frequency && listening) if (!accept) - for (var/ch_name in channels) - var/datum/radio_frequency/RF = secure_radio_connections[ch_name] - if (RF.frequency==freq && (channels[ch_name]&FREQ_LISTENING)) - accept = 1 - break + for(var/ch_name in channels) + if(channels[ch_name] & FREQ_LISTENING) + if(radiochannels[ch_name] == text2num(freq) || syndie) //the radiochannels list is located in communications.dm + accept = 1 + break if (!accept) return -1 return canhear_range @@ -655,7 +447,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use var/range = receive_range(freq, level) if(range > -1) - return get_mobs_in_view(canhear_range, src) + return get_hearers_in_view(canhear_range, src) /obj/item/device/radio/examine() @@ -664,9 +456,9 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use ..() if ((in_range(src, usr) || loc == usr)) if (b_stat) - usr.show_message("\blue \the [src] can be attached and modified!") + usr.show_message("\the [src] can be attached and modified!") else - usr.show_message("\blue \the [src] can not be modified or attached!") + usr.show_message("\the [src] can not be modified or attached!") return /obj/item/device/radio/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -677,9 +469,9 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use b_stat = !( b_stat ) if(!istype(src, /obj/item/device/radio/beacon)) if (b_stat) - user.show_message("\blue The radio can now be attached and modified!") + user.show_message("The radio can now be attached and modified!") else - user.show_message("\blue The radio can no longer be modified or attached!") + user.show_message("The radio can no longer be modified or attached!") updateDialog() //Foreach goto(83) add_fingerprint(user) @@ -781,7 +573,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use src.name = "broken radio" return - secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT) + secure_radio_connections[ch_name] = add_radio(src, radiochannels[ch_name]) return diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 200c0a0a855..3945db0dd83 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -4,7 +4,9 @@ icon_state = "taperecorder_empty" item_state = "analyzer" w_class = 2 + flags = HEAR slot_flags = SLOT_BELT + languages = ALL //this is a translator, after all. m_amt = 60 g_amt = 30 force = 2 @@ -89,23 +91,10 @@ icon_state = "taperecorder_idle" -/obj/item/device/taperecorder/hear_talk(mob/living/M as mob, msg) +/obj/item/device/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) if(mytape && recording) - var/ending = copytext(msg, length(msg)) mytape.timestamp += mytape.used_capacity - if(M.stuttering) - mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] stammers, \"[msg]\"" - return - if(M.getBrainLoss() >= 60) - mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] gibbers, \"[msg]\"" - return - if(ending == "?") - mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] asks, \"[msg]\"" - return - else if(ending == "!") - mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] exclaims, \"[msg]\"" - return - mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] says, \"[msg]\"" + mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [message]" /obj/item/device/taperecorder/verb/record() @@ -194,19 +183,16 @@ break if(mytape.storedinfo.len < i) break - var/turf/T = get_turf(src) - T.visible_message("Tape Recorder: [mytape.storedinfo[i]]") + say(mytape.storedinfo[i]) if(mytape.storedinfo.len < i + 1) playsleepseconds = 1 sleep(10) - T = get_turf(src) - T.visible_message("Tape Recorder: End of recording.") + say("End of recording.") else playsleepseconds = mytape.timestamp[i + 1] - mytape.timestamp[i] if(playsleepseconds > 14) sleep(10) - T = get_turf(src) - T.visible_message("Tape Recorder: Skipping [playsleepseconds] seconds of silence") + say("Skipping [playsleepseconds] seconds of silence") playsleepseconds = 1 i++ @@ -299,4 +285,4 @@ //Random colour tapes /obj/item/device/tape/random/New() - icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]" \ No newline at end of file + icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]" diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index eb5a33d17d3..0aef25a67fd 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -34,7 +34,7 @@ effective or pretty fucking useless. /obj/item/device/batterer/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) if(!user) return if(times_used >= max_uses) - user << "\red The mind batterer has been burnt out!" + user << "The mind batterer has been burnt out!" return add_logs(user, null, "knocked down people in the area", admin=0, object="[src]") @@ -46,13 +46,13 @@ effective or pretty fucking useless. M.Weaken(rand(10,20)) if(prob(25)) M.Stun(rand(5,10)) - M << "\red You feel a tremendous, paralyzing wave flood your mind." + M << "You feel a tremendous, paralyzing wave flood your mind." else - M << "\red You feel a sudden, electric jolt travel through your head." + M << "You feel a sudden, electric jolt travel through your head." playsound(src.loc, 'sound/misc/interference.ogg', 50, 1) - user << "\blue You trigger [src]." + user << "You trigger [src]." times_used += 1 if(times_used >= max_uses) icon_state = "battererburnt" diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 4126181ea89..64951705275 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -64,11 +64,6 @@ if(!attached_device) return attached_device.HasProximity(AM) return -/obj/item/device/transfer_valve/hear_talk(mob/living/M, msg) - if(!attached_device) return - attached_device.hear_talk(M, msg) - return - /obj/item/device/transfer_valve/attack_self(mob/user as mob) user.set_machine(src) var/dat = {" Valve properties: diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 5a66365263b..4a56ab7b1f8 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -20,7 +20,8 @@ for(var/mob/O in viewers(M, null)) if (O.client) - O.show_message("\red [user] has prodded [M] with an electrically-charged arm!", 1, "\red You hear someone fall", 2) + O.show_message("[user] has prodded [M] with an electrically-charged arm!", 1, + " You hear someone fall", 2) add_logs(user, M, "stunned", object="[src.name]", addition="(INTENT: [uppertext(user.a_intent)])") /obj/item/borg/overdrive diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index f88936e66d9..98040a52653 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -152,9 +152,9 @@ src.chest = W src.updateicon() else if(!W:wires) - user << "\blue You need to attach wires to it first!" + user << "You need to attach wires to it first!" else - user << "\blue You need to attach a cell to it first!" + user << "You need to attach a cell to it first!" if(istype(W, /obj/item/robot_parts/head)) if(src.head) return @@ -164,7 +164,7 @@ src.head = W src.updateicon() else - user << "\blue You need to attach a flash to it first!" + user << "You need to attach a flash to it first!" if (istype(W, /obj/item/device/multitool)) if(check_completion()) @@ -176,10 +176,10 @@ var/obj/item/device/mmi/M = W if(check_completion()) if(!istype(loc,/turf)) - user << "\red You can't put the MMI in, the frame has to be standing on the ground to be perfectly precise." + user << "You can't put the MMI in, the frame has to be standing on the ground to be perfectly precise." return if(!M.brainmob) - user << "\red Sticking an empty MMI into the frame would sort of defeat the purpose." + user << "Sticking an empty MMI into the frame would sort of defeat the purpose." return if(!M.brainmob.key) var/ghost_can_reenter = 0 @@ -193,15 +193,15 @@ return if(M.brainmob.stat == DEAD) - user << "\red Sticking a dead brain into the frame would sort of defeat the purpose." + user << "Sticking a dead brain into the frame would sort of defeat the purpose." return if(M.brainmob.mind in ticker.mode.head_revolutionaries) - user << "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the MMI." + user << "The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the MMI." return if(jobban_isbanned(M.brainmob, "Cyborg")) - user << "\red This MMI does not seem to fit." + user << "This MMI does not seem to fit." return var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc)) @@ -225,7 +225,7 @@ O.lawupdate = 0 O.make_laws() if(ticker.mode.config_tag == "malfunction") //Don't let humans get a cyborg on their side during malf, for balance reasons. - O.set_zeroth_law("\red ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK#*�&110010") + O.set_zeroth_law("ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK#*�&110010") M.brainmob.mind.transfer_to(O) @@ -308,13 +308,13 @@ ..() if(istype(W, /obj/item/weapon/stock_parts/cell)) if(src.cell) - user << "\blue You have already inserted a cell!" + user << "You have already inserted a cell!" return else user.drop_item() W.loc = src src.cell = W - user << "\blue You insert the cell!" + user << "You insert the cell!" if(istype(W, /obj/item/stack/cable_coil)) if(src.wires) user << "You have already inserted wire." @@ -332,10 +332,10 @@ if(istype(W, /obj/item/device/flash)) var/obj/item/device/flash/F = W if(src.flash1 && src.flash2) - user << "\blue You have already inserted the eyes!" + user << "You have already inserted the eyes!" return else if(F.broken) - user << "\blue You can't use a broken flash!" + user << "You can't use a broken flash!" return else user.drop_item() @@ -344,6 +344,6 @@ src.flash2 = F else src.flash1 = F - user << "\blue You insert the flash into the eye socket!" + user << "You insert the flash into the eye socket!" return diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 9765eacd19e..8d974017521 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -97,7 +97,7 @@ if(hp <= 0) for(var/mob/O in oviewers()) if ((O.client && !( O.blinded ))) - O << "\red [src] breaks into tiny pieces and collapses!" + O << "[src] breaks into tiny pieces and collapses!" qdel(src) // Create a temporary object to represent the damage diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 3c5ba610865..b203f1f3bdd 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -18,24 +18,24 @@ t_him = "him" else if (M.gender == FEMALE) t_him = "her" - user << "\red \The [M] is dead, you cannot help [t_him]!" + user << "\The [M] is dead, you cannot help [t_him]!" return if (!istype(M)) - user << "\red \The [src] cannot be applied to [M]!" + user << "\The [src] cannot be applied to [M]!" return 1 if ( ! (istype(user, /mob/living/carbon/human) || \ istype(user, /mob/living/silicon) || \ istype(user, /mob/living/carbon/monkey)) ) - user << "\red You don't have the dexterity to do this!" + user << "You don't have the dexterity to do this!" return 1 if (user) if (M != user) user.visible_message( \ - "\blue [M] has been applied with [src] by [user].", \ - "\blue You apply \the [src] to [M]." \ + "[M] has been applied with [src] by [user].", \ + "You apply \the [src] to [M]." \ ) else var/t_himself = "itself" @@ -45,8 +45,8 @@ t_himself = "herself" user.visible_message( \ - "\blue [M] applied [src] on [t_himself].", \ - "\blue You apply \the [src] on yourself." \ + "[M] applied [src] on [t_himself].", \ + "You apply \the [src] on yourself." \ ) if (istype(M, /mob/living/carbon/human)) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index ac5c1cbca99..4264f29e542 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -20,14 +20,14 @@ var/obj/item/weapon/weldingtool/WT = W if(get_amount() < 2) - user << "\red You need at least two rods to do this." + user << "You need at least two rods to do this." return if(WT.remove_fuel(0,user)) var/obj/item/stack/sheet/metal/new_item = new(usr.loc) new_item.add_to_stacks(usr) for (var/mob/M in viewers(src)) - M.show_message("\red [src] is shaped into metal by [user.name] with the weldingtool.", 3, "\red You hear welding.", 2) + M.show_message("[src] is shaped into metal by [user.name] with the weldingtool.", 3, "You hear welding.", 2) var/obj/item/stack/rods/R = src src = null var/replace = (user.get_inactive_hand()==R) @@ -55,13 +55,13 @@ return 1 else if(get_amount() < 2) - user << "\blue You need at least two rods to do this." + user << "You need at least two rods to do this." return - usr << "\blue Assembling grille..." + usr << "Assembling grille..." if (!do_after(usr, 10)) return var/obj/structure/grille/F = new /obj/structure/grille/ ( usr.loc ) - usr << "\blue You assemble a grille" + usr << "You assemble a grille." F.add_fingerprint(usr) use(2) return diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 1e3e9157602..fabece80e32 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -60,7 +60,7 @@ if(!user || !src) return 0 if(!istype(user.loc,/turf)) return 0 if(!user.IsAdvancedToolUser()) - user << "\red You don't have the dexterity to do this!" + user << "You don't have the dexterity to do this!" return 0 var/title = "Sheet-Glass" title += " ([src.get_amount()] sheet\s left)" @@ -74,11 +74,11 @@ for (var/obj/structure/window/win in user.loc) i++ if(i >= 4) - user << "\red There are too many windows in this location." + user << "There are too many windows in this location." return 1 directions-=win.dir if(!(win.ini_dir in cardinal)) - user << "\red Can't let you do that." + user << "Can't let you do that." return 1 //Determine the direction. It will first check in the direction the person making the window is facing, if it finds an already made window it will try looking at the next cardinal direction, etc. @@ -104,10 +104,10 @@ if(!src) return 1 if(src.loc != user) return 1 if(src.get_amount() < 2) - user << "\red You need more glass to do that." + user << "You need more glass to do that." return 1 if(locate(/obj/structure/window) in user.loc) - user << "\red There is a window in the way." + user << "There is a window in the way." return 1 var/obj/structure/window/W W = new /obj/structure/window/basic( user.loc, 0 ) @@ -160,7 +160,7 @@ if(!user || !src) return 0 if(!istype(user.loc,/turf)) return 0 if(!user.IsAdvancedToolUser()) - user << "\red You don't have the dexterity to do this!" + user << "You don't have the dexterity to do this!" return 0 var/title = "Sheet Reinf. Glass" title += " ([src.get_amount()] sheet\s left)" @@ -173,11 +173,11 @@ for (var/obj/structure/window/win in user.loc) i++ if(i >= 4) - user << "\red There are too many windows in this location." + user << "There are too many windows in this location." return 1 directions-=win.dir if(!(win.ini_dir in cardinal)) - user << "\red Can't let you do that." + user << "Can't let you do that." return 1 //Determine the direction. It will first check in the direction the person making the window is facing, if it finds an already made window it will try looking at the next cardinal direction, etc. diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 66f22c5cc58..9c5b5e4d3c0 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -97,9 +97,9 @@ istype(W, /obj/item/weapon/hatchet) ) //visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message) - usr.visible_message("\blue \the [usr] starts cutting hair off \the [src]", "\blue You start cutting the hair off \the [src]", "You hear the sound of a knife rubbing against flesh") + usr.visible_message("\the [usr] starts cutting hair off \the [src]", "You start cutting the hair off \the [src]", "You hear the sound of a knife rubbing against flesh") if(do_after(user,50)) - usr << "\blue You cut the hair from this [src.singular_name]" + usr << "You cut the hair from this [src.singular_name]" //Try locating an exisitng stack on the tile and add to there if possible for(var/obj/item/stack/sheet/hairlesshide/HS in usr.loc) if(HS.amount < 50) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 2630ca27570..80fc7c2ec0b 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -121,18 +121,18 @@ if (!multiplier) multiplier = 1 if (src.get_amount() < R.req_amount*multiplier) if (R.req_amount*multiplier>1) - usr << "\red You haven't got enough [src] to build \the [R.req_amount*multiplier] [R.title]\s!" + usr << "You haven't got enough [src] to build \the [R.req_amount*multiplier] [R.title]\s!" else - usr << "\red You haven't got enough [src] to build \the [R.title]!" + usr << "You haven't got enough [src] to build \the [R.title]!" return if (R.one_per_turf && (locate(R.result_type) in usr.loc)) - usr << "\red There is another [R.title] here!" + usr << "There is another [R.title] here!" return if (R.on_floor && !istype(usr.loc, /turf/simulated/floor)) - usr << "\red \The [R.title] must be constructed on the floor!" + usr << "\The [R.title] must be constructed on the floor!" return if (R.time) - usr << "\blue Building [R.title] ..." + usr << "Building [R.title] ..." if (!do_after(usr, R.time)) return if (src.get_amount() < R.req_amount*multiplier) diff --git a/code/game/objects/items/stacks/tiles/plasteel.dm b/code/game/objects/items/stacks/tiles/plasteel.dm index adf2e4f7257..a76a3e35da4 100644 --- a/code/game/objects/items/stacks/tiles/plasteel.dm +++ b/code/game/objects/items/stacks/tiles/plasteel.dm @@ -30,14 +30,14 @@ var/obj/item/weapon/weldingtool/WT = W if(get_amount() < 4) - user << "\red You need at least four tiles to do this." + user << "You need at least four tiles to do this." return if(WT.remove_fuel(0,user)) var/obj/item/stack/sheet/metal/new_item = new(usr.loc) new_item.add_to_stacks(usr) for (var/mob/M in viewers(src)) - M.show_message("\red [src] is shaped into metal by [user.name] with the weldingtool.", 3, "\red You hear welding.", 2) + M.show_message("[src] is shaped into metal by [user.name] with the weldingtool.", 3, "You hear welding.", 2) var/obj/item/stack/rods/R = src src = null var/replace = (user.get_inactive_hand()==R) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 62ab7c68790..2553ebd372b 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -41,7 +41,7 @@ if(!proximity) return if (istype(A, /obj/structure/reagent_dispensers/watertank) && get_dist(src,A) <= 1) A.reagents.trans_to(src, 10) - user << "\blue You fill the balloon with the contents of [A]." + user << "You fill the balloon with the contents of [A]." src.desc = "A translucent balloon with some form of liquid sloshing around in it." src.update_icon() return @@ -58,14 +58,14 @@ qdel(src) else src.desc = "A translucent balloon with some form of liquid sloshing around in it." - user << "\blue You fill the balloon with the contents of [O]." + user << "You fill the balloon with the contents of [O]." O.reagents.trans_to(src, 10) src.update_icon() return /obj/item/toy/balloon/throw_impact(atom/hit_atom) if(src.reagents.total_volume >= 1) - src.visible_message("\red The [src] bursts!","You hear a pop and a splash.") + src.visible_message("The [src] bursts!","You hear a pop and a splash.") src.reagents.reaction(get_turf(hit_atom)) for(var/atom/A in get_turf(hit_atom)) src.reagents.reaction(A) @@ -132,17 +132,17 @@ if (istype(A, /obj/item/toy/ammo/gun)) if (src.bullets >= 7) - user << "\blue It's already fully loaded!" + user << "It's already fully loaded!" return 1 if (A.amount_left <= 0) - user << "\red There are no more caps!" + user << "There are no more caps!" return 1 if (A.amount_left < (7 - src.bullets)) src.bullets += A.amount_left - user << text("\red You reload [] cap\s!", A.amount_left) + user << text("You reload [] cap\s!", A.amount_left) A.amount_left = 0 else - user << text("\red You reload [] cap\s!", 7 - src.bullets) + user << text("You reload [] cap\s!", 7 - src.bullets) A.amount_left -= 7 - src.bullets src.bullets = 7 A.update_icon() @@ -153,16 +153,18 @@ if (flag) return if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "\red You don't have the dexterity to do this!" + usr << "You don't have the dexterity to do this!" return src.add_fingerprint(user) if (src.bullets < 1) - user.show_message("\red *click* *click*", 2) + user.show_message("*click*", 2) + playsound(user, 'sound/weapons/empty.ogg', 100, 1) return playsound(user, 'sound/weapons/Gunshot.ogg', 100, 1) src.bullets-- for(var/mob/O in viewers(user, null)) - O.show_message(text("\red [] fires the [src] at []!", user, target), 1, "\red You hear a gunshot", 2) + O.show_message(text("[user] fires [src] at [target]!"), 1, + " You hear a gunshot.", 2) /obj/item/toy/ammo/gun name = "ammo-caps" @@ -197,7 +199,7 @@ set src in view(2) ..() if (bullets) - usr << "\blue It is loaded with [bullets] foam darts!" + usr << "It is loaded with [bullets] foam darts!" /obj/item/toy/crossbow/attackby(obj/item/I as obj, mob/user as mob) if(istype(I, /obj/item/toy/ammo/crossbow)) @@ -205,9 +207,9 @@ user.drop_item() qdel(I) bullets++ - user << "\blue You load the foam dart into the crossbow." + user << "You load the foam dart into the crossbow." else - usr << "\red It's already fully loaded." + usr << "It's already fully loaded." /obj/item/toy/crossbow/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag) @@ -233,7 +235,7 @@ if(!istype(M,/mob/living)) continue if(M == user) continue for(var/mob/O in viewers(world.view, D)) - O.show_message(text("\red [] was hit by the foam dart!", M), 1) + O.show_message(text("[] was hit by the foam dart!", M), 1) new /obj/item/toy/ammo/crossbow(M.loc) qdel(D) return @@ -255,7 +257,7 @@ else if (bullets == 0) user.Weaken(5) for(var/mob/O in viewers(world.view, user)) - O.show_message(text("\red [] realized they were out of ammo and starting scrounging for some!", user), 1) + O.show_message(text("[] realized they were out of ammo and starting scrounging for some!", user), 1) /obj/item/toy/crossbow/attack(mob/M as mob, mob/user as mob) @@ -267,15 +269,15 @@ for(var/mob/O in viewers(M, null)) if(O.client) - O.show_message(text("\red [] casually lines up a shot with []'s head and pulls the trigger!", user, M), 1, "\red You hear the sound of foam against skull", 2) - O.show_message(text("\red [] was hit in the head by the foam dart!", M), 1) + O.show_message(text("[] casually lines up a shot with []'s head and pulls the trigger!", user, M), 1, "You hear the sound of foam against skull.", 2) + O.show_message(text("[] was hit in the head by the foam dart!", M), 1) playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1) new /obj/item/toy/ammo/crossbow(M.loc) src.bullets-- else if (M.lying && src.bullets == 0) for(var/mob/O in viewers(M, null)) - if (O.client) O.show_message(text("\red [] casually lines up a shot with []'s head, pulls the trigger, then realizes they are out of ammo and drops to the floor in search of some!", user, M), 1, "\red You hear someone fall", 2) + if (O.client) O.show_message(text("[] casually lines up a shot with []'s head, pulls the trigger, then realizes they are out of ammo and drops to the floor in search of some!", user, M), 1, "You hear someone fall", 2) user.Weaken(5) return @@ -313,7 +315,7 @@ /obj/item/toy/sword/attack_self(mob/user as mob) active = !( active ) if (active) - user << "\blue You extend the plastic blade with a quick flick of your wrist." + user << "You extend the plastic blade with a quick flick of your wrist." playsound(user, 'sound/weapons/saberon.ogg', 20, 1) if(hacked) icon_state = "swordrainbow" @@ -323,7 +325,7 @@ item_state = "swordblue" w_class = 4 else - user << "\blue You push the plastic blade back down into the handle." + user << "You push the plastic blade back down into the handle." playsound(user, 'sound/weapons/saberoff.ogg', 20, 1) icon_state = "sword0" item_state = "sword0" @@ -448,13 +450,13 @@ if((ishuman(H))) //i guess carp and shit shouldn't set them off var/mob/living/carbon/M = H if(M.m_intent == "run") - M << "\red You step on the snap pop!" + M << "You step on the snap pop!" var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(2, 0, src) s.start() new /obj/effect/decal/cleanable/ash(src.loc) - src.visible_message("\red The [src.name] explodes!","\red You hear a snap!") + src.visible_message("The [src.name] explodes!","You hear a snap!") playsound(src, 'sound/effects/snap.ogg', 50, 1) qdel(src) @@ -553,7 +555,7 @@ var/message = generate_ion_law() user << "You press the button on [src]." playsound(user, 'sound/machines/click.ogg', 20, 1) - src.loc.visible_message("\red \icon[src] [message]") + src.loc.visible_message("\icon[src] [message]") cooldown = 1 spawn(30) cooldown = 0 return diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index e056c275a20..29e4534a1fe 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -142,7 +142,7 @@ update_label("John Doe", "Clowny") src.access |= I.access if(istype(user, /mob/living) && user.mind) if(user.mind.special_role) - usr << "\blue The card's microscanners activate as you pass it over the ID, copying its access." + usr << "The card's microscanners activate as you pass it over the ID, copying its access." /obj/item/weapon/card/id/syndicate/attack_self(mob/user as mob) @@ -161,7 +161,7 @@ update_label("John Doe", "Clowny") return src.assignment = u update_label() - user << "\blue You successfully forge the ID card." + user << "You successfully forge the ID card." else ..() diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index bf09d24a89f..ffc7b60fe2f 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -54,7 +54,7 @@ /obj/item/weapon/soap/attack(mob/target as mob, mob/user as mob) if(target && user && ishuman(target) && ishuman(user) && !target.stat && !user.stat && user.zone_sel &&user.zone_sel.selecting == "mouth" ) - user.visible_message("\red \the [user] washes \the [target]'s mouth out with soap!") + user.visible_message("\the [user] washes \the [target]'s mouth out with soap!") return ..() diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 37245f065f0..74e2371756d 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -33,7 +33,7 @@ if(fields["SE"]) M.dna.struc_enzymes = merge_text(M.dna.struc_enzymes, fields["SE"]) if(ishuman(M) && (deconstruct_block(getblock(M.dna.struc_enzymes, RACEBLOCK), BAD_MUTATION_DIFFICULTY) == BAD_MUTATION_DIFFICULTY)) //check for monkeying people. - message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] \red(MONKEY)") + message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] (MONKEY)") log_msg += " (MONKEY)" domutcheck(M, null,(type != /obj/item/weapon/dnainjector)) //admin-spawnable-injectors always work log_attack(log_msg) diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 1417d8da2a8..0059be158c8 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -70,7 +70,7 @@ if (ismob(target)) add_logs(user, target, "planted [name] on") - user.visible_message("\red [user.name] finished planting an explosive on [target.name]!") + user.visible_message("[user.name] finished planting an explosive on [target.name]!") message_admins("[key_name(user, user.client)](?) planted C4 on [key_name(target)](?) with [timer] second fuse",0,1) log_game("[key_name(user)] planted C4 on [key_name(target)] with [timer] second fuse") diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 8713c39b2ce..3b8180c78f8 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -55,13 +55,13 @@ if( istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(src,target) <= 1) var/obj/o = target o.reagents.trans_to(src, max_water) - user << "\blue \The [src] is now refilled" + user << "\The [src] is now refilled" playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) return if (!safety) if (src.reagents.total_volume < 1) - usr << "\red \The [src] is empty." + usr << "\The [src] is empty." return if (world.time < src.last_use + 20) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 39cdf599d33..7d8a694085b 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -154,12 +154,6 @@ if(nadeassembly) nadeassembly.on_found(finder) -/obj/item/weapon/grenade/chem_grenade/hear_talk(mob/living/M, msg) - if(nadeassembly) - nadeassembly.hear_talk(M, msg) - - - /obj/item/weapon/grenade/chem_grenade/prime() if(stage != READY) return diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 90ef0b0b540..424029867d7 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -107,10 +107,10 @@ /obj/machinery/implantchair/put_mob(mob/living/carbon/M as mob) if(!iscarbon(M)) - usr << "\red The [src.name] cannot hold this!" + usr << "The [src.name] cannot hold this!" return if(src.occupant) - usr << "\red The [src.name] is already occupied!" + usr << "The [src.name] is already occupied!" return if(M.client) M.client.perspective = EYE_PERSPECTIVE @@ -131,7 +131,7 @@ if(!imp) continue if(istype(imp, /obj/item/weapon/implant/loyalty)) for (var/mob/O in viewers(M, null)) - O.show_message("\red [M] has been implanted by the [src.name].", 1) + O.show_message("[M] has been implanted by the [src.name].", 1) if(imp.implanted(M)) imp.loc = M diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implantfreedom.dm index 879faa9f2bd..fdf63866f6b 100644 --- a/code/game/objects/items/weapons/implants/implantfreedom.dm +++ b/code/game/objects/items/weapons/implants/implantfreedom.dm @@ -5,7 +5,7 @@ desc = "Use this to escape from those evil Red Shirts." item_color = "r" var/activation_emote = "chuckle" - var/uses = 1.0 + var/uses = 4.0 /obj/item/weapon/implant/freedom/New() diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index cbb3ac81efa..783e5c833a9 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -59,11 +59,11 @@ if (src.icon_state == "forkloaded") //This is a poor way of handling it, but a proper rewrite of the fork to allow for a more varied foodening can happen when I'm in the mood. --NEO if(M == user) for(var/mob/O in viewers(M, null)) - O.show_message(text("\blue [] eats a delicious forkful of omelette!", user), 1) + O.show_message(text("[] eats a delicious forkful of omelette!", user), 1) M.reagents.add_reagent("nutriment", 1) else for(var/mob/O in viewers(M, null)) - O.show_message(text("\blue [] feeds [] a delicious forkful of omelette!", user, M), 1) + O.show_message(text("[] feeds [] a delicious forkful of omelette!", user, M), 1) M.reagents.add_reagent("nutriment", 1) src.icon_state = "fork" return diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 27cae71883b..ce066c0501e 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -163,7 +163,7 @@ name = "energy blade" desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal." icon_state = "blade" - force = 70.0//Normal attacks deal very high damage. + force = 30 //Normal attacks deal esword damage hitsound = 'sound/weapons/blade1.ogg' throwforce = 1//Throwing or dropping the item deletes it. throw_speed = 3 diff --git a/code/game/objects/items/weapons/singularityhammer.dm b/code/game/objects/items/weapons/singularityhammer.dm index a5cceb0170c..c0773df5a01 100644 --- a/code/game/objects/items/weapons/singularityhammer.dm +++ b/code/game/objects/items/weapons/singularityhammer.dm @@ -90,9 +90,9 @@ s.set_up(5, 1, target.loc) s.start() target.take_organ_damage(0,30) - target.visible_message("\red [target.name] was shocked by the [src.name]!", \ - "\red You feel a powerful shock course through your body sending you flying!", \ - "\red You hear a heavy electrical crack") + target.visible_message("[target.name] was shocked by the [src.name]!", \ + "You feel a powerful shock course through your body sending you flying!", \ + "You hear a heavy electrical crack.") var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src))) target.throw_at(throw_target, 200, 4) return diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 070a026488c..bce56df922d 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -41,11 +41,11 @@ /obj/item/weapon/storage/backpack/holding/attackby(obj/item/weapon/W as obj, mob/user as mob) if(crit_fail) - user << "\red The Bluespace generator isn't working." + user << "The Bluespace generator isn't working." return if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail) investigate_log("has become a singularity. Caused by [user.key]","singulo") - user << "\red The Bluespace interfaces of the two devices catastrophically malfunction!" + user << "The Bluespace interfaces of the two devices catastrophically malfunction!" qdel(W) var/obj/machinery/singularity/singulo = new /obj/machinery/singularity (get_turf(src)) singulo.energy = 300 //should make it a bit bigger~ @@ -58,9 +58,9 @@ /obj/item/weapon/storage/backpack/holding/proc/failcheck(mob/user as mob) if (prob(src.reliability)) return 1 //No failure if (prob(src.reliability)) - user << "\red The Bluespace portal resists your attempt to add another item." //light failure + user << "The Bluespace portal resists your attempt to add another item." //light failure else - user << "\red The Bluespace generator malfunctions!" + user << "The Bluespace generator malfunctions!" for (var/obj/O in src.contents) //it broke, delete what was in it qdel(O) crit_fail = 1 diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 2def6f3c4c5..6100e836582 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -137,7 +137,7 @@ current += S.amount if(capacity == current)//If it's full, you're done if(!stop_messages) - usr << "\red The snatcher is full." + usr << "The snatcher is full." return 0 return 1 diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm index fbb71c3c486..3becca92514 100644 --- a/code/game/objects/items/weapons/storage/book.dm +++ b/code/game/objects/items/weapons/storage/book.dm @@ -53,15 +53,15 @@ add_logs(user, M, "attacked", object="[src.name]") if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - user << "\red You don't have the dexterity to do this!" + user << "You don't have the dexterity to do this!" return if(!chaplain) - user << "\red The book sizzles in your hands." + user << "The book sizzles in your hands." user.take_organ_damage(0,10) return if ((CLUMSY in user.mutations) && prob(50)) - user << "\red The [src] slips out of your hand and hits your head." + user << "The [src] slips out of your hand and hits your head." user.take_organ_damage(10) user.Paralyse(20) return @@ -71,7 +71,7 @@ if (M.stat !=2) if(M.mind && (M.mind.assigned_role == "Chaplain")) - user << "\red You can't heal yourself!" + user << "You can't heal yourself!" return /*if((M.mind in ticker.mode.cult) && (prob(20))) M << "\red The power of [src.deity_name] clears your mind of heresy!" @@ -86,8 +86,8 @@ if(affecting.status == ORGAN_ORGANIC) if(message_halt == 0) for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] heals [] with the power of [src.deity_name]!", user, M), 1) - M << "\red May the power of [src.deity_name] compel you to be healed!" + O.show_message(text("[] heals [] with the power of [src.deity_name]!", user, M), 1) + M << "May the power of [src.deity_name] compel you to be healed!" playsound(src.loc, "punch", 25, 1, -1) message_halt = 1 else @@ -100,31 +100,31 @@ else if(ishuman(M) && !istype(M:head, /obj/item/clothing/head/helmet)) M.adjustBrainLoss(10) - M << "\red You feel dumber." + M << "You feel dumber." for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] beats [] over the head with []!", user, M, src), 1) + O.show_message(text("[user] beats [M] over the head with [src]!"), 1) playsound(src.loc, "punch", 25, 1, -1) else if(M.stat == 2) for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] smacks []'s lifeless corpse with [].", user, M, src), 1) + O.show_message(text("[user] smacks [M]'s lifeless corpse with [src]."), 1) playsound(src.loc, "punch", 25, 1, -1) return /obj/item/weapon/storage/book/bible/afterattack(atom/A, mob/user as mob, proximity) if(!proximity) return if (istype(A, /turf/simulated/floor)) - user << "\blue You hit the floor with the bible." + user << "You hit the floor with the bible." if(user.mind && (user.mind.assigned_role == "Chaplain")) call(/obj/effect/rune/proc/revealrunes)(src) if(user.mind && (user.mind.assigned_role == "Chaplain")) if(A.reagents && A.reagents.has_reagent("water")) //blesses all the water in the holder - user << "\blue You bless [A]." + user << "You bless [A]." var/water2holy = A.reagents.get_reagent_amount("water") A.reagents.del_reagent("water") A.reagents.add_reagent("holywater",water2holy) if(A.reagents && A.reagents.has_reagent("unholywater")) //yeah yeah, copy pasted code - sue me - user << "\blue You purify [A]." + user << " You purify [A]." var/unholy2clean = A.reagents.get_reagent_amount("unholywater") A.reagents.del_reagent("unholywater") A.reagents.add_reagent("cleaner",unholy2clean) //it cleans their soul, get it? I'll get my coat... diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 8d2513a2dd3..4507b1e0bb5 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -72,7 +72,7 @@ /obj/item/weapon/storage/box/gloves name = "box of latex gloves" - desc = "Contains white gloves." + desc = "Contains sterile latex gloves." icon_state = "latex" /obj/item/weapon/storage/box/gloves/New() @@ -87,7 +87,7 @@ /obj/item/weapon/storage/box/masks name = "box of sterile masks" - desc = "This box contains masks of sterility." + desc = "This box contains sterile medical masks." icon_state = "sterile" /obj/item/weapon/storage/box/masks/New() @@ -537,4 +537,4 @@ new /obj/item/clothing/tie/armband/deputy(src) new /obj/item/clothing/tie/armband/deputy(src) new /obj/item/clothing/tie/armband/deputy(src) - new /obj/item/clothing/tie/armband/deputy(src) \ No newline at end of file + new /obj/item/clothing/tie/armband/deputy(src) diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index e1895f2928a..30e44e3425b 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -20,20 +20,20 @@ /obj/item/weapon/storage/lockbox/attackby(obj/item/weapon/W as obj, mob/user as mob) if (W.GetID()) if(src.broken) - user << "\red It appears to be broken." + user << "It appears to be broken." return if(src.allowed(user)) src.locked = !( src.locked ) if(src.locked) src.icon_state = src.icon_locked - user << "\red You lock the [src.name]!" + user << "You lock the [src.name]!" return else src.icon_state = src.icon_closed - user << "\red You unlock the [src.name]!" + user << "You unlock the [src.name]!" return else - user << "\red Access Denied." + user << "Access Denied." return else if((istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && !src.broken) broken = 1 @@ -47,21 +47,21 @@ playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) playsound(src.loc, "sparks", 50, 1) for(var/mob/O in viewers(user, 3)) - O.show_message(text("\blue \The [src] has been sliced open by [] with an energy blade!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2) + O.show_message(text("\The [src] has been sliced open by [] with an energy blade!", user), 1, text("You hear metal being sliced and sparks flying."), 2) return else for(var/mob/O in viewers(user, 3)) - O.show_message(text("\blue \The [src] has been broken by [] with an electromagnetic card!", user), 1, text("You hear a faint electrical spark."), 2) + O.show_message(text("\The [src] has been broken by [] with an electromagnetic card!", user), 1, text("You hear a faint electrical spark."), 2) return if(!locked) ..() else - user << "\red It's locked!" + user << "It's locked!" return /obj/item/weapon/storage/lockbox/show_to(mob/user as mob) if(locked) - user << "\red It's locked!" + user << "It's locked!" else ..() return diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 27e7f8deeb1..7db2d68d5de 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -55,21 +55,21 @@ if (istype(W, /obj/item/weapon/screwdriver)) if (do_after(user, 20)) src.open =! src.open - user.show_message(text("\blue You [] the service panel.", (src.open ? "open" : "close"))) + user.show_message(text("You [] the service panel.", (src.open ? "open" : "close"))) return if ((istype(W, /obj/item/device/multitool)) && (src.open == 1)&& (!src.l_hacking)) - user.show_message(text("\red Now attempting to reset internal memory, please hold."), 1) + user.show_message(text("Now attempting to reset internal memory, please hold."), 1) src.l_hacking = 1 if (do_after(usr, 100)) if (prob(40)) src.l_setshort = 1 src.l_set = 0 - user.show_message(text("\red Internal memory reset. Please give it a few seconds to reinitialize."), 1) + user.show_message(text("Internal memory reset. Please give it a few seconds to reinitialize."), 1) sleep(80) src.l_setshort = 0 src.l_hacking = 0 else - user.show_message(text("\red Unable to reset internal memory."), 1) + user.show_message(text("Unable to reset internal memory."), 1) src.l_hacking = 0 else src.l_hacking = 0 return @@ -166,7 +166,7 @@ /obj/item/weapon/storage/secure/briefcase/attack_hand(mob/user as mob) if ((src.loc == user) && (src.locked == 1)) - usr << "\red [src] is locked and cannot be opened!" + usr << "[src] is locked and cannot be opened!" else if ((src.loc == user) && (!src.locked)) playsound(src.loc, "rustle", 50, 1, -5) if (user.s_active) diff --git a/code/game/objects/items/weapons/table_rack_parts.dm b/code/game/objects/items/weapons/table_rack_parts.dm index d8cbe11c631..ecea8326990 100644 --- a/code/game/objects/items/weapons/table_rack_parts.dm +++ b/code/game/objects/items/weapons/table_rack_parts.dm @@ -17,7 +17,7 @@ new /obj/item/stack/sheet/metal( user.loc ) //SN src = null qdel(src) - if (istype(W, /obj/item/stack/rods)) + if (istype(W, /obj/item/stack/rods)) var/obj/item/stack/rods/V = W if (V.use(4)) new /obj/item/weapon/table_parts/reinforced( user.loc ) @@ -25,12 +25,13 @@ qdel(src) else user << "You need four rods to reinforce table parts." - return + return /obj/item/weapon/table_parts/attack_self(mob/user as mob) user << "Constructing table.." if (do_after(user, construct_delay)) - new table_type( user.loc ) + var/obj/new_table = new table_type( user.loc ) + new_table.add_fingerprint(user) user.drop_item() qdel(src) return @@ -93,4 +94,4 @@ R.add_fingerprint(user) user.drop_item() qdel(src) - return + return diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index bd0bf77b013..56f1cc49056 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -27,7 +27,7 @@ set src in usr ..() if(air_contents.oxygen < 10) - usr << text("\red The meter on the [src.name] indicates you are almost out of air!") + usr << text("The meter on the [src.name] indicates you are almost out of air!") playsound(usr, 'sound/effects/alert.ogg', 50, 1) @@ -73,7 +73,7 @@ set src in usr ..() if(air_contents.oxygen < 1 && loc==usr) - usr << "\red The meter on the [src.name] indicates you are almost out of air!" + usr << "The meter on the [src.name] indicates you are almost out of air!" usr << sound('sound/effects/alert.ogg') /obj/item/weapon/tank/air/New() @@ -143,7 +143,7 @@ set src in usr ..() if(air_contents.oxygen < 0.2 && loc==usr) - usr << text("\red The meter on the [src.name] indicates you are almost out of air!") + usr << text("The meter on the [src.name] indicates you are almost out of air!") usr << sound('sound/effects/alert.ogg') /obj/item/weapon/tank/emergency_oxygen/engi diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 9c1e150c3e2..cdb07a9e566 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -42,7 +42,7 @@ if (istype(src.loc, /obj/item/assembly)) icon = src.loc if (!in_range(src, usr)) - if (icon == src) usr << "\blue If you want any more information you'll need to get closer." + if (icon == src) usr << "If you want any more information you'll need to get closer." return var/celsius_temperature = src.air_contents.temperature-T0C @@ -61,7 +61,7 @@ else descriptive = "furiously hot" - usr << "\blue It feels [descriptive]" + usr << "It feels [descriptive]" return @@ -131,17 +131,17 @@ if(location.internal == src) location.internal = null location.internals.icon_state = "internal0" - usr << "\blue You close the tank release valve." + usr << "You close the tank release valve." if (location.internals) location.internals.icon_state = "internal0" else if(location.wear_mask && (location.wear_mask.flags & MASKINTERNALS)) location.internal = src - usr << "\blue You open \the [src] valve." + usr << "You open \the [src] valve." if (location.internals) location.internals.icon_state = "internal1" else - usr << "\blue You need something to connect to \the [src]." + usr << "You need something to connect to \the [src]." src.add_fingerprint(usr) /* diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 6449a0ee712..f497312f5d7 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -222,9 +222,7 @@ message_admins("[key_name_admin(user)] triggered a fueltank explosion.") log_game("[key_name(user)] triggered a fueltank explosion.") user << "That was stupid of you." - explosion(O.loc, -1, 0, 2, flame_range = 2) - if(O) - qdel(O) + O.ex_act() return if(welding) @@ -421,16 +419,16 @@ */ /obj/item/weapon/crowbar - name = "crowbar" - desc = "Used to hit floors" + name = "pocket crowbar" + desc = "A small crowbar. This handy tool is useful for lots of things, such as prying floor tiles or opening unpowered doors." icon = 'icons/obj/items.dmi' icon_state = "crowbar" flags = CONDUCT slot_flags = SLOT_BELT - force = 5.0 - throwforce = 7.0 + force = 5 + throwforce = 7 item_state = "crowbar" - w_class = 2.0 + w_class = 2 m_amt = 50 origin_tech = "engineering=1" attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked") @@ -439,3 +437,13 @@ icon = 'icons/obj/items.dmi' icon_state = "red_crowbar" item_state = "crowbar_red" + +/obj/item/weapon/crowbar/large + name = "crowbar" + desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big." + force = 12 + w_class = 3 + throw_speed = 3 + throw_range = 3 + m_amt = 66 + icon_state = "crowbar_large" \ No newline at end of file diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index dac4c8ba93b..f45a8b5766f 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -1,4 +1,5 @@ /obj + languages = HUMAN //var/datum/module/mod //not used var/m_amt = 0 // metal var/g_amt = 0 // glass @@ -126,18 +127,6 @@ /obj/proc/hide(h) return - -/obj/proc/hear_talk(mob/M as mob, text) -/* - var/mob/mo = locate(/mob) in src - if(mo) - var/rendered = "[M.name]: [text]" - mo.show_message(rendered, 2) - */ - return - - - //If a mob logouts/logins in side of an object you can use this proc /obj/proc/on_log() ..() diff --git a/code/game/objects/structures/crates_lockers/bins.dm b/code/game/objects/structures/crates_lockers/bins.dm index 5f0e04a3325..d18db0702c4 100644 --- a/code/game/objects/structures/crates_lockers/bins.dm +++ b/code/game/objects/structures/crates_lockers/bins.dm @@ -32,7 +32,7 @@ /obj/structure/closet/crate/bin/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/storage/bag/trash)) var/obj/item/weapon/storage/bag/trash/T = W - user << "\blue You fill the bag." + user << "You fill the bag." for(var/obj/item/O in src) if(T.can_be_inserted(O, 1)) O.loc = T diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 29725327057..1ce6e22f988 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -151,7 +151,7 @@ /obj/structure/closet/attack_animal(mob/living/simple_animal/user as mob) if(user.environment_smash) - visible_message("\red [user] destroys the [src]. ") + visible_message("[user] destroys the [src].") for(var/atom/movable/A as mob|obj in src) A.loc = src.loc qdel(src) @@ -182,14 +182,13 @@ user << "You begin cutting the [src] apart..." playsound(loc, 'sound/items/Welder2.ogg', 40, 1) if(do_after(user,40,5,1)) - if(!WT.remove_fuel(0,user)) - user << "You need more welding fuel to complete this task." - return - playsound(loc, 'sound/items/welder.ogg', 50, 1) - new /obj/item/stack/sheet/metal(src.loc) - for(var/mob/M in viewers(src)) - M.show_message("\The [src] has been cut apart by [user] with \the [WT].", 3, "You hear welding.", 2) - qdel(src) + if(src.opened) + if(WT.remove_fuel(0,user)) + playsound(loc, 'sound/items/welder.ogg', 50, 1) + new /obj/item/stack/sheet/metal(src.loc) + for(var/mob/M in viewers(src)) + M.show_message("\The [src] has been cut apart by [user] with \the [WT].", 3, "You hear welding.", 2) + qdel(src) return if(isrobot(user)) @@ -205,14 +204,13 @@ user << "You begin [welded ? "unwelding":"welding"] the [src]..." playsound(loc, 'sound/items/Welder2.ogg', 40, 1) if(do_after(user,40,5,1)) - if(WT.remove_fuel(0,user)) - playsound(loc, 'sound/items/welder.ogg', 50, 1) - welded = !welded - user << "You [welded ? "welded the [src] shut":"unwelded the [src]"]" - update_icon() - user.visible_message("[src] has been [welded? "welded shut":"unwelded"] by [user.name].") - else - user << "You need more welding fuel to complete this task." + if(!src.opened) + if(WT.remove_fuel(0,user)) + playsound(loc, 'sound/items/welder.ogg', 50, 1) + welded = !welded + user << "You [welded ? "welded the [src] shut":"unwelded the [src]"]" + update_icon() + user.visible_message("[src] has been [welded? "welded shut":"unwelded"] by [user.name].") return else if(!place(user, W)) src.attack_hand(user) diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index b285494aeaf..4efc8c6292e 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -14,81 +14,57 @@ locked = 1 var/smashed = 0 - attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri - //..() //That's very useful, Erro +/obj/structure/closet/fireaxecabinet/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri + //..() //That's very useful, Erro - var/hasaxe = 0 //gonna come in handy later~ - if(fireaxe) - hasaxe = 1 + var/hasaxe = 0 //gonna come in handy later~ + if(fireaxe) + hasaxe = 1 - if (isrobot(usr) || src.locked) - if(istype(O, /obj/item/device/multitool)) - user << " Resetting circuitry..." - playsound(user, 'sound/machines/lockreset.ogg', 50, 1) - if(do_after(user, 20)) - src.locked = 0 - user << " You disable the locking modules." - update_icon() - return - else if(istype(O, /obj/item/weapon)) - user.changeNext_move(CLICK_CD_MELEE) - var/obj/item/weapon/W = O - if(src.smashed || src.localopened) - if(localopened) - localopened = 0 - icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - return - else - playsound(user, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time - if(W.force < 15) - user << " The cabinet's protective glass glances off the hit." - else - src.hitstaken++ - if(src.hitstaken == 4) - playsound(user, 'sound/effects/Glassbr3.ogg', 100, 1) //Break cabinet, receive goodies. Cabinet's fucked for life after that. - src.smashed = 1 - src.locked = 0 - src.localopened = 1 + if (isrobot(usr) || src.locked) + if(istype(O, /obj/item/device/multitool)) + user << " Resetting circuitry..." + playsound(user, 'sound/machines/lockreset.ogg', 50, 1) + if(do_after(user, 20)) + src.locked = 0 + user << " You disable the locking modules." update_icon() return - if (istype(O, /obj/item/weapon/twohanded/fireaxe) && src.localopened) - if(!fireaxe) - if(O:wielded) - user << " Unwield the axe first." - return - fireaxe = O - user.drop_item() - src.contents += O - user << " You place the fire axe back in the [src.name]." - update_icon() - else - if(src.smashed) - return - else - localopened = !localopened - if(localopened) - icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - if(src.smashed) - return - if(istype(O, /obj/item/device/multitool)) + else if(istype(O, /obj/item/weapon)) + user.changeNext_move(CLICK_CD_MELEE) + var/obj/item/weapon/W = O + if(src.smashed || src.localopened) if(localopened) localopened = 0 icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) spawn(10) update_icon() - return - else - user << " Resetting circuitry..." - playsound(user, 'sound/machines/lockenable.ogg', 50, 1) - if(do_after(user, 20)) - src.locked = 1 - user << " You re-enable the locking modules." - return + return + else + playsound(user, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time + if(W.force < 15) + user << " The cabinet's protective glass glances off the hit." + else + src.hitstaken++ + if(src.hitstaken == 4) + playsound(user, 'sound/effects/Glassbr3.ogg', 100, 1) //Break cabinet, receive goodies. Cabinet's fucked for life after that. + src.smashed = 1 + src.locked = 0 + src.localopened = 1 + update_icon() + return + if (istype(O, /obj/item/weapon/twohanded/fireaxe) && src.localopened) + if(!fireaxe) + if(O:wielded) + user << " Unwield the axe first." + return + fireaxe = O + user.drop_item() + src.contents += O + user << " You place the fire axe back in the [src.name]." + update_icon() + else + if(src.smashed) + return else localopened = !localopened if(localopened) @@ -97,112 +73,136 @@ else icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) spawn(10) update_icon() - - - - - attack_hand(mob/user as mob) - - var/hasaxe = 0 - if(fireaxe) - hasaxe = 1 - - if(src.locked) - user <<" The cabinet won't budge!" - return - if(localopened) - if(fireaxe) - user.put_in_hands(fireaxe) - fireaxe = null - user << " You take the fire axe from the [name]." - src.add_fingerprint(user) - update_icon() - else - if(src.smashed) - return - else - localopened = !localopened - if(localopened) - src.icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - - else - localopened = !localopened //I'm pretty sure we don't need an if(src.smashed) in here. In case I'm wrong and it fucks up teh cabinet, **MARKER**. -Agouri - if(localopened) - src.icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - - attack_tk(mob/user as mob) - if(localopened && fireaxe) - fireaxe.loc = loc - user << " You telekinetically remove the fire axe." - fireaxe = null - update_icon() - return - attack_hand(user) - - verb/toggle_openness() //nice name, huh? HUH?! -Erro //YEAH -Agouri - set name = "Open/Close" - set category = "Object" - - if (isrobot(usr) || src.locked || src.smashed) - if(src.locked) - usr << "\red The cabinet won't budge!" - else if(src.smashed) - usr << "\blue The protective glass is broken!" - return - - localopened = !localopened - update_icon() - - verb/remove_fire_axe() - set name = "Remove Fire Axe" - set category = "Object" - - if (isrobot(usr)) - return - - if (localopened) - if(fireaxe) - usr.put_in_hands(fireaxe) - fireaxe = null - usr << "\blue You take the Fire axe from the [name]." - else - usr << "\blue The [src.name] is empty." - else - usr << "\blue The [src.name] is closed." - update_icon() - - attack_paw(mob/user as mob) - attack_hand(user) - return - - attack_ai(mob/user as mob) + else if(src.smashed) - user << " The security of the cabinet is compromised." return - else - locked = !locked - if(locked) - user << " Cabinet locked." + if(istype(O, /obj/item/device/multitool)) + if(localopened) + localopened = 0 + icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) + spawn(10) update_icon() + return else - user << " Cabinet unlocked." - return + user << " Resetting circuitry..." + playsound(user, 'sound/machines/lockenable.ogg', 50, 1) + if(do_after(user, 20)) + src.locked = 1 + user << " You re-enable the locking modules." + return + else + localopened = !localopened + if(localopened) + icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed) + spawn(10) update_icon() + else + icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) + spawn(10) update_icon() - update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers - var/hasaxe = 0 + + + +/obj/structure/closet/fireaxecabinet/attack_hand(mob/user as mob) + + var/hasaxe = 0 + if(fireaxe) + hasaxe = 1 + + if(src.locked) + user <<" The cabinet won't budge!" + return + if(localopened) if(fireaxe) - hasaxe = 1 - icon_state = text("fireaxe[][][][]",hasaxe,src.localopened,src.hitstaken,src.smashed) + user.put_in_hands(fireaxe) + fireaxe = null + user << " You take the fire axe from the [name]." + src.add_fingerprint(user) + update_icon() + else + if(src.smashed) + return + else + localopened = !localopened + if(localopened) + src.icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed) + spawn(10) update_icon() + else + src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) + spawn(10) update_icon() - open() + else + localopened = !localopened //I'm pretty sure we don't need an if(src.smashed) in here. In case I'm wrong and it fucks up teh cabinet, **MARKER**. -Agouri + if(localopened) + src.icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed) + spawn(10) update_icon() + else + src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) + spawn(10) update_icon() + +/obj/structure/closet/fireaxecabinet/attack_tk(mob/user as mob) + if(localopened && fireaxe) + fireaxe.loc = loc + user << " You telekinetically remove the fire axe." + fireaxe = null + update_icon() + return + attack_hand(user) + +/obj/structure/closet/fireaxecabinet/verb/toggle_openness() //nice name, huh? HUH?! -Erro //YEAH -Agouri + set name = "Open/Close" + set category = "Object" + + if (isrobot(usr) || src.locked || src.smashed) + if(src.locked) + usr << "The cabinet won't budge!" + else if(src.smashed) + usr << "The protective glass is broken!" return - close() + localopened = !localopened + update_icon() + +/obj/structure/closet/fireaxecabinet/verb/remove_fire_axe() + set name = "Remove Fire Axe" + set category = "Object" + + if (isrobot(usr)) return + + if (localopened) + if(fireaxe) + usr.put_in_hands(fireaxe) + fireaxe = null + usr << "You take the Fire axe from the [name]." + else + usr << "The [src.name] is empty." + else + usr << "The [src.name] is closed." + update_icon() + +/obj/structure/closet/fireaxecabinet/attack_paw(mob/user as mob) + attack_hand(user) + return + +/obj/structure/closet/fireaxecabinet/attack_ai(mob/user as mob) + if(src.smashed) + user << " The security of the cabinet is compromised." + return + else + locked = !locked + if(locked) + user << " Cabinet locked." + else + user << " Cabinet unlocked." + return + +/obj/structure/closet/fireaxecabinet/update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers + var/hasaxe = 0 + if(fireaxe) + hasaxe = 1 + icon_state = text("fireaxe[][][][]",hasaxe,src.localopened,src.hitstaken,src.smashed) + +/obj/structure/closet/fireaxecabinet/open() + return + +/obj/structure/closet/fireaxecabinet/close() + return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm index fc45cbf0943..03ba70127cc 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm @@ -9,20 +9,20 @@ icon_off = "cabinetdetective_broken" - New() - ..() - sleep(2) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - return +/obj/structure/closet/secure_closet/bar/New() + ..() + sleep(2) + new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) + return /obj/structure/closet/secure_closet/bar/update_icon() if(broken) @@ -34,4 +34,4 @@ else icon_state = icon_closed else - icon_state = icon_opened \ No newline at end of file + icon_state = icon_opened diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index 28e73053299..1b0d70e24b4 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -8,16 +8,16 @@ icon_broken = "securecargobroken" icon_off = "securecargooff" - New() - ..() - sleep(2) - new /obj/item/clothing/under/rank/cargotech(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/device/radio/headset/headset_cargo(src) - new /obj/item/clothing/gloves/black(src) - new /obj/item/clothing/head/soft(src) -// new /obj/item/weapon/cartridge/quartermaster(src) - return +/obj/structure/closet/secure_closet/cargotech/New() + ..() + sleep(2) + new /obj/item/clothing/under/rank/cargotech(src) + new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/device/radio/headset/headset_cargo(src) + new /obj/item/clothing/gloves/fingerless(src) + new /obj/item/clothing/head/soft(src) +// new /obj/item/weapon/cartridge/quartermaster(src) + return /obj/structure/closet/secure_closet/quartermaster name = "\proper quartermaster's locker" @@ -29,17 +29,17 @@ icon_broken = "secureqmbroken" icon_off = "secureqmoff" - New() - ..() - sleep(2) - new /obj/item/clothing/under/rank/cargo(src) - new /obj/item/clothing/shoes/sneakers/brown(src) - new /obj/item/device/radio/headset/headset_cargo(src) - new /obj/item/clothing/gloves/black(src) -// new /obj/item/weapon/cartridge/quartermaster(src) - new /obj/item/clothing/suit/fire/firefighter(src) - new /obj/item/weapon/tank/emergency_oxygen(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/clothing/glasses/meson(src) - new /obj/item/clothing/head/soft(src) - return \ No newline at end of file +/obj/structure/closet/secure_closet/quartermaster/New() + ..() + sleep(2) + new /obj/item/clothing/under/rank/cargo(src) + new /obj/item/clothing/shoes/sneakers/brown(src) + new /obj/item/device/radio/headset/headset_cargo(src) + new /obj/item/clothing/gloves/fingerless(src) +// new /obj/item/weapon/cartridge/quartermaster(src) + new /obj/item/clothing/suit/fire/firefighter(src) + new /obj/item/weapon/tank/emergency_oxygen(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/glasses/meson(src) + new /obj/item/clothing/head/soft(src) + return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index a08dd717f8e..649111df7cf 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -9,28 +9,28 @@ icon_off = "secureceoff" - New() - ..() - sleep(2) - if(prob(50)) - new /obj/item/weapon/storage/backpack/industrial(src) - else - new /obj/item/weapon/storage/backpack/satchel_eng(src) - new /obj/item/blueprints(src) - new /obj/item/clothing/under/rank/chief_engineer(src) - new /obj/item/clothing/head/hardhat/white(src) - new /obj/item/clothing/head/welding(src) - new /obj/item/clothing/gloves/yellow(src) - new /obj/item/clothing/shoes/sneakers/brown(src) - new /obj/item/weapon/cartridge/ce(src) - new /obj/item/device/radio/headset/heads/ce(src) - new /obj/item/weapon/storage/toolbox/mechanical(src) - new /obj/item/clothing/suit/hazardvest(src) - new /obj/item/weapon/airlock_painter(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/device/multitool(src) - new /obj/item/device/flash(src) - return +/obj/structure/closet/secure_closet/engineering_chief/New() + ..() + sleep(2) + if(prob(50)) + new /obj/item/weapon/storage/backpack/industrial(src) + else + new /obj/item/weapon/storage/backpack/satchel_eng(src) + new /obj/item/blueprints(src) + new /obj/item/clothing/under/rank/chief_engineer(src) + new /obj/item/clothing/head/hardhat/white(src) + new /obj/item/clothing/head/welding(src) + new /obj/item/clothing/gloves/yellow(src) + new /obj/item/clothing/shoes/sneakers/brown(src) + new /obj/item/weapon/cartridge/ce(src) + new /obj/item/device/radio/headset/heads/ce(src) + new /obj/item/weapon/storage/toolbox/mechanical(src) + new /obj/item/clothing/suit/hazardvest(src) + new /obj/item/weapon/airlock_painter(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/device/multitool(src) + new /obj/item/device/flash(src) + return /obj/structure/closet/secure_closet/engineering_electrical name = "electrical supplies locker" @@ -43,21 +43,21 @@ icon_off = "secureengelecoff" - New() - ..() - sleep(2) - new /obj/item/clothing/gloves/yellow(src) - new /obj/item/clothing/gloves/yellow(src) - new /obj/item/weapon/storage/toolbox/electrical(src) - new /obj/item/weapon/storage/toolbox/electrical(src) - new /obj/item/weapon/storage/toolbox/electrical(src) - new /obj/item/weapon/module/power_control(src) - new /obj/item/weapon/module/power_control(src) - new /obj/item/weapon/module/power_control(src) - new /obj/item/device/multitool(src) - new /obj/item/device/multitool(src) - new /obj/item/device/multitool(src) - return +/obj/structure/closet/secure_closet/engineering_electrical/New() + ..() + sleep(2) + new /obj/item/clothing/gloves/yellow(src) + new /obj/item/clothing/gloves/yellow(src) + new /obj/item/weapon/storage/toolbox/electrical(src) + new /obj/item/weapon/storage/toolbox/electrical(src) + new /obj/item/weapon/storage/toolbox/electrical(src) + new /obj/item/weapon/module/power_control(src) + new /obj/item/weapon/module/power_control(src) + new /obj/item/weapon/module/power_control(src) + new /obj/item/device/multitool(src) + new /obj/item/device/multitool(src) + new /obj/item/device/multitool(src) + return @@ -72,16 +72,16 @@ icon_off = "secureengweldoff" - New() - ..() - sleep(2) - new /obj/item/clothing/head/welding(src) - new /obj/item/clothing/head/welding(src) - new /obj/item/clothing/head/welding(src) - new /obj/item/weapon/weldingtool/largetank(src) - new /obj/item/weapon/weldingtool/largetank(src) - new /obj/item/weapon/weldingtool/largetank(src) - return +/obj/structure/closet/secure_closet/engineering_welding/New() + ..() + sleep(2) + new /obj/item/clothing/head/welding(src) + new /obj/item/clothing/head/welding(src) + new /obj/item/clothing/head/welding(src) + new /obj/item/weapon/weldingtool/largetank(src) + new /obj/item/weapon/weldingtool/largetank(src) + new /obj/item/weapon/weldingtool/largetank(src) + return @@ -96,19 +96,19 @@ icon_off = "secureengoff" - New() - ..() - sleep(2) - if(prob(50)) - new /obj/item/weapon/storage/backpack/industrial(src) - else - new /obj/item/weapon/storage/backpack/satchel_eng(src) - new /obj/item/clothing/under/rank/engineer(src) - new /obj/item/clothing/shoes/sneakers/orange(src) - new /obj/item/weapon/storage/toolbox/mechanical(src) -// new /obj/item/weapon/cartridge/engineering(src) - new /obj/item/device/radio/headset/headset_eng(src) - new /obj/item/clothing/suit/hazardvest(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/clothing/glasses/meson(src) - return \ No newline at end of file +/obj/structure/closet/secure_closet/engineering_personal/New() + ..() + sleep(2) + if(prob(50)) + new /obj/item/weapon/storage/backpack/industrial(src) + else + new /obj/item/weapon/storage/backpack/satchel_eng(src) + new /obj/item/clothing/under/rank/engineer(src) + new /obj/item/clothing/shoes/sneakers/orange(src) + new /obj/item/weapon/storage/toolbox/mechanical(src) +// new /obj/item/weapon/cartridge/engineering(src) + new /obj/item/device/radio/headset/headset_eng(src) + new /obj/item/clothing/suit/hazardvest(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/glasses/meson(src) + return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index afe8aa8d83f..4a8b884fdc2 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -16,13 +16,13 @@ name = "kitchen Cabinet" req_access = list(access_kitchen) - New() - ..() - sleep(2) - for(var/i = 0, i < 3, i++) - new /obj/item/weapon/reagent_containers/food/drinks/flour(src) - new /obj/item/weapon/reagent_containers/food/condiment/sugar(src) - return +/obj/structure/closet/secure_closet/freezer/kitchen/New() + ..() + sleep(2) + for(var/i = 0, i < 3, i++) + new /obj/item/weapon/reagent_containers/food/drinks/flour(src) + new /obj/item/weapon/reagent_containers/food/condiment/sugar(src) + return /obj/structure/closet/secure_closet/freezer/kitchen/mining @@ -40,12 +40,12 @@ icon_off = "fridge1" - New() - ..() - sleep(2) - for(var/i = 0, i < 4, i++) - new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey(src) - return +/obj/structure/closet/secure_closet/freezer/meat/New() + ..() + sleep(2) + for(var/i = 0, i < 4, i++) + new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey(src) + return @@ -59,21 +59,22 @@ icon_off = "fridge1" - New() - ..() - sleep(2) - for(var/i = 0, i < 5, i++) - new /obj/item/weapon/reagent_containers/food/drinks/milk(src) - for(var/i = 0, i < 5, i++) - new /obj/item/weapon/reagent_containers/food/drinks/soymilk(src) - for(var/i = 0, i < 2, i++) - new /obj/item/weapon/storage/fancy/egg_box(src) - return +/obj/structure/closet/secure_closet/freezer/fridge/New() + ..() + sleep(2) + for(var/i = 0, i < 5, i++) + new /obj/item/weapon/reagent_containers/food/drinks/milk(src) + for(var/i = 0, i < 5, i++) + new /obj/item/weapon/reagent_containers/food/drinks/soymilk(src) + for(var/i = 0, i < 2, i++) + new /obj/item/weapon/storage/fancy/egg_box(src) + return /obj/structure/closet/secure_closet/freezer/money name = "freezer" + desc = "This contains cold hard cash." icon_state = "fridge1" icon_closed = "fridge" icon_locked = "fridge1" @@ -83,21 +84,13 @@ req_access = list(access_heads_vault) - New() - ..() - sleep(2) - for(var/i = 0, i < 3, i++) - new /obj/item/weapon/spacecash/c1000(src) - for(var/i = 0, i < 5, i++) - new /obj/item/weapon/spacecash/c500(src) - for(var/i = 0, i < 6, i++) - new /obj/item/weapon/spacecash/c200(src) - return - - - - - - - - +/obj/structure/closet/secure_closet/freezer/money/New() + ..() + sleep(2) + for(var/i = 0, i < 3, i++) + new /obj/item/weapon/spacecash/c1000(src) + for(var/i = 0, i < 5, i++) + new /obj/item/weapon/spacecash/c500(src) + for(var/i = 0, i < 6, i++) + new /obj/item/weapon/spacecash/c200(src) + return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 5416820a21e..64f10372f3f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -10,19 +10,19 @@ req_access = list(access_medical) - New() - ..() - sleep(2) - new /obj/item/weapon/storage/box/syringes(src) - new /obj/item/weapon/reagent_containers/dropper(src) - new /obj/item/weapon/reagent_containers/dropper(src) - new /obj/item/weapon/reagent_containers/glass/beaker(src) - new /obj/item/weapon/reagent_containers/glass/beaker(src) - new /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline(src) - new /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline(src) - new /obj/item/weapon/reagent_containers/glass/bottle/antitoxin(src) - new /obj/item/weapon/reagent_containers/glass/bottle/antitoxin(src) - return +/obj/structure/closet/secure_closet/medical1/New() + ..() + sleep(2) + new /obj/item/weapon/storage/box/syringes(src) + new /obj/item/weapon/reagent_containers/dropper(src) + new /obj/item/weapon/reagent_containers/dropper(src) + new /obj/item/weapon/reagent_containers/glass/beaker(src) + new /obj/item/weapon/reagent_containers/glass/beaker(src) + new /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline(src) + new /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline(src) + new /obj/item/weapon/reagent_containers/glass/bottle/antitoxin(src) + new /obj/item/weapon/reagent_containers/glass/bottle/antitoxin(src) + return @@ -38,16 +38,16 @@ req_access = list(access_surgery) - New() - ..() - sleep(2) - new /obj/item/weapon/tank/anesthetic(src) - new /obj/item/weapon/tank/anesthetic(src) - new /obj/item/weapon/tank/anesthetic(src) - new /obj/item/clothing/mask/breath/medical(src) - new /obj/item/clothing/mask/breath/medical(src) - new /obj/item/clothing/mask/breath/medical(src) - return +/obj/structure/closet/secure_closet/medical2/New() + ..() + sleep(2) + new /obj/item/weapon/tank/anesthetic(src) + new /obj/item/weapon/tank/anesthetic(src) + new /obj/item/weapon/tank/anesthetic(src) + new /obj/item/clothing/mask/breath/medical(src) + new /obj/item/clothing/mask/breath/medical(src) + new /obj/item/clothing/mask/breath/medical(src) + return @@ -61,36 +61,36 @@ icon_broken = "securemedbroken" icon_off = "securemedoff" - New() - ..() - sleep(2) - if(prob(50)) - new /obj/item/weapon/storage/backpack/medic(src) - else - new /obj/item/weapon/storage/backpack/satchel_med(src) - new /obj/item/clothing/under/rank/nursesuit (src) - new /obj/item/clothing/head/nursehat (src) - switch(pick("blue", "green", "purple")) - if ("blue") - new /obj/item/clothing/under/rank/medical/blue(src) - if ("green") - new /obj/item/clothing/under/rank/medical/green(src) - if ("purple") - new /obj/item/clothing/under/rank/medical/purple(src) - switch(pick("blue", "green", "purple")) - if ("blue") - new /obj/item/clothing/under/rank/medical/blue(src) - if ("green") - new /obj/item/clothing/under/rank/medical/green(src) - if ("purple") - new /obj/item/clothing/under/rank/medical/purple(src) - new /obj/item/clothing/under/rank/medical(src) - new /obj/item/clothing/suit/labcoat(src) - new /obj/item/clothing/shoes/sneakers/white(src) -// new /obj/item/weapon/cartridge/medical(src) - new /obj/item/device/radio/headset/headset_med(src) - new /obj/item/weapon/storage/belt/medical(src) - return +/obj/structure/closet/secure_closet/medical3/New() + ..() + sleep(2) + if(prob(50)) + new /obj/item/weapon/storage/backpack/medic(src) + else + new /obj/item/weapon/storage/backpack/satchel_med(src) + new /obj/item/clothing/under/rank/nursesuit (src) + new /obj/item/clothing/head/nursehat (src) + switch(pick("blue", "green", "purple")) + if ("blue") + new /obj/item/clothing/under/rank/medical/blue(src) + if ("green") + new /obj/item/clothing/under/rank/medical/green(src) + if ("purple") + new /obj/item/clothing/under/rank/medical/purple(src) + switch(pick("blue", "green", "purple")) + if ("blue") + new /obj/item/clothing/under/rank/medical/blue(src) + if ("green") + new /obj/item/clothing/under/rank/medical/green(src) + if ("purple") + new /obj/item/clothing/under/rank/medical/purple(src) + new /obj/item/clothing/under/rank/medical(src) + new /obj/item/clothing/suit/labcoat(src) + new /obj/item/clothing/shoes/sneakers/white(src) +// new /obj/item/weapon/cartridge/medical(src) + new /obj/item/device/radio/headset/headset_med(src) + new /obj/item/weapon/storage/belt/medical(src) + return @@ -104,25 +104,25 @@ icon_broken = "cmosecurebroken" icon_off = "cmosecureoff" - New() - ..() - sleep(2) - if(prob(50)) - new /obj/item/weapon/storage/backpack/medic(src) - else - new /obj/item/weapon/storage/backpack/satchel_med(src) - new /obj/item/clothing/suit/bio_suit/cmo(src) - new /obj/item/clothing/head/bio_hood/cmo(src) - new /obj/item/clothing/under/rank/chief_medical_officer(src) - new /obj/item/clothing/suit/labcoat/cmo(src) - new /obj/item/weapon/cartridge/cmo(src) - new /obj/item/clothing/gloves/latex(src) - new /obj/item/clothing/shoes/sneakers/brown (src) - new /obj/item/device/radio/headset/heads/cmo(src) - new /obj/item/weapon/storage/belt/medical(src) - new /obj/item/device/flash(src) - new /obj/item/weapon/reagent_containers/hypospray(src) - return +/obj/structure/closet/secure_closet/CMO/New() + ..() + sleep(2) + if(prob(50)) + new /obj/item/weapon/storage/backpack/medic(src) + else + new /obj/item/weapon/storage/backpack/satchel_med(src) + new /obj/item/clothing/suit/bio_suit/cmo(src) + new /obj/item/clothing/head/bio_hood/cmo(src) + new /obj/item/clothing/under/rank/chief_medical_officer(src) + new /obj/item/clothing/suit/labcoat/cmo(src) + new /obj/item/weapon/cartridge/cmo(src) + new /obj/item/clothing/gloves/latex(src) + new /obj/item/clothing/shoes/sneakers/brown (src) + new /obj/item/device/radio/headset/heads/cmo(src) + new /obj/item/weapon/storage/belt/medical(src) + new /obj/item/device/flash(src) + new /obj/item/weapon/reagent_containers/hypospray(src) + return @@ -131,14 +131,14 @@ req_access = list(access_surgery) - New() - ..() - sleep(2) - new /obj/item/device/assembly/signaler(src) - new /obj/item/device/radio/electropack(src) - new /obj/item/device/radio/electropack(src) - new /obj/item/device/radio/electropack(src) - return +/obj/structure/closet/secure_closet/animal/New() + ..() + sleep(2) + new /obj/item/device/assembly/signaler(src) + new /obj/item/device/radio/electropack(src) + new /obj/item/device/radio/electropack(src) + new /obj/item/device/radio/electropack(src) + return @@ -154,12 +154,12 @@ req_access = list(access_chemistry) - New() - ..() - sleep(2) - new /obj/item/weapon/storage/box/pillbottles(src) - new /obj/item/weapon/storage/box/pillbottles(src) - return +/obj/structure/closet/secure_closet/chemical/New() + ..() + sleep(2) + new /obj/item/weapon/storage/box/pillbottles(src) + new /obj/item/weapon/storage/box/pillbottles(src) + return /obj/structure/closet/secure_closet/medical_wall name = "first aid closet" @@ -185,4 +185,4 @@ else icon_state = icon_closed else - icon_state = icon_opened \ No newline at end of file + icon_state = icon_opened diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm index ebdcba771d8..1c56b4c27e4 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -59,7 +59,7 @@ var/obj/item/weapon/card/id/I = W.GetID() if(istype(I)) if(src.broken) - user << "\red It appears to be broken." + user << "It appears to be broken." return if(!I || !I.registered_name) return if(src.allowed(user) || !src.registered_name || (istype(I) && (src.registered_name == I.registered_name))) @@ -72,7 +72,7 @@ src.registered_name = I.registered_name src.desc = "Owned by [I.registered_name]." else - user << "\red Access Denied" + user << "Access Denied." else ..() else diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 7a06549d669..9b0cef34c99 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -8,17 +8,17 @@ icon_broken = "secureresbroken" icon_off = "secureresoff" - New() - ..() - sleep(2) - new /obj/item/clothing/under/rank/scientist(src) - new /obj/item/clothing/suit/labcoat/science(src) - new /obj/item/clothing/shoes/sneakers/white(src) -// new /obj/item/weapon/cartridge/signal/toxins(src) - new /obj/item/device/radio/headset/headset_sci(src) - new /obj/item/weapon/tank/air(src) - new /obj/item/clothing/mask/gas(src) - return +/obj/structure/closet/secure_closet/scientist/New() + ..() + sleep(2) + new /obj/item/clothing/under/rank/scientist(src) + new /obj/item/clothing/suit/labcoat/science(src) + new /obj/item/clothing/shoes/sneakers/white(src) +// new /obj/item/weapon/cartridge/signal/toxins(src) + new /obj/item/device/radio/headset/headset_sci(src) + new /obj/item/weapon/tank/air(src) + new /obj/item/clothing/mask/gas(src) + return @@ -32,21 +32,21 @@ icon_broken = "rdsecurebroken" icon_off = "rdsecureoff" - New() - ..() - sleep(2) - new /obj/item/clothing/suit/bio_suit/scientist(src) - new /obj/item/clothing/head/bio_hood/scientist(src) - new /obj/item/clothing/under/rank/research_director(src) - new /obj/item/clothing/suit/labcoat(src) - new /obj/item/weapon/cartridge/rd(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/gloves/latex(src) - new /obj/item/device/radio/headset/heads/rd(src) - new /obj/item/weapon/tank/air(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/clothing/suit/armor/reactive(src) - new /obj/item/device/flash(src) - new /obj/item/device/laser_pointer(src) - new /obj/item/clothing/under/rank/research_director/alt(src) - return \ No newline at end of file +/obj/structure/closet/secure_closet/RD/New() + ..() + sleep(2) + new /obj/item/clothing/suit/bio_suit/scientist(src) + new /obj/item/clothing/head/bio_hood/scientist(src) + new /obj/item/clothing/under/rank/research_director(src) + new /obj/item/clothing/suit/labcoat(src) + new /obj/item/weapon/cartridge/rd(src) + new /obj/item/clothing/shoes/sneakers/white(src) + new /obj/item/clothing/gloves/latex(src) + new /obj/item/device/radio/headset/heads/rd(src) + new /obj/item/weapon/tank/air(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/suit/armor/reactive(src) + new /obj/item/device/flash(src) + new /obj/item/device/laser_pointer(src) + new /obj/item/clothing/under/rank/research_director/alt(src) + return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index d6c66069701..a1e7aacfcc1 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -8,24 +8,24 @@ icon_broken = "capsecurebroken" icon_off = "capsecureoff" - New() - ..() - sleep(2) - if(prob(50)) - new /obj/item/weapon/storage/backpack/captain(src) - else - new /obj/item/weapon/storage/backpack/satchel_cap(src) - new /obj/item/clothing/suit/captunic(src) - new /obj/item/clothing/under/captainformal(src) - new /obj/item/clothing/head/helmet/cap(src) - new /obj/item/clothing/under/rank/captain(src) - new /obj/item/clothing/suit/armor/vest/capcarapace(src) - new /obj/item/weapon/cartridge/captain(src) - new /obj/item/clothing/shoes/sneakers/brown(src) - new /obj/item/device/radio/headset/heads/captain/alt(src) - new /obj/item/clothing/gloves/captain(src) - new /obj/item/weapon/gun/energy/gun(src) - return +/obj/structure/closet/secure_closet/captains/New() + ..() + sleep(2) + if(prob(50)) + new /obj/item/weapon/storage/backpack/captain(src) + else + new /obj/item/weapon/storage/backpack/satchel_cap(src) + new /obj/item/clothing/suit/captunic(src) + new /obj/item/clothing/under/captainformal(src) + new /obj/item/clothing/head/helmet/cap(src) + new /obj/item/clothing/under/rank/captain(src) + new /obj/item/clothing/suit/armor/vest/capcarapace(src) + new /obj/item/weapon/cartridge/captain(src) + new /obj/item/clothing/shoes/sneakers/brown(src) + new /obj/item/device/radio/headset/heads/captain/alt(src) + new /obj/item/clothing/gloves/captain(src) + new /obj/item/weapon/gun/energy/gun(src) + return /obj/structure/closet/secure_closet/hop name = "\proper head of personnel's locker" @@ -37,22 +37,22 @@ icon_broken = "hopsecurebroken" icon_off = "hopsecureoff" - New() - ..() - sleep(2) - new /obj/item/clothing/under/rank/head_of_personnel(src) - new /obj/item/clothing/head/hopcap(src) - new /obj/item/weapon/cartridge/hop(src) - new /obj/item/device/radio/headset/heads/hop(src) - new /obj/item/clothing/shoes/sneakers/brown(src) - new /obj/item/weapon/storage/box/ids(src) - new /obj/item/weapon/storage/box/ids(src) - new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/weapon/gun/energy/gun(src) - new /obj/item/device/flash(src) - new /obj/item/clothing/glasses/sunglasses(src) - new /obj/item/weapon/mining_voucher(src) - return +/obj/structure/closet/secure_closet/hop/New() + ..() + sleep(2) + new /obj/item/clothing/under/rank/head_of_personnel(src) + new /obj/item/clothing/head/hopcap(src) + new /obj/item/weapon/cartridge/hop(src) + new /obj/item/device/radio/headset/heads/hop(src) + new /obj/item/clothing/shoes/sneakers/brown(src) + new /obj/item/weapon/storage/box/ids(src) + new /obj/item/weapon/storage/box/ids(src) + new /obj/item/clothing/suit/armor/vest(src) + new /obj/item/weapon/gun/energy/gun(src) + new /obj/item/device/flash(src) + new /obj/item/clothing/glasses/sunglasses(src) + new /obj/item/weapon/mining_voucher(src) + return @@ -66,24 +66,24 @@ icon_broken = "hossecurebroken" icon_off = "hossecureoff" - New() - ..() - sleep(2) - new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/clothing/suit/armor/hos/jensen(src) - new /obj/item/clothing/head/helmet/HoS/dermal(src) - new /obj/item/weapon/cartridge/hos(src) - new /obj/item/device/radio/headset/heads/hos/alt(src) - new /obj/item/clothing/glasses/hud/security/sunglasses(src) - new /obj/item/weapon/shield/riot(src) - new /obj/item/clothing/mask/gas/sechailer/hos(src) - new /obj/item/weapon/storage/lockbox/loyalty(src) - new /obj/item/weapon/storage/box/flashbangs(src) - new /obj/item/device/flash(src) - new /obj/item/weapon/melee/baton/loaded(src) - new /obj/item/weapon/gun/energy/gun(src) - new /obj/item/weapon/storage/belt/security(src) - return +/obj/structure/closet/secure_closet/hos/New() + ..() + sleep(2) + new /obj/item/clothing/suit/armor/vest(src) + new /obj/item/clothing/suit/armor/hos/jensen(src) + new /obj/item/clothing/head/helmet/HoS/dermal(src) + new /obj/item/weapon/cartridge/hos(src) + new /obj/item/device/radio/headset/heads/hos/alt(src) + new /obj/item/clothing/glasses/hud/security/sunglasses(src) + new /obj/item/weapon/shield/riot(src) + new /obj/item/clothing/mask/gas/sechailer/hos(src) + new /obj/item/weapon/storage/lockbox/loyalty(src) + new /obj/item/weapon/storage/box/flashbangs(src) + new /obj/item/device/flash(src) + new /obj/item/weapon/melee/baton/loaded(src) + new /obj/item/weapon/gun/energy/gun(src) + new /obj/item/weapon/storage/belt/security(src) + return /obj/structure/closet/secure_closet/warden @@ -97,23 +97,23 @@ icon_off = "wardensecureoff" - New() - ..() - sleep(2) - new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/clothing/under/rank/warden(src) - new /obj/item/clothing/suit/armor/vest/warden(src) - new /obj/item/clothing/head/helmet/warden(src) - new /obj/item/weapon/clipboard(src) - new /obj/item/device/radio/headset/headset_sec/alt(src) - new /obj/item/clothing/glasses/hud/security/sunglasses(src) - new /obj/item/clothing/mask/gas/sechailer/warden(src) - new /obj/item/weapon/storage/box/flashbangs(src) - new /obj/item/weapon/reagent_containers/spray/pepper(src) - new /obj/item/weapon/melee/baton/loaded(src) - new /obj/item/weapon/gun/energy/taser(src) - new /obj/item/weapon/storage/belt/security(src) - return +/obj/structure/closet/secure_closet/warden/New() + ..() + sleep(2) + new /obj/item/clothing/suit/armor/vest(src) + new /obj/item/clothing/under/rank/warden(src) + new /obj/item/clothing/suit/armor/vest/warden(src) + new /obj/item/clothing/head/helmet/warden(src) + new /obj/item/weapon/clipboard(src) + new /obj/item/device/radio/headset/headset_sec/alt(src) + new /obj/item/clothing/glasses/hud/security/sunglasses(src) + new /obj/item/clothing/mask/gas/sechailer/warden(src) + new /obj/item/weapon/storage/box/flashbangs(src) + new /obj/item/weapon/reagent_containers/spray/pepper(src) + new /obj/item/weapon/melee/baton/loaded(src) + new /obj/item/weapon/gun/energy/taser(src) + new /obj/item/weapon/storage/belt/security(src) + return @@ -127,60 +127,60 @@ icon_broken = "secbroken" icon_off = "secoff" - New() - ..() - sleep(2) - new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/clothing/head/helmet(src) - new /obj/item/device/radio/headset/headset_sec/alt(src) - new /obj/item/clothing/mask/gas/sechailer(src) - new /obj/item/device/flash(src) - new /obj/item/weapon/reagent_containers/spray/pepper(src) - new /obj/item/weapon/grenade/flashbang(src) - new /obj/item/weapon/gun/energy/taser(src) - new /obj/item/weapon/storage/belt/security(src) - new /obj/item/clothing/glasses/hud/security/sunglasses(src) - return +/obj/structure/closet/secure_closet/security/New() + ..() + sleep(2) + new /obj/item/clothing/suit/armor/vest(src) + new /obj/item/clothing/head/helmet(src) + new /obj/item/device/radio/headset/headset_sec/alt(src) + new /obj/item/clothing/mask/gas/sechailer(src) + new /obj/item/device/flash(src) + new /obj/item/weapon/reagent_containers/spray/pepper(src) + new /obj/item/weapon/grenade/flashbang(src) + new /obj/item/weapon/gun/energy/taser(src) + new /obj/item/weapon/storage/belt/security(src) + new /obj/item/clothing/glasses/hud/security/sunglasses(src) + return /obj/structure/closet/secure_closet/security/sec - New() - new /obj/item/weapon/melee/baton/loaded(src) - ..() - return +/obj/structure/closet/secure_closet/security/sec/New() + new /obj/item/weapon/melee/baton/loaded(src) + ..() + return /obj/structure/closet/secure_closet/security/cargo - New() - new /obj/item/clothing/tie/armband/cargo(src) - new /obj/item/device/encryptionkey/headset_cargo(src) - ..() - return +/obj/structure/closet/secure_closet/security/cargo/New() + new /obj/item/clothing/tie/armband/cargo(src) + new /obj/item/device/encryptionkey/headset_cargo(src) + ..() + return /obj/structure/closet/secure_closet/security/engine - New() - new /obj/item/clothing/tie/armband/engine(src) - new /obj/item/device/encryptionkey/headset_eng(src) - ..() - return +/obj/structure/closet/secure_closet/security/engine/New() + new /obj/item/clothing/tie/armband/engine(src) + new /obj/item/device/encryptionkey/headset_eng(src) + ..() + return /obj/structure/closet/secure_closet/security/science - New() - new /obj/item/clothing/tie/armband/science(src) - new /obj/item/device/encryptionkey/headset_sci(src) - ..() - return +/obj/structure/closet/secure_closet/security/science/New() + new /obj/item/clothing/tie/armband/science(src) + new /obj/item/device/encryptionkey/headset_sci(src) + ..() + return /obj/structure/closet/secure_closet/security/med - New() - new /obj/item/clothing/tie/armband/medblue(src) - new /obj/item/device/encryptionkey/headset_med(src) - ..() - return +/obj/structure/closet/secure_closet/security/med/New() + new /obj/item/clothing/tie/armband/medblue(src) + new /obj/item/device/encryptionkey/headset_med(src) + ..() + return /obj/structure/closet/secure_closet/detective @@ -193,23 +193,23 @@ icon_broken = "cabinetdetective_broken" icon_off = "cabinetdetective_broken" - New() - ..() - sleep(2) - new /obj/item/clothing/under/rank/det(src) - new /obj/item/clothing/suit/det_suit(src) - new /obj/item/clothing/gloves/black(src) - new /obj/item/clothing/head/det_hat(src) - new /obj/item/clothing/shoes/sneakers/brown(src) - new /obj/item/weapon/storage/box/evidence(src) - new /obj/item/weapon/clipboard(src) - new /obj/item/device/radio/headset/headset_sec(src) - new /obj/item/device/detective_scanner(src) - new /obj/item/clothing/suit/armor/vest/det_suit(src) - new /obj/item/ammo_box/c38(src) - new /obj/item/ammo_box/c38(src) - new /obj/item/weapon/gun/projectile/revolver/detective(src) - return +/obj/structure/closet/secure_closet/detective/New() + ..() + sleep(2) + new /obj/item/clothing/under/rank/det(src) + new /obj/item/clothing/suit/det_suit(src) + new /obj/item/clothing/gloves/black(src) + new /obj/item/clothing/head/det_hat(src) + new /obj/item/clothing/shoes/sneakers/brown(src) + new /obj/item/weapon/storage/box/evidence(src) + new /obj/item/weapon/clipboard(src) + new /obj/item/device/radio/headset/headset_sec(src) + new /obj/item/device/detective_scanner(src) + new /obj/item/clothing/suit/armor/vest/det_suit(src) + new /obj/item/ammo_box/c38(src) + new /obj/item/ammo_box/c38(src) + new /obj/item/weapon/gun/projectile/revolver/detective(src) + return /obj/structure/closet/secure_closet/detective/update_icon() if(broken) @@ -227,14 +227,14 @@ name = "lethal injections" req_access = list(access_hos) - New() - ..() - sleep(2) - new /obj/item/weapon/reagent_containers/syringe/lethal/choral(src) - new /obj/item/weapon/reagent_containers/syringe/lethal/choral(src) - new /obj/item/weapon/reagent_containers/syringe/lethal/choral(src) - new /obj/item/weapon/reagent_containers/syringe/lethal/choral(src) - new /obj/item/weapon/reagent_containers/syringe/lethal/choral(src) +/obj/structure/closet/secure_closet/injection/New() + ..() + sleep(2) + new /obj/item/weapon/reagent_containers/syringe/lethal/choral(src) + new /obj/item/weapon/reagent_containers/syringe/lethal/choral(src) + new /obj/item/weapon/reagent_containers/syringe/lethal/choral(src) + new /obj/item/weapon/reagent_containers/syringe/lethal/choral(src) + new /obj/item/weapon/reagent_containers/syringe/lethal/choral(src) /obj/structure/closet/secure_closet/brig @@ -243,10 +243,10 @@ anchored = 1 var/id = null - New() - new /obj/item/clothing/under/color/orange( src ) - new /obj/item/clothing/shoes/sneakers/orange( src ) - return +/obj/structure/closet/secure_closet/brig/New() + new /obj/item/clothing/under/color/orange( src ) + new /obj/item/clothing/shoes/sneakers/orange( src ) + return @@ -254,18 +254,18 @@ name = "courtroom locker" req_access = list(access_court) - New() - ..() - sleep(2) - new /obj/item/clothing/shoes/sneakers/brown(src) - new /obj/item/weapon/paper/Court (src) - new /obj/item/weapon/paper/Court (src) - new /obj/item/weapon/paper/Court (src) - new /obj/item/weapon/pen (src) - new /obj/item/clothing/suit/judgerobe (src) - new /obj/item/clothing/head/powdered_wig (src) - new /obj/item/weapon/storage/briefcase(src) - return +/obj/structure/closet/secure_closet/courtroom/New() + ..() + sleep(2) + new /obj/item/clothing/shoes/sneakers/brown(src) + new /obj/item/weapon/paper/Court (src) + new /obj/item/weapon/paper/Court (src) + new /obj/item/weapon/paper/Court (src) + new /obj/item/weapon/pen (src) + new /obj/item/clothing/suit/judgerobe (src) + new /obj/item/clothing/head/powdered_wig (src) + new /obj/item/weapon/storage/briefcase(src) + return /obj/structure/closet/secure_closet/wall name = "wall locker" diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 04c1f737b46..986a918ffb4 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -23,6 +23,8 @@ L.client.eye = src L.loc = src L.sdisabilities += MUTE + L.faction += "mimic" //Stops mimics from instaqdeling people in statues + health = L.health + 100 //stoning damaged mobs will result in easier to shatter statues intialTox = L.getToxLoss() intialFire = L.getFireLoss() @@ -79,6 +81,7 @@ M.loc = src.loc M.sdisabilities -= MUTE M.take_overall_damage((M.health - health - 100),0) //any new damage the statue incurred is transfered to the mob + M.faction -= "mimic" if(M.client) M.client.eye = M.client.mob M.client.perspective = MOB_PERSPECTIVE @@ -123,7 +126,7 @@ /obj/structure/closet/statue/attackby(obj/item/I as obj, mob/user as mob) health -= I.force - visible_message("\red [user] strikes [src] with [I].") + visible_message("[user] strikes [src] with [I].") if(health <= 0) for(var/mob/M in src) shatter(M) @@ -150,8 +153,8 @@ if (user) user.dust() dump_contents() - visible_message("\red [src] shatters!. ") + visible_message("[src] shatters!.") qdel(src) /obj/structure/closet/statue/container_resist() - return + return \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index fbc52019f21..d0aed1ca894 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -50,87 +50,87 @@ new /obj/item/device/pda/syndicate(src) return -/obj/structure/closet/syndicate/resources/ +/obj/structure/closet/syndicate/resources desc = "An old, dusty locker." - New() - ..() - var/common_min = 30 //Minimum amount of minerals in the stack for common minerals - var/common_max = 50 //Maximum amount of HONK in the stack for HONK common minerals - var/rare_min = 5 //Minimum HONK of HONK in the stack HONK HONK rare minerals - var/rare_max = 20 //Maximum HONK HONK HONK in the HONK for HONK rare HONK +/obj/structure/closet/syndicate/resources/New() + ..() + var/common_min = 30 //Minimum amount of minerals in the stack for common minerals + var/common_max = 50 //Maximum amount of HONK in the stack for HONK common minerals + var/rare_min = 5 //Minimum HONK of HONK in the stack HONK HONK rare minerals + var/rare_max = 20 //Maximum HONK HONK HONK in the HONK for HONK rare HONK - sleep(2) + sleep(2) - var/pickednum = rand(1, 50) + var/pickednum = rand(1, 50) - //Sad trombone - if(pickednum == 1) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src) - P.name = "\improper IOU" - P.info = "Sorry man, we needed the money so we sold your stash. It's ok, we'll double our money for sure this time!" + //Sad trombone + if(pickednum == 1) + var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src) + P.name = "\improper IOU" + P.info = "Sorry man, we needed the money so we sold your stash. It's ok, we'll double our money for sure this time!" - //Metal (common ore) - if(pickednum >= 2) - new /obj/item/stack/sheet/metal(src, rand(common_min, common_max)) + //Metal (common ore) + if(pickednum >= 2) + new /obj/item/stack/sheet/metal(src, rand(common_min, common_max)) - //Glass (common ore) - if(pickednum >= 5) - new /obj/item/stack/sheet/glass(src, rand(common_min, common_max)) + //Glass (common ore) + if(pickednum >= 5) + new /obj/item/stack/sheet/glass(src, rand(common_min, common_max)) - //Plasteel (common ore) Because it has a million more uses then plasma - if(pickednum >= 10) - new /obj/item/stack/sheet/plasteel(src, rand(common_min, common_max)) + //Plasteel (common ore) Because it has a million more uses then plasma + if(pickednum >= 10) + new /obj/item/stack/sheet/plasteel(src, rand(common_min, common_max)) - //Plasma (rare ore) - if(pickednum >= 15) - new /obj/item/stack/sheet/mineral/plasma(src, rand(rare_min, rare_max)) + //Plasma (rare ore) + if(pickednum >= 15) + new /obj/item/stack/sheet/mineral/plasma(src, rand(rare_min, rare_max)) - //Silver (rare ore) - if(pickednum >= 20) - new /obj/item/stack/sheet/mineral/silver(src, rand(rare_min, rare_max)) + //Silver (rare ore) + if(pickednum >= 20) + new /obj/item/stack/sheet/mineral/silver(src, rand(rare_min, rare_max)) - //Gold (rare ore) - if(pickednum >= 30) - new /obj/item/stack/sheet/mineral/gold(src, rand(rare_min, rare_max)) + //Gold (rare ore) + if(pickednum >= 30) + new /obj/item/stack/sheet/mineral/gold(src, rand(rare_min, rare_max)) - //Uranium (rare ore) - if(pickednum >= 40) - new /obj/item/stack/sheet/mineral/uranium(src, rand(rare_min, rare_max)) + //Uranium (rare ore) + if(pickednum >= 40) + new /obj/item/stack/sheet/mineral/uranium(src, rand(rare_min, rare_max)) - //Diamond (rare HONK) - if(pickednum >= 45) - new /obj/item/stack/sheet/mineral/diamond(src, rand(rare_min, rare_max)) + //Diamond (rare HONK) + if(pickednum >= 45) + new /obj/item/stack/sheet/mineral/diamond(src, rand(rare_min, rare_max)) - //Jetpack (You hit the jackpot!) - if(pickednum == 50) - new /obj/item/weapon/tank/jetpack/carbondioxide(src) + //Jetpack (You hit the jackpot!) + if(pickednum == 50) + new /obj/item/weapon/tank/jetpack/carbondioxide(src) - return + return /obj/structure/closet/syndicate/resources/everything desc = "It's an emergency storage closet for repairs." - New() - var/list/resources = list( - /obj/item/stack/sheet/metal, - /obj/item/stack/sheet/glass, - /obj/item/stack/sheet/mineral/gold, - /obj/item/stack/sheet/mineral/silver, - /obj/item/stack/sheet/mineral/plasma, - /obj/item/stack/sheet/mineral/uranium, - /obj/item/stack/sheet/mineral/diamond, - /obj/item/stack/sheet/mineral/clown, - /obj/item/stack/sheet/plasteel, - /obj/item/stack/rods - ) +/obj/structure/closet/syndicate/resources/everything/New() + var/list/resources = list( + /obj/item/stack/sheet/metal, + /obj/item/stack/sheet/glass, + /obj/item/stack/sheet/mineral/gold, + /obj/item/stack/sheet/mineral/silver, + /obj/item/stack/sheet/mineral/plasma, + /obj/item/stack/sheet/mineral/uranium, + /obj/item/stack/sheet/mineral/diamond, + /obj/item/stack/sheet/mineral/clown, + /obj/item/stack/sheet/plasteel, + /obj/item/stack/rods + ) - sleep(2) + sleep(2) - for(var/i = 0, i<2, i++) - for(var/res in resources) - var/obj/item/stack/R = new res(src) - R.amount = R.max_amount + for(var/i = 0, i<2, i++) + for(var/res in resources) + var/obj/item/stack/R = new res(src) + R.amount = R.max_amount - return \ No newline at end of file + return \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 097d7b400ae..bdf97295bab 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -82,23 +82,23 @@ var/target_temp = T0C - 40 var/cooling_power = 40 - return_air() - var/datum/gas_mixture/gas = (..()) - if(!gas) return null - var/datum/gas_mixture/newgas = new/datum/gas_mixture() - newgas.oxygen = gas.oxygen - newgas.carbon_dioxide = gas.carbon_dioxide - newgas.nitrogen = gas.nitrogen - newgas.toxins = gas.toxins - newgas.volume = gas.volume - newgas.temperature = gas.temperature - if(newgas.temperature <= target_temp) return +/obj/structure/closet/crate/freezer/return_air() + var/datum/gas_mixture/gas = (..()) + if(!gas) return null + var/datum/gas_mixture/newgas = new/datum/gas_mixture() + newgas.oxygen = gas.oxygen + newgas.carbon_dioxide = gas.carbon_dioxide + newgas.nitrogen = gas.nitrogen + newgas.toxins = gas.toxins + newgas.volume = gas.volume + newgas.temperature = gas.temperature + if(newgas.temperature <= target_temp) return - if((newgas.temperature - cooling_power) > target_temp) - newgas.temperature -= cooling_power - else - newgas.temperature = target_temp - return newgas + if((newgas.temperature - cooling_power) > target_temp) + newgas.temperature -= cooling_power + else + newgas.temperature = target_temp + return newgas /obj/structure/closet/crate/radiation @@ -189,11 +189,12 @@ icon_opened = "hydrocrateopen" icon_closed = "hydrocrate" density = 1*/ - New() - ..() - new /obj/item/weapon/reagent_containers/spray/plantbgone(src) - new /obj/item/weapon/reagent_containers/spray/plantbgone(src) - new /obj/item/weapon/minihoe(src) + +/obj/structure/closet/crate/hydroponics/prespawned/New() + ..() + new /obj/item/weapon/reagent_containers/spray/plantbgone(src) + new /obj/item/weapon/reagent_containers/spray/plantbgone(src) + new /obj/item/weapon/minihoe(src) // new /obj/item/weapon/reagent_containers/spray/weedspray(src) // new /obj/item/weapon/reagent_containers/spray/weedspray(src) // new /obj/item/weapon/reagent_containers/spray/pestspray(src) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index e0c403006d5..63817318c05 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -2,7 +2,7 @@ name = "display case" icon = 'icons/obj/stationobjs.dmi' icon_state = "glassbox1" - desc = "A display case for prized possessions. It taunts you to kick it." + desc = "A display case for prized possessions. Hooked up with an anti-theft system." density = 1 anchored = 1 unacidable = 1//Dissolving the case would also delete the gun. @@ -53,6 +53,12 @@ new /obj/item/weapon/shard( src.loc ) playsound(src, "shatter", 70, 1) update_icon() + + //Activate Anti-theft + var/area/alarmed = get_area(src) + alarmed.burglaralert(src) + playsound(src, "sound/effects/alert.ogg", 50, 1) + else playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) return @@ -85,10 +91,10 @@ update_icon() return else - usr << text("\blue You kick the display case.") + usr << text("You kick the display case.") for(var/mob/O in oviewers()) if ((O.client && !( O.blinded ))) - O << text("\red [] kicks the display case.", usr) + O << text("[] kicks the display case.", usr) src.health -= 2 healthcheck() return diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index db202e16461..898e96e7968 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -16,309 +16,327 @@ obj/structure/door_assembly var/glass_type = /obj/machinery/door/airlock/glass var/created_name = null - New() - base_icon_state = copytext(icon_state,1,lentext(icon_state)) +obj/structure/door_assembly/New() + base_icon_state = copytext(icon_state,1,lentext(icon_state)) - /obj/structure/door_assembly/door_assembly_0 - name = "airlock assembly" - icon_state = "door_as_1" - airlock_type = /obj/machinery/door/airlock - anchored = 1 - density = 1 - state = 1 +/obj/structure/door_assembly/door_assembly_0 + name = "airlock assembly" + icon_state = "door_as_1" + airlock_type = /obj/machinery/door/airlock + anchored = 1 + density = 1 + state = 1 - /obj/structure/door_assembly/door_assembly_com - name = "command airlock assembly" - icon_state = "door_as_com1" - glass_base_icon_state = "door_as_gcom" - typetext = "command" - icontext = "com" - glass_type = /obj/machinery/door/airlock/glass_command - airlock_type = /obj/machinery/door/airlock/command - anchored = 1 - density = 1 - state = 1 +/obj/structure/door_assembly/door_assembly_com + name = "command airlock assembly" + icon_state = "door_as_com1" + glass_base_icon_state = "door_as_gcom" + typetext = "command" + icontext = "com" + glass_type = /obj/machinery/door/airlock/glass_command + airlock_type = /obj/machinery/door/airlock/command + anchored = 1 + density = 1 + state = 1 - glass - mineral = "glass" - icon_state = "door_as_gcom1" +/obj/structure/door_assembly/door_assembly_com/glass + mineral = "glass" + icon_state = "door_as_gcom1" - /obj/structure/door_assembly/door_assembly_sec - name = "security airlock assembly" - icon_state = "door_as_sec1" - glass_base_icon_state = "door_as_gsec" - typetext = "security" - icontext = "sec" - glass_type = /obj/machinery/door/airlock/glass_security - airlock_type = /obj/machinery/door/airlock/security - anchored = 1 - density = 1 - state = 1 +/obj/structure/door_assembly/door_assembly_sec + name = "security airlock assembly" + icon_state = "door_as_sec1" + glass_base_icon_state = "door_as_gsec" + typetext = "security" + icontext = "sec" + glass_type = /obj/machinery/door/airlock/glass_security + airlock_type = /obj/machinery/door/airlock/security + anchored = 1 + density = 1 + state = 1 - glass - mineral = "glass" - icon_state = "door_as_gsec1" +/obj/structure/door_assembly/door_assembly_sec/glass + mineral = "glass" + icon_state = "door_as_gsec1" - /obj/structure/door_assembly/door_assembly_eng - name = "engineering airlock assembly" - icon_state = "door_as_eng1" - glass_base_icon_state = "door_as_geng" - typetext = "engineering" - icontext = "eng" - glass_type = /obj/machinery/door/airlock/glass_engineering - airlock_type = /obj/machinery/door/airlock/engineering - anchored = 1 - density = 1 - state = 1 +/obj/structure/door_assembly/door_assembly_eng + name = "engineering airlock assembly" + icon_state = "door_as_eng1" + glass_base_icon_state = "door_as_geng" + typetext = "engineering" + icontext = "eng" + glass_type = /obj/machinery/door/airlock/glass_engineering + airlock_type = /obj/machinery/door/airlock/engineering + anchored = 1 + density = 1 + state = 1 - glass - mineral = "glass" - icon_state = "door_as_geng1" +/obj/structure/door_assembly/door_assembly_eng/glass + mineral = "glass" + icon_state = "door_as_geng1" - /obj/structure/door_assembly/door_assembly_min - name = "mining airlock assembly" - icon_state = "door_as_min1" - glass_base_icon_state = "door_as_gmin" - typetext = "mining" - icontext = "min" - glass_type = /obj/machinery/door/airlock/glass_mining - airlock_type = /obj/machinery/door/airlock/mining - anchored = 1 - density = 1 - state = 1 +/obj/structure/door_assembly/door_assembly_min + name = "mining airlock assembly" + icon_state = "door_as_min1" + glass_base_icon_state = "door_as_gmin" + typetext = "mining" + icontext = "min" + glass_type = /obj/machinery/door/airlock/glass_mining + airlock_type = /obj/machinery/door/airlock/mining + anchored = 1 + density = 1 + state = 1 - glass - mineral = "glass" - icon_state = "door_as_gmin1" +/obj/structure/door_assembly/door_assembly_min/glass + mineral = "glass" + icon_state = "door_as_gmin1" - /obj/structure/door_assembly/door_assembly_atmo - name = "atmospherics airlock assembly" - icon_state = "door_as_atmo1" - glass_base_icon_state = "door_as_gatmo" - typetext = "atmos" - icontext = "atmo" - glass_type = /obj/machinery/door/airlock/glass_atmos - airlock_type = /obj/machinery/door/airlock/atmos - anchored = 1 - density = 1 - state = 1 +/obj/structure/door_assembly/door_assembly_atmo + name = "atmospherics airlock assembly" + icon_state = "door_as_atmo1" + glass_base_icon_state = "door_as_gatmo" + typetext = "atmos" + icontext = "atmo" + glass_type = /obj/machinery/door/airlock/glass_atmos + airlock_type = /obj/machinery/door/airlock/atmos + anchored = 1 + density = 1 + state = 1 - glass - mineral = "glass" - icon_state = "door_as_gatmo1" +/obj/structure/door_assembly/door_assembly_atmo/glass + mineral = "glass" + icon_state = "door_as_gatmo1" - /obj/structure/door_assembly/door_assembly_research - name = "research airlock assembly" - icon_state = "door_as_res1" - glass_base_icon_state = "door_as_gres" - typetext = "research" - icontext = "res" - glass_type = /obj/machinery/door/airlock/glass_research - airlock_type = /obj/machinery/door/airlock/research - anchored = 1 - density = 1 - state = 1 +/obj/structure/door_assembly/door_assembly_research + name = "research airlock assembly" + icon_state = "door_as_res1" + glass_base_icon_state = "door_as_gres" + typetext = "research" + icontext = "res" + glass_type = /obj/machinery/door/airlock/glass_research + airlock_type = /obj/machinery/door/airlock/research + anchored = 1 + density = 1 + state = 1 - glass - mineral = "glass" - icon_state = "door_as_gres1" +/obj/structure/door_assembly/door_assembly_research/glass + mineral = "glass" + icon_state = "door_as_gres1" - /obj/structure/door_assembly/door_assembly_science - name = "science airlock assembly" - icon_state = "door_as_sci1" - glass_base_icon_state = "door_as_gsci" - typetext = "science" - icontext = "sci" - glass_type = /obj/machinery/door/airlock/glass_science - airlock_type = /obj/machinery/door/airlock/science - anchored = 1 - density = 1 - state = 1 +/obj/structure/door_assembly/door_assembly_science + name = "science airlock assembly" + icon_state = "door_as_sci1" + glass_base_icon_state = "door_as_gsci" + typetext = "science" + icontext = "sci" + glass_type = /obj/machinery/door/airlock/glass_science + airlock_type = /obj/machinery/door/airlock/science + anchored = 1 + density = 1 + state = 1 - glass - mineral = "glass" - icon_state = "door_as_gsci1" +/obj/structure/door_assembly/door_assembly_science/glass + mineral = "glass" + icon_state = "door_as_gsci1" - /obj/structure/door_assembly/door_assembly_med - name = "medical airlock assembly" - icon_state = "door_as_med1" - typetext = "medical" - icontext = "med" - airlock_type = /obj/machinery/door/airlock/medical - anchored = 1 - density = 1 - state = 1 +/obj/structure/door_assembly/door_assembly_med + name = "medical airlock assembly" + icon_state = "door_as_med1" + glass_base_icon_state = "door_as_gmed" + typetext = "medical" + icontext = "med" + glass_type = /obj/machinery/door/airlock/glass_medical + airlock_type = /obj/machinery/door/airlock/medical + anchored = 1 + density = 1 + state = 1 - glass - mineral = "glass" - icon_state = "door_as_gmed1" +/obj/structure/door_assembly/door_assembly_med/glass + mineral = "glass" + icon_state = "door_as_gmed1" - /obj/structure/door_assembly/door_assembly_mai - name = "maintenance airlock assembly" - icon_state = "door_as_mai1" - typetext = "maintenance" - icontext = "mai" - airlock_type = /obj/machinery/door/airlock/maintenance - anchored = 1 - density = 1 - state = 1 +/obj/structure/door_assembly/door_assembly_mai + name = "maintenance airlock assembly" + icon_state = "door_as_mai1" + typetext = "maintenance" + icontext = "mai" + airlock_type = /obj/machinery/door/airlock/maintenance + anchored = 1 + density = 1 + state = 1 - /obj/structure/door_assembly/door_assembly_ext - name = "external airlock assembly" - icon_state = "door_as_ext1" - typetext = "external" - icontext = "ext" - airlock_type = /obj/machinery/door/airlock/external - anchored = 1 - density = 1 - state = 1 +/obj/structure/door_assembly/door_assembly_ext + name = "external airlock assembly" + icon_state = "door_as_ext1" + typetext = "external" + icontext = "ext" + airlock_type = /obj/machinery/door/airlock/external + anchored = 1 + density = 1 + state = 1 - /obj/structure/door_assembly/door_assembly_fre - name = "freezer airlock assembly" - icon_state = "door_as_fre1" - typetext = "freezer" - icontext = "fre" - airlock_type = /obj/machinery/door/airlock/freezer - anchored = 1 - density = 1 - state = 1 +/obj/structure/door_assembly/door_assembly_fre + name = "freezer airlock assembly" + icon_state = "door_as_fre1" + typetext = "freezer" + icontext = "fre" + airlock_type = /obj/machinery/door/airlock/freezer + anchored = 1 + density = 1 + state = 1 - /obj/structure/door_assembly/door_assembly_hatch - name = "airtight hatch assembly" - icon_state = "door_as_hatch1" - typetext = "hatch" - icontext = "hatch" - airlock_type = /obj/machinery/door/airlock/hatch - anchored = 1 - density = 1 - state = 1 +/obj/structure/door_assembly/door_assembly_hatch + name = "airtight hatch assembly" + icon_state = "door_as_hatch1" + typetext = "hatch" + icontext = "hatch" + airlock_type = /obj/machinery/door/airlock/hatch + anchored = 1 + density = 1 + state = 1 - /obj/structure/door_assembly/door_assembly_mhatch - name = "maintenance hatch assembly" - icon_state = "door_as_mhatch1" - typetext = "maintenance_hatch" - icontext = "mhatch" - airlock_type = /obj/machinery/door/airlock/maintenance_hatch - anchored = 1 - density = 1 - state = 1 +/obj/structure/door_assembly/door_assembly_mhatch + name = "maintenance hatch assembly" + icon_state = "door_as_mhatch1" + typetext = "maintenance_hatch" + icontext = "mhatch" + airlock_type = /obj/machinery/door/airlock/maintenance_hatch + anchored = 1 + density = 1 + state = 1 - /obj/structure/door_assembly/door_assembly_glass - name = "glass airlock assembly" - icon_state = "door_as_g1" - airlock_type = /obj/machinery/door/airlock/glass - anchored = 1 - density = 1 - state = 1 - mineral = "glass" +/obj/structure/door_assembly/door_assembly_glass + name = "glass airlock assembly" + icon_state = "door_as_g1" + airlock_type = /obj/machinery/door/airlock/glass + anchored = 1 + density = 1 + state = 1 + mineral = "glass" - /obj/structure/door_assembly/door_assembly_gold - name = "gold airlock assembly" - icon_state = "door_as_gold1" - airlock_type = /obj/machinery/door/airlock/gold - anchored = 1 - density = 1 - state = 1 - mineral = "gold" +/obj/structure/door_assembly/door_assembly_gold + name = "gold airlock assembly" + icon_state = "door_as_gold1" + airlock_type = /obj/machinery/door/airlock/gold + anchored = 1 + density = 1 + state = 1 + mineral = "gold" - /obj/structure/door_assembly/door_assembly_silver - name = "silver airlock assembly" - icon_state = "door_as_silver1" - airlock_type = /obj/machinery/door/airlock/silver - anchored = 1 - density = 1 - state = 1 - mineral = "silver" +/obj/structure/door_assembly/door_assembly_silver + name = "silver airlock assembly" + icon_state = "door_as_silver1" + airlock_type = /obj/machinery/door/airlock/silver + anchored = 1 + density = 1 + state = 1 + mineral = "silver" - /obj/structure/door_assembly/door_assembly_diamond - name = "diamond airlock assembly" - icon_state = "door_as_diamond1" - airlock_type = /obj/machinery/door/airlock/diamond - anchored = 1 - density = 1 - state = 1 - mineral = "diamond" +/obj/structure/door_assembly/door_assembly_diamond + name = "diamond airlock assembly" + icon_state = "door_as_diamond1" + airlock_type = /obj/machinery/door/airlock/diamond + anchored = 1 + density = 1 + state = 1 + mineral = "diamond" - /obj/structure/door_assembly/door_assembly_uranium - name = "uranium airlock assembly" - icon_state = "door_as_uranium1" - airlock_type = /obj/machinery/door/airlock/uranium - anchored = 1 - density = 1 - state = 1 - mineral = "uranium" +/obj/structure/door_assembly/door_assembly_uranium + name = "uranium airlock assembly" + icon_state = "door_as_uranium1" + airlock_type = /obj/machinery/door/airlock/uranium + anchored = 1 + density = 1 + state = 1 + mineral = "uranium" - /obj/structure/door_assembly/door_assembly_plasma - name = "plasma airlock assembly" - icon_state = "door_as_plasma1" - airlock_type = /obj/machinery/door/airlock/plasma - anchored = 1 - density = 1 - state = 1 - mineral = "plasma" +/obj/structure/door_assembly/door_assembly_plasma + name = "plasma airlock assembly" + icon_state = "door_as_plasma1" + airlock_type = /obj/machinery/door/airlock/plasma + anchored = 1 + density = 1 + state = 1 + mineral = "plasma" - /obj/structure/door_assembly/door_assembly_clown - name = "bananium airlock assembly" - desc = "Honk" - icon_state = "door_as_clown1" - airlock_type = /obj/machinery/door/airlock/clown - anchored = 1 - density = 1 - state = 1 - mineral = "clown" +/obj/structure/door_assembly/door_assembly_clown + name = "bananium airlock assembly" + desc = "Honk" + icon_state = "door_as_clown1" + airlock_type = /obj/machinery/door/airlock/clown + anchored = 1 + density = 1 + state = 1 + mineral = "clown" - /obj/structure/door_assembly/door_assembly_sandstone - name = "sandstone airlock assembly" - icon_state = "door_as_sandstone1" - airlock_type = /obj/machinery/door/airlock/sandstone - anchored = 1 - density = 1 - state = 1 - mineral = "sandstone" +/obj/structure/door_assembly/door_assembly_sandstone + name = "sandstone airlock assembly" + icon_state = "door_as_sandstone1" + airlock_type = /obj/machinery/door/airlock/sandstone + anchored = 1 + density = 1 + state = 1 + mineral = "sandstone" - /obj/structure/door_assembly/door_assembly_highsecurity // Borrowing this until WJohnston makes sprites for the assembly - name = "high security airlock assembly" - icon_state = "door_as_highsec1" - typetext = "highsecurity" - icontext = "highsec" - airlock_type = /obj/machinery/door/airlock/highsecurity - anchored = 1 - density = 1 - state = 1 +/obj/structure/door_assembly/door_assembly_highsecurity // Borrowing this until WJohnston makes sprites for the assembly + name = "high security airlock assembly" + icon_state = "door_as_highsec1" + typetext = "highsecurity" + icontext = "highsec" + airlock_type = /obj/machinery/door/airlock/highsecurity + anchored = 1 + density = 1 + state = 1 - /obj/structure/door_assembly/door_assembly_vault - name = "vault door assembly" - icon_state = "door_as_vault1" - typetext = "vault" - icontext = "vault" - airlock_type = /obj/machinery/door/airlock/vault - anchored = 1 - density = 1 - state = 1 +/obj/structure/door_assembly/door_assembly_vault + name = "vault door assembly" + icon_state = "door_as_vault1" + typetext = "vault" + icontext = "vault" + airlock_type = /obj/machinery/door/airlock/vault + anchored = 1 + density = 1 + state = 1 - /obj/structure/door_assembly/door_assembly_shuttle - name = "shuttle airlock assembly" - icon_state = "door_as_shuttle1" - typetext = "shuttle" - icontext = "shuttle" - airlock_type = /obj/machinery/door/airlock/shuttle - anchored = 1 - density = 1 - state = 1 +/obj/structure/door_assembly/door_assembly_shuttle + name = "shuttle airlock assembly" + icon_state = "door_as_shuttle1" + typetext = "shuttle" + icontext = "shuttle" + airlock_type = /obj/machinery/door/airlock/shuttle + anchored = 1 + density = 1 + state = 1 - /obj/structure/door_assembly/door_assembly_wood - name = "wooden airlock assembly" - icon_state = "door_as_wood1" - airlock_type = /obj/machinery/door/airlock/wood - anchored = 1 - density = 1 - state = 1 - mineral = "wood" +/obj/structure/door_assembly/door_assembly_wood + name = "wooden airlock assembly" + icon_state = "door_as_wood1" + airlock_type = /obj/machinery/door/airlock/wood + anchored = 1 + density = 1 + state = 1 + mineral = "wood" + +/obj/structure/door_assembly/door_assembly_viro + name = "virology airlock assembly" + icon_state = "door_as_viro1" + glass_base_icon_state = "door_as_gviro" + typetext = "virology" + icontext = "viro" + glass_type = /obj/machinery/door/airlock/glass_virology + airlock_type = /obj/machinery/door/airlock/virology + anchored = 1 + density = 1 + state = 1 + +/obj/structure/door_assembly/door_assembly_viro/glass + mineral = "glass" + icon_state = "door_as_gviro1" /obj/structure/door_assembly/attackby(obj/item/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/pen)) var/t = copytext(stripped_input(user, "Enter the name for the door.", src.name, src.created_name),1,MAX_NAME_LEN) - if(!t) + if(!t) return if(!in_range(src, usr) && src.loc != usr) return @@ -426,7 +444,7 @@ obj/structure/door_assembly playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) if(do_after(user, 40)) - if( !WT.isOn() ) + if( !WT.isOn() ) return user << " You've disassembled the airlock assembly." new /obj/item/stack/sheet/metal(get_turf(src), 4) @@ -447,7 +465,7 @@ obj/structure/door_assembly user.visible_message("[user] secures the airlock assembly to the floor.", "You start to secure the airlock assembly to the floor.") if(do_after(user, 40)) - if( src.anchored ) + if( src.anchored ) return user << " You've secured the airlock assembly." src.name = "secured airlock assembly" @@ -457,7 +475,7 @@ obj/structure/door_assembly playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) user.visible_message("[user] unsecures the airlock assembly from the floor.", "You start to unsecure the airlock assembly from the floor.") if(do_after(user, 40)) - if( !src.anchored ) + if( !src.anchored ) return user << " You've unsecured the airlock assembly." src.name = "airlock assembly" @@ -469,11 +487,11 @@ obj/structure/door_assembly user << "You need one length of cable to wire the airlock assembly." return user.visible_message("[user] wires the airlock assembly.", "You start to wire the airlock assembly.") - if(do_after(user, 40)) + if(do_after(user, 40)) if(C.get_amount() < 1 || state != 0) return C.use(1) src.state = 1 - user << "You've wired the airlock assembly." + user << "You've wired the airlock assembly." src.name = "wired airlock assembly" else if(istype(W, /obj/item/weapon/wirecutters) && state == 1 ) @@ -481,7 +499,7 @@ obj/structure/door_assembly user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.") if(do_after(user, 40)) - if( src.state != 1 ) + if( src.state != 1 ) return user << " You've cut the wires from the airlock assembly." new/obj/item/stack/cable_coil(get_turf(user), 1) @@ -495,7 +513,7 @@ obj/structure/door_assembly W.loc = src if(do_after(user, 40)) - if( src.state != 1 ) + if( src.state != 1 ) return user << " You've installed the airlock electronics." src.state = 2 @@ -530,9 +548,9 @@ obj/structure/door_assembly if(G.type == /obj/item/stack/sheet/rglass) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] adds [G.name] to the airlock assembly.", "You start to install [G.name] into the airlock assembly.") - if(do_after(user, 40)) - if(G.get_amount() < 1 || mineral) return - user << "You've installed reinforced glass windows into the airlock assembly." + if(do_after(user, 40)) + if(G.get_amount() < 1 || mineral) return + user << "You've installed reinforced glass windows into the airlock assembly." G.use(1) mineral = "glass" name = "near finished window airlock assembly" @@ -553,9 +571,9 @@ obj/structure/door_assembly if(G.get_amount() >= 2) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] adds [G.name] to the airlock assembly.", "You start to install [G.name] into the airlock assembly.") - if(do_after(user, 40)) - if(G.get_amount() < 2 || mineral) return - user << "You've installed [M] plating into the airlock assembly." + if(do_after(user, 40)) + if(G.get_amount() < 2 || mineral) return + user << "You've installed [M] plating into the airlock assembly." G.use(2) mineral = "[M]" name = "near finished [M] airlock assembly" diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 171e430bdbb..46730d0332f 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -59,6 +59,10 @@ SetOpacity(0) update_icon(0) else + var/srcturf = get_turf(src) + for(var/mob/living/obstacle in srcturf) //Stop people from using this as a shield + opening = 0 + return do_the_flick() density = 1 sleep(4) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index bfaa43fd18a..514572d4e9b 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -5,199 +5,199 @@ layer = 2 var/state = 0 - attackby(obj/item/W as obj, mob/user as mob) - add_fingerprint(user) - if(istype(W, /obj/item/weapon/wrench) && state == 0) - if(anchored && !istype(src,/obj/structure/girder/displaced)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "Now disassembling the girder..." - if(do_after(user,40)) - if(!src) return - user << "You dissasembled the girder!" - new /obj/item/stack/sheet/metal(get_turf(src)) - qdel(src) - else if(!anchored) - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "Now securing the girder..." - if(do_after(user, 40)) - if(!src) return - user << "You secured the girder!" - var/obj/structure/girder/G = new (loc) - transfer_fingerprints_to(G) - qdel(src) - - else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter)) - user << "Now slicing apart the girder..." - if(do_after(user,30)) +/obj/structure/girder/attackby(obj/item/W as obj, mob/user as mob) + add_fingerprint(user) + if(istype(W, /obj/item/weapon/wrench) && state == 0) + if(anchored && !istype(src,/obj/structure/girder/displaced)) + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) + user << "Now disassembling the girder..." + if(do_after(user,40)) if(!src) return - user << "You slice apart the girder!" + user << "You dissasembled the girder!" new /obj/item/stack/sheet/metal(get_turf(src)) qdel(src) - - else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill)) - user << "You drill through the girder!" - new /obj/item/stack/sheet/metal(get_turf(src)) - qdel(src) - - else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 && istype(src,/obj/structure/girder/reinforced)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user << "Now unsecuring support struts..." - if(do_after(user,40)) + else if(!anchored) + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) + user << "Now securing the girder..." + if(do_after(user, 40)) if(!src) return - user << "You unsecured the support struts!" - state = 1 - - else if(istype(W, /obj/item/weapon/wirecutters) && istype(src,/obj/structure/girder/reinforced) && state == 1) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) - user << "Now removing support struts..." - if(do_after(user,40)) - if(!src) return - user << "You removed the support struts!" + user << "You secured the girder!" var/obj/structure/girder/G = new (loc) transfer_fingerprints_to(G) qdel(src) - else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored ) - playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) - user << "Now dislodging the girder..." - if(do_after(user, 40)) - if(!src) return - user << "You dislodged the girder!" - var/obj/structure/girder/displaced/D = new (loc) - transfer_fingerprints_to(D) - qdel(src) + else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter)) + user << "Now slicing apart the girder..." + if(do_after(user,30)) + if(!src) return + user << "You slice apart the girder!" + new /obj/item/stack/sheet/metal(get_turf(src)) + qdel(src) - else if(istype(W, /obj/item/stack/sheet)) + else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill)) + user << "You drill through the girder!" + new /obj/item/stack/sheet/metal(get_turf(src)) + qdel(src) - var/obj/item/stack/sheet/S = W - switch(S.type) + else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 && istype(src,/obj/structure/girder/reinforced)) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) + user << "Now unsecuring support struts..." + if(do_after(user,40)) + if(!src) return + user << "You unsecured the support struts!" + state = 1 - if(/obj/item/stack/sheet/metal, /obj/item/stack/sheet/metal/cyborg) - if(!anchored) - if (S.use(2)) - user << "You create a false wall! Push on it to open or close the passage." - var/obj/structure/falsewall/F = new (loc) - transfer_fingerprints_to(F) - qdel(src) - else - user << "You need two sheets of metal to create a false wall." - return - else - if(S.get_amount() < 2) - user << "You need two sheets of metal to finish a wall." - return - user << "Now adding plating..." - if (do_after(user, 40)) - if(loc == null || S.get_amount() < 2) - return - S.use(2) - user << "You added the plating!" - var/turf/Tsrc = get_turf(src) - Tsrc.ChangeTurf(/turf/simulated/wall) - for(var/turf/simulated/wall/X in Tsrc.loc) - if(X) - transfer_fingerprints_to(X) - qdel(src) - return + else if(istype(W, /obj/item/weapon/wirecutters) && istype(src,/obj/structure/girder/reinforced) && state == 1) + playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) + user << "Now removing support struts..." + if(do_after(user,40)) + if(!src) return + user << "You removed the support struts!" + var/obj/structure/girder/G = new (loc) + transfer_fingerprints_to(G) + qdel(src) - if(/obj/item/stack/sheet/plasteel) - if(!anchored) - if(S.amount < 2) - user << "You need at least two sheets to create a false wall." - return - S.use(2) + else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored ) + playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) + user << "Now dislodging the girder..." + if(do_after(user, 40)) + if(!src) return + user << "You dislodged the girder!" + var/obj/structure/girder/displaced/D = new (loc) + transfer_fingerprints_to(D) + qdel(src) + + else if(istype(W, /obj/item/stack/sheet)) + + var/obj/item/stack/sheet/S = W + switch(S.type) + + if(/obj/item/stack/sheet/metal, /obj/item/stack/sheet/metal/cyborg) + if(!anchored) + if (S.use(2)) user << "You create a false wall! Push on it to open or close the passage." - var/obj/structure/falsewall/reinforced/FW = new (loc) - transfer_fingerprints_to(FW) + var/obj/structure/falsewall/F = new (loc) + transfer_fingerprints_to(F) qdel(src) else - if (src.icon_state == "reinforced") //I cant believe someone would actually write this line of code... - if(S.amount < 1) return ..() - user << "Now finalising reinforced wall..." - if(do_after(user, 50)) - if(!src || !S || S.amount < 1) return - S.use(1) - user << "Wall fully reinforced!" - var/turf/Tsrc = get_turf(src) - Tsrc.ChangeTurf(/turf/simulated/wall/r_wall) - for(var/turf/simulated/wall/r_wall/X in Tsrc.loc) - if(X) transfer_fingerprints_to(X) - qdel(src) - return - else - if(S.amount < 1) return ..() - user << "Now reinforcing girders..." - if (do_after(user,60)) - if(!src || !S || S.amount < 1) return - S.use(1) - user << "Girders reinforced!" - var/obj/structure/girder/reinforced/R = new (loc) - transfer_fingerprints_to(R) - qdel(src) + user << "You need two sheets of metal to create a false wall." + return + else + if(S.get_amount() < 2) + user << "You need two sheets of metal to finish a wall." + return + user << "Now adding plating..." + if (do_after(user, 40)) + if(loc == null || S.get_amount() < 2) return + S.use(2) + user << "You added the plating!" + var/turf/Tsrc = get_turf(src) + Tsrc.ChangeTurf(/turf/simulated/wall) + for(var/turf/simulated/wall/X in Tsrc.loc) + if(X) + transfer_fingerprints_to(X) + qdel(src) + return - if(S.sheettype) - var/M = S.sheettype + if(/obj/item/stack/sheet/plasteel) if(!anchored) if(S.amount < 2) user << "You need at least two sheets to create a false wall." return S.use(2) user << "You create a false wall! Push on it to open or close the passage." - var/F = text2path("/obj/structure/falsewall/[M]") - var/obj/structure/FW = new F (loc) + var/obj/structure/falsewall/reinforced/FW = new (loc) transfer_fingerprints_to(FW) qdel(src) else - if(S.amount < 2) return ..() - user << "Now adding plating..." - if (do_after(user,40)) - if(!src || !S || S.amount < 2) return - S.use(2) - user << "You added the plating!" - var/turf/Tsrc = get_turf(src) - Tsrc.ChangeTurf(text2path("/turf/simulated/wall/mineral/[M]")) - for(var/turf/simulated/wall/mineral/X in Tsrc.loc) - if(X) transfer_fingerprints_to(X) - qdel(src) + if (src.icon_state == "reinforced") //I cant believe someone would actually write this line of code... + if(S.amount < 1) return ..() + user << "Now finalising reinforced wall..." + if(do_after(user, 50)) + if(!src || !S || S.amount < 1) return + S.use(1) + user << "Wall fully reinforced!" + var/turf/Tsrc = get_turf(src) + Tsrc.ChangeTurf(/turf/simulated/wall/r_wall) + for(var/turf/simulated/wall/r_wall/X in Tsrc.loc) + if(X) transfer_fingerprints_to(X) + qdel(src) + return + else + if(S.amount < 1) return ..() + user << "Now reinforcing girders..." + if (do_after(user,60)) + if(!src || !S || S.amount < 1) return + S.use(1) + user << "Girders reinforced!" + var/obj/structure/girder/reinforced/R = new (loc) + transfer_fingerprints_to(R) + qdel(src) + return + + if(S.sheettype) + var/M = S.sheettype + if(!anchored) + if(S.amount < 2) + user << "You need at least two sheets to create a false wall." return - - add_hiddenprint(usr) - - else if(istype(W, /obj/item/pipe)) - var/obj/item/pipe/P = W - if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds. - user.drop_item() - P.loc = src.loc - user << "You fit the pipe into the [src]!" - else - ..() - - - blob_act() - if(prob(40)) - qdel(src) - - - ex_act(severity) - switch(severity) - if(1.0) + S.use(2) + user << "You create a false wall! Push on it to open or close the passage." + var/F = text2path("/obj/structure/falsewall/[M]") + var/obj/structure/FW = new F (loc) + transfer_fingerprints_to(FW) qdel(src) - return - if(2.0) - if (prob(30)) - var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal) - new remains(loc) - qdel(src) - return - if(3.0) - if (prob(5)) - var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal) - new remains(loc) - qdel(src) - return else - return + if(S.amount < 2) return ..() + user << "Now adding plating..." + if (do_after(user,40)) + if(!src || !S || S.amount < 2) return + S.use(2) + user << "You added the plating!" + var/turf/Tsrc = get_turf(src) + Tsrc.ChangeTurf(text2path("/turf/simulated/wall/mineral/[M]")) + for(var/turf/simulated/wall/mineral/X in Tsrc.loc) + if(X) transfer_fingerprints_to(X) + qdel(src) + return + + add_hiddenprint(usr) + + else if(istype(W, /obj/item/pipe)) + var/obj/item/pipe/P = W + if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds. + user.drop_item() + P.loc = src.loc + user << "You fit the pipe into the [src]!" + else + ..() + + +/obj/structure/girder/blob_act() + if(prob(40)) + qdel(src) + + +/obj/structure/girder/ex_act(severity) + switch(severity) + if(1.0) + qdel(src) + return + if(2.0) + if (prob(30)) + var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal) + new remains(loc) + qdel(src) + return + if(3.0) + if (prob(5)) + var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal) + new remains(loc) + qdel(src) + return + else + return /obj/structure/girder/displaced icon_state = "displaced" @@ -214,50 +214,50 @@ density = 1 layer = 2 - attackby(obj/item/W as obj, mob/user as mob) - if(istype(W, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "Now disassembling the girder..." - if(do_after(user,40)) - user << "You dissasembled the girder!" - var/obj/effect/decal/remains/human/R = new (get_turf(src)) - transfer_fingerprints_to(R) - qdel(src) - - else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter)) - user << "Now slicing apart the girder..." - if(do_after(user,30)) - user << "You slice apart the girder!" - var/obj/effect/decal/remains/human/R = new (get_turf(src)) - transfer_fingerprints_to(R) - qdel(src) - - else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill)) - user << "You drill through the girder!" - if(do_after(user, 5)) - var/obj/effect/decal/remains/human/R = new (get_turf(src)) - transfer_fingerprints_to(R) - qdel(src) - - blob_act() - if(prob(40)) +/obj/structure/cultgirder/attackby(obj/item/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/wrench)) + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) + user << "Now disassembling the girder..." + if(do_after(user,40)) + user << "You dissasembled the girder!" + var/obj/effect/decal/remains/human/R = new (get_turf(src)) + transfer_fingerprints_to(R) qdel(src) + else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter)) + user << "Now slicing apart the girder..." + if(do_after(user,30)) + user << "You slice apart the girder!" + var/obj/effect/decal/remains/human/R = new (get_turf(src)) + transfer_fingerprints_to(R) + qdel(src) - ex_act(severity) - switch(severity) - if(1.0) + else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill)) + user << "You drill through the girder!" + if(do_after(user, 5)) + var/obj/effect/decal/remains/human/R = new (get_turf(src)) + transfer_fingerprints_to(R) + qdel(src) + +/obj/structure/cultgirder/blob_act() + if(prob(40)) + qdel(src) + + +/obj/structure/cultgirder/ex_act(severity) + switch(severity) + if(1.0) + qdel(src) + return + if(2.0) + if (prob(30)) + new /obj/effect/decal/remains/human(loc) qdel(src) - return - if(2.0) - if (prob(30)) - new /obj/effect/decal/remains/human(loc) - qdel(src) - return - if(3.0) - if (prob(5)) - new /obj/effect/decal/remains/human(loc) - qdel(src) - return - else - return \ No newline at end of file + return + if(3.0) + if (prob(5)) + new /obj/effect/decal/remains/human(loc) + qdel(src) + return + else + return \ No newline at end of file diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index a526f7ec191..df18f1b114e 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -120,51 +120,52 @@ //window placing begin else if(istype(W, /obj/item/stack/sheet/rglass) || istype(W, /obj/item/stack/sheet/glass)) - var/obj/item/stack/ST = W - if (ST.get_amount() < 1) - user << "You need at least one sheet of glass for that." - return - var/dir_to_set = 1 - if(loc == user.loc) - dir_to_set = user.dir - else - if( ( x == user.x ) || (y == user.y) ) //Only supposed to work for cardinal directions. - if( x == user.x ) - if( y > user.y ) - dir_to_set = 2 - else - dir_to_set = 1 - else if( y == user.y ) - if( x > user.x ) - dir_to_set = 8 - else - dir_to_set = 4 - else - user << "You can't reach." - return //Only works for cardinal direcitons, diagonals aren't supposed to work like this. - for(var/obj/structure/window/WINDOW in loc) - if(WINDOW.dir == dir_to_set) - user << "There is already a window facing this way there." + if (!destroyed) + var/obj/item/stack/ST = W + if (ST.get_amount() < 1) + user << "You need at least one sheet of glass for that." return - user << "You start placing the window." - if(do_after(user,20)) - if(!src) return //Grille destroyed while waiting + var/dir_to_set = 1 + if(loc == user.loc) + dir_to_set = user.dir + else + if( ( x == user.x ) || (y == user.y) ) //Only supposed to work for cardinal directions. + if( x == user.x ) + if( y > user.y ) + dir_to_set = 2 + else + dir_to_set = 1 + else if( y == user.y ) + if( x > user.x ) + dir_to_set = 8 + else + dir_to_set = 4 + else + user << "You can't reach." + return //Only works for cardinal direcitons, diagonals aren't supposed to work like this. for(var/obj/structure/window/WINDOW in loc) - if(WINDOW.dir == dir_to_set)//checking this for a 2nd time to check if a window was made while we were waiting. + if(WINDOW.dir == dir_to_set) user << "There is already a window facing this way there." return - var/obj/structure/window/WD - if(istype(W, /obj/item/stack/sheet/rglass)) - WD = new/obj/structure/window(loc,1) //reinforced window - else - WD = new/obj/structure/window(loc,0) //normal window - WD.dir = dir_to_set - WD.ini_dir = dir_to_set - WD.anchored = 0 - WD.state = 0 - ST.use(1) - user << "You place the [WD] on [src]." - return + user << "You start placing the window." + if(do_after(user,20)) + if(!src) return //Grille destroyed while waiting + for(var/obj/structure/window/WINDOW in loc) + if(WINDOW.dir == dir_to_set)//checking this for a 2nd time to check if a window was made while we were waiting. + user << "There is already a window facing this way there." + return + var/obj/structure/window/WD + if(istype(W, /obj/item/stack/sheet/rglass)) + WD = new/obj/structure/window(loc,1) //reinforced window + else + WD = new/obj/structure/window(loc,0) //normal window + WD.dir = dir_to_set + WD.ini_dir = dir_to_set + WD.anchored = 0 + WD.state = 0 + ST.use(1) + user << "You place the [WD] on [src]." + return //window placing end else if(istype(W, /obj/item/weapon/shard)) @@ -184,13 +185,12 @@ /obj/structure/grille/proc/healthcheck() if(health <= 0) - var/obj/item/stack/rods/newrods = new(loc) - transfer_fingerprints_to(newrods) - if(!destroyed) icon_state = "brokengrille" density = 0 destroyed = 1 + var/obj/item/stack/rods/newrods = new(loc) + transfer_fingerprints_to(newrods) else if(health <= -6) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 82c7850793e..1d1d5661cea 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -11,70 +11,69 @@ var/occupied = 0 var/meattype = 0 // 0 - Nothing, 1 - Monkey, 2 - Xeno -/obj/structure/kitchenspike - attack_paw(mob/user as mob) - return src.attack_hand(usr) +/obj/structure/kitchenspike/attack_paw(mob/user as mob) + return src.attack_hand(usr) - attackby(obj/item/weapon/grab/G as obj, mob/user as mob) - if(!istype(G, /obj/item/weapon/grab)) - return - if(istype(G.affecting, /mob/living/carbon/monkey)) - if(src.occupied == 0) - src.icon_state = "spikebloody" - src.occupied = 1 - src.meat = 5 - src.meattype = 1 - for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [user] has forced [G.affecting] onto the spike, killing them instantly!")) - qdel(G.affecting) - qdel(G) +/obj/structure/kitchenspike/attackby(obj/item/weapon/grab/G as obj, mob/user as mob) + if(!istype(G, /obj/item/weapon/grab)) + return + if(istype(G.affecting, /mob/living/carbon/monkey)) + if(src.occupied == 0) + src.icon_state = "spikebloody" + src.occupied = 1 + src.meat = 5 + src.meattype = 1 + for(var/mob/O in viewers(src, null)) + O.show_message(text("[user] has forced [G.affecting] onto the spike, killing them instantly!")) + qdel(G.affecting) + qdel(G) - else - user << "\red The spike already has something on it, finish collecting its meat first!" - else if(istype(G.affecting, /mob/living/carbon/alien)) - if(src.occupied == 0) - src.icon_state = "spikebloodygreen" - src.occupied = 1 - src.meat = 5 - src.meattype = 2 - for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [user] has forced [G.affecting] onto the spike, killing them instantly!")) - qdel(G.affecting) - qdel(G) - else - user << "\red The spike already has something on it, finish collecting its meat first!" else - user << "\red They are too big for the spike, try something smaller!" - return + user << "The spike already has something on it, finish collecting its meat first!" + else if(istype(G.affecting, /mob/living/carbon/alien)) + if(src.occupied == 0) + src.icon_state = "spikebloodygreen" + src.occupied = 1 + src.meat = 5 + src.meattype = 2 + for(var/mob/O in viewers(src, null)) + O.show_message(text("[user] has forced [G.affecting] onto the spike, killing them instantly!")) + qdel(G.affecting) + qdel(G) + else + user << "The spike already has something on it, finish collecting its meat first!" + else + user << "They are too big for the spike, try something smaller!" + return -// MouseDrop_T(var/atom/movable/C, mob/user) -// if(istype(C, /obj/mob/carbon/monkey) -// else if(istype(C, /obj/mob/carbon/alien) && !istype(C, /mob/living/carbon/alien/larva/slime)) -// else if(istype(C, /obj/livestock/spesscarp +///obj/structure/kitchenspike/MouseDrop_T(var/atom/movable/C, mob/user) +// if(istype(C, /obj/mob/carbon/monkey) +// else if(istype(C, /obj/mob/carbon/alien) && !istype(C, /mob/living/carbon/alien/larva/slime)) +// else if(istype(C, /obj/livestock/spesscarp - attack_hand(mob/user as mob) - if(..()) - return - if(src.occupied) - if(src.meattype == 1) - if(src.meat > 1) - src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey( src.loc ) - usr << "You remove some meat from the monkey." - else if(src.meat == 1) - src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey(src.loc) - usr << "You remove the last piece of meat from the monkey!" - src.icon_state = "spike" - src.occupied = 0 - else if(src.meattype == 2) - if(src.meat > 1) - src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/xenomeat( src.loc ) - usr << "You remove some meat from the alien." - else if(src.meat == 1) - src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/xenomeat(src.loc) - usr << "You remove the last piece of meat from the alien!" - src.icon_state = "spike" - src.occupied = 0 \ No newline at end of file +/obj/structure/kitchenspike/attack_hand(mob/user as mob) + if(..()) + return + if(src.occupied) + if(src.meattype == 1) + if(src.meat > 1) + src.meat-- + new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey( src.loc ) + usr << "You remove some meat from the monkey." + else if(src.meat == 1) + src.meat-- + new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey(src.loc) + usr << "You remove the last piece of meat from the monkey!" + src.icon_state = "spike" + src.occupied = 0 + else if(src.meattype == 2) + if(src.meat > 1) + src.meat-- + new /obj/item/weapon/reagent_containers/food/snacks/xenomeat( src.loc ) + usr << "You remove some meat from the alien." + else if(src.meat == 1) + src.meat-- + new /obj/item/weapon/reagent_containers/food/snacks/xenomeat(src.loc) + usr << "You remove the last piece of meat from the alien!" + src.icon_state = "spike" + src.occupied = 0 diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm index 94e4b829939..69a6626d69a 100644 --- a/code/game/objects/structures/lamarr_cage.dm +++ b/code/game/objects/structures/lamarr_cage.dm @@ -75,10 +75,10 @@ if (src.destroyed) return else - usr << text("\blue You kick the lab cage.") + usr << text("You kick the lab cage.") for(var/mob/O in oviewers()) if ((O.client && !( O.blinded ))) - O << text("\red [] kicks the lab cage.", usr) + O << text("[] kicks the lab cage.", usr) src.health -= 2 healthcheck() return diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index aa5dda732da..ea89e95dfa6 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -58,7 +58,7 @@ if (istype(C, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = C if(WT.remove_fuel(0, user)) - user << "\blue Slicing lattice joints ..." + user << "Slicing lattice joints ..." new /obj/item/stack/rods(src.loc) qdel(src) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 50a4c2579cb..637d0ebffbc 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -145,7 +145,7 @@ if (user != O) for(var/mob/B in viewers(user, 3)) if ((B.client && !( B.blinded ))) - B << text("\red [] stuffs [] into []!", user, O, src) + B << text("[] stuffs [] into []!", user, O, src) return @@ -201,7 +201,7 @@ /obj/structure/crematorium/attack_hand(mob/user as mob) if (cremating || locked) - user << "\red It's locked." + user << "It's locked." return if (!connected) user << "That doesn't appear to have a tray." @@ -236,12 +236,12 @@ if(contents.len <= 1) for (var/mob/M in viewers(src)) - M.show_message("\red You hear a hollow crackle.", 1) + M.show_message("You hear a hollow crackle.", 1) return else for (var/mob/M in viewers(src)) - M.show_message("\red You hear a roar as the crematorium activates.", 1) + M.show_message("You hear a roar as the crematorium activates.", 1) cremating = 1 locked = 1 @@ -325,7 +325,7 @@ if (user != O) for(var/mob/B in viewers(user, 3)) if ((B.client && !( B.blinded ))) - B << text("\red [] stuffs [] into []!", user, O, src) + B << text("[] stuffs [] into []!", user, O, src) //Foreach goto(99) return @@ -336,6 +336,6 @@ if (!C.cremating) C.cremate(user) else - usr << "\red Access denied." + usr << "Access denied." return diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 879fdba84cc..3b3e131ca64 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -97,12 +97,12 @@ if (M == usr) M.visible_message(\ - "\blue [M.name] buckles in!",\ + "[M.name] buckles in!",\ "You buckle yourself to [src].",\ "You hear metal clanking") else M.visible_message(\ - "\blue [M.name] is buckled in to [src] by [user.name]!",\ + "[M.name] is buckled in to [src] by [user.name]!",\ "You are buckled in to [src] by [user.name].",\ "You hear metal clanking") M.buckled = src diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index b22febb5900..a91c555d6bf 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -103,6 +103,32 @@ tools = list(/obj/item/weapon/screwdriver) time = 20 +/datum/table_recipe/meteorshot + name = "Meteorshot Shell" + result_path = /obj/item/ammo_casing/shotgun/meteorshot + reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, + /obj/item/weapon/rcd_ammo = 1, + /obj/item/weapon/stock_parts/manipulator = 2) + tools = list(/obj/item/weapon/screwdriver) + time = 5 + +/datum/table_recipe/pulseslug + name = "Pulse Slug Shell" + result_path = /obj/item/ammo_casing/shotgun/pulseslug + reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, + /obj/item/weapon/stock_parts/capacitor/adv = 2, + /obj/item/weapon/stock_parts/micro_laser/ultra = 1) + tools = list(/obj/item/weapon/screwdriver) + time = 5 + +/datum/table_recipe/dragonsbreath + name = "Dragonsbreath Shell" + result_path = /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath + reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, + /datum/reagent/phosphorus = 5,) + tools = list(/obj/item/weapon/screwdriver) + time = 5 + /obj/structure/table name = "table" @@ -269,7 +295,7 @@ var/dat = "

    Construction menu

    " dat += "
    " if(busy) - dat += "Construction inprogress...
    " + dat += "Construction in progress..." else for(var/datum/table_recipe/R in table_recipes) if(check_contents(R)) @@ -559,8 +585,14 @@ return if (istype(I, /obj/item/weapon/wrench)) - table_destroy(2, user) - return + if(istype(src, /obj/structure/table/reinforced)) + var/obj/structure/table/reinforced/RT = src + if(RT.status == 1) + table_destroy(2, user) + return + else + table_destroy(2, user) + return if (istype(I, /obj/item/weapon/storage/bag/tray)) var/obj/item/weapon/storage/bag/tray/T = I @@ -606,24 +638,13 @@ Destroy type values: return if(destroy_type == 2) - if(istype(src, /obj/structure/table/reinforced)) - var/obj/structure/table/reinforced/RT = src - if(RT.status == 1) - user << "Now disassembling the reinforced table" - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - if (do_after(user, 50)) - new parts( src.loc ) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - qdel(src) - return - else - user << "Now disassembling table" - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - if (do_after(user, 50)) - new parts( src.loc ) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - qdel(src) - return + user << "Now disassembling the [src.name]" + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + if (do_after(user, 50)) + new parts( src.loc ) + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + qdel(src) + return @@ -659,18 +680,18 @@ Destroy type values: var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0, user)) if(src.status == 2) - user << "\blue Now weakening the reinforced table" + user << "Now weakening the reinforced table" playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) if (do_after(user, 50)) if(!src || !WT.isOn()) return - user << "\blue Table weakened" + user << "Table weakened" src.status = 1 else - user << "\blue Now strengthening the reinforced table" + user << "Now strengthening the reinforced table" playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) if (do_after(user, 50)) if(!src || !WT.isOn()) return - user << "\blue Table strengthened" + user << "Table strengthened" src.status = 2 return ..() @@ -779,4 +800,3 @@ Destroy type values: qdel(src) /obj/structure/rack/attack_tk() // no telehulk sorry return - diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index 7b972e6b0b9..9f0f6e9686e 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -8,45 +8,45 @@ flags = CONDUCT var/obj/item/target/pinned_target // the current pinned target - Move() - ..() - // Move the pinned target along with the stake - if(pinned_target in view(3, src)) - pinned_target.loc = loc +/obj/structure/target_stake/Move() + ..() + // Move the pinned target along with the stake + if(pinned_target in view(3, src)) + pinned_target.loc = loc - else // Sanity check: if the pinned target can't be found in immediate view - pinned_target = null - density = 1 + else // Sanity check: if the pinned target can't be found in immediate view + pinned_target = null + density = 1 - attackby(obj/item/W as obj, mob/user as mob) - // Putting objects on the stake. Most importantly, targets - if(pinned_target) - return // get rid of that pinned target first! +/obj/structure/target_stake/attackby(obj/item/W as obj, mob/user as mob) + // Putting objects on the stake. Most importantly, targets + if(pinned_target) + return // get rid of that pinned target first! - if(istype(W, /obj/item/target)) - density = 0 - W.density = 1 - user.drop_item() - W.loc = loc - W.layer = 3.1 - pinned_target = W - user << "You slide the target into the stake." - return + if(istype(W, /obj/item/target)) + density = 0 + W.density = 1 + user.drop_item() + W.loc = loc + W.layer = 3.1 + pinned_target = W + user << "You slide the target into the stake." + return - attack_hand(mob/user as mob) - // taking pinned targets off! - if(pinned_target) - density = 1 - pinned_target.density = 0 - pinned_target.layer = OBJ_LAYER +/obj/structure/target_stake/attack_hand(mob/user as mob) + // taking pinned targets off! + if(pinned_target) + density = 1 + pinned_target.density = 0 + pinned_target.layer = OBJ_LAYER - pinned_target.loc = user.loc - if(ishuman(user)) - if(!user.get_active_hand()) - user.put_in_hands(pinned_target) - user << "You take the target out of the stake." - else - pinned_target.loc = get_turf(user) + pinned_target.loc = user.loc + if(ishuman(user)) + if(!user.get_active_hand()) + user.put_in_hands(pinned_target) user << "You take the target out of the stake." + else + pinned_target.loc = get_turf(user) + user << "You take the target out of the stake." - pinned_target = null \ No newline at end of file + pinned_target = null diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 26a0e40042a..0e9c73ac499 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -153,6 +153,7 @@ /obj/machinery/shower/attack_hand(mob/M) on = !on update_icon() + add_fingerprint(M) if(on) for (var/atom/movable/G in loc) Crossed(G) @@ -171,7 +172,9 @@ watertemp = "boiling" if("boiling") watertemp = "normal" - user.visible_message("[user] adjusts the shower with the [I].", "You adjust the shower with the [I].") + user.visible_message("[user] adjusts the shower with the [I].", "You adjust the shower with the [I] to [watertemp] temperature.") + log_game("[key_name(user)] has wrenched a shower to [watertemp] at ([x],[y],[z])") + add_hiddenprint(user) /obj/machinery/shower/update_icon() //this is terribly unreadable, but basically it makes the shower mist up diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 9126e268d5d..281594704e1 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -99,7 +99,7 @@ obj/structure/windoor_assembly/Destroy() if(do_after(user, 40)) if(!src) return - user << "\blue You've secured the windoor assembly!" + user << "You've secured the windoor assembly!" src.anchored = 1 if(src.secure) src.name = "secure anchored windoor assembly" @@ -113,7 +113,7 @@ obj/structure/windoor_assembly/Destroy() if(do_after(user, 40)) if(!src) return - user << "\blue You've unsecured the windoor assembly!" + user << "You've unsecured the windoor assembly!" src.anchored = 0 if(src.secure) src.name = "secure windoor assembly" @@ -124,15 +124,15 @@ obj/structure/windoor_assembly/Destroy() else if(istype(W, /obj/item/stack/sheet/plasteel) && !secure) var/obj/item/stack/sheet/plasteel/P = W if(P.amount < 2) - user << "\red You need more plasteel to do this." + user << "You need more plasteel to do this." return - user << "\blue You start to reinforce the windoor with plasteel." + user << "You start to reinforce the windoor with plasteel." if(do_after(user,40)) if(!src) return P.use(2) - user << "\blue You reinforce the windoor." + user << "You reinforce the windoor." src.secure = "secure_" if(src.anchored) src.name = "secure anchored windoor assembly" @@ -147,7 +147,7 @@ obj/structure/windoor_assembly/Destroy() if(!src) return var/obj/item/stack/cable_coil/CC = W CC.use(1) - user << "\blue You wire the windoor!" + user << "You wire the windoor!" src.state = "02" if(src.secure) src.name = "secure wired windoor assembly" @@ -166,7 +166,7 @@ obj/structure/windoor_assembly/Destroy() if(do_after(user, 40)) if(!src) return - user << "\blue You cut the windoor wires.!" + user << "You cut the windoor wires.!" new/obj/item/stack/cable_coil(get_turf(user), 1) src.state = "01" if(src.secure) @@ -184,7 +184,7 @@ obj/structure/windoor_assembly/Destroy() user.drop_item() W.loc = src - user << "\blue You've installed the airlock electronics!" + user << "You've installed the airlock electronics!" src.name = "near finished windoor assembly" src.electronics = W else @@ -200,7 +200,7 @@ obj/structure/windoor_assembly/Destroy() if(do_after(user, 40)) if(!src) return - user << "\blue You've removed the airlock electronics!" + user << "You've removed the airlock electronics!" src.name = "wired windoor assembly" var/obj/item/weapon/airlock_electronics/ae if (!electronics) //This shouldnt happen, but if it does, lets not crash and runtime. @@ -214,7 +214,7 @@ obj/structure/windoor_assembly/Destroy() //Crowbar to complete the assembly, Step 7 complete. else if(istype(W, /obj/item/weapon/crowbar)) if(!src.electronics) - usr << "\red The assembly is missing electronics." + usr << "The assembly is missing electronics." return usr << browse(null, "window=windoor_access") playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) @@ -225,7 +225,7 @@ obj/structure/windoor_assembly/Destroy() if(!src) return density = 1 //Shouldn't matter but just incase - user << "\blue You finish the windoor!" + user << "You finish the windoor!" if(secure) var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(src.loc) diff --git a/code/game/say.dm b/code/game/say.dm new file mode 100644 index 00000000000..5eea35115b8 --- /dev/null +++ b/code/game/say.dm @@ -0,0 +1,155 @@ +/* + Miauw's big Say() rewrite. + This file has the basic atom/movable level speech procs. + And the base of the send_speech() proc, which is the core of saycode. +*/ +var/list/freqtospan = list( + "1351" = "sciradio", + "1355" = "medradio", + "1357" = "engradio", + "1347" = "suppradio", + "1349" = "servradio", + "1359" = "secradio", + "1353" = "comradio", + "1447" = "aiprivradio", + "1213" = "syndradio", + "1441" = "dsquadradio" + ) + +var/list/freqtoname = list( + "1351" = "Science", + "1353" = "Command", + "1355" = "Medical", + "1357" = "Engineering", + "1359" = "Security", + "1441" = "Deathsquad", + "1213" = "Syndicate", + "1347" = "Supply", + "1349" = "Service", + "1447" = "AI Private" +) + +/atom/movable/proc/say(message) + if(!can_speak()) + return + if(message == "" || !message) + return + send_speech(message) + +/atom/movable/proc/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + return + +/atom/movable/proc/can_speak() + return 1 + +/atom/movable/proc/send_speech(message, range) + var/rendered = compose_message(src, languages, message) + for(var/atom/movable/AM in get_hearers_in_view(range, src)) + AM.Hear(rendered, src, languages, message) + +/atom/movable/proc/compose_message(atom/movable/speaker, message_langs, raw_message, radio_freq) + //This proc uses text() because it is faster than appending strings. Thanks BYOND. + //Basic span + var/spanpart1 = "" + //Start name span. + var/spanpart2 = "" + //Radio freq/name display + var/freqpart = radio_freq ? "\[[get_radio_name(radio_freq)]\] " : "" + //Speaker name + var/namepart = "[speaker.GetVoice()][speaker.get_alt_name()]" + //End name span. + var/endspanpart = "" + //Message + var/messagepart = " [lang_treat(speaker, message_langs, raw_message)]" + + return "[spanpart1][spanpart2][freqpart][compose_track_href(speaker, message_langs, raw_message, radio_freq)][namepart][compose_job(speaker, message_langs, raw_message, radio_freq)][endspanpart][messagepart]" + +/atom/movable/proc/compose_track_href(atom/movable/speaker, message_langs, raw_message, radio_freq) + return "" + +/atom/movable/proc/compose_job(atom/movable/speaker, message_langs, raw_message, radio_freq) + return "" + +/atom/movable/proc/say_quote(var/text) + if(!text) + return "says, \"...\"" //not the best solution, but it will stop a large number of runtimes. The cause is somewhere in the Tcomms code + var/ending = copytext(text, length(text)) + if (ending == "?") + return "asks, \"[text]\"" + if (ending == "!") + return "exclaims, \"[text]\"" + + return "says, \"[text]\"" + +/atom/movable/proc/lang_treat(atom/movable/speaker, message_langs, raw_message) + if(languages & message_langs) + var/atom/movable/AM = speaker.GetSource() + if(AM) + return AM.say_quote(raw_message) + else + return speaker.say_quote(raw_message) + else if(message_langs & HUMAN) + var/atom/movable/AM = speaker.GetSource() + if(AM) + return AM.say_quote(stars(raw_message)) + else + return speaker.say_quote(stars(raw_message)) + else if(message_langs & MONKEY) + return "chimpers." + else if(message_langs & ALIEN) + return "hisses." + else if(message_langs & ROBOT) + return "beeps rapidly." + else + return "makes a strange sound." + +/proc/get_radio_span(freq) + var/returntext = freqtospan["[freq]"] + if(returntext) + return returntext + return "radio" + +/proc/get_radio_name(freq) + var/returntext = radiochannelsreverse["[freq]"] + if(returntext) + return returntext + return "[copytext("[freq]", 1, 4)].[copytext("[freq]", 4, 5)]" + +/atom/movable/proc/GetVoice() + return name + +/atom/movable/proc/IsVocal() + return 1 + +/atom/movable/proc/get_alt_name() + return + +//these exist mostly to deal with the AIs hrefs and job stuff. +/atom/movable/proc/GetJob() + return + +/atom/movable/proc/GetTrack() + return + +/atom/movable/proc/GetSource() + return + +/atom/movable/proc/GetRadio() + +/atom/movable/virtualspeaker + var/job + var/faketrack + var/atom/movable/source + var/obj/item/device/radio/radio + +/atom/movable/virtualspeaker/GetJob() + return job + +/atom/movable/virtualspeaker/GetTrack() + return faketrack + +/atom/movable/virtualspeaker/GetSource() + return source + +/atom/movable/virtualspeaker/GetRadio() + return radio diff --git a/code/game/smoothwall.dm b/code/game/smoothwall.dm index 9078e262b45..29800a163e8 100644 --- a/code/game/smoothwall.dm +++ b/code/game/smoothwall.dm @@ -97,14 +97,11 @@ ..()*/ /turf/simulated/wall/Del() - - var/temploc = src.loc - spawn(10) - for(var/turf/simulated/wall/W in range(temploc,1)) + for(var/turf/simulated/wall/W in range(src,1)) W.relativewall() - for(var/obj/structure/falsewall/W in range(temploc,1)) + for(var/obj/structure/falsewall/W in range(src,1)) W.relativewall() for(var/direction in cardinal) @@ -114,19 +111,8 @@ shroom.icon_state = "glowshroomf" shroom.pixel_x = 0 shroom.pixel_y = 0 - ..() -/*/turf/simulated/shuttle/wall/Del() - - var/temploc = src.loc - - spawn(10) - for(var/turf/simulated/shuttle/wall/W in range(temploc,1)) - W.relativewall() - - ..()*/ - /turf/simulated/wall/relativewall() if(istype(src,/turf/simulated/wall/vault)) //HACK!!! return diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 2f2ea8d6eed..4de300cff1f 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -34,7 +34,7 @@ /turf/simulated/Entered(atom/A, atom/OL) if(movement_disabled && usr.ckey != movement_disabled_exception) - usr << "\red Movement is admin-disabled." //This is to identify lag problems + usr << "Movement is admin-disabled." //This is to identify lag problems return if (istype(A,/mob/living/carbon)) diff --git a/code/game/turfs/simulated/dirtystation.dm b/code/game/turfs/simulated/dirtystation.dm index a9c7e18f082..c47f0c55da5 100644 --- a/code/game/turfs/simulated/dirtystation.dm +++ b/code/game/turfs/simulated/dirtystation.dm @@ -6,24 +6,27 @@ /obj/effect/decal/cleanable/blood/old name = "dried blood" desc = "Looks like it's been here a while. Eew." - New() - ..() - icon_state += "-old" + +/obj/effect/decal/cleanable/blood/old/New() + ..() + icon_state += "-old" /obj/effect/decal/cleanable/blood/gibs/old name = "old rotting gibs" desc = "Oh god, why didn't anyone clean this up? It smells terrible." - New() - ..() - icon_state += "-old" - dir = pick(1,2,4,8) + +/obj/effect/decal/cleanable/blood/gibs/old/New() + ..() + icon_state += "-old" + dir = pick(1,2,4,8) /obj/effect/decal/cleanable/vomit/old name = "crusty dried vomit" desc = "You try not to look at the chunks, and fail." - New() - ..() - icon_state += "-old" + +/obj/effect/decal/cleanable/vomit/old/New() + ..() + icon_state += "-old" /obj/effect/decal/cleanable/robot_debris/old name = "dusty robot debris" diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index be5e7807136..12ef24729a1 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -428,18 +428,18 @@ turf/simulated/floor/proc/update_icon() qdel(C) T.state = C //fixing it by bashing it with a light bulb, fun eh? update_icon() - user << "\blue You replace the light bulb." + user << "You replace the light bulb." else - user << "\blue The lightbulb seems fine, no need to replace it." + user << "The lightbulb seems fine, no need to replace it." if(istype(C, /obj/item/weapon/crowbar) && (!(is_plating()))) if(broken || burnt) - user << "\red You remove the broken plating." + user << "You remove the broken plating." else if(is_wood_floor()) - user << "\red You forcefully pry off the planks, destroying them in the process." + user << "You forcefully pry off the planks, destroying them in the process." else - user << "\red You remove the [floor_tile.name]." + user << "You remove the [floor_tile.name]." new floor_tile.type(src) make_plating() @@ -452,7 +452,7 @@ turf/simulated/floor/proc/update_icon() return else if(is_wood_floor()) - user << "\red You unscrew the planks." + user << "You unscrew the planks." new floor_tile.type(src) make_plating() @@ -508,7 +508,7 @@ turf/simulated/floor/proc/update_icon() levelupdate() playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) else - user << "\blue This section is too damaged to support a tile. Use a welder to fix the damage." + user << "This section is too damaged to support a tile. Use a welder to fix the damage." if(istype(C, /obj/item/stack/cable_coil)) @@ -526,20 +526,20 @@ turf/simulated/floor/proc/update_icon() if(is_grass_floor()) new /obj/item/weapon/ore/glass(src) new /obj/item/weapon/ore/glass(src) //Make some sand if you shovel grass - user << "\blue You shovel the grass." + user << "You shovel the grass." make_plating() else - user << "\red You cannot shovel this." + user << "You cannot shovel this." if(istype(C, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/welder = C if(welder.isOn() && (is_plating())) if(broken || burnt) if(welder.remove_fuel(0,user)) - user << "\red You fix some dents on the broken plating." + user << "You fix some dents on the broken plating." playsound(src, 'sound/items/Welder.ogg', 80, 1) icon_state = icon_plating burnt = 0 broken = 0 else - user << "\blue You need more welding fuel to complete this task." + user << "You need more welding fuel to complete this task." diff --git a/code/game/turfs/simulated/floor_types.dm b/code/game/turfs/simulated/floor_types.dm index 97c433114f5..b446d3f03c7 100644 --- a/code/game/turfs/simulated/floor_types.dm +++ b/code/game/turfs/simulated/floor_types.dm @@ -5,9 +5,9 @@ nitrogen = 0.01 temperature = TCMB - New() - ..() - name = "floor" +/turf/simulated/floor/airless/New() + ..() + name = "floor" /turf/simulated/floor/light name = "Light floor" @@ -15,14 +15,14 @@ icon_state = "light_on" floor_tile = new/obj/item/stack/tile/light - New() - floor_tile.New() //I guess New() isn't run on objects spawned without the definition of a turf to house them, ah well. - var/n = name //just in case commands rename it in the ..() call - ..() - spawn(4) - if(src) - update_icon() - name = n +/turf/simulated/floor/light/New() + floor_tile.New() //I guess New() isn't run on objects spawned without the definition of a turf to house them, ah well. + var/n = name //just in case commands rename it in the ..() call + ..() + spawn(4) + if(src) + update_icon() + name = n @@ -54,7 +54,7 @@ if(!user) return if(istype(C, /obj/item/weapon/wrench)) - user << "\blue Removing rods..." + user << "Removing rods..." playsound(src, 'sound/items/Ratchet.ogg', 80, 1) if(do_after(user, 30)) new /obj/item/stack/rods(src, 2) @@ -68,17 +68,16 @@ icon_state = "cult" -/turf/simulated/floor/engine/n20 - New() - ..() - var/datum/gas_mixture/adding = new - var/datum/gas/sleeping_agent/trace_gas = new +/turf/simulated/floor/engine/n20/New() + ..() + var/datum/gas_mixture/adding = new + var/datum/gas/sleeping_agent/trace_gas = new - trace_gas.moles = 6000 - adding.trace_gases += trace_gas - adding.temperature = T20C + trace_gas.moles = 6000 + adding.trace_gases += trace_gas + adding.temperature = T20C - assume_air(adding) + assume_air(adding) /turf/simulated/floor/engine/vacuum name = "vacuum floor" @@ -100,9 +99,9 @@ nitrogen = 0.01 temperature = TCMB - New() - ..() - name = "plating" +/turf/simulated/floor/plating/airless/New() + ..() + name = "plating" /turf/simulated/floor/bluegrid icon = 'icons/turf/floors.dmi' @@ -163,35 +162,35 @@ icon_state = "grass1" floor_tile = new/obj/item/stack/tile/grass - New() - floor_tile.New() //I guess New() isn't ran on objects spawned without the definition of a turf to house them, ah well. - icon_state = "grass[pick("1","2","3","4")]" - ..() - spawn(4) - if(src) - update_icon() - for(var/direction in cardinal) - if(istype(get_step(src,direction),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,direction) - FF.update_icon() //so siding get updated properly +/turf/simulated/floor/grass/New() + floor_tile.New() //I guess New() isn't ran on objects spawned without the definition of a turf to house them, ah well. + icon_state = "grass[pick("1","2","3","4")]" + ..() + spawn(4) + if(src) + update_icon() + for(var/direction in cardinal) + if(istype(get_step(src,direction),/turf/simulated/floor)) + var/turf/simulated/floor/FF = get_step(src,direction) + FF.update_icon() //so siding get updated properly /turf/simulated/floor/carpet name = "Carpet" icon_state = "carpet" floor_tile = new/obj/item/stack/tile/carpet - New() - floor_tile.New() //I guess New() isn't ran on objects spawned without the definition of a turf to house them, ah well. - if(!icon_state) - icon_state = "carpet" - ..() - spawn(4) - if(src) - update_icon() - for(var/direction in list(1,2,4,8,5,6,9,10)) - if(istype(get_step(src,direction),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,direction) - FF.update_icon() //so siding get updated properly +/turf/simulated/floor/carpet/New() + floor_tile.New() //I guess New() isn't ran on objects spawned without the definition of a turf to house them, ah well. + if(!icon_state) + icon_state = "carpet" + ..() + spawn(4) + if(src) + update_icon() + for(var/direction in list(1,2,4,8,5,6,9,10)) + if(istype(get_step(src,direction),/turf/simulated/floor)) + var/turf/simulated/floor/FF = get_step(src,direction) + FF.update_icon() //so siding get updated properly @@ -206,4 +205,4 @@ icon_state = "snow" /turf/simulated/floor/plating/snow/ex_act(severity) - return \ No newline at end of file + return diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 1e516a3cdf5..4a595d5f0e7 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -54,7 +54,7 @@ /turf/space/Entered(atom/movable/A as mob|obj) if(movement_disabled) - usr << "\red Movement is admin-disabled." //This is to identify lag problems + usr << "Movement is admin-disabled." //This is to identify lag problems return ..() if ((!(A) || src != A.loc)) return diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 1e4d75217fb..5e74b05aa31 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -51,7 +51,7 @@ /turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area) if(movement_disabled && usr.ckey != movement_disabled_exception) - usr << "\red Movement is admin-disabled." //This is to identify lag problems + usr << "Movement is admin-disabled." //This is to identify lag problems return if (!mover) return 1 @@ -87,7 +87,7 @@ /turf/Entered(atom/atom as mob|obj) if(movement_disabled) - usr << "\red Movement is admin-disabled." //This is to identify lag problems + usr << "Movement is admin-disabled." //This is to identify lag problems return ..() //vvvvv Infared beam stuff vvvvv @@ -245,15 +245,14 @@ src.ChangeTurf(/turf/space) new /obj/structure/lattice( locate(src.x, src.y, src.z) ) -/turf/proc/kill_creatures(mob/U = null)//Will kill people/creatures and damage mechs./N -//Useful to batch-add creatures to the list. +/turf/proc/phase_damage_creatures(damage,mob/U = null)//>Ninja Code. Hurts and knocks out creatures on this turf for(var/mob/living/M in src) - if(M==U) continue//Will not harm U. Since null != M, can be excluded to kill everyone. - spawn(0) - M.gib() - for(var/obj/mecha/M in src)//Mecha are not gibbed but are damaged. - spawn(0) - M.take_damage(100, "brute") + if(M==U) + continue//Will not harm U. Since null != M, can be excluded to kill everyone. + M.adjustBruteLoss(damage) + M.Paralyse(damage/5) + for(var/obj/mecha/M in src) + M.take_damage(damage*2, "brute") /turf/proc/Bless() flags |= NOJAUNT @@ -371,13 +370,15 @@ if (M.m_intent=="walk" && (lube&NO_SLIP_WHEN_WALKING)) return 0 if(!M.lying) + var/olddir = M.dir + M.Stun(s_amount) + M.Weaken(w_amount) M.stop_pulling() - if(lube&STEP) - step(M, M.dir) if(lube&SLIDE) for(var/i=1, i<5, i++) spawn (i) - step(M, M.dir) + step(M, olddir) + M.spin(1,1) if(M.lying) //did I fall over? M.adjustBruteLoss(2) if(O) @@ -385,7 +386,5 @@ else M << "You slipped!" playsound(M.loc, 'sound/misc/slip.ogg', 50, 1, -3) - M.Stun(s_amount) - M.Weaken(w_amount) return 1 - return 0 // no success. Used in clown pda and wet floors + return 0 // no success. Used in clown pda and wet floors \ No newline at end of file diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index cfeeec22c46..56ac5f09d04 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -3,7 +3,7 @@ set category = "OOC" if(say_disabled) //This is here to try to identify lag problems - usr << "\red Speech is currently admin-disabled." + usr << "Speech is currently admin-disabled." return if(!mob) return @@ -15,18 +15,18 @@ if(!msg) return if(!(prefs.toggles & CHAT_OOC)) - src << "\red You have OOC muted." + src << "You have OOC muted." return if(!holder) if(!ooc_allowed) - src << "\red OOC is globally muted" + src << "OOC is globally muted." return if(!dooc_allowed && (mob.stat == DEAD)) - usr << "\red OOC for dead mobs has been turned off." + usr << "OOC for dead mobs has been turned off." return if(prefs.muted & MUTE_OOC) - src << "\red You cannot use OOC (muted)." + src << "You cannot use OOC (muted)." return if(handle_spam_prevention(msg,MUTE_OOC)) return @@ -96,9 +96,9 @@ var/global/normal_ooc_colour = "#002eb8" set desc ="Check the admin notice if it has been set" if(admin_notice) - src << "\blue Admin Notice:\n \t [admin_notice]" + src << "Admin Notice:\n \t [admin_notice]" else - src << "\blue There are no admin notices at the moment." + src << "There are no admin notices at the moment." /client/verb/motd() set name = "MOTD" @@ -108,4 +108,4 @@ var/global/normal_ooc_colour = "#002eb8" if(join_motd) src << "
    [join_motd]
    " else - src << "\blue The Message of the Day has not been set." \ No newline at end of file + src << "The Message of the Day has not been set." \ No newline at end of file diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 49e7bcbd3a1..ec64e84c355 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -65,10 +65,10 @@ return - visible_message(pick("\red [src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \ - "\red [src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.", \ - "\red [src] is twisting \his own neck! It looks like \he's trying to commit suicide.", \ - "\red [src] is holding \his breath! It looks like \he's trying to commit suicide.")) + visible_message(pick("[src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \ + "[src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.", \ + "[src] is twisting \his own neck! It looks like \he's trying to commit suicide.", \ + "[src] is holding \his breath! It looks like \he's trying to commit suicide.")) adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() @@ -91,7 +91,7 @@ if(confirm == "Yes") suiciding = 1 - viewers(loc) << "\red [src]'s brain is growing dull and lifeless. It looks like it's lost the will to live." + viewers(loc) << "[src]'s brain is growing dull and lifeless. It looks like it's lost the will to live." spawn(50) death(0) suiciding = 0 @@ -119,7 +119,7 @@ return suiciding = 1 //instead of killing them instantly, just put them at -175 health and let 'em gasp for a while - viewers(src) << "\red [src] is attempting to bite \his tongue. It looks like \he's trying to commit suicide." + viewers(src) << "[src] is attempting to bite \his tongue. It looks like \he's trying to commit suicide." adjustOxyLoss(max(175- getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() @@ -138,7 +138,7 @@ if(confirm == "Yes") suiciding = 1 - viewers(src) << "\red [src] is powering down. It looks like \he's trying to commit suicide." + viewers(src) << "[src] is powering down. It looks like \he's trying to commit suicide." //put em at -175 adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() @@ -158,7 +158,7 @@ if(confirm == "Yes") suiciding = 1 - viewers(src) << "\red [src] is powering down. It looks like \he's trying to commit suicide." + viewers(src) << "[src] is powering down. It looks like \he's trying to commit suicide." //put em at -175 adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() @@ -171,7 +171,7 @@ if(answer == "Yes") card.removePersonality() for (var/mob/M in viewers(loc)) - M.show_message("\blue [src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "\blue [src] bleeps electronically.", 2) + M.show_message("[src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "[src] bleeps electronically.", 2) death(0) else src << "Aborting suicide attempt." @@ -191,7 +191,7 @@ if(confirm == "Yes") suiciding = 1 - viewers(src) << "\red [src] is thrashing wildly! It looks like \he's trying to commit suicide." + viewers(src) << "[src] is thrashing wildly! It looks like \he's trying to commit suicide." //put em at -175 adjustOxyLoss(max(175 - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm index 860766ddeb4..f87c93a181c 100644 --- a/code/modules/admin/DB ban/functions.dm +++ b/code/modules/admin/DB ban/functions.dm @@ -96,7 +96,7 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = if(blockselfban) if(a_ckey == ckey) - usr << "\red You cannot apply this ban type on yourself." + usr << "You cannot apply this ban type on yourself." return var/who @@ -121,13 +121,13 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = if(adm_query.NextRow()) var/adm_bans = text2num(adm_query.item[1]) if(adm_bans >= MAX_ADMIN_BANS_PER_ADMIN) - usr << "\red You already logged [MAX_ADMIN_BANS_PER_ADMIN] admin ban(s) or more. Do not abuse this function!" + usr << "You already logged [MAX_ADMIN_BANS_PER_ADMIN] admin ban(s) or more. Do not abuse this function!" return var/sql = "INSERT INTO erro_ban (`id`,`bantime`,`serverip`,`bantype`,`reason`,`job`,`duration`,`rounds`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`,`edits`,`unbanned`,`unbanned_datetime`,`unbanned_ckey`,`unbanned_computerid`,`unbanned_ip`) VALUES (null, Now(), '[serverip]', '[bantype_str]', '[reason]', '[job]', [(duration)?"[duration]":"0"], [(rounds)?"[rounds]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[ckey]', '[computerid]', '[ip]', '[a_ckey]', '[a_computerid]', '[a_ip]', '[who]', '[adminwho]', '', null, null, null, null, null)" var/DBQuery/query_insert = dbcon.NewQuery(sql) query_insert.Execute() - usr << "\blue Ban saved to database." + usr << "Ban saved to database." message_admins("[key_name_admin(usr)] has added a [bantype_str] for [ckey] [(job)?"([job])":""] [(duration > 0)?"([duration] minutes)":""] with the reason: \"[reason]\" to the ban database.",1) if(announceinirc) @@ -196,17 +196,17 @@ datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "") ban_number++; if(ban_number == 0) - usr << "\red Database update failed due to no bans fitting the search criteria. If this is not a legacy ban you should contact the database admin." + usr << "Database update failed due to no bans fitting the search criteria. If this is not a legacy ban you should contact the database admin." return if(ban_number > 1) - usr << "\red Database update failed due to multiple bans fitting the search criteria. Note down the ckey, job and current time and contact the database admin." + usr << "Database update failed due to multiple bans fitting the search criteria. Note down the ckey, job and current time and contact the database admin." return if(istext(ban_id)) ban_id = text2num(ban_id) if(!isnum(ban_id)) - usr << "\red Database update failed due to a ban ID mismatch. Contact the database admin." + usr << "Database update failed due to a ban ID mismatch. Contact the database admin." return DB_ban_unban_by_id(ban_id) @@ -291,11 +291,11 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) ban_number++; if(ban_number == 0) - usr << "\red Database update failed due to a ban id not being present in the database." + usr << "Database update failed due to a ban id not being present in the database." return if(ban_number > 1) - usr << "\red Database update failed due to multiple bans having the same ID. Contact the database admin." + usr << "Database update failed due to multiple bans having the same ID. Contact the database admin." return if(!src.owner || !istype(src.owner, /client)) @@ -331,7 +331,7 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) establish_db_connection() if(!dbcon.IsConnected()) - usr << "\red Failed to establish database connection" + usr << "Failed to establish database connection." return var/output = "

    Name

    Vitals

    Position

    " diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 58bce47400a..b354b25d031 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -44,7 +44,7 @@ world/IsBanned(key,address,computer_id) //Guest Checking if(!guests_allowed && IsGuestKey(key)) log_access("Failed Login: [key] - Guests not allowed") - message_admins("\blue Failed Login: [key] - Guests not allowed") + message_admins("Failed Login: [key] - Guests not allowed") return list("reason"="guest", "desc"="\nReason: Guests not allowed. Please sign in with a byond account.") if(config.ban_legacy_system) @@ -53,7 +53,7 @@ world/IsBanned(key,address,computer_id) . = CheckBan( ckey(key), computer_id, address ) if(.) log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]") - message_admins("\blue Failed Login: [key] id:[computer_id] ip:[address] - Banned [.["reason"]]") + message_admins("Failed Login: [key] id:[computer_id] ip:[address] - Banned [.["reason"]]") return . return ..() //default pager ban stuff diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 38a4334fae7..7e8a502250e 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -103,7 +103,7 @@ var/savefile/Banlist Banlist.cd = "/base" if ( Banlist.dir.Find("[ckey][computerid]") ) - usr << text("\red Ban already exists.") + usr << text("Ban already exists.") return 0 else Banlist.dir.Add("[ckey][computerid]") diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index d1363c55f80..b45727cb0c0 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -430,35 +430,13 @@ var/global/floorIsLava = 0
    "} - if(check_rights(R_FUN,0))//TODO: Make all this hardcoded random event panel stuff its own proc so we can actually remove poor events without making the code stop compiling + if(check_rights(R_FUN,0)) dat += {" - 'Random' Events
    -
    - Spawn a wave of meteors (aka lagocolyptic shower)
    - Spawn a vortex anomaly
    - Spawn a gravitational anomaly
    - Spawn a pyroclastic anomaly
    - Spawn a flux wave anomaly
    - Spawn a bluespace anomaly
    - Spawn wormholes
    - Spawn blob
    - Trigger an Alien infestation
    - Spawn an Alien silently
    - Trigger a Spider infestation
    - Send in a space ninja
    - Trigger an Carp migration
    - Irradiate the station
    - Trigger a Prison Break
    - Trigger a Virus Outbreak
    - Spawn an Immovable Rod
    - Toggle a "lights out" event
    - Spawn an Ion Storm
    - Spawn Space-Vines
    - Trigger a communication blackout
    -
    Fun Secrets

    + Trigger a Virus Outbreak
    Turn all humans into monkeys
    + Change the species of all humans
    Make all areas powered
    Make all areas unpowered
    Power all SMES
    @@ -512,7 +490,7 @@ var/global/floorIsLava = 0 if(confirm == "Cancel") return if(confirm == "Yes") - world << "\red Restarting world! \blue Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!" + world << "Restarting world! Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!" log_admin("[key_name(usr)] initiated a reboot.") feedback_set_details("end_error","admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]") @@ -535,7 +513,7 @@ var/global/floorIsLava = 0 if(message) if(!check_rights(R_SERVER,0)) message = adminscrub(message,500) - world << "\blue [usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:\n \t [message]" + world << "[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:\n \t [message]" log_admin("Announce: [key_name(usr)] : [message]") feedback_add_details("admin_verb","A") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -616,7 +594,7 @@ var/global/floorIsLava = 0 else world << "New players may now enter the game." log_admin("[key_name(usr)] toggled new player game entering.") - message_admins("\blue [key_name_admin(usr)] toggled new player game entering.", 1) + message_admins("[key_name_admin(usr)] toggled new player game entering.", 1) world.update_status() feedback_add_details("admin_verb","TE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -642,7 +620,7 @@ var/global/floorIsLava = 0 world << "You may now respawn." else world << "You may no longer respawn :(" - message_admins("\blue [key_name_admin(usr)] toggled respawn to [abandon_allowed ? "On" : "Off"].", 1) + message_admins("[key_name_admin(usr)] toggled respawn to [abandon_allowed ? "On" : "Off"].", 1) log_admin("[key_name(usr)] toggled respawn to [abandon_allowed ? "On" : "Off"].") world.update_status() feedback_add_details("admin_verb","TR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -669,7 +647,7 @@ var/global/floorIsLava = 0 if(!usr.client.holder) return if( alert("Reboot server?",,"Yes","No") == "No") return - world << "\red Rebooting world! \blue Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!" + world << "Rebooting world! Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!" log_admin("[key_name(usr)] initiated an immediate reboot.") feedback_set_details("end_error","immediate admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]") @@ -783,7 +761,7 @@ var/global/floorIsLava = 0 else world << "Guests may now enter the game." log_admin("[key_name(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.") - message_admins("\blue [key_name_admin(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.", 1) + message_admins("[key_name_admin(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.", 1) feedback_add_details("admin_verb","TGU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/unjobban_panel() diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index c13e1ac79d4..3d4d7b0c1cf 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -81,7 +81,8 @@ var/list/admin_verbs_fun = list( /client/proc/cmd_admin_add_random_ai_law, /client/proc/make_sound, /client/proc/toggle_random_events, - /client/proc/set_ooc + /client/proc/set_ooc, + /client/proc/forceEvent ) var/list/admin_verbs_spawn = list( /datum/admins/proc/spawn_atom, /*allows us to spawn instances*/ @@ -310,10 +311,10 @@ var/list/admin_verbs_hideable = list( if(holder && mob) if(mob.invisibility == INVISIBILITY_OBSERVER) mob.invisibility = initial(mob.invisibility) - mob << "\red Invisimin off. Invisibility reset." + mob << "Invisimin off. Invisibility reset." else mob.invisibility = INVISIBILITY_OBSERVER - mob << "\blue Invisimin on. You are now as invisible as a ghost." + mob << "Invisimin on. You are now as invisible as a ghost." /client/proc/player_panel() @@ -418,7 +419,7 @@ var/list/admin_verbs_hideable = list( var/light_impact_range = input("Light impact range (in tiles):") as num var/flash_range = input("Flash range (in tiles):") as num explosion(epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range) - message_admins("\blue [ckey] creating an admin explosion at [epicenter.loc].") + message_admins("[ckey] creating an admin explosion at [epicenter.loc].") feedback_add_details("admin_verb","DB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/give_spell(mob/T as mob in mob_list) @@ -430,13 +431,13 @@ var/list/admin_verbs_hideable = list( return feedback_add_details("admin_verb","GS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] the spell [S].") - message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] the spell [S].", 1) + message_admins("[key_name_admin(usr)] gave [key_name(T)] the spell [S].", 1) if(T.mind) T.mind.spell_list += new S else T.mob_spell_list += new S - message_admins("\red Spells given to mindless mobs will not be transferred in mindswap or cloning!", 1) + message_admins("Spells given to mindless mobs will not be transferred in mindswap or cloning!", 1) /client/proc/give_disease(mob/T as mob in mob_list) @@ -448,23 +449,24 @@ var/list/admin_verbs_hideable = list( T.contract_disease(new D, 1) feedback_add_details("admin_verb","GD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] the disease [D].") - message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] the disease [D].", 1) + message_admins("[key_name_admin(usr)] gave [key_name(T)] the disease [D].", 1) /client/proc/make_sound(var/obj/O in world) set category = "Special Verbs" - set name = "Make Sound" - set desc = "Display a message to everyone who can hear the target" - if(O) - var/message = input("What do you want the message to be?", "Make Sound") as text|null + set name = "Osay" + set desc = "Makes an object say something." + if(istype(O)) + var/message = input("What do you want the message to be?", "Make Sound") as text | null if(!message) - return - for (var/mob/V in hearers(O)) - V.show_message(message, 2) - log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z]. make a sound") - message_admins("\blue [key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z]. make a sound", 1) + return + var/templanguages = O.languages + O.languages |= ALL + O.say(message) + O.languages = templanguages + log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z] say [message]") + message_admins("[key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z]. say [message]", 1) feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - /client/proc/togglebuildmodeself() set name = "Toggle Build Mode Self" set category = "Special Verbs" @@ -495,7 +497,7 @@ var/list/admin_verbs_hideable = list( usr << "Disabled air processing." feedback_add_details("admin_verb","KA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] used 'kill air'.") - message_admins("\blue [key_name_admin(usr)] used 'kill air'.", 1) + message_admins("[key_name_admin(usr)] used 'kill air'.", 1) /client/proc/deadmin_self() set name = "De-admin self" diff --git a/code/modules/admin/newbanjob.dm b/code/modules/admin/newbanjob.dm index 3deca48ecea..a881c5b2976 100644 --- a/code/modules/admin/newbanjob.dm +++ b/code/modules/admin/newbanjob.dm @@ -143,7 +143,7 @@ var/savefile/Banlistjob Banlistjob.cd = "/base" if ( Banlistjob.dir.Find("[ckey][computerid][rank]") ) - usr << text("\red Banjob already exists.") + usr << text("Banjob already exists.") return 0 else Banlistjob.dir.Add("[ckey][computerid][rank]") diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm index 174dba2ddd7..08b71af162f 100644 --- a/code/modules/admin/permissionverbs/permissionedit.dm +++ b/code/modules/admin/permissionverbs/permissionedit.dm @@ -28,10 +28,10 @@ for(var/adm_ckey in admin_datums) var/datum/admins/D = admin_datums[adm_ckey] if(!D) continue - + var/rights = rights2text(D.rank.rights," ") if(!rights) rights = "*none*" - + output += "
    " output += "" output += "" @@ -59,7 +59,7 @@ establish_db_connection() if(!dbcon.IsConnected()) - usr << "\red Failed to establish database connection" + usr << "Failed to establish database connection." return if(!adm_ckey || !new_rank) @@ -87,14 +87,14 @@ insert_query.Execute() var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.`erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added new admin [adm_ckey] to rank [new_rank]');") log_query.Execute() - usr << "\blue New admin added." + usr << "New admin added." else if(!isnull(admin_id) && isnum(admin_id)) var/DBQuery/insert_query = dbcon.NewQuery("UPDATE `erro_admin` SET rank = '[new_rank]' WHERE id = [admin_id]") insert_query.Execute() var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.`erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Edited the rank of [adm_ckey] to [new_rank]');") log_query.Execute() - usr << "\blue Admin rank changed." + usr << "Admin rank changed." /datum/admins/proc/log_admin_permission_modification(var/adm_ckey, var/new_permission) @@ -104,7 +104,7 @@ establish_db_connection() if(!dbcon.IsConnected()) - usr << "\red Failed to establish database connection" + usr << "Failed to establish database connection." return if(!adm_ckey || !istext(adm_ckey) || !isnum(new_permission)) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index e0375d13081..664f27b00b6 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2,7 +2,7 @@ ..() if(usr.client != src.owner || !check_rights(0)) - world << "\blue [usr.key] has attempted to override the admin panel!" + world << "[usr.key] has attempted to override the admin panel!" log_admin("[key_name(usr)] tried to use the admin panel without authorization.") return @@ -12,37 +12,37 @@ message_admins("[key_name_admin(usr)] created traitors.") log_admin("[key_name(usr)] created traitors.") if(!src.makeTraitors()) - usr << "\red Unfortunatly there were no candidates available" + usr << "Unfortunatly there were no candidates available." if("2") message_admins("[key_name(usr)] created changelings.") log_admin("[key_name(usr)] created changelings.") if(!src.makeChanglings()) - usr << "\red Unfortunatly there were no candidates available" + usr << "Unfortunatly there were no candidates available." if("3") message_admins("[key_name(usr)] started a revolution.") log_admin("[key_name(usr)] started a revolution.") if(!src.makeRevs()) - usr << "\red Unfortunatly there were no candidates available" + usr << "Unfortunatly there were no candidates available." if("4") message_admins("[key_name(usr)] created cultists.") log_admin("[key_name(usr)] created cultists.") if(!src.makeCult()) - usr << "\red Unfortunatly there were no candidates available" + usr << "Unfortunatly there were no candidates available." if("5") message_admins("[key_name(usr)] caused an AI to malfunction.") log_admin("[key_name(usr)] caused an AI to malfunction.") if(!src.makeMalfAImode()) - usr << "\red Unfortunatly there were no candidates available" + usr << "Unfortunatly there were no candidates available." if("6") message_admins("[key_name(usr)] created a wizard.") log_admin("[key_name(usr)] created a wizard.") if(!src.makeWizard()) - usr << "\red Unfortunatly there were no candidates available" + usr << "Unfortunatly there were no candidates available." if("7") message_admins("[key_name(usr)] created a nuke team.") log_admin("[key_name(usr)] created a nuke team.") if(!src.makeNukeTeam()) - usr << "\red Unfortunatly there were no candidates available" + usr << "Unfortunatly there were not enough candidates available." if("8") message_admins("[key_name(usr)] spawned a ninja.") log_admin("[key_name(usr)] spawned a ninja.") @@ -51,13 +51,36 @@ message_admins("[key_name(usr)] started an alien infestation.") log_admin("[key_name(usr)] started an alien infestation.") src.makeAliens() -/* DEATH SQUADS if("10") message_admins("[key_name(usr)] created a death squad.") log_admin("[key_name(usr)] created a death squad.") if(!src.makeDeathsquad()) - usr << "\red Unfortunatly there were no candidates available" -*/ + usr << "Unfortunatly there were not enough candidates available." + + if("11") + var/strength = input("Set Blob Strength (1=Weak, 2=Strong, 3=Full)","Set Strength",1) as num + message_admins("[key_name(usr)] spawned a blob with strength [strength].") + log_admin("[key_name(usr)] spawned a blob with strength [strength].") + new/datum/round_event/blob(strength) + + else if(href_list["forceevent"]) + var/datum/round_event_control/E = locate(href_list["forceevent"]) in events.control + if(E) + var/datum/round_event/event = E.runEvent() + if(event.announceWhen>0) + event.processing = 0 + var/prompt = alert(usr, "Would you like to alert the crew?", "Alert", "Yes", "No", "Cancel") + switch(prompt) + if("Cancel") + event.kill() + return + if("No") + event.announceWhen = -1 + event.processing = 1 + message_admins("[key_name_admin(usr)] has triggered an event. ([E.name])", 1) + log_admin("[key_name(usr)] has triggered an event. ([E.name])") + return + else if(href_list["dbsearchckey"] || href_list["dbsearchadmin"]) var/adminckey = href_list["dbsearchadmin"] var/playerckey = href_list["dbsearchckey"] @@ -159,7 +182,7 @@ emergency_shuttle.incall() priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.", null,'sound/AI/shuttlecalled.ogg', "Priority") log_admin("[key_name(usr)] called the Emergency Shuttle") - message_admins("\blue [key_name_admin(usr)] called the Emergency Shuttle to the station", 1) + message_admins("[key_name_admin(usr)] called the Emergency Shuttle to the station", 1) if("2") if ((!( ticker ) || emergency_shuttle.location || emergency_shuttle.direction == 0)) @@ -169,11 +192,11 @@ emergency_shuttle.incall() priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.", null, 'sound/AI/shuttlerecalled.ogg', "Priority") log_admin("[key_name(usr)] called the Emergency Shuttle") - message_admins("\blue [key_name_admin(usr)] called the Emergency Shuttle to the station", 1) + message_admins("[key_name_admin(usr)] called the Emergency Shuttle to the station", 1) if(1) emergency_shuttle.recall() log_admin("[key_name(usr)] sent the Emergency Shuttle back") - message_admins("\blue [key_name_admin(usr)] sent the Emergency Shuttle back", 1) + message_admins("[key_name_admin(usr)] sent the Emergency Shuttle back", 1) href_list["secretsadmin"] = "check_antagonist" @@ -182,8 +205,8 @@ emergency_shuttle.settimeleft( input("Enter new shuttle duration (seconds):","Edit Shuttle Timeleft", emergency_shuttle.timeleft() ) as num ) log_admin("[key_name(usr)] edited the Emergency Shuttle's timeleft to [emergency_shuttle.timeleft()]") - priority_announce("The emergency shuttle will reach its destination in [round(emergency_shuttle.timeleft()/60)] minutes.", null, null, "Priority") - message_admins("\blue [key_name_admin(usr)] edited the Emergency Shuttle's timeleft to [emergency_shuttle.timeleft()]", 1) + minor_announce("The emergency shuttle will reach its destination in [round(emergency_shuttle.timeleft()/60)] minutes.") + message_admins("[key_name_admin(usr)] edited the Emergency Shuttle's timeleft to [emergency_shuttle.timeleft()]", 1) href_list["secretsadmin"] = "check_antagonist" else if(href_list["delay_round_end"]) @@ -191,7 +214,7 @@ ticker.delay_end = !ticker.delay_end log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") - message_admins("\blue [key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) + message_admins("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) href_list["secretsadmin"] = "check_antagonist" else if(href_list["simplemake"]) @@ -208,7 +231,7 @@ if("Yes") delmob = 1 log_admin("[key_name(usr)] has used rudimentary transformation on [key_name(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]") - message_admins("\blue [key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]", 1) + message_admins("[key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]", 1) switch(href_list["simplemake"]) if("observer") M.change_mob_type( /mob/dead/observer , null, null, delmob ) @@ -288,7 +311,7 @@ log_admin("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]") ban_unban_log_save("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]") - message_admins("\blue [key_name_admin(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]", 1) + message_admins("[key_name_admin(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]", 1) Banlist.cd = "/base/[banfolder]" Banlist["reason"] << reason Banlist["temp"] << temp @@ -324,8 +347,8 @@ feedback_inc("ban_appearance_unban", 1) DB_ban_unban(M.ckey, BANTYPE_APPEARANCE) appearance_unban(M) - message_admins("\blue [key_name_admin(usr)] removed [key_name_admin(M)]'s appearance ban", 1) - M << "\red[usr.client.ckey] has removed your appearance ban." + message_admins("[key_name_admin(usr)] removed [key_name_admin(M)]'s appearance ban", 1) + M << "[usr.client.ckey] has removed your appearance ban." else switch(alert("Appearance ban [M.ckey]?",,"Yes","No", "Cancel")) if("Yes") @@ -338,14 +361,14 @@ DB_ban_record(BANTYPE_APPEARANCE, M, -1, reason) appearance_fullban(M, "[reason]; By [usr.ckey] on [time2text(world.realtime)]") notes_add(M.ckey, "Appearance banned - [reason]") - message_admins("\blue [key_name_admin(usr)] appearance banned [key_name_admin(M)]", 1) - M << "\redYou have been appearance banned by [usr.client.ckey]." - M << "\red The reason is: [reason]" - M << "\red Appearance ban can be lifted only upon request." + message_admins("[key_name_admin(usr)] appearance banned [key_name_admin(M)]", 1) + M << "You have been appearance banned by [usr.client.ckey]." + M << "The reason is: [reason]" + M << "Appearance ban can be lifted only upon request." if(config.banappeals) - M << "\red To try to resolve this matter head to [config.banappeals]" + M << "To try to resolve this matter head to [config.banappeals]" else - M << "\red No ban appeals URL has been set." + M << "No ban appeals URL has been set." if("No") return @@ -668,7 +691,7 @@ switch(alert("Temporary Ban?",,"Yes","No", "Cancel")) if("Yes") if(config.ban_legacy_system) - usr << "\red Your server is using the legacy banning system, which does not support temporary job bans. Consider upgrading. Aborting ban." + usr << "Your server is using the legacy banning system, which does not support temporary job bans. Consider upgrading. Aborting ban." return var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null if(!mins) @@ -690,10 +713,10 @@ else msg += ", [job]" notes_add(M.ckey, "Banned from [msg] - [reason]") - message_admins("\blue [key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes", 1) - M << "\redYou have been jobbanned by [usr.client.ckey] from: [msg]." - M << "\red The reason is: [reason]" - M << "\red This jobban will be lifted in [mins] minutes." + message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes", 1) + M << "You have been jobbanned by [usr.client.ckey] from: [msg]." + M << "The reason is: [reason]" + M << "This jobban will be lifted in [mins] minutes." href_list["jobban2"] = 1 // lets it fall through and refresh return 1 if("No") @@ -710,10 +733,10 @@ if(!msg) msg = job else msg += ", [job]" notes_add(M.ckey, "Banned from [msg] - [reason]") - message_admins("\blue [key_name_admin(usr)] banned [key_name_admin(M)] from [msg]", 1) - M << "\redYou have been jobbanned by [usr.client.ckey] from: [msg]." - M << "\red The reason is: [reason]" - M << "\red Jobban can be lifted only upon request." + message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg]", 1) + M << "You have been jobbanned by [usr.client.ckey] from: [msg]." + M << "The reason is: [reason]" + M << "Jobban can be lifted only upon request." href_list["jobban2"] = 1 // lets it fall through and refresh return 1 if("Cancel") @@ -743,8 +766,8 @@ else continue if(msg) - message_admins("\blue [key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg]", 1) - M << "\redYou have been un-jobbanned by [usr.client.ckey] from [msg]." + message_admins("[key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg]", 1) + M << "You have been un-jobbanned by [usr.client.ckey] from [msg]." href_list["jobban2"] = 1 // lets it fall through and refresh return 1 return 0 //we didn't do anything! @@ -754,9 +777,9 @@ if (ismob(M)) if(!check_if_greater_rights_than(M.client)) return - M << "\red You have been kicked from the server" + M << "You have been kicked from the server." log_admin("[key_name(usr)] booted [key_name(M)].") - message_admins("\blue [key_name_admin(usr)] booted [key_name_admin(M)].", 1) + message_admins("[key_name_admin(usr)] booted [key_name_admin(M)].", 1) //M.client = null del(M.client) @@ -780,7 +803,7 @@ if(t) if((alert("Do you want to unjobban [t]?","Unjobban confirmation", "Yes", "No") == "Yes") && t) //No more misclicks! Unless you do it twice. log_admin("[key_name(usr)] removed [t]") - message_admins("\blue [key_name_admin(usr)] removed [t]", 1) + message_admins("[key_name_admin(usr)] removed [t]", 1) jobban_remove(t) href_list["ban"] = 1 // lets it fall through and refresh var/t_split = text2list(t, " - ") @@ -807,17 +830,17 @@ return AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins) ban_unban_log_save("[usr.client.ckey] has banned [M.ckey]. - Reason: [reason] - This will be removed in [mins] minutes.") - M << "\redYou have been banned by [usr.client.ckey].\nReason: [reason]" - M << "\red This is a temporary ban, it will be removed in [mins] minutes." + M << "You have been banned by [usr.client.ckey].\nReason: [reason]" + M << "This is a temporary ban, it will be removed in [mins] minutes." feedback_inc("ban_tmp",1) DB_ban_record(BANTYPE_TEMP, M, mins, reason) feedback_inc("ban_tmp_mins",mins) if(config.banappeals) - M << "\red To try to resolve this matter head to [config.banappeals]" + M << "To try to resolve this matter head to [config.banappeals]" else - M << "\red No ban appeals URL has been set." + M << "No ban appeals URL has been set." log_admin("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") - message_admins("\blue[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") + message_admins("usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") del(M.client) //qdel(M) // See no reason why to delete mob. Important stuff can be lost. And ban can be lifted before round ends. @@ -831,15 +854,15 @@ AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0, M.lastKnownIP) if("No") AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0) - M << "\redYou have been banned by [usr.client.ckey].\nReason: [reason]" - M << "\red This is a permanent ban." + M << "You have been banned by [usr.client.ckey].\nReason: [reason]" + M << "This is a permanent ban." if(config.banappeals) - M << "\red To try to resolve this matter head to [config.banappeals]" + M << "To try to resolve this matter head to [config.banappeals]" else - M << "\red No ban appeals URL has been set." + M << "No ban appeals URL has been set." ban_unban_log_save("[usr.client.ckey] has permabanned [M.ckey]. - Reason: [reason] - This is a permanent ban.") log_admin("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.") - message_admins("\blue[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.") + message_admins("usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.") feedback_inc("ban_perma",1) DB_ban_record(BANTYPE_PERMA, M, -1, reason) @@ -899,8 +922,8 @@ return alert(usr, "The game has already started.", null, null, null, null) master_mode = href_list["c_mode2"] log_admin("[key_name(usr)] set the mode as [master_mode].") - message_admins("\blue [key_name_admin(usr)] set the mode as [master_mode].", 1) - world << "\blue The mode is now: [master_mode]" + message_admins("[key_name_admin(usr)] set the mode as [master_mode].", 1) + world << "The mode is now: [master_mode]" Game() // updates the main game menu world.save_mode(master_mode) .(href, list("c_mode"=1)) @@ -914,7 +937,7 @@ return alert(usr, "The game mode has to be secret!", null, null, null, null) secret_force_mode = href_list["f_secret2"] log_admin("[key_name(usr)] set the forced secret mode as [secret_force_mode].") - message_admins("\blue [key_name_admin(usr)] set the forced secret mode as [secret_force_mode].", 1) + message_admins("[key_name_admin(usr)] set the forced secret mode as [secret_force_mode].", 1) Game() // updates the main game menu .(href, list("f_secret"=1)) @@ -927,7 +950,7 @@ return log_admin("[key_name(usr)] attempting to monkeyize [key_name(H)]") - message_admins("\blue [key_name_admin(usr)] attempting to monkeyize [key_name_admin(H)]", 1) + message_admins("[key_name_admin(usr)] attempting to monkeyize [key_name_admin(H)]", 1) H.monkeyize() else if(href_list["humanone"]) @@ -939,7 +962,7 @@ return log_admin("[key_name(usr)] attempting to humanize [key_name(Mo)]") - message_admins("\blue [key_name_admin(usr)] attempting to humanize [key_name_admin(Mo)]", 1) + message_admins("[key_name_admin(usr)] attempting to humanize [key_name_admin(Mo)]", 1) Mo.humanize() else if(href_list["corgione"]) @@ -951,7 +974,7 @@ return log_admin("[key_name(usr)] attempting to corgize [key_name(H)]") - message_admins("\blue [key_name_admin(usr)] attempting to corgize [key_name_admin(H)]", 1) + message_admins("[key_name_admin(usr)] attempting to corgize [key_name_admin(H)]", 1) H.corgize() @@ -967,7 +990,7 @@ M.say(speech) speech = sanitize(speech) // Nah, we don't trust them log_admin("[key_name(usr)] forced [key_name(M)] to say: [speech]") - message_admins("\blue [key_name_admin(usr)] forced [key_name_admin(M)] to say: [speech]") + message_admins("[key_name_admin(usr)] forced [key_name_admin(M)] to say: [speech]") else if(href_list["sendtoprison"]) if(!check_rights(R_ADMIN)) return @@ -984,7 +1007,7 @@ return M.loc = pick(prisonwarp) - M << "\blue You have been sent to Prison!" + M << "You have been sent to Prison!" log_admin("[key_name(usr)] has sent [key_name(M)] to Prison!") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] Prison!", 1) @@ -1013,7 +1036,7 @@ sleep(5) M.loc = pick(tdome1) spawn(50) - M << "\blue You have been sent to the Thunderdome." + M << "You have been sent to the Thunderdome." log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Team 1)") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Team 1)", 1) @@ -1042,7 +1065,7 @@ sleep(5) M.loc = pick(tdome2) spawn(50) - M << "\blue You have been sent to the Thunderdome." + M << "You have been sent to the Thunderdome." log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Team 2)") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Team 2)", 1) @@ -1064,7 +1087,7 @@ sleep(5) M.loc = pick(tdomeadmin) spawn(50) - M << "\blue You have been sent to the Thunderdome." + M << "You have been sent to the Thunderdome." log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Admin.)") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Admin.)", 1) @@ -1097,7 +1120,7 @@ sleep(5) M.loc = pick(tdomeobserve) spawn(50) - M << "\blue You have been sent to the Thunderdome." + M << " You have been sent to the Thunderdome." log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Observer.)") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Observer.)", 1) @@ -1110,7 +1133,7 @@ return L.revive() - message_admins("\red Admin [key_name_admin(usr)] healed / revived [key_name_admin(L)]!", 1) + message_admins("Admin [key_name_admin(usr)] healed / revived [key_name_admin(L)]!", 1) log_admin("[key_name(usr)] healed / Revived [key_name(L)]") else if(href_list["makeai"]) @@ -1121,7 +1144,7 @@ usr << "This can only be used on instances of type /mob/living/carbon/human" return - message_admins("\red Admin [key_name_admin(usr)] AIized [key_name_admin(H)]!", 1) + message_admins("Admin [key_name_admin(usr)] AIized [key_name_admin(H)]!", 1) log_admin("[key_name(usr)] AIized [key_name(H)]") H.AIize() @@ -1315,7 +1338,7 @@ log_admin("[key_name(H)] got their cookie, spawned by [key_name(src.owner)]") message_admins("[key_name(H)] got their cookie, spawned by [key_name(src.owner)]") feedback_inc("admin_cookies_spawned",1) - H << "\blue Your prayers have been answered!! You received the best cookie!" + H << "Your prayers have been answered!! You received the best cookie!" else if(href_list["BlueSpaceArtillery"]) if(!check_rights(R_ADMIN|R_FUN)) return @@ -1583,6 +1606,15 @@ spawn(0) H.monkeyize() ok = 1 + if("allspecies") + var/result = input(usr, "Please choose a new species","Species") as null|anything in species_list + if(result) + log_admin("[key_name(usr)] turned all humans into [result]", 1) + message_admins("\blue [key_name_admin(usr)] turned all humans into [result]", 1) + var/newtype = species_list[result] + for(var/mob/living/carbon/human/H in mob_list) + H.dna.species = new newtype() + H.regenerate_icons() if("corgi") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","M") @@ -1604,19 +1636,19 @@ feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","P") log_admin("[key_name(usr)] made all areas powered", 1) - message_admins("\blue [key_name_admin(usr)] made all areas powered", 1) + message_admins("[key_name_admin(usr)] made all areas powered", 1) power_restore() if("unpower") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","UP") log_admin("[key_name(usr)] made all areas unpowered", 1) - message_admins("\blue [key_name_admin(usr)] made all areas unpowered", 1) + message_admins("[key_name_admin(usr)] made all areas unpowered", 1) power_failure() if("quickpower") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","QP") log_admin("[key_name(usr)] made all SMESs powered", 1) - message_admins("\blue [key_name_admin(usr)] made all SMESs powered", 1) + message_admins("[key_name_admin(usr)] made all SMESs powered", 1) power_restore_quick() if("traitor_all") if(!ticker) @@ -1652,7 +1684,7 @@ A.mind.objectives += new_objective ticker.mode.greet_traitor(A.mind) ticker.mode.finalize_traitor(A.mind) - message_admins("\blue [key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective]", 1) + message_admins("[key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective]", 1) log_admin("[key_name(usr)] used everyone is a traitor secret. Objective is [objective]") if("togglebombcap") feedback_inc("admin_secrets_fun_used",1) @@ -1682,89 +1714,9 @@ MAX_EX_LIGHT_RANGE = 14 MAX_EX_HEAVY_RANGE = 7 MAX_EX_DEVESTATION_RANGE = 3 - message_admins("\red [key_name_admin(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE]", 1) + message_admins("[key_name_admin(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE]", 1) log_admin("[key_name(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE]") - if("wave") - var/should_announce = alert(usr, "Meteors will be spawned. Would you like to make an announcement?", "Message", "Yes", "No") == "Yes" - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","MW") - message_admins("[key_name_admin(usr)] has spawned meteors") - E = new /datum/round_event/meteor_wave(should_announce) - if("gravanomalies") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","GA") - message_admins("[key_name_admin(usr)] has spawned a gravitational anomaly") - E = new /datum/round_event/anomaly/anomaly_grav() - if("pyroanomalies") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","PYRO") - message_admins("[key_name_admin(usr)] has spawned a pyroclastic anomaly") - E = new /datum/round_event/anomaly/anomaly_pyro() - if("blackhole") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","BH") - message_admins("[key_name_admin(usr)] has spawned a vortex anomaly") - E = new /datum/round_event/anomaly/anomaly_vortex() - if("timeanomalies") //dear god this code was awful :P Still needs further optimisation - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","STA") - message_admins("[key_name_admin(usr)] has made wormholes") - E = new /datum/round_event/wormholes() - if("goblob") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","BL") - message_admins("[key_name_admin(usr)] has spawned blob", 1) - E = new /datum/round_event/blob() - if("aliens") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","AL") - message_admins("[key_name_admin(usr)] has spawned aliens", 1) - E = new /datum/round_event/alien_infestation() - if("alien_silent") //replaces the spawn_xeno verb - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","ALS") - create_xeno() - if("spiders") - E = new /datum/round_event/spider_infestation() - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","SL") - message_admins("[key_name_admin(usr)] has spawned spiders", 1) - if("bluespaceanomaly") - E = new /datum/round_event/anomaly/anomaly_bluespace() - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","BA") - message_admins("[key_name_admin(usr)] has triggered a bluespace anomaly", 1) - if("comms_blackout") - E = new /datum/round_event/communications_blackout() - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","CB") - message_admins("[key_name_admin(usr)] triggered a communications blackout.", 1) - if("spaceninja") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","SN") - message_admins("[key_name_admin(usr)] has sent in a space ninja", 1) - E = new /datum/round_event/ninja() - if("carp") - E = new /datum/round_event/carp_migration() - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","C") - message_admins("[key_name_admin(usr)] has spawned carp.", 1) - if("radiation") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","R") - message_admins("[key_name_admin(usr)] has has irradiated the station", 1) - E = new /datum/round_event/radiation_storm() - if("immovable") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","IR") - message_admins("[key_name_admin(usr)] has sent an immovable rod to the station", 1) - E = new /datum/round_event/immovable_rod() - if("prison_break") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","PB") - message_admins("[key_name_admin(usr)] has allowed a prison break", 1) - E = new /datum/round_event/prison_break() if("lightsout") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","LO") @@ -1854,7 +1806,7 @@ feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","RET") for(var/mob/living/carbon/human/H in player_list) - H << "\red You suddenly feel stupid." + H << "You suddenly feel stupid." H.setBrainLoss(60) message_admins("[key_name_admin(usr)] made everybody retarded") if("eagles")//SCRAW @@ -1880,26 +1832,11 @@ B.facial_hair_style = "Dward Beard" B.update_hair() message_admins("[key_name_admin(usr)] activated dorf mode") - if("ionstorm") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","I") - message_admins("[key_name_admin(usr)] triggered an ion storm") - E = new /datum/round_event/ion_storm() - if("spacevines") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","K") - message_admins("[key_name_admin(usr)] has spawned spacevines", 1) - E = new /datum/round_event/spacevine() if("onlyone") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","OO") usr.client.only_one() // message_admins("[key_name_admin(usr)] has triggered a battle to the death (only one)") - if("energeticflux") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","FLUX") - message_admins("[key_name_admin(usr)] has triggered an energetic flux") - E = new /datum/round_event/anomaly/anomaly_flux() if(E) E.processing = 0 if(E.announceWhen>0) @@ -1966,7 +1903,7 @@ if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby??","Message","Yes","Cancel") != "Yes") usr << "Kick clients from lobby aborted" return - var/list/listkicked = kick_clients_in_lobby("\red The admin [usr.ckey] issued a 'kick all clients from lobby' command.", afkonly) + var/list/listkicked = kick_clients_in_lobby("The admin [usr.ckey] issued a 'kick all clients from lobby' command.", afkonly) var/strkicked = "" for(var/name in listkicked) strkicked += "[name], " diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index c6771a1ef0d..505482d4567 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -18,7 +18,7 @@ /client/proc/SDQL2_query(query_text as message) set category = "Debug" if(!check_rights(R_DEBUG)) //Shouldn't happen... but just to be safe. - message_admins("\red ERROR: Non-admin [usr.key] attempted to execute a SDQL query!") + message_admins("ERROR: Non-admin [usr.key] attempted to execute a SDQL query!") log_admin("Non-admin [usr.key] attempted to execute a SDQL query!") if(!query_text || length(query_text) < 1) @@ -287,7 +287,7 @@ if("or", "||") result = (result || val) else - usr << "\red SDQL2: Unknown op [op]" + usr << "SDQL2: Unknown op [op]" result = null else result = val diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm index c3f96072ba3..520a83b25b6 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm @@ -66,7 +66,7 @@ /datum/SDQL_parser/proc/parse_error(error_message) error = 1 - usr << "\red SQDL2 Parsing Error: [error_message]" + usr << "SQDL2 Parsing Error: [error_message]" return query.len + 1 /datum/SDQL_parser/proc/parse() diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 94ca95d3528..309c8106b5c 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -8,12 +8,12 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," set name = "Adminhelp" if(say_disabled) //This is here to try to identify lag problems - usr << "\red Speech is currently admin-disabled." + usr << "Speech is currently admin-disabled." return //handle muting and automuting if(prefs.muted & MUTE_ADMINHELP) - src << "Error: Admin-PM: You cannot send adminhelps (Muted)." + src << "Error: Admin-PM: You cannot send adminhelps (Muted)." return if(src.handle_spam_prevention(msg,MUTE_ADMINHELP)) return @@ -85,7 +85,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," if(!mob) return //this doesn't happen var/ref_mob = "\ref[mob]" - msg = "\blue HELP: [key_name(src, 1)] (?) (PP) (VV) (SM) (JMP) (CA) [ai_found ? " (CL)" : ""]: [msg]" + msg = "HELP: [key_name(src, 1)] (?) (PP) (VV) (SM) (JMP) (CA) [ai_found ? " (CL)" : ""]: [msg]" //send this msg to all admins var/admin_number_total = 0 //Total number of admins diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index d716210ce43..213e618d82d 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -8,7 +8,7 @@ if(!src.mob) return if(prefs.muted & MUTE_DEADCHAT) - src << "\red You cannot send DSAY messages (muted)." + src << "You cannot send DSAY messages (muted)." return if (src.handle_spam_prevention(msg,MUTE_DEADCHAT)) @@ -19,8 +19,9 @@ if (!msg) return + var/nicknames = file2list("config/admin_nicknames.txt") - var/rendered = "DEAD: ADMIN([src.holder.fakekey ? pick("BADMIN", "Fun Police", "Conspiracy", "ERP BLOCKER", "Button Masher", "MissPhaeron", "Turdicide", "hornigranny", "TLC", "scaredofshowers", "SXSI", "HerpEs", "Nerdrak", "Dickarrus", "Wario90900", "Deurpyn", "Fatbeaver", "Arrowage", "Intigaycy", "Hosin Hitter", "Cheridumb", "Petethegoatse", "HotelHabboLover", "Giacunt", "Muskrats", "FickleInspector", "Tankbutt", "Ulisex", "Scrotemis", "Sillnazi", "Stillachair", "cbdsm", "Un_Professional", "Doopenis", "Calasrear", "Quackink ", "ANyan:3", "Slieve", "Pali-en269", "Teamcreep", "Agoatsie", "Zoomerdik", "LewdMechanic", "NemoPanFried", "LameMontgommery", "EndGameOver", "LocalDingus", "ThoughtlessNaps", "Sewage", "hbgay6969", "Cockdtbent", "Iranclanos", "Liarwhine", "Vagyina", "Nohrape", "Dumboner69", "Gaymarr", "Jesusfraud") : src.key]) says, \"[msg]\"" + var/rendered = "DEAD: ADMIN([src.holder.fakekey ? pick(nicknames) : src.key]) says, \"[msg]\"" for (var/mob/M in player_list) if (istype(M, /mob/new_player)) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 2372f653b6f..b8300e665e4 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -244,7 +244,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M:Alienize() feedback_add_details("admin_verb","MKAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] made [key_name(M)] into an alien.") - message_admins("\blue [key_name_admin(usr)] made [key_name(M)] into an alien.", 1) + message_admins("[key_name_admin(usr)] made [key_name(M)] into an alien.", 1) else alert("Invalid mob") @@ -261,7 +261,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M:slimeize() feedback_add_details("admin_verb","MKMET") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] made [key_name(M)] into a slime.") - message_admins("\blue [key_name_admin(usr)] made [key_name(M)] into a slime.", 1) + message_admins("[key_name_admin(usr)] made [key_name(M)] into a slime.", 1) else alert("Invalid mob") @@ -487,7 +487,7 @@ var/global/list/g_fancy_list_of_safe_types = null alert("Invalid mob") feedback_add_details("admin_verb","GFA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(src)] has granted [M.key] full access.") - message_admins("\blue [key_name_admin(usr)] has granted [M.key] full access.", 1) + message_admins("[key_name_admin(usr)] has granted [M.key] full access.", 1) /client/proc/cmd_assume_direct_control(var/mob/M in mob_list) set category = "Admin" @@ -500,7 +500,7 @@ var/global/list/g_fancy_list_of_safe_types = null else var/mob/dead/observer/ghost = new/mob/dead/observer(M,1) ghost.ckey = M.ckey - message_admins("\blue [key_name_admin(usr)] assumed direct control of [M].", 1) + message_admins("[key_name_admin(usr)] assumed direct control of [M].", 1) log_admin("[key_name(usr)] assumed direct control of [M].") var/mob/adminmob = src.mob M.ckey = src.ckey @@ -636,7 +636,6 @@ var/global/list/g_fancy_list_of_safe_types = null "assassin", "mobster", "death commando", -// "syndicate commando", "centcom official", "centcom commander", "special ops officer", @@ -664,7 +663,8 @@ var/global/list/g_fancy_list_of_safe_types = null if ("as job...") if(jobdatum) - dresscode = "[jobdatum.title]" + dresscode = jobdatum.title + M.job = jobdatum.title jobdatum.equip(M) if ("standard space gear") @@ -777,13 +777,6 @@ var/global/list/g_fancy_list_of_safe_types = null M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand) -/* - if ("soviet soldier") - M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head) -*/ - if("tunnel clown")//Tunnel clowns rule! M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes) @@ -860,54 +853,9 @@ var/global/list/g_fancy_list_of_safe_types = null W.update_label(M.real_name) M.equip_to_slot_or_del(W, slot_wear_id) // DEATH SQUADS - if("death commando")//Was looking to add this for a while. + if("death commando") + equip_deathsquad(M) - var/obj/item/device/radio/R = new /obj/item/device/radio/headset(M) - R.set_frequency(1441) - M.equip_to_slot_or_del(R, slot_ears) - - M.equip_to_slot_or_del(new /obj/item/clothing/under/color/green(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad(M), slot_head) - M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(M), slot_wear_mask) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(M), slot_glasses) - - M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(M), slot_back) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) - - M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) - - M.equip_to_slot_or_del(new /obj/item/weapon/plastique(M), slot_in_backpack) - - M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(M), slot_l_store) - M.equip_to_slot_or_del(new /obj/item/weapon/grenade/flashbang(M), slot_r_store) - M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen(M), slot_s_store) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_belt) - - M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle(M), slot_r_hand) - - - var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)//Here you go Deuryn - L.imp_in = M - L.implanted = 1 - - var/obj/item/weapon/card/id/W = new(M) - W.icon_state = "centcom" - W.access = get_all_accesses()//They get full station access. - W.access += get_centcom_access("Death Commando")//Let's add their alloted Centcom access. - W.assignment = "Death Commando" - W.registered_name = M.real_name - W.update_label(M.real_name) - M.equip_to_slot_or_del(W, slot_wear_id) -/* - if("syndicate commando") - M.equip_syndicate_commando() -*/ if("centcom official") M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(M), slot_shoes) @@ -1057,7 +1005,7 @@ var/global/list/g_fancy_list_of_safe_types = null M.regenerate_icons() log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].") - message_admins("\blue [key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode]..", 1) + message_admins("[key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode]..", 1) return /client/proc/startSinglo() @@ -1142,3 +1090,51 @@ var/global/list/g_fancy_list_of_safe_types = null dat += "[path] - [garbage.logging[path]] times
    " usr << browse(dat, "window=dellog") + +/proc/equip_deathsquad(var/mob/living/carbon/human/M, var/officer) + var/obj/item/device/radio/R = new /obj/item/device/radio/headset(M) + R.set_frequency(1441) + M.equip_to_slot_or_del(R, slot_ears) + + if(officer) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head) + else + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad(M), slot_head) + + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/under/color/green(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(M), slot_glasses) + + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) + + M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) + + M.equip_to_slot_or_del(new /obj/item/weapon/plastique(M), slot_in_backpack) + + M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(M), slot_l_store) + M.equip_to_slot_or_del(new /obj/item/weapon/shield/energy(M), slot_r_store) + M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen(M), slot_s_store) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_belt) + + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle(M), slot_r_hand) + + + var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)//Here you go Deuryn + L.imp_in = M + L.implanted = 1 + + var/obj/item/weapon/card/id/W = new(M) + W.icon_state = "centcom" + W.access = get_all_accesses()//They get full station access. + W.access += get_centcom_access("Death Commando")//Let's add their alloted Centcom access. + W.assignment = "Death Commando" + W.registered_name = M.real_name + W.update_label(M.real_name) + M.equip_to_slot_or_del(W, slot_wear_id) diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index cea94770a86..eb4c446ec01 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -12,7 +12,7 @@ if(T.active_hotspot) burning = 1 - usr << "\blue @[target.x],[target.y]: O:[GM.oxygen] T:[GM.toxins] N:[GM.nitrogen] C:[GM.carbon_dioxide] w [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]" + usr << "@[target.x],[target.y]: O:[GM.oxygen] T:[GM.toxins] N:[GM.nitrogen] C:[GM.carbon_dioxide] w [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]" for(var/datum/gas/trace_gas in GM.trace_gases) usr << "[trace_gas.type]: [trace_gas.moles]" feedback_add_details("admin_verb","DAST") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index a567d4eaec6..efe38fa2172 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -140,7 +140,6 @@ var/intercom_range_display_status = 0 src.verbs += /datum/admins/proc/show_traitor_panel src.verbs += /client/proc/print_jobban_old src.verbs += /client/proc/print_jobban_old_filter - src.verbs += /client/proc/forceEvent src.verbs += /client/proc/kill_pipe_processing src.verbs += /client/proc/kill_air_processing src.verbs += /client/proc/disable_communication diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/verbs/massmodvar.dm index 910f7530bb2..4b9cdbac6da 100644 --- a/code/modules/admin/verbs/massmodvar.dm +++ b/code/modules/admin/verbs/massmodvar.dm @@ -30,7 +30,7 @@ for(var/p in forbidden_varedit_object_types) if( istype(O,p) ) - usr << "\red It is forbidden to edit this object's variables." + usr << "It is forbidden to edit this object's variables." return var/list/names = list() diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 22321eda7bd..9f1e3e206bb 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -281,11 +281,11 @@ var/list/forbidden_varedit_object_types = list( for(var/p in forbidden_varedit_object_types) if( istype(O,p) ) - usr << "\red It is forbidden to edit this object's variables." + usr << "It is forbidden to edit this object's variables." return if(istype(O, /client) && (param_var_name == "ckey" || param_var_name == "key")) - usr << "\red You cannot edit ckeys on client objects." + usr << "You cannot edit ckeys on client objects." return var/class diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index c225d332a23..b12a431043d 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -10,14 +10,16 @@ client/proc/one_click_antag() /datum/admins/proc/one_click_antag() - var/dat = {"One-click Antagonist
    + var/dat = {"Quick-Create Antagonist
    Make Traitors
    Make Changelings
    Make Revs
    Make Cult
    Make Malf AI
    + Make Blob
    Make Wizard (Requires Ghosts)
    Make Nuke Team (Requires Ghosts)
    + Make Deathsquad (Requires Ghosts)
    "} /* These dont work just yet Ninja, aliens and deathsquad I have not looked into yet @@ -26,7 +28,6 @@ client/proc/one_click_antag() Make Space Ninja (Requires Ghosts)
    Make Aliens (Requires Ghosts)
    - Make Deathsquad (Syndicate) (Requires Ghosts)
    "} */ usr << browse(dat, "window=oneclickantag;size=400x400") @@ -317,21 +318,16 @@ client/proc/one_click_antag() new /datum/round_event/ninja() return 1 -/* DEATH SQUADS +// DEATH SQUADS /datum/admins/proc/makeDeathsquad() var/list/mob/dead/observer/candidates = list() - var/mob/dead/observer/theghost = null var/time_passed = world.time - var/input = "Purify the station." - if(prob(10)) - input = "Save Runtime and any other cute things on the station." - - var/syndicate_leader_selected = 0 //when the leader is chosen. The last person spawned. + var/mission = input("Assign a mission to the deathsquad", "Assign Mission", "Leave no witnesses.") //Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos. for(var/mob/dead/observer/G in player_list) spawn(0) - switch(alert(G,"Do you wish to be considered for an elite syndicate strike team being sent in?","Please answer in 30 seconds!","Yes","No")) + switch(alert(G,"Do you wish to be considered for an elite Nanotrasen strike team being sent in?","Please answer in 30 seconds!","Yes","No")) if("Yes") if((world.time-time_passed)>300)//If more than 30 game seconds passed. return @@ -346,45 +342,58 @@ client/proc/one_click_antag() if(!G.key) candidates.Remove(G) - if(candidates.len) - var/numagents = 6 - //Spawns commandos and equips them. - for (var/obj/effect/landmark/L in /area/syndicate_mothership/elite_squad) - if(numagents<=0) - break - if (L.name == "Syndicate-Commando") - syndicate_leader_selected = numagents == 1?1:0 + if(candidates.len >= 3) //Minimum 3 to be considered a squad + //Pick the lucky players + var/numagents = min(5,candidates.len) //How many commandos to spawn + while(numagents && deathsquadspawn.len && candidates.len) + var/spawnloc = deathsquadspawn[1] + var/mob/dead/observer/chosen_candidate = pick(candidates) + candidates -= chosen_candidate + if(!chosen_candidate.key) + continue - var/mob/living/carbon/human/new_syndicate_commando = create_syndicate_death_commando(L, syndicate_leader_selected) + //Spawn and equip the commando + var/mob/living/carbon/human/Commando = new(spawnloc) + chosen_candidate.client.prefs.copy_to(Commando) + ready_dna(Commando) + if(numagents == 1) //If Squad Leader + Commando.real_name = "Officer [pick(commando_names)]" + equip_deathsquad(Commando, 1) + else + Commando.real_name = "Trooper [pick(commando_names)]" + equip_deathsquad(Commando) + Commando.key = chosen_candidate.key + Commando.mind.assigned_role = "Death Commando" + //Assign antag status and the mission + ticker.mode.traitors += Commando.mind + Commando.mind.special_role = "deathsquad" + var/datum/objective/missionobj = new + missionobj.owner = Commando.mind + missionobj.explanation_text = mission + missionobj.completed = 1 + Commando.mind.objectives += missionobj - while((!theghost || !theghost.client) && candidates.len) - theghost = pick(candidates) - candidates.Remove(theghost) + //Greet the commando + Commando << "You are the [numagents==1?"Deathsquad Officer":"Death Commando"]." + var/missiondesc = "Your squad is being sent on a mission to [station_name()] by Nanotrasen's Security Division." + if(numagents == 1) //If Squad Leader + missiondesc += " Lead your squad to ensure the completion of the mission. Board the shuttle when your team is ready." + else + missiondesc += " Follow orders given to you by your squad leader." + missiondesc += "
    Your Mission: [mission]" + Commando << missiondesc - if(!theghost) - qdel(new_syndicate_commando) - break + //Logging and cleanup + if(numagents == 1) + message_admins("The deathsquad has spawned with [key_name_admin(Commando)] as squad leader.") + log_game("[key_name(Commando)] has been selected as a Death Commando") + deathsquadspawn -= spawnloc + numagents-- - new_syndicate_commando.key = theghost.key - new_syndicate_commando.internal = new_syndicate_commando.s_store - new_syndicate_commando.internals.icon_state = "internal1" + return 1 - //So they don't forget their code or mission. - - - new_syndicate_commando << "\blue You are an Elite Syndicate. [!syndicate_leader_selected?"commando":"LEADER"] in the service of the Syndicate. \nYour current mission is: \red [input]" - - numagents-- - if(numagents >= 6) - return 0 - - for (var/obj/effect/landmark/L in /area/shuttle/syndicate_elite) - if (L.name == "Syndicate-Commando-Bomb") - new /obj/effect/spawner/newbomb/timer/syndicate(L.loc) - - return 1 -*/ + return /datum/admins/proc/makeBody(var/mob/dead/observer/G_found) // Uses stripped down and bastardized code from respawn character if(!G_found || !G_found.key) return diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index 055dddd958b..03df9628c46 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -46,5 +46,5 @@ W.update_label(H.real_name) H.equip_to_slot_or_del(W, slot_wear_id) - message_admins("\blue [key_name_admin(usr)] used THERE CAN BE ONLY ONE!", 1) + message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ONE!", 1) log_admin("[key_name(usr)] used there can be only one.") \ No newline at end of file diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 6451ed11748..09fcefa8845 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -3,7 +3,7 @@ set name = "Pray" if(say_disabled) //This is here to try to identify lag problems - usr << "\red Speech is currently admin-disabled." + usr << "Speech is currently admin-disabled." return msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) @@ -11,13 +11,13 @@ log_prayer("[src.key]/([src.name]): [msg]") if(usr.client) if(usr.client.prefs.muted & MUTE_PRAY) - usr << "\red You cannot pray (muted)." + usr << "You cannot pray (muted)." return if(src.client.handle_spam_prevention(msg,MUTE_PRAY)) return var/image/cross = image('icons/obj/storage.dmi',"bible") - msg = "\blue \icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) (JMP) (CA) (SC): [msg]" + msg = "\icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) (JMP) (CA) (SC): [msg]" for(var/client/C in admins) if(C.prefs.toggles & CHAT_PRAYER) @@ -29,10 +29,10 @@ /proc/Centcomm_announce(var/text , var/mob/Sender) var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN) - msg = "\blue CENTCOM:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" + msg = " CENTCOM:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" admins << msg /proc/Syndicate_announce(var/text , var/mob/Sender) var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN) - msg = "\blue SYNDICATE:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" + msg = "SYNDICATE:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" admins << msg diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 2c258ec15ba..cf5bd6884e6 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -36,7 +36,7 @@ M << "\bold You hear a voice in your head... \italic [msg]" log_admin("SubtlePM: [key_name(usr)] -> [key_name(M)] : [msg]") - message_admins("\blue \bold SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]", 1) + message_admins(" SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]", 1) feedback_add_details("admin_verb","SMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_world_narrate() @@ -53,7 +53,7 @@ return world << "[msg]" log_admin("GlobalNarrate: [key_name(usr)] : [msg]") - message_admins("\blue \bold GlobalNarrate: [key_name_admin(usr)] : [msg]
    ", 1) + message_admins(" GlobalNarrate: [key_name_admin(usr)] : [msg]
    ", 1) feedback_add_details("admin_verb","GLN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_direct_narrate(var/mob/M) @@ -77,7 +77,7 @@ M << msg log_admin("DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]): [msg]") - message_admins("\blue \bold DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]): [msg]
    ", 1) + message_admins(" DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]): [msg]
    ", 1) feedback_add_details("admin_verb","DIRN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_godmode(mob/M as mob in mob_list) @@ -87,7 +87,7 @@ src << "Only administrators may use this command." return M.status_flags ^= GODMODE - usr << "\blue Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]" + usr << "Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]" log_admin("[key_name(usr)] has toggled [key_name(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]") message_admins("[key_name_admin(usr)] has toggled [key_name_admin(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]", 1) @@ -196,7 +196,7 @@ proc/cmd_admin_mute(whom, mute_type, automute = 0) else return 0 new_xeno.ckey = ckey - message_admins("\blue [key_name_admin(usr)] has spawned [ckey] as a filthy xeno [alien_caste].", 1) + message_admins("[key_name_admin(usr)] has spawned [ckey] as a filthy xeno [alien_caste].", 1) return 1 /* @@ -247,7 +247,7 @@ Traitors and the like can also be revived with the previous role mostly intact. G_found.mind.transfer_to(new_xeno) //be careful when doing stuff like this! I've already checked the mind isn't in use new_xeno.key = G_found.key new_xeno << "You have been fully respawned. Enjoy the game." - message_admins("\blue [key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno.", 1) + message_admins("[key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno.", 1) return //all done. The ghost is auto-deleted //check if they were a monkey @@ -257,7 +257,7 @@ Traitors and the like can also be revived with the previous role mostly intact. G_found.mind.transfer_to(new_monkey) //be careful when doing stuff like this! I've already checked the mind isn't in use new_monkey.key = G_found.key new_monkey << "You have been fully respawned. Enjoy the game." - message_admins("\blue [key_name_admin(usr)] has respawned [new_monkey.key] as a filthy xeno.", 1) + message_admins("[key_name_admin(usr)] has respawned [new_monkey.key] as a filthy xeno.", 1) return //all done. The ghost is auto-deleted @@ -367,7 +367,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(alert(new_character,"Would you like an active AI to announce this character?",,"No","Yes")=="Yes") call(/mob/new_player/proc/AnnounceArrival)(new_character, new_character.mind.assigned_role) - message_admins("\blue [admin] has respawned [player_key] as [new_character.real_name].", 1) + message_admins("[admin] has respawned [player_key] as [new_character.real_name].", 1) new_character << "You have been fully respawned. Enjoy the game." @@ -408,7 +408,7 @@ Traitors and the like can also be revived with the previous role mostly intact. M.revive() log_admin("[key_name(usr)] healed / revived [key_name(M)]") - message_admins("\red Admin [key_name_admin(usr)] healed / revived [key_name_admin(M)]!", 1) + message_admins("Admin [key_name_admin(usr)] healed / revived [key_name_admin(M)]!", 1) feedback_add_details("admin_verb","REJU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_create_centcom_report() @@ -423,23 +423,11 @@ Traitors and the like can also be revived with the previous role mostly intact. var/confirm = alert(src, "Do you want to announce the contents of the report to the crew?", "Announce", "Yes", "No") if(confirm == "Yes") - priority_announce(input, null, 'sound/AI/commandreport.ogg'); - for (var/obj/machinery/computer/communications/C in machines) - if(! (C.stat & (BROKEN|NOPOWER) ) ) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc ) - P.name = "paper- '[command_name()] Update.'" - P.info = input - C.messagetitle.Add("[command_name()] Update") - C.messagetext.Add(P.info) + priority_announce(input, null, 'sound/AI/commandreport.ogg') else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg'); - for (var/obj/machinery/computer/communications/C in machines) - if(! (C.stat & (BROKEN|NOPOWER) ) ) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc ) - P.name = "paper- 'Classified [command_name()] Update.'" - P.info = input - C.messagetitle.Add("Classified [command_name()] Update") - C.messagetext.Add(P.info) + priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg') + + print_command_report(input,"[confirm=="Yes" ? "" : "Classified "][command_name()] Update") log_admin("[key_name(src)] has created a command report: [input]") message_admins("[key_name_admin(src)] has created a command report", 1) @@ -560,7 +548,7 @@ Traitors and the like can also be revived with the previous role mostly intact. mob.gib() log_admin("[key_name(usr)] used gibself.") - message_admins("\blue [key_name_admin(usr)] used gibself.", 1) + message_admins("[key_name_admin(usr)] used gibself.", 1) feedback_add_details("admin_verb","GIBS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /* /client/proc/cmd_manual_ban() @@ -705,7 +693,7 @@ Traitors and the like can also be revived with the previous role mostly intact. priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.", null, 'sound/AI/shuttlecalled.ogg', "Priority") feedback_add_details("admin_verb","CSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] admin-called the emergency shuttle.") - message_admins("\blue [key_name_admin(usr)] admin-called the emergency shuttle.", 1) + message_admins("[key_name_admin(usr)] admin-called the emergency shuttle.", 1) return /client/proc/admin_cancel_shuttle() @@ -720,7 +708,7 @@ Traitors and the like can also be revived with the previous role mostly intact. emergency_shuttle.recall() feedback_add_details("admin_verb","CCSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] admin-recalled the emergency shuttle.") - message_admins("\blue [key_name_admin(usr)] admin-recalled the emergency shuttle.", 1) + message_admins("[key_name_admin(usr)] admin-recalled the emergency shuttle.", 1) return @@ -728,7 +716,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Special Verbs" set name = "Attack Log" - usr << text("\red Attack Log for []", mob) + usr << text("Attack Log for []", mob) for(var/t in M.attack_log) usr << t feedback_add_details("admin_verb","ATTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -758,7 +746,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("Admin [key_name_admin(usr)] has forced the players to have random appearances.", 1) if(notifyplayers == "Yes") - world << "\blue Admin [usr.key] has forced the players to have completely random identities!" + world << "Admin [usr.key] has forced the players to have completely random identities!" usr << "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet." diff --git a/code/modules/admin/verbs/ticklag.dm b/code/modules/admin/verbs/ticklag.dm index 928ba733caa..73a04bd5306 100644 --- a/code/modules/admin/verbs/ticklag.dm +++ b/code/modules/admin/verbs/ticklag.dm @@ -19,6 +19,6 @@ if("Yes") config.Tickcomp = 1 else config.Tickcomp = 0 else - src << "\red Error: ticklag(): Invalid world.ticklag value. No changes made." + src << "Error: ticklag(): Invalid world.ticklag value. No changes made." diff --git a/code/modules/admin/verbs/tripAI.dm b/code/modules/admin/verbs/tripAI.dm index 5e5ccbb1237..07d97e39ef1 100644 --- a/code/modules/admin/verbs/tripAI.dm +++ b/code/modules/admin/verbs/tripAI.dm @@ -14,9 +14,9 @@ if(ticker.triai) ticker.triai = 0 usr << "Only one AI will be spawned at round start." - message_admins("\blue [key_name_admin(usr)] has toggled off triple AIs at round start.", 1) + message_admins("[key_name_admin(usr)] has toggled off triple AIs at round start.", 1) else ticker.triai = 1 usr << "There will be an AI Triumvirate at round start." - message_admins("\blue [key_name_admin(usr)] has toggled on triple AIs at round start.", 1) + message_admins("[key_name_admin(usr)] has toggled on triple AIs at round start.", 1) return diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 6a62258e991..3097608333e 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -98,7 +98,7 @@ /obj/item/device/assembly/attach_assembly(var/obj/item/device/assembly/A, var/mob/user) holder = new/obj/item/device/assembly_holder(get_turf(src)) if(holder.attach(A,src,user)) - user << "\blue You attach \the [A] to \the [src]!" + user << "You attach \the [A] to \the [src]!" return 1 return 0 @@ -111,9 +111,9 @@ return if(istype(W, /obj/item/weapon/screwdriver)) if(toggle_secure()) - user << "\blue \The [src] is ready!" + user << "\The [src] is ready!" else - user << "\blue \The [src] can now be attached!" + user << "\The [src] can now be attached!" return ..() return diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index f17048048f6..af2f1a73b59 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -81,10 +81,6 @@ if(bombassembly) bombassembly.on_found(finder) -/obj/item/device/onetankbomb/hear_talk(mob/living/M as mob, msg) - if(bombassembly) - bombassembly.hear_talk(M, msg) - // ---------- Procs below are for tanks that are used exclusively in 1-tank bombs ---------- diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 50f135941e0..b2bde69df19 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -19,8 +19,6 @@ /obj/item/device/assembly_holder/proc/process_activation(var/obj/item/device/D) return - - /obj/item/device/assembly_holder/IsAssemblyHolder() return 1 @@ -87,20 +85,12 @@ if(a_right) a_right.on_found(finder) - -/obj/item/device/assembly_holder/hear_talk(mob/living/M as mob, msg) - if(a_left) - a_left.hear_talk(M, msg) - if(a_right) - a_right.hear_talk(M, msg) - /obj/item/device/assembly_holder/Move() ..() if(a_left && a_right) a_left.holder_movement() a_right.holder_movement() - return - + return /obj/item/device/assembly_holder/attack_hand()//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess if(a_left && a_right) @@ -113,15 +103,15 @@ /obj/item/device/assembly_holder/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/screwdriver)) if(!a_left || !a_right) - user << "\red BUG:Assembly part missing, please report this!" + user << "BUG:Assembly part missing, please report this!" return a_left.toggle_secure() a_right.toggle_secure() secured = !secured if(secured) - user << "\blue \The [src] is ready!" + user << "\The [src] is ready!" else - user << "\blue \The [src] can now be taken apart!" + user << "\The [src] can now be taken apart!" update_icon() return else @@ -133,7 +123,7 @@ src.add_fingerprint(user) if(src.secured) if(!a_left || !a_right) - user << "\red Assembly part missing!" + user << "Assembly part missing!" return if(istype(a_left,a_right.type))//If they are the same type it causes issues due to window code switch(alert("Which side would you like to use?",,"Left","Right")) @@ -166,13 +156,3 @@ if(master) master.receive_signal() return 1 - - - - - - - - - - diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index a1cbfbb7759..130390dec5b 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -57,7 +57,7 @@ H.updatehealth() else if(ismouse(target)) var/mob/living/simple_animal/mouse/M = target - visible_message("\red SPLAT!") + visible_message("SPLAT!") M.splat() playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) armed = 0 diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index 05b9b508e9c..6e3c6c86976 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -19,7 +19,7 @@ /obj/item/device/assembly/prox_sensor/describe() if(timing) - return "\blue The proximity sensor is arming." + return "The proximity sensor is arming." return "The proximity sensor is [scanning?"armed":"disarmed"]." /obj/item/device/assembly/prox_sensor/activate() @@ -103,7 +103,7 @@ /obj/item/device/assembly/prox_sensor/interact(mob/user as mob)//TODO: Change this to the wires thingy if(!secured) - user.show_message("\red The [name] is unsecured!") + user.show_message("The [name] is unsecured!") return 0 var/second = time % 60 var/minute = (time - second) / 60 diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index cf654c56c83..b31c883dc68 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -69,7 +69,7 @@ /obj/item/device/assembly/timer/interact(mob/user as mob)//TODO: Have this use the wires if(!secured) - user.show_message("\red The [name] is unsecured!") + user.show_message("The [name] is unsecured!") return 0 var/second = time % 60 var/minute = (time - second) / 60 diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index d8ee49932ce..ad873803a34 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -5,26 +5,27 @@ m_amt = 500 g_amt = 50 origin_tech = "magnets=1" + flags = HEAR var/listening = 0 var/recorded //the activation message - -/obj/item/device/assembly/voice/hear_talk(mob/living/M as mob, msg) + +/obj/item/device/assembly/voice/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) if(listening) - recorded = msg + recorded = raw_message listening = 0 - var/turf/T = get_turf(src) //otherwise it won't work in hand - T.visible_message("\icon[src] beeps, \"Activation message is '[recorded]'.\"") - else - if(findtext(msg, recorded)) + say("Activation message is '[recorded]'.") + else + if(findtext(raw_message, recorded)) pulse(0) - + /obj/item/device/assembly/voice/activate() if(secured) if(!holder) listening = !listening - var/turf/T = get_turf(src) - T.visible_message("\icon[src] beeps, \"[listening ? "Now" : "No longer"] recording input.\"") + say("[listening ? "Now" : "No longer"] recording input.") +/obj/machinery/vending/say_quote(text) + return "beeps, \"[text]\"" /obj/item/device/assembly/voice/attack_self(mob/user) if(!user) return 0 @@ -33,5 +34,5 @@ /obj/item/device/assembly/voice/toggle_secure() - . = ..() - listening = 0 \ No newline at end of file + . = ..() + listening = 0 diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 4245bf5e056..d35ab672b6a 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -232,6 +232,6 @@ obj/machinery/gateway/centerstation/process() user << "\black The gate is already calibrated, there is no work for you to do here." return else - user << "\blue Recalibration successful!: \black This gate's systems have been fine tuned. Travel to this gate will now be on target." + user << "Recalibration successful!: \black This gate's systems have been fine tuned. Travel to this gate will now be on target." calibrated = 1 return \ No newline at end of file diff --git a/code/modules/awaymissions/loot.dm b/code/modules/awaymissions/loot.dm deleted file mode 100644 index d67610f4525..00000000000 --- a/code/modules/awaymissions/loot.dm +++ /dev/null @@ -1,17 +0,0 @@ -/obj/effect/spawner/lootdrop - icon = 'icons/mob/screen_gen.dmi' - icon_state = "x2" - var/lootcount = 1 //how many items will be spawned - var/lootdoubles = 0 //if the same item can be spawned twice - var/list/loot //a list of possible items to spawn e.g. list(/obj/item, /obj/structure, /obj/effect) - -/obj/effect/spawner/lootdrop/initialize() - if(loot && loot.len) - for(var/i = lootcount, i > 0, i--) - if(!loot.len) break - var/lootspawn = pick(loot) - if(!lootdoubles) - loot.Remove(lootspawn) - - new lootspawn(get_turf(src)) - qdel(src) \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index 1f0a894cd5a..2f3fe0ba0e6 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -79,16 +79,16 @@ user << "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart." if (!(LASER in user.mutations)) user.mutations.Add(LASER) - user << "\blue You feel pressure building behind your eyes." + user << "You feel pressure building behind your eyes." if (!(COLD_RESISTANCE in user.mutations)) user.mutations.Add(COLD_RESISTANCE) - user << "\blue Your body feels warm." + user << "Your body feels warm." if (!(XRAY in user.mutations)) user.mutations.Add(XRAY) user.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) user.see_in_dark = 8 user.see_invisible = SEE_INVISIBLE_LEVEL_TWO - user << "\blue The walls suddenly disappear." + user << "The walls suddenly disappear." user.dna.species = new /datum/species/shadow() user.regenerate_icons() if("Wealth") diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 143030c886c..a9debf6f524 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -3,7 +3,7 @@ proc/createRandomZlevel() return var/list/potentialRandomZlevels = list() - world << "\red \b Searching for away missions..." + world << "Searching for away missions..." var/list/Lines = file2list("_maps/RandomZLevels/fileList.txt") if(!Lines.len) return for (var/t in Lines) @@ -33,7 +33,7 @@ proc/createRandomZlevel() if(potentialRandomZlevels.len) - world << "\red \b Loading away mission..." + world << "Loading away mission..." var/map = pick(potentialRandomZlevels) var/file = file(map) @@ -46,8 +46,8 @@ proc/createRandomZlevel() continue awaydestinations.Add(L) - world << "\red \b Away mission loaded." + world << "Away mission loaded." else - world << "\red \b No away missions found." + world << "No away missions found." return \ No newline at end of file diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index c95d27a2a7d..3c597dd443e 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -56,11 +56,11 @@ if(config.automute_on && !holder && src.last_message == message) src.last_message_count++ if(src.last_message_count >= SPAM_TRIGGER_AUTOMUTE) - src << "\red You have exceeded the spam filter limit for identical messages. An auto-mute was applied." + src << "You have exceeded the spam filter limit for identical messages. An auto-mute was applied." cmd_admin_mute(src, mute_type, 1) return 1 if(src.last_message_count >= SPAM_TRIGGER_WARNING) - src << "\red You are nearing the spam filter limit for identical messages." + src << "You are nearing the spam filter limit for identical messages." return 0 else last_message = message diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 392768a0f8a..4e808277dc6 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -181,6 +181,7 @@ datum/preferences dat += "

    Hair Style

    " dat += "[hair_style]
    " + dat += "< >
    " dat += "    Change
    " @@ -189,6 +190,7 @@ datum/preferences dat += "

    Facial Hair Style

    " dat += "[facial_hair_style]
    " + dat += "< >
    " dat += "    Change
    " @@ -450,7 +452,7 @@ datum/preferences return if (!isnum(desiredLvl)) - user << "\red UpdateJobPreference - desired level was not a number. Please notify coders!" + user << "UpdateJobPreference - desired level was not a number. Please notify coders!" ShowChoices(user) return @@ -597,6 +599,18 @@ datum/preferences if(new_hair_style) hair_style = new_hair_style + if("next_hair_style") + if (gender == MALE) + hair_style = next_list_item(hair_style, hair_styles_male_list) + else + hair_style = next_list_item(hair_style, hair_styles_female_list) + + if("previous_hair_style") + if (gender == MALE) + hair_style = previous_list_item(hair_style, hair_styles_male_list) + else + hair_style = previous_list_item(hair_style, hair_styles_female_list) + if("facial") var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference") as null|color if(new_facial) @@ -611,6 +625,18 @@ datum/preferences if(new_facial_hair_style) facial_hair_style = new_facial_hair_style + if("next_facehair_style") + if (gender == MALE) + facial_hair_style = next_list_item(facial_hair_style, facial_hair_styles_male_list) + else + facial_hair_style = next_list_item(facial_hair_style, facial_hair_styles_female_list) + + if("previous_facehair_style") + if (gender == MALE) + facial_hair_style = previous_list_item(facial_hair_style, facial_hair_styles_male_list) + else + facial_hair_style = previous_list_item(facial_hair_style, facial_hair_styles_female_list) + if("underwear") var/new_underwear if(gender == MALE) diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 2fc6ef47c14..360a0fcf481 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -155,4 +155,13 @@ var/list/ghost_forms = list("ghost","ghostking","ghostian2","ghost_red","ghost_b prefs.ghost_form = new_form prefs.save_preferences() if(istype(mob,/mob/dead/observer)) - mob.icon_state = new_form \ No newline at end of file + mob.icon_state = new_form + +/client/verb/toggle_intent_style() + set name = "Toggle Intent Selection Style" + set category = "Preferences" + set desc = "Toggle between directly clicking the desired intent or clicking to rotate through." + prefs.toggles ^= INTENT_STYLE + src << "[(prefs.toggles & INTENT_STYLE) ? "Clicking directly on intents selects them." : "Clicking on intents rotates selection clockwise."]" + prefs.save_preferences() + feedback_add_details("admin_verb","ITENTS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! \ No newline at end of file diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 99265d6cf6f..8dae6424bb8 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -58,6 +58,7 @@ BLIND // can't see anything body_parts_covered = HANDS slot_flags = SLOT_GLOVES attack_verb = list("challenged") + var/transfer_prints = FALSE // Called just before an attack_hand(), in mob/UnarmedAttack() /obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity) @@ -170,18 +171,18 @@ BLIND // can't see anything attachTie(I, user) ..() -/obj/item/clothing/under/proc/attachTie(obj/item/I, mob/user) +/obj/item/clothing/under/proc/attachTie(obj/item/I, mob/user, notifyAttach = 1) if(istype(I, /obj/item/clothing/tie)) if(hastie) if(user) user << "[src] already has an accessory." - return + return 0 else if(user) user.drop_item() hastie = I I.loc = src - if(user) + if(user && notifyAttach) user << "You attach [I] to [src]." I.transform *= 0.5 //halve the size so it doesn't overpower the under I.pixel_x += 8 @@ -194,7 +195,7 @@ BLIND // can't see anything var/mob/living/carbon/human/H = loc H.update_inv_w_uniform(0) - return + return 1 /obj/item/clothing/under/examine() diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index a58cc64c225..5911f0178d8 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -122,7 +122,7 @@ emp_act(severity) if(istype(src.loc, /mob/living/carbon/human)) var/mob/living/carbon/human/M = src.loc - M << "\red The Optical Thermal Scanner overloads and blinds you!" + M << "The Optical Thermal Scanner overloads and blinds you!" if(M.glasses == src) M.eye_blind = 3 M.eye_blurry = 5 diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 5ea61c79d7e..9261975cb54 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -39,6 +39,15 @@ ce item_color = "chief" //Exists for washing machines. Is not different from black gloves in any way. +/obj/item/clothing/gloves/black/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/wirecutters)) + user << "You snip the fingertips off of [src]." + playsound(user.loc,'sound/items/Wirecutter.ogg', rand(10,50), 1) + var/obj/item/clothing/gloves/fingerless/fingerless_gloves = new /obj/item/clothing/gloves/fingerless(user.loc) + fingerless_gloves.icon_state = icon_state + qdel(src) + ..() + /obj/item/clothing/gloves/orange name = "orange gloves" desc = "A pair of gloves, they don't look special in any way." diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 2e551d4161b..f45c2923393 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -37,17 +37,26 @@ siemens_coefficient = 0.30 permeability_coefficient = 0.01 item_color="white" + transfer_prints = TRUE cmo item_color = "medical" //Exists for washing machines. Is not different from latex gloves in any way. /obj/item/clothing/gloves/botanic_leather - desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin. They're also quite warm." name = "botanist's leather gloves" + desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin. They're also quite warm." icon_state = "leather" item_state = "ggloves" permeability_coefficient = 0.9 cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT heat_protection = HANDS - max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT \ No newline at end of file + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + +/obj/item/clothing/gloves/fingerless + name = "fingerless gloves" + desc = "Plain black gloves without fingertips for the hard working." + icon_state = "fingerless" + item_state = "fingerless" + item_color = null //So they don't wash. + transfer_prints = TRUE \ No newline at end of file diff --git a/code/modules/clothing/gloves/ninja.dm b/code/modules/clothing/gloves/ninja.dm index 6fe92f5d346..79ae2097ee9 100644 --- a/code/modules/clothing/gloves/ninja.dm +++ b/code/modules/clothing/gloves/ninja.dm @@ -52,7 +52,7 @@ suit.transfer_ai("AICORE", "NINJASUIT", A, H) return 1 else - H << "\red ERROR: \black Remote access channel disabled." + H << "ERROR: \black Remote access channel disabled." return 0 if(istype(A,/obj/structure/AIcore/deactivated)) @@ -61,7 +61,7 @@ suit.transfer_ai("INACTIVE","NINJASUIT",A, H) return 1 else - H << "\red ERROR: \black Remote access channel disabled." + H << "ERROR: \black Remote access channel disabled." return 0 if(istype(A,/obj/machinery/computer/aifixer)) if(suit.s_control) @@ -69,7 +69,7 @@ suit.transfer_ai("AIFIXER","NINJASUIT",A, H) return 1 else - H << "\red ERROR: \black Remote access channel disabled." + H << "ERROR: \black Remote access channel disabled." return 0 // steal energy from powered things diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index a739959f784..1a21cda6535 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -62,19 +62,19 @@ if(istype(W, /obj/item/weapon/screwdriver)) switch(aggressiveness) if(1) - user << "\blue You set the restrictor to the middle position." + user << "You set the restrictor to the middle position." aggressiveness = 2 if(2) - user << "\blue You set the restrictor to the last position." + user << "You set the restrictor to the last position." aggressiveness = 3 if(3) - user << "\blue You set the restrictor to the first position." + user << "You set the restrictor to the first position." aggressiveness = 1 if(4) - user << "\red You adjust the restrictor but nothing happens, probably because its broken." + user << "You adjust the restrictor but nothing happens, probably because its broken." else if(istype(W, /obj/item/weapon/wirecutters)) if(aggressiveness != 4) - user << "\red You broke it!" + user << "You broke it!" aggressiveness = 4 else ..() diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 3fb21d3f0e1..d75d2938540 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -40,6 +40,7 @@ name = "officer's beret" desc = "An armored beret commonly used by special operations officers. Uses advanced force field technology to protect the head from space." icon_state = "beret_badge" + flags = STOPSPRESSUREDMAGE flags_inv = 0 /obj/item/clothing/suit/space/deathsquad/officer diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index a6896bc8d6a..551d38d7f26 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -2,8 +2,8 @@ * Science */ /obj/item/clothing/under/rank/research_director - desc = "It's a jumpsuit worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants." - name = "research director's jumpsuit" + desc = "It's a suit worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants." + name = "research director's suit" icon_state = "director" item_state = "g_suit" item_color = "director" @@ -11,12 +11,12 @@ /obj/item/clothing/under/rank/research_director/alt desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants." - name = "research director's jumpsuit" + name = "research director's suit" icon_state = "rdwhimsy" item_state = "rdwhimsy" item_color = "rdwhimsy" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) - flags = FPRINT + /obj/item/clothing/under/rank/scientist desc = "It's made of a special fiber that provides minor protection against biohazards. It has markings that denote the wearer as a scientist." diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm index 0617a258039..92c6e97985a 100644 --- a/code/modules/clothing/under/ties.dm +++ b/code/modules/clothing/under/ties.dm @@ -96,19 +96,12 @@ if(M.w_uniform) var/obj/item/clothing/under/U = M.w_uniform - if(!U.hastie) //Check if he is not already wearing an accessory - user.drop_item() - U.hastie = src - src.loc = U - + if(U.attachTie(src, user, 0)) //Attach it, do not notify the user of the attachment if(user == M) user << "You attach [src] to [U]." else user.visible_message("[user] pins \the [src] on [M]'s chest.", \ "You pin \the [src] on [M]'s chest.") - M.update_inv_w_uniform(0) - - else user << "\The [U] already has an accessory." else user << "Medals can only be pinned on jumpsuits." else ..() diff --git a/code/modules/detectivework/detective_work.dm b/code/modules/detectivework/detective_work.dm index 26f00b7a44c..ee5b0f262eb 100644 --- a/code/modules/detectivework/detective_work.dm +++ b/code/modules/detectivework/detective_work.dm @@ -87,6 +87,12 @@ atom/proc/add_fibers(mob/living/carbon/human/M) var/mob/living/carbon/human/H = M check_dna_integrity(H) //sets up dna and its variables if it was missing somehow + //Check if the gloves (if any) hide fingerprints + if(H.gloves) + var/obj/item/clothing/gloves/G = H.gloves + if(G.transfer_prints) + ignoregloves = 1 + //Now, deal with gloves. if(!ignoregloves) if(H.gloves && H.gloves != src) @@ -94,13 +100,7 @@ atom/proc/add_fibers(mob/living/carbon/human/M) fingerprintshidden += text("\[[]\](Wearing gloves). Real name: [], Key: []",time_stamp(), H.real_name, H.key) fingerprintslast = H.ckey H.gloves.add_fingerprint(M) - - //Deal with gloves the pass finger/palm prints. - if(H.gloves != src) - if(prob(75) && istype(H.gloves, /obj/item/clothing/gloves/latex)) - return 0 - else if(H.gloves && !istype(H.gloves, /obj/item/clothing/gloves/latex)) - return 0 + return 0 //More adminstuffz if(fingerprintslast != H.ckey) diff --git a/code/modules/detectivework/footprints_and_rag.dm b/code/modules/detectivework/footprints_and_rag.dm index 9d9fd3a8e95..7781afff461 100644 --- a/code/modules/detectivework/footprints_and_rag.dm +++ b/code/modules/detectivework/footprints_and_rag.dm @@ -41,7 +41,7 @@ /obj/item/weapon/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag) if(ismob(target) && target.reagents && reagents.total_volume) - user.visible_message("\red \The [target] has been smothered with \the [src] by \the [user]!", "\red You smother \the [target] with \the [src]!", "You hear some struggling and muffled cries of surprise") + user.visible_message("\The [target] has been smothered with \the [src] by \the [user]!", "You smother \the [target] with \the [src]!", "You hear some struggling and muffled cries of surprise") src.reagents.reaction(target, TOUCH) spawn(5) src.reagents.clear_reagents() return diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm index 654c227e810..9062ed7e4a3 100644 --- a/code/modules/events/anomaly.dm +++ b/code/modules/events/anomaly.dm @@ -7,6 +7,7 @@ /datum/round_event/anomaly var/area/impact_area var/obj/effect/anomaly/newAnomaly + announceWhen = 1 /datum/round_event/anomaly/setup(loop=0) diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index 368172ebecd..c678bdab8dc 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -9,9 +9,13 @@ /datum/round_event/blob announceWhen = 12 endWhen = 120 - + var/new_rate = 2 var/obj/effect/blob/core/Blob +/datum/round_event/blob/New(var/strength) + ..() + if(strength) + new_rate = strength /datum/round_event/blob/announce() priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg') @@ -21,7 +25,7 @@ var/turf/T = pick(blobstart) if(!T) return kill() - Blob = new /obj/effect/blob/core(T, 200) + Blob = new /obj/effect/blob/core(T, 200, null, new_rate) for(var/i = 1; i < rand(3, 6), i++) Blob.process() diff --git a/code/modules/events/communications_blackout.dm b/code/modules/events/communications_blackout.dm index 353b92a78b8..cb55bbbd248 100644 --- a/code/modules/events/communications_blackout.dm +++ b/code/modules/events/communications_blackout.dm @@ -3,6 +3,9 @@ typepath = /datum/round_event/communications_blackout weight = 30 +/datum/round_event/communications_blackout + announceWhen = 1 + /datum/round_event/communications_blackout/announce() var/alert = pick( "Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you*%fj00)`5vc-BZZT", \ "Ionospheric anomalies detected. Temporary telecommunication failu*3mga;b4;'1v¬-BZZZT", \ diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm index d24b6cab401..5c5bdfb596a 100644 --- a/code/modules/events/dust.dm +++ b/code/modules/events/dust.dm @@ -8,6 +8,7 @@ /datum/round_event/meteor_wave/dust startWhen = 1 endWhen = 2 + announceWhen = 0 /datum/round_event/meteor_wave/dust/announce() return diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index 51fa161ef23..4ccd64f5cd9 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -7,7 +7,7 @@ /datum/round_event/electrical_storm var/lightsoutAmount = 1 var/lightsoutRange = 25 - + announceWhen = 1 /datum/round_event/electrical_storm/announce() priority_announce("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm Alert") diff --git a/code/modules/events/event.dm b/code/modules/events/event.dm index 8b90cb13085..20ec857ef56 100644 --- a/code/modules/events/event.dm +++ b/code/modules/events/event.dm @@ -26,12 +26,14 @@ testing("[time2text(world.time, "hh:mm:ss")] [E.type]") + return E + /datum/round_event //NOTE: Times are measured in master controller ticks! var/processing = 1 var/datum/round_event_control/control var/startWhen = 0 //When in the lifetime to call start(). - var/announceWhen = 0 //When in the lifetime to call announce(). + var/announceWhen = 0 //When in the lifetime to call announce(). Set an event's announceWhen to >0 if there is an announcement. var/endWhen = 0 //When in the lifetime the event should end. var/activeFor = 0 //How long the event has existed. You don't need to change this. @@ -81,7 +83,7 @@ /datum/round_event/proc/process() if(!processing) return - + if(activeFor == startWhen) start() diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm index b41e08d2d0c..0174bda76b3 100644 --- a/code/modules/events/event_manager.dm +++ b/code/modules/events/event_manager.dm @@ -109,17 +109,25 @@ var/datum/controller/event/events -//allows a client to trigger an event (For Debugging Purposes) -/client/proc/forceEvent(var/datum/round_event_control/E in events.control) - set name = "Trigger Event (Debug Only)" - set category = "Debug" +//allows a client to trigger an event +//aka Badmin Central +/client/proc/forceEvent() + set name = "Trigger Event" + set category = "Fun" - if(!holder) + if(!holder ||!check_rights(R_FUN)) return - if(istype(E)) - E.runEvent() - message_admins("[key_name_admin(usr)] has triggered an event. ([E.name])", 1) + holder.forceEvent() + +/datum/admins/proc/forceEvent() + var/dat = "" + for(var/datum/round_event_control/E in events.control) + dat += "
    [E]" + + var/datum/browser/popup = new(usr, "forceevent", "Force Random Event", 300, 750) + popup.set_content(dat) + popup.open() /* diff --git a/code/modules/events/false_alarm.dm b/code/modules/events/false_alarm.dm index 2fb4b050b48..49deb57c137 100644 --- a/code/modules/events/false_alarm.dm +++ b/code/modules/events/false_alarm.dm @@ -9,8 +9,13 @@ endWhen = 1 /datum/round_event/falsealarm/announce() - var/datum/round_event_control/E = pick(events.control) - var/datum/round_event/Event = new E.typepath() + var/list/events_list + for(var/datum/round_event_control/E in events.control) + if(!E.holidayID) //No holiday cheer allowed during non-holidays. Not even fake holiday cheer. + events_list += E //No holiday cheer allowed during non-holidays. Not even fake holiday cheer. + var/datum/round_event_control/event_control = pick(events_list) + if(event_control) + var/datum/round_event/Event = new event_control.typepath() message_admins("False Alarm: [Event]") Event.kill() //do not process this event - no starts, no ticks, no ends Event.announce() //just announce it like it's happening \ No newline at end of file diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index 9a7945d7719..ad6a82e04df 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -1,5 +1,5 @@ /datum/round_event_control/spooky - name = "2 SPOOKY!" + name = "2 SPOOKY! (Halloween)" holidayID = "Halloween" typepath = /datum/round_event/spooky weight = -1 //forces it to be called, regardless of weight @@ -14,4 +14,4 @@ Ian.place_on_head(new /obj/item/weapon/bedsheet(Ian)) /datum/round_event/spooky/announce() - priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE") + priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE") diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index d7021e0e12d..3c93432b541 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -1,5 +1,5 @@ /datum/round_event_control/treevenge - name = "Treevenge" + name = "Treevenge (Christmas)" holidayID = "Xmas" typepath = /datum/round_event/treevenge max_occurrences = 1 @@ -16,7 +16,7 @@ //this is an example of a possible round-start event /datum/round_event_control/presents - name = "Presents under Trees" + name = "Presents under Trees (Christmas)" holidayID = "Xmas" typepath = /datum/round_event/presents weight = -1 //forces it to be called, regardless of weight diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index ae4e07094ed..090c7ac85ba 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -11,6 +11,7 @@ var/announceEvent = ION_RANDOM // -1 means don't announce, 0 means have it randomly announce, 1 means var/ionMessage = null var/ionAnnounceChance = 33 + announceWhen = 1 /datum/round_event/ion_storm/New(var/botEmagChance = 10, var/announceEvent = ION_RANDOM, var/ionMessage = null, var/ionAnnounceChance = 33) src.botEmagChance = botEmagChance @@ -32,7 +33,7 @@ if(message) M.add_ion_law(message) M << "
    " - M << "\red [message] ...LAWS UPDATED" + M << "[message] ...LAWS UPDATED" M << "
    " if(botEmagChance) diff --git a/code/modules/events/meateor_wave.dm b/code/modules/events/meateor_wave.dm index d66ef27596f..b45140ad5ee 100644 --- a/code/modules/events/meateor_wave.dm +++ b/code/modules/events/meateor_wave.dm @@ -5,8 +5,7 @@ max_occurrences = 1 /datum/round_event/meteor_wave/meaty/announce() - if(announce) - priority_announce("Meaty ores have been detected on collision course with the station.", "Oh Crap, Get The Mop.",'sound/AI/meteors.ogg') + priority_announce("Meaty ores have been detected on collision course with the station.", "Oh Crap, Get The Mop.",'sound/AI/meteors.ogg') /datum/round_event/meteor_wave/meaty/tick() if(IsMultiple(activeFor, 3)) diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index 2063f369194..6effd5fc41f 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -7,15 +7,10 @@ /datum/round_event/meteor_wave startWhen = 6 endWhen = 66 - var/announce = 1 - -/datum/round_event/meteor_wave/New(should_announce = 1) - ..() - announce = should_announce + announceWhen = 1 /datum/round_event/meteor_wave/announce() - if(announce) - priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/AI/meteors.ogg') + priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/AI/meteors.ogg') /datum/round_event/meteor_wave/tick() diff --git a/code/modules/events/ninja.dm b/code/modules/events/ninja.dm index 06c821888bc..6e25cb211f5 100644 --- a/code/modules/events/ninja.dm +++ b/code/modules/events/ninja.dm @@ -5,6 +5,7 @@ name = "Space Ninja" typepath = /datum/round_event/ninja max_occurrences = 1 + earliest_start = 30000 // 1 hour /datum/round_event/ninja var/success_spawn = 0 @@ -336,7 +337,7 @@ ________________________________________________________________________________ E.key=C.key E.mission=mission - message_admins("\blue [key_name_admin(key)] has spawned [key_name_admin(C.key)] as a Space Ninja.") + message_admins("[key_name_admin(key)] has spawned [key_name_admin(C.key)] as a Space Ninja.") log_admin("[key] used Spawn Space Ninja.") return @@ -408,13 +409,13 @@ ________________________________________________________________________________ U.gib() return 0 if(!istype(U:head, /obj/item/clothing/head/helmet/space/space_ninja)) - U << "\red ERROR: 100113 \black UNABLE TO LOCATE HEAD GEAR\nABORTING..." + U << "ERROR: 100113 \black UNABLE TO LOCATE HEAD GEAR\nABORTING..." return 0 if(!istype(U:shoes, /obj/item/clothing/shoes/space_ninja)) - U << "\red ERROR: 122011 \black UNABLE TO LOCATE FOOT GEAR\nABORTING..." + U << "ERROR: 122011 \black UNABLE TO LOCATE FOOT GEAR\nABORTING..." return 0 if(!istype(U:gloves, /obj/item/clothing/gloves/space_ninja)) - U << "\red ERROR: 110223 \black UNABLE TO LOCATE HAND GEAR\nABORTING..." + U << "ERROR: 110223 \black UNABLE TO LOCATE HAND GEAR\nABORTING..." return 0 affecting = U @@ -549,7 +550,7 @@ ________________________________________________________________________________ cancel_stealth() U << browse(null, "window=spideros") - U << "\red Do or Die, LET'S ROCK!!" + U << "Do or Die, LET'S ROCK!!" /obj/item/clothing/suit/space/space_ninja/proc/remove_kamikaze(mob/living/carbon/U) if(kamikaze) @@ -570,7 +571,7 @@ ________________________________________________________________________________ U.incorporeal_move = 0 kamikaze = 0 k_unlock = 0 - U << "\blue Disengaging mode...\n\blackCODE NAME: \red KAMIKAZE" + U << "Disengaging mode...\n\blackCODE NAME: KAMIKAZE" //=======//AI VERBS//=======// @@ -926,21 +927,21 @@ s_cooldown ticks off each second based on the suit recharge proc, in seconds. De /obj/item/clothing/suit/space/space_ninja/proc/ninjacost(C = 0,X = 0) var/mob/living/carbon/human/U = affecting if( (U.stat||U.incorporeal_move)&&X!=3 )//Will not return if user is using an adrenaline booster since you can use them when stat==1. - U << "\red You must be conscious and solid to do this."//It's not a problem of stat==2 since the ninja will explode anyway if they die. + U << "You must be conscious and solid to do this."//It's not a problem of stat==2 since the ninja will explode anyway if they die. return 1 else if(C&&cell.chargeNot enough energy." return 1 switch(X) if(1) cancel_stealth()//Get rid of it. if(2) if(s_bombs<=0) - U << "\red There are no more smoke bombs remaining." + U << "There are no more smoke bombs remaining." return 1 if(3) if(a_boost<=0) - U << "\red You do not have any more adrenaline boosters." + U << "You do not have any more adrenaline boosters." return 1 return (s_coold)//Returns the value of the variable which counts down to zero. @@ -965,7 +966,7 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo if(!ninjacost(,2)) var/mob/living/carbon/human/U = affecting - U << "\blue There are [s_bombs] smoke bombs remaining." + U << "There are [s_bombs] smoke bombs remaining." var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread() smoke.set_up(10, 0, U.loc) smoke.start() @@ -1002,11 +1003,11 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir) spawn(0) - destination.kill_creatures(U)//Any living mobs in teleport area are gibbed. Check turf procs for how it does it. + destination.phase_damage_creatures(20,U)//Paralyse and damage mobs and mechas on the turf s_coold = 1 cell.charge-=(C*10) else - U << "\red The VOID-shift device is malfunctioning, teleportation failed." + U << "The VOID-shift device is malfunctioning, teleportation failed." return //=======//RIGHT CLICK TELEPORT//=======// @@ -1036,11 +1037,11 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir) spawn(0)//Any living mobs in teleport area are gibbed. - T.kill_creatures(U) + T.phase_damage_creatures(20,U)//Paralyse and damage mobs and mechas on the turf s_coold = 1 cell.charge-=(C*10) else - U << "\red You cannot teleport into solid walls or from solid matter" + U << "You cannot teleport into solid walls or from solid matter" return //=======//EM PULSE//=======// @@ -1079,7 +1080,7 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo U.put_in_hands(W) cell.charge-=(C*10) else - U << "\red You can only summon one blade. Try dropping an item first." + U << "You can only summon one blade. Try dropping an item first." else//Else you can run around with TWO energy blades. I don't know why you'd want to but cool factor remains. if(!U.get_active_hand()) var/obj/item/weapon/melee/energy/blade/W = new() @@ -1124,7 +1125,7 @@ This could be a lot better but I'm too tired atm.*/ cell.charge-=(C*10) A.process() else - U << "\red There are no targets in view." + U << "There are no targets in view." return //=======//ENERGY NET//=======// @@ -1153,7 +1154,7 @@ Must right click on a mob to activate.*/ var/obj/effect/energy_net/E = new /obj/effect/energy_net(M.loc) E.layer = M.layer+1//To have it appear one layer above the mob. for(var/mob/O in viewers(U, 3)) - O.show_message(text("\red [] caught [] with an energy net!", U, M), 1) + O.show_message(text("[] caught [] with an energy net!", U, M), 1) E.affecting = M E.master = U spawn(0)//Parallel processing. @@ -1193,7 +1194,7 @@ Movement impairing would indicate drugs and the like.*/ spawn(70) reagents.reaction(U, 2) reagents.trans_id_to(U, "radium", a_transfer) - U << "\red You are beginning to feel the after-effect of the injection." + U << "You are beginning to feel the after-effect of the injection." a_boost-- s_coold = 3 return @@ -1216,17 +1217,17 @@ Or otherwise known as anime mode. Which also happens to be ridiculously powerful var/mob/living/carbon/human/U = affecting if(!U.incorporeal_move) U.incorporeal_move = 2 - U << "\blue You will now phase through solid matter." + U << "You will now phase through solid matter." else U.incorporeal_move = 0 - U << "\blue You will no-longer phase through solid matter." + U << "You will no-longer phase through solid matter." return //=======//5 TILE TELEPORT/GIB//=======// -//Allows to gib up to five squares in a straight line. Seriously. +//Allows to kill up to five squares in a straight line. Seriously. /obj/item/clothing/suit/space/space_ninja/proc/ninjaslayer() set name = "Phase Slayer" - set desc = "Utilizes the internal VOID-shift device to mutilate creatures in a straight line." + set desc = "Utilizes the internal VOID-shift device to kill all creatures in a straight line." set category = "Ninja Ability" set popup_menu = 0 @@ -1243,7 +1244,7 @@ Or otherwise known as anime mode. Which also happens to be ridiculously powerful spawn(0) for(var/turf/T in getline(mobloc, destination)) spawn(0) - T.kill_creatures(U) + T.phase_damage_creatures(190,U) if(T==mobloc||T==destination) continue spawn(0) anim(T,U,'icons/mob/mob.dmi',,"phasein",,U.dir) @@ -1258,7 +1259,7 @@ Or otherwise known as anime mode. Which also happens to be ridiculously powerful anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir) s_coold = 1 else - U << "\red The VOID-shift device is malfunctioning, teleportation failed." + U << "The VOID-shift device is malfunctioning, teleportation failed." return //=======//TELEPORT BEHIND MOB//=======// @@ -1332,9 +1333,9 @@ This is so anime it hurts. But that's the point.*/ anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir) s_coold = 1 else - U << "\red The VOID-shift device is malfunctioning, teleportation failed." + U << "The VOID-shift device is malfunctioning, teleportation failed." else - U << "\red There are no targets in view." + U << "There are no targets in view." return @@ -1397,7 +1398,7 @@ ________________________________________________________________________________ /obj/item/clothing/suit/space/space_ninja/proc/killai(mob/living/silicon/ai/A = AI) if(A.client) - A << "\red Self-erase protocol dete-- *bzzzzz*" + A << "Self-erase protocol dete-- *bzzzzz*" A << browse(null, "window=hack spideros") AI = null A.death(1)//Kill, deleting mob. @@ -1423,7 +1424,7 @@ ________________________________________________________________________________ if(s_control&&!s_busy) deinitialize() else - affecting << "\red The function did not trigger!" + affecting << "The function did not trigger!" return /obj/item/clothing/suit/space/space_ninja/proc/spideros() @@ -1434,7 +1435,7 @@ ________________________________________________________________________________ if(s_control&&!s_busy&&!kamikaze) display_spideros() else - affecting << "\red The interface is locked!" + affecting << "The interface is locked!" return /obj/item/clothing/suit/space/space_ninja/proc/stealth() @@ -1445,7 +1446,7 @@ ________________________________________________________________________________ if(s_control&&!s_busy) toggle_stealth() else - affecting << "\red Stealth does not appear to work!" + affecting << "Stealth does not appear to work!" return //=======//PROCESS PROCS//=======// @@ -1495,27 +1496,27 @@ ________________________________________________________________________________ for(var/i,i<7,i++) switch(i) if(0) - U << "\blue Now initializing..." + U << "Now initializing..." if(1) if(!lock_suit(U))//To lock the suit onto wearer. break - U << "\blue Securing external locking mechanism...\nNeural-net established." + U << "Securing external locking mechanism...\nNeural-net established." if(2) - U << "\blue Extending neural-net interface...\nNow monitoring brain wave pattern..." + U << "Extending neural-net interface...\nNow monitoring brain wave pattern..." if(3) if(U.stat==2||U.health<=0) - U << "\red FĆAL �Rr�R: 344--93#�&&21 BR��N |/|/aV� PATT$RN RED\nA-A-aB�rT�NG..." + U << "FĆAL �Rr�R: 344--93#�&&21 BR��N |/|/aV� PATT$RN RED\nA-A-aB�rT�NG..." unlock_suit() break lock_suit(U,1)//Check for icons. U.regenerate_icons() - U << "\blue Linking neural-net interface...\nPattern \green GREEN\blue, continuing operation." + U << " Linking neural-net interface...\nPattern\green GREEN, continuing operation." if(4) - U << "\blue VOID-shift device status: ONLINE.\nCLOAK-tech device status: ONLINE." + U << "VOID-shift device status: ONLINE.\nCLOAK-tech device status: ONLINE." if(5) - U << "\blue Primary system status: ONLINE.\nBackup system status: ONLINE.\nCurrent energy capacity: [cell.charge]." + U << "Primary system status: ONLINE.\nBackup system status: ONLINE.\nCurrent energy capacity: [cell.charge]." if(6) - U << "\blue All systems operational. Welcome to SpiderOS, [U.real_name]." + U << "All systems operational. Welcome to SpiderOS, [U.real_name]." grant_ninja_verbs() grant_equip_verbs() ntick() @@ -1525,9 +1526,9 @@ ________________________________________________________________________________ if(!U.mind||U.mind.assigned_role!="MODE")//Your run of the mill persons shouldn't know what it is. Or how to turn it on. U << "You do not understand how this suit functions. Where the heck did it even come from?" else if(s_initialized) - U << "\red The suit is already functioning. \black Please report this bug." + U << "The suit is already functioning. \black Please report this bug." else - U << "\red ERROR: \black You cannot use this function at this time." + U << "ERROR: \black You cannot use this function at this time." return //=======//DEINITIALIZE//=======// @@ -1536,34 +1537,34 @@ ________________________________________________________________________________ if(affecting==loc&&!s_busy) var/mob/living/carbon/human/U = affecting if(!s_initialized) - U << "\red The suit is not initialized. \black Please report this bug." + U << "The suit is not initialized. \black Please report this bug." return if(alert("Are you certain you wish to remove the suit? This will take time and remove all abilities.",,"Yes","No")=="No") return if(s_busy||flush) - U << "\red ERROR: \black You cannot use this function at this time." + U << "ERROR: \black You cannot use this function at this time." return s_busy = 1 for(var/i = 0,i<7,i++) switch(i) if(0) - U << "\blue Now de-initializing..." + U << "Now de-initializing..." remove_kamikaze(U)//Shutdowns kamikaze. spideros = 0//Spideros resets. if(1) - U << "\blue Logging off, [U:real_name]. Shutting down SpiderOS." + U << "Logging off, [U:real_name]. Shutting down SpiderOS." remove_ninja_verbs() if(2) - U << "\blue Primary system status: OFFLINE.\nBackup system status: OFFLINE." + U << "Primary system status: OFFLINE.\nBackup system status: OFFLINE." if(3) - U << "\blue VOID-shift device status: OFFLINE.\nCLOAK-tech device status: OFFLINE." + U << "VOID-shift device status: OFFLINE.\nCLOAK-tech device status: OFFLINE." cancel_stealth()//Shutdowns stealth. if(4) - U << "\blue Disconnecting neural-net interface...\greenSuccess\blue." + U << "Disconnecting neural-net interface...\greenSuccess." if(5) - U << "\blue Disengaging neural-net interface...\greenSuccess\blue." + U << "Disengaging neural-net interface...\greenSuccess." if(6) - U << "\blue Unsecuring external locking mechanism...\nNeural-net abolished.\nOperation status: FINISHED." + U << "Unsecuring external locking mechanism...\nNeural-net abolished.\nOperation status: FINISHED." blade_check(U,2) remove_equip_verbs() unlock_suit() @@ -1823,7 +1824,7 @@ ________________________________________________________________________________ if(s_control) if(!affecting||U.stat||!s_initialized)//Check to make sure the guy is wearing the suit after clicking and it's on. - U << "\red Your suit must be worn and active to use this function." + U << "Your suit must be worn and active to use this function." U << browse(null, "window=spideros")//Closes the window. return @@ -1835,7 +1836,7 @@ ________________________________________________________________________________ U << "Anonymous Messenger blinks." else if(!affecting||A.stat||!s_initialized||A.loc!=src) - A << "\red This function is not available at this time." + A << "This function is not available at this time." A << browse(null, "window=spideros")//Closes the window. return @@ -1857,7 +1858,7 @@ ________________________________________________________________________________ U.electrocute_act(damage, src,0.1,1)//The last argument is a safety for the human proc that checks for gloves. cell.charge -= damage else - A << "\red ERROR: \black Not enough energy remaining." + A << "ERROR: \black Not enough energy remaining." if("Message") var/obj/item/device/pda/P = locate(href_list["target"]) @@ -1867,7 +1868,7 @@ ________________________________________________________________________________ display_to << browse(null, "window=spideros") return if(isnull(P)||P.toff)//So it doesn't freak out if the object no-longer exists. - display_to << "\red Error: unable to deliver message." + display_to << "Error: unable to deliver message." display_spideros() return P.tnote += "← From [!s_control?(A):"an unknown source"]:
    [t]
    " @@ -1880,7 +1881,7 @@ ________________________________________________________________________________ if("Inject") if( (href_list["tag"]=="radium"? (reagents.get_reagent_amount("radium"))<=(a_boost*a_transfer) : !reagents.get_reagent_amount(href_list["tag"])) )//Special case for radium. If there are only a_boost*a_transfer radium units left. - display_to << "\red Error: the suit cannot perform this function. Out of [href_list["name"]]." + display_to << "Error: the suit cannot perform this function. Out of [href_list["name"]]." else reagents.reaction(U, 2) reagents.trans_id_to(U, href_list["tag"], href_list["tag"]=="nutriment"?5:a_transfer)//Nutriment is a special case since it's very potent. Shouldn't influence actual refill amounts or anything. @@ -1919,27 +1920,27 @@ ________________________________________________________________________________ for(var/i, i<4, i++) switch(i) if(0) - U << "\blue Engaging mode...\n\blackCODE NAME: \red KAMIKAZE" + U << "Engaging mode...\n\blackCODE NAME: KAMIKAZE" if(1) - U << "\blue Re-routing power nodes... \nUnlocking limiter..." + U << "Re-routing power nodes... \nUnlocking limiter..." if(2) - U << "\blue Power nodes re-routed. \nLimiter unlocked." + U << "Power nodes re-routed. \nLimiter unlocked." if(3) grant_kamikaze(U)//Give them verbs and change variables as necessary. U.regenerate_icons()//Update their clothing. ninjablade()//Summon two energy blades. - message_admins("\blue [key_name_admin(U)] used KAMIKAZE mode.")//Let the admins know. + message_admins("[key_name_admin(U)] used KAMIKAZE mode.")//Let the admins know. s_busy = 0 return sleep(s_delay) else - U << "\red ERROR: \black Unable to initiate mode." + U << "ERROR: \black Unable to initiate mode." else U << browse(null, "window=spideros") s_busy = 0 return else - U << "\red ERROR: WRONG PASSWORD!" + U << "ERROR: WRONG PASSWORD!" k_unlock = 0 spideros = 0 s_busy = 0 @@ -1955,7 +1956,7 @@ ________________________________________________________________________________ t_disk.loc = T t_disk = null else - U << "\red ERROR: \black Could not eject disk." + U << "ERROR: \black Could not eject disk." if("Copy to Disk") var/datum/tech/current_data = locate(href_list["target"]) @@ -1976,14 +1977,14 @@ ________________________________________________________________________________ pai.loc = T pai = null else - U << "\red ERROR: \black Could not eject pAI card." + U << "ERROR: \black Could not eject pAI card." if("Override AI Laws") var/law_zero = A.laws.zeroth//Remembers law zero, if there is one. A.laws = new /datum/ai_laws/ninja_override A.set_zeroth_law(law_zero)//Adds back law zero if there was one. A.show_laws() - U << "\blue Law Override: SUCCESS." + U << "Law Override: SUCCESS." if("Purge AI") var/confirm = alert("Are you sure you want to purge the AI? This cannot be undone once started.", "Confirm purge", "Yes", "No") @@ -1997,31 +1998,31 @@ ________________________________________________________________________________ if(AI==A) switch(i) if(0) - A << "\red WARNING: \black purge procedure detected. \nNow hacking host..." - U << "\red WARNING: HACKING AT��TEMP� IN PR0GRESs!" + A << "WARNING: \black purge procedure detected. \nNow hacking host..." + U << "WARNING: HACKING AT��TEMP� IN PR0GRESs!" spideros = 0 k_unlock = 0 U << browse(null, "window=spideros") if(1) A << "Disconnecting neural interface..." - U << "\red WAR�NING: �R�O0�Gr�--S 2&3%" + U << "WAR�NING: �R�O0�Gr�--S 2&3%" if(2) A << "Shutting down external protocol..." - U << "\red WARNING: P����RֆGr�5S 677^%" + U << "WARNING: P����RֆGr�5S 677^%" cancel_stealth() if(3) A << "Connecting to kernel..." - U << "\red WARNING: �R�r�R_404" + U << "WARNING: �R�r�R_404" A.control_disabled = 0 if(4) A << "Connection established and secured. Menu updated." - U << "\red W�r#nING: #%@!!WȆ|_4�54@ \nUn�B88l3 T� L�-�o-L�CaT2 ##$!�RN�0..%.." + U << "W�r#nING: #%@!!WȆ|_4�54@ \nUn�B88l3 T� L�-�o-L�CaT2 ##$!�RN�0..%.." grant_AI_verbs() return sleep(s_delay) else break s_busy = 0 - U << "\blue Hacking attempt disconnected. Resuming normal operation." + U << "Hacking attempt disconnected. Resuming normal operation." else flush = 1 A.suiciding = 1 @@ -2069,9 +2070,9 @@ ________________________________________________________________________________ ai_holo_process()//Move to initialize else - AI << "\red ERROR: \black Image feed in progress." + AI << "ERROR: \black Image feed in progress." else - AI << "\red ERROR: \black Unable to project image." + AI << "ERROR: \black Unable to project image." return /obj/item/clothing/suit/space/space_ninja/proc/ai_holo_process() @@ -2136,13 +2137,13 @@ ________________________________________________________________________________ if(s_control) I:transfer_ai("NINJASUIT","AICARD",src,U) else - U << "\red ERROR: \black Remote access channel disabled." + U << "ERROR: \black Remote access channel disabled." return//Return individually so that ..() can run properly at the end of the proc. else if(istype(I, /obj/item/device/paicard) && !pai)//If it's a pai card. U:drop_item() I.loc = src pai = I - U << "\blue You slot \the [I] into \the [src]." + U << "You slot \the [I] into \the [src]." updateUsrDialog() return else if(istype(I, /obj/item/weapon/reagent_containers/glass))//If it's a glass beaker. @@ -2162,7 +2163,7 @@ ________________________________________________________________________________ return else if(istype(I, /obj/item/weapon/stock_parts/cell)) if(I:maxcharge>cell.maxcharge&&n_gloves&&n_gloves.candrain) - U << "\blue Higher maximum capacity detected.\nUpgrading..." + U << "Higher maximum capacity detected.\nUpgrading..." if (n_gloves&&n_gloves.candrain&&do_after(U,s_delay)) U.drop_item() I.loc = src @@ -2174,9 +2175,9 @@ ________________________________________________________________________________ old_cell.corrupt() old_cell.updateicon() cell = I - U << "\blue Upgrade complete. Maximum capacity: [round(cell.maxcharge/100)]%" + U << "Upgrade complete. Maximum capacity: [round(cell.maxcharge/100)]%" else - U << "\red Procedure interrupted. Protocol terminated." + U << "Procedure interrupted. Protocol terminated." return else if(istype(I, /obj/item/weapon/disk/tech_disk))//If it's a data disk, we want to copy the research on to the suit. var/obj/item/weapon/disk/tech_disk/TD = I @@ -2189,13 +2190,13 @@ ________________________________________________________________________________ current_data.level=TD.stored.level break TD.stored = null - U << "\blue Data analyzed and updated. Disk erased." + U << "Data analyzed and updated. Disk erased." else - U << "\red ERROR: \black Procedure interrupted. Process terminated." + U << "ERROR: \black Procedure interrupted. Process terminated." else I.loc = src t_disk = I - U << "\blue You slot \the [I] into \the [src]." + U << "You slot \the [I] into \the [src]." return ..() @@ -2208,7 +2209,7 @@ ________________________________________________________________________________ anim(U.loc,U,'icons/mob/mob.dmi',,"cloak",,U.dir) s_active=!s_active U.alpha = 0 - U << "\blue You are now invisible to normal detection." + U << "You are now invisible to normal detection." for(var/mob/O in oviewers(U)) O.show_message("[U.name] vanishes into thin air!",1) return @@ -2220,7 +2221,7 @@ ________________________________________________________________________________ anim(U.loc,U,'icons/mob/mob.dmi',,"uncloak",,U.dir) s_active=!s_active U.alpha = 255 - U << "\blue You are now visible." + U << "You are now visible." for(var/mob/O in oviewers(U)) O.show_message("[U.name] appears from thin air!",1) return 1 @@ -2256,7 +2257,7 @@ ________________________________________________________________________________ if(!kamikaze) U << "The CLOAK-tech device is [s_active?"active":"inactive"]." else - U << "\red KAMIKAZE MODE ENGAGED!" + U << "KAMIKAZE MODE ENGAGED!" U << "There are [s_bombs] smoke bombs remaining." U << "There are [a_boost] adrenaline boosters remaining." else @@ -2283,7 +2284,7 @@ ________________________________________________________________________________ G.draining = 1 if(target_type!="RESEARCH")//I lumped research downloading here for ease of use. - U << "\blue Now charging battery..." + U << "Now charging battery..." switch(target_type) @@ -2306,14 +2307,14 @@ ________________________________________________________________________________ S.cell.charge+=drain totaldrain+=drain else break - U << "\blue Gained [totaldrain] energy from the APC." + U << "Gained [totaldrain] energy from the APC." if(!A.emagged) flick("apc-spark", src) A.emagged = 1 A.locked = 0 A.update_icon() else - U << "\red This APC has run dry of power. You must find another source." + U << "This APC has run dry of power. You must find another source." if("SMES") var/obj/machinery/power/smes/A = target @@ -2334,15 +2335,15 @@ ________________________________________________________________________________ S.cell.charge+=drain totaldrain+=drain else break - U << "\blue Gained [totaldrain] energy from the SMES cell." + U << "Gained [totaldrain] energy from the SMES cell." else - U << "\red This SMES cell has run dry of power. You must find another source." + U << "This SMES cell has run dry of power. You must find another source." if("CELL") var/obj/item/weapon/stock_parts/cell/A = target if(A.charge) if (G.candrain&&do_after(U,30)) - U << "\blue Gained [A.charge] energy from the cell." + U << "Gained [A.charge] energy from the cell." if(S.cell.charge+A.charge>S.cell.maxcharge) S.cell.charge=S.cell.maxcharge else @@ -2352,9 +2353,9 @@ ________________________________________________________________________________ A.corrupt() A.updateicon() else - U << "\red Procedure interrupted. Protocol terminated." + U << "Procedure interrupted. Protocol terminated." else - U << "\red This cell is empty and of no use." + U << "This cell is empty and of no use." if("MACHINERY")//Can be applied to generically to all powered machinery. I'm leaving this alone for now. var/obj/machinery/A = target @@ -2389,31 +2390,31 @@ ________________________________________________________________________________ totaldrain += drained spark_system.start() if(drained==0) break - U << "\blue Gained [totaldrain] energy from the power network." + U << "Gained [totaldrain] energy from the power network." else - U << "\red Power network could not be found. Aborting." + U << "Power network could not be found. Aborting." else - U << "\red This recharger is not providing energy. You must find another source." + U << "This recharger is not providing energy. You must find another source." if("RESEARCH") var/obj/machinery/A = target - U << "\blue Hacking \the [A]..." + U << "Hacking \the [A]..." spawn(0) var/turf/location = get_turf(U) for(var/mob/living/silicon/ai/AI in player_list) - AI << "\red Network Alert: Hacking attempt detected[location?" in [location]":". Unable to pinpoint location"]." + AI << "Network Alert: Hacking attempt detected[location?" in [location]":". Unable to pinpoint location"]." if(A:files&&A:files.known_tech.len) for(var/datum/tech/current_data in S.stored_research) - U << "\blue Checking \the [current_data.name] database." + U << "Checking \the [current_data.name] database." if(do_after(U, S.s_delay)&&G.candrain&&!isnull(A)) for(var/datum/tech/analyzing_data in A:files.known_tech) if(current_data.id==analyzing_data.id) if(analyzing_data.level>current_data.level) - U << "\blue Database: \black UPDATED." + U << "Database: \black UPDATED." current_data.level = analyzing_data.level break//Move on to next. else break//Otherwise, quit processing. - U << "\blue Data analyzed. Process finished." + U << "Data analyzed. Process finished." if("WIRE") var/obj/structure/cable/A = target @@ -2441,11 +2442,11 @@ ________________________________________________________________________________ totaldrain += drained S.spark_system.start() if(drained==0) break - U << "\blue Gained [totaldrain] energy from the power network." + U << "Gained [totaldrain] energy from the power network." if("MECHA") var/obj/mecha/A = target - A.occupant_message("\red Warning: Unauthorized access through sub-route 4, block H, detected.") + A.occupant_message("Warning: Unauthorized access through sub-route 4, block H, detected.") if(A.get_charge()) while(G.candrain&&A.cell.charge>0&&!maxcapacity) drain = rand(G.mindrain,G.maxdrain) @@ -2461,13 +2462,13 @@ ________________________________________________________________________________ S.cell.charge+=drain totaldrain+=drain else break - U << "\blue Gained [totaldrain] energy from [src]." + U << "Gained [totaldrain] energy from [src]." else - U << "\red The exosuit's battery has run dry. You must find another source of power." + U << "The exosuit's battery has run dry. You must find another source of power." if("CYBORG") var/mob/living/silicon/robot/A = target - A << "\red Warning: Unauthorized access through sub-route 12, block C, detected." + A << "Warning: Unauthorized access through sub-route 12, block C, detected." G.draining = 1 if(A.cell&&A.cell.charge) while(G.candrain&&A.cell.charge>0&&!maxcapacity) @@ -2484,9 +2485,9 @@ ________________________________________________________________________________ S.cell.charge+=drain totaldrain+=drain else break - U << "\blue Gained [totaldrain] energy from [A]." + U << "Gained [totaldrain] energy from [A]." else - U << "\red Their battery has run dry of power. You must find another source." + U << "Their battery has run dry of power. You must find another source." else//Else nothing :< @@ -2663,7 +2664,7 @@ It is possible to destroy the net by the occupant or someone else. for(var/mob/O in viewers(src, 3)) O.show_message(text("[] was recovered from the energy net!", M.name), 1, text("You hear a grunt."), 2) if(!isnull(master))//As long as they still exist. - master << "\red ERROR: \black unable to initiate transport protocol. Procedure terminated." + master << "ERROR: \black unable to initiate transport protocol. Procedure terminated." qdel(src) return @@ -2677,7 +2678,7 @@ It is possible to destroy the net by the occupant or someone else. if(isnull(M)||M.loc!=loc)//If mob is gone or not at the location. if(!isnull(master))//As long as they still exist. - master << "\red ERROR: \black unable to locate \the [mob_name]. Procedure terminated." + master << "ERROR: \black unable to locate \the [mob_name]. Procedure terminated." qdel(src)//Get rid of the net. return @@ -2698,7 +2699,7 @@ It is possible to destroy the net by the occupant or someone else. anim(M.loc,M,'icons/mob/mob.dmi',,"phaseout",,M.dir) M.loc = pick(holdingfacility)//Throw mob in to the holding facility. - M << "\red You appear in a strange place!" + M << "You appear in a strange place!" spawn(0) var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() @@ -2713,12 +2714,12 @@ It is possible to destroy the net by the occupant or someone else. O.show_message(text("[] vanished!", M), 1, text("You hear sparks flying!"), 2) if(!isnull(master))//As long as they still exist. - master << "\blue SUCCESS: \black transport procedure of \the [affecting] complete." + master << "SUCCESS: \black transport procedure of \the [affecting] complete." M.anchored = 0//Important. else//And they are free. - M << "\blue You are free of the net!" + M << "You are free of the net!" return bullet_act(var/obj/item/projectile/Proj) @@ -2745,7 +2746,7 @@ It is possible to destroy the net by the occupant or someone else. hitby(AM as mob|obj) ..() for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [src] was hit by [AM]."), 1) + O.show_message(text("[src] was hit by [AM]."), 1) var/tforce = 0 if(ismob(AM)) tforce = 10 @@ -2759,9 +2760,9 @@ It is possible to destroy the net by the occupant or someone else. attack_hand() if (HULK in usr.mutations) - usr << text("\blue You easily destroy the energy net.") + usr << text("You easily destroy the energy net.") for(var/mob/O in oviewers(src)) - O.show_message(text("\red [] rips the energy net apart!", usr), 1) + O.show_message(text("[] rips the energy net apart!", usr), 1) health-=50 healthcheck() return @@ -2774,13 +2775,13 @@ It is possible to destroy the net by the occupant or someone else. return usr << text("\green You claw at the net.") for(var/mob/O in oviewers(src)) - O.show_message(text("\red [] claws at the energy net!", usr), 1) + O.show_message(text("[] claws at the energy net!", usr), 1) playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1) health -= rand(10, 20) if(health <= 0) usr << text("\green You slice the energy net to pieces.") for(var/mob/O in oviewers(src)) - O.show_message(text("\red [] slices the energy net apart!", usr), 1) + O.show_message(text("[] slices the energy net apart!", usr), 1) healthcheck() return diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 8053cea32db..55b30f45011 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -10,6 +10,7 @@ /datum/round_event/radiation_storm/setup() startWhen = rand(10, 20) endWhen = startWhen + 5 + announceWhen = 1 /datum/round_event/radiation_storm/announce() priority_announce("High levels of radiation detected near the station. Maintenance is best shielded from radiation.", "Anomaly Alert", 'sound/AI/radiation.ogg') diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index d785caa4292..28587ed7942 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -15,6 +15,7 @@ var/bonus_points = 100 var/thanks_msg = "Have some supply points as thanks (the shuttle will be returned in 5 minutes)." var/dispatched = 0 + announceWhen = 1 /datum/round_event/shuttle_loan/start() dispatch_type = pick(HIJACK_SYNDIE, RUSKY_PARTY, SPIDER_GIFT, DEPARTMENT_RESUPPLY) diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index f202148ca29..db410577ab7 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -4,7 +4,7 @@ weight = 35 /datum/round_event/vent_clog - announceWhen = 0 + announceWhen = 1 startWhen = 5 endWhen = 35 var/interval = 2 diff --git a/code/modules/events/weightless.dm b/code/modules/events/weightless.dm index bc1e79f91d9..9d98ca5db59 100644 --- a/code/modules/events/weightless.dm +++ b/code/modules/events/weightless.dm @@ -6,6 +6,7 @@ /datum/round_event/weightless startWhen = 5 endWhen = 65 + announceWhen = 1 /datum/round_event/weightless/setup() startWhen = rand(0,10) @@ -17,7 +18,7 @@ /datum/round_event/weightless/start() for(var/area/A in world) A.gravitychange(0) - + if(control) control.weight *= 2 diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm index d196603c83c..8729f1b1627 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/Dreaming.dm @@ -12,7 +12,7 @@ mob/living/carbon/proc/dream() for(var/i = rand(1,4),i > 0, i--) var/dream_image = pick(dreams) dreams -= dream_image - src << "\blue ... [dream_image] ..." + src << "... [dream_image] ..." sleep(rand(40,70)) if(paralysis <= 0) dreaming = 0 diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 706612fbd56..32692b64771 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -109,7 +109,7 @@ mob/living/carbon/proc/handle_hallucinations() if(41 to 65) //Strange audio //src << "Strange Audio" - switch(rand(1,12)) + switch(rand(1,14)) if(1) src << 'sound/machines/airlock.ogg' if(2) if(prob(50))src << 'sound/effects/Explosion1.ogg' @@ -140,6 +140,12 @@ mob/living/carbon/proc/handle_hallucinations() 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') src << pick(creepyasssounds) + if(13) + src << "You feel a tiny prick!" + if(14) + src << "

    Priority Announcement

    " + src << "

    The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.

    " + src << sound('sound/AI/shuttledock.ogg') if(66 to 70) //Flashes of danger //src << "Danger Flash" @@ -242,8 +248,8 @@ proc/check_panel(mob/M) /obj/effect/fake_attacker/attackby(var/obj/item/weapon/P as obj, mob/user as mob) step_away(src,my_target,2) for(var/mob/M in oviewers(world.view,my_target)) - M << "\red [my_target] flails around wildly." - my_target.show_message("\red [src] has been attacked by [my_target] ", 1) //Lazy. + M << "[my_target] flails around wildly." + my_target.show_message("[src] has been attacked by [my_target] ", 1) //Lazy. src.health -= P.force @@ -255,7 +261,7 @@ proc/check_panel(mob/M) step_away(src,my_target,2) if(prob(30)) for(var/mob/O in oviewers(world.view , my_target)) - O << "\red [my_target] stumbles around." + O << "[my_target] stumbles around." /obj/effect/fake_attacker/New() ..() @@ -308,7 +314,7 @@ proc/check_panel(mob/M) fake_blood(my_target) else my_target << sound(pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg')) - my_target.show_message("\red [src.name] has punched [my_target]!", 1) + my_target.show_message("[src.name] has punched [my_target]!", 1) my_target.staminaloss += 30 if(prob(33)) if(!locate(/obj/effect/overlay) in my_target.loc) diff --git a/code/modules/food&drinks/drinks/drinks.dm b/code/modules/food&drinks/drinks/drinks.dm index 26b35cdc487..b3ec99101bf 100644 --- a/code/modules/food&drinks/drinks/drinks.dm +++ b/code/modules/food&drinks/drinks/drinks.dm @@ -11,37 +11,24 @@ possible_transfer_amounts = list(5,10,25) volume = 50 - on_reagent_change() - if (gulp_size < 5) gulp_size = 5 - else gulp_size = max(round(reagents.total_volume / 5), 5) +/obj/item/weapon/reagent_containers/food/drinks/on_reagent_change() + if (gulp_size < 5) gulp_size = 5 + else gulp_size = max(round(reagents.total_volume / 5), 5) - attack_self(mob/user as mob) - return +/obj/item/weapon/reagent_containers/food/drinks/attack_self(mob/user as mob) + return - attack(mob/M as mob, mob/user as mob, def_zone) +/obj/item/weapon/reagent_containers/food/drinks/attack(mob/M as mob, mob/user as mob, def_zone) - if(!reagents || !reagents.total_volume) - user << "None of [src] left, oh no!" - return 0 + if(!reagents || !reagents.total_volume) + user << "None of [src] left, oh no!" + return 0 - if(!canconsume(M, user)) - return 0 + if(!canconsume(M, user)) + return 0 - if(M == user) - M << "You swallow a gulp of [src]." - if(reagents.total_volume) - reagents.reaction(M, INGEST) - spawn(5) - reagents.trans_to(M, gulp_size) - - playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) - return 1 - - M.visible_message("[user] attempts to feed [src] to [M].", "You attempt to feed [src] to [M].") - if(!do_mob(user, M)) return - if(!reagents.total_volume) return // The drink might be empty after the delay, such as by spam-feeding - M.visible_message("[user] feeds [src] to [M].", "You feed [src] to [M].") - add_logs(user, M, "fed", object="[reagentlist(src)]") + if(M == user) + M << "You swallow a gulp of [src]." if(reagents.total_volume) reagents.reaction(M, INGEST) spawn(5) @@ -50,57 +37,70 @@ playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) return 1 + M.visible_message("[user] attempts to feed [src] to [M].", "You attempt to feed [src] to [M].") + if(!do_mob(user, M)) return + if(!reagents.total_volume) return // The drink might be empty after the delay, such as by spam-feeding + M.visible_message("[user] feeds [src] to [M].", "You feed [src] to [M].") + add_logs(user, M, "fed", object="[reagentlist(src)]") + if(reagents.total_volume) + reagents.reaction(M, INGEST) + spawn(5) + reagents.trans_to(M, gulp_size) - afterattack(obj/target, mob/user , proximity) - if(!proximity) return - if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. + playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) + return 1 - if(!target.reagents.total_volume) - user << "[target] is empty." - return - if(reagents.total_volume >= reagents.maximum_volume) - user << "[src] is full." - return +/obj/item/weapon/reagent_containers/food/drinks/afterattack(obj/target, mob/user , proximity) + if(!proximity) return + if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. - var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) - user << "You fill [src] with [trans] units of the contents of [target]." + if(!target.reagents.total_volume) + user << "[target] is empty." + return - else if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it. - if(!reagents.total_volume) - user << "[src] is empty." - return + if(reagents.total_volume >= reagents.maximum_volume) + user << "[src] is full." + return - if(target.reagents.total_volume >= target.reagents.maximum_volume) - user << "[target] is full." - return + var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) + user << "You fill [src] with [trans] units of the contents of [target]." - var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) - user << " You transfer [trans] units of the solution to [target]." + else if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it. + if(!reagents.total_volume) + user << "[src] is empty." + return - if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell - var/mob/living/silicon/robot/bro = user - bro.cell.use(30) - var/refill = reagents.get_master_reagent_id() - spawn(600) - reagents.add_reagent(refill, trans) + if(target.reagents.total_volume >= target.reagents.maximum_volume) + user << "[target] is full." + return - return + var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) + user << " You transfer [trans] units of the solution to [target]." - examine() - set src in view() - ..() - if (!(usr in range(0)) && usr!=src.loc) return - if(!reagents || reagents.total_volume==0) - usr << "\The [src] is empty!" - else if (reagents.total_volume<=src.volume/4) - usr << "\The [src] is almost empty!" - else if (reagents.total_volume<=src.volume*0.66) - usr << "\The [src] is half full!" - else if (reagents.total_volume<=src.volume*0.90) - usr << "\The [src] is almost full!" - else - usr << "\The [src] is full!" + if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell + var/mob/living/silicon/robot/bro = user + bro.cell.use(30) + var/refill = reagents.get_master_reagent_id() + spawn(600) + reagents.add_reagent(refill, trans) + + return + +/obj/item/weapon/reagent_containers/food/drinks/examine() + set src in view() + ..() + if (!(usr in range(0)) && usr!=src.loc) return + if(!reagents || reagents.total_volume==0) + usr << "\The [src] is empty!" + else if (reagents.total_volume<=src.volume/4) + usr << "\The [src] is almost empty!" + else if (reagents.total_volume<=src.volume*0.66) + usr << "\The [src] is half full!" + else if (reagents.total_volume<=src.volume*0.90) + usr << "\The [src] is almost full!" + else + usr << "\The [src] is full!" //////////////////////////////////////////////////////////////////////////////// @@ -134,11 +134,12 @@ desc = "It's milk. White and nutritious goodness!" icon_state = "milk" item_state = "carton" - New() - ..() - reagents.add_reagent("milk", 50) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + +/obj/item/weapon/reagent_containers/food/drinks/milk/New() + ..() + reagents.add_reagent("milk", 50) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) /obj/item/weapon/reagent_containers/food/drinks/flour name = "flour sack" @@ -146,95 +147,104 @@ icon = 'icons/obj/food.dmi' icon_state = "flour" item_state = "flour" - New() - ..() - reagents.add_reagent("flour", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + +/obj/item/weapon/reagent_containers/food/drinks/flour/New() + ..() + reagents.add_reagent("flour", 30) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) /obj/item/weapon/reagent_containers/food/drinks/soymilk name = "SoyMilk" desc = "It's soy milk. White and nutritious goodness!" icon_state = "soymilk" item_state = "carton" - New() - ..() - reagents.add_reagent("soymilk", 50) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + +/obj/item/weapon/reagent_containers/food/drinks/soymilk/New() + ..() + reagents.add_reagent("soymilk", 50) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) /obj/item/weapon/reagent_containers/food/drinks/coffee name = "Robust Coffee" desc = "Careful, the beverage you're about to enjoy is extremely hot." icon_state = "coffee" - New() - ..() - reagents.add_reagent("coffee", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + +/obj/item/weapon/reagent_containers/food/drinks/coffee/New() + ..() + reagents.add_reagent("coffee", 30) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) /obj/item/weapon/reagent_containers/food/drinks/tea name = "Duke Purple Tea" desc = "An insult to Duke Purple is an insult to the Space Queen! Any proper gentleman will fight you, if you sully this tea." icon_state = "tea" item_state = "coffee" - New() - ..() - reagents.add_reagent("tea", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + +/obj/item/weapon/reagent_containers/food/drinks/tea/New() + ..() + reagents.add_reagent("tea", 30) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) /obj/item/weapon/reagent_containers/food/drinks/ice name = "Ice Cup" desc = "Careful, cold ice, do not chew." icon_state = "coffee" - New() - ..() - reagents.add_reagent("ice", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + +/obj/item/weapon/reagent_containers/food/drinks/ice/New() + ..() + reagents.add_reagent("ice", 30) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) /obj/item/weapon/reagent_containers/food/drinks/h_chocolate name = "Dutch Hot Coco" desc = "Made in Space South America." icon_state = "tea" item_state = "coffee" - New() - ..() - reagents.add_reagent("hot_coco", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + +/obj/item/weapon/reagent_containers/food/drinks/h_chocolate/New() + ..() + reagents.add_reagent("hot_coco", 30) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) /obj/item/weapon/reagent_containers/food/drinks/dry_ramen name = "Cup Ramen" desc = "Just add 10ml water, self heats! A taste that reminds you of your school years." icon_state = "ramen" - New() - ..() - reagents.add_reagent("dry_ramen", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + +/obj/item/weapon/reagent_containers/food/drinks/dry_ramen/New() + ..() + reagents.add_reagent("dry_ramen", 30) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) /obj/item/weapon/reagent_containers/food/drinks/beer name = "Space Beer" desc = "Beer. In space." icon_state = "beer" - New() - ..() - reagents.add_reagent("beer", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + +/obj/item/weapon/reagent_containers/food/drinks/beer/New() + ..() + reagents.add_reagent("beer", 30) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) /obj/item/weapon/reagent_containers/food/drinks/ale name = "Magm-Ale" desc = "A true dorf's drink of choice." icon_state = "alebottle" item_state = "beer" - New() - ..() - reagents.add_reagent("ale", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + +/obj/item/weapon/reagent_containers/food/drinks/ale/New() + ..() + reagents.add_reagent("ale", 30) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) /obj/item/weapon/reagent_containers/food/drinks/sillycup name = "Paper Cup" @@ -242,15 +252,17 @@ icon_state = "water_cup_e" possible_transfer_amounts = null volume = 10 - New() - ..() - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) - on_reagent_change() - if(reagents.total_volume) - icon_state = "water_cup" - else - icon_state = "water_cup_e" + +/obj/item/weapon/reagent_containers/food/drinks/sillycup/New() + ..() + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) + +/obj/item/weapon/reagent_containers/food/drinks/sillycup/on_reagent_change() + if(reagents.total_volume) + icon_state = "water_cup" + else + icon_state = "water_cup_e" //////////////////////////drinkingglass and shaker// //Note by Darem: This code handles the mixing of drinks. New drinks go in three places: In Chemistry-Reagents.dm (for the drink @@ -292,87 +304,96 @@ name = "Space Cola" desc = "Cola. in space." icon_state = "cola" - New() - ..() - reagents.add_reagent("cola", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + +/obj/item/weapon/reagent_containers/food/drinks/soda_cans/cola/New() + ..() + reagents.add_reagent("cola", 30) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) /obj/item/weapon/reagent_containers/food/drinks/soda_cans/tonic name = "T-Borg's Tonic Water" desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." icon_state = "tonic" - New() - ..() - reagents.add_reagent("tonic", 50) + +/obj/item/weapon/reagent_containers/food/drinks/soda_cans/tonic/New() + ..() + reagents.add_reagent("tonic", 50) /obj/item/weapon/reagent_containers/food/drinks/soda_cans/sodawater name = "Soda Water" desc = "A can of soda water. Why not make a scotch and soda?" icon_state = "sodawater" - New() - ..() - reagents.add_reagent("sodawater", 50) + +/obj/item/weapon/reagent_containers/food/drinks/soda_cans/sodawater/New() + ..() + reagents.add_reagent("sodawater", 50) /obj/item/weapon/reagent_containers/food/drinks/soda_cans/lemon_lime name = "Orange Soda" desc = "You wanted ORANGE. It gave you Lemon Lime." icon_state = "lemon-lime" - New() - ..() - name = "Lemon-Lime Soda" - reagents.add_reagent("lemon_lime", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + +/obj/item/weapon/reagent_containers/food/drinks/soda_cans/lemon_lime/New() + ..() + name = "Lemon-Lime Soda" + reagents.add_reagent("lemon_lime", 30) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) /obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_up name = "Space-Up" desc = "Tastes like a hull breach in your mouth." icon_state = "space-up" - New() - ..() - reagents.add_reagent("space_up", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + +/obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_up/New() + ..() + reagents.add_reagent("space_up", 30) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) /obj/item/weapon/reagent_containers/food/drinks/soda_cans/starkist name = "Star-kist" desc = "The taste of a star in liquid form. And, a bit of tuna...?" icon_state = "starkist" - New() - ..() - reagents.add_reagent("cola", 15) - reagents.add_reagent("orangejuice", 15) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + +/obj/item/weapon/reagent_containers/food/drinks/soda_cans/starkist/New() + ..() + reagents.add_reagent("cola", 15) + reagents.add_reagent("orangejuice", 15) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) /obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_mountain_wind name = "Space Mountain Wind" desc = "Blows right through you like a space wind." icon_state = "space_mountain_wind" - New() - ..() - reagents.add_reagent("spacemountainwind", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + +/obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_mountain_wind/New() + ..() + reagents.add_reagent("spacemountainwind", 30) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) /obj/item/weapon/reagent_containers/food/drinks/soda_cans/thirteenloko name = "Thirteen Loko" desc = "The CMO has advised crew members that consumption of Thirteen Loko may result in seizures, blindness, drunkeness, or even death. Please Drink Responsably." icon_state = "thirteen_loko" - New() - ..() - reagents.add_reagent("thirteenloko", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + +/obj/item/weapon/reagent_containers/food/drinks/soda_cans/thirteenloko/New() + ..() + reagents.add_reagent("thirteenloko", 30) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) /obj/item/weapon/reagent_containers/food/drinks/soda_cans/dr_gibb name = "Dr. Gibb" desc = "A delicious mixture of 42 different flavors." icon_state = "dr_gibb" - New() - ..() - reagents.add_reagent("dr_gibb", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + +/obj/item/weapon/reagent_containers/food/drinks/soda_cans/dr_gibb/New() + ..() + reagents.add_reagent("dr_gibb", 30) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) diff --git a/code/modules/food&drinks/drinks/drinks/bottle.dm b/code/modules/food&drinks/drinks/drinks/bottle.dm index 90673de7f8b..06f0707f6af 100644 --- a/code/modules/food&drinks/drinks/drinks/bottle.dm +++ b/code/modules/food&drinks/drinks/drinks/bottle.dm @@ -84,8 +84,8 @@ //Display an attack message. for(var/mob/O in viewers(user, null)) - if(target != user) O.show_message(text("\red [target] has been hit over the head with a bottle of [src.name], by [user]!"), 1) - else O.show_message(text("\red [target] hit himself with a bottle of [src.name] on the head!"), 1) + if(target != user) O.show_message(text("[target] has been hit over the head with a bottle of [src.name], by [user]!"), 1) + else O.show_message(text("[target] hits himself with a bottle of [src.name] on the head!"), 1) //Weaken the target for the duration that we calculated and divide it by 5. if(armor_duration) target.apply_effect(min(armor_duration, 10) , WEAKEN) // Never weaken more than a flash! @@ -102,7 +102,7 @@ //The reagents in the bottle splash all over the target, thanks for the idea Nodrak if(src.reagents) for(var/mob/O in viewers(user, null)) - O.show_message(text("\blue The contents of the [src] splashes all over [target]!"), 1) + O.show_message(text("The contents of the [src] splashes all over [target]!"), 1) src.reagents.reaction(target, TOUCH) //Finally, smash the bottle. This kills (del) the bottle. @@ -130,105 +130,118 @@ name = "Griffeater Gin" desc = "A bottle of high quality gin, produced in the New London Space Station." icon_state = "ginbottle" - New() - ..() - reagents.add_reagent("gin", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/gin/New() + ..() + reagents.add_reagent("gin", 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey name = "Uncle Git's Special Reserve" desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES." icon_state = "whiskeybottle" - New() - ..() - reagents.add_reagent("whiskey", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey/New() + ..() + reagents.add_reagent("whiskey", 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/vodka name = "Tunguska Triple Distilled" desc = "Aah, vodka. Prime choice of drink AND fuel by Russians worldwide." icon_state = "vodkabottle" - New() - ..() - reagents.add_reagent("vodka", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka/New() + ..() + reagents.add_reagent("vodka", 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla name = "Caccavo Guaranteed Quality Tequilla" desc = "Made from premium petroleum distillates, pure thalidomide and other fine quality ingredients!" icon_state = "tequillabottle" - New() - ..() - reagents.add_reagent("tequilla", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla/New() + ..() + reagents.add_reagent("tequilla", 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing name = "Bottle of Nothing" desc = "A bottle filled with nothing" icon_state = "bottleofnothing" - New() - ..() - reagents.add_reagent("nothing", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing/New() + ..() + reagents.add_reagent("nothing", 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/patron name = "Wrapp Artiste Patron" desc = "Silver laced tequilla, served in space night clubs across the galaxy." icon_state = "patronbottle" - New() - ..() - reagents.add_reagent("patron", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/patron/New() + ..() + reagents.add_reagent("patron", 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/rum name = "Captain Pete's Cuban Spiced Rum" desc = "This isn't just rum, oh no. It's practically GRIFF in a bottle." icon_state = "rumbottle" - New() - ..() - reagents.add_reagent("rum", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/rum/New() + ..() + reagents.add_reagent("rum", 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater name = "Flask of Holy Water" desc = "A flask of the chaplain's holy water." icon_state = "holyflask" - New() - ..() - reagents.add_reagent("holywater", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater/New() + ..() + reagents.add_reagent("holywater", 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth name = "Goldeneye Vermouth" desc = "Sweet, sweet dryness~" icon_state = "vermouthbottle" - New() - ..() - reagents.add_reagent("vermouth", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth/New() + ..() + reagents.add_reagent("vermouth", 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua name = "Robert Robust's Coffee Liqueur" desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK" icon_state = "kahluabottle" - New() - ..() - reagents.add_reagent("kahlua", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua/New() + ..() + reagents.add_reagent("kahlua", 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager name = "College Girl Goldschlager" desc = "Because they are the only ones who will drink 100 proof cinnamon schnapps." icon_state = "goldschlagerbottle" - New() - ..() - reagents.add_reagent("goldschlager", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager/New() + ..() + reagents.add_reagent("goldschlager", 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/cognac name = "Chateau De Baton Premium Cognac" desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time." icon_state = "cognacbottle" - New() - ..() - reagents.add_reagent("cognac", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac/New() + ..() + reagents.add_reagent("cognac", 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/wine name = "Doublebeard Bearded Special Wine" desc = "A faint aura of unease and asspainery surrounds the bottle." icon_state = "winebottle" - New() - ..() - reagents.add_reagent("wine", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/wine/New() + ..() + reagents.add_reagent("wine", 100) //////////////////////////JUICES AND STUFF /////////////////////// @@ -238,9 +251,10 @@ icon_state = "orangejuice" item_state = "carton" isGlass = 0 - New() - ..() - reagents.add_reagent("orangejuice", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice/New() + ..() + reagents.add_reagent("orangejuice", 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/cream name = "Milk Cream" @@ -248,9 +262,10 @@ icon_state = "cream" item_state = "carton" isGlass = 0 - New() - ..() - reagents.add_reagent("cream", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/cream/New() + ..() + reagents.add_reagent("cream", 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice name = "Tomato Juice" @@ -258,9 +273,10 @@ icon_state = "tomatojuice" item_state = "carton" isGlass = 0 - New() - ..() - reagents.add_reagent("tomatojuice", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice/New() + ..() + reagents.add_reagent("tomatojuice", 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice name = "Lime Juice" @@ -268,6 +284,7 @@ icon_state = "limejuice" item_state = "carton" isGlass = 0 - New() - ..() - reagents.add_reagent("limejuice", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice/New() + ..() + reagents.add_reagent("limejuice", 100) diff --git a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm b/code/modules/food&drinks/drinks/drinks/drinkingglass.dm index 353cb8e6f9f..6320f340a6d 100644 --- a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food&drinks/drinks/drinks/drinkingglass.dm @@ -7,450 +7,450 @@ amount_per_transfer_from_this = 10 volume = 50 - on_reagent_change() - if (reagents.reagent_list.len > 0) - switch(reagents.get_master_reagent_id()) - if("beer") - icon_state = "beerglass" - name = "glass of beer" - desc = "A freezing pint of beer" - if("beer2") - icon_state = "beerglass" - name = "glass of beer" - desc = "A freezing pint of beer" - if("greenbeer") - icon_state = "greenbeerglass" - name = "glass of green beer" - desc = "A freezing pint of green beer. Festive." - if("ale") - icon_state = "aleglass" - name = "glass of ale" - desc = "A freezing pint of delicious Ale" - if("milk") - icon_state = "glass_white" - name = "glass of milk" - desc = "White and nutritious goodness!" - if("cream") - icon_state = "glass_white" - name = "glass of cream" - desc = "Ewwww..." - if("hot_coco") - icon_state = "chocolateglass" - name = "glass of chocolate" - desc = "Tasty" - if("lemonjuice") - icon_state = "lemonglass" - name = "glass of lemon juice" - desc = "Sour..." - if("holywater") - icon_state = "glass_clear" - name = "glass of Holy Water" - desc = "A glass of holy water." - if("potato") - icon_state = "glass_brown" - name = "glass of potato juice" - desc = "Bleh..." - if("watermelonjuice") - icon_state = "glass_red" - name = "glass of watermelon juice" - desc = "A glass of watermelon juice." - if("cola") - icon_state = "glass_brown" - name = "glass of space Cola" - desc = "A glass of refreshing Space Cola" - if("nuka_cola") - icon_state = "nuka_colaglass" - name = "Nuka Cola" - desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland" - if("orangejuice") - icon_state = "glass_orange" - name = "glass of orange juice" - desc = "Vitamins! Yay!" - if("tomatojuice") - icon_state = "glass_red" - name = "glass of tomato juice" - desc = "Are you sure this is tomato juice?" - if("blood") - icon_state = "glass_red" - name = "glass of tomato juice" - desc = "Are you sure this is tomato juice?" - if("limejuice") - icon_state = "glass_green" - name = "glass of lime juice" - desc = "A glass of sweet-sour lime juice." - if("whiskey") - icon_state = "whiskeyglass" - name = "glass of whiskey" - desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." - if("gin") - icon_state = "ginvodkaglass" - name = "glass of gin" - desc = "A crystal clear glass of Griffeater gin." - if("vodka") - icon_state = "ginvodkaglass" - name = "glass of vodka" - desc = "The glass contain wodka. Xynta." - if("goldschlager") - icon_state = "ginvodkaglass" - name = "glass of Goldschlager" - desc = "100 proof that teen girls will drink anything with gold in it." - if("wine") - icon_state = "wineglass" - name = "glass of wine" - desc = "A very classy looking drink." - if("cognac") - icon_state = "cognacglass" - name = "glass of cognac" - desc = "Damn, you feel like some kind of French aristocrat just by holding this." - if ("kahlua") - icon_state = "kahluaglass" - name = "glass of RR Coffee Liquor" - desc = "DAMN, THIS THING LOOKS ROBUST" - if("vermouth") - icon_state = "vermouthglass" - name = "glass of vermouth" - desc = "You wonder why you're even drinking this straight." - if("tequilla") - icon_state = "tequillaglass" - name = "glass of tequilla" - desc = "Now all that's missing is the weird colored shades!" - if("patron") - icon_state = "patronglass" - name = "glass of patron" - desc = "Drinking patron in the bar, with all the subpar ladies." - if("rum") - icon_state = "rumglass" - name = "glass of rum" - desc = "Now you want to Pray for a pirate suit, don't you?" - if("gintonic") - icon_state = "gintonicglass" - name = "Gin and Tonic" - desc = "A mild but still great cocktail. Drink up, like a true Englishman." - if("whiskeycola") - icon_state = "whiskeycolaglass" - name = "Whiskey Cola" - desc = "An innocent-looking mixture of cola and Whiskey. Delicious." - if("whiterussian") - icon_state = "whiterussianglass" - name = "White Russian" - desc = "A very nice looking drink. But that's just, like, your opinion, man." - if("screwdrivercocktail") - icon_state = "screwdriverglass" - name = "Screwdriver" - desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." - if("bloodymary") - icon_state = "bloodymaryglass" - name = "Bloody Mary" - desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder." - if("martini") - icon_state = "martiniglass" - name = "Classic Martini" - desc = "Damn, the bartender even stirred it, not shook it." - if("vodkamartini") - icon_state = "martiniglass" - name = "Vodka martini" - desc ="A bastardisation of the classic martini. Still great." - if("gargleblaster") - icon_state = "gargleblasterglass" - name = "Pan-Galactic Gargle Blaster" - desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy." - if("bravebull") - icon_state = "bravebullglass" - name = "Brave Bull" - desc = "Tequilla and Coffee liquor, brought together in a mouthwatering mixture. Drink up." - if("tequillasunrise") - icon_state = "tequillasunriseglass" - name = "Tequilla Sunrise" - desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." - if("toxinsspecial") - icon_state = "toxinsspecialglass" - name = "Toxins Special" - desc = "Whoah, this thing is on FIRE" - if("beepskysmash") - icon_state = "beepskysmashglass" - name = "Beepsky Smash" - desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." - if("doctorsdelight") - icon_state = "doctorsdelightglass" - name = "Doctor's Delight" - desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place." - if("manlydorf") - icon_state = "manlydorfglass" - name = "The Manly Dorf" - desc = "A manly concotion made from Ale and Beer. Intended for true men only." - if("irishcream") - icon_state = "irishcreamglass" - name = "Irish Cream" - desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" - if("cubalibre") - icon_state = "cubalibreglass" - name = "Cuba Libre" - desc = "A classic mix of rum and cola." - if("b52") - icon_state = "b52glass" - name = "B-52" - desc = "Kahlua, Irish Cream, and cognac. You will get bombed." - if("atomicbomb") - icon_state = "atomicbombglass" - name = "Atomic Bomb" - desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." - if("longislandicedtea") - icon_state = "longislandicedteaglass" - name = "Long Island Iced Tea" - desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." - if("threemileisland") - icon_state = "threemileislandglass" - name = "Three Mile Island Ice Tea" - desc = "A glass of this is sure to prevent a meltdown." - if("margarita") - icon_state = "margaritaglass" - name = "Margarita" - desc = "On the rocks with salt on the rim. Arriba~!" - if("blackrussian") - icon_state = "blackrussianglass" - name = "Black Russian" - desc = "For the lactose-intolerant. Still as classy as a White Russian." - if("vodkatonic") - icon_state = "vodkatonicglass" - name = "Vodka and Tonic" - desc = "For when a gin and tonic isn't Russian enough." - if("manhattan") - icon_state = "manhattanglass" - name = "Manhattan" - desc = "The Detective's undercover drink of choice. He never could stomach gin..." - if("manhattan_proj") - icon_state = "proj_manhattanglass" - name = "Manhattan Project" - desc = "A scientist drink of choice, for thinking how to blow up the station." - if("ginfizz") - icon_state = "ginfizzglass" - name = "Gin Fizz" - desc = "Refreshingly lemony, deliciously dry." - if("irishcoffee") - icon_state = "irishcoffeeglass" - name = "Irish Coffee" - desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." - if("hooch") - icon_state = "glass_brown2" - name = "Hooch" - desc = "You've really hit rock bottom now... your liver packed its bags and left last night." - if("whiskeysoda") - icon_state = "whiskeysodaglass2" - name = "Whiskey Soda" - desc = "Ultimate refreshment." - if("tonic") - icon_state = "glass_clear" - name = "Glass of Tonic Water" - desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." - if("sodawater") - icon_state = "glass_clear" - name = "Glass of Soda Water" - desc = "Soda water. Why not make a scotch and soda?" - if("water") - icon_state = "glass_clear" - name = "Glass of Water" - desc = "The father of all refreshments." - if("spacemountainwind") - icon_state = "Space_mountain_wind_glass" - name = "Glass of Space Mountain Wind" - desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind." - if("thirteenloko") - icon_state = "thirteen_loko_glass" - name = "Glass of Thirteen Loko" - desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass" - if("dr_gibb") - icon_state = "dr_gibb_glass" - name = "Glass of Dr. Gibb" - desc = "Dr. Gibb. Not as dangerous as the name might imply." - if("space_up") - icon_state = "space-up_glass" - name = "Glass of Space-up" - desc = "Space-up. It helps keep your cool." - if("lemon_lime") - icon_state = "glass_yellow" - name = "Glass of Lemon-Lime" - desc = "You're pretty certain a real fruit has never actually touched this." - if("moonshine") - icon_state = "glass_clear" - name = "Moonshine" - desc = "You've really hit rock bottom now... your liver packed its bags and left last night." - if("soymilk") - icon_state = "glass_white" - name = "Glass of soy milk" - desc = "White and nutritious soy goodness!" - if("berryjuice") - icon_state = "berryjuice" - name = "Glass of berry juice" - desc = "Berry juice. Or maybe it's jam. Who cares?" - if("poisonberryjuice") - icon_state = "poisonberryjuice" - name = "Glass of berry juice" - desc = "Berry juice. Or maybe it's poison. Who cares?" - if("carrotjuice") - icon_state = "carrotjuice" - name = "Glass of carrot juice" - desc = "It is just like a carrot but without crunching." - if("banana") - icon_state = "banana" - name = "Glass of banana juice" - desc = "The raw essence of a banana. HONK" - if("bahama_mama") - icon_state = "bahama_mama" - name = "Bahama Mama" - desc = "Tropic cocktail" - if("singulo") - icon_state = "singulo" - name = "Singulo" - desc = "A blue-space beverage." - if("alliescocktail") - icon_state = "alliescocktail" - name = "Allies cocktail" - desc = "A drink made from your allies." - if("antifreeze") - icon_state = "antifreeze" - name = "Anti-freeze" - desc = "The ultimate refreshment." - if("barefoot") - icon_state = "b&p" - name = "Barefoot" - desc = "Barefoot and pregnant" - if("demonsblood") - icon_state = "demonsblood" - name = "Demons Blood" - desc = "Just looking at this thing makes the hair at the back of your neck stand up." - if("booger") - icon_state = "booger" - name = "Booger" - desc = "Ewww..." - if("snowwhite") - icon_state = "snowwhite" - name = "Snow White" - desc = "A cold refreshment." - if("aloe") - icon_state = "aloe" - name = "Aloe" - desc = "Very, very, very good." - if("andalusia") - icon_state = "andalusia" - name = "Andalusia" - desc = "A nice, strange named drink." - if("sbiten") - icon_state = "sbitenglass" - name = "Sbiten" - desc = "A spicy mix of Vodka and Spice. Very hot." - if("red_mead") - icon_state = "red_meadglass" - name = "Red Mead" - desc = "A True Vikings Beverage, though its color is strange." - if("mead") - icon_state = "meadglass" - name = "Mead" - desc = "A Vikings Beverage, though a cheap one." - if("iced_beer") - icon_state = "iced_beerglass" - name = "Iced Beer" - desc = "A beer so frosty, the air around it freezes." - if("grog") - icon_state = "grogglass" - name = "Grog" - desc = "A fine and cepa drink for Space." - if("soy_latte") - icon_state = "soy_latte" - name = "Soy Latte" - desc = "A nice and refrshing beverage while you are reading." - if("cafe_latte") - icon_state = "cafe_latte" - name = "Cafe Latte" - desc = "A nice, strong and refreshing beverage while you are reading." - if("acidspit") - icon_state = "acidspitglass" - name = "Acid Spit" - desc = "A drink from Nanotrasen. Made from live aliens." - if("amasec") - icon_state = "amasecglass" - name = "Amasec" - desc = "Always handy before COMBAT!!!" - if("neurotoxin") - icon_state = "neurotoxinglass" - name = "Neurotoxin" - desc = "A drink that is guaranteed to knock you silly." - if("hippiesdelight") - icon_state = "hippiesdelightglass" - name = "Hippie's Delight" - desc = "A drink enjoyed by people during the 1960's." - if("bananahonk") - icon_state = "bananahonkglass" - name = "Banana Honk" - desc = "A drink from Clown Heaven." - if("silencer") - icon_state = "silencerglass" - name = "Silencer" - desc = "A drink from mime Heaven." - if("nothing") - icon_state = "nothing" - name = "Nothing" - desc = "Absolutely nothing." - if("devilskiss") - icon_state = "devilskiss" - name = "Devils Kiss" - desc = "Creepy time!" - if("changelingsting") - icon_state = "changelingsting" - name = "Changeling Sting" - desc = "A stingy drink." - if("irishcarbomb") - icon_state = "irishcarbomb" - name = "Irish Car Bomb" - desc = "An irish car bomb." - if("syndicatebomb") - icon_state = "syndicatebomb" - name = "Syndicate Bomb" - desc = "A syndicate bomb." - if("erikasurprise") - icon_state = "erikasurprise" - name = "Erika Surprise" - desc = "The surprise is, it's green!" - if("driestmartini") - icon_state = "driestmartiniglass" - name = "Driest Martini" - desc = "Only for the experienced. You think you see sand floating in the glass." - if("ice") - icon_state = "iceglass" - name = "Glass of ice" - desc = "Generally, you're supposed to put something else in there too..." - if("icecoffee") - icon_state = "icedcoffeeglass" - name = "Iced Coffee" - desc = "A drink to perk you up and refresh you!" - if("icetea") - icon_state = "icedteaglass" - name = "Iced Tea" - desc = "All natural, antioxidant-rich flavour sensation." - if("coffee") - icon_state = "glass_brown" - name = "Glass of coffee" - desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." - if("tea") - icon_state = "teaglass" - name = "Glass of tea" - desc = "Drinking it from here would not seem right." - if("bilk") - icon_state = "glass_brown" - name = "Glass of bilk" - desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." - if("fuel") - icon_state = "dr_gibb_glass" - name = "Glass of welder fuel" - desc = "Unless you are an industrial tool, this is probably not safe for consumption." - else - icon_state ="glass_brown" - name = "Glass of ..what?" - desc = "You can't really tell what this is." - else - icon_state = "glass_empty" - name = "Drinking glass" - desc = "Your standard drinking glass" - return +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/on_reagent_change() + if (reagents.reagent_list.len > 0) + switch(reagents.get_master_reagent_id()) + if("beer") + icon_state = "beerglass" + name = "glass of beer" + desc = "A freezing pint of beer" + if("beer2") + icon_state = "beerglass" + name = "glass of beer" + desc = "A freezing pint of beer" + if("greenbeer") + icon_state = "greenbeerglass" + name = "glass of green beer" + desc = "A freezing pint of green beer. Festive." + if("ale") + icon_state = "aleglass" + name = "glass of ale" + desc = "A freezing pint of delicious Ale" + if("milk") + icon_state = "glass_white" + name = "glass of milk" + desc = "White and nutritious goodness!" + if("cream") + icon_state = "glass_white" + name = "glass of cream" + desc = "Ewwww..." + if("hot_coco") + icon_state = "chocolateglass" + name = "glass of chocolate" + desc = "Tasty" + if("lemonjuice") + icon_state = "lemonglass" + name = "glass of lemon juice" + desc = "Sour..." + if("holywater") + icon_state = "glass_clear" + name = "glass of Holy Water" + desc = "A glass of holy water." + if("potato") + icon_state = "glass_brown" + name = "glass of potato juice" + desc = "Bleh..." + if("watermelonjuice") + icon_state = "glass_red" + name = "glass of watermelon juice" + desc = "A glass of watermelon juice." + if("cola") + icon_state = "glass_brown" + name = "glass of space Cola" + desc = "A glass of refreshing Space Cola" + if("nuka_cola") + icon_state = "nuka_colaglass" + name = "Nuka Cola" + desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland" + if("orangejuice") + icon_state = "glass_orange" + name = "glass of orange juice" + desc = "Vitamins! Yay!" + if("tomatojuice") + icon_state = "glass_red" + name = "glass of tomato juice" + desc = "Are you sure this is tomato juice?" + if("blood") + icon_state = "glass_red" + name = "glass of tomato juice" + desc = "Are you sure this is tomato juice?" + if("limejuice") + icon_state = "glass_green" + name = "glass of lime juice" + desc = "A glass of sweet-sour lime juice." + if("whiskey") + icon_state = "whiskeyglass" + name = "glass of whiskey" + desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." + if("gin") + icon_state = "ginvodkaglass" + name = "glass of gin" + desc = "A crystal clear glass of Griffeater gin." + if("vodka") + icon_state = "ginvodkaglass" + name = "glass of vodka" + desc = "The glass contain wodka. Xynta." + if("goldschlager") + icon_state = "ginvodkaglass" + name = "glass of Goldschlager" + desc = "100 proof that teen girls will drink anything with gold in it." + if("wine") + icon_state = "wineglass" + name = "glass of wine" + desc = "A very classy looking drink." + if("cognac") + icon_state = "cognacglass" + name = "glass of cognac" + desc = "Damn, you feel like some kind of French aristocrat just by holding this." + if ("kahlua") + icon_state = "kahluaglass" + name = "glass of RR Coffee Liquor" + desc = "DAMN, THIS THING LOOKS ROBUST" + if("vermouth") + icon_state = "vermouthglass" + name = "glass of vermouth" + desc = "You wonder why you're even drinking this straight." + if("tequilla") + icon_state = "tequillaglass" + name = "glass of tequilla" + desc = "Now all that's missing is the weird colored shades!" + if("patron") + icon_state = "patronglass" + name = "glass of patron" + desc = "Drinking patron in the bar, with all the subpar ladies." + if("rum") + icon_state = "rumglass" + name = "glass of rum" + desc = "Now you want to Pray for a pirate suit, don't you?" + if("gintonic") + icon_state = "gintonicglass" + name = "Gin and Tonic" + desc = "A mild but still great cocktail. Drink up, like a true Englishman." + if("whiskeycola") + icon_state = "whiskeycolaglass" + name = "Whiskey Cola" + desc = "An innocent-looking mixture of cola and Whiskey. Delicious." + if("whiterussian") + icon_state = "whiterussianglass" + name = "White Russian" + desc = "A very nice looking drink. But that's just, like, your opinion, man." + if("screwdrivercocktail") + icon_state = "screwdriverglass" + name = "Screwdriver" + desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." + if("bloodymary") + icon_state = "bloodymaryglass" + name = "Bloody Mary" + desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder." + if("martini") + icon_state = "martiniglass" + name = "Classic Martini" + desc = "Damn, the bartender even stirred it, not shook it." + if("vodkamartini") + icon_state = "martiniglass" + name = "Vodka martini" + desc ="A bastardisation of the classic martini. Still great." + if("gargleblaster") + icon_state = "gargleblasterglass" + name = "Pan-Galactic Gargle Blaster" + desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy." + if("bravebull") + icon_state = "bravebullglass" + name = "Brave Bull" + desc = "Tequilla and Coffee liquor, brought together in a mouthwatering mixture. Drink up." + if("tequillasunrise") + icon_state = "tequillasunriseglass" + name = "Tequilla Sunrise" + desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." + if("toxinsspecial") + icon_state = "toxinsspecialglass" + name = "Toxins Special" + desc = "Whoah, this thing is on FIRE" + if("beepskysmash") + icon_state = "beepskysmashglass" + name = "Beepsky Smash" + desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." + if("doctorsdelight") + icon_state = "doctorsdelightglass" + name = "Doctor's Delight" + desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place." + if("manlydorf") + icon_state = "manlydorfglass" + name = "The Manly Dorf" + desc = "A manly concotion made from Ale and Beer. Intended for true men only." + if("irishcream") + icon_state = "irishcreamglass" + name = "Irish Cream" + desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" + if("cubalibre") + icon_state = "cubalibreglass" + name = "Cuba Libre" + desc = "A classic mix of rum and cola." + if("b52") + icon_state = "b52glass" + name = "B-52" + desc = "Kahlua, Irish Cream, and cognac. You will get bombed." + if("atomicbomb") + icon_state = "atomicbombglass" + name = "Atomic Bomb" + desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." + if("longislandicedtea") + icon_state = "longislandicedteaglass" + name = "Long Island Iced Tea" + desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." + if("threemileisland") + icon_state = "threemileislandglass" + name = "Three Mile Island Ice Tea" + desc = "A glass of this is sure to prevent a meltdown." + if("margarita") + icon_state = "margaritaglass" + name = "Margarita" + desc = "On the rocks with salt on the rim. Arriba~!" + if("blackrussian") + icon_state = "blackrussianglass" + name = "Black Russian" + desc = "For the lactose-intolerant. Still as classy as a White Russian." + if("vodkatonic") + icon_state = "vodkatonicglass" + name = "Vodka and Tonic" + desc = "For when a gin and tonic isn't Russian enough." + if("manhattan") + icon_state = "manhattanglass" + name = "Manhattan" + desc = "The Detective's undercover drink of choice. He never could stomach gin..." + if("manhattan_proj") + icon_state = "proj_manhattanglass" + name = "Manhattan Project" + desc = "A scientist drink of choice, for thinking how to blow up the station." + if("ginfizz") + icon_state = "ginfizzglass" + name = "Gin Fizz" + desc = "Refreshingly lemony, deliciously dry." + if("irishcoffee") + icon_state = "irishcoffeeglass" + name = "Irish Coffee" + desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." + if("hooch") + icon_state = "glass_brown2" + name = "Hooch" + desc = "You've really hit rock bottom now... your liver packed its bags and left last night." + if("whiskeysoda") + icon_state = "whiskeysodaglass2" + name = "Whiskey Soda" + desc = "Ultimate refreshment." + if("tonic") + icon_state = "glass_clear" + name = "Glass of Tonic Water" + desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." + if("sodawater") + icon_state = "glass_clear" + name = "Glass of Soda Water" + desc = "Soda water. Why not make a scotch and soda?" + if("water") + icon_state = "glass_clear" + name = "Glass of Water" + desc = "The father of all refreshments." + if("spacemountainwind") + icon_state = "Space_mountain_wind_glass" + name = "Glass of Space Mountain Wind" + desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind." + if("thirteenloko") + icon_state = "thirteen_loko_glass" + name = "Glass of Thirteen Loko" + desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass" + if("dr_gibb") + icon_state = "dr_gibb_glass" + name = "Glass of Dr. Gibb" + desc = "Dr. Gibb. Not as dangerous as the name might imply." + if("space_up") + icon_state = "space-up_glass" + name = "Glass of Space-up" + desc = "Space-up. It helps keep your cool." + if("lemon_lime") + icon_state = "glass_yellow" + name = "Glass of Lemon-Lime" + desc = "You're pretty certain a real fruit has never actually touched this." + if("moonshine") + icon_state = "glass_clear" + name = "Moonshine" + desc = "You've really hit rock bottom now... your liver packed its bags and left last night." + if("soymilk") + icon_state = "glass_white" + name = "Glass of soy milk" + desc = "White and nutritious soy goodness!" + if("berryjuice") + icon_state = "berryjuice" + name = "Glass of berry juice" + desc = "Berry juice. Or maybe it's jam. Who cares?" + if("poisonberryjuice") + icon_state = "poisonberryjuice" + name = "Glass of berry juice" + desc = "Berry juice. Or maybe it's poison. Who cares?" + if("carrotjuice") + icon_state = "carrotjuice" + name = "Glass of carrot juice" + desc = "It is just like a carrot but without crunching." + if("banana") + icon_state = "banana" + name = "Glass of banana juice" + desc = "The raw essence of a banana. HONK" + if("bahama_mama") + icon_state = "bahama_mama" + name = "Bahama Mama" + desc = "Tropic cocktail" + if("singulo") + icon_state = "singulo" + name = "Singulo" + desc = "A blue-space beverage." + if("alliescocktail") + icon_state = "alliescocktail" + name = "Allies cocktail" + desc = "A drink made from your allies." + if("antifreeze") + icon_state = "antifreeze" + name = "Anti-freeze" + desc = "The ultimate refreshment." + if("barefoot") + icon_state = "b&p" + name = "Barefoot" + desc = "Barefoot and pregnant" + if("demonsblood") + icon_state = "demonsblood" + name = "Demons Blood" + desc = "Just looking at this thing makes the hair at the back of your neck stand up." + if("booger") + icon_state = "booger" + name = "Booger" + desc = "Ewww..." + if("snowwhite") + icon_state = "snowwhite" + name = "Snow White" + desc = "A cold refreshment." + if("aloe") + icon_state = "aloe" + name = "Aloe" + desc = "Very, very, very good." + if("andalusia") + icon_state = "andalusia" + name = "Andalusia" + desc = "A nice, strange named drink." + if("sbiten") + icon_state = "sbitenglass" + name = "Sbiten" + desc = "A spicy mix of Vodka and Spice. Very hot." + if("red_mead") + icon_state = "red_meadglass" + name = "Red Mead" + desc = "A True Vikings Beverage, though its color is strange." + if("mead") + icon_state = "meadglass" + name = "Mead" + desc = "A Vikings Beverage, though a cheap one." + if("iced_beer") + icon_state = "iced_beerglass" + name = "Iced Beer" + desc = "A beer so frosty, the air around it freezes." + if("grog") + icon_state = "grogglass" + name = "Grog" + desc = "A fine and cepa drink for Space." + if("soy_latte") + icon_state = "soy_latte" + name = "Soy Latte" + desc = "A nice and refrshing beverage while you are reading." + if("cafe_latte") + icon_state = "cafe_latte" + name = "Cafe Latte" + desc = "A nice, strong and refreshing beverage while you are reading." + if("acidspit") + icon_state = "acidspitglass" + name = "Acid Spit" + desc = "A drink from Nanotrasen. Made from live aliens." + if("amasec") + icon_state = "amasecglass" + name = "Amasec" + desc = "Always handy before COMBAT!!!" + if("neurotoxin") + icon_state = "neurotoxinglass" + name = "Neurotoxin" + desc = "A drink that is guaranteed to knock you silly." + if("hippiesdelight") + icon_state = "hippiesdelightglass" + name = "Hippie's Delight" + desc = "A drink enjoyed by people during the 1960's." + if("bananahonk") + icon_state = "bananahonkglass" + name = "Banana Honk" + desc = "A drink from Clown Heaven." + if("silencer") + icon_state = "silencerglass" + name = "Silencer" + desc = "A drink from mime Heaven." + if("nothing") + icon_state = "nothing" + name = "Nothing" + desc = "Absolutely nothing." + if("devilskiss") + icon_state = "devilskiss" + name = "Devils Kiss" + desc = "Creepy time!" + if("changelingsting") + icon_state = "changelingsting" + name = "Changeling Sting" + desc = "A stingy drink." + if("irishcarbomb") + icon_state = "irishcarbomb" + name = "Irish Car Bomb" + desc = "An irish car bomb." + if("syndicatebomb") + icon_state = "syndicatebomb" + name = "Syndicate Bomb" + desc = "A syndicate bomb." + if("erikasurprise") + icon_state = "erikasurprise" + name = "Erika Surprise" + desc = "The surprise is, it's green!" + if("driestmartini") + icon_state = "driestmartiniglass" + name = "Driest Martini" + desc = "Only for the experienced. You think you see sand floating in the glass." + if("ice") + icon_state = "iceglass" + name = "Glass of ice" + desc = "Generally, you're supposed to put something else in there too..." + if("icecoffee") + icon_state = "icedcoffeeglass" + name = "Iced Coffee" + desc = "A drink to perk you up and refresh you!" + if("icetea") + icon_state = "icedteaglass" + name = "Iced Tea" + desc = "All natural, antioxidant-rich flavour sensation." + if("coffee") + icon_state = "glass_brown" + name = "Glass of coffee" + desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." + if("tea") + icon_state = "teaglass" + name = "Glass of tea" + desc = "Drinking it from here would not seem right." + if("bilk") + icon_state = "glass_brown" + name = "Glass of bilk" + desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." + if("fuel") + icon_state = "dr_gibb_glass" + name = "Glass of welder fuel" + desc = "Unless you are an industrial tool, this is probably not safe for consumption." + else + icon_state ="glass_brown" + name = "Glass of ..what?" + desc = "You can't really tell what this is." + else + icon_state = "glass_empty" + name = "Drinking glass" + desc = "Your standard drinking glass" + return // for /obj/machinery/vending/sovietsoda /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/soda diff --git a/code/modules/food&drinks/food/condiment.dm b/code/modules/food&drinks/food/condiment.dm index 9433751e0be..ff7706eec96 100644 --- a/code/modules/food&drinks/food/condiment.dm +++ b/code/modules/food&drinks/food/condiment.dm @@ -118,15 +118,15 @@ desc = "Used in cooking various dishes." icon_state = "enzyme" - New() - ..() - reagents.add_reagent("enzyme", 50) +/obj/item/weapon/reagent_containers/food/condiment/enzyme/New() + ..() + reagents.add_reagent("enzyme", 50) /obj/item/weapon/reagent_containers/food/condiment/sugar - New() - ..() - reagents.add_reagent("sugar", 50) +/obj/item/weapon/reagent_containers/food/condiment/sugar/New() + ..() + reagents.add_reagent("sugar", 50) /obj/item/weapon/reagent_containers/food/condiment/saltshaker //Seperate from above since it's a small shaker rather then name = "Salt Shaker" // a large one. @@ -136,9 +136,9 @@ amount_per_transfer_from_this = 1 volume = 20 - New() - ..() - reagents.add_reagent("sodiumchloride", 20) +/obj/item/weapon/reagent_containers/food/condiment/saltshaker/New() + ..() + reagents.add_reagent("sodiumchloride", 20) /obj/item/weapon/reagent_containers/food/condiment/peppermill name = "Pepper Mill" @@ -148,9 +148,9 @@ amount_per_transfer_from_this = 1 volume = 20 - New() - ..() - reagents.add_reagent("blackpepper", 20) +/obj/item/weapon/reagent_containers/food/condiment/peppermill/New() + ..() + reagents.add_reagent("blackpepper", 20) //Food packs. To easily apply deadly toxi... delicious sauces to your food! /obj/item/weapon/reagent_containers/food/condiment/pack diff --git a/code/modules/food&drinks/food/snacks.dm b/code/modules/food&drinks/food/snacks.dm index 6d3d4effe66..34625cda3fc 100644 --- a/code/modules/food&drinks/food/snacks.dm +++ b/code/modules/food&drinks/food/snacks.dm @@ -229,33 +229,36 @@ desc = "Probably too incredible for mortal men to fully enjoy." icon_state = "aesirsalad" trash = /obj/item/trash/snack_bowl - New() - ..() - eatverb = pick("crunch","devour","nibble","gnaw","gobble","chomp") - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("tricordrazine", 8) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/aesirsalad/New() + ..() + eatverb = pick("crunch","devour","nibble","gnaw","gobble","chomp") + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("tricordrazine", 8) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/herbsalad name = "herb salad" desc = "A tasty salad with apples on top." icon_state = "herbsalad" trash = /obj/item/trash/snack_bowl - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/herbsalad/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/validsalad name = "valid salad" desc = "It's just an herb salad with meatballs and fried potato slices. Nothing suspicious about it." icon_state = "validsalad" trash = /obj/item/trash/snack_bowl - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("doctorsdelight", 5) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/validsalad/New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("doctorsdelight", 5) + bitesize = 3 ////////////////////////////////////////////DONUTS//////////////////////////////////////////// @@ -266,49 +269,51 @@ /obj/item/weapon/reagent_containers/food/snacks/donut/normal desc = "Goes great with Robust Coffee." - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - src.bitesize = 3 - if(prob(30)) - src.icon_state = "donut2" - src.name = "frosted donut" - reagents.add_reagent("sprinkles", 2) + +/obj/item/weapon/reagent_containers/food/snacks/donut/normal/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sprinkles", 1) + src.bitesize = 3 + if(prob(30)) + src.icon_state = "donut2" + src.name = "frosted donut" + reagents.add_reagent("sprinkles", 2) /obj/item/weapon/reagent_containers/food/snacks/donut/chaos name = "chaos donut" desc = "Like life, it never quite tastes the same." - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("sprinkles", 1) - bitesize = 10 - switch(rand(1,10)) - if(1) - reagents.add_reagent("nutriment", 3) - if(2) - reagents.add_reagent("capsaicin", 3) - if(3) - reagents.add_reagent("frostoil", 3) - if(4) - reagents.add_reagent("sprinkles", 3) - if(5) - reagents.add_reagent("plasma", 3) - if(6) - reagents.add_reagent("coco", 3) - if(7) - reagents.add_reagent("slimejelly", 3) - if(8) - reagents.add_reagent("banana", 3) - if(9) - reagents.add_reagent("berryjuice", 3) - if(10) - reagents.add_reagent("tricordrazine", 3) - if(prob(30)) - icon_state = "donut2" - name = "frosted chaos donut" - reagents.add_reagent("sprinkles", 2) + +/obj/item/weapon/reagent_containers/food/snacks/donut/chaos/New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("sprinkles", 1) + bitesize = 10 + switch(rand(1,10)) + if(1) + reagents.add_reagent("nutriment", 3) + if(2) + reagents.add_reagent("capsaicin", 3) + if(3) + reagents.add_reagent("frostoil", 3) + if(4) + reagents.add_reagent("sprinkles", 3) + if(5) + reagents.add_reagent("plasma", 3) + if(6) + reagents.add_reagent("coco", 3) + if(7) + reagents.add_reagent("slimejelly", 3) + if(8) + reagents.add_reagent("banana", 3) + if(9) + reagents.add_reagent("berryjuice", 3) + if(10) + reagents.add_reagent("tricordrazine", 3) + if(prob(30)) + icon_state = "donut2" + name = "frosted chaos donut" + reagents.add_reagent("sprinkles", 2) /obj/item/weapon/reagent_containers/food/snacks/donut/jelly @@ -316,46 +321,49 @@ desc = "You jelly?" icon_state = "jdonut1" bitesize = 5 - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - reagents.add_reagent("berryjuice", 5) - if(prob(30)) - icon_state = "jdonut2" - name = "Frosted Jelly Donut" - reagents.add_reagent("sprinkles", 2) + +/obj/item/weapon/reagent_containers/food/snacks/donut/jelly/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sprinkles", 1) + reagents.add_reagent("berryjuice", 5) + if(prob(30)) + icon_state = "jdonut2" + name = "Frosted Jelly Donut" + reagents.add_reagent("sprinkles", 2) /obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly name = "jelly donut" desc = "You jelly?" icon_state = "jdonut1" bitesize = 5 - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - reagents.add_reagent("slimejelly", 5) - bitesize = 5 - if(prob(30)) - icon_state = "jdonut2" - name = "Frosted Jelly Donut" - reagents.add_reagent("sprinkles", 2) + +/obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sprinkles", 1) + reagents.add_reagent("slimejelly", 5) + bitesize = 5 + if(prob(30)) + icon_state = "jdonut2" + name = "Frosted Jelly Donut" + reagents.add_reagent("sprinkles", 2) /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly name = "jelly donut" desc = "You jelly?" icon_state = "jdonut1" bitesize = 5 - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - reagents.add_reagent("cherryjelly", 5) - if(prob(30)) - icon_state = "jdonut2" - name = "Frosted Jelly Donut" - reagents.add_reagent("sprinkles", 2) + +/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sprinkles", 1) + reagents.add_reagent("cherryjelly", 5) + if(prob(30)) + icon_state = "jdonut2" + name = "Frosted Jelly Donut" + reagents.add_reagent("sprinkles", 2) ////////////////////////////////////////////WAFFLES//////////////////////////////////////////// @@ -364,41 +372,45 @@ desc = "Mmm, waffles." icon_state = "waffles" trash = /obj/item/trash/waffles - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/waffles/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/soylentgreen name = "\improper Soylent Green" desc = "Not made of people. Honest." //Totally people. icon_state = "soylent_green" trash = /obj/item/trash/waffles - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/soylentgreen/New() + ..() + reagents.add_reagent("nutriment", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/soylenviridians name = "\improper Soylent Virdians" desc = "Not made of people. Honest." //Actually honest for once. icon_state = "soylent_yellow" trash = /obj/item/trash/waffles - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/soylenviridians/New() + ..() + reagents.add_reagent("nutriment", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/rofflewaffles name = "roffle waffles" desc = "Waffles from Roffle. Co." icon_state = "rofflewaffles" trash = /obj/item/trash/waffles - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("mushroomhallucinogen", 8) - bitesize = 4 + +/obj/item/weapon/reagent_containers/food/snacks/rofflewaffles/New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("mushroomhallucinogen", 8) + bitesize = 4 ////////////////////////////////////////////FISH//////////////////////////////////////////// @@ -407,23 +419,25 @@ desc = "A grifftastic sandwich that burns your tongue and then leaves it numb!" icon_state = "cubancarp" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("carpotoxin", 3) - reagents.add_reagent("capsaicin", 3) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/cubancarp/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("carpotoxin", 3) + reagents.add_reagent("capsaicin", 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/carpmeat name = "carp fillet" desc = "A fillet of spess carp meat." icon_state = "fishfillet" - New() - ..() - eatverb = pick("bite","chew","choke down","gnaw","swallow","chomp") - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("carpotoxin", 3) - bitesize = 6 + +/obj/item/weapon/reagent_containers/food/snacks/carpmeat/New() + ..() + eatverb = pick("bite","chew","choke down","gnaw","swallow","chomp") + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("carpotoxin", 3) + bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/carpmeat/imitation name = "imitation carp fillet" @@ -433,21 +447,23 @@ name = "fish fingers" desc = "A finger of fish." icon_state = "fishfingers" - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("carpotoxin", 3) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/fishfingers/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("carpotoxin", 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/fishandchips name = "fish and chips" desc = "I do say so myself chap." icon_state = "fishandchips" - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("carpotoxin", 3) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/fishandchips/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("carpotoxin", 3) + bitesize = 3 ////////////////////////////////////////////EGGS//////////////////////////////////////////// @@ -455,41 +471,43 @@ name = "chocolate egg" desc = "Such, sweet, fattening food." icon_state = "chocolateegg" - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("sugar", 2) - reagents.add_reagent("coco", 2) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/chocolateegg/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("sugar", 2) + reagents.add_reagent("coco", 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/egg name = "egg" desc = "An egg!" icon_state = "egg" - New() + +/obj/item/weapon/reagent_containers/food/snacks/egg/New() + ..() + reagents.add_reagent("nutriment", 1) + +/obj/item/weapon/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom) + ..() + new/obj/effect/decal/cleanable/egg_smudge(src.loc) + reagents.reaction(hit_atom, TOUCH) + del(src) // Not qdel, because it'll hit other mobs then the floor for runtimes. + +/obj/item/weapon/reagent_containers/food/snacks/egg/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype( W, /obj/item/toy/crayon )) + var/obj/item/toy/crayon/C = W + var/clr = C.colourName + + if(!(clr in list("blue", "green", "mime", "orange", "purple", "rainbow", "red", "yellow"))) + usr << "[src] refuses to take on this colour!" + return + + usr << "You colour [src] [clr]." + icon_state = "egg-[clr]" + item_color = clr + else ..() - reagents.add_reagent("nutriment", 1) - - throw_impact(atom/hit_atom) - ..() - new/obj/effect/decal/cleanable/egg_smudge(src.loc) - reagents.reaction(hit_atom, TOUCH) - del(src) // Not qdel, because it'll hit other mobs then the floor for runtimes. - - attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype( W, /obj/item/toy/crayon )) - var/obj/item/toy/crayon/C = W - var/clr = C.colourName - - if(!(clr in list("blue", "green", "mime", "orange", "purple", "rainbow", "red", "yellow"))) - usr << "[src] refuses to take on this colour!" - return - - usr << "You colour [src] [clr]." - icon_state = "egg-[clr]" - item_color = clr - else - ..() /obj/item/weapon/reagent_containers/food/snacks/egg/blue icon_state = "egg-blue" @@ -527,20 +545,22 @@ name = "fried egg" desc = "A fried egg, with a touch of salt and pepper." icon_state = "friedegg" - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("sodiumchloride", 1) - reagents.add_reagent("blackpepper", 1) - bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/friedegg/New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("sodiumchloride", 1) + reagents.add_reagent("blackpepper", 1) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/boiledegg name = "boiled egg" desc = "A hard boiled egg." icon_state = "egg" - New() - ..() - reagents.add_reagent("nutriment", 2) + +/obj/item/weapon/reagent_containers/food/snacks/boiledegg/New() + ..() + reagents.add_reagent("nutriment", 2) /obj/item/weapon/reagent_containers/food/snacks/omelette //FUCK THIS name = "omelette du fromage" @@ -548,33 +568,34 @@ icon_state = "omelette" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 1 +/obj/item/weapon/reagent_containers/food/snacks/omelette/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 1 - attackby(obj/item/weapon/W, mob/user) - if(istype(W,/obj/item/weapon/kitchen/utensil/fork)) - if(W.icon_state == "forkloaded") - user << "You already have omelette on your fork." - return - W.icon_state = "forkloaded" - user.visible_message( \ - "[user] takes a piece of omelette with their fork!", \ - "You take a piece of omelette with your fork!" \ - ) - reagents.remove_reagent("nutriment", 1) - if(reagents.total_volume <= 0) - qdel(src) +/obj/item/weapon/reagent_containers/food/snacks/omelette/attackby(obj/item/weapon/W, mob/user) + if(istype(W,/obj/item/weapon/kitchen/utensil/fork)) + if(W.icon_state == "forkloaded") + user << "You already have omelette on your fork." + return + W.icon_state = "forkloaded" + user.visible_message( \ + "[user] takes a piece of omelette with their fork!", \ + "You take a piece of omelette with your fork!" \ + ) + reagents.remove_reagent("nutriment", 1) + if(reagents.total_volume <= 0) + qdel(src) /obj/item/weapon/reagent_containers/food/snacks/benedict name = "eggs benedict" desc = "There is only one egg on this, how rude." icon_state = "benedict" - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/benedict/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 3 ////////////////////////////////////////////MUFFINS//////////////////////////////////////////// @@ -582,10 +603,11 @@ name = "muffin" desc = "A delicious and spongy little cake." icon_state = "muffin" - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/muffin/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/muffin/berry name = "berry muffin" @@ -605,40 +627,44 @@ desc = "Nougat love it or hate it." icon_state = "candy" trash = /obj/item/trash/candy - New() - ..() - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("sugar", 3) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/candy/New() + ..() + reagents.add_reagent("nutriment", 1) + reagents.add_reagent("sugar", 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/candy_corn name = "candy corn" desc = "It's a handful of candy corn. Can be stored in a detective's hat." icon_state = "candy_corn" - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("sugar", 2) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/candy_corn/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("sugar", 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/chips name = "chips" desc = "Commander Riker's What-The-Crisps" icon_state = "chips" trash = /obj/item/trash/chips - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/chips/New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/cookie name = "cookie" desc = "COOKIE!!!" icon_state = "COOKIE!!!" - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/cookie/New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/chocolatebar name = "chocolate bar" @@ -646,17 +672,18 @@ icon_state = "chocolatebarunwrapped" wrapped = 0 bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sugar", 2) - reagents.add_reagent("coco", 2) - attack_self(mob/user) - if(wrapped) - Unwrap(user) - else - ..() +/obj/item/weapon/reagent_containers/food/snacks/chocolatebar/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sugar", 2) + reagents.add_reagent("coco", 2) + +/obj/item/weapon/reagent_containers/food/snacks/chocolatebar/attack_self(mob/user) + if(wrapped) + Unwrap(user) + else + ..() /obj/item/weapon/reagent_containers/food/snacks/chocolatebar/proc/Unwrap(mob/user) icon_state = "chocolatebarunwrapped" @@ -674,153 +701,170 @@ name = "tofu" desc = "We all love tofu." icon_state = "tofu" - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/tofu/New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice name = "huge mushroom slice" desc = "A slice from a huge mushroom." icon_state = "hugemushroomslice" - New() - ..() - reagents.add_reagent("nutriment", 3) - src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice/New() + ..() + reagents.add_reagent("nutriment", 3) + src.bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/tomatomeat name = "tomato slice" desc = "A slice from a huge tomato." icon_state = "tomatomeat" - New() - ..() - reagents.add_reagent("nutriment", 3) - src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/tomatomeat/New() + ..() + reagents.add_reagent("nutriment", 3) + src.bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/bearmeat name = "bear meat" desc = "A very manly slab of meat." icon_state = "bearmeat" - New() - ..() - reagents.add_reagent("nutriment", 12) - reagents.add_reagent("hyperzine", 5) - src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/bearmeat/New() + ..() + reagents.add_reagent("nutriment", 12) + reagents.add_reagent("hyperzine", 5) + src.bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/xenomeat name = "meat" desc = "A slab of meat" icon_state = "xenomeat" - New() - ..() - reagents.add_reagent("nutriment", 3) - src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/xenomeat/New() + ..() + reagents.add_reagent("nutriment", 3) + src.bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/spidermeat name = "spider meat" desc = "A slab of spider meat." icon_state = "spidermeat" - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("toxin", 3) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/spidermeat/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("toxin", 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/spiderleg name = "spider leg" desc = "A still twitching leg of a giant spider... you don't really want to eat this, do you?" icon_state = "spiderleg" - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("toxin", 2) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/spiderleg/New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("toxin", 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cornedbeef name = "corned beef and cabbage" desc = "Now you can feel like a real tourist vacationing in Ireland." icon_state = "cornedbeef" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/cornedbeef/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/faggot name = "faggot" desc = "A great meal all round. Not a cord of wood." icon_state = "faggot" - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/faggot/New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sausage name = "sausage" desc = "A piece of mixed, long meat." icon_state = "sausage" - New() - ..() - eatverb = pick("bite","chew","nibble","deep throat","gobble","chomp") - reagents.add_reagent("nutriment", 6) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sausage/New() + ..() + eatverb = pick("bite","chew","nibble","deep throat","gobble","chomp") + reagents.add_reagent("nutriment", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/donkpocket name = "\improper Donk-pocket" desc = "The food of choice for the seasoned traitor." icon_state = "donkpocket" - New() - ..() - reagents.add_reagent("nutriment", 4) - var/warm = 0 - proc/cooltime() //Not working, derp? - if(warm) - spawn(4200) //ew - warm = 0 - reagents.del_reagent("tricordrazine") - name = initial(name) - return + +/obj/item/weapon/reagent_containers/food/snacks/donkpocket/New() + ..() + reagents.add_reagent("nutriment", 4) + + + +/obj/item/weapon/reagent_containers/food/snacks/donkpocket/proc/cooltime() //Not working, derp? + if(warm) + spawn(4200) //ew + warm = 0 + reagents.del_reagent("tricordrazine") + name = initial(name) + return /obj/item/weapon/reagent_containers/food/snacks/wingfangchu name = "wing fang chu" desc = "A savory dish of alien wing wang in soy." icon_state = "wingfangchu" trash = /obj/item/trash/snack_bowl - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/wingfangchu/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/human/kebab name = "-kebab" icon_state = "kebab" desc = "A human meat, on a stick." trash = /obj/item/stack/rods - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/human/kebab/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/monkeykebab name = "meat-kebab" icon_state = "kebab" desc = "Delicious meat, on a stick." trash = /obj/item/stack/rods - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/monkeykebab/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tofukebab name = "tofu-kebab" icon_state = "kebab" desc = "Vegan meat, on a stick." trash = /obj/item/stack/rods - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/tofukebab/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/popcorn name = "popcorn" @@ -828,18 +872,20 @@ icon_state = "popcorn" trash = /obj/item/trash/popcorn var/unpopped = 0 - New() - ..() - eatverb = pick("bite","crunch","nibble","gnaw","gobble","chomp") - unpopped = rand(1,10) - reagents.add_reagent("nutriment", 2) - bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0 - On_Consume() - if(prob(unpopped)) //lol ...what's the point? << AINT SO POINTLESS NO MORE - usr << "\red You bite down on an un-popped kernel, and it hurts your teeth!" - unpopped = max(0, unpopped-1) - reagents.add_reagent("sacid",0.1) //only a little tingle. - ..() + +/obj/item/weapon/reagent_containers/food/snacks/popcorn/New() + ..() + eatverb = pick("bite","crunch","nibble","gnaw","gobble","chomp") + unpopped = rand(1,10) + reagents.add_reagent("nutriment", 2) + bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0 + +/obj/item/weapon/reagent_containers/food/snacks/popcorn/On_Consume() + if(prob(unpopped)) //lol ...what's the point? << AINT SO POINTLESS NO MORE + usr << "You bite down on an un-popped kernel, and it hurts your teeth!" + unpopped = max(0, unpopped-1) + reagents.add_reagent("sacid",0.1) //only a little tingle. + ..() /obj/item/weapon/reagent_containers/food/snacks/sosjerky @@ -847,153 +893,168 @@ icon_state = "sosjerky" desc = "Beef jerky made from the finest space cows." trash = /obj/item/trash/sosjerky - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sosjerky/New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/no_raisin name = "4no raisins" icon_state = "4no_raisins" desc = "Best raisins in the universe. Not sure why." trash = /obj/item/trash/raisins - New() - ..() - reagents.add_reagent("nutriment", 6) + +/obj/item/weapon/reagent_containers/food/snacks/no_raisin/New() + ..() + reagents.add_reagent("nutriment", 6) /obj/item/weapon/reagent_containers/food/snacks/spacetwinkie name = "space twinkie" icon_state = "space_twinkie" desc = "Guaranteed to survive longer than you will." - New() - ..() - reagents.add_reagent("sugar", 4) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie/New() + ..() + reagents.add_reagent("sugar", 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers name = "cheesie honkers" desc = "Bite sized cheesie snacks that will honk all over your mouth." icon_state = "cheesie_honkers" trash = /obj/item/trash/cheesie - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers/New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/syndicake name = "syndi-cakes" icon_state = "syndi_cakes" desc = "An extremely moist snack cake that tastes just as good after being nuked." trash = /obj/item/trash/syndi_cakes - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("doctorsdelight", 5) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/syndicake/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("doctorsdelight", 5) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato name = "loaded baked potato" desc = "Totally baked." icon_state = "loadedbakedpotato" - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/fries name = "space fries" desc = "AKA: French Fries, Freedom Fries, etc." icon_state = "fries" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/fries/New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/soydope name = "soy dope" desc = "Dope from a soy." icon_state = "soydope" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/soydope/New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheesyfries name = "cheesy fries" desc = "Fries. Covered in cheese. Duh." icon_state = "cheesyfries" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/cheesyfries/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/fortunecookie name = "fortune cookie" desc = "A true prophecy in each cookie!" icon_state = "fortune_cookie" - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/fortunecookie/New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/badrecipe name = "burned mess" desc = "Someone should be demoted from chef for this." icon_state = "badrecipe" - New() - ..() - eatverb = pick("choke down","nibble","gnaw","chomp") - reagents.add_reagent("toxin", 1) - reagents.add_reagent("carbon", 3) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/badrecipe/New() + ..() + eatverb = pick("choke down","nibble","gnaw","chomp") + reagents.add_reagent("toxin", 1) + reagents.add_reagent("carbon", 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatsteak name = "meat steak" desc = "A piece of hot spicy meat." icon_state = "meatsteak" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("sodiumchloride", 1) - reagents.add_reagent("blackpepper", 1) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/meatsteak/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("sodiumchloride", 1) + reagents.add_reagent("blackpepper", 1) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff name = "spacy liberty duff" desc = "Jello gelatin, from Alfred Hubbard's cookbook." icon_state = "spacylibertyduff" trash = /obj/item/trash/snack_bowl - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("mushroomhallucinogen", 6) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("mushroomhallucinogen", 6) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/amanitajelly name = "amanita jelly" desc = "Looks curiously toxic." icon_state = "amanitajelly" trash = /obj/item/trash/snack_bowl - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("amatoxin", 6) - reagents.add_reagent("mushroomhallucinogen", 3) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/amanitajelly/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("amatoxin", 6) + reagents.add_reagent("mushroomhallucinogen", 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/poppypretzel name = "poppy pretzel" desc = "It's all twisted up!" icon_state = "poppypretzel" bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/poppypretzel/New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 2 /* No more of this /obj/item/weapon/reagent_containers/food/snacks/telebacon @@ -1002,14 +1063,15 @@ icon_state = "bacon" var/obj/item/device/radio/beacon/bacon/baconbeacon bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 4) - baconbeacon = new /obj/item/device/radio/beacon/bacon(src) - On_Consume() - if(!reagents.total_volume) - baconbeacon.loc = usr - baconbeacon.digest_delay() + +/obj/item/weapon/reagent_containers/food/snacks/telebacon/New() + ..() + reagents.add_reagent("nutriment", 4) + baconbeacon = new /obj/item/device/radio/beacon/bacon(src) +/obj/item/weapon/reagent_containers/food/snacks/telebacon/On_Consume() + if(!reagents.total_volume) + baconbeacon.loc = usr + baconbeacon.digest_delay() */ /obj/item/weapon/reagent_containers/food/snacks/monkeycube @@ -1019,33 +1081,33 @@ bitesize = 12 wrapped = 0 - New() - ..() - reagents.add_reagent("nutriment",10) +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/New() + ..() + reagents.add_reagent("nutriment",10) - afterattack(obj/O, mob/user,proximity) - if(!proximity) return - if(istype(O,/obj/structure/sink) && !wrapped) - user << "You place [src] under a stream of water..." - user.drop_item() - loc = get_turf(O) - return Expand() - ..() +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/afterattack(obj/O, mob/user,proximity) + if(!proximity) return + if(istype(O,/obj/structure/sink) && !wrapped) + user << "You place [src] under a stream of water..." + user.drop_item() + loc = get_turf(O) + return Expand() + ..() - attack_self(mob/user) - if(wrapped) - Unwrap(user) +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/attack_self(mob/user) + if(wrapped) + Unwrap(user) - proc/Expand() - visible_message("[src] expands!") - new /mob/living/carbon/monkey(get_turf(src)) - qdel(src) +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Expand() + visible_message("[src] expands!") + new /mob/living/carbon/monkey(get_turf(src)) + qdel(src) - proc/Unwrap(mob/user) - icon_state = "monkeycube" - desc = "Just add water!" - user << "You unwrap the cube." - wrapped = 0 +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Unwrap(mob/user) + icon_state = "monkeycube" + desc = "Just add water!" + user << "You unwrap the cube." + wrapped = 0 /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped @@ -1057,112 +1119,122 @@ name = "enchiladas" desc = "Viva La Mexico!" icon_state = "enchiladas" - New() - ..() - reagents.add_reagent("nutriment",8) - reagents.add_reagent("capsaicin", 6) - bitesize = 4 + +/obj/item/weapon/reagent_containers/food/snacks/enchiladas/New() + ..() + reagents.add_reagent("nutriment",8) + reagents.add_reagent("capsaicin", 6) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/stew name = "stew" desc = "A nice and warm stew. Healthy and strong." icon_state = "stew" trash = /obj/item/trash/snack_bowl - New() - ..() - eatverb = pick("slurp","sip","suck","inhale","drink") - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("tomatojuice", 5) - reagents.add_reagent("imidazoline", 5) - reagents.add_reagent("water", 5) - bitesize = 10 + +/obj/item/weapon/reagent_containers/food/snacks/stew/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") + reagents.add_reagent("nutriment", 10) + reagents.add_reagent("tomatojuice", 5) + reagents.add_reagent("imidazoline", 5) + reagents.add_reagent("water", 5) + bitesize = 10 /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat name = "stewed soy meat" desc = "Even non-vegetarians will LOVE this!" icon_state = "stewedsoymeat" trash = /obj/item/trash/plate - New() - ..() - eatverb = pick("slurp","sip","suck","inhale","drink") - reagents.add_reagent("nutriment", 8) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") + reagents.add_reagent("nutriment", 8) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/carrotfries name = "carrot fries" desc = "Tasty fries from fresh Carrots." icon_state = "carrotfries" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("imidazoline", 3) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/carrotfries/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("imidazoline", 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/candiedapple name = "candied apple" desc = "An apple coated in sugary sweetness." icon_state = "candiedapple" - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/candiedapple/New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 3 /* /obj/item/weapon/reagent_containers/food/snacks/boiledslimecore name = "Boiled slime Core" desc = "A boiled red thing." icon_state = "boiledslimecore" - New() - ..() - reagents.add_reagent("slimejelly", 5) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/boiledslimecore/New() + ..() + reagents.add_reagent("slimejelly", 5) + bitesize = 3 */ /obj/item/weapon/reagent_containers/food/snacks/mint name = "mint" desc = "it is only wafer thin." icon_state = "mint" - New() - ..() - reagents.add_reagent("minttoxin", 1) - bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/mint/New() + ..() + reagents.add_reagent("minttoxin", 1) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit name = "plump helmet biscuit" desc = "This is a finely-prepared plump helmet biscuit. The ingredients are exceptionally minced plump helmet, and well-minced dwarven wheat flour." icon_state = "phelmbiscuit" - New() - ..() - if(prob(10)) - name = "exceptional plump helmet biscuit" - desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("tricordrazine", 5) - bitesize = 2 - else - reagents.add_reagent("nutriment", 5) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit/New() + ..() + if(prob(10)) + name = "exceptional plump helmet biscuit" + desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("tricordrazine", 5) + bitesize = 2 + else + reagents.add_reagent("nutriment", 5) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/chawanmushi name = "chawanmushi" desc = "A legendary egg custard that makes friends out of enemies. Probably too hot for a cat to eat." icon_state = "chawanmushi" trash = /obj/item/trash/snack_bowl - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/chawanmushi/New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/appletart name = "golden apple streusel tart" desc = "A tasty dessert that won't make it through a metal detector." icon_state = "gappletart" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("gold", 5) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/appletart/New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("gold", 5) + bitesize = 3 /////////////////////////////////////////////////Sliceable//////////////////////////////////////// // All the food items that can be sliced into smaller bits like Meatbread and Cheesewheels @@ -1193,10 +1265,11 @@ icon_state = "cheesewheel" slice_path = /obj/item/weapon/reagent_containers/food/snacks/cheesewedge slices_num = 5 - New() - ..() - reagents.add_reagent("nutriment", 20) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel/New() + ..() + reagents.add_reagent("nutriment", 20) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheesewedge name = "cheese wedge" @@ -1215,9 +1288,9 @@ desc = "It's a salted cracker." icon_state = "cracker" - New() - ..() - reagents.add_reagent("nutriment", 1) +/obj/item/weapon/reagent_containers/food/snacks/cracker/New() + ..() + reagents.add_reagent("nutriment", 1) ////////////////////////////////FOOD ADDITIONS//////////////////////////////////////////// @@ -1226,88 +1299,97 @@ name = "egg wrap" desc = "The precursor to Pigs in a Blanket." icon_state = "wrap" - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/wrap/New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/beans name = "tin of beans" desc = "Musical fruit in a slightly less musical container." icon_state = "beans" - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/beans/New() + ..() + reagents.add_reagent("nutriment", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/hotdog name = "hotdog" desc = "Fresh footlong ready to go down on." icon_state = "hotdog" - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("ketchup", 3) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/hotdog/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("ketchup", 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/meatbun name = "meat bun" desc = "Has the potential to not be Dog." icon_state = "meatbun" - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 6 + +/obj/item/weapon/reagent_containers/food/snacks/meatbun/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/sugarcookie name = "sugar cookie" desc = "Just like your little sister used to make." icon_state = "sugarcookie" - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("sugar", 5) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sugarcookie/New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("sugar", 5) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/boiledspiderleg name = "boiled spider leg" desc = "A giant spider's leg that's still twitching after being cooked. Gross!" icon_state = "spiderlegcooked" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("toxin", 2) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/boiledspiderleg/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("toxin", 2) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/spidereggs name = "spider eggs" desc = "A cluster of juicy spider eggs. A great side dish for when you care not for your health." icon_state = "spidereggs" - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("toxin", 3) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/spidereggs/New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("toxin", 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/spidereggsham name = "green eggs and ham" desc = "Would you eat them on a train? Would you eat them on a plane? Would you eat them on a state of the art corporate deathtrap floating through space?" icon_state = "spidereggsham" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("sodiumchloride", 1) - reagents.add_reagent("toxin", 3) - bitesize = 4 + +/obj/item/weapon/reagent_containers/food/snacks/spidereggsham/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("sodiumchloride", 1) + reagents.add_reagent("toxin", 3) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/sashimi name = "carp sashimi" desc = "Celebrate surviving attack from hostile alien lifeforms by hospitalising yourself." icon_state = "sashimi" - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("toxin", 5) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/sashimi/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("toxin", 5) + bitesize = 3 diff --git a/code/modules/food&drinks/food/snacks/meat.dm b/code/modules/food&drinks/food/snacks/meat.dm index d35e905f857..91b2c27b243 100644 --- a/code/modules/food&drinks/food/snacks/meat.dm +++ b/code/modules/food&drinks/food/snacks/meat.dm @@ -3,10 +3,11 @@ desc = "A slab of meat" icon_state = "meat" dried_type = /obj/item/weapon/reagent_containers/food/snacks/sosjerky - New() - ..() - reagents.add_reagent("nutriment", 3) - src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/meat/New() + ..() + reagents.add_reagent("nutriment", 3) + src.bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh @@ -18,6 +19,47 @@ var/subjectname = "" var/subjectjob = null +/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/slime + icon_state = "slimemeat" + desc = "Because jello wasn't offensive enough to vegans" + New() + ..() + reagents.add_reagent("slimejelly", 3) + +/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/golem + icon_state = "golemmeat" + desc = "Edible rocks, welcome to the future" + New() + ..() + reagents.add_reagent("iron", 3) + +/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/golem/adamantine + icon_state = "agolemmeat" + desc = "From the slime pen to the rune to the kitchen, science" + +/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/lizard + icon_state = "lizardmeat" + desc = "Delicious dino damage" + +/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/plant + icon_state = "plantmeat" + desc = "All the joys of healthy eating with all the fun of cannibalism" + +/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/shadow + icon_state = "shadowmeat" + desc = "Ow, the edge" + +/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/fly + icon_state = "flymeat" + desc = "Nothing says tasty like maggot filled radioactive mutant flesh" + New() + ..() + reagents.add_reagent("uranium", 3) + +/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/skeleton + name = "-bone" + icon_state = "skeletonmeat" + desc = "There's a point where this needs to stop and clearly we have passed it" /obj/item/weapon/reagent_containers/food/snacks/meat/monkey //same as plain meat diff --git a/code/modules/food&drinks/food/snacks_bread.dm b/code/modules/food&drinks/food/snacks_bread.dm index 01f8b0c2744..793dd7f1e9f 100644 --- a/code/modules/food&drinks/food/snacks_bread.dm +++ b/code/modules/food&drinks/food/snacks_bread.dm @@ -5,10 +5,11 @@ icon_state = "meatbread" slice_path = /obj/item/weapon/reagent_containers/food/snacks/meatbreadslice slices_num = 5 - New() - ..() - reagents.add_reagent("nutriment", 30) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/store/meatbread/New() + ..() + reagents.add_reagent("nutriment", 30) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatbreadslice name = "meatbread slice" @@ -23,10 +24,11 @@ icon_state = "xenomeatbread" slice_path = /obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice slices_num = 5 - New() - ..() - reagents.add_reagent("nutriment", 30) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/store/xenomeatbread/New() + ..() + reagents.add_reagent("nutriment", 30) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice name = "xenomeatbread slice" @@ -41,11 +43,12 @@ icon_state = "spidermeatbread" slice_path = /obj/item/weapon/reagent_containers/food/snacks/spidermeatbreadslice slices_num = 5 - New() - ..() - reagents.add_reagent("nutriment", 30) - reagents.add_reagent("toxin", 15) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/store/spidermeatbread/New() + ..() + reagents.add_reagent("nutriment", 30) + reagents.add_reagent("toxin", 15) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/spidermeatbreadslice name = "spider meat bread slice" @@ -53,9 +56,10 @@ icon_state = "xenobreadslice" trash = /obj/item/trash/plate bitesize = 2 - New() - ..() - reagents.add_reagent("toxin", 2) + +/obj/item/weapon/reagent_containers/food/snacks/spidermeatbreadslice/New() + ..() + reagents.add_reagent("toxin", 2) /obj/item/weapon/reagent_containers/food/snacks/sliceable/store/bananabread name = "banana-nut bread" @@ -63,11 +67,12 @@ icon_state = "bananabread" slice_path = /obj/item/weapon/reagent_containers/food/snacks/bananabreadslice slices_num = 5 - New() - ..() - reagents.add_reagent("banana", 20) - reagents.add_reagent("nutriment", 20) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/store/bananabread/New() + ..() + reagents.add_reagent("banana", 20) + reagents.add_reagent("nutriment", 20) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bananabreadslice name = "banana-nut bread slice" @@ -82,10 +87,11 @@ icon_state = "tofubread" slice_path = /obj/item/weapon/reagent_containers/food/snacks/tofubreadslice slices_num = 5 - New() - ..() - reagents.add_reagent("nutriment", 30) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/store/tofubread/New() + ..() + reagents.add_reagent("nutriment", 30) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tofubreadslice name = "tofubread slice" @@ -100,10 +106,11 @@ icon_state = "bread" slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice slices_num = 5 - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/store/bread/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/breadslice name = "bread slice" @@ -119,10 +126,11 @@ icon_state = "creamcheesebread" slice_path = /obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice slices_num = 5 - New() - ..() - reagents.add_reagent("nutriment", 20) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/store/creamcheesebread/New() + ..() + reagents.add_reagent("nutriment", 20) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice name = "cream cheese bread slice" @@ -135,9 +143,10 @@ name = "baguette" desc = "Bon appetit!" icon_state = "baguette" - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("blackpepper", 1) - reagents.add_reagent("sodiumchloride", 1) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/baguette/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("blackpepper", 1) + reagents.add_reagent("sodiumchloride", 1) + bitesize = 3 diff --git a/code/modules/food&drinks/food/snacks_burgers.dm b/code/modules/food&drinks/food/snacks_burgers.dm index cd707375e7b..268f0502894 100644 --- a/code/modules/food&drinks/food/snacks_burgers.dm +++ b/code/modules/food&drinks/food/snacks_burgers.dm @@ -2,10 +2,11 @@ name = "burger" desc = "The cornerstone of every nutritious breakfast." icon_state = "hburger" - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/burger/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/burger/human var/hname = "" @@ -22,10 +23,11 @@ name = "fillet -o- carp sandwich" desc = "Almost like a carp is yelling somewhere... Give me back that fillet -o- carp, give me that carp." icon_state = "fishburger" - New() - ..() - reagents.add_reagent("carpotoxin", 3) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/burger/fish/New() + ..() + reagents.add_reagent("carpotoxin", 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/burger/tofu name = "tofu burger" @@ -36,27 +38,30 @@ name = "roburger" desc = "The lettuce is the only organic component. Beep." icon_state = "roburger" - New() - ..() - reagents.add_reagent("nanites", 2) + +/obj/item/weapon/reagent_containers/food/snacks/burger/roburger/New() + ..() + reagents.add_reagent("nanites", 2) /obj/item/weapon/reagent_containers/food/snacks/burger/roburgerbig name = "roburger" desc = "This massive patty looks like poison. Beep." icon_state = "roburger" volume = 106 - New() - ..() - reagents.add_reagent("nanites", 100) - bitesize = 0.1 + +/obj/item/weapon/reagent_containers/food/snacks/burger/roburgerbig/New() + ..() + reagents.add_reagent("nanites", 100) + bitesize = 0.1 /obj/item/weapon/reagent_containers/food/snacks/burger/xeno name = "xenoburger" desc = "Smells caustic. Tastes like heresy." icon_state = "xburger" - New() - ..() - reagents.add_reagent("nutriment", 2) + +/obj/item/weapon/reagent_containers/food/snacks/burger/xeno/New() + ..() + reagents.add_reagent("nutriment", 2) /obj/item/weapon/reagent_containers/food/snacks/burger/clown name = "clown burger" @@ -72,9 +77,10 @@ name = "brainburger" desc = "A strange looking burger. It looks almost sentient." icon_state = "brainburger" - New() - ..() - reagents.add_reagent("alkysine", 6) + +/obj/item/weapon/reagent_containers/food/snacks/burger/brain/New() + ..() + reagents.add_reagent("alkysine", 6) /obj/item/weapon/reagent_containers/food/snacks/burger/ghost name = "ghost burger" @@ -86,60 +92,66 @@ desc = "Perfect for hiding the fact it's burnt to a crisp." icon_state = "cburger" color = "#DA0000FF" - New() - ..() - reagents.add_reagent("redcrayonpowder", 10) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/burger/red/New() + ..() + reagents.add_reagent("redcrayonpowder", 10) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/burger/orange name = "orange burger" desc = "Contains 0% juice." icon_state = "cburger" color = "#FF9300FF" - New() - ..() - reagents.add_reagent("orangecrayonpowder", 10) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/burger/orange/New() + ..() + reagents.add_reagent("orangecrayonpowder", 10) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/burger/yellow name = "yellow burger" desc = "Bright to the last bite." icon_state = "cburger" color = "#FFF200FF" - New() - ..() - reagents.add_reagent("yellowcrayonpowder", 10) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/burger/yellow/New() + ..() + reagents.add_reagent("yellowcrayonpowder", 10) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/burger/green name = "green burger" desc = "It's not tainted meat, it's painted meat!" icon_state = "cburger" color = "#A8E61DFF" - New() - ..() - reagents.add_reagent("greencrayonpowder", 10) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/burger/green/New() + ..() + reagents.add_reagent("greencrayonpowder", 10) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/burger/blue name = "blue burger" desc = "Is this blue rare?" icon_state = "cburger" color = "#00B7EFFF" - New() - ..() - reagents.add_reagent("bluecrayonpowder", 10) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/burger/blue/New() + ..() + reagents.add_reagent("bluecrayonpowder", 10) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/burger/purple name = "purple burger" desc = "Regal and low class at the same time." icon_state = "cburger" color = "#DA00FFFF" - New() - ..() - reagents.add_reagent("purplecrayonpowder", 10) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/burger/purple/New() + ..() + reagents.add_reagent("purplecrayonpowder", 10) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/burger/spell name = "spell burger" @@ -150,31 +162,31 @@ name = "big bite burger" desc = "Forget the Big Mac. THIS is the future!" icon_state = "bigbiteburger" - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/burger/bigbite/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/burger/jelly name = "jelly burger" desc = "Culinary delight..?" icon_state = "jellyburger" -/obj/item/weapon/reagent_containers/food/snacks/burger/jelly/slime - New() - ..() - reagents.add_reagent("slimejelly", 5) +/obj/item/weapon/reagent_containers/food/snacks/burger/jelly/slime/New() + ..() + reagents.add_reagent("slimejelly", 5) -/obj/item/weapon/reagent_containers/food/snacks/burger/jelly/cherry - New() - ..() - reagents.add_reagent("cherryjelly", 5) +/obj/item/weapon/reagent_containers/food/snacks/burger/jelly/cherry/New() + ..() + reagents.add_reagent("cherryjelly", 5) /obj/item/weapon/reagent_containers/food/snacks/burger/superbite name = "super bite burger" desc = "This is a mountain of a burger. FOOD!" icon_state = "superbiteburger" - New() - ..() - reagents.add_reagent("nutriment", 40) - bitesize = 10 + +/obj/item/weapon/reagent_containers/food/snacks/burger/superbite/New() + ..() + reagents.add_reagent("nutriment", 40) + bitesize = 10 diff --git a/code/modules/food&drinks/food/snacks_cake.dm b/code/modules/food&drinks/food/snacks_cake.dm index 208e034a4ab..76163b4723b 100644 --- a/code/modules/food&drinks/food/snacks_cake.dm +++ b/code/modules/food&drinks/food/snacks_cake.dm @@ -5,11 +5,12 @@ icon_state = "carrotcake" slice_path = /obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice slices_num = 5 - New() - ..() - reagents.add_reagent("nutriment", 25) - reagents.add_reagent("imidazoline", 10) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/store/carrotcake/New() + ..() + reagents.add_reagent("nutriment", 25) + reagents.add_reagent("imidazoline", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice name = "carrot cake slice" @@ -24,11 +25,12 @@ icon_state = "braincake" slice_path = /obj/item/weapon/reagent_containers/food/snacks/braincakeslice slices_num = 5 - New() - ..() - reagents.add_reagent("nutriment", 25) - reagents.add_reagent("alkysine", 10) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/store/braincake/New() + ..() + reagents.add_reagent("nutriment", 25) + reagents.add_reagent("alkysine", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/braincakeslice name = "brain cake slice" @@ -43,10 +45,11 @@ icon_state = "cheesecake" slice_path = /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice slices_num = 5 - New() - ..() - reagents.add_reagent("nutriment", 25) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/store/cheesecake/New() + ..() + reagents.add_reagent("nutriment", 25) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice name = "cheese cake slice" @@ -61,9 +64,10 @@ icon_state = "plaincake" slice_path = /obj/item/weapon/reagent_containers/food/snacks/plaincakeslice slices_num = 5 - New() - ..() - reagents.add_reagent("nutriment", 20) + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/store/plaincake/New() + ..() + reagents.add_reagent("nutriment", 20) /obj/item/weapon/reagent_containers/food/snacks/plaincakeslice name = "vanilla cake slice" @@ -78,9 +82,10 @@ icon_state = "orangecake" slice_path = /obj/item/weapon/reagent_containers/food/snacks/orangecakeslice slices_num = 5 - New() - ..() - reagents.add_reagent("nutriment", 20) + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/store/orangecake/New() + ..() + reagents.add_reagent("nutriment", 20) /obj/item/weapon/reagent_containers/food/snacks/orangecakeslice name = "orange cake slice" @@ -95,9 +100,10 @@ icon_state = "limecake" slice_path = /obj/item/weapon/reagent_containers/food/snacks/limecakeslice slices_num = 5 - New() - ..() - reagents.add_reagent("nutriment", 20) + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/store/limecake/New() + ..() + reagents.add_reagent("nutriment", 20) /obj/item/weapon/reagent_containers/food/snacks/limecakeslice name = "lime cake slice" @@ -112,9 +118,10 @@ icon_state = "lemoncake" slice_path = /obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice slices_num = 5 - New() - ..() - reagents.add_reagent("nutriment", 20) + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/store/lemoncake/New() + ..() + reagents.add_reagent("nutriment", 20) /obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice name = "lemon cake slice" @@ -129,9 +136,10 @@ icon_state = "chocolatecake" slice_path = /obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice slices_num = 5 - New() - ..() - reagents.add_reagent("nutriment", 20) + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/store/chocolatecake/New() + ..() + reagents.add_reagent("nutriment", 20) /obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice name = "chocolate cake slice" @@ -146,11 +154,12 @@ icon_state = "birthdaycake" slice_path = /obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice slices_num = 5 - New() - ..() - reagents.add_reagent("nutriment", 20) - reagents.add_reagent("sprinkles", 10) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/store/birthdaycake/New() + ..() + reagents.add_reagent("nutriment", 20) + reagents.add_reagent("sprinkles", 10) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice name = "birthday cake slice" @@ -165,9 +174,10 @@ icon_state = "applecake" slice_path = /obj/item/weapon/reagent_containers/food/snacks/applecakeslice slices_num = 5 - New() - ..() - reagents.add_reagent("nutriment", 15) + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/store/applecake/New() + ..() + reagents.add_reagent("nutriment", 15) /obj/item/weapon/reagent_containers/food/snacks/applecakeslice name = "apple cake slice" diff --git a/code/modules/food&drinks/food/snacks_pies.dm b/code/modules/food&drinks/food/snacks_pies.dm index 095ed99c971..7cb7c79d9a7 100644 --- a/code/modules/food&drinks/food/snacks_pies.dm +++ b/code/modules/food&drinks/food/snacks_pies.dm @@ -4,11 +4,12 @@ desc = "Just like back home, on clown planet! HONK!" icon_state = "pie" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("banana",5) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/pie/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("banana",5) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/pie/throw_impact(atom/hit_atom) ..() @@ -21,86 +22,94 @@ desc = "No black birds, this is a good sign." icon_state = "berryclafoutis" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("berryjuice", 5) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/berryclafoutis/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("berryjuice", 5) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/meatpie name = "meat-pie" icon_state = "meatpie" desc = "An old barber recipe, very delicious!" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/meatpie/New() + ..() + reagents.add_reagent("nutriment", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tofupie name = "tofu-pie" icon_state = "meatpie" desc = "A delicious tofu pie." trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/tofupie/New() + ..() + reagents.add_reagent("nutriment", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/amanita_pie name = "amanita pie" desc = "Sweet and tasty poison pie." icon_state = "amanita_pie" - New() - ..() - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("amatoxin", 3) - reagents.add_reagent("mushroomhallucinogen", 1) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/amanita_pie/New() + ..() + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("amatoxin", 3) + reagents.add_reagent("mushroomhallucinogen", 1) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/plump_pie name = "plump pie" desc = "I bet you love stuff made out of plump helmets!" icon_state = "plump_pie" - New() - ..() - if(prob(10)) - name = "exceptional plump pie" - desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("tricordrazine", 5) - bitesize = 2 - else - reagents.add_reagent("nutriment", 8) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/plump_pie/New() + ..() + if(prob(10)) + name = "exceptional plump pie" + desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("tricordrazine", 5) + bitesize = 2 + else + reagents.add_reagent("nutriment", 8) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/xemeatpie name = "xeno-pie" icon_state = "xenomeatpie" desc = "A delicious meatpie. Probably heretical." trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/xemeatpie/New() + ..() + reagents.add_reagent("nutriment", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/applepie name = "apple pie" desc = "A pie containing sweet sweet love...or apple." icon_state = "applepie" - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/applepie/New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/cherrypie name = "cherry pie" desc = "Taste so good, make a grown man cry." icon_state = "cherrypie" - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/cherrypie/New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie name = "pumpkin pie" @@ -108,9 +117,10 @@ icon_state = "pumpkinpie" slice_path = /obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice slices_num = 5 - New() - ..() - reagents.add_reagent("nutriment", 15) + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie/New() + ..() + reagents.add_reagent("nutriment", 15) /obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice name = "pumpkin pie slice" diff --git a/code/modules/food&drinks/food/snacks_pizza.dm b/code/modules/food&drinks/food/snacks_pizza.dm index d3096addb0b..f8e003172dd 100644 --- a/code/modules/food&drinks/food/snacks_pizza.dm +++ b/code/modules/food&drinks/food/snacks_pizza.dm @@ -10,11 +10,12 @@ icon_state = "pizzamargherita" slice_path = /obj/item/weapon/reagent_containers/food/snacks/margheritaslice slices_num = 6 - New() - ..() - reagents.add_reagent("nutriment", 40) - reagents.add_reagent("tomatojuice", 6) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita/New() + ..() + reagents.add_reagent("nutriment", 40) + reagents.add_reagent("tomatojuice", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/margheritaslice name = "margherita slice" @@ -28,11 +29,12 @@ icon_state = "meatpizza" slice_path = /obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice slices_num = 6 - New() - ..() - reagents.add_reagent("nutriment", 50) - reagents.add_reagent("tomatojuice", 6) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza/New() + ..() + reagents.add_reagent("nutriment", 50) + reagents.add_reagent("tomatojuice", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice name = "meatpizza slice" @@ -46,10 +48,11 @@ icon_state = "mushroompizza" slice_path = /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice slices_num = 6 - New() - ..() - reagents.add_reagent("nutriment", 35) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza/New() + ..() + reagents.add_reagent("nutriment", 35) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice name = "mushroom pizza slice" @@ -63,12 +66,13 @@ icon_state = "vegetablepizza" slice_path = /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice slices_num = 6 - New() - ..() - reagents.add_reagent("nutriment", 30) - reagents.add_reagent("tomatojuice", 6) - reagents.add_reagent("imidazoline", 12) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza/New() + ..() + reagents.add_reagent("nutriment", 30) + reagents.add_reagent("tomatojuice", 6) + reagents.add_reagent("imidazoline", 12) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice name = "vegetable pizza slice" diff --git a/code/modules/food&drinks/food/snacks_sandwichtoast.dm b/code/modules/food&drinks/food/snacks_sandwichtoast.dm index ee45942cb46..7ca43af1f4a 100644 --- a/code/modules/food&drinks/food/snacks_sandwichtoast.dm +++ b/code/modules/food&drinks/food/snacks_sandwichtoast.dm @@ -4,97 +4,101 @@ desc = "A grand creation of meat, cheese, bread, and several leaves of lettuce! Arthur Dent would be proud." icon_state = "sandwich" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sandwich/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/toastedsandwich name = "toasted sandwich" desc = "Now if you only had a pepper bar." icon_state = "toastedsandwich" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("carbon", 2) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/toastedsandwich/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("carbon", 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/grilledcheese name = "grilled cheese sandwich" desc = "Goes great with Tomato soup!" icon_state = "toastedsandwich" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 7) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/grilledcheese/New() + ..() + reagents.add_reagent("nutriment", 7) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/jellysandwich name = "jelly sandwich" desc = "You wish you had some peanut butter to go with this..." icon_state = "jellysandwich" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 3 -/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime - New() - ..() - reagents.add_reagent("slimejelly", 5) +/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 3 -/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry - New() - ..() - reagents.add_reagent("cherryjelly", 5) +/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime/New() + ..() + reagents.add_reagent("slimejelly", 5) + +/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry/New() + ..() + reagents.add_reagent("cherryjelly", 5) /obj/item/weapon/reagent_containers/food/snacks/icecreamsandwich name = "icecream sandwich" desc = "Portable Ice-cream in it's own packaging." icon_state = "icecreamsandwich" - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("ice", 2) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/icecreamsandwich/New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("ice", 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/notasandwich name = "not-a-sandwich" desc = "Something seems to be wrong with this, you can't quite figure what. Maybe it's his moustache." icon_state = "notasandwich" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/notasandwich/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast name = "jellied toast" desc = "A slice of bread covered with delicious jam." icon_state = "jellytoast" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 1) - bitesize = 3 -/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/cherry - New() - ..() - reagents.add_reagent("cherryjelly", 5) +/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/New() + ..() + reagents.add_reagent("nutriment", 1) + bitesize = 3 -/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/slime - New() - ..() - reagents.add_reagent("slimejelly", 5) +/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/cherry/New() + ..() + reagents.add_reagent("cherryjelly", 5) + +/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/slime/New() + ..() + reagents.add_reagent("slimejelly", 5) /obj/item/weapon/reagent_containers/food/snacks/twobread name = "two bread" desc = "This seems awfully bitter." icon_state = "twobread" - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/twobread/New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 3 diff --git a/code/modules/food&drinks/food/snacks_soup.dm b/code/modules/food&drinks/food/snacks_soup.dm index f0e471f02e5..05bf0568838 100644 --- a/code/modules/food&drinks/food/snacks_soup.dm +++ b/code/modules/food&drinks/food/snacks_soup.dm @@ -4,144 +4,153 @@ desc = "You've got balls kid, BALLS!" icon_state = "meatballsoup" trash = /obj/item/trash/snack_bowl - New() - ..() - eatverb = pick("slurp","sip","suck","inhale","drink") - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("water", 5) - bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/meatballsoup/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("water", 5) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/slimesoup name = "slime soup" desc = "If no water is available, you may substitute tears." icon_state = "slimesoup" - New() - ..() - eatverb = pick("slurp","sip","suck","inhale","drink") - reagents.add_reagent("slimejelly", 5) - reagents.add_reagent("water", 10) - bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/slimesoup/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") + reagents.add_reagent("slimejelly", 5) + reagents.add_reagent("water", 10) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/bloodsoup name = "tomato soup" desc = "Smells like copper." icon_state = "tomatosoup" - New() - ..() - eatverb = pick("slurp","sip","suck","inhale","drink") - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("blood", 10) - reagents.add_reagent("water", 5) - bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/bloodsoup/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("blood", 10) + reagents.add_reagent("water", 5) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/clownstears name = "clown's tears" desc = "Not very funny." icon_state = "clownstears" - New() - ..() - eatverb = pick("slurp","sip","suck","inhale","drink") - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("banana", 5) - reagents.add_reagent("water", 10) - bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/clownstears/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("banana", 5) + reagents.add_reagent("water", 10) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/vegetablesoup name = "vegetable soup" desc = "A true vegan meal." icon_state = "vegetablesoup" trash = /obj/item/trash/snack_bowl - New() - ..() - eatverb = pick("slurp","sip","suck","inhale","drink") - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("water", 5) - bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/vegetablesoup/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("water", 5) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/nettlesoup name = "nettle soup" desc = "To think, the botanist would've beat you to death with one of these." icon_state = "nettlesoup" trash = /obj/item/trash/snack_bowl - New() - ..() - eatverb = pick("slurp","sip","suck","inhale","drink") - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("water", 5) - reagents.add_reagent("tricordrazine", 5) - bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/nettlesoup/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("water", 5) + reagents.add_reagent("tricordrazine", 5) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/mysterysoup name = "mystery soup" desc = "The mystery is, why aren't you eating it?" icon_state = "mysterysoup" trash = /obj/item/trash/snack_bowl - New() - ..() - eatverb = pick("slurp","sip","suck","inhale","drink") - switch(rand(1,10)) - if(1) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("capsaicin", 3) - reagents.add_reagent("tomatojuice", 2) - if(2) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("frostoil", 3) - reagents.add_reagent("tomatojuice", 2) - if(3) - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("water", 5) - reagents.add_reagent("tricordrazine", 5) - if(4) - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("water", 10) - if(5) - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("banana", 10) - if(6) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("blood", 10) - if(7) - reagents.add_reagent("slimejelly", 10) - reagents.add_reagent("water", 10) - if(8) - reagents.add_reagent("carbon", 10) - reagents.add_reagent("toxin", 10) - if(9) - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("tomatojuice", 10) - if(10) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("tomatojuice", 5) - reagents.add_reagent("imidazoline", 5) - bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/mysterysoup/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") + switch(rand(1,10)) + if(1) + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("capsaicin", 3) + reagents.add_reagent("tomatojuice", 2) + if(2) + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("frostoil", 3) + reagents.add_reagent("tomatojuice", 2) + if(3) + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("water", 5) + reagents.add_reagent("tricordrazine", 5) + if(4) + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("water", 10) + if(5) + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("banana", 10) + if(6) + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("blood", 10) + if(7) + reagents.add_reagent("slimejelly", 10) + reagents.add_reagent("water", 10) + if(8) + reagents.add_reagent("carbon", 10) + reagents.add_reagent("toxin", 10) + if(9) + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("tomatojuice", 10) + if(10) + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("tomatojuice", 5) + reagents.add_reagent("imidazoline", 5) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/wishsoup name = "wish soup" desc = "I wish this was soup." icon_state = "wishsoup" trash = /obj/item/trash/snack_bowl - New() - ..() - eatverb = pick("slurp","sip","suck","inhale","drink") - reagents.add_reagent("water", 10) - bitesize = 5 - if(prob(25)) - desc = "A wish come true!" - reagents.add_reagent("nutriment", 8) + +/obj/item/weapon/reagent_containers/food/snacks/wishsoup/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") + reagents.add_reagent("water", 10) + bitesize = 5 + if(prob(25)) + desc = "A wish come true!" + reagents.add_reagent("nutriment", 8) /obj/item/weapon/reagent_containers/food/snacks/hotchili name = "hot chili" desc = "A five alarm Texan Chili!" icon_state = "hotchili" trash = /obj/item/trash/snack_bowl - New() - ..() - eatverb = pick("slurp","sip","suck","inhale","drink") - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("capsaicin", 3) - reagents.add_reagent("tomatojuice", 2) - bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/hotchili/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("capsaicin", 3) + reagents.add_reagent("tomatojuice", 2) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/coldchili @@ -149,70 +158,76 @@ desc = "This slush is barely a liquid!" icon_state = "coldchili" trash = /obj/item/trash/snack_bowl - New() - ..() - eatverb = pick("slurp","sip","suck","inhale","drink") - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("frostoil", 3) - reagents.add_reagent("tomatojuice", 2) - bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/coldchili/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("frostoil", 3) + reagents.add_reagent("tomatojuice", 2) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/monkeysdelight name = "monkey's delight" desc = "A delicious soup with dumplings and hunks of monkey meat simmered to perfection, in a broth that tastes faintly of bananas." icon_state = "monkeysdelight" trash = /obj/item/trash/snack_bowl - New() - ..() - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("banana", 5) - reagents.add_reagent("blackpepper", 1) - reagents.add_reagent("sodiumchloride", 1) - bitesize = 6 + +/obj/item/weapon/reagent_containers/food/snacks/monkeysdelight/New() + ..() + reagents.add_reagent("nutriment", 10) + reagents.add_reagent("banana", 5) + reagents.add_reagent("blackpepper", 1) + reagents.add_reagent("sodiumchloride", 1) + bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/tomatosoup name = "tomato soup" desc = "Drinking this feels like being a vampire! A tomato vampire..." icon_state = "tomatosoup" trash = /obj/item/trash/snack_bowl - New() - ..() - eatverb = pick("slurp","sip","suck","inhale","drink") - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("tomatojuice", 10) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/tomatosoup/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("tomatojuice", 10) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/milosoup name = "milosoup" desc = "The universes best soup! Yum!!!" icon_state = "milosoup" trash = /obj/item/trash/snack_bowl - New() - ..() - eatverb = pick("slurp","sip","suck","inhale","drink") - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("water", 5) - bitesize = 4 + +/obj/item/weapon/reagent_containers/food/snacks/milosoup/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("water", 5) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/mushroomsoup name = "chantrelle soup" desc = "A delicious and hearty mushroom soup." icon_state = "mushroomsoup" trash = /obj/item/trash/snack_bowl - New() - ..() - eatverb = pick("slurp","sip","suck","inhale","drink") - reagents.add_reagent("nutriment", 8) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/mushroomsoup/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") + reagents.add_reagent("nutriment", 8) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/beetsoup name = "beet soup" desc = "Wait, how do you spell it again..?" icon_state = "beetsoup" trash = /obj/item/trash/snack_bowl - New() - ..() - eatverb = pick("slurp","sip","suck","inhale","drink") - name = pick("borsch","bortsch","borstch","borsh","borshch","borscht") - reagents.add_reagent("nutriment", 8) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/beetsoup/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") + name = pick("borsch","bortsch","borstch","borsh","borshch","borscht") + reagents.add_reagent("nutriment", 8) + bitesize = 2 diff --git a/code/modules/food&drinks/food/snacks_spaghetti.dm b/code/modules/food&drinks/food/snacks_spaghetti.dm index 7d3b013aeee..5b73364e628 100644 --- a/code/modules/food&drinks/food/snacks_spaghetti.dm +++ b/code/modules/food&drinks/food/snacks_spaghetti.dm @@ -3,68 +3,75 @@ name = "spaghetti" desc = "Now that's a nic'e pasta!" icon_state = "spaghetti" - New() - ..() - reagents.add_reagent("nutriment", 1) - bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/spaghetti/New() + ..() + reagents.add_reagent("nutriment", 1) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti name = "boiled spaghetti" desc = "A plain dish of noodles, this sucks." icon_state = "spaghettiboiled" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti/New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/pastatomato name = "spaghetti" desc = "Spaghetti and crushed tomatoes. Just like your abusive father used to make!" icon_state = "pastatomato" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("tomatojuice", 10) - bitesize = 4 + +/obj/item/weapon/reagent_containers/food/snacks/pastatomato/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("tomatojuice", 10) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/copypasta name = "copypasta" desc = "You probably shouldn't try this, you always hear people talking about how bad it is..." icon_state = "copypasta" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 12) - reagents.add_reagent("tomatojuice", 20) - bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/copypasta/New() + ..() + reagents.add_reagent("nutriment", 12) + reagents.add_reagent("tomatojuice", 20) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/meatballspaghetti name = "spaghetti and meatballs" desc = "Now that's a nic'e meatball!" icon_state = "meatballspaghetti" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/meatballspaghetti/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/spesslaw name = "spesslaw" desc = "A lawyers favourite." icon_state = "spesslaw" - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/spesslaw/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/eggplantparm name = "eggplant parmigiana" desc = "The only good recipe for eggplant." icon_state = "eggplantparm" trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/eggplantparm/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 diff --git a/code/modules/food&drinks/kitchen machinery/gibber.dm b/code/modules/food&drinks/kitchen machinery/gibber.dm index c948602119b..c43c4bec814 100644 --- a/code/modules/food&drinks/kitchen machinery/gibber.dm +++ b/code/modules/food&drinks/kitchen machinery/gibber.dm @@ -9,6 +9,7 @@ var/operating = 0 //Is it on? var/dirty = 0 // Does it need cleaning? var/gibtime = 40 // Time from starting until meat appears + var/typeofmeat = /obj/item/weapon/reagent_containers/food/snacks/meat/ use_power = 1 idle_power_usage = 2 active_power_usage = 500 @@ -17,31 +18,30 @@ /obj/machinery/gibber/autogibber var/turf/input_plate - New() - ..() - spawn(5) - for(var/i in cardinal) - var/obj/machinery/mineral/input/input_obj = locate( /obj/machinery/mineral/input, get_step(src.loc, i) ) - if(input_obj) - if(isturf(input_obj.loc)) - input_plate = input_obj.loc - qdel(input_obj) - break +/obj/machinery/gibber/autogibber/New() + ..() + spawn(5) + for(var/i in cardinal) + var/obj/machinery/mineral/input/input_obj = locate( /obj/machinery/mineral/input, get_step(src.loc, i) ) + if(input_obj) + if(isturf(input_obj.loc)) + input_plate = input_obj.loc + qdel(input_obj) + break - if(!input_plate) - diary << "a [src] didn't find an input plate." - return + if(!input_plate) + diary << "a [src] didn't find an input plate." + return - Bumped(var/atom/A) - if(!input_plate) return +/obj/machinery/gibber/autogibber/Bumped(var/atom/A) + if(!input_plate) return - if(ismob(A)) - var/mob/M = A + if(ismob(A)) + var/mob/M = A - if(M.loc == input_plate - ) - M.loc = src - M.gib() + if(M.loc == input_plate) + M.loc = src + M.gib() /obj/machinery/gibber/New() @@ -72,29 +72,29 @@ if(stat & (NOPOWER|BROKEN)) return if(operating) - user << "\red It's locked and running" + user << "It's locked and running." return else src.startgibbing(user) /obj/machinery/gibber/attackby(obj/item/weapon/grab/G as obj, mob/user as mob) if(src.occupant) - user << "\red The gibber is full, empty it first!" + user << "The gibber is full, empty it first!" return if(default_unfasten_wrench(user, G)) return if (!( istype(G, /obj/item/weapon/grab)) || !(istype(G.affecting, /mob/living/carbon/human))) - user << "\red This item is not suitable for the gibber!" + user << "This item is not suitable for the gibber!" return if(G.affecting.abiotic(1)) - user << "\red Subject may not have abiotic items on." + user << "Subject may not have abiotic items on." return - user.visible_message("\red [user] starts to put [G.affecting] into the gibber!") + user.visible_message("[user] starts to put [G.affecting] into the gibber!") src.add_fingerprint(user) if(do_after(user, 30) && G && G.affecting && !occupant) - user.visible_message("\red [user] stuffs [G.affecting] into the gibber!") + user.visible_message("[user] stuffs [G.affecting] into the gibber!") var/mob/M = G.affecting if(M.client) M.client.perspective = EYE_PERSPECTIVE @@ -134,10 +134,10 @@ if(src.operating) return if(!src.occupant) - visible_message("\red You hear a loud metallic grinding sound.") + visible_message("You hear a loud metallic grinding sound.") return use_power(1000) - visible_message("\red You hear a loud squelchy grinding sound.") + visible_message("You hear a loud squelchy grinding sound.") src.operating = 1 update_icon() var/sourcename = src.occupant.real_name @@ -147,8 +147,15 @@ var/totalslabs = 3 var/obj/item/weapon/reagent_containers/food/snacks/meat/human/allmeat[totalslabs] + + if(ishuman(occupant)) + var/mob/living/carbon/human/gibee = occupant + if(gibee.dna && gibee.dna.species) + typeofmeat = gibee.dna.species.meat + else + typeofmeat = /obj/item/weapon/reagent_containers/food/snacks/meat/human for (var/i=1 to totalslabs) - var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new + var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new typeofmeat newmeat.name = sourcename + newmeat.name newmeat.subjectname = sourcename newmeat.subjectjob = sourcejob diff --git a/code/modules/food&drinks/kitchen machinery/icecream_vat.dm b/code/modules/food&drinks/kitchen machinery/icecream_vat.dm index cb949c00eec..e575d930dfd 100644 --- a/code/modules/food&drinks/kitchen machinery/icecream_vat.dm +++ b/code/modules/food&drinks/kitchen machinery/icecream_vat.dm @@ -177,7 +177,7 @@ var/list/ingredients_source = list( return if(href_list["dispense"]) dispense_flavour = text2num(href_list["dispense"]) - src.visible_message("\blue[usr] sets [src] to dispense [get_icecream_flavour_string(dispense_flavour)] flavoured icecream.") + src.visible_message("[usr] sets [src] to dispense [get_icecream_flavour_string(dispense_flavour)] flavoured icecream.") if(href_list["cone"]) var/dispense_cone = text2num(href_list["cone"]) diff --git a/code/modules/food&drinks/kitchen machinery/juicer.dm b/code/modules/food&drinks/kitchen machinery/juicer.dm index 2047c071103..80ba39354a3 100644 --- a/code/modules/food&drinks/kitchen machinery/juicer.dm +++ b/code/modules/food&drinks/kitchen machinery/juicer.dm @@ -162,20 +162,19 @@ if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume) break -/obj/structure/closet/crate/juice - New() - ..() - new/obj/machinery/juicer(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src) +/obj/structure/closet/crate/juice/New() + ..() + new/obj/machinery/juicer(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src) diff --git a/code/modules/food&drinks/kitchen machinery/microwave.dm b/code/modules/food&drinks/kitchen machinery/microwave.dm index cd06edeeeb7..76fa9c72d56 100644 --- a/code/modules/food&drinks/kitchen machinery/microwave.dm +++ b/code/modules/food&drinks/kitchen machinery/microwave.dm @@ -74,24 +74,24 @@ if(src.broken > 0) if(src.broken == 2 && istype(O, /obj/item/weapon/wirecutters)) // If it's broken and they're using a screwdriver user.visible_message( \ - "\blue [user] starts to fix part of the microwave.", \ - "\blue You start to fix part of the microwave." \ + "[user] starts to fix part of the microwave.", \ + "You start to fix part of the microwave." \ ) if (do_after(user,20)) user.visible_message( \ - "\blue [user] fixes part of the microwave.", \ - "\blue You have fixed part of the microwave." \ + "[user] fixes part of the microwave.", \ + "You have fixed part of the microwave." \ ) src.broken = 1 // Fix it a bit else if(src.broken == 1 && istype(O, /obj/item/weapon/weldingtool)) // If it's broken and they're doing the wrench user.visible_message( \ - "\blue [user] starts to fix part of the microwave.", \ - "\blue You start to fix part of the microwave." \ + "[user] starts to fix part of the microwave.", \ + "You start to fix part of the microwave." \ ) if (do_after(user,20)) user.visible_message( \ - "\blue [user] fixes the microwave.", \ - "\blue You have fixed the microwave." \ + "[user] fixes the microwave.", \ + "You have fixed the microwave." \ ) src.icon_state = "mw" src.broken = 0 // Fix it! @@ -99,7 +99,7 @@ src.flags = OPENCONTAINER return 0 //to use some fuel else - user << "\red It's broken!" + user << "It's broken!" return 1 else if(istype(O, /obj/item/weapon/reagent_containers/spray/)) var/obj/item/weapon/reagent_containers/spray/clean_spray = O @@ -107,8 +107,8 @@ clean_spray.reagents.remove_reagent("cleaner",clean_spray.amount_per_transfer_from_this,1) playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6) user.visible_message( \ - "\blue [user] has cleaned the microwave.", \ - "\blue You have cleaned the microwave." \ + "[user] has cleaned the microwave.", \ + "You have cleaned the microwave." \ ) src.dirty = 0 // It's clean! src.broken = 0 // just to be sure @@ -117,36 +117,36 @@ src.updateUsrDialog() return 1 // Disables the after-attack so we don't spray the floor/user. else - user << "\red You need more space cleaner!" + user << "You need more space cleaner!" return 1 else if(istype(O, /obj/item/weapon/soap/)) // If they're trying to clean it then let them user.visible_message( \ - "\blue [user] starts to clean the microwave.", \ - "\blue You start to clean the microwave." \ + "[user] starts to clean the microwave.", \ + "You start to clean the microwave." \ ) if (do_after(user,20)) user.visible_message( \ - "\blue [user] has cleaned the microwave.", \ - "\blue You have cleaned the microwave." \ + "[user] has cleaned the microwave.", \ + "You have cleaned the microwave." \ ) src.dirty = 0 // It's clean! src.broken = 0 // just to be sure src.icon_state = "mw" src.flags = OPENCONTAINER else if(src.dirty==100) // The microwave is all dirty so can't be used! - user << "\red It's dirty!" + user << "It's dirty!" return 1 else if(is_type_in_list(O,acceptable_items)) if (contents.len>=max_n_of_items) - user << "\red This [src] is full of ingredients, you cannot put more." + user << "This [src] is full of ingredients, you cannot put more." return 1 if (istype(O,/obj/item/stack) && O:amount>1) new O.type (src) O:use(1) user.visible_message( \ - "\blue [user] has added one of [O] to \the [src].", \ - "\blue You add one of [O] to \the [src].") + "[user] has added one of [O] to \the [src].", \ + "You add one of [O] to \the [src].") else // user.unEquip(O) //This just causes problems so far as I can tell. -Pete if(!user.drop_item()) @@ -154,8 +154,8 @@ return 0 O.loc = src user.visible_message( \ - "\blue [user] has added \the [O] to \the [src].", \ - "\blue You add \the [O] to \the [src].") + "[user] has added \the [O] to \the [src].", \ + "You add \the [O] to \the [src].") else if(istype(O,/obj/item/weapon/reagent_containers/glass) || \ istype(O,/obj/item/weapon/reagent_containers/food/drinks) || \ istype(O,/obj/item/weapon/reagent_containers/food/condiment) \ @@ -164,15 +164,15 @@ return 1 for (var/datum/reagent/R in O.reagents.reagent_list) if (!(R.id in acceptable_reagents)) - user << "\red Your [O] contains components unsuitable for cookery." + user << "Your [O] contains components unsuitable for cookery." return 1 //G.reagents.trans_to(src,G.amount_per_transfer_from_this) else if(istype(O,/obj/item/weapon/grab)) var/obj/item/weapon/grab/G = O - user << "\red This is ridiculous. You can not fit \the [G.affecting] in this [src]." + user << "This is ridiculous. You can not fit \the [G.affecting] in this [src]." return 1 else - user << "\red You have no idea what you can cook with this." + user << "You have no idea what you can cook with this." return 1 src.updateUsrDialog() @@ -334,7 +334,7 @@ return 0 /obj/machinery/microwave/proc/start() - src.visible_message("\blue The microwave turns on.", "\blue You hear a microwave.") + src.visible_message("The microwave turns on.", "You hear a microwave.") src.operating = 1 src.icon_state = "mw1" src.updateUsrDialog() @@ -356,7 +356,7 @@ if (src.reagents.total_volume) src.dirty++ src.reagents.clear_reagents() - usr << "\blue You dispose of the microwave contents." + usr << "You dispose of the microwave contents." src.updateUsrDialog() /obj/machinery/microwave/proc/muck_start() @@ -365,7 +365,7 @@ /obj/machinery/microwave/proc/muck_finish() playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) - src.visible_message("\red The microwave gets covered in muck!") + src.visible_message("The microwave gets covered in muck!") src.dirty = 100 // Make it dirty so it can't be used util cleaned src.flags = null //So you can't add condiments src.icon_state = "mwbloody" // Make it look dirty too @@ -377,7 +377,7 @@ s.set_up(2, 1, src) s.start() src.icon_state = "mwb" // Make it look all busted up and shit - src.visible_message("\red The microwave breaks!") //Let them know they're stupid + src.visible_message("The microwave breaks!") //Let them know they're stupid src.broken = 2 // Make it broken so it can't be used util fixed src.flags = null //So you can't add condiments src.operating = 0 // Turn it off again aferwards diff --git a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm b/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm index 0074715c335..9cb3864acc6 100644 --- a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm +++ b/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm @@ -24,29 +24,29 @@ if(istype(grabbed, /mob/living/carbon/monkey)) var/mob/living/carbon/monkey/target = grabbed if(target.stat == 0) - user << "\red The monkey is struggling far too much to put it in the recycler." + user << "The monkey is struggling far too much to put it in the recycler." else user.drop_item() qdel(target) - user << "\blue You stuff the monkey in the machine." + user << "You stuff the monkey in the machine." playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1) use_power(500) src.grinded++ - user << "\blue The machine now has [grinded] monkey\s worth of material stored." + user << "The machine now has [grinded] monkey\s worth of material stored." else - user << "\red The machine only accepts monkeys!" + user << "The machine only accepts monkeys!" return /obj/machinery/monkey_recycler/attack_hand(var/mob/user as mob) if (src.stat != 0) //NOPOWER etc return if(grinded >= 5) - user << "\blue The machine hisses loudly as it condenses the grinded monkey meat. After a moment, it dispenses a brand new monkey cube." + user << "The machine hisses loudly as it condenses the grinded monkey meat. After a moment, it dispenses a brand new monkey cube." playsound(src.loc, 'sound/machines/hiss.ogg', 50, 1) grinded -= 5 new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src.loc) - user << "\blue The machine's display flashes that it has [grinded] monkeys worth of material left." + user << "The machine's display flashes that it has [grinded] monkeys worth of material left." else - user << "\red The machine needs at least 5 monkeys worth of material to produce a monkey cube. It only has [grinded]." + user << "The machine needs at least 5 monkeys worth of material to produce a monkey cube. It only has [grinded]." return diff --git a/code/modules/food&drinks/kitchen machinery/processor.dm b/code/modules/food&drinks/kitchen machinery/processor.dm index 87d11a48a1a..7ec3d44356e 100644 --- a/code/modules/food&drinks/kitchen machinery/processor.dm +++ b/code/modules/food&drinks/kitchen machinery/processor.dm @@ -26,77 +26,74 @@ qdel(what) // Note to self: Make this safer /* objs */ - meat - input = /obj/item/weapon/reagent_containers/food/snacks/meat - output = /obj/item/weapon/reagent_containers/food/snacks/faggot +/datum/food_processor_process/meat + input = /obj/item/weapon/reagent_containers/food/snacks/meat + output = /obj/item/weapon/reagent_containers/food/snacks/faggot - potato - input = /obj/item/weapon/reagent_containers/food/snacks/grown/potato - output = /obj/item/weapon/reagent_containers/food/snacks/fries +/datum/food_processor_process/potato + input = /obj/item/weapon/reagent_containers/food/snacks/grown/potato + output = /obj/item/weapon/reagent_containers/food/snacks/fries - carrot - input = /obj/item/weapon/reagent_containers/food/snacks/grown/carrot - output = /obj/item/weapon/reagent_containers/food/snacks/carrotfries +/datum/food_processor_process/carrot + input = /obj/item/weapon/reagent_containers/food/snacks/grown/carrot + output = /obj/item/weapon/reagent_containers/food/snacks/carrotfries - soybeans - input = /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans - output = /obj/item/weapon/reagent_containers/food/snacks/soydope +/datum/food_processor_process/soybeans + input = /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans + output = /obj/item/weapon/reagent_containers/food/snacks/soydope - /* mobs */ - mob - process(loc, what) - ..() +/* mobs */ +/datum/food_processor_process/mob/process(loc, what) + ..() - slime +/datum/food_processor_process/mob/slime/process(loc, what) + var/mob/living/carbon/slime/S = what + var/C = S.cores + if(S.stat != DEAD) + S.loc = loc + S.visible_message("[C] crawls free of the processor!") + return + for(var/i = 1, i <= C, i++) + new S.coretype(loc) + feedback_add_details("slime_core_harvested","[replacetext(S.colour," ","_")]") + ..() - process(loc, what) +/datum/food_processor_process/mob/slime/input = /mob/living/carbon/slime +/datum/food_processor_process/mob/slime/output = null - var/mob/living/carbon/slime/S = what - var/C = S.cores - if(S.stat != DEAD) - S.loc = loc - S.visible_message("\blue [C] crawls free of the processor!") - return - for(var/i = 1, i <= C, i++) - new S.coretype(loc) - feedback_add_details("slime_core_harvested","[replacetext(S.colour," ","_")]") - ..() - input = /mob/living/carbon/slime - output = null - monkey - process(loc, what) - var/mob/living/carbon/monkey/O = what - if (O.client) //grief-proof - O.loc = loc - O.visible_message("\blue Suddenly [O] jumps out from the processor!", \ - "You jump out from the processor", \ - "You hear chimpering") - return - var/obj/item/weapon/reagent_containers/glass/bucket/bucket_of_blood = new(loc) - var/datum/reagent/blood/B = new() - B.holder = bucket_of_blood - B.volume = 70 - //set reagent data - B.data["donor"] = O +/datum/food_processor_process/mob/monkey/process(loc, what) + var/mob/living/carbon/monkey/O = what + if (O.client) //grief-proof + O.loc = loc + O.visible_message("Suddenly [O] jumps out from the processor!", \ + "You jump out from the processor", \ + "You hear chimpering") + return + var/obj/item/weapon/reagent_containers/glass/bucket/bucket_of_blood = new(loc) + var/datum/reagent/blood/B = new() + B.holder = bucket_of_blood + B.volume = 70 + //set reagent data + B.data["donor"] = O - for(var/datum/disease/D in O.viruses) - if(D.spread_type != SPECIAL) - B.data["viruses"] += D.Copy() - if(check_dna_integrity(O)) - B.data["blood_DNA"] = copytext(O.dna.unique_enzymes,1,0) + for(var/datum/disease/D in O.viruses) + if(D.spread_type != SPECIAL) + B.data["viruses"] += D.Copy() + if(check_dna_integrity(O)) + B.data["blood_DNA"] = copytext(O.dna.unique_enzymes,1,0) - if(O.resistances&&O.resistances.len) - B.data["resistances"] = O.resistances.Copy() - bucket_of_blood.reagents.reagent_list += B - bucket_of_blood.reagents.update_total() - bucket_of_blood.on_reagent_change() - //bucket_of_blood.reagents.handle_reactions() //blood doesn't react - ..() + if(O.resistances&&O.resistances.len) + B.data["resistances"] = O.resistances.Copy() + bucket_of_blood.reagents.reagent_list += B + bucket_of_blood.reagents.update_total() + bucket_of_blood.on_reagent_change() + //bucket_of_blood.reagents.handle_reactions() //blood doesn't react + ..() - input = /mob/living/carbon/monkey - output = null +/datum/food_processor_process/mob/monkey/input = /mob/living/carbon/monkey +/datum/food_processor_process/mob/monkey/output = null /obj/machinery/processor/proc/select_recipe(var/X) for (var/Type in typesof(/datum/food_processor_process) - /datum/food_processor_process - /datum/food_processor_process/mob) @@ -108,10 +105,10 @@ /obj/machinery/processor/attackby(var/obj/item/O as obj, var/mob/user as mob) if(src.processing) - user << "\red The processor is in the process of processing." + user << "The processor is in the process of processing." return 1 if(src.contents.len > 0) //TODO: several items at once? several different items? - user << "\red Something is already in the processing chamber." + user << "Something is already in the processing chamber." return 1 if(default_unfasten_wrench(user, O)) return @@ -122,7 +119,7 @@ var/datum/food_processor_process/P = select_recipe(what) if (!P) - user << "\red That probably won't blend." + user << "That probably won't blend." return 1 user.visible_message("[user] put [what] into [src].", \ "You put the [what] into [src].") @@ -134,10 +131,10 @@ if (src.stat != 0) //NOPOWER etc return if(src.processing) - user << "\red The processor is in the process of processing." + user << "The processor is in the process of processing." return 1 if(src.contents.len == 0) - user << "\red The processor is empty." + user << "The processor is empty." return 1 for(var/O in src.contents) var/datum/food_processor_process/P = select_recipe(O) @@ -145,7 +142,7 @@ log_admin("DEBUG: [O] in processor havent suitable recipe. How do you put it in?") //-rastaf0 continue src.processing = 1 - user.visible_message("\blue [user] turns on \a [src].", \ + user.visible_message("[user] turns on \a [src].", \ "You turn on \a [src].", \ "You hear a food processor") playsound(src.loc, 'sound/machines/blender.ogg', 50, 1) @@ -153,7 +150,7 @@ sleep(P.time) P.process(src.loc, O) src.processing = 0 - src.visible_message("\blue \the [src] finished processing.") + src.visible_message("\the [src] finished processing.") /obj/machinery/processor/verb/eject() set category = "Object" diff --git a/code/modules/food&drinks/recipes/microwave/recipes_burgers.dm b/code/modules/food&drinks/recipes/microwave/recipes_burgers.dm index b21eab3ead0..8823a0928f5 100644 --- a/code/modules/food&drinks/recipes/microwave/recipes_burgers.dm +++ b/code/modules/food&drinks/recipes/microwave/recipes_burgers.dm @@ -184,11 +184,11 @@ result = /obj/item/weapon/reagent_containers/food/snacks/burger/superbite /datum/recipe/burger/slime - reagents = list("slimejelly" = 5, "flour" = 15) + reagents = list("slimejelly" = 5, "flour" = 5) items = list() result = /obj/item/weapon/reagent_containers/food/snacks/burger/jelly/slime /datum/recipe/burger/jelly - reagents = list("cherryjelly" = 5, "flour" = 15) + reagents = list("cherryjelly" = 5, "flour" = 5) items = list() result = /obj/item/weapon/reagent_containers/food/snacks/burger/jelly/cherry diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index 964b6864c33..3a69a546cb7 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -138,7 +138,7 @@ /obj/item/weapon/grown/novaflower/attack(mob/living/carbon/M as mob, mob/user as mob) if(!..()) return if(istype(M, /mob/living)) - M << "\red You are heated by the warmth of the of the [name]!" + M << "You are heated by the warmth of the of the [name]!" M.bodytemperature += potency / 2 * TEMPERATURE_DAMAGE_COEFFICIENT /obj/item/weapon/grown/novaflower/afterattack(atom/A as mob|obj, mob/user as mob,proximity) @@ -152,7 +152,7 @@ /obj/item/weapon/grown/novaflower/pickup(mob/living/carbon/human/user as mob) if(!user.gloves) - user << "\red The [name] burns your bare hand!" + user << "The [name] burns your bare hand!" user.adjustFireLoss(rand(1, 5)) @@ -178,7 +178,7 @@ /obj/item/weapon/grown/nettle/pickup(mob/living/carbon/human/user as mob) if(!user.gloves) - user << "\red The nettle burns your bare hand!" + user << "The nettle burns your bare hand!" if(istype(user, /mob/living/carbon/human)) var/organ = ((user.hand ? "l_":"r_") + "arm") var/obj/item/organ/limb/affecting = user.get_organ(organ) @@ -210,7 +210,7 @@ /obj/item/weapon/grown/nettle/death seed = /obj/item/seeds/deathnettleseed name = "deathnettle" - desc = "The \red glowing \black nettle incites \red rage\black in you just from looking at it!" + desc = "The glowing \black nettle incites rage\black in you just from looking at it!" icon_state = "deathnettle" force = 30 throwforce = 15 @@ -232,12 +232,12 @@ user.take_organ_damage(0, force) if(prob(50)) user.Paralyse(5) - user << "\red You are stunned by the Deathnettle when you try picking it up!" + user << "You are stunned by the Deathnettle when you try picking it up!" /obj/item/weapon/grown/nettle/death/attack(mob/living/carbon/M as mob, mob/user as mob) if(!..()) return if(istype(M, /mob/living)) - M << "\red You are stunned by the powerful acid of the Deathnettle!" + M << "You are stunned by the powerful acid of the Deathnettle!" add_logs(user, M, "attacked", object= "[src.name]") M.eye_blurry += force/7 diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 3b2fc03923e..56c26ec1530 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -257,7 +257,7 @@ obj/machinery/hydroponics/update_icon() overlays += image('icons/obj/hydroponics.dmi', icon_state = "[myseed.species]-grow[myseed.growthstages]") // Same if(waterlevel <= 10) - overlays += image('icons/obj/hydroponics.dmi', icon_state =" over_lowwater3") + overlays += image('icons/obj/hydroponics.dmi', icon_state = "over_lowwater3") if(nutrilevel <= 2) overlays += image('icons/obj/hydroponics.dmi', icon_state = "over_lownutri3") if(health <= (myseed.endurance / 2)) @@ -839,6 +839,8 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) //dna stuff hardset_dna(podman, ui, se, null, null, null, !prob(potency) ? /datum/species/plant/pod : null, "#59CE00") //makes sure podman has dna and sets the dna's ui/se/mutantrace/real_name etc variables + podman.set_cloned_appearance() + else //else, one packet of seeds. maybe two var/seed_count = 1 if(prob(getYield() * 20)) diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index b4e341fb323..63454894ebb 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -3,7 +3,7 @@ /obj/machinery/mineral/ore_redemption name = "ore redemption machine" - desc = "A machine that accepts ore and instantly transforms it into workable material sheets, but cannot produce alloys such as Plasteel. Points for ore are generated based on type and can be redeemed at a mining equipment vendor." + desc = "A machine that accepts ore and instantly transforms it into workable material sheets. Points for ore are generated based on type and can be redeemed at a mining equipment vendor." icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "ore_redemption" density = 1 @@ -34,6 +34,11 @@ var/obj/item/stack/sheet/s = new processed_sheet(src,0) s.amount = 0 stack_list[processed_sheet] = s + if(s.name != "glass" && s.name != "metal") //we can get these from cargo anyway + var/msg = "[capitalize(s.name)] sheets are now available in the Cargo Bay." + for(var/obj/machinery/requests_console/D in allConsoles) + if(D.department == "Science" || D.department == "Robotics" || D.department == "Research Director's Desk" || (D.department == "Chemistry" && (s.name == "uranium" || s.name == "solid plasma"))) + D.createmessage("Ore Redemption Machine", "New minerals available!", msg, 1, 0) var/obj/item/stack/sheet/storage = stack_list[processed_sheet] storage.amount += 1 //Stack the sheets O.loc = null //Let the old sheet garbage collect @@ -113,6 +118,12 @@ if(s.amount > 0) dat += text("[capitalize(s.name)]: [s.amount] Release
    ") + if((/obj/item/stack/sheet/metal in stack_list) && (/obj/item/stack/sheet/mineral/plasma in stack_list)) + var/obj/item/stack/sheet/metalstack = stack_list[/obj/item/stack/sheet/metal] + var/obj/item/stack/sheet/plasmastack = stack_list[/obj/item/stack/sheet/mineral/plasma] + if(min(metalstack.amount, plasmastack.amount)) + dat += text("Plasteel Alloy (Metal + Plasma): Smelt
    ") + dat += text("
    Mineral Value List:
    [get_ore_values()]") user << browse("[dat]", "window=console_stacking_machine") @@ -161,6 +172,22 @@ unload_mineral(out) else usr << "Required access not found." + if(href_list["plasteel"] && istype(inserted_id)) + if(check_access(inserted_id)) + if(!(/obj/item/stack/sheet/metal in stack_list)) return + if(!(/obj/item/stack/sheet/mineral/plasma in stack_list)) return + var/obj/item/stack/sheet/metalstack = stack_list[/obj/item/stack/sheet/metal] + var/obj/item/stack/sheet/plasmastack = stack_list[/obj/item/stack/sheet/mineral/plasma] + + var/desired = input("How much?", "How much would you like to smelt?", 1) as num + var/obj/item/stack/sheet/plasteel/plasteelout = new + plasteelout.amount = min(desired,50,metalstack.amount,plasmastack.amount) + if(plasteelout.amount >= 1) + metalstack.amount -= plasteelout.amount + plasmastack.amount -= plasteelout.amount + unload_mineral(plasteelout) + else + usr << "Required access not found." updateUsrDialog() return @@ -268,7 +295,7 @@ usr.drop_item() I.loc = src inserted_id = I - else usr << "\red No valid ID." + else usr << "No valid ID." if(href_list["purchase"]) if(istype(inserted_id)) var/datum/data/mining_equipment/prize = locate(href_list["purchase"]) diff --git a/code/modules/mining/laborcamp/laborshuttle.dm b/code/modules/mining/laborcamp/laborshuttle.dm index d0fce36e488..49d287e75c0 100644 --- a/code/modules/mining/laborcamp/laborshuttle.dm +++ b/code/modules/mining/laborcamp/laborshuttle.dm @@ -17,6 +17,6 @@ if(href_list["move"]) var/datum/shuttle_manager/s = shuttles["laborcamp"] if(s.location == /area/shuttle/laborcamp/outpost) - usr << "\blue Shuttle is already at the outpost." + usr << "Shuttle is already at the outpost." return 0 ..() \ No newline at end of file diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index 334d71311e5..81c682355d5 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -3,7 +3,6 @@ /obj/machinery/mineral/labor_claim_console name = "point claim console" desc = "A stacking console with an electromagnetic writer, used to track ore mined by prisoners." - name = "stacking machine console" icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "console" density = 0 @@ -34,18 +33,14 @@ /obj/machinery/mineral/labor_claim_console/attack_hand(user as mob) - name = "point claim console" - icon = 'icons/obj/machines/mining_machines.dmi' - icon_state = "console" - desc = "A stacking console with an electromagnetic writer, used to track ore mined by prisoners." - density = 0 - anchored = 1 var/dat dat += text("Point Claim Console

    ") if(emagged) //Shit's broken dat += text("QU&#t0A In%aL*D
    ") else if(istype(inserted_id)) //There's an ID in there. - dat += text("[inserted_id.points] / [inserted_id.goal] collected. Eject ID.
    ") + dat += text("ID: [inserted_id.registered_name] Eject ID.
    ") + dat += text("Points Collected:[inserted_id.points]
    ") + dat += text("Point Quota: [inserted_id.goal ? inserted_id.goal : "Unlimited"] - Reach your quota to earn your release
    ") dat += text("Unclaimed Collection Points: [machine.points]. Claim points.
    ") else //No ID in sight. Complain about it. dat += text("No ID inserted. Insert ID.
    ") @@ -91,26 +86,31 @@ usr.drop_item() I.loc = src inserted_id = I - else usr << "\red No valid ID." + else usr << "Invalid ID." if(check_auth()) //Sanity check against hef spoofs if(href_list["choice"] == "station") var/datum/shuttle_manager/s = shuttles["laborcamp"] if(s.location == /area/shuttle/laborcamp/outpost) if(alone_in_area(get_area(loc), usr)) if (s.move_shuttle(0)) // No delay, to stop people from getting on while it is departing. - usr << "\blue Shuttle recieved message and will be sent shortly." + broadcast_hud_message("[inserted_id.registered_name] has met their quota and has returned to the station. Minerals and Prisoner ID card ready for retrieval.", src) + usr << "Shuttle recieved message and will be sent shortly." else - usr << "\blue Shuttle is already moving." + usr << "Shuttle is already moving." else - usr << "\red Prisoners are only allowed to be released while alone." + usr << "Prisoners are only allowed to be released while alone." else - usr << "\blue Shuttle is already on-station." + usr << "Shuttle is already on-station." if(href_list["choice"] == "release") + var/datum/shuttle_manager/s = shuttles["laborcamp"] + if(s.location == /area/shuttle/laborcamp/outpost) + usr << "Prisoners can only be released while docked with the station." + return if(alone_in_area(get_area(loc), usr)) if(release_door.density) release_door.open() else - usr << "\red Prisoners are only allowed to be released while alone." + usr << "Prisoners are only allowed to be released while alone." src.updateUsrDialog() return @@ -136,4 +136,30 @@ var/a = inp.amount if(n in ore_values) points += ore_values[n] * a + ..() + + +/**********************Point Lookup Console**************************/ +/obj/machinery/mineral/labor_points_checker + name = "points checking console" + desc = "A console used by prisoners to check the progress on their quotas. Simply swipe a prisoner ID." + icon = 'icons/obj/machines/mining_machines.dmi' + icon_state = "console" + density = 0 + anchored = 1 + +/obj/machinery/mineral/labor_points_checker/attack_hand(user as mob) + examine(user) + +/obj/machinery/mineral/labor_points_checker/attackby(obj/item/I as obj, mob/user as mob) + if(istype(I, /obj/item/weapon/card/id)) + if(istype(I, /obj/item/weapon/card/id/prisoner)) + var/obj/item/weapon/card/id/prisoner/prisoner_id = I + user << "ID: [prisoner_id.registered_name]" + user << "Points Collected:[prisoner_id.points]" + user << "Point Quota: [prisoner_id.goal ? prisoner_id.goal : "Unlimited"]" + user << "Collect points by bringing smelted minerals to the Labor Shuttle stacking machine. Reach your quota to earn your release." + else + user << "Error: Invalid ID" + return ..() \ No newline at end of file diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index ac5c8342911..f660ba1c7f9 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -28,7 +28,7 @@ new /obj/item/weapon/storage/backpack/satchel_eng(src) new /obj/item/device/radio/headset/headset_cargo(src) new /obj/item/clothing/under/rank/miner(src) - new /obj/item/clothing/gloves/black(src) + new /obj/item/clothing/gloves/fingerless(src) new /obj/item/clothing/shoes/sneakers/black(src) new /obj/item/device/mining_scanner(src) new /obj/item/weapon/storage/bag/ore(src) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 52aca2ed8c1..85218ee2e5b 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -373,7 +373,7 @@ /turf/simulated/mineral/attackby(obj/item/weapon/W as obj, mob/user as mob) if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "\red You don't have the dexterity to do this!" + usr << "You don't have the dexterity to do this!" return if (istype(W, /obj/item/weapon/pickaxe)) @@ -390,11 +390,11 @@ if(last_act+W:digspeed > world.time)//prevents message spam return last_act = world.time - user << "\red You start picking." + user << "You start picking." playsound(user, 'sound/weapons/Genhit.ogg', 20, 1) if(do_after(user,W:digspeed)) - user << "\blue You finish cutting into the rock." + user << "You finish cutting into the rock." gets_drilled() else return attack_hand(user) @@ -512,15 +512,15 @@ return if (dug) - user << "\red This area has already been dug" + user << "This area has already been dug." return - user << "\red You start digging." + user << "You start digging." playsound(src, 'sound/effects/rustle1.ogg', 50, 1) //russle sounds sounded better sleep(40) if ((user.loc == T && user.get_active_hand() == W)) - user << "\blue You dug a hole." + user << "You dug a hole." gets_dug() return @@ -530,15 +530,15 @@ return if (dug) - user << "\red This area has already been dug" + user << "This area has already been dug." return - user << "\red You start digging." + user << "You start digging." playsound(src, 'sound/effects/rustle1.ogg', 50, 1) //russle sounds sounded better sleep(30) if ((user.loc == T && user.get_active_hand() == W)) - user << "\blue You dug a hole." + user << "You dug a hole." gets_dug() if ((istype(W,/obj/item/weapon/pickaxe/diamonddrill)) || (istype(W,/obj/item/weapon/pickaxe/borgdrill))) @@ -547,15 +547,15 @@ return if (dug) - user << "\red This area has already been dug" + user << "This area has already been dug." return - user << "\red You start digging." + user << "You start digging." playsound(src, 'sound/effects/rustle1.ogg', 50, 1) //russle sounds sounded better sleep(0) if ((user.loc == T && user.get_active_hand() == W)) - user << "\blue You dug a hole." + user << "You dug a hole." gets_dug() if(istype(W,/obj/item/weapon/storage/bag/ore)) diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm index 2f130f34d6e..9ae9d7bd63d 100644 --- a/code/modules/mining/mint.dm +++ b/code/modules/mining/mint.dm @@ -117,7 +117,7 @@ usr.set_machine(src) src.add_fingerprint(usr) if(processing==1) - usr << "\blue The machine is processing." + usr << "The machine is processing." return if(href_list["choose"]) chosen = href_list["choose"] diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm index 3f0a0b48769..525401825bc 100644 --- a/code/modules/mining/money_bag.dm +++ b/code/modules/mining/money_bag.dm @@ -60,14 +60,14 @@ ..() if (istype(W, /obj/item/weapon/coin)) var/obj/item/weapon/coin/C = W - user << "\blue You add the [C.name] into the bag." + user << "You add the [C.name] into the bag." usr.drop_item() contents += C if (istype(W, /obj/item/weapon/moneybag)) var/obj/item/weapon/moneybag/C = W for (var/obj/O in C.contents) contents += O; - user << "\blue You empty the [C.name] into the bag." + user << "You empty the [C.name] into the bag." return /obj/item/weapon/moneybag/Topic(href, href_list) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index eb73cd4e384..67f3f0095be 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -259,7 +259,7 @@ CC.update_icon() overlays = list() string_attached = null - user << "\blue You detach the string from the coin." + user << "You detach the string from the coin." else ..() /obj/item/weapon/coin/attack_self(mob/user as mob) diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 1bba0dfd42f..794efb49ec8 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -17,7 +17,7 @@ S.hide_from(usr) for(var/obj/item/weapon/ore/O in S.contents) S.remove_from_storage(O, src) //This will move the item to this item's contents - user << "\blue You empty the satchel into the box." + user << "You empty the satchel into the box." return /obj/structure/ore_box/attack_hand(mob/user as mob) @@ -79,6 +79,6 @@ for (var/obj/item/weapon/ore/O in contents) contents -= O O.loc = src.loc - usr << "\blue You empty the box" + usr << "You empty the box." src.updateUsrDialog() return diff --git a/code/modules/mob/dead/observer/login.dm.bak b/code/modules/mob/dead/observer/login.dm.bak deleted file mode 100644 index b71c51271eb..00000000000 --- a/code/modules/mob/dead/observer/login.dm.bak +++ /dev/null @@ -1,14 +0,0 @@ -/mob/observer/Login() - ..() - if (!src.start) - src.start = 1 - var/A = locate(/area/start) - var/list/L = list( ) - for(var/turf/T in A) - L += T - src.loc = pick(L) - src.client.screen = null - if (!isturf(src.loc)) - src.client.eye = src.loc - src.client.perspective = EYE_PERSPECTIVE - return \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index e79d3fbc795..9082eeb01f7 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -10,6 +10,7 @@ blinded = 0 anchored = 1 // don't get pushed around invisibility = INVISIBILITY_OBSERVER + languages = ALL var/can_reenter_corpse var/datum/hud/living/carbon/hud = null // hud var/bootime = 0 @@ -191,7 +192,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(following && following == target) return following = target - src << "\blue Now following [target]" + src << "Now following [target]" spawn(0) var/turf/pos = get_turf(src) while(loc == pos && target && following == target && client) @@ -249,11 +250,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/memory() set hidden = 1 - src << "\red You are dead! You have no mind to store memory!" + src << "You are dead! You have no mind to store memory!" /mob/dead/observer/add_memory() set hidden = 1 - src << "\red You are dead! You have no mind to store memory!" + src << "You are dead! You have no mind to store memory!" /mob/dead/observer/verb/toggle_darkness() set name = "Toggle Darkness" diff --git a/code/modules/mob/dead/observer/observer.dm.bak b/code/modules/mob/dead/observer/observer.dm.bak deleted file mode 100644 index 766b14c1fa7..00000000000 --- a/code/modules/mob/dead/observer/observer.dm.bak +++ /dev/null @@ -1,170 +0,0 @@ -/mob/observer/New(mob/corpse) - set invisibility = 10 - - ..() - - if(corpse) - src.corpse = corpse - src.loc = get_turf(corpse.loc) - src.real_name = corpse.real_name - src.name = corpse.real_name - - src.sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS - src.see_invisible = 10 - src.see_in_dark = 100 - src.verbs += /mob/observer/proc/dead_tele - src.verbs += /mob/observer/proc/reenter_corpse - -/mob/proc/ghostize() - set name = "Ghost" - set desc = "You cannot be revived as a ghost" - if(src.client) - src.client.mob = new/mob/observer(src) - return - -/mob/observer/Move(NewLoc, direct) - if(NewLoc) - src.loc = NewLoc - return - if((direct & NORTH) && src.y < world.maxy) - src.y++ - if((direct & SOUTH) && src.y > 1) - src.y-- - if((direct & EAST) && src.x < world.maxx) - src.x++ - if((direct & WEST) && src.x > 1) - src.x-- - -/mob/observer/examine() - if(usr) usr << src.desc - -/mob/observer/can_use_hands() return 0 -/mob/observer/is_active() return 0 - -/mob/observer/Stat() - ..() - statpanel("Status") - if (src.client.statpanel == "Status") - if(ticker && ticker.mode) - if (ticker.timeleft) - stat(null, "ETA-[ticker.timeleft / 600 % 60]:[ticker.timeleft / 100 % 6][ticker.timeleft / 100 % 10]") - - if(ticker.mode.name == "Corporate Restructuring" && ticker.target) - var/icon = ticker.target.name - var/icon2 = ticker.target.real_name - var/area = get_area(ticker.target) - stat(null, text("Target: [icon2] (as [icon]) is in [area]")) - - if(ticker.mode.name == "AI malfunction" && ticker.processing) - stat(null, text("Time until all [station_name()]'s systems are taken over: [(ticker.AIwin - ticker.AItime) / 600 % 60]:[(ticker.AIwin - ticker.AItime) / 100 % 6][(ticker.AIwin - ticker.AItime) / 10 % 10]")) - - if (ticker.mode.name == "ctf") - stat(null, text("Red Team - [ticker.red_score]")) - stat(null, text("Green Team - [ticker.green_score]")) - -/mob/observer/proc/reenter_corpse() - set category = "Special Verbs" - set name = "Re-enter Corpse" - if(!corpse) - alert("You don't have a corpse!") - return - if(corpse.stat == 2) - alert("Your body is dead!") - return - if(src.client && src.client.holder && src.client.holder.state == 2) - var/rank = src.client.holder.rank - src.client.clear_admin_verbs() - src.client.holder.state = 1 - src.client.update_admins(rank) - src.client.mob = corpse - del(src) - -/mob/observer/proc/dead_tele() - set category = "Special Verbs" - set name = "Teleport" - set desc= "Teleport" - if((usr.stat != 2) || !istype(usr, /mob/observer)) - usr << "Not when you're not dead!" - return - var/A - usr.verbs -= /mob/observer/proc/dead_tele - spawn(50) - usr.verbs += /mob/observer/proc/dead_tele - A = input("Area to jump to", "BOOYEA", A) in list("Engine","Hallways","Toxins","Storage","Maintenance","Crew Quarters","Medical","Security","Chapel","Bridge") - - switch (A) - if ("Engine") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/engine) && !istype(B, /area/engine/combustion) && !istype(B, /area/engine/engine_walls)) - L += B - A = pick(L) - if ("Hallways") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/hallway)) - L += B - A = pick(L) - if ("Toxins") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/toxins) && !istype(B, /area/toxins/test_chamber)) - L += B - A = pick(L) - if ("Storage") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/storage)) - L += B - A = pick(L) - if ("Maintenance") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/maintenance)) - L += B - A = pick(L) - if ("Crew Quarters") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/crew_quarters)) - L += B - A = pick(L) - if ("Medical") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/medical)) - L += B - A = pick(L) - if ("Security") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/security)) - L += B - A = pick(L) - if ("Chapel") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/chapel)) - L += B - A = pick(L) - if ("Bridge") - var/list/L = list() - for(var/area/B in world) - if(istype(B, /area/bridge)) - L += B - A = pick(L) - - var/list/L = list() - for(var/turf/T in A) - if(!T.density) - var/clear = 1 - for(var/obj/O in T) - if(O.density) - clear = 0 - break - if(clear) - L+=T - - usr.loc = pick(L) - - diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index 5e576701d63..37831db6f0a 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -1,6 +1,3 @@ -/mob/dead/observer/say_understands(var/other) - return 1 - /mob/dead/observer/say(var/message) message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) @@ -11,13 +8,17 @@ if (src.client) if(src.client.prefs.muted & MUTE_DEADCHAT) - src << "\red You cannot talk in deadchat (muted)." + src << "You cannot talk in deadchat (muted)." return if (src.client.handle_spam_prevention(message,MUTE_DEADCHAT)) return . = src.say_dead(message) + +/mob/dead/observer/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + src << message + /* for (var/mob/M in hearers(null, null)) if (!M.stat) diff --git a/code/modules/mob/dead/observer/say.dm.bak b/code/modules/mob/dead/observer/say.dm.bak deleted file mode 100644 index 5f330b2ab93..00000000000 --- a/code/modules/mob/dead/observer/say.dm.bak +++ /dev/null @@ -1,30 +0,0 @@ -/mob/observer/say_understands(var/other) - return 1 - -/mob/observer/say(var/message) - message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) - - if (!message) - return - - world.log_say("Ghost/[src.key] : [message]") - - if (src.muted) - return - - . = src.say_dead(message) - - for (var/mob/M in hearers(null, null)) - if (!M.stat) - if(M.job == "Chaplain") - if (prob (49)) - M.show_message("You hear muffled speech... but nothing is there...", 2) - else - M.show_message("[stutter(message)]", 2) - else - if (prob(50)) - return - else if (prob (95)) - M.show_message("You hear muffled speech... but nothing is there...", 2) - else - M.show_message("[stutter(message)]", 2) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 0263237a03d..402f6e9597d 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -5,19 +5,17 @@ /mob/living/carbon/alien name = "alien" voice_name = "alien" - voice_message = "hisses" say_message = "hisses" icon = 'icons/mob/alien.dmi' gender = NEUTER dna = null faction = list("alien") ventcrawler = 2 + languages = ALIEN var/storedPlasma = 250 var/max_plasma = 500 - alien_talk_understand = 1 - var/obj/item/weapon/card/id/wear_id = null // Fix for station bounced radios -- Skie var/has_fine_manipulation = 0 diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index cf14f45c838..80cb1fdc642 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -8,13 +8,13 @@ Doesn't work on other aliens/AI.*/ /mob/living/carbon/alien/proc/powerc(X, Y)//Y is optional, checks for weed planting. X can be null. if(stat) - src << "\green You must be conscious to do this." + src << "You must be conscious to do this." return 0 else if(X && getPlasma() < X) - src << "\green Not enough plasma stored." + src << "Not enough plasma stored." return 0 else if(Y && (!isturf(src.loc) || istype(src.loc, /turf/space))) - src << "\green Bad place for a garden!" + src << "Bad place for a garden!" return 0 else return 1 @@ -30,7 +30,7 @@ Doesn't work on other aliens/AI.*/ if(powerc(50,1)) adjustToxLoss(-50) for(var/mob/O in viewers(src, null)) - O.show_message(text("\green [src] has planted some alien weeds!"), 1) + O.show_message(text("[src] has planted some alien weeds!"), 1) new /obj/structure/alien/weeds/node(loc) return @@ -57,8 +57,8 @@ Doesn't work on other aliens/AI.*/ var/msg = sanitize(input("Message:", "Alien Whisper") as text|null) if(msg) log_say("AlienWhisper: [key_name(src)]->[M.key] : [msg]") - M << "\green You hear a strange, alien voice in your head... \italic [msg]" - src << {"\green You said: "[msg]" to [M]"} + M << "You hear a strange, alien voice in your head...[msg]" + src << {"You said: "[msg]" to [M]"} return /mob/living/carbon/alien/humanoid/verb/transfer_plasma(mob/living/carbon/alien/M as mob in oview()) @@ -74,10 +74,10 @@ Doesn't work on other aliens/AI.*/ if (get_dist(src,M) <= 1) M.adjustToxLoss(amount) adjustToxLoss(-amount) - M << "\green [src] has transfered [amount] plasma to you." - src << {"\green You have trasferred [amount] plasma to [M]"} + M << "[src] has transfered [amount] plasma to you." + src << {"You have trasferred [amount] plasma to [M]"} else - src << "\green You need to be closer." + src << "You need to be closer." return @@ -92,27 +92,27 @@ Doesn't work on other aliens/AI.*/ if(isobj(O)) var/obj/I = O if(I.unacidable) //So the aliens don't destroy energy fields/singularies/other aliens/etc with their acid. - src << "\green You cannot dissolve this object." + src << "You cannot dissolve this object." return // TURF CHECK else if(istype(O, /turf/simulated)) var/turf/T = O // R WALL if(istype(T, /turf/simulated/wall/r_wall)) - src << "\green You cannot dissolve this object." + src << "You cannot dissolve this object." return // R FLOOR if(istype(T, /turf/simulated/floor/engine)) - src << "\green You cannot dissolve this object." + src << "You cannot dissolve this object." return else// Not a type we can acid. return adjustToxLoss(-200) new /obj/effect/acid(get_turf(O), O) - visible_message("\green [src] vomits globs of vile stuff all over [O]. It begins to sizzle and melt under the bubbling mess of acid!") + visible_message("[src] vomits globs of vile stuff all over [O]. It begins to sizzle and melt under the bubbling mess of acid!") else - src << "\green Target is too far away." + src << "Target is too far away." return @@ -123,7 +123,7 @@ Doesn't work on other aliens/AI.*/ if(powerc(50)) adjustToxLoss(-50) - src.visible_message("\red [src] spits neurotoxin!", "\green You spit neurotoxin.") + src.visible_message("[src] spits neurotoxin!", "You spit neurotoxin.") var/turf/T = loc var/turf/U = get_step(src, dir) // Get the tile infront of the move, based on their direction @@ -146,9 +146,9 @@ Doesn't work on other aliens/AI.*/ var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin door","resin wall","resin membrane","resin nest") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist if(!choice || !powerc(75)) return adjustToxLoss(-75) - src << "\green You shape a [choice]." + src << "You shape a [choice]." for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [src] vomits up a thick purple substance and begins to shape it!"), 1) + O.show_message(text("[src] vomits up a thick purple substance and begins to shape it!"), 1) switch(choice) if("resin door") new /obj/structure/mineral_door/resin(loc) @@ -171,5 +171,5 @@ Doesn't work on other aliens/AI.*/ stomach_contents.Remove(A) A.loc = loc //Paralyse(10) - src.visible_message("\green [src] hurls out the contents of their stomach!") + src.visible_message("[src] hurls out the contents of their stomach!") return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm index efe7e9d47aa..bae52d99d01 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm @@ -37,9 +37,9 @@ if(no_queen) adjustToxLoss(-500) - src << "\green You begin to evolve!" + src << "You begin to evolve!" for(var/mob/O in viewers(src, null)) - O.show_message(text("\green [src] begins to twist and contort!"), 1) + O.show_message(text("[src] begins to twist and contort!"), 1) var/mob/living/carbon/alien/humanoid/queen/new_xeno = new (loc) mind.transfer_to(new_xeno) qdel(src) diff --git a/code/modules/mob/living/carbon/alien/humanoid/death.dm b/code/modules/mob/living/carbon/alien/humanoid/death.dm index 91138a43090..bee27cda077 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/death.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/death.dm @@ -6,7 +6,7 @@ if(!gibbed) playsound(loc, 'sound/voice/hiss6.ogg', 80, 1, 1) for(var/mob/O in viewers(src, null)) - O.show_message("[src] lets out a waning guttural screech, green blood bubbling from its maw...", 1) + O.show_message("[src] lets out a waning guttural screech, green blood bubbling from its maw...", 1) update_canmove() if(client) blind.layer = 0 update_icons() diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm index 4351ced974f..ed3061be2e8 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm @@ -14,54 +14,54 @@ switch(act) //Alphabetical please if ("deathgasp") - message = "[src] lets out a waning guttural screech, green blood bubbling from its maw..." + message = "[src] lets out a waning guttural screech, green blood bubbling from its maw..." m_type = 2 if ("gnarl") if (!muzzled) - message = "[src] gnarls and shows its teeth.." + message = "[src] gnarls and shows its teeth.." m_type = 2 if ("hiss") if(!muzzled) - message = "[src] hisses." + message = "[src] hisses." m_type = 2 if ("moan") - message = "[src] moans!" + message = "[src] moans!" m_type = 2 if ("roar") if (!muzzled) - message = "[src] roars." + message = "[src] roars." m_type = 2 if ("roll") if (!src.restrained()) - message = "[src] rolls." + message = "[src] rolls." m_type = 1 if ("scratch") if (!src.restrained()) - message = "[src] scratches." + message = "[src] scratches." m_type = 1 if ("scretch") if (!muzzled) - message = "[src] scretches." + message = "[src] scretches." m_type = 2 if ("shiver") - message = "[src] shivers." + message = "[src] shivers." m_type = 2 if ("sign") if (!src.restrained()) - message = text("[src] signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null)) + message = text("[src] signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null)) m_type = 1 if ("tail") - message = "[src] waves its tail." + message = "[src] waves its tail." m_type = 1 if ("help") //This is an exception diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index eb89d6cf49b..2c29857b305 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -345,7 +345,7 @@ In all, this is a lot like the monkey code. /N /mob/living/carbon/alien/humanoid/Topic(href, href_list) ..() //strip panel - if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr)) + if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) if(href_list["pouches"]) visible_message("[usr] tries to empty [src]'s pouches.", \ "[usr] tries to empty [src]'s pouches.") diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index 937323da58f..71ad1de7810 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -68,404 +68,403 @@ handle_regular_hud_updates() -/mob/living/carbon/alien/humanoid - proc/handle_disabilities() - if (disabilities & EPILEPSY) - if ((prob(1) && paralysis < 10)) - src << "\red You have a seizure!" - Paralyse(10) - if (disabilities & COUGHING) - if ((prob(5) && paralysis <= 1)) - drop_item() - spawn( 0 ) - emote("cough") - return - if (disabilities & TOURETTES) - if ((prob(10) && paralysis <= 1)) - Stun(10) - spawn( 0 ) - emote("twitch") - return - if (disabilities & NERVOUS) - if (prob(10)) - stuttering = max(10, stuttering) +/mob/living/carbon/alien/humanoid/proc/handle_disabilities() + if (disabilities & EPILEPSY) + if ((prob(1) && paralysis < 10)) + src << "You have a seizure!" + Paralyse(10) + if (disabilities & COUGHING) + if ((prob(5) && paralysis <= 1)) + drop_item() + spawn( 0 ) + emote("cough") + return + if (disabilities & TOURETTES) + if ((prob(10) && paralysis <= 1)) + Stun(10) + spawn( 0 ) + emote("twitch") + return + if (disabilities & NERVOUS) + if (prob(10)) + stuttering = max(10, stuttering) - proc/breathe() - if(reagents) - if(reagents.has_reagent("lexorin")) return - if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return +/mob/living/carbon/alien/humanoid/proc/breathe() + if(reagents) + if(reagents.has_reagent("lexorin")) return + if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return - var/datum/gas_mixture/environment = loc.return_air() - var/datum/gas_mixture/breath - // HACK NEED CHANGING LATER - if(health <= config.health_threshold_crit) - losebreath++ + var/datum/gas_mixture/environment = loc.return_air() + var/datum/gas_mixture/breath + // HACK NEED CHANGING LATER + if(health <= config.health_threshold_crit) + losebreath++ - if(losebreath>0) //Suffocating so do not take a breath - losebreath-- - if (prob(75)) //High chance of gasping for air - spawn emote("gasp") + if(losebreath>0) //Suffocating so do not take a breath + losebreath-- + if (prob(75)) //High chance of gasping for air + spawn emote("gasp") + if(istype(loc, /obj/)) + var/obj/location_as_object = loc + location_as_object.handle_internal_lifeform(src, 0) + else + //First, check for air from internal atmosphere (using an air tank and mask generally) + breath = get_breath_from_internal(BREATH_VOLUME) + + //No breath from internal atmosphere so get breath from location + if(!breath) + if(istype(loc, /obj/)) + var/obj/location_as_object = loc + breath = location_as_object.handle_internal_lifeform(src, BREATH_VOLUME) + else if(istype(loc, /turf/)) + var/breath_moles = 0 + /*if(environment.return_pressure() > ONE_ATMOSPHERE) + // Loads of air around (pressure effect will be handled elsewhere), so lets just take a enough to fill our lungs at normal atmos pressure (using n = Pv/RT) + breath_moles = (ONE_ATMOSPHERE*BREATH_VOLUME/R_IDEAL_GAS_EQUATION*environment.temperature) + else*/ + // Not enough air around, take a percentage of what's there to model this properly + breath_moles = environment.total_moles()*BREATH_PERCENTAGE + + breath = loc.remove_air(breath_moles) + + // Handle chem smoke effect -- Doohl + for(var/obj/effect/effect/chem_smoke/smoke in view(1, src)) + if(smoke.reagents.total_volume) + smoke.reagents.reaction(src, INGEST) + spawn(5) + if(smoke) + smoke.reagents.copy_to(src, 10) // I dunno, maybe the reagents enter the blood stream through the lungs? + break // If they breathe in the nasty stuff once, no need to continue checking + + + else //Still give containing object the chance to interact if(istype(loc, /obj/)) var/obj/location_as_object = loc location_as_object.handle_internal_lifeform(src, 0) - else - //First, check for air from internal atmosphere (using an air tank and mask generally) - breath = get_breath_from_internal(BREATH_VOLUME) - //No breath from internal atmosphere so get breath from location - if(!breath) - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - breath = location_as_object.handle_internal_lifeform(src, BREATH_VOLUME) - else if(istype(loc, /turf/)) - var/breath_moles = 0 - /*if(environment.return_pressure() > ONE_ATMOSPHERE) - // Loads of air around (pressure effect will be handled elsewhere), so lets just take a enough to fill our lungs at normal atmos pressure (using n = Pv/RT) - breath_moles = (ONE_ATMOSPHERE*BREATH_VOLUME/R_IDEAL_GAS_EQUATION*environment.temperature) - else*/ - // Not enough air around, take a percentage of what's there to model this properly - breath_moles = environment.total_moles()*BREATH_PERCENTAGE + handle_breath(breath) - breath = loc.remove_air(breath_moles) - - // Handle chem smoke effect -- Doohl - for(var/obj/effect/effect/chem_smoke/smoke in view(1, src)) - if(smoke.reagents.total_volume) - smoke.reagents.reaction(src, INGEST) - spawn(5) - if(smoke) - smoke.reagents.copy_to(src, 10) // I dunno, maybe the reagents enter the blood stream through the lungs? - break // If they breathe in the nasty stuff once, no need to continue checking + if(breath) + loc.assume_air(breath) - else //Still give containing object the chance to interact - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - location_as_object.handle_internal_lifeform(src, 0) - - handle_breath(breath) - - if(breath) - loc.assume_air(breath) - - - proc/get_breath_from_internal(volume_needed) +/mob/living/carbon/alien/humanoid/proc/get_breath_from_internal(volume_needed) + if(internal) + if (!contents.Find(internal)) + internal = null + if (!wear_mask || !(wear_mask.flags & MASKINTERNALS) ) + internal = null if(internal) - if (!contents.Find(internal)) - internal = null - if (!wear_mask || !(wear_mask.flags & MASKINTERNALS) ) - internal = null - if(internal) - if (internals) - internals.icon_state = "internal1" - return internal.remove_air_volume(volume_needed) - else - if (internals) - internals.icon_state = "internal0" - return null - - proc/handle_breath(datum/gas_mixture/breath) - if(status_flags & GODMODE) - return - - if(!breath || (breath.total_moles() == 0)) - //Aliens breathe in vaccuum - return 0 - - var/toxins_used = 0 - var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME - - //Partial pressure of the toxins in our breath - var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure - - if(Toxins_pp) // Detect toxins in air - - adjustToxLoss(breath.toxins*250) - toxins_alert = max(toxins_alert, 1) - - toxins_used = breath.toxins - + if (internals) + internals.icon_state = "internal1" + return internal.remove_air_volume(volume_needed) else - toxins_alert = 0 + if (internals) + internals.icon_state = "internal0" + return null - //Breathe in toxins and out oxygen - breath.toxins -= toxins_used - breath.oxygen += toxins_used +/mob/living/carbon/alien/humanoid/proc/handle_breath(datum/gas_mixture/breath) + if(status_flags & GODMODE) + return - if(breath.temperature > (T0C+66) && !(COLD_RESISTANCE in mutations)) // Hot air hurts :( - if(prob(20)) - src << "\red You feel a searing heat in your lungs!" - fire_alert = max(fire_alert, 1) - else - fire_alert = 0 + if(!breath || (breath.total_moles() == 0)) + //Aliens breathe in vaccuum + return 0 - //Temporary fixes to the alerts. + var/toxins_used = 0 + var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME - return 1 + //Partial pressure of the toxins in our breath + var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure + + if(Toxins_pp) // Detect toxins in air + + adjustToxLoss(breath.toxins*250) + toxins_alert = max(toxins_alert, 1) + + toxins_used = breath.toxins + + else + toxins_alert = 0 + + //Breathe in toxins and out oxygen + breath.toxins -= toxins_used + breath.oxygen += toxins_used + + if(breath.temperature > (T0C+66) && !(COLD_RESISTANCE in mutations)) // Hot air hurts :( + if(prob(20)) + src << "You feel a searing heat in your lungs!>/span>" + fire_alert = max(fire_alert, 1) + else + fire_alert = 0 + + //Temporary fixes to the alerts. + + return 1 - proc/adjust_body_temperature(current, loc_temp, boost) - var/temperature = current - var/difference = abs(current-loc_temp) //get difference - var/increments// = difference/10 //find how many increments apart they are - if(difference > 50) - increments = difference/5 - else - increments = difference/10 - var/change = increments*boost // Get the amount to change by (x per increment) - var/temp_change - if(current < loc_temp) - temperature = min(loc_temp, temperature+change) - else if(current > loc_temp) - temperature = max(loc_temp, temperature-change) - temp_change = (temperature - current) - return temp_change +/mob/living/carbon/alien/humanoid/proc/adjust_body_temperature(current, loc_temp, boost) + var/temperature = current + var/difference = abs(current-loc_temp) //get difference + var/increments// = difference/10 //find how many increments apart they are + if(difference > 50) + increments = difference/5 + else + increments = difference/10 + var/change = increments*boost // Get the amount to change by (x per increment) + var/temp_change + if(current < loc_temp) + temperature = min(loc_temp, temperature+change) + else if(current > loc_temp) + temperature = max(loc_temp, temperature-change) + temp_change = (temperature - current) + return temp_change /* - proc/get_thermal_protection() - var/thermal_protection = 1.0 - //Handle normal clothing - if(head && (head.body_parts_covered & HEAD)) - thermal_protection += 0.5 - if(wear_suit && (wear_suit.body_parts_covered & CHEST)) - thermal_protection += 0.5 - if(wear_suit && (wear_suit.body_parts_covered & LEGS)) - thermal_protection += 0.2 - if(wear_suit && (wear_suit.body_parts_covered & ARMS)) - thermal_protection += 0.2 - if(wear_suit && (wear_suit.body_parts_covered & HANDS)) - thermal_protection += 0.2 - if(wear_suit && (wear_suit.flags & SUITSPACE)) - thermal_protection += 3 - if(COLD_RESISTANCE in mutations) - thermal_protection += 5 +/mob/living/carbon/alien/humanoid/proc/get_thermal_protection() + var/thermal_protection = 1.0 + //Handle normal clothing + if(head && (head.body_parts_covered & HEAD)) + thermal_protection += 0.5 + if(wear_suit && (wear_suit.body_parts_covered & CHEST)) + thermal_protection += 0.5 + if(wear_suit && (wear_suit.body_parts_covered & LEGS)) + thermal_protection += 0.2 + if(wear_suit && (wear_suit.body_parts_covered & ARMS)) + thermal_protection += 0.2 + if(wear_suit && (wear_suit.body_parts_covered & HANDS)) + thermal_protection += 0.2 + if(wear_suit && (wear_suit.flags & SUITSPACE)) + thermal_protection += 3 + if(COLD_RESISTANCE in mutations) + thermal_protection += 5 - return thermal_protection + return thermal_protection - proc/add_fire_protection(var/temp) - var/fire_prot = 0 - if(head) - if(head.protective_temperature > temp) - fire_prot += (head.protective_temperature/10) - if(wear_mask) - if(wear_mask.protective_temperature > temp) - fire_prot += (wear_mask.protective_temperature/10) - if(wear_suit) - if(wear_suit.protective_temperature > temp) - fire_prot += (wear_suit.protective_temperature/10) +/mob/living/carbon/alien/humanoid/proc/add_fire_protection(var/temp) + var/fire_prot = 0 + if(head) + if(head.protective_temperature > temp) + fire_prot += (head.protective_temperature/10) + if(wear_mask) + if(wear_mask.protective_temperature > temp) + fire_prot += (wear_mask.protective_temperature/10) + if(wear_suit) + if(wear_suit.protective_temperature > temp) + fire_prot += (wear_suit.protective_temperature/10) - return fire_prot - */ + return fire_prot +*/ - proc/handle_chemicals_in_body() +/mob/living/carbon/alien/humanoid/proc/handle_chemicals_in_body() - if(reagents) reagents.metabolize(src) + if(reagents) reagents.metabolize(src) - if(FAT in mutations) - if(nutrition < 100) - if(prob(round((50 - nutrition) / 100))) - src << "\blue You feel fit again!" - mutations.Remove(FAT) - else - if(nutrition > 500) - if(prob(5 + round((nutrition - 200) / 2))) - src << "\red You suddenly feel blubbery!" - mutations.Add(FAT) + if(FAT in mutations) + if(nutrition < 100) + if(prob(round((50 - nutrition) / 100))) + src << "You feel fit again!" + mutations.Remove(FAT) + else + if(nutrition > 500) + if(prob(5 + round((nutrition - 200) / 2))) + src << "You suddenly feel blubbery!" + mutations.Add(FAT) - if (nutrition > 0) - nutrition -= HUNGER_FACTOR + if (nutrition > 0) + nutrition -= HUNGER_FACTOR - if (drowsyness) - drowsyness-- - eye_blurry = max(2, eye_blurry) - if (prob(5)) - sleeping += 1 - Paralyse(5) + if (drowsyness) + drowsyness-- + eye_blurry = max(2, eye_blurry) + if (prob(5)) + sleeping += 1 + Paralyse(5) - confused = max(0, confused - 1) - // decrement dizziness counter, clamped to 0 - if(resting) - dizziness = max(0, dizziness - 5) - jitteriness = max(0, jitteriness - 5) - else - dizziness = max(0, dizziness - 1) - jitteriness = max(0, jitteriness - 1) + confused = max(0, confused - 1) + // decrement dizziness counter, clamped to 0 + if(resting) + dizziness = max(0, dizziness - 5) + jitteriness = max(0, jitteriness - 5) + else + dizziness = max(0, dizziness - 1) + jitteriness = max(0, jitteriness - 1) - updatehealth() + updatehealth() - return //TODO: DEFERRED + return //TODO: DEFERRED - proc/handle_regular_status_updates() - updatehealth() +/mob/living/carbon/alien/humanoid/proc/handle_regular_status_updates() + updatehealth() - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP + if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP + blinded = 1 + silent = 0 + else //ALIVE. LIGHTS ARE ON + if(health < config.health_threshold_dead || !getorgan(/obj/item/organ/brain)) + death() blinded = 1 + stat = DEAD silent = 0 - else //ALIVE. LIGHTS ARE ON - if(health < config.health_threshold_dead || !getorgan(/obj/item/organ/brain)) - death() - blinded = 1 - stat = DEAD - silent = 0 - return 1 + return 1 - //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 50) || (config.health_threshold_crit >= health) ) - if( health <= 20 && prob(1) ) - spawn(0) - emote("gasp") - if(!reagents.has_reagent("inaprovaline")) - adjustOxyLoss(1) - Paralyse(3) + //UNCONSCIOUS. NO-ONE IS HOME + if( (getOxyLoss() > 50) || (config.health_threshold_crit >= health) ) + if( health <= 20 && prob(1) ) + spawn(0) + emote("gasp") + if(!reagents.has_reagent("inaprovaline")) + adjustOxyLoss(1) + Paralyse(3) - if(paralysis) - AdjustParalysis(-1) - blinded = 1 - stat = UNCONSCIOUS - else if(sleeping) - sleeping = max(sleeping-1, 0) - blinded = 1 - stat = UNCONSCIOUS - if( prob(10) && health ) - spawn(0) - emote("hiss") - //CONSCIOUS - else - stat = CONSCIOUS + if(paralysis) + AdjustParalysis(-1) + blinded = 1 + stat = UNCONSCIOUS + else if(sleeping) + sleeping = max(sleeping-1, 0) + blinded = 1 + stat = UNCONSCIOUS + if( prob(10) && health ) + spawn(0) + emote("hiss") + //CONSCIOUS + else + stat = CONSCIOUS - /* What in the living hell is this?*/ - if(move_delay_add > 0) - move_delay_add = max(0, move_delay_add - rand(1, 2)) + /* What in the living hell is this?*/ + if(move_delay_add > 0) + move_delay_add = max(0, move_delay_add - rand(1, 2)) - //Eyes - if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own - blinded = 1 - else if(eye_blind) //blindness, heals slowly over time - eye_blind = max(eye_blind-1,0) - blinded = 1 - else if(eye_blurry) //blurry eyes heal slowly - eye_blurry = max(eye_blurry-1, 0) + //Eyes + if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own + blinded = 1 + else if(eye_blind) //blindness, heals slowly over time + eye_blind = max(eye_blind-1,0) + blinded = 1 + else if(eye_blurry) //blurry eyes heal slowly + eye_blurry = max(eye_blurry-1, 0) - //Ears - if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own - ear_deaf = max(ear_deaf, 1) - else if(ear_deaf) //deafness, heals slowly over time - ear_deaf = max(ear_deaf-1, 0) - else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs - ear_damage = max(ear_damage-0.05, 0) + //Ears + if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own + ear_deaf = max(ear_deaf, 1) + else if(ear_deaf) //deafness, heals slowly over time + ear_deaf = max(ear_deaf-1, 0) + else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs + ear_damage = max(ear_damage-0.05, 0) - //Other - if(stunned) - AdjustStunned(-1) - if(!stunned) - update_icons() + //Other + if(stunned) + AdjustStunned(-1) + if(!stunned) + update_icons() - if(weakened) - weakened = max(weakened-1,0) + if(weakened) + weakened = max(weakened-1,0) - if(stuttering) - stuttering = max(stuttering-1, 0) + if(stuttering) + stuttering = max(stuttering-1, 0) - if(silent) - silent = max(silent-1, 0) + if(silent) + silent = max(silent-1, 0) - if(druggy) - druggy = max(druggy-1, 0) - return 1 + if(druggy) + druggy = max(druggy-1, 0) + return 1 - proc/handle_regular_hud_updates() +/mob/living/carbon/alien/humanoid/proc/handle_regular_hud_updates() - if (stat == 2 || (XRAY in mutations)) - sight |= SEE_TURFS - sight |= SEE_MOBS - sight |= SEE_OBJS - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - else if (stat != 2) - sight |= SEE_MOBS - sight &= ~SEE_TURFS - sight &= ~SEE_OBJS - see_in_dark = 4 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - if(see_override) - see_invisible = see_override - - if (healths) - if (stat != 2) - switch(health) - if(100 to INFINITY) - healths.icon_state = "health0" - if(75 to 100) - healths.icon_state = "health1" - if(50 to 75) - healths.icon_state = "health2" - if(25 to 50) - healths.icon_state = "health3" - if(0 to 25) - healths.icon_state = "health4" - else - healths.icon_state = "health5" - else - healths.icon_state = "health6" - - if(pullin) - if(pulling) - pullin.icon_state = "pull" - else - pullin.icon_state = "pull0" - - - if (toxin) toxin.icon_state = "tox[toxins_alert ? 1 : 0]" - if (oxygen) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]" - if (fire) fire.icon_state = "fire[fire_alert ? 1 : 0]" - //NOTE: the alerts dont reset when youre out of danger. dont blame me, - //blame the person who coded them. Temporary fix added. - - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) - - if ((blind && stat != 2)) - if ((blinded)) - blind.layer = 18 - else - blind.layer = 0 - - if (disabilities & NEARSIGHTED) - client.screen += global_hud.vimpaired - - if (eye_blurry) - client.screen += global_hud.blurry - - if (druggy) - client.screen += global_hud.druggy + if (stat == 2 || (XRAY in mutations)) + sight |= SEE_TURFS + sight |= SEE_MOBS + sight |= SEE_OBJS + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_LEVEL_TWO + else if (stat != 2) + sight |= SEE_MOBS + sight &= ~SEE_TURFS + sight &= ~SEE_OBJS + see_in_dark = 4 + see_invisible = SEE_INVISIBLE_LEVEL_TWO + if(see_override) + see_invisible = see_override + if (healths) if (stat != 2) - if (machine) - if (!( machine.check_eye(src) )) - reset_view(null) - else - if(!client.adminobs) - reset_view(null) + switch(health) + if(100 to INFINITY) + healths.icon_state = "health0" + if(75 to 100) + healths.icon_state = "health1" + if(50 to 75) + healths.icon_state = "health2" + if(25 to 50) + healths.icon_state = "health3" + if(0 to 25) + healths.icon_state = "health4" + else + healths.icon_state = "health5" + else + healths.icon_state = "health6" - return 1 + if(pullin) + if(pulling) + pullin.icon_state = "pull" + else + pullin.icon_state = "pull0" - proc/handle_stomach() - spawn(0) - for(var/mob/living/M in stomach_contents) - if(M.loc != src) + + if (toxin) toxin.icon_state = "tox[toxins_alert ? 1 : 0]" + if (oxygen) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]" + if (fire) fire.icon_state = "fire[fire_alert ? 1 : 0]" + //NOTE: the alerts dont reset when youre out of danger. dont blame me, + //blame the person who coded them. Temporary fix added. + + client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) + + if ((blind && stat != 2)) + if ((blinded)) + blind.layer = 18 + else + blind.layer = 0 + + if (disabilities & NEARSIGHTED) + client.screen += global_hud.vimpaired + + if (eye_blurry) + client.screen += global_hud.blurry + + if (druggy) + client.screen += global_hud.druggy + + if (stat != 2) + if (machine) + if (!( machine.check_eye(src) )) + reset_view(null) + else + if(!client.adminobs) + reset_view(null) + + return 1 + +/mob/living/carbon/alien/humanoid/proc/handle_stomach() + spawn(0) + for(var/mob/living/M in stomach_contents) + if(M.loc != src) + stomach_contents.Remove(M) + continue + if(istype(M, /mob/living/carbon) && stat != 2) + if(M.stat == 2) + M.death(1) stomach_contents.Remove(M) + qdel(M) continue - if(istype(M, /mob/living/carbon) && stat != 2) - if(M.stat == 2) - M.death(1) - stomach_contents.Remove(M) - qdel(M) - continue - if(air_master.current_cycle%3==1) - if(!(status_flags & GODMODE)) - M.adjustBruteLoss(5) - nutrition += 10 + if(air_master.current_cycle%3==1) + if(!(status_flags & GODMODE)) + M.adjustBruteLoss(5) + nutrition += 10 diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index bdbb5bbcad5..4b47808e80a 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -65,7 +65,7 @@ if(powerc(75,1))//Can't plant eggs on spess tiles. That's silly. adjustToxLoss(-75) for(var/mob/O in viewers(src, null)) - O.show_message(text("\green [src] has laid an egg!"), 1) + O.show_message(text("[src] has laid an egg!"), 1) new /obj/structure/alien/egg(loc) return diff --git a/code/modules/mob/living/carbon/alien/larva/emote.dm b/code/modules/mob/living/carbon/alien/larva/emote.dm index 8a662b5dc47..3504b211893 100644 --- a/code/modules/mob/living/carbon/alien/larva/emote.dm +++ b/code/modules/mob/living/carbon/alien/larva/emote.dm @@ -15,92 +15,92 @@ switch(act) //Alphabetically sorted please. if ("burp") if (!muzzled) - message = "[src] burps." + message = "[src] burps." m_type = 2 if ("choke") - message = "[src] chokes." + message = "[src] chokes." m_type = 2 if ("collapse") Paralyse(2) - message = "[src] collapses!" + message = "[src] collapses!" m_type = 2 if ("dance") if (!src.restrained()) - message = "[src] dances around happily." + message = "[src] dances around happily." m_type = 1 if ("drool") - message = "[src] drools." + message = "[src] drools." m_type = 1 if ("gasp") - message = "[src] gasps." + message = "[src] gasps." m_type = 2 if ("gnarl") if (!muzzled) - message = "[src] gnarls and shows its teeth.." + message = "[src] gnarls and shows its teeth.." m_type = 2 if ("hiss") - message = "[src] hisses softly." + message = "[src] hisses softly." m_type = 1 if ("jump") - message = "[src] jumps!" + message = "[src] jumps!" m_type = 1 if ("moan") - message = "[src] moans!" + message = "[src] moans!" m_type = 2 if ("nod") - message = "[src] nods its head." + message = "[src] nods its head." m_type = 1 // if ("roar") // if (!muzzled) -// message = "[src] roars." Commenting out since larva shouldn't roar /N +// message = "[src] roars." Commenting out since larva shouldn't roar /N // m_type = 2 if ("roll") if (!src.restrained()) - message = "[src] rolls." + message = "[src] rolls." m_type = 1 if ("scratch") if (!src.restrained()) - message = "[src] scratches." + message = "[src] scratches." m_type = 1 if ("scretch") if (!muzzled) - message = "[src] scretches." + message = "[src] scretches." m_type = 2 if ("shake") - message = "[src] shakes its head." + message = "[src] shakes its head." m_type = 1 if ("shiver") - message = "[src] shivers." + message = "[src] shivers." m_type = 2 if ("sign") if (!src.restrained()) - message = text("The alien signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null)) + message = text("[src] signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null)) m_type = 1 // if ("sit") -// message = "[src] sits down." //Larvan can't sit down, /N +// message = "[src] sits down." //Larvan can't sit down, /N // m_type = 1 if ("sulk") - message = "[src] sulks down sadly." + message = "[src] sulks down sadly." m_type = 1 if ("sway") - message = "[src] sways around dizzily." + message = "[src] sways around dizzily." m_type = 1 if ("tail") - message = "[src] waves its tail." + message = "[src] waves its tail." m_type = 1 if ("twitch") - message = "[src] twitches violently." + message = "[src] twitches violently." m_type = 1 if ("whimper") if (!muzzled) - message = "[src] whimpers." + message = "[src] whimpers." m_type = 2 if ("help") //"The exception" src << "Help for larva emotes. You can use these emotes with say \"*emote\":\n\nburp, choke, collapse, dance, drool, gasp, gnarl, hiss, jump, moan, nod, roll, scratch,\nscretch, shake, shiver, sign-#, sulk, sway, tail, twitch, whimper" else - src << "\blue Unusable emote '[act]'. Say *help for a list." + src << " Unusable emote '[act]'. Say *help for a list." if ((message && src.stat == 0)) log_emote("[name]/[key] : [message]") if (m_type & 1) diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index cb4774f6b90..b7f6cb35a41 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -62,327 +62,325 @@ handle_regular_hud_updates() -/mob/living/carbon/alien/larva +/mob/living/carbon/alien/larva/proc/breathe() - proc/breathe() + if(reagents.has_reagent("lexorin")) return + if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return - if(reagents.has_reagent("lexorin")) return - if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return + var/datum/gas_mixture/environment = loc.return_air() + var/datum/gas_mixture/breath + // HACK NEED CHANGING LATER + if(health <= config.health_threshold_crit) + losebreath++ - var/datum/gas_mixture/environment = loc.return_air() - var/datum/gas_mixture/breath - // HACK NEED CHANGING LATER - if(health <= config.health_threshold_crit) - losebreath++ + if(losebreath>0) //Suffocating so do not take a breath + losebreath-- + if (prob(75)) //High chance of gasping for air + spawn emote("gasp") + if(istype(loc, /obj/)) + var/obj/location_as_object = loc + location_as_object.handle_internal_lifeform(src, 0) + else + //First, check for air from internal atmosphere (using an air tank and mask generally) + breath = get_breath_from_internal(BREATH_VOLUME) - if(losebreath>0) //Suffocating so do not take a breath - losebreath-- - if (prob(75)) //High chance of gasping for air - spawn emote("gasp") + //No breath from internal atmosphere so get breath from location + if(!breath) + if(istype(loc, /obj/)) + var/obj/location_as_object = loc + breath = location_as_object.handle_internal_lifeform(src, BREATH_VOLUME) + else if(istype(loc, /turf/)) + var/breath_moles = 0 + /*if(environment.return_pressure() > ONE_ATMOSPHERE) + // Loads of air around (pressure effect will be handled elsewhere), so lets just take a enough to fill our lungs at normal atmos pressure (using n = Pv/RT) + breath_moles = (ONE_ATMOSPHERE*BREATH_VOLUME/R_IDEAL_GAS_EQUATION*environment.temperature) + else*/ + // Not enough air around, take a percentage of what's there to model this properly + breath_moles = environment.total_moles()*BREATH_PERCENTAGE + + breath = loc.remove_air(breath_moles) + + // Handle chem smoke effect -- Doohl + for(var/obj/effect/effect/chem_smoke/smoke in view(1, src)) + if(smoke.reagents.total_volume) + smoke.reagents.reaction(src, INGEST) + spawn(5) + if(smoke) + smoke.reagents.copy_to(src, 10) // I dunno, maybe the reagents enter the blood stream through the lungs? + break // If they breathe in the nasty stuff once, no need to continue checking + + + else //Still give containing object the chance to interact if(istype(loc, /obj/)) var/obj/location_as_object = loc location_as_object.handle_internal_lifeform(src, 0) - else - //First, check for air from internal atmosphere (using an air tank and mask generally) - breath = get_breath_from_internal(BREATH_VOLUME) - //No breath from internal atmosphere so get breath from location - if(!breath) - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - breath = location_as_object.handle_internal_lifeform(src, BREATH_VOLUME) - else if(istype(loc, /turf/)) - var/breath_moles = 0 - /*if(environment.return_pressure() > ONE_ATMOSPHERE) - // Loads of air around (pressure effect will be handled elsewhere), so lets just take a enough to fill our lungs at normal atmos pressure (using n = Pv/RT) - breath_moles = (ONE_ATMOSPHERE*BREATH_VOLUME/R_IDEAL_GAS_EQUATION*environment.temperature) - else*/ - // Not enough air around, take a percentage of what's there to model this properly - breath_moles = environment.total_moles()*BREATH_PERCENTAGE + handle_breath(breath) - breath = loc.remove_air(breath_moles) - - // Handle chem smoke effect -- Doohl - for(var/obj/effect/effect/chem_smoke/smoke in view(1, src)) - if(smoke.reagents.total_volume) - smoke.reagents.reaction(src, INGEST) - spawn(5) - if(smoke) - smoke.reagents.copy_to(src, 10) // I dunno, maybe the reagents enter the blood stream through the lungs? - break // If they breathe in the nasty stuff once, no need to continue checking + if(breath) + loc.assume_air(breath) - else //Still give containing object the chance to interact - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - location_as_object.handle_internal_lifeform(src, 0) - - handle_breath(breath) - - if(breath) - loc.assume_air(breath) - - - proc/get_breath_from_internal(volume_needed) +/mob/living/carbon/alien/larva/proc/get_breath_from_internal(volume_needed) + if(internal) + if (!contents.Find(internal)) + internal = null + if (!wear_mask || !(wear_mask.flags & MASKINTERNALS) ) + internal = null if(internal) - if (!contents.Find(internal)) - internal = null - if (!wear_mask || !(wear_mask.flags & MASKINTERNALS) ) - internal = null - if(internal) - if (internals) - internals.icon_state = "internal1" - return internal.remove_air_volume(volume_needed) - else - if (internals) - internals.icon_state = "internal0" - return null - - proc/handle_breath(datum/gas_mixture/breath) - if(status_flags & GODMODE) - return - - if(!breath || (breath.total_moles() == 0)) - //Aliens breathe in vaccuum - return 0 - - var/toxins_used = 0 - var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME - - //Partial pressure of the toxins in our breath - var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure - - if(Toxins_pp) // Detect toxins in air - - adjustToxLoss(breath.toxins*250) - toxins_alert = max(toxins_alert, 1) - - toxins_used = breath.toxins - + if (internals) + internals.icon_state = "internal1" + return internal.remove_air_volume(volume_needed) else - toxins_alert = 0 + if (internals) + internals.icon_state = "internal0" + return null - //Breathe in toxins and out oxygen - breath.toxins -= toxins_used - breath.oxygen += toxins_used - - if(breath.temperature > (T0C+66) && !(COLD_RESISTANCE in mutations)) // Hot air hurts :( - if(prob(20)) - src << "\red You feel a searing heat in your lungs!" - fire_alert = max(fire_alert, 1) - else - fire_alert = 0 - - //Temporary fixes to the alerts. - - return 1 - - - proc/handle_chemicals_in_body() - if(reagents) reagents.metabolize(src) - - if(FAT in mutations) - if(nutrition < 100) - if(prob(round((50 - nutrition) / 100))) - src << "\blue You feel fit again!" - mutations.Add(FAT) - else - if(nutrition > 500) - if(prob(5 + round((nutrition - max_grown) / 2))) - src << "\red You suddenly feel blubbery!" - mutations.Add(FAT) - - if (nutrition > 0) - nutrition-= HUNGER_FACTOR - - if (drowsyness) - drowsyness-- - eye_blurry = max(2, eye_blurry) - if (prob(5)) - sleeping += 1 - Paralyse(5) - - confused = max(0, confused - 1) - // decrement dizziness counter, clamped to 0 - if(resting) - dizziness = max(0, dizziness - 5) - jitteriness = max(0, jitteriness - 5) - else - dizziness = max(0, dizziness - 1) - jitteriness = max(0, jitteriness - 1) - - updatehealth() - - return //TODO: DEFERRED - - proc/handle_regular_status_updates() - updatehealth() - - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP - blinded = 1 - silent = 0 - else //ALIVE. LIGHTS ARE ON - if(health < -25 || !getorgan(/obj/item/organ/brain)) - death() - blinded = 1 - silent = 0 - return 1 - - //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 25) || (config.health_threshold_crit >= health) ) - //if( health <= 20 && prob(1) ) - // spawn(0) - // emote("gasp") - if(!reagents.has_reagent("inaprovaline")) - adjustOxyLoss(1) - Paralyse(3) - - if(paralysis) - AdjustParalysis(-2) - blinded = 1 - stat = UNCONSCIOUS - else if(sleeping) - sleeping = max(sleeping-1, 0) - blinded = 1 - stat = UNCONSCIOUS - if( prob(10) && health ) - spawn(0) - emote("hiss_") - //CONSCIOUS - else - stat = CONSCIOUS - - /* What in the living hell is this?*/ - if(move_delay_add > 0) - move_delay_add = max(0, move_delay_add - rand(1, 2)) - - //Eyes - if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own - blinded = 1 - else if(eye_blind) //blindness, heals slowly over time - eye_blind = max(eye_blind-1,0) - blinded = 1 - else if(eye_blurry) //blurry eyes heal slowly - eye_blurry = max(eye_blurry-1, 0) - - //Ears - if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own - ear_deaf = max(ear_deaf, 1) - else if(ear_deaf) //deafness, heals slowly over time - ear_deaf = max(ear_deaf-1, 0) - else if(ear_damage < 25) //ear damage heals slowly under this threshold. - ear_damage = max(ear_damage-0.05, 0) - - //Other - if(stunned) - AdjustStunned(-1) - - if(weakened) - weakened = max(weakened-1,0) - - if(stuttering) - stuttering = max(stuttering-1, 0) - - if(silent) - silent = max(silent-1, 0) - - if(druggy) - druggy = max(druggy-1, 0) - return 1 - - - proc/handle_regular_hud_updates() - - if (stat == 2 || (XRAY in mutations)) - sight |= SEE_TURFS - sight |= SEE_MOBS - sight |= SEE_OBJS - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - else if (stat != 2) - sight |= SEE_MOBS - sight &= ~SEE_TURFS - sight &= ~SEE_OBJS - see_in_dark = 4 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - if(see_override) - see_invisible = see_override - - if (healths) - if (stat != 2) - switch(health) - if(25 to INFINITY) - healths.icon_state = "health0" - if(19 to 25) - healths.icon_state = "health1" - if(13 to 19) - healths.icon_state = "health2" - if(7 to 13) - healths.icon_state = "health3" - if(0 to 7) - healths.icon_state = "health4" - else - healths.icon_state = "health5" - else - healths.icon_state = "health6" - - if(pullin) - if(pulling) - pullin.icon_state = "pull" - else - pullin.icon_state = "pull0" - - if (toxin) toxin.icon_state = "tox[toxins_alert ? 1 : 0]" - if (oxygen) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]" - if (fire) fire.icon_state = "fire[fire_alert ? 1 : 0]" - //NOTE: the alerts dont reset when youre out of danger. dont blame me, - //blame the person who coded them. Temporary fix added. - - - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) - - if ((blind && stat != 2)) - if ((blinded)) - blind.layer = 18 - else - blind.layer = 0 - - if (disabilities & NEARSIGHTED) - client.screen += global_hud.vimpaired - - if (eye_blurry) - client.screen += global_hud.blurry - - if (druggy) - client.screen += global_hud.druggy - - if (stat != 2) - if (machine) - if (!( machine.check_eye(src) )) - reset_view(null) - else - if(!client.adminobs) - reset_view(null) - - return 1 - - proc/handle_random_events() +/mob/living/carbon/alien/larva/proc/handle_breath(datum/gas_mixture/breath) + if(status_flags & GODMODE) return + if(!breath || (breath.total_moles() == 0)) + //Aliens breathe in vaccuum + return 0 - proc/handle_stomach() - spawn(0) - for(var/mob/living/M in stomach_contents) - if(M.loc != src) + var/toxins_used = 0 + var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME + + //Partial pressure of the toxins in our breath + var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure + + if(Toxins_pp) // Detect toxins in air + + adjustToxLoss(breath.toxins*250) + toxins_alert = max(toxins_alert, 1) + + toxins_used = breath.toxins + + else + toxins_alert = 0 + + //Breathe in toxins and out oxygen + breath.toxins -= toxins_used + breath.oxygen += toxins_used + + if(breath.temperature > (T0C+66) && !(COLD_RESISTANCE in mutations)) // Hot air hurts :( + if(prob(20)) + src << "You feel a searing heat in your lungs!" + fire_alert = max(fire_alert, 1) + else + fire_alert = 0 + + //Temporary fixes to the alerts. + + return 1 + + +/mob/living/carbon/alien/larva/proc/handle_chemicals_in_body() + if(reagents) reagents.metabolize(src) + + if(FAT in mutations) + if(nutrition < 100) + if(prob(round((50 - nutrition) / 100))) + src << "You feel fit again!" + mutations.Add(FAT) + else + if(nutrition > 500) + if(prob(5 + round((nutrition - max_grown) / 2))) + src << "You suddenly feel blubbery!" + mutations.Add(FAT) + + if (nutrition > 0) + nutrition-= HUNGER_FACTOR + + if (drowsyness) + drowsyness-- + eye_blurry = max(2, eye_blurry) + if (prob(5)) + sleeping += 1 + Paralyse(5) + + confused = max(0, confused - 1) + // decrement dizziness counter, clamped to 0 + if(resting) + dizziness = max(0, dizziness - 5) + jitteriness = max(0, jitteriness - 5) + else + dizziness = max(0, dizziness - 1) + jitteriness = max(0, jitteriness - 1) + + updatehealth() + + return //TODO: DEFERRED + +/mob/living/carbon/alien/larva/proc/handle_regular_status_updates() + updatehealth() + + if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP + blinded = 1 + silent = 0 + else //ALIVE. LIGHTS ARE ON + if(health < -25 || !getorgan(/obj/item/organ/brain)) + death() + blinded = 1 + silent = 0 + return 1 + + //UNCONSCIOUS. NO-ONE IS HOME + if( (getOxyLoss() > 25) || (config.health_threshold_crit >= health) ) + //if( health <= 20 && prob(1) ) + // spawn(0) + // emote("gasp") + if(!reagents.has_reagent("inaprovaline")) + adjustOxyLoss(1) + Paralyse(3) + + if(paralysis) + AdjustParalysis(-2) + blinded = 1 + stat = UNCONSCIOUS + else if(sleeping) + sleeping = max(sleeping-1, 0) + blinded = 1 + stat = UNCONSCIOUS + if( prob(10) && health ) + spawn(0) + emote("hiss_") + //CONSCIOUS + else + stat = CONSCIOUS + + /* What in the living hell is this?*/ + if(move_delay_add > 0) + move_delay_add = max(0, move_delay_add - rand(1, 2)) + + //Eyes + if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own + blinded = 1 + else if(eye_blind) //blindness, heals slowly over time + eye_blind = max(eye_blind-1,0) + blinded = 1 + else if(eye_blurry) //blurry eyes heal slowly + eye_blurry = max(eye_blurry-1, 0) + + //Ears + if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own + ear_deaf = max(ear_deaf, 1) + else if(ear_deaf) //deafness, heals slowly over time + ear_deaf = max(ear_deaf-1, 0) + else if(ear_damage < 25) //ear damage heals slowly under this threshold. + ear_damage = max(ear_damage-0.05, 0) + + //Other + if(stunned) + AdjustStunned(-1) + + if(weakened) + weakened = max(weakened-1,0) + + if(stuttering) + stuttering = max(stuttering-1, 0) + + if(silent) + silent = max(silent-1, 0) + + if(druggy) + druggy = max(druggy-1, 0) + return 1 + + +/mob/living/carbon/alien/larva/proc/handle_regular_hud_updates() + + if (stat == 2 || (XRAY in mutations)) + sight |= SEE_TURFS + sight |= SEE_MOBS + sight |= SEE_OBJS + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_LEVEL_TWO + else if (stat != 2) + sight |= SEE_MOBS + sight &= ~SEE_TURFS + sight &= ~SEE_OBJS + see_in_dark = 4 + see_invisible = SEE_INVISIBLE_LEVEL_TWO + if(see_override) + see_invisible = see_override + + if (healths) + if (stat != 2) + switch(health) + if(25 to INFINITY) + healths.icon_state = "health0" + if(19 to 25) + healths.icon_state = "health1" + if(13 to 19) + healths.icon_state = "health2" + if(7 to 13) + healths.icon_state = "health3" + if(0 to 7) + healths.icon_state = "health4" + else + healths.icon_state = "health5" + else + healths.icon_state = "health6" + + if(pullin) + if(pulling) + pullin.icon_state = "pull" + else + pullin.icon_state = "pull0" + + if (toxin) toxin.icon_state = "tox[toxins_alert ? 1 : 0]" + if (oxygen) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]" + if (fire) fire.icon_state = "fire[fire_alert ? 1 : 0]" + //NOTE: the alerts dont reset when youre out of danger. dont blame me, + //blame the person who coded them. Temporary fix added. + + + client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) + + if ((blind && stat != 2)) + if ((blinded)) + blind.layer = 18 + else + blind.layer = 0 + + if (disabilities & NEARSIGHTED) + client.screen += global_hud.vimpaired + + if (eye_blurry) + client.screen += global_hud.blurry + + if (druggy) + client.screen += global_hud.druggy + + if (stat != 2) + if (machine) + if (!( machine.check_eye(src) )) + reset_view(null) + else + if(!client.adminobs) + reset_view(null) + + return 1 + +/mob/living/carbon/alien/larva/proc/handle_random_events() + return + + +/mob/living/carbon/alien/larva/proc/handle_stomach() + spawn(0) + for(var/mob/living/M in stomach_contents) + if(M.loc != src) + stomach_contents.Remove(M) + continue + if(istype(M, /mob/living/carbon) && stat != 2) + if(M.stat == 2) + M.death(1) stomach_contents.Remove(M) + qdel(M) continue - if(istype(M, /mob/living/carbon) && stat != 2) - if(M.stat == 2) - M.death(1) - stomach_contents.Remove(M) - qdel(M) - continue - if(air_master.current_cycle%3==1) - if(!(M.status_flags & GODMODE)) - M.adjustBruteLoss(5) - nutrition += 10 \ No newline at end of file + if(air_master.current_cycle%3==1) + if(!(M.status_flags & GODMODE)) + M.adjustBruteLoss(5) + nutrition += 10 diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index 21e5494e2bb..46097e7c411 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -9,13 +9,13 @@ if (layer != TURF_LAYER+0.2) layer = TURF_LAYER+0.2 - src << text("\green You are now hiding.") + src << text("You are now hiding.") for(var/mob/O in oviewers(src, null)) if ((O.client && !( O.blinded ))) - O << text("[] scurries to the ground!", src) + O << text("[] scurries to the ground!", src) else layer = MOB_LAYER - src << text("\green You have stopped hiding.") + src << text("You have stopped hiding.") for(var/mob/O in oviewers(src, null)) if ((O.client && !( O.blinded ))) O << text("[] slowly peaks up from the ground...", src) @@ -29,15 +29,14 @@ return if(handcuffed || legcuffed) - src << "\red You cannot evolve when you are cuffed." + src << "You cannot evolve when you are cuffed." if(amount_grown >= max_grown) //TODO ~Carn - //green is impossible to read, so i made these blue and changed the formatting slightly - src << "\blue You are growing into a beautiful alien! It is time to choose a caste." - src << "\blue There are three to choose from:" - src << "Hunters \blue are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves." - src << "Sentinels \blue are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters." - src << "Drones \blue are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen." + src << "You are growing into a beautiful alien! It is time to choose a caste." + src << "There are three to choose from:" + src << "Hunters are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves." + src << "Sentinels are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters." + src << "Drones are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen." var/alien_caste = alert(src, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone") var/mob/living/carbon/alien/humanoid/new_xeno @@ -52,5 +51,5 @@ qdel(src) return else - src << "\red You are not fully grown." + src << "You are not fully grown." return diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm index a8e2a3e0034..a65299adfc1 100644 --- a/code/modules/mob/living/carbon/alien/say.dm +++ b/code/modules/mob/living/carbon/alien/say.dm @@ -1,35 +1,7 @@ -/mob/living/carbon/alien/say_understands(var/other) - if (istype(other, /mob/living/carbon/alien)) - return 1 - return ..() - /mob/living/carbon/alien/say(var/message) - - if (silent) - return - - if (length(message) >= 2) - if (copytext(message, 1, 3) == ":a" || copytext(message, 1, 3) == "#a" || copytext(message, 1, 3) == ".a" ) - message = copytext(message, 3) - message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) - if (stat == 2) - return say_dead(message) - else - alien_talk(message) - else - if (copytext(message, 1, 2) != "*" && !stat) - playsound(loc, "hiss", 25, 1, 1)//So aliens can hiss while they hiss yo/N - return ..(message, "A") - else - -// ~lol~ -/mob/living/carbon/alien/say_quote(var/text) -// var/ending = copytext(text, length(text)) - - return "[say_message], \"[text]\""; + return ..(message, "A") /mob/living/proc/alien_talk(var/message) - log_say("[key_name(src)] : [message]") message = trim(message) @@ -38,42 +10,17 @@ var/message_a = say_quote(message) var/rendered = "Hivemind, [name] [message_a]" - for (var/mob/living/S in player_list) - if(!S.stat) - if(S.alien_talk_understand) - if(S.alien_talk_understand == alien_talk_understand) - S.show_message(rendered, 2) - else if (S.hivecheck()) - S.show_message(rendered, 2) + for(var/mob/S in player_list) + if((!S.stat && (S.hivecheck())) || (S.stat == DEAD && !istype(S, /mob/new_player))) + S << rendered - var/list/listening = hearers(1, src) - listening -= src - listening += src +/mob/living/carbon/alien/handle_inherent_channels(message, message_mode) + if(!..()) + if(message_mode == MODE_ALIEN) + if(hivecheck()) + alien_talk(message) + return 1 + return 0 - var/list/heard = list() - for (var/mob/M in listening) - if(!istype(M, /mob/living/carbon/alien) && !M.alien_talk_understand) - heard += M - - - if (length(heard)) - var/message_b - - message_b = "hsssss" - message_b = say_quote(message_b) - message_b = "[message_b]" - - rendered = "[voice_name] [message_b]" - - for (var/mob/M in heard) - M.show_message(rendered, 2) - - message = say_quote(message) - - rendered = "Hivemind, [name] [message_a]" - - for (var/mob/M in player_list) - if (istype(M, /mob/new_player)) - continue - if (M.stat > 1) - M.show_message(rendered, 2) \ No newline at end of file +/mob/living/carbon/alien/hivecheck() + return 1 diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 0a1b0e02ea1..b895068c1c2 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -49,25 +49,25 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "\red Your throat feels sore." + affected_mob << "Your throat feels sore." if(prob(1)) - affected_mob << "\red Mucous runs down the back of your throat." + affected_mob << "Mucous runs down the back of your throat." if(4) if(prob(1)) affected_mob.emote("sneeze") if(prob(1)) affected_mob.emote("cough") if(prob(2)) - affected_mob << "\red Your muscles ache." + affected_mob << "Your muscles ache." if(prob(20)) affected_mob.take_organ_damage(1) if(prob(2)) - affected_mob << "\red Your stomach hurts." + affected_mob << "Your stomach hurts." if(prob(20)) affected_mob.adjustToxLoss(1) affected_mob.updatehealth() if(5) - affected_mob << "\red You feel something tearing its way out of your stomach..." + affected_mob << "You feel something tearing its way out of your stomach..." affected_mob.adjustToxLoss(10) affected_mob.updatehealth() if(prob(50)) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index d337e56d4dd..df9a0e26887 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -47,11 +47,11 @@ var/const/MAX_ACTIVE_TIME = 400 ..() switch(stat) if(DEAD,UNCONSCIOUS) - usr << "\red \b [src] is not moving." + usr << "[src] is not moving." if(CONSCIOUS) - usr << "\red \b [src] seems to be active." + usr << "[src] seems to be active." if (sterile) - usr << "\red \b It looks like the proboscis has been removed." + usr << "It looks like the proboscis has been removed." return /obj/item/clothing/mask/facehugger/attackby(var/obj/item/O,var/mob/m) @@ -117,12 +117,12 @@ var/const/MAX_ACTIVE_TIME = 400 if(stat != CONSCIOUS) return 0 if(!sterile) L.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage - L.visible_message("\red \b [src] leaps at [L]'s face!") + L.visible_message("[src] leaps at [L]'s face!") if(ishuman(L)) var/mob/living/carbon/human/H = L if(H.head && H.head.flags & HEADCOVERSMOUTH) - H.visible_message("\red \b [src] smashes against [H]'s [H.head]!") + H.visible_message("[src] smashes against [H]'s [H.head]!") Die() return 0 @@ -135,7 +135,7 @@ var/const/MAX_ACTIVE_TIME = 400 if(W.flags & NODROP) return 0 target.unEquip(W) - target.visible_message("\red \b [src] tears [W] off of [target]'s face!") + target.visible_message("[src] tears [W] off of [target]'s face!") src.loc = target target.equip_to_slot(src, slot_wear_mask,,0) @@ -164,7 +164,7 @@ var/const/MAX_ACTIVE_TIME = 400 if(!sterile) //target.contract_disease(new /datum/disease/alien_embryo(0)) //so infection chance is same as virus infection chance - target.visible_message("\red \b [src] falls limp after violating [target]'s face!") + target.visible_message("[src] falls limp after violating [target]'s face!") Die() icon_state = "[initial(icon_state)]_impregnated" @@ -178,7 +178,7 @@ var/const/MAX_ACTIVE_TIME = 400 src.loc = get_turf(C) C.facehugger = null else - target.visible_message("\red \b [src] violates [target]'s face!") + target.visible_message("[src] violates [target]'s face!") return /obj/item/clothing/mask/facehugger/proc/GoActive() @@ -218,7 +218,7 @@ var/const/MAX_ACTIVE_TIME = 400 icon_state = "[initial(icon_state)]_dead" stat = DEAD - src.visible_message("\red \b[src] curls up into a ball!") + src.visible_message("[src] curls up into a ball!") return diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 442698859b7..028440606bd 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -26,12 +26,12 @@ if(istype(O,/obj/item/organ/brain)) //Time to stick a brain in it --NEO var/obj/item/organ/brain/newbrain = O if(brain) - user << "\red There's already a brain in the MMI!" + user << "There's already a brain in the MMI!" return if(!newbrain.brainmob) - user << "\red You aren't sure where this brain came from, but you're pretty sure it's a useless brain." + user << "You aren't sure where this brain came from, but you're pretty sure it's a useless brain." return - visible_message("\blue [user] sticks \a [newbrain] into \the [src]") + visible_message("[user] sticks \a [newbrain] into \the [src]") brainmob = newbrain.brainmob newbrain.brainmob = null @@ -60,9 +60,9 @@ if((istype(O,/obj/item/weapon/card/id)||istype(O,/obj/item/device/pda)) && brainmob) if(allowed(user)) locked = !locked - user << "\blue You [locked ? "lock" : "unlock"] the brain holder." + user << "You [locked ? "lock" : "unlock"] the brain holder." else - user << "\red Access denied." + user << "Access denied." return if(brainmob) O.attack(brainmob, user) //Oh noooeeeee @@ -71,11 +71,11 @@ /obj/item/device/mmi/attack_self(mob/user as mob) if(!brain) - user << "\red You upend the MMI, but there's nothing in it." + user << "You upend the MMI, but there's nothing in it." else if(locked) - user << "\red You upend the MMI, but the brain is clamped into place." + user << "You upend the MMI, but the brain is clamped into place." else - user << "\blue You upend the MMI, spilling the brain onto the floor." + user << "You upend the MMI, spilling the brain onto the floor." brainmob.container = null //Reset brainmob mmi var. brainmob.loc = brain //Throw mob into brain. @@ -131,7 +131,7 @@ brainmob << "Can't do that while incapacitated or dead." radio.broadcasting = radio.broadcasting==1 ? 0 : 1 - brainmob << "\blue Radio is [radio.broadcasting==1 ? "now" : "no longer"] broadcasting." + brainmob << "Radio is [radio.broadcasting==1 ? "now" : "no longer"] broadcasting." /obj/item/device/mmi/radio_enabled/verb/Toggle_Listening() set name = "Toggle Listening" @@ -144,7 +144,7 @@ brainmob << "Can't do that while incapacitated or dead." radio.listening = radio.listening==1 ? 0 : 1 - brainmob << "\blue Radio is [radio.listening==1 ? "now" : "no longer"] receiving broadcast." + brainmob << "Radio is [radio.listening==1 ? "now" : "no longer"] receiving broadcast." /obj/item/device/mmi/emp_act(severity) if(!brainmob) diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 82498bd1afd..2f0d259284c 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -1,50 +1,23 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 /mob/living/carbon/brain + languages = HUMAN var/obj/item/container = null var/timeofhostdeath = 0 var/emp_damage = 0//Handles a type of MMI damage var/alert = null - New() - create_reagents(1000) - ..() - - Destroy() - if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting. - if(stat!=DEAD) //If not dead. - death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA - ghostize() //Ghostize checks for key so nothing else is necessary. - ..() - - say_understands(var/other)//Goddamn is this hackish, but this say code is so odd - if (istype(other, /mob/living/silicon/ai)) - if(!(container && istype(container, /obj/item/device/mmi))) - return 0 - else - return 1 - if (istype(other, /mob/living/silicon/decoy)) - if(!(container && istype(container, /obj/item/device/mmi))) - return 0 - else - return 1 - if (istype(other, /mob/living/silicon/pai)) - if(!(container && istype(container, /obj/item/device/mmi))) - return 0 - else - return 1 - if (istype(other, /mob/living/silicon/robot)) - if(!(container && istype(container, /obj/item/device/mmi))) - return 0 - else - return 1 - if (istype(other, /mob/living/carbon/human)) - return 1 - if (istype(other, /mob/living/carbon/slime)) - return 1 - return ..() - +/mob/living/carbon/brain/New() + create_reagents(1000) + ..() +/mob/living/carbon/brain/Destroy() + if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting. + if(stat!=DEAD) //If not dead. + death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA + ghostize() //Ghostize checks for key so nothing else is necessary. + ..() + /mob/living/carbon/brain/update_canmove() if(in_contents_of(/obj/mecha)) canmove = 1 else canmove = 0 diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm index 5e44ce96ccd..51b17b8e7fa 100644 --- a/code/modules/mob/living/carbon/brain/death.dm +++ b/code/modules/mob/living/carbon/brain/death.dm @@ -2,7 +2,7 @@ if(stat == DEAD) return if(!gibbed && container && istype(container, /obj/item/device/mmi))//If not gibbed but in a container. for(var/mob/O in viewers(container, null)) - O.show_message(text("\red []'s MMI flatlines!", src), 1, "\red You hear something flatline.", 2) + O.show_message(text("[]'s MMI flatlines!", src), 1, "You hear something flatline.", 2) if(istype(src,/obj/item/organ/brain/alien)) container.icon_state = "mmi_alien_dead" else diff --git a/code/modules/mob/living/carbon/brain/emote.dm b/code/modules/mob/living/carbon/brain/emote.dm index 1b3966ebe4f..eae87baf57f 100644 --- a/code/modules/mob/living/carbon/brain/emote.dm +++ b/code/modules/mob/living/carbon/brain/emote.dm @@ -54,7 +54,7 @@ src << "Help for MMI emotes. You can use these emotes with say \"*emote\":\nalarm, alert, beep, blink, boop, flash, notice, whistle" else - src << "\blue Unusable emote '[act]'. Say *help for a list." + src << "Unusable emote '[act]'. Say *help for a list." if (message) log_emote("[name]/[key] : [message]") diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index a0d54685034..dcd67418415 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -32,244 +32,243 @@ handle_regular_hud_updates() -/mob/living/carbon/brain/ - proc/handle_mutations_and_radiation() +/mob/living/carbon/brain/proc/handle_mutations_and_radiation() - if (radiation) - if (radiation > 100) - radiation = 100 - if(!container)//If it's not in an MMI - src << "\red You feel weak." - else//Fluff-wise, since the brain can't detect anything itself, the MMI handles thing like that - src << "\red STATUS: CRITICAL AMOUNTS OF RADIATION DETECTED." + if (radiation) + if (radiation > 100) + radiation = 100 + if(!container)//If it's not in an MMI + src << "You feel weak." + else//Fluff-wise, since the brain can't detect anything itself, the MMI handles thing like that + src << "STATUS: CRITICAL AMOUNTS OF RADIATION DETECTED." - switch(radiation) - if(1 to 49) - radiation-- - if(prob(25)) - adjustToxLoss(1) - updatehealth() - - if(50 to 74) - radiation -= 2 + switch(radiation) + if(1 to 49) + radiation-- + if(prob(25)) adjustToxLoss(1) - if(prob(5)) - radiation -= 5 - if(!container) - src << "\red You feel weak." - else - src << "\red STATUS: DANGEROUS LEVELS OF RADIATION DETECTED." updatehealth() - if(75 to 100) - radiation -= 3 - adjustToxLoss(3) - updatehealth() + if(50 to 74) + radiation -= 2 + adjustToxLoss(1) + if(prob(5)) + radiation -= 5 + if(!container) + src << "You feel weak." + else + src << "STATUS: DANGEROUS LEVELS OF RADIATION DETECTED." + updatehealth() + + if(75 to 100) + radiation -= 3 + adjustToxLoss(3) + updatehealth() - proc/handle_environment(datum/gas_mixture/environment) - if(!environment) - return - var/environment_heat_capacity = environment.heat_capacity() - if(istype(get_turf(src), /turf/space)) - var/turf/heat_turf = get_turf(src) - environment_heat_capacity = heat_turf.heat_capacity +/mob/living/carbon/brain/proc/handle_environment(datum/gas_mixture/environment) + if(!environment) + return + var/environment_heat_capacity = environment.heat_capacity() + if(istype(get_turf(src), /turf/space)) + var/turf/heat_turf = get_turf(src) + environment_heat_capacity = heat_turf.heat_capacity - if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10))) - var/transfer_coefficient = 1 + if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10))) + var/transfer_coefficient = 1 - handle_temperature_damage(HEAD, environment.temperature, environment_heat_capacity*transfer_coefficient) + handle_temperature_damage(HEAD, environment.temperature, environment_heat_capacity*transfer_coefficient) - if(stat==2) - bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000) + if(stat==2) + bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000) - //Account for massive pressure differences + //Account for massive pressure differences - return //TODO: DEFERRED + return //TODO: DEFERRED - proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity) - if(status_flags & GODMODE) return +/mob/living/carbon/brain/proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity) + if(status_flags & GODMODE) return - if(exposed_temperature > bodytemperature) - var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) - //adjustFireLoss(2.5*discomfort) - //adjustFireLoss(5.0*discomfort) - adjustFireLoss(20.0*discomfort) + if(exposed_temperature > bodytemperature) + var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) + //adjustFireLoss(2.5*discomfort) + //adjustFireLoss(5.0*discomfort) + adjustFireLoss(20.0*discomfort) - else - var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) - //adjustFireLoss(2.5*discomfort) - adjustFireLoss(5.0*discomfort) + else + var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) + //adjustFireLoss(2.5*discomfort) + adjustFireLoss(5.0*discomfort) - proc/handle_chemicals_in_body() +/mob/living/carbon/brain/proc/handle_chemicals_in_body() - if(reagents) reagents.metabolize(src) + if(reagents) reagents.metabolize(src) - confused = max(0, confused - 1) - // decrement dizziness counter, clamped to 0 - if(resting) - dizziness = max(0, dizziness - 5) - else - dizziness = max(0, dizziness - 1) + confused = max(0, confused - 1) + // decrement dizziness counter, clamped to 0 + if(resting) + dizziness = max(0, dizziness - 5) + else + dizziness = max(0, dizziness - 1) - updatehealth() + updatehealth() - return //TODO: DEFERRED + return //TODO: DEFERRED - proc/handle_regular_status_updates() //TODO: comment out the unused bits >_> - updatehealth() +/mob/living/carbon/brain/proc/handle_regular_status_updates() //TODO: comment out the unused bits >_> + updatehealth() - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP + if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP + blinded = 1 + silent = 0 + else //ALIVE. LIGHTS ARE ON + if( !container && (health < config.health_threshold_dead || ((world.time - timeofhostdeath) > config.revival_brain_life)) ) + death() blinded = 1 silent = 0 - else //ALIVE. LIGHTS ARE ON - if( !container && (health < config.health_threshold_dead || ((world.time - timeofhostdeath) > config.revival_brain_life)) ) - death() - blinded = 1 - silent = 0 - return 1 + return 1 - //Handling EMP effect in the Life(), it's made VERY simply, and has some additional effects handled elsewhere - if(emp_damage) //This is pretty much a damage type only used by MMIs, dished out by the emp_act - if(!(container && istype(container, /obj/item/device/mmi))) - emp_damage = 0 - else - emp_damage = round(emp_damage,1)//Let's have some nice numbers to work with - switch(emp_damage) - if(31 to INFINITY) - emp_damage = 30//Let's not overdo it - if(21 to 30)//High level of EMP damage, unable to see, hear, or speak - eye_blind = 1 - blinded = 1 - ear_deaf = 1 - silent = 1 - if(!alert)//Sounds an alarm, but only once per 'level' - emote("alarm") - src << "\red Major electrical distruption detected: System rebooting." - alert = 1 - if(prob(75)) - emp_damage -= 1 - if(20) - alert = 0 - blinded = 0 - eye_blind = 0 - ear_deaf = 0 - silent = 0 - emp_damage -= 1 - if(11 to 19)//Moderate level of EMP damage, resulting in nearsightedness and ear damage - eye_blurry = 1 - ear_damage = 1 - if(!alert) - emote("alert") - src << "\red Primary systems are now online." - alert = 1 - if(prob(50)) - emp_damage -= 1 - if(10) - alert = 0 - eye_blurry = 0 - ear_damage = 0 - emp_damage -= 1 - if(2 to 9)//Low level of EMP damage, has few effects(handled elsewhere) - if(!alert) - emote("notice") - src << "\red System reboot nearly complete." - alert = 1 - if(prob(25)) - emp_damage -= 1 - if(1) - alert = 0 - src << "\red All systems restored." - emp_damage -= 1 - - //Other - /* commented out because none of these should happen - if(stunned) - AdjustStunned(-1) - - if(weakened) - weakened = max(weakened-1,0) - - if(stuttering) - stuttering = max(stuttering-1, 0) - - if(silent) - silent = max(silent-1, 0) - - if(druggy) - druggy = max(druggy-1, 0) - */ - return 1 - - - proc/handle_regular_hud_updates() - - if (stat == 2 || (XRAY in src.mutations)) - sight |= SEE_TURFS - sight |= SEE_MOBS - sight |= SEE_OBJS - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - else if (stat != 2) - sight &= ~SEE_TURFS - sight &= ~SEE_MOBS - sight &= ~SEE_OBJS - see_in_dark = 2 - see_invisible = SEE_INVISIBLE_LIVING - if(see_override) - see_invisible = see_override - - if (healths) - if (stat != 2) - switch(health) - if(100 to INFINITY) - healths.icon_state = "health0" - if(80 to 100) - healths.icon_state = "health1" - if(60 to 80) - healths.icon_state = "health2" - if(40 to 60) - healths.icon_state = "health3" - if(20 to 40) - healths.icon_state = "health4" - if(0 to 20) - healths.icon_state = "health5" - else - healths.icon_state = "health6" + //Handling EMP effect in the Life(), it's made VERY simply, and has some additional effects handled elsewhere + if(emp_damage) //This is pretty much a damage type only used by MMIs, dished out by the emp_act + if(!(container && istype(container, /obj/item/device/mmi))) + emp_damage = 0 else - healths.icon_state = "health7" + emp_damage = round(emp_damage,1)//Let's have some nice numbers to work with + switch(emp_damage) + if(31 to INFINITY) + emp_damage = 30//Let's not overdo it + if(21 to 30)//High level of EMP damage, unable to see, hear, or speak + eye_blind = 1 + blinded = 1 + ear_deaf = 1 + silent = 1 + if(!alert)//Sounds an alarm, but only once per 'level' + emote("alarm") + src << "Major electrical distruption detected: System rebooting." + alert = 1 + if(prob(75)) + emp_damage -= 1 + if(20) + alert = 0 + blinded = 0 + eye_blind = 0 + ear_deaf = 0 + silent = 0 + emp_damage -= 1 + if(11 to 19)//Moderate level of EMP damage, resulting in nearsightedness and ear damage + eye_blurry = 1 + ear_damage = 1 + if(!alert) + emote("alert") + src << "Primary systems are now online." + alert = 1 + if(prob(50)) + emp_damage -= 1 + if(10) + alert = 0 + eye_blurry = 0 + ear_damage = 0 + emp_damage -= 1 + if(2 to 9)//Low level of EMP damage, has few effects(handled elsewhere) + if(!alert) + emote("notice") + src << "System reboot nearly complete." + alert = 1 + if(prob(25)) + emp_damage -= 1 + if(1) + alert = 0 + src << "All systems restored." + emp_damage -= 1 - if(pullin) pullin.icon_state = "pull[pulling ? 1 : 0]" + //Other + /* commented out because none of these should happen + if(stunned) + AdjustStunned(-1) - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) + if(weakened) + weakened = max(weakened-1,0) - if ((blind && stat != 2)) - if ((blinded)) - blind.layer = 18 - else - blind.layer = 0 + if(stuttering) + stuttering = max(stuttering-1, 0) - if (disabilities & NEARSIGHTED) - client.screen += global_hud.vimpaired + if(silent) + silent = max(silent-1, 0) - if (eye_blurry) - client.screen += global_hud.blurry + if(druggy) + druggy = max(druggy-1, 0) + */ + return 1 - if (druggy) - client.screen += global_hud.druggy +/mob/living/carbon/brain/proc/handle_regular_hud_updates() + + if (stat == 2 || (XRAY in src.mutations)) + sight |= SEE_TURFS + sight |= SEE_MOBS + sight |= SEE_OBJS + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_LEVEL_TWO + else if (stat != 2) + sight &= ~SEE_TURFS + sight &= ~SEE_MOBS + sight &= ~SEE_OBJS + see_in_dark = 2 + see_invisible = SEE_INVISIBLE_LIVING + if(see_override) + see_invisible = see_override + + if (healths) if (stat != 2) - if (machine) - if (!( machine.check_eye(src) )) - reset_view(null) - else - if(!client.adminobs) - reset_view(null) + switch(health) + if(100 to INFINITY) + healths.icon_state = "health0" + if(80 to 100) + healths.icon_state = "health1" + if(60 to 80) + healths.icon_state = "health2" + if(40 to 60) + healths.icon_state = "health3" + if(20 to 40) + healths.icon_state = "health4" + if(0 to 20) + healths.icon_state = "health5" + else + healths.icon_state = "health6" + else + healths.icon_state = "health7" - return 1 + if(pullin) pullin.icon_state = "pull[pulling ? 1 : 0]" + + client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) + + if ((blind && stat != 2)) + if ((blinded)) + blind.layer = 18 + else + blind.layer = 0 + + if (disabilities & NEARSIGHTED) + client.screen += global_hud.vimpaired + + if (eye_blurry) + client.screen += global_hud.blurry + + if (druggy) + client.screen += global_hud.druggy + + if (stat != 2) + if (machine) + if (!( machine.check_eye(src) )) + reset_view(null) + else + if(!client.adminobs) + reset_view(null) + + return 1 /*/mob/living/carbon/brain/emp_act(severity) @@ -283,4 +282,4 @@ emp_damage += rand(10,20) if(3) emp_damage += rand(0,10) - ..()*/ \ No newline at end of file + ..()*/ diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm index 4b8174cc21b..5c9d10c9ae5 100644 --- a/code/modules/mob/living/carbon/brain/say.dm +++ b/code/modules/mob/living/carbon/brain/say.dm @@ -1,7 +1,4 @@ /mob/living/carbon/brain/say(var/message) - if (silent) - return - if(!(container && istype(container, /obj/item/device/mmi))) return //No MMI, can't speak, bucko./N else @@ -10,8 +7,14 @@ return else message = Gibberish(message, (emp_damage*6))//scrambles the message, gets worse when emp_damage is higher - if(istype(container, /obj/item/device/mmi/radio_enabled)) - var/obj/item/device/mmi/radio_enabled/R = container - if(R.radio) - spawn(0) R.radio.hear_talk(src, sanitize(message)) - ..() \ No newline at end of file + ..() + +/mob/living/carbon/brain/radio(message, message_mode) + if(message_mode && istype(container, /obj/item/device/mmi/radio_enabled)) + var/obj/item/device/mmi/radio_enabled/R = container + if(R.radio) + R.radio.talk_into(src, sanitize(message)) + return ITALICS | REDUCE_RANGE + +/mob/living/carbon/brain/lingcheck() + return 0 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index f2dfb348f29..13c0fcc5e78 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -25,7 +25,7 @@ if(prob(40)) for(var/mob/M in hearers(4, src)) if(M.client) - M.show_message(text("\red You hear something rumbling inside [src]'s stomach..."), 2) + M.show_message(text("You hear something rumbling inside [src]'s stomach..."), 2) var/obj/item/I = user.get_active_hand() if(I && I.force) var/d = rand(round(I.force / 4), I.force) @@ -41,7 +41,7 @@ src.take_organ_damage(d) for(var/mob/M in viewers(user, null)) if(M.client) - M.show_message(text("\red [user] attacks [src]'s stomach wall with the [I.name]!"), 2) + M.show_message(text("[user] attacks [src]'s stomach wall with the [I.name]!"), 2) playsound(user.loc, 'sound/effects/attackblob.ogg', 50, 1) if(prob(src.getBruteLoss() - 50)) @@ -117,9 +117,9 @@ //src.adjustFireLoss(shock_damage) //burn_skin will do this for us //src.updatehealth() src.visible_message( - "\red [src] was shocked by the [source]!", \ - "\red You feel a powerful shock course through your body!", \ - "\red You hear a heavy electrical crack." \ + "[src] was shocked by the [source]!", \ + "You feel a powerful shock course through your body!", \ + "You hear a heavy electrical crack." \ ) // if(src.stunned < shock_damage) src.stunned = shock_damage Stun(5)//This should work for now, more is really silly and makes you lay there forever @@ -308,7 +308,7 @@ //actually throw it! if(item) item.layer = initial(item.layer) - src.visible_message("\red [src] has thrown [item].") + src.visible_message("[src] has thrown [item].") if(!src.lastarea) src.lastarea = get_area(src.loc) @@ -420,7 +420,7 @@ /mob/living/carbon/Topic(href, href_list) ..() //strip panel - if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr)) + if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) if(href_list["internal"]) var/slot = text2num(href_list["internal"]) var/obj/item/ITEM = get_item_by_slot(slot) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index a765805d011..ba715c188be 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -77,13 +77,13 @@ if (!input) return if(copytext(input,1,5) == "says") - src << "\red Invalid emote." + src << "Invalid emote." return else if(copytext(input,1,9) == "exclaims") - src << "\red Invalid emote." + src << "Invalid emote." return else if(copytext(input,1,5) == "asks") - src << "\red Invalid emote." + src << "Invalid emote." return else var/input2 = input("Is this a visible or hearable emote?") in list("Visible","Hearable") @@ -202,7 +202,7 @@ return if (src.client) if (client.prefs.muted & MUTE_IC) - src << "\red You cannot send IC messages (muted)." + src << "You cannot send IC messages (muted)." return if (src.client.handle_spam_prevention(message,MUTE_IC)) return @@ -211,13 +211,13 @@ if(!(message)) return if(copytext(message,1,5) == "says") - src << "\red Invalid emote." + src << "Invalid emote." return else if(copytext(message,1,9) == "exclaims") - src << "\red Invalid emote." + src << "Invalid emote." return else if(copytext(message,1,5) == "asks") - src << "\red Invalid emote." + src << "Invalid emote." return else message = "[src] [message]" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 6cdcc417ba5..78e13478803 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -227,7 +227,7 @@ if(M.attack_sound) playsound(loc, M.attack_sound, 50, 1, 1) visible_message("[M] [M.attacktext] [src]!", \ - "[M] [M.attacktext]!") + "[M] [M.attacktext] [src]!") add_logs(M, src, "attacked", admin=0) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") @@ -403,7 +403,7 @@ /mob/living/carbon/human/Topic(href, href_list) - if(!usr.stat && usr.canmove && !usr.restrained() && Adjacent(usr)) + if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) if(href_list["item"]) var/slot = text2num(href_list["item"]) if(slot in check_obscured_slots()) @@ -607,3 +607,14 @@ threatcount -= 2 return threatcount + + +//Used for new human mobs created by cloning/goleming/podding +/mob/living/carbon/human/proc/set_cloned_appearance() + if(gender == MALE) + facial_hair_style = "Full Beard" + else + facial_hair_style = "Shaved" + hair_style = pick("Bedhead", "Bedhead 2", "Bedhead 3") + underwear = "Nude" + regenerate_icons() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 3fffa8a5958..cd5c6e591e5 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -1,4 +1,5 @@ /mob/living/carbon/human + languages = HUMAN //Hair colour and style var/hair_color = "000" var/hair_style = "Bald" diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 9e99030ba8d..e8065e4a126 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -46,7 +46,7 @@ return 0 if(!w_uniform) if(!disable_warning) - src << "\red You need a jumpsuit before you can attach this [I.name]." + src << "You need a jumpsuit before you can attach this [I.name]." return 0 if( !(I.slot_flags & SLOT_BELT) ) return @@ -80,7 +80,7 @@ return 0 if(!w_uniform) if(!disable_warning) - src << "\red You need a jumpsuit before you can attach this [I.name]." + src << "You need a jumpsuit before you can attach this [I.name]." return 0 if( !(I.slot_flags & SLOT_ID) ) return 0 @@ -92,7 +92,7 @@ return 0 if(!w_uniform) if(!disable_warning) - src << "\red You need a jumpsuit before you can attach this [I.name]." + src << "You need a jumpsuit before you can attach this [I.name]." return 0 if(I.slot_flags & SLOT_DENYPOCKET) return @@ -105,7 +105,7 @@ return 0 if(!w_uniform) if(!disable_warning) - src << "\red You need a jumpsuit before you can attach this [I.name]." + src << "You need a jumpsuit before you can attach this [I.name]." return 0 if(I.slot_flags & SLOT_DENYPOCKET) return 0 @@ -119,7 +119,7 @@ return 0 if(!wear_suit) if(!disable_warning) - src << "\red You need a suit before you can attach this [I.name]." + src << "You need a suit before you can attach this [I.name]." return 0 if(!wear_suit.allowed) if(!disable_warning) @@ -183,7 +183,7 @@ if(istype(S, /obj/item/weapon/storage) && S.can_be_inserted(I,1)) S.handle_item_insertion(I) else - H << "\red You are unable to equip that." + H << "You are unable to equip that." /mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/I, list/slots, qdel_on_fail = 1) @@ -385,5 +385,5 @@ I.loc = back return else - src << "\red You are trying to equip this item to an unsupported inventory slot. Report this to a coder!" + src << "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!" return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 5af4af3c12c..1184b881c8d 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -124,70 +124,68 @@ return ONE_ATMOSPHERE - pressure_difference -/mob/living/carbon/human - - proc/handle_disabilities() - if (disabilities & EPILEPSY) - if ((prob(1) && paralysis < 1)) - src << "\red You have a seizure!" - for(var/mob/O in viewers(src, null)) - if(O == src) - continue - O.show_message(text("\red [src] starts having a seizure!"), 1) - Paralyse(10) - Jitter(1000) - if (disabilities & COUGHING) - if ((prob(5) && paralysis <= 1)) - drop_item() - emote("cough") - if (disabilities & TOURETTES) - if ((prob(10) && paralysis <= 1)) - Stun(10) - switch(rand(1, 3)) - if(1) - emote("twitch") - if(2 to 3) - say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]") - var/x_offset = pixel_x + rand(-2,2) //Should probably be moved into the twitch emote at some point. - var/y_offset = pixel_y + rand(-1,1) - animate(src, pixel_x = pixel_x + x_offset, pixel_y = pixel_y + y_offset, time = 1) - animate(pixel_x = pixel_x - x_offset, pixel_y = pixel_y - y_offset, time = 1) - if (disabilities & NERVOUS) - if (prob(10)) - stuttering = max(10, stuttering) - if (getBrainLoss() >= 60 && stat != 2) - if (prob(3)) - switch(pick(1,2,3)) - if(1) - say(pick("IM A PONY NEEEEEEIIIIIIIIIGH", "without oxigen blob don't evoluate?", "CAPTAINS A COMDOM", "[pick("", "that faggot traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!", "can u give me [pick("telikesis","halk","eppilapse")]?", "THe saiyans screwed", "Bi is THE BEST OF BOTH WORLDS>", "I WANNA PET TEH monkeyS", "stop grifing me!!!!", "SOTP IT#")) - if(2) - say(pick("FUS RO DAH","fucking 4rries!", "stat me", ">my face", "roll it easy!", "waaaaaagh!!!", "red wonz go fasta", "FOR TEH EMPRAH", "lol2cat", "dem dwarfs man, dem dwarfs", "SPESS MAHREENS", "hwee did eet fhor khayosss", "lifelike texture ;_;", "luv can bloooom", "PACKETS!!!")) - if(3) - emote("drool") +/mob/living/carbon/human/proc/handle_disabilities() + if (disabilities & EPILEPSY) + if ((prob(1) && paralysis < 1)) + src << "You have a seizure!" + for(var/mob/O in viewers(src, null)) + if(O == src) + continue + O.show_message(text("[src] starts having a seizure!"), 1) + Paralyse(10) + Jitter(1000) + if (disabilities & COUGHING) + if ((prob(5) && paralysis <= 1)) + drop_item() + emote("cough") + if (disabilities & TOURETTES) + if ((prob(10) && paralysis <= 1)) + Stun(10) + switch(rand(1, 3)) + if(1) + emote("twitch") + if(2 to 3) + say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]") + var/x_offset = pixel_x + rand(-2,2) //Should probably be moved into the twitch emote at some point. + var/y_offset = pixel_y + rand(-1,1) + animate(src, pixel_x = pixel_x + x_offset, pixel_y = pixel_y + y_offset, time = 1) + animate(pixel_x = pixel_x - x_offset, pixel_y = pixel_y - y_offset, time = 1) + if (disabilities & NERVOUS) + if (prob(10)) + stuttering = max(10, stuttering) + if (getBrainLoss() >= 60 && stat != 2) + if (prob(3)) + switch(pick(1,2,3)) + if(1) + say(pick("IM A PONY NEEEEEEIIIIIIIIIGH", "without oxigen blob don't evoluate?", "CAPTAINS A COMDOM", "[pick("", "that faggot traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!", "can u give me [pick("telikesis","halk","eppilapse")]?", "THe saiyans screwed", "Bi is THE BEST OF BOTH WORLDS>", "I WANNA PET TEH monkeyS", "stop grifing me!!!!", "SOTP IT#")) + if(2) + say(pick("FUS RO DAH","fucking 4rries!", "stat me", ">my face", "roll it easy!", "waaaaaagh!!!", "red wonz go fasta", "FOR TEH EMPRAH", "lol2cat", "dem dwarfs man, dem dwarfs", "SPESS MAHREENS", "hwee did eet fhor khayosss", "lifelike texture ;_;", "luv can bloooom", "PACKETS!!!")) + if(3) + emote("drool") - proc/handle_mutations_and_radiation() - if(dna) - dna.species.handle_mutations_and_radiation(src) +/mob/living/carbon/human/proc/handle_mutations_and_radiation() + if(dna) + dna.species.handle_mutations_and_radiation(src) - proc/breathe() - if(dna) - dna.species.breathe(src) +/mob/living/carbon/human/proc/breathe() + if(dna) + dna.species.breathe(src) - return + return - proc/get_breath_from_internal(volume_needed) +/mob/living/carbon/human/proc/get_breath_from_internal(volume_needed) + if(internal) + if (!contents.Find(internal)) + internal = null + if (!wear_mask || !(wear_mask.flags & MASKINTERNALS) ) + internal = null if(internal) - if (!contents.Find(internal)) - internal = null - if (!wear_mask || !(wear_mask.flags & MASKINTERNALS) ) - internal = null - if(internal) - return internal.remove_air_volume(volume_needed) - else if(internals) - internals.icon_state = "internal0" - return null + return internal.remove_air_volume(volume_needed) + else if(internals) + internals.icon_state = "internal0" + return null /*proc/handle_breath(datum/gas_mixture/breath) @@ -199,349 +197,357 @@ return 1*/ - proc/handle_environment(datum/gas_mixture/environment) - if(dna) - dna.species.handle_environment(environment, src) +/mob/living/carbon/human/proc/handle_environment(datum/gas_mixture/environment) + if(dna) + dna.species.handle_environment(environment, src) - return + return ///FIRE CODE - handle_fire() - if(dna) - dna.species.handle_fire(src) +/mob/living/carbon/human/handle_fire() + if(dna) + dna.species.handle_fire(src) - if(..()) - return - var/thermal_protection = get_heat_protection(30000) //If you don't have fire suit level protection, you get a temperature increase - if((1 - thermal_protection) > 0.0001) - bodytemperature += BODYTEMP_HEATING_MAX + if(..()) return + var/thermal_protection = get_heat_protection(30000) //If you don't have fire suit level protection, you get a temperature increase + if((1 - thermal_protection) > 0.0001) + bodytemperature += BODYTEMP_HEATING_MAX + return - IgniteMob() - if(dna) - dna.species.IgniteMob(src) - else - ..() +/mob/living/carbon/human/IgniteMob() + if(dna) + dna.species.IgniteMob(src) + else + ..() - ExtinguishMob() - if(dna) - dna.species.ExtinguishMob(src) - else - ..() +/mob/living/carbon/human/ExtinguishMob() + if(dna) + dna.species.ExtinguishMob(src) + else + ..() //END FIRE CODE /* - proc/adjust_body_temperature(current, loc_temp, boost) - var/temperature = current - var/difference = abs(current-loc_temp) //get difference - var/increments// = difference/10 //find how many increments apart they are - if(difference > 50) - increments = difference/5 - else - increments = difference/10 - var/change = increments*boost // Get the amount to change by (x per increment) - var/temp_change - if(current < loc_temp) - temperature = min(loc_temp, temperature+change) - else if(current > loc_temp) - temperature = max(loc_temp, temperature-change) - temp_change = (temperature - current) - return temp_change - */ +/mob/living/carbon/human/proc/adjust_body_temperature(current, loc_temp, boost) + var/temperature = current + var/difference = abs(current-loc_temp) //get difference + var/increments// = difference/10 //find how many increments apart they are + if(difference > 50) + increments = difference/5 + else + increments = difference/10 + var/change = increments*boost // Get the amount to change by (x per increment) + var/temp_change + if(current < loc_temp) + temperature = min(loc_temp, temperature+change) + else if(current > loc_temp) + temperature = max(loc_temp, temperature-change) + temp_change = (temperature - current) + return temp_change +*/ - proc/stabilize_temperature_from_calories() - switch(bodytemperature) - if(-INFINITY to 260.15) //260.15 is 310.15 - 50, the temperature where you start to feel effects. - if(nutrition >= 2) //If we are very, very cold we'll use up quite a bit of nutriment to heat us up. - nutrition -= 2 - var/body_temperature_difference = 310.15 - bodytemperature - bodytemperature += max((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), BODYTEMP_AUTORECOVERY_MINIMUM) - if(260.15 to 360.15) - var/body_temperature_difference = 310.15 - bodytemperature - bodytemperature += body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR - if(360.15 to INFINITY) //360.15 is 310.15 + 50, the temperature where you start to feel effects. - //We totally need a sweat system cause it totally makes sense...~ - var/body_temperature_difference = 310.15 - bodytemperature - bodytemperature += min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers +/mob/living/carbon/human/proc/stabilize_temperature_from_calories() + switch(bodytemperature) + if(-INFINITY to 260.15) //260.15 is 310.15 - 50, the temperature where you start to feel effects. + if(nutrition >= 2) //If we are very, very cold we'll use up quite a bit of nutriment to heat us up. + nutrition -= 2 + var/body_temperature_difference = 310.15 - bodytemperature + bodytemperature += max((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), BODYTEMP_AUTORECOVERY_MINIMUM) + if(260.15 to 360.15) + var/body_temperature_difference = 310.15 - bodytemperature + bodytemperature += body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR + if(360.15 to INFINITY) //360.15 is 310.15 + 50, the temperature where you start to feel effects. + //We totally need a sweat system cause it totally makes sense...~ + var/body_temperature_difference = 310.15 - bodytemperature + bodytemperature += min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers - //This proc returns a number made up of the flags for body parts which you are protected on. (such as HEAD, CHEST, GROIN, etc. See setup.dm for the full list) - proc/get_heat_protection_flags(temperature) //Temperature is the temperature you're being exposed to. - var/thermal_protection_flags = 0 - //Handle normal clothing - if(head) - if(head.max_heat_protection_temperature && head.max_heat_protection_temperature >= temperature) - thermal_protection_flags |= head.heat_protection - if(wear_suit) - if(wear_suit.max_heat_protection_temperature && wear_suit.max_heat_protection_temperature >= temperature) - thermal_protection_flags |= wear_suit.heat_protection - if(w_uniform) - if(w_uniform.max_heat_protection_temperature && w_uniform.max_heat_protection_temperature >= temperature) - thermal_protection_flags |= w_uniform.heat_protection - if(shoes) - if(shoes.max_heat_protection_temperature && shoes.max_heat_protection_temperature >= temperature) - thermal_protection_flags |= shoes.heat_protection - if(gloves) - if(gloves.max_heat_protection_temperature && gloves.max_heat_protection_temperature >= temperature) - thermal_protection_flags |= gloves.heat_protection - if(wear_mask) - if(wear_mask.max_heat_protection_temperature && wear_mask.max_heat_protection_temperature >= temperature) - thermal_protection_flags |= wear_mask.heat_protection +//This proc returns a number made up of the flags for body parts which you are protected on. (such as HEAD, CHEST, GROIN, etc. See setup.dm for the full list) +/mob/living/carbon/human/proc/get_heat_protection_flags(temperature) //Temperature is the temperature you're being exposed to. + var/thermal_protection_flags = 0 + //Handle normal clothing + if(head) + if(head.max_heat_protection_temperature && head.max_heat_protection_temperature >= temperature) + thermal_protection_flags |= head.heat_protection + if(wear_suit) + if(wear_suit.max_heat_protection_temperature && wear_suit.max_heat_protection_temperature >= temperature) + thermal_protection_flags |= wear_suit.heat_protection + if(w_uniform) + if(w_uniform.max_heat_protection_temperature && w_uniform.max_heat_protection_temperature >= temperature) + thermal_protection_flags |= w_uniform.heat_protection + if(shoes) + if(shoes.max_heat_protection_temperature && shoes.max_heat_protection_temperature >= temperature) + thermal_protection_flags |= shoes.heat_protection + if(gloves) + if(gloves.max_heat_protection_temperature && gloves.max_heat_protection_temperature >= temperature) + thermal_protection_flags |= gloves.heat_protection + if(wear_mask) + if(wear_mask.max_heat_protection_temperature && wear_mask.max_heat_protection_temperature >= temperature) + thermal_protection_flags |= wear_mask.heat_protection - return thermal_protection_flags + return thermal_protection_flags - proc/get_heat_protection(temperature) //Temperature is the temperature you're being exposed to. - var/thermal_protection_flags = get_heat_protection_flags(temperature) +/mob/living/carbon/human/proc/get_heat_protection(temperature) //Temperature is the temperature you're being exposed to. + var/thermal_protection_flags = get_heat_protection_flags(temperature) - var/thermal_protection = 0.0 - if(thermal_protection_flags) - if(thermal_protection_flags & HEAD) - thermal_protection += THERMAL_PROTECTION_HEAD - if(thermal_protection_flags & CHEST) - thermal_protection += THERMAL_PROTECTION_CHEST - if(thermal_protection_flags & GROIN) - thermal_protection += THERMAL_PROTECTION_GROIN - if(thermal_protection_flags & LEG_LEFT) - thermal_protection += THERMAL_PROTECTION_LEG_LEFT - if(thermal_protection_flags & LEG_RIGHT) - thermal_protection += THERMAL_PROTECTION_LEG_RIGHT - if(thermal_protection_flags & FOOT_LEFT) - thermal_protection += THERMAL_PROTECTION_FOOT_LEFT - if(thermal_protection_flags & FOOT_RIGHT) - thermal_protection += THERMAL_PROTECTION_FOOT_RIGHT - if(thermal_protection_flags & ARM_LEFT) - thermal_protection += THERMAL_PROTECTION_ARM_LEFT - if(thermal_protection_flags & ARM_RIGHT) - thermal_protection += THERMAL_PROTECTION_ARM_RIGHT - if(thermal_protection_flags & HAND_LEFT) - thermal_protection += THERMAL_PROTECTION_HAND_LEFT - if(thermal_protection_flags & HAND_RIGHT) - thermal_protection += THERMAL_PROTECTION_HAND_RIGHT + var/thermal_protection = 0.0 + if(thermal_protection_flags) + if(thermal_protection_flags & HEAD) + thermal_protection += THERMAL_PROTECTION_HEAD + if(thermal_protection_flags & CHEST) + thermal_protection += THERMAL_PROTECTION_CHEST + if(thermal_protection_flags & GROIN) + thermal_protection += THERMAL_PROTECTION_GROIN + if(thermal_protection_flags & LEG_LEFT) + thermal_protection += THERMAL_PROTECTION_LEG_LEFT + if(thermal_protection_flags & LEG_RIGHT) + thermal_protection += THERMAL_PROTECTION_LEG_RIGHT + if(thermal_protection_flags & FOOT_LEFT) + thermal_protection += THERMAL_PROTECTION_FOOT_LEFT + if(thermal_protection_flags & FOOT_RIGHT) + thermal_protection += THERMAL_PROTECTION_FOOT_RIGHT + if(thermal_protection_flags & ARM_LEFT) + thermal_protection += THERMAL_PROTECTION_ARM_LEFT + if(thermal_protection_flags & ARM_RIGHT) + thermal_protection += THERMAL_PROTECTION_ARM_RIGHT + if(thermal_protection_flags & HAND_LEFT) + thermal_protection += THERMAL_PROTECTION_HAND_LEFT + if(thermal_protection_flags & HAND_RIGHT) + thermal_protection += THERMAL_PROTECTION_HAND_RIGHT - return min(1,thermal_protection) + return min(1,thermal_protection) - //See proc/get_heat_protection_flags(temperature) for the description of this proc. - proc/get_cold_protection_flags(temperature) - var/thermal_protection_flags = 0 - //Handle normal clothing +//See proc/get_heat_protection_flags(temperature) for the description of this proc. +/mob/living/carbon/human/proc/get_cold_protection_flags(temperature) + var/thermal_protection_flags = 0 + //Handle normal clothing - if(head) - if(head.min_cold_protection_temperature && head.min_cold_protection_temperature <= temperature) - thermal_protection_flags |= head.cold_protection - if(wear_suit) - if(wear_suit.min_cold_protection_temperature && wear_suit.min_cold_protection_temperature <= temperature) - thermal_protection_flags |= wear_suit.cold_protection - if(w_uniform) - if(w_uniform.min_cold_protection_temperature && w_uniform.min_cold_protection_temperature <= temperature) - thermal_protection_flags |= w_uniform.cold_protection - if(shoes) - if(shoes.min_cold_protection_temperature && shoes.min_cold_protection_temperature <= temperature) - thermal_protection_flags |= shoes.cold_protection - if(gloves) - if(gloves.min_cold_protection_temperature && gloves.min_cold_protection_temperature <= temperature) - thermal_protection_flags |= gloves.cold_protection - if(wear_mask) - if(wear_mask.min_cold_protection_temperature && wear_mask.min_cold_protection_temperature <= temperature) - thermal_protection_flags |= wear_mask.cold_protection + if(head) + if(head.min_cold_protection_temperature && head.min_cold_protection_temperature <= temperature) + thermal_protection_flags |= head.cold_protection + if(wear_suit) + if(wear_suit.min_cold_protection_temperature && wear_suit.min_cold_protection_temperature <= temperature) + thermal_protection_flags |= wear_suit.cold_protection + if(w_uniform) + if(w_uniform.min_cold_protection_temperature && w_uniform.min_cold_protection_temperature <= temperature) + thermal_protection_flags |= w_uniform.cold_protection + if(shoes) + if(shoes.min_cold_protection_temperature && shoes.min_cold_protection_temperature <= temperature) + thermal_protection_flags |= shoes.cold_protection + if(gloves) + if(gloves.min_cold_protection_temperature && gloves.min_cold_protection_temperature <= temperature) + thermal_protection_flags |= gloves.cold_protection + if(wear_mask) + if(wear_mask.min_cold_protection_temperature && wear_mask.min_cold_protection_temperature <= temperature) + thermal_protection_flags |= wear_mask.cold_protection - return thermal_protection_flags + return thermal_protection_flags - proc/get_cold_protection(temperature) +/mob/living/carbon/human/proc/get_cold_protection(temperature) - if(COLD_RESISTANCE in mutations) - return 1 //Fully protected from the cold. + if(COLD_RESISTANCE in mutations) + return 1 //Fully protected from the cold. - if(dna && COLDRES in dna.species.specflags) - return 1 + if(dna && COLDRES in dna.species.specflags) + return 1 - temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K. - var/thermal_protection_flags = get_cold_protection_flags(temperature) + temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K. + var/thermal_protection_flags = get_cold_protection_flags(temperature) - var/thermal_protection = 0.0 - if(thermal_protection_flags) - if(thermal_protection_flags & HEAD) - thermal_protection += THERMAL_PROTECTION_HEAD - if(thermal_protection_flags & CHEST) - thermal_protection += THERMAL_PROTECTION_CHEST - if(thermal_protection_flags & GROIN) - thermal_protection += THERMAL_PROTECTION_GROIN - if(thermal_protection_flags & LEG_LEFT) - thermal_protection += THERMAL_PROTECTION_LEG_LEFT - if(thermal_protection_flags & LEG_RIGHT) - thermal_protection += THERMAL_PROTECTION_LEG_RIGHT - if(thermal_protection_flags & FOOT_LEFT) - thermal_protection += THERMAL_PROTECTION_FOOT_LEFT - if(thermal_protection_flags & FOOT_RIGHT) - thermal_protection += THERMAL_PROTECTION_FOOT_RIGHT - if(thermal_protection_flags & ARM_LEFT) - thermal_protection += THERMAL_PROTECTION_ARM_LEFT - if(thermal_protection_flags & ARM_RIGHT) - thermal_protection += THERMAL_PROTECTION_ARM_RIGHT - if(thermal_protection_flags & HAND_LEFT) - thermal_protection += THERMAL_PROTECTION_HAND_LEFT - if(thermal_protection_flags & HAND_RIGHT) - thermal_protection += THERMAL_PROTECTION_HAND_RIGHT + var/thermal_protection = 0.0 + if(thermal_protection_flags) + if(thermal_protection_flags & HEAD) + thermal_protection += THERMAL_PROTECTION_HEAD + if(thermal_protection_flags & CHEST) + thermal_protection += THERMAL_PROTECTION_CHEST + if(thermal_protection_flags & GROIN) + thermal_protection += THERMAL_PROTECTION_GROIN + if(thermal_protection_flags & LEG_LEFT) + thermal_protection += THERMAL_PROTECTION_LEG_LEFT + if(thermal_protection_flags & LEG_RIGHT) + thermal_protection += THERMAL_PROTECTION_LEG_RIGHT + if(thermal_protection_flags & FOOT_LEFT) + thermal_protection += THERMAL_PROTECTION_FOOT_LEFT + if(thermal_protection_flags & FOOT_RIGHT) + thermal_protection += THERMAL_PROTECTION_FOOT_RIGHT + if(thermal_protection_flags & ARM_LEFT) + thermal_protection += THERMAL_PROTECTION_ARM_LEFT + if(thermal_protection_flags & ARM_RIGHT) + thermal_protection += THERMAL_PROTECTION_ARM_RIGHT + if(thermal_protection_flags & HAND_LEFT) + thermal_protection += THERMAL_PROTECTION_HAND_LEFT + if(thermal_protection_flags & HAND_RIGHT) + thermal_protection += THERMAL_PROTECTION_HAND_RIGHT - return min(1,thermal_protection) + return min(1,thermal_protection) - /* - proc/add_fire_protection(var/temp) - var/fire_prot = 0 - if(head) - if(head.protective_temperature > temp) - fire_prot += (head.protective_temperature/10) - if(wear_mask) - if(wear_mask.protective_temperature > temp) - fire_prot += (wear_mask.protective_temperature/10) - if(glasses) - if(glasses.protective_temperature > temp) - fire_prot += (glasses.protective_temperature/10) - if(ears) - if(ears.protective_temperature > temp) - fire_prot += (ears.protective_temperature/10) - if(wear_suit) - if(wear_suit.protective_temperature > temp) - fire_prot += (wear_suit.protective_temperature/10) - if(w_uniform) - if(w_uniform.protective_temperature > temp) - fire_prot += (w_uniform.protective_temperature/10) - if(gloves) - if(gloves.protective_temperature > temp) - fire_prot += (gloves.protective_temperature/10) - if(shoes) - if(shoes.protective_temperature > temp) - fire_prot += (shoes.protective_temperature/10) +/* +/mob/living/carbon/human/proc/add_fire_protection(var/temp) + var/fire_prot = 0 + if(head) + if(head.protective_temperature > temp) + fire_prot += (head.protective_temperature/10) + if(wear_mask) + if(wear_mask.protective_temperature > temp) + fire_prot += (wear_mask.protective_temperature/10) + if(glasses) + if(glasses.protective_temperature > temp) + fire_prot += (glasses.protective_temperature/10) + if(ears) + if(ears.protective_temperature > temp) + fire_prot += (ears.protective_temperature/10) + if(wear_suit) + if(wear_suit.protective_temperature > temp) + fire_prot += (wear_suit.protective_temperature/10) + if(w_uniform) + if(w_uniform.protective_temperature > temp) + fire_prot += (w_uniform.protective_temperature/10) + if(gloves) + if(gloves.protective_temperature > temp) + fire_prot += (gloves.protective_temperature/10) + if(shoes) + if(shoes.protective_temperature > temp) + fire_prot += (shoes.protective_temperature/10) - return fire_prot + return fire_prot - proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity) - if(nodamage) - return - //world <<"body_part = [body_part], exposed_temperature = [exposed_temperature], exposed_intensity = [exposed_intensity]" - var/discomfort = min(abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) +/mob/living/carbon/human/proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity) + if(nodamage) + return + //world <<"body_part = [body_part], exposed_temperature = [exposed_temperature], exposed_intensity = [exposed_intensity]" + var/discomfort = min(abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) - if(exposed_temperature > bodytemperature) - discomfort *= 4 + if(exposed_temperature > bodytemperature) + discomfort *= 4 - if(mutantrace == "plant") - discomfort *= TEMPERATURE_DAMAGE_COEFFICIENT * 2 //I don't like magic numbers. I'll make mutantraces a datum with vars sometime later. -- Urist - else - discomfort *= TEMPERATURE_DAMAGE_COEFFICIENT //Dangercon 2011 - now with less magic numbers! - //world <<"[discomfort]" + if(mutantrace == "plant") + discomfort *= TEMPERATURE_DAMAGE_COEFFICIENT * 2 //I don't like magic numbers. I'll make mutantraces a datum with vars sometime later. -- Urist + else + discomfort *= TEMPERATURE_DAMAGE_COEFFICIENT //Dangercon 2011 - now with less magic numbers! + //world <<"[discomfort]" - switch(body_part) - if(HEAD) - apply_damage(2.5*discomfort, BURN, "head") - if(CHEST) - apply_damage(2.5*discomfort, BURN, "chest") - if(LEGS) - apply_damage(0.6*discomfort, BURN, "l_leg") - apply_damage(0.6*discomfort, BURN, "r_leg") - if(ARMS) - apply_damage(0.4*discomfort, BURN, "l_arm") - apply_damage(0.4*discomfort, BURN, "r_arm") - */ + switch(body_part) + if(HEAD) + apply_damage(2.5*discomfort, BURN, "head") + if(CHEST) + apply_damage(2.5*discomfort, BURN, "chest") + if(LEGS) + apply_damage(0.6*discomfort, BURN, "l_leg") + apply_damage(0.6*discomfort, BURN, "r_leg") + if(ARMS) + apply_damage(0.4*discomfort, BURN, "l_arm") + apply_damage(0.4*discomfort, BURN, "r_arm") +*/ - proc/handle_chemicals_in_body() - if(dna) - dna.species.handle_chemicals_in_body(src) +/mob/living/carbon/human/proc/handle_chemicals_in_body() + if(dna) + dna.species.handle_chemicals_in_body(src) - return //TODO: DEFERRED + return //TODO: DEFERRED - proc/handle_regular_status_updates() - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP +/mob/living/carbon/human/proc/handle_regular_status_updates() + if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP + blinded = 1 + silent = 0 + else //ALIVE. LIGHTS ARE ON + updatehealth() //TODO + if(health <= config.health_threshold_dead || !getorgan(/obj/item/organ/brain)) + death() blinded = 1 silent = 0 - else //ALIVE. LIGHTS ARE ON - updatehealth() //TODO - if(health <= config.health_threshold_dead || !getorgan(/obj/item/organ/brain)) - death() - blinded = 1 - silent = 0 - return 1 + return 1 - //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 50) || (config.health_threshold_crit >= health) ) - Paralyse(3) + //UNCONSCIOUS. NO-ONE IS HOME + if( (getOxyLoss() > 50) || (config.health_threshold_crit >= health) ) + Paralyse(3) - /* Done by handle_breath() - if( health <= 20 && prob(1) ) - spawn(0) - emote("gasp") - if(!reagents.has_reagent("inaprovaline")) - adjustOxyLoss(1)*/ + /* Done by handle_breath() + if( health <= 20 && prob(1) ) + spawn(0) + emote("gasp") + if(!reagents.has_reagent("inaprovaline")) + adjustOxyLoss(1)*/ - if(hallucination) - if(hallucination >= 20) - if(prob(3)) - fake_attack(src) - if(!handling_hal) - spawn handle_hallucinations() //The not boring kind! - - if(hallucination<=2) - hallucination = 0 - else - hallucination -= 2 + if(hallucination) + if(hallucination >= 20) + if(prob(3)) + fake_attack(src) + if(!handling_hal) + spawn handle_hallucinations() //The not boring kind! + if(hallucination<=2) + hallucination = 0 else - for(var/atom/a in hallucinations) - qdel(a) + hallucination -= 2 - if(paralysis) - AdjustParalysis(-1) - blinded = 1 - stat = UNCONSCIOUS - else if(sleeping) - handle_dreams() - adjustStaminaLoss(-10) - sleeping = max(sleeping-1, 0) - blinded = 1 - stat = UNCONSCIOUS - if( prob(10) && health && !hal_crit ) - spawn(0) - emote("snore") - //CONSCIOUS - else - stat = CONSCIOUS + else + for(var/atom/a in hallucinations) + qdel(a) - //Eyes - if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own - blinded = 1 - else if(eye_blind) //blindness, heals slowly over time - eye_blind = max(eye_blind-1,0) - blinded = 1 - else if(tinttotal >= TINT_BLIND) //covering your eyes heals blurry eyes faster - eye_blurry = max(eye_blurry-3, 0) - // blinded = 1 //now handled under /handle_regular_hud_updates() - else if(eye_blurry) //blurry eyes heal slowly - eye_blurry = max(eye_blurry-1, 0) + if(paralysis) + AdjustParalysis(-1) + blinded = 1 + stat = UNCONSCIOUS + else if(sleeping) + handle_dreams() + adjustStaminaLoss(-10) + sleeping = max(sleeping-1, 0) + blinded = 1 + stat = UNCONSCIOUS + if( prob(10) && health && !hal_crit ) + spawn(0) + emote("snore") + //CONSCIOUS + else + stat = CONSCIOUS - //Ears - if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own - ear_deaf = max(ear_deaf, 1) - else if(istype(ears, /obj/item/clothing/ears/earmuffs)) //resting your ears with earmuffs heals ear damage faster, and slowly heals deafness - ear_damage = max(ear_damage-0.15, 0) - ear_deaf = max(ear_deaf-1, 1) - else if(ear_deaf) //deafness, heals slowly over time - ear_deaf = max(ear_deaf-1, 0) - else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs - ear_damage = max(ear_damage-0.05, 0) + //Eyes + if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own + blinded = 1 + else if(eye_blind) //blindness, heals slowly over time + eye_blind = max(eye_blind-1,0) + blinded = 1 + else if(tinttotal >= TINT_BLIND) //covering your eyes heals blurry eyes faster + eye_blurry = max(eye_blurry-3, 0) + // blinded = 1 //now handled under /handle_regular_hud_updates() + else if(eye_blurry) //blurry eyes heal slowly + eye_blurry = max(eye_blurry-1, 0) - //Dizziness - if(dizziness) - var/client/C = client - var/pixel_x_diff = 0 - var/pixel_y_diff = 0 - var/temp - var/saved_dizz = dizziness - dizziness = max(dizziness-1, 0) - if(C) - var/oldsrc = src - var/amplitude = dizziness*(sin(dizziness * 0.044 * world.time) + 1) / 70 // This shit is annoying at high strength - src = null - spawn(0) + //Ears + if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own + ear_deaf = max(ear_deaf, 1) + else if(istype(ears, /obj/item/clothing/ears/earmuffs)) //resting your ears with earmuffs heals ear damage faster, and slowly heals deafness + ear_damage = max(ear_damage-0.15, 0) + ear_deaf = max(ear_deaf-1, 1) + else if(ear_deaf) //deafness, heals slowly over time + ear_deaf = max(ear_deaf-1, 0) + else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs + ear_damage = max(ear_damage-0.05, 0) + + //Dizziness + if(dizziness) + var/client/C = client + var/pixel_x_diff = 0 + var/pixel_y_diff = 0 + var/temp + var/saved_dizz = dizziness + dizziness = max(dizziness-1, 0) + if(C) + var/oldsrc = src + var/amplitude = dizziness*(sin(dizziness * 0.044 * world.time) + 1) / 70 // This shit is annoying at high strength + src = null + spawn(0) + if(C) + temp = amplitude * sin(0.008 * saved_dizz * world.time) + pixel_x_diff += temp + C.pixel_x += temp + temp = amplitude * cos(0.008 * saved_dizz * world.time) + pixel_y_diff += temp + C.pixel_y += temp + sleep(3) if(C) temp = amplitude * sin(0.008 * saved_dizz * world.time) pixel_x_diff += temp @@ -549,189 +555,181 @@ temp = amplitude * cos(0.008 * saved_dizz * world.time) pixel_y_diff += temp C.pixel_y += temp - sleep(3) - if(C) - temp = amplitude * sin(0.008 * saved_dizz * world.time) - pixel_x_diff += temp - C.pixel_x += temp - temp = amplitude * cos(0.008 * saved_dizz * world.time) - pixel_y_diff += temp - C.pixel_y += temp - sleep(3) - if(C) - C.pixel_x -= pixel_x_diff - C.pixel_y -= pixel_y_diff - src = oldsrc + sleep(3) + if(C) + C.pixel_x -= pixel_x_diff + C.pixel_y -= pixel_y_diff + src = oldsrc - //Jitteryness - if(jitteriness) - var/amplitude = min(4, (jitteriness/100) + 1) - var/pixel_x_diff = rand(-amplitude, amplitude) - var/pixel_y_diff = rand(-amplitude/3, amplitude/3) + //Jitteryness + if(jitteriness) + var/amplitude = min(4, (jitteriness/100) + 1) + var/pixel_x_diff = rand(-amplitude, amplitude) + var/pixel_y_diff = rand(-amplitude/3, amplitude/3) - animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = 6) - animate(pixel_x = pixel_x - pixel_x_diff, pixel_y = pixel_y - pixel_y_diff, time = 2) - jitteriness = max(jitteriness-1, 0) + animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = 6) + animate(pixel_x = pixel_x - pixel_x_diff, pixel_y = pixel_y - pixel_y_diff, time = 2) + jitteriness = max(jitteriness-1, 0) - //Other - if(stunned) - AdjustStunned(-1) + //Other + if(stunned) + AdjustStunned(-1) - if(weakened) - weakened = max(weakened-1,0) + if(weakened) + weakened = max(weakened-1,0) - if(stuttering) - stuttering = max(stuttering-1, 0) + if(stuttering) + stuttering = max(stuttering-1, 0) - if(silent) - silent = max(silent-1, 0) + if(silent) + silent = max(silent-1, 0) - if(druggy) - druggy = max(druggy-1, 0) + if(druggy) + druggy = max(druggy-1, 0) - CheckStamina() + CheckStamina() - return 1 + return 1 - proc/handle_regular_hud_updates() - if(!client) return 0 +/mob/living/carbon/human/proc/handle_regular_hud_updates() + if(!client) return 0 - for(var/image/hud in client.images) - if(copytext(hud.icon_state,1,4) == "hud") //ugly, but icon comparison is worse, I believe - client.images.Remove(hud) + for(var/image/hud in client.images) + if(copytext(hud.icon_state,1,4) == "hud") //ugly, but icon comparison is worse, I believe + client.images.Remove(hud) - client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask) + client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask) - update_action_buttons() + update_action_buttons() - if(damageoverlay.overlays) - damageoverlay.overlays = list() + if(damageoverlay.overlays) + damageoverlay.overlays = list() - if(stat == UNCONSCIOUS) - //Critical damage passage overlay - if(health <= config.health_threshold_crit) - var/image/I = image("icon" = 'icons/mob/screen_full.dmi', "icon_state" = "passage0") - I.blend_mode = BLEND_OVERLAY //damageoverlay is BLEND_MULTIPLY - switch(health) - if(-20 to -10) - I.icon_state = "passage1" - if(-30 to -20) - I.icon_state = "passage2" - if(-40 to -30) - I.icon_state = "passage3" - if(-50 to -40) - I.icon_state = "passage4" - if(-60 to -50) - I.icon_state = "passage5" - if(-70 to -60) - I.icon_state = "passage6" - if(-80 to -70) - I.icon_state = "passage7" - if(-90 to -80) - I.icon_state = "passage8" - if(-95 to -90) - I.icon_state = "passage9" - if(-INFINITY to -95) - I.icon_state = "passage10" - damageoverlay.overlays += I + if(stat == UNCONSCIOUS) + //Critical damage passage overlay + if(health <= config.health_threshold_crit) + var/image/I = image("icon" = 'icons/mob/screen_full.dmi', "icon_state" = "passage0") + I.blend_mode = BLEND_OVERLAY //damageoverlay is BLEND_MULTIPLY + switch(health) + if(-20 to -10) + I.icon_state = "passage1" + if(-30 to -20) + I.icon_state = "passage2" + if(-40 to -30) + I.icon_state = "passage3" + if(-50 to -40) + I.icon_state = "passage4" + if(-60 to -50) + I.icon_state = "passage5" + if(-70 to -60) + I.icon_state = "passage6" + if(-80 to -70) + I.icon_state = "passage7" + if(-90 to -80) + I.icon_state = "passage8" + if(-95 to -90) + I.icon_state = "passage9" + if(-INFINITY to -95) + I.icon_state = "passage10" + damageoverlay.overlays += I + else + //Oxygen damage overlay + if(oxyloss) + var/image/I = image("icon" = 'icons/mob/screen_full.dmi', "icon_state" = "oxydamageoverlay0") + switch(oxyloss) + if(10 to 20) + I.icon_state = "oxydamageoverlay1" + if(20 to 25) + I.icon_state = "oxydamageoverlay2" + if(25 to 30) + I.icon_state = "oxydamageoverlay3" + if(30 to 35) + I.icon_state = "oxydamageoverlay4" + if(35 to 40) + I.icon_state = "oxydamageoverlay5" + if(40 to 45) + I.icon_state = "oxydamageoverlay6" + if(45 to INFINITY) + I.icon_state = "oxydamageoverlay7" + damageoverlay.overlays += I + + //Fire and Brute damage overlay (BSSR) + var/hurtdamage = src.getBruteLoss() + src.getFireLoss() + damageoverlaytemp + damageoverlaytemp = 0 // We do this so we can detect if someone hits us or not. + if(hurtdamage) + var/image/I = image("icon" = 'icons/mob/screen_full.dmi', "icon_state" = "brutedamageoverlay0") + I.blend_mode = BLEND_ADD + switch(hurtdamage) + if(5 to 15) + I.icon_state = "brutedamageoverlay1" + if(15 to 30) + I.icon_state = "brutedamageoverlay2" + if(30 to 45) + I.icon_state = "brutedamageoverlay3" + if(45 to 70) + I.icon_state = "brutedamageoverlay4" + if(70 to 85) + I.icon_state = "brutedamageoverlay5" + if(85 to INFINITY) + I.icon_state = "brutedamageoverlay6" + var/image/black = image(I.icon, I.icon_state) //BLEND_ADD doesn't let us darken, so this is just to blacken the edge of the screen + black.color = "#170000" + damageoverlay.overlays += I + damageoverlay.overlays += black + + if(machine) + if(!machine.check_eye(src)) reset_view(null) else - //Oxygen damage overlay - if(oxyloss) - var/image/I = image("icon" = 'icons/mob/screen_full.dmi', "icon_state" = "oxydamageoverlay0") - switch(oxyloss) - if(10 to 20) - I.icon_state = "oxydamageoverlay1" - if(20 to 25) - I.icon_state = "oxydamageoverlay2" - if(25 to 30) - I.icon_state = "oxydamageoverlay3" - if(30 to 35) - I.icon_state = "oxydamageoverlay4" - if(35 to 40) - I.icon_state = "oxydamageoverlay5" - if(40 to 45) - I.icon_state = "oxydamageoverlay6" - if(45 to INFINITY) - I.icon_state = "oxydamageoverlay7" - damageoverlay.overlays += I + if(!client.adminobs) reset_view(null) - //Fire and Brute damage overlay (BSSR) - var/hurtdamage = src.getBruteLoss() + src.getFireLoss() + damageoverlaytemp - damageoverlaytemp = 0 // We do this so we can detect if someone hits us or not. - if(hurtdamage) - var/image/I = image("icon" = 'icons/mob/screen_full.dmi', "icon_state" = "brutedamageoverlay0") - I.blend_mode = BLEND_ADD - switch(hurtdamage) - if(5 to 15) - I.icon_state = "brutedamageoverlay1" - if(15 to 30) - I.icon_state = "brutedamageoverlay2" - if(30 to 45) - I.icon_state = "brutedamageoverlay3" - if(45 to 70) - I.icon_state = "brutedamageoverlay4" - if(70 to 85) - I.icon_state = "brutedamageoverlay5" - if(85 to INFINITY) - I.icon_state = "brutedamageoverlay6" - var/image/black = image(I.icon, I.icon_state) //BLEND_ADD doesn't let us darken, so this is just to blacken the edge of the screen - black.color = "#170000" - damageoverlay.overlays += I - damageoverlay.overlays += black + if(dna) + dna.species.handle_vision(src) + dna.species.handle_hud_icons(src) - if(machine) - if(!machine.check_eye(src)) reset_view(null) - else - if(!client.adminobs) reset_view(null) + return 1 - if(dna) - dna.species.handle_vision(src) - dna.species.handle_hud_icons(src) +/mob/living/carbon/human/proc/handle_random_events() + // Puke if toxloss is too high + if(!stat) + if (getToxLoss() >= 45 && nutrition > 20) + lastpuke ++ + if(lastpuke >= 25) // about 25 second delay I guess + Stun(5) - return 1 + for(var/mob/O in viewers(world.view, src)) + O.show_message("[O] throws up!") + playsound(loc, 'sound/effects/splat.ogg', 50, 1) - proc/handle_random_events() - // Puke if toxloss is too high - if(!stat) - if (getToxLoss() >= 45 && nutrition > 20) - lastpuke ++ - if(lastpuke >= 25) // about 25 second delay I guess - Stun(5) + var/turf/location = loc + if (istype(location, /turf/simulated)) + location.add_vomit_floor(src, 1) - for(var/mob/O in viewers(world.view, src)) - O.show_message(text("\red [] throws up!", src), 1) - playsound(loc, 'sound/effects/splat.ogg', 50, 1) + nutrition -= 20 + adjustToxLoss(-3) - var/turf/location = loc - if (istype(location, /turf/simulated)) - location.add_vomit_floor(src, 1) + // make it so you can only puke so fast + lastpuke = 0 - nutrition -= 20 - adjustToxLoss(-3) - - // make it so you can only puke so fast - lastpuke = 0 - - proc/handle_stomach() - spawn(0) - for(var/mob/living/M in stomach_contents) - if(M.loc != src) +/mob/living/carbon/human/proc/handle_stomach() + spawn(0) + for(var/mob/living/M in stomach_contents) + if(M.loc != src) + stomach_contents.Remove(M) + continue + if(istype(M, /mob/living/carbon) && stat != 2) + if(M.stat == 2) + M.death(1) stomach_contents.Remove(M) + qdel(M) continue - if(istype(M, /mob/living/carbon) && stat != 2) - if(M.stat == 2) - M.death(1) - stomach_contents.Remove(M) - qdel(M) - continue - if(air_master.current_cycle%3==1) - if(!(M.status_flags & GODMODE)) - M.adjustBruteLoss(5) - nutrition += 10 + if(air_master.current_cycle%3==1) + if(!(M.status_flags & GODMODE)) + M.adjustBruteLoss(5) + nutrition += 10 - proc/handle_changeling() - if(mind && mind.changeling) - mind.changeling.regenerate() +/mob/living/carbon/human/proc/handle_changeling() + if(mind && mind.changeling) + mind.changeling.regenerate() #undef HUMAN_MAX_OXYLOSS #undef HUMAN_CRIT_MAX_OXYLOSS diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index be98cf67ed9..205decd4442 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -1,50 +1,4 @@ /mob/living/carbon/human/say(var/message) - - if(silent) - return - - // Needed so when they die they can talk in dead chat normally without needing to ghost. - if(stat != DEAD) - - //Mimes dont speak! Changeling hivemind and emotes are allowed. - if(!IsVocal()) - if(length(message) >= 2) - if(mind && mind.changeling) - if(copytext(message, 1, 2) != "*" && copytext(message, 1, 3) != ":g" && copytext(message, 1, 3) != ":G" && copytext(message, 1, 3) != ":ï") - return - else - return ..(message) - if(stat == DEAD) - return ..(message) - - if(length(message) >= 1) //In case people forget the '*help' command, this will slow them the message and prevent people from saying one letter at a time - if (copytext(message, 1, 2) != "*") - return - - if(dna) - message = dna.species.handle_speech(message,src) - - if(viruses.len) - for(var/datum/disease/pierrot_throat/D in viruses) - var/list/temp_message = text2list(message, " ") //List each word in the message - var/list/pick_list = list() - for(var/i = 1, i <= temp_message.len, i++) //Create a second list for excluding words down the line - pick_list += i - for(var/i=1, ((i <= D.stage) && (i <= temp_message.len)), i++) //Loop for each stage of the disease or until we run out of words - if(prob(3 * D.stage)) //Stage 1: 3% Stage 2: 6% Stage 3: 9% Stage 4: 12% - var/H = pick(pick_list) - if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue - temp_message[H] = "HONK" - pick_list -= H //Make sure that you dont HONK the same word twice - message = list2text(temp_message, " ") - - if(wear_mask) - message = wear_mask.speechModification(message) - - if ((HULK in mutations) && health >= 25 && length(message)) - if(copytext(message, 1, 2) != "*") - message = "[uppertext(replacetext(message, ".", "!"))]!!" //because I don't know how to code properly in getting vars from other files -Bro - ..(message) /mob/living/carbon/human/say_quote(text) @@ -67,53 +21,30 @@ return "says, \"[text]\""; -/mob/living/carbon/human/proc/forcesay(list/append) - if(stat == CONSCIOUS) - if(client) - var/virgin = 1 //has the text been modified yet? - var/temp = winget(client, "input", "text") - if(findtextEx(temp, "Say \"", 1, 7) && length(temp) > 5) //case sensitive means +/mob/living/carbon/human/treat_message(message) + if(dna) + message = dna.species.handle_speech(message,src) - temp = replacetext(temp, ";", "") //general radio + if ((HULK in mutations) && health >= 25 && length(message)) + message = "[uppertext(replacetext(message, ".", "!"))]!!" //because I don't know how to code properly in getting vars from other files -Bro - if(findtext(trim_left(temp), ":", 6, 7)) //dept radio - temp = copytext(trim_left(temp), 8) - virgin = 0 + if(viruses.len) + for(var/datum/disease/pierrot_throat/D in viruses) + var/list/temp_message = text2list(message, " ") //List each word in the message + var/list/pick_list = list() + for(var/i = 1, i <= temp_message.len, i++) //Create a second list for excluding words down the line + pick_list += i + for(var/i=1, ((i <= D.stage) && (i <= temp_message.len)), i++) //Loop for each stage of the disease or until we run out of words + if(prob(3 * D.stage)) //Stage 1: 3% Stage 2: 6% Stage 3: 9% Stage 4: 12% + var/H = pick(pick_list) + if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue + temp_message[H] = "HONK" + pick_list -= H //Make sure that you dont HONK the same word twice + message = list2text(temp_message, " ") - if(virgin) - temp = copytext(trim_left(temp), 6) //normal speech - virgin = 0 - - while(findtext(trim_left(temp), ":", 1, 2)) //dept radio again (necessary) - temp = copytext(trim_left(temp), 3) - - if(findtext(temp, "*", 1, 2)) //emotes - return - - var/trimmed = trim_left(temp) - if(length(trimmed)) - if(append) - temp += pick(append) - - say(temp) - winset(client, "input", "text=[null]") - - -/mob/living/carbon/human/say_understands(var/other) - if (istype(other, /mob/living/silicon/ai)) - return 1 - if (istype(other, /mob/living/silicon/decoy)) - return 1 - if (istype(other, /mob/living/silicon/pai)) - return 1 - if (istype(other, /mob/living/silicon/robot)) - return 1 - if (istype(other, /mob/living/carbon/brain)) - return 1 - if (istype(other, /mob/living/carbon/slime)) - return 1 - return ..() + message = ..(message) + return message /mob/living/carbon/human/GetVoice() if(istype(src.wear_mask, /obj/item/clothing/mask/gas/voice)) @@ -138,11 +69,78 @@ special_voice = new_voice return - /mob/living/carbon/human/proc/UnsetSpecialVoice() special_voice = "" return - /mob/living/carbon/human/proc/GetSpecialVoice() - return special_voice \ No newline at end of file + return special_voice + +/mob/living/carbon/human/binarycheck() + if(ears) + var/obj/item/device/radio/headset/dongle = ears + if(!istype(dongle)) return 0 + if(dongle.translate_binary) return 1 + +/mob/living/carbon/human/radio(message, message_mode) + . = ..() + if(. != 0) + return . + + switch(message_mode) + if(MODE_HEADSET) + if (ears) + ears.talk_into(src, message) + return ITALICS | REDUCE_RANGE + + if(MODE_SECURE_HEADSET) + if (ears) + ears.talk_into(src, message, 1) + return ITALICS | REDUCE_RANGE + + if(MODE_DEPARTMENT) + if (ears) + ears.talk_into(src, message, message_mode) + return ITALICS | REDUCE_RANGE + + if(message_mode in radiochannels) + if(ears) + ears.talk_into(src, message, message_mode) + return ITALICS | REDUCE_RANGE + + return 0 + +/mob/living/carbon/human/get_alt_name() + if(name != GetVoice()) + return " (as [get_id_name("Unknown")])" + +/mob/living/carbon/human/proc/forcesay(list/append) //this proc is at the bottom of the file because quote fuckery makes notepad++ cri + if(stat == CONSCIOUS) + if(client) + var/virgin = 1 //has the text been modified yet? + var/temp = winget(client, "input", "text") + if(findtextEx(temp, "Say \"", 1, 7) && length(temp) > 5) //"case sensitive means + + temp = replacetext(temp, ";", "") //general radio + + if(findtext(trim_left(temp), ":", 6, 7)) //dept radio + temp = copytext(trim_left(temp), 8) + virgin = 0 + + if(virgin) + temp = copytext(trim_left(temp), 6) //normal speech + virgin = 0 + + while(findtext(trim_left(temp), ":", 1, 2)) //dept radio again (necessary) + temp = copytext(trim_left(temp), 3) + + if(findtext(temp, "*", 1, 2)) //emotes + return + + var/trimmed = trim_left(temp) + if(length(trimmed)) + if(append) + temp += pick(append) + + say(temp) + winset(client, "input", "text=[null]") diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index ee4865b6ca4..de73e267986 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -37,7 +37,7 @@ var/hair_color = null // this allows races to have specific hair colors... if null, it uses the H's hair/facial hair colors. if "mutcolor", it uses the H's mutant_color var/hair_alpha = 255 // the alpha used by the hair. 255 is completely solid, 0 is transparent. var/use_skintones = 0 // does it use skintones or not? (spoiler alert this is only used by humans) - + var/meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human //What the species drops on gibbing var/list/no_equip = list() // slots the race can't equip stuff to var/nojumpsuit = 0 // this is sorta... weird. it basically lets you equip stuff that usually needs jumpsuits without one, like belts and pockets and ids @@ -67,1241 +67,1241 @@ // PROCS // /////////// - proc/update_base_icon_state(var/mob/living/carbon/human/H) - if(HUSK in H.mutations) - H.remove_overlay(SPECIES_LAYER) // races lose their color - return "husk" - else if(sexes) - if(use_skintones) - return "[H.skin_tone]_[(H.gender == FEMALE) ? "f" : "m"]" - else - return "[id]_[(H.gender == FEMALE) ? "f" : "m"]" +/datum/species/proc/update_base_icon_state(var/mob/living/carbon/human/H) + if(HUSK in H.mutations) + H.remove_overlay(SPECIES_LAYER) // races lose their color + return "husk" + else if(sexes) + if(use_skintones) + return "[H.skin_tone]_[(H.gender == FEMALE) ? "f" : "m"]" else - return "[id]" + return "[id]_[(H.gender == FEMALE) ? "f" : "m"]" + else + return "[id]" - proc/update_color(var/mob/living/carbon/human/H) - H.remove_overlay(SPECIES_LAYER) +/datum/species/proc/update_color(var/mob/living/carbon/human/H) + H.remove_overlay(SPECIES_LAYER) - var/image/standing + var/image/standing - var/g = (H.gender == FEMALE) ? "f" : "m" + var/g = (H.gender == FEMALE) ? "f" : "m" - if(MUTCOLORS in specflags) - var/image/spec_base - if(sexes) - spec_base = image("icon" = 'icons/mob/human.dmi', "icon_state" = "[id]_[g]_s", "layer" = -SPECIES_LAYER) + if(MUTCOLORS in specflags) + var/image/spec_base + if(sexes) + spec_base = image("icon" = 'icons/mob/human.dmi', "icon_state" = "[id]_[g]_s", "layer" = -SPECIES_LAYER) + else + spec_base = image("icon" = 'icons/mob/human.dmi', "icon_state" = "[id]_s", "layer" = -SPECIES_LAYER) + if(!config.mutant_colors) + H.dna.mutant_color = default_color + spec_base.color = "#[H.dna.mutant_color]" + standing = spec_base + + if(standing) + H.overlays_standing[SPECIES_LAYER] = standing + + H.apply_overlay(SPECIES_LAYER) + +/datum/species/proc/handle_hair(var/mob/living/carbon/human/H) + H.remove_overlay(HAIR_LAYER) + + var/datum/sprite_accessory/S + var/list/standing = list() + + if(H.facial_hair_style && FACEHAIR in specflags) + S = facial_hair_styles_list[H.facial_hair_style] + if(S) + var/image/img_facial_s + + img_facial_s = image("icon" = S.icon, "icon_state" = "[S.icon_state]_s", "layer" = -HAIR_LAYER) + + if(hair_color) + if(hair_color == "mutcolor") + if(!config.mutant_colors) + img_facial_s.color = "#" + default_color + else + img_facial_s.color = "#" + H.dna.mutant_color + else + img_facial_s.color = "#" + hair_color else - spec_base = image("icon" = 'icons/mob/human.dmi', "icon_state" = "[id]_s", "layer" = -SPECIES_LAYER) - if(!config.mutant_colors) - H.dna.mutant_color = default_color - spec_base.color = "#[H.dna.mutant_color]" - standing = spec_base + img_facial_s.color = "#" + H.facial_hair_color + img_facial_s.alpha = hair_alpha - if(standing) - H.overlays_standing[SPECIES_LAYER] = standing + standing += img_facial_s - H.apply_overlay(SPECIES_LAYER) + //Applies the debrained overlay if there is no brain + if(!H.getorgan(/obj/item/organ/brain)) + standing += image("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained_s", "layer" = -HAIR_LAYER) - proc/handle_hair(var/mob/living/carbon/human/H) - H.remove_overlay(HAIR_LAYER) + else if(H.hair_style && HAIR in specflags) + S = hair_styles_list[H.hair_style] + if(S) + var/image/img_hair_s = image("icon" = S.icon, "icon_state" = "[S.icon_state]_s", "layer" = -HAIR_LAYER) - var/datum/sprite_accessory/S - var/list/standing = list() + img_hair_s = image("icon" = S.icon, "icon_state" = "[S.icon_state]_s", "layer" = -HAIR_LAYER) - if(H.facial_hair_style && FACEHAIR in specflags) - S = facial_hair_styles_list[H.facial_hair_style] - if(S) - var/image/img_facial_s - - img_facial_s = image("icon" = S.icon, "icon_state" = "[S.icon_state]_s", "layer" = -HAIR_LAYER) - - if(hair_color) - if(hair_color == "mutcolor") - if(!config.mutant_colors) - img_facial_s.color = "#" + default_color - else - img_facial_s.color = "#" + H.dna.mutant_color + if(hair_color) + if(hair_color == "mutcolor") + if(!config.mutant_colors) + img_hair_s.color = "#" + default_color else - img_facial_s.color = "#" + hair_color + img_hair_s.color = "#" + H.dna.mutant_color else - img_facial_s.color = "#" + H.facial_hair_color - img_facial_s.alpha = hair_alpha + img_hair_s.color = "#" + hair_color + else + img_hair_s.color = "#" + H.hair_color + img_hair_s.alpha = hair_alpha - standing += img_facial_s + standing += img_hair_s - //Applies the debrained overlay if there is no brain - if(!H.getorgan(/obj/item/organ/brain)) - standing += image("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained_s", "layer" = -HAIR_LAYER) + if(standing.len) + H.overlays_standing[HAIR_LAYER] = standing - else if(H.hair_style && HAIR in specflags) - S = hair_styles_list[H.hair_style] - if(S) - var/image/img_hair_s = image("icon" = S.icon, "icon_state" = "[S.icon_state]_s", "layer" = -HAIR_LAYER) + H.apply_overlay(HAIR_LAYER) - img_hair_s = image("icon" = S.icon, "icon_state" = "[S.icon_state]_s", "layer" = -HAIR_LAYER) + return - if(hair_color) - if(hair_color == "mutcolor") - if(!config.mutant_colors) - img_hair_s.color = "#" + default_color - else - img_hair_s.color = "#" + H.dna.mutant_color - else - img_hair_s.color = "#" + hair_color - else - img_hair_s.color = "#" + H.hair_color - img_hair_s.alpha = hair_alpha +/datum/species/proc/handle_body(var/mob/living/carbon/human/H) + H.remove_overlay(BODY_LAYER) - standing += img_hair_s + var/list/standing = list() - if(standing.len) - H.overlays_standing[HAIR_LAYER] = standing + // lipstick + if(H.lip_style && LIPS in specflags) + standing += image("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[H.lip_style]_s", "layer" = -BODY_LAYER) - H.apply_overlay(HAIR_LAYER) + // eyes + if(EYECOLOR in specflags) + var/image/img_eyes_s = image("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[eyes]_s", "layer" = -BODY_LAYER) + img_eyes_s.color = "#" + H.eye_color + standing += img_eyes_s - return + //Underwear + if(H.underwear) + var/datum/sprite_accessory/underwear/U = underwear_all[H.underwear] + if(U) + standing += image("icon"=U.icon, "icon_state"="[U.icon_state]_s", "layer"=-BODY_LAYER) - proc/handle_body(var/mob/living/carbon/human/H) - H.remove_overlay(BODY_LAYER) + if(standing.len) + H.overlays_standing[BODY_LAYER] = standing - var/list/standing = list() + H.apply_overlay(BODY_LAYER) - // lipstick - if(H.lip_style && LIPS in specflags) - standing += image("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[H.lip_style]_s", "layer" = -BODY_LAYER) + return - // eyes - if(EYECOLOR in specflags) - var/image/img_eyes_s = image("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[eyes]_s", "layer" = -BODY_LAYER) - img_eyes_s.color = "#" + H.eye_color - standing += img_eyes_s +/datum/species/proc/spec_life(var/mob/living/carbon/human/H) + return - //Underwear - if(H.underwear) - var/datum/sprite_accessory/underwear/U = underwear_all[H.underwear] - if(U) - standing += image("icon"=U.icon, "icon_state"="[U.icon_state]_s", "layer"=-BODY_LAYER) +/datum/species/proc/spec_death(var/gibbed, var/mob/living/carbon/human/H) + return - if(standing.len) - H.overlays_standing[BODY_LAYER] = standing +/datum/species/proc/auto_equip(var/mob/living/carbon/human/H) + // handles the equipping of species-specific gear + return - H.apply_overlay(BODY_LAYER) +/datum/species/proc/can_equip(var/obj/item/I, var/slot, var/disable_warning, var/mob/living/carbon/human/H) + if(slot in no_equip) + if(!(type in I.species_exception)) + return 0 - return - - proc/spec_life(var/mob/living/carbon/human/H) - return - - proc/spec_death(var/gibbed, var/mob/living/carbon/human/H) - return - - proc/auto_equip(var/mob/living/carbon/human/H) - // handles the equipping of species-specific gear - return - - proc/can_equip(var/obj/item/I, var/slot, var/disable_warning, var/mob/living/carbon/human/H) - if(slot in no_equip) - if(!(type in I.species_exception)) + switch(slot) + if(slot_l_hand) + if(H.l_hand) return 0 - - switch(slot) - if(slot_l_hand) - if(H.l_hand) - return 0 + return 1 + if(slot_r_hand) + if(H.r_hand) + return 0 + return 1 + if(slot_wear_mask) + if(H.wear_mask) + return 0 + if( !(I.slot_flags & SLOT_MASK) ) + return 0 + return 1 + if(slot_back) + if(H.back) + return 0 + if( !(I.slot_flags & SLOT_BACK) ) + return 0 + return 1 + if(slot_wear_suit) + if(H.wear_suit) + return 0 + if( !(I.slot_flags & SLOT_OCLOTHING) ) + return 0 + return 1 + if(slot_gloves) + if(H.gloves) + return 0 + if( !(I.slot_flags & SLOT_GLOVES) ) + return 0 + return 1 + if(slot_shoes) + if(H.shoes) + return 0 + if( !(I.slot_flags & SLOT_FEET) ) + return 0 + return 1 + if(slot_belt) + if(H.belt) + return 0 + if(!H.w_uniform && !nojumpsuit) + if(!disable_warning) + H << "You need a jumpsuit before you can attach this [I.name]." + return 0 + if( !(I.slot_flags & SLOT_BELT) ) + return + return 1 + if(slot_glasses) + if(H.glasses) + return 0 + if( !(I.slot_flags & SLOT_EYES) ) + return 0 + return 1 + if(slot_head) + if(H.head) + return 0 + if( !(I.slot_flags & SLOT_HEAD) ) + return 0 + return 1 + if(slot_ears) + if(H.ears) + return 0 + if( !(I.slot_flags & SLOT_EARS) ) + return 0 + return 1 + if(slot_w_uniform) + if(H.w_uniform) + return 0 + if( !(I.slot_flags & SLOT_ICLOTHING) ) + return 0 + return 1 + if(slot_wear_id) + if(H.wear_id) + return 0 + if(!H.w_uniform && !nojumpsuit) + if(!disable_warning) + H << "You need a jumpsuit before you can attach this [I.name]." + return 0 + if( !(I.slot_flags & SLOT_ID) ) + return 0 + return 1 + if(slot_l_store) + if(I.flags & NODROP) //Pockets aren't visible, so you can't move NODROP items into them. + return 0 + if(H.l_store) + return 0 + if(!H.w_uniform && !nojumpsuit) + if(!disable_warning) + H << "You need a jumpsuit before you can attach this [I.name]." + return 0 + if(I.slot_flags & SLOT_DENYPOCKET) + return + if( I.w_class <= 2 || (I.slot_flags & SLOT_POCKET) ) return 1 - if(slot_r_hand) - if(H.r_hand) - return 0 + if(slot_r_store) + if(I.flags & NODROP) + return 0 + if(H.r_store) + return 0 + if(!H.w_uniform && !nojumpsuit) + if(!disable_warning) + H << "You need a jumpsuit before you can attach this [I.name]." + return 0 + if(I.slot_flags & SLOT_DENYPOCKET) + return 0 + if( I.w_class <= 2 || (I.slot_flags & SLOT_POCKET) ) return 1 - if(slot_wear_mask) - if(H.wear_mask) - return 0 - if( !(I.slot_flags & SLOT_MASK) ) - return 0 + return 0 + if(slot_s_store) + if(I.flags & NODROP) + return 0 + if(H.s_store) + return 0 + if(!H.wear_suit) + if(!disable_warning) + H << "You need a suit before you can attach this [I.name]." + return 0 + if(!H.wear_suit.allowed) + if(!disable_warning) + H << "You somehow have a suit with no defined allowed items for suit storage, stop that." + return 0 + if(I.w_class > 4) + if(!disable_warning) + H << "The [I.name] is too big to attach." //should be src? + return 0 + if( istype(I, /obj/item/device/pda) || istype(I, /obj/item/weapon/pen) || is_type_in_list(I, H.wear_suit.allowed) ) return 1 - if(slot_back) - if(H.back) - return 0 - if( !(I.slot_flags & SLOT_BACK) ) - return 0 - return 1 - if(slot_wear_suit) - if(H.wear_suit) - return 0 - if( !(I.slot_flags & SLOT_OCLOTHING) ) - return 0 - return 1 - if(slot_gloves) - if(H.gloves) - return 0 - if( !(I.slot_flags & SLOT_GLOVES) ) - return 0 - return 1 - if(slot_shoes) - if(H.shoes) - return 0 - if( !(I.slot_flags & SLOT_FEET) ) - return 0 - return 1 - if(slot_belt) - if(H.belt) - return 0 - if(!H.w_uniform && !nojumpsuit) - if(!disable_warning) - H << "You need a jumpsuit before you can attach this [I.name]." - return 0 - if( !(I.slot_flags & SLOT_BELT) ) - return - return 1 - if(slot_glasses) - if(H.glasses) - return 0 - if( !(I.slot_flags & SLOT_EYES) ) - return 0 - return 1 - if(slot_head) - if(H.head) - return 0 - if( !(I.slot_flags & SLOT_HEAD) ) - return 0 - return 1 - if(slot_ears) - if(H.ears) - return 0 - if( !(I.slot_flags & SLOT_EARS) ) - return 0 - return 1 - if(slot_w_uniform) - if(H.w_uniform) - return 0 - if( !(I.slot_flags & SLOT_ICLOTHING) ) - return 0 - return 1 - if(slot_wear_id) - if(H.wear_id) - return 0 - if(!H.w_uniform && !nojumpsuit) - if(!disable_warning) - H << "You need a jumpsuit before you can attach this [I.name]." - return 0 - if( !(I.slot_flags & SLOT_ID) ) - return 0 - return 1 - if(slot_l_store) - if(I.flags & NODROP) //Pockets aren't visible, so you can't move NODROP items into them. - return 0 - if(H.l_store) - return 0 - if(!H.w_uniform && !nojumpsuit) - if(!disable_warning) - H << "You need a jumpsuit before you can attach this [I.name]." - return 0 - if(I.slot_flags & SLOT_DENYPOCKET) - return - if( I.w_class <= 2 || (I.slot_flags & SLOT_POCKET) ) + return 0 + if(slot_handcuffed) + if(H.handcuffed) + return 0 + if(!istype(I, /obj/item/weapon/handcuffs)) + return 0 + return 1 + if(slot_legcuffed) + if(H.legcuffed) + return 0 + if(!istype(I, /obj/item/weapon/legcuffs)) + return 0 + return 1 + if(slot_in_backpack) + if (H.back && istype(H.back, /obj/item/weapon/storage/backpack)) + var/obj/item/weapon/storage/backpack/B = H.back + if(B.contents.len < B.storage_slots && I.w_class <= B.max_w_class) return 1 - if(slot_r_store) - if(I.flags & NODROP) - return 0 - if(H.r_store) - return 0 - if(!H.w_uniform && !nojumpsuit) - if(!disable_warning) - H << "You need a jumpsuit before you can attach this [I.name]." - return 0 - if(I.slot_flags & SLOT_DENYPOCKET) - return 0 - if( I.w_class <= 2 || (I.slot_flags & SLOT_POCKET) ) - return 1 - return 0 - if(slot_s_store) - if(I.flags & NODROP) - return 0 - if(H.s_store) - return 0 - if(!H.wear_suit) - if(!disable_warning) - H << "You need a suit before you can attach this [I.name]." - return 0 - if(!H.wear_suit.allowed) - if(!disable_warning) - H << "You somehow have a suit with no defined allowed items for suit storage, stop that." - return 0 - if(I.w_class > 4) - if(!disable_warning) - H << "The [I.name] is too big to attach." //should be src? - return 0 - if( istype(I, /obj/item/device/pda) || istype(I, /obj/item/weapon/pen) || is_type_in_list(I, H.wear_suit.allowed) ) - return 1 - return 0 - if(slot_handcuffed) - if(H.handcuffed) - return 0 - if(!istype(I, /obj/item/weapon/handcuffs)) - return 0 - return 1 - if(slot_legcuffed) - if(H.legcuffed) - return 0 - if(!istype(I, /obj/item/weapon/legcuffs)) - return 0 - return 1 - if(slot_in_backpack) - if (H.back && istype(H.back, /obj/item/weapon/storage/backpack)) - var/obj/item/weapon/storage/backpack/B = H.back - if(B.contents.len < B.storage_slots && I.w_class <= B.max_w_class) - return 1 - return 0 - return 0 //Unsupported slot + return 0 + return 0 //Unsupported slot - proc/before_equip_job(var/datum/job/J, var/mob/living/carbon/human/H) - return +/datum/species/proc/before_equip_job(var/datum/job/J, var/mob/living/carbon/human/H) + return - proc/after_equip_job(var/datum/job/J, var/mob/living/carbon/human/H) - return +/datum/species/proc/after_equip_job(var/datum/job/J, var/mob/living/carbon/human/H) + return - proc/handle_chemicals(var/datum/reagent/chem, var/mob/living/carbon/human/H) - return 0 +/datum/species/proc/handle_chemicals(var/datum/reagent/chem, var/mob/living/carbon/human/H) + return 0 - proc/handle_speech(var/message, var/mob/living/carbon/human/H) - return message +/datum/species/proc/handle_speech(var/message, var/mob/living/carbon/human/H) + return message - //////// +//////// //LIFE// //////// - proc/handle_chemicals_in_body(var/mob/living/carbon/human/H) - if(H.reagents) H.reagents.metabolize(H) +/datum/species/proc/handle_chemicals_in_body(var/mob/living/carbon/human/H) + if(H.reagents) H.reagents.metabolize(H) - //The fucking FAT mutation is the dumbest shit ever. It makes the code so difficult to work with - if(FAT in H.mutations) - if(H.overeatduration < 100) - H << "You feel fit again!" - H.mutations -= FAT - H.update_inv_w_uniform(0) - H.update_inv_wear_suit() - else - if(H.overeatduration > 500) - H << "You suddenly feel blubbery!" - H.mutations |= FAT - H.update_inv_w_uniform(0) - H.update_inv_wear_suit() + //The fucking FAT mutation is the dumbest shit ever. It makes the code so difficult to work with + if(FAT in H.mutations) + if(H.overeatduration < 100) + H << "You feel fit again!" + H.mutations -= FAT + H.update_inv_w_uniform(0) + H.update_inv_wear_suit() + else + if(H.overeatduration > 500) + H << "You suddenly feel blubbery!" + H.mutations |= FAT + H.update_inv_w_uniform(0) + H.update_inv_wear_suit() - // nutrition decrease - if (H.nutrition > 0 && H.stat != 2) - H.nutrition = max (0, H.nutrition - HUNGER_FACTOR) + // nutrition decrease + if (H.nutrition > 0 && H.stat != 2) + H.nutrition = max (0, H.nutrition - HUNGER_FACTOR) - if (H.nutrition > 450) - if(H.overeatduration < 600) //capped so people don't take forever to unfat - H.overeatduration++ - else - if(H.overeatduration > 1) - H.overeatduration -= 2 //doubled the unfat rate + if (H.nutrition > 450) + if(H.overeatduration < 600) //capped so people don't take forever to unfat + H.overeatduration++ + else + if(H.overeatduration > 1) + H.overeatduration -= 2 //doubled the unfat rate - if (H.drowsyness) - H.drowsyness-- - H.eye_blurry = max(2, H.eye_blurry) - if (prob(5)) - H.sleeping += 1 - H.Paralyse(5) + if (H.drowsyness) + H.drowsyness-- + H.eye_blurry = max(2, H.eye_blurry) + if (prob(5)) + H.sleeping += 1 + H.Paralyse(5) - H.confused = max(0, H.confused - 1) - // decrement dizziness counter, clamped to 0 - if(H.resting) - H.dizziness = max(0, H.dizziness - 15) - H.jitteriness = max(0, H.jitteriness - 15) - else - H.dizziness = max(0, H.dizziness - 3) - H.jitteriness = max(0, H.jitteriness - 3) + H.confused = max(0, H.confused - 1) + // decrement dizziness counter, clamped to 0 + if(H.resting) + H.dizziness = max(0, H.dizziness - 15) + H.jitteriness = max(0, H.jitteriness - 15) + else + H.dizziness = max(0, H.dizziness - 3) + H.jitteriness = max(0, H.jitteriness - 3) - H.updatehealth() + H.updatehealth() - return + return - proc/handle_vision(var/mob/living/carbon/human/H) - if( H.stat == DEAD ) - H.sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) +/datum/species/proc/handle_vision(var/mob/living/carbon/human/H) + if( H.stat == DEAD ) + H.sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) + H.see_in_dark = 8 + if(!H.druggy) H.see_invisible = SEE_INVISIBLE_LEVEL_TWO + else + H.sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS) + var/see_temp = H.see_invisible + H.see_invisible = invis_sight + H.see_in_dark = darksight + + if(XRAY in H.mutations) + H.sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS H.see_in_dark = 8 - if(!H.druggy) H.see_invisible = SEE_INVISIBLE_LEVEL_TWO + H.see_invisible = SEE_INVISIBLE_LEVEL_TWO + + if(H.seer) + H.see_invisible = SEE_INVISIBLE_OBSERVER + + if(H.mind && H.mind.changeling) + H.hud_used.lingchemdisplay.invisibility = 0 + H.hud_used.lingchemdisplay.maptext = "
    [H.mind.changeling.chem_charges]
    " else - H.sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS) - var/see_temp = H.see_invisible - H.see_invisible = invis_sight - H.see_in_dark = darksight + H.hud_used.lingchemdisplay.invisibility = 101 - if(XRAY in H.mutations) - H.sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS - H.see_in_dark = 8 - H.see_invisible = SEE_INVISIBLE_LEVEL_TWO + if(istype(H.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)) + var/obj/item/clothing/mask/gas/voice/space_ninja/O = H.wear_mask + switch(O.mode) + if(0) + var/target_list[] = list() + for(var/mob/living/target in oview(H)) + if( target.mind&&(target.mind.special_role||issilicon(target)) )//They need to have a mind. + target_list += target + if(target_list.len)//Everything else is handled by the ninja mask proc. + O.assess_targets(target_list, H) + H.see_invisible = SEE_INVISIBLE_LIVING + if(1) + H.see_in_dark = 5 + H.see_invisible = SEE_INVISIBLE_LIVING + if(2) + H.sight |= SEE_MOBS + H.see_invisible = SEE_INVISIBLE_LEVEL_TWO + if(3) + H.sight |= SEE_TURFS + H.see_invisible = SEE_INVISIBLE_LIVING - if(H.seer) - H.see_invisible = SEE_INVISIBLE_OBSERVER + if(H.glasses) + if(istype(H.glasses, /obj/item/clothing/glasses)) + var/obj/item/clothing/glasses/G = H.glasses + H.sight |= G.vision_flags + H.see_in_dark = G.darkness_view + H.see_invisible = G.invis_view + if(G.hud) + G.process_hud(H) - if(H.mind && H.mind.changeling) - H.hud_used.lingchemdisplay.invisibility = 0 - H.hud_used.lingchemdisplay.maptext = "
    [H.mind.changeling.chem_charges]
    " - else - H.hud_used.lingchemdisplay.invisibility = 101 + if(H.druggy) //Override for druggy + H.see_invisible = see_temp - if(istype(H.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)) - var/obj/item/clothing/mask/gas/voice/space_ninja/O = H.wear_mask - switch(O.mode) - if(0) - var/target_list[] = list() - for(var/mob/living/target in oview(H)) - if( target.mind&&(target.mind.special_role||issilicon(target)) )//They need to have a mind. - target_list += target - if(target_list.len)//Everything else is handled by the ninja mask proc. - O.assess_targets(target_list, H) - H.see_invisible = SEE_INVISIBLE_LIVING - if(1) - H.see_in_dark = 5 - H.see_invisible = SEE_INVISIBLE_LIVING - if(2) - H.sight |= SEE_MOBS - H.see_invisible = SEE_INVISIBLE_LEVEL_TWO - if(3) - H.sight |= SEE_TURFS - H.see_invisible = SEE_INVISIBLE_LIVING + if(H.see_override) //Override all + H.see_invisible = H.see_override - if(H.glasses) - if(istype(H.glasses, /obj/item/clothing/glasses)) - var/obj/item/clothing/glasses/G = H.glasses - H.sight |= G.vision_flags - H.see_in_dark = G.darkness_view - H.see_invisible = G.invis_view - if(G.hud) - G.process_hud(H) + // This checks how much the mob's eyewear impairs their vision + if(H.tinttotal >= TINT_IMPAIR) + if(tinted_weldhelh) + if(H.tinttotal >= TINT_BLIND) + H.blinded = 1 // You get the sudden urge to learn to play keyboard + H.client.screen += global_hud.darkMask + else + H.client.screen += global_hud.darkMask - if(H.druggy) //Override for druggy - H.see_invisible = see_temp + if(H.blind) + if(H.blinded) H.blind.layer = 18 + else H.blind.layer = 0 - if(H.see_override) //Override all - H.see_invisible = H.see_override - - // This checks how much the mob's eyewear impairs their vision - if(H.tinttotal >= TINT_IMPAIR) - if(tinted_weldhelh) - if(H.tinttotal >= TINT_BLIND) - H.blinded = 1 // You get the sudden urge to learn to play keyboard - H.client.screen += global_hud.darkMask - else - H.client.screen += global_hud.darkMask - - if(H.blind) - if(H.blinded) H.blind.layer = 18 - else H.blind.layer = 0 - - if( H.disabilities & NEARSIGHTED && !istype(H.glasses, /obj/item/clothing/glasses/regular) ) - H.client.screen += global_hud.vimpaired - if(H.eye_blurry) H.client.screen += global_hud.blurry - if(H.druggy) H.client.screen += global_hud.druggy + if( H.disabilities & NEARSIGHTED && !istype(H.glasses, /obj/item/clothing/glasses/regular) ) + H.client.screen += global_hud.vimpaired + if(H.eye_blurry) H.client.screen += global_hud.blurry + if(H.druggy) H.client.screen += global_hud.druggy - if(H.eye_stat > 20) - if(H.eye_stat > 30) H.client.screen += global_hud.darkMask - else H.client.screen += global_hud.vimpaired + if(H.eye_stat > 20) + if(H.eye_stat > 30) H.client.screen += global_hud.darkMask + else H.client.screen += global_hud.vimpaired - return 1 + return 1 - proc/handle_hud_icons(var/mob/living/carbon/human/H) - if(H.healths) - if(H.stat == DEAD) - H.healths.icon_state = "health7" - else - switch(H.hal_screwyhud) - if(1) H.healths.icon_state = "health6" - if(2) H.healths.icon_state = "health7" - else - switch(H.health - H.staminaloss) - if(100 to INFINITY) H.healths.icon_state = "health0" - if(80 to 100) H.healths.icon_state = "health1" - if(60 to 80) H.healths.icon_state = "health2" - if(40 to 60) H.healths.icon_state = "health3" - if(20 to 40) H.healths.icon_state = "health4" - if(0 to 20) H.healths.icon_state = "health5" - else H.healths.icon_state = "health6" +/datum/species/proc/handle_hud_icons(var/mob/living/carbon/human/H) + if(H.healths) + if(H.stat == DEAD) + H.healths.icon_state = "health7" + else + switch(H.hal_screwyhud) + if(1) H.healths.icon_state = "health6" + if(2) H.healths.icon_state = "health7" + else + switch(H.health - H.staminaloss) + if(100 to INFINITY) H.healths.icon_state = "health0" + if(80 to 100) H.healths.icon_state = "health1" + if(60 to 80) H.healths.icon_state = "health2" + if(40 to 60) H.healths.icon_state = "health3" + if(20 to 40) H.healths.icon_state = "health4" + if(0 to 20) H.healths.icon_state = "health5" + else H.healths.icon_state = "health6" - if(H.nutrition_icon) - switch(H.nutrition) - if(450 to INFINITY) H.nutrition_icon.icon_state = "nutrition0" - if(350 to 450) H.nutrition_icon.icon_state = "nutrition1" - if(250 to 350) H.nutrition_icon.icon_state = "nutrition2" - if(150 to 250) H.nutrition_icon.icon_state = "nutrition3" - else H.nutrition_icon.icon_state = "nutrition4" + if(H.nutrition_icon) + switch(H.nutrition) + if(450 to INFINITY) H.nutrition_icon.icon_state = "nutrition0" + if(350 to 450) H.nutrition_icon.icon_state = "nutrition1" + if(250 to 350) H.nutrition_icon.icon_state = "nutrition2" + if(150 to 250) H.nutrition_icon.icon_state = "nutrition3" + else H.nutrition_icon.icon_state = "nutrition4" - if(H.pressure) - H.pressure.icon_state = "pressure[H.pressure_alert]" + if(H.pressure) + H.pressure.icon_state = "pressure[H.pressure_alert]" - if(H.pullin) - if(H.pulling) H.pullin.icon_state = "pull" - else H.pullin.icon_state = "pull0" + if(H.pullin) + if(H.pulling) H.pullin.icon_state = "pull" + else H.pullin.icon_state = "pull0" // if(rest) //Not used with new UI // if(resting || lying || sleeping) rest.icon_state = "rest1" // else rest.icon_state = "rest0" - if(H.toxin) - if(H.hal_screwyhud == 4 || H.toxins_alert) H.toxin.icon_state = "tox1" - else H.toxin.icon_state = "tox0" - if(H.oxygen) - if(H.hal_screwyhud == 3 || H.oxygen_alert) H.oxygen.icon_state = "oxy1" - else H.oxygen.icon_state = "oxy0" - if(H.fire) - if(H.fire_alert) H.fire.icon_state = "fire[H.fire_alert]" //fire_alert is either 0 if no alert, 1 for cold and 2 for heat. - else H.fire.icon_state = "fire0" + if(H.toxin) + if(H.hal_screwyhud == 4 || H.toxins_alert) H.toxin.icon_state = "tox1" + else H.toxin.icon_state = "tox0" + if(H.oxygen) + if(H.hal_screwyhud == 3 || H.oxygen_alert) H.oxygen.icon_state = "oxy1" + else H.oxygen.icon_state = "oxy0" + if(H.fire) + if(H.fire_alert) H.fire.icon_state = "fire[H.fire_alert]" //fire_alert is either 0 if no alert, 1 for cold and 2 for heat. + else H.fire.icon_state = "fire0" - if(H.bodytemp) - if(!(HEATRES in specflags)) - switch(H.bodytemperature) //310.055 optimal body temp - if(370 to INFINITY) H.bodytemp.icon_state = "temp4" - if(350 to 370) H.bodytemp.icon_state = "temp3" - if(335 to 350) H.bodytemp.icon_state = "temp2" + if(H.bodytemp) + if(!(HEATRES in specflags)) + switch(H.bodytemperature) //310.055 optimal body temp + if(370 to INFINITY) H.bodytemp.icon_state = "temp4" + if(350 to 370) H.bodytemp.icon_state = "temp3" + if(335 to 350) H.bodytemp.icon_state = "temp2" + switch(H.bodytemperature) + if(320 to 335) H.bodytemp.icon_state = "temp1" + if(300 to 320) H.bodytemp.icon_state = "temp0" + if(295 to 300) H.bodytemp.icon_state = "temp-1" + if(!(COLDRES in specflags)) switch(H.bodytemperature) - if(320 to 335) H.bodytemp.icon_state = "temp1" - if(300 to 320) H.bodytemp.icon_state = "temp0" - if(295 to 300) H.bodytemp.icon_state = "temp-1" - if(!(COLDRES in specflags)) - switch(H.bodytemperature) - if(280 to 295) H.bodytemp.icon_state = "temp-2" - if(260 to 280) H.bodytemp.icon_state = "temp-3" - if(-INFINITY to 260) H.bodytemp.icon_state = "temp-4" + if(280 to 295) H.bodytemp.icon_state = "temp-2" + if(260 to 280) H.bodytemp.icon_state = "temp-3" + if(-INFINITY to 260) H.bodytemp.icon_state = "temp-4" - return 1 + return 1 - proc/handle_mutations_and_radiation(var/mob/living/carbon/human/H) - if(H.getFireLoss()) - if((COLD_RESISTANCE in H.mutations) || (prob(1))) - H.heal_organ_damage(0,1) +/datum/species/proc/handle_mutations_and_radiation(var/mob/living/carbon/human/H) + if(H.getFireLoss()) + if((COLD_RESISTANCE in H.mutations) || (prob(1))) + H.heal_organ_damage(0,1) - if ((HULK in H.mutations) && H.health <= 25) - H.mutations.Remove(HULK) - H.update_mutations() //update our mutation overlays - H << "You suddenly feel very weak." - H.Weaken(3) + if ((HULK in H.mutations) && H.health <= 25) + H.mutations.Remove(HULK) + H.update_mutations() //update our mutation overlays + H << "You suddenly feel very weak." + H.Weaken(3) + H.emote("collapse") + + if (H.radiation && !(RADIMMUNE in specflags)) + if (H.radiation > 100) + H.radiation = 100 + H.Weaken(10) + H << "You feel weak." H.emote("collapse") - if (H.radiation && !(RADIMMUNE in specflags)) - if (H.radiation > 100) - H.radiation = 100 - H.Weaken(10) - H << "You feel weak." - H.emote("collapse") + if (H.radiation < 0) + H.radiation = 0 - if (H.radiation < 0) - H.radiation = 0 - - else - switch(H.radiation) - if(1 to 49) - H.radiation-- - if(prob(25)) - H.adjustToxLoss(1) - H.updatehealth() - - if(50 to 74) - H.radiation -= 2 + else + switch(H.radiation) + if(1 to 49) + H.radiation-- + if(prob(25)) H.adjustToxLoss(1) - if(prob(5)) - H.radiation -= 5 - H.Weaken(3) - H << "You feel weak." - H.emote("collapse") - if(prob(15)) - if(!( H.hair_style == "Shaved") || !(H.hair_style == "Bald") || HAIR in specflags) - H << "Your hair starts to fall out in clumps..." - spawn(50) - H.facial_hair_style = "Shaved" - H.hair_style = "Bald" - H.update_hair() H.updatehealth() - if(75 to 100) - H.radiation -= 3 - H.adjustToxLoss(3) - if(prob(1)) - H << "You mutate!" - randmutb(H) - domutcheck(H,null) - H.emote("gasp") - H.updatehealth() + if(50 to 74) + H.radiation -= 2 + H.adjustToxLoss(1) + if(prob(5)) + H.radiation -= 5 + H.Weaken(3) + H << "You feel weak." + H.emote("collapse") + if(prob(15)) + if(!( H.hair_style == "Shaved") || !(H.hair_style == "Bald") || HAIR in specflags) + H << "Your hair starts to fall out in clumps..." + spawn(50) + H.facial_hair_style = "Shaved" + H.hair_style = "Bald" + H.update_hair() + H.updatehealth() - //////////////// - // MOVE SPEED // - //////////////// + if(75 to 100) + H.radiation -= 3 + H.adjustToxLoss(3) + if(prob(1)) + H << "You mutate!" + randmutb(H) + domutcheck(H,null) + H.emote("gasp") + H.updatehealth() - proc/movement_delay(var/mob/living/carbon/human/H) - var/mspeed = 0 +//////////////// +// MOVE SPEED // +//////////////// - if(!has_gravity(H)) - return -1 //It's hard to be slowed down in space by... anything - else if(H.status_flags & GOTTAGOFAST) - return -1 +/datum/species/proc/movement_delay(var/mob/living/carbon/human/H) + var/mspeed = 0 - mspeed = 0 - var/health_deficiency = (100 - H.health + H.staminaloss) - if(health_deficiency >= 40) - mspeed += (health_deficiency / 25) + if(!has_gravity(H)) + return -1 //It's hard to be slowed down in space by... anything + else if(H.status_flags & GOTTAGOFAST) + return -1 - var/hungry = (500 - H.nutrition) / 5 //So overeat would be 100 and default level would be 80 - if(hungry >= 70) - mspeed += hungry / 50 + mspeed = 0 + var/health_deficiency = (100 - H.health + H.staminaloss) + if(health_deficiency >= 40) + mspeed += (health_deficiency / 25) - if(H.wear_suit) - mspeed += H.wear_suit.slowdown - if(H.shoes) - mspeed += H.shoes.slowdown - if(H.back) - mspeed += H.back.slowdown + var/hungry = (500 - H.nutrition) / 5 //So overeat would be 100 and default level would be 80 + if(hungry >= 70) + mspeed += hungry / 50 - if(FAT in H.mutations) - mspeed += 1.5 - if(H.bodytemperature < 283.222) - mspeed += (283.222 - H.bodytemperature) / 10 * 1.75 + if(H.wear_suit) + mspeed += H.wear_suit.slowdown + if(H.shoes) + mspeed += H.shoes.slowdown + if(H.back) + mspeed += H.back.slowdown - mspeed += speedmod + if(FAT in H.mutations) + mspeed += 1.5 + if(H.bodytemperature < 283.222) + mspeed += (283.222 - H.bodytemperature) / 10 * 1.75 - return mspeed + mspeed += speedmod - ////////////////// - // ATTACK PROCS // - ////////////////// + return mspeed - proc/spec_attack_hand(var/mob/living/carbon/human/M, var/mob/living/carbon/human/H) - if((M != H) && H.check_shields(0, M.name)) - add_logs(M, H, "attempted to touch") - H.visible_message("[M] attempted to touch [H]!") - return 0 +////////////////// +// ATTACK PROCS // +////////////////// - switch(M.a_intent) - if("help") - if(H.health >= 0) - H.help_shake_act(M) - if(H != M) - add_logs(M, H, "shaked") - return 1 +/datum/species/proc/spec_attack_hand(var/mob/living/carbon/human/M, var/mob/living/carbon/human/H) + if((M != H) && H.check_shields(0, M.name)) + add_logs(M, H, "attempted to touch") + H.visible_message("[M] attempted to touch [H]!") + return 0 - //CPR - if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH))) - M << "Remove your mask!" - return 0 - if((H.head && (H.head.flags & HEADCOVERSMOUTH)) || (H.wear_mask && (H.wear_mask.flags & MASKCOVERSMOUTH))) - M << "Remove their mask!" - return 0 - - if(H.cpr_time < world.time + 30) - add_logs(H, M, "CPRed") - H.visible_message("[M] is trying to perform CPR on [H]!") - if(!do_mob(M, H)) - return 0 - if((H.health >= -99 && H.health <= 0)) - H.cpr_time = world.time - var/suff = min(H.getOxyLoss(), 7) - H.adjustOxyLoss(-suff) - H.updatehealth() - M.visible_message("[M] performs CPR on [H]!") - H << "You feel a breath of fresh air enter your lungs. It feels good." - - if("grab") - if(M == H || H.anchored) - return 0 - - add_logs(M, H, "grabbed", addition="passively") - - if(H.w_uniform) - H.w_uniform.add_fingerprint(M) - - var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, H) - if(H.buckled) - M << "You cannot grab [H], \he is buckled in!" - if(!G) //the grab will delete itself in New if affecting is anchored - return - M.put_in_active_hand(G) - G.synch() - H.LAssailant = M - - playsound(H.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - H.visible_message("[M] has grabbed [H] passively!") + switch(M.a_intent) + if("help") + if(H.health >= 0) + H.help_shake_act(M) + if(H != M) + add_logs(M, H, "shaked") return 1 - if("harm") - add_logs(M, H, "punched") + //CPR + if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH))) + M << "Remove your mask!" + return 0 + if((H.head && (H.head.flags & HEADCOVERSMOUTH)) || (H.wear_mask && (H.wear_mask.flags & MASKCOVERSMOUTH))) + M << "Remove their mask!" + return 0 - var/atk_verb = "punch" - if(H.lying) - atk_verb = "kick" - else if(M.dna) - atk_verb = M.dna.species.attack_verb - - var/damage = rand(0, 9) - damage += punchmod - - if(!damage) - if(M.dna) - playsound(H.loc, M.dna.species.miss_sound, 25, 1, -1) - else - playsound(H.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - - H.visible_message("[M] has attempted to [atk_verb] [H]!") + if(H.cpr_time < world.time + 30) + add_logs(H, M, "CPRed") + H.visible_message("[M] is trying to perform CPR on [H]!") + if(!do_mob(M, H)) return 0 + if((H.health >= -99 && H.health <= 0)) + H.cpr_time = world.time + var/suff = min(H.getOxyLoss(), 7) + H.adjustOxyLoss(-suff) + H.updatehealth() + M.visible_message("[M] performs CPR on [H]!") + H << "You feel a breath of fresh air enter your lungs. It feels good." + if("grab") + if(M == H || H.anchored) + return 0 - var/obj/item/organ/limb/affecting = H.get_organ(ran_zone(M.zone_sel.selecting)) - var/armor_block = H.run_armor_check(affecting, "melee") + add_logs(M, H, "grabbed", addition="passively") - if(HULK in M.mutations) - damage += 5 + if(H.w_uniform) + H.w_uniform.add_fingerprint(M) + var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, H) + if(H.buckled) + M << "You cannot grab [H], \he is buckled in!" + if(!G) //the grab will delete itself in New if affecting is anchored + return + M.put_in_active_hand(G) + G.synch() + H.LAssailant = M + + playsound(H.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + H.visible_message("[M] has grabbed [H] passively!") + return 1 + + if("harm") + add_logs(M, H, "punched") + + var/atk_verb = "punch" + if(H.lying) + atk_verb = "kick" + else if(M.dna) + atk_verb = M.dna.species.attack_verb + + var/damage = rand(0, 9) + damage += punchmod + + if(!damage) if(M.dna) - playsound(H.loc, M.dna.species.attack_sound, 25, 1, -1) + playsound(H.loc, M.dna.species.miss_sound, 25, 1, -1) else - playsound(H.loc, 'sound/weapons/punch1.ogg', 25, 1, -1) + playsound(H.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + + H.visible_message("[M] has attempted to [atk_verb] [H]!") + return 0 - H.visible_message("[M] has [atk_verb]ed [H]!", \ - "[M] has [atk_verb]ed [H]!") + var/obj/item/organ/limb/affecting = H.get_organ(ran_zone(M.zone_sel.selecting)) + var/armor_block = H.run_armor_check(affecting, "melee") - H.apply_damage(damage, BRUTE, affecting, armor_block) - if((H.stat != DEAD) && damage >= 9) - H.visible_message("[M] has weakened [H]!", \ - "[M] has weakened [H]!") - H.apply_effect(4, WEAKEN, armor_block) - H.forcesay(hit_appends) - else if(H.lying) - H.forcesay(hit_appends) + if(HULK in M.mutations) + damage += 5 - if("disarm") - add_logs(M, H, "disarmed") + if(M.dna) + playsound(H.loc, M.dna.species.attack_sound, 25, 1, -1) + else + playsound(H.loc, 'sound/weapons/punch1.ogg', 25, 1, -1) - if(H.w_uniform) - H.w_uniform.add_fingerprint(M) - var/obj/item/organ/limb/affecting = H.get_organ(ran_zone(M.zone_sel.selecting)) - var/randn = rand(1, 100) - if(randn <= 25) - H.apply_effect(2, WEAKEN, H.run_armor_check(affecting, "melee")) - playsound(H, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - H.visible_message("[M] has pushed [H]!", - "[M] has pushed [H]!") - H.forcesay(hit_appends) - return - var/talked = 0 // BubbleWrap + H.visible_message("[M] has [atk_verb]ed [H]!", \ + "[M] has [atk_verb]ed [H]!") - if(randn <= 60) - //BubbleWrap: Disarming breaks a pull - if(H.pulling) - H.visible_message("[M] has broken [H]'s grip on [H.pulling]!") + H.apply_damage(damage, BRUTE, affecting, armor_block) + if((H.stat != DEAD) && damage >= 9) + H.visible_message("[M] has weakened [H]!", \ + "[M] has weakened [H]!") + H.apply_effect(4, WEAKEN, armor_block) + H.forcesay(hit_appends) + else if(H.lying) + H.forcesay(hit_appends) + + if("disarm") + add_logs(M, H, "disarmed") + + if(H.w_uniform) + H.w_uniform.add_fingerprint(M) + var/obj/item/organ/limb/affecting = H.get_organ(ran_zone(M.zone_sel.selecting)) + var/randn = rand(1, 100) + if(randn <= 25) + H.apply_effect(2, WEAKEN, H.run_armor_check(affecting, "melee")) + playsound(H, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + H.visible_message("[M] has pushed [H]!", + "[M] has pushed [H]!") + H.forcesay(hit_appends) + return + + var/talked = 0 // BubbleWrap + + if(randn <= 60) + //BubbleWrap: Disarming breaks a pull + if(H.pulling) + H.visible_message("[M] has broken [H]'s grip on [H.pulling]!") + talked = 1 + H.stop_pulling() + + //BubbleWrap: Disarming also breaks a grab - this will also stop someone being choked, won't it? + if(istype(H.l_hand, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/lgrab = H.l_hand + if(lgrab.affecting) + H.visible_message("[M] has broken [H]'s grip on [lgrab.affecting]!") talked = 1 - H.stop_pulling() + spawn(1) + qdel(lgrab) + if(istype(H.r_hand, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/rgrab = H.r_hand + if(rgrab.affecting) + H.visible_message("[M] has broken [H]'s grip on [rgrab.affecting]!") + talked = 1 + spawn(1) + qdel(rgrab) + //End BubbleWrap - //BubbleWrap: Disarming also breaks a grab - this will also stop someone being choked, won't it? - if(istype(H.l_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/lgrab = H.l_hand - if(lgrab.affecting) - H.visible_message("[M] has broken [H]'s grip on [lgrab.affecting]!") - talked = 1 - spawn(1) - qdel(lgrab) - if(istype(H.r_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/rgrab = H.r_hand - if(rgrab.affecting) - H.visible_message("[M] has broken [H]'s grip on [rgrab.affecting]!") - talked = 1 - spawn(1) - qdel(rgrab) - //End BubbleWrap - - if(!talked) //BubbleWrap - if(H.drop_item()) - H.visible_message("[M] has disarmed [H]!", \ - "[M] has disarmed [H]!") - playsound(H, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - return + if(!talked) //BubbleWrap + if(H.drop_item()) + H.visible_message("[M] has disarmed [H]!", \ + "[M] has disarmed [H]!") + playsound(H, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + return - playsound(H, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - H.visible_message("[M] attempted to disarm [H]!", \ - "[M] attemped to disarm [H]!") - return + playsound(H, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + H.visible_message("[M] attempted to disarm [H]!", \ + "[M] attemped to disarm [H]!") + return - proc/spec_attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone, var/obj/item/organ/limb/affecting, var/hit_area, var/intent, var/obj/item/organ/limb/target_limb, target_area, var/mob/living/carbon/human/H) - // Allows you to put in item-specific reactions based on species - if((user != H) && H.check_shields(I.force, "the [I.name]")) - return 0 +/datum/species/proc/spec_attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone, var/obj/item/organ/limb/affecting, var/hit_area, var/intent, var/obj/item/organ/limb/target_limb, target_area, var/mob/living/carbon/human/H) + // Allows you to put in item-specific reactions based on species + if((user != H) && H.check_shields(I.force, "the [I.name]")) + return 0 - if(I.attack_verb && I.attack_verb.len) - H.visible_message("[H] has been [pick(I.attack_verb)] in the [hit_area] with [I] by [user]!", \ - "[H] has been [pick(I.attack_verb)] in the [hit_area] with [I] by [user]!") - else if(I.force) - H.visible_message("[H] has been attacked in the [hit_area] with [I] by [user]!", \ - "[H] has been attacked in the [hit_area] with [I] by [user]!") - else - return 0 + if(I.attack_verb && I.attack_verb.len) + H.visible_message("[H] has been [pick(I.attack_verb)] in the [hit_area] with [I] by [user]!", \ + "[H] has been [pick(I.attack_verb)] in the [hit_area] with [I] by [user]!") + else if(I.force) + H.visible_message("[H] has been attacked in the [hit_area] with [I] by [user]!", \ + "[H] has been attacked in the [hit_area] with [I] by [user]!") + else + return 0 - var/armor = H.run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened a hit to your [hit_area].") - if(armor >= 100) return 0 - var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords) + var/armor = H.run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened a hit to your [hit_area].") + if(armor >= 100) return 0 + var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords) - apply_damage(I.force, I.damtype, affecting, armor, H) + apply_damage(I.force, I.damtype, affecting, armor, H) - var/bloody = 0 - if(((I.damtype == BRUTE) && prob(25 + (I.force * 2)))) - if(affecting.status == ORGAN_ORGANIC) - I.add_blood(H) //Make the weapon bloody, not the person. - if(prob(I.force * 2)) //blood spatter! - bloody = 1 - var/turf/location = H.loc - if(istype(location, /turf/simulated)) - location.add_blood(H) - if(get_dist(H, H) <= 1) //people with TK won't get smeared with blood - if(H.wear_suit) - H.wear_suit.add_blood(H) - H.update_inv_wear_suit(0) //updates mob overlays to show the new blood (no refresh) - else if(H.w_uniform) - H.w_uniform.add_blood(H) - H.update_inv_w_uniform(0) //updates mob overlays to show the new blood (no refresh) - if (H.gloves) - var/obj/item/clothing/gloves/G = H.gloves - G.add_blood(H) - else - H.add_blood(H) - H.update_inv_gloves() //updates on-mob overlays for bloody hands and/or bloody gloves - - - switch(hit_area) - if("head") //Harder to score a stun but if you do it lasts a bit longer - if(H.stat == CONSCIOUS && prob(I.force) && armor < 50) - H.visible_message("[H] has been knocked unconscious!", \ - "[H] has been knocked unconscious!") - H.apply_effect(20, PARALYZE, armor) - if(H != user && I.damtype == BRUTE) - ticker.mode.remove_revolutionary(H.mind) - - if(bloody) //Apply blood - if(H.wear_mask) - H.wear_mask.add_blood(H) - H.update_inv_wear_mask(0) - if(H.head) - H.head.add_blood(H) - H.update_inv_head(0) - if(H.glasses && prob(33)) - H.glasses.add_blood(H) - H.update_inv_glasses(0) - - if("chest") //Easier to score a stun but lasts less time - if(H.stat == CONSCIOUS && prob(I.force + 10)) - H.visible_message("[H] has been knocked down!", \ - "[H] has been knocked down!") - H.apply_effect(5, WEAKEN, armor) - - if(bloody) - if(H.wear_suit) - H.wear_suit.add_blood(H) - H.update_inv_wear_suit(0) - if(H.w_uniform) - H.w_uniform.add_blood(H) - H.update_inv_w_uniform(0) - - if(Iforce > 10 || Iforce >= 5 && prob(33)) - H.forcesay(hit_appends) //forcesay checks stat already. - return - - proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone, var/mob/living/carbon/human/H) - H.apply_damage(I.force, I.damtype) - if(I.damtype == "brute") - if(prob(33) && I.force && !(NOBLOOD in specflags)) + var/bloody = 0 + if(((I.damtype == BRUTE) && prob(25 + (I.force * 2)))) + if(affecting.status == ORGAN_ORGANIC) + I.add_blood(H) //Make the weapon bloody, not the person. + if(prob(I.force * 2)) //blood spatter! + bloody = 1 var/turf/location = H.loc if(istype(location, /turf/simulated)) - location.add_blood_floor(H) + location.add_blood(H) + if(get_dist(H, H) <= 1) //people with TK won't get smeared with blood + if(H.wear_suit) + H.wear_suit.add_blood(H) + H.update_inv_wear_suit(0) //updates mob overlays to show the new blood (no refresh) + else if(H.w_uniform) + H.w_uniform.add_blood(H) + H.update_inv_w_uniform(0) //updates mob overlays to show the new blood (no refresh) + if (H.gloves) + var/obj/item/clothing/gloves/G = H.gloves + G.add_blood(H) + else + H.add_blood(H) + H.update_inv_gloves() //updates on-mob overlays for bloody hands and/or bloody gloves - var/showname = "." - if(user) - showname = " by [user]!" - if(!(user in viewers(I, null))) - showname = "." - if(I.attack_verb && I.attack_verb.len) - H.visible_message("[H] has been [pick(I.attack_verb)] with [I][showname]", - "[H] has been [pick(I.attack_verb)] with [I][showname]") - else if(I.force) - H.visible_message("[H] has been attacked with [I][showname]", - "[H] has been attacked with [I][showname]") - if(!showname && user) - if(user.client) - user << "You attack [H] with [I]. " + switch(hit_area) + if("head") //Harder to score a stun but if you do it lasts a bit longer + if(H.stat == CONSCIOUS && prob(I.force) && armor < 50) + H.visible_message("[H] has been knocked unconscious!", \ + "[H] has been knocked unconscious!") + H.apply_effect(20, PARALYZE, armor) + if(H != user && I.damtype == BRUTE) + ticker.mode.remove_revolutionary(H.mind) + if(bloody) //Apply blood + if(H.wear_mask) + H.wear_mask.add_blood(H) + H.update_inv_wear_mask(0) + if(H.head) + H.head.add_blood(H) + H.update_inv_head(0) + if(H.glasses && prob(33)) + H.glasses.add_blood(H) + H.update_inv_glasses(0) + + if("chest") //Easier to score a stun but lasts less time + if(H.stat == CONSCIOUS && prob(I.force + 10)) + H.visible_message("[H] has been knocked down!", \ + "[H] has been knocked down!") + H.apply_effect(5, WEAKEN, armor) + + if(bloody) + if(H.wear_suit) + H.wear_suit.add_blood(H) + H.update_inv_wear_suit(0) + if(H.w_uniform) + H.w_uniform.add_blood(H) + H.update_inv_w_uniform(0) + + if(Iforce > 10 || Iforce >= 5 && prob(33)) + H.forcesay(hit_appends) //forcesay checks stat already. return - proc/apply_damage(var/damage, var/damagetype = BRUTE, var/def_zone = null, var/blocked, var/mob/living/carbon/human/H) - blocked = (100-(blocked+armor))/100 - if(blocked <= 0) return 0 +/datum/species/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone, var/mob/living/carbon/human/H) + H.apply_damage(I.force, I.damtype) + if(I.damtype == "brute") + if(prob(33) && I.force && !(NOBLOOD in specflags)) + var/turf/location = H.loc + if(istype(location, /turf/simulated)) + location.add_blood_floor(H) - var/obj/item/organ/limb/organ = null - if(isorgan(def_zone)) - organ = def_zone - else - if(!def_zone) def_zone = ran_zone(def_zone) - organ = H.get_organ(check_zone(def_zone)) - if(!organ) return 0 + var/showname = "." + if(user) + showname = " by [user]!" + if(!(user in viewers(I, null))) + showname = "." - damage = (damage * blocked) + if(I.attack_verb && I.attack_verb.len) + H.visible_message("[H] has been [pick(I.attack_verb)] with [I][showname]", + "[H] has been [pick(I.attack_verb)] with [I][showname]") + else if(I.force) + H.visible_message("[H] has been attacked with [I][showname]", + "[H] has been attacked with [I][showname]") + if(!showname && user) + if(user.client) + user << "You attack [H] with [I]. " - switch(damagetype) - if(BRUTE) - H.damageoverlaytemp = 20 - if(organ.take_damage(damage*brutemod, 0)) - H.update_damage_overlays(0) - if(BURN) - H.damageoverlaytemp = 20 - if(organ.take_damage(0, damage*burnmod)) - H.update_damage_overlays(0) - if(TOX) - H.adjustToxLoss(damage * blocked) - if(OXY) - H.adjustOxyLoss(damage * blocked) - if(CLONE) - H.adjustCloneLoss(damage * blocked) - if(STAMINA) - H.adjustStaminaLoss(damage * blocked) + return - proc/on_hit(var/obj/item/projectile/proj_type, var/mob/living/carbon/human/H) - // called when hit by a projectile - switch(proj_type) - if(/obj/item/projectile/energy/floramut) // overwritten by plants/pods - H.show_message("The radiation beam dissipates harmlessly through your body.") - if(/obj/item/projectile/energy/florayield) - H.show_message("The radiation beam dissipates harmlessly through your body.") - return +/datum/species/proc/apply_damage(var/damage, var/damagetype = BRUTE, var/def_zone = null, var/blocked, var/mob/living/carbon/human/H) + blocked = (100-(blocked+armor))/100 + if(blocked <= 0) return 0 - ///////////// - //BREATHING// - ///////////// + var/obj/item/organ/limb/organ = null + if(isorgan(def_zone)) + organ = def_zone + else + if(!def_zone) def_zone = ran_zone(def_zone) + organ = H.get_organ(check_zone(def_zone)) + if(!organ) return 0 - proc/breathe(var/mob/living/carbon/human/H) - if(H.reagents.has_reagent("lexorin")) return - if(istype(H.loc, /obj/machinery/atmospherics/unary/cryo_cell)) return + damage = (damage * blocked) - var/datum/gas_mixture/environment = H.loc.return_air() - var/datum/gas_mixture/breath - // HACK NEED CHANGING LATER - if(H.health <= config.health_threshold_crit) - H.losebreath++ + switch(damagetype) + if(BRUTE) + H.damageoverlaytemp = 20 + if(organ.take_damage(damage*brutemod, 0)) + H.update_damage_overlays(0) + if(BURN) + H.damageoverlaytemp = 20 + if(organ.take_damage(0, damage*burnmod)) + H.update_damage_overlays(0) + if(TOX) + H.adjustToxLoss(damage * blocked) + if(OXY) + H.adjustOxyLoss(damage * blocked) + if(CLONE) + H.adjustCloneLoss(damage * blocked) + if(STAMINA) + H.adjustStaminaLoss(damage * blocked) - if(H.losebreath>0) //Suffocating so do not take a breath - H.losebreath-- - if (prob(10)) //Gasp per 10 ticks? Sounds about right. - spawn H.emote("gasp") +/datum/species/proc/on_hit(var/obj/item/projectile/proj_type, var/mob/living/carbon/human/H) + // called when hit by a projectile + switch(proj_type) + if(/obj/item/projectile/energy/floramut) // overwritten by plants/pods + H.show_message("The radiation beam dissipates harmlessly through your body.") + if(/obj/item/projectile/energy/florayield) + H.show_message("The radiation beam dissipates harmlessly through your body.") + return + +///////////// +//BREATHING// +///////////// + +/datum/species/proc/breathe(var/mob/living/carbon/human/H) + if(H.reagents.has_reagent("lexorin")) return + if(istype(H.loc, /obj/machinery/atmospherics/unary/cryo_cell)) return + + var/datum/gas_mixture/environment = H.loc.return_air() + var/datum/gas_mixture/breath + // HACK NEED CHANGING LATER + if(H.health <= config.health_threshold_crit) + H.losebreath++ + + if(H.losebreath>0) //Suffocating so do not take a breath + H.losebreath-- + if (prob(10)) //Gasp per 10 ticks? Sounds about right. + spawn H.emote("gasp") + if(istype(H.loc, /obj/)) + var/obj/location_as_object = H.loc + location_as_object.handle_internal_lifeform(H, 0) + else + //First, check for air from internal atmosphere (using an air tank and mask generally) + breath = H.get_breath_from_internal(BREATH_VOLUME) // Super hacky -- TLE + //breath = get_breath_from_internal(0.5) // Manually setting to old BREATH_VOLUME amount -- TLE + + //No breath from internal atmosphere so get breath from location + if(!breath) + if(isobj(H.loc)) + var/obj/location_as_object = H.loc + breath = location_as_object.handle_internal_lifeform(H, BREATH_VOLUME) + else if(isturf(H.loc)) + var/breath_moles = 0 + /*if(environment.return_pressure() > ONE_ATMOSPHERE) + // Loads of air around (pressure effect will be handled elsewhere), so lets just take a enough to fill our lungs at normal atmos pressure (using n = Pv/RT) + breath_moles = (ONE_ATMOSPHERE*BREATH_VOLUME/R_IDEAL_GAS_EQUATION*environment.temperature) + else*/ + // Not enough air around, take a percentage of what's there to model this properly + breath_moles = environment.total_moles()*BREATH_PERCENTAGE + + breath = H.loc.remove_air(breath_moles) + // Handle chem smoke effect -- Doohl + var/block = 0 + if(H.wear_mask) + if(H.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT) + block = 1 + if(H.glasses) + if(H.glasses.flags & BLOCK_GAS_SMOKE_EFFECT) + block = 1 + if(H.head) + if(H.head.flags & BLOCK_GAS_SMOKE_EFFECT) + block = 1 + + if(!block) + + for(var/obj/effect/effect/chem_smoke/smoke in view(1, H)) + if(smoke.reagents.total_volume) + smoke.reagents.reaction(H, INGEST) + spawn(5) + if(smoke) + smoke.reagents.copy_to(H, 10) // I dunno, maybe the reagents enter the blood stream through the lungs? + break // If they breathe in the nasty stuff once, no need to continue checking + + else //Still give containing object the chance to interact if(istype(H.loc, /obj/)) var/obj/location_as_object = H.loc location_as_object.handle_internal_lifeform(H, 0) - else - //First, check for air from internal atmosphere (using an air tank and mask generally) - breath = H.get_breath_from_internal(BREATH_VOLUME) // Super hacky -- TLE - //breath = get_breath_from_internal(0.5) // Manually setting to old BREATH_VOLUME amount -- TLE - //No breath from internal atmosphere so get breath from location - if(!breath) - if(isobj(H.loc)) - var/obj/location_as_object = H.loc - breath = location_as_object.handle_internal_lifeform(H, BREATH_VOLUME) - else if(isturf(H.loc)) - var/breath_moles = 0 - /*if(environment.return_pressure() > ONE_ATMOSPHERE) - // Loads of air around (pressure effect will be handled elsewhere), so lets just take a enough to fill our lungs at normal atmos pressure (using n = Pv/RT) - breath_moles = (ONE_ATMOSPHERE*BREATH_VOLUME/R_IDEAL_GAS_EQUATION*environment.temperature) - else*/ - // Not enough air around, take a percentage of what's there to model this properly - breath_moles = environment.total_moles()*BREATH_PERCENTAGE + handle_breath(breath, H) - breath = H.loc.remove_air(breath_moles) - // Handle chem smoke effect -- Doohl - var/block = 0 - if(H.wear_mask) - if(H.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT) - block = 1 - if(H.glasses) - if(H.glasses.flags & BLOCK_GAS_SMOKE_EFFECT) - block = 1 - if(H.head) - if(H.head.flags & BLOCK_GAS_SMOKE_EFFECT) - block = 1 + if(breath) + H.loc.assume_air(breath) - if(!block) +/datum/species/proc/handle_breath(datum/gas_mixture/breath, var/mob/living/carbon/human/H) + if((H.status_flags & GODMODE)) + return - for(var/obj/effect/effect/chem_smoke/smoke in view(1, H)) - if(smoke.reagents.total_volume) - smoke.reagents.reaction(H, INGEST) - spawn(5) - if(smoke) - smoke.reagents.copy_to(H, 10) // I dunno, maybe the reagents enter the blood stream through the lungs? - break // If they breathe in the nasty stuff once, no need to continue checking - - else //Still give containing object the chance to interact - if(istype(H.loc, /obj/)) - var/obj/location_as_object = H.loc - location_as_object.handle_internal_lifeform(H, 0) - - handle_breath(breath, H) - - if(breath) - H.loc.assume_air(breath) - - proc/handle_breath(datum/gas_mixture/breath, var/mob/living/carbon/human/H) - if((H.status_flags & GODMODE)) + if(!breath || (breath.total_moles() == 0) || H.suiciding) + if(H.reagents.has_reagent("inaprovaline")) return + if(H.suiciding) + H.adjustOxyLoss(2)//If you are suiciding, you should die a little bit faster + H.failed_last_breath = 1 + H.oxygen_alert = max(H.oxygen_alert, 1) + return 0 + if(H.health >= config.health_threshold_crit) + if(NOBREATH in specflags) return 1 + H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) + H.failed_last_breath = 1 + else + H.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) + H.failed_last_breath = 1 - if(!breath || (breath.total_moles() == 0) || H.suiciding) - if(H.reagents.has_reagent("inaprovaline")) - return - if(H.suiciding) - H.adjustOxyLoss(2)//If you are suiciding, you should die a little bit faster + H.oxygen_alert = max(H.oxygen_alert, 1) + + return 0 + + var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa + //var/safe_oxygen_max = 140 // Maximum safe partial pressure of O2, in kPa (Not used for now) + var/safe_co2_max = 10 // Yes it's an arbitrary value who cares? + var/safe_toxins_max = 0.005 + var/SA_para_min = 1 + var/SA_sleep_min = 5 + var/oxygen_used = 0 + var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME + + //Partial pressure of the O2 in our breath + var/O2_pp = (breath.oxygen/breath.total_moles())*breath_pressure + // Same, but for the toxins + var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure + // And CO2, lets say a PP of more than 10 will be bad (It's a little less really, but eh, being passed out all round aint no fun) + var/CO2_pp = (breath.carbon_dioxide/breath.total_moles())*breath_pressure // Tweaking to fit the hacky bullshit I've done with atmo -- TLE + //var/CO2_pp = (breath.carbon_dioxide/breath.total_moles())*0.5 // The default pressure value + + if(O2_pp < safe_oxygen_min) // Too little oxygen + if(!(NOBREATH in specflags) || (H.health <= config.health_threshold_crit)) + if(prob(20)) + spawn(0) H.emote("gasp") + if(O2_pp > 0) + var/ratio = safe_oxygen_min/O2_pp + H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!) H.failed_last_breath = 1 - H.oxygen_alert = max(H.oxygen_alert, 1) - return 0 - if(H.health >= config.health_threshold_crit) - if(NOBREATH in specflags) return 1 + oxygen_used = breath.oxygen*ratio/6 + else H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) H.failed_last_breath = 1 - else - H.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) - H.failed_last_breath = 1 - H.oxygen_alert = max(H.oxygen_alert, 1) + /*else if (O2_pp > safe_oxygen_max) // Too much oxygen (commented this out for now, I'll deal with pressure damage elsewhere I suppose) + spawn(0) emote("cough") + var/ratio = O2_pp/safe_oxygen_max + oxyloss += 5*ratio + oxygen_used = breath.oxygen*ratio/6 + oxygen_alert = max(oxygen_alert, 1)*/ + else // We're in safe limits + H.failed_last_breath = 0 + H.adjustOxyLoss(-5) + oxygen_used = breath.oxygen/6 + H.oxygen_alert = 0 - return 0 + breath.oxygen -= oxygen_used + breath.carbon_dioxide += oxygen_used - var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa - //var/safe_oxygen_max = 140 // Maximum safe partial pressure of O2, in kPa (Not used for now) - var/safe_co2_max = 10 // Yes it's an arbitrary value who cares? - var/safe_toxins_max = 0.005 - var/SA_para_min = 1 - var/SA_sleep_min = 5 - var/oxygen_used = 0 - var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME + //CO2 does not affect failed_last_breath. So if there was enough oxygen in the air but too much co2, this will hurt you, but only once per 4 ticks, instead of once per tick. + if(CO2_pp > safe_co2_max && !(NOBREATH in specflags)) + if(!H.co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so. + H.co2overloadtime = world.time + else if(world.time - H.co2overloadtime > 120) + H.Paralyse(3) + H.adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business + if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! + H.adjustOxyLoss(8) + if(prob(20)) // Lets give them some chance to know somethings not right though I guess. + spawn(0) H.emote("cough") - //Partial pressure of the O2 in our breath - var/O2_pp = (breath.oxygen/breath.total_moles())*breath_pressure - // Same, but for the toxins - var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure - // And CO2, lets say a PP of more than 10 will be bad (It's a little less really, but eh, being passed out all round aint no fun) - var/CO2_pp = (breath.carbon_dioxide/breath.total_moles())*breath_pressure // Tweaking to fit the hacky bullshit I've done with atmo -- TLE - //var/CO2_pp = (breath.carbon_dioxide/breath.total_moles())*0.5 // The default pressure value + else + H.co2overloadtime = 0 - if(O2_pp < safe_oxygen_min) // Too little oxygen - if(!(NOBREATH in specflags) || (H.health <= config.health_threshold_crit)) + if(Toxins_pp > safe_toxins_max && !(NOBREATH in specflags)) // Too much toxins + var/ratio = (breath.toxins/safe_toxins_max) * 10 + //adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second + if(H.reagents) + H.reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) + H.toxins_alert = max(H.toxins_alert, 1) + else + H.toxins_alert = 0 + + if(breath.trace_gases.len && !(NOBREATH in specflags)) // If there's some other shit in the air lets deal with it here. + for(var/datum/gas/sleeping_agent/SA in breath.trace_gases) + var/SA_pp = (SA.moles/breath.total_moles())*breath_pressure + if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit + H.Paralyse(3) // 3 gives them one second to wake up and run away a bit! + if(SA_pp > SA_sleep_min) // Enough to make us sleep as well + H.sleeping = max(H.sleeping+2, 10) + else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning if(prob(20)) - spawn(0) H.emote("gasp") - if(O2_pp > 0) - var/ratio = safe_oxygen_min/O2_pp - H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!) - H.failed_last_breath = 1 - oxygen_used = breath.oxygen*ratio/6 - else - H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) - H.failed_last_breath = 1 - H.oxygen_alert = max(H.oxygen_alert, 1) - /*else if (O2_pp > safe_oxygen_max) // Too much oxygen (commented this out for now, I'll deal with pressure damage elsewhere I suppose) - spawn(0) emote("cough") - var/ratio = O2_pp/safe_oxygen_max - oxyloss += 5*ratio - oxygen_used = breath.oxygen*ratio/6 - oxygen_alert = max(oxygen_alert, 1)*/ - else // We're in safe limits - H.failed_last_breath = 0 - H.adjustOxyLoss(-5) - oxygen_used = breath.oxygen/6 - H.oxygen_alert = 0 + spawn(0) H.emote(pick("giggle", "laugh")) - breath.oxygen -= oxygen_used - breath.carbon_dioxide += oxygen_used + handle_temperature(breath, H) - //CO2 does not affect failed_last_breath. So if there was enough oxygen in the air but too much co2, this will hurt you, but only once per 4 ticks, instead of once per tick. - if(CO2_pp > safe_co2_max && !(NOBREATH in specflags)) - if(!H.co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so. - H.co2overloadtime = world.time - else if(world.time - H.co2overloadtime > 120) - H.Paralyse(3) - H.adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business - if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! - H.adjustOxyLoss(8) - if(prob(20)) // Lets give them some chance to know somethings not right though I guess. - spawn(0) H.emote("cough") + return 1 - else - H.co2overloadtime = 0 +/datum/species/proc/handle_temperature(datum/gas_mixture/breath, var/mob/living/carbon/human/H) // called by human/life, handles temperatures + if( (abs(310.15 - breath.temperature) > 50) && !(COLD_RESISTANCE in H.mutations) && !(COLDRES in specflags)) // Hot air hurts :( + if(breath.temperature < 260.15) + if(prob(20)) + H << "You feel your face freezing and an icicle forming in your lungs!" + else if(breath.temperature > 360.15 && !(HEATRES in specflags)) + if(prob(20)) + H << "You feel your face burning and a searing heat in your lungs!" - if(Toxins_pp > safe_toxins_max && !(NOBREATH in specflags)) // Too much toxins - var/ratio = (breath.toxins/safe_toxins_max) * 10 - //adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second - if(H.reagents) - H.reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) - H.toxins_alert = max(H.toxins_alert, 1) - else - H.toxins_alert = 0 + if(!(COLDRES in specflags)) // COLD DAMAGE + switch(breath.temperature) + if(-INFINITY to 120) + H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head") + H.fire_alert = max(H.fire_alert, 1) + if(120 to 200) + H.apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head") + H.fire_alert = max(H.fire_alert, 1) + if(200 to 260) + H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head") + H.fire_alert = max(H.fire_alert, 1) - if(breath.trace_gases.len && !(NOBREATH in specflags)) // If there's some other shit in the air lets deal with it here. - for(var/datum/gas/sleeping_agent/SA in breath.trace_gases) - var/SA_pp = (SA.moles/breath.total_moles())*breath_pressure - if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit - H.Paralyse(3) // 3 gives them one second to wake up and run away a bit! - if(SA_pp > SA_sleep_min) // Enough to make us sleep as well - H.sleeping = max(H.sleeping+2, 10) - else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning - if(prob(20)) - spawn(0) H.emote(pick("giggle", "laugh")) + if(!(HEATRES in specflags)) // HEAT DAMAGE + switch(breath.temperature) + if(360 to 400) + H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head") + H.fire_alert = max(H.fire_alert, 2) + if(400 to 1000) + H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head") + H.fire_alert = max(H.fire_alert, 2) + if(1000 to INFINITY) + H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head") + H.fire_alert = max(H.fire_alert, 2) - handle_temperature(breath, H) - - return 1 - - proc/handle_temperature(datum/gas_mixture/breath, var/mob/living/carbon/human/H) // called by human/life, handles temperatures - if( (abs(310.15 - breath.temperature) > 50) && !(COLD_RESISTANCE in H.mutations) && !(COLDRES in specflags)) // Hot air hurts :( - if(breath.temperature < 260.15) - if(prob(20)) - H << "You feel your face freezing and an icicle forming in your lungs!" - else if(breath.temperature > 360.15 && !(HEATRES in specflags)) - if(prob(20)) - H << "You feel your face burning and a searing heat in your lungs!" - - if(!(COLDRES in specflags)) // COLD DAMAGE - switch(breath.temperature) - if(-INFINITY to 120) - H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head") - H.fire_alert = max(H.fire_alert, 1) - if(120 to 200) - H.apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head") - H.fire_alert = max(H.fire_alert, 1) - if(200 to 260) - H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head") - H.fire_alert = max(H.fire_alert, 1) - - if(!(HEATRES in specflags)) // HEAT DAMAGE - switch(breath.temperature) - if(360 to 400) - H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head") - H.fire_alert = max(H.fire_alert, 2) - if(400 to 1000) - H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head") - H.fire_alert = max(H.fire_alert, 2) - if(1000 to INFINITY) - H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head") - H.fire_alert = max(H.fire_alert, 2) + return +/datum/species/proc/handle_environment(datum/gas_mixture/environment, var/mob/living/carbon/human/H) + if(!environment) return - proc/handle_environment(datum/gas_mixture/environment, var/mob/living/carbon/human/H) - if(!environment) - return + var/loc_temp = H.get_temperature(environment) + //world << "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Thermal protection: [get_thermal_protection()] - Fire protection: [thermal_protection + add_fire_protection(loc_temp)] - Heat capacity: [environment_heat_capacity] - Location: [loc] - src: [src]" - var/loc_temp = H.get_temperature(environment) - //world << "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Thermal protection: [get_thermal_protection()] - Fire protection: [thermal_protection + add_fire_protection(loc_temp)] - Heat capacity: [environment_heat_capacity] - Location: [loc] - src: [src]" + //Body temperature is adjusted in two steps. Firstly your body tries to stabilize itself a bit. + if(H.stat != 2) + H.stabilize_temperature_from_calories() - //Body temperature is adjusted in two steps. Firstly your body tries to stabilize itself a bit. - if(H.stat != 2) - H.stabilize_temperature_from_calories() + //After then, it reacts to the surrounding atmosphere based on your thermal protection + if(!H.on_fire) //If you're on fire, you do not heat up or cool down based on surrounding gases + if(loc_temp < H.bodytemperature) + //Place is colder than we are + var/thermal_protection = H.get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. + if(thermal_protection < 1) + H.bodytemperature += min((1-thermal_protection) * ((loc_temp - H.bodytemperature) / BODYTEMP_COLD_DIVISOR), BODYTEMP_COOLING_MAX) + else + //Place is hotter than we are + var/thermal_protection = H.get_heat_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. + if(thermal_protection < 1) + H.bodytemperature += min((1-thermal_protection) * ((loc_temp - H.bodytemperature) / BODYTEMP_HEAT_DIVISOR), BODYTEMP_HEATING_MAX) - //After then, it reacts to the surrounding atmosphere based on your thermal protection - if(!H.on_fire) //If you're on fire, you do not heat up or cool down based on surrounding gases - if(loc_temp < H.bodytemperature) - //Place is colder than we are - var/thermal_protection = H.get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. - if(thermal_protection < 1) - H.bodytemperature += min((1-thermal_protection) * ((loc_temp - H.bodytemperature) / BODYTEMP_COLD_DIVISOR), BODYTEMP_COOLING_MAX) - else - //Place is hotter than we are - var/thermal_protection = H.get_heat_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. - if(thermal_protection < 1) - H.bodytemperature += min((1-thermal_protection) * ((loc_temp - H.bodytemperature) / BODYTEMP_HEAT_DIVISOR), BODYTEMP_HEATING_MAX) - - // +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt. - if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !(HEATRES in specflags)) - //Body temperature is too hot. - H.fire_alert = max(H.fire_alert, 1) - switch(H.bodytemperature) - if(360 to 400) - H.apply_damage(HEAT_DAMAGE_LEVEL_1*heatmod, BURN) + // +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt. + if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !(HEATRES in specflags)) + //Body temperature is too hot. + H.fire_alert = max(H.fire_alert, 1) + switch(H.bodytemperature) + if(360 to 400) + H.apply_damage(HEAT_DAMAGE_LEVEL_1*heatmod, BURN) + H.fire_alert = max(H.fire_alert, 2) + if(400 to 460) + H.apply_damage(HEAT_DAMAGE_LEVEL_2*heatmod, BURN) + H.fire_alert = max(H.fire_alert, 2) + if(460 to INFINITY) + if(H.on_fire) + H.apply_damage(HEAT_DAMAGE_LEVEL_3*heatmod, BURN) H.fire_alert = max(H.fire_alert, 2) - if(400 to 460) + else H.apply_damage(HEAT_DAMAGE_LEVEL_2*heatmod, BURN) H.fire_alert = max(H.fire_alert, 2) - if(460 to INFINITY) - if(H.on_fire) - H.apply_damage(HEAT_DAMAGE_LEVEL_3*heatmod, BURN) - H.fire_alert = max(H.fire_alert, 2) - else - H.apply_damage(HEAT_DAMAGE_LEVEL_2*heatmod, BURN) - H.fire_alert = max(H.fire_alert, 2) - else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !(COLDRES in specflags)) - H.fire_alert = max(H.fire_alert, 1) - if(!istype(H.loc, /obj/machinery/atmospherics/unary/cryo_cell)) - switch(H.bodytemperature) - if(200 to 260) - H.apply_damage(COLD_DAMAGE_LEVEL_1*coldmod, BURN) - H.fire_alert = max(H.fire_alert, 1) - if(120 to 200) - H.apply_damage(COLD_DAMAGE_LEVEL_2*coldmod, BURN) - H.fire_alert = max(H.fire_alert, 1) - if(-INFINITY to 120) - H.apply_damage(COLD_DAMAGE_LEVEL_3*coldmod, BURN) - H.fire_alert = max(H.fire_alert, 1) + else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !(COLDRES in specflags)) + H.fire_alert = max(H.fire_alert, 1) + if(!istype(H.loc, /obj/machinery/atmospherics/unary/cryo_cell)) + switch(H.bodytemperature) + if(200 to 260) + H.apply_damage(COLD_DAMAGE_LEVEL_1*coldmod, BURN) + H.fire_alert = max(H.fire_alert, 1) + if(120 to 200) + H.apply_damage(COLD_DAMAGE_LEVEL_2*coldmod, BURN) + H.fire_alert = max(H.fire_alert, 1) + if(-INFINITY to 120) + H.apply_damage(COLD_DAMAGE_LEVEL_3*coldmod, BURN) + H.fire_alert = max(H.fire_alert, 1) - // Account for massive pressure differences. Done by Polymorph - // Made it possible to actually have something that can protect against high pressure... Done by Errorage. Polymorph now has an axe sticking from his head for his previous hardcoded nonsense! + // Account for massive pressure differences. Done by Polymorph + // Made it possible to actually have something that can protect against high pressure... Done by Errorage. Polymorph now has an axe sticking from his head for his previous hardcoded nonsense! - var/pressure = environment.return_pressure() - var/adjusted_pressure = H.calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob. - switch(adjusted_pressure) - if(HAZARD_HIGH_PRESSURE to INFINITY) - if(!(HEATRES in specflags)) - H.adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) ) - H.pressure_alert = 2 - else - H.pressure_alert = 1 - if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) + var/pressure = environment.return_pressure() + var/adjusted_pressure = H.calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob. + switch(adjusted_pressure) + if(HAZARD_HIGH_PRESSURE to INFINITY) + if(!(HEATRES in specflags)) + H.adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) ) + H.pressure_alert = 2 + else H.pressure_alert = 1 - if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE) - H.pressure_alert = 0 - if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) + if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) + H.pressure_alert = 1 + if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE) + H.pressure_alert = 0 + if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) + H.pressure_alert = -1 + else + if((COLD_RESISTANCE in H.mutations) || (COLDRES in specflags)) H.pressure_alert = -1 else - if((COLD_RESISTANCE in H.mutations) || (COLDRES in specflags)) - H.pressure_alert = -1 - else - H.adjustBruteLoss( LOW_PRESSURE_DAMAGE ) - H.pressure_alert = -2 + H.adjustBruteLoss( LOW_PRESSURE_DAMAGE ) + H.pressure_alert = -2 + return + +////////// +// FIRE // +////////// + +/datum/species/proc/handle_fire(var/mob/living/carbon/human/H) + if((HEATRES in specflags) || (NOFIRE in specflags)) return + if(H.fire_stacks < 0) + H.fire_stacks++ //If we've doused ourselves in water to avoid fire, dry off slowly + H.fire_stacks = min(0, H.fire_stacks)//So we dry ourselves back to default, nonflammable. + if(!H.on_fire) + return + var/datum/gas_mixture/G = H.loc.return_air() // Check if we're standing in an oxygenless environment + if(G.oxygen < 1) + ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire + return + var/turf/location = get_turf(H) + location.hotspot_expose(700, 50, 1) - ////////// - // FIRE // - ////////// +/datum/species/proc/IgniteMob(var/mob/living/carbon/human/H) + if(H.fire_stacks > 0 && !H.on_fire && !(HEATRES in specflags) && !(NOFIRE in specflags)) + H.on_fire = 1 + H.AddLuminosity(3) + H.update_fire() - proc/handle_fire(var/mob/living/carbon/human/H) - if((HEATRES in specflags) || (NOFIRE in specflags)) - return - if(H.fire_stacks < 0) - H.fire_stacks++ //If we've doused ourselves in water to avoid fire, dry off slowly - H.fire_stacks = min(0, H.fire_stacks)//So we dry ourselves back to default, nonflammable. - if(!H.on_fire) - return - var/datum/gas_mixture/G = H.loc.return_air() // Check if we're standing in an oxygenless environment - if(G.oxygen < 1) - ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire - return - var/turf/location = get_turf(H) - location.hotspot_expose(700, 50, 1) - - proc/IgniteMob(var/mob/living/carbon/human/H) - if(H.fire_stacks > 0 && !H.on_fire && !(HEATRES in specflags) && !(NOFIRE in specflags)) - H.on_fire = 1 - H.AddLuminosity(3) - H.update_fire() - - proc/ExtinguishMob(var/mob/living/carbon/human/H) - if(H.on_fire) - H.on_fire = 0 - H.fire_stacks = 0 - H.AddLuminosity(-3) - H.update_fire() +/datum/species/proc/ExtinguishMob(var/mob/living/carbon/human/H) + if(H.on_fire) + H.on_fire = 0 + H.fire_stacks = 0 + H.AddLuminosity(-3) + H.update_fire() #undef SPECIES_LAYER #undef BODY_LAYER @@ -1327,4 +1327,4 @@ #undef COLD_GAS_DAMAGE_LEVEL_3 #undef TINT_IMPAIR -#undef TINT_BLIND \ No newline at end of file +#undef TINT_BLIND diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index 7d159238fc5..e3e42effb46 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -32,6 +32,7 @@ attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/lizard /datum/species/lizard/handle_speech(message) // jesus christ why @@ -55,6 +56,7 @@ miss_sound = 'sound/weapons/slashmiss.ogg' burnmod = 1.25 heatmod = 1.5 + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/plant /datum/species/plant/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(chem.id == "plantbgone") @@ -122,6 +124,7 @@ darksight = 8 sexes = 0 ignored_by = list(/mob/living/simple_animal/hostile/faithless) + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/shadow /datum/species/shadow/spec_life(mob/living/carbon/human/H) var/light_amount = 0 @@ -151,6 +154,7 @@ hair_color = "mutcolor" hair_alpha = 150 ignored_by = list(/mob/living/carbon/slime) + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/slime /* JELLYPEOPLE @@ -164,6 +168,7 @@ say_mod = "chirps" eyes = "jelleyes" specflags = list(MUTCOLORS,EYECOLOR) + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/slime /* GOLEMS @@ -179,6 +184,8 @@ punchmod = 5 no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_head, slot_w_uniform) nojumpsuit = 1 + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/golem + /* ADAMANTINE GOLEMS @@ -187,6 +194,7 @@ /datum/species/golem/adamantine name = "Adamantine Golem" id = "adamantine" + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/golem/adamantine /* FLIES @@ -197,6 +205,7 @@ name = "Human?" id = "fly" say_mod = "buzzes" + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/fly /datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(chem.id == "pestkiller") @@ -218,4 +227,5 @@ // 2spooky name = "Spooky Scary Skeleton" id = "skeleton" - sexes = 0 \ No newline at end of file + sexes = 0 + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/skeleton diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm index 0fd4a491c57..7423fdf456e 100644 --- a/code/modules/mob/living/carbon/human/whisper.dm +++ b/code/modules/mob/living/carbon/human/whisper.dm @@ -1,44 +1,28 @@ /mob/living/carbon/human/whisper(message as text) - if(!IsVocal()) return if(say_disabled) //This is here to try to identify lag problems - usr << "\red Speech is currently admin-disabled." + usr << "Speech is currently admin-disabled." return - + message = trim(copytext(strip_html_simple(message), 1, MAX_MESSAGE_LEN)) - - if (!message || silent) + if(!can_speak(message)) return - + + message = "[message]" log_whisper("[src.name]/[src.key] : [message]") if (src.client) if (src.client.prefs.muted & MUTE_IC) - src << "\red You cannot whisper (muted)." - return + src << "You cannot whisper (muted)." + return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return + log_whisper("[src.name]/[src.key] : [message]") - - if (src.stat == DEAD) - return src.say_dead(message) - - var/alt_name = "" - if (src.name != GetVoice()) - alt_name = " (as [get_id_name("Unknown")])" - // Mute disability - if (src.sdisabilities & MUTE) - return - - if (is_muzzled()) - return + var/alt_name = get_alt_name() var/whispers = "whispers" - - var/critical = InCritical() // We are unconscious but not in critical, so don't allow them to whisper. @@ -54,99 +38,35 @@ message = Ellipsis(message, 10, 1) whispers = "whispers in their final breath" - var/italics = 1 - var/message_range = 1 + message = treat_message(message) - if(src.wear_mask) - message = wear_mask.speechModification(message) + var/list/listening_dead = list() + for(var/mob/M in player_list) + if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTEARS) && client) + listening_dead |= M - if (src.stuttering) - message = stutter(message) - - for (var/obj/O in view(message_range, src)) - spawn (0) - if (O) - O.hear_talk(src, message) - - var/list/listening = hearers(message_range, src) - listening -= src - if(!critical) - listening += src + var/list/listening = get_hear(1, src) | listening_dead var/list/eavesdropping = hearers(2, src) - eavesdropping -= src eavesdropping -= listening var/list/watching = hearers(5, src) - watching -= src watching -= listening watching -= eavesdropping - var/list/heard_a = list() // understood us - var/list/heard_b = list() // didn't understand us + var/rendered - for (var/mob/M in listening) - if (M.say_understands(src)) - heard_a += M - else - heard_b += M - - var/rendered = null - - for (var/mob/M in watching) - if (M.say_understands(src)) - rendered = "[src.name] [whispers] something." - else - rendered = "[src.voice_name] [whispers] something." + rendered = "[src.name] [whispers] something." + for(var/mob/M in watching) M.show_message(rendered, 2) - if (length(heard_a)) - var/message_a = message - - if (italics) - message_a = "[message_a]" - //This appears copied from carbon/living say.dm so the istype check for mob is probably not needed. Appending for src is also not needed as the game will check that automatically. - rendered = "[GetVoice()][alt_name] [whispers], \"[message_a]\"" - - for (var/mob/M in heard_a) - M.show_message(rendered, 2) - - if (length(heard_b)) - var/message_b - - if (src.voice_message) - message_b = src.voice_message - else - message_b = stars(message) - - if (italics) - message_b = "[message_b]" - - rendered = "[src.voice_name] [whispers], \"[message_b]\"" - - for (var/mob/M in heard_b) - M.show_message(rendered, 2) - - for (var/mob/M in eavesdropping) - if (M.say_understands(src)) - var/message_c - message_c = stars(message) - rendered = "[GetVoice()][alt_name] [whispers], \"[message_c]\"" - M.show_message(rendered, 2) - else - rendered = "[src.voice_name] [whispers] something." - M.show_message(rendered, 2) - - if (italics) - message = "[message]" rendered = "[GetVoice()][alt_name] [whispers], \"[message]\"" - for (var/mob/M in dead_mob_list) - if (!(M.client)) - continue - if (M.stat > 1 && !(M in heard_a)) - M.show_message(rendered, 2) + for(var/mob/M in listening) + M.Hear(rendered, src, languages, message) - // We whispered our final breath, now we die and show the message you have sent - // since it might have been cut off and it would be annoying not being able to know. - if(critical) - src << rendered + message = stars(message) + rendered = "[GetVoice()][alt_name] [whispers], \"[message]\"" + for(var/mob/M in eavesdropping) + M.Hear(rendered, src, languages, message) + + if(critical) //Dying words. succumb(1) diff --git a/code/modules/mob/living/carbon/monkey/inventory.dm b/code/modules/mob/living/carbon/monkey/inventory.dm index e5757e52903..95ff775c0a4 100644 --- a/code/modules/mob/living/carbon/monkey/inventory.dm +++ b/code/modules/mob/living/carbon/monkey/inventory.dm @@ -64,7 +64,7 @@ I.loc = back return else - usr << "\red You are trying to equip this item to an unsupported inventory slot. Report this to a coder." + usr << "You are trying to equip this item to an unsupported inventory slot. Report this to a coder." return I.loc = src diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 220b99380f6..7afba60788a 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -76,519 +76,517 @@ ..() return pressure -/mob/living/carbon/monkey +/mob/living/carbon/monkey/proc/handle_disabilities() - proc/handle_disabilities() + if (disabilities & EPILEPSY) + if ((prob(1) && paralysis < 10)) + src << "You have a seizure!" + Paralyse(10) + if (disabilities & COUGHING) + if ((prob(5) && paralysis <= 1)) + drop_item() + spawn( 0 ) + emote("cough") + return + if (disabilities & TOURETTES) + if ((prob(10) && paralysis <= 1)) + Stun(10) + spawn( 0 ) + emote("twitch") + return + if (disabilities & NERVOUS) + if (prob(10)) + stuttering = max(10, stuttering) - if (disabilities & EPILEPSY) - if ((prob(1) && paralysis < 10)) - src << "\red You have a seizure!" - Paralyse(10) - if (disabilities & COUGHING) - if ((prob(5) && paralysis <= 1)) - drop_item() - spawn( 0 ) - emote("cough") - return - if (disabilities & TOURETTES) - if ((prob(10) && paralysis <= 1)) - Stun(10) - spawn( 0 ) - emote("twitch") - return - if (disabilities & NERVOUS) - if (prob(10)) - stuttering = max(10, stuttering) +/mob/living/carbon/monkey/proc/handle_mutations_and_radiation() - proc/handle_mutations_and_radiation() + if(getFireLoss()) + if((COLD_RESISTANCE in mutations) && prob(50)) + switch(getFireLoss()) + if(1 to 50) + adjustFireLoss(-1) + if(51 to 100) + adjustFireLoss(-5) - if(getFireLoss()) - if((COLD_RESISTANCE in mutations) && prob(50)) - switch(getFireLoss()) - if(1 to 50) - adjustFireLoss(-1) - if(51 to 100) - adjustFireLoss(-5) + if ((HULK in mutations) && health <= 25) + mutations.Remove(HULK) + src << "You suddenly feel very weak." + Weaken(3) + emote("collapse") - if ((HULK in mutations) && health <= 25) - mutations.Remove(HULK) - src << "\red You suddenly feel very weak." - Weaken(3) + if (radiation) + if (radiation > 100) + radiation = 100 + Weaken(10) + src << "You feel weak." emote("collapse") - if (radiation) - if (radiation > 100) - radiation = 100 - Weaken(10) - src << "\red You feel weak." - emote("collapse") - - switch(radiation) - if(1 to 49) - radiation-- - if(prob(25)) - adjustToxLoss(1) - updatehealth() - - if(50 to 74) - radiation -= 2 + switch(radiation) + if(1 to 49) + radiation-- + if(prob(25)) adjustToxLoss(1) - if(prob(5)) - radiation -= 5 - Weaken(3) - src << "\red You feel weak." - emote("collapse") updatehealth() - if(75 to 100) - radiation -= 3 - adjustToxLoss(3) - if(prob(1)) - src << "\red You mutate!" - randmutb(src) - domutcheck(src,null) - emote("gasp") - updatehealth() + if(50 to 74) + radiation -= 2 + adjustToxLoss(1) + if(prob(5)) + radiation -= 5 + Weaken(3) + src << "You feel weak." + emote("collapse") + updatehealth() + + if(75 to 100) + radiation -= 3 + adjustToxLoss(3) + if(prob(1)) + src << "You mutate!" + randmutb(src) + domutcheck(src,null) + emote("gasp") + updatehealth() - proc/breathe() - if(reagents) +/mob/living/carbon/monkey/proc/breathe() + if(reagents) - if(reagents.has_reagent("lexorin")) return + if(reagents.has_reagent("lexorin")) return - if(!loc) return //probably ought to make a proper fix for this, but :effort: --NeoFite + if(!loc) return //probably ought to make a proper fix for this, but :effort: --NeoFite - var/datum/gas_mixture/environment = loc.return_air() - var/datum/gas_mixture/breath - if(health <= config.health_threshold_crit) - losebreath++ - if(losebreath>0) //Suffocating so do not take a breath - losebreath-- - if (prob(75)) //High chance of gasping for air - spawn emote("gasp") + var/datum/gas_mixture/environment = loc.return_air() + var/datum/gas_mixture/breath + if(health <= config.health_threshold_crit) + losebreath++ + if(losebreath>0) //Suffocating so do not take a breath + losebreath-- + if (prob(75)) //High chance of gasping for air + spawn emote("gasp") + if(istype(loc, /obj/)) + var/obj/location_as_object = loc + location_as_object.handle_internal_lifeform(src, 0) + else + //First, check for air from internal atmosphere (using an air tank and mask generally) + breath = get_breath_from_internal(BREATH_VOLUME) + + //No breath from internal atmosphere so get breath from location + if(!breath) + if(istype(loc, /obj/)) + var/obj/location_as_object = loc + breath = location_as_object.handle_internal_lifeform(src, BREATH_VOLUME) + else if(istype(loc, /turf/)) + var/breath_moles = environment.total_moles()*BREATH_PERCENTAGE + breath = loc.remove_air(breath_moles) + + // Handle chem smoke effect -- Doohl + var/block = 0 + if(wear_mask) + if(istype(wear_mask, /obj/item/clothing/mask/gas)) + block = 1 + + if(!block) + + for(var/obj/effect/effect/chem_smoke/smoke in view(1, src)) + if(smoke.reagents.total_volume) + smoke.reagents.reaction(src, INGEST) + spawn(5) + if(smoke) + smoke.reagents.copy_to(src, 10) // I dunno, maybe the reagents enter the blood stream through the lungs? + break // If they breathe in the nasty stuff once, no need to continue checking + + + else //Still give containing object the chance to interact if(istype(loc, /obj/)) var/obj/location_as_object = loc location_as_object.handle_internal_lifeform(src, 0) - else - //First, check for air from internal atmosphere (using an air tank and mask generally) - breath = get_breath_from_internal(BREATH_VOLUME) - //No breath from internal atmosphere so get breath from location - if(!breath) - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - breath = location_as_object.handle_internal_lifeform(src, BREATH_VOLUME) - else if(istype(loc, /turf/)) - var/breath_moles = environment.total_moles()*BREATH_PERCENTAGE - breath = loc.remove_air(breath_moles) + handle_breath(breath) - // Handle chem smoke effect -- Doohl - var/block = 0 - if(wear_mask) - if(istype(wear_mask, /obj/item/clothing/mask/gas)) - block = 1 - - if(!block) - - for(var/obj/effect/effect/chem_smoke/smoke in view(1, src)) - if(smoke.reagents.total_volume) - smoke.reagents.reaction(src, INGEST) - spawn(5) - if(smoke) - smoke.reagents.copy_to(src, 10) // I dunno, maybe the reagents enter the blood stream through the lungs? - break // If they breathe in the nasty stuff once, no need to continue checking + if(breath) + loc.assume_air(breath) - else //Still give containing object the chance to interact - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - location_as_object.handle_internal_lifeform(src, 0) - - handle_breath(breath) - - if(breath) - loc.assume_air(breath) - - - proc/get_breath_from_internal(volume_needed) +/mob/living/carbon/monkey/proc/get_breath_from_internal(volume_needed) + if(internal) + if (!contents.Find(internal)) + internal = null + if (!wear_mask || !(wear_mask.flags|MASKINTERNALS) ) + internal = null if(internal) - if (!contents.Find(internal)) - internal = null - if (!wear_mask || !(wear_mask.flags|MASKINTERNALS) ) - internal = null - if(internal) - if (internals) - internals.icon_state = "internal1" - return internal.remove_air_volume(volume_needed) - else - if (internals) - internals.icon_state = "internal0" - return null - - proc/handle_breath(datum/gas_mixture/breath) - if(status_flags & GODMODE) - return - - if(!breath || (breath.total_moles() == 0)) - adjustOxyLoss(7) - - oxygen_alert = max(oxygen_alert, 1) - - return 0 - - var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa - //var/safe_oxygen_max = 140 // Maximum safe partial pressure of O2, in kPa (Not used for now) - var/safe_co2_max = 10 // Yes it's an arbitrary value who cares? - var/safe_toxins_max = 0.5 - var/SA_para_min = 0.5 - var/SA_sleep_min = 5 - var/oxygen_used = 0 - var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME - - //Partial pressure of the O2 in our breath - var/O2_pp = (breath.oxygen/breath.total_moles())*breath_pressure - // Same, but for the toxins - var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure - // And CO2, lets say a PP of more than 10 will be bad (It's a little less really, but eh, being passed out all round aint no fun) - var/CO2_pp = (breath.carbon_dioxide/breath.total_moles())*breath_pressure - - if(O2_pp < safe_oxygen_min) // Too little oxygen - if(prob(20)) - spawn(0) emote("gasp") - if (O2_pp == 0) - O2_pp = 0.01 - var/ratio = safe_oxygen_min/O2_pp - adjustOxyLoss(min(5*ratio, 7)) // Don't fuck them up too fast (space only does 7 after all!) - oxygen_used = breath.oxygen*ratio/6 - oxygen_alert = max(oxygen_alert, 1) - /*else if (O2_pp > safe_oxygen_max) // Too much oxygen (commented this out for now, I'll deal with pressure damage elsewhere I suppose) - spawn(0) emote("cough") - var/ratio = O2_pp/safe_oxygen_max - oxyloss += 5*ratio - oxygen_used = breath.oxygen*ratio/6 - oxygen_alert = max(oxygen_alert, 1)*/ - else // We're in safe limits - adjustOxyLoss(-5) - oxygen_used = breath.oxygen/6 - oxygen_alert = 0 - - breath.oxygen -= oxygen_used - breath.carbon_dioxide += oxygen_used - - if(CO2_pp > safe_co2_max) - if(!co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so. - co2overloadtime = world.time - else if(world.time - co2overloadtime > 120) - Paralyse(3) - adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business - if(world.time - co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! - adjustOxyLoss(8) - if(prob(20)) // Lets give them some chance to know somethings not right though I guess. - spawn(0) emote("cough") - + if (internals) + internals.icon_state = "internal1" + return internal.remove_air_volume(volume_needed) else - co2overloadtime = 0 - - if(Toxins_pp > safe_toxins_max) // Too much toxins - var/ratio = (breath.toxins/safe_toxins_max) * 10 - //adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second - if(reagents) - reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) - toxins_alert = max(toxins_alert, 1) - else - toxins_alert = 0 - - if(breath.trace_gases.len) // If there's some other shit in the air lets deal with it here. - for(var/datum/gas/sleeping_agent/SA in breath.trace_gases) - var/SA_pp = (SA.moles/breath.total_moles())*breath_pressure - if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit - Paralyse(3) // 3 gives them one second to wake up and run away a bit! - if(SA_pp > SA_sleep_min) // Enough to make us sleep as well - sleeping = max(sleeping+2, 10) - else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning - if(prob(20)) - spawn(0) emote(pick("giggle", "laugh")) - - - if(breath.temperature > (T0C+66)) // Hot air hurts :( - if(prob(20)) - src << "\red You feel a searing heat in your lungs!" - fire_alert = max(fire_alert, 2) - else - fire_alert = 0 - - - //Temporary fixes to the alerts. - - return 1 - - proc/handle_environment(datum/gas_mixture/environment) - if(!environment) - return - var/environment_heat_capacity = environment.heat_capacity() - if(istype(get_turf(src), /turf/space)) - var/turf/heat_turf = get_turf(src) - environment_heat_capacity = heat_turf.heat_capacity - - if(!on_fire) - if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10))) - var/transfer_coefficient = 1 - - handle_temperature_damage(HEAD, environment.temperature, environment_heat_capacity*transfer_coefficient) - - if(stat != 2) - bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000) - - //Account for massive pressure differences - - var/pressure = environment.return_pressure() - var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob. - switch(adjusted_pressure) - if(HAZARD_HIGH_PRESSURE to INFINITY) - adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) ) - pressure_alert = 2 - if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) - pressure_alert = 1 - if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE) - pressure_alert = 0 - if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) - pressure_alert = -1 - else - if( !(COLD_RESISTANCE in mutations) ) - adjustBruteLoss( LOW_PRESSURE_DAMAGE ) - pressure_alert = -2 - else - pressure_alert = -1 + if (internals) + internals.icon_state = "internal0" + return null +/mob/living/carbon/monkey/proc/handle_breath(datum/gas_mixture/breath) + if(status_flags & GODMODE) return - proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity) - if(status_flags & GODMODE) return - var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) - //adjustFireLoss(2.5*discomfort) + if(!breath || (breath.total_moles() == 0)) + adjustOxyLoss(7) - if(exposed_temperature > bodytemperature) - adjustFireLoss(20.0*discomfort) + oxygen_alert = max(oxygen_alert, 1) + return 0 + + var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa + //var/safe_oxygen_max = 140 // Maximum safe partial pressure of O2, in kPa (Not used for now) + var/safe_co2_max = 10 // Yes it's an arbitrary value who cares? + var/safe_toxins_max = 0.5 + var/SA_para_min = 0.5 + var/SA_sleep_min = 5 + var/oxygen_used = 0 + var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME + + //Partial pressure of the O2 in our breath + var/O2_pp = (breath.oxygen/breath.total_moles())*breath_pressure + // Same, but for the toxins + var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure + // And CO2, lets say a PP of more than 10 will be bad (It's a little less really, but eh, being passed out all round aint no fun) + var/CO2_pp = (breath.carbon_dioxide/breath.total_moles())*breath_pressure + + if(O2_pp < safe_oxygen_min) // Too little oxygen + if(prob(20)) + spawn(0) emote("gasp") + if (O2_pp == 0) + O2_pp = 0.01 + var/ratio = safe_oxygen_min/O2_pp + adjustOxyLoss(min(5*ratio, 7)) // Don't fuck them up too fast (space only does 7 after all!) + oxygen_used = breath.oxygen*ratio/6 + oxygen_alert = max(oxygen_alert, 1) + /*else if (O2_pp > safe_oxygen_max) // Too much oxygen (commented this out for now, I'll deal with pressure damage elsewhere I suppose) + spawn(0) emote("cough") + var/ratio = O2_pp/safe_oxygen_max + oxyloss += 5*ratio + oxygen_used = breath.oxygen*ratio/6 + oxygen_alert = max(oxygen_alert, 1)*/ + else // We're in safe limits + adjustOxyLoss(-5) + oxygen_used = breath.oxygen/6 + oxygen_alert = 0 + + breath.oxygen -= oxygen_used + breath.carbon_dioxide += oxygen_used + + if(CO2_pp > safe_co2_max) + if(!co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so. + co2overloadtime = world.time + else if(world.time - co2overloadtime > 120) + Paralyse(3) + adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business + if(world.time - co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! + adjustOxyLoss(8) + if(prob(20)) // Lets give them some chance to know somethings not right though I guess. + spawn(0) emote("cough") + + else + co2overloadtime = 0 + + if(Toxins_pp > safe_toxins_max) // Too much toxins + var/ratio = (breath.toxins/safe_toxins_max) * 10 + //adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second + if(reagents) + reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) + toxins_alert = max(toxins_alert, 1) + else + toxins_alert = 0 + + if(breath.trace_gases.len) // If there's some other shit in the air lets deal with it here. + for(var/datum/gas/sleeping_agent/SA in breath.trace_gases) + var/SA_pp = (SA.moles/breath.total_moles())*breath_pressure + if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit + Paralyse(3) // 3 gives them one second to wake up and run away a bit! + if(SA_pp > SA_sleep_min) // Enough to make us sleep as well + sleeping = max(sleeping+2, 10) + else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning + if(prob(20)) + spawn(0) emote(pick("giggle", "laugh")) + + + if(breath.temperature > (T0C+66)) // Hot air hurts :( + if(prob(20)) + src << "You feel a searing heat in your lungs!" + fire_alert = max(fire_alert, 2) + else + fire_alert = 0 + + + //Temporary fixes to the alerts. + + return 1 + +/mob/living/carbon/monkey/proc/handle_environment(datum/gas_mixture/environment) + if(!environment) + return + var/environment_heat_capacity = environment.heat_capacity() + if(istype(get_turf(src), /turf/space)) + var/turf/heat_turf = get_turf(src) + environment_heat_capacity = heat_turf.heat_capacity + + if(!on_fire) + if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10))) + var/transfer_coefficient = 1 + + handle_temperature_damage(HEAD, environment.temperature, environment_heat_capacity*transfer_coefficient) + + if(stat != 2) + bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000) + + //Account for massive pressure differences + + var/pressure = environment.return_pressure() + var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob. + switch(adjusted_pressure) + if(HAZARD_HIGH_PRESSURE to INFINITY) + adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) ) + pressure_alert = 2 + if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) + pressure_alert = 1 + if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE) + pressure_alert = 0 + if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) + pressure_alert = -1 else - adjustFireLoss(5.0*discomfort) - - proc/handle_chemicals_in_body() - - if(reagents) reagents.metabolize(src) - - if (drowsyness) - drowsyness-- - eye_blurry = max(2, eye_blurry) - if (prob(5)) - sleeping += 1 - Paralyse(5) - - confused = max(0, confused - 1) - // decrement dizziness counter, clamped to 0 - if(resting) - dizziness = max(0, dizziness - 5) - else - dizziness = max(0, dizziness - 1) - - updatehealth() - - return //TODO: DEFERRED - - proc/handle_regular_status_updates() - updatehealth() - - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP - blinded = 1 - silent = 0 - else //ALIVE. LIGHTS ARE ON - if(health < config.health_threshold_dead || !getorgan(/obj/item/organ/brain)) - death() - blinded = 1 - stat = DEAD - silent = 0 - return 1 - - //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 25) || (config.health_threshold_crit >= health) ) - if( health <= 20 && prob(1) ) - spawn(0) - emote("gasp") - if(!reagents.has_reagent("inaprovaline")) - adjustOxyLoss(1) - Paralyse(3) - - if(paralysis) - AdjustParalysis(-1) - blinded = 1 - stat = UNCONSCIOUS - else if(sleeping) - sleeping = max(sleeping-1, 0) - blinded = 1 - stat = UNCONSCIOUS - if( prob(10) && health ) - spawn(0) - emote("snore") - //CONSCIOUS + if( !(COLD_RESISTANCE in mutations) ) + adjustBruteLoss( LOW_PRESSURE_DAMAGE ) + pressure_alert = -2 else - stat = CONSCIOUS + pressure_alert = -1 - //Eyes - if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own - blinded = 1 - else if(eye_blind) //blindness, heals slowly over time - eye_blind = max(eye_blind-1,0) - blinded = 1 - else if(eye_blurry) //blurry eyes heal slowly - eye_blurry = max(eye_blurry-1, 0) + return - //Ears - if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own - ear_deaf = max(ear_deaf, 1) - else if(ear_deaf) //deafness, heals slowly over time - ear_deaf = max(ear_deaf-1, 0) - else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs - ear_damage = max(ear_damage-0.05, 0) +/mob/living/carbon/monkey/proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity) + if(status_flags & GODMODE) return + var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) + //adjustFireLoss(2.5*discomfort) - //Other - if(stunned) - AdjustStunned(-1) + if(exposed_temperature > bodytemperature) + adjustFireLoss(20.0*discomfort) - if(weakened) - weakened = max(weakened-1,0) + else + adjustFireLoss(5.0*discomfort) - if(stuttering) - stuttering = max(stuttering-1, 0) +/mob/living/carbon/monkey/proc/handle_chemicals_in_body() - if(silent) - silent = max(silent-1, 0) + if(reagents) reagents.metabolize(src) + + if (drowsyness) + drowsyness-- + eye_blurry = max(2, eye_blurry) + if (prob(5)) + sleeping += 1 + Paralyse(5) + + confused = max(0, confused - 1) + // decrement dizziness counter, clamped to 0 + if(resting) + dizziness = max(0, dizziness - 5) + else + dizziness = max(0, dizziness - 1) + + updatehealth() + + return //TODO: DEFERRED + +/mob/living/carbon/monkey/proc/handle_regular_status_updates() + updatehealth() + + if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP + blinded = 1 + silent = 0 + else //ALIVE. LIGHTS ARE ON + if(health < config.health_threshold_dead || !getorgan(/obj/item/organ/brain)) + death() + blinded = 1 + stat = DEAD + silent = 0 + return 1 + + //UNCONSCIOUS. NO-ONE IS HOME + if( (getOxyLoss() > 25) || (config.health_threshold_crit >= health) ) + if( health <= 20 && prob(1) ) + spawn(0) + emote("gasp") + if(!reagents.has_reagent("inaprovaline")) + adjustOxyLoss(1) + Paralyse(3) + + if(paralysis) + AdjustParalysis(-1) + blinded = 1 + stat = UNCONSCIOUS + else if(sleeping) + sleeping = max(sleeping-1, 0) + blinded = 1 + stat = UNCONSCIOUS + if( prob(10) && health ) + spawn(0) + emote("snore") + //CONSCIOUS + else + stat = CONSCIOUS + + //Eyes + if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own + blinded = 1 + else if(eye_blind) //blindness, heals slowly over time + eye_blind = max(eye_blind-1,0) + blinded = 1 + else if(eye_blurry) //blurry eyes heal slowly + eye_blurry = max(eye_blurry-1, 0) + + //Ears + if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own + ear_deaf = max(ear_deaf, 1) + else if(ear_deaf) //deafness, heals slowly over time + ear_deaf = max(ear_deaf-1, 0) + else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs + ear_damage = max(ear_damage-0.05, 0) + + //Other + if(stunned) + AdjustStunned(-1) + + if(weakened) + weakened = max(weakened-1,0) + + if(stuttering) + stuttering = max(stuttering-1, 0) + + if(silent) + silent = max(silent-1, 0) + + if(druggy) + druggy = max(druggy-1, 0) + + CheckStamina() + return 1 + + +/mob/living/carbon/monkey/proc/handle_regular_hud_updates() + + if (stat == 2 || (XRAY in mutations)) + sight |= SEE_TURFS + sight |= SEE_MOBS + sight |= SEE_OBJS + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_LEVEL_TWO + else if (stat != 2) + sight &= ~SEE_TURFS + sight &= ~SEE_MOBS + sight &= ~SEE_OBJS + see_in_dark = 2 + see_invisible = SEE_INVISIBLE_LIVING + if(see_override) + see_invisible = see_override + + if (healths) + if (stat != 2) + switch(health) + if(100 to INFINITY) + healths.icon_state = "health0" + if(80 to 100) + healths.icon_state = "health1" + if(60 to 80) + healths.icon_state = "health2" + if(40 to 60) + healths.icon_state = "health3" + if(20 to 40) + healths.icon_state = "health4" + if(0 to 20) + healths.icon_state = "health5" + else + healths.icon_state = "health6" + else + healths.icon_state = "health7" + + + if(pressure) + pressure.icon_state = "pressure[pressure_alert]" + + if(pullin) + if(pulling) + pullin.icon_state = "pull" + else + pullin.icon_state = "pull0" + + if (toxin) toxin.icon_state = "tox[toxins_alert ? 1 : 0]" + if (oxygen) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]" + if (fire) fire.icon_state = "fire[fire_alert ? 2 : 0]" + //NOTE: the alerts dont reset when youre out of danger. dont blame me, + //blame the person who coded them. Temporary fix added. + + if(bodytemp) + switch(bodytemperature) //310.055 optimal body temp + if(345 to INFINITY) + bodytemp.icon_state = "temp4" + if(335 to 345) + bodytemp.icon_state = "temp3" + if(327 to 335) + bodytemp.icon_state = "temp2" + if(316 to 327) + bodytemp.icon_state = "temp1" + if(300 to 316) + bodytemp.icon_state = "temp0" + if(295 to 300) + bodytemp.icon_state = "temp-1" + if(280 to 295) + bodytemp.icon_state = "temp-2" + if(260 to 280) + bodytemp.icon_state = "temp-3" + else + bodytemp.icon_state = "temp-4" + + client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) + + if(blind && stat != DEAD) + if(blinded) + blind.layer = 18 + else + blind.layer = 0 + + if(disabilities & NEARSIGHTED) + client.screen += global_hud.vimpaired + + if(eye_blurry) + client.screen += global_hud.blurry if(druggy) - druggy = max(druggy-1, 0) + client.screen += global_hud.druggy - CheckStamina() - return 1 + if (stat != 2) + if (machine) + if (!( machine.check_eye(src) )) + reset_view(null) + else + if(!client.adminobs) + reset_view(null) + + return 1 + +/mob/living/carbon/monkey/proc/handle_random_events() + if (prob(1) && prob(2)) + spawn(0) + emote("scratch") + return - proc/handle_regular_hud_updates() - - if (stat == 2 || (XRAY in mutations)) - sight |= SEE_TURFS - sight |= SEE_MOBS - sight |= SEE_OBJS - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - else if (stat != 2) - sight &= ~SEE_TURFS - sight &= ~SEE_MOBS - sight &= ~SEE_OBJS - see_in_dark = 2 - see_invisible = SEE_INVISIBLE_LIVING - if(see_override) - see_invisible = see_override - - if (healths) - if (stat != 2) - switch(health) - if(100 to INFINITY) - healths.icon_state = "health0" - if(80 to 100) - healths.icon_state = "health1" - if(60 to 80) - healths.icon_state = "health2" - if(40 to 60) - healths.icon_state = "health3" - if(20 to 40) - healths.icon_state = "health4" - if(0 to 20) - healths.icon_state = "health5" - else - healths.icon_state = "health6" - else - healths.icon_state = "health7" - - - if(pressure) - pressure.icon_state = "pressure[pressure_alert]" - - if(pullin) - if(pulling) - pullin.icon_state = "pull" - else - pullin.icon_state = "pull0" - - if (toxin) toxin.icon_state = "tox[toxins_alert ? 1 : 0]" - if (oxygen) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]" - if (fire) fire.icon_state = "fire[fire_alert ? 2 : 0]" - //NOTE: the alerts dont reset when youre out of danger. dont blame me, - //blame the person who coded them. Temporary fix added. - - if(bodytemp) - switch(bodytemperature) //310.055 optimal body temp - if(345 to INFINITY) - bodytemp.icon_state = "temp4" - if(335 to 345) - bodytemp.icon_state = "temp3" - if(327 to 335) - bodytemp.icon_state = "temp2" - if(316 to 327) - bodytemp.icon_state = "temp1" - if(300 to 316) - bodytemp.icon_state = "temp0" - if(295 to 300) - bodytemp.icon_state = "temp-1" - if(280 to 295) - bodytemp.icon_state = "temp-2" - if(260 to 280) - bodytemp.icon_state = "temp-3" - else - bodytemp.icon_state = "temp-4" - - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) - - if(blind && stat != DEAD) - if(blinded) - blind.layer = 18 - else - blind.layer = 0 - - if(disabilities & NEARSIGHTED) - client.screen += global_hud.vimpaired - - if(eye_blurry) - client.screen += global_hud.blurry - - if(druggy) - client.screen += global_hud.druggy - - if (stat != 2) - if (machine) - if (!( machine.check_eye(src) )) - reset_view(null) - else - if(!client.adminobs) - reset_view(null) - - return 1 - - proc/handle_random_events() - if (prob(1) && prob(2)) - spawn(0) - emote("scratch") - return - - - proc/handle_changeling() - if(mind && mind.changeling) - mind.changeling.regenerate() - hud_used.lingchemdisplay.invisibility = 0 - hud_used.lingchemdisplay.maptext = "
    [src.mind.changeling.chem_charges]
    " +/mob/living/carbon/monkey/proc/handle_changeling() + if(mind && mind.changeling) + mind.changeling.regenerate() + hud_used.lingchemdisplay.invisibility = 0 + hud_used.lingchemdisplay.maptext = "
    [src.mind.changeling.chem_charges]
    " ///FIRE CODE - handle_fire() - if(..()) - return - adjustFireLoss(6) +/mob/living/carbon/monkey/handle_fire() + if(..()) return -//END FIRE CODE \ No newline at end of file + adjustFireLoss(6) + return +//END FIRE CODE diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 51d5fbd1bc7..7d0f4cf4e4e 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -1,12 +1,12 @@ /mob/living/carbon/monkey name = "monkey" voice_name = "monkey" - voice_message = "chimpers" say_message = "chimpers" icon = 'icons/mob/monkey.dmi' icon_state = "monkey1" gender = NEUTER pass_flags = PASSTABLE + languages = MONKEY update_icon = 0 ///no need to call regenerate_icon ventcrawler = 1 diff --git a/code/modules/mob/living/carbon/monkey/say.dm b/code/modules/mob/living/carbon/monkey/say.dm index b2136593683..58cfe0e35f8 100644 --- a/code/modules/mob/living/carbon/monkey/say.dm +++ b/code/modules/mob/living/carbon/monkey/say.dm @@ -1,8 +1,2 @@ -/mob/living/carbon/monkey/say(var/message) - if (silent) - return - else - return ..() - /mob/living/carbon/monkey/say_quote(var/text) - return "[src.say_message], \"[text]\""; + return "[say_message], \"[text]\""; diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm new file mode 100644 index 00000000000..61f1fef423e --- /dev/null +++ b/code/modules/mob/living/carbon/say.dm @@ -0,0 +1,11 @@ +/mob/living/carbon/treat_message(message) + message = ..(message) + if(wear_mask) + message = wear_mask.speechModification(message) + + return message + +/mob/living/carbon/can_speak_vocal(message) + if(!..() || silent) + return 0 + return 1 diff --git a/code/modules/mob/living/carbon/slime/emote.dm b/code/modules/mob/living/carbon/slime/emote.dm index bd29160b643..149bec620fd 100644 --- a/code/modules/mob/living/carbon/slime/emote.dm +++ b/code/modules/mob/living/carbon/slime/emote.dm @@ -49,7 +49,7 @@ src << "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, jiggle, light, moan, shiver, sway, twitch, vibrate" else - src << "\blue Unusable emote '[act]'. Say *help for a list." + src << "Unusable emote '[act]'. Say *help for a list." if ((message && src.stat == 0)) if (m_type & 1) for(var/mob/O in viewers(src, null)) diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm index 1c22fe9cf65..bdb63e28c37 100644 --- a/code/modules/mob/living/carbon/slime/life.dm +++ b/code/modules/mob/living/carbon/slime/life.dm @@ -253,7 +253,7 @@ /mob/living/carbon/slime/proc/handle_nutrition() - if (prob(15)) + if(prob(15)) nutrition -= 1 + is_adult if(nutrition <= 0) @@ -271,6 +271,18 @@ else Evolve() +/mob/living/carbon/slime/proc/add_nutrition(var/nutrition_to_add = 0, var/lastnut = 0) + nutrition = min((nutrition + nutrition_to_add), get_max_nutrition()) + if(nutrition >= (lastnut + 50)) + if(prob(80)) + lastnut = nutrition + powerlevel++ + if(powerlevel > 10) + powerlevel = 10 + adjustToxLoss(-10) + + + /mob/living/carbon/slime/proc/handle_targets() if(Tempstun) if(!Victim) // not while they're eating! diff --git a/code/modules/mob/living/carbon/slime/powers.dm b/code/modules/mob/living/carbon/slime/powers.dm index 31eff88033a..ef91582c3ec 100644 --- a/code/modules/mob/living/carbon/slime/powers.dm +++ b/code/modules/mob/living/carbon/slime/powers.dm @@ -3,11 +3,11 @@ set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process." if(Victim) Feedstop() - return + return 0 if(stat) src << "I must be conscious to do this..." - return + return 0 var/list/choices = list() for(var/mob/living/C in view(1,src)) @@ -15,31 +15,31 @@ choices += C var/mob/living/M = input(src,"Who do you wish to feed on?") in null|choices - if(!M) return + if(!M) return 0 if(Adjacent(M)) - if(!istype(src, /mob/living/carbon/brain)) - if(!istype(M, /mob/living/carbon/slime)) - if(stat != 2) - if(health > -70) - - for(var/mob/living/carbon/slime/met in view()) - if(met.Victim == M && met != src) - src << "The [met.name] is already feeding on this subject..." - return - src << "\blue I have latched onto the subject and begun feeding..." - M << "\red The [src.name] has latched onto your head!" - Feedon(M) - - else - src << "This subject does not have a strong enough life energy..." - else - src << "This subject does not have an edible life energy..." - else - src << "I must not feed on my brothers..." - else + if(istype(M, /mob/living/carbon/brain)) src << "This subject does not have an edible life energy..." + return 0 + if(istype(M, /mob/living/carbon) && (M.health < -70)) + src << "This subject does not have a strong enough life energy..." + return 0 + + if(istype(M, /mob/living/simple_animal) && (M.health < 1))//animals don't go into crit, stupid; fixes infinite energy exploit + src << "This subject does not have a strong enough life energy..." + return 0 + + for(var/mob/living/carbon/slime/met in view()) + if(met.Victim == M && met != src) + src << "The [met.name] is already feeding on this subject..." + return 0 + + src << "I have latched onto the subject and begun feeding..." + M << "The [src.name] has latched onto your head!" + + Feedon(M) + return 1 /mob/living/carbon/slime/proc/Feedon(var/mob/living/M) @@ -49,62 +49,59 @@ anchored = 1 var/lastnut = nutrition var/fed_succesfully = 0 + var/health_minimum = -70 + if(is_adult) icon_state = "[colour] adult slime eat" else icon_state = "[colour] baby slime eat" - while(Victim && M.health > -70 && stat != 2) + + if(istype(Victim, /mob/living/simple_animal)) + health_minimum = 0 + + while(Victim && Victim.health > health_minimum && stat != 2) canmove = 0 - if(Adjacent(M)) + if(Adjacent(Victim)) loc = M.loc - if(prob(15) && M.client && istype(M, /mob/living/carbon)) - M << "[pick("You can feel your body becoming weak!", \ - "You feel like you're about to die!", \ - "You feel every part of your body screaming in agony!", \ - "A low, rolling pain passes through your body!", \ - "Your body feels as if it's falling apart!", \ - "You feel extremely weak!", \ - "A sharp, deep pain bathes every inch of your body!")]" - - if(istype(M, /mob/living/carbon)) + if(istype(Victim, /mob/living/carbon)) Victim.adjustCloneLoss(rand(5,6)) Victim.adjustToxLoss(rand(1,2)) if(Victim.health <= 0) Victim.adjustToxLoss(rand(2,4)) + if(prob(15) && Victim.client) + Victim << "[pick("You can feel your body becoming weak!", \ + "You feel like you're about to die!", \ + "You feel every part of your body screaming in agony!", \ + "A low, rolling pain passes through your body!", \ + "Your body feels as if it's falling apart!", \ + "You feel extremely weak!", \ + "A sharp, deep pain bathes every inch of your body!")]" + fed_succesfully = 1 - else if(istype(M, /mob/living/simple_animal)) + else if(health_minimum == 0) //we already know it's a simple_animal from above Victim.adjustBruteLoss(is_adult ? rand(7, 15) : rand(4, 12)) fed_succesfully = 1 else - if(prob(25)) - src << "[pick("This subject is incompatable", \ - "This subject does not have a life energy", "This subject is empty", \ - "I am not satisified", "I can not feed from this subject", \ - "I do not feel nourished", "This subject is not food")]..." + src << "[pick("This subject is incompatable", \ + "This subject does not have a life energy", "This subject is empty", \ + "I am not satisified", "I can not feed from this subject", \ + "I do not feel nourished", "This subject is not food")]..." if(fed_succesfully) - //I have no idea why this is not in handle_nutrition() - nutrition += rand(15,30) - if(nutrition >= lastnut + 50) - if(prob(80)) - lastnut = nutrition - powerlevel++ - if(powerlevel > 10) - powerlevel = 10 - adjustToxLoss(-10) + add_nutrition(rand(15,30), lastnut) //Heal yourself. adjustOxyLoss(-10) adjustBruteLoss(-10) adjustFireLoss(-10) adjustCloneLoss(-10) - + updatehealth() if(Victim) Victim.updatehealth() @@ -114,7 +111,7 @@ else break - if(stat == 2) + if(stat == 2) //why the fuck are you doing icon updating here if(!is_adult) icon_state = "[colour] baby slime dead" @@ -128,7 +125,7 @@ anchored = 0 if(M) - if(M.health <= -70) + if(M.health < health_minimum) M.canmove = 0 if(!client) if(Victim && !rabid && !attacked) @@ -145,13 +142,16 @@ if(prob(85)) rabid = 1 // UUUNNBGHHHH GONNA EAT JUUUUUU - if(client) src << "This subject does not have a strong enough life energy anymore..." + if(client) + src << "This subject does not have a strong enough life energy anymore..." else M.canmove = 1 - if(client) src << "I have stopped feeding..." + if(client) + src << "I have stopped feeding..." else - if(client) src << "I have stopped feeding..." + if(client) + src << "I have stopped feeding..." Victim = null @@ -217,7 +217,7 @@ var/mob/living/carbon/slime/new_slime = pick(babies) new_slime.a_intent = "harm" - new_slime.universal_speak = universal_speak + new_slime.languages = languages if(src.mind) src.mind.transfer_to(new_slime) else diff --git a/code/modules/mob/living/carbon/slime/say.dm b/code/modules/mob/living/carbon/slime/say.dm index 9c2a59dbe94..0ede0e1d1bf 100644 --- a/code/modules/mob/living/carbon/slime/say.dm +++ b/code/modules/mob/living/carbon/slime/say.dm @@ -1,8 +1,5 @@ /mob/living/carbon/slime/say(var/message) - if (silent) - return - else - return ..() + ..() /mob/living/carbon/slime/say_quote(var/text) var/ending = copytext(text, length(text)) @@ -14,8 +11,10 @@ return "telepathically chirps, \"[text]\""; -/mob/living/carbon/slime/say_understands(var/other) - if (istype(other, /mob/living/carbon/slime)) - return 1 - return ..() - +/mob/living/carbon/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + if(speaker != src && !radio_freq) + if (speaker in Friends) + speech_buffer = list() + speech_buffer += speaker.name + speech_buffer += lowertext(html_decode(message)) + ..() diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index 5d4f4fa4067..ed218c49862 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -3,10 +3,10 @@ icon = 'icons/mob/slimes.dmi' icon_state = "grey baby slime" pass_flags = PASSTABLE - voice_message = "skree!" say_message = "hums" ventcrawler = 2 var/is_adult = 0 + languages = SLIME | HUMAN layer = 5 @@ -920,6 +920,8 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 var/mob/living/carbon/human/G = new /mob/living/carbon/human if(prob(50)) G.gender = "female" hardset_dna(G, null, null, null, null, /datum/species/golem/adamantine) + + G.set_cloned_appearance() G.real_name = text("Adamantine Golem ([rand(1, 1000)])") G.dna.species.auto_equip(G) G.loc = src.loc diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index c58542f7b6a..ec32f437b12 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -16,9 +16,9 @@ else //if(lying != 0) if(lying_prev == 0) //Standing to lying final_pixel_y -= 6 + if(dir & (EAST|WEST)) //Facing east or west + final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass - if(dir & (EAST|WEST)) //Facing east or west - final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass lying_prev = lying //so we don't try to animate until there's been another change. if(changed) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index f4dcb2f7648..f111b5cb5f5 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -255,7 +255,7 @@ src << "Help for emotes. You can use these emotes with say \"*emote\":\n\naflap, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, dance, deathgasp, drool, flap, frown, gasp, giggle, glare-(none)/mob, grin, jump, laugh, look, me, nod, point-atom, scream, shake, sit, sigh, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tremble, twitch, twitch_s, wave, whimper, yawn" else - src << "\blue Unusable emote '[act]'. Say *help for a list." + src << "Unusable emote '[act]'. Say *help for a list." diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index a7acd1cdf83..33e41fb2775 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -17,7 +17,7 @@ src.adjustOxyLoss(src.health + 200) src.health = 100 - src.getOxyLoss() - src.getToxLoss() - src.getFireLoss() - src.getBruteLoss() if(!whispered) - src << "\blue You have given up life and succumbed to death." + src << "You have given up life and succumbed to death." death() /mob/living/proc/InCritical() @@ -361,7 +361,7 @@ var/obj/item/weapon/grab/G = pick(M.grabbed_by) if (istype(G, /obj/item/weapon/grab)) for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] has been pulled from []'s grip by []", G.affecting, G.assailant, src), 1) + O.show_message(text("[] has been pulled from []'s grip by []", G.affecting, G.assailant, src), 1) //G = null qdel(G) else @@ -543,9 +543,11 @@ var/mob/living/carbon/CM = L if(CM.on_fire && CM.canmove) CM.fire_stacks -= 5 - CM.weakened = 5 + CM.Weaken(3) + CM.spin(32,2) CM.visible_message("[CM] rolls on the floor, trying to put themselves out!", \ "You stop, drop, and roll!") + sleep(30) if(fire_stacks <= 0) CM.visible_message("[CM] has successfully extinguished themselves!", \ "You extinguish yourself.") @@ -560,6 +562,23 @@ else cuff_resist(CM.legcuffed, CM) +/mob/living/carbon/proc/spin(spintime, speed) + spawn() + var/D = dir + while(spintime >= speed) + sleep(speed) + switch(D) + if(NORTH) + D = EAST + if(SOUTH) + D = WEST + if(EAST) + D = SOUTH + if(WEST) + D = NORTH + dir = D + spintime -= speed + return /mob/living/proc/get_visible_name() return name @@ -592,7 +611,7 @@ // The src mob is trying to strip an item from someone // Override if a certain type of mob should be behave differently when stripping items (can't, for example) -/mob/living/stripPanelUnequip(mob/who, obj/item/what, where) +/mob/living/stripPanelUnequip(obj/item/what, mob/who, where) if(what.flags & NODROP) src << "You can't remove \the [what.name], it appears to be stuck!" return @@ -606,7 +625,7 @@ // The src mob is trying to place an item on someone // Override if a certain mob should be behave differently when placing items (can't, for example) -/mob/living/stripPanelEquip(mob/who, obj/item/what, where) +/mob/living/stripPanelEquip(obj/item/what, mob/who, where) what = src.get_active_hand() if(what && (what.flags & NODROP)) src << "You can't put \the [what.name] on [who], it's stuck to your hand!" diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index a1de3adb051..c93828d01f2 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -1,5 +1,6 @@ /mob/living see_invisible = SEE_INVISIBLE_LIVING + languages = HUMAN //Health and life related vars var/maxHealth = 100 //Maximum health that should be possible. diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 53977a44810..c325bc9836d 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -1,3 +1,21 @@ +//bitflag #defines for radio return. +#define ITALICS 1 +#define REDUCE_RANGE 2 +#define NOPASS 4 + +//message modes. you're not supposed to mess with these. +#define MODE_HEADSET "headset" +#define MODE_ROBOT "robot" +#define MODE_R_HAND "right hand" +#define MODE_L_HAND "left hand" +#define MODE_INTERCOM "intercom" +#define MODE_BINARY "binary" +#define MODE_WHISPER "whisper" +#define MODE_SECURE_HEADSET "secure headset" +#define MODE_DEPARTMENT "department" +#define MODE_ALIEN "alientalk" +#define MODE_HOLOPAD "holopad" +#define MODE_CHANGELING "changeling" var/list/department_radio_keys = list( ":r" = "right hand", "#r" = "right hand", ".r" = "right hand", @@ -54,339 +72,97 @@ var/list/department_radio_keys = list( ) /mob/living/proc/binarycheck() - if (istype(src, /mob/living/silicon/pai)) - return - if (issilicon(src)) - return 1 - if (!ishuman(src)) - return - var/mob/living/carbon/human/H = src - if (H.ears) - var/obj/item/device/radio/headset/dongle = H.ears - if(!istype(dongle)) return - if(dongle.translate_binary) return 1 + return 0 -/mob/living/proc/IsVocal() - return 1 - -/mob/living/proc/hivecheck() - if (isalien(src)) return 1 - if (!ishuman(src)) return - var/mob/living/carbon/human/H = src - if (H.ears) - var/obj/item/device/radio/headset/dongle = H.ears - if(!istype(dongle)) return - if(dongle.translate_hive) return 1 - -/mob/living/say(var/message, var/bubble_type) +/mob/living/say(message, bubble_type) message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) - if (!message) + if(stat == DEAD) + say_dead(message) return - if (stat == 2) - return say_dead(message) - - if (src.client) - if(client.prefs.muted & MUTE_IC) - src << "\red You cannot speak in IC (muted)." - return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return - - // stat == 2 is handled above, so this stops transmission of uncontious messages - if (stat) + if(stat) return - // Mute disability - if (sdisabilities & MUTE) + if(check_emote(message)) return - // emotes - if (copytext(message, 1, 2) == "*" && !stat) - return emote(copytext(message, 2)) + if(!can_speak_basic(message)) //Stat is seperate so I can handle whispers properly. + return - var/alt_name = "" - if (istype(src, /mob/living/carbon/human) && name != GetVoice()) - var/mob/living/carbon/human/H = src - alt_name = " (as [H.get_id_name("Unknown")])" - var/italics = 0 - var/message_range = null - var/message_mode = null + var/message_mode = get_message_mode(message) - if (getBrainLoss() >= 60 && prob(50)) - if (ishuman(src)) - message_mode = "headset" - // Special message handling - else if (copytext(message, 1, 2) == ";") - if (ishuman(src)) - message_mode = "headset" - else if(ispAI(src) || isrobot(src)) - message_mode = "pAI" + if(message_mode == MODE_HEADSET || message_mode == MODE_ROBOT) + message = copytext(message, 2) + else if(message_mode) + message = copytext(message, 3) + if(findtext(message, " ", 1, 2)) message = copytext(message, 2) - else if (length(message) >= 2) - var/channel_prefix = copytext(message, 1, 3) - - message_mode = department_radio_keys[channel_prefix] - //world << "channel_prefix=[channel_prefix]; message_mode=[message_mode]" - if (message_mode) - message = trim(copytext(message, 3)) - if (!(ishuman(src) || istype(src, /mob/living/simple_animal/parrot) || isrobot(src)) && (message_mode=="department" || (message_mode in radiochannels))) // If they're not a human, parrot, or robot, and they're trying to use a radio channel - message_mode = null //only humans can use headsets - // Check changed so that parrots can use headsets. Other simple animals do not have ears and will cause runtimes. - // And borgs -Sieve - - if (!message) + if(handle_inherent_channels(message, message_mode)) //Hiveminds, binary chat & holopad. return - // :downs: - if (getBrainLoss() >= 60) - message = derpspeech(message, stuttering) - - if (stuttering) - message = stutter(message) - -/* //qw do not have beesease atm. - if(virus) - if(virus.name=="beesease" && virus.stage>=2) - if(prob(virus.stage*10)) - var/bzz = length(message) - message = "B" - for(var/i=0,i[mind.changeling.changelingID]: [message]" - return - - if (message_mode == "alientalk") - if(alien_talk_understand || hivecheck()) - //message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant - alien_talk(message) + if(!can_speak_vocal(message)) return - if(is_muzzled()) // Intentionally after changeling hivemind check - return - - var/list/obj/item/used_radios = new + message = treat_message(message) - switch (message_mode) - if ("headset") - if (src:ears) - src:ears.talk_into(src, message) - used_radios += src:ears - - message_range = 1 - italics = 1 - - - if ("secure headset") - if (src:ears) - src:ears.talk_into(src, message, 1) - used_radios += src:ears - - message_range = 1 - italics = 1 - - if ("right hand") - if (r_hand) - r_hand.talk_into(src, message) - used_radios += src:r_hand - - message_range = 1 - italics = 1 - - if ("left hand") - if (l_hand) - l_hand.talk_into(src, message) - used_radios += src:l_hand - - message_range = 1 - italics = 1 - - if ("intercom") - for (var/obj/item/device/radio/intercom/I in view(1, null)) - I.talk_into(src, message) - used_radios += I - - message_range = 1 - italics = 1 - - //I see no reason to restrict such way of whispering - if ("whisper") - whisper(message) - return - - if ("binary") - if(robot_talk_understand || binarycheck()) - //message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant - robot_talk(message) - return - - if ("department") - if (src:ears) - src:ears.talk_into(src, message, message_mode) - used_radios += src:ears - message_range = 1 - italics = 1 - - if ("pAI") - if (src:radio) - src:radio.talk_into(src, message) - used_radios += src:radio - message_range = 1 - italics = 1 - -////SPECIAL HEADSETS START - else - //world << "SPECIAL HEADSETS" - if (message_mode in radiochannels) - if(isrobot(src))//Seperates robots to prevent runtimes from the ear stuff - var/mob/living/silicon/robot/R = src - if(R.radio)//Sanityyyy - R.radio.talk_into(src, message, message_mode) - used_radios += R.radio - else - if (src:ears) - src:ears.talk_into(src, message, message_mode) - used_radios += src:ears - message_range = 1 - italics = 1 -/////SPECIAL HEADSETS END - - if(!IsVocal()) + if(!message || message == "") return - var/list/listening + var/message_range = 7 + var/radio_return = radio(message, message_mode) + if(radio_return & NOPASS) //There's a whisper() message_mode, no need to continue the proc if that is called + return + if(radio_return & ITALICS) + message = "[message]" + if(radio_return & REDUCE_RANGE) + message_range = 1 - listening = get_mobs_in_view(message_range, src) + send_speech(message, message_range, src, bubble_type) + + log_say("[name]/[key] : [message]") + +/mob/living/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + if(!client) + return + var/deaf_message + var/deaf_type + if(speaker != src) + deaf_message = "[speaker] talks but you cannot hear them." + deaf_type = 1 + else + deaf_message = "You can't hear yourself!" + deaf_type = 2 // Since you should be able to hear yourself without looking + if(!(message_langs & languages) || force_compose) //force_compose is so AIs don't end up without their hrefs. + message = compose_message(speaker, message_langs, raw_message, radio_freq) + show_message(message, 2, deaf_message, deaf_type) + return message + +/mob/living/send_speech(message, message_range = 7, obj/source = src, bubble_type) + var/list/listening = get_hearers_in_view(message_range, source) + var/list/listening_dead = list() for(var/mob/M in player_list) - if (!M.client) - continue //skip monkeys and leavers - if (istype(M, /mob/new_player)) - continue - if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTEARS) && src.client) // src.client is so that ghosts don't have to listen to mice - listening|=M + if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTEARS) && client) // client is so that ghosts don't have to listen to mice + listening_dead |= M - var/turf/T = get_turf(src) - var/list/W = hear(message_range, T) + listening -= listening_dead //so ghosts dont hear stuff twice - for (var/obj/O in ((W | contents)-used_radios)) - W |= O + var/rendered = compose_message(src, languages, message) + for(var/atom/movable/AM in listening) + AM.Hear(rendered, src, languages, message) - for (var/mob/M in W) - W |= M.contents - - for (var/atom/A in W) - if(istype(A, /mob/living/simple_animal/parrot)) //Parrot speech mimickry - if(A == src) - continue //Dont imitate ourselves - - var/mob/living/simple_animal/parrot/P = A - if(P.speech_buffer.len >= 10) - P.speech_buffer.Remove(pick(P.speech_buffer)) - P.speech_buffer.Add(html_decode(message)) - - if(isslime(A)) //Slimes answering to people - if (A == src) - continue - - var/mob/living/carbon/slime/S = A - if (src in S.Friends) - S.speech_buffer = list() - S.speech_buffer.Add(src) - S.speech_buffer.Add(lowertext(html_decode(message))) - - if(istype(A, /obj/)) //radio in pocket could work, radio in backpack wouldn't --rastaf0 - var/obj/O = A - spawn (0) - if(O && !istype(O.loc, /obj/item/weapon/storage)) - O.hear_talk(src, message) - - -/* Commented out as replaced by code above from BS12 - for (var/obj/O in ((V | contents)-used_radios)) //radio in pocket could work, radio in backpack wouldn't --rastaf0 - spawn (0) - if (O) - O.hear_talk(src, message) -*/ - -/* if(isbrain(src))//For brains to properly talk if they are in an MMI..or in a brain. Could be extended to other mobs I guess. - for(var/obj/O in loc)//Kinda ugly but whatever. - if(O) - spawn(0) - O.hear_talk(src, message) -*/ - - - var/list/heard_a = list() // understood us - var/list/heard_b = list() // didn't understand us - - for (var/M in listening) - if(hascall(M,"say_understands")) - if (M:say_understands(src)) - heard_a += M - else - heard_b += M - - var/rendered = null - if (length(heard_a)) - var/message_a = say_quote(message) - - if (italics) - message_a = "[message_a]" - - rendered = "[GetVoice()][alt_name] [message_a]" - - for (var/M in heard_a) - if(hascall(M,"show_message")) - var/deaf_message = "" - var/deaf_type = 1 - if(M != src) - deaf_message = "[name][alt_name] talks but you cannot hear them." - else - deaf_message = "You cannot hear yourself!" - deaf_type = 2 // Since you should be able to hear yourself without looking - M:show_message(rendered, 2, deaf_message, deaf_type) - - if (length(heard_b)) - var/message_b - - if (voice_message) - message_b = voice_message - else - message_b = stars(message) - message_b = say_quote(message_b) - - if (italics) - message_b = "[message_b]" - - rendered = "[voice_name] [message_b]" - - - for (var/M in heard_b) - if(hascall(M,"show_message")) - M:show_message(rendered, 2) + for(var/mob/M in listening_dead) + M.Hear(rendered, src, languages, message) //speech bubble var/list/speech_bubble_recipients = list() - for(var/mob/M in heard_a + heard_b) + for(var/mob/M in (listening + listening_dead)) if(M.client) speech_bubble_recipients.Add(M.client) spawn(0) flick_overlay(image('icons/mob/talk.dmi', src, "h[bubble_type][say_test(message)]",MOB_LAYER+1), speech_bubble_recipients, 30) - log_say("[name]/[key] : [message]") - -/mob/living/proc/GetVoice() - return name - /mob/living/proc/say_test(var/text) var/ending = copytext(text, length(text)) if (ending == "?") @@ -394,3 +170,103 @@ var/list/department_radio_keys = list( else if (ending == "!") return "2" return "0" + +/mob/living/can_speak(message) //For use outside of Say() + if(can_speak_basic(message) && can_speak_vocal(message)) + return 1 + +/mob/living/proc/can_speak_basic(message) //Check BEFORE handling of xeno and ling channels + if(!message || message == "") + return + + if(client) + if(client.prefs.muted & MUTE_IC) + src << "You cannot speak in IC (muted)." + return + if(client.handle_spam_prevention(message,MUTE_IC)) + return + + return 1 + +/mob/living/proc/can_speak_vocal(message) //Check AFTER handling of xeno and ling channels + if(!message) + return + + if(sdisabilities & MUTE) + return + + if(is_muzzled()) + return + + if(!IsVocal()) + return + + return 1 + +/mob/living/proc/check_emote(message) + if(copytext(message, 1, 2) == "*") + emote(copytext(message, 2)) + return 1 + +/mob/living/proc/get_message_mode(message) + if(copytext(message, 1, 2) == ";") + return MODE_HEADSET + else if(length(message) > 2) + return department_radio_keys[copytext(message, 1, 3)] + +/mob/living/proc/handle_inherent_channels(message, message_mode) + if(message_mode == MODE_CHANGELING) + if(lingcheck()) + log_say("[mind.changeling.changelingID]/[src.key] : [message]") + for(var/mob/M in mob_list) + if(M.lingcheck() || (M.stat == DEAD && !istype(M, /mob/new_player))) + M << "[mind.changeling.changelingID]: [message]" + return 1 + return 0 + +/mob/living/proc/treat_message(message) + if(getBrainLoss() >= 60) + message = derpspeech(message, stuttering) + + if(stuttering) + message = stutter(message) + + return message + +/mob/living/proc/radio(message, message_mode, steps) + switch(message_mode) + if(MODE_R_HAND) + if (r_hand) + r_hand.talk_into(src, message) + return ITALICS | REDUCE_RANGE + + if(MODE_L_HAND) + if (l_hand) + l_hand.talk_into(src, message) + return ITALICS | REDUCE_RANGE + + if(MODE_INTERCOM) + for (var/obj/item/device/radio/intercom/I in view(1, null)) + I.talk_into(src, message) + return ITALICS | REDUCE_RANGE + + if(MODE_BINARY) + if(binarycheck()) + robot_talk(message) + return ITALICS | REDUCE_RANGE //Does not return 0 since this is only reached by humans, not borgs or AIs. + + if(MODE_WHISPER) + whisper(message) + return NOPASS + return 0 + +/mob/living/lingcheck() + if(mind && mind.changeling) + return 1 + +/mob/living/say_quote() + if (stuttering) + return "stammers, \"[text]\"" + if (getBrainLoss() >= 60) + return "gibbers, \"[text]\"" + return ..() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index bb4d03f2515..ceea1384d12 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -19,17 +19,18 @@ var/list/ai_list = list() anchored = 1 density = 1 status_flags = CANSTUN|CANPARALYSE|CANPUSH + force_compose = 1 //This ensures that the AI always composes it's own hear message. Needed for hrefs and job display. var/list/network = list("SS13") var/obj/machinery/camera/current = null var/list/connected_robots = list() var/aiRestorePowerRoutine = 0 //var/list/laws = list() - var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list()) + var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list()) var/viewalerts = 0 var/icon/holo_icon//Default is assigned when AI is created. var/obj/item/device/pda/ai/aiPDA = null var/obj/item/device/multitool/aiMulti = null - var/obj/item/device/camera/ai_camera/aicamera = null + var/obj/item/device/camera/siliconcam/aicamera = null //MALFUNCTION var/datum/module_picker/malf_picker @@ -88,7 +89,7 @@ var/list/ai_list = list() aiPDA.name = name + " (" + aiPDA.ownjob + ")" aiMulti = new(src) - aicamera = new/obj/item/device/camera/ai_camera(src) + aicamera = new/obj/item/device/camera/siliconcam/ai_camera(src) if (istype(loc, /turf)) verbs.Add(/mob/living/silicon/ai/proc/ai_network_change, \ @@ -393,7 +394,7 @@ var/list/ai_list = list() if ("help") for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) - O.show_message(text("\blue [M] caresses [src]'s plating with its scythe like arm."), 1) + O.show_message(text("[M] caresses [src]'s plating with its scythe like arm."), 1) else //harm var/damage = rand(10, 20) @@ -401,7 +402,7 @@ var/list/ai_list = list() playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has slashed at []!", M, src), 1) + O.show_message(text("[] has slashed at []!", M, src), 1) if(prob(8)) flick("noise", flash) adjustBruteLoss(damage) @@ -410,7 +411,7 @@ var/list/ai_list = list() playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] took a swipe at []!", M, src), 1) + O.show_message(text("[] took a swipe at []!", M, src), 1) return /mob/living/silicon/ai/attack_animal(mob/living/simple_animal/M as mob) @@ -420,7 +421,7 @@ var/list/ai_list = list() if(M.attack_sound) playsound(loc, M.attack_sound, 50, 1, 1) for(var/mob/O in viewers(src, null)) - O.show_message("\red [M] [M.attacktext] [src]!", 1) + O.show_message("[M] [M.attacktext] [src]!", 1) add_logs(M, src, "attacked", admin=0) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) adjustBruteLoss(damage) @@ -545,7 +546,7 @@ var/list/ai_list = list() if(network in C.network) U.eyeobj.setLoc(get_turf(C)) break - src << "\blue Switched to [network] camera network." + src << "Switched to [network] camera network." //End of code by Mord_Sith @@ -628,7 +629,7 @@ var/list/ai_list = list() var/obj/machinery/power/apc/apc = src.loc if(!istype(apc)) - src << "\blue You are already in your Main Core." + src << "You are already in your Main Core." return apc.malfvacate() @@ -672,4 +673,4 @@ var/list/ai_list = list() lit_cameras -= C for (var/obj/machinery/camera/C in add) C.SetLuminosity(AI_CAMERA_LUMINOSITY) - lit_cameras |= C \ No newline at end of file + lit_cameras |= C diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index f9f5c89b9da..615b2433726 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -14,7 +14,7 @@ if (src.malfhack) if (src.malfhack.aidisabled) - src << "\red ERROR: APC access disabled, hack attempt canceled." + src << "ERROR: APC access disabled, hack attempt canceled." src.malfhacking = 0 src.malfhack = null diff --git a/code/modules/mob/living/silicon/decoy/death.dm b/code/modules/mob/living/silicon/decoy/death.dm deleted file mode 100644 index d3996e2fa70..00000000000 --- a/code/modules/mob/living/silicon/decoy/death.dm +++ /dev/null @@ -1,10 +0,0 @@ -/mob/living/silicon/decoy/death(gibbed) - if(stat == DEAD) return - stat = DEAD - icon_state = "ai-crash" - spawn(10) - explosion(loc, 3, 6, 12, 15) - - for(var/obj/machinery/ai_status_display/O in world) //change status - O.mode = 2 - return ..(gibbed) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/decoy/decoy.dm b/code/modules/mob/living/silicon/decoy/decoy.dm deleted file mode 100644 index 5881e860eeb..00000000000 --- a/code/modules/mob/living/silicon/decoy/decoy.dm +++ /dev/null @@ -1,32 +0,0 @@ -/mob/living/silicon/decoy - name = "AI" - icon = 'icons/mob/AI.dmi'// - icon_state = "ai" - anchored = 1 - canmove = 0 - -/mob/living/silicon/decoy/New() - ..() - src.icon = 'icons/mob/AI.dmi' - src.icon_state = "ai" - src.anchored = 1 - src.canmove = 0 - -/mob/living/silicon/decoy/say_understands(var/other) - if (istype(other, /mob/living/carbon/human)) - return 1 - if (istype(other, /mob/living/silicon/robot)) - return 1 - if (istype(other, /mob/living/silicon/ai)) - return 1 - return ..() - -/mob/living/silicon/decoy/say_quote(var/text) - var/ending = copytext(text, length(text)) - - if (ending == "?") - return "queries, \"[text]\""; - else if (ending == "!") - return "declares, \"[copytext(text, 1, length(text))]\""; - - return "states, \"[text]\""; \ No newline at end of file diff --git a/code/modules/mob/living/silicon/decoy/life.dm b/code/modules/mob/living/silicon/decoy/life.dm deleted file mode 100644 index 8a336b8353b..00000000000 --- a/code/modules/mob/living/silicon/decoy/life.dm +++ /dev/null @@ -1,15 +0,0 @@ -/mob/living/silicon/decoy/Life() - if (src.stat == 2) - return - else - if (src.health <= config.health_threshold_dead && src.stat != 2) - death() - return - - -/mob/living/silicon/decoy/updatehealth() - if(status_flags & GODMODE) - health = maxHealth - stat = CONSCIOUS - return - health = maxHealth - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index 385c0ae6760..728db940163 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -5,7 +5,7 @@ if(get_dist(src, src.cable) > 1) var/turf/T = get_turf(src.loc) for (var/mob/M in viewers(T)) - M.show_message("\red [src.cable] rapidly retracts back into its spool.", 3, "\red You hear a click and the sound of wire spooling rapidly.", 2) + M.show_message("[src.cable] rapidly retracts back into its spool.", 3, "You hear a click and the sound of wire spooling rapidly.", 2) qdel(src.cable) cable = null diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 820f646421f..042f0430361 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -4,8 +4,6 @@ mouse_opacity density = 0 - robot_talk_understand = 0 - var/network = "SS13" var/obj/machinery/camera/current = null @@ -13,7 +11,6 @@ var/list/software = list() var/userDNA // The DNA string of our assigned user var/obj/item/device/paicard/card // The card we inhabit - var/obj/item/device/radio/radio // Our primary radio var/speakStatement = "states" var/speakExclamation = "declares" diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index eb6384f17fa..b5a4f0ee025 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -20,198 +20,198 @@ var/datum/paiController/paiController // Global handler for pAI candidates var/askDelay = 10 * 60 * 1 // One minute [ms * sec * min] - Topic(href, href_list[]) - if(href_list["download"]) - var/datum/paiCandidate/candidate = locate(href_list["candidate"]) - var/obj/item/device/paicard/card = locate(href_list["device"]) - if(card.pai) +/datum/paiController/Topic(href, href_list[]) + if(href_list["download"]) + var/datum/paiCandidate/candidate = locate(href_list["candidate"]) + var/obj/item/device/paicard/card = locate(href_list["device"]) + if(card.pai) + return + if(istype(card,/obj/item/device/paicard) && istype(candidate,/datum/paiCandidate)) + var/mob/living/silicon/pai/pai = new(card) + if(!candidate.name) + pai.name = pick(ninja_names) + else + pai.name = candidate.name + pai.real_name = pai.name + pai.key = candidate.key + + card.setPersonality(pai) + card.looking_for_personality = 0 + + ticker.mode.update_cult_icons_removed(card.pai.mind) + ticker.mode.update_rev_icons_removed(card.pai.mind) + + pai_candidates -= candidate + usr << browse(null, "window=findPai") + + if(href_list["new"]) + var/datum/paiCandidate/candidate = locate(href_list["candidate"]) + var/option = href_list["option"] + var/t = "" + + switch(option) + if("name") + t = input("Enter a name for your pAI", "pAI Name", candidate.name) as text + if(t) + candidate.name = copytext(sanitize(t),1,MAX_NAME_LEN) + if("desc") + t = input("Enter a description for your pAI", "pAI Description", candidate.description) as message + if(t) + candidate.description = copytext(sanitize(t),1,MAX_MESSAGE_LEN) + if("role") + t = input("Enter a role for your pAI", "pAI Role", candidate.role) as text + if(t) + candidate.role = copytext(sanitize(t),1,MAX_MESSAGE_LEN) + if("ooc") + t = input("Enter any OOC comments", "pAI OOC Comments", candidate.comments) as message + if(t) + candidate.comments = copytext(sanitize(t),1,MAX_MESSAGE_LEN) + if("save") + candidate.savefile_save(usr) + if("load") + candidate.savefile_load(usr) + //In case people have saved unsanitized stuff. + if(candidate.name) + candidate.name = copytext(sanitize(candidate.name),1,MAX_NAME_LEN) + if(candidate.description) + candidate.description = copytext(sanitize(candidate.description),1,MAX_MESSAGE_LEN) + if(candidate.role) + candidate.role = copytext(sanitize(candidate.role),1,MAX_MESSAGE_LEN) + if(candidate.comments) + candidate.comments = copytext(sanitize(candidate.comments),1,MAX_MESSAGE_LEN) + + if("submit") + if(candidate) + candidate.ready = 1 + for(var/obj/item/device/paicard/p in world) + if(p.looking_for_personality == 1) + p.alertUpdate() + usr << browse(null, "window=paiRecruit") return - if(istype(card,/obj/item/device/paicard) && istype(candidate,/datum/paiCandidate)) - var/mob/living/silicon/pai/pai = new(card) - if(!candidate.name) - pai.name = pick(ninja_names) - else - pai.name = candidate.name - pai.real_name = pai.name - pai.key = candidate.key + recruitWindow(usr) - card.setPersonality(pai) - card.looking_for_personality = 0 - - ticker.mode.update_cult_icons_removed(card.pai.mind) - ticker.mode.update_rev_icons_removed(card.pai.mind) - - pai_candidates -= candidate - usr << browse(null, "window=findPai") - - if(href_list["new"]) - var/datum/paiCandidate/candidate = locate(href_list["candidate"]) - var/option = href_list["option"] - var/t = "" - - switch(option) - if("name") - t = input("Enter a name for your pAI", "pAI Name", candidate.name) as text - if(t) - candidate.name = copytext(sanitize(t),1,MAX_NAME_LEN) - if("desc") - t = input("Enter a description for your pAI", "pAI Description", candidate.description) as message - if(t) - candidate.description = copytext(sanitize(t),1,MAX_MESSAGE_LEN) - if("role") - t = input("Enter a role for your pAI", "pAI Role", candidate.role) as text - if(t) - candidate.role = copytext(sanitize(t),1,MAX_MESSAGE_LEN) - if("ooc") - t = input("Enter any OOC comments", "pAI OOC Comments", candidate.comments) as message - if(t) - candidate.comments = copytext(sanitize(t),1,MAX_MESSAGE_LEN) - if("save") - candidate.savefile_save(usr) - if("load") - candidate.savefile_load(usr) - //In case people have saved unsanitized stuff. - if(candidate.name) - candidate.name = copytext(sanitize(candidate.name),1,MAX_NAME_LEN) - if(candidate.description) - candidate.description = copytext(sanitize(candidate.description),1,MAX_MESSAGE_LEN) - if(candidate.role) - candidate.role = copytext(sanitize(candidate.role),1,MAX_MESSAGE_LEN) - if(candidate.comments) - candidate.comments = copytext(sanitize(candidate.comments),1,MAX_MESSAGE_LEN) - - if("submit") - if(candidate) - candidate.ready = 1 - for(var/obj/item/device/paicard/p in world) - if(p.looking_for_personality == 1) - p.alertUpdate() - usr << browse(null, "window=paiRecruit") - return - recruitWindow(usr) - - proc/recruitWindow(var/mob/M as mob) - var/datum/paiCandidate/candidate - for(var/datum/paiCandidate/c in pai_candidates) - if(c.key == M.key) - candidate = c - if(!candidate) - candidate = new /datum/paiCandidate() - candidate.key = M.key - pai_candidates.Add(candidate) +/datum/paiController/proc/recruitWindow(var/mob/M as mob) + var/datum/paiCandidate/candidate + for(var/datum/paiCandidate/c in pai_candidates) + if(c.key == M.key) + candidate = c + if(!candidate) + candidate = new /datum/paiCandidate() + candidate.key = M.key + pai_candidates.Add(candidate) - var/dat = "" - dat += {" - - "} + tr.d0 td { + background-color: #CC9999; color: black; + } + tr.d1 td { + background-color: #9999CC; color: black; + } + + "} - dat += "

    Please configure your pAI personality's options. Remember, what you enter here could determine whether or not the user requesting a personality chooses you!

    " - dat += "
    [adm_ckey] \[-\][D.rank.name]
    " - dat += "" - dat += "" + dat += "

    Please configure your pAI personality's options. Remember, what you enter here could determine whether or not the user requesting a personality chooses you!

    " + dat += "
    Name:[candidate.name]
    \[Edit\]What you plan to call yourself. Suggestions: Any character name you would choose for a station character OR an AI.
    " + dat += "" + dat += "" - dat += "" - dat += "" + dat += "" + dat += "" - dat += "" - dat += "" + dat += "" + dat += "" - dat += "" - dat += "" + dat += "" + dat += "" - dat += "
    Name:[candidate.name]
    \[Edit\]What you plan to call yourself. Suggestions: Any character name you would choose for a station character OR an AI.
    Description:[candidate.description]
    \[Edit\]What sort of pAI you typically play; your mannerisms, your quirks, etc. This can be as sparse or as detailed as you like.
    Description:[candidate.description]
    \[Edit\]What sort of pAI you typically play; your mannerisms, your quirks, etc. This can be as sparse or as detailed as you like.
    Preferred Role:[candidate.role]
    \[Edit\]Do you like to partner with sneaky social ninjas? Like to help security hunt down thugs? Enjoy watching an engineer's back while he saves the station yet again? This doesn't have to be limited to just station jobs. Pretty much any general descriptor for what you'd like to be doing works here.
    Preferred Role:[candidate.role]
    \[Edit\]Do you like to partner with sneaky social ninjas? Like to help security hunt down thugs? Enjoy watching an engineer's back while he saves the station yet again? This doesn't have to be limited to just station jobs. Pretty much any general descriptor for what you'd like to be doing works here.
    OOC Comments:[candidate.comments]
    \[Edit\]Anything you'd like to address specifically to the player reading this in an OOC manner. \"I prefer more serious RP.\", \"I'm still learning the interface!\", etc. Feel free to leave this blank if you want.
    OOC Comments:[candidate.comments]
    \[Edit\]Anything you'd like to address specifically to the player reading this in an OOC manner. \"I prefer more serious RP.\", \"I'm still learning the interface!\", etc. Feel free to leave this blank if you want.
    " + dat += "" - dat += "
    " - dat += "

    Submit Personality


    " - dat += "Save Personality
    " - dat += "Load Personality
    " + dat += "
    " + dat += "

    Submit Personality


    " + dat += "Save Personality
    " + dat += "Load Personality
    " - M << browse(dat, "window=paiRecruit") + M << browse(dat, "window=paiRecruit") - proc/findPAI(var/obj/item/device/paicard/p, var/mob/user) - requestRecruits() - var/list/available = list() - for(var/datum/paiCandidate/c in paiController.pai_candidates) - if(c.ready) - var/found = 0 - for(var/mob/dead/observer/o in player_list) - if(o.key == c.key) - found = 1 - if(found) - available.Add(c) - var/dat = "" +/datum/paiController/proc/findPAI(var/obj/item/device/paicard/p, var/mob/user) + requestRecruits() + var/list/available = list() + for(var/datum/paiCandidate/c in paiController.pai_candidates) + if(c.ready) + var/found = 0 + for(var/mob/dead/observer/o in player_list) + if(o.key == c.key) + found = 1 + if(found) + available.Add(c) + var/dat = "" - dat += {" - - "} - dat += "

    Requesting AI personalities from central database... If there are no entries, or if a suitable entry is not listed, check again later as more personalities may be added.

    " + tr.d0 td { + background-color: #CC9999; color: black; + } + tr.d1 td { + background-color: #9999CC; color: black; + } + tr.d2 td { + background-color: #99CC99; color: black; + } + + "} + dat += "

    Requesting AI personalities from central database... If there are no entries, or if a suitable entry is not listed, check again later as more personalities may be added.

    " - dat += "" + dat += "
    " - for(var/datum/paiCandidate/c in available) - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" + for(var/datum/paiCandidate/c in available) + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" - dat += "
    Name:[c.name]
    Description:[c.description]
    Preferred Role:[c.role]
    OOC Comments:[c.comments]
    \[Download [c.name]\]
    Name:[c.name]
    Description:[c.description]
    Preferred Role:[c.role]
    OOC Comments:[c.comments]
    \[Download [c.name]\]
    " + dat += "" - user << browse(dat, "window=findPai") + user << browse(dat, "window=findPai") - proc/requestRecruits() - for(var/mob/dead/observer/O in player_list) - if(jobban_isbanned(O, "pAI")) +/datum/paiController/proc/requestRecruits() + for(var/mob/dead/observer/O in player_list) + if(jobban_isbanned(O, "pAI")) + continue + if(asked.Find(O.key)) + if(world.time < asked[O.key] + askDelay) continue - if(asked.Find(O.key)) - if(world.time < asked[O.key] + askDelay) - continue - else - asked.Remove(O.key) - if(O.client) - var/hasSubmitted = 0 - for(var/datum/paiCandidate/c in paiController.pai_candidates) - if(c.key == O.key) - hasSubmitted = 1 - if(!hasSubmitted && (O.client.prefs.be_special & BE_PAI)) - question(O.client) + else + asked.Remove(O.key) + if(O.client) + var/hasSubmitted = 0 + for(var/datum/paiCandidate/c in paiController.pai_candidates) + if(c.key == O.key) + hasSubmitted = 1 + if(!hasSubmitted && (O.client.prefs.be_special & BE_PAI)) + question(O.client) - proc/question(var/client/C) - spawn(0) - if(!C) return - asked.Add(C.key) - asked[C.key] = world.time - var/response = alert(C, "Someone is requesting a pAI personality. Would you like to play as a personal AI?", "pAI Request", "Yes", "No", "Never for this round") - if(!C) return //handle logouts that happen whilst the alert is waiting for a response. - if(response == "Yes") - recruitWindow(C.mob) - else if (response == "Never for this round") - asked[C.key] = INFINITY +/datum/paiController/proc/question(var/client/C) + spawn(0) + if(!C) return + asked.Add(C.key) + asked[C.key] = world.time + var/response = alert(C, "Someone is requesting a pAI personality. Would you like to play as a personal AI?", "pAI Request", "Yes", "No", "Never for this round") + if(!C) return //handle logouts that happen whilst the alert is waiting for a response. + if(response == "Yes") + recruitWindow(C.mob) + else if (response == "Never for this round") + asked[C.key] = INFINITY diff --git a/code/modules/mob/living/silicon/pai/say.dm b/code/modules/mob/living/silicon/pai/say.dm index d314224682b..4b1cd2c1626 100644 --- a/code/modules/mob/living/silicon/pai/say.dm +++ b/code/modules/mob/living/silicon/pai/say.dm @@ -1,18 +1,3 @@ -/mob/living/silicon/pai/say_understands(var/other) - if (istype(other, /mob/living/carbon/human)) - return 1 - if (istype(other, /mob/living/silicon/robot)) - return 1 - if (istype(other, /mob/living/silicon/pai)) - return 1 - if (istype(other, /mob/living/silicon/ai)) - return 1 - if (istype(other, /mob/living/silicon/decoy)) - return 1 - if (istype(other, /mob/living/carbon/brain)) - return 1 - return ..() - /mob/living/silicon/pai/say_quote(var/text) var/ending = copytext(text, length(text)) @@ -27,4 +12,7 @@ if(silence_time) src << "Communication circuits remain unitialized." else - ..(msg) \ No newline at end of file + ..(msg) + +/mob/living/silicon/pai/binarycheck() + return 0 diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 404d55a80ba..eb72fb2b9f8 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -242,7 +242,7 @@ src.medHUD = !src.medHUD if("translator") if(href_list["toggle"]) - src.universal_speak = !src.universal_speak + languages = languages == ALL ? HUMAN & ROBOT : ALL if("doorjack") if(href_list["jack"]) if(src.cable && src.cable.machine) @@ -254,7 +254,7 @@ var/turf/T = get_turf(src.loc) src.cable = new /obj/item/weapon/pai_cable(T) for (var/mob/M in viewers(T)) - M.show_message("\red A port on [src] opens to reveal [src.cable], which promptly falls to the floor.", 3, "\red You hear the soft click of something light and hard falling to the ground.", 2) + M.show_message("A port on [src] opens to reveal [src.cable], which promptly falls to the floor.", 3, "You hear the soft click of something light and hard falling to the ground.", 2) //src.updateUsrDialog() We only need to account for the single mob this is intended for, and he will *always* be able to call this window src.paiInterface() // So we'll just call the update directly rather than doing some default checks return @@ -301,7 +301,7 @@ if(s == "medical HUD") dat += "Medical Analysis Suite[(src.medHUD) ? " On" : " Off"]
    " if(s == "universal translator") - dat += "Universal Translator[(src.universal_speak) ? " On" : " Off"]
    " + dat += "Universal Translator[(languages == ALL) ? " On" : " Off"]
    " if(s == "projection array") dat += "Projection Array
    " if(s == "camera jack") @@ -362,7 +362,7 @@ if(answer == "Yes") var/turf/T = get_turf(P.loc) for (var/mob/v in viewers(T)) - v.show_message("\blue [M] presses \his thumb against [P].", 3, "\blue [P] makes a sharp clicking sound as it extracts DNA material from [M].", 2) + v.show_message("[M] presses \his thumb against [P].", 3, "[P] makes a sharp clicking sound as it extracts DNA material from [M].", 2) if(!check_dna_integrity(M)) P << "No DNA detected" return @@ -454,7 +454,7 @@ /mob/living/silicon/pai/proc/softwareTranslator() . = {"

    Universal Translator


    When enabled, this device will automatically convert all spoken and written language into a format that any known recipient can understand.

    - The device is currently [ (src.universal_speak) ? "en" : "dis" ]abled.
    + The device is currently [ (languages == ALL) ? "en" : "dis" ]abled.
    Toggle Device
    "} return . diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 0a902e97fad..e5634f9708c 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -198,7 +198,7 @@ src << "Help for cyborg emotes. You can use these emotes with say \"*emote\":\n\naflap, beep-(none)/mob, bow-(none)/mob, buzz-(none)/mob, clap, custom, deathgasp, flap, glare-(none)/mob, look-(none)/mob, me, nod, ping-(none)/mob, \nsalute-(none)/mob, twitch, twitch_s," else - src << "\blue Unusable emote '[act]'. Say *help for a list." + src << "Unusable emote '[act]'. Say *help for a list." if ((message && src.stat == 0)) if (m_type & 1) @@ -207,4 +207,4 @@ else for(var/mob/O in hearers(src, null)) O.show_message(message, m_type) - return \ No newline at end of file + return diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 0218d44432c..59106208f25 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -26,7 +26,6 @@ var/module_state_2 = null var/module_state_3 = null - var/obj/item/device/radio/borg/radio = null var/mob/living/silicon/ai/connected_ai = null var/obj/item/weapon/stock_parts/cell/cell = null var/obj/machinery/camera/camera = null @@ -41,7 +40,7 @@ var/list/req_access = list(access_robotics) var/ident = 0 //var/list/laws = list() - var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list()) + var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list()) var/viewalerts = 0 var/modtype = "robot" var/lower_mod = 0 @@ -57,7 +56,9 @@ var/obj/item/weapon/tank/internal = null //Hatred. Used if a borg has a jetpack. var/obj/item/robot_parts/robot_suit/robot_suit = null //Used for deconstruction to remember what the borg was constructed out of.. - + var/obj/item/device/camera/siliconcam/aicamera = null //photography + var/toner = 0 + var/tonermax = 40 /mob/living/silicon/robot/New(loc) @@ -113,7 +114,8 @@ mmi.contents += mmi.brainmob playsound(loc, 'sound/voice/liveagain.ogg', 75, 1) - + aicamera = new/obj/item/device/camera/siliconcam/robot_camera(src) + toner = 40 //If there's an MMI in the robot, have it ejected when the mob goes away. --NEO //Improved /N @@ -408,7 +410,7 @@ updatehealth() add_fingerprint(user) for(var/mob/O in viewers(user, null)) - O.show_message(text("\red [user] has fixed some of the dents on [src]!"), 1) + O.show_message(text("[user] has fixed some of the dents on [src]!"), 1) else user << "Need more welding fuel!" return @@ -419,7 +421,7 @@ adjustFireLoss(-30) updatehealth() for(var/mob/O in viewers(user, null)) - O.show_message(text("\red [user] has fixed some of the burnt wires on [src]!"), 1) + O.show_message(text("[user] has fixed some of the burnt wires on [src]!"), 1) else user << "You need one length of cable to repair [src]." @@ -469,13 +471,13 @@ else if(istype(W, /obj/item/weapon/wrench) && opened && !cell) //Deconstruction. The flashes break from the fall, to prevent this from being a ghetto reset module. if(!lockcharge) - user << "\red [src]'s bolts spark! Maybe you should lock them down first!" + user << "[src]'s bolts spark! Maybe you should lock them down first!" spark_system.start() return else playsound(src, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 50) && !cell) - user.visible_message("\red [user] deconstructs [src]!", "\blue You unfasten the securing bolts, and [src] falls to pieces!") + user.visible_message("[user] deconstructs [src]!", "You unfasten the securing bolts, and [src] falls to pieces!") deconstruct() else if(istype(W, /obj/item/device/encryptionkey/) && opened) @@ -495,7 +497,7 @@ user << "You [ locked ? "lock" : "unlock"] [src]'s cover." updateicon() else - user << "\red Access denied." + user << "Access denied." else if(istype(W, /obj/item/weapon/card/emag)) // trying to unlock with an emag card if(user != src)//To prevent syndieborgs from emagging themselves @@ -532,22 +534,22 @@ var/time = time2text(world.realtime,"hh:mm:ss") lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])") set_zeroth_law("Only [user.real_name] and people he designates as being such are Syndicate Agents.") - src << "\red ALERT: Foreign software detected." + src << "ALERT: Foreign software detected." sleep(5) - src << "\red Initiating diagnostics..." + src << "Initiating diagnostics..." sleep(20) - src << "\red SynBorg v1.7 loaded." + src << "SynBorg v1.7 loaded." sleep(5) - src << "\red LAW SYNCHRONISATION ERROR" + src << "LAW SYNCHRONISATION ERROR" sleep(5) - src << "\red Would you like to send a report to NanoTraSoft? Y/N" + src << "Would you like to send a report to NanoTraSoft? Y/N" sleep(10) - src << "\red > N" + src << "> N" sleep(20) - src << "\red ERRORERRORERROR" + src << "ERRORERRORERROR" src << "Obey these laws:" laws.show_laws(src) - src << "\red \b ALERT: [user.real_name] is your new master. Obey your new laws and his commands." + src << "ALERT: [user.real_name] is your new master. Obey your new laws and his commands." updateicon() else user << "You fail to [ locked ? "unlock" : "lock"] [src]'s interface." @@ -571,6 +573,14 @@ else usr << "Upgrade error!" + else if(istype(W, /obj/item/device/toner)) + if(toner >= tonermax) + usr << "The toner level of [src] is at it's highest level possible" + else + toner = 40 + usr.drop_item() + qdel(W) + usr << "You fill the toner level of [src] to it's max capacity" else if(W.force) @@ -602,7 +612,7 @@ if ("help") for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) - O.show_message(text("\blue [M] caresses [src]'s plating with its scythe like arm."), 1) + O.show_message(text("[M] caresses [src]'s plating with its scythe like arm."), 1) if ("grab") if (M == src || anchored) @@ -615,7 +625,7 @@ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has grabbed [] passively!", M, src), 1) + O.show_message(text("[] has grabbed [] passively!", M, src), 1) if ("harm") var/damage = rand(10, 20) @@ -630,7 +640,7 @@ playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [] has slashed at []!", M, src), 1) + O.show_message(text("[] has slashed at []!", M, src), 1) if(prob(8)) flick("noise", flash) adjustBruteLoss(damage) @@ -639,7 +649,7 @@ playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] took a swipe at []!", M, src), 1) + O.show_message(text("[] took a swipe at []!", M, src), 1) if ("disarm") if(!(lying)) @@ -650,12 +660,12 @@ playsound(loc, 'sound/weapons/pierce.ogg', 50, 1, -1) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has forced back []!", M, src), 1) + O.show_message(text("[] has forced back []!", M, src), 1) else playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] attempted to force back []!", M, src), 1) + O.show_message(text("[] attempted to force back []!", M, src), 1) return @@ -671,7 +681,7 @@ for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) - O.show_message(text("\red The [M.name] glomps []!", src), 1) + O.show_message(text("The [M.name] glomps []!", src), 1) var/damage = rand(1, 3) @@ -702,7 +712,7 @@ for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) - O.show_message(text("\red The [M.name] has electrified []!", src), 1) + O.show_message(text("The [M.name] has electrified []!", src), 1) flick("noise", flash) @@ -725,7 +735,7 @@ if(M.attack_sound) playsound(loc, M.attack_sound, 50, 1, 1) for(var/mob/O in viewers(src, null)) - O.show_message("\red [M] [M.attacktext] [src]!", 1) + O.show_message("[M] [M.attacktext] [src]!", 1) add_logs(M, src, "attacked", admin=0) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) adjustBruteLoss(damage) @@ -949,7 +959,7 @@ cleaned_human.shoes.clean_blood() cleaned_human.update_inv_shoes(0) cleaned_human.clean_blood() - cleaned_human << "\red [src] cleans your face!" + cleaned_human << "[src] cleans your face!" return /mob/living/silicon/robot/proc/self_destruct() diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 819101c1a70..e9faf2b07f2 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -61,176 +61,177 @@ /obj/item/weapon/robot_module/standard name = "standard robot module" - New() - ..() - modules += new /obj/item/weapon/melee/baton/loaded(src) - modules += new /obj/item/weapon/extinguisher(src) - modules += new /obj/item/weapon/wrench(src) - modules += new /obj/item/weapon/crowbar(src) - modules += new /obj/item/device/healthanalyzer(src) - emag = new /obj/item/weapon/melee/energy/sword(src) +/obj/item/weapon/robot_module/standard/New() + ..() + modules += new /obj/item/weapon/melee/baton/loaded(src) + modules += new /obj/item/weapon/extinguisher(src) + modules += new /obj/item/weapon/wrench(src) + modules += new /obj/item/weapon/crowbar(src) + modules += new /obj/item/device/healthanalyzer(src) + emag = new /obj/item/weapon/melee/energy/sword(src) /obj/item/weapon/robot_module/medical name = "medical robot module" - New() - ..() - modules += new /obj/item/borg/sight/hud/med(src) - modules += new /obj/item/device/healthanalyzer(src) - modules += new /obj/item/weapon/reagent_containers/borghypo(src) - modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) - modules += new /obj/item/weapon/reagent_containers/dropper(src) - modules += new /obj/item/weapon/reagent_containers/syringe(src) - modules += new /obj/item/weapon/extinguisher/mini(src) - emag = new /obj/item/weapon/reagent_containers/spray(src) +/obj/item/weapon/robot_module/medical/New() + ..() + modules += new /obj/item/borg/sight/hud/med(src) + modules += new /obj/item/device/healthanalyzer(src) + modules += new /obj/item/weapon/reagent_containers/borghypo(src) + modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) + modules += new /obj/item/weapon/reagent_containers/dropper(src) + modules += new /obj/item/weapon/reagent_containers/syringe(src) + modules += new /obj/item/weapon/extinguisher/mini(src) + emag = new /obj/item/weapon/reagent_containers/spray(src) - emag.reagents.add_reagent("pacid", 250) - emag.name = "polyacid spray" + emag.reagents.add_reagent("pacid", 250) + emag.name = "polyacid spray" /obj/item/weapon/robot_module/engineering name = "engineering robot module" - New() - ..() - modules += new /obj/item/borg/sight/meson(src) - emag = new /obj/item/borg/stun(src) - modules += new /obj/item/weapon/rcd/borg(src) - modules += new /obj/item/weapon/extinguisher(src) - modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src) - modules += new /obj/item/weapon/screwdriver(src) - modules += new /obj/item/weapon/wrench(src) - modules += new /obj/item/weapon/crowbar(src) - modules += new /obj/item/weapon/wirecutters(src) - modules += new /obj/item/device/multitool(src) - modules += new /obj/item/device/t_scanner(src) - modules += new /obj/item/device/analyzer(src) +/obj/item/weapon/robot_module/engineering/New() + ..() + modules += new /obj/item/borg/sight/meson(src) + emag = new /obj/item/borg/stun(src) + modules += new /obj/item/weapon/rcd/borg(src) + modules += new /obj/item/weapon/extinguisher(src) + modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src) + modules += new /obj/item/weapon/screwdriver(src) + modules += new /obj/item/weapon/wrench(src) + modules += new /obj/item/weapon/crowbar(src) + modules += new /obj/item/weapon/wirecutters(src) + modules += new /obj/item/device/multitool(src) + modules += new /obj/item/device/t_scanner(src) + modules += new /obj/item/device/analyzer(src) - var/datum/robot_energy_storage/metal/metstore = new /datum/robot_energy_storage/metal(src) - var/datum/robot_energy_storage/glass/glastore = new /datum/robot_energy_storage/glass(src) - var/datum/robot_energy_storage/wire/wirestore = new /datum/robot_energy_storage/wire(src) + var/datum/robot_energy_storage/metal/metstore = new /datum/robot_energy_storage/metal(src) + var/datum/robot_energy_storage/glass/glastore = new /datum/robot_energy_storage/glass(src) + var/datum/robot_energy_storage/wire/wirestore = new /datum/robot_energy_storage/wire(src) - var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src) - M.source = metstore - modules += M + var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src) + M.source = metstore + modules += M - var/obj/item/stack/sheet/glass/cyborg/Q = new /obj/item/stack/sheet/glass/cyborg(src) - Q.source = glastore - modules += Q + var/obj/item/stack/sheet/glass/cyborg/Q = new /obj/item/stack/sheet/glass/cyborg(src) + Q.source = glastore + modules += Q - var/obj/item/stack/sheet/rglass/cyborg/G = new /obj/item/stack/sheet/rglass/cyborg(src) - G.metsource = metstore - G.glasource = glastore - modules += G + var/obj/item/stack/sheet/rglass/cyborg/G = new /obj/item/stack/sheet/rglass/cyborg(src) + G.metsource = metstore + G.glasource = glastore + modules += G - var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) - R.source = metstore - modules += R + var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) + R.source = metstore + modules += R - var/obj/item/stack/cable_coil/cyborg/W = new /obj/item/stack/cable_coil/cyborg(src) - W.source = wirestore - modules += W + var/obj/item/stack/cable_coil/cyborg/W = new /obj/item/stack/cable_coil/cyborg(src) + W.source = wirestore + modules += W - var/obj/item/stack/tile/plasteel/cyborg/F = new /obj/item/stack/tile/plasteel/cyborg(src) //"Plasteel" is the normal metal floor tile, Don't be confused - RR - F.source = metstore - modules += F //'F' for floor tile - RR(src) + var/obj/item/stack/tile/plasteel/cyborg/F = new /obj/item/stack/tile/plasteel/cyborg(src) //"Plasteel" is the normal metal floor tile, Don't be confused - RR + F.source = metstore + modules += F //'F' for floor tile - RR(src) - storages += metstore - storages += glastore - storages += wirestore + storages += metstore + storages += glastore + storages += wirestore /obj/item/weapon/robot_module/security name = "security robot module" - New() - ..() - modules += new /obj/item/borg/sight/hud/sec(src) - modules += new /obj/item/weapon/handcuffs/cyborg(src) - modules += new /obj/item/weapon/melee/baton/loaded(src) - modules += new /obj/item/weapon/gun/energy/taser/cyborg(src) - modules += new /obj/item/clothing/mask/gas/sechailer/cyborg(src) - emag = new /obj/item/weapon/gun/energy/laser/cyborg(src) +/obj/item/weapon/robot_module/security/New() + ..() + modules += new /obj/item/borg/sight/hud/sec(src) + modules += new /obj/item/weapon/handcuffs/cyborg(src) + modules += new /obj/item/weapon/melee/baton/loaded(src) + modules += new /obj/item/weapon/gun/energy/taser/cyborg(src) + modules += new /obj/item/clothing/mask/gas/sechailer/cyborg(src) + emag = new /obj/item/weapon/gun/energy/laser/cyborg(src) /obj/item/weapon/robot_module/janitor name = "janitorial robot module" - New() - ..() - modules += new /obj/item/weapon/soap/nanotrasen(src) - modules += new /obj/item/weapon/storage/bag/trash/cyborg(src) - modules += new /obj/item/weapon/mop/cyborg(src) - modules += new /obj/item/device/lightreplacer/cyborg(src) - emag = new /obj/item/weapon/reagent_containers/spray(src) +/obj/item/weapon/robot_module/janitor/New() + ..() + modules += new /obj/item/weapon/soap/nanotrasen(src) + modules += new /obj/item/weapon/storage/bag/trash/cyborg(src) + modules += new /obj/item/weapon/mop/cyborg(src) + modules += new /obj/item/device/lightreplacer/cyborg(src) + emag = new /obj/item/weapon/reagent_containers/spray(src) - emag.reagents.add_reagent("lube", 250) - emag.name = "lube spray" + emag.reagents.add_reagent("lube", 250) + emag.name = "lube spray" /obj/item/weapon/robot_module/butler name = "service robot module" - New() - ..() - modules += new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src) - modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src) - modules += new /obj/item/weapon/pen(src) - modules += new /obj/item/weapon/razor(src) - modules += new /obj/item/device/violin(src) +/obj/item/weapon/robot_module/butler/New() + ..() + modules += new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src) + modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src) + modules += new /obj/item/weapon/pen(src) + modules += new /obj/item/weapon/razor(src) + modules += new /obj/item/device/violin(src) - var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src) - M.matter = 30 - modules += M + var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src) + M.matter = 30 + modules += M - modules += new /obj/item/weapon/reagent_containers/dropper(src) + modules += new /obj/item/weapon/reagent_containers/dropper(src) - var/obj/item/weapon/lighter/zippo/L = new /obj/item/weapon/lighter/zippo(src) - L.lit = 1 - modules += L + var/obj/item/weapon/lighter/zippo/L = new /obj/item/weapon/lighter/zippo(src) + L.lit = 1 + modules += L - modules += new /obj/item/weapon/storage/bag/tray(src) - modules += new /obj/item/weapon/reagent_containers/borghypo/borgshaker(src) - emag = new /obj/item/weapon/reagent_containers/borghypo/borgshaker/hacked(src) + modules += new /obj/item/weapon/storage/bag/tray(src) + modules += new /obj/item/weapon/reagent_containers/borghypo/borgshaker(src) + emag = new /obj/item/weapon/reagent_containers/borghypo/borgshaker/hacked(src) /obj/item/weapon/robot_module/miner name = "miner robot module" - New() - ..() - var/mob/living/silicon/robot/R = loc - modules += new /obj/item/borg/sight/meson(src) - emag = new /obj/item/borg/stun(src) - modules += new /obj/item/weapon/storage/bag/ore(src) - if(R.emagged) - modules += new /obj/item/weapon/pickaxe/diamonddrill(src) - else - modules += new /obj/item/weapon/pickaxe/borgdrill(src) - modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src) - modules += new /obj/item/device/mining_scanner(src) - modules += new /obj/item/weapon/gun/energy/kinetic_accelerator(src) - on_emag() - ..() - for(var/obj/item/weapon/pickaxe/borgdrill/D in modules) - qdel(D) +/obj/item/weapon/robot_module/miner/New() + ..() + var/mob/living/silicon/robot/R = loc + modules += new /obj/item/borg/sight/meson(src) + emag = new /obj/item/borg/stun(src) + modules += new /obj/item/weapon/storage/bag/ore(src) + if(R.emagged) modules += new /obj/item/weapon/pickaxe/diamonddrill(src) - rebuild() + else + modules += new /obj/item/weapon/pickaxe/borgdrill(src) + modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src) + modules += new /obj/item/device/mining_scanner(src) + modules += new /obj/item/weapon/gun/energy/kinetic_accelerator(src) + +/obj/item/weapon/robot_module/miner/on_emag() + ..() + for(var/obj/item/weapon/pickaxe/borgdrill/D in modules) + qdel(D) + modules += new /obj/item/weapon/pickaxe/diamonddrill(src) + rebuild() /obj/item/weapon/robot_module/syndicate name = "syndicate robot module" - New() - ..() - modules += new /obj/item/weapon/melee/energy/sword/cyborg(src) - modules += new /obj/item/weapon/gun/energy/crossbow/cyborg(src) - modules += new /obj/item/weapon/card/emag(src) - modules += new /obj/item/weapon/gun/energy/laser/cyborg(src) - modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src) - modules += new /obj/item/weapon/crowbar(src) - emag = null +/obj/item/weapon/robot_module/syndicate/New() + ..() + modules += new /obj/item/weapon/melee/energy/sword/cyborg(src) + modules += new /obj/item/weapon/gun/energy/crossbow/cyborg(src) + modules += new /obj/item/weapon/card/emag(src) + modules += new /obj/item/weapon/gun/energy/laser/cyborg(src) + modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src) + modules += new /obj/item/weapon/crowbar(src) + emag = null /datum/robot_energy_storage var/name = "Generic energy storage" diff --git a/code/modules/mob/living/silicon/robot/say.dm b/code/modules/mob/living/silicon/robot/say.dm index 065a23bd8bf..7c252092b3e 100644 --- a/code/modules/mob/living/silicon/robot/say.dm +++ b/code/modules/mob/living/silicon/robot/say.dm @@ -1,18 +1,3 @@ -/mob/living/silicon/robot/say_understands(var/other) - if (istype(other, /mob/living/silicon/ai)) - return 1 - if (istype(other, /mob/living/silicon/decoy)) - return 1 - if (istype(other, /mob/living/carbon/human)) - return 1 - if (istype(other, /mob/living/carbon/brain)) - return 1 - if (istype(other, /mob/living/silicon/pai)) - return 1 -// if (istype(other, /mob/living/silicon/hivebot)) -// return 1 - return ..() - /mob/living/silicon/robot/say_quote(var/text) var/ending = copytext(text, length(text)) @@ -24,4 +9,4 @@ return "states, \"[text]\""; /mob/living/silicon/robot/IsVocal() - return !config.silent_borg \ No newline at end of file + return !config.silent_borg diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 06b452e6d59..d23561abee5 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -1,13 +1,13 @@ /mob/living/silicon gender = NEUTER - robot_talk_understand = 1 voice_name = "synthesized voice" + languages = ROBOT | HUMAN var/syndicate = 0 var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS var/list/alarms_to_show = list() var/list/alarms_to_clear = list() var/designation = "" - + var/obj/item/device/radio/borg/radio = null //AIs dont use this but this is at the silicon level to advoid copypasta in say() var/list/alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) var/list/alarm_types_clear = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) @@ -31,7 +31,7 @@ alarm_types_clear[type] += 1 if(!in_cooldown) - spawn(3 * 10) // 10 seconds + spawn(3 * 10) // 3 seconds if(alarms_to_show.len < 5) for(var/msg in alarms_to_show) @@ -40,6 +40,9 @@ var/msg = "--- " + if(alarm_types_show["Burglar"]) + msg += "BURGLAR: [alarm_types_show["Burglar"]] alarms detected. - " + if(alarm_types_show["Motion"]) msg += "MOTION: [alarm_types_show["Motion"]] alarms detected. - " @@ -103,8 +106,8 @@ src.take_organ_damage(10) Stun(3) flick("noise", src:flash) - src << "\red *BZZZT*" - src << "\red Warning: Electromagnetic pulse detected." + src << "*BZZZT*" + src << "Warning: Electromagnetic pulse detected." ..() /mob/living/silicon/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0) diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index f38bfcb81c6..9ad3606dcb7 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -58,13 +58,13 @@ //helmet and armor = 100% protection if( istype(inventory_head,/obj/item/clothing/head/helmet) && istype(inventory_back,/obj/item/clothing/suit/armor) ) if( O.force ) - usr << "\red [src] is wearing too much armor. You can't cause \him any damage." + usr << "[src] is wearing too much armor. You can't cause \him any damage." for (var/mob/M in viewers(src, null)) M.show_message("\red \b [user] hits [src] with [O], however [src] is too armored.") else - usr << "\red [src] is wearing too much armor. You can't reach \his skin." + usr << "[src] is wearing too much armor. You can't reach \his skin." for (var/mob/M in viewers(src, null)) - M.show_message("\red [user] gently taps [src] with [O]. ") + M.show_message("[user] gently taps [src] with [O].") if(health>0 && prob(15)) emote("looks at [user] with [pick("an amused","an annoyed","a confused","a resentful", "a happy", "an excited")] expression") return @@ -93,7 +93,7 @@ inventory_head = null regenerate_icons() else - usr << "\red There is nothing to remove from its [remove_from]." + usr << "There is nothing to remove from its [remove_from]." return if("back") if(inventory_back) @@ -101,7 +101,7 @@ inventory_back = null regenerate_icons() else - usr << "\red There is nothing to remove from its [remove_from]." + usr << "There is nothing to remove from its [remove_from]." return show_inv(usr) @@ -119,13 +119,13 @@ if("back") if(inventory_back) - usr << "\red It's already wearing something." + usr << "It's already wearing something." return else var/obj/item/item_to_add = usr.get_active_hand() if(!item_to_add) - usr.visible_message("\blue [usr] pets [src]","\blue You rest your hand on [src]'s back for a moment.") + usr.visible_message("[usr] pets [src]","You rest your hand on [src]'s back for a moment.") return if(istype(item_to_add,/obj/item/weapon/plastique)) // last thing he ever wears, I guess item_to_add.afterattack(src,usr,1) @@ -174,10 +174,10 @@ return if(inventory_head) - if(usr) usr << "\red You can't put more than one hat on [src]!" + if(usr) usr << "You can't put more than one hat on [src]!" return if(!item_to_add) - usr.visible_message("\blue [usr] pets [src]","\blue You rest your hand on [src]'s head for a moment.") + usr.visible_message("[usr] pets [src]","You rest your hand on [src]'s head for a moment.") return @@ -306,7 +306,9 @@ valid = 1 if(valid) - if(usr) + if(health <= 0) + usr << "There is merely a dull, lifeless look in [real_name]'s eyes as you put the [item_to_add] on \him." + else if(usr) if(!usr.drop_item()) usr << "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!" return 0 @@ -426,7 +428,7 @@ /mob/living/simple_animal/corgi/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri if(istype(O, /obj/item/weapon/newspaper)) if(!stat) - user.visible_message("\blue [user] baps [name] on the nose with the rolled up [O]") + user.visible_message("[user] baps [name] on the nose with the rolled up [O]") spawn(0) for(var/i in list(1,2,4,8,4,2,1,2)) dir = i @@ -476,7 +478,7 @@ //puppies cannot wear anything. /mob/living/simple_animal/corgi/puppy/Topic(href, href_list) if(href_list["remove_inv"] || href_list["add_inv"]) - usr << "\red You can't fit this on [src]" + usr << "You can't fit this on [src]" return ..() @@ -499,7 +501,7 @@ //Lisa already has a cute bow! /mob/living/simple_animal/corgi/Lisa/Topic(href, href_list) if(href_list["remove_inv"] || href_list["add_inv"]) - usr << "\red [src] already has a cute bow!" + usr << "[src] already has a cute bow!" return ..() diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 1b462749cf1..36be2f583d4 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -41,7 +41,7 @@ if(enemies.len && prob(10)) enemies = list() LoseTarget() - src.visible_message("\blue [src] calms down.") + src.visible_message("[src] calms down.") if(stat == CONSCIOUS) if(udder && prob(5)) @@ -60,7 +60,7 @@ /mob/living/simple_animal/hostile/retaliate/goat/Retaliate() ..() - src.visible_message("\red [src] gets an evil-looking gleam in \his eye.") + src.visible_message("[src] gets an evil-looking gleam in \his eye.") /mob/living/simple_animal/hostile/retaliate/goat/Move() ..() @@ -76,9 +76,9 @@ var/obj/item/weapon/reagent_containers/glass/G = O var/transfered = udder.trans_id_to(G, "milk", rand(5,10)) if(G.reagents.total_volume >= G.volume) - user << "\red [O] is full." + user << "[O] is full." if(!transfered) - user << "\red The udder is dry. Wait a bit longer..." + user << "The udder is dry. Wait a bit longer..." else ..() //cow @@ -116,9 +116,9 @@ var/obj/item/weapon/reagent_containers/glass/G = O var/transfered = udder.trans_id_to(G, "milk", rand(5,10)) if(G.reagents.total_volume >= G.volume) - user << "\red [O] is full." + user << "[O] is full." if(!transfered) - user << "\red The udder is dry. Wait a bit longer..." + user << "The udder is dry. Wait a bit longer..." else ..() @@ -228,13 +228,13 @@ var/global/chicken_count = 0 /mob/living/simple_animal/chicken/attackby(var/obj/item/O as obj, var/mob/user as mob) if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/wheat)) //feedin' dem chickens if(!stat && eggsleft < 8) - user.visible_message("\blue [user] feeds [O] to [name]! It clucks happily.","\blue You feed [O] to [name]! It clucks happily.") + user.visible_message("[user] feeds [O] to [name]! It clucks happily.","You feed [O] to [name]! It clucks happily.") user.drop_item() qdel(O) eggsleft += rand(1, 4) //world << eggsleft else - user << "\blue [name] doesn't seem hungry!" + user << "[name] doesn't seem hungry!" else ..() diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 6b3751e633f..4e5960eef1c 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -46,7 +46,7 @@ if( ishuman(AM) ) if(!stat) var/mob/M = AM - M << "\blue \icon[src] Squeek!" + M << "\icon[src] Squeek!" playsound(src, 'sound/effects/mousesqueek.ogg', 100, 1) ..() diff --git a/code/modules/mob/living/simple_animal/friendly/pug.dm b/code/modules/mob/living/simple_animal/friendly/pug.dm index b008220cfac..86c36adf2ff 100644 --- a/code/modules/mob/living/simple_animal/friendly/pug.dm +++ b/code/modules/mob/living/simple_animal/friendly/pug.dm @@ -33,7 +33,7 @@ /mob/living/simple_animal/pug/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri if(istype(O, /obj/item/weapon/newspaper)) if(!stat) - user.visible_message("\blue [user] baps [name] on the nose with the rolled up [O]") + user.visible_message("[user] baps [name] on the nose with the rolled up [O]") spawn(0) for(var/i in list(1,2,4,8,4,2,1,2)) dir = i diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index af38509f429..2c161d443e4 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -72,7 +72,7 @@ if(L.reagents) L.reagents.add_reagent("toxin", poison_per_bite) if(prob(poison_per_bite)) - L << "\red You feel a tiny prick." + L << "You feel a tiny prick." L.reagents.add_reagent(poison_type, 5) /mob/living/simple_animal/hostile/giant_spider/Life() @@ -132,7 +132,7 @@ var/obj/effect/spider/stickyweb/W = locate() in get_turf(src) if(!W) busy = SPINNING_WEB - src.visible_message("\blue \the [src] begins to secrete a sticky substance.") + src.visible_message("\the [src] begins to secrete a sticky substance.") stop_automated_movement = 1 spawn(40) if(busy == SPINNING_WEB) @@ -144,7 +144,7 @@ var/obj/effect/spider/eggcluster/E = locate() in get_turf(src) if(!E && fed > 0) busy = LAYING_EGGS - src.visible_message("\blue \the [src] begins to lay a cluster of eggs.") + src.visible_message("\the [src] begins to lay a cluster of eggs.") stop_automated_movement = 1 spawn(50) if(busy == LAYING_EGGS) @@ -172,7 +172,7 @@ else if(busy == MOVING_TO_TARGET && cocoon_target) if(get_dist(src, cocoon_target) <= 1) busy = SPINNING_COCOON - src.visible_message("\blue \the [src] begins to secrete a sticky substance around \the [cocoon_target].") + src.visible_message("\the [src] begins to secrete a sticky substance around \the [cocoon_target].") stop_automated_movement = 1 walk(src,0) spawn(50) @@ -187,7 +187,7 @@ continue large_cocoon = 1 fed++ - src.visible_message("\red \the [src] sticks a proboscis into \the [cocoon_target] and sucks a viscous substance out.") + src.visible_message("\the [src] sticks a proboscis into \the [cocoon_target] and sucks a viscous substance out.") M.loc = C C.pixel_x = M.pixel_x C.pixel_y = M.pixel_y diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 32362d58d4b..11bbfa8a561 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -81,12 +81,12 @@ var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() smoke.set_up(5, 0, src.loc) smoke.start() - visible_message("\red The [src] warps in!") + visible_message("The [src] warps in!") playsound(src.loc, 'sound/effects/EMPulse.ogg', 25, 1) warpbots() icon_state = "def_radar" - visible_message("\red The [src] turns on!") + visible_message("The [src] turns on!") while(bot_amt > 0) bot_amt-- switch(bot_type) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index ebdf71d9228..b59ae854e77 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -231,7 +231,7 @@ /mob/living/simple_animal/hostile/proc/OpenFire(var/the_target) var/target = the_target - visible_message("\red [src] [ranged_message] at [target]!", 1) + visible_message("[src] [ranged_message] at [target]!", 1) var/tturf = get_turf(target) if(rapid) diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 8535f93c7ce..a3854898ea1 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -43,7 +43,7 @@ /mob/living/simple_animal/hostile/mimic/Die() ..() - visible_message("\red [src] stops moving!") + visible_message("[src] stops moving!") qdel(src) @@ -196,7 +196,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca maxHealth = health if(creator) src.creator = creator - faction = list("\ref[creator]") // very unique + faction += "\ref[creator]" // very unique if(destroy_original) qdel(O) return 1 diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 20be126522d..8e1ff31edca 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -68,8 +68,8 @@ else visible_message("[src] blocks [O] with its shield!") else - usr << "\red This weapon is ineffective, it does no damage." - visible_message("\red [user] gently taps [src] with [O]. ") + usr << "This weapon is ineffective, it does no damage." + visible_message("[user] gently taps [src] with [O].") /mob/living/simple_animal/hostile/syndicate/melee/bullet_act(var/obj/item/projectile/Proj) @@ -78,7 +78,7 @@ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) src.health -= Proj.damage else - visible_message("\red [src] blocks [Proj] with its shield!") + visible_message("[src] blocks [Proj] with its shield!") return 0 @@ -160,6 +160,6 @@ /mob/living/simple_animal/hostile/viscerator/Die() ..() - visible_message("\red [src] is smashed into pieces!") + visible_message("[src] is smashed into pieces!") qdel(src) return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 45c787a6d6a..2e2f5ab0dc9 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -52,7 +52,7 @@ /mob/living/simple_animal/hostile/tree/Die() ..() - visible_message("\red [src] is hacked into pieces!") + visible_message("[src] is hacked into pieces!") new /obj/item/stack/sheet/mineral/wood(loc) qdel(src) @@ -66,6 +66,6 @@ /mob/living/simple_animal/hostile/tree/festivus/Die() ..() - visible_message("\red [src] is hacked into pieces!") + visible_message("[src] is hacked into pieces!") new /obj/item/stack/rods(loc) qdel(src) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 7b3b06ce6fb..f5e164ca75d 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -6,14 +6,9 @@ * AI * Procs / Verbs (usable by players) * Sub-types + * Hear & say (the things we do for gimmicks) */ -/*So you want to delete parrots eh? -heres the locations of their snowflake code: -lines 294-301 in living/say.dm (speech buffer) -135 in living/say.dm (parrots talking into headsets) -*/ - /* * Defines */ @@ -33,7 +28,7 @@ lines 294-301 in living/say.dm (speech buffer) /mob/living/simple_animal/parrot name = "parrot" - desc = "The parrot squaks, \"It's a Parrot! BAWWK!\"" + desc = "The parrot squaks, \"It's a Parrot! BAWWK!\"" //' icon = 'icons/mob/animal.dmi' icon_state = "parrot_fly" icon_living = "parrot_fly" @@ -128,6 +123,41 @@ lines 294-301 in living/say.dm (speech buffer) stat("Held Item", held_item) stat("Mode",a_intent) +/mob/living/simple_animal/parrot/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + if(speaker != src && prob(20)) //Dont imitate ourselves + if(speech_buffer.len >= 20) + speech_buffer -= pick(speech_buffer) + speech_buffer |= html_decode(raw_message) + ..() + +/mob/living/simple_animal/parrot/radio(message, message_mode) //literally copied from human/radio(), but there's no other way to do this. at least it's better than it used to be. + . = ..() + if(. != 0) + return . + + switch(message_mode) + if(MODE_HEADSET) + if (ears) + ears.talk_into(src, message) + return ITALICS | REDUCE_RANGE + + if(MODE_SECURE_HEADSET) + if (ears) + ears.talk_into(src, message, 1) + return ITALICS | REDUCE_RANGE + + if(MODE_DEPARTMENT) + if (ears) + ears.talk_into(src, message, message_mode) + return ITALICS | REDUCE_RANGE + + if(message_mode in radiochannels) + if(ears) + ears.talk_into(src, message, message_mode) + return ITALICS | REDUCE_RANGE + + return 0 + /* * Inventory */ @@ -167,21 +197,21 @@ lines 294-301 in living/say.dm (speech buffer) ears = null for(var/possible_phrase in speak) if(copytext(possible_phrase,1,3) in department_radio_keys) - possible_phrase = copytext(possible_phrase,3,length(possible_phrase)) + possible_phrase = copytext(possible_phrase,3) else - usr << "\red There is nothing to remove from its [remove_from]." + usr << "There is nothing to remove from its [remove_from]." return //Adding things to inventory else if(href_list["add_inv"]) var/add_to = href_list["add_inv"] if(!usr.get_active_hand()) - usr << "\red You have nothing in your hand to put on its [add_to]." + usr << "You have nothing in your hand to put on its [add_to]." return switch(add_to) if("ears") if(ears) - usr << "\red It's already wearing something." + usr << "It's already wearing something." return else var/obj/item/item_to_add = usr.get_active_hand() @@ -189,7 +219,7 @@ lines 294-301 in living/say.dm (speech buffer) return if( !istype(item_to_add, /obj/item/device/radio/headset) ) - usr << "\red This object won't fit." + usr << "This object won't fit." return var/obj/item/device/radio/headset/headset_to_add = item_to_add @@ -288,7 +318,7 @@ lines 294-301 in living/say.dm (speech buffer) user.drop_item() if(health < maxHealth) adjustBruteLoss(-10) - user << "\blue [src] eagerly devours the cracker." + user << "[src] eagerly devours the cracker." ..() return @@ -329,7 +359,7 @@ lines 294-301 in living/say.dm (speech buffer) //-----SPEECH /* Parrot speech mimickry! - Phrases that the parrot hears in mob/living/say() get added to speach_buffer. + Phrases that the parrot Hear()s get added to speach_buffer. Every once in a while, the parrot picks one of the lines from the buffer and replaces an element of the 'speech' list. Then it clears the buffer to make sure they dont magically remember something from hours ago. */ if(speech_buffer.len && prob(10)) @@ -372,9 +402,9 @@ lines 294-301 in living/say.dm (speech buffer) useradio = 1 if(copytext(possible_phrase,1,3) in department_radio_keys) - possible_phrase = "[useradio?pick(available_channels):""] [copytext(possible_phrase,3,length(possible_phrase)+1)]" //crop out the channel prefix + possible_phrase = "[useradio?pick(available_channels):""][copytext(possible_phrase,3)]" //crop out the channel prefix else - possible_phrase = "[useradio?pick(available_channels):""] [possible_phrase]" + possible_phrase = "[useradio?pick(available_channels):""][possible_phrase]" newspeak.Add(possible_phrase) @@ -452,7 +482,7 @@ lines 294-301 in living/say.dm (speech buffer) if(!parrot_perch || parrot_interest.loc != parrot_perch.loc) held_item = parrot_interest parrot_interest.loc = src - visible_message("[src] grabs [held_item]!", "\blue You grab [held_item]!", "You hear the sounds of wings flapping furiously.") + visible_message("[src] grabs [held_item]!", "You grab [held_item]!", "You hear the sounds of wings flapping furiously.") parrot_interest = null parrot_state = PARROT_SWOOP | PARROT_RETURN @@ -626,7 +656,7 @@ lines 294-301 in living/say.dm (speech buffer) return -1 if(held_item) - src << "\red You are already holding [held_item]" + src << "You are already holding [held_item]" return 1 for(var/obj/item/I in view(1,src)) @@ -639,10 +669,10 @@ lines 294-301 in living/say.dm (speech buffer) held_item = I I.loc = src - visible_message("[src] grabs [held_item]!", "\blue You grab [held_item]!", "You hear the sounds of wings flapping furiously.") + visible_message("[src] grabs [held_item]!", "You grab [held_item]!", "You hear the sounds of wings flapping furiously.") return held_item - src << "\red There is nothing of interest to take." + src << "There is nothing of interest to take." return 0 /mob/living/simple_animal/parrot/proc/steal_from_mob() @@ -654,7 +684,7 @@ lines 294-301 in living/say.dm (speech buffer) return -1 if(held_item) - src << "\red You are already holding [held_item]" + src << "You are already holding [held_item]" return 1 var/obj/item/stolen_item = null @@ -670,10 +700,10 @@ lines 294-301 in living/say.dm (speech buffer) C.unEquip(stolen_item) held_item = stolen_item stolen_item.loc = src - visible_message("[src] grabs [held_item] out of [C]'s hand!", "\blue You snag [held_item] out of [C]'s hand!", "You hear the sounds of wings flapping furiously.") + visible_message("[src] grabs [held_item] out of [C]'s hand!", "You snag [held_item] out of [C]'s hand!", "You hear the sounds of wings flapping furiously.") return held_item - src << "\red There is nothing of interest to take." + src << "There is nothing of interest to take." return 0 /mob/living/simple_animal/parrot/verb/drop_held_item_player() @@ -698,7 +728,7 @@ lines 294-301 in living/say.dm (speech buffer) if(!held_item) if(src == usr) //So that other mobs wont make this message appear when they're bludgeoning you. - src << "\red You have nothing to drop!" + src << "You have nothing to drop!" return 0 @@ -742,7 +772,7 @@ lines 294-301 in living/say.dm (speech buffer) src.loc = AM.loc icon_state = "parrot_sit" return - src << "\red There is no perch nearby to sit on." + src << "There is no perch nearby to sit on." return /mob/living/simple_animal/parrot/proc/toggle_mode() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index ee89070f77a..7721a60bda4 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -18,7 +18,6 @@ var/turns_per_move = 1 var/turns_since_move = 0 - universal_speak = 1 var/meat_amount = 0 var/meat_type var/stop_automated_movement = 0 //Use this to temporarely stop random movement or to if you write special movement code for animals. diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 5dc726708c5..1da52ea6991 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -32,14 +32,14 @@ var/next_mob_id = 0 var/datum/gas_mixture/environment = loc.return_air() - var/t = "\blue Coordinates: [x],[y] \n" - t+= "\red Temperature: [environment.temperature] \n" - t+= "\blue Nitrogen: [environment.nitrogen] \n" - t+= "\blue Oxygen: [environment.oxygen] \n" - t+= "\blue Plasma : [environment.toxins] \n" - t+= "\blue Carbon Dioxide: [environment.carbon_dioxide] \n" + var/t = "Coordinates: [x],[y] \n" + t+= "Temperature: [environment.temperature] \n" + t+= "Nitrogen: [environment.nitrogen] \n" + t+= "Oxygen: [environment.oxygen] \n" + t+= "Plasma : [environment.toxins] \n" + t+= "Carbon Dioxide: [environment.carbon_dioxide] \n" for(var/datum/gas/trace_gas in environment.trace_gases) - usr << "\blue [trace_gas.type]: [trace_gas.moles] \n" + usr << "[trace_gas.type]: [trace_gas.moles] \n" usr.show_message(t, 1) @@ -178,7 +178,7 @@ var/next_mob_id = 0 qdel(W) else if(!disable_warning) - src << "\red You are unable to equip that." //Only print if qdel_on_fail is false + src << "You are unable to equip that." //Only print if qdel_on_fail is false return 0 equip_to_slot(W, slot, redraw_mob) //This proc should not ever fail. return 1 @@ -328,12 +328,12 @@ var/list/slot_equipment_priority = list( \ if (!( abandon_allowed )) return if ((stat != 2 || !( ticker ))) - usr << "\blue You must be dead to use this!" + usr << "You must be dead to use this!" return log_game("[usr.name]/[usr.key] used abandon mob.") - usr << "\blue Please roleplay correctly!" + usr << "Please roleplay correctly!" if(!client) log_game("[usr.key] AM failed due to disconnect.") @@ -391,7 +391,7 @@ var/list/slot_equipment_priority = list( \ if(check_rights_for(client,R_ADMIN)) is_admin = 1 else if(stat != DEAD || istype(src, /mob/new_player)) - usr << "\blue You must be observing to use this!" + usr << "You must be observing to use this!" return if(is_admin && stat == DEAD) @@ -485,15 +485,15 @@ var/list/slot_equipment_priority = list( \ if(machine && in_range(src, usr)) show_inv(machine) - if(!usr.stat && usr.canmove && !usr.restrained() && Adjacent(usr)) + if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) if(href_list["item"]) var/slot = text2num(href_list["item"]) var/obj/item/what = get_item_by_slot(slot) if(what) - usr.stripPanelUnequip(src,what,slot) + usr.stripPanelUnequip(what,src,slot) else - usr.stripPanelEquip(src,what,slot) + usr.stripPanelEquip(what,src,slot) if(usr.machine == src) if(Adjacent(usr)) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 89817980775..603d3228b8b 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -2,7 +2,7 @@ density = 1 layer = 4 animate_movement = 2 - flags = NOREACT + flags = NOREACT | HEAR var/datum/mind/mind var/stat = 0 //Whether a mob is alive or dead. TODO: Move this to living - Nodrak @@ -121,7 +121,6 @@ //see: setup.dm for list of mutations var/voice_name = "unidentifiable voice" - var/voice_message = null // When you are not understood by others (replaced with just screeches, hisses, chimpers etc.) var/say_message = null // When you are understood by others. Currently only used by aliens and monkeys in their say_quote procs var/list/faction = list("neutral") //A list of factions that this mob is currently in, for hostile mob targetting, amongst other things @@ -157,12 +156,8 @@ var/list/radar_blips = list() // list of screen objects, radar blips var/radar_open = 0 // nonzero is radar is open + var/force_compose = 0 //If this is nonzero, the mob will always compose it's own hear message instead of using the one given in the arguments. var/obj/control_object //Used by admins to possess objects. All mobs should have this var - //Whether or not mobs can understand other mobtypes. These stay in /mob so that ghosts can hear everything. - var/universal_speak = 0 // Set to 1 to enable the mob to speak to everyone - var/robot_talk_understand = 0 - var/alien_talk_understand = 0 - var/turf/listed_turf = null //the current turf being examined in the stat panel diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index a4bf9852443..40eb8d8364f 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -453,3 +453,10 @@ proc/is_special_character(mob/M) // returns 1 for special characters and 2 for h return else return + +/proc/broadcast_hud_message(var/message, var/broadcast_source) + var/turf/sourceturf = get_turf(broadcast_source) + for(var/mob/living/carbon/human/human in mob_list) + var/turf/humanturf = get_turf(human) + if((humanturf.z == sourceturf.z) && istype(human.glasses, /obj/item/clothing/glasses/hud/security)) + human.show_message("\icon[human.glasses] [message]", 1) \ No newline at end of file diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 23bea151de0..20d9496f60f 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -26,7 +26,7 @@ var/mob/living/carbon/C = usr C.toggle_throw_mode() else - usr << "\red This mob type cannot throw items." + usr << "This mob type cannot throw items." return @@ -34,11 +34,11 @@ if(iscarbon(usr)) var/mob/living/carbon/C = usr if(!C.get_active_hand()) - usr << "\red You have nothing to drop in your hand." + usr << "You have nothing to drop in your hand." return drop_item() else - usr << "\red This mob type cannot drop items." + usr << "This mob type cannot drop items." return //This gets called when you press the delete button. @@ -46,7 +46,7 @@ set hidden = 1 if(!usr.pulling) - usr << "\blue You are not pulling anything." + usr << "You are not pulling anything." return usr.stop_pulling() @@ -189,7 +189,7 @@ for(var/mob/M in range(mob, 1)) if(M.pulling == mob) if(!M.restrained() && M.stat == 0 && M.canmove && mob.Adjacent(M)) - src << "\blue You're restrained! You can't move!" + src << "You're restrained! You can't move!" return 0 else M.stop_pulling() @@ -386,7 +386,7 @@ //Check to see if we slipped if(prob(Process_Spaceslipping(5))) - src << "\blue You slipped!" + src << "You slipped!" src.inertia_dir = src.last_move step(src, src.inertia_dir) return 0 diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index 717109e3e32..e0b8ca39e86 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -5,7 +5,7 @@ /mob/proc/change_mob_type(var/new_type = null, var/turf/location = null, var/new_name = null as text, var/delete_old_mob = 0 as num) if(istype(src,/mob/new_player)) - usr << "\red cannot convert players who have not entered yet." + usr << "cannot convert players who have not entered yet." return if(!new_type) @@ -19,7 +19,7 @@ return if( new_type == /mob/new_player ) - usr << "\red cannot convert into a new_player mob type." + usr << "cannot convert into a new_player mob type." return var/mob/M diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index 870e7fb4da6..3c4d0c8d6d1 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -4,7 +4,7 @@ src << "
    [join_motd]
    " if(admin_notice) - src << "\blue Admin Notice:\n \t [admin_notice]" + src << "Admin Notice:\n \t [admin_notice]" if(!mind) mind = new /datum/mind(key) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 0ebc94fedd1..0c9d0eced7e 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -5,6 +5,8 @@ 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 + + flags = NONE invisibility = 101 @@ -14,353 +16,355 @@ anchored = 1 // don't get pushed around - New() - tag = "mob_[next_mob_id++]" - mob_list += src +/mob/new_player/New() + tag = "mob_[next_mob_id++]" + mob_list += src - proc/new_player_panel() +/mob/new_player/proc/new_player_panel() - var/output = "

    Setup Character

    " + var/output = "

    Setup Character

    " - if(!ticker || ticker.current_state <= GAME_STATE_PREGAME) - if(!ready) output += "

    Declare Ready

    " - else output += "

    You are ready Cancel

    " + if(!ticker || ticker.current_state <= GAME_STATE_PREGAME) + if(!ready) output += "

    Declare Ready

    " + else output += "

    You are ready Cancel

    " - else - output += "

    Join Game!

    " + else + output += "

    Join Game!

    " - output += "

    Observe

    " + output += "

    Observe

    " - if(!IsGuestKey(src.key)) - establish_db_connection() + if(!IsGuestKey(src.key)) + establish_db_connection() - if(dbcon.IsConnected()) - var/isadmin = 0 - if(src.client && src.client.holder) - isadmin = 1 - var/DBQuery/query = dbcon.NewQuery("SELECT id FROM erro_poll_question WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM erro_poll_vote WHERE ckey = \"[ckey]\") AND id NOT IN (SELECT pollid FROM erro_poll_textreply WHERE ckey = \"[ckey]\")") - query.Execute() - var/newpoll = 0 - while(query.NextRow()) - newpoll = 1 - break - - if(newpoll) - output += "

    Show Player Polls (NEW!)

    " - else - output += "

    Show Player Polls

    " - - output += "
    " - - //src << browse(output,"window=playersetup;size=210x240;can_close=0") - var/datum/browser/popup = new(src, "playersetup", "
    New Player Options
    ", 210, 240) - popup.set_window_options("can_close=0") - popup.set_content(output) - popup.open(0) - return - - Stat() - ..() - - statpanel("Lobby") - if(client.statpanel == "Lobby" && ticker) - if(ticker.hide_mode) - stat("Game Mode:", "Secret") - else - stat("Game Mode:", "[master_mode]") - - if((ticker.current_state == GAME_STATE_PREGAME) && going) - stat("Time To Start:", ticker.pregame_timeleft) - if((ticker.current_state == GAME_STATE_PREGAME) && !going) - stat("Time To Start:", "DELAYED") - - if(ticker.current_state == GAME_STATE_PREGAME) - stat("Players: [totalPlayers]", "Players Ready: [totalPlayersReady]") - totalPlayers = 0 - totalPlayersReady = 0 - for(var/mob/new_player/player in player_list) - stat("[player.key]", (player.ready)?("(Playing)"):(null)) - totalPlayers++ - if(player.ready)totalPlayersReady++ - - Topic(href, href_list[]) - if(src != usr) - return 0 - - if(!client) return 0 - - if(href_list["show_preferences"]) - client.prefs.ShowChoices(src) - return 1 - - if(href_list["ready"]) - ready = text2num(href_list["ready"]) - - if(href_list["refresh"]) - src << browse(null, "window=playersetup") //closes the player setup window - new_player_panel() - - if(href_list["observe"]) - - if(alert(src,"Are you sure you wish to observe? You will not be able to play this round!","Player Setup","Yes","No") == "Yes") - if(!client) return 1 - var/mob/dead/observer/observer = new() - - spawning = 1 - src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo - - observer.started_as_observer = 1 - close_spawn_windows() - var/obj/O = locate("landmark*Observer-Start") - src << "\blue Now teleporting." - observer.loc = O.loc - if(client.prefs.be_random_name) - client.prefs.real_name = random_name(gender) - observer.real_name = client.prefs.real_name - observer.name = observer.real_name - observer.key = key - qdel(mind) - - qdel(src) - return 1 - - if(href_list["late_join"]) - if(!ticker || ticker.current_state != GAME_STATE_PLAYING) - usr << "\red The round is either not ready, or has already finished..." - return - LateChoices() - - if(href_list["SelectedJob"]) - - if(!enter_allowed) - usr << "\blue There is an administrative lock on entering the game!" - return - - AttemptLateSpawn(href_list["SelectedJob"]) - return - - if(href_list["privacy_poll"]) - establish_db_connection() - if(!dbcon.IsConnected()) - return - var/voted = 0 - - //First check if the person has not voted yet. - var/DBQuery/query = dbcon.NewQuery("SELECT * FROM erro_privacy WHERE ckey='[src.ckey]'") + if(dbcon.IsConnected()) + var/isadmin = 0 + if(src.client && src.client.holder) + isadmin = 1 + var/DBQuery/query = dbcon.NewQuery("SELECT id FROM erro_poll_question WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM erro_poll_vote WHERE ckey = \"[ckey]\") AND id NOT IN (SELECT pollid FROM erro_poll_textreply WHERE ckey = \"[ckey]\")") query.Execute() + var/newpoll = 0 while(query.NextRow()) - voted = 1 + newpoll = 1 break - //This is a safety switch, so only valid options pass through - var/option = "UNKNOWN" - switch(href_list["privacy_poll"]) - if("signed") - option = "SIGNED" - if("anonymous") - option = "ANONYMOUS" - if("nostats") - option = "NOSTATS" - if("later") - usr << browse(null,"window=privacypoll") - return - if("abstain") - option = "ABSTAIN" + if(newpoll) + output += "

    Show Player Polls (NEW!)

    " + else + output += "

    Show Player Polls

    " - if(option == "UNKNOWN") - return + output += "
    " - if(!voted) - var/sql = "INSERT INTO erro_privacy VALUES (null, Now(), '[src.ckey]', '[option]')" - var/DBQuery/query_insert = dbcon.NewQuery(sql) - query_insert.Execute() - usr << "Thank you for your vote!" - usr << browse(null,"window=privacypoll") + //src << browse(output,"window=playersetup;size=210x240;can_close=0") + var/datum/browser/popup = new(src, "playersetup", "
    New Player Options
    ", 210, 240) + popup.set_window_options("can_close=0") + popup.set_content(output) + popup.open(0) + return - if(!ready && href_list["preference"]) - if(client) - client.prefs.process_link(src, href_list) - else if(!href_list["late_join"]) - new_player_panel() +/mob/new_player/Stat() + ..() - if(href_list["showpoll"]) - handle_player_polling() - return - - if(href_list["pollid"]) - var/pollid = href_list["pollid"] - if(istext(pollid)) - pollid = text2num(pollid) - if(isnum(pollid)) - src.poll_player(pollid) - return - - if(href_list["votepollid"] && href_list["votetype"]) - var/pollid = text2num(href_list["votepollid"]) - var/votetype = href_list["votetype"] - switch(votetype) - if("OPTION") - var/optionid = text2num(href_list["voteoptionid"]) - vote_on_poll(pollid, optionid) - if("TEXT") - var/replytext = href_list["replytext"] - log_text_poll_reply(pollid, replytext) - if("NUMVAL") - var/id_min = text2num(href_list["minid"]) - var/id_max = text2num(href_list["maxid"]) - - if( (id_max - id_min) > 100 ) //Basic exploit prevention - usr << "The option ID difference is too big. Please contact administration or the database admin." - return - - for(var/optionid = id_min; optionid <= id_max; optionid++) - if(!isnull(href_list["o[optionid]"])) //Test if this optionid was replied to - var/rating - if(href_list["o[optionid]"] == "abstain") - rating = null - else - rating = text2num(href_list["o[optionid]"]) - if(!isnum(rating)) - return - - vote_on_numval_poll(pollid, optionid, rating) - if("MULTICHOICE") - var/id_min = text2num(href_list["minoptionid"]) - var/id_max = text2num(href_list["maxoptionid"]) - - if( (id_max - id_min) > 100 ) //Basic exploit prevention - usr << "The option ID difference is too big. Please contact administration or the database admin." - return - - for(var/optionid = id_min; optionid <= id_max; optionid++) - if(!isnull(href_list["option_[optionid]"])) //Test if this optionid was selected - vote_on_poll(pollid, optionid, 1) - - proc/IsJobAvailable(rank) - var/datum/job/job = job_master.GetJob(rank) - if(!job) return 0 - if((job.current_positions >= job.total_positions) && job.total_positions != -1) return 0 - if(jobban_isbanned(src,rank)) return 0 - if(!job.player_old_enough(src.client)) return 0 - return 1 - - - proc/AttemptLateSpawn(rank) - if(!IsJobAvailable(rank)) - src << alert("[rank] is not available. Please try another.") - return 0 - - job_master.AssignRole(src, rank, 1) - - var/mob/living/carbon/human/character = create_character() //creates the human and transfers vars and mind - job_master.EquipRank(character, rank, 1) //equips the human - character.loc = pick(latejoin) - character.lastarea = get_area(loc) - - if(character.mind.assigned_role != "Cyborg") - data_core.manifest_inject(character) - ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn - AnnounceArrival(character, rank) + statpanel("Lobby") + if(client.statpanel == "Lobby" && ticker) + if(ticker.hide_mode) + stat("Game Mode:", "Secret") else - character.Robotize() + stat("Game Mode:", "[master_mode]") - joined_player_list += character.ckey + if((ticker.current_state == GAME_STATE_PREGAME) && going) + stat("Time To Start:", ticker.pregame_timeleft) + if((ticker.current_state == GAME_STATE_PREGAME) && !going) + stat("Time To Start:", "DELAYED") - if(config.allow_latejoin_antagonists && emergency_shuttle.timeleft() > 300) //Don't make them antags if the station is evacuating - ticker.mode.make_antag_chance(character) - qdel(src) + if(ticker.current_state == GAME_STATE_PREGAME) + stat("Players:", "[totalPlayers]") + if(src.client in admins) + stat("Players Ready:", "[totalPlayersReady]") + totalPlayers = 0 + totalPlayersReady = 0 + for(var/mob/new_player/player in player_list) + stat("[player.key]", (player.ready && src.client in admins)?("(Playing)"):(null)) + totalPlayers++ + if(player.ready)totalPlayersReady++ - proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank) - if (ticker.current_state == GAME_STATE_PLAYING) - var/ailist[] = list() - for (var/mob/living/silicon/ai/A in living_mob_list) - ailist += A - if (ailist.len) - var/mob/living/silicon/ai/announcer = pick(ailist) - if(character.mind) - if((character.mind.assigned_role != "Cyborg") && (character.mind.special_role != "MODE")) - announcer.say("[character.real_name] has signed up as [rank].") - - proc/LateChoices() - var/mills = world.time // 1/10 of a second, not real milliseconds but whatever - //var/secs = ((mills % 36000) % 600) / 10 //Not really needed, but I'll leave it here for refrence.. or something - var/mins = (mills % 36000) / 600 - var/hours = mills / 36000 - - var/dat = "
    Round Duration: [round(hours)]h [round(mins)]m
    " - - if(emergency_shuttle) //In case Nanotrasen decides reposess Centcom's shuttles. - if(emergency_shuttle.direction == 2) //Shuttle is going to centcom, not recalled - dat += "
    The station has been evacuated.

    " - if(emergency_shuttle.direction == 1 && emergency_shuttle.timeleft() < 300) //Shuttle is past the point of no recall - dat += "
    The station is currently undergoing evacuation procedures.

    " - - var/available_job_count = 0 - for(var/datum/job/job in job_master.occupations) - if(job && IsJobAvailable(job.title)) - available_job_count++; - - dat += "
    Choose from the following open positions:

    " - dat += "
    " - var/job_count = 0 - for(var/datum/job/job in job_master.occupations) - if(job && IsJobAvailable(job.title)) - job_count++; - if (job_count > round(available_job_count / 2)) - dat += "
    " - var/position_class = "otherPosition" - if (job.title in command_positions) - position_class = "commandPosition" - dat += "[job.title] ([job.current_positions])
    " - dat += "
    " - - // Removing the old window method but leaving it here for reference - //src << browse(dat, "window=latechoices;size=300x640;can_close=1") - - // Added the new browser window method - var/datum/browser/popup = new(src, "latechoices", "Choose Profession", 440, 500) - popup.add_stylesheet("playeroptions", 'html/browser/playeroptions.css') - popup.set_content(dat) - popup.open(0) // 0 is passed to open so that it doesn't use the onclose() proc - - - proc/create_character() - spawning = 1 - close_spawn_windows() - - var/mob/living/carbon/human/new_character = new(loc) - new_character.lastarea = get_area(loc) - - create_dna(new_character) - - if(config.force_random_names || appearance_isbanned(src)) - client.prefs.random_character() - client.prefs.real_name = random_name(gender) - client.prefs.copy_to(new_character) - - src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo - - if(mind) - mind.active = 0 //we wish to transfer the key manually - mind.transfer_to(new_character) //won't transfer key since the mind is not active - - new_character.name = real_name - - ready_dna(new_character, client.prefs.blood_type) - - new_character.key = key //Manually transfer the key to log them in - - return new_character - - - Move() +/mob/new_player/Topic(href, href_list[]) + if(src != usr) return 0 + if(!client) return 0 - proc/close_spawn_windows() + if(href_list["show_preferences"]) + client.prefs.ShowChoices(src) + return 1 - src << browse(null, "window=latechoices") //closes late choices window + if(href_list["ready"]) + ready = text2num(href_list["ready"]) + + if(href_list["refresh"]) src << browse(null, "window=playersetup") //closes the player setup window - src << browse(null, "window=preferences") //closes job selection - src << browse(null, "window=mob_occupation") - src << browse(null, "window=latechoices") //closes late job selection + new_player_panel() + + if(href_list["observe"]) + + if(alert(src,"Are you sure you wish to observe? You will not be able to play this round!","Player Setup","Yes","No") == "Yes") + if(!client) return 1 + var/mob/dead/observer/observer = new() + + spawning = 1 + src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo + + observer.started_as_observer = 1 + close_spawn_windows() + var/obj/O = locate("landmark*Observer-Start") + src << "Now teleporting." + observer.loc = O.loc + if(client.prefs.be_random_name) + client.prefs.real_name = random_name(gender) + observer.real_name = client.prefs.real_name + observer.name = observer.real_name + observer.key = key + qdel(mind) + + qdel(src) + return 1 + + if(href_list["late_join"]) + if(!ticker || ticker.current_state != GAME_STATE_PLAYING) + usr << "The round is either not ready, or has already finished..." + return + LateChoices() + + if(href_list["SelectedJob"]) + + if(!enter_allowed) + usr << "There is an administrative lock on entering the game!" + return + + AttemptLateSpawn(href_list["SelectedJob"]) + return + + if(href_list["privacy_poll"]) + establish_db_connection() + if(!dbcon.IsConnected()) + return + var/voted = 0 + + //First check if the person has not voted yet. + var/DBQuery/query = dbcon.NewQuery("SELECT * FROM erro_privacy WHERE ckey='[src.ckey]'") + query.Execute() + while(query.NextRow()) + voted = 1 + break + + //This is a safety switch, so only valid options pass through + var/option = "UNKNOWN" + switch(href_list["privacy_poll"]) + if("signed") + option = "SIGNED" + if("anonymous") + option = "ANONYMOUS" + if("nostats") + option = "NOSTATS" + if("later") + usr << browse(null,"window=privacypoll") + return + if("abstain") + option = "ABSTAIN" + + if(option == "UNKNOWN") + return + + if(!voted) + var/sql = "INSERT INTO erro_privacy VALUES (null, Now(), '[src.ckey]', '[option]')" + var/DBQuery/query_insert = dbcon.NewQuery(sql) + query_insert.Execute() + usr << "Thank you for your vote!" + usr << browse(null,"window=privacypoll") + + if(!ready && href_list["preference"]) + if(client) + client.prefs.process_link(src, href_list) + else if(!href_list["late_join"]) + new_player_panel() + + if(href_list["showpoll"]) + handle_player_polling() + return + + if(href_list["pollid"]) + var/pollid = href_list["pollid"] + if(istext(pollid)) + pollid = text2num(pollid) + if(isnum(pollid)) + src.poll_player(pollid) + return + + if(href_list["votepollid"] && href_list["votetype"]) + var/pollid = text2num(href_list["votepollid"]) + var/votetype = href_list["votetype"] + switch(votetype) + if("OPTION") + var/optionid = text2num(href_list["voteoptionid"]) + vote_on_poll(pollid, optionid) + if("TEXT") + var/replytext = href_list["replytext"] + log_text_poll_reply(pollid, replytext) + if("NUMVAL") + var/id_min = text2num(href_list["minid"]) + var/id_max = text2num(href_list["maxid"]) + + if( (id_max - id_min) > 100 ) //Basic exploit prevention + usr << "The option ID difference is too big. Please contact administration or the database admin." + return + + for(var/optionid = id_min; optionid <= id_max; optionid++) + if(!isnull(href_list["o[optionid]"])) //Test if this optionid was replied to + var/rating + if(href_list["o[optionid]"] == "abstain") + rating = null + else + rating = text2num(href_list["o[optionid]"]) + if(!isnum(rating)) + return + + vote_on_numval_poll(pollid, optionid, rating) + if("MULTICHOICE") + var/id_min = text2num(href_list["minoptionid"]) + var/id_max = text2num(href_list["maxoptionid"]) + + if( (id_max - id_min) > 100 ) //Basic exploit prevention + usr << "The option ID difference is too big. Please contact administration or the database admin." + return + + for(var/optionid = id_min; optionid <= id_max; optionid++) + if(!isnull(href_list["option_[optionid]"])) //Test if this optionid was selected + vote_on_poll(pollid, optionid, 1) + +/mob/new_player/proc/IsJobAvailable(rank) + var/datum/job/job = job_master.GetJob(rank) + if(!job) return 0 + if((job.current_positions >= job.total_positions) && job.total_positions != -1) return 0 + if(jobban_isbanned(src,rank)) return 0 + if(!job.player_old_enough(src.client)) return 0 + return 1 + + +/mob/new_player/proc/AttemptLateSpawn(rank) + if(!IsJobAvailable(rank)) + src << alert("[rank] is not available. Please try another.") + return 0 + + job_master.AssignRole(src, rank, 1) + + var/mob/living/carbon/human/character = create_character() //creates the human and transfers vars and mind + job_master.EquipRank(character, rank, 1) //equips the human + character.loc = pick(latejoin) + character.lastarea = get_area(loc) + + if(character.mind.assigned_role != "Cyborg") + data_core.manifest_inject(character) + ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn + AnnounceArrival(character, rank) + else + character.Robotize() + + joined_player_list += character.ckey + + if(config.allow_latejoin_antagonists && emergency_shuttle.timeleft() > 300) //Don't make them antags if the station is evacuating + ticker.mode.make_antag_chance(character) + qdel(src) + +/mob/new_player/proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank) + if (ticker.current_state == GAME_STATE_PLAYING) + var/ailist[] = list() + for (var/mob/living/silicon/ai/A in living_mob_list) + ailist += A + if (ailist.len) + var/mob/living/silicon/ai/announcer = pick(ailist) + if(character.mind) + if((character.mind.assigned_role != "Cyborg") && (character.mind.special_role != "MODE")) + announcer.say("[character.real_name] has signed up as [rank].") + +/mob/new_player/proc/LateChoices() + var/mills = world.time // 1/10 of a second, not real milliseconds but whatever + //var/secs = ((mills % 36000) % 600) / 10 //Not really needed, but I'll leave it here for refrence.. or something + var/mins = (mills % 36000) / 600 + var/hours = mills / 36000 + + var/dat = "
    Round Duration: [round(hours)]h [round(mins)]m
    " + + if(emergency_shuttle) //In case Nanotrasen decides reposess Centcom's shuttles. + if(emergency_shuttle.direction == 2) //Shuttle is going to centcom, not recalled + dat += "
    The station has been evacuated.

    " + if(emergency_shuttle.direction == 1 && emergency_shuttle.timeleft() < 300) //Shuttle is past the point of no recall + dat += "
    The station is currently undergoing evacuation procedures.

    " + + var/available_job_count = 0 + for(var/datum/job/job in job_master.occupations) + if(job && IsJobAvailable(job.title)) + available_job_count++; + + dat += "
    Choose from the following open positions:

    " + dat += "
    " + var/job_count = 0 + for(var/datum/job/job in job_master.occupations) + if(job && IsJobAvailable(job.title)) + job_count++; + if (job_count > round(available_job_count / 2)) + dat += "
    " + var/position_class = "otherPosition" + if (job.title in command_positions) + position_class = "commandPosition" + dat += "[job.title] ([job.current_positions])
    " + dat += "
    " + + // Removing the old window method but leaving it here for reference + //src << browse(dat, "window=latechoices;size=300x640;can_close=1") + + // Added the new browser window method + var/datum/browser/popup = new(src, "latechoices", "Choose Profession", 440, 500) + popup.add_stylesheet("playeroptions", 'html/browser/playeroptions.css') + popup.set_content(dat) + popup.open(0) // 0 is passed to open so that it doesn't use the onclose() proc + + +/mob/new_player/proc/create_character() + spawning = 1 + close_spawn_windows() + + var/mob/living/carbon/human/new_character = new(loc) + new_character.lastarea = get_area(loc) + + create_dna(new_character) + + if(config.force_random_names || appearance_isbanned(src)) + client.prefs.random_character() + client.prefs.real_name = random_name(gender) + client.prefs.copy_to(new_character) + + src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo + + if(mind) + mind.active = 0 //we wish to transfer the key manually + mind.transfer_to(new_character) //won't transfer key since the mind is not active + + new_character.name = real_name + + ready_dna(new_character, client.prefs.blood_type) + + new_character.key = key //Manually transfer the key to log them in + + return new_character + + +/mob/new_player/Move() + return 0 + + +/mob/new_player/proc/close_spawn_windows() + + src << browse(null, "window=latechoices") //closes late choices window + src << browse(null, "window=playersetup") //closes the player setup window + src << browse(null, "window=preferences") //closes job selection + src << browse(null, "window=mob_occupation") + src << browse(null, "window=latechoices") //closes late job selection diff --git a/code/modules/mob/new_player/poll.dm b/code/modules/mob/new_player/poll.dm index 884b7ffc4ee..ba3ff0e6940 100644 --- a/code/modules/mob/new_player/poll.dm +++ b/code/modules/mob/new_player/poll.dm @@ -103,7 +103,7 @@ break if(!found) - usr << "\red Poll question details not found." + usr << "Poll question details not found." return switch(polltype) @@ -360,7 +360,7 @@ break if(!validpoll) - usr << "\red Poll is not valid." + usr << "Poll is not valid." return var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM erro_poll_option WHERE id = [optionid] AND pollid = [pollid]") @@ -373,7 +373,7 @@ break if(!validoption) - usr << "\red Poll option is not valid." + usr << "Poll option is not valid." return var/alreadyvoted = 0 @@ -387,11 +387,11 @@ break if(!multichoice && alreadyvoted) - usr << "\red You already voted in this poll." + usr << "You already voted in this poll." return if(multichoice && (alreadyvoted >= multiplechoiceoptions)) - usr << "\red You already have more than [multiplechoiceoptions] logged votes on this poll. Enough is enough. Contact the database admin if this is an error." + usr << "You already have more than [multiplechoiceoptions] logged votes on this poll. Enough is enough. Contact the database admin if this is an error." return var/adminrank = "Player" @@ -402,7 +402,7 @@ var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO erro_poll_vote (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]')") insert_query.Execute() - usr << "\blue Vote successful." + usr << "Vote successful." usr << browse(null,"window=playerpoll") @@ -427,7 +427,7 @@ break if(!validpoll) - usr << "\red Poll is not valid." + usr << "Poll is not valid." return var/alreadyvoted = 0 @@ -440,7 +440,7 @@ break if(alreadyvoted) - usr << "\red You already sent your feedback for this poll." + usr << "You already sent your feedback for this poll." return var/adminrank = "Player" @@ -460,7 +460,7 @@ var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO erro_poll_textreply (id ,datetime ,pollid ,ckey ,ip ,replytext ,adminrank) VALUES (null, Now(), [pollid], '[usr.ckey]', '[usr.client.address]', '[replytext]', '[adminrank]')") insert_query.Execute() - usr << "\blue Feedback logging successful." + usr << "Feedback logging successful." usr << browse(null,"window=playerpoll") @@ -485,7 +485,7 @@ break if(!validpoll) - usr << "\red Poll is not valid." + usr << "Poll is not valid." return var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM erro_poll_option WHERE id = [optionid] AND pollid = [pollid]") @@ -498,7 +498,7 @@ break if(!validoption) - usr << "\red Poll option is not valid." + usr << "Poll option is not valid." return var/alreadyvoted = 0 @@ -511,7 +511,7 @@ break if(alreadyvoted) - usr << "\red You already voted in this poll." + usr << "You already voted in this poll." return var/adminrank = "Player" @@ -522,5 +522,5 @@ var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO erro_poll_vote (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank, rating) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]', [(isnull(rating)) ? "null" : rating])") insert_query.Execute() - usr << "\blue Vote successful." + usr << "Vote successful." usr << browse(null,"window=playerpoll") \ No newline at end of file diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index d91da2be50f..01e73989d95 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -1,351 +1,351 @@ -datum/preferences + //The mob should have a gender you want before running this proc. Will run fine without H - proc/random_character(gender_override) - if(gender_override) - gender = gender_override - else - gender = pick(MALE,FEMALE) - underwear = random_underwear(gender) - skin_tone = random_skin_tone() - hair_style = random_hair_style(gender) - facial_hair_style = random_facial_hair_style(gender) - hair_color = random_short_color() - facial_hair_color = hair_color - eye_color = random_eye_color() - pref_species = new /datum/species/human() - backbag = 2 - age = rand(AGE_MIN,AGE_MAX) +/datum/preferences/proc/random_character(gender_override) + if(gender_override) + gender = gender_override + else + gender = pick(MALE,FEMALE) + underwear = random_underwear(gender) + skin_tone = random_skin_tone() + hair_style = random_hair_style(gender) + facial_hair_style = random_facial_hair_style(gender) + hair_color = random_short_color() + facial_hair_color = hair_color + eye_color = random_eye_color() + pref_species = new /datum/species/human() + backbag = 2 + age = rand(AGE_MIN,AGE_MAX) - proc/update_preview_icon() //seriously. This is horrendous. - del(preview_icon_front) - del(preview_icon_side) - var/icon/preview_icon = null +/datum/preferences/proc/update_preview_icon() //seriously. This is horrendous. + del(preview_icon_front) + del(preview_icon_side) + var/icon/preview_icon = null - var/g = "m" - if(gender == FEMALE) g = "f" + var/g = "m" + if(gender == FEMALE) g = "f" - if(pref_species.id == "human" || !config.mutant_races) - preview_icon = new /icon('icons/mob/human.dmi', "[skin_tone]_[g]_s") - else - preview_icon = new /icon('icons/mob/human.dmi', "[pref_species.id]_[g]_s") - preview_icon.Blend("#[mutant_color]", ICON_MULTIPLY) + if(pref_species.id == "human" || !config.mutant_races) + preview_icon = new /icon('icons/mob/human.dmi', "[skin_tone]_[g]_s") + else + preview_icon = new /icon('icons/mob/human.dmi', "[pref_species.id]_[g]_s") + preview_icon.Blend("#[mutant_color]", ICON_MULTIPLY) - var/datum/sprite_accessory/S - if(underwear) - S = underwear_all[underwear] - if(S) - preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY) + var/datum/sprite_accessory/S + if(underwear) + S = underwear_all[underwear] + if(S) + preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY) - var/icon/eyes_s = new/icon() - if(EYECOLOR in pref_species.specflags) - eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[pref_species.eyes]_s") - eyes_s.Blend("#[eye_color]", ICON_MULTIPLY) + var/icon/eyes_s = new/icon() + if(EYECOLOR in pref_species.specflags) + eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[pref_species.eyes]_s") + eyes_s.Blend("#[eye_color]", ICON_MULTIPLY) - S = hair_styles_list[hair_style] - if(S && (HAIR in pref_species.specflags)) - var/icon/hair_s = new/icon("icon" = S.icon, "icon_state" = "[S.icon_state]_s") - hair_s.Blend("#[hair_color]", ICON_MULTIPLY) - eyes_s.Blend(hair_s, ICON_OVERLAY) + S = hair_styles_list[hair_style] + if(S && (HAIR in pref_species.specflags)) + var/icon/hair_s = new/icon("icon" = S.icon, "icon_state" = "[S.icon_state]_s") + hair_s.Blend("#[hair_color]", ICON_MULTIPLY) + eyes_s.Blend(hair_s, ICON_OVERLAY) - S = facial_hair_styles_list[facial_hair_style] - if(S && (FACEHAIR in pref_species.specflags)) - var/icon/facial_s = new/icon("icon" = S.icon, "icon_state" = "[S.icon_state]_s") - facial_s.Blend("#[facial_hair_color]", ICON_MULTIPLY) - eyes_s.Blend(facial_s, ICON_OVERLAY) + S = facial_hair_styles_list[facial_hair_style] + if(S && (FACEHAIR in pref_species.specflags)) + var/icon/facial_s = new/icon("icon" = S.icon, "icon_state" = "[S.icon_state]_s") + facial_s.Blend("#[facial_hair_color]", ICON_MULTIPLY) + eyes_s.Blend(facial_s, ICON_OVERLAY) - var/icon/clothes_s = null - if(job_civilian_low & ASSISTANT)//This gives the preview icon clothes depending on which job(if any) is set to 'high' - clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - else if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + var/icon/clothes_s = null + if(job_civilian_low & ASSISTANT)//This gives the preview icon clothes depending on which job(if any) is set to 'high' + clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + else if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - else if(job_civilian_high)//I hate how this looks, but there's no reason to go through this switch if it's empty - switch(job_civilian_high) - if(HOP) - clothes_s = new /icon('icons/mob/uniform.dmi', "hop_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "hopcap"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - else if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(BARTENDER) - clothes_s = new /icon('icons/mob/uniform.dmi', "ba_suit_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - else if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(BOTANIST) - clothes_s = new /icon('icons/mob/uniform.dmi', "hydroponics_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "ggloves"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "apron"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - else if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-hyd"), ICON_OVERLAY) - if(CHEF) - clothes_s = new /icon('icons/mob/uniform.dmi', "chef_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "chef"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(JANITOR) - clothes_s = new /icon('icons/mob/uniform.dmi', "janitor_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(LIBRARIAN) - clothes_s = new /icon('icons/mob/uniform.dmi', "red_suit_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(QUARTERMASTER) - clothes_s = new /icon('icons/mob/uniform.dmi', "qm_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sun"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "clipboard"), ICON_UNDERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(CARGOTECH) - clothes_s = new /icon('icons/mob/uniform.dmi', "cargotech_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(MINER) - clothes_s = new /icon('icons/mob/uniform.dmi', "miner_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY) - if(LAWYER) - clothes_s = new /icon('icons/mob/uniform.dmi', "lawyer_blue_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "briefcase"), ICON_UNDERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(CHAPLAIN) - clothes_s = new /icon('icons/mob/uniform.dmi', "chapblack_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(CLOWN) - clothes_s = new /icon('icons/mob/uniform.dmi', "clown_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "clown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/mask.dmi', "clown"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "clownpack"), ICON_OVERLAY) - if(MIME) - clothes_s = new /icon('icons/mob/uniform.dmi', "mime_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "lgloves"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/mask.dmi', "mime"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "beret"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "suspenders"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "mimepack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + else if(job_civilian_high)//I hate how this looks, but there's no reason to go through this switch if it's empty + switch(job_civilian_high) + if(HOP) + clothes_s = new /icon('icons/mob/uniform.dmi', "hop_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "hopcap"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + else if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(BARTENDER) + clothes_s = new /icon('icons/mob/uniform.dmi', "ba_suit_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + else if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(BOTANIST) + clothes_s = new /icon('icons/mob/uniform.dmi', "hydroponics_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "ggloves"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "apron"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + else if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-hyd"), ICON_OVERLAY) + if(CHEF) + clothes_s = new /icon('icons/mob/uniform.dmi', "chef_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "chef"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(JANITOR) + clothes_s = new /icon('icons/mob/uniform.dmi', "janitor_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(LIBRARIAN) + clothes_s = new /icon('icons/mob/uniform.dmi', "red_suit_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(QUARTERMASTER) + clothes_s = new /icon('icons/mob/uniform.dmi', "qm_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sun"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "clipboard"), ICON_UNDERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(CARGOTECH) + clothes_s = new /icon('icons/mob/uniform.dmi', "cargotech_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(MINER) + clothes_s = new /icon('icons/mob/uniform.dmi', "miner_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY) + if(LAWYER) + clothes_s = new /icon('icons/mob/uniform.dmi', "lawyer_blue_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "briefcase"), ICON_UNDERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(CHAPLAIN) + clothes_s = new /icon('icons/mob/uniform.dmi', "chapblack_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(CLOWN) + clothes_s = new /icon('icons/mob/uniform.dmi', "clown_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "clown"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/mask.dmi', "clown"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "clownpack"), ICON_OVERLAY) + if(MIME) + clothes_s = new /icon('icons/mob/uniform.dmi', "mime_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "lgloves"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/mask.dmi', "mime"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "beret"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "suspenders"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "mimepack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - else if(job_medsci_high) - switch(job_medsci_high) - if(RD) - clothes_s = new /icon('icons/mob/uniform.dmi', "director_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "clipboard"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-tox"), ICON_OVERLAY) - if(SCIENTIST) - clothes_s = new /icon('icons/mob/uniform.dmi', "toxinswhite_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_tox_open"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-tox"), ICON_OVERLAY) - if(CHEMIST) - clothes_s = new /icon('icons/mob/uniform.dmi', "chemistrywhite_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_chem_open"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-chem"), ICON_OVERLAY) - if(CMO) - clothes_s = new /icon('icons/mob/uniform.dmi', "cmo_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/items_lefthand.dmi', "firstaid"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_cmo_open"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY) - if(DOCTOR) - clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/items_lefthand.dmi', "firstaid"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY) - if(GENETICIST) - clothes_s = new /icon('icons/mob/uniform.dmi', "geneticswhite_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_gen_open"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-gen"), ICON_OVERLAY) - if(VIROLOGIST) - clothes_s = new /icon('icons/mob/uniform.dmi', "virologywhite_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/mask.dmi', "sterile"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_vir_open"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-vir"), ICON_OVERLAY) - if(ROBOTICIST) - clothes_s = new /icon('icons/mob/uniform.dmi', "robotics_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "toolbox_blue"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + else if(job_medsci_high) + switch(job_medsci_high) + if(RD) + clothes_s = new /icon('icons/mob/uniform.dmi', "director_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "clipboard"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-tox"), ICON_OVERLAY) + if(SCIENTIST) + clothes_s = new /icon('icons/mob/uniform.dmi', "toxinswhite_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_tox_open"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-tox"), ICON_OVERLAY) + if(CHEMIST) + clothes_s = new /icon('icons/mob/uniform.dmi', "chemistrywhite_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_chem_open"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-chem"), ICON_OVERLAY) + if(CMO) + clothes_s = new /icon('icons/mob/uniform.dmi', "cmo_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/items_lefthand.dmi', "firstaid"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_cmo_open"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY) + if(DOCTOR) + clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/items_lefthand.dmi', "firstaid"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY) + if(GENETICIST) + clothes_s = new /icon('icons/mob/uniform.dmi', "geneticswhite_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_gen_open"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-gen"), ICON_OVERLAY) + if(VIROLOGIST) + clothes_s = new /icon('icons/mob/uniform.dmi', "virologywhite_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/mask.dmi', "sterile"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_vir_open"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-vir"), ICON_OVERLAY) + if(ROBOTICIST) + clothes_s = new /icon('icons/mob/uniform.dmi', "robotics_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "toolbox_blue"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - else if(job_engsec_high) - switch(job_engsec_high) - if(CAPTAIN) - clothes_s = new /icon('icons/mob/uniform.dmi', "captain_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "captain"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sun"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "capcarapace"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(HOS) - clothes_s = new /icon('icons/mob/uniform.dmi', "hosred_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "hoscap"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sunhud"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "hos"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY) - if(WARDEN) - clothes_s = new /icon('icons/mob/uniform.dmi', "warden_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "policehelm"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sunhud"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "warden_jacket"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY) - if(DETECTIVE) - clothes_s = new /icon('icons/mob/uniform.dmi', "detective_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/mask.dmi', "cigaron"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "detective"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "detective"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(OFFICER) - clothes_s = new /icon('icons/mob/uniform.dmi', "secred_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "helmet"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY) - if(CHIEF) - clothes_s = new /icon('icons/mob/uniform.dmi', "chief_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/mask.dmi', "cigaron"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "hardhat0_white"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY) - if(ENGINEER) - clothes_s = new /icon('icons/mob/uniform.dmi', "engine_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "hardhat0_yellow"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY) - if(ATMOSTECH) - clothes_s = new /icon('icons/mob/uniform.dmi', "atmos_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(AI)//Gives AI and borgs assistant-wear, so they can still customize their character - clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - else if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(CYBORG) - clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - else if(backbag == 3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + else if(job_engsec_high) + switch(job_engsec_high) + if(CAPTAIN) + clothes_s = new /icon('icons/mob/uniform.dmi', "captain_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "captain"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sun"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "capcarapace"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(HOS) + clothes_s = new /icon('icons/mob/uniform.dmi', "hosred_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "hoscap"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sunhud"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "hos"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY) + if(WARDEN) + clothes_s = new /icon('icons/mob/uniform.dmi', "warden_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "policehelm"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sunhud"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "warden_jacket"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY) + if(DETECTIVE) + clothes_s = new /icon('icons/mob/uniform.dmi', "detective_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/mask.dmi', "cigaron"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "detective"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "detective"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(OFFICER) + clothes_s = new /icon('icons/mob/uniform.dmi', "secred_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "helmet"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY) + if(CHIEF) + clothes_s = new /icon('icons/mob/uniform.dmi', "chief_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/mask.dmi', "cigaron"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "hardhat0_white"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY) + if(ENGINEER) + clothes_s = new /icon('icons/mob/uniform.dmi', "engine_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "hardhat0_yellow"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY) + if(ATMOSTECH) + clothes_s = new /icon('icons/mob/uniform.dmi', "atmos_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(AI)//Gives AI and borgs assistant-wear, so they can still customize their character + clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + else if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(CYBORG) + clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + else if(backbag == 3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - preview_icon.Blend(eyes_s, ICON_OVERLAY) - if(clothes_s) - preview_icon.Blend(clothes_s, ICON_OVERLAY) - preview_icon_front = new(preview_icon, dir = SOUTH) - preview_icon_side = new(preview_icon, dir = WEST) + preview_icon.Blend(eyes_s, ICON_OVERLAY) + if(clothes_s) + preview_icon.Blend(clothes_s, ICON_OVERLAY) + preview_icon_front = new(preview_icon, dir = SOUTH) + preview_icon_side = new(preview_icon, dir = WEST) - del(preview_icon) - del(eyes_s) - del(clothes_s) \ No newline at end of file + del(preview_icon) + del(eyes_s) + del(clothes_s) \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index cd96649604b..8712f30ea04 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -48,285 +48,418 @@ /datum/sprite_accessory/hair icon = 'icons/mob/human_face.dmi' // default icon for all hairs - 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 +/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 - shorthair2 - name = "Short Hair 2" - icon_state = "hair_shorthair2" +/datum/sprite_accessory/hair/shorthair2 + name = "Short Hair 2" + icon_state = "hair_shorthair2" - cut - name = "Cut Hair" - icon_state = "hair_c" +/datum/sprite_accessory/hair/shorthair3 + name = "Short Hair 3" + icon_state = "hair_shorthair3" - long - name = "Shoulder-length Hair" - icon_state = "hair_b" +/datum/sprite_accessory/hair/cut + name = "Cut Hair" + icon_state = "hair_c" - longer - name = "Long Hair" - icon_state = "hair_vlong" +/datum/sprite_accessory/hair/long + name = "Shoulder-length Hair" + icon_state = "hair_b" - long_over_eye - name = "Over eye" - icon_state = "hair_longovereye" +/datum/sprite_accessory/hair/longer + name = "Long Hair" + icon_state = "hair_vlong" - longest - name = "Very Long Hair" - icon_state = "hair_longest" +/datum/sprite_accessory/hair/over_eye + name = "Over Eye" + icon_state = "hair_overeye" - longest2 - name = "Very Long Over Eye" - icon_state = "hair_longest2" +/datum/sprite_accessory/hair/long_over_eye + name = "Long Over Eye" + icon_state = "hair_longovereye" - longfringe - name = "Long Fringe" - icon_state = "hair_longfringe" +/datum/sprite_accessory/hair/longest2 + name = "Very Long Over Eye" + icon_state = "hair_longest2" - longestalt - name = "Longer Fringe" - icon_state = "hair_vlongfringe" +/datum/sprite_accessory/hair/longest + name = "Very Long Hair" + icon_state = "hair_longest" - gentle - name = "Gentle" - icon_state = "hair_gentle" +/datum/sprite_accessory/hair/longfringe + name = "Long Fringe" + icon_state = "hair_longfringe" - halfbang - name = "Half-banged Hair" - icon_state = "hair_halfbang" +/datum/sprite_accessory/hair/longestalt + name = "Longer Fringe" + icon_state = "hair_vlongfringe" - halfbangalt - name = "Half-banged Hair Alt" - icon_state = "hair_halfbang_alt" +/datum/sprite_accessory/hair/gentle + name = "Gentle" + icon_state = "hair_gentle" - ponytail1 - name = "Ponytail 1" - icon_state = "hair_ponytail" +/datum/sprite_accessory/hair/halfbang + name = "Half-banged Hair" + icon_state = "hair_halfbang" - ponytail2 - name = "Ponytail 2" - icon_state = "hair_pa" +/datum/sprite_accessory/hair/halfbang2 + name = "Half-banged Hair 2" + icon_state = "hair_halfbang2" - ponytail3 - name = "Ponytail 3" - icon_state = "hair_ponytail3" +/datum/sprite_accessory/hair/ponytail1 + name = "Ponytail" + icon_state = "hair_ponytail" - side_tail - name = "Side Pony" - icon_state = "hair_sidetail" +/datum/sprite_accessory/hair/ponytail2 + name = "Ponytail 2" + icon_state = "hair_ponytail2" - side_tail2 - name = "Side Pony 2" - icon_state = "hair_sidetail2" +/datum/sprite_accessory/hair/ponytail3 + name = "Ponytail 3" + icon_state = "hair_ponytail3" - side_tail3 - name = "Side Pony 3" - icon_state = "hair_stail" +/datum/sprite_accessory/hair/ponytail4 + name = "Ponytail 4" + icon_state = "hair_ponytail4" - oneshoulder - name = "One Shoulder" - icon_state = "hair_oneshoulder" +/datum/sprite_accessory/hair/ponytail5 + name = "Ponytail 5" + icon_state = "hair_ponytail5" - tressshoulder - name = "Tress Shoulder" - icon_state = "hair_tressshoulder" - parted - name = "Parted" - icon_state = "hair_parted" +/datum/sprite_accessory/hair/sidetail + name = "Side Pony" + icon_state = "hair_sidetail" - pompadour - name = "Pompadour" - icon_state = "hair_pompadour" +/datum/sprite_accessory/hair/sidetail2 + name = "Side Pony 2" + icon_state = "hair_sidetail2" - quiff - name = "Quiff" - icon_state = "hair_quiff" +/datum/sprite_accessory/hair/sidetail3 + name = "Side Pony 3" + icon_state = "hair_sidetail3" - bedhead - name = "Bedhead" - icon_state = "hair_bedhead" +/datum/sprite_accessory/hair/sidetail4 + name = "Side Pony 4" + icon_state = "hair_sidetail4" - bedhead2 - name = "Bedhead 2" - icon_state = "hair_bedheadv2" +/datum/sprite_accessory/hair/oneshoulder + name = "One Shoulder" + icon_state = "hair_oneshoulder" - bedhead3 - name = "Bedhead 3" - icon_state = "hair_bedheadv3" +/datum/sprite_accessory/hair/tressshoulder + name = "Tress Shoulder" + icon_state = "hair_tressshoulder" - messy - name = "Messy" - icon_state = "hair_messy" +/datum/sprite_accessory/hair/parted + name = "Parted" + icon_state = "hair_parted" - beehive - name = "Beehive" - icon_state = "hair_beehive" +/datum/sprite_accessory/hair/pompadour + name = "Pompadour" + icon_state = "hair_pompadour" - bobcurl - name = "Bobcurl" - icon_state = "hair_bobcurl" +/datum/sprite_accessory/hair/bigpompadour + name = "Big Pompadour" + icon_state = "hair_bigpompadour" - bob - name = "Bob" - icon_state = "hair_bobcut" +/datum/sprite_accessory/hair/quiff + name = "Quiff" + icon_state = "hair_quiff" - bowl - name = "Bowl" - icon_state = "hair_bowlcut" +/datum/sprite_accessory/hair/bedhead + name = "Bedhead" + icon_state = "hair_bedhead" - buzz - name = "Buzzcut" - icon_state = "hair_buzzcut" +/datum/sprite_accessory/hair/bedhead2 + name = "Bedhead 2" + icon_state = "hair_bedheadv2" - crew - name = "Crewcut" - icon_state = "hair_crewcut" +/datum/sprite_accessory/hair/bedhead3 + name = "Bedhead 3" + icon_state = "hair_bedheadv3" - combover - name = "Combover" - icon_state = "hair_combover" +/datum/sprite_accessory/hair/messy + name = "Messy" + icon_state = "hair_messy" - devillock - name = "Devil Lock" - icon_state = "hair_devilock" +/datum/sprite_accessory/hair/beehive + name = "Beehive" + icon_state = "hair_beehive" - dreadlocks - name = "Dreadlocks" - icon_state = "hair_dreads" +/datum/sprite_accessory/hair/beehive2 + name = "Beehive 2" + icon_state = "hair_beehivev2" - curls - name = "Curls" - icon_state = "hair_curls" +/datum/sprite_accessory/hair/bobcurl + name = "Bobcurl" + icon_state = "hair_bobcurl" - afro - name = "Afro" - icon_state = "hair_afro" +/datum/sprite_accessory/hair/bob + name = "Bob" + icon_state = "hair_bobcut" - afro2 - name = "Afro 2" - icon_state = "hair_afro2" +/datum/sprite_accessory/hair/bowl + name = "Bowl" + icon_state = "hair_bowlcut" - afro_large - name = "Big Afro" - icon_state = "hair_bigafro" +/datum/sprite_accessory/hair/buzz + name = "Buzzcut" + icon_state = "hair_buzzcut" - sargeant - name = "Flat Top" - icon_state = "hair_sargeant" +/datum/sprite_accessory/hair/crew + name = "Crewcut" + icon_state = "hair_crewcut" - emo - name = "Emo" - icon_state = "hair_emo" +/datum/sprite_accessory/hair/combover + name = "Combover" + icon_state = "hair_combover" - fag - name = "Flow Hair" - icon_state = "hair_f" +/datum/sprite_accessory/hair/devillock + name = "Devil Lock" + icon_state = "hair_devilock" - feather - name = "Feather" - icon_state = "hair_feather" +/datum/sprite_accessory/hair/dreadlocks + name = "Dreadlocks" + icon_state = "hair_dreads" - hitop - name = "Hitop" - icon_state = "hair_hitop" +/datum/sprite_accessory/hair/curls + name = "Curls" + icon_state = "hair_curls" - mohawk - name = "Mohawk" - icon_state = "hair_d" +/datum/sprite_accessory/hair/afro + name = "Afro" + icon_state = "hair_afro" - jensen - name = "Adam Jensen Hair" - icon_state = "hair_jensen" +/datum/sprite_accessory/hair/afro2 + name = "Afro 2" + icon_state = "hair_afro2" - gelled - name = "Gelled Back" - icon_state = "hair_gelled" +/datum/sprite_accessory/hair/afro_large + name = "Big Afro" + icon_state = "hair_bigafro" - spiky - name = "Spiky" - icon_state = "hair_spikey" +/datum/sprite_accessory/hair/sargeant + name = "Flat Top" + icon_state = "hair_sargeant" - protagonist - name = "Slightly long" - icon_state = "hair_protagonist" +/datum/sprite_accessory/hair/emo + name = "Emo" + icon_state = "hair_emo" - kusangi - name = "Kusanagi Hair" - icon_state = "hair_kusanagi" +/datum/sprite_accessory/hair/longemo + name = "Long Emo" + icon_state = "hair_longemo" - kagami - name = "Pigtails" - icon_state = "hair_kagami" +/datum/sprite_accessory/hair/fag + name = "Flow Hair" + icon_state = "hair_f" - himecut - name = "Hime Cut" - icon_state = "hair_himecut" +/datum/sprite_accessory/hair/feather + name = "Feather" + icon_state = "hair_feather" - antenna - name = "Ahoge" - icon_state = "hair_antenna" +/datum/sprite_accessory/hair/hitop + name = "Hitop" + icon_state = "hair_hitop" - pigtail - name = "Pig tails" - icon_state = "hair_pigtails" +/datum/sprite_accessory/hair/mohawk + name = "Mohawk" + icon_state = "hair_d" - front_braid - name = "Braided front" - icon_state = "hair_braidfront" +/datum/sprite_accessory/hair/reversemohawk + name = "Reverse Mohawk" + icon_state = "hair_reversemohawk" - lowbraid - name = "Low Braid" - icon_state = "hair_hbraid" +/datum/sprite_accessory/hair/jensen + name = "Adam Jensen Hair" + icon_state = "hair_jensen" - not_floorlength_braid - name = "High Braid" - icon_state = "hair_braid2" +/datum/sprite_accessory/hair/gelled + name = "Gelled Back" + icon_state = "hair_gelled" - braid - name = "Floorlength Braid" - icon_state = "hair_braid" +/datum/sprite_accessory/hair/spiky + name = "Spiky" + icon_state = "hair_spikey" - odango - name = "Odango" - icon_state = "hair_odango" +/datum/sprite_accessory/hair/spiky2 + name = "Spiky 2" + icon_state = "hair_spiky" - ombre - name = "Ombre" - icon_state = "hair_ombre" +/datum/sprite_accessory/hair/spiky3 + name = "Spiky 3" + icon_state = "hair_spiky2" - updo - name = "Updo" - icon_state = "hair_updo" +/datum/sprite_accessory/hair/protagonist + name = "Slightly long" + icon_state = "hair_protagonist" - skinhead - name = "Skinhead" - icon_state = "hair_skinhead" +/datum/sprite_accessory/hair/kusangi + name = "Kusanagi Hair" + icon_state = "hair_kusanagi" - longbangs - name = "Long Bangs" - icon_state = "hair_lbangs" +/datum/sprite_accessory/hair/kagami + name = "Pigtails" + icon_state = "hair_kagami" - balding - name = "Balding Hair" - icon_state = "hair_e" +/datum/sprite_accessory/hair/pigtail + name = "Pigtails 2" + icon_state = "hair_pigtails" - bald - name = "Bald" - icon_state = null +/datum/sprite_accessory/hair/pigtail + name = "Pigtails 3" + icon_state = "hair_pigtails2" - parted - name = "Side Part" - icon_state = "hair_part" +/datum/sprite_accessory/hair/himecut + name = "Hime Cut" + icon_state = "hair_himecut" - braided - name = "Braided" - icon_state = "hair_braided" +/datum/sprite_accessory/hair/himecut2 + name = "Hime Cut 2" + icon_state = "hair_himecut2" - bun - name = "Bun Head" - icon_state = "hair_bun" +/datum/sprite_accessory/hair/himeup + name = "Hime Updo" + icon_state = "hair_himeup" + +/datum/sprite_accessory/hair/antenna + name = "Ahoge" + icon_state = "hair_antenna" + +/datum/sprite_accessory/hair/front_braid + name = "Braided front" + icon_state = "hair_braidfront" + +/datum/sprite_accessory/hair/lowbraid + name = "Low Braid" + icon_state = "hair_hbraid" + +/datum/sprite_accessory/hair/not_floorlength_braid + name = "High Braid" + icon_state = "hair_braid2" + +/datum/sprite_accessory/hair/shortbraid + name = "Short Braid" + icon_state = "hair_shortbraid" + +/datum/sprite_accessory/hair/braid + name = "Floorlength Braid" + icon_state = "hair_braid" + +/datum/sprite_accessory/hair/odango + name = "Odango" + icon_state = "hair_odango" + +/datum/sprite_accessory/hair/ombre + name = "Ombre" + icon_state = "hair_ombre" + +/datum/sprite_accessory/hair/updo + name = "Updo" + icon_state = "hair_updo" + +/datum/sprite_accessory/hair/skinhead + name = "Skinhead" + icon_state = "hair_skinhead" + +/datum/sprite_accessory/hair/longbangs + name = "Long Bangs" + icon_state = "hair_lbangs" + +/datum/sprite_accessory/hair/balding + name = "Balding Hair" + icon_state = "hair_e" + +/datum/sprite_accessory/hair/bald + name = "Bald" + icon_state = null + +/datum/sprite_accessory/hair/parted + name = "Side Part" + icon_state = "hair_part" + +/datum/sprite_accessory/hair/braided + name = "Braided" + icon_state = "hair_braided" + +/datum/sprite_accessory/hair/bun + name = "Bun Head" + icon_state = "hair_bun" + +/datum/sprite_accessory/hair/bun2 + name = "Bun Head 2" + icon_state = "hair_bunhead2" + +/datum/sprite_accessory/hair/braidtail + name = "Braided Tail" + icon_state = "hair_braidtail" + +/datum/sprite_accessory/hair/bigflattop + name = "Big Flat Top" + icon_state = "hair_bigflattop" + +/datum/sprite_accessory/hair/drillhair + name = "Drill Hair" + icon_state = "hair_drillhair" + +/datum/sprite_accessory/hair/keanu + name = "Keanu Hair" + icon_state = "hair_keanu" + +/datum/sprite_accessory/hair/swept + name = "Swept Back Hair" + icon_state = "hair_swept" + +/datum/sprite_accessory/hair/swept2 + name = "Swept Back Hair 2" + icon_state = "hair_swept2" + +/datum/sprite_accessory/hair/business + name = "Business Hair" + icon_state = "hair_business" + +/datum/sprite_accessory/hair/business2 + name = "Business Hair 2" + icon_state = "hair_business2" + +/datum/sprite_accessory/hair/business3 + name = "Business Hair 3" + icon_state = "hair_business3" + +/datum/sprite_accessory/hair/business4 + name = "Business Hair 4" + icon_state = "hair_business4" + +/datum/sprite_accessory/hair/hedgehog + name = "Hedgehog Hair" + icon_state = "hair_hedgehog" + +/datum/sprite_accessory/hair/bob + name = "Bob Hair" + icon_state = "hair_bob" + +/datum/sprite_accessory/hair/bob2 + name = "Bob Hair 2" + icon_state = "hair_bob2" + +/datum/sprite_accessory/hair/long + name = "Long Hair 1" + icon_state = "hair_long" + +/datum/sprite_accessory/hair/long2 + name = "Long Hair 2" + icon_state = "hair_long2" + +/datum/sprite_accessory/hair/pixie + name = "Pixie Cut" + icon_state = "hair_pixie" + +/datum/sprite_accessory/hair/megaeyebrows + name = "Mega Eyebrows" + icon_state = "hair_megaeyebrows" ///////////////////////////// // Facial Hair Definitions // @@ -335,82 +468,82 @@ icon = 'icons/mob/human_face.dmi' gender = MALE // barf (unless you're a dorf, dorfs dig chix w/ beards :P) - shaved - name = "Shaved" - icon_state = null - gender = NEUTER +/datum/sprite_accessory/facial_hair/shaved + name = "Shaved" + icon_state = null + gender = NEUTER - watson - name = "Watson Mustache" - icon_state = "facial_watson" +/datum/sprite_accessory/facial_hair/watson + name = "Watson Mustache" + icon_state = "facial_watson" - hogan - name = "Hulk Hogan Mustache" - icon_state = "facial_hogan" //-Neek +/datum/sprite_accessory/facial_hair/hogan + name = "Hulk Hogan Mustache" + icon_state = "facial_hogan" //-Neek - vandyke - name = "Van Dyke Mustache" - icon_state = "facial_vandyke" +/datum/sprite_accessory/facial_hair/vandyke + name = "Van Dyke Mustache" + icon_state = "facial_vandyke" - chaplin - name = "Square Mustache" - icon_state = "facial_chaplin" +/datum/sprite_accessory/facial_hair/chaplin + name = "Square Mustache" + icon_state = "facial_chaplin" - selleck - name = "Selleck Mustache" - icon_state = "facial_selleck" +/datum/sprite_accessory/facial_hair/selleck + name = "Selleck Mustache" + icon_state = "facial_selleck" - neckbeard - name = "Neckbeard" - icon_state = "facial_neckbeard" +/datum/sprite_accessory/facial_hair/neckbeard + name = "Neckbeard" + icon_state = "facial_neckbeard" - fullbeard - name = "Full Beard" - icon_state = "facial_fullbeard" +/datum/sprite_accessory/facial_hair/fullbeard + name = "Full Beard" + icon_state = "facial_fullbeard" - longbeard - name = "Long Beard" - icon_state = "facial_longbeard" +/datum/sprite_accessory/facial_hair/longbeard + name = "Long Beard" + icon_state = "facial_longbeard" - vlongbeard - name = "Very Long Beard" - icon_state = "facial_wise" +/datum/sprite_accessory/facial_hair/vlongbeard + name = "Very Long Beard" + icon_state = "facial_wise" - elvis - name = "Elvis Sideburns" - icon_state = "facial_elvis" +/datum/sprite_accessory/facial_hair/elvis + name = "Elvis Sideburns" + icon_state = "facial_elvis" - abe - name = "Abraham Lincoln Beard" - icon_state = "facial_abe" +/datum/sprite_accessory/facial_hair/abe + name = "Abraham Lincoln Beard" + icon_state = "facial_abe" - chinstrap - name = "Chinstrap" - icon_state = "facial_chin" +/datum/sprite_accessory/facial_hair/chinstrap + name = "Chinstrap" + icon_state = "facial_chin" - hip - name = "Hipster Beard" - icon_state = "facial_hip" +/datum/sprite_accessory/facial_hair/hip + name = "Hipster Beard" + icon_state = "facial_hip" - gt - name = "Goatee" - icon_state = "facial_gt" +/datum/sprite_accessory/facial_hair/gt + name = "Goatee" + icon_state = "facial_gt" - jensen - name = "Adam Jensen Beard" - icon_state = "facial_jensen" +/datum/sprite_accessory/facial_hair/jensen + name = "Adam Jensen Beard" + icon_state = "facial_jensen" - dwarf - name = "Dwarf Beard" - icon_state = "facial_dwarf" +/datum/sprite_accessory/facial_hair/dwarf + name = "Dwarf Beard" + icon_state = "facial_dwarf" - fiveoclock - name = "Five o Clock Shadow" - icon_state = "facial_fiveoclock" +/datum/sprite_accessory/facial_hair/fiveoclock + name = "Five o Clock Shadow" + icon_state = "facial_fiveoclock" - fu - name = "Fu Manchu" - icon_state = "facial_fumanchu" +/datum/sprite_accessory/facial_hair/fu + name = "Fu Manchu" + icon_state = "facial_fumanchu" /////////////////////////// // Underwear Definitions // @@ -418,127 +551,127 @@ /datum/sprite_accessory/underwear icon = 'icons/mob/underwear.dmi' - nude - name = "Nude" - icon_state = null - gender = NEUTER +/datum/sprite_accessory/underwear/nude + name = "Nude" + icon_state = null + gender = NEUTER - male_white - name = "Mens White" - icon_state = "male_white" - gender = MALE +/datum/sprite_accessory/underwear/male_white + name = "Mens White" + icon_state = "male_white" + gender = MALE - male_grey - name = "Mens Grey" - icon_state = "male_grey" - gender = MALE +/datum/sprite_accessory/underwear/male_grey + name = "Mens Grey" + icon_state = "male_grey" + gender = MALE - male_green - name = "Mens Green" - icon_state = "male_green" - gender = MALE +/datum/sprite_accessory/underwear/male_green + name = "Mens Green" + icon_state = "male_green" + gender = MALE - male_blue - name = "Mens Blue" - icon_state = "male_blue" - gender = MALE +/datum/sprite_accessory/underwear/male_blue + name = "Mens Blue" + icon_state = "male_blue" + gender = MALE - male_black - name = "Mens Black" - icon_state = "male_black" - gender = MALE +/datum/sprite_accessory/underwear/male_black + name = "Mens Black" + icon_state = "male_black" + gender = MALE - male_mankini - name = "Mankini" - icon_state = "male_mankini" - gender = MALE +/datum/sprite_accessory/underwear/male_mankini + name = "Mankini" + icon_state = "male_mankini" + gender = MALE - male_hearts - name = "Mens Hearts Boxer" - icon_state = "male_hearts" - gender = MALE +/datum/sprite_accessory/underwear/male_hearts + name = "Mens Hearts Boxer" + icon_state = "male_hearts" + gender = MALE - male_blackalt - name = "Mens Black Boxer" - icon_state = "male_blackalt" - gender = MALE +/datum/sprite_accessory/underwear/male_blackalt + name = "Mens Black Boxer" + icon_state = "male_blackalt" + gender = MALE - male_greyalt - name = "Mens Grey Boxer" - icon_state = "male_greyalt" - gender = MALE +/datum/sprite_accessory/underwear/male_greyalt + name = "Mens Grey Boxer" + icon_state = "male_greyalt" + gender = MALE - male_stripe - name = "Mens Striped Boxer" - icon_state = "male_stripe" - gender = MALE +/datum/sprite_accessory/underwear/male_stripe + name = "Mens Striped Boxer" + icon_state = "male_stripe" + gender = MALE - male_kinky - name = "Mens Kinky" - icon_state = "male_kinky" - gender = MALE +/datum/sprite_accessory/underwear/male_kinky + name = "Mens Kinky" + icon_state = "male_kinky" + gender = MALE - male_red - name = "Mens Red" - icon_state = "male_red" - gender = MALE +/datum/sprite_accessory/underwear/male_red + name = "Mens Red" + icon_state = "male_red" + gender = MALE - female_red - name = "Ladies Red" - icon_state = "female_red" - gender = FEMALE +/datum/sprite_accessory/underwear/female_red + name = "Ladies Red" + icon_state = "female_red" + gender = FEMALE - female_white - name = "Ladies White" - icon_state = "female_white" - gender = FEMALE +/datum/sprite_accessory/underwear/female_white + name = "Ladies White" + icon_state = "female_white" + gender = FEMALE - female_yellow - name = "Ladies Yellow" - icon_state = "female_yellow" - gender = FEMALE +/datum/sprite_accessory/underwear/female_yellow + name = "Ladies Yellow" + icon_state = "female_yellow" + gender = FEMALE - female_blue - name = "Ladies Blue" - icon_state = "female_blue" - gender = FEMALE +/datum/sprite_accessory/underwear/female_blue + name = "Ladies Blue" + icon_state = "female_blue" + gender = FEMALE - female_black - name = "Ladies Black" - icon_state = "female_black" - gender = FEMALE +/datum/sprite_accessory/underwear/female_black + name = "Ladies Black" + icon_state = "female_black" + gender = FEMALE - female_thong - name = "Ladies Thong" - icon_state = "female_thong" - gender = FEMALE +/datum/sprite_accessory/underwear/female_thong + name = "Ladies Thong" + icon_state = "female_thong" + gender = FEMALE - female_babydoll - name = "Babydoll" - icon_state = "female_babydoll" - gender = FEMALE +/datum/sprite_accessory/underwear/female_babydoll + name = "Babydoll" + icon_state = "female_babydoll" + gender = FEMALE - female_babyblue - name = "Ladies Baby-Blue" - icon_state = "female_babyblue" - gender = FEMALE +/datum/sprite_accessory/underwear/female_babyblue + name = "Ladies Baby-Blue" + icon_state = "female_babyblue" + gender = FEMALE - female_green - name = "Ladies Green" - icon_state = "female_green" - gender = FEMALE +/datum/sprite_accessory/underwear/female_green + name = "Ladies Green" + icon_state = "female_green" + gender = FEMALE - female_pink - name = "Ladies Pink" - icon_state = "female_pink" - gender = FEMALE +/datum/sprite_accessory/underwear/female_pink + name = "Ladies Pink" + icon_state = "female_pink" + gender = FEMALE - female_kinky - name = "Ladies Kinky" - icon_state = "female_kinky" - gender = FEMALE +/datum/sprite_accessory/underwear/female_kinky + name = "Ladies Kinky" + icon_state = "female_kinky" + gender = FEMALE - female_tankini - name = "Tankini" - icon_state = "female_tankini" - gender = FEMALE +/datum/sprite_accessory/underwear/female_tankini + name = "Tankini" + icon_state = "female_tankini" + gender = FEMALE diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 487dd675fe0..5bf229f61d5 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -1,25 +1,23 @@ -/mob/proc/say() - return - -/mob/verb/whisper() - set name = "Whisper" - set category = "IC" - return - +//Speech verbs. /mob/verb/say_verb(message as text) set name = "Say" set category = "IC" if(say_disabled) //This is here to try to identify lag problems - usr << "\red Speech is currently admin-disabled." + usr << "Speech is currently admin-disabled." return usr.say(message) +/mob/verb/whisper(message as text) + set name = "Whisper" + set category = "IC" + return + /mob/verb/me_verb(message as text) set name = "Me" set category = "IC" if(say_disabled) //This is here to try to identify lag problems - usr << "\red Speech is currently admin-disabled." + usr << "Speech is currently admin-disabled." return message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) @@ -34,7 +32,7 @@ var/alt_name = "" if(say_disabled) //This is here to try to identify lag problems - usr << "\red Speech is currently admin-disabled." + usr << "Speech is currently admin-disabled." return if(mind && mind.name) @@ -53,42 +51,14 @@ if(M.client && M.client.holder && (M.client.prefs.toggles & CHAT_DEAD)) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above M << rendered //Admins can hear deadchat, if they choose to, no matter if they're blind/deaf or not. else if(M.stat == DEAD) - M.show_message(rendered, 2) //Takes into account blindness and such. - return - -/mob/proc/say_understands(var/mob/other) - if (src.stat == 2) - return 1 - else if (istype(other, src.type)) - return 1 - else if(other.universal_speak || src.universal_speak) - return 1 - return 0 - -/mob/proc/say_quote(var/text) - if(!text) - return "says, \"...\""; //not the best solution, but it will stop a large number of runtimes. The cause is somewhere in the Tcomms code - var/ending = copytext(text, length(text)) - if (src.stuttering) - return "stammers, \"[text]\""; - if(isliving(src)) - var/mob/living/L = src - if (L.getBrainLoss() >= 60) - return "gibbers, \"[text]\""; - if (ending == "?") - return "asks, \"[text]\""; - if (ending == "!") - return "exclaims, \"[text]\""; - - return "says, \"[text]\""; + //M.show_message(rendered, 2) //Takes into account blindness and such. //preserved so you can look at it and cry at the stupidity of oldcoders. whoever coded this should be punched into the sun + M << rendered /mob/proc/emote(var/act) return -/mob/proc/get_ear() - // returns an atom representing a location on the map from which this - // mob can hear things +/mob/proc/hivecheck() + return 0 - // should be overloaded for all mobs whose "ear" is separate from their "mob" - - return get_turf(src) \ No newline at end of file +/mob/proc/lingcheck() + return 0 diff --git a/code/modules/mob/say_readme.dm b/code/modules/mob/say_readme.dm new file mode 100644 index 00000000000..f57b4249549 --- /dev/null +++ b/code/modules/mob/say_readme.dm @@ -0,0 +1,163 @@ +/*============================================================= +======================MIAUW'S SAY REWRITE====================== +=============================================================== + +This is a basic explanation of how say() works. Read this if you don't understand something. + +The basic "flow" of say() is that a speaker says a message, which is heard by hearers. What appears on screen +is constructed by each hearer seperately, and not by the speaker. + +This rewrite was needed, but is far from perfect. Report any bugs you come across and feel free to fix things up. +Radio code, while very much related to saycode, is not something I wanted to touch, so the code related to that may be messy. + +If you came here to see how to use saycode, all you will ever really need to call is say(message). +To have things react when other things speak around them, add the HEAR flag to their flags variable and +override their Hear() proc. + +=======================PROCS & VARIABLES======================= + Here follows a list of say()-related procs and variables. +global procs + get_radio_span(freq) + Returns the span class associated with that frequency. + + get_radio_name(freq) + Returns the name of that frequency. + + get_hearers_in_view(R, atom/source) + Self-explanatory. Calls get_hear() and then calls recursive_hear_check on everything that get_hear() returns. + + recursive_hear_check(atom/O) + Checks for hearers by looping through the contents of O and the contents of the contents of O and etc and checking + each object for the HEAR flag. Returns a list of objects with the HEAR flag. + + get_hear(range, atom/source) + Like view(), but ignores luminosity. + +/atom/movable + flags + The HEAR flag determines whether something is a hearer or not. + Hear() is only called on procs with this flag. + + languages + Bitmask variable. + What languages this object speaks/understands. If the languages of the speaker don't match the languages + of the hearer, the message will be modified in the hearer's lang_treat(). + + say(message) + Say() is the "mother-proc". It calls all the other procs required for speaking, but does little itself. + At the atom/movable level, say() just calls send_speech. + + Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + This proc handles hearing. What it does varies. For mobs, it treats the message with hearer-specific things + like language and deafness, then outputs it to the hearer. + + IMPORTANT NOTE: If radio_freq is not null, the code will assume that the speaker is virtual! (more info on this in the Radios section below) + + send_speech(message, range) + This proc composes a list of hearers (things with the HEAR flag + dead people) and calls Hear() on them. + Message treatment or composition of output are not done by this proc, these are handled by the rest of + say() and the hearer respectively. + + lang_treat(message, atom/movable/speaker, message_langs, raw_message) + Modifies the message by comparing the languages of the speaker with the languages of the hearer. + Called on the hearer. + + say_quote(text) + Adds a verb and quotes to a message, according to the type of mob. Called on the speaker. + +/mob + say_dead(message) + Sends a message to all dead people. Does not use Hear(). + + compose_message(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + Composes the message mobs see on their screen when they hear something. + + compose_track_href(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + Composes the href tags used by the AI for tracking. Returns "" for all mobs except AIs. + + compose_job(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + Composes the job and the end tag for tracking hrefs. Returns "" for all mobs except AIs. + + hivecheck() + Returns 1 if the mob can hear and talk in the alien hivemind. + + lingcheck() + Returns 1 if the mob can hear and talk in the changeling hivemind. + +/mob/living + say(message) + The say() of mob_living is significantly more complex than that of objects. + Most of the extra code has to do with radios and message treatment. + + check_emote(message) + Checks if the message begins with an * and is thus an emote. + + can_speak(message) + Calls can_speak_basic() and can_speak_vocal() + + can_speak_basic(message) + Sees if the mob can "think" the message. Does not include vocalization or stat checks. + Vocalization checks are in can_speak_vocal, stat checks have to be done manually. + Called right before handle_inherent_channels() + + can_speak_vocal(message) + Checks if the mob can vocalize their message. This is seperate so, for example, muzzles don't block + hivemind chat. + Called right after handle_inherent_channels() + + get_message_mode(message) + Checks the start of the message for a message mode, then returns said message mode. + DOES NOT TRIM THE MESSAGE. This is done manually. + + handle_inherent_channels(message, message_mode) + If message_mode is MODE_BINARY, MODE_ALIEN or MODE_CHANGELING (or, for AIs, MODE_HOLOPAD), this will + handle speaking in those modes. Return 1 to exit say(). + + treat_message(message) + What it says on the tin. Treats the message according to masks, mutantraces, mutations, etc. + Please try to keep things in a logical order (e.g. don't have masks handled before mutations), + even if that means you have to call ..() in the middle of the proc. + + radio(message, message_mode) + Handles talking into radios. Uses a switch to determine what radio to speak into and in which manner to do so. + + Return is a bitflag. + NOPASS = terminate say() (used for whispers) + ITALICS = add italics to the message + REDUCE_RANGE = reduce the message range to one tile. + + Return 0 if no radio was spoken into. + IMPORTANT: remember to call ..() and check for ..()'s return value properly! + +============================RADIOS============================= + +I did not want to interfere with radios too much, but I sort of had to. +For future generations, here is how radio code works: +First, talk_into() is called on a radio. This sends a signal datum into the magic machine that is tcomms, which +eventually results in broadcast_message() being called. + +Broadcast_message() does NOT call say() on radios, but rather calls Hear() on everyone in range of a radio. +This is because the system does not like repeating says. + +Furthermore, I changed radios to not be in the radio_controller. Instead, they are in a global list called all_radios. +This is an associative list, and the numbers as strings are the keys. The values are lists of radios that can hear said frequency. + +To add a radio, simply use add_radio(radio, frequency). To remove a radio, use remove_radio(radio, frequency). +To remove a radio from ALL frequencies, use remove_radio_all(radio). + +VIRTUAL SPEAKERS: +Virtual speakers are simply atom/movables with a few extra variables. +If radio_freq is not null, the code will rely on the fact that the speaker is virtual. This means that several procs will return something: + (all of these procs are defined at the atom/movable level and return "" at that level.) + GetJob() + Returns the job string variable of the virtual speaker. + GetTrack() + Returns wether the tracking href should be fake or not. + GetSource() + Returns the source of the virtual speaker. + GetRadio() + Returns the radio that was spoken through by the source. Needed for AI tracking. + +This is fairly hacky, but it means that I can advoid using istypes. It's mainly relevant for AI tracking and AI job display. + +That's all, folks!*/ \ No newline at end of file diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index f470ff5b325..15a3b7df52a 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -420,7 +420,7 @@ var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes if(!safe_animal(mobpath)) - usr << "\red Sorry but this mob type is currently unavailable." + usr << "Sorry but this mob type is currently unavailable." return if(notransform) @@ -453,7 +453,7 @@ var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes if(!safe_animal(mobpath)) - usr << "\red Sorry but this mob type is currently unavailable." + usr << "Sorry but this mob type is currently unavailable." return var/mob/new_mob = new mobpath(src.loc) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index ef53fcaa779..7b9bacaf5d3 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -47,7 +47,7 @@ if(M.can_inject(user, 1)) user << "You stab [M] with the pen." - M << "\red You feel a tiny prick!" + M << "You feel a tiny prick!" . = 1 add_logs(user, M, "stabbed", object="[name]") diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index b002c91a8dc..1df8ee0aa83 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -188,7 +188,7 @@ var/datum/picture/selection var/mob/living/silicon/ai/tempAI = usr if(tempAI.aicamera.aipictures.len == 0) - usr << "No images saved" + usr << "No images saved
    " return for(var/datum/picture/t in tempAI.aicamera.aipictures) nametemp += t.fields["name"] diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index c593cc727ad..88fa0d37683 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -4,6 +4,7 @@ * Camera Film * Photos * Photo Albums + * AI Photography */ /* @@ -30,6 +31,7 @@ var/icon/img //Big photo image var/scribble //Scribble on the back. var/blueprints = 0 //Does it include the blueprints? + var/sillynewscastervar //Photo objects with this set to 1 will not be ejected by a newscaster. Only gets set to 1 if a silicon puts one of their images into a newscaster /obj/item/weapon/photo/attack_self(mob/user) @@ -77,6 +79,11 @@ name = "photo[(n_name ? text("- '[n_name]'") : null)]" add_fingerprint(usr) +/obj/item/weapon/photo/proc/photocreate(var/inicon, var/inimg, var/indesc, var/inblueprints) + icon = inicon + img = inimg + desc = indesc + blueprints = inblueprints /* * Photo album @@ -106,13 +113,26 @@ var/pictures_left = 10 var/on = 1 var/blueprints = 0 //are blueprints visible in the current photo being created? - var/list/aipictures = list() //Allows for storage of pictures taken by AI, in a similar manner the datacore stores info + var/list/aipictures = list() //Allows for storage of pictures taken by AI, in a similar manner the datacore stores info. Keeping this here allows us to share some procs w/ regualar camera -/obj/item/device/camera/ai_camera //camera AI can take pictures with - name = "AI photo camera" +/obj/item/device/camera/siliconcam //camera AI can take pictures with + name = "silicon photo camera" var/in_camera_mode = 0 +/obj/item/device/camera/siliconcam/ai_camera //camera AI can take pictures with + name = "AI photo camera" + +/obj/item/device/camera/siliconcam/robot_camera //camera cyborgs can take pictures with.. needs it's own because of verb CATEGORY >.> + name = "Cyborg photo camera" + +/obj/item/device/camera/siliconcam/robot_camera/verb/borgprinting() + set category ="Robot Commands" + set name = "Print Image" + set src in usr + + borgprint() + /obj/item/device/camera/attack(mob/living/carbon/human/M, mob/user) return @@ -179,7 +199,7 @@ /obj/item/device/camera/proc/camera_get_mobs(turf/the_turf) var/mob_detail - for(var/mob/living/carbon/A in the_turf) + for(var/mob/living/A in the_turf) if(A.invisibility) continue var/holding = null if(A.l_hand || A.r_hand) @@ -203,11 +223,11 @@ var/list/seen if(!isAi) //crappy check, but without it AI photos would be subject to line of sight from the AI Eye object. Made the best of it by moving the sec camera check inside if(user.client) //To make shooting through security cameras possible - seen = hear(world.view, user.client.eye) //To make shooting through security cameras possible + seen = get_hear(world.view, user.client.eye) //To make shooting through security cameras possible else - seen = hear(world.view, user) + seen = get_hear(world.view, user) else - seen = hear(world.view, target) + seen = get_hear(world.view, target) var/list/turfs = list() for(var/turf/T in range(1, target)) @@ -222,10 +242,10 @@ temp.Blend("#000", ICON_OVERLAY) temp.Blend(camera_get_icon(turfs, target), ICON_OVERLAY) - if(!isAi) + if(!issilicon(user)) printpicture(user, temp, mobs, flag) else - aipicture(user, temp, mobs, blueprints) + aipicture(user, temp, mobs, isAi, blueprints) @@ -248,7 +268,7 @@ blueprints = 0 -/obj/item/device/camera/proc/aipicture(mob/user, icon/temp, mobs) //instead of printing a picture like a regular camera would, we do this instead for the AI +/obj/item/device/camera/proc/aipicture(mob/user, icon/temp, mobs, isAi) //instead of printing a picture like a regular camera would, we do this instead for the AI var/icon/small_img = icon(temp) var/icon/ic = icon('icons/obj/items.dmi',"photo") @@ -265,7 +285,11 @@ injectblueprints = 1 blueprints = 0 - injectaialbum(icon, img, desc, pixel_x, pixel_y, injectblueprints) + if(isAi) + injectaialbum(icon, img, desc, pixel_x, pixel_y, injectblueprints) + else + injectmasteralbum(icon, img, desc, pixel_x, pixel_y, injectblueprints) + /datum/picture @@ -278,7 +302,7 @@ for(var/datum/picture in src.aipictures) numberer++ var/datum/picture/P = new() - P.fields["name"] = "Image [numberer]" + P.fields["name"] = "Image [numberer] (taken by [src.loc.name])" P.fields["icon"] = icon P.fields["img"] = img P.fields["desc"] = desc @@ -287,33 +311,65 @@ P.fields["blueprints"] = blueprintsinject aipictures += P - usr << "Image recorded" //feedback to the AI player that the picture was taken + usr << "Image recorded" //feedback to the AI player that the picture was taken + +/obj/item/device/camera/proc/injectmasteralbum(var/icon, var/img, var/desc, var/pixel_x, var/pixel_y, var/blueprintsinject) //stores image information to a list similar to that of the datacore + var/numberer = 1 + var/mob/living/silicon/robot/C = src.loc + if(C.connected_ai) + for(var/datum/picture in C.connected_ai.aicamera.aipictures) + numberer++ + var/datum/picture/P = new() + P.fields["name"] = "Image [numberer] (taken by [src.loc.name])" + P.fields["icon"] = icon + P.fields["img"] = img + P.fields["desc"] = desc + P.fields["pixel_x"] = pixel_x + P.fields["pixel_y"] = pixel_y + P.fields["blueprints"] = blueprintsinject + + C.connected_ai.aicamera.aipictures += P + usr << "Image recorded and saved to remote database" //feedback to the Cyborg player that the picture was taken + else + injectaialbum(icon, img, desc, pixel_x, pixel_y, blueprintsinject) -/obj/item/device/camera/ai_camera/proc/viewpictures() //AI proc for viewing pictures they have taken +obj/item/device/camera/siliconcam/proc/viewpichelper(var/obj/item/device/camera/siliconcam/targetloc) var/list/nametemp = list() var/find var/datum/picture/selection - if(src.aipictures.len == 0) - usr << "No images saved" + if(targetloc.aipictures.len == 0) + usr << "No images saved" return - for(var/datum/picture/t in src.aipictures) + for(var/datum/picture/t in targetloc.aipictures) nametemp += t.fields["name"] find = input("Select image (numbered in order taken)") in nametemp var/obj/item/weapon/photo/P = new/obj/item/weapon/photo() - for(var/datum/picture/q in src.aipictures) + for(var/datum/picture/q in targetloc.aipictures) if(q.fields["name"] == find) selection = q break // just in case some AI decides to take 10 thousand pictures in a round - P.icon = selection.fields["icon"] - P.img = selection.fields["img"] - P.desc = selection.fields["desc"] + P.photocreate(selection.fields["icon"], selection.fields["img"], selection.fields["desc"]) P.pixel_x = selection.fields["pixel_x"] P.pixel_y = selection.fields["pixel_y"] P.show(usr) usr << P.desc - qdel(P) //so 10 thousdand pictures items are not left in memory should an AI take them and then view them all. + qdel(P) //so 10 thousand picture items are not left in memory should an AI take them and then view them all + +obj/item/device/camera/siliconcam/proc/viewpictures(user) + if(isrobot(user)) // Cyborg + var/mob/living/silicon/robot/C = src.loc + var/obj/item/device/camera/siliconcam/Cinfo + if(C.connected_ai) + Cinfo = C.connected_ai.aicamera + viewpichelper(Cinfo) + else + Cinfo = C.aicamera + viewpichelper(Cinfo) + else // AI + var/Ainfo = src + viewpichelper(Ainfo) /obj/item/device/camera/afterattack(atom/target, mob/user, flag) if(!on || !pictures_left || ismob(target.loc)) return @@ -329,16 +385,47 @@ icon_state = "camera" on = 1 -/obj/item/device/camera/ai_camera/proc/toggle_camera_mode() +/obj/item/device/camera/siliconcam/proc/toggle_camera_mode() if(in_camera_mode) camera_mode_off() else camera_mode_on() -/obj/item/device/camera/ai_camera/proc/camera_mode_off() +/obj/item/device/camera/siliconcam/proc/camera_mode_off() src.in_camera_mode = 0 usr << "Camera Mode deactivated" -/obj/item/device/camera/ai_camera/proc/camera_mode_on() +/obj/item/device/camera/siliconcam/proc/camera_mode_on() src.in_camera_mode = 1 usr << "Camera Mode activated" + +obj/item/device/camera/siliconcam/robot_camera/proc/borgprint() + var/list/nametemp = list() + var/find + var/datum/picture/selection + var/mob/living/silicon/robot/C = src.loc + var/obj/item/device/camera/siliconcam/targetcam = null + if(C.toner < 20) + usr << "Insufficent toner to print image." + return + if(C.connected_ai) + targetcam = C.connected_ai.aicamera + else + targetcam = C.aicamera + if(targetcam.aipictures.len == 0) + usr << "No images saved" + return + for(var/datum/picture/t in targetcam.aipictures) + nametemp += t.fields["name"] + find = input("Select image (numbered in order taken)") in nametemp + for(var/datum/picture/q in targetcam.aipictures) + if(q.fields["name"] == find) + selection = q + break + var/obj/item/weapon/photo/p = new /obj/item/weapon/photo(C.loc) + p.photocreate(selection.fields["icon"], selection.fields["img"], selection.fields["desc"], selection.fields["blueprints"]) + p.pixel_x = rand(-10, 10) + p.pixel_y = rand(-10, 10) + C.toner -= 20 //Cyborgs are very ineffeicient at printing an image + visible_message("[C.name] spits out a photograph from a narrow slot on it's chassis.") + usr << "You print a photograph." diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index c41a479aa97..abeb01e6729 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -161,12 +161,12 @@ src.anchored = 0 disconnect_from_network() else - user << "\red Once bolted and linked to a shielding unit it the [src.name] is unable to be moved!" + user << "Once bolted and linked to a shielding unit it the [src.name] is unable to be moved!" return if(istype(W, /obj/item/weapon/am_containment)) if(fueljar) - user << "\red There is already a [fueljar] inside!" + user << "There is already a [fueljar] inside!" return fueljar = W W.loc = src diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index 5233d1b6f38..33df680089e 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -66,7 +66,7 @@ proc/cardinalrange(var/center) /obj/machinery/am_shielding/Destroy() if(control_unit) control_unit.remove_shielding(src) if(processing) shutdown_core() - visible_message("\red The [src.name] melts!") + visible_message("The [src.name] melts!") //Might want to have it leave a mess on the floor but no sprites for now ..() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 18f0e451bfe..7433e5c5f17 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -383,7 +383,7 @@ if (istype(W, /obj/item/weapon/crowbar) && opened) if (has_electronics==1) if (terminal) - user << "\red Disconnect wires first." + user << "Disconnect wires first." return playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) user << "You are trying to remove the power control board..." //lpeters - fixed grammar issues @@ -391,13 +391,13 @@ has_electronics = 0 if ((stat & BROKEN) || malfhack) user.visible_message(\ - "\red [user.name] has broken the power control board inside [src.name]!",\ + "[user.name] has broken the power control board inside [src.name]!",\ "You broke the charred power control board and remove the remains.", "You hear a crack!") //ticker.mode:apcs-- //XSI said no and I agreed. -rastaf0 else user.visible_message(\ - "\red [user.name] has removed the power control board from [src.name]!",\ + "[user.name] has removed the power control board from [src.name]!",\ "You remove the power control board.") new /obj/item/weapon/module/power_control(loc) else if (opened!=2) //cover isn't removed @@ -405,7 +405,7 @@ update_icon() else if (istype(W, /obj/item/weapon/crowbar) && !((stat & BROKEN) || malfhack) ) if(coverlocked && !(stat & MAINT)) - user << "\red The cover is locked and cannot be opened." + user << "The cover is locked and cannot be opened." return else opened = 1 @@ -416,20 +416,20 @@ return else if (stat & MAINT) - user << "\red There is no connector for your power cell." + user << "There is no connector for your power cell." return user.drop_item() W.loc = src cell = W user.visible_message(\ - "\red [user.name] has inserted the power cell to [src.name]!",\ + "[user.name] has inserted the power cell to [src.name]!",\ "You insert the power cell.") chargecount = 0 update_icon() else if (istype(W, /obj/item/weapon/screwdriver)) // haxing if(opened) if (cell) - user << "\red Close the APC first." //Less hints more mystery! + user << "Close the APC first." //Less hints more mystery! return else if (has_electronics==1 && terminal) @@ -443,7 +443,7 @@ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "You unfasten the electronics." else /* has_electronics==0 */ - user << "\red There is nothing to secure." + user << "There is nothing to secure." return update_icon() else if(emagged) @@ -468,7 +468,7 @@ user << "You [ locked ? "lock" : "unlock"] the APC interface." update_icon() else - user << "\red Access denied." + user << "Access denied." else if (istype(W, /obj/item/weapon/card/emag) && !(emagged || malfhack)) // trying to unlock with an emag card if(opened) user << "You must close the cover to swipe an ID card." @@ -507,13 +507,13 @@ return C.use(10) user.visible_message(\ - "\red [user.name] has added cables to the APC frame!",\ + "[user.name] has added cables to the APC frame!",\ "You add cables to the APC frame.") make_terminal() terminal.connect_to_network() else if (istype(W, /obj/item/weapon/wirecutters) && terminal && opened && has_electronics!=2) if (src.loc:intact) - user << "\red You must remove the floor plating in front of the APC first." + user << "You must remove the floor plating in front of the APC first." return user << "You begin to cut the cables..." playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) @@ -525,7 +525,7 @@ return new /obj/item/stack/cable_coil(loc,10) user.visible_message(\ - "\red [user.name] cut the cables and dismantled the power terminal.",\ + "[user.name] cut the cables and dismantled the power terminal.",\ "You cut the cables and dismantle the power terminal.") qdel(terminal) else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && !((stat & BROKEN) || malfhack)) @@ -536,12 +536,12 @@ user << "You place the power control board inside the frame." qdel(W) else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && ((stat & BROKEN) || malfhack)) - user << "\red You cannot put the board inside, the frame is damaged." + user << "You cannot put the board inside, the frame is damaged." return else if (istype(W, /obj/item/weapon/weldingtool) && opened && has_electronics==0 && !terminal) var/obj/item/weapon/weldingtool/WT = W if (WT.get_fuel() < 3) - user << "\blue You need more welding fuel to complete this task." + user << "You need more welding fuel to complete this task." return user << "You start welding the APC frame..." playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) @@ -550,15 +550,15 @@ if (emagged || malfhack || (stat & BROKEN) || opened==2) new /obj/item/stack/sheet/metal(loc) user.visible_message(\ - "\red [src] has been cut apart by [user.name] with the weldingtool.",\ + "[src] has been cut apart by [user.name] with the weldingtool.",\ "You disassembled the broken APC frame.",\ - "\red You hear welding.") + "You hear welding.") else new /obj/item/apc_frame(loc) user.visible_message(\ - "\red [src] has been cut from the wall by [user.name] with the weldingtool.",\ + "[src] has been cut from the wall by [user.name] with the weldingtool.",\ "You cut the APC frame from the wall.",\ - "\red You hear welding.") + "You hear welding.") qdel(src) return else if (istype(W, /obj/item/apc_frame) && opened && emagged) @@ -566,7 +566,7 @@ if (opened==2) opened = 1 user.visible_message(\ - "\red [user.name] has replaced the damaged APC frontal panel with a new one.",\ + "[user.name] has replaced the damaged APC frontal panel with a new one.",\ "You replace the damaged APC frontal panel with a new one.") qdel(W) update_icon() @@ -577,7 +577,7 @@ user << "You begin to replace the damaged APC frame..." if(do_after(user, 50)) user.visible_message(\ - "\red [user.name] has replaced the damaged APC frame with new one.",\ + "[user.name] has replaced the damaged APC frame with new one.",\ "You replace the damaged APC frame with new one.") qdel(W) stat &= ~BROKEN @@ -593,8 +593,8 @@ && W.w_class >= 3.0 \ && prob(20) ) opened = 2 - user.visible_message("\red The APC cover was knocked down with the [W.name] by [user.name]!", \ - "\red You knock down the APC cover with your [W.name]!", \ + user.visible_message("The APC cover was knocked down with the [W.name] by [user.name]!", \ + "You knock down the APC cover with your [W.name]!", \ "You hear bang") update_icon() else @@ -604,8 +604,8 @@ (istype(W, /obj/item/device/multitool) || \ istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/assembly/signaler))) return src.attack_hand(user) - user.visible_message("\red The [src.name] has been hit with the [W.name] by [user.name]!", \ - "\red You hit the [src.name] with your [W.name]!", \ + user.visible_message("The [src.name] has been hit with the [W.name] by [user.name]!", \ + "You hit the [src.name] with your [W.name]!", \ "You hear bang") // attack with hand - remove cell (if cover open) or interact with the APC @@ -623,7 +623,7 @@ cell.updateicon() src.cell = null - user.visible_message("\red [user.name] removes the power cell from [src.name]!", "You remove the power cell.") + user.visible_message("[user.name] removes the power cell from [src.name]!", "You remove the power cell.") //user << "You remove the power cell." charging = 0 src.update_icon() @@ -636,7 +636,7 @@ /obj/machinery/power/apc/attack_alien(mob/living/carbon/alien/humanoid/user) if(!user) return - user.visible_message("\red [user.name] slashes at the [src.name]!", "\blue You slash at the [src.name]!") + user.visible_message("[user.name] slashes at the [src.name]!", "You slash at the [src.name]!") playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) var/allcut = wires.IsAllCut() @@ -644,12 +644,12 @@ if(beenhit >= pick(3, 4) && wiresexposed != 1) wiresexposed = 1 src.update_icon() - src.visible_message("\red The [src.name]'s cover flies open, exposing the wires!") + src.visible_message("The [src.name]'s cover flies open, exposing the wires!") else if(wiresexposed == 1 && allcut == 0) wires.CutAll() src.update_icon() - src.visible_message("\red The [src.name]'s wires are shredded!") + src.visible_message("The [src.name]'s wires are shredded!") else beenhit += 1 return @@ -768,20 +768,20 @@ /obj/machinery/power/apc/proc/can_use(mob/user as mob, var/loud = 0) //used by attack_hand() and Topic() if (user.stat) - user << "\red You must be conscious to use this [src]!" + user << "You must be conscious to use this [src]!" return 0 if(!user.client) return 0 if ( ! (istype(user, /mob/living/carbon/human) || \ istype(user, /mob/living/silicon) || \ istype(user, /mob/living/carbon/monkey)) ) - user << "\red You don't have the dexterity to use this [src]!" + user << "You don't have the dexterity to use this [src]!" return 0 if(user.restrained()) - user << "\red You must have free hands to use this [src]" + user << "You must have free hands to use this [src]." return 0 if(user.lying) - user << "\red You must stand to use this [src]!" + user << "You must stand to use this [src]!" return 0 if (istype(user, /mob/living/silicon)) var/mob/living/silicon/ai/AI = user @@ -795,7 +795,7 @@ ) \ ) if(!loud) - user << "\red \The [src] have AI control disabled!" + user << "\The [src] have AI control disabled!" return 0 else if ((!in_range(src, user) || !istype(src.loc, /turf))) @@ -805,10 +805,10 @@ if (istype(H)) if(H.getBrainLoss() >= 60) for(var/mob/M in viewers(src, null)) - M << "\red [H] stares cluelessly at [src] and drools." + M << "[H] stares cluelessly at [src] and drools." return 0 else if(prob(H.getBrainLoss())) - user << "\red You momentarily forget how to use [src]." + user << "You momentarily forget how to use [src]." return 0 return 1 @@ -954,7 +954,7 @@ point.the_disk = A //The pinpointer tracks the AI back into its core. else - src.occupier << "\red Primary core damaged, unable to return core processes." + src.occupier << "Primary core damaged, unable to return core processes." if(forced) src.occupier.loc = src.loc src.occupier.death() @@ -982,7 +982,7 @@ s.set_up(3, 1, src) s.start() for(var/mob/M in viewers(src)) - M.show_message("\red The [src.name] suddenly lets out a blast of smoke and some sparks!", 3, "\red You hear sizzling electronics.", 2) + M.show_message("The [src.name] suddenly lets out a blast of smoke and some sparks!", 3, "You hear sizzling electronics.", 2) /obj/machinery/power/apc/surplus() diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 3c13c5709eb..ba869fce07f 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -130,14 +130,16 @@ By design, d1 is the smallest direction and d2 is the highest if (shock(user, 50)) return + var/obj/newcable if(src.d1) // 0-X cables are 1 unit, X-X cables are 2 units long - new/obj/item/stack/cable_coil(T, 2, cable_color) + newcable = new/obj/item/stack/cable_coil(T, 2, cable_color) else - new/obj/item/stack/cable_coil(T, 1, cable_color) + newcable = new/obj/item/stack/cable_coil(T, 1, cable_color) for(var/mob/O in viewers(src, null)) - O.show_message("\red [user] cuts the cable.", 1) + O.show_message("[user] cuts the cable.", 1) + newcable.add_fingerprint(user) investigate_log("was cut by [key_name(usr, usr.client)] in [user.loc.loc]","wires") qdel(src) @@ -154,10 +156,10 @@ By design, d1 is the smallest direction and d2 is the highest else if(istype(W, /obj/item/device/multitool)) if(powernet && (powernet.avail > 0)) // is it powered? - user << "\red [powernet.avail]W in power network." + user << "[powernet.avail]W in power network." else - user << "\red The cable is not powered." + user << "The cable is not powered." shock(user, 5, 0.2) @@ -553,14 +555,14 @@ obj/structure/cable/proc/avail() if(ishuman(M) && !M.restrained() && !M.stat && !M.paralysis && ! M.stunned) if(!istype(usr.loc,/turf)) return if(src.amount <= 14) - usr << "\red You need at least 15 lengths to make restraints!" + usr << "You need at least 15 lengths to make restraints!" return var/obj/item/weapon/handcuffs/cable/B = new /obj/item/weapon/handcuffs/cable(usr.loc) B.icon_state = "cuff_[item_color]" - usr << "\blue You wind some cable together to make some restraints." + usr << "You wind some cable together to make some restraints." src.use(15) else - usr << "\blue You cannot do that." + usr << "You cannot do that." ..() // Items usable on a cable coil : diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index bc6cad2a655..2b60ba46e4d 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -56,7 +56,7 @@ if(usr /*&& !usr.stat*/) usr << "This cell has a power rating of [maxcharge], and you should not swallow it.\nThe charge meter reads [round(src.percent() )]%." if(crit_fail) - usr << "\red This power cell seems to be faulty." + usr << "This power cell seems to be faulty." /obj/item/weapon/stock_parts/cell/attack_self(mob/user as mob) src.add_fingerprint(user) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index b942018d001..43551762fa9 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -36,7 +36,7 @@ return var/turf/loc = get_turf(usr) if (!istype(loc, /turf/simulated/floor)) - usr << "\red [src.name] cannot be placed on this spot." + usr << "[src.name] cannot be placed on this spot." return usr << "Attaching [src] to the wall." playsound(src.loc, 'sound/machines/click.ogg', 75, 1) @@ -459,18 +459,18 @@ return else if (status == LIGHT_OK||status == LIGHT_BURNED) for(var/mob/M in viewers(src)) - M.show_message("\red [user.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2) + M.show_message("[user.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2) broken() return /obj/machinery/light/attack_animal(mob/living/simple_animal/M) if(M.melee_damage_upper == 0) return if(status == LIGHT_EMPTY||status == LIGHT_BROKEN) - M << "\red That object is useless to you." + M << "That object is useless to you." return else if (status == LIGHT_OK||status == LIGHT_BURNED) for(var/mob/O in viewers(src)) - O.show_message("\red [M.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2) + O.show_message("[M.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2) broken() return // attack with hand - remove tube/bulb @@ -716,7 +716,7 @@ /obj/item/weapon/light/proc/shatter() if(status == LIGHT_OK || status == LIGHT_BURNED) - src.visible_message("\red [name] shatters.","\red You hear a small glass object shatter.") + src.visible_message("[name] shatters.","You hear a small glass object shatter.") status = LIGHT_BROKEN force = 5 playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index b417f0121e4..5bb5c072507 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -144,8 +144,8 @@ display round(lastgen) and plasmatank amount /obj/machinery/power/port_gen/pacman/examine() ..() - usr << "\blue The generator has [sheets] units of [sheet_name] fuel left, producing [power_gen] per cycle." - if(crit_fail) usr << "\red The generator seems to have broken down." + usr << "The generator has [sheets] units of [sheet_name] fuel left, producing [power_gen] per cycle." + if(crit_fail) usr << "The generator seems to have broken down." /obj/machinery/power/port_gen/pacman/HasFuel() if(sheets >= 1 / (time_per_sheet / power_output) - sheet_left) @@ -207,9 +207,9 @@ display round(lastgen) and plasmatank amount var/obj/item/stack/addstack = O var/amount = min((max_sheets - sheets), addstack.amount) if(amount < 1) - user << "\blue The [src.name] is full!" + user << "The [src.name] is full!" return - user << "\blue You add [amount] sheets to the [src.name]." + user << "You add [amount] sheets to the [src.name]." sheets += amount addstack.use(amount) updateUsrDialog() @@ -226,11 +226,11 @@ display round(lastgen) and plasmatank amount if(!anchored && !isinspace()) connect_to_network() - user << "\blue You secure the generator to the floor." + user << "You secure the generator to the floor." anchored = 1 else if(anchored) disconnect_from_network() - user << "\blue You unsecure the generator from the floor." + user << "You unsecure the generator from the floor." anchored = 0 playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) @@ -239,9 +239,9 @@ display round(lastgen) and plasmatank amount panel_open = !panel_open playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) if(panel_open) - user << "\blue You open the access panel." + user << "You open the access panel." else - user << "\blue You close the access panel." + user << "You close the access panel." else if(istype(O, /obj/item/weapon/crowbar) && panel_open) default_deconstruction_crowbar(O) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index c2b41f5bb03..fbf10c64a0a 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -44,23 +44,23 @@ var/global/list/rad_collectors = list() investigate_log("turned [active?"on":"off"] by [user.key]. [P?"Fuel: [round(P.air_contents.toxins/0.29)]%":"It is empty"].","singulo") return else - user << "\red The controls are locked!" + user << "The controls are locked!" return ..() /obj/machinery/power/rad_collector/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/device/multitool)) - user << "\blue The [W.name] detects that [last_power]W were recently produced." + user << "The [W.name] detects that [last_power]W were recently produced." return 1 else if(istype(W, /obj/item/device/analyzer) && P) atmosanalyzer_scan(P.air_contents, user) else if(istype(W, /obj/item/weapon/tank/plasma)) if(!src.anchored) - user << "\red The [src] needs to be secured to the floor first." + user << "The [src] needs to be secured to the floor first." return 1 if(src.P) - user << "\red There's already a plasma tank loaded." + user << "There's already a plasma tank loaded." return 1 user.drop_item() src.P = W @@ -72,7 +72,7 @@ var/global/list/rad_collectors = list() return 1 else if(istype(W, /obj/item/weapon/wrench)) if(P) - user << "\blue Remove the plasma tank first." + user << "Remove the plasma tank first." return 1 if(!anchored && !isinspace()) playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) @@ -95,9 +95,9 @@ var/global/list/rad_collectors = list() user << "The controls are now [src.locked ? "locked." : "unlocked."]" else src.locked = 0 //just in case it somehow gets locked - user << "\red The controls can only be locked when the [src] is active" + user << "The controls can only be locked when the [src] is active." else - user << "\red Access denied!" + user << "Access denied!" return 1 else ..() diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 56dcd502414..4158e2e1fec 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -82,17 +82,17 @@ user.Stun(stun) user.Weaken(10) user.burn_skin(shock_damage) - user.visible_message("\red [user.name] was shocked by the [src.name]!", \ - "\red You feel a powerful shock course through your body sending you flying!", \ - "\red You hear a heavy electrical crack") + user.visible_message("[user.name] was shocked by the [src.name]!", \ + "You feel a powerful shock course through your body sending you flying!", \ + "You hear a heavy electrical crack.") else if(issilicon(user)) if(prob(20)) user.Stun(2) user.take_overall_damage(0, shock_damage) - user.visible_message("\red [user.name] was shocked by the [src.name]!", \ - "\red Energy pulse detected, system damaged!", \ - "\red You hear an electrical crack") + user.visible_message("[user.name] was shocked by the [src.name]!", \ + "Energy pulse detected, system damaged!", \ + "You hear an electrical crack.") user.updatehealth() var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src))) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index a644a5b0d54..e1ff0aa2a43 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -73,9 +73,9 @@ investigate_log("turned on by [user.key]","singulo") update_icon() else - user << "\red The controls are locked!" + user << "The controls are locked!" else - user << "\red The [src] needs to be firmly secured to the floor first." + user << "The [src] needs to be firmly secured to the floor first." return 1 @@ -164,7 +164,7 @@ "You hear a ratchet") src.anchored = 0 if(2) - user << "\red The [src.name] needs to be unwelded from the floor." + user << "The [src.name] needs to be unwelded from the floor." return if(istype(W, /obj/item/weapon/weldingtool)) @@ -174,7 +174,7 @@ return switch(state) if(0) - user << "\red The [src.name] needs to be wrenched to the floor." + user << "The [src.name] needs to be wrenched to the floor." if(1) if (WT.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) @@ -187,7 +187,7 @@ user << "You weld the [src] to the floor." connect_to_network() else - user << "\red You need more welding fuel to complete this task." + user << "You need more welding fuel to complete this task." if(2) if (WT.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) @@ -200,12 +200,12 @@ user << "You cut the [src] free from the floor." disconnect_from_network() else - user << "\red You need more welding fuel to complete this task." + user << "You need more welding fuel to complete this task." return if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) if(emagged) - user << "\red The lock seems to be broken" + user << "The lock seems to be broken." return if(src.allowed(user)) if(active) @@ -213,16 +213,16 @@ user << "The controls are now [src.locked ? "locked." : "unlocked."]" else src.locked = 0 //just in case it somehow gets locked - user << "\red The controls can only be locked when the [src] is online" + user << "The controls can only be locked when the [src] is online." else - user << "\red Access denied." + user << "Access denied." return if(istype(W, /obj/item/weapon/card/emag) && !emagged) locked = 0 emagged = 1 - user.visible_message("[user.name] emags the [src.name].","\red You short out the lock.") + user.visible_message("[user.name] emags the [src.name].","You short out the lock.") return ..() diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 3cb5edc8fee..e9ceeffcbd9 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -115,13 +115,13 @@ field_generator power level display "You hear ratchet") src.anchored = 0 if(2) - user << "\red The [src.name] needs to be unwelded from the floor." + user << "The [src.name] needs to be unwelded from the floor." return else if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W switch(state) if(0) - user << "\red The [src.name] needs to be wrenched to the floor." + user << "The [src.name] needs to be wrenched to the floor." return if(1) if (WT.remove_fuel(0,user)) @@ -212,7 +212,7 @@ field_generator power level display return 1 else for(var/mob/M in viewers(src)) - M.show_message("\red The [src.name] shuts down!") + M.show_message("The [src.name] shuts down!") turn_off() investigate_log("ran out of power and deactivated","singulo") src.power = 0 diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 5336163c4fd..770cd676ed8 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -438,12 +438,12 @@ if (istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M if(istype(H.glasses,/obj/item/clothing/glasses/meson)) - H << "\blue You look directly into The [src.name], good thing you had your protective eyewear on!" + H << "You look directly into The [src.name], good thing you had your protective eyewear on!" return - M << "\red You look directly into The [src.name] and feel weak." + M << "You look directly into The [src.name] and feel weak." M.apply_effect(3, STUN) for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] stares blankly at The []!", M, src), 1) + O.show_message(text("[] stares blankly at The []!", M, src), 1) return diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index d246343d260..11cf4e62218 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -417,7 +417,7 @@ var/list/solars_list = list() playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) if(do_after(user, 20)) if (src.stat & BROKEN) - user << "\blue The broken glass falls out." + user << "The broken glass falls out." var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) new /obj/item/weapon/shard( src.loc ) var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A ) @@ -429,7 +429,7 @@ var/list/solars_list = list() A.anchored = 1 qdel(src) else - user << "\blue You disconnect the monitor." + user << "You disconnect the monitor." var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A ) for (var/obj/C in src) diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index be9f64f54f7..cc767928e92 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -28,7 +28,7 @@ icon_state = "[initial(icon_state)][BB ? "-live" : ""]" desc = "[initial(desc)][BB ? "" : " This one is spent"]" -/obj/item/ammo_casing/proc/newshot() //For energy weapons and shotgun shells. +/obj/item/ammo_casing/proc/newshot() //For energy weapons, shotgun shells and wands (!). if (!BB) BB = new projectile_type(src) return diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/ammo_casings.dm similarity index 68% rename from code/modules/projectiles/ammunition/bullets.dm rename to code/modules/projectiles/ammunition/ammo_casings.dm index c39b9e35c45..205ab164360 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -1,124 +1,151 @@ -/obj/item/ammo_casing/a357 - desc = "A .357 bullet casing." - caliber = "357" - projectile_type = /obj/item/projectile/bullet - -/obj/item/ammo_casing/a50 - desc = "A .50AE bullet casing." - caliber = ".50" - projectile_type = /obj/item/projectile/bullet - -/obj/item/ammo_casing/a418 - desc = "A .418 bullet casing." - caliber = "357" - projectile_type = /obj/item/projectile/bullet/suffocationbullet - - -/obj/item/ammo_casing/a666 - desc = "A .666 bullet casing." - caliber = "357" - projectile_type = /obj/item/projectile/bullet/cyanideround - - -/obj/item/ammo_casing/c38 - desc = "A .38 bullet casing." - caliber = "38" - projectile_type = /obj/item/projectile/bullet/weakbullet2 - - -/obj/item/ammo_casing/c10mm - desc = "A 10mm bullet casing." - caliber = "10mm" - projectile_type = /obj/item/projectile/bullet/midbullet3 - - -/obj/item/ammo_casing/c9mm - desc = "A 9mm bullet casing." - caliber = "9mm" - projectile_type = /obj/item/projectile/bullet/midbullet2 - - -/obj/item/ammo_casing/c45 - desc = "A .45 bullet casing." - caliber = ".45" - projectile_type = /obj/item/projectile/bullet/midbullet - - -/obj/item/ammo_casing/shotgun - name = "shotgun slug" - desc = "A 12 gauge slug." - icon_state = "blshell" - caliber = "shotgun" - projectile_type = /obj/item/projectile/bullet - m_amt = 4000 - - -/obj/item/ammo_casing/shotgun/buckshot - name = "shotgun shell" - desc = "A 12 gauge shell." - icon_state = "gshell" - projectile_type = /obj/item/projectile/bullet/pellet - pellets = 5 - variance = 0.8 - - -/obj/item/ammo_casing/shotgun/beanbag - name = "beanbag shell" - desc = "A weak beanbag shell." - icon_state = "bshell" - projectile_type = /obj/item/projectile/bullet/weakbullet - m_amt = 250 - - -/obj/item/ammo_casing/shotgun/stunshell - name = "stun shell" - desc = "A stunning shell." - icon_state = "stunshell" - projectile_type = /obj/item/projectile/bullet/stunshot - m_amt = 200 - - -/obj/item/ammo_casing/shotgun/incendiary - name = "incendiary shell" - desc = "An incendiary shell" - icon_state = "ishell" - projectile_type = /obj/item/projectile/bullet/incendiary/shell - - -/obj/item/ammo_casing/shotgun/dart - name = "shotgun dart" - desc = "A dart for use in shotguns. Can be injected with up to 30 units of any chemical." - icon_state = "cshell" - projectile_type = /obj/item/projectile/bullet/dart - -/obj/item/ammo_casing/shotgun/dart/New() - ..() - flags |= NOREACT - flags |= OPENCONTAINER - create_reagents(30) - -/obj/item/ammo_casing/shotgun/dart/attackby() - return - -/obj/item/ammo_casing/a762 - desc = "A 7.62mm bullet casing." - caliber = "a762" - projectile_type = /obj/item/projectile/bullet - - -/obj/item/ammo_casing/caseless - desc = "A caseless bullet casing." - - -/obj/item/ammo_casing/caseless/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params, var/distro, var/quiet) - if (..()) - loc = null - return 1 - else - return 0 - - -/obj/item/ammo_casing/caseless/a75 - desc = "A .75 bullet casing." - caliber = "75" - projectile_type = /obj/item/projectile/bullet/gyro +/obj/item/ammo_casing/a357 + desc = "A .357 bullet casing." + caliber = "357" + projectile_type = /obj/item/projectile/bullet + +/obj/item/ammo_casing/a50 + desc = "A .50AE bullet casing." + caliber = ".50" + projectile_type = /obj/item/projectile/bullet + +/obj/item/ammo_casing/a418 + desc = "A .418 bullet casing." + caliber = "357" + projectile_type = /obj/item/projectile/bullet/suffocationbullet + + +/obj/item/ammo_casing/a666 + desc = "A .666 bullet casing." + caliber = "357" + projectile_type = /obj/item/projectile/bullet/cyanideround + + +/obj/item/ammo_casing/c38 + desc = "A .38 bullet casing." + caliber = "38" + projectile_type = /obj/item/projectile/bullet/weakbullet2 + + +/obj/item/ammo_casing/c10mm + desc = "A 10mm bullet casing." + caliber = "10mm" + projectile_type = /obj/item/projectile/bullet/midbullet3 + + +/obj/item/ammo_casing/c9mm + desc = "A 9mm bullet casing." + caliber = "9mm" + projectile_type = /obj/item/projectile/bullet/midbullet2 + + +/obj/item/ammo_casing/c45 + desc = "A .45 bullet casing." + caliber = ".45" + projectile_type = /obj/item/projectile/bullet/midbullet + + +/obj/item/ammo_casing/shotgun + name = "shotgun slug" + desc = "A 12 gauge slug." + icon_state = "blshell" + caliber = "shotgun" + projectile_type = /obj/item/projectile/bullet + m_amt = 4000 + + +/obj/item/ammo_casing/shotgun/buckshot + name = "shotgun shell" + desc = "A 12 gauge shell." + icon_state = "gshell" + projectile_type = /obj/item/projectile/bullet/pellet + pellets = 5 + variance = 0.8 + + +/obj/item/ammo_casing/shotgun/beanbag + name = "beanbag shell" + desc = "A weak beanbag shell." + icon_state = "bshell" + projectile_type = /obj/item/projectile/bullet/weakbullet + m_amt = 250 + + +/obj/item/ammo_casing/shotgun/stunshell + name = "stun shell" + desc = "A stunning shell." + icon_state = "stunshell" + projectile_type = /obj/item/projectile/bullet/stunshot + m_amt = 200 + + +/obj/item/ammo_casing/shotgun/meteorshot + name = "meteorshot shell" + desc = "A shotgun shell rigged with CMC technology, which launches a massive slug when fired." + icon_state = "mshell" + projectile_type = /obj/item/projectile/bullet/meteorshot + +/obj/item/ammo_casing/shotgun/pulseslug + name = "pulse slug" + desc = "A delicate device which can be loaded into a shotgun. The primer acts as a button which triggers the gain medium and fires a powerful \ + energy blast. While the heat and power drain limit it to one use, it can still allow an operator to engage targets that ballistic ammunition \ + would have difficulty with." + icon_state = "pshell" + projectile_type = /obj/item/projectile/beam/pulse/shot + +/obj/item/ammo_casing/shotgun/incendiary + name = "incendiary slug" + desc = "An incendiary shell which fires a single slug of incendiary ammo." + icon_state = "ishell" + projectile_type = /obj/item/projectile/bullet/incendiary/shell + +/obj/item/ammo_casing/shotgun/incendiary/dragonsbreath + name = "dragonsbreath shell" + desc = "An incendiary shell which fires a spread of incendiary ammo." + icon_state = "ishell2" + projectile_type = /obj/item/projectile/bullet/incendiary/shell/dragonsbreath + pellets = 4 + variance = 0.9 + +/obj/item/ammo_casing/shotgun/techshell + name = "unloaded technological shell" + desc = "A high-tech shotgun shell which can be loaded with materials to produce unique effects." + icon_state = "cshell" + projectile_type = null + +/obj/item/ammo_casing/shotgun/dart + name = "shotgun dart" + desc = "A dart for use in shotguns. Can be injected with up to 30 units of any chemical." + icon_state = "cshell" + projectile_type = /obj/item/projectile/bullet/dart + +/obj/item/ammo_casing/shotgun/dart/New() + ..() + flags |= NOREACT + flags |= OPENCONTAINER + create_reagents(30) + +/obj/item/ammo_casing/shotgun/dart/attackby() + return + +/obj/item/ammo_casing/a762 + desc = "A 7.62mm bullet casing." + caliber = "a762" + projectile_type = /obj/item/projectile/bullet + + +/obj/item/ammo_casing/caseless + desc = "A caseless bullet casing." + + +/obj/item/ammo_casing/caseless/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params, var/distro, var/quiet) + if (..()) + loc = null + return 1 + else + return 0 + + +/obj/item/ammo_casing/caseless/a75 + desc = "A .75 bullet casing." + caliber = "75" + projectile_type = /obj/item/projectile/bullet/gyro diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 5f65f777dd8..4caf9eb7aa7 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -29,7 +29,8 @@ return 1 /obj/item/weapon/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj) - user << "*click*" + user << "*click*" + playsound(user, 'sound/weapons/empty.ogg', 100, 1) return /obj/item/weapon/gun/proc/shoot_live_shot(mob/living/user as mob|obj, var/pointblank = 0, var/mob/pbtarget = null) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index fb6c41d2216..ebace57085b 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -78,6 +78,10 @@ obj/item/weapon/gun/energy/laser/retro desc = "With the L.A.S.E.R. cannon, the lasing medium is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core. This incredible technology may help YOU achieve high excitation rates with small laser volumes!" icon_state = "lasercannon" item_state = "laser" + w_class = 4.0 + force = 10 + flags = CONDUCT + slot_flags = SLOT_BACK origin_tech = "combat=4;materials=3;powerstorage=3" ammo_type = list(/obj/item/ammo_casing/energy/laser/heavy) @@ -106,7 +110,7 @@ obj/item/weapon/gun/energy/laser/retro if(ishuman(M)) if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag)) return 1 - M << "\red You need to be wearing your laser tag vest!" + M << "You need to be wearing your laser tag vest!" return 0 /obj/item/weapon/gun/energy/laser/bluetag/New() @@ -143,7 +147,7 @@ obj/item/weapon/gun/energy/laser/retro if(ishuman(M)) if(istype(M.wear_suit, /obj/item/clothing/suit/redtag)) return 1 - M << "\red You need to be wearing your laser tag vest!" + M << "You need to be wearing your laser tag vest!" return 0 /obj/item/weapon/gun/energy/laser/redtag/New() @@ -163,4 +167,4 @@ obj/item/weapon/gun/energy/laser/retro if(!power_supply) return 0 power_supply.give(100) update_icon() - return 1 + return 1 diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 3b3198fc952..7074c8102b1 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -50,16 +50,16 @@ if (prob(src.reliability)) for (var/mob/living/M in range(0,src)) //Only a minor failure, enjoy your radiation if you're in the same tile or carrying it if (src in M.contents) - M << "\red Your gun feels pleasantly warm for a moment." + M << "Your gun feels pleasantly warm for a moment." else - M << "\red You feel a warm sensation." + M << "You feel a warm sensation." M.apply_effect(rand(3,120), IRRADIATE) lightfail = 1 else for (var/mob/living/M in range(rand(1,4),src)) //Big failure, TIME FOR RADIATION BITCHES if (src in M.contents) - M << "\red Your gun's reactor overloads!" - M << "\red You feel a wave of heat wash over you." + M << "Your gun's reactor overloads!" + M << "You feel a wave of heat wash over you." M.apply_effect(300, IRRADIATE) crit_fail = 1 //break the gun so it stops recharging processing_objects.Remove(src) diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index deb5e4e2999..fcf35cf32a4 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -2,8 +2,11 @@ name = "pulse rifle" desc = "A heavy-duty, multifaceted energy rifle with three modes. Preferred by front-line combat personnel." icon_state = "pulse" - item_state = null //so the human update icon uses the icon_state instead. + item_state = "pulse" + w_class = 4.0 force = 10 + flags = CONDUCT + slot_flags = SLOT_BACK ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse, /obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser) cell_type = "/obj/item/weapon/stock_parts/cell/super" @@ -18,7 +21,7 @@ ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse) /obj/item/weapon/gun/energy/pulse_rifle/destroyer/attack_self(mob/living/user as mob) - user << "\red [src.name] has three settings, and they are all DESTROY." + user << "[src.name] has three settings, and they are all DESTROY." diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index c036dfdb2ef..f9a0be82b99 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -32,7 +32,11 @@ /obj/item/weapon/gun/magic/proc/newshot() if (charges && chambered) chambered.newshot() - charges-- + return + +/obj/item/weapon/gun/magic/process_chamber() + if(chambered && !chambered.BB) //if BB is null, i.e the shot has been fired... + charges--//... drain a charge return /obj/item/weapon/gun/magic/New() diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index f6c236ca156..b6d5446ce0d 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -53,6 +53,11 @@ playsound(user, fire_sound, 50, 1) user.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] zapped \himself with a [src]" + +///////////////////////////////////// +//WAND OF DEATH +///////////////////////////////////// + /obj/item/weapon/gun/magic/wand/death name = "wand of death" desc = "This deadly wand overwhelms the victim's body with pure energy, slaying them without fail." @@ -68,6 +73,10 @@ charges-- ..() +///////////////////////////////////// +//WAND OF HEALING +///////////////////////////////////// + /obj/item/weapon/gun/magic/wand/resurrection name = "wand of healing" desc = "This wand uses healing magics to heal and revive. They are rarely utilized within the Wizard Federation for some reason." @@ -81,6 +90,10 @@ charges-- ..() +///////////////////////////////////// +//WAND OF POLYMORPH +///////////////////////////////////// + /obj/item/weapon/gun/magic/wand/polymorph name = "wand of polymorph" desc = "This wand is attuned to chaos and will radically alter the victim's form." @@ -93,6 +106,10 @@ wabbajack(user) charges-- +///////////////////////////////////// +//WAND OF TELEPORTATION +///////////////////////////////////// + /obj/item/weapon/gun/magic/wand/teleport name = "wand of teleportation" desc = "This wand will wrench targets through space and time to move them somewhere else." @@ -109,6 +126,10 @@ charges-- ..() +///////////////////////////////////// +//WAND OF DOOR CREATION +///////////////////////////////////// + /obj/item/weapon/gun/magic/wand/door name = "wand of door creation" desc = "This particular wand can create doors in any wall for the unscrupulous wizard who shuns teleportation magics." @@ -120,6 +141,10 @@ /obj/item/weapon/gun/magic/wand/door/zap_self() return +///////////////////////////////////// +//WAND OF FIREBALL +///////////////////////////////////// + /obj/item/weapon/gun/magic/wand/fireball name = "wand of fireball" desc = "This wand shoots scorching balls of fire that explode into destructive flames." diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index ee56dd0c6e2..d313deaa92b 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -207,7 +207,7 @@ if(target == user) if(!chambered) - user.visible_message("\red *click*", "\red *click*") + user.visible_message("*click*", "*click*") return if(isliving(target) && isliving(user)) @@ -220,7 +220,7 @@ user.visible_message("[user.name] fires [src] at \his head!", "You fire [src] at your head!", "You hear a [istype(AC.BB, /obj/item/projectile/beam) ? "laser blast" : "gunshot"]!") return else - user.visible_message("\red *click*", "\red *click*") + user.visible_message("*click*", "*click*") return ..() diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 276a3b8d0de..a64c3291f23 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -40,16 +40,14 @@ name = "pulse" icon_state = "u_laser" damage = 50 - on_hit(var/atom/target, var/blocked = 0) - if(istype(target,/turf/)||istype(target,/obj/structure/)) - target.ex_act(2) - ..() +/obj/item/projectile/beam/pulse/on_hit(var/atom/target, var/blocked = 0) + if(istype(target,/turf/)||istype(target,/obj/structure/)) + target.ex_act(2) + ..() -/obj/item/projectile/beam/deathlaser - name = "death laser" - icon_state = "heavylaser" - damage = 60 +/obj/item/projectile/beam/pulse/shot + damage = 40 /obj/item/projectile/beam/emitter name = "emitter beam" diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 918800c32e0..f56e641c8e2 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -50,11 +50,6 @@ damage_type = TOX -/obj/item/projectile/bullet/burstbullet//I think this one needs something for the on hit - name = "exploding bullet" - damage = 20 - - /obj/item/projectile/bullet/stunshot name = "stunshot" damage = 5 @@ -70,25 +65,56 @@ /obj/item/projectile/bullet/incendiary /obj/item/projectile/bullet/incendiary/on_hit(var/atom/target, var/blocked = 0) - if(istype(target, /mob/living/carbon)) - var/mob/living/carbon/M = target - M.adjust_fire_stacks(1) - M.IgniteMob() + ..() + if(istype(target, /mob/living/carbon)) + var/mob/living/carbon/M = target + M.adjust_fire_stacks(1) + M.IgniteMob() + /obj/item/projectile/bullet/incendiary/shell + name = "incendiary slug" damage = 20 -/obj/item/projectile/bullet/incendiary/mech +/obj/item/projectile/bullet/incendiary/shell/Move() + ..() + var/turf/location = get_turf(src) + new/obj/effect/hotspot(location) + location.hotspot_expose(700, 50, 1) + +/obj/item/projectile/bullet/incendiary/shell/dragonsbreath + name = "dragonsbreath round" damage = 5 +/obj/item/projectile/bullet/meteorshot + name = "meteor" + icon = 'icons/obj/meteor.dmi' + icon_state = "dust" + damage = 30 + weaken = 8 + stun = 8 + hitsound = 'sound/effects/meteorimpact.ogg' + +/obj/item/projectile/bullet/meteorshot/on_hit(var/atom/target, var/blocked = 0) + ..() + if(istype(target, /atom/movable)) + var/atom/movable/M = target + var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src))) + M.throw_at(throw_target, 3, 2) + +/obj/item/projectile/bullet/meteorshot/New() + ..() + SpinAnimation() + + /obj/item/projectile/bullet/mime damage = 20 /obj/item/projectile/bullet/mime/on_hit(var/atom/target, var/blocked = 0) - if(istype(target, /mob/living/carbon)) - var/mob/living/carbon/M = target - M.silent = max(M.silent, 10) + if(istype(target, /mob/living/carbon)) + var/mob/living/carbon/M = target + M.silent = max(M.silent, 10) /obj/item/projectile/bullet/dart diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index cdab219a80d..c11469e8e12 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -18,14 +18,24 @@ /obj/item/projectile/magic/fireball name = "bolt of fireball" icon_state = "fireball" - damage = 25 //The spell fireball additionally does 20 burn, so the wand fireball is marginally less painful + damage = 10 damage_type = BRUTE nodamage = 0 flag = "magic" +/obj/item/projectile/magic/fireball/Range() + var/mob/living/L = locate(/mob/living) in (range(src, 1) - firer) + if(L && L.stat != DEAD) + Bump(L) //Magic Bullet #teachthecontroversy + return + ..() + /obj/item/projectile/magic/fireball/on_hit(var/target) var/turf/T = get_turf(target) explosion(T, -1, 0, 2, 3, 0, flame_range = 2) + if(ismob(target)) //multiple flavors of pain + var/mob/living/M = target + M.take_overall_damage(0,10) //between this 10 burn, the 10 brute, the explosion brute, and the onfire burn, your at about 65 damage if you stop drop and roll immediately /obj/item/projectile/magic/resurrection name = "bolt of resurrection" @@ -133,7 +143,7 @@ proc/wabbajack(mob/living/M) switch(randomize) if("monkey") new_mob = new /mob/living/carbon/monkey(M.loc) - new_mob.universal_speak = 1 + new_mob.languages |= HUMAN if("robot") if(prob(30)) new_mob = new /mob/living/silicon/robot/syndicate(M.loc) @@ -150,13 +160,13 @@ proc/wabbajack(mob/living/M) if(prob(50)) var/mob/living/carbon/slime/Slime = new_mob Slime.is_adult = 1 - new_mob.universal_speak = 1 + new_mob.languages |= HUMAN if("xeno") if(prob(50)) new_mob = new /mob/living/carbon/alien/humanoid/hunter(M.loc) else new_mob = new /mob/living/carbon/alien/humanoid/sentinel(M.loc) - new_mob.universal_speak = 1 + new_mob.languages |= HUMAN /*var/alien_caste = pick("Hunter","Sentinel","Drone","Larva") switch(alien_caste) @@ -164,7 +174,7 @@ proc/wabbajack(mob/living/M) if("Sentinel") new_mob = new /mob/living/carbon/alien/humanoid/sentinel(M.loc) if("Drone") new_mob = new /mob/living/carbon/alien/humanoid/drone(M.loc) else new_mob = new /mob/living/carbon/alien/larva(M.loc) - new_mob.universal_speak = 1*/ + new_mob.languages |= HUMAN*/ if("animal") if(prob(50)) var/beast = pick("carp","bear","mushroom","statue", "bat", "goat","killertomato") @@ -189,7 +199,7 @@ proc/wabbajack(mob/living/M) if("cow") new_mob = new /mob/living/simple_animal/cow(M.loc) if("lizard") new_mob = new /mob/living/simple_animal/lizard(M.loc) else new_mob = new /mob/living/simple_animal/chick(M.loc) - new_mob.universal_speak = 1 + new_mob.languages |= HUMAN if("human") new_mob = new /mob/living/carbon/human(M.loc) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index b931177013b..9e4da4d8a40 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -275,14 +275,14 @@ datum/reagents/proc/handle_reactions() if(!istype(my_atom, /mob)) // No bubbling mobs for(var/mob/M in seen) - M << "\blue \icon[my_atom] The solution begins to bubble." + M << "\icon[my_atom] The solution begins to bubble." if(istype(my_atom, /obj/item/slime_extract)) var/obj/item/slime_extract/ME2 = my_atom ME2.Uses-- if(ME2.Uses <= 0) // give the notification that the slime core is dead for(var/mob/M in seen) - M << "\blue \icon[my_atom] The [my_atom]'s power is consumed in the reaction." + M << "\icon[my_atom] The [my_atom]'s power is consumed in the reaction." ME2.name = "\improper used slime extract" ME2.desc = "This extract has been used up." diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index a3624b381d9..7f0078bb44f 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -808,7 +808,6 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime) icon = 'icons/obj/kitchen.dmi' icon_state = "juicer1" layer = 2.9 - density = 1 anchored = 1 use_power = 1 idle_power_usage = 5 diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 653b87fa3dd..cce34d2f244 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1922,7 +1922,7 @@ datum/reagent/condensedcapsaicin/reaction_mob(var/mob/living/M, var/method=TOUCH victim.eye_blind = max(M.eye_blind, 1) victim.confused = max(M.confused, 3) victim.damageoverlaytemp = 60 - victim.Weaken(1) + victim.Weaken(3) victim.drop_item() return else if ( eyes_covered ) // Eye cover is better than mouth cover @@ -1936,7 +1936,7 @@ datum/reagent/condensedcapsaicin/reaction_mob(var/mob/living/M, var/method=TOUCH victim.eye_blind = max(M.eye_blind, 2) victim.confused = max(M.confused, 6) victim.damageoverlaytemp = 75 - victim.Weaken(3) + victim.Weaken(5) victim.drop_item() datum/reagent/condensedcapsaicin/on_mob_life(var/mob/living/M as mob) diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index cd546797aec..5c6225284fe 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -543,12 +543,12 @@ silicate var/location = get_turf(holder.my_atom) for(var/mob/M in viewers(5, location)) - M << "\red The solution violently bubbles!" + M << "The solution violently bubbles!" location = get_turf(holder.my_atom) for(var/mob/M in viewers(5, location)) - M << "\red The solution spews out foam!" + M << "The solution spews out foam!" //world << "Holder volume is [holder.total_volume]" //for(var/datum/reagent/R in holder.reagent_list) @@ -573,7 +573,7 @@ silicate var/location = get_turf(holder.my_atom) for(var/mob/M in viewers(5, location)) - M << "\red The solution spews out a metalic foam!" + M << "The solution spews out a metalic foam!" var/datum/effect/effect/system/foam_spread/s = new() s.set_up(created_volume, location, holder, 1) @@ -593,7 +593,7 @@ silicate var/location = get_turf(holder.my_atom) for(var/mob/M in viewers(5, location)) - M << "\red The solution spews out a metalic foam!" + M << "The solution spews out a metalic foam!" var/datum/effect/effect/system/foam_spread/s = new() s.set_up(created_volume, location, holder, 2) @@ -949,7 +949,7 @@ datum/chemical_reaction/pestkiller /datum/chemical_reaction/slimespawn/on_reaction(var/datum/reagents/holder) feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1) + O.show_message(text("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1) var/mob/living/carbon/slime/S = new /mob/living/carbon/slime S.loc = get_turf(holder.my_atom) @@ -1010,7 +1010,7 @@ datum/chemical_reaction/pestkiller /datum/chemical_reaction/slimecrit/on_reaction(var/datum/reagents/holder) feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) + O.show_message(text("The slime extract begins to vibrate violently !"), 1) spawn(50) if(holder && holder.my_atom) @@ -1079,7 +1079,7 @@ datum/chemical_reaction/pestkiller /datum/chemical_reaction/slimecritlesser/on_reaction(var/datum/reagents/holder) feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) + O.show_message(text("The slime extract begins to vibrate violently !"), 1) spawn(50) if(holder && holder.my_atom) @@ -1206,13 +1206,13 @@ datum/chemical_reaction/pestkiller /datum/chemical_reaction/slimefreeze/on_reaction(var/datum/reagents/holder) feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) + O.show_message(text("The slime extract begins to vibrate violently !"), 1) spawn(50) if(holder && holder.my_atom) playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) for(var/mob/living/M in range (get_turf(holder.my_atom), 7)) M.bodytemperature -= 240 - M << "\blue You feel a chill!" + M << "You feel a chill!" //Orange /datum/chemical_reaction/slimecasp @@ -1237,7 +1237,7 @@ datum/chemical_reaction/pestkiller /datum/chemical_reaction/slimefire/on_reaction(var/datum/reagents/holder) feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) + O.show_message(text("The slime extract begins to vibrate violently !"), 1) spawn(50) if(holder && holder.my_atom) var/turf/simulated/T = get_turf(holder.my_atom) @@ -1283,7 +1283,7 @@ datum/chemical_reaction/pestkiller /datum/chemical_reaction/slimeglow/on_reaction(var/datum/reagents/holder) feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The slime begins to emit a soft light. Squeezing it will cause it to grow brightly."), 1) + O.show_message(text("The slime begins to emit a soft light. Squeezing it will cause it to grow brightly."), 1) var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime F.loc = get_turf(holder.my_atom) @@ -1355,7 +1355,7 @@ datum/chemical_reaction/pestkiller for(var/mob/living/carbon/slime/slime in viewers(get_turf(holder.my_atom), null)) slime.rabid = 1 for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The [slime] is driven into a frenzy!."), 1) + O.show_message(text("The [slime] is driven into a frenzy!."), 1) //Pink /datum/chemical_reaction/slimeppotion @@ -1396,7 +1396,7 @@ datum/chemical_reaction/pestkiller /datum/chemical_reaction/slimeexplosion/on_reaction(var/datum/reagents/holder) feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) + O.show_message(text("The slime extract begins to vibrate violently !"), 1) spawn(50) if(holder && holder.my_atom) explosion(get_turf(holder.my_atom), 1 ,3, 6) diff --git a/code/modules/reagents/grenade_launcher.dm b/code/modules/reagents/grenade_launcher.dm index e6588331869..986141ccda6 100644 --- a/code/modules/reagents/grenade_launcher.dm +++ b/code/modules/reagents/grenade_launcher.dm @@ -26,10 +26,10 @@ user.drop_item() I.loc = src grenades += I - user << "\blue You put the grenade in the grenade launcher." - user << "\blue [grenades.len] / [max_grenades] Grenades." + user << "You put the grenade in the grenade launcher." + user << "[grenades.len] / [max_grenades] Grenades." else - usr << "\red The grenade launcher cannot hold more grenades." + usr << "The grenade launcher cannot hold more grenades." /obj/item/weapon/gun/grenadelauncher/afterattack(obj/target, mob/user , flag) @@ -45,12 +45,12 @@ if(grenades.len) spawn(0) fire_grenade(target,user) else - usr << "\red The grenade launcher is empty." + usr << "The grenade launcher is empty." /obj/item/weapon/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user) for(var/mob/O in viewers(world.view, user)) - O.show_message(text("\red [] fired a grenade!", user), 1) - user << "\red You fire the grenade launcher!" + O.show_message(text("[] fired a grenade!", user), 1) + user << "You fire the grenade launcher!" var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta! grenades -= F F.loc = user.loc diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 8544ea9bb72..2e24d578572 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -43,12 +43,12 @@ set src in view() ..() if (!(usr in view(2)) && usr!=src.loc) return - usr << "\blue It contains:" + usr << "It contains:" if(reagents && reagents.reagent_list.len) for(var/datum/reagent/R in reagents.reagent_list) - usr << "\blue [R.volume] units of [R.name]" + usr << "[R.volume] units of [R.name]" else - usr << "\blue Nothing." + usr << "Nothing." /obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this set name = "Set transfer amount" diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index e472b1bb659..21cb505e3df 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -19,245 +19,245 @@ var/base_state = "pipe-s" // update iconstate and dpdir due to dir and type - proc/update() - var/flip = turn(dir, 180) - var/left = turn(dir, 90) - var/right = turn(dir, -90) +/obj/structure/disposalconstruct/proc/update() + var/flip = turn(dir, 180) + var/left = turn(dir, 90) + var/right = turn(dir, -90) - switch(ptype) - if(0) - base_state = "pipe-s" - dpdir = dir | flip - if(1) - base_state = "pipe-c" - dpdir = dir | right - if(2) - base_state = "pipe-j1" - dpdir = dir | right | flip - if(3) - base_state = "pipe-j2" - dpdir = dir | left | flip - if(4) - base_state = "pipe-y" - dpdir = dir | left | right - if(5) - base_state = "pipe-t" - dpdir = dir - // disposal bin has only one dir, thus we don't need to care about setting it - if(6) - if(anchored) - base_state = "disposal" - else - base_state = "condisposal" + switch(ptype) + if(0) + base_state = "pipe-s" + dpdir = dir | flip + if(1) + base_state = "pipe-c" + dpdir = dir | right + if(2) + base_state = "pipe-j1" + dpdir = dir | right | flip + if(3) + base_state = "pipe-j2" + dpdir = dir | left | flip + if(4) + base_state = "pipe-y" + dpdir = dir | left | right + if(5) + base_state = "pipe-t" + dpdir = dir + // disposal bin has only one dir, thus we don't need to care about setting it + if(6) + if(anchored) + base_state = "disposal" + else + base_state = "condisposal" - if(7) - base_state = "outlet" - dpdir = dir + if(7) + base_state = "outlet" + dpdir = dir - if(8) - base_state = "intake" - dpdir = dir + if(8) + base_state = "intake" + dpdir = dir - if(9) - base_state = "pipe-j1s" - dpdir = dir | right | flip + if(9) + base_state = "pipe-j1s" + dpdir = dir | right | flip - if(10) - base_state = "pipe-j2s" - dpdir = dir | left | flip + if(10) + base_state = "pipe-j2s" + dpdir = dir | left | flip - if(ptype<6 || ptype>8) - icon_state = "con[base_state]" - else - icon_state = base_state + if(ptype<6 || ptype>8) + icon_state = "con[base_state]" + else + icon_state = base_state - // if invisible, fade icon - alpha = (invisibility ? 0 : 255) + // if invisible, fade icon + alpha = (invisibility ? 0 : 255) - // hide called by levelupdate if turf intact status changes - // change visibility status and force update of icon - hide(var/intact) - invisibility = (intact && level==1) ? 101: 0 // hide if floor is intact - update() +// hide called by levelupdate if turf intact status changes +// change visibility status and force update of icon +/obj/structure/disposalconstruct/hide(var/intact) + invisibility = (intact && level==1) ? 101: 0 // hide if floor is intact + update() - // flip and rotate verbs - verb/rotate() - set name = "Rotate Pipe" - set category = "Object" - set src in view(1) +// flip and rotate verbs +/obj/structure/disposalconstruct/verb/rotate() + set name = "Rotate Pipe" + set category = "Object" + set src in view(1) - if(usr.stat) - return - - if(anchored) - usr << "You must unfasten the pipe before rotating it." - return - - dir = turn(dir, -90) - update() - - verb/flip() - set name = "Flip Pipe" - set category = "Object" - set src in view(1) - if(usr.stat) - return - - if(anchored) - usr << "You must unfasten the pipe before flipping it." - return - - dir = turn(dir, 180) - switch(ptype) - if(2) - ptype = 3 - if(3) - ptype = 2 - if(9) - ptype = 10 - if(10) - ptype = 9 - - update() - - // returns the type path of disposalpipe corresponding to this item dtype - proc/dpipetype() - switch(ptype) - if(0,1) - return /obj/structure/disposalpipe/segment - if(2,3,4) - return /obj/structure/disposalpipe/junction - if(5) - return /obj/structure/disposalpipe/trunk - if(6) - return /obj/machinery/disposal - if(7) - return /obj/structure/disposaloutlet - if(8) - return /obj/machinery/disposal/deliveryChute - if(9,10) - return /obj/structure/disposalpipe/sortjunction + if(usr.stat) return + if(anchored) + usr << "You must unfasten the pipe before rotating it." + return + + dir = turn(dir, -90) + update() + +/obj/structure/disposalconstruct/verb/flip() + set name = "Flip Pipe" + set category = "Object" + set src in view(1) + if(usr.stat) + return + + if(anchored) + usr << "You must unfasten the pipe before flipping it." + return + + dir = turn(dir, 180) + switch(ptype) + if(2) + ptype = 3 + if(3) + ptype = 2 + if(9) + ptype = 10 + if(10) + ptype = 9 + + update() + +// returns the type path of disposalpipe corresponding to this item dtype +/obj/structure/disposalconstruct/proc/dpipetype() + switch(ptype) + if(0,1) + return /obj/structure/disposalpipe/segment + if(2,3,4) + return /obj/structure/disposalpipe/junction + if(5) + return /obj/structure/disposalpipe/trunk + if(6) + return /obj/machinery/disposal + if(7) + return /obj/structure/disposaloutlet + if(8) + return /obj/machinery/disposal/deliveryChute + if(9,10) + return /obj/structure/disposalpipe/sortjunction + return - // attackby item - // wrench: (un)anchor - // weldingtool: convert to real pipe - attackby(var/obj/item/I, var/mob/user) - var/nicetype = "pipe" - var/ispipe = 0 // Indicates if we should change the level of this pipe - src.add_fingerprint(user) - switch(ptype) - if(6) - nicetype = "disposal bin" - if(7) - nicetype = "disposal outlet" - if(8) - nicetype = "delivery chute" - if(9, 10) - nicetype = "sorting pipe" - ispipe = 1 +// attackby item +// wrench: (un)anchor +// weldingtool: convert to real pipe + +/obj/structure/disposalconstruct/attackby(var/obj/item/I, var/mob/user) + var/nicetype = "pipe" + var/ispipe = 0 // Indicates if we should change the level of this pipe + src.add_fingerprint(user) + switch(ptype) + if(6) + nicetype = "disposal bin" + if(7) + nicetype = "disposal outlet" + if(8) + nicetype = "delivery chute" + if(9, 10) + nicetype = "sorting pipe" + ispipe = 1 + else + nicetype = "pipe" + ispipe = 1 + + var/turf/T = src.loc + if(T.intact) + user << "You can only attach the [nicetype] if the floor plating is removed." + return + + var/obj/structure/disposalpipe/CP = locate() in T + + if(istype(I, /obj/item/weapon/wrench)) + if(anchored) + anchored = 0 + if(ispipe) + level = 2 + density = 0 else - nicetype = "pipe" - ispipe = 1 - - var/turf/T = src.loc - if(T.intact) - user << "You can only attach the [nicetype] if the floor plating is removed." - return - - var/obj/structure/disposalpipe/CP = locate() in T - - if(istype(I, /obj/item/weapon/wrench)) - if(anchored) - anchored = 0 - if(ispipe) - level = 2 - density = 0 - else - density = 1 - user << "You detach the [nicetype] from the underfloor." - else - if(ptype>=6 && ptype <= 8) // Disposal or outlet - if(CP) // There's something there - if(!istype(CP,/obj/structure/disposalpipe/trunk)) - user << "The [nicetype] requires a trunk underneath it in order to work." - return - else // Nothing under, fuck. + density = 1 + user << "You detach the [nicetype] from the underfloor." + else + if(ptype>=6 && ptype <= 8) // Disposal or outlet + if(CP) // There's something there + if(!istype(CP,/obj/structure/disposalpipe/trunk)) user << "The [nicetype] requires a trunk underneath it in order to work." return - else - if(CP) - update() - var/pdir = CP.dpdir - if(istype(CP, /obj/structure/disposalpipe/broken)) - pdir = CP.dir - if(pdir & dpdir) - user << "There is already a [nicetype] at that location." - return - anchored = 1 - if(ispipe) - level = 1 // We don't want disposal bins to disappear under the floors - density = 0 - else - density = 1 // We don't want disposal bins or outlets to go density 0 - user << "You attach the [nicetype] to the underfloor." - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - update() - - else if(istype(I, /obj/item/weapon/weldingtool)) - if(anchored) - var/obj/item/weapon/weldingtool/W = I - if(W.remove_fuel(0,user)) - playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - user << "Welding the [nicetype] in place." - if(do_after(user, 20)) - if(!src || !W.isOn()) return - user << "The [nicetype] has been welded in place!" - update() // TODO: Make this neat - if(ispipe) // Pipe - - var/pipetype = dpipetype() - var/obj/structure/disposalpipe/P = new pipetype(src.loc) - src.transfer_fingerprints_to(P) - P.base_icon_state = base_state - P.dir = dir - P.dpdir = dpdir - P.updateicon() - - //Needs some special treatment ;) - if(ptype==9 || ptype==10) - var/obj/structure/disposalpipe/sortjunction/SortP = P - SortP.updatedir() - - else if(ptype==6) // Disposal bin - var/obj/machinery/disposal/P = new /obj/machinery/disposal(src.loc) - src.transfer_fingerprints_to(P) - P.mode = 0 // start with pump off - - else if(ptype==7) // Disposal outlet - - var/obj/structure/disposaloutlet/P = new /obj/structure/disposaloutlet(src.loc) - src.transfer_fingerprints_to(P) - P.dir = dir - var/obj/structure/disposalpipe/trunk/Trunk = CP - Trunk.linked = P - - else if(ptype==8) // Disposal outlet - - var/obj/machinery/disposal/deliveryChute/P = new /obj/machinery/disposal/deliveryChute(src.loc) - src.transfer_fingerprints_to(P) - P.dir = dir - - qdel(src) - return - else - user << "You need more welding fuel to complete this task." + else // Nothing under, fuck. + user << "The [nicetype] requires a trunk underneath it in order to work." return else - user << "You need to attach it to the plating first!" + if(CP) + update() + var/pdir = CP.dpdir + if(istype(CP, /obj/structure/disposalpipe/broken)) + pdir = CP.dir + if(pdir & dpdir) + user << "There is already a [nicetype] at that location." + return + anchored = 1 + if(ispipe) + level = 1 // We don't want disposal bins to disappear under the floors + density = 0 + else + density = 1 // We don't want disposal bins or outlets to go density 0 + user << "You attach the [nicetype] to the underfloor." + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) + update() + + else if(istype(I, /obj/item/weapon/weldingtool)) + if(anchored) + var/obj/item/weapon/weldingtool/W = I + if(W.remove_fuel(0,user)) + playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) + user << "Welding the [nicetype] in place." + if(do_after(user, 20)) + if(!src || !W.isOn()) return + user << "The [nicetype] has been welded in place!" + update() // TODO: Make this neat + if(ispipe) // Pipe + + var/pipetype = dpipetype() + var/obj/structure/disposalpipe/P = new pipetype(src.loc) + src.transfer_fingerprints_to(P) + P.base_icon_state = base_state + P.dir = dir + P.dpdir = dpdir + P.updateicon() + + //Needs some special treatment ;) + if(ptype==9 || ptype==10) + var/obj/structure/disposalpipe/sortjunction/SortP = P + SortP.updatedir() + + else if(ptype==6) // Disposal bin + var/obj/machinery/disposal/P = new /obj/machinery/disposal(src.loc) + src.transfer_fingerprints_to(P) + P.mode = 0 // start with pump off + + else if(ptype==7) // Disposal outlet + + var/obj/structure/disposaloutlet/P = new /obj/structure/disposaloutlet(src.loc) + src.transfer_fingerprints_to(P) + P.dir = dir + var/obj/structure/disposalpipe/trunk/Trunk = CP + Trunk.linked = P + + else if(ptype==8) // Disposal outlet + + var/obj/machinery/disposal/deliveryChute/P = new /obj/machinery/disposal/deliveryChute(src.loc) + src.transfer_fingerprints_to(P) + P.dir = dir + + qdel(src) + return + else + user << "You need more welding fuel to complete this task." return + else + user << "You need to attach it to the plating first!" + return diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 88e88dc3e6d..89fd12cf7d0 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -211,7 +211,7 @@ // human interact with machine /obj/machinery/disposal/attack_hand(mob/user as mob) if(user && user.loc == src) - usr << "\red You cannot reach the controls from inside." + usr << "You cannot reach the controls from inside." return /* if(mode==-1) @@ -267,11 +267,11 @@ if(..()) return if(usr.loc == src) - usr << "\red You cannot reach the controls from inside." + usr << "You cannot reach the controls from inside." return if(mode==-1 && !href_list["eject"]) // only allow ejecting if mode is -1 - usr << "\red \The [src]'s power is disabled." + usr << "\The [src]'s power is disabled." return ..() usr.set_machine(src) @@ -479,120 +479,119 @@ active = 0 ..() -/obj/structure/disposalholder // initialize a holder from the contents of a disposal unit - proc/init(var/obj/machinery/disposal/D) - gas = D.air_contents// transfer gas resv. into holder object +/obj/structure/disposalholder/proc/init(var/obj/machinery/disposal/D) + gas = D.air_contents// transfer gas resv. into holder object - //Check for any living mobs trigger hasmob. - //hasmob effects whether the package goes to cargo or its tagged destination. - for(var/mob/living/M in D) - if(M && M.stat != 2) - hasmob = 1 + //Check for any living mobs trigger hasmob. + //hasmob effects whether the package goes to cargo or its tagged destination. + for(var/mob/living/M in D) + if(M && M.stat != 2) + hasmob = 1 - //Checks 1 contents level deep. This means that players can be sent through disposals... - //...but it should require a second person to open the package. (i.e. person inside a wrapped locker) - for(var/obj/O in D) - if(O.contents) - for(var/mob/living/M in O.contents) - if(M && M.stat != 2) - hasmob = 1 + //Checks 1 contents level deep. This means that players can be sent through disposals... + //...but it should require a second person to open the package. (i.e. person inside a wrapped locker) + for(var/obj/O in D) + if(O.contents) + for(var/mob/living/M in O.contents) + if(M && M.stat != 2) + hasmob = 1 - // now everything inside the disposal gets put into the holder - // note AM since can contain mobs or objs - for(var/atom/movable/AM in D) - AM.loc = src - if(istype(AM, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = AM - if(FAT in H.mutations) // is a human and fat? - has_fat_guy = 1 // set flag on holder - if(istype(AM, /obj/structure/bigDelivery) && !hasmob) - var/obj/structure/bigDelivery/T = AM - src.destinationTag = T.sortTag - if(istype(AM, /obj/item/smallDelivery) && !hasmob) - var/obj/item/smallDelivery/T = AM - src.destinationTag = T.sortTag + // now everything inside the disposal gets put into the holder + // note AM since can contain mobs or objs + for(var/atom/movable/AM in D) + AM.loc = src + if(istype(AM, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = AM + if(FAT in H.mutations) // is a human and fat? + has_fat_guy = 1 // set flag on holder + if(istype(AM, /obj/structure/bigDelivery) && !hasmob) + var/obj/structure/bigDelivery/T = AM + src.destinationTag = T.sortTag + if(istype(AM, /obj/item/smallDelivery) && !hasmob) + var/obj/item/smallDelivery/T = AM + src.destinationTag = T.sortTag - // start the movement process - // argument is the disposal unit the holder started in - proc/start(var/obj/machinery/disposal/D) - if(!D.trunk) - D.expel(src) // no trunk connected, so expel immediately - return - - loc = D.trunk - active = 1 - dir = DOWN - spawn(1) - move() // spawn off the movement process - +// start the movement process +// argument is the disposal unit the holder started in +/obj/structure/disposalholder/proc/start(var/obj/machinery/disposal/D) + if(!D.trunk) + D.expel(src) // no trunk connected, so expel immediately return - // movement process, persists while holder is moving through pipes - proc/move() - var/obj/structure/disposalpipe/last - while(active) - var/obj/structure/disposalpipe/curr = loc - last = curr - curr = curr.transfer(src) - if(!curr && active) - last.expel(src, loc, dir) + loc = D.trunk + active = 1 + dir = DOWN + spawn(1) + move() // spawn off the movement process - sleep(1) - if(!(count--)) - active = 0 - return + return + +// movement process, persists while holder is moving through pipes +/obj/structure/disposalholder/proc/move() + var/obj/structure/disposalpipe/last + while(active) + var/obj/structure/disposalpipe/curr = loc + last = curr + curr = curr.transfer(src) + if(!curr && active) + last.expel(src, loc, dir) + + sleep(1) + if(!(count--)) + active = 0 + return - // find the turf which should contain the next pipe - proc/nextloc() - return get_step(loc,dir) +// find the turf which should contain the next pipe +/obj/structure/disposalholder/proc/nextloc() + return get_step(loc,dir) - // find a matching pipe on a turf - proc/findpipe(var/turf/T) +// find a matching pipe on a turf +/obj/structure/disposalholder/proc/findpipe(var/turf/T) - if(!T) - return null - - var/fdir = turn(dir, 180) // flip the movement direction - for(var/obj/structure/disposalpipe/P in T) - if(fdir & P.dpdir) // find pipe direction mask that matches flipped dir - return P - // if no matching pipe, return null + if(!T) return null - // merge two holder objects - // used when a a holder meets a stuck holder - proc/merge(var/obj/structure/disposalholder/other) - for(var/atom/movable/AM in other) - AM.loc = src // move everything in other holder to this one - if(ismob(AM)) - var/mob/M = AM - if(M.client) // if a client mob, update eye to follow this holder - M.client.eye = src + var/fdir = turn(dir, 180) // flip the movement direction + for(var/obj/structure/disposalpipe/P in T) + if(fdir & P.dpdir) // find pipe direction mask that matches flipped dir + return P + // if no matching pipe, return null + return null - if(other.has_fat_guy) - has_fat_guy = 1 - qdel(other) +// merge two holder objects +// used when a a holder meets a stuck holder +/obj/structure/disposalholder/proc/merge(var/obj/structure/disposalholder/other) + for(var/atom/movable/AM in other) + AM.loc = src // move everything in other holder to this one + if(ismob(AM)) + var/mob/M = AM + if(M.client) // if a client mob, update eye to follow this holder + M.client.eye = src + + if(other.has_fat_guy) + has_fat_guy = 1 + qdel(other) - // called when player tries to move while in a pipe - relaymove(mob/user as mob) - if (user.stat) - return - if (src.loc) - for (var/mob/M in hearers(src.loc.loc)) - M << "CLONG, clong!" - - playsound(src.loc, 'sound/effects/clang.ogg', 50, 0, 0) - - // called to vent all gas in holder to a location - proc/vent_gas(var/atom/location) - location.assume_air(gas) // vent all gas to turf - air_update_turf() +// called when player tries to move while in a pipe +/obj/structure/disposalholder/relaymove(mob/user as mob) + if (user.stat) return + if (src.loc) + for (var/mob/M in hearers(src.loc.loc)) + M << "CLONG, clong!" + + playsound(src.loc, 'sound/effects/clang.ogg', 50, 0, 0) + +// called to vent all gas in holder to a location +/obj/structure/disposalholder/proc/vent_gas(var/atom/location) + location.assume_air(gas) // vent all gas to turf + air_update_turf() + return // Disposal pipes @@ -611,252 +610,252 @@ var/base_icon_state // initial icon state on map // new pipe, set the icon_state as on map - New() - ..() - base_icon_state = icon_state - return +/obj/structure/disposalpipe/New() + ..() + base_icon_state = icon_state + return // pipe is deleted // ensure if holder is present, it is expelled - Destroy() - var/obj/structure/disposalholder/H = locate() in src - if(H) - // holder was present - H.active = 0 - var/turf/T = src.loc - if(T.density) - // deleting pipe is inside a dense turf (wall) - // this is unlikely, but just dump out everything into the turf in case - - for(var/atom/movable/AM in H) - AM.loc = T - AM.pipe_eject(0) - qdel(H) - ..() - return - - // otherwise, do normal expel from turf - if(H) - expel(H, T, 0) - ..() - - // returns the direction of the next pipe object, given the entrance dir - // by default, returns the bitmask of remaining directions - proc/nextdir(var/fromdir) - return dpdir & (~turn(fromdir, 180)) - - // transfer the holder through this pipe segment - // overriden for special behaviour - // - proc/transfer(var/obj/structure/disposalholder/H) - var/nextdir = nextdir(H.dir) - H.dir = nextdir - var/turf/T = H.nextloc() - var/obj/structure/disposalpipe/P = H.findpipe(T) - - if(P) - // find other holder in next loc, if inactive merge it with current - var/obj/structure/disposalholder/H2 = locate() in P - if(H2 && !H2.active) - H.merge(H2) - - H.loc = P - else // if wasn't a pipe, then set loc to turf - H.loc = T - return null - - return P - - - // update the icon_state to reflect hidden status - proc/update() +/obj/structure/disposalpipe/Destroy() + var/obj/structure/disposalholder/H = locate() in src + if(H) + // holder was present + H.active = 0 var/turf/T = src.loc - hide(T.intact && !istype(T,/turf/space)) // space never hides pipes + if(T.density) + // deleting pipe is inside a dense turf (wall) + // this is unlikely, but just dump out everything into the turf in case - // hide called by levelupdate if turf intact status changes - // change visibility status and force update of icon - hide(var/intact) - invisibility = intact ? 101: 0 // hide if floor is intact - updateicon() + for(var/atom/movable/AM in H) + AM.loc = T + AM.pipe_eject(0) + qdel(H) + ..() + return - // update actual icon_state depending on visibility - // if invisible, append "f" to icon_state to show faded version - // this will be revealed if a T-scanner is used - // if visible, use regular icon_state - proc/updateicon() - if(invisibility) - icon_state = "[base_icon_state]f" - else - icon_state = base_icon_state - return - - - // expel the held objects into a turf - // called when there is a break in the pipe - // - - proc/expel(var/obj/structure/disposalholder/H, var/turf/T, var/direction) - - var/turf/target - - if(istype(T, /turf/simulated/floor)) //intact floor, pop the tile - var/turf/simulated/floor/F = T - if(F.floor_tile) - F.floor_tile.loc = H //It took me a day to figure out this was the right way to do it. - F.floor_tile = null //So it doesn't get deleted in make_plating() - F.make_plating() - - if(direction) // direction is specified - if(istype(T, /turf/space)) // if ended in space, then range is unlimited - target = get_edge_target_turf(T, direction) - else // otherwise limit to 10 tiles - target = get_ranged_target_turf(T, direction, 10) - - playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) - if(H) - for(var/atom/movable/AM in H) - AM.loc = T - AM.pipe_eject(direction) - spawn(1) - if(AM) - AM.throw_at(target, 100, 1) - - else // no specified direction, so throw in random direction - - playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) - if(H) - for(var/atom/movable/AM in H) - target = get_offset_target_turf(T, rand(5)-rand(5), rand(5)-rand(5)) - - AM.loc = T - AM.pipe_eject(0) - spawn(1) - if(AM) - AM.throw_at(target, 5, 1) - H.vent_gas(T) - qdel(H) - return - - // call to break the pipe - // will expel any holder inside at the time - // then delete the pipe - // remains : set to leave broken pipe pieces in place - proc/broken(var/remains = 0) - if(remains) - for(var/D in cardinal) - if(D & dpdir) - var/obj/structure/disposalpipe/broken/P = new(src.loc) - P.dir = D - - src.invisibility = 101 // make invisible (since we won't delete the pipe immediately) - var/obj/structure/disposalholder/H = locate() in src + // otherwise, do normal expel from turf if(H) - // holder was present - H.active = 0 - var/turf/T = src.loc - if(T.density) - // broken pipe is inside a dense turf (wall) - // this is unlikely, but just dump out everything into the turf in case + expel(H, T, 0) + ..() - for(var/atom/movable/AM in H) - AM.loc = T - AM.pipe_eject(0) - qdel(H) - return +// returns the direction of the next pipe object, given the entrance dir +// by default, returns the bitmask of remaining directions +/obj/structure/disposalpipe/proc/nextdir(var/fromdir) + return dpdir & (~turn(fromdir, 180)) - // otherwise, do normal expel from turf - if(H) - expel(H, T, 0) +// transfer the holder through this pipe segment +// overriden for special behaviour +// +/obj/structure/disposalpipe/proc/transfer(var/obj/structure/disposalholder/H) + var/nextdir = nextdir(H.dir) + H.dir = nextdir + var/turf/T = H.nextloc() + var/obj/structure/disposalpipe/P = H.findpipe(T) - spawn(2) // delete pipe after 2 ticks to ensure expel proc finished - qdel(src) + if(P) + // find other holder in next loc, if inactive merge it with current + var/obj/structure/disposalholder/H2 = locate() in P + if(H2 && !H2.active) + H.merge(H2) + + H.loc = P + else // if wasn't a pipe, then set loc to turf + H.loc = T + return null + + return P - // pipe affected by explosion - ex_act(severity) +// update the icon_state to reflect hidden status +/obj/structure/disposalpipe/proc/update() + var/turf/T = src.loc + hide(T.intact && !istype(T,/turf/space)) // space never hides pipes - //pass on ex_act to our contents before calling it on ourself - var/obj/structure/disposalholder/H = locate() in src +// hide called by levelupdate if turf intact status changes +// change visibility status and force update of icon +/obj/structure/disposalpipe/hide(var/intact) + invisibility = intact ? 101: 0 // hide if floor is intact + updateicon() + +// update actual icon_state depending on visibility +// if invisible, append "f" to icon_state to show faded version +// this will be revealed if a T-scanner is used +// if visible, use regular icon_state +/obj/structure/disposalpipe/proc/updateicon() + if(invisibility) + icon_state = "[base_icon_state]f" + else + icon_state = base_icon_state + return + + +// expel the held objects into a turf +// called when there is a break in the pipe +// + +/obj/structure/disposalpipe/proc/expel(var/obj/structure/disposalholder/H, var/turf/T, var/direction) + + var/turf/target + + if(istype(T, /turf/simulated/floor)) //intact floor, pop the tile + var/turf/simulated/floor/F = T + if(F.floor_tile) + F.floor_tile.loc = H //It took me a day to figure out this was the right way to do it. + F.floor_tile = null //So it doesn't get deleted in make_plating() + F.make_plating() + + if(direction) // direction is specified + if(istype(T, /turf/space)) // if ended in space, then range is unlimited + target = get_edge_target_turf(T, direction) + else // otherwise limit to 10 tiles + target = get_ranged_target_turf(T, direction, 10) + + playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) if(H) for(var/atom/movable/AM in H) - AM.ex_act(severity) + AM.loc = T + AM.pipe_eject(direction) + spawn(1) + if(AM) + AM.throw_at(target, 100, 1) - switch(severity) - if(1.0) - broken(0) - return - if(2.0) - health -= rand(5,15) - healthcheck() - return - if(3.0) - health -= rand(0,15) - healthcheck() - return + else // no specified direction, so throw in random direction + playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) + if(H) + for(var/atom/movable/AM in H) + target = get_offset_target_turf(T, rand(5)-rand(5), rand(5)-rand(5)) - // test health for brokenness - proc/healthcheck() - if(health < -2) - broken(0) - else if(health<1) - broken(1) - return + AM.loc = T + AM.pipe_eject(0) + spawn(1) + if(AM) + AM.throw_at(target, 5, 1) + H.vent_gas(T) + qdel(H) + return - //attack by item - //weldingtool: unfasten and convert to obj/disposalconstruct - - attackby(var/obj/item/I, var/mob/user) +// call to break the pipe +// will expel any holder inside at the time +// then delete the pipe +// remains : set to leave broken pipe pieces in place +/obj/structure/disposalpipe/proc/broken(var/remains = 0) + if(remains) + for(var/D in cardinal) + if(D & dpdir) + var/obj/structure/disposalpipe/broken/P = new(src.loc) + P.dir = D + src.invisibility = 101 // make invisible (since we won't delete the pipe immediately) + var/obj/structure/disposalholder/H = locate() in src + if(H) + // holder was present + H.active = 0 var/turf/T = src.loc - if(T.intact) - return // prevent interaction with T-scanner revealed pipes - src.add_fingerprint(user) - if(istype(I, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/W = I + if(T.density) + // broken pipe is inside a dense turf (wall) + // this is unlikely, but just dump out everything into the turf in case - if(W.remove_fuel(0,user)) - playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - user << "You start slicing the disposal pipe." - // check if anything changed over 2 seconds - if(do_after(user,30)) - if(!src || !W.isOn()) return - welded() - user << "You've sliced the disposal pipe." - else - user << "You need more welding fuel to cut the pipe." - return + for(var/atom/movable/AM in H) + AM.loc = T + AM.pipe_eject(0) + qdel(H) + return - // called when pipe is cut with welder - proc/welded() - - var/obj/structure/disposalconstruct/C = new (src.loc) - switch(base_icon_state) - if("pipe-s") - C.ptype = 0 - if("pipe-c") - C.ptype = 1 - if("pipe-j1") - C.ptype = 2 - if("pipe-j2") - C.ptype = 3 - if("pipe-y") - C.ptype = 4 - if("pipe-t") - C.ptype = 5 - if("pipe-j1s") - C.ptype = 9 - if("pipe-j2s") - C.ptype = 10 - src.transfer_fingerprints_to(C) - C.dir = dir - C.density = 0 - C.anchored = 1 - C.update() + // otherwise, do normal expel from turf + if(H) + expel(H, T, 0) + spawn(2) // delete pipe after 2 ticks to ensure expel proc finished qdel(src) + +// pipe affected by explosion +/obj/structure/disposalpipe/ex_act(severity) + + //pass on ex_act to our contents before calling it on ourself + var/obj/structure/disposalholder/H = locate() in src + if(H) + for(var/atom/movable/AM in H) + AM.ex_act(severity) + + switch(severity) + if(1.0) + broken(0) + return + if(2.0) + health -= rand(5,15) + healthcheck() + return + if(3.0) + health -= rand(0,15) + healthcheck() + return + + +// test health for brokenness +/obj/structure/disposalpipe/proc/healthcheck() + if(health < -2) + broken(0) + else if(health<1) + broken(1) + return + +//attack by item +//weldingtool: unfasten and convert to obj/disposalconstruct + +/obj/structure/disposalpipe/attackby(var/obj/item/I, var/mob/user) + + var/turf/T = src.loc + if(T.intact) + return // prevent interaction with T-scanner revealed pipes + src.add_fingerprint(user) + if(istype(I, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/W = I + + if(W.remove_fuel(0,user)) + playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) + user << "You start slicing the disposal pipe." + // check if anything changed over 2 seconds + if(do_after(user,30)) + if(!src || !W.isOn()) return + welded() + user << "You've sliced the disposal pipe." + else + user << "You need more welding fuel to cut the pipe." + return + +// called when pipe is cut with welder +/obj/structure/disposalpipe/proc/welded() + + var/obj/structure/disposalconstruct/C = new (src.loc) + switch(base_icon_state) + if("pipe-s") + C.ptype = 0 + if("pipe-c") + C.ptype = 1 + if("pipe-j1") + C.ptype = 2 + if("pipe-j2") + C.ptype = 3 + if("pipe-y") + C.ptype = 4 + if("pipe-t") + C.ptype = 5 + if("pipe-j1s") + C.ptype = 9 + if("pipe-j2s") + C.ptype = 10 + src.transfer_fingerprints_to(C) + C.dir = dir + C.density = 0 + C.anchored = 1 + C.update() + + qdel(src) + // *** TEST verb //client/verb/dispstop() // for(var/obj/structure/disposalholder/H in world) @@ -866,15 +865,15 @@ /obj/structure/disposalpipe/segment icon_state = "pipe-s" - New() - ..() - if(icon_state == "pipe-s") - dpdir = dir | turn(dir, 180) - else - dpdir = dir | turn(dir, -90) +/obj/structure/disposalpipe/segment/New() + ..() + if(icon_state == "pipe-s") + dpdir = dir | turn(dir, 180) + else + dpdir = dir | turn(dir, -90) - update() - return + update() + return @@ -883,45 +882,45 @@ /obj/structure/disposalpipe/junction icon_state = "pipe-j1" - New() - ..() - if(icon_state == "pipe-j1") - dpdir = dir | turn(dir, -90) | turn(dir,180) - else if(icon_state == "pipe-j2") - dpdir = dir | turn(dir, 90) | turn(dir,180) - else // pipe-y - dpdir = dir | turn(dir,90) | turn(dir, -90) - update() - return +/obj/structure/disposalpipe/junction/New() + ..() + if(icon_state == "pipe-j1") + dpdir = dir | turn(dir, -90) | turn(dir,180) + else if(icon_state == "pipe-j2") + dpdir = dir | turn(dir, 90) | turn(dir,180) + else // pipe-y + dpdir = dir | turn(dir,90) | turn(dir, -90) + update() + return - // next direction to move - // if coming in from secondary dirs, then next is primary dir - // if coming in from primary dir, then next is equal chance of other dirs +// next direction to move +// if coming in from secondary dirs, then next is primary dir +// if coming in from primary dir, then next is equal chance of other dirs - nextdir(var/fromdir) - var/flipdir = turn(fromdir, 180) - if(flipdir != dir) // came from secondary dir - return dir // so exit through primary - else // came from primary - // so need to choose either secondary exit - var/mask = ..(fromdir) +/obj/structure/disposalpipe/junction/nextdir(var/fromdir) + var/flipdir = turn(fromdir, 180) + if(flipdir != dir) // came from secondary dir + return dir // so exit through primary + else // came from primary + // so need to choose either secondary exit + var/mask = ..(fromdir) - // find a bit which is set - var/setbit = 0 - if(mask & NORTH) - setbit = NORTH - else if(mask & SOUTH) - setbit = SOUTH - else if(mask & EAST) - setbit = EAST - else - setbit = WEST + // find a bit which is set + var/setbit = 0 + if(mask & NORTH) + setbit = NORTH + else if(mask & SOUTH) + setbit = SOUTH + else if(mask & EAST) + setbit = EAST + else + setbit = WEST - if(prob(50)) // 50% chance to choose the found bit or the other one - return setbit - else - return mask & (~setbit) + if(prob(50)) // 50% chance to choose the found bit or the other one + return setbit + else + return mask & (~setbit) //a three-way junction that sorts objects /obj/structure/disposalpipe/sortjunction @@ -932,81 +931,81 @@ var/negdir = 0 var/sortdir = 0 - proc/updatedesc() - desc = "An underfloor disposal pipe with a package sorting mechanism." - if(sortType>0) - var/tag = uppertext(TAGGERLOCATIONS[sortType]) - desc += "\nIt's tagged with [tag]" +/obj/structure/disposalpipe/sortjunction/proc/updatedesc() + desc = "An underfloor disposal pipe with a package sorting mechanism." + if(sortType>0) + var/tag = uppertext(TAGGERLOCATIONS[sortType]) + desc += "\nIt's tagged with [tag]" - proc/updatedir() - posdir = dir - negdir = turn(posdir, 180) +/obj/structure/disposalpipe/sortjunction/proc/updatedir() + posdir = dir + negdir = turn(posdir, 180) - if(icon_state == "pipe-j1s") - sortdir = turn(posdir, -90) - else - icon_state = "pipe-j2s" - sortdir = turn(posdir, 90) + if(icon_state == "pipe-j1s") + sortdir = turn(posdir, -90) + else + icon_state = "pipe-j2s" + sortdir = turn(posdir, 90) - dpdir = sortdir | posdir | negdir + dpdir = sortdir | posdir | negdir - New() - ..() - updatedir() - updatedesc() - update() +/obj/structure/disposalpipe/sortjunction/New() + ..() + updatedir() + updatedesc() + update() + return + +/obj/structure/disposalpipe/sortjunction/attackby(var/obj/item/I, var/mob/user) + if(..()) return - attackby(var/obj/item/I, var/mob/user) - if(..()) - return + if(istype(I, /obj/item/device/destTagger)) + var/obj/item/device/destTagger/O = I - if(istype(I, /obj/item/device/destTagger)) - var/obj/item/device/destTagger/O = I - - if(O.currTag > 0)// Tag set - sortType = O.currTag - playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1) - var/tag = uppertext(TAGGERLOCATIONS[O.currTag]) - user << " Changed filter to [tag]." - updatedesc() + if(O.currTag > 0)// Tag set + sortType = O.currTag + playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1) + var/tag = uppertext(TAGGERLOCATIONS[O.currTag]) + user << " Changed filter to [tag]." + updatedesc() - // next direction to move - // if coming in from negdir, then next is primary dir or sortdir - // if coming in from posdir, then flip around and go back to posdir - // if coming in from sortdir, go to posdir +// next direction to move +// if coming in from negdir, then next is primary dir or sortdir +// if coming in from posdir, then flip around and go back to posdir +// if coming in from sortdir, go to posdir - nextdir(var/fromdir, var/sortTag) - //var/flipdir = turn(fromdir, 180) - if(fromdir != sortdir) // probably came from the negdir +/obj/structure/disposalpipe/sortjunction/nextdir(var/fromdir, var/sortTag) + //var/flipdir = turn(fromdir, 180) + if(fromdir != sortdir) // probably came from the negdir - if(src.sortType == sortTag) //if destination matches filtered type... - return sortdir // exit through sortdirection - else - return posdir - else // came from sortdir - // so go with the flow to positive direction + if(src.sortType == sortTag) //if destination matches filtered type... + return sortdir // exit through sortdirection + else return posdir + else // came from sortdir + // so go with the flow to positive direction + return posdir - transfer(var/obj/structure/disposalholder/H) - var/nextdir = nextdir(H.dir, H.destinationTag) - H.dir = nextdir - var/turf/T = H.nextloc() - var/obj/structure/disposalpipe/P = H.findpipe(T) +/obj/structure/disposalpipe/sortjunction/transfer(var/obj/structure/disposalholder/H) + var/nextdir = nextdir(H.dir, H.destinationTag) + H.dir = nextdir + var/turf/T = H.nextloc() + var/obj/structure/disposalpipe/P = H.findpipe(T) - if(P) - // find other holder in next loc, if inactive merge it with current - var/obj/structure/disposalholder/H2 = locate() in P - if(H2 && !H2.active) - H.merge(H2) + if(P) + // find other holder in next loc, if inactive merge it with current + var/obj/structure/disposalholder/H2 = locate() in P + if(H2 && !H2.active) + H.merge(H2) - H.loc = P - else // if wasn't a pipe, then set loc to turf - H.loc = T - return null + H.loc = P + else // if wasn't a pipe, then set loc to turf + H.loc = T + return null - return P + return P //a three-way junction that sorts objects destined for the mail office mail table (tomail = 1) @@ -1018,56 +1017,56 @@ var/negdir = 0 var/sortdir = 0 - New() - ..() - posdir = dir - if(icon_state == "pipe-j1s") - sortdir = turn(posdir, -90) - negdir = turn(posdir, 180) +/obj/structure/disposalpipe/wrapsortjunction/New() + ..() + posdir = dir + if(icon_state == "pipe-j1s") + sortdir = turn(posdir, -90) + negdir = turn(posdir, 180) + else + icon_state = "pipe-j2s" + sortdir = turn(posdir, 90) + negdir = turn(posdir, 180) + dpdir = sortdir | posdir | negdir + + update() + return + +// next direction to move +// if coming in from negdir, then next is primary dir or sortdir +// if coming in from posdir, then flip around and go back to posdir +// if coming in from sortdir, go to posdir + +/obj/structure/disposalpipe/wrapsortjunction/nextdir(var/fromdir, var/istomail) + //var/flipdir = turn(fromdir, 180) + if(fromdir != sortdir) // probably came from the negdir + + if(istomail) //if destination matches filtered type... + return sortdir // exit through sortdirection else - icon_state = "pipe-j2s" - sortdir = turn(posdir, 90) - negdir = turn(posdir, 180) - dpdir = sortdir | posdir | negdir - - update() - return - - // next direction to move - // if coming in from negdir, then next is primary dir or sortdir - // if coming in from posdir, then flip around and go back to posdir - // if coming in from sortdir, go to posdir - - nextdir(var/fromdir, var/istomail) - //var/flipdir = turn(fromdir, 180) - if(fromdir != sortdir) // probably came from the negdir - - if(istomail) //if destination matches filtered type... - return sortdir // exit through sortdirection - else - return posdir - else // came from sortdir - // so go with the flow to positive direction return posdir + else // came from sortdir + // so go with the flow to positive direction + return posdir - transfer(var/obj/structure/disposalholder/H) - var/nextdir = nextdir(H.dir, H.tomail) - H.dir = nextdir - var/turf/T = H.nextloc() - var/obj/structure/disposalpipe/P = H.findpipe(T) +/obj/structure/disposalpipe/wrapsortjunction/transfer(var/obj/structure/disposalholder/H) + var/nextdir = nextdir(H.dir, H.tomail) + H.dir = nextdir + var/turf/T = H.nextloc() + var/obj/structure/disposalpipe/P = H.findpipe(T) - if(P) - // find other holder in next loc, if inactive merge it with current - var/obj/structure/disposalholder/H2 = locate() in P - if(H2 && !H2.active) - H.merge(H2) + if(P) + // find other holder in next loc, if inactive merge it with current + var/obj/structure/disposalholder/H2 = locate() in P + if(H2 && !H2.active) + H.merge(H2) - H.loc = P - else // if wasn't a pipe, then set loc to turf - H.loc = T - return null + H.loc = P + else // if wasn't a pipe, then set loc to turf + H.loc = T + return null - return P + return P @@ -1183,18 +1182,18 @@ // i.e. will be treated as an empty turf desc = "A broken piece of disposal pipe." - New() - ..() - update() - return +/obj/structure/disposalpipe/broken/New() + ..() + update() + return - // called when welded - // for broken pipe, remove and turn into scrap +// called when welded +// for broken pipe, remove and turn into scrap - welded() -// var/obj/item/scrap/S = new(src.loc) -// S.set_components(200,0,0) - qdel(src) +/obj/structure/disposalpipe/broken/welded() +// var/obj/item/scrap/S = new(src.loc) +// S.set_components(200,0,0) + qdel(src) // the disposal outlet machine @@ -1211,74 +1210,74 @@ var/start_eject = 0 var/eject_range = 2 - New() - ..() +/obj/structure/disposaloutlet/New() + ..() - spawn(1) - target = get_ranged_target_turf(src, dir, 10) + spawn(1) + target = get_ranged_target_turf(src, dir, 10) - var/obj/structure/disposalpipe/trunk/trunk = locate() in src.loc - if(trunk) - trunk.linked = src // link the pipe trunk to self + var/obj/structure/disposalpipe/trunk/trunk = locate() in src.loc + if(trunk) + trunk.linked = src // link the pipe trunk to self - // expel the contents of the holder object, then delete it - // called when the holder exits the outlet - proc/expel(var/obj/structure/disposalholder/H) +// expel the contents of the holder object, then delete it +// called when the holder exits the outlet +/obj/structure/disposaloutlet/proc/expel(var/obj/structure/disposalholder/H) - flick("outlet-open", src) - if((start_eject + 30) < world.time) - start_eject = world.time - playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0) - sleep(20) - playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) - else - sleep(20) - if(H) - for(var/atom/movable/AM in H) - AM.loc = src.loc - AM.pipe_eject(dir) - spawn(5) - if(AM) - AM.throw_at(target, eject_range, 1) - H.vent_gas(src.loc) - qdel(H) + flick("outlet-open", src) + if((start_eject + 30) < world.time) + start_eject = world.time + playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0) + sleep(20) + playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) + else + sleep(20) + if(H) + for(var/atom/movable/AM in H) + AM.loc = src.loc + AM.pipe_eject(dir) + spawn(5) + if(AM) + AM.throw_at(target, eject_range, 1) + H.vent_gas(src.loc) + qdel(H) + return + +/obj/structure/disposaloutlet/attackby(var/obj/item/I, var/mob/user) + if(!I || !user) return - - attackby(var/obj/item/I, var/mob/user) - if(!I || !user) + src.add_fingerprint(user) + if(istype(I, /obj/item/weapon/screwdriver)) + if(mode==0) + mode=1 + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + user << "You remove the screws around the power connection." + return + else if(mode==1) + mode=0 + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + user << "You attach the screws around the power connection." + return + else if(istype(I,/obj/item/weapon/weldingtool) && mode==1) + var/obj/item/weapon/weldingtool/W = I + if(W.remove_fuel(0,user)) + playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) + user << "You start slicing the floorweld off \the [src]." + if(do_after(user,20)) + if(!src || !W.isOn()) return + user << "You've sliced the floorweld off \the [src]." + var/obj/structure/disposalconstruct/C = new (src.loc) + src.transfer_fingerprints_to(C) + C.ptype = 7 // 7 = outlet + C.update() + C.anchored = 1 + C.density = 1 + qdel(src) + return + else + user << "You need more welding fuel to complete this task." return - src.add_fingerprint(user) - if(istype(I, /obj/item/weapon/screwdriver)) - if(mode==0) - mode=1 - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You remove the screws around the power connection." - return - else if(mode==1) - mode=0 - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You attach the screws around the power connection." - return - else if(istype(I,/obj/item/weapon/weldingtool) && mode==1) - var/obj/item/weapon/weldingtool/W = I - if(W.remove_fuel(0,user)) - playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - user << "You start slicing the floorweld off \the [src]." - if(do_after(user,20)) - if(!src || !W.isOn()) return - user << "You've sliced the floorweld off \the [src]." - var/obj/structure/disposalconstruct/C = new (src.loc) - src.transfer_fingerprints_to(C) - C.ptype = 7 // 7 = outlet - C.update() - C.anchored = 1 - C.density = 1 - qdel(src) - return - else - user << "You need more welding fuel to complete this task." - return diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 043116087bf..269cf0531e4 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -29,7 +29,7 @@ if(sortTag != O.currTag) var/tag = uppertext(TAGGERLOCATIONS[O.currTag]) - user << "\blue *[tag]*" + user << "*[tag]*" sortTag = O.currTag playsound(loc, 'sound/machines/twobeep.ogg', 100, 1) @@ -58,38 +58,38 @@ var/sortTag = 0 - attack_self(mob/user as mob) - if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 - wrapped.loc = user.loc - if(ishuman(user)) - user.put_in_hands(wrapped) - else - wrapped.loc = get_turf(src) +/obj/item/smallDelivery/attack_self(mob/user as mob) + if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 + wrapped.loc = user.loc + if(ishuman(user)) + user.put_in_hands(wrapped) + else + wrapped.loc = get_turf(src) - qdel(src) + qdel(src) - attackby(obj/item/W as obj, mob/user as mob) - if(istype(W, /obj/item/device/destTagger)) - var/obj/item/device/destTagger/O = W +/obj/item/smallDelivery/attackby(obj/item/W as obj, mob/user as mob) + if(istype(W, /obj/item/device/destTagger)) + var/obj/item/device/destTagger/O = W - if(sortTag != O.currTag) - var/tag = uppertext(TAGGERLOCATIONS[O.currTag]) - user << "\blue *[tag]*" - sortTag = O.currTag - playsound(loc, 'sound/machines/twobeep.ogg', 100, 1) + if(sortTag != O.currTag) + var/tag = uppertext(TAGGERLOCATIONS[O.currTag]) + user << "*[tag]*" + sortTag = O.currTag + playsound(loc, 'sound/machines/twobeep.ogg', 100, 1) - else if(istype(W, /obj/item/weapon/pen)) - var/str = copytext(sanitize(input(user,"Label text?","Set label","")),1,MAX_NAME_LEN) - if(!str || !length(str)) - user << "Invalid text." - return - user.visible_message("[user] labels [src] as [str].") - name = "[name] ([str])" + else if(istype(W, /obj/item/weapon/pen)) + var/str = copytext(sanitize(input(user,"Label text?","Set label","")),1,MAX_NAME_LEN) + if(!str || !length(str)) + user << "Invalid text." + return + user.visible_message("[user] labels [src] as [str].") + name = "[name] ([str])" - else if(istype(W, /obj/item/weapon/wrapping_paper)) - icon_state = "giftcrate[wrapped.w_class]" - user.visible_message("[user] wraps the package in festive paper!") + else if(istype(W, /obj/item/weapon/wrapping_paper)) + icon_state = "giftcrate[wrapped.w_class]" + user.visible_message("[user] wraps the package in festive paper!") /obj/item/weapon/packageWrap @@ -101,71 +101,71 @@ var/amount = 25.0 - afterattack(var/obj/target as obj, mob/user as mob, proximity) - if(!proximity) return - if(!istype(target)) //this really shouldn't be necessary (but it is). -Pete - return - if(istype(target, /obj/item/smallDelivery) || istype(target,/obj/structure/bigDelivery) \ - || istype(target, /obj/item/weapon/evidencebag) || istype(target, /obj/structure/closet/body_bag)) - return - if(target.anchored) - return - if(target in user) - return - - user.attack_log += text("\[[time_stamp()]\] Has used [name] on \ref[target]") - - if(istype(target, /obj/item) && !(istype(target, /obj/item/weapon/storage) && !istype(target,/obj/item/weapon/storage/box))) - var/obj/item/O = target - if(amount > 1) - var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(get_turf(O.loc)) //Aaannd wrap it up! - if(!istype(O.loc, /turf)) - if(user.client) - user.client.screen -= O - P.wrapped = O - O.loc = P - var/i = round(O.w_class) - if(i in list(1,2,3,4,5)) - P.icon_state = "deliverycrate[i]" - P.w_class = i - P.add_fingerprint(usr) - O.add_fingerprint(usr) - add_fingerprint(usr) - amount -= 1 - else if(istype(target, /obj/structure/closet/crate)) - var/obj/structure/closet/crate/O = target - if(amount > 3 && !O.opened) - var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) - P.icon_state = "deliverycrate" - P.wrapped = O - O.loc = P - amount -= 3 - else if(amount < 3) - user << "You need more paper." - else if(istype (target, /obj/structure/closet)) - var/obj/structure/closet/O = target - if(amount > 3 && !O.opened) - var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) - P.wrapped = O - O.welded = 1 - O.loc = P - amount -= 3 - else if(amount < 3) - user << "You need more paper." - else - user << "The object you are trying to wrap is unsuitable for the sorting machinery." - if(amount <= 0) - new /obj/item/weapon/c_tube( loc ) - qdel(src) - return +/obj/item/weapon/packageWrap/afterattack(var/obj/target as obj, mob/user as mob, proximity) + if(!proximity) return + if(!istype(target)) //this really shouldn't be necessary (but it is). -Pete + return + if(istype(target, /obj/item/smallDelivery) || istype(target,/obj/structure/bigDelivery) \ + || istype(target, /obj/item/weapon/evidencebag) || istype(target, /obj/structure/closet/body_bag)) + return + if(target.anchored) + return + if(target in user) return + user.attack_log += text("\[[time_stamp()]\] Has used [name] on \ref[target]") - examine() - if(src in usr) - usr << "There are [amount] units of package wrap left." - ..() + if(istype(target, /obj/item) && !(istype(target, /obj/item/weapon/storage) && !istype(target,/obj/item/weapon/storage/box))) + var/obj/item/O = target + if(amount > 1) + var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(get_turf(O.loc)) //Aaannd wrap it up! + if(!istype(O.loc, /turf)) + if(user.client) + user.client.screen -= O + P.wrapped = O + O.loc = P + var/i = round(O.w_class) + if(i in list(1,2,3,4,5)) + P.icon_state = "deliverycrate[i]" + P.w_class = i + P.add_fingerprint(usr) + O.add_fingerprint(usr) + add_fingerprint(usr) + amount -= 1 + else if(istype(target, /obj/structure/closet/crate)) + var/obj/structure/closet/crate/O = target + if(amount > 3 && !O.opened) + var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) + P.icon_state = "deliverycrate" + P.wrapped = O + O.loc = P + amount -= 3 + else if(amount < 3) + user << "You need more paper." + else if(istype (target, /obj/structure/closet)) + var/obj/structure/closet/O = target + if(amount > 3 && !O.opened) + var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) + P.wrapped = O + O.welded = 1 + O.loc = P + amount -= 3 + else if(amount < 3) + user << "You need more paper." + else + user << "The object you are trying to wrap is unsuitable for the sorting machinery." + if(amount <= 0) + new /obj/item/weapon/c_tube( loc ) + qdel(src) return + return + + +/obj/item/weapon/packageWrap/examine() + if(src in usr) + usr << "There are [amount] units of package wrap left." + ..() + return /obj/item/device/destTagger @@ -184,31 +184,31 @@ flags = CONDUCT slot_flags = SLOT_BELT - proc/openwindow(mob/user as mob) - var/dat = "

    TagMaster 2.2

    " +/obj/item/device/destTagger/proc/openwindow(mob/user as mob) + var/dat = "

    TagMaster 2.2

    " - dat += "" - for (var/i = 1, i <= TAGGERLOCATIONS.len, i++) - dat += "" + dat += "
    [TAGGERLOCATIONS[i]]
    " + for (var/i = 1, i <= TAGGERLOCATIONS.len, i++) + dat += "" - if(i%4==0) - dat += "" + if(i%4==0) + dat += "" - dat += "
    [TAGGERLOCATIONS[i]]

    Current Selection: [currTag ? TAGGERLOCATIONS[currTag] : "None"]
    " + dat += "
    Current Selection: [currTag ? TAGGERLOCATIONS[currTag] : "None"]
    " - user << browse(dat, "window=destTagScreen;size=450x350") - onclose(user, "destTagScreen") + user << browse(dat, "window=destTagScreen;size=450x350") + onclose(user, "destTagScreen") - attack_self(mob/user as mob) - openwindow(user) - return +/obj/item/device/destTagger/attack_self(mob/user as mob) + openwindow(user) + return - Topic(href, href_list) - add_fingerprint(usr) - if(href_list["nextTag"]) - var/n = text2num(href_list["nextTag"]) - currTag = n - openwindow(usr) +/obj/item/device/destTagger/Topic(href, href_list) + add_fingerprint(usr) + if(href_list["nextTag"]) + var/n = text2num(href_list["nextTag"]) + currTag = n + openwindow(usr) /obj/machinery/disposal/deliveryChute name = "delivery chute" diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 518c716c35a..dca8737f26c 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1,5 +1,3 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 - /*************************************************************** ** Design Datums ** ** All the data for building stuff and tracking reliability. ** @@ -64,546 +62,6 @@ datum/design/proc/CalcReliability(var/list/temp_techs) return -///////////////////Computer Boards/////////////////////////////////// - -datum/design/seccamera - name = "Computer Design (Security)" - desc = "Allows for the construction of circuit boards used to build security camera computers." - id = "seccamera" - req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/security - -datum/design/aicore - name = "AI Design (AI Core)" - desc = "Allows for the construction of circuit boards used to build new AI cores." - id = "aicore" - req_tech = list("programming" = 4, "biotech" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/aicore - -datum/design/aiupload - name = "Computer Design (AI Upload)" - desc = "Allows for the construction of circuit boards used to build an AI Upload Console." - id = "aiupload" - req_tech = list("programming" = 4) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/aiupload - -datum/design/borgupload - name = "Computer Design (Cyborg Upload)" - desc = "Allows for the construction of circuit boards used to build a Cyborg Upload Console." - id = "borgupload" - req_tech = list("programming" = 4) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/borgupload - -datum/design/med_data - name = "Computer Design (Medical Records)" - desc = "Allows for the construction of circuit boards used to build a medical records console." - id = "med_data" - req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/med_data - -datum/design/operating - name = "Computer Design (Operating Computer)" - desc = "Allows for the construction of circuit boards used to build an operating computer console." - id = "operating" - req_tech = list("programming" = 2, "biotech" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/operating - -datum/design/pandemic - name = "Computer Design (PanD.E.M.I.C. 2200)" - desc = "Allows for the construction of circuit boards used to build a PanD.E.M.I.C. 2200 console." - id = "pandemic" - req_tech = list("programming" = 2, "biotech" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/pandemic - -datum/design/scan_console - name = "Computer Design (DNA Machine)" - desc = "Allows for the construction of circuit boards used to build a new DNA scanning console." - id = "scan_console" - req_tech = list("programming" = 2, "biotech" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/scan_consolenew - -datum/design/comconsole - name = "Computer Design (Communications)" - desc = "Allows for the construction of circuit boards used to build a communications console." - id = "comconsole" - req_tech = list("programming" = 2, "magnets" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/communications - -datum/design/idcardconsole - name = "Computer Design (ID Console)" - desc = "Allows for the construction of circuit boards used to build an ID computer." - id = "idcardconsole" - req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/card - -datum/design/crewconsole - name = "Computer Design (Crew monitoring computer)" - desc = "Allows for the construction of circuit boards used to build a Crew monitoring computer." - id = "crewconsole" - req_tech = list("programming" = 3, "magnets" = 2, "biotech" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/crew - -datum/design/teleconsole - name = "Computer Design (Teleporter Console)" - desc = "Allows for the construction of circuit boards used to build a teleporter control console." - id = "teleconsole" - req_tech = list("programming" = 3, "bluespace" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/teleporter - -datum/design/secdata - name = "Computer Design (Security Records Console)" - desc = "Allows for the construction of circuit boards used to build a security records console." - id = "secdata" - req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/secure_data - -datum/design/atmosalerts - name = "Computer Design (Atmosphere Alert)" - desc = "Allows for the construction of circuit boards used to build an atmosphere alert console.." - id = "atmosalerts" - req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/atmos_alert - -datum/design/air_management - name = "Computer Design (Atmospheric Monitor)" - desc = "Allows for the construction of circuit boards used to build an Atmospheric Monitor." - id = "air_management" - req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/air_management - -datum/design/robocontrol - name = "Computer Design (Robotics Control Console)" - desc = "Allows for the construction of circuit boards used to build a Robotics Control console." - id = "robocontrol" - req_tech = list("programming" = 4) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/robotics - -datum/design/clonecontrol - name = "Computer Design (Cloning Machine Console)" - desc = "Allows for the construction of circuit boards used to build a new Cloning Machine console." - id = "clonecontrol" - req_tech = list("programming" = 3, "biotech" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/cloning - -datum/design/clonepod - name = "Machine Design (Clone Pod)" - desc = "Allows for the construction of circuit boards used to build a Cloning Pod." - id = "clonepod" - req_tech = list("programming" = 3, "biotech" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/clonepod - -datum/design/clonescanner - name = "Machine Design (Cloning Scanner)" - desc = "Allows for the construction of circuit boards used to build a Cloning Scanner." - id = "clonescanner" - req_tech = list("programming" = 3, "biotech" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/clonescanner - -datum/design/arcadebattle - name = "Computer Design (Battle Arcade Machine)" - desc = "Allows for the construction of circuit boards used to build a new arcade machine." - id = "arcademachine" - req_tech = list("programming" = 1) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/arcade/battle - -datum/design/orion_trail - name = "Computer Design (Orion Trail Arcade Machine)" - desc = "Allows for the construction of circuit boards used to build a new Orion Trail machine." - id = "arcademachine" - req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/arcade/orion_trail - -datum/design/orion_trail - name = "Computer Design (Slot Machine)" - desc = "Allows for the construction of circuit boards used to build a new slot machine." - id = "slotmachine" - req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/slot_machine - -datum/design/powermonitor - name = "Computer Design (Power Monitor)" - desc = "Allows for the construction of circuit boards used to build a new power monitor." - id = "powermonitor" - req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/powermonitor - -datum/design/solarcontrol - name = "Computer Design (Solar Control)" - desc = "Allows for the construction of circuit boards used to build a solar control console." - id = "solarcontrol" - req_tech = list("programming" = 2, "powerstorage" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/solar_control - -datum/design/prisonmanage - name = "Computer Design (Prisoner Management Console)" - desc = "Allows for the construction of circuit boards used to build a prisoner management console." - id = "prisonmanage" - req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/prisoner - -datum/design/mechacontrol - name = "Computer Design (Exosuit Control Console)" - desc = "Allows for the construction of circuit boards used to build an exosuit control console." - id = "mechacontrol" - req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mecha_control - -datum/design/mechapower - name = "Computer Design (Mech Bay Power Control Console)" - desc = "Allows for the construction of circuit boards used to build a mech bay power control console." - id = "mechapower" - req_tech = list("programming" = 2, "powerstorage" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mech_bay_power_console - -datum/design/rdconsole - name = "Computer Design (R&D Console)" - desc = "Allows for the construction of circuit boards used to build a new R&D console." - id = "rdconsole" - req_tech = list("programming" = 4) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/rdconsole - -datum/design/ordercomp - name = "Computer Design (Supply ordering console)" - desc = "Allows for the construction of circuit boards used to build a Supply ordering console." - id = "ordercomp" - req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/ordercomp - -datum/design/supplycomp - name = "Computer Design (Supply shuttle console)" - desc = "Allows for the construction of circuit boards used to build a Supply shuttle console." - id = "supplycomp" - req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/supplycomp - -datum/design/mining - name = "Computer Design (Outpost Status Display)" - desc = "Allows for the construction of circuit boards used to build an outpost status display console." - id = "mining" - req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mining - -datum/design/comm_monitor - name = "Computer Design (Telecommunications Monitoring Console)" - desc = "Allows for the construction of circuit boards used to build a telecommunications monitor." - id = "comm_monitor" - req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/comm_monitor - -datum/design/comm_server - name = "Computer Design (Telecommunications Server Monitoring Console)" - desc = "Allows for the construction of circuit boards used to build a telecommunication server browser and monitor." - id = "comm_server" - req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/comm_server - -datum/design/message_monitor - name = "Computer Design (Messaging Monitor Console)" - desc = "Allows for the construction of circuit boards used to build a messaging monitor console." - id = "message_monitor" - req_tech = list("programming" = 5) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/message_monitor - -datum/design/comm_traffic - name = "Computer Design (Telecommunications Traffic Control Console)" - desc = "Allows for the construction of circuit boards used to build a telecommunications traffic control console." - id = "comm_traffic" - req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/comm_traffic - -datum/design/telesci_console - name = "Computer Design (Telepad Control Console Board)" - desc = "Allows for the construction of circuit boards used to build a telescience console." - id = "telesci_console" - req_tech = list("programming" = 3, "bluespace" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/telesci_console - -datum/design/aifixer - name = "Computer Design (AI Integrity Restorer)" - desc = "Allows for the construction of circuit boards used to build an AI Integrity Restorer." - id = "aifixer" - req_tech = list("programming" = 3, "biotech" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/aifixer - -/////////////////////////////////// -//////////AI Module Disks////////// -/////////////////////////////////// -datum/design/safeguard_module - name = "Module Design (Safeguard)" - desc = "Allows for the construction of a Safeguard AI Module." - id = "safeguard_module" - req_tech = list("programming" = 3, "materials" = 4) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20, "$gold" = 100) - build_path = /obj/item/weapon/aiModule/supplied/safeguard - -datum/design/onehuman_module - name = "Module Design (OneHuman)" - desc = "Allows for the construction of a OneHuman AI Module." - id = "onehuman_module" - req_tech = list("programming" = 4, "materials" = 6) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20, "$diamond" = 100) - build_path = /obj/item/weapon/aiModule/zeroth/oneHuman - -datum/design/protectstation_module - name = "Module Design (ProtectStation)" - desc = "Allows for the construction of a ProtectStation AI Module." - id = "protectstation_module" - req_tech = list("programming" = 3, "materials" = 6) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20, "$gold" = 100) - build_path = /obj/item/weapon/aiModule/supplied/protectStation - -/*datum/design/notele_module - name = "Module Design (TeleporterOffline Module)" - desc = "Allows for the construction of a TeleporterOffline AI Module." - id = "notele_module" - req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20, "$gold" = 100) - build_path = /obj/item/weapon/aiModule/teleporterOffline"*/ - -datum/design/quarantine_module - name = "Module Design (Quarantine)" - desc = "Allows for the construction of a Quarantine AI Module." - id = "quarantine_module" - req_tech = list("programming" = 3, "biotech" = 2, "materials" = 4) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20, "$gold" = 100) - build_path = /obj/item/weapon/aiModule/supplied/quarantine - -datum/design/oxygen_module - name = "Module Design (OxygenIsToxicToHumans)" - desc = "Allows for the construction of a Safeguard AI Module." - id = "oxygen_module" - req_tech = list("programming" = 3, "biotech" = 2, "materials" = 4) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20, "$gold" = 100) - build_path = /obj/item/weapon/aiModule/supplied/oxygen - -datum/design/freeform_module - name = "Module Design (Freeform)" - desc = "Allows for the construction of a Freeform AI Module." - id = "freeform_module" - req_tech = list("programming" = 4, "materials" = 4) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20, "$gold" = 100) - build_path = /obj/item/weapon/aiModule/supplied/freeform - -datum/design/reset_module - name = "Module Design (Reset)" - desc = "Allows for the construction of a Reset AI Module." - id = "reset_module" - req_tech = list("programming" = 3, "materials" = 6) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20, "$gold" = 100) - build_path = /obj/item/weapon/aiModule/reset - -datum/design/purge_module - name = "Module Design (Purge)" - desc = "Allows for the construction of a Purge AI Module." - id = "purge_module" - req_tech = list("programming" = 4, "materials" = 6) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20, "$diamond" = 100) - build_path = /obj/item/weapon/aiModule/reset/purge - -datum/design/freeformcore_module - name = "Core Module Design (Freeform)" - desc = "Allows for the construction of a Freeform AI Core Module." - id = "freeformcore_module" - req_tech = list("programming" = 4, "materials" = 6) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20, "$diamond" = 100) - build_path = /obj/item/weapon/aiModule/core/freeformcore - -datum/design/asimov - name = "Core Module Design (Asimov)" - desc = "Allows for the construction of a Asimov AI Core Module." - id = "asimov_module" - req_tech = list("programming" = 3, "materials" = 6) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20, "$diamond" = 100) - build_path = /obj/item/weapon/aiModule/core/full/asimov - -datum/design/paladin_module - name = "Core Module Design (P.A.L.A.D.I.N.)" - desc = "Allows for the construction of a P.A.L.A.D.I.N. AI Core Module." - id = "paladin_module" - req_tech = list("programming" = 4, "materials" = 6) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20, "$diamond" = 100) - build_path = /obj/item/weapon/aiModule/core/full/paladin - -datum/design/tyrant_module - name = "Core Module Design (T.Y.R.A.N.T.)" - desc = "Allows for the construction of a T.Y.R.A.N.T. AI Module." - id = "tyrant_module" - req_tech = list("programming" = 4, "syndicate" = 2, "materials" = 6) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20, "$diamond" = 100) - build_path = /obj/item/weapon/aiModule/core/full/tyrant - -datum/design/corporate_module - name = "Core Module Design (Corporate)" - desc = "Allows for the construction of a Corporate AI Core Module." - id = "corporate_module" - req_tech = list("programming" = 4, "materials" = 6) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20, "$diamond" = 100) - build_path = /obj/item/weapon/aiModule/core/full/corp - -datum/design/custom_module - name = "Core Module Design (Custom)" - desc = "Allows for the construction of a Custom AI Core Module." - id = "custom_module" - req_tech = list("programming" = 4, "materials" = 6) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20, "$diamond" = 100) - build_path = /obj/item/weapon/aiModule/core/full/custom - - -/////////////////////////////////// -/////Subspace Telecomms//////////// -/////////////////////////////////// -datum/design/subspace_receiver - name = "Machine Design (Subspace Receiver)" - desc = "Allows for the construction of Subspace Receiver equipment." - id = "s-receiver" - req_tech = list("programming" = 2, "engineering" = 2, "bluespace" = 1) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/telecomms/receiver - -datum/design/telecomms_bus - name = "Machine Design (Bus Mainframe)" - desc = "Allows for the construction of Telecommunications Bus Mainframes." - id = "s-bus" - req_tech = list("programming" = 2, "engineering" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/telecomms/bus - -datum/design/telecomms_hub - name = "Machine Design (Hub Mainframe)" - desc = "Allows for the construction of Telecommunications Hub Mainframes." - id = "s-hub" - req_tech = list("programming" = 2, "engineering" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/telecomms/hub - -datum/design/telecomms_relay - name = "Machine Design (Relay Mainframe)" - desc = "Allows for the construction of Telecommunications Relay Mainframes." - id = "s-relay" - req_tech = list("programming" = 2, "engineering" = 2, "bluespace" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/telecomms/relay - -datum/design/telecomms_processor - name = "Machine Design (Processor Unit)" - desc = "Allows for the construction of Telecommunications Processor equipment." - id = "s-processor" - req_tech = list("programming" = 2, "engineering" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/telecomms/processor - -datum/design/telecomms_server - name = "Machine Design (Server Mainframe)" - desc = "Allows for the construction of Telecommunications Servers." - id = "s-server" - req_tech = list("programming" = 2, "engineering" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/telecomms/server - -datum/design/subspace_broadcaster - name = "Machine Design (Subspace Broadcaster)" - desc = "Allows for the construction of Subspace Broadcasting equipment." - id = "s-broadcaster" - req_tech = list("programming" = 2, "engineering" = 2, "bluespace" = 1) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/telecomms/broadcaster - /////////////////////////////////// /////Non-Board Computer Stuff////// /////////////////////////////////// @@ -626,302 +84,6 @@ datum/design/paicard materials = list("$glass" = 500, "$metal" = 500) build_path = /obj/item/device/paicard -/////////////////////////////////// -//////////Mecha Module Disks/////// -/////////////////////////////////// - -datum/design/ripley_main - name = "Exosuit Design (APLU \"Ripley\" Central Control module)" - desc = "Allows for the construction of a \"Ripley\" Central Control module." - id = "ripley_main" - req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mecha/ripley/main - -datum/design/ripley_peri - name = "Exosuit Design (APLU \"Ripley\" Peripherals Control module)" - desc = "Allows for the construction of a \"Ripley\" Peripheral Control module." - id = "ripley_peri" - req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mecha/ripley/peripherals - -datum/design/odysseus_main - name = "Exosuit Design (\"Odysseus\" Central Control module)" - desc = "Allows for the construction of a \"Odysseus\" Central Control module." - id = "odysseus_main" - req_tech = list("programming" = 3,"biotech" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mecha/odysseus/main - -datum/design/odysseus_peri - name = "Exosuit Design (\"Odysseus\" Peripherals Control module)" - desc = "Allows for the construction of a \"Odysseus\" Peripheral Control module." - id = "odysseus_peri" - req_tech = list("programming" = 3,"biotech" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mecha/odysseus/peripherals - -datum/design/gygax_main - name = "Exosuit Design (\"Gygax\" Central Control module)" - desc = "Allows for the construction of a \"Gygax\" Central Control module." - id = "gygax_main" - req_tech = list("programming" = 4) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mecha/gygax/main - -datum/design/gygax_peri - name = "Exosuit Design (\"Gygax\" Peripherals Control module)" - desc = "Allows for the construction of a \"Gygax\" Peripheral Control module." - id = "gygax_peri" - req_tech = list("programming" = 4) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mecha/gygax/peripherals - -datum/design/gygax_targ - name = "Exosuit Design (\"Gygax\" Weapons & Targeting Control module)" - desc = "Allows for the construction of a \"Gygax\" Weapons & Targeting Control module." - id = "gygax_targ" - req_tech = list("programming" = 4, "combat" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mecha/gygax/targeting - -datum/design/durand_main - name = "Exosuit Design (\"Durand\" Central Control module)" - desc = "Allows for the construction of a \"Durand\" Central Control module." - id = "durand_main" - req_tech = list("programming" = 4) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mecha/durand/main - -datum/design/durand_peri - name = "Exosuit Design (\"Durand\" Peripherals Control module)" - desc = "Allows for the construction of a \"Durand\" Peripheral Control module." - id = "durand_peri" - req_tech = list("programming" = 4) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mecha/durand/peripherals - -datum/design/durand_targ - name = "Exosuit Design (\"Durand\" Weapons & Targeting Control module)" - desc = "Allows for the construction of a \"Durand\" Weapons & Targeting Control module." - id = "durand_targ" - req_tech = list("programming" = 4, "combat" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mecha/durand/targeting - -datum/design/honker_main - name = "Exosuit Design (\"H.O.N.K\" Central Control module)" - desc = "Allows for the construction of a \"H.O.N.K\" Central Control module." - id = "honker_main" - req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mecha/honker/main - -datum/design/honker_peri - name = "Exosuit Design (\"H.O.N.K\" Peripherals Control module)" - desc = "Allows for the construction of a \"H.O.N.K\" Peripheral Control module." - id = "honker_peri" - req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mecha/honker/peripherals - -datum/design/honker_targ - name = "Exosuit Design (\"H.O.N.K\" Weapons & Targeting Control module)" - desc = "Allows for the construction of a \"H.O.N.K\" Weapons & Targeting Control module." - id = "honker_targ" - req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mecha/honker/targeting - -//////////////////////////////////////// -/////////// Mecha Equpment ///////////// -//////////////////////////////////////// - -datum/design/mech_scattershot - name = "Exosuit Weapon Design (LBX AC 10 \"Scattershot\")" - desc = "Allows for the construction of LBX AC 10." - id = "mech_scattershot" - build_type = MECHFAB - req_tech = list("combat" = 4) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot - category = "Exosuit Equipment" - -datum/design/mech_carbine - name = "Exosuit Weapon Design (FNX-99 \"Hades\" Carbine)" - desc = "Allows for the construction of FNX-99 \"Hades\" Carbine." - id = "mech_carbine" - build_type = MECHFAB - req_tech = list("combat" = 5, "materials" = 4) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine - category = "Exosuit Equipment" - -datum/design/mech_ion - name = "Exosuit Weapon Design (MKIV Ion Heavy Cannon)" - desc = "Allows for the construction of MKIV Ion Heavy Cannon." - id = "mech_ion" - build_type = MECHFAB - req_tech = list("combat" = 6, "magnets" = 5, "materials" = 5) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion - category = "Exosuit Equipment" - -datum/design/mech_laser - name = "Exosuit Weapon Design (CH-PS \"Immolator\" Laser)" - desc = "Allows for the construction of CH-PS Laser." - id = "mech_laser" - build_type = MECHFAB - req_tech = list("combat" = 3, "magnets" = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser - category = "Exosuit Equipment" - -datum/design/mech_laser_heavy - name = "Exosuit Weapon Design (CH-LC \"Solaris\" Laser Cannon)" - desc = "Allows for the construction of CH-LC Laser Cannon." - id = "mech_laser_heavy" - build_type = MECHFAB - req_tech = list("combat" = 4, "magnets" = 4) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy - category = "Exosuit Equipment" - -datum/design/mech_grenade_launcher - name = "Exosuit Weapon Design (SGL-6 Grenade Launcher)" - desc = "Allows for the construction of SGL-6 Grenade Launcher." - id = "mech_grenade_launcher" - build_type = MECHFAB - req_tech = list("combat" = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang - category = "Exosuit Equipment" - -datum/design/mech_missile_rack - name = "Exosuit Weapon Design (SRM-8 Missile Rack)" - desc = "Allows for the construction of SRM-8 Missile Rack." - id = "mech_missile_rack" - build_type = MECHFAB - req_tech = list("combat" = 6, "materials" = 6) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack - category = "Exosuit Equipment" - -datum/design/clusterbang_launcher - name = "Exosuit Module Design (SOB-3 Clusterbang Launcher)" - desc = "A weapon that violates the Geneva Convention at 3 rounds per minute" - id = "clusterbang_launcher" - build_type = MECHFAB - req_tech = list("combat"= 5, "materials" = 5, "syndicate" = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang - category = "Exosuit Equipment" - -datum/design/mech_wormhole_gen - name = "Exosuit Module Design (Localized Wormhole Generator)" - desc = "An exosuit module that allows generating of small quasi-stable wormholes." - id = "mech_wormhole_gen" - build_type = MECHFAB - req_tech = list("bluespace" = 3, "magnets" = 2) - build_path = /obj/item/mecha_parts/mecha_equipment/wormhole_generator - category = "Exosuit Equipment" - -datum/design/mech_teleporter - name = "Exosuit Module Design (Teleporter Module)" - desc = "An exosuit module that allows exosuits to teleport to any position in view." - id = "mech_teleporter" - build_type = MECHFAB - req_tech = list("bluespace" = 10, "magnets" = 5) - build_path = /obj/item/mecha_parts/mecha_equipment/teleporter - category = "Exosuit Equipment" - -datum/design/mech_rcd - name = "Exosuit Module Design (RCD Module)" - desc = "An exosuit-mounted Rapid Construction Device." - id = "mech_rcd" - build_type = MECHFAB - req_tech = list("materials" = 4, "bluespace" = 3, "magnets" = 4, "powerstorage"=4, "engineering" = 4) - build_path = /obj/item/mecha_parts/mecha_equipment/tool/rcd - category = "Exosuit Equipment" - -datum/design/mech_gravcatapult - name = "Exosuit Module Design (Gravitational Catapult Module)" - desc = "An exosuit mounted Gravitational Catapult." - id = "mech_gravcatapult" - build_type = MECHFAB - req_tech = list("bluespace" = 2, "magnets" = 3, "engineering" = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult - category = "Exosuit Equipment" - -datum/design/mech_repair_droid - name = "Exosuit Module Design (Repair Droid Module)" - desc = "Automated Repair Droid. BEEP BOOP" - id = "mech_repair_droid" - build_type = MECHFAB - req_tech = list("magnets" = 3, "programming" = 3, "engineering" = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid - category = "Exosuit Equipment" - -datum/design/mech_energy_relay - name = "Exosuit Module Design (Tesla Energy Relay)" - desc = "Tesla Energy Relay" - id = "mech_energy_relay" - build_type = MECHFAB - req_tech = list("magnets" = 4, "powerstorage" = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay - category = "Exosuit Equipment" - -datum/design/mech_ccw_armor - name = "Exosuit Module Design(Reactive Armor Booster Module)" - desc = "Exosuit-mounted armor booster." - id = "mech_ccw_armor" - build_type = MECHFAB - req_tech = list("materials" = 5, "combat" = 4) - build_path = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster - category = "Exosuit Equipment" - -datum/design/mech_proj_armor - name = "Exosuit Module Design(Reflective Armor Booster Module)" - desc = "Exosuit-mounted armor booster." - id = "mech_proj_armor" - build_type = MECHFAB - req_tech = list("materials" = 5, "combat" = 5, "engineering"=3) - build_path = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster - category = "Exosuit Equipment" - -datum/design/mech_syringe_gun - name = "Exosuit Module Design(Syringe Gun)" - desc = "Exosuit-mounted syringe gun and chemical synthesizer." - id = "mech_syringe_gun" - build_type = MECHFAB - req_tech = list("materials" = 3, "biotech"=4, "magnets"=4, "programming"=3) - build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun - category = "Exosuit Equipment" - -datum/design/mech_diamond_drill - name = "Exosuit Module Design (Diamond Mining Drill)" - desc = "An upgraded version of the standard drill." - id = "mech_diamond_drill" - build_type = MECHFAB - req_tech = list("materials" = 4, "engineering" = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill - category = "Exosuit Equipment" - -datum/design/mech_generator_nuclear - name = "Exosuit Module Design (ExoNuclear Reactor)" - desc = "Compact nuclear reactor module." - id = "mech_generator_nuclear" - build_type = MECHFAB - req_tech = list("powerstorage"= 3, "engineering" = 3, "materials" = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/generator/nuclear - category = "Exosuit Equipment" - //////////////////////////////////////// //////////Disk Construction Disks/////// @@ -944,801 +106,6 @@ datum/design/tech_disk materials = list("$metal" = 30, "$glass" = 10) build_path = /obj/item/weapon/disk/tech_disk -//////////////////////////////////////// -/////////////Stock Parts//////////////// -//////////////////////////////////////// - -datum/design/RPED - name = "Rapid Part Exchange Device" - desc = "Special mechanical module made to store, sort, and apply standard machine parts." - id = "rped" - req_tech = list("engineering" = 3, - "materials" = 3) - build_type = PROTOLATHE - materials = list("$metal" = 15000, "$glass" = 5000) //hardcore - build_path = /obj/item/weapon/storage/part_replacer - -datum/design/basic_capacitor - name = "Basic Capacitor" - desc = "A stock part used in the construction of various devices." - id = "basic_capacitor" - req_tech = list("powerstorage" = 1) - build_type = PROTOLATHE | AUTOLATHE - materials = list("$metal" = 50, "$glass" = 50) - build_path = /obj/item/weapon/stock_parts/capacitor - -datum/design/basic_scanning - name = "Basic Scanning Module" - desc = "A stock part used in the construction of various devices." - id = "basic_scanning" - req_tech = list("magnets" = 1) - build_type = PROTOLATHE | AUTOLATHE - materials = list("$metal" = 50, "$glass" = 20) - build_path = /obj/item/weapon/stock_parts/scanning_module - -datum/design/micro_mani - name = "Micro Manipulator" - desc = "A stock part used in the construction of various devices." - id = "micro_mani" - req_tech = list("materials" = 1, "programming" = 1) - build_type = PROTOLATHE | AUTOLATHE - materials = list("$metal" = 30) - build_path = /obj/item/weapon/stock_parts/manipulator - -datum/design/basic_micro_laser - name = "Basic Micro-Laser" - desc = "A stock part used in the construction of various devices." - id = "basic_micro_laser" - req_tech = list("magnets" = 1) - build_type = PROTOLATHE | AUTOLATHE - materials = list("$metal" = 10, "$glass" = 20) - build_path = /obj/item/weapon/stock_parts/micro_laser - -datum/design/basic_matter_bin - name = "Basic Matter Bin" - desc = "A stock part used in the construction of various devices." - id = "basic_matter_bin" - req_tech = list("materials" = 1) - build_type = PROTOLATHE | AUTOLATHE - materials = list("$metal" = 80) - build_path = /obj/item/weapon/stock_parts/matter_bin - -datum/design/adv_capacitor - name = "Advanced Capacitor" - desc = "A stock part used in the construction of various devices." - id = "adv_capacitor" - req_tech = list("powerstorage" = 3) - build_type = PROTOLATHE - materials = list("$metal" = 50, "$glass" = 50) - build_path = /obj/item/weapon/stock_parts/capacitor/adv - -datum/design/adv_scanning - name = "Advanced Scanning Module" - desc = "A stock part used in the construction of various devices." - id = "adv_scanning" - req_tech = list("magnets" = 3) - build_type = PROTOLATHE - materials = list("$metal" = 50, "$glass" = 20) - build_path = /obj/item/weapon/stock_parts/scanning_module/adv - -datum/design/nano_mani - name = "Nano Manipulator" - desc = "A stock part used in the construction of various devices." - id = "nano_mani" - req_tech = list("materials" = 3, "programming" = 2) - build_type = PROTOLATHE - materials = list("$metal" = 30) - build_path = /obj/item/weapon/stock_parts/manipulator/nano - -datum/design/high_micro_laser - name = "High-Power Micro-Laser" - desc = "A stock part used in the construction of various devices." - id = "high_micro_laser" - req_tech = list("magnets" = 3) - build_type = PROTOLATHE - materials = list("$metal" = 10, "$glass" = 20) - build_path = /obj/item/weapon/stock_parts/micro_laser/high - -datum/design/adv_matter_bin - name = "Advanced Matter Bin" - desc = "A stock part used in the construction of various devices." - id = "adv_matter_bin" - req_tech = list("materials" = 3) - build_type = PROTOLATHE - materials = list("$metal" = 80) - build_path = /obj/item/weapon/stock_parts/matter_bin/adv - -datum/design/super_capacitor - name = "Super Capacitor" - desc = "A stock part used in the construction of various devices." - id = "super_capacitor" - req_tech = list("powerstorage" = 5, "materials" = 4) - build_type = PROTOLATHE - reliability = 71 - materials = list("$metal" = 50, "$glass" = 50, "$gold" = 20) - build_path = /obj/item/weapon/stock_parts/capacitor/super - -datum/design/phasic_scanning - name = "Phasic Scanning Module" - desc = "A stock part used in the construction of various devices." - id = "phasic_scanning" - req_tech = list("magnets" = 5, "materials" = 3) - build_type = PROTOLATHE - materials = list("$metal" = 50, "$glass" = 20, "$silver" = 10) - reliability = 72 - build_path = /obj/item/weapon/stock_parts/scanning_module/phasic - -datum/design/pico_mani - name = "Pico Manipulator" - desc = "A stock part used in the construction of various devices." - id = "pico_mani" - req_tech = list("materials" = 5, "programming" = 2) - build_type = PROTOLATHE - materials = list("$metal" = 30) - reliability = 73 - build_path = /obj/item/weapon/stock_parts/manipulator/pico - -datum/design/ultra_micro_laser - name = "Ultra-High-Power Micro-Laser" - desc = "A stock part used in the construction of various devices." - id = "ultra_micro_laser" - req_tech = list("magnets" = 5, "materials" = 5) - build_type = PROTOLATHE - materials = list("$metal" = 10, "$glass" = 20, "$uranium" = 10) - reliability = 70 - build_path = /obj/item/weapon/stock_parts/micro_laser/ultra - -datum/design/super_matter_bin - name = "Super Matter Bin" - desc = "A stock part used in the construction of various devices." - id = "super_matter_bin" - req_tech = list("materials" = 5) - build_type = PROTOLATHE - materials = list("$metal" = 80) - reliability = 75 - build_path = /obj/item/weapon/stock_parts/matter_bin/super - - - -datum/design/telesci_gps - name = "GPS Device" - desc = "Little thingie that can track its position at all times." - id = "telesci_gps" - req_tech = list("materials" = 2, "magnets" = 3, "bluespace" = 3) - build_type = PROTOLATHE - materials = list("$metal" = 500, "$glass" = 1000) - build_path = /obj/item/device/gps - -datum/design/subspace_ansible - name = "Subspace Ansible" - desc = "A compact module capable of sensing extradimensional activity." - id = "s-ansible" - req_tech = list("programming" = 2, "magnets" = 2, "materials" = 2, "bluespace" = 1) - build_type = PROTOLATHE - materials = list("$metal" = 80, "$silver" = 20) - build_path = /obj/item/weapon/stock_parts/subspace/ansible - -datum/design/hyperwave_filter - name = "Hyperwave Filter" - desc = "A tiny device capable of filtering and converting super-intense radiowaves." - id = "s-filter" - req_tech = list("programming" = 2, "magnets" = 2) - build_type = PROTOLATHE - materials = list("$metal" = 40, "$silver" = 10) - build_path = /obj/item/weapon/stock_parts/subspace/filter - -datum/design/subspace_amplifier - name = "Subspace Amplifier" - desc = "A compact micro-machine capable of amplifying weak subspace transmissions." - id = "s-amplifier" - req_tech = list("programming" = 2, "magnets" = 2, "materials" = 2, "bluespace" = 1) - build_type = PROTOLATHE - materials = list("$metal" = 10, "$gold" = 30, "$uranium" = 15) - build_path = /obj/item/weapon/stock_parts/subspace/amplifier - -datum/design/subspace_treatment - name = "Subspace Treatment Disk" - desc = "A compact micro-machine capable of stretching out hyper-compressed radio waves." - id = "s-treatment" - req_tech = list("programming" = 2, "magnets" = 1, "materials" = 2, "bluespace" = 1) - build_type = PROTOLATHE - materials = list("$metal" = 10, "$silver" = 20) - build_path = /obj/item/weapon/stock_parts/subspace/treatment - -datum/design/subspace_analyzer - name = "Subspace Analyzer" - desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths." - id = "s-analyzer" - req_tech = list("programming" = 2, "magnets" = 2, "materials" = 2, "bluespace" = 1) - build_type = PROTOLATHE - materials = list("$metal" = 10, "$gold" = 15) - build_path = /obj/item/weapon/stock_parts/subspace/analyzer - -datum/design/subspace_crystal - name = "Ansible Crystal" - desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths." - id = "s-crystal" - req_tech = list("magnets" = 2, "materials" = 2, "bluespace" = 1) - build_type = PROTOLATHE - materials = list("$glass" = 1000, "$silver" = 20, "$gold" = 20) - build_path = /obj/item/weapon/stock_parts/subspace/crystal - -datum/design/subspace_transmitter - name = "Subspace Transmitter" - desc = "A large piece of equipment used to open a window into the subspace dimension." - id = "s-transmitter" - req_tech = list("magnets" = 3, "materials" = 3, "bluespace" = 2) - build_type = PROTOLATHE - materials = list("$glass" = 100, "$silver" = 10, "$uranium" = 15) - build_path = /obj/item/weapon/stock_parts/subspace/transmitter - -//////////////////////////////////////// -//////////////////Power///////////////// -//////////////////////////////////////// - -datum/design/basic_cell - name = "Basic Power Cell" - desc = "A basic power cell that holds 1000 units of energy." - id = "basic_cell" - req_tech = list("powerstorage" = 1) - build_type = PROTOLATHE | AUTOLATHE |MECHFAB - materials = list("$metal" = 700, "$glass" = 50) - build_path = /obj/item/weapon/stock_parts/cell - category = "Misc" - -datum/design/high_cell - name = "High-Capacity Power Cell" - desc = "A power cell that holds 10000 units of energy." - id = "high_cell" - req_tech = list("powerstorage" = 2) - build_type = PROTOLATHE | AUTOLATHE | MECHFAB - materials = list("$metal" = 700, "$glass" = 60) - build_path = /obj/item/weapon/stock_parts/cell/high - category = "Misc" - -datum/design/super_cell - name = "Super-Capacity Power Cell" - desc = "A power cell that holds 20000 units of energy." - id = "super_cell" - req_tech = list("powerstorage" = 3, "materials" = 2) - reliability = 75 - build_type = PROTOLATHE | MECHFAB - materials = list("$metal" = 700, "$glass" = 70) - build_path = /obj/item/weapon/stock_parts/cell/super - category = "Misc" - -datum/design/hyper_cell - name = "Hyper-Capacity Power Cell" - desc = "A power cell that holds 30000 units of energy." - id = "hyper_cell" - req_tech = list("powerstorage" = 5, "materials" = 4) - reliability = 70 - build_type = PROTOLATHE | MECHFAB - materials = list("$metal" = 400, "$gold" = 150, "$silver" = 150, "$glass" = 70) - build_path = /obj/item/weapon/stock_parts/cell/hyper - category = "Misc" - -datum/design/light_replacer - name = "Light Replacer" - desc = "A device to automatically replace lights. Refill with working lightbulbs." - id = "light_replacer" - req_tech = list("magnets" = 3, "materials" = 4) - build_type = PROTOLATHE - materials = list("$metal" = 1500, "$silver" = 150, "$glass" = 3000) - build_path = /obj/item/device/lightreplacer - -//////////////////////////////////////// -//////////////MISC Boards/////////////// -//////////////////////////////////////// - -datum/design/smes - name = "Machine Design (SMES Board)" - desc = "The circuit board for a SMES." - id = "smes" - req_tech = list("programming" = 4, "power" = 5, "engineering" = 4) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/smes - -datum/design/turbine_computer - name = "Computer Design (Power Turbine Console Board)" - desc = "The circuit board for a power turbine console." - id = "power_turbine_console" - req_tech = list("programming" = 4, "power" = 4, "engineering" = 4) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/turbine_computer - -datum/design/power_compressor - name = "Machine Design (Power Compressor Board)" - desc = "The circuit board for a power compressor." - id = "power_compressor" - req_tech = list("programming" = 4, "power" = 5, "engineering" = 4) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/power_compressor - -datum/design/power_turbine - name = "Machine Design (Power Turbine Board)" - desc = "The circuit board for a power turbine." - id = "power_turbine" - req_tech = list("programming" = 4, "power" = 4, "engineering" = 5) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/power_turbine - -datum/design/teleport_station - name = "Machine Design (Teleportation Station Board)" - desc = "The circuit board for a teleportation station." - id = "tele_station" - req_tech = list("programming" = 4, "bluespace" = 4, "engineering" = 4) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/teleporter_station - -datum/design/teleport_hub - name = "Machine Design (Teleportation Hub Board)" - desc = "The circuit board for a teleportation hub." - id = "tele_hub" - req_tech = list("programming" = 3, "bluespace" = 5, "materials" = 4, "engineering" = 5) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/teleporter_hub - -datum/design/telepad - name = "Machine Design (Telepad Board)" - desc = "The circuit board for a telescience telepad." - id = "telepad" - req_tech = list("programming" = 4, "bluespace" = 4, "materials" = 3, "engineering" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/telesci_pad - -datum/design/sleeper - name = "Machine Design (Sleeper Board)" - desc = "The circuit board for a sleeper." - id = "sleeper" - req_tech = list("programming" = 3, "biotech" = 2, "materials" = 3, "engineering" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/sleeper - -datum/design/cryotube - name = "Machine Design (Cryotube Board)" - desc = "The circuit board for a cryotube." - id = "cryotube" - req_tech = list("programming" = 4, "biotech" = 3, "engineering" = 4) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/cryo_tube - -datum/design/thermomachine - name = "Machine Design (Freezer/Heater Board)" - desc = "The circuit board for a freezer/heater." - id = "thermomachine" - req_tech = list("programming" = 3, "plasmatech" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/thermomachine - -datum/design/biogenerator - name = "Machine Design (Biogenerator Board)" - desc = "The circuit board for a biogenerator." - id = "biogenerator" - req_tech = list("programming" = 3, "biotech" = 2, "materials" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/biogenerator - -datum/design/hydroponics - name = "Machine Design (Hydroponics Tray Board)" - desc = "The circuit board for a hydroponics tray." - id = "hydro_tray" - req_tech = list("programming" = 1, "biotech" = 1) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/hydroponics - -datum/design/microwave - name = "Machine Design (Microwave Board)" - desc = "The circuit board for a microwave." - id = "microwave" - req_tech = list("programming" = 1) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/microwave - -datum/design/chem_dispenser - name = "Machine Design (Portable Chem Dispenser Board)" - desc = "The circuit board for a portable chem dispenser." - id = "chem_dispenser" - req_tech = list("programming" = 4, "biotech" = 3, "engineering" = 4, "materials" = 4, "plasmatech" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/chem_dispenser - -datum/design/destructive_analyzer - name = "Machine Design (Destructive Analyzer Board)" - desc = "The circuit board for a destructive analyzer." - id = "destructive_analyzer" - req_tech = list("programming" = 2, "magnets" = 2, "engineering" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/destructive_analyzer - -datum/design/protolathe - name = "Machine Design (Protolathe Board)" - desc = "The circuit board for a protolathe." - id = "protolathe" - req_tech = list("programming" = 2, "engineering" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/protolathe - -datum/design/circuit_imprinter - name = "Machine Design (Circuit Imprinter Board)" - desc = "The circuit board for a circuit imprinter." - id = "circuit_imprinter" - req_tech = list("programming" = 2, "engineering" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/circuit_imprinter - -datum/design/autolathe - name = "Machine Design (Autolathe Board)" - desc = "The circuit board for an autolathe." - id = "autolathe" - req_tech = list("programming" = 2, "engineering" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/autolathe - -datum/design/rdservercontrol - name = "Computer Design (R&D Server Control Console Board)" - desc = "The circuit board for an R&D Server Control Console." - id = "rdservercontrol" - req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/rdservercontrol - -datum/design/rdserver - name = "Machine Design (R&D Server Board)" - desc = "The circuit board for an R&D Server." - id = "rdserver" - req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/rdserver - -datum/design/mechfab - name = "Machine Design (Exosuit Fabricator Board)" - desc = "The circuit board for an Exosuit Fabricator." - id = "mechfab" - req_tech = list("programming" = 3, "engineering" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mechfab - - -datum/design/cyborgrecharger - name = "Machine Design (Cyborg Recharger Board)" - desc = "The circuit board for a Cyborg Recharger." - id = "cyborgrecharger" - req_tech = list("powerstorage" = 3, "engineering" = 3) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/cyborgrecharger - -datum/design/mech_recharger - name = "Machine Design (Mechbay Recharger Board)" - desc = "The circuit board for a Mechbay Recharger." - id = "mech_recharger" - req_tech = list("programming" = 3, "powerstorage" = 4, "engineering" = 4) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mech_recharger - -datum/design/vendor - name = "Machine Design (Vendor Board)" - desc = "The circuit board for a Vendor." - id = "vendor" - req_tech = list("programming" = 1) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/vendor - -datum/design/ore_redemption - name = "Machine Design (Ore Redemption Board)" - desc = "The circuit board for an Ore Redemption machine." - id = "ore_redemption" - req_tech = list("programming" = 1, "engineering" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/ore_redemption - - -datum/design/mining_equipment_vendor - name = "Machine Design (Mining Rewards Vender Board)" - desc = "The circuit board for a Mining Rewards Vender." - id = "mining_equipment_vendor" - req_tech = list("programming" = 1, "engineering" = 2) - build_type = IMPRINTER - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/mining_equipment_vendor - -///////////////////////////////////////// -////////////Power Stuff////////////////// -///////////////////////////////////////// - -datum/design/pacman - name = "Machine Design (PACMAN-type Generator Board)" - desc = "The circuit board that for a PACMAN-type portable generator." - id = "pacman" - req_tech = list("programming" = 3, "plasmatech" = 3, "powerstorage" = 3, "engineering" = 3) - build_type = IMPRINTER - reliability = 79 - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/pacman - -datum/design/superpacman - name = "Machine Design (SUPERPACMAN-type Generator Board)" - desc = "The circuit board that for a SUPERPACMAN-type portable generator." - id = "superpacman" - req_tech = list("programming" = 3, "powerstorage" = 4, "engineering" = 4) - build_type = IMPRINTER - reliability = 76 - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/pacman/super - -datum/design/mrspacman - name = "Machine Design (MRSPACMAN-type Generator Board)" - desc = "The circuit board that for a MRSPACMAN-type portable generator." - id = "mrspacman" - req_tech = list("programming" = 3, "powerstorage" = 5, "engineering" = 5) - build_type = IMPRINTER - reliability = 74 - materials = list("$glass" = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/pacman/mrs - - -///////////////////////////////////////// -////////////Medical Tools//////////////// -///////////////////////////////////////// - -datum/design/mass_spectrometer - name = "Mass-Spectrometer" - desc = "A device for analyzing chemicals in the blood." - id = "mass_spectrometer" - req_tech = list("biotech" = 2, "magnets" = 2) - build_type = PROTOLATHE - materials = list("$metal" = 30, "$glass" = 20) - reliability = 76 - build_path = /obj/item/device/mass_spectrometer - -datum/design/adv_mass_spectrometer - name = "Advanced Mass-Spectrometer" - desc = "A device for analyzing chemicals in the blood and their quantities." - id = "adv_mass_spectrometer" - req_tech = list("biotech" = 2, "magnets" = 4) - build_type = PROTOLATHE - materials = list("$metal" = 30, "$glass" = 20) - reliability = 74 - build_path = /obj/item/device/mass_spectrometer/adv - -datum/design/mmi - name = "Man-Machine Interface" - desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity." - id = "mmi" - req_tech = list("programming" = 2, "biotech" = 3) - build_type = PROTOLATHE | MECHFAB - materials = list("$metal" = 1000, "$glass" = 500) - reliability = 76 - build_path = /obj/item/device/mmi - category = "Misc" - -datum/design/mmi_radio - name = "Radio-enabled Man-Machine Interface" - desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity. This one comes with a built-in radio." - id = "mmi_radio" - req_tech = list("programming" = 2, "biotech" = 4) - build_type = PROTOLATHE | MECHFAB - materials = list("$metal" = 1200, "$glass" = 500) - reliability = 74 - build_path = /obj/item/device/mmi/radio_enabled - category = "Misc" - -datum/design/synthetic_flash - name = "Synthetic Flash" - desc = "When a problem arises, SCIENCE is the solution." - id = "sflash" - req_tech = list("magnets" = 3, "combat" = 2) - build_type = MECHFAB - materials = list("$metal" = 750, "$glass" = 750) - reliability = 76 - build_path = /obj/item/device/flash/synthetic - category = "Misc" - -datum/design/bluespacebeaker - name = "Bluespace Beaker" - desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units." - id = "bluespacebeaker" - req_tech = list("bluespace" = 2, "materials" = 6) - build_type = PROTOLATHE - materials = list("$metal" = 3000, "$plasma" = 3000, "$diamond" = 500) - reliability = 76 - build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace - category = "Misc" - -datum/design/noreactbeaker - name = "Cryostasis Beaker" - desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units." - id = "splitbeaker" - req_tech = list("materials" = 2) - build_type = PROTOLATHE - materials = list("$metal" = 3000) - reliability = 76 - build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact - category = "Misc" - -///////////////////////////////////////// -/////////////////Weapons///////////////// -///////////////////////////////////////// - -datum/design/nuclear_gun - name = "Advanced Energy Gun" - desc = "An energy gun with an experimental miniaturized reactor." - id = "nuclear_gun" - req_tech = list("combat" = 3, "materials" = 5, "powerstorage" = 3) - build_type = PROTOLATHE - materials = list("$metal" = 5000, "$glass" = 1000, "$uranium" = 2000) - reliability = 76 - build_path = /obj/item/weapon/gun/energy/gun/nuclear - locked = 1 - -datum/design/stunrevolver - name = "Stun Revolver" - desc = "The prize of the Head of Security." - id = "stunrevolver" - req_tech = list("combat" = 3, "materials" = 3, "powerstorage" = 2) - build_type = PROTOLATHE - materials = list("$metal" = 4000) - build_path = /obj/item/weapon/gun/energy/stunrevolver - locked = 1 - -datum/design/lasercannon - name = "Laser Cannon" - desc = "A heavy duty laser cannon." - id = "lasercannon" - req_tech = list("combat" = 4, "materials" = 3, "powerstorage" = 3) - build_type = PROTOLATHE - materials = list("$metal" = 10000, "$glass" = 2000, "$diamond" = 2000) - build_path = /obj/item/weapon/gun/energy/lasercannon - locked = 1 - -datum/design/decloner - name = "Decloner" - desc = "Your opponent will bubble into a messy pile of goop." - id = "decloner" - req_tech = list("combat" = 8, "materials" = 7, "biotech" = 5, "powerstorage" = 6) - build_type = PROTOLATHE - materials = list("$gold" = 5000,"$uranium" = 10000, "mutagen" = 40) - build_path = /obj/item/weapon/gun/energy/decloner - locked = 1 -/* -datum/design/chemsprayer - name = "Chem Sprayer" - desc = "An advanced chem spraying device." - id = "chemsprayer" - req_tech = list("combat" = 3, "materials" = 3, "engineering" = 3, "biotech" = 2) - build_type = PROTOLATHE - materials = list("$metal" = 5000, "$glass" = 1000) - reliability = 100 - build_path = /obj/item/weapon/chemsprayer" -*/ -datum/design/rapidsyringe - name = "Rapid Syringe Gun" - desc = "A gun that fires many syringes." - id = "rapidsyringe" - req_tech = list("combat" = 3, "materials" = 3, "engineering" = 3, "biotech" = 2) - build_type = PROTOLATHE - materials = list("$metal" = 5000, "$glass" = 1000) - build_path = /obj/item/weapon/gun/syringe/rapidsyringe -/* -datum/design/largecrossbow - name = "Energy Crossbow" - desc = "A weapon favoured by syndicate infiltration teams." - id = "largecrossbow" - req_tech = list("combat" = 4, "materials" = 5, "engineering" = 3, "biotech" = 4, "syndicate" = 3) - build_type = PROTOLATHE - materials = list("$metal" = 5000, "$glass" = 1000, "$uranium" = 1000, "$silver" = 1000) - build_path = /obj/item/weapon/gun/energy/crossbow/largecrossbow" -*/ -datum/design/temp_gun - name = "Temperature Gun" - desc = "A gun that shoots temperature bullet energythings to change temperature."//Change it if you want - id = "temp_gun" - req_tech = list("combat" = 3, "materials" = 4, "powerstorage" = 3, "magnets" = 2) - build_type = PROTOLATHE - materials = list("$metal" = 5000, "$glass" = 500, "$silver" = 3000) - build_path = /obj/item/weapon/gun/energy/temperature - locked = 1 - -datum/design/flora_gun - name = "Floral Somatoray" - desc = "A tool that discharges controlled radiation which induces mutation in plant cells. Harmless to other organic life." - id = "flora_gun" - req_tech = list("materials" = 2, "biotech" = 3, "powerstorage" = 3) - build_type = PROTOLATHE - materials = list("$metal" = 2000, "$glass" = 500, "radium" = 20) - build_path = /obj/item/weapon/gun/energy/floragun - -datum/design/large_grenade - name = "Large Grenade" - desc = "A grenade that affects a larger area and use larger containers." - id = "large_Grenade" - req_tech = list("combat" = 3, "materials" = 2) - build_type = PROTOLATHE - materials = list("$metal" = 3000) - reliability = 79 - build_path = /obj/item/weapon/grenade/chem_grenade/large - -datum/design/smg - name = "Submachine Gun" - desc = "A lightweight, fast firing gun." - id = "smg" - req_tech = list("combat" = 4, "materials" = 3) - build_type = PROTOLATHE - materials = list("$metal" = 8000, "$silver" = 2000, "$diamond" = 1000) - build_path = /obj/item/weapon/gun/projectile/automatic - locked = 1 - -datum/design/xray - name = "Xray Laser Gun" - desc = "Not quite as menacing as it sounds" - id = "xray" - req_tech = list("combat" = 6, "materials" = 5, "biotech" = 5, "powerstorage" = 4) - build_type = PROTOLATHE - materials = list("$gold" = 5000,"$uranium" = 10000, "$metal" = 4000) - build_path = /obj/item/weapon/gun/energy/xray - locked = 1 - -datum/design/ionrifle - name = "Ion Rifle" - desc = "How to dismantle a cyborg : The gun." - id = "ionrifle" - req_tech = list("combat" = 5, "materials" = 4, "magnets" = 4) - build_type = PROTOLATHE - materials = list("$silver" = 4000, "$metal" = 6000, "$uranium" = 1000) - build_path = /obj/item/weapon/gun/energy/ionrifle - locked = 1 - -datum/design/ammo_9mm - name = "Ammunition Box (9mm)" - desc = "A box of prototype 9mm ammunition." - id = "ammo_9mm" - req_tech = list("combat" = 4, "materials" = 3) - build_type = PROTOLATHE - materials = list("$metal" = 2000) - build_path = /obj/item/ammo_box/c9mm - -datum/design/mag_smg - name = "Submachine Gun Magazine (9mm)" - desc = "A prototype magazine for the submachine gun." - id = "mag_smg" - req_tech = list("combat" = 4, "materials" = 3) - build_type = PROTOLATHE - materials = list("$metal" = 2000) - build_path = /obj/item/ammo_box/magazine/msmg9mm - -datum/design/stunshell - name = "Stun Shell" - desc = "A stunning shell for a shotgun." - id = "stunshell" - req_tech = list("combat" = 3, "materials" = 3) - build_type = PROTOLATHE - materials = list("$metal" = 200) - build_path = /obj/item/ammo_casing/shotgun/stunshell ///////////////////////////////////////// /////////////////Mining////////////////// @@ -1824,6 +191,17 @@ datum/design/bluespace_crystal reliability = 100 build_path = /obj/item/bluespace_crystal/artificial +datum/design/telesci_gps + name = "GPS Device" + desc = "Little thingie that can track its position at all times." + id = "telesci_gps" + req_tech = list("materials" = 2, "magnets" = 3, "bluespace" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 500, "$glass" = 1000) + build_path = /obj/item/device/gps + + + ///////////////////////////////////////// /////////////////HUDs//////////////////// ///////////////////////////////////////// @@ -1900,6 +278,7 @@ datum/design/security_hud_night ///////////////////////////////////////// //////////////Borg Upgrades////////////// ///////////////////////////////////////// + datum/design/borg_syndicate_module name = "Borg Illegal Weapons Upgrade" desc = "Allows for the construction of illegal upgrades for cyborgs" @@ -1909,6 +288,7 @@ datum/design/borg_syndicate_module build_path = /obj/item/borg/upgrade/syndicate category = "Cyborg Upgrade Modules" + ///////////////////////////////////////// //////////////////Misc/////////////////// ///////////////////////////////////////// diff --git a/code/modules/research/designs/AI_module_designs.dm b/code/modules/research/designs/AI_module_designs.dm new file mode 100644 index 00000000000..c8188d904b0 --- /dev/null +++ b/code/modules/research/designs/AI_module_designs.dm @@ -0,0 +1,129 @@ +/////////////////////////////////// +//////////AI Module Disks////////// +/////////////////////////////////// + +datum/design/safeguard_module + name = "Module Design (Safeguard)" + desc = "Allows for the construction of a Safeguard AI Module." + id = "safeguard_module" + req_tech = list("programming" = 3, "materials" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20, "$gold" = 100) + build_path = /obj/item/weapon/aiModule/supplied/safeguard + +datum/design/onehuman_module + name = "Module Design (OneHuman)" + desc = "Allows for the construction of a OneHuman AI Module." + id = "onehuman_module" + req_tech = list("programming" = 4, "materials" = 6) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20, "$diamond" = 100) + build_path = /obj/item/weapon/aiModule/zeroth/oneHuman + +datum/design/protectstation_module + name = "Module Design (ProtectStation)" + desc = "Allows for the construction of a ProtectStation AI Module." + id = "protectstation_module" + req_tech = list("programming" = 3, "materials" = 6) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20, "$gold" = 100) + build_path = /obj/item/weapon/aiModule/supplied/protectStation + +datum/design/quarantine_module + name = "Module Design (Quarantine)" + desc = "Allows for the construction of a Quarantine AI Module." + id = "quarantine_module" + req_tech = list("programming" = 3, "biotech" = 2, "materials" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20, "$gold" = 100) + build_path = /obj/item/weapon/aiModule/supplied/quarantine + +datum/design/oxygen_module + name = "Module Design (OxygenIsToxicToHumans)" + desc = "Allows for the construction of a Safeguard AI Module." + id = "oxygen_module" + req_tech = list("programming" = 3, "biotech" = 2, "materials" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20, "$gold" = 100) + build_path = /obj/item/weapon/aiModule/supplied/oxygen + +datum/design/freeform_module + name = "Module Design (Freeform)" + desc = "Allows for the construction of a Freeform AI Module." + id = "freeform_module" + req_tech = list("programming" = 4, "materials" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20, "$gold" = 100) + build_path = /obj/item/weapon/aiModule/supplied/freeform + +datum/design/reset_module + name = "Module Design (Reset)" + desc = "Allows for the construction of a Reset AI Module." + id = "reset_module" + req_tech = list("programming" = 3, "materials" = 6) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20, "$gold" = 100) + build_path = /obj/item/weapon/aiModule/reset + +datum/design/purge_module + name = "Module Design (Purge)" + desc = "Allows for the construction of a Purge AI Module." + id = "purge_module" + req_tech = list("programming" = 4, "materials" = 6) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20, "$diamond" = 100) + build_path = /obj/item/weapon/aiModule/reset/purge + +datum/design/freeformcore_module + name = "Core Module Design (Freeform)" + desc = "Allows for the construction of a Freeform AI Core Module." + id = "freeformcore_module" + req_tech = list("programming" = 4, "materials" = 6) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20, "$diamond" = 100) + build_path = /obj/item/weapon/aiModule/core/freeformcore + +datum/design/asimov + name = "Core Module Design (Asimov)" + desc = "Allows for the construction of a Asimov AI Core Module." + id = "asimov_module" + req_tech = list("programming" = 3, "materials" = 6) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20, "$diamond" = 100) + build_path = /obj/item/weapon/aiModule/core/full/asimov + +datum/design/paladin_module + name = "Core Module Design (P.A.L.A.D.I.N.)" + desc = "Allows for the construction of a P.A.L.A.D.I.N. AI Core Module." + id = "paladin_module" + req_tech = list("programming" = 4, "materials" = 6) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20, "$diamond" = 100) + build_path = /obj/item/weapon/aiModule/core/full/paladin + +datum/design/tyrant_module + name = "Core Module Design (T.Y.R.A.N.T.)" + desc = "Allows for the construction of a T.Y.R.A.N.T. AI Module." + id = "tyrant_module" + req_tech = list("programming" = 4, "syndicate" = 2, "materials" = 6) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20, "$diamond" = 100) + build_path = /obj/item/weapon/aiModule/core/full/tyrant + +datum/design/corporate_module + name = "Core Module Design (Corporate)" + desc = "Allows for the construction of a Corporate AI Core Module." + id = "corporate_module" + req_tech = list("programming" = 4, "materials" = 6) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20, "$diamond" = 100) + build_path = /obj/item/weapon/aiModule/core/full/corp + +datum/design/custom_module + name = "Core Module Design (Custom)" + desc = "Allows for the construction of a Custom AI Core Module." + id = "custom_module" + req_tech = list("programming" = 4, "materials" = 6) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20, "$diamond" = 100) + build_path = /obj/item/weapon/aiModule/core/full/custom \ No newline at end of file diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm new file mode 100644 index 00000000000..33839c88874 --- /dev/null +++ b/code/modules/research/designs/comp_board_designs.dm @@ -0,0 +1,334 @@ +///////////////////Computer Boards/////////////////////////////////// + +datum/design/seccamera + name = "Computer Design (Security)" + desc = "Allows for the construction of circuit boards used to build security camera computers." + id = "seccamera" + req_tech = list("programming" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/security + +datum/design/aicore + name = "AI Design (AI Core)" + desc = "Allows for the construction of circuit boards used to build new AI cores." + id = "aicore" + req_tech = list("programming" = 4, "biotech" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/aicore + +datum/design/aiupload + name = "Computer Design (AI Upload)" + desc = "Allows for the construction of circuit boards used to build an AI Upload Console." + id = "aiupload" + req_tech = list("programming" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/aiupload + +datum/design/borgupload + name = "Computer Design (Cyborg Upload)" + desc = "Allows for the construction of circuit boards used to build a Cyborg Upload Console." + id = "borgupload" + req_tech = list("programming" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/borgupload + +datum/design/med_data + name = "Computer Design (Medical Records)" + desc = "Allows for the construction of circuit boards used to build a medical records console." + id = "med_data" + req_tech = list("programming" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/med_data + +datum/design/operating + name = "Computer Design (Operating Computer)" + desc = "Allows for the construction of circuit boards used to build an operating computer console." + id = "operating" + req_tech = list("programming" = 2, "biotech" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/operating + +datum/design/pandemic + name = "Computer Design (PanD.E.M.I.C. 2200)" + desc = "Allows for the construction of circuit boards used to build a PanD.E.M.I.C. 2200 console." + id = "pandemic" + req_tech = list("programming" = 2, "biotech" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/pandemic + +datum/design/scan_console + name = "Computer Design (DNA Machine)" + desc = "Allows for the construction of circuit boards used to build a new DNA scanning console." + id = "scan_console" + req_tech = list("programming" = 2, "biotech" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/scan_consolenew + +datum/design/comconsole + name = "Computer Design (Communications)" + desc = "Allows for the construction of circuit boards used to build a communications console." + id = "comconsole" + req_tech = list("programming" = 2, "magnets" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/communications + +datum/design/idcardconsole + name = "Computer Design (ID Console)" + desc = "Allows for the construction of circuit boards used to build an ID computer." + id = "idcardconsole" + req_tech = list("programming" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/card + +datum/design/crewconsole + name = "Computer Design (Crew monitoring computer)" + desc = "Allows for the construction of circuit boards used to build a Crew monitoring computer." + id = "crewconsole" + req_tech = list("programming" = 3, "magnets" = 2, "biotech" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/crew + +datum/design/teleconsole + name = "Computer Design (Teleporter Console)" + desc = "Allows for the construction of circuit boards used to build a teleporter control console." + id = "teleconsole" + req_tech = list("programming" = 3, "bluespace" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/teleporter + +datum/design/secdata + name = "Computer Design (Security Records Console)" + desc = "Allows for the construction of circuit boards used to build a security records console." + id = "secdata" + req_tech = list("programming" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/secure_data + +datum/design/atmosalerts + name = "Computer Design (Atmosphere Alert)" + desc = "Allows for the construction of circuit boards used to build an atmosphere alert console.." + id = "atmosalerts" + req_tech = list("programming" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/atmos_alert + +datum/design/air_management + name = "Computer Design (Atmospheric Monitor)" + desc = "Allows for the construction of circuit boards used to build an Atmospheric Monitor." + id = "air_management" + req_tech = list("programming" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/air_management + +datum/design/robocontrol + name = "Computer Design (Robotics Control Console)" + desc = "Allows for the construction of circuit boards used to build a Robotics Control console." + id = "robocontrol" + req_tech = list("programming" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/robotics + +datum/design/clonecontrol + name = "Computer Design (Cloning Machine Console)" + desc = "Allows for the construction of circuit boards used to build a new Cloning Machine console." + id = "clonecontrol" + req_tech = list("programming" = 3, "biotech" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/cloning + +datum/design/clonepod + name = "Machine Design (Clone Pod)" + desc = "Allows for the construction of circuit boards used to build a Cloning Pod." + id = "clonepod" + req_tech = list("programming" = 3, "biotech" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/clonepod + +datum/design/clonescanner + name = "Machine Design (Cloning Scanner)" + desc = "Allows for the construction of circuit boards used to build a Cloning Scanner." + id = "clonescanner" + req_tech = list("programming" = 3, "biotech" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/clonescanner + +datum/design/arcadebattle + name = "Computer Design (Battle Arcade Machine)" + desc = "Allows for the construction of circuit boards used to build a new arcade machine." + id = "arcademachine" + req_tech = list("programming" = 1) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/arcade/battle + +datum/design/orion_trail + name = "Computer Design (Orion Trail Arcade Machine)" + desc = "Allows for the construction of circuit boards used to build a new Orion Trail machine." + id = "arcademachine" + req_tech = list("programming" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/arcade/orion_trail + +datum/design/orion_trail + name = "Computer Design (Slot Machine)" + desc = "Allows for the construction of circuit boards used to build a new slot machine." + id = "slotmachine" + req_tech = list("programming" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/slot_machine + +datum/design/powermonitor + name = "Computer Design (Power Monitor)" + desc = "Allows for the construction of circuit boards used to build a new power monitor." + id = "powermonitor" + req_tech = list("programming" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/powermonitor + +datum/design/solarcontrol + name = "Computer Design (Solar Control)" + desc = "Allows for the construction of circuit boards used to build a solar control console." + id = "solarcontrol" + req_tech = list("programming" = 2, "powerstorage" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/solar_control + +datum/design/prisonmanage + name = "Computer Design (Prisoner Management Console)" + desc = "Allows for the construction of circuit boards used to build a prisoner management console." + id = "prisonmanage" + req_tech = list("programming" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/prisoner + +datum/design/mechacontrol + name = "Computer Design (Exosuit Control Console)" + desc = "Allows for the construction of circuit boards used to build an exosuit control console." + id = "mechacontrol" + req_tech = list("programming" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mecha_control + +datum/design/mechapower + name = "Computer Design (Mech Bay Power Control Console)" + desc = "Allows for the construction of circuit boards used to build a mech bay power control console." + id = "mechapower" + req_tech = list("programming" = 2, "powerstorage" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mech_bay_power_console + +datum/design/rdconsole + name = "Computer Design (R&D Console)" + desc = "Allows for the construction of circuit boards used to build a new R&D console." + id = "rdconsole" + req_tech = list("programming" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/rdconsole + +datum/design/ordercomp + name = "Computer Design (Supply ordering console)" + desc = "Allows for the construction of circuit boards used to build a Supply ordering console." + id = "ordercomp" + req_tech = list("programming" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/ordercomp + +datum/design/supplycomp + name = "Computer Design (Supply shuttle console)" + desc = "Allows for the construction of circuit boards used to build a Supply shuttle console." + id = "supplycomp" + req_tech = list("programming" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/supplycomp + +datum/design/mining + name = "Computer Design (Outpost Status Display)" + desc = "Allows for the construction of circuit boards used to build an outpost status display console." + id = "mining" + req_tech = list("programming" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mining + +datum/design/comm_monitor + name = "Computer Design (Telecommunications Monitoring Console)" + desc = "Allows for the construction of circuit boards used to build a telecommunications monitor." + id = "comm_monitor" + req_tech = list("programming" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/comm_monitor + +datum/design/comm_server + name = "Computer Design (Telecommunications Server Monitoring Console)" + desc = "Allows for the construction of circuit boards used to build a telecommunication server browser and monitor." + id = "comm_server" + req_tech = list("programming" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/comm_server + +datum/design/message_monitor + name = "Computer Design (Messaging Monitor Console)" + desc = "Allows for the construction of circuit boards used to build a messaging monitor console." + id = "message_monitor" + req_tech = list("programming" = 5) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/message_monitor + +datum/design/comm_traffic + name = "Computer Design (Telecommunications Traffic Control Console)" + desc = "Allows for the construction of circuit boards used to build a telecommunications traffic control console." + id = "comm_traffic" + req_tech = list("programming" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/comm_traffic + +datum/design/telesci_console + name = "Computer Design (Telepad Control Console Board)" + desc = "Allows for the construction of circuit boards used to build a telescience console." + id = "telesci_console" + req_tech = list("programming" = 3, "bluespace" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/telesci_console + +datum/design/aifixer + name = "Computer Design (AI Integrity Restorer)" + desc = "Allows for the construction of circuit boards used to build an AI Integrity Restorer." + id = "aifixer" + req_tech = list("programming" = 3, "biotech" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/aifixer \ No newline at end of file diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm new file mode 100644 index 00000000000..bc0d01dd8fb --- /dev/null +++ b/code/modules/research/designs/machine_designs.dm @@ -0,0 +1,238 @@ +//////////////////////////////////////// +//////////////MISC Boards/////////////// +//////////////////////////////////////// + +datum/design/smes + name = "Machine Design (SMES Board)" + desc = "The circuit board for a SMES." + id = "smes" + req_tech = list("programming" = 4, "power" = 5, "engineering" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/smes + +datum/design/turbine_computer + name = "Computer Design (Power Turbine Console Board)" + desc = "The circuit board for a power turbine console." + id = "power_turbine_console" + req_tech = list("programming" = 4, "power" = 4, "engineering" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/turbine_computer + +datum/design/power_compressor + name = "Machine Design (Power Compressor Board)" + desc = "The circuit board for a power compressor." + id = "power_compressor" + req_tech = list("programming" = 4, "power" = 5, "engineering" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/power_compressor + +datum/design/power_turbine + name = "Machine Design (Power Turbine Board)" + desc = "The circuit board for a power turbine." + id = "power_turbine" + req_tech = list("programming" = 4, "power" = 4, "engineering" = 5) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/power_turbine + +datum/design/teleport_station + name = "Machine Design (Teleportation Station Board)" + desc = "The circuit board for a teleportation station." + id = "tele_station" + req_tech = list("programming" = 4, "bluespace" = 4, "engineering" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/teleporter_station + +datum/design/teleport_hub + name = "Machine Design (Teleportation Hub Board)" + desc = "The circuit board for a teleportation hub." + id = "tele_hub" + req_tech = list("programming" = 3, "bluespace" = 5, "materials" = 4, "engineering" = 5) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/teleporter_hub + +datum/design/telepad + name = "Machine Design (Telepad Board)" + desc = "The circuit board for a telescience telepad." + id = "telepad" + req_tech = list("programming" = 4, "bluespace" = 4, "materials" = 3, "engineering" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/telesci_pad + +datum/design/sleeper + name = "Machine Design (Sleeper Board)" + desc = "The circuit board for a sleeper." + id = "sleeper" + req_tech = list("programming" = 3, "biotech" = 2, "materials" = 3, "engineering" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/sleeper + +datum/design/cryotube + name = "Machine Design (Cryotube Board)" + desc = "The circuit board for a cryotube." + id = "cryotube" + req_tech = list("programming" = 4, "biotech" = 3, "engineering" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/cryo_tube + +datum/design/thermomachine + name = "Machine Design (Freezer/Heater Board)" + desc = "The circuit board for a freezer/heater." + id = "thermomachine" + req_tech = list("programming" = 3, "plasmatech" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/thermomachine + +datum/design/biogenerator + name = "Machine Design (Biogenerator Board)" + desc = "The circuit board for a biogenerator." + id = "biogenerator" + req_tech = list("programming" = 3, "biotech" = 2, "materials" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/biogenerator + +datum/design/hydroponics + name = "Machine Design (Hydroponics Tray Board)" + desc = "The circuit board for a hydroponics tray." + id = "hydro_tray" + req_tech = list("programming" = 1, "biotech" = 1) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/hydroponics + +datum/design/microwave + name = "Machine Design (Microwave Board)" + desc = "The circuit board for a microwave." + id = "microwave" + req_tech = list("programming" = 1) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/microwave + +datum/design/chem_dispenser + name = "Machine Design (Portable Chem Dispenser Board)" + desc = "The circuit board for a portable chem dispenser." + id = "chem_dispenser" + req_tech = list("programming" = 4, "biotech" = 3, "engineering" = 4, "materials" = 4, "plasmatech" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/chem_dispenser + +datum/design/destructive_analyzer + name = "Machine Design (Destructive Analyzer Board)" + desc = "The circuit board for a destructive analyzer." + id = "destructive_analyzer" + req_tech = list("programming" = 2, "magnets" = 2, "engineering" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/destructive_analyzer + +datum/design/protolathe + name = "Machine Design (Protolathe Board)" + desc = "The circuit board for a protolathe." + id = "protolathe" + req_tech = list("programming" = 2, "engineering" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/protolathe + +datum/design/circuit_imprinter + name = "Machine Design (Circuit Imprinter Board)" + desc = "The circuit board for a circuit imprinter." + id = "circuit_imprinter" + req_tech = list("programming" = 2, "engineering" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/circuit_imprinter + +datum/design/autolathe + name = "Machine Design (Autolathe Board)" + desc = "The circuit board for an autolathe." + id = "autolathe" + req_tech = list("programming" = 2, "engineering" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/autolathe + +datum/design/rdservercontrol + name = "Computer Design (R&D Server Control Console Board)" + desc = "The circuit board for an R&D Server Control Console." + id = "rdservercontrol" + req_tech = list("programming" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/rdservercontrol + +datum/design/rdserver + name = "Machine Design (R&D Server Board)" + desc = "The circuit board for an R&D Server." + id = "rdserver" + req_tech = list("programming" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/rdserver + +datum/design/mechfab + name = "Machine Design (Exosuit Fabricator Board)" + desc = "The circuit board for an Exosuit Fabricator." + id = "mechfab" + req_tech = list("programming" = 3, "engineering" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mechfab + +datum/design/cyborgrecharger + name = "Machine Design (Cyborg Recharger Board)" + desc = "The circuit board for a Cyborg Recharger." + id = "cyborgrecharger" + req_tech = list("powerstorage" = 3, "engineering" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/cyborgrecharger + +datum/design/mech_recharger + name = "Machine Design (Mechbay Recharger Board)" + desc = "The circuit board for a Mechbay Recharger." + id = "mech_recharger" + req_tech = list("programming" = 3, "powerstorage" = 4, "engineering" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mech_recharger + +datum/design/vendor + name = "Machine Design (Vendor Board)" + desc = "The circuit board for a Vendor." + id = "vendor" + req_tech = list("programming" = 1) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/vendor + +datum/design/ore_redemption + name = "Machine Design (Ore Redemption Board)" + desc = "The circuit board for an Ore Redemption machine." + id = "ore_redemption" + req_tech = list("programming" = 1, "engineering" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/ore_redemption + + +datum/design/mining_equipment_vendor + name = "Machine Design (Mining Rewards Vender Board)" + desc = "The circuit board for a Mining Rewards Vender." + id = "mining_equipment_vendor" + req_tech = list("programming" = 1, "engineering" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mining_equipment_vendor \ No newline at end of file diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm new file mode 100644 index 00000000000..f50c4b9b256 --- /dev/null +++ b/code/modules/research/designs/mecha_designs.dm @@ -0,0 +1,295 @@ +/////////////////////////////////// +//////////Mecha Module Disks/////// +/////////////////////////////////// + +datum/design/ripley_main + name = "Exosuit Design (APLU \"Ripley\" Central Control module)" + desc = "Allows for the construction of a \"Ripley\" Central Control module." + id = "ripley_main" + req_tech = list("programming" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mecha/ripley/main + +datum/design/ripley_peri + name = "Exosuit Design (APLU \"Ripley\" Peripherals Control module)" + desc = "Allows for the construction of a \"Ripley\" Peripheral Control module." + id = "ripley_peri" + req_tech = list("programming" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mecha/ripley/peripherals + +datum/design/odysseus_main + name = "Exosuit Design (\"Odysseus\" Central Control module)" + desc = "Allows for the construction of a \"Odysseus\" Central Control module." + id = "odysseus_main" + req_tech = list("programming" = 3,"biotech" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mecha/odysseus/main + +datum/design/odysseus_peri + name = "Exosuit Design (\"Odysseus\" Peripherals Control module)" + desc = "Allows for the construction of a \"Odysseus\" Peripheral Control module." + id = "odysseus_peri" + req_tech = list("programming" = 3,"biotech" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mecha/odysseus/peripherals + +datum/design/gygax_main + name = "Exosuit Design (\"Gygax\" Central Control module)" + desc = "Allows for the construction of a \"Gygax\" Central Control module." + id = "gygax_main" + req_tech = list("programming" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mecha/gygax/main + +datum/design/gygax_peri + name = "Exosuit Design (\"Gygax\" Peripherals Control module)" + desc = "Allows for the construction of a \"Gygax\" Peripheral Control module." + id = "gygax_peri" + req_tech = list("programming" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mecha/gygax/peripherals + +datum/design/gygax_targ + name = "Exosuit Design (\"Gygax\" Weapons & Targeting Control module)" + desc = "Allows for the construction of a \"Gygax\" Weapons & Targeting Control module." + id = "gygax_targ" + req_tech = list("programming" = 4, "combat" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mecha/gygax/targeting + +datum/design/durand_main + name = "Exosuit Design (\"Durand\" Central Control module)" + desc = "Allows for the construction of a \"Durand\" Central Control module." + id = "durand_main" + req_tech = list("programming" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mecha/durand/main + +datum/design/durand_peri + name = "Exosuit Design (\"Durand\" Peripherals Control module)" + desc = "Allows for the construction of a \"Durand\" Peripheral Control module." + id = "durand_peri" + req_tech = list("programming" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mecha/durand/peripherals + +datum/design/durand_targ + name = "Exosuit Design (\"Durand\" Weapons & Targeting Control module)" + desc = "Allows for the construction of a \"Durand\" Weapons & Targeting Control module." + id = "durand_targ" + req_tech = list("programming" = 4, "combat" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mecha/durand/targeting + +datum/design/honker_main + name = "Exosuit Design (\"H.O.N.K\" Central Control module)" + desc = "Allows for the construction of a \"H.O.N.K\" Central Control module." + id = "honker_main" + req_tech = list("programming" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mecha/honker/main + +datum/design/honker_peri + name = "Exosuit Design (\"H.O.N.K\" Peripherals Control module)" + desc = "Allows for the construction of a \"H.O.N.K\" Peripheral Control module." + id = "honker_peri" + req_tech = list("programming" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mecha/honker/peripherals + +datum/design/honker_targ + name = "Exosuit Design (\"H.O.N.K\" Weapons & Targeting Control module)" + desc = "Allows for the construction of a \"H.O.N.K\" Weapons & Targeting Control module." + id = "honker_targ" + req_tech = list("programming" = 3) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/mecha/honker/targeting + +//////////////////////////////////////// +/////////// Mecha Equpment ///////////// +//////////////////////////////////////// + +datum/design/mech_scattershot + name = "Exosuit Weapon Design (LBX AC 10 \"Scattershot\")" + desc = "Allows for the construction of LBX AC 10." + id = "mech_scattershot" + build_type = MECHFAB + req_tech = list("combat" = 4) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot + category = "Exosuit Equipment" + +datum/design/mech_carbine + name = "Exosuit Weapon Design (FNX-99 \"Hades\" Carbine)" + desc = "Allows for the construction of FNX-99 \"Hades\" Carbine." + id = "mech_carbine" + build_type = MECHFAB + req_tech = list("combat" = 5, "materials" = 4) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine + category = "Exosuit Equipment" + +datum/design/mech_ion + name = "Exosuit Weapon Design (MKIV Ion Heavy Cannon)" + desc = "Allows for the construction of MKIV Ion Heavy Cannon." + id = "mech_ion" + build_type = MECHFAB + req_tech = list("combat" = 6, "magnets" = 5, "materials" = 5) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion + category = "Exosuit Equipment" + +datum/design/mech_laser + name = "Exosuit Weapon Design (CH-PS \"Immolator\" Laser)" + desc = "Allows for the construction of CH-PS Laser." + id = "mech_laser" + build_type = MECHFAB + req_tech = list("combat" = 3, "magnets" = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser + category = "Exosuit Equipment" + +datum/design/mech_laser_heavy + name = "Exosuit Weapon Design (CH-LC \"Solaris\" Laser Cannon)" + desc = "Allows for the construction of CH-LC Laser Cannon." + id = "mech_laser_heavy" + build_type = MECHFAB + req_tech = list("combat" = 4, "magnets" = 4) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy + category = "Exosuit Equipment" + +datum/design/mech_grenade_launcher + name = "Exosuit Weapon Design (SGL-6 Grenade Launcher)" + desc = "Allows for the construction of SGL-6 Grenade Launcher." + id = "mech_grenade_launcher" + build_type = MECHFAB + req_tech = list("combat" = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang + category = "Exosuit Equipment" + +datum/design/mech_missile_rack + name = "Exosuit Weapon Design (SRM-8 Missile Rack)" + desc = "Allows for the construction of SRM-8 Missile Rack." + id = "mech_missile_rack" + build_type = MECHFAB + req_tech = list("combat" = 6, "materials" = 6) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack + category = "Exosuit Equipment" + +datum/design/clusterbang_launcher + name = "Exosuit Module Design (SOB-3 Clusterbang Launcher)" + desc = "A weapon that violates the Geneva Convention at 3 rounds per minute" + id = "clusterbang_launcher" + build_type = MECHFAB + req_tech = list("combat"= 5, "materials" = 5, "syndicate" = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang + category = "Exosuit Equipment" + +datum/design/mech_wormhole_gen + name = "Exosuit Module Design (Localized Wormhole Generator)" + desc = "An exosuit module that allows generating of small quasi-stable wormholes." + id = "mech_wormhole_gen" + build_type = MECHFAB + req_tech = list("bluespace" = 3, "magnets" = 2) + build_path = /obj/item/mecha_parts/mecha_equipment/wormhole_generator + category = "Exosuit Equipment" + +datum/design/mech_teleporter + name = "Exosuit Module Design (Teleporter Module)" + desc = "An exosuit module that allows exosuits to teleport to any position in view." + id = "mech_teleporter" + build_type = MECHFAB + req_tech = list("bluespace" = 10, "magnets" = 5) + build_path = /obj/item/mecha_parts/mecha_equipment/teleporter + category = "Exosuit Equipment" + +datum/design/mech_rcd + name = "Exosuit Module Design (RCD Module)" + desc = "An exosuit-mounted Rapid Construction Device." + id = "mech_rcd" + build_type = MECHFAB + req_tech = list("materials" = 4, "bluespace" = 3, "magnets" = 4, "powerstorage"=4, "engineering" = 4) + build_path = /obj/item/mecha_parts/mecha_equipment/tool/rcd + category = "Exosuit Equipment" + +datum/design/mech_gravcatapult + name = "Exosuit Module Design (Gravitational Catapult Module)" + desc = "An exosuit mounted Gravitational Catapult." + id = "mech_gravcatapult" + build_type = MECHFAB + req_tech = list("bluespace" = 2, "magnets" = 3, "engineering" = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult + category = "Exosuit Equipment" + +datum/design/mech_repair_droid + name = "Exosuit Module Design (Repair Droid Module)" + desc = "Automated Repair Droid. BEEP BOOP" + id = "mech_repair_droid" + build_type = MECHFAB + req_tech = list("magnets" = 3, "programming" = 3, "engineering" = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid + category = "Exosuit Equipment" + +datum/design/mech_energy_relay + name = "Exosuit Module Design (Tesla Energy Relay)" + desc = "Tesla Energy Relay" + id = "mech_energy_relay" + build_type = MECHFAB + req_tech = list("magnets" = 4, "powerstorage" = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay + category = "Exosuit Equipment" + +datum/design/mech_ccw_armor + name = "Exosuit Module Design(Reactive Armor Booster Module)" + desc = "Exosuit-mounted armor booster." + id = "mech_ccw_armor" + build_type = MECHFAB + req_tech = list("materials" = 5, "combat" = 4) + build_path = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster + category = "Exosuit Equipment" + +datum/design/mech_proj_armor + name = "Exosuit Module Design(Reflective Armor Booster Module)" + desc = "Exosuit-mounted armor booster." + id = "mech_proj_armor" + build_type = MECHFAB + req_tech = list("materials" = 5, "combat" = 5, "engineering"=3) + build_path = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster + category = "Exosuit Equipment" + +datum/design/mech_syringe_gun + name = "Exosuit Module Design(Syringe Gun)" + desc = "Exosuit-mounted syringe gun and chemical synthesizer." + id = "mech_syringe_gun" + build_type = MECHFAB + req_tech = list("materials" = 3, "biotech"=4, "magnets"=4, "programming"=3) + build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun + category = "Exosuit Equipment" + +datum/design/mech_diamond_drill + name = "Exosuit Module Design (Diamond Mining Drill)" + desc = "An upgraded version of the standard drill." + id = "mech_diamond_drill" + build_type = MECHFAB + req_tech = list("materials" = 4, "engineering" = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill + category = "Exosuit Equipment" + +datum/design/mech_generator_nuclear + name = "Exosuit Module Design (ExoNuclear Reactor)" + desc = "Compact nuclear reactor module." + id = "mech_generator_nuclear" + build_type = MECHFAB + req_tech = list("powerstorage"= 3, "engineering" = 3, "materials" = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/generator/nuclear + category = "Exosuit Equipment" \ No newline at end of file diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm new file mode 100644 index 00000000000..dcd5f06d0c1 --- /dev/null +++ b/code/modules/research/designs/medical_designs.dm @@ -0,0 +1,78 @@ +///////////////////////////////////////// +////////////Medical Tools//////////////// +///////////////////////////////////////// + +datum/design/mass_spectrometer + name = "Mass-Spectrometer" + desc = "A device for analyzing chemicals in the blood." + id = "mass_spectrometer" + req_tech = list("biotech" = 2, "magnets" = 2) + build_type = PROTOLATHE + materials = list("$metal" = 30, "$glass" = 20) + reliability = 76 + build_path = /obj/item/device/mass_spectrometer + +datum/design/adv_mass_spectrometer + name = "Advanced Mass-Spectrometer" + desc = "A device for analyzing chemicals in the blood and their quantities." + id = "adv_mass_spectrometer" + req_tech = list("biotech" = 2, "magnets" = 4) + build_type = PROTOLATHE + materials = list("$metal" = 30, "$glass" = 20) + reliability = 74 + build_path = /obj/item/device/mass_spectrometer/adv + +datum/design/mmi + name = "Man-Machine Interface" + desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity." + id = "mmi" + req_tech = list("programming" = 2, "biotech" = 3) + build_type = PROTOLATHE | MECHFAB + materials = list("$metal" = 1000, "$glass" = 500) + reliability = 76 + build_path = /obj/item/device/mmi + category = "Misc" + +datum/design/mmi_radio + name = "Radio-enabled Man-Machine Interface" + desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity. This one comes with a built-in radio." + id = "mmi_radio" + req_tech = list("programming" = 2, "biotech" = 4) + build_type = PROTOLATHE | MECHFAB + materials = list("$metal" = 1200, "$glass" = 500) + reliability = 74 + build_path = /obj/item/device/mmi/radio_enabled + category = "Misc" + +datum/design/synthetic_flash + name = "Synthetic Flash" + desc = "When a problem arises, SCIENCE is the solution." + id = "sflash" + req_tech = list("magnets" = 3, "combat" = 2) + build_type = MECHFAB + materials = list("$metal" = 750, "$glass" = 750) + reliability = 76 + build_path = /obj/item/device/flash/synthetic + category = "Misc" + +datum/design/bluespacebeaker + name = "Bluespace Beaker" + desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units." + id = "bluespacebeaker" + req_tech = list("bluespace" = 2, "materials" = 6) + build_type = PROTOLATHE + materials = list("$metal" = 3000, "$plasma" = 3000, "$diamond" = 500) + reliability = 76 + build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace + category = "Misc" + +datum/design/noreactbeaker + name = "Cryostasis Beaker" + desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units." + id = "splitbeaker" + req_tech = list("materials" = 2) + build_type = PROTOLATHE + materials = list("$metal" = 3000) + reliability = 76 + build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact + category = "Misc" \ No newline at end of file diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm new file mode 100644 index 00000000000..a8273cfdeb0 --- /dev/null +++ b/code/modules/research/designs/power_designs.dm @@ -0,0 +1,84 @@ +//////////////////////////////////////// +//////////////////Power///////////////// +//////////////////////////////////////// + +datum/design/basic_cell + name = "Basic Power Cell" + desc = "A basic power cell that holds 1000 units of energy." + id = "basic_cell" + req_tech = list("powerstorage" = 1) + build_type = PROTOLATHE | AUTOLATHE |MECHFAB + materials = list("$metal" = 700, "$glass" = 50) + build_path = /obj/item/weapon/stock_parts/cell + category = "Misc" + +datum/design/high_cell + name = "High-Capacity Power Cell" + desc = "A power cell that holds 10000 units of energy." + id = "high_cell" + req_tech = list("powerstorage" = 2) + build_type = PROTOLATHE | AUTOLATHE | MECHFAB + materials = list("$metal" = 700, "$glass" = 60) + build_path = /obj/item/weapon/stock_parts/cell/high + category = "Misc" + +datum/design/super_cell + name = "Super-Capacity Power Cell" + desc = "A power cell that holds 20000 units of energy." + id = "super_cell" + req_tech = list("powerstorage" = 3, "materials" = 2) + reliability = 75 + build_type = PROTOLATHE | MECHFAB + materials = list("$metal" = 700, "$glass" = 70) + build_path = /obj/item/weapon/stock_parts/cell/super + category = "Misc" + +datum/design/hyper_cell + name = "Hyper-Capacity Power Cell" + desc = "A power cell that holds 30000 units of energy." + id = "hyper_cell" + req_tech = list("powerstorage" = 5, "materials" = 4) + reliability = 70 + build_type = PROTOLATHE | MECHFAB + materials = list("$metal" = 400, "$gold" = 150, "$silver" = 150, "$glass" = 70) + build_path = /obj/item/weapon/stock_parts/cell/hyper + category = "Misc" + +datum/design/light_replacer + name = "Light Replacer" + desc = "A device to automatically replace lights. Refill with working lightbulbs." + id = "light_replacer" + req_tech = list("magnets" = 3, "materials" = 4) + build_type = PROTOLATHE + materials = list("$metal" = 1500, "$silver" = 150, "$glass" = 3000) + build_path = /obj/item/device/lightreplacer + +datum/design/pacman + name = "Machine Design (PACMAN-type Generator Board)" + desc = "The circuit board that for a PACMAN-type portable generator." + id = "pacman" + req_tech = list("programming" = 3, "plasmatech" = 3, "powerstorage" = 3, "engineering" = 3) + build_type = IMPRINTER + reliability = 79 + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/pacman + +datum/design/superpacman + name = "Machine Design (SUPERPACMAN-type Generator Board)" + desc = "The circuit board that for a SUPERPACMAN-type portable generator." + id = "superpacman" + req_tech = list("programming" = 3, "powerstorage" = 4, "engineering" = 4) + build_type = IMPRINTER + reliability = 76 + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/pacman/super + +datum/design/mrspacman + name = "Machine Design (MRSPACMAN-type Generator Board)" + desc = "The circuit board that for a MRSPACMAN-type portable generator." + id = "mrspacman" + req_tech = list("programming" = 3, "powerstorage" = 5, "engineering" = 5) + build_type = IMPRINTER + reliability = 74 + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/pacman/mrs \ No newline at end of file diff --git a/code/modules/research/designs/stock_parts_designs.dm b/code/modules/research/designs/stock_parts_designs.dm new file mode 100644 index 00000000000..1268e86079a --- /dev/null +++ b/code/modules/research/designs/stock_parts_designs.dm @@ -0,0 +1,216 @@ +//////////////////////////////////////// +/////////////Stock Parts//////////////// +//////////////////////////////////////// + +datum/design/RPED + name = "Rapid Part Exchange Device" + desc = "Special mechanical module made to store, sort, and apply standard machine parts." + id = "rped" + req_tech = list("engineering" = 3, + "materials" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 15000, "$glass" = 5000) //hardcore + build_path = /obj/item/weapon/storage/part_replacer + +datum/design/basic_capacitor + name = "Basic Capacitor" + desc = "A stock part used in the construction of various devices." + id = "basic_capacitor" + req_tech = list("powerstorage" = 1) + build_type = PROTOLATHE | AUTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = /obj/item/weapon/stock_parts/capacitor + +datum/design/basic_scanning + name = "Basic Scanning Module" + desc = "A stock part used in the construction of various devices." + id = "basic_scanning" + req_tech = list("magnets" = 1) + build_type = PROTOLATHE | AUTOLATHE + materials = list("$metal" = 50, "$glass" = 20) + build_path = /obj/item/weapon/stock_parts/scanning_module + +datum/design/micro_mani + name = "Micro Manipulator" + desc = "A stock part used in the construction of various devices." + id = "micro_mani" + req_tech = list("materials" = 1, "programming" = 1) + build_type = PROTOLATHE | AUTOLATHE + materials = list("$metal" = 30) + build_path = /obj/item/weapon/stock_parts/manipulator + +datum/design/basic_micro_laser + name = "Basic Micro-Laser" + desc = "A stock part used in the construction of various devices." + id = "basic_micro_laser" + req_tech = list("magnets" = 1) + build_type = PROTOLATHE | AUTOLATHE + materials = list("$metal" = 10, "$glass" = 20) + build_path = /obj/item/weapon/stock_parts/micro_laser + +datum/design/basic_matter_bin + name = "Basic Matter Bin" + desc = "A stock part used in the construction of various devices." + id = "basic_matter_bin" + req_tech = list("materials" = 1) + build_type = PROTOLATHE | AUTOLATHE + materials = list("$metal" = 80) + build_path = /obj/item/weapon/stock_parts/matter_bin + +datum/design/adv_capacitor + name = "Advanced Capacitor" + desc = "A stock part used in the construction of various devices." + id = "adv_capacitor" + req_tech = list("powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 50) + build_path = /obj/item/weapon/stock_parts/capacitor/adv + +datum/design/adv_scanning + name = "Advanced Scanning Module" + desc = "A stock part used in the construction of various devices." + id = "adv_scanning" + req_tech = list("magnets" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 20) + build_path = /obj/item/weapon/stock_parts/scanning_module/adv + +datum/design/nano_mani + name = "Nano Manipulator" + desc = "A stock part used in the construction of various devices." + id = "nano_mani" + req_tech = list("materials" = 3, "programming" = 2) + build_type = PROTOLATHE + materials = list("$metal" = 30) + build_path = /obj/item/weapon/stock_parts/manipulator/nano + +datum/design/high_micro_laser + name = "High-Power Micro-Laser" + desc = "A stock part used in the construction of various devices." + id = "high_micro_laser" + req_tech = list("magnets" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 10, "$glass" = 20) + build_path = /obj/item/weapon/stock_parts/micro_laser/high + +datum/design/adv_matter_bin + name = "Advanced Matter Bin" + desc = "A stock part used in the construction of various devices." + id = "adv_matter_bin" + req_tech = list("materials" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 80) + build_path = /obj/item/weapon/stock_parts/matter_bin/adv + +datum/design/super_capacitor + name = "Super Capacitor" + desc = "A stock part used in the construction of various devices." + id = "super_capacitor" + req_tech = list("powerstorage" = 5, "materials" = 4) + build_type = PROTOLATHE + reliability = 71 + materials = list("$metal" = 50, "$glass" = 50, "$gold" = 20) + build_path = /obj/item/weapon/stock_parts/capacitor/super + +datum/design/phasic_scanning + name = "Phasic Scanning Module" + desc = "A stock part used in the construction of various devices." + id = "phasic_scanning" + req_tech = list("magnets" = 5, "materials" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 50, "$glass" = 20, "$silver" = 10) + reliability = 72 + build_path = /obj/item/weapon/stock_parts/scanning_module/phasic + +datum/design/pico_mani + name = "Pico Manipulator" + desc = "A stock part used in the construction of various devices." + id = "pico_mani" + req_tech = list("materials" = 5, "programming" = 2) + build_type = PROTOLATHE + materials = list("$metal" = 30) + reliability = 73 + build_path = /obj/item/weapon/stock_parts/manipulator/pico + +datum/design/ultra_micro_laser + name = "Ultra-High-Power Micro-Laser" + desc = "A stock part used in the construction of various devices." + id = "ultra_micro_laser" + req_tech = list("magnets" = 5, "materials" = 5) + build_type = PROTOLATHE + materials = list("$metal" = 10, "$glass" = 20, "$uranium" = 10) + reliability = 70 + build_path = /obj/item/weapon/stock_parts/micro_laser/ultra + +datum/design/super_matter_bin + name = "Super Matter Bin" + desc = "A stock part used in the construction of various devices." + id = "super_matter_bin" + req_tech = list("materials" = 5) + build_type = PROTOLATHE + materials = list("$metal" = 80) + reliability = 75 + build_path = /obj/item/weapon/stock_parts/matter_bin/super + +datum/design/subspace_ansible + name = "Subspace Ansible" + desc = "A compact module capable of sensing extradimensional activity." + id = "s-ansible" + req_tech = list("programming" = 2, "magnets" = 2, "materials" = 2, "bluespace" = 1) + build_type = PROTOLATHE + materials = list("$metal" = 80, "$silver" = 20) + build_path = /obj/item/weapon/stock_parts/subspace/ansible + +datum/design/hyperwave_filter + name = "Hyperwave Filter" + desc = "A tiny device capable of filtering and converting super-intense radiowaves." + id = "s-filter" + req_tech = list("programming" = 2, "magnets" = 2) + build_type = PROTOLATHE + materials = list("$metal" = 40, "$silver" = 10) + build_path = /obj/item/weapon/stock_parts/subspace/filter + +datum/design/subspace_amplifier + name = "Subspace Amplifier" + desc = "A compact micro-machine capable of amplifying weak subspace transmissions." + id = "s-amplifier" + req_tech = list("programming" = 2, "magnets" = 2, "materials" = 2, "bluespace" = 1) + build_type = PROTOLATHE + materials = list("$metal" = 10, "$gold" = 30, "$uranium" = 15) + build_path = /obj/item/weapon/stock_parts/subspace/amplifier + +datum/design/subspace_treatment + name = "Subspace Treatment Disk" + desc = "A compact micro-machine capable of stretching out hyper-compressed radio waves." + id = "s-treatment" + req_tech = list("programming" = 2, "magnets" = 1, "materials" = 2, "bluespace" = 1) + build_type = PROTOLATHE + materials = list("$metal" = 10, "$silver" = 20) + build_path = /obj/item/weapon/stock_parts/subspace/treatment + +datum/design/subspace_analyzer + name = "Subspace Analyzer" + desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths." + id = "s-analyzer" + req_tech = list("programming" = 2, "magnets" = 2, "materials" = 2, "bluespace" = 1) + build_type = PROTOLATHE + materials = list("$metal" = 10, "$gold" = 15) + build_path = /obj/item/weapon/stock_parts/subspace/analyzer + +datum/design/subspace_crystal + name = "Ansible Crystal" + desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths." + id = "s-crystal" + req_tech = list("magnets" = 2, "materials" = 2, "bluespace" = 1) + build_type = PROTOLATHE + materials = list("$glass" = 1000, "$silver" = 20, "$gold" = 20) + build_path = /obj/item/weapon/stock_parts/subspace/crystal + +datum/design/subspace_transmitter + name = "Subspace Transmitter" + desc = "A large piece of equipment used to open a window into the subspace dimension." + id = "s-transmitter" + req_tech = list("magnets" = 3, "materials" = 3, "bluespace" = 2) + build_type = PROTOLATHE + materials = list("$glass" = 100, "$silver" = 10, "$uranium" = 15) + build_path = /obj/item/weapon/stock_parts/subspace/transmitter \ No newline at end of file diff --git a/code/modules/research/designs/telecomms_designs.dm b/code/modules/research/designs/telecomms_designs.dm new file mode 100644 index 00000000000..e4de22f4fdd --- /dev/null +++ b/code/modules/research/designs/telecomms_designs.dm @@ -0,0 +1,66 @@ +/////////////////////////////////// +/////Subspace Telecomms//////////// +/////////////////////////////////// + +datum/design/subspace_receiver + name = "Machine Design (Subspace Receiver)" + desc = "Allows for the construction of Subspace Receiver equipment." + id = "s-receiver" + req_tech = list("programming" = 2, "engineering" = 2, "bluespace" = 1) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/telecomms/receiver + +datum/design/telecomms_bus + name = "Machine Design (Bus Mainframe)" + desc = "Allows for the construction of Telecommunications Bus Mainframes." + id = "s-bus" + req_tech = list("programming" = 2, "engineering" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/telecomms/bus + +datum/design/telecomms_hub + name = "Machine Design (Hub Mainframe)" + desc = "Allows for the construction of Telecommunications Hub Mainframes." + id = "s-hub" + req_tech = list("programming" = 2, "engineering" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/telecomms/hub + +datum/design/telecomms_relay + name = "Machine Design (Relay Mainframe)" + desc = "Allows for the construction of Telecommunications Relay Mainframes." + id = "s-relay" + req_tech = list("programming" = 2, "engineering" = 2, "bluespace" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/telecomms/relay + +datum/design/telecomms_processor + name = "Machine Design (Processor Unit)" + desc = "Allows for the construction of Telecommunications Processor equipment." + id = "s-processor" + req_tech = list("programming" = 2, "engineering" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/telecomms/processor + +datum/design/telecomms_server + name = "Machine Design (Server Mainframe)" + desc = "Allows for the construction of Telecommunications Servers." + id = "s-server" + req_tech = list("programming" = 2, "engineering" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/telecomms/server + +datum/design/subspace_broadcaster + name = "Machine Design (Subspace Broadcaster)" + desc = "Allows for the construction of Subspace Broadcasting equipment." + id = "s-broadcaster" + req_tech = list("programming" = 2, "engineering" = 2, "bluespace" = 1) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/telecomms/broadcaster \ No newline at end of file diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm new file mode 100644 index 00000000000..b50e0225101 --- /dev/null +++ b/code/modules/research/designs/weapon_designs.dm @@ -0,0 +1,167 @@ +///////////////////////////////////////// +/////////////////Weapons///////////////// +///////////////////////////////////////// + +datum/design/nuclear_gun + name = "Advanced Energy Gun" + desc = "An energy gun with an experimental miniaturized reactor." + id = "nuclear_gun" + req_tech = list("combat" = 3, "materials" = 5, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 5000, "$glass" = 1000, "$uranium" = 2000) + reliability = 76 + build_path = /obj/item/weapon/gun/energy/gun/nuclear + locked = 1 + +datum/design/stunrevolver + name = "Stun Revolver" + desc = "The prize of the Head of Security." + id = "stunrevolver" + req_tech = list("combat" = 3, "materials" = 3, "powerstorage" = 2) + build_type = PROTOLATHE + materials = list("$metal" = 4000) + build_path = /obj/item/weapon/gun/energy/stunrevolver + locked = 1 + +datum/design/lasercannon + name = "Laser Cannon" + desc = "A heavy duty laser cannon." + id = "lasercannon" + req_tech = list("combat" = 4, "materials" = 3, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 10000, "$glass" = 2000, "$diamond" = 2000) + build_path = /obj/item/weapon/gun/energy/lasercannon + locked = 1 + +datum/design/decloner + name = "Decloner" + desc = "Your opponent will bubble into a messy pile of goop." + id = "decloner" + req_tech = list("combat" = 8, "materials" = 7, "biotech" = 5, "powerstorage" = 6) + build_type = PROTOLATHE + materials = list("$gold" = 5000,"$uranium" = 10000, "mutagen" = 40) + build_path = /obj/item/weapon/gun/energy/decloner + locked = 1 +/* +datum/design/chemsprayer + name = "Chem Sprayer" + desc = "An advanced chem spraying device." + id = "chemsprayer" + req_tech = list("combat" = 3, "materials" = 3, "engineering" = 3, "biotech" = 2) + build_type = PROTOLATHE + materials = list("$metal" = 5000, "$glass" = 1000) + reliability = 100 + build_path = /obj/item/weapon/chemsprayer" +*/ +datum/design/rapidsyringe + name = "Rapid Syringe Gun" + desc = "A gun that fires many syringes." + id = "rapidsyringe" + req_tech = list("combat" = 3, "materials" = 3, "engineering" = 3, "biotech" = 2) + build_type = PROTOLATHE + materials = list("$metal" = 5000, "$glass" = 1000) + build_path = /obj/item/weapon/gun/syringe/rapidsyringe +/* +datum/design/largecrossbow + name = "Energy Crossbow" + desc = "A weapon favoured by syndicate infiltration teams." + id = "largecrossbow" + req_tech = list("combat" = 4, "materials" = 5, "engineering" = 3, "biotech" = 4, "syndicate" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 5000, "$glass" = 1000, "$uranium" = 1000, "$silver" = 1000) + build_path = /obj/item/weapon/gun/energy/crossbow/largecrossbow" +*/ +datum/design/temp_gun + name = "Temperature Gun" + desc = "A gun that shoots temperature bullet energythings to change temperature."//Change it if you want + id = "temp_gun" + req_tech = list("combat" = 3, "materials" = 4, "powerstorage" = 3, "magnets" = 2) + build_type = PROTOLATHE + materials = list("$metal" = 5000, "$glass" = 500, "$silver" = 3000) + build_path = /obj/item/weapon/gun/energy/temperature + locked = 1 + +datum/design/flora_gun + name = "Floral Somatoray" + desc = "A tool that discharges controlled radiation which induces mutation in plant cells. Harmless to other organic life." + id = "flora_gun" + req_tech = list("materials" = 2, "biotech" = 3, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 2000, "$glass" = 500, "radium" = 20) + build_path = /obj/item/weapon/gun/energy/floragun + +datum/design/large_grenade + name = "Large Grenade" + desc = "A grenade that affects a larger area and use larger containers." + id = "large_Grenade" + req_tech = list("combat" = 3, "materials" = 2) + build_type = PROTOLATHE + materials = list("$metal" = 3000) + reliability = 79 + build_path = /obj/item/weapon/grenade/chem_grenade/large + +datum/design/smg + name = "Submachine Gun" + desc = "A lightweight, fast firing gun." + id = "smg" + req_tech = list("combat" = 4, "materials" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 8000, "$silver" = 2000, "$diamond" = 1000) + build_path = /obj/item/weapon/gun/projectile/automatic + locked = 1 + +datum/design/xray + name = "Xray Laser Gun" + desc = "Not quite as menacing as it sounds" + id = "xray" + req_tech = list("combat" = 6, "materials" = 5, "biotech" = 5, "powerstorage" = 4) + build_type = PROTOLATHE + materials = list("$gold" = 5000,"$uranium" = 10000, "$metal" = 4000) + build_path = /obj/item/weapon/gun/energy/xray + locked = 1 + +datum/design/ionrifle + name = "Ion Rifle" + desc = "How to dismantle a cyborg : The gun." + id = "ionrifle" + req_tech = list("combat" = 5, "materials" = 4, "magnets" = 4) + build_type = PROTOLATHE + materials = list("$silver" = 4000, "$metal" = 6000, "$uranium" = 1000) + build_path = /obj/item/weapon/gun/energy/ionrifle + locked = 1 + +datum/design/ammo_9mm + name = "Ammunition Box (9mm)" + desc = "A box of prototype 9mm ammunition." + id = "ammo_9mm" + req_tech = list("combat" = 4, "materials" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 2000) + build_path = /obj/item/ammo_box/c9mm + +datum/design/mag_smg + name = "Submachine Gun Magazine (9mm)" + desc = "A prototype magazine for the submachine gun." + id = "mag_smg" + req_tech = list("combat" = 4, "materials" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 2000) + build_path = /obj/item/ammo_box/magazine/msmg9mm + +datum/design/stunshell + name = "Stun Shell" + desc = "A stunning shell for a shotgun." + id = "stunshell" + req_tech = list("combat" = 3, "materials" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 200) + build_path = /obj/item/ammo_casing/shotgun/stunshell + +datum/design/techshell + name = "Unloaded Technological Shotshell" + desc = "A high-tech shotgun shell which can be loaded with materials to produce unique effects." + id = "techshotshell" + req_tech = list("combat" = 3, "materials" = 3, "powerstorage" = 4, "magnets" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 1000, "$glass" = 200, "$silver" = 300) + build_path = /obj/item/ammo_casing/shotgun/techshell \ No newline at end of file diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 90ea97309ed..96b6bce013e 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -152,15 +152,15 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(istype(D, /obj/item/weapon/disk/tech_disk)) t_disk = D else if (istype(D, /obj/item/weapon/disk/design_disk)) d_disk = D else - user << "\red Machine cannot accept disks in that format." + user << " Machine cannot accept disks in that format." return user.drop_item() D.loc = src - user << "\blue You add the disk to the machine!" + user << " You add the disk to the machine!" else if(istype(D, /obj/item/weapon/card/emag) && !emagged) playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 - user << "\blue You you disable the security protocols" + user << " You you disable the security protocols" else ..() src.updateUsrDialog() @@ -229,7 +229,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, else if(href_list["eject_item"]) //Eject the item inside the destructive analyzer. if(linked_destroy) if(linked_destroy.busy) - usr << "\red The destructive analyzer is busy at the moment." + usr << " The destructive analyzer is busy at the moment." else if(linked_destroy.loaded_item) linked_destroy.loaded_item.loc = linked_destroy.loc @@ -240,7 +240,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, else if(href_list["deconstruct"]) //Deconstruct the item in the destructive analyzer and update the research holder. if(linked_destroy) if(linked_destroy.busy) - usr << "\red The destructive analyzer is busy at the moment." + usr << " The destructive analyzer is busy at the moment." else var/choice = input("Proceeding will destroy loaded item.") in list("Proceed", "Cancel") if(choice == "Cancel" || !linked_destroy) return @@ -253,7 +253,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, linked_destroy.busy = 0 if(!linked_destroy.hacked) if(!linked_destroy.loaded_item) - usr <<"\red The destructive analyzer appears to be empty." + usr <<" The destructive analyzer appears to be empty." screen = 1.0 return if((linked_destroy.loaded_item.reliability >= 99 - (linked_destroy.decon_mod * 3)) || linked_destroy.loaded_item.crit_fail) @@ -298,7 +298,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, else if(href_list["sync"]) //Sync the research holder with all the R&D consoles in the game that aren't sync protected. screen = 0.0 if(!sync) - usr << "\red You must connect to the network first!" + usr << " You must connect to the network first!" else griefProtection() //Putting this here because I dont trust the sync process spawn(30) @@ -345,7 +345,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(being_built) var/power = 2000 var/amount=text2num(href_list["amount"]) - amount = max(10, min(1, amount)) + amount = max(1, min(10, amount)) for(var/M in being_built.materials) power += round(being_built.materials[M] * amount / 5) power = max(2000, power) @@ -356,8 +356,8 @@ won't update every console in existence) but it's more of a hassle to do. Also, if (!(being_built.build_type & PROTOLATHE)) g2g = 0 message_admins("Protolathe exploit attempted by [key_name(usr, usr.client)]!") - - + + if (g2g) //If input is incorrect, nothing happens linked_lathe.busy = 1 @@ -366,7 +366,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, for(var/M in being_built.materials) if(!linked_lathe.check_mat(being_built, M)) - src.visible_message("The [src.name] beeps, \"Not enough materials to complete prototype.\"") + src.visible_message("The [src.name] beeps, \"Not enough materials to complete prototype.\"") g2g = 0 break switch(M) @@ -392,7 +392,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes. var/R = being_built.reliability var/O = being_built.locked - spawn(32*amount) + spawn(32*amount/coeff) if(g2g) //And if we only fail the material requirements, we still spend time and power for(var/i = 0, iThe [src.name] beeps, \"Not enough materials to complete prototype.\"
    ") + src.visible_message("The [src.name] beeps, \"Not enough materials to complete prototype.\"") g2g = 0 break switch(M) @@ -790,7 +790,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, else temp_material += " [D.materials[M]/coeff] [CallMaterialName(M)]" c = min(c,t) - + if (c) dat += "* [temp_dat]" if(c >= 5.0) diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 8abbae4220c..2daa19ffe69 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -191,7 +191,7 @@ add_fingerprint(usr) usr.set_machine(src) if(!src.allowed(usr) && !emagged) - usr << "\red You do not have the required access level" + usr << " You do not have the required access level." return if(href_list["main"]) @@ -319,7 +319,7 @@ if(istype(D, /obj/item/weapon/card/emag) && !emagged) playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 - user << "\blue You you disable the security protocols" + user << " You you disable the security protocols." else ..() src.updateUsrDialog() diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm index 7af28b4a418..ab3b73cdbfa 100644 --- a/code/modules/scripting/Implementations/Telecomms.dm +++ b/code/modules/scripting/Implementations/Telecomms.dm @@ -300,9 +300,18 @@ datum/signal freq *= 10 // shift the decimal one place if(!job) - job = "?" + job = "Unknown" + + //SAY REWRITE RELATED CODE. + //This code is a little hacky, but it *should* work. Even though it'll result in a virtual speaker referencing another virtual speaker. vOv + var/atom/movable/virtualspeaker/virt = new(null) + virt.name = source + virt.job = job + virt.faketrack = 1 + virt.languages = HUMAN + //END SAY REWRITE RELATED CODE. - newsign.data["mob"] = null + newsign.data["mob"] = virt newsign.data["mobtype"] = /mob/living/carbon/human newsign.data["name"] = source newsign.data["realname"] = newsign.data["name"] @@ -314,15 +323,12 @@ datum/signal freq = text2num(freq) newsign.frequency = freq - var/datum/radio_frequency/connection = radio_controller.return_frequency(freq) - newsign.data["connection"] = connection - newsign.data["radio"] = hradio newsign.data["vmessage"] = message newsign.data["vname"] = source newsign.data["vmask"] = 0 - newsign.data["level"] = list() + newsign.data["level"] = data["level"] newsign.sanitize_data() diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index 2ed12f11736..2d8578d0e39 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -150,8 +150,7 @@ for(var/obj/machinery/door/airlock/D in A) D.emergency = 1 D.update_icon(0) - world << "Attention! Station-wide emergency declared" - world << "Access restrictions on maintenance and external airlocks have been lifted." + minor_announce("Access restrictions on maintenance and external airlocks have been lifted.", "Attention! Station-wide emergency declared!") emergency_access = 1 /proc/revoke_maint_all_access() @@ -159,6 +158,5 @@ for(var/obj/machinery/door/airlock/D in A) D.emergency = 0 D.update_icon(0) - world << "Attention! Emergency maintenance access disabled" - world << "Access restrictions in maintenance areas have been restored." + minor_announce("Access restrictions in maintenance areas have been restored.", "Attention! Station-wide emergency rescinded:") emergency_access = 0 \ No newline at end of file diff --git a/code/modules/security levels/security levels.dm b/code/modules/security levels/security levels.dm index 52651452ca4..e33370e7fb6 100644 --- a/code/modules/security levels/security levels.dm +++ b/code/modules/security levels/security levels.dm @@ -21,8 +21,7 @@ if(level >= SEC_LEVEL_GREEN && level <= SEC_LEVEL_DELTA && level != security_level) switch(level) if(SEC_LEVEL_GREEN) - world << "Attention! Security level lowered to green" - world << "[config.alert_desc_green]" + minor_announce(config.alert_desc_green, "Attention! Security level lowered to green:") security_level = SEC_LEVEL_GREEN for(var/obj/machinery/firealarm/FA in world) if(FA.z == 1) @@ -30,11 +29,9 @@ FA.overlays += image('icons/obj/monitors.dmi', "overlay_green") if(SEC_LEVEL_BLUE) if(security_level < SEC_LEVEL_BLUE) - world << "Attention! Security level elevated to blue" - world << "[config.alert_desc_blue_upto]" + minor_announce(config.alert_desc_blue_upto, "Attention! Security level elevated to blue:") else - world << "Attention! Security level lowered to blue" - world << "[config.alert_desc_blue_downto]" + minor_announce(config.alert_desc_blue_downto, "Attention! Security level lowered to blue:") security_level = SEC_LEVEL_BLUE for(var/obj/machinery/firealarm/FA in world) if(FA.z == 1) @@ -42,11 +39,9 @@ FA.overlays += image('icons/obj/monitors.dmi', "overlay_blue") if(SEC_LEVEL_RED) if(security_level < SEC_LEVEL_RED) - world << "Attention! Code red!" - world << "[config.alert_desc_red_upto]" + minor_announce(config.alert_desc_red_upto, "Attention! Code red!") else - world << "Attention! Code red!" - world << "[config.alert_desc_red_downto]" + minor_announce(config.alert_desc_red_downto, "Attention! Code red!") security_level = SEC_LEVEL_RED /* - At the time of commit, setting status displays didn't work properly @@ -59,8 +54,7 @@ FA.overlays = list() FA.overlays += image('icons/obj/monitors.dmi', "overlay_red") if(SEC_LEVEL_DELTA) - world << "Attention! Delta security level reached!" - world << "[config.alert_desc_delta]" + minor_announce(config.alert_desc_delta, "Attention! Delta security level reached!") security_level = SEC_LEVEL_DELTA for(var/obj/machinery/firealarm/FA in world) if(FA.z == 1) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 1002d63f30b..fd8c3a3e653 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -74,7 +74,7 @@ datum/shuttle_manager/proc/move_shuttle(var/override_delay) usr.set_machine(src) src.add_fingerprint(usr) if(!allowed(usr)) - usr << "\red Access denied." + usr << "Access denied." return if(href_list["move"]) if(id in shuttles) @@ -92,7 +92,28 @@ datum/shuttle_manager/proc/move_shuttle(var/override_delay) if (istype(I, /obj/item/weapon/card/emag)) src.req_access = list() emagged = 1 - usr << "You fried the consoles ID checking system. It's now available to everyone!" + usr << "You fried the consoles ID checking system." else ..() - return \ No newline at end of file + return + +/obj/machinery/computer/shuttle/ferry + name = "transport ferry console" + circuit = /obj/item/weapon/circuitboard/ferry + id = "ferry" + +/obj/machinery/computer/shuttle/ferry/request + name = "ferry console" + circuit = /obj/item/weapon/circuitboard/ferry/request + var/cooldown //prevents spamming admins + +/obj/machinery/computer/shuttle/ferry/request/Topic(href, href_list) + if(href_list["move"]) + if(cooldown) + return + cooldown = 1 + usr << "Docking locks are engaged. Sending request to leave..." + var/datum/shuttle_manager/s = shuttles["ferry"] + admins << "FERRY: [key_name(usr)] (?) (Move) is requesting to move the transport ferry to [s.location == /area/shuttle/transport1/centcom ? "the station" : "Centcom"]." + spawn(600) //One minute cooldown + cooldown = 0 \ No newline at end of file diff --git a/code/unused/ai_lockdown.dm b/code/unused/ai_lockdown.dm deleted file mode 100644 index 7604c209af6..00000000000 --- a/code/unused/ai_lockdown.dm +++ /dev/null @@ -1,50 +0,0 @@ -/* world << "\red Lockdown initiated by [usr.name]!" - - for(var/obj/machinery/firealarm/FA in world) //activate firealarms - spawn( 0 ) - if(FA.lockdownbyai == 0) - FA.lockdownbyai = 1 - FA.alarm() - for(var/obj/machinery/door/airlock/AL in world) //close airlocks - spawn( 0 ) - if(AL.canAIControl() && AL.icon_state == "door0" && AL.lockdownbyai == 0) - AL.close() - AL.lockdownbyai = 1 - - var/obj/machinery/computer/communications/C = locate() in world - if(C) - C.post_status("alert", "lockdown") -*/ - -/* src.verbs -= /mob/living/silicon/ai/proc/lockdown - src.verbs += /mob/living/silicon/ai/proc/disablelockdown - usr << "\red Disable lockdown command enabled!" - winshow(usr,"rpane",1) -*/ - -/mob/living/silicon/ai/proc/disablelockdown() - set category = "AI Commands" - set name = "Disable Lockdown" - - if(usr.stat == 2) - usr <<"You cannot disable lockdown because you are dead!" - return - - world << "\red Lockdown cancelled by [usr.name]!" - - for(var/obj/machinery/firealarm/FA in world) //deactivate firealarms - spawn( 0 ) - if(FA.lockdownbyai == 1) - FA.lockdownbyai = 0 - FA.reset() - for(var/obj/machinery/door/airlock/AL in world) //open airlocks - spawn ( 0 ) - if(AL.canAIControl() && AL.lockdownbyai == 1) - AL.open() - AL.lockdownbyai = 0 - -/* src.verbs -= /mob/living/silicon/ai/proc/disablelockdown - src.verbs += /mob/living/silicon/ai/proc/lockdown - usr << "\red Disable lockdown command removed until lockdown initiated again!" - winshow(usr,"rpane",1) -*/ \ No newline at end of file diff --git a/code/unused/hivebot/hivebotdefine.dm b/code/unused/hivebot/hivebotdefine.dm index 03222ca9998..50702de79b7 100644 --- a/code/unused/hivebot/hivebotdefine.dm +++ b/code/unused/hivebot/hivebotdefine.dm @@ -4,8 +4,6 @@ icon_state = "basic" health = 80 var/health_max = 80 - robot_talk_understand = 2 - //HUD var/obj/screen/cells = null var/obj/screen/inv1 = null @@ -37,7 +35,6 @@ icon_state = "hive_main" health = 200 var/health_max = 200 - robot_talk_understand = 2 anchored = 1 var/online = 1 diff --git a/code/world.dm b/code/world.dm index 62df19d5dd7..0e61d58db15 100644 --- a/code/world.dm +++ b/code/world.dm @@ -204,7 +204,7 @@ if(C.is_afk(INACTIVITY_KICK)) if(!istype(C.mob, /mob/dead)) log_access("AFK: [key_name(C)]") - C << "\red You have been inactive for more than 10 minutes and have been disconnected." + C << "You have been inactive for more than 10 minutes and have been disconnected." del(C) #undef INACTIVITY_KICK diff --git a/config/admin_nicknames.txt b/config/admin_nicknames.txt new file mode 100644 index 00000000000..76198b6c050 --- /dev/null +++ b/config/admin_nicknames.txt @@ -0,0 +1,2 @@ +Badmin +Spanmin \ No newline at end of file diff --git a/config/admins.txt b/config/admins.txt index 68fea1b2a47..01e3c664d27 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -61,4 +61,5 @@ firecage = Game Master donkieyo = Game Master argoneus = Game Master paprka = Game Master -cookingboy3 = Game Master \ No newline at end of file +cookingboy3 = Game Master +limeliz = Game Master \ No newline at end of file diff --git a/config/config.txt b/config/config.txt index d886eef1e80..a4e9469997f 100644 --- a/config/config.txt +++ b/config/config.txt @@ -1,6 +1,9 @@ -## Server name: This appears at the top of the screen in-game. In this case it will read "tgstation: station_name" where station_name is the randomly generated name of the station for the round. Remove the # infront of SERVERNAME and replace 'tgstation' with the name of your choice +## Server name: This appears at the top of the screen in-game. Remove the # infront of SERVERNAME and replace 'tgstation' with the name of your choice # SERVERNAME tgstation +## Station name: The name of the station as it is referred to in-game. If commented out, the game will generate a random name instead. +STATIONNAME Space Station 13 + # Lobby time: This is the amount of time between rounds that players have to setup their characters and be ready. LOBBY_COUNTDOWN 120 diff --git a/html/changelog.html b/html/changelog.html index d54d339a51e..947ab871c91 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -54,6 +54,148 @@ should be listed in the changelog upon commit tho. Thanks. --> +
    +

    4 September 2014

    +

    KyrahAbattoir updated:

    +
      +
    • All the objects found in BoxStation maintenance are now randomized at round start. +
    +
    + +
    +

    3 September 2014

    +

    Ikarrus updated:

    +
      +
    • Due to munitions shortages, Syndicate Command have increased the cost of Syndicate Bombs to 6 telecrystals. +
    +

    JStheguy updated:

    +
      +
    • Many new posters have been added. +
    +
    + +
    +

    1 September 2014

    +

    ChuckTheSheep updated:

    +
      +
    • Adds preference toggle for intent selection mode. +
    • Direct selection mode switches intent to the one you click on instead of cycling them. +
    +

    Miauw updated:

    +
      +
    • A major rework of saycode has been completed which fixes numerous issues and improves functionality. +
    • Please report any issues you notice with any form of messaging to Github. +
    +

    Jordie0608 updated:

    +
      +
    • Virology has been made the right color. +
    +

    Ikarrus updated:

    +
      +
    • New more detailed End-Round report. +
    • Removes count of readied players from the lobby. +
    +
    + +
    +

    31 August 2014

    +

    Tokiko1 updated:

    +
      +
    • Adds two new hairstyles. +
    +
    + +
    +

    30 August 2014

    +

    Ikarrus updated:

    +
      +
    • Space Station 13 has been authorized to requisition additional Tank Transfer Valves from Centcom's supply lines for the price of 60 cargo points. +
    +
    + +
    +

    26 August 2014

    +

    Ikarrus updated:

    +
      +
    • Security forces are advised to increase scrutiny on personnel coming into contact with AI systems. Central Intelligence suggests that Syndicate terrorist groups may have begun targeting our AIs for destruction. +
    • For the preservation of corporate assets, Central Command would like to remind all personnel that evacuating during an emergency is mandatory. We suspect that terrorist groups may be attempting to abduct marooned personnel who failed to evacuate. +
    • R&D teams have released an urgent update to station teleporters. To eliminate the risk of mutation, personnel are advised to calibrate teleporters before attempting each use. +
    • Centcom has approved the Captain's request to rig the display case in his office with a burglar alarm. Any attempts to breach the case will now trigger a lockdown of the room. +
    • **Crew Monitoring Consoles now scan their own Z-level for suit sensors, instead of only scanning Z1. +
    • **Server operators can now set a name for the station in config.txt. Simply add the line "STATIONNAME Space Station 13" anywhere on the text file. Replace Space Station 13 with your station name of choice.
    • +
    +
    + +
    +

    24 August 2014

    +

    Ikarrus updated:

    +
      +
    • Ore redemption machine can now smelt plasteel.
    • +
    • Mulebot speed has been vastly increased by up to 300%.
    • +
    • Removed exploit where false walls can be used to cheese the AI chamber's defenses
    • +
    +
    + +
    +

    21 August 2014

    +

    Ikarrus updated:

    +
      +
    • The Phase Shift ability will no longer instantly gib players. Instead, they will be knocked out for a few seconds. Mechas will be damaged.
    • +
    • The Phase Slayer ability will no longer instantly gib players. Instead, they will be dealt 190 brute damage. Mechas will be dealt 380 damage.
    • +
    • ADMIN: Most Event buttons have been moved out of the secrets menu and into a Fun verb.
    • +
    +
    + +
    +

    20 August 2014

    +

    Cheridan updated:

    +
      +
    • Three new shotgun shells added. Create them by first researching and printing an unloaded tech shell in R&D. Afterwards, use table-crafting with the appropriate components with a screwdriver in-hand.
    • +
    • Meteorshot: tech shell + compressed matter cartridge + micro(or better) manipulator.
    • +
    • Pulse Slug: tech shell + advanced capacitor + ultra micro-laser.
    • +
    • Dragonsbreath: tech shell + 5 phosphorus (in container).
    • +
    • Incendiary rounds now leave a blazing trail as they pass. This includes existing incendiary rounds, new dragonsbreath rounds, and the Dark Gygax's carbine.
    • +
    +
    + +
    +

    19 August 2014

    +

    Ikarrus updated:

    +
      +
    • Brig cells and labour shuttle have both been modified to send a message to all security HUDs whenever a prisoner is automatically released.
    • +
    • The labour camp has been outfitted with a points checking console to allow prisoners to check their quota progress easier and better explain the punishment system of forced labour.
    • +
    +
    + +
    +

    18 August 2014

    +

    Iamgoofball updated:

    +
      +
    • 25 new hairstyles have been added. +
    +
    + +
    +

    15 August 2014

    +

    AndroidSFV updated:

    +
      +
    • AI photography has been extended to Cyborgs. While connected to an AI, all images taken by cyborgs will be placed in the AI's album, and viewable by the AI and all linked Cyborgs.
    • +
    • When a Cyborgs AI link wire is pulsed, the images from the Cyborgs image album will be synced with the AI it gets linked to.
    • +
    • Additonally, Cyborgs are able to attach images to newscaster feeds from whichever album is active for them. Cyborgs are also mobile, inefficent, printers of same images. +
    +
    + +
    +

    11 August 2014

    +

    Ikarrus updated:

    +
      +
    • Boxstation map updates:
      + -Singularity engine walled from from outer space
      + -Shutters for exterior Science windows
      + -Teleporter board moved from RD's Office to Tech Storage now that the teleporter can be built again.
      + -Security Deputy Armbands (red) added in HoS's Office
    • +
    +

    14 July 2014

    diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 5efde47fc04..5c0f93e93d8 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/corgi_back.dmi b/icons/mob/corgi_back.dmi index 2947ea587cb..ced75e39a42 100644 Binary files a/icons/mob/corgi_back.dmi and b/icons/mob/corgi_back.dmi differ diff --git a/icons/mob/corgi_head.dmi b/icons/mob/corgi_head.dmi index 411dbb988c7..e9fdbd53072 100644 Binary files a/icons/mob/corgi_head.dmi and b/icons/mob/corgi_head.dmi differ diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi index 2b09a9324ad..74f9907b66a 100644 Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 7b9629e0de8..47328e6fa81 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi index 63aafeb582f..8bbc8d06c3f 100644 Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi index ac49d5d6be0..afea8e24f3e 100644 Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ diff --git a/icons/mob/monkey.dmi b/icons/mob/monkey.dmi index e8c55d3e49b..99beec24bf8 100644 Binary files a/icons/mob/monkey.dmi and b/icons/mob/monkey.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 3126cde6405..94ff50ba91a 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index 9a8ee374dd3..c7851bc5a20 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi index c5914bb5876..03f6c8d17f8 100644 Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ diff --git a/icons/obj/doors/door_assembly.dmi b/icons/obj/doors/door_assembly.dmi index 94b91be6c09..94ed8ac6c2d 100644 Binary files a/icons/obj/doors/door_assembly.dmi and b/icons/obj/doors/door_assembly.dmi differ diff --git a/icons/obj/doors/doorviro.dmi b/icons/obj/doors/doorviro.dmi new file mode 100644 index 00000000000..fbf35abdef5 Binary files /dev/null and b/icons/obj/doors/doorviro.dmi differ diff --git a/icons/obj/doors/doorviroglass.dmi b/icons/obj/doors/doorviroglass.dmi new file mode 100644 index 00000000000..250a82be855 Binary files /dev/null and b/icons/obj/doors/doorviroglass.dmi differ diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi index 63bbcc68797..b54a3b38536 100644 Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 95f63945904..6e8a9004a6b 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index db0b10a1046..a63f92049a3 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -26,13 +26,13 @@ em {font-style: normal; font-weight: bold;} .deadsay {color: #5c00e6;} .radio {color: #008000;} .sciradio {color: #993399;} -.comradio {color: #ACA82D;} -.secradio {color: #B22222;} +.comradio {color: #aca82d;} +.secradio {color: #b22222;} .medradio {color: #337296;} .engradio {color: #fb5613;} .suppradio {color: #a8732b;} .servradio {color: #6eaa2c;} -.syndradio {color: #6D3F40;} +.syndradio {color: #6d3f40;} .dsquadradio {color: #686868;} .aiprivradio {color: #ff00ff;} @@ -40,7 +40,7 @@ em {font-style: normal; font-weight: bold;} h1.alert, h2.alert {color: #000000;} .emote { font-style: italic;} -.selecteddna {color: #FFFFFF; background-color: #001B1B} +.selecteddna {color: #ffffff; background-color: #001B1B} .attack {color: #ff0000;} .disarm {color: #990000;} @@ -53,16 +53,19 @@ h1.alert, h2.alert {color: #000000;} .rose {color: #ff5050;} .info {color: #0000CC;} .notice {color: #000099;} -.unconscious {color: #0000FF; font-weight: bold;} +.boldnotice {color: #000099; font-weight: bold;} +.unconscious {color: #0000ff; font-weight: bold;} .suicide {color: #ff5050; font-style: italic;} -.alien {color: #543354;} .newscaster {color: #800000;} .ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;} +.alien {color: #543354;} +.noticealien {color: #00c000;} +.alertalien {color: #00c000; font-weight: bold;} + .interface {color: #330033;} BIG IMG.icon {width: 32px; height: 32px;} - "} diff --git a/sound/misc/notice2.ogg b/sound/misc/notice2.ogg new file mode 100644 index 00000000000..3489ca3e15b Binary files /dev/null and b/sound/misc/notice2.ogg differ diff --git a/sound/vox_fem/a.ogg b/sound/vox_fem/a.ogg index 7c6863012b7..f91e6de8f29 100644 Binary files a/sound/vox_fem/a.ogg and b/sound/vox_fem/a.ogg differ diff --git a/sound/vox_fem/abortions.ogg b/sound/vox_fem/abortions.ogg index e371694b6ca..1eecff6c89d 100644 Binary files a/sound/vox_fem/abortions.ogg and b/sound/vox_fem/abortions.ogg differ diff --git a/sound/vox_fem/accelerating.ogg b/sound/vox_fem/accelerating.ogg index ef15dcda4e4..2ad134d963d 100644 Binary files a/sound/vox_fem/accelerating.ogg and b/sound/vox_fem/accelerating.ogg differ diff --git a/sound/vox_fem/accelerator.ogg b/sound/vox_fem/accelerator.ogg index 81982a0cb7a..3cc4044525a 100644 Binary files a/sound/vox_fem/accelerator.ogg and b/sound/vox_fem/accelerator.ogg differ diff --git a/sound/vox_fem/accepted.ogg b/sound/vox_fem/accepted.ogg index c8e6ea76d48..0e93357e9d6 100644 Binary files a/sound/vox_fem/accepted.ogg and b/sound/vox_fem/accepted.ogg differ diff --git a/sound/vox_fem/access.ogg b/sound/vox_fem/access.ogg index 8c02ddb5b41..21c926651cc 100644 Binary files a/sound/vox_fem/access.ogg and b/sound/vox_fem/access.ogg differ diff --git a/sound/vox_fem/acknowledge.ogg b/sound/vox_fem/acknowledge.ogg index a25661cc08c..29938de29de 100644 Binary files a/sound/vox_fem/acknowledge.ogg and b/sound/vox_fem/acknowledge.ogg differ diff --git a/sound/vox_fem/acknowledged.ogg b/sound/vox_fem/acknowledged.ogg index ce3a8756494..910a31fc179 100644 Binary files a/sound/vox_fem/acknowledged.ogg and b/sound/vox_fem/acknowledged.ogg differ diff --git a/sound/vox_fem/acquired.ogg b/sound/vox_fem/acquired.ogg index 0b74101ec9b..8248e057782 100644 Binary files a/sound/vox_fem/acquired.ogg and b/sound/vox_fem/acquired.ogg differ diff --git a/sound/vox_fem/acquisition.ogg b/sound/vox_fem/acquisition.ogg index 1d4e67fd603..28d3dc67355 100644 Binary files a/sound/vox_fem/acquisition.ogg and b/sound/vox_fem/acquisition.ogg differ diff --git a/sound/vox_fem/across.ogg b/sound/vox_fem/across.ogg index d9db1b83de8..e3a82f7ee9a 100644 Binary files a/sound/vox_fem/across.ogg and b/sound/vox_fem/across.ogg differ diff --git a/sound/vox_fem/activate.ogg b/sound/vox_fem/activate.ogg index f49bcd878d4..662f74e7a51 100644 Binary files a/sound/vox_fem/activate.ogg and b/sound/vox_fem/activate.ogg differ diff --git a/sound/vox_fem/activated.ogg b/sound/vox_fem/activated.ogg index 4a7a260665d..526352d0bed 100644 Binary files a/sound/vox_fem/activated.ogg and b/sound/vox_fem/activated.ogg differ diff --git a/sound/vox_fem/activity.ogg b/sound/vox_fem/activity.ogg index d045d6b2541..b45be28c061 100644 Binary files a/sound/vox_fem/activity.ogg and b/sound/vox_fem/activity.ogg differ diff --git a/sound/vox_fem/adios.ogg b/sound/vox_fem/adios.ogg index d9c536be6cc..d90dec63ab4 100644 Binary files a/sound/vox_fem/adios.ogg and b/sound/vox_fem/adios.ogg differ diff --git a/sound/vox_fem/administration.ogg b/sound/vox_fem/administration.ogg index 404b9d4043d..89df9d6889d 100644 Binary files a/sound/vox_fem/administration.ogg and b/sound/vox_fem/administration.ogg differ diff --git a/sound/vox_fem/advanced.ogg b/sound/vox_fem/advanced.ogg index 3a32cb81682..04359f62e25 100644 Binary files a/sound/vox_fem/advanced.ogg and b/sound/vox_fem/advanced.ogg differ diff --git a/sound/vox_fem/aft.ogg b/sound/vox_fem/aft.ogg index 242c094023b..c7d967e8159 100644 Binary files a/sound/vox_fem/aft.ogg and b/sound/vox_fem/aft.ogg differ diff --git a/sound/vox_fem/after.ogg b/sound/vox_fem/after.ogg index 4115198e065..950e3019b22 100644 Binary files a/sound/vox_fem/after.ogg and b/sound/vox_fem/after.ogg differ diff --git a/sound/vox_fem/agent.ogg b/sound/vox_fem/agent.ogg index 6affb0e3c2d..0375ccaa700 100644 Binary files a/sound/vox_fem/agent.ogg and b/sound/vox_fem/agent.ogg differ diff --git a/sound/vox_fem/ai.ogg b/sound/vox_fem/ai.ogg index c1249bf9625..af61ae25cec 100644 Binary files a/sound/vox_fem/ai.ogg and b/sound/vox_fem/ai.ogg differ diff --git a/sound/vox_fem/alarm.ogg b/sound/vox_fem/alarm.ogg index 4f42cd10b6f..b3aad597351 100644 Binary files a/sound/vox_fem/alarm.ogg and b/sound/vox_fem/alarm.ogg differ diff --git a/sound/vox_fem/alert.ogg b/sound/vox_fem/alert.ogg index d17cf6ee971..9e66d9b1c2d 100644 Binary files a/sound/vox_fem/alert.ogg and b/sound/vox_fem/alert.ogg differ diff --git a/sound/vox_fem/alien.ogg b/sound/vox_fem/alien.ogg index 3abd5ebbd77..4895423f5e9 100644 Binary files a/sound/vox_fem/alien.ogg and b/sound/vox_fem/alien.ogg differ diff --git a/sound/vox_fem/aligned.ogg b/sound/vox_fem/aligned.ogg index 097685c71d1..9a427ad6fb7 100644 Binary files a/sound/vox_fem/aligned.ogg and b/sound/vox_fem/aligned.ogg differ diff --git a/sound/vox_fem/all.ogg b/sound/vox_fem/all.ogg index 52c4d6b59f7..d02fbf8d5b5 100644 Binary files a/sound/vox_fem/all.ogg and b/sound/vox_fem/all.ogg differ diff --git a/sound/vox_fem/alpha.ogg b/sound/vox_fem/alpha.ogg index bcd722c96b8..ab5aa85a0f6 100644 Binary files a/sound/vox_fem/alpha.ogg and b/sound/vox_fem/alpha.ogg differ diff --git a/sound/vox_fem/am.ogg b/sound/vox_fem/am.ogg index ce499f11c57..a38d05c9356 100644 Binary files a/sound/vox_fem/am.ogg and b/sound/vox_fem/am.ogg differ diff --git a/sound/vox_fem/amigo.ogg b/sound/vox_fem/amigo.ogg index 3ea42298e3a..efe51a5568e 100644 Binary files a/sound/vox_fem/amigo.ogg and b/sound/vox_fem/amigo.ogg differ diff --git a/sound/vox_fem/ammunition.ogg b/sound/vox_fem/ammunition.ogg index 4f8dc140185..e13406ab284 100644 Binary files a/sound/vox_fem/ammunition.ogg and b/sound/vox_fem/ammunition.ogg differ diff --git a/sound/vox_fem/an.ogg b/sound/vox_fem/an.ogg index 5d7c8595bb4..c371f13ee35 100644 Binary files a/sound/vox_fem/an.ogg and b/sound/vox_fem/an.ogg differ diff --git a/sound/vox_fem/and.ogg b/sound/vox_fem/and.ogg index b64e51ddbc8..6765aaa98d0 100644 Binary files a/sound/vox_fem/and.ogg and b/sound/vox_fem/and.ogg differ diff --git a/sound/vox_fem/announcement.ogg b/sound/vox_fem/announcement.ogg index f1fd37d9848..16cc4b45710 100644 Binary files a/sound/vox_fem/announcement.ogg and b/sound/vox_fem/announcement.ogg differ diff --git a/sound/vox_fem/anomalous.ogg b/sound/vox_fem/anomalous.ogg index 5a614592d63..00849a70c75 100644 Binary files a/sound/vox_fem/anomalous.ogg and b/sound/vox_fem/anomalous.ogg differ diff --git a/sound/vox_fem/antenna.ogg b/sound/vox_fem/antenna.ogg index 55c390aaa9d..65e50cb55d5 100644 Binary files a/sound/vox_fem/antenna.ogg and b/sound/vox_fem/antenna.ogg differ diff --git a/sound/vox_fem/any.ogg b/sound/vox_fem/any.ogg index b5e648653ae..bf10035db98 100644 Binary files a/sound/vox_fem/any.ogg and b/sound/vox_fem/any.ogg differ diff --git a/sound/vox_fem/apprehend.ogg b/sound/vox_fem/apprehend.ogg index 91b99cf6721..8b84b7b5439 100644 Binary files a/sound/vox_fem/apprehend.ogg and b/sound/vox_fem/apprehend.ogg differ diff --git a/sound/vox_fem/approach.ogg b/sound/vox_fem/approach.ogg index d6dc3d2a167..e1514d1bded 100644 Binary files a/sound/vox_fem/approach.ogg and b/sound/vox_fem/approach.ogg differ diff --git a/sound/vox_fem/are.ogg b/sound/vox_fem/are.ogg index 240ed4d32cf..c91427b9760 100644 Binary files a/sound/vox_fem/are.ogg and b/sound/vox_fem/are.ogg differ diff --git a/sound/vox_fem/area.ogg b/sound/vox_fem/area.ogg index e631b97ebc2..7bb402ba3e8 100644 Binary files a/sound/vox_fem/area.ogg and b/sound/vox_fem/area.ogg differ diff --git a/sound/vox_fem/arm.ogg b/sound/vox_fem/arm.ogg index aa1cf4ca4d9..270325ca9b6 100644 Binary files a/sound/vox_fem/arm.ogg and b/sound/vox_fem/arm.ogg differ diff --git a/sound/vox_fem/armed.ogg b/sound/vox_fem/armed.ogg index 0e980613d62..6710dc13328 100644 Binary files a/sound/vox_fem/armed.ogg and b/sound/vox_fem/armed.ogg differ diff --git a/sound/vox_fem/armor.ogg b/sound/vox_fem/armor.ogg index d8509a510f1..be00c5c1aed 100644 Binary files a/sound/vox_fem/armor.ogg and b/sound/vox_fem/armor.ogg differ diff --git a/sound/vox_fem/armory.ogg b/sound/vox_fem/armory.ogg index ee9adea2918..1b8b486713f 100644 Binary files a/sound/vox_fem/armory.ogg and b/sound/vox_fem/armory.ogg differ diff --git a/sound/vox_fem/array.ogg b/sound/vox_fem/array.ogg index c482e0db211..3caabbf9d94 100644 Binary files a/sound/vox_fem/array.ogg and b/sound/vox_fem/array.ogg differ diff --git a/sound/vox_fem/arrest.ogg b/sound/vox_fem/arrest.ogg index 3d812f2fefe..db4291d93eb 100644 Binary files a/sound/vox_fem/arrest.ogg and b/sound/vox_fem/arrest.ogg differ diff --git a/sound/vox_fem/asimov.ogg b/sound/vox_fem/asimov.ogg index 752be57d8f9..6665a1c2b6a 100644 Binary files a/sound/vox_fem/asimov.ogg and b/sound/vox_fem/asimov.ogg differ diff --git a/sound/vox_fem/ass.ogg b/sound/vox_fem/ass.ogg index b261433ea39..ab51e76032d 100644 Binary files a/sound/vox_fem/ass.ogg and b/sound/vox_fem/ass.ogg differ diff --git a/sound/vox_fem/asshole.ogg b/sound/vox_fem/asshole.ogg index 7eabf85a29c..d446c21281a 100644 Binary files a/sound/vox_fem/asshole.ogg and b/sound/vox_fem/asshole.ogg differ diff --git a/sound/vox_fem/assholes.ogg b/sound/vox_fem/assholes.ogg index 612d6ab4b75..ce06096ef42 100644 Binary files a/sound/vox_fem/assholes.ogg and b/sound/vox_fem/assholes.ogg differ diff --git a/sound/vox_fem/at.ogg b/sound/vox_fem/at.ogg index bd45395c0d9..446edf47878 100644 Binary files a/sound/vox_fem/at.ogg and b/sound/vox_fem/at.ogg differ diff --git a/sound/vox_fem/atomic.ogg b/sound/vox_fem/atomic.ogg index ffece4ca03e..6d75570f0e8 100644 Binary files a/sound/vox_fem/atomic.ogg and b/sound/vox_fem/atomic.ogg differ diff --git a/sound/vox_fem/attention.ogg b/sound/vox_fem/attention.ogg index 655a2f76a70..1de7b20fca9 100644 Binary files a/sound/vox_fem/attention.ogg and b/sound/vox_fem/attention.ogg differ diff --git a/sound/vox_fem/authorize.ogg b/sound/vox_fem/authorize.ogg index a14d2cad1fd..332ed3b3314 100644 Binary files a/sound/vox_fem/authorize.ogg and b/sound/vox_fem/authorize.ogg differ diff --git a/sound/vox_fem/authorized.ogg b/sound/vox_fem/authorized.ogg index 127e498e22d..d7f91f81328 100644 Binary files a/sound/vox_fem/authorized.ogg and b/sound/vox_fem/authorized.ogg differ diff --git a/sound/vox_fem/automatic.ogg b/sound/vox_fem/automatic.ogg index 47296e85ad1..2f7fedada2e 100644 Binary files a/sound/vox_fem/automatic.ogg and b/sound/vox_fem/automatic.ogg differ diff --git a/sound/vox_fem/away.ogg b/sound/vox_fem/away.ogg index 2e550b5c7dd..3f482d5ccf3 100644 Binary files a/sound/vox_fem/away.ogg and b/sound/vox_fem/away.ogg differ diff --git a/sound/vox_fem/b.ogg b/sound/vox_fem/b.ogg index e5444171ebc..9985f7c56aa 100644 Binary files a/sound/vox_fem/b.ogg and b/sound/vox_fem/b.ogg differ diff --git a/sound/vox_fem/back.ogg b/sound/vox_fem/back.ogg index 77e7a83bc53..87fd5b3cc0d 100644 Binary files a/sound/vox_fem/back.ogg and b/sound/vox_fem/back.ogg differ diff --git a/sound/vox_fem/backman.ogg b/sound/vox_fem/backman.ogg index 77c9e19e816..6b3e758e90b 100644 Binary files a/sound/vox_fem/backman.ogg and b/sound/vox_fem/backman.ogg differ diff --git a/sound/vox_fem/bad.ogg b/sound/vox_fem/bad.ogg index b3cb0af0288..3dd4e2cec6b 100644 Binary files a/sound/vox_fem/bad.ogg and b/sound/vox_fem/bad.ogg differ diff --git a/sound/vox_fem/bag.ogg b/sound/vox_fem/bag.ogg index 74237046e27..04d64df9f2f 100644 Binary files a/sound/vox_fem/bag.ogg and b/sound/vox_fem/bag.ogg differ diff --git a/sound/vox_fem/bailey.ogg b/sound/vox_fem/bailey.ogg index d75f5782a87..25fee818440 100644 Binary files a/sound/vox_fem/bailey.ogg and b/sound/vox_fem/bailey.ogg differ diff --git a/sound/vox_fem/barracks.ogg b/sound/vox_fem/barracks.ogg index 160c63d1f54..6f78b3a8202 100644 Binary files a/sound/vox_fem/barracks.ogg and b/sound/vox_fem/barracks.ogg differ diff --git a/sound/vox_fem/base.ogg b/sound/vox_fem/base.ogg index d73dec5177c..9706d299453 100644 Binary files a/sound/vox_fem/base.ogg and b/sound/vox_fem/base.ogg differ diff --git a/sound/vox_fem/bay.ogg b/sound/vox_fem/bay.ogg index fe61b649713..a4aac8563f3 100644 Binary files a/sound/vox_fem/bay.ogg and b/sound/vox_fem/bay.ogg differ diff --git a/sound/vox_fem/be.ogg b/sound/vox_fem/be.ogg index 925b02ead8a..e3ee37f2a04 100644 Binary files a/sound/vox_fem/be.ogg and b/sound/vox_fem/be.ogg differ diff --git a/sound/vox_fem/been.ogg b/sound/vox_fem/been.ogg index 011629a1527..202d8f229cd 100644 Binary files a/sound/vox_fem/been.ogg and b/sound/vox_fem/been.ogg differ diff --git a/sound/vox_fem/before.ogg b/sound/vox_fem/before.ogg index ab94bf3fe0d..9b25bf1d2c6 100644 Binary files a/sound/vox_fem/before.ogg and b/sound/vox_fem/before.ogg differ diff --git a/sound/vox_fem/beyond.ogg b/sound/vox_fem/beyond.ogg index e11d695a5da..d9064b764a3 100644 Binary files a/sound/vox_fem/beyond.ogg and b/sound/vox_fem/beyond.ogg differ diff --git a/sound/vox_fem/biohazard.ogg b/sound/vox_fem/biohazard.ogg index 55ff5d6eb32..914a083c5be 100644 Binary files a/sound/vox_fem/biohazard.ogg and b/sound/vox_fem/biohazard.ogg differ diff --git a/sound/vox_fem/biological.ogg b/sound/vox_fem/biological.ogg index 3e1fd695dfa..4efbb349702 100644 Binary files a/sound/vox_fem/biological.ogg and b/sound/vox_fem/biological.ogg differ diff --git a/sound/vox_fem/birdwell.ogg b/sound/vox_fem/birdwell.ogg index 2a07a4de4e4..b291d8d40b2 100644 Binary files a/sound/vox_fem/birdwell.ogg and b/sound/vox_fem/birdwell.ogg differ diff --git a/sound/vox_fem/bitch.ogg b/sound/vox_fem/bitch.ogg index 32c80e7b348..348715b1517 100644 Binary files a/sound/vox_fem/bitch.ogg and b/sound/vox_fem/bitch.ogg differ diff --git a/sound/vox_fem/bitches.ogg b/sound/vox_fem/bitches.ogg index 25f9504c6ba..dab8e1257ab 100644 Binary files a/sound/vox_fem/bitches.ogg and b/sound/vox_fem/bitches.ogg differ diff --git a/sound/vox_fem/black.ogg b/sound/vox_fem/black.ogg index 2d5d30ef695..9c74790de48 100644 Binary files a/sound/vox_fem/black.ogg and b/sound/vox_fem/black.ogg differ diff --git a/sound/vox_fem/blast.ogg b/sound/vox_fem/blast.ogg index 52bac578777..21d13d1e3ba 100644 Binary files a/sound/vox_fem/blast.ogg and b/sound/vox_fem/blast.ogg differ diff --git a/sound/vox_fem/blocked.ogg b/sound/vox_fem/blocked.ogg index 8208b0bf922..0d97cf44e04 100644 Binary files a/sound/vox_fem/blocked.ogg and b/sound/vox_fem/blocked.ogg differ diff --git a/sound/vox_fem/blue.ogg b/sound/vox_fem/blue.ogg index 0363e5effe8..2bca816f342 100644 Binary files a/sound/vox_fem/blue.ogg and b/sound/vox_fem/blue.ogg differ diff --git a/sound/vox_fem/bottom.ogg b/sound/vox_fem/bottom.ogg index 06bcfc8530c..c1850574c58 100644 Binary files a/sound/vox_fem/bottom.ogg and b/sound/vox_fem/bottom.ogg differ diff --git a/sound/vox_fem/bravo.ogg b/sound/vox_fem/bravo.ogg index 2ec3f494b31..eaba95e28b6 100644 Binary files a/sound/vox_fem/bravo.ogg and b/sound/vox_fem/bravo.ogg differ diff --git a/sound/vox_fem/breach.ogg b/sound/vox_fem/breach.ogg index 3b950aae120..b95f17f8d7c 100644 Binary files a/sound/vox_fem/breach.ogg and b/sound/vox_fem/breach.ogg differ diff --git a/sound/vox_fem/breached.ogg b/sound/vox_fem/breached.ogg index 0fa6340c03d..fd5369c05ac 100644 Binary files a/sound/vox_fem/breached.ogg and b/sound/vox_fem/breached.ogg differ diff --git a/sound/vox_fem/break.ogg b/sound/vox_fem/break.ogg index 4fb6c762694..7a846fad7f4 100644 Binary files a/sound/vox_fem/break.ogg and b/sound/vox_fem/break.ogg differ diff --git a/sound/vox_fem/bridge.ogg b/sound/vox_fem/bridge.ogg index 7912a06f8ba..9d99aaf7067 100644 Binary files a/sound/vox_fem/bridge.ogg and b/sound/vox_fem/bridge.ogg differ diff --git a/sound/vox_fem/bust.ogg b/sound/vox_fem/bust.ogg index 9660d48c132..eb227024863 100644 Binary files a/sound/vox_fem/bust.ogg and b/sound/vox_fem/bust.ogg differ diff --git a/sound/vox_fem/but.ogg b/sound/vox_fem/but.ogg index 00b2347b465..a1c80f6d5d7 100644 Binary files a/sound/vox_fem/but.ogg and b/sound/vox_fem/but.ogg differ diff --git a/sound/vox_fem/button.ogg b/sound/vox_fem/button.ogg index 3d7ce663acc..b31c342b149 100644 Binary files a/sound/vox_fem/button.ogg and b/sound/vox_fem/button.ogg differ diff --git a/sound/vox_fem/bypass.ogg b/sound/vox_fem/bypass.ogg index 7474c751735..f5e7449143b 100644 Binary files a/sound/vox_fem/bypass.ogg and b/sound/vox_fem/bypass.ogg differ diff --git a/sound/vox_fem/c.ogg b/sound/vox_fem/c.ogg index 6d4a237fa65..4fdccce68c4 100644 Binary files a/sound/vox_fem/c.ogg and b/sound/vox_fem/c.ogg differ diff --git a/sound/vox_fem/cable.ogg b/sound/vox_fem/cable.ogg index 8ac529fd93f..d859a727291 100644 Binary files a/sound/vox_fem/cable.ogg and b/sound/vox_fem/cable.ogg differ diff --git a/sound/vox_fem/call.ogg b/sound/vox_fem/call.ogg index 8b6b73b8dca..9040e35ca1a 100644 Binary files a/sound/vox_fem/call.ogg and b/sound/vox_fem/call.ogg differ diff --git a/sound/vox_fem/called.ogg b/sound/vox_fem/called.ogg index c87f00cacc9..b40530537dd 100644 Binary files a/sound/vox_fem/called.ogg and b/sound/vox_fem/called.ogg differ diff --git a/sound/vox_fem/canal.ogg b/sound/vox_fem/canal.ogg index d3082bb1460..74b888be6bf 100644 Binary files a/sound/vox_fem/canal.ogg and b/sound/vox_fem/canal.ogg differ diff --git a/sound/vox_fem/cap.ogg b/sound/vox_fem/cap.ogg index 2e5830b4325..842cd36f51a 100644 Binary files a/sound/vox_fem/cap.ogg and b/sound/vox_fem/cap.ogg differ diff --git a/sound/vox_fem/captain.ogg b/sound/vox_fem/captain.ogg index 891e7156f0e..b3c418cdd33 100644 Binary files a/sound/vox_fem/captain.ogg and b/sound/vox_fem/captain.ogg differ diff --git a/sound/vox_fem/capture.ogg b/sound/vox_fem/capture.ogg index ba4923e0e7f..7ff6e2d303f 100644 Binary files a/sound/vox_fem/capture.ogg and b/sound/vox_fem/capture.ogg differ diff --git a/sound/vox_fem/cargo.ogg b/sound/vox_fem/cargo.ogg index db5ba362071..bacb92bcefc 100644 Binary files a/sound/vox_fem/cargo.ogg and b/sound/vox_fem/cargo.ogg differ diff --git a/sound/vox_fem/ceiling.ogg b/sound/vox_fem/ceiling.ogg index 94a6c1e7e12..23077d3190f 100644 Binary files a/sound/vox_fem/ceiling.ogg and b/sound/vox_fem/ceiling.ogg differ diff --git a/sound/vox_fem/celsius.ogg b/sound/vox_fem/celsius.ogg index f511399c212..c581b1826c6 100644 Binary files a/sound/vox_fem/celsius.ogg and b/sound/vox_fem/celsius.ogg differ diff --git a/sound/vox_fem/centcom.ogg b/sound/vox_fem/centcom.ogg index 9c6404df836..fa959cf317e 100644 Binary files a/sound/vox_fem/centcom.ogg and b/sound/vox_fem/centcom.ogg differ diff --git a/sound/vox_fem/center.ogg b/sound/vox_fem/center.ogg index f7777bfe599..25287989017 100644 Binary files a/sound/vox_fem/center.ogg and b/sound/vox_fem/center.ogg differ diff --git a/sound/vox_fem/centi.ogg b/sound/vox_fem/centi.ogg index 4e05d4b1158..1edbec2af63 100644 Binary files a/sound/vox_fem/centi.ogg and b/sound/vox_fem/centi.ogg differ diff --git a/sound/vox_fem/central.ogg b/sound/vox_fem/central.ogg index 0559204e26a..46391d79d5f 100644 Binary files a/sound/vox_fem/central.ogg and b/sound/vox_fem/central.ogg differ diff --git a/sound/vox_fem/chamber.ogg b/sound/vox_fem/chamber.ogg index be4cd9990af..2ebe6e95ef8 100644 Binary files a/sound/vox_fem/chamber.ogg and b/sound/vox_fem/chamber.ogg differ diff --git a/sound/vox_fem/changed.ogg b/sound/vox_fem/changed.ogg index ca2ed7a42a1..a18a7e0bfa9 100644 Binary files a/sound/vox_fem/changed.ogg and b/sound/vox_fem/changed.ogg differ diff --git a/sound/vox_fem/charlie.ogg b/sound/vox_fem/charlie.ogg index c82908eb621..0178175604a 100644 Binary files a/sound/vox_fem/charlie.ogg and b/sound/vox_fem/charlie.ogg differ diff --git a/sound/vox_fem/check.ogg b/sound/vox_fem/check.ogg index f94e753b4b3..111d71d51aa 100644 Binary files a/sound/vox_fem/check.ogg and b/sound/vox_fem/check.ogg differ diff --git a/sound/vox_fem/checkpoint.ogg b/sound/vox_fem/checkpoint.ogg index 80ef803fc09..591e4506a73 100644 Binary files a/sound/vox_fem/checkpoint.ogg and b/sound/vox_fem/checkpoint.ogg differ diff --git a/sound/vox_fem/chemical.ogg b/sound/vox_fem/chemical.ogg index 8de2dfc54b5..f79015a82f3 100644 Binary files a/sound/vox_fem/chemical.ogg and b/sound/vox_fem/chemical.ogg differ diff --git a/sound/vox_fem/cleanup.ogg b/sound/vox_fem/cleanup.ogg index 700b9beb4d2..21bb9439055 100644 Binary files a/sound/vox_fem/cleanup.ogg and b/sound/vox_fem/cleanup.ogg differ diff --git a/sound/vox_fem/clear.ogg b/sound/vox_fem/clear.ogg index 0ea496386f0..28bc282ae23 100644 Binary files a/sound/vox_fem/clear.ogg and b/sound/vox_fem/clear.ogg differ diff --git a/sound/vox_fem/clearance.ogg b/sound/vox_fem/clearance.ogg index 73ebc3a3a5c..31e27ea4532 100644 Binary files a/sound/vox_fem/clearance.ogg and b/sound/vox_fem/clearance.ogg differ diff --git a/sound/vox_fem/close.ogg b/sound/vox_fem/close.ogg index a5655f9c8f1..e478f3c2423 100644 Binary files a/sound/vox_fem/close.ogg and b/sound/vox_fem/close.ogg differ diff --git a/sound/vox_fem/clown.ogg b/sound/vox_fem/clown.ogg index 2d8103e3a29..3d92a003732 100644 Binary files a/sound/vox_fem/clown.ogg and b/sound/vox_fem/clown.ogg differ diff --git a/sound/vox_fem/code.ogg b/sound/vox_fem/code.ogg index 6b233f565b6..2f4f969e63c 100644 Binary files a/sound/vox_fem/code.ogg and b/sound/vox_fem/code.ogg differ diff --git a/sound/vox_fem/coded.ogg b/sound/vox_fem/coded.ogg index 58750503ebc..a82df555807 100644 Binary files a/sound/vox_fem/coded.ogg and b/sound/vox_fem/coded.ogg differ diff --git a/sound/vox_fem/collider.ogg b/sound/vox_fem/collider.ogg index fc880498a4e..985d715bffe 100644 Binary files a/sound/vox_fem/collider.ogg and b/sound/vox_fem/collider.ogg differ diff --git a/sound/vox_fem/come.ogg b/sound/vox_fem/come.ogg index c666bdb1bb5..d3c414ff984 100644 Binary files a/sound/vox_fem/come.ogg and b/sound/vox_fem/come.ogg differ diff --git a/sound/vox_fem/command.ogg b/sound/vox_fem/command.ogg index b02f62f3162..4461a7f1a40 100644 Binary files a/sound/vox_fem/command.ogg and b/sound/vox_fem/command.ogg differ diff --git a/sound/vox_fem/communication.ogg b/sound/vox_fem/communication.ogg index 5acb9a4546f..1bdea077e1d 100644 Binary files a/sound/vox_fem/communication.ogg and b/sound/vox_fem/communication.ogg differ diff --git a/sound/vox_fem/complex.ogg b/sound/vox_fem/complex.ogg index 80d3734f3e5..baedb710c99 100644 Binary files a/sound/vox_fem/complex.ogg and b/sound/vox_fem/complex.ogg differ diff --git a/sound/vox_fem/computer.ogg b/sound/vox_fem/computer.ogg index dd194d2c9b9..9582c594bb9 100644 Binary files a/sound/vox_fem/computer.ogg and b/sound/vox_fem/computer.ogg differ diff --git a/sound/vox_fem/condition.ogg b/sound/vox_fem/condition.ogg index 024e408a209..d6467534104 100644 Binary files a/sound/vox_fem/condition.ogg and b/sound/vox_fem/condition.ogg differ diff --git a/sound/vox_fem/connor.ogg b/sound/vox_fem/connor.ogg index 17b85fc3a89..d151e640d31 100644 Binary files a/sound/vox_fem/connor.ogg and b/sound/vox_fem/connor.ogg differ diff --git a/sound/vox_fem/containment.ogg b/sound/vox_fem/containment.ogg index cc8674f2061..669ab3ebba3 100644 Binary files a/sound/vox_fem/containment.ogg and b/sound/vox_fem/containment.ogg differ diff --git a/sound/vox_fem/contamination.ogg b/sound/vox_fem/contamination.ogg index 327085dc375..11dd067ace7 100644 Binary files a/sound/vox_fem/contamination.ogg and b/sound/vox_fem/contamination.ogg differ diff --git a/sound/vox_fem/contraband.ogg b/sound/vox_fem/contraband.ogg index 2fe6da29f88..f236049a7cf 100644 Binary files a/sound/vox_fem/contraband.ogg and b/sound/vox_fem/contraband.ogg differ diff --git a/sound/vox_fem/control.ogg b/sound/vox_fem/control.ogg index 38b91cca882..0074e0ffbb5 100644 Binary files a/sound/vox_fem/control.ogg and b/sound/vox_fem/control.ogg differ diff --git a/sound/vox_fem/coolant.ogg b/sound/vox_fem/coolant.ogg index 923dcfd53c3..dc4065daee3 100644 Binary files a/sound/vox_fem/coolant.ogg and b/sound/vox_fem/coolant.ogg differ diff --git a/sound/vox_fem/coomer.ogg b/sound/vox_fem/coomer.ogg index ff8140db909..4f7f8ca3b94 100644 Binary files a/sound/vox_fem/coomer.ogg and b/sound/vox_fem/coomer.ogg differ diff --git a/sound/vox_fem/core.ogg b/sound/vox_fem/core.ogg index e3dd073d989..c44383dd591 100644 Binary files a/sound/vox_fem/core.ogg and b/sound/vox_fem/core.ogg differ diff --git a/sound/vox_fem/correct.ogg b/sound/vox_fem/correct.ogg index f9cf6b2e3d1..952bee83563 100644 Binary files a/sound/vox_fem/correct.ogg and b/sound/vox_fem/correct.ogg differ diff --git a/sound/vox_fem/corridor.ogg b/sound/vox_fem/corridor.ogg index 46b1cb16f07..04227fd5d4e 100644 Binary files a/sound/vox_fem/corridor.ogg and b/sound/vox_fem/corridor.ogg differ diff --git a/sound/vox_fem/coward.ogg b/sound/vox_fem/coward.ogg index 75873e43a54..a343df23f75 100644 Binary files a/sound/vox_fem/coward.ogg and b/sound/vox_fem/coward.ogg differ diff --git a/sound/vox_fem/cowards.ogg b/sound/vox_fem/cowards.ogg index 4aba6793a7a..f5dac8813c3 100644 Binary files a/sound/vox_fem/cowards.ogg and b/sound/vox_fem/cowards.ogg differ diff --git a/sound/vox_fem/crew.ogg b/sound/vox_fem/crew.ogg index f4f749fb575..4a886bbfb71 100644 Binary files a/sound/vox_fem/crew.ogg and b/sound/vox_fem/crew.ogg differ diff --git a/sound/vox_fem/cross.ogg b/sound/vox_fem/cross.ogg index 7efe69a4359..caaeb7057fb 100644 Binary files a/sound/vox_fem/cross.ogg and b/sound/vox_fem/cross.ogg differ diff --git a/sound/vox_fem/cryogenic.ogg b/sound/vox_fem/cryogenic.ogg index 2efb8db8b27..04624fe5601 100644 Binary files a/sound/vox_fem/cryogenic.ogg and b/sound/vox_fem/cryogenic.ogg differ diff --git a/sound/vox_fem/cunt.ogg b/sound/vox_fem/cunt.ogg index d5700592e42..37abf11e927 100644 Binary files a/sound/vox_fem/cunt.ogg and b/sound/vox_fem/cunt.ogg differ diff --git a/sound/vox_fem/cyborg.ogg b/sound/vox_fem/cyborg.ogg index 399fe35133f..76ea47f7d27 100644 Binary files a/sound/vox_fem/cyborg.ogg and b/sound/vox_fem/cyborg.ogg differ diff --git a/sound/vox_fem/cyborgs.ogg b/sound/vox_fem/cyborgs.ogg index 7c07d670b5d..f05ec68ac08 100644 Binary files a/sound/vox_fem/cyborgs.ogg and b/sound/vox_fem/cyborgs.ogg differ diff --git a/sound/vox_fem/d.ogg b/sound/vox_fem/d.ogg index 83eccc85a4b..55a41320604 100644 Binary files a/sound/vox_fem/d.ogg and b/sound/vox_fem/d.ogg differ diff --git a/sound/vox_fem/damage.ogg b/sound/vox_fem/damage.ogg index a43f9801929..08b44edc4ec 100644 Binary files a/sound/vox_fem/damage.ogg and b/sound/vox_fem/damage.ogg differ diff --git a/sound/vox_fem/damaged.ogg b/sound/vox_fem/damaged.ogg index 40f392e24ed..dddb8ce9768 100644 Binary files a/sound/vox_fem/damaged.ogg and b/sound/vox_fem/damaged.ogg differ diff --git a/sound/vox_fem/danger.ogg b/sound/vox_fem/danger.ogg index 7307b3c3cdb..4e3f77b0eaf 100644 Binary files a/sound/vox_fem/danger.ogg and b/sound/vox_fem/danger.ogg differ diff --git a/sound/vox_fem/day.ogg b/sound/vox_fem/day.ogg index cf06ec003f4..a1ad0c915f3 100644 Binary files a/sound/vox_fem/day.ogg and b/sound/vox_fem/day.ogg differ diff --git a/sound/vox_fem/deactivated.ogg b/sound/vox_fem/deactivated.ogg index 921b10c9b89..9553b60f797 100644 Binary files a/sound/vox_fem/deactivated.ogg and b/sound/vox_fem/deactivated.ogg differ diff --git a/sound/vox_fem/decompression.ogg b/sound/vox_fem/decompression.ogg index 1434459c3d9..d6bf99ddf4b 100644 Binary files a/sound/vox_fem/decompression.ogg and b/sound/vox_fem/decompression.ogg differ diff --git a/sound/vox_fem/decontamination.ogg b/sound/vox_fem/decontamination.ogg index 6eb032bad6a..6c2678fea9d 100644 Binary files a/sound/vox_fem/decontamination.ogg and b/sound/vox_fem/decontamination.ogg differ diff --git a/sound/vox_fem/deeoo.ogg b/sound/vox_fem/deeoo.ogg index bb465bd949f..3a8bbd48aee 100644 Binary files a/sound/vox_fem/deeoo.ogg and b/sound/vox_fem/deeoo.ogg differ diff --git a/sound/vox_fem/defense.ogg b/sound/vox_fem/defense.ogg index fad8709bbba..fb96cc7cce4 100644 Binary files a/sound/vox_fem/defense.ogg and b/sound/vox_fem/defense.ogg differ diff --git a/sound/vox_fem/degrees.ogg b/sound/vox_fem/degrees.ogg index dd7e56b7968..cb483e04fb7 100644 Binary files a/sound/vox_fem/degrees.ogg and b/sound/vox_fem/degrees.ogg differ diff --git a/sound/vox_fem/delta.ogg b/sound/vox_fem/delta.ogg index c25839a87ae..63cfcbc64c3 100644 Binary files a/sound/vox_fem/delta.ogg and b/sound/vox_fem/delta.ogg differ diff --git a/sound/vox_fem/denied.ogg b/sound/vox_fem/denied.ogg index 1f3eef8f343..b44fc72b8f0 100644 Binary files a/sound/vox_fem/denied.ogg and b/sound/vox_fem/denied.ogg differ diff --git a/sound/vox_fem/deploy.ogg b/sound/vox_fem/deploy.ogg index 61ff085b6dc..1ff0a0e8625 100644 Binary files a/sound/vox_fem/deploy.ogg and b/sound/vox_fem/deploy.ogg differ diff --git a/sound/vox_fem/deployed.ogg b/sound/vox_fem/deployed.ogg index c0c3a5c988d..28bde2e2769 100644 Binary files a/sound/vox_fem/deployed.ogg and b/sound/vox_fem/deployed.ogg differ diff --git a/sound/vox_fem/destroy.ogg b/sound/vox_fem/destroy.ogg index 7a8dce32b37..924ec152f6e 100644 Binary files a/sound/vox_fem/destroy.ogg and b/sound/vox_fem/destroy.ogg differ diff --git a/sound/vox_fem/destroyed.ogg b/sound/vox_fem/destroyed.ogg index cbe5ee43b32..0cbd8474f99 100644 Binary files a/sound/vox_fem/destroyed.ogg and b/sound/vox_fem/destroyed.ogg differ diff --git a/sound/vox_fem/detain.ogg b/sound/vox_fem/detain.ogg index 2596d508c0e..3391f7f859b 100644 Binary files a/sound/vox_fem/detain.ogg and b/sound/vox_fem/detain.ogg differ diff --git a/sound/vox_fem/detected.ogg b/sound/vox_fem/detected.ogg index a438cbe1e91..b308ce59c97 100644 Binary files a/sound/vox_fem/detected.ogg and b/sound/vox_fem/detected.ogg differ diff --git a/sound/vox_fem/detonation.ogg b/sound/vox_fem/detonation.ogg index 88a470d088f..835111b1d7d 100644 Binary files a/sound/vox_fem/detonation.ogg and b/sound/vox_fem/detonation.ogg differ diff --git a/sound/vox_fem/device.ogg b/sound/vox_fem/device.ogg index e5343a59eda..a08e6c3f443 100644 Binary files a/sound/vox_fem/device.ogg and b/sound/vox_fem/device.ogg differ diff --git a/sound/vox_fem/did.ogg b/sound/vox_fem/did.ogg index bb80968c1bd..3af6acb99ed 100644 Binary files a/sound/vox_fem/did.ogg and b/sound/vox_fem/did.ogg differ diff --git a/sound/vox_fem/die.ogg b/sound/vox_fem/die.ogg index f4fb598a086..602cc083ca7 100644 Binary files a/sound/vox_fem/die.ogg and b/sound/vox_fem/die.ogg differ diff --git a/sound/vox_fem/dimensional.ogg b/sound/vox_fem/dimensional.ogg index 2b349d7f5dc..175bfe01074 100644 Binary files a/sound/vox_fem/dimensional.ogg and b/sound/vox_fem/dimensional.ogg differ diff --git a/sound/vox_fem/dirt.ogg b/sound/vox_fem/dirt.ogg index df82cf76902..39cc18c6163 100644 Binary files a/sound/vox_fem/dirt.ogg and b/sound/vox_fem/dirt.ogg differ diff --git a/sound/vox_fem/disengaged.ogg b/sound/vox_fem/disengaged.ogg index 19c16b7358a..906350fd67b 100644 Binary files a/sound/vox_fem/disengaged.ogg and b/sound/vox_fem/disengaged.ogg differ diff --git a/sound/vox_fem/dish.ogg b/sound/vox_fem/dish.ogg index e7f3c2d30b7..5dd123050fb 100644 Binary files a/sound/vox_fem/dish.ogg and b/sound/vox_fem/dish.ogg differ diff --git a/sound/vox_fem/disposal.ogg b/sound/vox_fem/disposal.ogg index 8569a012ed6..25331eeaf2a 100644 Binary files a/sound/vox_fem/disposal.ogg and b/sound/vox_fem/disposal.ogg differ diff --git a/sound/vox_fem/distance.ogg b/sound/vox_fem/distance.ogg index ac979817671..a663a6386b4 100644 Binary files a/sound/vox_fem/distance.ogg and b/sound/vox_fem/distance.ogg differ diff --git a/sound/vox_fem/distortion.ogg b/sound/vox_fem/distortion.ogg index 4a65c206304..825cc558163 100644 Binary files a/sound/vox_fem/distortion.ogg and b/sound/vox_fem/distortion.ogg differ diff --git a/sound/vox_fem/do.ogg b/sound/vox_fem/do.ogg index 5291ce51d41..6ac7099d0bf 100644 Binary files a/sound/vox_fem/do.ogg and b/sound/vox_fem/do.ogg differ diff --git a/sound/vox_fem/doctor.ogg b/sound/vox_fem/doctor.ogg index af10d76affa..a0736050219 100644 Binary files a/sound/vox_fem/doctor.ogg and b/sound/vox_fem/doctor.ogg differ diff --git a/sound/vox_fem/door.ogg b/sound/vox_fem/door.ogg index cedc6609173..4d93d28cd85 100644 Binary files a/sound/vox_fem/door.ogg and b/sound/vox_fem/door.ogg differ diff --git a/sound/vox_fem/down.ogg b/sound/vox_fem/down.ogg index 4377136bec9..c6a69398b28 100644 Binary files a/sound/vox_fem/down.ogg and b/sound/vox_fem/down.ogg differ diff --git a/sound/vox_fem/dual.ogg b/sound/vox_fem/dual.ogg index 8bca7b52cd7..291c5eca450 100644 Binary files a/sound/vox_fem/dual.ogg and b/sound/vox_fem/dual.ogg differ diff --git a/sound/vox_fem/duct.ogg b/sound/vox_fem/duct.ogg index da440eaf8bb..04309950649 100644 Binary files a/sound/vox_fem/duct.ogg and b/sound/vox_fem/duct.ogg differ diff --git a/sound/vox_fem/e.ogg b/sound/vox_fem/e.ogg index 6254b76fbb5..7a9af66368a 100644 Binary files a/sound/vox_fem/e.ogg and b/sound/vox_fem/e.ogg differ diff --git a/sound/vox_fem/east.ogg b/sound/vox_fem/east.ogg index fc587cb8c04..6034fcc6412 100644 Binary files a/sound/vox_fem/east.ogg and b/sound/vox_fem/east.ogg differ diff --git a/sound/vox_fem/echo.ogg b/sound/vox_fem/echo.ogg index 273c032994d..6bbf45589f3 100644 Binary files a/sound/vox_fem/echo.ogg and b/sound/vox_fem/echo.ogg differ diff --git a/sound/vox_fem/ed.ogg b/sound/vox_fem/ed.ogg index df8f32fff8f..e4bb08f3e8b 100644 Binary files a/sound/vox_fem/ed.ogg and b/sound/vox_fem/ed.ogg differ diff --git a/sound/vox_fem/effect.ogg b/sound/vox_fem/effect.ogg index 0f0b2e30805..5c60751cf3c 100644 Binary files a/sound/vox_fem/effect.ogg and b/sound/vox_fem/effect.ogg differ diff --git a/sound/vox_fem/egress.ogg b/sound/vox_fem/egress.ogg index 49cf5087c0d..b7b6a29d0d5 100644 Binary files a/sound/vox_fem/egress.ogg and b/sound/vox_fem/egress.ogg differ diff --git a/sound/vox_fem/eight.ogg b/sound/vox_fem/eight.ogg index a229bf163fd..ecf7111a42e 100644 Binary files a/sound/vox_fem/eight.ogg and b/sound/vox_fem/eight.ogg differ diff --git a/sound/vox_fem/eighteen.ogg b/sound/vox_fem/eighteen.ogg index 8e61c7b7d3a..b9c239faf62 100644 Binary files a/sound/vox_fem/eighteen.ogg and b/sound/vox_fem/eighteen.ogg differ diff --git a/sound/vox_fem/eighty.ogg b/sound/vox_fem/eighty.ogg index 9f940752e8d..c9b2f0ac5f8 100644 Binary files a/sound/vox_fem/eighty.ogg and b/sound/vox_fem/eighty.ogg differ diff --git a/sound/vox_fem/electric.ogg b/sound/vox_fem/electric.ogg index ba21120dac5..58788723d23 100644 Binary files a/sound/vox_fem/electric.ogg and b/sound/vox_fem/electric.ogg differ diff --git a/sound/vox_fem/electromagnetic.ogg b/sound/vox_fem/electromagnetic.ogg index 343cf63fbb9..bec4c9d2f90 100644 Binary files a/sound/vox_fem/electromagnetic.ogg and b/sound/vox_fem/electromagnetic.ogg differ diff --git a/sound/vox_fem/elevator.ogg b/sound/vox_fem/elevator.ogg index c16d677a707..d4383ba9089 100644 Binary files a/sound/vox_fem/elevator.ogg and b/sound/vox_fem/elevator.ogg differ diff --git a/sound/vox_fem/eleven.ogg b/sound/vox_fem/eleven.ogg index e2cbf9768c4..ea38113247a 100644 Binary files a/sound/vox_fem/eleven.ogg and b/sound/vox_fem/eleven.ogg differ diff --git a/sound/vox_fem/eliminate.ogg b/sound/vox_fem/eliminate.ogg index 38526009166..1e2bc8cc658 100644 Binary files a/sound/vox_fem/eliminate.ogg and b/sound/vox_fem/eliminate.ogg differ diff --git a/sound/vox_fem/emergency.ogg b/sound/vox_fem/emergency.ogg index 879cdca52bd..5289a375caa 100644 Binary files a/sound/vox_fem/emergency.ogg and b/sound/vox_fem/emergency.ogg differ diff --git a/sound/vox_fem/energy.ogg b/sound/vox_fem/energy.ogg index 46de8690951..d0e52f084b0 100644 Binary files a/sound/vox_fem/energy.ogg and b/sound/vox_fem/energy.ogg differ diff --git a/sound/vox_fem/engage.ogg b/sound/vox_fem/engage.ogg index 9f2599867ac..ee7d2112b87 100644 Binary files a/sound/vox_fem/engage.ogg and b/sound/vox_fem/engage.ogg differ diff --git a/sound/vox_fem/engaged.ogg b/sound/vox_fem/engaged.ogg index 2983abc9969..358d13f1061 100644 Binary files a/sound/vox_fem/engaged.ogg and b/sound/vox_fem/engaged.ogg differ diff --git a/sound/vox_fem/engine.ogg b/sound/vox_fem/engine.ogg index defb291fca5..1936b115cc1 100644 Binary files a/sound/vox_fem/engine.ogg and b/sound/vox_fem/engine.ogg differ diff --git a/sound/vox_fem/enter.ogg b/sound/vox_fem/enter.ogg index 5788e096517..93d796ca9c0 100644 Binary files a/sound/vox_fem/enter.ogg and b/sound/vox_fem/enter.ogg differ diff --git a/sound/vox_fem/entry.ogg b/sound/vox_fem/entry.ogg index c0baeb0aa7e..a11ed9be4ec 100644 Binary files a/sound/vox_fem/entry.ogg and b/sound/vox_fem/entry.ogg differ diff --git a/sound/vox_fem/environment.ogg b/sound/vox_fem/environment.ogg index b96dc916f18..02a2a172cf1 100644 Binary files a/sound/vox_fem/environment.ogg and b/sound/vox_fem/environment.ogg differ diff --git a/sound/vox_fem/error.ogg b/sound/vox_fem/error.ogg index f8d4e646fc3..44c45e4a99b 100644 Binary files a/sound/vox_fem/error.ogg and b/sound/vox_fem/error.ogg differ diff --git a/sound/vox_fem/escape.ogg b/sound/vox_fem/escape.ogg index a51cde6acb5..5567566d5ae 100644 Binary files a/sound/vox_fem/escape.ogg and b/sound/vox_fem/escape.ogg differ diff --git a/sound/vox_fem/evacuate.ogg b/sound/vox_fem/evacuate.ogg index 7e5fa8b4c89..929f5514a3b 100644 Binary files a/sound/vox_fem/evacuate.ogg and b/sound/vox_fem/evacuate.ogg differ diff --git a/sound/vox_fem/exchange.ogg b/sound/vox_fem/exchange.ogg index 69ae043721a..844fd8e7bbe 100644 Binary files a/sound/vox_fem/exchange.ogg and b/sound/vox_fem/exchange.ogg differ diff --git a/sound/vox_fem/exit.ogg b/sound/vox_fem/exit.ogg index 5722745a572..7a6f5048870 100644 Binary files a/sound/vox_fem/exit.ogg and b/sound/vox_fem/exit.ogg differ diff --git a/sound/vox_fem/expect.ogg b/sound/vox_fem/expect.ogg index 348f7a206b4..e02d7913169 100644 Binary files a/sound/vox_fem/expect.ogg and b/sound/vox_fem/expect.ogg differ diff --git a/sound/vox_fem/experiment.ogg b/sound/vox_fem/experiment.ogg index d45f8741243..7937c16d4d3 100644 Binary files a/sound/vox_fem/experiment.ogg and b/sound/vox_fem/experiment.ogg differ diff --git a/sound/vox_fem/experimental.ogg b/sound/vox_fem/experimental.ogg index 54a7b249b8a..d9b1312603e 100644 Binary files a/sound/vox_fem/experimental.ogg and b/sound/vox_fem/experimental.ogg differ diff --git a/sound/vox_fem/explode.ogg b/sound/vox_fem/explode.ogg index 76e8080b72b..ad026fe0038 100644 Binary files a/sound/vox_fem/explode.ogg and b/sound/vox_fem/explode.ogg differ diff --git a/sound/vox_fem/explosion.ogg b/sound/vox_fem/explosion.ogg index 436e4ca4564..717f55ad63a 100644 Binary files a/sound/vox_fem/explosion.ogg and b/sound/vox_fem/explosion.ogg differ diff --git a/sound/vox_fem/exposure.ogg b/sound/vox_fem/exposure.ogg index c095733623c..c10c8a621da 100644 Binary files a/sound/vox_fem/exposure.ogg and b/sound/vox_fem/exposure.ogg differ diff --git a/sound/vox_fem/exterminate.ogg b/sound/vox_fem/exterminate.ogg index 1629ed336b7..476f16484f5 100644 Binary files a/sound/vox_fem/exterminate.ogg and b/sound/vox_fem/exterminate.ogg differ diff --git a/sound/vox_fem/extinguish.ogg b/sound/vox_fem/extinguish.ogg index 3a1dea1e968..184541bf630 100644 Binary files a/sound/vox_fem/extinguish.ogg and b/sound/vox_fem/extinguish.ogg differ diff --git a/sound/vox_fem/extinguisher.ogg b/sound/vox_fem/extinguisher.ogg index 1048d352298..53afe9584ba 100644 Binary files a/sound/vox_fem/extinguisher.ogg and b/sound/vox_fem/extinguisher.ogg differ diff --git a/sound/vox_fem/extreme.ogg b/sound/vox_fem/extreme.ogg index bdb521203be..73bd6d769fa 100644 Binary files a/sound/vox_fem/extreme.ogg and b/sound/vox_fem/extreme.ogg differ diff --git a/sound/vox_fem/f.ogg b/sound/vox_fem/f.ogg index 7e0955c1b97..edf6d8aa2ed 100644 Binary files a/sound/vox_fem/f.ogg and b/sound/vox_fem/f.ogg differ diff --git a/sound/vox_fem/facility.ogg b/sound/vox_fem/facility.ogg index 9108abcdfef..a9a6992ee9e 100644 Binary files a/sound/vox_fem/facility.ogg and b/sound/vox_fem/facility.ogg differ diff --git a/sound/vox_fem/fahrenheit.ogg b/sound/vox_fem/fahrenheit.ogg index 721778cdd76..5a49a31a29e 100644 Binary files a/sound/vox_fem/fahrenheit.ogg and b/sound/vox_fem/fahrenheit.ogg differ diff --git a/sound/vox_fem/failed.ogg b/sound/vox_fem/failed.ogg index 86f05c79c22..1914ade3c4e 100644 Binary files a/sound/vox_fem/failed.ogg and b/sound/vox_fem/failed.ogg differ diff --git a/sound/vox_fem/failure.ogg b/sound/vox_fem/failure.ogg index 9954642d159..352bce6e45a 100644 Binary files a/sound/vox_fem/failure.ogg and b/sound/vox_fem/failure.ogg differ diff --git a/sound/vox_fem/farthest.ogg b/sound/vox_fem/farthest.ogg index 6df59168130..74216b9a2e1 100644 Binary files a/sound/vox_fem/farthest.ogg and b/sound/vox_fem/farthest.ogg differ diff --git a/sound/vox_fem/fast.ogg b/sound/vox_fem/fast.ogg index 720b1e96ee4..80f7468142c 100644 Binary files a/sound/vox_fem/fast.ogg and b/sound/vox_fem/fast.ogg differ diff --git a/sound/vox_fem/feet.ogg b/sound/vox_fem/feet.ogg index 6060522cb17..b94c99517cd 100644 Binary files a/sound/vox_fem/feet.ogg and b/sound/vox_fem/feet.ogg differ diff --git a/sound/vox_fem/field.ogg b/sound/vox_fem/field.ogg index e992afe4437..89cc50ea826 100644 Binary files a/sound/vox_fem/field.ogg and b/sound/vox_fem/field.ogg differ diff --git a/sound/vox_fem/fifteen.ogg b/sound/vox_fem/fifteen.ogg index 6bedf4cd013..0343d6b3ffe 100644 Binary files a/sound/vox_fem/fifteen.ogg and b/sound/vox_fem/fifteen.ogg differ diff --git a/sound/vox_fem/fifth.ogg b/sound/vox_fem/fifth.ogg index 254496586c1..b8255dad441 100644 Binary files a/sound/vox_fem/fifth.ogg and b/sound/vox_fem/fifth.ogg differ diff --git a/sound/vox_fem/fifty.ogg b/sound/vox_fem/fifty.ogg index b5b23a68451..b71757c7c11 100644 Binary files a/sound/vox_fem/fifty.ogg and b/sound/vox_fem/fifty.ogg differ diff --git a/sound/vox_fem/final.ogg b/sound/vox_fem/final.ogg index 41e15b07251..d1dc9e44ec1 100644 Binary files a/sound/vox_fem/final.ogg and b/sound/vox_fem/final.ogg differ diff --git a/sound/vox_fem/fine.ogg b/sound/vox_fem/fine.ogg index a4fba8f60b5..4737c4259a8 100644 Binary files a/sound/vox_fem/fine.ogg and b/sound/vox_fem/fine.ogg differ diff --git a/sound/vox_fem/fire.ogg b/sound/vox_fem/fire.ogg index 282ca0cef1f..db52a769179 100644 Binary files a/sound/vox_fem/fire.ogg and b/sound/vox_fem/fire.ogg differ diff --git a/sound/vox_fem/first.ogg b/sound/vox_fem/first.ogg index 7da2fc7b7bb..9ef771b1671 100644 Binary files a/sound/vox_fem/first.ogg and b/sound/vox_fem/first.ogg differ diff --git a/sound/vox_fem/five.ogg b/sound/vox_fem/five.ogg index a16bf5bb379..014b7d4251e 100644 Binary files a/sound/vox_fem/five.ogg and b/sound/vox_fem/five.ogg differ diff --git a/sound/vox_fem/flooding.ogg b/sound/vox_fem/flooding.ogg index 9b6d8e91647..a1019a56b99 100644 Binary files a/sound/vox_fem/flooding.ogg and b/sound/vox_fem/flooding.ogg differ diff --git a/sound/vox_fem/floor.ogg b/sound/vox_fem/floor.ogg index e492f452bff..d5d501d4756 100644 Binary files a/sound/vox_fem/floor.ogg and b/sound/vox_fem/floor.ogg differ diff --git a/sound/vox_fem/fool.ogg b/sound/vox_fem/fool.ogg index db0d7fcae77..6b3f5e0fa32 100644 Binary files a/sound/vox_fem/fool.ogg and b/sound/vox_fem/fool.ogg differ diff --git a/sound/vox_fem/for.ogg b/sound/vox_fem/for.ogg index 6345c79edd4..eaf89e5f782 100644 Binary files a/sound/vox_fem/for.ogg and b/sound/vox_fem/for.ogg differ diff --git a/sound/vox_fem/forbidden.ogg b/sound/vox_fem/forbidden.ogg index 0aab3c217cd..4f5fc36bbe7 100644 Binary files a/sound/vox_fem/forbidden.ogg and b/sound/vox_fem/forbidden.ogg differ diff --git a/sound/vox_fem/force.ogg b/sound/vox_fem/force.ogg index df5af5ae98a..575ffb613ed 100644 Binary files a/sound/vox_fem/force.ogg and b/sound/vox_fem/force.ogg differ diff --git a/sound/vox_fem/fore.ogg b/sound/vox_fem/fore.ogg index 6e87fb0dcd1..61f995103b8 100644 Binary files a/sound/vox_fem/fore.ogg and b/sound/vox_fem/fore.ogg differ diff --git a/sound/vox_fem/forms.ogg b/sound/vox_fem/forms.ogg index c82528572a4..2de5796c8d0 100644 Binary files a/sound/vox_fem/forms.ogg and b/sound/vox_fem/forms.ogg differ diff --git a/sound/vox_fem/found.ogg b/sound/vox_fem/found.ogg index 68c0f780122..e6ff55b2421 100644 Binary files a/sound/vox_fem/found.ogg and b/sound/vox_fem/found.ogg differ diff --git a/sound/vox_fem/four.ogg b/sound/vox_fem/four.ogg index e521785972c..a7f16e38ec3 100644 Binary files a/sound/vox_fem/four.ogg and b/sound/vox_fem/four.ogg differ diff --git a/sound/vox_fem/fourteen.ogg b/sound/vox_fem/fourteen.ogg index 464709daa7a..268b18abf95 100644 Binary files a/sound/vox_fem/fourteen.ogg and b/sound/vox_fem/fourteen.ogg differ diff --git a/sound/vox_fem/fourth.ogg b/sound/vox_fem/fourth.ogg index ab85499bd8f..5c867743b5c 100644 Binary files a/sound/vox_fem/fourth.ogg and b/sound/vox_fem/fourth.ogg differ diff --git a/sound/vox_fem/fourty.ogg b/sound/vox_fem/fourty.ogg index d6efec50609..5280d49b2fb 100644 Binary files a/sound/vox_fem/fourty.ogg and b/sound/vox_fem/fourty.ogg differ diff --git a/sound/vox_fem/foxtrot.ogg b/sound/vox_fem/foxtrot.ogg index 94214d1e4b3..4f64b89c489 100644 Binary files a/sound/vox_fem/foxtrot.ogg and b/sound/vox_fem/foxtrot.ogg differ diff --git a/sound/vox_fem/freeman.ogg b/sound/vox_fem/freeman.ogg index bb6b0cfec8b..e94c55fbf21 100644 Binary files a/sound/vox_fem/freeman.ogg and b/sound/vox_fem/freeman.ogg differ diff --git a/sound/vox_fem/freezer.ogg b/sound/vox_fem/freezer.ogg index 78f625abb10..f2f5362b3ed 100644 Binary files a/sound/vox_fem/freezer.ogg and b/sound/vox_fem/freezer.ogg differ diff --git a/sound/vox_fem/from.ogg b/sound/vox_fem/from.ogg index 90a9c1d51d9..eacf7a7c01c 100644 Binary files a/sound/vox_fem/from.ogg and b/sound/vox_fem/from.ogg differ diff --git a/sound/vox_fem/front.ogg b/sound/vox_fem/front.ogg index e8c11d5eba2..748d021e33d 100644 Binary files a/sound/vox_fem/front.ogg and b/sound/vox_fem/front.ogg differ diff --git a/sound/vox_fem/fuck.ogg b/sound/vox_fem/fuck.ogg index 6c9ec75de8c..adc5e48c9ff 100644 Binary files a/sound/vox_fem/fuck.ogg and b/sound/vox_fem/fuck.ogg differ diff --git a/sound/vox_fem/fucking.ogg b/sound/vox_fem/fucking.ogg index 05acbcd6760..1c877c01298 100644 Binary files a/sound/vox_fem/fucking.ogg and b/sound/vox_fem/fucking.ogg differ diff --git a/sound/vox_fem/fucks.ogg b/sound/vox_fem/fucks.ogg index 3e9664a12ac..2b4c0102655 100644 Binary files a/sound/vox_fem/fucks.ogg and b/sound/vox_fem/fucks.ogg differ diff --git a/sound/vox_fem/fuel.ogg b/sound/vox_fem/fuel.ogg index 8e827d8c865..3604ce4c913 100644 Binary files a/sound/vox_fem/fuel.ogg and b/sound/vox_fem/fuel.ogg differ diff --git a/sound/vox_fem/g.ogg b/sound/vox_fem/g.ogg index f171cac1ce3..fccf3f566ad 100644 Binary files a/sound/vox_fem/g.ogg and b/sound/vox_fem/g.ogg differ diff --git a/sound/vox_fem/gas.ogg b/sound/vox_fem/gas.ogg index bbf6ade32d2..a65a8b11b0b 100644 Binary files a/sound/vox_fem/gas.ogg and b/sound/vox_fem/gas.ogg differ diff --git a/sound/vox_fem/get.ogg b/sound/vox_fem/get.ogg index 716eee1a79f..9ae01e8c997 100644 Binary files a/sound/vox_fem/get.ogg and b/sound/vox_fem/get.ogg differ diff --git a/sound/vox_fem/glory.ogg b/sound/vox_fem/glory.ogg index cb166a52a1c..4bf9738844f 100644 Binary files a/sound/vox_fem/glory.ogg and b/sound/vox_fem/glory.ogg differ diff --git a/sound/vox_fem/go.ogg b/sound/vox_fem/go.ogg index b0c93f1cd11..e8ace3d943a 100644 Binary files a/sound/vox_fem/go.ogg and b/sound/vox_fem/go.ogg differ diff --git a/sound/vox_fem/going.ogg b/sound/vox_fem/going.ogg index 3e1d4314b10..3f21184de93 100644 Binary files a/sound/vox_fem/going.ogg and b/sound/vox_fem/going.ogg differ diff --git a/sound/vox_fem/good.ogg b/sound/vox_fem/good.ogg index 5c9d0fd53d1..63760754d50 100644 Binary files a/sound/vox_fem/good.ogg and b/sound/vox_fem/good.ogg differ diff --git a/sound/vox_fem/goodbye.ogg b/sound/vox_fem/goodbye.ogg index 47875554c14..9be827d7a47 100644 Binary files a/sound/vox_fem/goodbye.ogg and b/sound/vox_fem/goodbye.ogg differ diff --git a/sound/vox_fem/gordon.ogg b/sound/vox_fem/gordon.ogg index d63783979b0..586f15063df 100644 Binary files a/sound/vox_fem/gordon.ogg and b/sound/vox_fem/gordon.ogg differ diff --git a/sound/vox_fem/got.ogg b/sound/vox_fem/got.ogg index ac8928c3063..893e9a15697 100644 Binary files a/sound/vox_fem/got.ogg and b/sound/vox_fem/got.ogg differ diff --git a/sound/vox_fem/government.ogg b/sound/vox_fem/government.ogg index 04b9138e335..581e92c9184 100644 Binary files a/sound/vox_fem/government.ogg and b/sound/vox_fem/government.ogg differ diff --git a/sound/vox_fem/granted.ogg b/sound/vox_fem/granted.ogg index 349efb3d3a1..f7d73456073 100644 Binary files a/sound/vox_fem/granted.ogg and b/sound/vox_fem/granted.ogg differ diff --git a/sound/vox_fem/gray.ogg b/sound/vox_fem/gray.ogg index cab850b882b..11e2e143f29 100644 Binary files a/sound/vox_fem/gray.ogg and b/sound/vox_fem/gray.ogg differ diff --git a/sound/vox_fem/great.ogg b/sound/vox_fem/great.ogg index d3748034488..b88d5eb40d4 100644 Binary files a/sound/vox_fem/great.ogg and b/sound/vox_fem/great.ogg differ diff --git a/sound/vox_fem/green.ogg b/sound/vox_fem/green.ogg index 982f45ff024..45d82c59c92 100644 Binary files a/sound/vox_fem/green.ogg and b/sound/vox_fem/green.ogg differ diff --git a/sound/vox_fem/grenade.ogg b/sound/vox_fem/grenade.ogg index 63b3afe2428..de9050bc91c 100644 Binary files a/sound/vox_fem/grenade.ogg and b/sound/vox_fem/grenade.ogg differ diff --git a/sound/vox_fem/guard.ogg b/sound/vox_fem/guard.ogg index 6a218ff1c40..1fc69a3499a 100644 Binary files a/sound/vox_fem/guard.ogg and b/sound/vox_fem/guard.ogg differ diff --git a/sound/vox_fem/gulf.ogg b/sound/vox_fem/gulf.ogg index 71e2d1782e4..0237ae19c05 100644 Binary files a/sound/vox_fem/gulf.ogg and b/sound/vox_fem/gulf.ogg differ diff --git a/sound/vox_fem/gun.ogg b/sound/vox_fem/gun.ogg index 294ea6099cf..7d2195b4c5d 100644 Binary files a/sound/vox_fem/gun.ogg and b/sound/vox_fem/gun.ogg differ diff --git a/sound/vox_fem/guthrie.ogg b/sound/vox_fem/guthrie.ogg index 879a0ba203c..1b7e5b6ae47 100644 Binary files a/sound/vox_fem/guthrie.ogg and b/sound/vox_fem/guthrie.ogg differ diff --git a/sound/vox_fem/h.ogg b/sound/vox_fem/h.ogg index c890be8112c..837d5ce44ce 100644 Binary files a/sound/vox_fem/h.ogg and b/sound/vox_fem/h.ogg differ diff --git a/sound/vox_fem/hacker.ogg b/sound/vox_fem/hacker.ogg index e3b71218ec0..16e1fbffebc 100644 Binary files a/sound/vox_fem/hacker.ogg and b/sound/vox_fem/hacker.ogg differ diff --git a/sound/vox_fem/hackers.ogg b/sound/vox_fem/hackers.ogg index 4b626a75373..f2d1a8b5e67 100644 Binary files a/sound/vox_fem/hackers.ogg and b/sound/vox_fem/hackers.ogg differ diff --git a/sound/vox_fem/handling.ogg b/sound/vox_fem/handling.ogg index f2b3864f6e6..91d6e879bae 100644 Binary files a/sound/vox_fem/handling.ogg and b/sound/vox_fem/handling.ogg differ diff --git a/sound/vox_fem/hangar.ogg b/sound/vox_fem/hangar.ogg index 22fc18babf7..c7add659889 100644 Binary files a/sound/vox_fem/hangar.ogg and b/sound/vox_fem/hangar.ogg differ diff --git a/sound/vox_fem/harm.ogg b/sound/vox_fem/harm.ogg index 7d021003ce9..777935ecf39 100644 Binary files a/sound/vox_fem/harm.ogg and b/sound/vox_fem/harm.ogg differ diff --git a/sound/vox_fem/has.ogg b/sound/vox_fem/has.ogg index 1e06d016977..a094d6017de 100644 Binary files a/sound/vox_fem/has.ogg and b/sound/vox_fem/has.ogg differ diff --git a/sound/vox_fem/have.ogg b/sound/vox_fem/have.ogg index 00530d867a4..df454d1168c 100644 Binary files a/sound/vox_fem/have.ogg and b/sound/vox_fem/have.ogg differ diff --git a/sound/vox_fem/hazard.ogg b/sound/vox_fem/hazard.ogg index 2d82b71f0a7..864acfd0b0f 100644 Binary files a/sound/vox_fem/hazard.ogg and b/sound/vox_fem/hazard.ogg differ diff --git a/sound/vox_fem/head.ogg b/sound/vox_fem/head.ogg index 8ef0d3afdbb..ae99aaf3fab 100644 Binary files a/sound/vox_fem/head.ogg and b/sound/vox_fem/head.ogg differ diff --git a/sound/vox_fem/health.ogg b/sound/vox_fem/health.ogg index 05a53ab599a..23022948442 100644 Binary files a/sound/vox_fem/health.ogg and b/sound/vox_fem/health.ogg differ diff --git a/sound/vox_fem/heat.ogg b/sound/vox_fem/heat.ogg index 4c87acba207..d83892a4c3d 100644 Binary files a/sound/vox_fem/heat.ogg and b/sound/vox_fem/heat.ogg differ diff --git a/sound/vox_fem/helicopter.ogg b/sound/vox_fem/helicopter.ogg index d92ae453357..3e7ecac435f 100644 Binary files a/sound/vox_fem/helicopter.ogg and b/sound/vox_fem/helicopter.ogg differ diff --git a/sound/vox_fem/helium.ogg b/sound/vox_fem/helium.ogg index f78efbebedf..3cf5c1638a2 100644 Binary files a/sound/vox_fem/helium.ogg and b/sound/vox_fem/helium.ogg differ diff --git a/sound/vox_fem/hello.ogg b/sound/vox_fem/hello.ogg index 2e8f2b55893..3122f275113 100644 Binary files a/sound/vox_fem/hello.ogg and b/sound/vox_fem/hello.ogg differ diff --git a/sound/vox_fem/help.ogg b/sound/vox_fem/help.ogg index de5ecafdb7d..221aec588ad 100644 Binary files a/sound/vox_fem/help.ogg and b/sound/vox_fem/help.ogg differ diff --git a/sound/vox_fem/here.ogg b/sound/vox_fem/here.ogg index 98148ef4020..974c80b862a 100644 Binary files a/sound/vox_fem/here.ogg and b/sound/vox_fem/here.ogg differ diff --git a/sound/vox_fem/hide.ogg b/sound/vox_fem/hide.ogg index a4710dc43c2..41a3556c359 100644 Binary files a/sound/vox_fem/hide.ogg and b/sound/vox_fem/hide.ogg differ diff --git a/sound/vox_fem/high.ogg b/sound/vox_fem/high.ogg index 885a6978055..29569f6a7ae 100644 Binary files a/sound/vox_fem/high.ogg and b/sound/vox_fem/high.ogg differ diff --git a/sound/vox_fem/highest.ogg b/sound/vox_fem/highest.ogg index 7a0c954ffbe..c59ff592164 100644 Binary files a/sound/vox_fem/highest.ogg and b/sound/vox_fem/highest.ogg differ diff --git a/sound/vox_fem/hit.ogg b/sound/vox_fem/hit.ogg index 1a6919bbf65..47cbbab958d 100644 Binary files a/sound/vox_fem/hit.ogg and b/sound/vox_fem/hit.ogg differ diff --git a/sound/vox_fem/hole.ogg b/sound/vox_fem/hole.ogg index 347a5747270..4507339b197 100644 Binary files a/sound/vox_fem/hole.ogg and b/sound/vox_fem/hole.ogg differ diff --git a/sound/vox_fem/hostile.ogg b/sound/vox_fem/hostile.ogg index be50c44607b..cad5232be5c 100644 Binary files a/sound/vox_fem/hostile.ogg and b/sound/vox_fem/hostile.ogg differ diff --git a/sound/vox_fem/hot.ogg b/sound/vox_fem/hot.ogg index 4aec99e9331..b56cab99425 100644 Binary files a/sound/vox_fem/hot.ogg and b/sound/vox_fem/hot.ogg differ diff --git a/sound/vox_fem/hotel.ogg b/sound/vox_fem/hotel.ogg index 8449e5a33d3..54f3297485a 100644 Binary files a/sound/vox_fem/hotel.ogg and b/sound/vox_fem/hotel.ogg differ diff --git a/sound/vox_fem/hour.ogg b/sound/vox_fem/hour.ogg index 7392d54b929..963b2a1f119 100644 Binary files a/sound/vox_fem/hour.ogg and b/sound/vox_fem/hour.ogg differ diff --git a/sound/vox_fem/hours.ogg b/sound/vox_fem/hours.ogg index 927b5679879..516adc16fad 100644 Binary files a/sound/vox_fem/hours.ogg and b/sound/vox_fem/hours.ogg differ diff --git a/sound/vox_fem/human.ogg b/sound/vox_fem/human.ogg index 7f7c5ed2728..247164486f2 100644 Binary files a/sound/vox_fem/human.ogg and b/sound/vox_fem/human.ogg differ diff --git a/sound/vox_fem/hundred.ogg b/sound/vox_fem/hundred.ogg index 5554a95a2ba..bdee8e497f4 100644 Binary files a/sound/vox_fem/hundred.ogg and b/sound/vox_fem/hundred.ogg differ diff --git a/sound/vox_fem/hunger.ogg b/sound/vox_fem/hunger.ogg index b29083a01ee..52de984e6ea 100644 Binary files a/sound/vox_fem/hunger.ogg and b/sound/vox_fem/hunger.ogg differ diff --git a/sound/vox_fem/hydro.ogg b/sound/vox_fem/hydro.ogg index e9fefb59d28..e371348a803 100644 Binary files a/sound/vox_fem/hydro.ogg and b/sound/vox_fem/hydro.ogg differ diff --git a/sound/vox_fem/hydroponics.ogg b/sound/vox_fem/hydroponics.ogg index 531b5ebcc78..b82884ad7de 100644 Binary files a/sound/vox_fem/hydroponics.ogg and b/sound/vox_fem/hydroponics.ogg differ diff --git a/sound/vox_fem/i.ogg b/sound/vox_fem/i.ogg index b939b51bb02..4184feccea2 100644 Binary files a/sound/vox_fem/i.ogg and b/sound/vox_fem/i.ogg differ diff --git a/sound/vox_fem/idiot.ogg b/sound/vox_fem/idiot.ogg index 67683c80de7..54539dc84db 100644 Binary files a/sound/vox_fem/idiot.ogg and b/sound/vox_fem/idiot.ogg differ diff --git a/sound/vox_fem/illegal.ogg b/sound/vox_fem/illegal.ogg index be6181d5f34..efc7a24f31c 100644 Binary files a/sound/vox_fem/illegal.ogg and b/sound/vox_fem/illegal.ogg differ diff --git a/sound/vox_fem/immediate.ogg b/sound/vox_fem/immediate.ogg index d0253cbadd4..589cb64d425 100644 Binary files a/sound/vox_fem/immediate.ogg and b/sound/vox_fem/immediate.ogg differ diff --git a/sound/vox_fem/immediately.ogg b/sound/vox_fem/immediately.ogg index c7dc6237248..0fb1a653e13 100644 Binary files a/sound/vox_fem/immediately.ogg and b/sound/vox_fem/immediately.ogg differ diff --git a/sound/vox_fem/in.ogg b/sound/vox_fem/in.ogg index 6548a0276bb..5620518d9f0 100644 Binary files a/sound/vox_fem/in.ogg and b/sound/vox_fem/in.ogg differ diff --git a/sound/vox_fem/inches.ogg b/sound/vox_fem/inches.ogg index 17b44126367..77a5a9f8ed9 100644 Binary files a/sound/vox_fem/inches.ogg and b/sound/vox_fem/inches.ogg differ diff --git a/sound/vox_fem/india.ogg b/sound/vox_fem/india.ogg index 3740ab7bb02..c9db0e71a1c 100644 Binary files a/sound/vox_fem/india.ogg and b/sound/vox_fem/india.ogg differ diff --git a/sound/vox_fem/ing.ogg b/sound/vox_fem/ing.ogg index ede58ecacbe..9373505f277 100644 Binary files a/sound/vox_fem/ing.ogg and b/sound/vox_fem/ing.ogg differ diff --git a/sound/vox_fem/inoperative.ogg b/sound/vox_fem/inoperative.ogg index 545b48b7a5a..09db3ab0625 100644 Binary files a/sound/vox_fem/inoperative.ogg and b/sound/vox_fem/inoperative.ogg differ diff --git a/sound/vox_fem/inside.ogg b/sound/vox_fem/inside.ogg index 865def0e7ba..4524e2b4529 100644 Binary files a/sound/vox_fem/inside.ogg and b/sound/vox_fem/inside.ogg differ diff --git a/sound/vox_fem/inspection.ogg b/sound/vox_fem/inspection.ogg index 69158e93237..93af36a4157 100644 Binary files a/sound/vox_fem/inspection.ogg and b/sound/vox_fem/inspection.ogg differ diff --git a/sound/vox_fem/inspector.ogg b/sound/vox_fem/inspector.ogg index 7da688b7f49..b18db6ab2bf 100644 Binary files a/sound/vox_fem/inspector.ogg and b/sound/vox_fem/inspector.ogg differ diff --git a/sound/vox_fem/interchange.ogg b/sound/vox_fem/interchange.ogg index a8f7dc77604..29028b2223a 100644 Binary files a/sound/vox_fem/interchange.ogg and b/sound/vox_fem/interchange.ogg differ diff --git a/sound/vox_fem/intruder.ogg b/sound/vox_fem/intruder.ogg index b77af2c2e4e..766980da4b0 100644 Binary files a/sound/vox_fem/intruder.ogg and b/sound/vox_fem/intruder.ogg differ diff --git a/sound/vox_fem/invalid.ogg b/sound/vox_fem/invalid.ogg index 7b7528c3574..beb8b66e8e8 100644 Binary files a/sound/vox_fem/invalid.ogg and b/sound/vox_fem/invalid.ogg differ diff --git a/sound/vox_fem/invasion.ogg b/sound/vox_fem/invasion.ogg index f4c2e333c02..9a73e827f8b 100644 Binary files a/sound/vox_fem/invasion.ogg and b/sound/vox_fem/invasion.ogg differ diff --git a/sound/vox_fem/is.ogg b/sound/vox_fem/is.ogg index 9980a72fc28..d8b1d6a1e7c 100644 Binary files a/sound/vox_fem/is.ogg and b/sound/vox_fem/is.ogg differ diff --git a/sound/vox_fem/it.ogg b/sound/vox_fem/it.ogg index c496303ba78..f0a09d7083c 100644 Binary files a/sound/vox_fem/it.ogg and b/sound/vox_fem/it.ogg differ diff --git a/sound/vox_fem/j.ogg b/sound/vox_fem/j.ogg index 9600aeb5008..bcf17e34a18 100644 Binary files a/sound/vox_fem/j.ogg and b/sound/vox_fem/j.ogg differ diff --git a/sound/vox_fem/johnson.ogg b/sound/vox_fem/johnson.ogg index 6372ae2193d..4b95210e8ff 100644 Binary files a/sound/vox_fem/johnson.ogg and b/sound/vox_fem/johnson.ogg differ diff --git a/sound/vox_fem/juliet.ogg b/sound/vox_fem/juliet.ogg index 5b9a349e8b7..c93e5a453bc 100644 Binary files a/sound/vox_fem/juliet.ogg and b/sound/vox_fem/juliet.ogg differ diff --git a/sound/vox_fem/k.ogg b/sound/vox_fem/k.ogg index ba71718e48b..4e791416bd4 100644 Binary files a/sound/vox_fem/k.ogg and b/sound/vox_fem/k.ogg differ diff --git a/sound/vox_fem/key.ogg b/sound/vox_fem/key.ogg index 165bd1f5071..d4abd3cdbdd 100644 Binary files a/sound/vox_fem/key.ogg and b/sound/vox_fem/key.ogg differ diff --git a/sound/vox_fem/kill.ogg b/sound/vox_fem/kill.ogg index fada11b05ff..3d9d0f58fce 100644 Binary files a/sound/vox_fem/kill.ogg and b/sound/vox_fem/kill.ogg differ diff --git a/sound/vox_fem/kilo.ogg b/sound/vox_fem/kilo.ogg index 460f249126f..b00875f0ea7 100644 Binary files a/sound/vox_fem/kilo.ogg and b/sound/vox_fem/kilo.ogg differ diff --git a/sound/vox_fem/kit.ogg b/sound/vox_fem/kit.ogg index a6719303069..9f9b0fee205 100644 Binary files a/sound/vox_fem/kit.ogg and b/sound/vox_fem/kit.ogg differ diff --git a/sound/vox_fem/l.ogg b/sound/vox_fem/l.ogg index 14e830e54fd..d32e84f8b6f 100644 Binary files a/sound/vox_fem/l.ogg and b/sound/vox_fem/l.ogg differ diff --git a/sound/vox_fem/lab.ogg b/sound/vox_fem/lab.ogg index 888a4863148..1e5e48f4ddc 100644 Binary files a/sound/vox_fem/lab.ogg and b/sound/vox_fem/lab.ogg differ diff --git a/sound/vox_fem/lambda.ogg b/sound/vox_fem/lambda.ogg index 75f88be2e0a..111041cb521 100644 Binary files a/sound/vox_fem/lambda.ogg and b/sound/vox_fem/lambda.ogg differ diff --git a/sound/vox_fem/laser.ogg b/sound/vox_fem/laser.ogg index f169bf4d827..93b5d9fd5b9 100644 Binary files a/sound/vox_fem/laser.ogg and b/sound/vox_fem/laser.ogg differ diff --git a/sound/vox_fem/last.ogg b/sound/vox_fem/last.ogg index b257fdafe88..a9e1703d78c 100644 Binary files a/sound/vox_fem/last.ogg and b/sound/vox_fem/last.ogg differ diff --git a/sound/vox_fem/launch.ogg b/sound/vox_fem/launch.ogg index 8f2cfc5943c..03319bb3a8f 100644 Binary files a/sound/vox_fem/launch.ogg and b/sound/vox_fem/launch.ogg differ diff --git a/sound/vox_fem/law.ogg b/sound/vox_fem/law.ogg index 2003dc273e7..1d78bb78c91 100644 Binary files a/sound/vox_fem/law.ogg and b/sound/vox_fem/law.ogg differ diff --git a/sound/vox_fem/laws.ogg b/sound/vox_fem/laws.ogg index c7a0cda09c3..78064715860 100644 Binary files a/sound/vox_fem/laws.ogg and b/sound/vox_fem/laws.ogg differ diff --git a/sound/vox_fem/leak.ogg b/sound/vox_fem/leak.ogg index 60218fad015..ac2966daffb 100644 Binary files a/sound/vox_fem/leak.ogg and b/sound/vox_fem/leak.ogg differ diff --git a/sound/vox_fem/leave.ogg b/sound/vox_fem/leave.ogg index 32dbe83fa55..023d6ccec9d 100644 Binary files a/sound/vox_fem/leave.ogg and b/sound/vox_fem/leave.ogg differ diff --git a/sound/vox_fem/left.ogg b/sound/vox_fem/left.ogg index 7045d052fdb..bab8c25f963 100644 Binary files a/sound/vox_fem/left.ogg and b/sound/vox_fem/left.ogg differ diff --git a/sound/vox_fem/legal.ogg b/sound/vox_fem/legal.ogg index b5a8a007110..89d11ae6a1e 100644 Binary files a/sound/vox_fem/legal.ogg and b/sound/vox_fem/legal.ogg differ diff --git a/sound/vox_fem/level.ogg b/sound/vox_fem/level.ogg index ed6aebb8bd9..d2a38d01605 100644 Binary files a/sound/vox_fem/level.ogg and b/sound/vox_fem/level.ogg differ diff --git a/sound/vox_fem/lever.ogg b/sound/vox_fem/lever.ogg index 8dd8ba644d7..e21aa7521d8 100644 Binary files a/sound/vox_fem/lever.ogg and b/sound/vox_fem/lever.ogg differ diff --git a/sound/vox_fem/lie.ogg b/sound/vox_fem/lie.ogg index f9b9f705fbf..bf78bfde8bc 100644 Binary files a/sound/vox_fem/lie.ogg and b/sound/vox_fem/lie.ogg differ diff --git a/sound/vox_fem/lieutenant.ogg b/sound/vox_fem/lieutenant.ogg index 137aa4eb1f8..bdc3aa05ef1 100644 Binary files a/sound/vox_fem/lieutenant.ogg and b/sound/vox_fem/lieutenant.ogg differ diff --git a/sound/vox_fem/life.ogg b/sound/vox_fem/life.ogg index d390ce55b81..a445c04df42 100644 Binary files a/sound/vox_fem/life.ogg and b/sound/vox_fem/life.ogg differ diff --git a/sound/vox_fem/light.ogg b/sound/vox_fem/light.ogg index 950d2989bac..b3514dfc55a 100644 Binary files a/sound/vox_fem/light.ogg and b/sound/vox_fem/light.ogg differ diff --git a/sound/vox_fem/lima.ogg b/sound/vox_fem/lima.ogg index a1bb5740f6d..4870bbe9505 100644 Binary files a/sound/vox_fem/lima.ogg and b/sound/vox_fem/lima.ogg differ diff --git a/sound/vox_fem/liquid.ogg b/sound/vox_fem/liquid.ogg index 3d385edabc1..8c071731257 100644 Binary files a/sound/vox_fem/liquid.ogg and b/sound/vox_fem/liquid.ogg differ diff --git a/sound/vox_fem/loading.ogg b/sound/vox_fem/loading.ogg index b4ff9015ca7..f3cca6e4827 100644 Binary files a/sound/vox_fem/loading.ogg and b/sound/vox_fem/loading.ogg differ diff --git a/sound/vox_fem/locate.ogg b/sound/vox_fem/locate.ogg index 513e38a225e..47d4e442bfb 100644 Binary files a/sound/vox_fem/locate.ogg and b/sound/vox_fem/locate.ogg differ diff --git a/sound/vox_fem/located.ogg b/sound/vox_fem/located.ogg index 2948ea615b9..2bf7cc84cb0 100644 Binary files a/sound/vox_fem/located.ogg and b/sound/vox_fem/located.ogg differ diff --git a/sound/vox_fem/location.ogg b/sound/vox_fem/location.ogg index 282b6f64f74..5b9466f5e2a 100644 Binary files a/sound/vox_fem/location.ogg and b/sound/vox_fem/location.ogg differ diff --git a/sound/vox_fem/lock.ogg b/sound/vox_fem/lock.ogg index 1649f7f4e03..1e6b9e66c55 100644 Binary files a/sound/vox_fem/lock.ogg and b/sound/vox_fem/lock.ogg differ diff --git a/sound/vox_fem/locked.ogg b/sound/vox_fem/locked.ogg index c5a4ef2ba88..e704c91cd57 100644 Binary files a/sound/vox_fem/locked.ogg and b/sound/vox_fem/locked.ogg differ diff --git a/sound/vox_fem/locker.ogg b/sound/vox_fem/locker.ogg index 14083a1115a..33a4d8172bf 100644 Binary files a/sound/vox_fem/locker.ogg and b/sound/vox_fem/locker.ogg differ diff --git a/sound/vox_fem/lockout.ogg b/sound/vox_fem/lockout.ogg index b1b9d9db17a..a49f98b0ccb 100644 Binary files a/sound/vox_fem/lockout.ogg and b/sound/vox_fem/lockout.ogg differ diff --git a/sound/vox_fem/loose.ogg b/sound/vox_fem/loose.ogg index 695834739e8..99434ebf140 100644 Binary files a/sound/vox_fem/loose.ogg and b/sound/vox_fem/loose.ogg differ diff --git a/sound/vox_fem/lower.ogg b/sound/vox_fem/lower.ogg index 44b01488a56..30b78e0e175 100644 Binary files a/sound/vox_fem/lower.ogg and b/sound/vox_fem/lower.ogg differ diff --git a/sound/vox_fem/lowest.ogg b/sound/vox_fem/lowest.ogg index 833d738b725..bac548f7c80 100644 Binary files a/sound/vox_fem/lowest.ogg and b/sound/vox_fem/lowest.ogg differ diff --git a/sound/vox_fem/m.ogg b/sound/vox_fem/m.ogg index 99c8bc3031b..f80354f00d2 100644 Binary files a/sound/vox_fem/m.ogg and b/sound/vox_fem/m.ogg differ diff --git a/sound/vox_fem/magnetic.ogg b/sound/vox_fem/magnetic.ogg index 23ddae5b63a..453363e076d 100644 Binary files a/sound/vox_fem/magnetic.ogg and b/sound/vox_fem/magnetic.ogg differ diff --git a/sound/vox_fem/main.ogg b/sound/vox_fem/main.ogg index ab8edf45ff0..f95b10ddd5c 100644 Binary files a/sound/vox_fem/main.ogg and b/sound/vox_fem/main.ogg differ diff --git a/sound/vox_fem/maintenance.ogg b/sound/vox_fem/maintenance.ogg index 8b08a15c073..7dd53dc47fb 100644 Binary files a/sound/vox_fem/maintenance.ogg and b/sound/vox_fem/maintenance.ogg differ diff --git a/sound/vox_fem/malfunction.ogg b/sound/vox_fem/malfunction.ogg index 5cc6cf5012b..df1655ca064 100644 Binary files a/sound/vox_fem/malfunction.ogg and b/sound/vox_fem/malfunction.ogg differ diff --git a/sound/vox_fem/man.ogg b/sound/vox_fem/man.ogg index c9ef267aa27..ec48fe61cb3 100644 Binary files a/sound/vox_fem/man.ogg and b/sound/vox_fem/man.ogg differ diff --git a/sound/vox_fem/mass.ogg b/sound/vox_fem/mass.ogg index 58b1922554e..5a71a33f07f 100644 Binary files a/sound/vox_fem/mass.ogg and b/sound/vox_fem/mass.ogg differ diff --git a/sound/vox_fem/materials.ogg b/sound/vox_fem/materials.ogg index 11d33380dda..250e678114a 100644 Binary files a/sound/vox_fem/materials.ogg and b/sound/vox_fem/materials.ogg differ diff --git a/sound/vox_fem/maximum.ogg b/sound/vox_fem/maximum.ogg index 5b4e06a7140..6b39bf1614d 100644 Binary files a/sound/vox_fem/maximum.ogg and b/sound/vox_fem/maximum.ogg differ diff --git a/sound/vox_fem/may.ogg b/sound/vox_fem/may.ogg index dd279d1f0dd..0739b28b26b 100644 Binary files a/sound/vox_fem/may.ogg and b/sound/vox_fem/may.ogg differ diff --git a/sound/vox_fem/me.ogg b/sound/vox_fem/me.ogg index 9fd2ae66da5..c96355b58d6 100644 Binary files a/sound/vox_fem/me.ogg and b/sound/vox_fem/me.ogg differ diff --git a/sound/vox_fem/medbay.ogg b/sound/vox_fem/medbay.ogg index 2d88b709d34..e16b458ab67 100644 Binary files a/sound/vox_fem/medbay.ogg and b/sound/vox_fem/medbay.ogg differ diff --git a/sound/vox_fem/medical.ogg b/sound/vox_fem/medical.ogg index 75e1a82a0ea..66b24a5d3f1 100644 Binary files a/sound/vox_fem/medical.ogg and b/sound/vox_fem/medical.ogg differ diff --git a/sound/vox_fem/men.ogg b/sound/vox_fem/men.ogg index ac59df5bba8..f3a9588adab 100644 Binary files a/sound/vox_fem/men.ogg and b/sound/vox_fem/men.ogg differ diff --git a/sound/vox_fem/mercy.ogg b/sound/vox_fem/mercy.ogg index d01c2599805..8cdba6a2571 100644 Binary files a/sound/vox_fem/mercy.ogg and b/sound/vox_fem/mercy.ogg differ diff --git a/sound/vox_fem/mesa.ogg b/sound/vox_fem/mesa.ogg index dbe2033b9a3..de69e00c8f3 100644 Binary files a/sound/vox_fem/mesa.ogg and b/sound/vox_fem/mesa.ogg differ diff --git a/sound/vox_fem/message.ogg b/sound/vox_fem/message.ogg index b57f5d60463..83eeb175d07 100644 Binary files a/sound/vox_fem/message.ogg and b/sound/vox_fem/message.ogg differ diff --git a/sound/vox_fem/meter.ogg b/sound/vox_fem/meter.ogg index 4503186a137..ba0e43ab9b7 100644 Binary files a/sound/vox_fem/meter.ogg and b/sound/vox_fem/meter.ogg differ diff --git a/sound/vox_fem/micro.ogg b/sound/vox_fem/micro.ogg index 67a5ad50c61..502bce58aae 100644 Binary files a/sound/vox_fem/micro.ogg and b/sound/vox_fem/micro.ogg differ diff --git a/sound/vox_fem/middle.ogg b/sound/vox_fem/middle.ogg index 0ebaddd9b34..429b39857f8 100644 Binary files a/sound/vox_fem/middle.ogg and b/sound/vox_fem/middle.ogg differ diff --git a/sound/vox_fem/mike.ogg b/sound/vox_fem/mike.ogg index a3d5f00b272..75a1549c6fa 100644 Binary files a/sound/vox_fem/mike.ogg and b/sound/vox_fem/mike.ogg differ diff --git a/sound/vox_fem/miles.ogg b/sound/vox_fem/miles.ogg index ef0e7a54b94..0de3bd36c71 100644 Binary files a/sound/vox_fem/miles.ogg and b/sound/vox_fem/miles.ogg differ diff --git a/sound/vox_fem/military.ogg b/sound/vox_fem/military.ogg index 281640fd701..0ff33b82340 100644 Binary files a/sound/vox_fem/military.ogg and b/sound/vox_fem/military.ogg differ diff --git a/sound/vox_fem/milli.ogg b/sound/vox_fem/milli.ogg index 8d9b9b147f8..4713bac1cdb 100644 Binary files a/sound/vox_fem/milli.ogg and b/sound/vox_fem/milli.ogg differ diff --git a/sound/vox_fem/million.ogg b/sound/vox_fem/million.ogg index 560a77a8a8e..dadcffc3ff9 100644 Binary files a/sound/vox_fem/million.ogg and b/sound/vox_fem/million.ogg differ diff --git a/sound/vox_fem/minefield.ogg b/sound/vox_fem/minefield.ogg index fe21d05dd4a..b4f1d013709 100644 Binary files a/sound/vox_fem/minefield.ogg and b/sound/vox_fem/minefield.ogg differ diff --git a/sound/vox_fem/minimum.ogg b/sound/vox_fem/minimum.ogg index 90767598fff..39b7e1439c8 100644 Binary files a/sound/vox_fem/minimum.ogg and b/sound/vox_fem/minimum.ogg differ diff --git a/sound/vox_fem/minutes.ogg b/sound/vox_fem/minutes.ogg index 665eb0d6308..f1eb19eb742 100644 Binary files a/sound/vox_fem/minutes.ogg and b/sound/vox_fem/minutes.ogg differ diff --git a/sound/vox_fem/mister.ogg b/sound/vox_fem/mister.ogg index 15cc27ddfbb..97fdde4c188 100644 Binary files a/sound/vox_fem/mister.ogg and b/sound/vox_fem/mister.ogg differ diff --git a/sound/vox_fem/mode.ogg b/sound/vox_fem/mode.ogg index 9aaf6470994..b585fc4a097 100644 Binary files a/sound/vox_fem/mode.ogg and b/sound/vox_fem/mode.ogg differ diff --git a/sound/vox_fem/money.ogg b/sound/vox_fem/money.ogg index 917f601c74d..ad054a71301 100644 Binary files a/sound/vox_fem/money.ogg and b/sound/vox_fem/money.ogg differ diff --git a/sound/vox_fem/motor.ogg b/sound/vox_fem/motor.ogg index 558ed877d9d..9a78193b464 100644 Binary files a/sound/vox_fem/motor.ogg and b/sound/vox_fem/motor.ogg differ diff --git a/sound/vox_fem/motorpool.ogg b/sound/vox_fem/motorpool.ogg index 82ff9146efc..4dcbdc6e9d3 100644 Binary files a/sound/vox_fem/motorpool.ogg and b/sound/vox_fem/motorpool.ogg differ diff --git a/sound/vox_fem/move.ogg b/sound/vox_fem/move.ogg index c467fc848e5..1f9ef74e546 100644 Binary files a/sound/vox_fem/move.ogg and b/sound/vox_fem/move.ogg differ diff --git a/sound/vox_fem/must.ogg b/sound/vox_fem/must.ogg index fb4c2c44cb6..54d4ffe53a5 100644 Binary files a/sound/vox_fem/must.ogg and b/sound/vox_fem/must.ogg differ diff --git a/sound/vox_fem/my.ogg b/sound/vox_fem/my.ogg index 429c43be7e6..fc6ae2366a0 100644 Binary files a/sound/vox_fem/my.ogg and b/sound/vox_fem/my.ogg differ diff --git a/sound/vox_fem/n.ogg b/sound/vox_fem/n.ogg index e9d4a5d8739..e0c396f5476 100644 Binary files a/sound/vox_fem/n.ogg and b/sound/vox_fem/n.ogg differ diff --git a/sound/vox_fem/nanotrasen.ogg b/sound/vox_fem/nanotrasen.ogg index 11a664c2116..10aa196c4ed 100644 Binary files a/sound/vox_fem/nanotrasen.ogg and b/sound/vox_fem/nanotrasen.ogg differ diff --git a/sound/vox_fem/nearest.ogg b/sound/vox_fem/nearest.ogg index 897ffa8c1ab..c11a89d9953 100644 Binary files a/sound/vox_fem/nearest.ogg and b/sound/vox_fem/nearest.ogg differ diff --git a/sound/vox_fem/nice.ogg b/sound/vox_fem/nice.ogg index 6136864cf33..e800e84d00f 100644 Binary files a/sound/vox_fem/nice.ogg and b/sound/vox_fem/nice.ogg differ diff --git a/sound/vox_fem/nine.ogg b/sound/vox_fem/nine.ogg index 4b1d67a55a6..86601bfa1ec 100644 Binary files a/sound/vox_fem/nine.ogg and b/sound/vox_fem/nine.ogg differ diff --git a/sound/vox_fem/nineteen.ogg b/sound/vox_fem/nineteen.ogg index 10a3b9c4871..d28d7b15b64 100644 Binary files a/sound/vox_fem/nineteen.ogg and b/sound/vox_fem/nineteen.ogg differ diff --git a/sound/vox_fem/ninety.ogg b/sound/vox_fem/ninety.ogg index f7432335506..ad5a1c1b42d 100644 Binary files a/sound/vox_fem/ninety.ogg and b/sound/vox_fem/ninety.ogg differ diff --git a/sound/vox_fem/no.ogg b/sound/vox_fem/no.ogg index 97605a78012..8eee9df35fb 100644 Binary files a/sound/vox_fem/no.ogg and b/sound/vox_fem/no.ogg differ diff --git a/sound/vox_fem/nominal.ogg b/sound/vox_fem/nominal.ogg index f0a86173b91..f6fb6736e71 100644 Binary files a/sound/vox_fem/nominal.ogg and b/sound/vox_fem/nominal.ogg differ diff --git a/sound/vox_fem/north.ogg b/sound/vox_fem/north.ogg index 01ebc8c57c7..7efef865cf8 100644 Binary files a/sound/vox_fem/north.ogg and b/sound/vox_fem/north.ogg differ diff --git a/sound/vox_fem/not.ogg b/sound/vox_fem/not.ogg index 21e86303947..b5cd9e5f55a 100644 Binary files a/sound/vox_fem/not.ogg and b/sound/vox_fem/not.ogg differ diff --git a/sound/vox_fem/november.ogg b/sound/vox_fem/november.ogg index 7b54ead3856..403b9160f7a 100644 Binary files a/sound/vox_fem/november.ogg and b/sound/vox_fem/november.ogg differ diff --git a/sound/vox_fem/now.ogg b/sound/vox_fem/now.ogg index 4d292fea76a..f5d4df71936 100644 Binary files a/sound/vox_fem/now.ogg and b/sound/vox_fem/now.ogg differ diff --git a/sound/vox_fem/number.ogg b/sound/vox_fem/number.ogg index b13e087ed1d..afa6bb45950 100644 Binary files a/sound/vox_fem/number.ogg and b/sound/vox_fem/number.ogg differ diff --git a/sound/vox_fem/o.ogg b/sound/vox_fem/o.ogg index 0e612ab944e..09fc769dd98 100644 Binary files a/sound/vox_fem/o.ogg and b/sound/vox_fem/o.ogg differ diff --git a/sound/vox_fem/objective.ogg b/sound/vox_fem/objective.ogg index bc4616c94bd..ecfacb733ec 100644 Binary files a/sound/vox_fem/objective.ogg and b/sound/vox_fem/objective.ogg differ diff --git a/sound/vox_fem/observation.ogg b/sound/vox_fem/observation.ogg index b6cf3820e06..653c31e346d 100644 Binary files a/sound/vox_fem/observation.ogg and b/sound/vox_fem/observation.ogg differ diff --git a/sound/vox_fem/obtain.ogg b/sound/vox_fem/obtain.ogg index 1f3a566c68a..ae28974e404 100644 Binary files a/sound/vox_fem/obtain.ogg and b/sound/vox_fem/obtain.ogg differ diff --git a/sound/vox_fem/of.ogg b/sound/vox_fem/of.ogg index 0a793a5e0c4..5bf24883419 100644 Binary files a/sound/vox_fem/of.ogg and b/sound/vox_fem/of.ogg differ diff --git a/sound/vox_fem/officer.ogg b/sound/vox_fem/officer.ogg index 2a7bbcf6048..4f80dd195a0 100644 Binary files a/sound/vox_fem/officer.ogg and b/sound/vox_fem/officer.ogg differ diff --git a/sound/vox_fem/ok.ogg b/sound/vox_fem/ok.ogg index f26e298ea81..072a208af95 100644 Binary files a/sound/vox_fem/ok.ogg and b/sound/vox_fem/ok.ogg differ diff --git a/sound/vox_fem/on.ogg b/sound/vox_fem/on.ogg index d9e1932ba17..be42780f461 100644 Binary files a/sound/vox_fem/on.ogg and b/sound/vox_fem/on.ogg differ diff --git a/sound/vox_fem/one.ogg b/sound/vox_fem/one.ogg index 181f328b4ea..749a9e5be9d 100644 Binary files a/sound/vox_fem/one.ogg and b/sound/vox_fem/one.ogg differ diff --git a/sound/vox_fem/open.ogg b/sound/vox_fem/open.ogg index 17c5e4350ec..96806dc3296 100644 Binary files a/sound/vox_fem/open.ogg and b/sound/vox_fem/open.ogg differ diff --git a/sound/vox_fem/operating.ogg b/sound/vox_fem/operating.ogg index 7093d9b2ba0..5404634ab13 100644 Binary files a/sound/vox_fem/operating.ogg and b/sound/vox_fem/operating.ogg differ diff --git a/sound/vox_fem/operations.ogg b/sound/vox_fem/operations.ogg index 50b92351b6c..114c603ed05 100644 Binary files a/sound/vox_fem/operations.ogg and b/sound/vox_fem/operations.ogg differ diff --git a/sound/vox_fem/operative.ogg b/sound/vox_fem/operative.ogg index d26fbb30bc7..d93b6534364 100644 Binary files a/sound/vox_fem/operative.ogg and b/sound/vox_fem/operative.ogg differ diff --git a/sound/vox_fem/option.ogg b/sound/vox_fem/option.ogg index fc7354ad87d..c9d163c3bbf 100644 Binary files a/sound/vox_fem/option.ogg and b/sound/vox_fem/option.ogg differ diff --git a/sound/vox_fem/order.ogg b/sound/vox_fem/order.ogg index 73e645acc32..fc19d3311a9 100644 Binary files a/sound/vox_fem/order.ogg and b/sound/vox_fem/order.ogg differ diff --git a/sound/vox_fem/organic.ogg b/sound/vox_fem/organic.ogg index a4f327a16c1..0ad410030a5 100644 Binary files a/sound/vox_fem/organic.ogg and b/sound/vox_fem/organic.ogg differ diff --git a/sound/vox_fem/oscar.ogg b/sound/vox_fem/oscar.ogg index 17c3b88cbf8..ae2dea023ff 100644 Binary files a/sound/vox_fem/oscar.ogg and b/sound/vox_fem/oscar.ogg differ diff --git a/sound/vox_fem/out.ogg b/sound/vox_fem/out.ogg index 23e4c515b01..005b7e204ec 100644 Binary files a/sound/vox_fem/out.ogg and b/sound/vox_fem/out.ogg differ diff --git a/sound/vox_fem/outside.ogg b/sound/vox_fem/outside.ogg index 9815ca2de77..5c6f721dc0c 100644 Binary files a/sound/vox_fem/outside.ogg and b/sound/vox_fem/outside.ogg differ diff --git a/sound/vox_fem/over.ogg b/sound/vox_fem/over.ogg index 3cc46c1332f..567bb69431d 100644 Binary files a/sound/vox_fem/over.ogg and b/sound/vox_fem/over.ogg differ diff --git a/sound/vox_fem/overload.ogg b/sound/vox_fem/overload.ogg index 05c685afe0c..d9ab530b1ec 100644 Binary files a/sound/vox_fem/overload.ogg and b/sound/vox_fem/overload.ogg differ diff --git a/sound/vox_fem/override.ogg b/sound/vox_fem/override.ogg index 6d63e7ae274..fcc285fb8bd 100644 Binary files a/sound/vox_fem/override.ogg and b/sound/vox_fem/override.ogg differ diff --git a/sound/vox_fem/p.ogg b/sound/vox_fem/p.ogg index c73cd8ab25f..98eacdf5498 100644 Binary files a/sound/vox_fem/p.ogg and b/sound/vox_fem/p.ogg differ diff --git a/sound/vox_fem/pacify.ogg b/sound/vox_fem/pacify.ogg index 2dbdf71f07e..15747e8d935 100644 Binary files a/sound/vox_fem/pacify.ogg and b/sound/vox_fem/pacify.ogg differ diff --git a/sound/vox_fem/pain.ogg b/sound/vox_fem/pain.ogg index 48f150b0d17..23ec6e2b7be 100644 Binary files a/sound/vox_fem/pain.ogg and b/sound/vox_fem/pain.ogg differ diff --git a/sound/vox_fem/pal.ogg b/sound/vox_fem/pal.ogg index 20d369f80b3..d9eaecc16d9 100644 Binary files a/sound/vox_fem/pal.ogg and b/sound/vox_fem/pal.ogg differ diff --git a/sound/vox_fem/panel.ogg b/sound/vox_fem/panel.ogg index 4d04f5e3c33..c68029951d8 100644 Binary files a/sound/vox_fem/panel.ogg and b/sound/vox_fem/panel.ogg differ diff --git a/sound/vox_fem/percent.ogg b/sound/vox_fem/percent.ogg index b340e7719e9..5c7432454d9 100644 Binary files a/sound/vox_fem/percent.ogg and b/sound/vox_fem/percent.ogg differ diff --git a/sound/vox_fem/perimeter.ogg b/sound/vox_fem/perimeter.ogg index a129f00192c..f4d5cebad9e 100644 Binary files a/sound/vox_fem/perimeter.ogg and b/sound/vox_fem/perimeter.ogg differ diff --git a/sound/vox_fem/permitted.ogg b/sound/vox_fem/permitted.ogg index 73e6998399b..39ebc8678a4 100644 Binary files a/sound/vox_fem/permitted.ogg and b/sound/vox_fem/permitted.ogg differ diff --git a/sound/vox_fem/personnel.ogg b/sound/vox_fem/personnel.ogg index e8822faa4f3..9eba8eab376 100644 Binary files a/sound/vox_fem/personnel.ogg and b/sound/vox_fem/personnel.ogg differ diff --git a/sound/vox_fem/pipe.ogg b/sound/vox_fem/pipe.ogg index 4537f7506f4..54f6d7cd528 100644 Binary files a/sound/vox_fem/pipe.ogg and b/sound/vox_fem/pipe.ogg differ diff --git a/sound/vox_fem/plant.ogg b/sound/vox_fem/plant.ogg index 2ae907a8eea..4b693d75bc9 100644 Binary files a/sound/vox_fem/plant.ogg and b/sound/vox_fem/plant.ogg differ diff --git a/sound/vox_fem/plasma.ogg b/sound/vox_fem/plasma.ogg index 3bab79725ef..4187d273d8c 100644 Binary files a/sound/vox_fem/plasma.ogg and b/sound/vox_fem/plasma.ogg differ diff --git a/sound/vox_fem/platform.ogg b/sound/vox_fem/platform.ogg index 2c006cae165..ede9921a167 100644 Binary files a/sound/vox_fem/platform.ogg and b/sound/vox_fem/platform.ogg differ diff --git a/sound/vox_fem/please.ogg b/sound/vox_fem/please.ogg index 4cc35d75280..829119d817c 100644 Binary files a/sound/vox_fem/please.ogg and b/sound/vox_fem/please.ogg differ diff --git a/sound/vox_fem/point.ogg b/sound/vox_fem/point.ogg index 9fe76bf9fee..c837b25f763 100644 Binary files a/sound/vox_fem/point.ogg and b/sound/vox_fem/point.ogg differ diff --git a/sound/vox_fem/port.ogg b/sound/vox_fem/port.ogg index 15b655dc68e..aa2c783b50a 100644 Binary files a/sound/vox_fem/port.ogg and b/sound/vox_fem/port.ogg differ diff --git a/sound/vox_fem/portal.ogg b/sound/vox_fem/portal.ogg index f11253d41b3..fa1345c3dc4 100644 Binary files a/sound/vox_fem/portal.ogg and b/sound/vox_fem/portal.ogg differ diff --git a/sound/vox_fem/power.ogg b/sound/vox_fem/power.ogg index 7f819bce56b..8c7f8f147a9 100644 Binary files a/sound/vox_fem/power.ogg and b/sound/vox_fem/power.ogg differ diff --git a/sound/vox_fem/presence.ogg b/sound/vox_fem/presence.ogg index c842cf3b262..7f8cb296d73 100644 Binary files a/sound/vox_fem/presence.ogg and b/sound/vox_fem/presence.ogg differ diff --git a/sound/vox_fem/press.ogg b/sound/vox_fem/press.ogg index a664808d449..a3e52593a3d 100644 Binary files a/sound/vox_fem/press.ogg and b/sound/vox_fem/press.ogg differ diff --git a/sound/vox_fem/primary.ogg b/sound/vox_fem/primary.ogg index 78953a1b68f..0452d8f00e5 100644 Binary files a/sound/vox_fem/primary.ogg and b/sound/vox_fem/primary.ogg differ diff --git a/sound/vox_fem/proceed.ogg b/sound/vox_fem/proceed.ogg index 76a95fb5371..13d301240de 100644 Binary files a/sound/vox_fem/proceed.ogg and b/sound/vox_fem/proceed.ogg differ diff --git a/sound/vox_fem/processing.ogg b/sound/vox_fem/processing.ogg index 579debcc065..c31af991ab1 100644 Binary files a/sound/vox_fem/processing.ogg and b/sound/vox_fem/processing.ogg differ diff --git a/sound/vox_fem/progress.ogg b/sound/vox_fem/progress.ogg index 66993b29bed..deefb0e56a7 100644 Binary files a/sound/vox_fem/progress.ogg and b/sound/vox_fem/progress.ogg differ diff --git a/sound/vox_fem/proper.ogg b/sound/vox_fem/proper.ogg index 0814a13c21b..4564070d09a 100644 Binary files a/sound/vox_fem/proper.ogg and b/sound/vox_fem/proper.ogg differ diff --git a/sound/vox_fem/propulsion.ogg b/sound/vox_fem/propulsion.ogg index d9d5500fbd9..b6f532b55ce 100644 Binary files a/sound/vox_fem/propulsion.ogg and b/sound/vox_fem/propulsion.ogg differ diff --git a/sound/vox_fem/prosecute.ogg b/sound/vox_fem/prosecute.ogg index f04c43e231b..98478476fe5 100644 Binary files a/sound/vox_fem/prosecute.ogg and b/sound/vox_fem/prosecute.ogg differ diff --git a/sound/vox_fem/protective.ogg b/sound/vox_fem/protective.ogg index 089992f65ed..c0f8ccc63e3 100644 Binary files a/sound/vox_fem/protective.ogg and b/sound/vox_fem/protective.ogg differ diff --git a/sound/vox_fem/push.ogg b/sound/vox_fem/push.ogg index 8b4572fc36b..9c15d2dd3e8 100644 Binary files a/sound/vox_fem/push.ogg and b/sound/vox_fem/push.ogg differ diff --git a/sound/vox_fem/q.ogg b/sound/vox_fem/q.ogg index 46a6da1205e..1763bb631a2 100644 Binary files a/sound/vox_fem/q.ogg and b/sound/vox_fem/q.ogg differ diff --git a/sound/vox_fem/quantum.ogg b/sound/vox_fem/quantum.ogg index ad297f4d070..57a03c9e823 100644 Binary files a/sound/vox_fem/quantum.ogg and b/sound/vox_fem/quantum.ogg differ diff --git a/sound/vox_fem/quebec.ogg b/sound/vox_fem/quebec.ogg index 36071a9cfc5..7234289c360 100644 Binary files a/sound/vox_fem/quebec.ogg and b/sound/vox_fem/quebec.ogg differ diff --git a/sound/vox_fem/queen.ogg b/sound/vox_fem/queen.ogg index 2c9058fc654..468d2eaf31a 100644 Binary files a/sound/vox_fem/queen.ogg and b/sound/vox_fem/queen.ogg differ diff --git a/sound/vox_fem/question.ogg b/sound/vox_fem/question.ogg index df55723b2a8..b849d536b0c 100644 Binary files a/sound/vox_fem/question.ogg and b/sound/vox_fem/question.ogg differ diff --git a/sound/vox_fem/questioning.ogg b/sound/vox_fem/questioning.ogg index d3a7af1d21a..fed35a84644 100644 Binary files a/sound/vox_fem/questioning.ogg and b/sound/vox_fem/questioning.ogg differ diff --git a/sound/vox_fem/quick.ogg b/sound/vox_fem/quick.ogg index 9b5107ecfa5..efd970ea193 100644 Binary files a/sound/vox_fem/quick.ogg and b/sound/vox_fem/quick.ogg differ diff --git a/sound/vox_fem/quit.ogg b/sound/vox_fem/quit.ogg index bec00b0675b..ad3af8c4621 100644 Binary files a/sound/vox_fem/quit.ogg and b/sound/vox_fem/quit.ogg differ diff --git a/sound/vox_fem/r.ogg b/sound/vox_fem/r.ogg index b28b48d98fc..ee0c442249b 100644 Binary files a/sound/vox_fem/r.ogg and b/sound/vox_fem/r.ogg differ diff --git a/sound/vox_fem/radiation.ogg b/sound/vox_fem/radiation.ogg index 2fd0bbc7157..83c42936576 100644 Binary files a/sound/vox_fem/radiation.ogg and b/sound/vox_fem/radiation.ogg differ diff --git a/sound/vox_fem/radioactive.ogg b/sound/vox_fem/radioactive.ogg index 34e6f659335..73dcd7f0ee8 100644 Binary files a/sound/vox_fem/radioactive.ogg and b/sound/vox_fem/radioactive.ogg differ diff --git a/sound/vox_fem/rads.ogg b/sound/vox_fem/rads.ogg index 121421ab283..a5d1e631f6f 100644 Binary files a/sound/vox_fem/rads.ogg and b/sound/vox_fem/rads.ogg differ diff --git a/sound/vox_fem/raider.ogg b/sound/vox_fem/raider.ogg index 661626e31df..a14a2eaf0bd 100644 Binary files a/sound/vox_fem/raider.ogg and b/sound/vox_fem/raider.ogg differ diff --git a/sound/vox_fem/raiders.ogg b/sound/vox_fem/raiders.ogg index a84dea0e804..5d4e6689791 100644 Binary files a/sound/vox_fem/raiders.ogg and b/sound/vox_fem/raiders.ogg differ diff --git a/sound/vox_fem/rapid.ogg b/sound/vox_fem/rapid.ogg index ba857632fd0..17bcad6f12f 100644 Binary files a/sound/vox_fem/rapid.ogg and b/sound/vox_fem/rapid.ogg differ diff --git a/sound/vox_fem/reach.ogg b/sound/vox_fem/reach.ogg index a45820cbc06..c3cb81cc39f 100644 Binary files a/sound/vox_fem/reach.ogg and b/sound/vox_fem/reach.ogg differ diff --git a/sound/vox_fem/reached.ogg b/sound/vox_fem/reached.ogg index 7dc48cbb39e..2fe07542c79 100644 Binary files a/sound/vox_fem/reached.ogg and b/sound/vox_fem/reached.ogg differ diff --git a/sound/vox_fem/reactor.ogg b/sound/vox_fem/reactor.ogg index 01edc35ff2d..ea05564d415 100644 Binary files a/sound/vox_fem/reactor.ogg and b/sound/vox_fem/reactor.ogg differ diff --git a/sound/vox_fem/red.ogg b/sound/vox_fem/red.ogg index 3c217f6899d..4d7226a0b13 100644 Binary files a/sound/vox_fem/red.ogg and b/sound/vox_fem/red.ogg differ diff --git a/sound/vox_fem/relay.ogg b/sound/vox_fem/relay.ogg index 2053dc0eebd..2f661b9c5e0 100644 Binary files a/sound/vox_fem/relay.ogg and b/sound/vox_fem/relay.ogg differ diff --git a/sound/vox_fem/released.ogg b/sound/vox_fem/released.ogg index 502cad90783..d7be271f41c 100644 Binary files a/sound/vox_fem/released.ogg and b/sound/vox_fem/released.ogg differ diff --git a/sound/vox_fem/remaining.ogg b/sound/vox_fem/remaining.ogg index c492bad1db6..a59165e1a51 100644 Binary files a/sound/vox_fem/remaining.ogg and b/sound/vox_fem/remaining.ogg differ diff --git a/sound/vox_fem/removal.ogg b/sound/vox_fem/removal.ogg index 4409ebd5a87..cb4c68c4b70 100644 Binary files a/sound/vox_fem/removal.ogg and b/sound/vox_fem/removal.ogg differ diff --git a/sound/vox_fem/renegade.ogg b/sound/vox_fem/renegade.ogg index 370ead73a6c..3c25e933fb6 100644 Binary files a/sound/vox_fem/renegade.ogg and b/sound/vox_fem/renegade.ogg differ diff --git a/sound/vox_fem/repair.ogg b/sound/vox_fem/repair.ogg index 77bd167c4d1..ee6f0921912 100644 Binary files a/sound/vox_fem/repair.ogg and b/sound/vox_fem/repair.ogg differ diff --git a/sound/vox_fem/report.ogg b/sound/vox_fem/report.ogg index 1efc1e552eb..13a3dcf6137 100644 Binary files a/sound/vox_fem/report.ogg and b/sound/vox_fem/report.ogg differ diff --git a/sound/vox_fem/reports.ogg b/sound/vox_fem/reports.ogg index 99cd0e1ebb7..d4317a29c08 100644 Binary files a/sound/vox_fem/reports.ogg and b/sound/vox_fem/reports.ogg differ diff --git a/sound/vox_fem/required.ogg b/sound/vox_fem/required.ogg index fcfcc5af77d..89fe4af635f 100644 Binary files a/sound/vox_fem/required.ogg and b/sound/vox_fem/required.ogg differ diff --git a/sound/vox_fem/research.ogg b/sound/vox_fem/research.ogg index 838083d3a9c..b7426ed6577 100644 Binary files a/sound/vox_fem/research.ogg and b/sound/vox_fem/research.ogg differ diff --git a/sound/vox_fem/resevoir.ogg b/sound/vox_fem/resevoir.ogg index 72b8baf6a15..b021c4b0b46 100644 Binary files a/sound/vox_fem/resevoir.ogg and b/sound/vox_fem/resevoir.ogg differ diff --git a/sound/vox_fem/resistance.ogg b/sound/vox_fem/resistance.ogg index 7a89c815628..3abbe8c3831 100644 Binary files a/sound/vox_fem/resistance.ogg and b/sound/vox_fem/resistance.ogg differ diff --git a/sound/vox_fem/rest.ogg b/sound/vox_fem/rest.ogg index da10d78aaf9..e41daa22d81 100644 Binary files a/sound/vox_fem/rest.ogg and b/sound/vox_fem/rest.ogg differ diff --git a/sound/vox_fem/right.ogg b/sound/vox_fem/right.ogg index 20f18f75749..b515afdfe14 100644 Binary files a/sound/vox_fem/right.ogg and b/sound/vox_fem/right.ogg differ diff --git a/sound/vox_fem/rocket.ogg b/sound/vox_fem/rocket.ogg index 87ffdf95312..ef56fb7397d 100644 Binary files a/sound/vox_fem/rocket.ogg and b/sound/vox_fem/rocket.ogg differ diff --git a/sound/vox_fem/roger.ogg b/sound/vox_fem/roger.ogg index 3910ecb03de..ae9d841daaf 100644 Binary files a/sound/vox_fem/roger.ogg and b/sound/vox_fem/roger.ogg differ diff --git a/sound/vox_fem/romeo.ogg b/sound/vox_fem/romeo.ogg index f400af1b27a..e5e5586d501 100644 Binary files a/sound/vox_fem/romeo.ogg and b/sound/vox_fem/romeo.ogg differ diff --git a/sound/vox_fem/room.ogg b/sound/vox_fem/room.ogg index 94f5ca95bba..6f72372f88f 100644 Binary files a/sound/vox_fem/room.ogg and b/sound/vox_fem/room.ogg differ diff --git a/sound/vox_fem/round.ogg b/sound/vox_fem/round.ogg index f62f70c935e..b5ed3e15cec 100644 Binary files a/sound/vox_fem/round.ogg and b/sound/vox_fem/round.ogg differ diff --git a/sound/vox_fem/run.ogg b/sound/vox_fem/run.ogg index ca5d162a5a8..edfde382d30 100644 Binary files a/sound/vox_fem/run.ogg and b/sound/vox_fem/run.ogg differ diff --git a/sound/vox_fem/s.ogg b/sound/vox_fem/s.ogg index e87ba9c3ec6..40d08fa599d 100644 Binary files a/sound/vox_fem/s.ogg and b/sound/vox_fem/s.ogg differ diff --git a/sound/vox_fem/safe.ogg b/sound/vox_fem/safe.ogg index fced276c126..b7ffe4245b3 100644 Binary files a/sound/vox_fem/safe.ogg and b/sound/vox_fem/safe.ogg differ diff --git a/sound/vox_fem/safety.ogg b/sound/vox_fem/safety.ogg index 6bc762e9852..4535a175afd 100644 Binary files a/sound/vox_fem/safety.ogg and b/sound/vox_fem/safety.ogg differ diff --git a/sound/vox_fem/sarah.ogg b/sound/vox_fem/sarah.ogg index 050737712b6..caece78a0bf 100644 Binary files a/sound/vox_fem/sarah.ogg and b/sound/vox_fem/sarah.ogg differ diff --git a/sound/vox_fem/sargeant.ogg b/sound/vox_fem/sargeant.ogg index 33fb5ac34d0..6e1c38a9430 100644 Binary files a/sound/vox_fem/sargeant.ogg and b/sound/vox_fem/sargeant.ogg differ diff --git a/sound/vox_fem/satellite.ogg b/sound/vox_fem/satellite.ogg index 5fcebe0046d..95a8b7043a2 100644 Binary files a/sound/vox_fem/satellite.ogg and b/sound/vox_fem/satellite.ogg differ diff --git a/sound/vox_fem/save.ogg b/sound/vox_fem/save.ogg index e0ba81d7b16..7a91a6429d4 100644 Binary files a/sound/vox_fem/save.ogg and b/sound/vox_fem/save.ogg differ diff --git a/sound/vox_fem/science.ogg b/sound/vox_fem/science.ogg index bfe39501a2a..72c62bfcbfc 100644 Binary files a/sound/vox_fem/science.ogg and b/sound/vox_fem/science.ogg differ diff --git a/sound/vox_fem/scream.ogg b/sound/vox_fem/scream.ogg index 7861b2bd2a1..2e7a12a6dbe 100644 Binary files a/sound/vox_fem/scream.ogg and b/sound/vox_fem/scream.ogg differ diff --git a/sound/vox_fem/screen.ogg b/sound/vox_fem/screen.ogg index 96a036ed6b2..0303f1e3982 100644 Binary files a/sound/vox_fem/screen.ogg and b/sound/vox_fem/screen.ogg differ diff --git a/sound/vox_fem/search.ogg b/sound/vox_fem/search.ogg index 168ad55d848..a1153e1baba 100644 Binary files a/sound/vox_fem/search.ogg and b/sound/vox_fem/search.ogg differ diff --git a/sound/vox_fem/second.ogg b/sound/vox_fem/second.ogg index 0dc8477672e..6e13ef40477 100644 Binary files a/sound/vox_fem/second.ogg and b/sound/vox_fem/second.ogg differ diff --git a/sound/vox_fem/secondary.ogg b/sound/vox_fem/secondary.ogg index 37d50e6371f..bdbadfa27ed 100644 Binary files a/sound/vox_fem/secondary.ogg and b/sound/vox_fem/secondary.ogg differ diff --git a/sound/vox_fem/seconds.ogg b/sound/vox_fem/seconds.ogg index 48024e37e5f..29d22cae9e2 100644 Binary files a/sound/vox_fem/seconds.ogg and b/sound/vox_fem/seconds.ogg differ diff --git a/sound/vox_fem/sector.ogg b/sound/vox_fem/sector.ogg index 094c59c85a6..f80294a8162 100644 Binary files a/sound/vox_fem/sector.ogg and b/sound/vox_fem/sector.ogg differ diff --git a/sound/vox_fem/secure.ogg b/sound/vox_fem/secure.ogg index 47ddd16db1d..6ed743af7c3 100644 Binary files a/sound/vox_fem/secure.ogg and b/sound/vox_fem/secure.ogg differ diff --git a/sound/vox_fem/secured.ogg b/sound/vox_fem/secured.ogg index bc524515cc9..f5126adec59 100644 Binary files a/sound/vox_fem/secured.ogg and b/sound/vox_fem/secured.ogg differ diff --git a/sound/vox_fem/security.ogg b/sound/vox_fem/security.ogg index ede9fb4b001..79c380eaf04 100644 Binary files a/sound/vox_fem/security.ogg and b/sound/vox_fem/security.ogg differ diff --git a/sound/vox_fem/select.ogg b/sound/vox_fem/select.ogg index 3b193d4ce8c..e98a0b8de83 100644 Binary files a/sound/vox_fem/select.ogg and b/sound/vox_fem/select.ogg differ diff --git a/sound/vox_fem/selected.ogg b/sound/vox_fem/selected.ogg index 7cf61646427..4aca5508673 100644 Binary files a/sound/vox_fem/selected.ogg and b/sound/vox_fem/selected.ogg differ diff --git a/sound/vox_fem/sensors.ogg b/sound/vox_fem/sensors.ogg index be2b84c07be..ee582ca9abb 100644 Binary files a/sound/vox_fem/sensors.ogg and b/sound/vox_fem/sensors.ogg differ diff --git a/sound/vox_fem/service.ogg b/sound/vox_fem/service.ogg index fd097d34ba7..372a89ce9d1 100644 Binary files a/sound/vox_fem/service.ogg and b/sound/vox_fem/service.ogg differ diff --git a/sound/vox_fem/seven.ogg b/sound/vox_fem/seven.ogg index 9a1d7f68822..e86498ddf44 100644 Binary files a/sound/vox_fem/seven.ogg and b/sound/vox_fem/seven.ogg differ diff --git a/sound/vox_fem/seventeen.ogg b/sound/vox_fem/seventeen.ogg index 25ef3e210c2..84e52f12d6d 100644 Binary files a/sound/vox_fem/seventeen.ogg and b/sound/vox_fem/seventeen.ogg differ diff --git a/sound/vox_fem/seventy.ogg b/sound/vox_fem/seventy.ogg index 5d9a7b269f1..d42bf34d0ef 100644 Binary files a/sound/vox_fem/seventy.ogg and b/sound/vox_fem/seventy.ogg differ diff --git a/sound/vox_fem/severe.ogg b/sound/vox_fem/severe.ogg index 4e3a18f5485..b99d49ebc73 100644 Binary files a/sound/vox_fem/severe.ogg and b/sound/vox_fem/severe.ogg differ diff --git a/sound/vox_fem/sewage.ogg b/sound/vox_fem/sewage.ogg index e765b3c7b69..f9988fcbb28 100644 Binary files a/sound/vox_fem/sewage.ogg and b/sound/vox_fem/sewage.ogg differ diff --git a/sound/vox_fem/sewer.ogg b/sound/vox_fem/sewer.ogg index 176de9bce6e..30e9b08a5a9 100644 Binary files a/sound/vox_fem/sewer.ogg and b/sound/vox_fem/sewer.ogg differ diff --git a/sound/vox_fem/shield.ogg b/sound/vox_fem/shield.ogg index be9739329f5..3a4daa666a7 100644 Binary files a/sound/vox_fem/shield.ogg and b/sound/vox_fem/shield.ogg differ diff --git a/sound/vox_fem/shipment.ogg b/sound/vox_fem/shipment.ogg index 563271eee71..bfcbaddeeb0 100644 Binary files a/sound/vox_fem/shipment.ogg and b/sound/vox_fem/shipment.ogg differ diff --git a/sound/vox_fem/shirt.ogg b/sound/vox_fem/shirt.ogg index a528d769976..6fc1d202569 100644 Binary files a/sound/vox_fem/shirt.ogg and b/sound/vox_fem/shirt.ogg differ diff --git a/sound/vox_fem/shit.ogg b/sound/vox_fem/shit.ogg index daabea473dd..ac9dcd6684c 100644 Binary files a/sound/vox_fem/shit.ogg and b/sound/vox_fem/shit.ogg differ diff --git a/sound/vox_fem/shitlord.ogg b/sound/vox_fem/shitlord.ogg index 92b1bb8988e..2f615748fe0 100644 Binary files a/sound/vox_fem/shitlord.ogg and b/sound/vox_fem/shitlord.ogg differ diff --git a/sound/vox_fem/shits.ogg b/sound/vox_fem/shits.ogg index 53fb0f56d30..7bab92de7fe 100644 Binary files a/sound/vox_fem/shits.ogg and b/sound/vox_fem/shits.ogg differ diff --git a/sound/vox_fem/shitting.ogg b/sound/vox_fem/shitting.ogg index ea1dcc28c53..550e3e6fe75 100644 Binary files a/sound/vox_fem/shitting.ogg and b/sound/vox_fem/shitting.ogg differ diff --git a/sound/vox_fem/shock.ogg b/sound/vox_fem/shock.ogg index be5827a2e81..0eaaae1f473 100644 Binary files a/sound/vox_fem/shock.ogg and b/sound/vox_fem/shock.ogg differ diff --git a/sound/vox_fem/shoot.ogg b/sound/vox_fem/shoot.ogg index 82d1d59f95b..3b2333e489f 100644 Binary files a/sound/vox_fem/shoot.ogg and b/sound/vox_fem/shoot.ogg differ diff --git a/sound/vox_fem/shower.ogg b/sound/vox_fem/shower.ogg index 266e3c003b1..0ee0234961b 100644 Binary files a/sound/vox_fem/shower.ogg and b/sound/vox_fem/shower.ogg differ diff --git a/sound/vox_fem/shut.ogg b/sound/vox_fem/shut.ogg index e6498ec735e..c7db582d06d 100644 Binary files a/sound/vox_fem/shut.ogg and b/sound/vox_fem/shut.ogg differ diff --git a/sound/vox_fem/shuttle.ogg b/sound/vox_fem/shuttle.ogg index dfc3afdbd3b..fd99a8239c3 100644 Binary files a/sound/vox_fem/shuttle.ogg and b/sound/vox_fem/shuttle.ogg differ diff --git a/sound/vox_fem/side.ogg b/sound/vox_fem/side.ogg index 3c14ad61a06..ea7b6fe8070 100644 Binary files a/sound/vox_fem/side.ogg and b/sound/vox_fem/side.ogg differ diff --git a/sound/vox_fem/sierra.ogg b/sound/vox_fem/sierra.ogg index 9e13dc7dbe8..dff0940bfe2 100644 Binary files a/sound/vox_fem/sierra.ogg and b/sound/vox_fem/sierra.ogg differ diff --git a/sound/vox_fem/sight.ogg b/sound/vox_fem/sight.ogg index 3b31351f2e3..18c20572759 100644 Binary files a/sound/vox_fem/sight.ogg and b/sound/vox_fem/sight.ogg differ diff --git a/sound/vox_fem/silo.ogg b/sound/vox_fem/silo.ogg index 5dd5c0570b7..90898029889 100644 Binary files a/sound/vox_fem/silo.ogg and b/sound/vox_fem/silo.ogg differ diff --git a/sound/vox_fem/singularity.ogg b/sound/vox_fem/singularity.ogg index 34f579d3201..18fa8c0a576 100644 Binary files a/sound/vox_fem/singularity.ogg and b/sound/vox_fem/singularity.ogg differ diff --git a/sound/vox_fem/six.ogg b/sound/vox_fem/six.ogg index 84de2ceaf6a..ddb45cfe20c 100644 Binary files a/sound/vox_fem/six.ogg and b/sound/vox_fem/six.ogg differ diff --git a/sound/vox_fem/sixteen.ogg b/sound/vox_fem/sixteen.ogg index 85e290cb7ea..ae4a4acc758 100644 Binary files a/sound/vox_fem/sixteen.ogg and b/sound/vox_fem/sixteen.ogg differ diff --git a/sound/vox_fem/sixty.ogg b/sound/vox_fem/sixty.ogg index fe1fa1b997b..4f1877f9791 100644 Binary files a/sound/vox_fem/sixty.ogg and b/sound/vox_fem/sixty.ogg differ diff --git a/sound/vox_fem/slime.ogg b/sound/vox_fem/slime.ogg index 64b9e65670e..eeae42794e3 100644 Binary files a/sound/vox_fem/slime.ogg and b/sound/vox_fem/slime.ogg differ diff --git a/sound/vox_fem/slow.ogg b/sound/vox_fem/slow.ogg index beb0e3196e9..d08f367ccc4 100644 Binary files a/sound/vox_fem/slow.ogg and b/sound/vox_fem/slow.ogg differ diff --git a/sound/vox_fem/solar.ogg b/sound/vox_fem/solar.ogg index a8288487261..e1b842a1ef4 100644 Binary files a/sound/vox_fem/solar.ogg and b/sound/vox_fem/solar.ogg differ diff --git a/sound/vox_fem/solars.ogg b/sound/vox_fem/solars.ogg index c50a137d25c..4c2699194d9 100644 Binary files a/sound/vox_fem/solars.ogg and b/sound/vox_fem/solars.ogg differ diff --git a/sound/vox_fem/soldier.ogg b/sound/vox_fem/soldier.ogg index 81ad7a2e813..33e82c8da68 100644 Binary files a/sound/vox_fem/soldier.ogg and b/sound/vox_fem/soldier.ogg differ diff --git a/sound/vox_fem/some.ogg b/sound/vox_fem/some.ogg index 0271e8ff0f4..ea24836f7f5 100644 Binary files a/sound/vox_fem/some.ogg and b/sound/vox_fem/some.ogg differ diff --git a/sound/vox_fem/someone.ogg b/sound/vox_fem/someone.ogg index ef49db72dcc..1586dfe0f6c 100644 Binary files a/sound/vox_fem/someone.ogg and b/sound/vox_fem/someone.ogg differ diff --git a/sound/vox_fem/something.ogg b/sound/vox_fem/something.ogg index 011eca0ece3..a7f12de2054 100644 Binary files a/sound/vox_fem/something.ogg and b/sound/vox_fem/something.ogg differ diff --git a/sound/vox_fem/son.ogg b/sound/vox_fem/son.ogg index 0a133ea2f1e..943d4fe23c5 100644 Binary files a/sound/vox_fem/son.ogg and b/sound/vox_fem/son.ogg differ diff --git a/sound/vox_fem/sorry.ogg b/sound/vox_fem/sorry.ogg index 511ae3227d3..9d2da84540e 100644 Binary files a/sound/vox_fem/sorry.ogg and b/sound/vox_fem/sorry.ogg differ diff --git a/sound/vox_fem/south.ogg b/sound/vox_fem/south.ogg index 963abd07907..5ce09ffa698 100644 Binary files a/sound/vox_fem/south.ogg and b/sound/vox_fem/south.ogg differ diff --git a/sound/vox_fem/squad.ogg b/sound/vox_fem/squad.ogg index 5b418bbf4b4..d356c019fcb 100644 Binary files a/sound/vox_fem/squad.ogg and b/sound/vox_fem/squad.ogg differ diff --git a/sound/vox_fem/square.ogg b/sound/vox_fem/square.ogg index 75d999fbe1a..e7c91123cd5 100644 Binary files a/sound/vox_fem/square.ogg and b/sound/vox_fem/square.ogg differ diff --git a/sound/vox_fem/ss13.ogg b/sound/vox_fem/ss13.ogg index c3d526a9eeb..e4e80e829ee 100644 Binary files a/sound/vox_fem/ss13.ogg and b/sound/vox_fem/ss13.ogg differ diff --git a/sound/vox_fem/stairway.ogg b/sound/vox_fem/stairway.ogg index 8e81f4cb8a6..713960cf62e 100644 Binary files a/sound/vox_fem/stairway.ogg and b/sound/vox_fem/stairway.ogg differ diff --git a/sound/vox_fem/starboard.ogg b/sound/vox_fem/starboard.ogg index 3a1454a7a8b..02c0ffe10ba 100644 Binary files a/sound/vox_fem/starboard.ogg and b/sound/vox_fem/starboard.ogg differ diff --git a/sound/vox_fem/station.ogg b/sound/vox_fem/station.ogg index 9bb667f1c13..465b83db809 100644 Binary files a/sound/vox_fem/station.ogg and b/sound/vox_fem/station.ogg differ diff --git a/sound/vox_fem/status.ogg b/sound/vox_fem/status.ogg index 3683f581674..985765375fc 100644 Binary files a/sound/vox_fem/status.ogg and b/sound/vox_fem/status.ogg differ diff --git a/sound/vox_fem/sterile.ogg b/sound/vox_fem/sterile.ogg index 7fba53a6ccf..3a51aecaf6b 100644 Binary files a/sound/vox_fem/sterile.ogg and b/sound/vox_fem/sterile.ogg differ diff --git a/sound/vox_fem/sterilization.ogg b/sound/vox_fem/sterilization.ogg index 08df6e08451..ebf092c8449 100644 Binary files a/sound/vox_fem/sterilization.ogg and b/sound/vox_fem/sterilization.ogg differ diff --git a/sound/vox_fem/storage.ogg b/sound/vox_fem/storage.ogg index 5d8e9615904..cc57069c25f 100644 Binary files a/sound/vox_fem/storage.ogg and b/sound/vox_fem/storage.ogg differ diff --git a/sound/vox_fem/stuck.ogg b/sound/vox_fem/stuck.ogg index e47d01c67d8..c4e477de6aa 100644 Binary files a/sound/vox_fem/stuck.ogg and b/sound/vox_fem/stuck.ogg differ diff --git a/sound/vox_fem/sub.ogg b/sound/vox_fem/sub.ogg index 5fdd39e4768..92c240a6468 100644 Binary files a/sound/vox_fem/sub.ogg and b/sound/vox_fem/sub.ogg differ diff --git a/sound/vox_fem/subsurface.ogg b/sound/vox_fem/subsurface.ogg index 1a9cc59c5d6..24da9c88936 100644 Binary files a/sound/vox_fem/subsurface.ogg and b/sound/vox_fem/subsurface.ogg differ diff --git a/sound/vox_fem/sudden.ogg b/sound/vox_fem/sudden.ogg index c9c4fed6042..baee11baaed 100644 Binary files a/sound/vox_fem/sudden.ogg and b/sound/vox_fem/sudden.ogg differ diff --git a/sound/vox_fem/suffer.ogg b/sound/vox_fem/suffer.ogg index f0a598bbfda..a1ab81689d5 100644 Binary files a/sound/vox_fem/suffer.ogg and b/sound/vox_fem/suffer.ogg differ diff --git a/sound/vox_fem/suit.ogg b/sound/vox_fem/suit.ogg index 55b177622da..e188763215e 100644 Binary files a/sound/vox_fem/suit.ogg and b/sound/vox_fem/suit.ogg differ diff --git a/sound/vox_fem/superconducting.ogg b/sound/vox_fem/superconducting.ogg index 9bce02e79ce..c89ab9b9eb3 100644 Binary files a/sound/vox_fem/superconducting.ogg and b/sound/vox_fem/superconducting.ogg differ diff --git a/sound/vox_fem/supercooled.ogg b/sound/vox_fem/supercooled.ogg index f9f0ab77f7b..c377951455b 100644 Binary files a/sound/vox_fem/supercooled.ogg and b/sound/vox_fem/supercooled.ogg differ diff --git a/sound/vox_fem/supply.ogg b/sound/vox_fem/supply.ogg index d69f77f64d7..992b2c68f81 100644 Binary files a/sound/vox_fem/supply.ogg and b/sound/vox_fem/supply.ogg differ diff --git a/sound/vox_fem/surface.ogg b/sound/vox_fem/surface.ogg index ba5802d3420..afe81808dd3 100644 Binary files a/sound/vox_fem/surface.ogg and b/sound/vox_fem/surface.ogg differ diff --git a/sound/vox_fem/surrender.ogg b/sound/vox_fem/surrender.ogg index a879e2930bb..207629f6ccc 100644 Binary files a/sound/vox_fem/surrender.ogg and b/sound/vox_fem/surrender.ogg differ diff --git a/sound/vox_fem/surround.ogg b/sound/vox_fem/surround.ogg index 4b64c723947..88d209d2651 100644 Binary files a/sound/vox_fem/surround.ogg and b/sound/vox_fem/surround.ogg differ diff --git a/sound/vox_fem/surrounded.ogg b/sound/vox_fem/surrounded.ogg index 288a46a1261..411040fa4dd 100644 Binary files a/sound/vox_fem/surrounded.ogg and b/sound/vox_fem/surrounded.ogg differ diff --git a/sound/vox_fem/switch.ogg b/sound/vox_fem/switch.ogg index 77d33e7ec9d..f98be12953c 100644 Binary files a/sound/vox_fem/switch.ogg and b/sound/vox_fem/switch.ogg differ diff --git a/sound/vox_fem/syndicate.ogg b/sound/vox_fem/syndicate.ogg index 460eb9bfb1a..e085c981565 100644 Binary files a/sound/vox_fem/syndicate.ogg and b/sound/vox_fem/syndicate.ogg differ diff --git a/sound/vox_fem/system.ogg b/sound/vox_fem/system.ogg index aa54f188b75..8c3cb383ff5 100644 Binary files a/sound/vox_fem/system.ogg and b/sound/vox_fem/system.ogg differ diff --git a/sound/vox_fem/systems.ogg b/sound/vox_fem/systems.ogg index 8537cf8f3d3..79b7ca80c31 100644 Binary files a/sound/vox_fem/systems.ogg and b/sound/vox_fem/systems.ogg differ diff --git a/sound/vox_fem/t.ogg b/sound/vox_fem/t.ogg index 508558d564e..f7bc5996a34 100644 Binary files a/sound/vox_fem/t.ogg and b/sound/vox_fem/t.ogg differ diff --git a/sound/vox_fem/tactical.ogg b/sound/vox_fem/tactical.ogg index 29b9ac75080..a482dba476e 100644 Binary files a/sound/vox_fem/tactical.ogg and b/sound/vox_fem/tactical.ogg differ diff --git a/sound/vox_fem/take.ogg b/sound/vox_fem/take.ogg index 4870651afc3..f3c5c6f1eef 100644 Binary files a/sound/vox_fem/take.ogg and b/sound/vox_fem/take.ogg differ diff --git a/sound/vox_fem/talk.ogg b/sound/vox_fem/talk.ogg index 7337c8947d6..122cc1e59e6 100644 Binary files a/sound/vox_fem/talk.ogg and b/sound/vox_fem/talk.ogg differ diff --git a/sound/vox_fem/tango.ogg b/sound/vox_fem/tango.ogg index d6211daee9d..eb8602f8c5f 100644 Binary files a/sound/vox_fem/tango.ogg and b/sound/vox_fem/tango.ogg differ diff --git a/sound/vox_fem/tank.ogg b/sound/vox_fem/tank.ogg index 421c7345bd0..6a7943a998c 100644 Binary files a/sound/vox_fem/tank.ogg and b/sound/vox_fem/tank.ogg differ diff --git a/sound/vox_fem/target.ogg b/sound/vox_fem/target.ogg index 86f77c95b55..f12c29de47d 100644 Binary files a/sound/vox_fem/target.ogg and b/sound/vox_fem/target.ogg differ diff --git a/sound/vox_fem/team.ogg b/sound/vox_fem/team.ogg index b2574fdca18..7269dd82232 100644 Binary files a/sound/vox_fem/team.ogg and b/sound/vox_fem/team.ogg differ diff --git a/sound/vox_fem/temperature.ogg b/sound/vox_fem/temperature.ogg index c688949398c..ae85c3ffedf 100644 Binary files a/sound/vox_fem/temperature.ogg and b/sound/vox_fem/temperature.ogg differ diff --git a/sound/vox_fem/temporal.ogg b/sound/vox_fem/temporal.ogg index b634294d07c..efa1de6189e 100644 Binary files a/sound/vox_fem/temporal.ogg and b/sound/vox_fem/temporal.ogg differ diff --git a/sound/vox_fem/ten.ogg b/sound/vox_fem/ten.ogg index f9d9a77c90e..d7c97e6310c 100644 Binary files a/sound/vox_fem/ten.ogg and b/sound/vox_fem/ten.ogg differ diff --git a/sound/vox_fem/terminal.ogg b/sound/vox_fem/terminal.ogg index bf41176495d..e19141b4de6 100644 Binary files a/sound/vox_fem/terminal.ogg and b/sound/vox_fem/terminal.ogg differ diff --git a/sound/vox_fem/terminated.ogg b/sound/vox_fem/terminated.ogg index c48abcad04c..505b5955123 100644 Binary files a/sound/vox_fem/terminated.ogg and b/sound/vox_fem/terminated.ogg differ diff --git a/sound/vox_fem/termination.ogg b/sound/vox_fem/termination.ogg index c9313e752b4..bc96b64a00b 100644 Binary files a/sound/vox_fem/termination.ogg and b/sound/vox_fem/termination.ogg differ diff --git a/sound/vox_fem/test.ogg b/sound/vox_fem/test.ogg index 44f6fa97966..90261697c96 100644 Binary files a/sound/vox_fem/test.ogg and b/sound/vox_fem/test.ogg differ diff --git a/sound/vox_fem/that.ogg b/sound/vox_fem/that.ogg index fd57219c060..868cdb0bf2d 100644 Binary files a/sound/vox_fem/that.ogg and b/sound/vox_fem/that.ogg differ diff --git a/sound/vox_fem/the.ogg b/sound/vox_fem/the.ogg index caa3b7deb55..f3783635aab 100644 Binary files a/sound/vox_fem/the.ogg and b/sound/vox_fem/the.ogg differ diff --git a/sound/vox_fem/then.ogg b/sound/vox_fem/then.ogg index a69977a0b47..547b2238b1a 100644 Binary files a/sound/vox_fem/then.ogg and b/sound/vox_fem/then.ogg differ diff --git a/sound/vox_fem/there.ogg b/sound/vox_fem/there.ogg index 499c11a7bbc..928bba64194 100644 Binary files a/sound/vox_fem/there.ogg and b/sound/vox_fem/there.ogg differ diff --git a/sound/vox_fem/third.ogg b/sound/vox_fem/third.ogg index fc3c1ad9090..63202c53214 100644 Binary files a/sound/vox_fem/third.ogg and b/sound/vox_fem/third.ogg differ diff --git a/sound/vox_fem/thirteen.ogg b/sound/vox_fem/thirteen.ogg index fd2c4d546fe..88115f5fa10 100644 Binary files a/sound/vox_fem/thirteen.ogg and b/sound/vox_fem/thirteen.ogg differ diff --git a/sound/vox_fem/thirty.ogg b/sound/vox_fem/thirty.ogg index 7899f376d5e..12e50744c38 100644 Binary files a/sound/vox_fem/thirty.ogg and b/sound/vox_fem/thirty.ogg differ diff --git a/sound/vox_fem/this.ogg b/sound/vox_fem/this.ogg index 8bead3b1087..b55923a48f4 100644 Binary files a/sound/vox_fem/this.ogg and b/sound/vox_fem/this.ogg differ diff --git a/sound/vox_fem/those.ogg b/sound/vox_fem/those.ogg index 24b77a90a29..41fc7456577 100644 Binary files a/sound/vox_fem/those.ogg and b/sound/vox_fem/those.ogg differ diff --git a/sound/vox_fem/thousand.ogg b/sound/vox_fem/thousand.ogg index e8b7a7d0610..ba92bcb2e89 100644 Binary files a/sound/vox_fem/thousand.ogg and b/sound/vox_fem/thousand.ogg differ diff --git a/sound/vox_fem/threat.ogg b/sound/vox_fem/threat.ogg index 001c63b12b1..d4003d6ab56 100644 Binary files a/sound/vox_fem/threat.ogg and b/sound/vox_fem/threat.ogg differ diff --git a/sound/vox_fem/three.ogg b/sound/vox_fem/three.ogg index 90ab31ac5e3..2e8dbf175c1 100644 Binary files a/sound/vox_fem/three.ogg and b/sound/vox_fem/three.ogg differ diff --git a/sound/vox_fem/through.ogg b/sound/vox_fem/through.ogg index 8469523146f..ad2e5ed1b72 100644 Binary files a/sound/vox_fem/through.ogg and b/sound/vox_fem/through.ogg differ diff --git a/sound/vox_fem/tide.ogg b/sound/vox_fem/tide.ogg index 5a003de1fe2..45917e2f57b 100644 Binary files a/sound/vox_fem/tide.ogg and b/sound/vox_fem/tide.ogg differ diff --git a/sound/vox_fem/time.ogg b/sound/vox_fem/time.ogg index 213395f7ea7..02746c98df0 100644 Binary files a/sound/vox_fem/time.ogg and b/sound/vox_fem/time.ogg differ diff --git a/sound/vox_fem/to.ogg b/sound/vox_fem/to.ogg index 0c83650fc81..aaf695702d1 100644 Binary files a/sound/vox_fem/to.ogg and b/sound/vox_fem/to.ogg differ diff --git a/sound/vox_fem/top.ogg b/sound/vox_fem/top.ogg index 992ff488874..1db5b104f28 100644 Binary files a/sound/vox_fem/top.ogg and b/sound/vox_fem/top.ogg differ diff --git a/sound/vox_fem/topside.ogg b/sound/vox_fem/topside.ogg index 79d632ca8bd..c3c4639830f 100644 Binary files a/sound/vox_fem/topside.ogg and b/sound/vox_fem/topside.ogg differ diff --git a/sound/vox_fem/touch.ogg b/sound/vox_fem/touch.ogg index 36db14887ac..4a165a15b8b 100644 Binary files a/sound/vox_fem/touch.ogg and b/sound/vox_fem/touch.ogg differ diff --git a/sound/vox_fem/towards.ogg b/sound/vox_fem/towards.ogg index 852e19b5947..1ee555597ff 100644 Binary files a/sound/vox_fem/towards.ogg and b/sound/vox_fem/towards.ogg differ diff --git a/sound/vox_fem/toxins.ogg b/sound/vox_fem/toxins.ogg index 5ae7d43b2d2..34d29ed792c 100644 Binary files a/sound/vox_fem/toxins.ogg and b/sound/vox_fem/toxins.ogg differ diff --git a/sound/vox_fem/track.ogg b/sound/vox_fem/track.ogg index 5119641b701..70467c449a8 100644 Binary files a/sound/vox_fem/track.ogg and b/sound/vox_fem/track.ogg differ diff --git a/sound/vox_fem/train.ogg b/sound/vox_fem/train.ogg index cd3b46c3582..c3b92d956d8 100644 Binary files a/sound/vox_fem/train.ogg and b/sound/vox_fem/train.ogg differ diff --git a/sound/vox_fem/traitor.ogg b/sound/vox_fem/traitor.ogg index 615a09630bd..5cfc3714d1a 100644 Binary files a/sound/vox_fem/traitor.ogg and b/sound/vox_fem/traitor.ogg differ diff --git a/sound/vox_fem/transportation.ogg b/sound/vox_fem/transportation.ogg index f9635b0b081..97d56ff61e4 100644 Binary files a/sound/vox_fem/transportation.ogg and b/sound/vox_fem/transportation.ogg differ diff --git a/sound/vox_fem/truck.ogg b/sound/vox_fem/truck.ogg index ede75cb9224..bd190eed3b6 100644 Binary files a/sound/vox_fem/truck.ogg and b/sound/vox_fem/truck.ogg differ diff --git a/sound/vox_fem/tunnel.ogg b/sound/vox_fem/tunnel.ogg index 40828dc94ed..d42beae1552 100644 Binary files a/sound/vox_fem/tunnel.ogg and b/sound/vox_fem/tunnel.ogg differ diff --git a/sound/vox_fem/turn.ogg b/sound/vox_fem/turn.ogg index 01fdca4b2ea..f6a11de5b52 100644 Binary files a/sound/vox_fem/turn.ogg and b/sound/vox_fem/turn.ogg differ diff --git a/sound/vox_fem/turret.ogg b/sound/vox_fem/turret.ogg index 8855ea430ed..541846aa2b8 100644 Binary files a/sound/vox_fem/turret.ogg and b/sound/vox_fem/turret.ogg differ diff --git a/sound/vox_fem/twelve.ogg b/sound/vox_fem/twelve.ogg index ab15c1dbc17..e192edeccd1 100644 Binary files a/sound/vox_fem/twelve.ogg and b/sound/vox_fem/twelve.ogg differ diff --git a/sound/vox_fem/twenty.ogg b/sound/vox_fem/twenty.ogg index 7fb374015e0..7b920b0ba8a 100644 Binary files a/sound/vox_fem/twenty.ogg and b/sound/vox_fem/twenty.ogg differ diff --git a/sound/vox_fem/two.ogg b/sound/vox_fem/two.ogg index ab9152ccab2..c327cc105ee 100644 Binary files a/sound/vox_fem/two.ogg and b/sound/vox_fem/two.ogg differ diff --git a/sound/vox_fem/u.ogg b/sound/vox_fem/u.ogg index 5e70abd2d6c..790bd095200 100644 Binary files a/sound/vox_fem/u.ogg and b/sound/vox_fem/u.ogg differ diff --git a/sound/vox_fem/unauthorized.ogg b/sound/vox_fem/unauthorized.ogg index bb3198f43e3..35d48120e98 100644 Binary files a/sound/vox_fem/unauthorized.ogg and b/sound/vox_fem/unauthorized.ogg differ diff --git a/sound/vox_fem/under.ogg b/sound/vox_fem/under.ogg index 7a42956aafa..89d91bef37d 100644 Binary files a/sound/vox_fem/under.ogg and b/sound/vox_fem/under.ogg differ diff --git a/sound/vox_fem/uniform.ogg b/sound/vox_fem/uniform.ogg index fac6ad19b9a..6f7de6902f7 100644 Binary files a/sound/vox_fem/uniform.ogg and b/sound/vox_fem/uniform.ogg differ diff --git a/sound/vox_fem/unlocked.ogg b/sound/vox_fem/unlocked.ogg index 362984b341e..725f8a6c819 100644 Binary files a/sound/vox_fem/unlocked.ogg and b/sound/vox_fem/unlocked.ogg differ diff --git a/sound/vox_fem/until.ogg b/sound/vox_fem/until.ogg index 85376504cc6..43cadd1a88d 100644 Binary files a/sound/vox_fem/until.ogg and b/sound/vox_fem/until.ogg differ diff --git a/sound/vox_fem/up.ogg b/sound/vox_fem/up.ogg index ed6aa7554d6..1c395a61958 100644 Binary files a/sound/vox_fem/up.ogg and b/sound/vox_fem/up.ogg differ diff --git a/sound/vox_fem/update.ogg b/sound/vox_fem/update.ogg index 841deff30a3..31a4e651aba 100644 Binary files a/sound/vox_fem/update.ogg and b/sound/vox_fem/update.ogg differ diff --git a/sound/vox_fem/updated.ogg b/sound/vox_fem/updated.ogg index 9c98ae36de6..61559f22939 100644 Binary files a/sound/vox_fem/updated.ogg and b/sound/vox_fem/updated.ogg differ diff --git a/sound/vox_fem/updating.ogg b/sound/vox_fem/updating.ogg index 6987745785a..0403f777969 100644 Binary files a/sound/vox_fem/updating.ogg and b/sound/vox_fem/updating.ogg differ diff --git a/sound/vox_fem/upload.ogg b/sound/vox_fem/upload.ogg index fece0c9ac11..f96547bfea1 100644 Binary files a/sound/vox_fem/upload.ogg and b/sound/vox_fem/upload.ogg differ diff --git a/sound/vox_fem/upper.ogg b/sound/vox_fem/upper.ogg index 01658ac0836..810d330ef08 100644 Binary files a/sound/vox_fem/upper.ogg and b/sound/vox_fem/upper.ogg differ diff --git a/sound/vox_fem/uranium.ogg b/sound/vox_fem/uranium.ogg index c1622b2b597..e2ac70d93eb 100644 Binary files a/sound/vox_fem/uranium.ogg and b/sound/vox_fem/uranium.ogg differ diff --git a/sound/vox_fem/us.ogg b/sound/vox_fem/us.ogg index 90c0977f560..0731a879a58 100644 Binary files a/sound/vox_fem/us.ogg and b/sound/vox_fem/us.ogg differ diff --git a/sound/vox_fem/usa.ogg b/sound/vox_fem/usa.ogg index b7a273bd556..f3bc1912e92 100644 Binary files a/sound/vox_fem/usa.ogg and b/sound/vox_fem/usa.ogg differ diff --git a/sound/vox_fem/use.ogg b/sound/vox_fem/use.ogg index 325536c4975..3ab7367a252 100644 Binary files a/sound/vox_fem/use.ogg and b/sound/vox_fem/use.ogg differ diff --git a/sound/vox_fem/used.ogg b/sound/vox_fem/used.ogg index 3e1a5344b66..5cb1afd8531 100644 Binary files a/sound/vox_fem/used.ogg and b/sound/vox_fem/used.ogg differ diff --git a/sound/vox_fem/user.ogg b/sound/vox_fem/user.ogg index 720a1fb83bd..739b3a31641 100644 Binary files a/sound/vox_fem/user.ogg and b/sound/vox_fem/user.ogg differ diff --git a/sound/vox_fem/v.ogg b/sound/vox_fem/v.ogg index 5df76474290..91484502295 100644 Binary files a/sound/vox_fem/v.ogg and b/sound/vox_fem/v.ogg differ diff --git a/sound/vox_fem/vacate.ogg b/sound/vox_fem/vacate.ogg index ef9e0f0c809..12f1c52c4ca 100644 Binary files a/sound/vox_fem/vacate.ogg and b/sound/vox_fem/vacate.ogg differ diff --git a/sound/vox_fem/valid.ogg b/sound/vox_fem/valid.ogg index 19a74baefed..a2d58b879c1 100644 Binary files a/sound/vox_fem/valid.ogg and b/sound/vox_fem/valid.ogg differ diff --git a/sound/vox_fem/vapor.ogg b/sound/vox_fem/vapor.ogg index 9643e16df9e..859d103ea6e 100644 Binary files a/sound/vox_fem/vapor.ogg and b/sound/vox_fem/vapor.ogg differ diff --git a/sound/vox_fem/vent.ogg b/sound/vox_fem/vent.ogg index cc7c31c1566..35fdffafa09 100644 Binary files a/sound/vox_fem/vent.ogg and b/sound/vox_fem/vent.ogg differ diff --git a/sound/vox_fem/ventilation.ogg b/sound/vox_fem/ventilation.ogg index c5903349a65..594cfbb5b8e 100644 Binary files a/sound/vox_fem/ventilation.ogg and b/sound/vox_fem/ventilation.ogg differ diff --git a/sound/vox_fem/victor.ogg b/sound/vox_fem/victor.ogg index a820e25ba95..97ce16b7f6d 100644 Binary files a/sound/vox_fem/victor.ogg and b/sound/vox_fem/victor.ogg differ diff --git a/sound/vox_fem/violated.ogg b/sound/vox_fem/violated.ogg index 64165c7364e..f7b0b72a8b3 100644 Binary files a/sound/vox_fem/violated.ogg and b/sound/vox_fem/violated.ogg differ diff --git a/sound/vox_fem/violation.ogg b/sound/vox_fem/violation.ogg index e870f9defe6..d50801ee766 100644 Binary files a/sound/vox_fem/violation.ogg and b/sound/vox_fem/violation.ogg differ diff --git a/sound/vox_fem/virology.ogg b/sound/vox_fem/virology.ogg index cc8e99d3fa6..9050ed50575 100644 Binary files a/sound/vox_fem/virology.ogg and b/sound/vox_fem/virology.ogg differ diff --git a/sound/vox_fem/voltage.ogg b/sound/vox_fem/voltage.ogg index 2665427add0..efcc71ffa93 100644 Binary files a/sound/vox_fem/voltage.ogg and b/sound/vox_fem/voltage.ogg differ diff --git a/sound/vox_fem/vox.ogg b/sound/vox_fem/vox.ogg index 5413d5e9693..9e173140c72 100644 Binary files a/sound/vox_fem/vox.ogg and b/sound/vox_fem/vox.ogg differ diff --git a/sound/vox_fem/vox_login.ogg b/sound/vox_fem/vox_login.ogg index d9a5a0be3c0..4c349b5835a 100644 Binary files a/sound/vox_fem/vox_login.ogg and b/sound/vox_fem/vox_login.ogg differ diff --git a/sound/vox_fem/voxtest.ogg b/sound/vox_fem/voxtest.ogg index 3e7ccda843b..cc73b4e8539 100644 Binary files a/sound/vox_fem/voxtest.ogg and b/sound/vox_fem/voxtest.ogg differ diff --git a/sound/vox_fem/voxtest2.ogg b/sound/vox_fem/voxtest2.ogg index c264f85256a..da1f57bc93a 100644 Binary files a/sound/vox_fem/voxtest2.ogg and b/sound/vox_fem/voxtest2.ogg differ diff --git a/sound/vox_fem/w.ogg b/sound/vox_fem/w.ogg index af691f5e546..9d79ce4a2a6 100644 Binary files a/sound/vox_fem/w.ogg and b/sound/vox_fem/w.ogg differ diff --git a/sound/vox_fem/walk.ogg b/sound/vox_fem/walk.ogg index 75cf580307b..10f5d04cf28 100644 Binary files a/sound/vox_fem/walk.ogg and b/sound/vox_fem/walk.ogg differ diff --git a/sound/vox_fem/wall.ogg b/sound/vox_fem/wall.ogg index 07ebc58d0bb..cc08c00256e 100644 Binary files a/sound/vox_fem/wall.ogg and b/sound/vox_fem/wall.ogg differ diff --git a/sound/vox_fem/wanker.ogg b/sound/vox_fem/wanker.ogg index 510faec69dc..fbb8c404e67 100644 Binary files a/sound/vox_fem/wanker.ogg and b/sound/vox_fem/wanker.ogg differ diff --git a/sound/vox_fem/want.ogg b/sound/vox_fem/want.ogg index 4c65e53c7f2..49ad91c895b 100644 Binary files a/sound/vox_fem/want.ogg and b/sound/vox_fem/want.ogg differ diff --git a/sound/vox_fem/wanted.ogg b/sound/vox_fem/wanted.ogg index e0e98f74678..1c87b3e140d 100644 Binary files a/sound/vox_fem/wanted.ogg and b/sound/vox_fem/wanted.ogg differ diff --git a/sound/vox_fem/warm.ogg b/sound/vox_fem/warm.ogg index 8acfb7de743..534203ba70e 100644 Binary files a/sound/vox_fem/warm.ogg and b/sound/vox_fem/warm.ogg differ diff --git a/sound/vox_fem/warn.ogg b/sound/vox_fem/warn.ogg index 6c387184830..437ef92c681 100644 Binary files a/sound/vox_fem/warn.ogg and b/sound/vox_fem/warn.ogg differ diff --git a/sound/vox_fem/warning.ogg b/sound/vox_fem/warning.ogg index ef546995a8b..5ff68583a0e 100644 Binary files a/sound/vox_fem/warning.ogg and b/sound/vox_fem/warning.ogg differ diff --git a/sound/vox_fem/waste.ogg b/sound/vox_fem/waste.ogg index 10f92e11aa0..46726eaa2dc 100644 Binary files a/sound/vox_fem/waste.ogg and b/sound/vox_fem/waste.ogg differ diff --git a/sound/vox_fem/water.ogg b/sound/vox_fem/water.ogg index 853e7fb4db3..08e6c8a0f1a 100644 Binary files a/sound/vox_fem/water.ogg and b/sound/vox_fem/water.ogg differ diff --git a/sound/vox_fem/we.ogg b/sound/vox_fem/we.ogg index 5d0f2736304..eb417004f52 100644 Binary files a/sound/vox_fem/we.ogg and b/sound/vox_fem/we.ogg differ diff --git a/sound/vox_fem/weapon.ogg b/sound/vox_fem/weapon.ogg index 8ee0d3b9336..b892f246d94 100644 Binary files a/sound/vox_fem/weapon.ogg and b/sound/vox_fem/weapon.ogg differ diff --git a/sound/vox_fem/welcome.ogg b/sound/vox_fem/welcome.ogg index 6c17b08fca0..cde71ac125f 100644 Binary files a/sound/vox_fem/welcome.ogg and b/sound/vox_fem/welcome.ogg differ diff --git a/sound/vox_fem/west.ogg b/sound/vox_fem/west.ogg index 3e281c681dc..588020a1d9f 100644 Binary files a/sound/vox_fem/west.ogg and b/sound/vox_fem/west.ogg differ diff --git a/sound/vox_fem/whiskey.ogg b/sound/vox_fem/whiskey.ogg index 29599ffc203..9b1b03c04c5 100644 Binary files a/sound/vox_fem/whiskey.ogg and b/sound/vox_fem/whiskey.ogg differ diff --git a/sound/vox_fem/white.ogg b/sound/vox_fem/white.ogg index ea7c279b513..0c95d531f1d 100644 Binary files a/sound/vox_fem/white.ogg and b/sound/vox_fem/white.ogg differ diff --git a/sound/vox_fem/wilco.ogg b/sound/vox_fem/wilco.ogg index 7604bf920d0..29109ecbdcb 100644 Binary files a/sound/vox_fem/wilco.ogg and b/sound/vox_fem/wilco.ogg differ diff --git a/sound/vox_fem/will.ogg b/sound/vox_fem/will.ogg index 8d039e704c7..fa1e53b78fb 100644 Binary files a/sound/vox_fem/will.ogg and b/sound/vox_fem/will.ogg differ diff --git a/sound/vox_fem/with.ogg b/sound/vox_fem/with.ogg index 54fc4c1cd7b..7bed6fcc46c 100644 Binary files a/sound/vox_fem/with.ogg and b/sound/vox_fem/with.ogg differ diff --git a/sound/vox_fem/without.ogg b/sound/vox_fem/without.ogg index 3eed0f1a8d6..814e123c8ce 100644 Binary files a/sound/vox_fem/without.ogg and b/sound/vox_fem/without.ogg differ diff --git a/sound/vox_fem/wood.ogg b/sound/vox_fem/wood.ogg index 640314e4d16..ec84917ea4f 100644 Binary files a/sound/vox_fem/wood.ogg and b/sound/vox_fem/wood.ogg differ diff --git a/sound/vox_fem/woody.ogg b/sound/vox_fem/woody.ogg index ccea84fe051..54e56f72e83 100644 Binary files a/sound/vox_fem/woody.ogg and b/sound/vox_fem/woody.ogg differ diff --git a/sound/vox_fem/x.ogg b/sound/vox_fem/x.ogg index db98a053d8b..c483daca87d 100644 Binary files a/sound/vox_fem/x.ogg and b/sound/vox_fem/x.ogg differ diff --git a/sound/vox_fem/xeno.ogg b/sound/vox_fem/xeno.ogg index 2b3fd99fcbe..ed486388d8a 100644 Binary files a/sound/vox_fem/xeno.ogg and b/sound/vox_fem/xeno.ogg differ diff --git a/sound/vox_fem/xenobiology.ogg b/sound/vox_fem/xenobiology.ogg index 4e04e305e99..f5e6554052b 100644 Binary files a/sound/vox_fem/xenobiology.ogg and b/sound/vox_fem/xenobiology.ogg differ diff --git a/sound/vox_fem/xenomorph.ogg b/sound/vox_fem/xenomorph.ogg index ea04350bf3e..5558123f938 100644 Binary files a/sound/vox_fem/xenomorph.ogg and b/sound/vox_fem/xenomorph.ogg differ diff --git a/sound/vox_fem/xenomorphs.ogg b/sound/vox_fem/xenomorphs.ogg index 369033fb4c5..caf268c9667 100644 Binary files a/sound/vox_fem/xenomorphs.ogg and b/sound/vox_fem/xenomorphs.ogg differ diff --git a/sound/vox_fem/y.ogg b/sound/vox_fem/y.ogg index ccf57ec9356..eac894378fc 100644 Binary files a/sound/vox_fem/y.ogg and b/sound/vox_fem/y.ogg differ diff --git a/sound/vox_fem/yankee.ogg b/sound/vox_fem/yankee.ogg index c93e921a9c9..6121116435c 100644 Binary files a/sound/vox_fem/yankee.ogg and b/sound/vox_fem/yankee.ogg differ diff --git a/sound/vox_fem/yards.ogg b/sound/vox_fem/yards.ogg index 640ad49c189..ed7a8a35e0c 100644 Binary files a/sound/vox_fem/yards.ogg and b/sound/vox_fem/yards.ogg differ diff --git a/sound/vox_fem/year.ogg b/sound/vox_fem/year.ogg index f31f2d168fe..4376f8f1251 100644 Binary files a/sound/vox_fem/year.ogg and b/sound/vox_fem/year.ogg differ diff --git a/sound/vox_fem/yellow.ogg b/sound/vox_fem/yellow.ogg index f703e96a25e..0588027ab6b 100644 Binary files a/sound/vox_fem/yellow.ogg and b/sound/vox_fem/yellow.ogg differ diff --git a/sound/vox_fem/yes.ogg b/sound/vox_fem/yes.ogg index 7523c67bf72..8c9d4fe441d 100644 Binary files a/sound/vox_fem/yes.ogg and b/sound/vox_fem/yes.ogg differ diff --git a/sound/vox_fem/you.ogg b/sound/vox_fem/you.ogg index e279b0a3c93..0f00616bd60 100644 Binary files a/sound/vox_fem/you.ogg and b/sound/vox_fem/you.ogg differ diff --git a/sound/vox_fem/your.ogg b/sound/vox_fem/your.ogg index a947291fb98..9113df51ec8 100644 Binary files a/sound/vox_fem/your.ogg and b/sound/vox_fem/your.ogg differ diff --git a/sound/vox_fem/yourself.ogg b/sound/vox_fem/yourself.ogg index dfd4d8f0e50..137be1bb376 100644 Binary files a/sound/vox_fem/yourself.ogg and b/sound/vox_fem/yourself.ogg differ diff --git a/sound/vox_fem/z.ogg b/sound/vox_fem/z.ogg index 4b984376bbd..6ece175d8f1 100644 Binary files a/sound/vox_fem/z.ogg and b/sound/vox_fem/z.ogg differ diff --git a/sound/vox_fem/zero.ogg b/sound/vox_fem/zero.ogg index af05ce0bc6c..1d9344f2203 100644 Binary files a/sound/vox_fem/zero.ogg and b/sound/vox_fem/zero.ogg differ diff --git a/sound/vox_fem/zone.ogg b/sound/vox_fem/zone.ogg index bb0af3b93e0..b054cca741c 100644 Binary files a/sound/vox_fem/zone.ogg and b/sound/vox_fem/zone.ogg differ diff --git a/sound/vox_fem/zulu.ogg b/sound/vox_fem/zulu.ogg index e853b4af5da..f54eeac9527 100644 Binary files a/sound/vox_fem/zulu.ogg and b/sound/vox_fem/zulu.ogg differ diff --git a/sound/weapons/empty.ogg b/sound/weapons/empty.ogg new file mode 100644 index 00000000000..12ef9e5fce8 Binary files /dev/null and b/sound/weapons/empty.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 548d5fabb98..d95ef20d0cf 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -221,6 +221,7 @@ #include "code\game\atoms_movable.dm" #include "code\game\communications.dm" #include "code\game\dna.dm" +#include "code\game\say.dm" #include "code\game\shuttle_engines.dm" #include "code\game\skincmd.dm" #include "code\game\smoothwall.dm" @@ -479,6 +480,7 @@ #include "code\game\objects\effects\decals\Cleanable\robots.dm" #include "code\game\objects\effects\spawners\bombspawner.dm" #include "code\game\objects\effects\spawners\gibspawner.dm" +#include "code\game\objects\effects\spawners\lootdrop.dm" #include "code\game\objects\effects\spawners\vaultspawner.dm" #include "code\game\objects\items\apc_frame.dm" #include "code\game\objects\items\blueprints.dm" @@ -743,7 +745,6 @@ #include "code\modules\awaymissions\corpse.dm" #include "code\modules\awaymissions\exile.dm" #include "code\modules\awaymissions\gateway.dm" -#include "code\modules\awaymissions\loot.dm" #include "code\modules\awaymissions\pamphlet.dm" #include "code\modules\awaymissions\trigger.dm" #include "code\modules\awaymissions\zlevel.dm" @@ -1032,9 +1033,6 @@ #include "code\modules\mob\living\silicon\ai\freelook\eye.dm" #include "code\modules\mob\living\silicon\ai\freelook\read_me.dm" #include "code\modules\mob\living\silicon\ai\freelook\update_triggers.dm" -#include "code\modules\mob\living\silicon\decoy\death.dm" -#include "code\modules\mob\living\silicon\decoy\decoy.dm" -#include "code\modules\mob\living\silicon\decoy\life.dm" #include "code\modules\mob\living\silicon\pai\death.dm" #include "code\modules\mob\living\silicon\pai\examine.dm" #include "code\modules\mob\living\silicon\pai\hud.dm" @@ -1146,8 +1144,8 @@ #include "code\modules\projectiles\firing.dm" #include "code\modules\projectiles\gun.dm" #include "code\modules\projectiles\projectile.dm" +#include "code\modules\projectiles\ammunition\ammo_casings.dm" #include "code\modules\projectiles\ammunition\boxes.dm" -#include "code\modules\projectiles\ammunition\bullets.dm" #include "code\modules\projectiles\ammunition\energy.dm" #include "code\modules\projectiles\ammunition\magazines.dm" #include "code\modules\projectiles\ammunition\special.dm" @@ -1204,6 +1202,15 @@ #include "code\modules\research\rdmachines.dm" #include "code\modules\research\research.dm" #include "code\modules\research\server.dm" +#include "code\modules\research\designs\AI_module_designs.dm" +#include "code\modules\research\designs\comp_board_designs.dm" +#include "code\modules\research\designs\machine_designs.dm" +#include "code\modules\research\designs\mecha_designs.dm" +#include "code\modules\research\designs\medical_designs.dm" +#include "code\modules\research\designs\power_designs.dm" +#include "code\modules\research\designs\stock_parts_designs.dm" +#include "code\modules\research\designs\telecomms_designs.dm" +#include "code\modules\research\designs\weapon_designs.dm" #include "code\modules\scripting\Errors.dm" #include "code\modules\scripting\IDE.dm" #include "code\modules\scripting\Options.dm"