diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/Academy.dmm index a7fab7df3a..4d715cb369 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 f127a7c95d..12f9ed6041 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 e47775466b..bacbe6b4aa 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 5e560a3c08..a80f111296 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 e1920ee74b..01c640a184 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 4edd744fc3..0848187f53 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 d156e3644f..2bc373f7cf 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 2b2ec65d76..37119d795d 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 f25531c939..878dbb8e93 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 b3409eb2b1..e61c72e96a 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 f50bdc5b7b..1f375037bb 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 e22be902f7..f7d5e53da4 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 d91a2044b0..5d47b85525 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 83affc6a0c..923bb5ea0c 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 2142b7b06e..a5a222736f 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 b761ad7150..e2332110eb 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 9441b78e48..3ac6219b4a 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 025cfded08..3158503861 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 049c336036..b893e822b9 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 545163c9cf..4a6aee54ea 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 3475707294..83b478442b 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 279d736f0f..260348b7ea 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 79af6de527..deb86fb9f8 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 b3632c84a1..ea66aa52d4 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 97714f1f6e..8aa828e117 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 017afeaf7e..41b0ad9619 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 a19503b7b6..062bbd7111 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 3a668a1dd0..17d62269f5 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 f87b9982ce..cbbb91683f 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 118c036c1e..0746540208 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 348ab41736..837e70ef4e 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 5ca05a0594..a1067d42d2 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 c67f47a403..47b9b94048 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 ce74f6cfbf..7956edb5a3 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 b9eb1d29a8..1d9e9e2d21 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 556800d1ef..c1cd3304c8 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 833ff4b93d..53858c331f 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 5089252dc5..37eb751e19 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 71b6bcc47c..63bc81b63f 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 5b63966de7..98e9574b0b 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 8073684f64..d7150693bf 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 b86d5e613b..5b189df3ae 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 25c256322e..66998d42a3 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 8f118599e6..9e0496a924 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 12ba4ad3ff..440a907e52 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 09081948d1..eb44cf81c7 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 6b53dcaa22..f833a5589d 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 b894a997d4..f7caa81233 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 aa06a59503..ebf047212f 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 bf1bacc94f..66168dcc93 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 8e748e94a9..24cb285cb2 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 519987d888..0e43d1f89e 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 ca4c3bb6d9..2d26a49903 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 c90a8c19db..87d1feeb1e 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 c67817e646..f784638362 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 69d5a23bb2..f0dc1c3c72 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 5b8174a965..932d14deee 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 813d44dfdf..cdc83c0ba9 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 cf22da2e3b..ab0073a6e5 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 8083c11d0a..deaec8acf8 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 46cbbab20f..de62d80c32 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 1108d8cdbb..0b6b63d249 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 e7c71a5942..d40e9a10bf 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 2cde6a019a..b74828c83f 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 7814d21753..d4f46b104f 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 da3b635c43..5f8d3c7d38 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 6e1c9a0a07..83fbd2c883 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 5bc835af74..3f8238177f 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 97bc448a4c..1af635b5d1 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 d59767f6cf..4d54909b27 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 7477a1bea4..2fb8c9bd85 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 7078ea3df4..f5d6ceef2b 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 db72c42f8b..782e518ffd 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 9317fa12ef..a62c482542 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 bea72ec36e..e22016eb01 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 9aa2c6c1fe..764119b587 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 2ef958bc04..a56e62c28d 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 bb32b44e5b..74dcdafaa9 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 8400d196b6..ef85ab1961 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 ceddf45117..9a677b7111 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 fb9fe042b8..b6f6aa91f1 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 e014e90190..6f7f16301b 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 521176fbf1..3c6450ccd8 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 1defba4e13..9de82ceaac 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 da0540c8bd..ac63febb37 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 70d24233e4..3526359ead 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 e066231960..4257921503 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 7b19b9a092..e8d6fad377 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 31c7f575ae..32b5a31309 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 f292e7648f..13014725d0 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 10e2f92a23..f5e60ee7b0 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 262c59eb77..1c6d5ce341 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 17dd3f1266..8090a5221e 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 ef0b79ac27..089c9cb2cf 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 8a0e6658ed..60bc8423e0 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 2a7357e2e7..30567e3fe1 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 de0ce7a767..ac9ed3763c 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 85f57ba6f3..48d99e1d71 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 c63f2e428f..4e1ab7ef49 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 0268bf7914..6b7bf818fb 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 3f0695d07a..30f3cca3f1 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 6e3ac1d88b..fccc80ae5f 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 df96df6c76..0aeee6b0bc 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 28f806a74d..05025fbc6f 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 12690ea4a4..c191abe326 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 d00ad36f0e..e997d1ec9f 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 22a06b41da..48bc30e5b4 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 7f724237cf..ac4576042c 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 984888483b..903a983e7d 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 e59b57e17e..937d461247 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 45c996ddab..188161d723 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 177ee48f56..6844ffe118 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 e1e257b927..3365038e72 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 d18d2e33a7..bd8c90e943 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 f9534c6b63..e0615b7582 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 d981874eeb..2d5225758e 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 acd65579c5..8e3d8f9ad8 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 de5f6538d5..9209b4f3df 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 ac5d17ceea..2417819e6c 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 7d6f10c52c..cb1fbdd641 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 55357a20be..62573d6032 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 35b5f42c69..05ab6f49f6 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 a0271f822d..1eea871212 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 59de10fc5e..c5428a993a 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 ef7c78843f..76f3b1215f 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 ba6f61653a..266a7c35e0 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 2e86b2e159..aefcfc70c4 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 ec80e55db8..9b4368d960 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 40e4b35910..fb957f4c86 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 30cc57e9c7..e0b45a6fc8 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 383fcb9c65..c5f11b0ece 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 f58ced881e..d2f36a2ee7 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 795a2976e1..802b3c57be 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 8023e387c9..5742e12630 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 1c09389339..7b513e46cd 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 ae728ff565..516c63e56b 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 545c622860..f3f2ce107b 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 347b911cd7..e4a9c21bb8 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 23352d566a..44bfebdb99 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 ec1667ad0c..39308cf600 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 86e3fb583f..876b57e9b6 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 152b25fd4f..82df3de755 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 896e042696..2daf551c73 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 d92f4ecc90..25bc022a36 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 b76b19cb9c..f264701ea0 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 e4fb0e881e..947bbe77df 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 5dd0535a9e..f177f2ed1c 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 bdcaea0f7e..a757280af3 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 94795f8264..e151bfc759 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 b58fc889a6..0bd36e3f74 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 ec9da16ba3..927645b740 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 169d8ef70a..311cc72910 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 f390afd429..8c9c2705ef 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 cd1ea3b5ce..fc4c18c537 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 16c1ac6178..78876d2c06 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 7ab878e4c5..16ec25f171 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 e48385c47a..c4e52d403a 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 ad7c6abec3..9671df6d94 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 a01dd65cdb..4fc05d7ef4 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 52a768fbb4..12bccdebc5 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 e59059859e..cabf12e418 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 f997ea8602..653618f589 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 2d264251da..6757442453 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 b803c611f8..5bbec89893 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 530c2bc3f7..9ecedc5142 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 904e526682..efa7140e7f 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 5b9733cd82..8061ba7f4d 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 919eb89ce2..4e0f21b531 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 6a1518e311..910feb64a4 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 c0fb82d88e..959767107a 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 f5612c6aef..5ee821d027 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 0c9a07ebee..1aed8927d4 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 1ea98bb5c4..9e1bd0616f 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 69b80866b8..8d41384915 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 851fd8c705..9c1b8ee09c 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 cb0b987997..d6a97d6723 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 0a997bfdc1..a9f6233372 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 e53c29e188..205886991a 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 d8d0b0c3e7..65fd8b1052 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 410282a754..4b97f50462 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 8e9700cc7d..a6de46e209 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 ff0ec5208c..599c5a2042 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 04341733af..006e992968 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 a551863c0d..cc54623857 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 df07d30f15..17cfec9e56 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 52a9164785..a34d7cec51 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 50da8e4965..a76c3e2445 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 2d56897af8..a639b5f63a 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 62a0efcda1..7ebf0183f4 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 8dfa3f3368..66a5036a9a 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 4567cb95b9..79ae3333d6 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 8acdf01e5a..4e9b858327 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 95ff6eee23..0a56ed5aa4 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 8c5d778de5..54b79470b1 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 5ff842c428..d7a893a37b 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 1fcb665b5f..3da9e78669 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 e2c0455825..116f2cd457 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 422de427f5..402bd6162f 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 39dab97020..742bbb1df1 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 1d0f6f1d37..3e2c9ec363 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 d357e91c38..47977d2a77 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 377d7777b0..94915cfa2c 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 b6948a21e8..e6618e62c7 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 0000000000..95e14fe9b2 --- /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 b6b40b42de..68c04cf5d5 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 cbf87e7b1c..c7818ed01e 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 208a2111da..0ad3469a5c 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 3584b97b28..2935773a75 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 bed61da06e..66ce3c1d56 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 5583cc1f9d..752d894dfb 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 1d11b7a44c..082db03166 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 0281a7b0e9..e576cc2e10 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 d0374abb08..27b7ead939 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 039f0cb215..24edb35624 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 24c0d8f5af..c6cfe12380 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 df97a6ab82..c719a49a66 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 7e2bc26776..503608f666 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 28f9936054..a8e111e309 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 324d941cff..c765eff2eb 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 3e49179e76..1397c2d157 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 8dca298554..9ab97b5cb9 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 200c0a0a85..3945db0dd8 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 eb5a33d17d..0aef25a67f 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 4126181ea8..6495170527 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 5a66365263..4a56ab7b1f 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 f88936e66d..98040a5265 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 9765eacd19..8d97401752 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 3c5ba61086..b203f1f3bd 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 ac5c1cbca9..4264f29e54 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 1e3e915760..fabece80e3 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 66f22c5cc5..9c5b5e4d3c 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 2630ca2757..80fc7c2ec0 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 adf2e4f725..a76a3e35da 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 62ab7c6879..2553ebd372 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 e056c275a2..29e4534a1f 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 bf09d24a89..ffc7b60fe2 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 37245f065f..74e2371756 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 1417d8da2a..0059be158c 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 8713c39b2c..3b8180c78f 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 39cdf599d3..7d8a694085 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 90ef0b0b54..424029867d 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 879faa9f2b..fdf63866f6 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 cbb3ac81ef..783e5c833a 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 27cae71883..ce066c0501 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 a5cceb0170..c0773df5a0 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 070a026488..bce56df922 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 2def6f3c4c..6100e83658 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 fbb71c3c48..3becca9251 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 8d2513a2dd..4507b1e0bb 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 e1895f2928..30e44e3425 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 27e7f8deeb..7db2d68d5d 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 d8cbe11c63..ecea832699 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 bd0bf77b01..56f1cc4905 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 9c1e150c3e..cdb07a9e56 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 6449a0ee71..f497312f5d 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 dac4c8ba93..f45a8b5766 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 5f0e04a332..d18db0702c 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 2972532705..1ce6e22f98 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 b285494aea..4efc8c6292 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 fc45cbf094..03ba70127c 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 28e7305329..1b0d70e24b 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 a08dd717f8..649111df7c 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 afe8aa8d83..4a8b884fdc 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 5416820a21..64f10372f3 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 ebdcba771d..1c56b4c27e 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 7a06549d66..9b0cef34c9 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 d6c6606970..a1e7aacfcc 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 04c1f737b4..986a918ffb 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 fbc52019f2..d0aed1ca89 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 097d7b400a..bdf97295ba 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 e0c403006d..63817318c0 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 db202e1646..898e96e796 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 171e430bdb..46730d0332 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 bfaa43fd18..514572d4e9 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 a526f7ec19..df18f1b114 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 82c7850793..1d1d5661ce 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 94e4b82993..69a6626d69 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 aa5dda732d..ea89e95dfa 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 50a4c2579c..637d0ebffb 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 879fdba84c..3b3e131ca6 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 b22febb590..a91c555d6b 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 7b972e6b0b..9f0f6e9686 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 26a0e40042..0e9c73ac49 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 9126e268d5..281594704e 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 0000000000..5eea35115b --- /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 9078e262b4..29800a163e 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 2f2ea8d6ee..4de300cff1 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 a9c7e18f08..c47f0c55da 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 be5e780713..12ef24729a 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 97c433114f..b446d3f03c 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 1e516a3cdf..4a595d5f0e 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 1e4d75217f..5e74b05aa3 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 cfeeec22c4..56ac5f09d0 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 49e7bcbd3a..ec64e84c35 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 860766ddeb..f87c93a181 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 58bce47400..b354b25d03 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 38a4334fae..7e8a502250 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 d1363c55f8..b45727cb0c 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 c13e1ac79d..3d4d7b0c1c 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 3deca48ece..a881c5b297 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 174dba2ddd..08b71af162 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 e0375d1308..664f27b00b 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 c6771a1ef0..505482d456 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 c3f96072ba..520a83b25b 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 94ca95d352..309c8106b5 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 d716210ce4..213e618d82 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 2372f653b6..b8300e665e 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 cea94770a8..eb4c446ec0 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 a567d4eaec..efe38fa217 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 910f7530bb..4b9cdbac6d 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 22321eda7b..9f1e3e206b 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 c225d332a2..b12a431043 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 055dddd958..03df9628c4 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 6451ed1174..09fcefa884 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 2c258ec15b..cf5bd6884e 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 928ba733ca..73a04bd530 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 5e5ccbb123..07d97e39ef 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 6a62258e99..3097608333 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 f17048048f..af2f1a73b5 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 50f135941e..b2bde69df1 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 a1cbfbb775..130390dec5 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 05b9b508e9..6e3c6c8697 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 cf654c56c8..b31c883dc6 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 d8ee49932c..ad873803a3 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 4245bf5e05..d35ab672b6 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 d67610f452..0000000000 --- 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 1f0a894cd5..2f3fe0ba0e 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 143030c886..a9debf6f52 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 c95d27a2a7..3c597dd443 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 392768a0f8..4e808277dc 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 2fc6ef47c1..360a0fcf48 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 99265d6cf6..8dae6424bb 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 a58cc64c22..5911f0178d 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 5ea61c79d7..9261975cb5 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 2e551d4161..f45c292339 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 6fe92f5d34..79ae2097ee 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 a739959f78..1a21cda653 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 3fb21d3f0e..d75d293854 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 a6896bc8d6..551d38d7f2 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 0617a25803..92c6e97985 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 26f00b7a44..ee5b0f262e 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 9d9fd3a8e9..7781afff46 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 654c227e81..9062ed7e4a 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 368172ebec..c678bdab8d 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 353b92a78b..cb55bbbd24 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 d24b6cab40..5c5bdfb596 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 51fa161ef2..4ccd64f5cd 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 8b90cb1308..20ec857ef5 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 b41e08d2d0..0174bda76b 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 2fb4b050b4..49deb57c13 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 9a7945d771..ad6a82e04d 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 d7021e0e12..3c93432b54 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 ae4e07094e..090c7ac85b 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 d66ef27596..b45140ad5e 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 2063f36919..6effd5fc41 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 06c821888b..6e25cb211f 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 8053cea32d..55b30f4501 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 d785caa429..28587ed794 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 f202148ca2..db410577ab 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 bc1e79f91d..9d98ca5db5 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 d196603c83..8729f1b162 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 706612fbd5..32692b6477 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 26b35cdc48..b3ec99101b 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 90673de7f8..06f0707f6a 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 353cb8e6f9..6320f340a6 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 9433751e0b..ff7706eec9 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 6d3d4effe6..34625cda3f 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 d35e905f85..91b2c27b24 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 01f8b0c274..793dd7f1e9 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 cd707375e7..268f050289 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 208e034a4a..76163b4723 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 095ed99c97..7cb7c79d9a 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 d3096addb0..f8e003172d 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 ee45942cb4..7ca43af1f4 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 f0e471f02e..05bf056883 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 7d3b013aee..5b73364e62 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 c948602119..c43c4bec81 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 cb949c00ee..e575d930df 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 2047c07110..80ba39354a 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 cd06edeeeb..76fa9c72d5 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 0074715c33..9cb3864acc 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 87d11a48a1..7ec3d44356 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 b21eab3ead..8823a0928f 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 964b6864c3..3a69a546cb 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 3b2fc03923..56c26ec153 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 b4e341fb32..63454894eb 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 d0fce36e48..49d287e75c 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 334d71311e..81c682355d 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 ac5c834291..f660ba1c7f 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 52aca2ed8c..85218ee2e5 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 2f130f34d6..9ae9d7bd63 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 3f0a0b4876..525401825b 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 eb73cd4e38..67f3f0095b 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 1bba0dfd42..794efb49ec 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 b71c51271e..0000000000 --- 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 e79d3fbc79..9082eeb01f 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 766b14c1fa..0000000000 --- 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 5e576701d6..37831db6f0 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 5f330b2ab9..0000000000 --- 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 0263237a03..402f6e9597 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 cf14f45c83..80cb1fdc64 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 efe7e9d47a..bae52d99d0 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 91138a4309..bee27cda07 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 4351ced974..ed3061be2e 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 eb89d6cf49..2c29857b30 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 937323da58..71ad1de781 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 bdbb5bbcad..4b47808e80 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 8a662b5dc4..3504b21189 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 cb4774f6b9..b7f6cb35a4 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 21e5494e2b..46097e7c41 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 a8e2a3e003..a65299adfc 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 0a1b0e02ea..b895068c1c 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 d337e56d4d..df9a0e2688 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 442698859b..028440606b 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 82498bd1af..2f0d259284 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 5e44ce96cc..51b17b8e7f 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 1b3966ebe4..eae87baf57 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 a0d5468503..dcd6741841 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 4b8174cc21..5c9d10c9ae 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 f2dfb348f2..13c0fcc5e7 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 a765805d01..ba715c188b 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 6cdcc417ba..78e1347880 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 3fffa8a595..cd5c6e591e 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 9e99030ba8..e8065e4a12 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 5af4af3c12..1184b881c8 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 be98cf67ed..205decd444 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 ee4865b6ca..de73e26798 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 7d159238fc..e3e42effb4 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 0fd4a491c5..7423fdf456 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 e5757e5290..95ff775c0a 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 220b99380f..7afba60788 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 51d5fbd1bc..7d0f4cf4e4 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 b213659368..58cfe0e35f 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 0000000000..61f1fef423 --- /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 bd29160b64..149bec620f 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 1c22fe9cf6..bdb63e28c3 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 31eff88033..ef91582c3e 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 9c2a59dbe9..0ede0e1d1b 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 5d4f4fa406..ed218c4986 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 c58542f7b6..ec32f437b1 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 f4dcb2f764..f111b5cb5f 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 a7acd1cdf8..33e41fb277 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 a1de3adb05..c93828d01f 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 53977a4481..c325bc9836 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 bb4d03f251..ceea1384d1 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 f9f5c89b9d..615b243372 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 d3996e2fa7..0000000000 --- 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 5881e860ee..0000000000 --- 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 8a336b8353..0000000000 --- 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 385c0ae676..728db94016 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 820f646421..042f043036 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 eb6384f17f..b5a4f0ee02 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 d314224682..4b1cd2c162 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 404d55a80b..eb72fb2b9f 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 0a902e97fa..e5634f9708 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 0218d44432..59106208f2 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 819101c1a7..e9faf2b07f 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 065a23bd8b..7c252092b3 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 06b452e6d5..d23561abee 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 f38bfcb81c..9ad3606dcb 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 1b462749cf..36be2f583d 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 6b3751e633..4e5960eef1 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 b008220cfa..86c36adf2f 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 af38509f42..2c161d443e 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 32362d58d4..11bbfa8a56 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 ebdf71d922..b59ae854e7 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 8535f93c7c..a3854898ea 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 20be126522..8e1ff31edc 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 45c787a6d6..2e2f5ab0dc 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 7b3b06ce6f..f5e164ca75 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 ee89070f77..7721a60bda 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 5dc726708c..1da52ea699 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 8981798077..603d3228b8 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 a4bf985244..40eb8d8364 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 23bea151de..20d9496f60 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 717109e3e3..e0b8ca39e8 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 870e7fb4da..3c4d0c8d6d 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 0ebc94fedd..0c9d0eced7 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 884b7ffc4e..ba3ff0e694 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 d91da2be50..01e73989d9 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 cd96649604..8712f30ea0 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 487dd675fe..5bf229f61d 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 0000000000..f57b424954 --- /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 f470ff5b32..15a3b7df52 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 ef53fcaa77..7b9bacaf5d 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 b002c91a8d..1df8ee0aa8 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 c593cc727a..88fa0d3768 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 c41a479aa9..abeb01e672 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 5233d1b6f3..33df680089 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 18f0e451bf..7433e5c5f1 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 3c13c5709e..ba869fce07 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 bc6cad2a65..2b60ba46e4 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 b942018d00..43551762fa 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 b417f0121e..5bb5c07250 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 c2b41f5bb0..fbf10c64a0 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 56dcd50241..4158e2e1fe 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 a644a5b0d5..e1ff0aa2a4 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 3cb5edc8fe..e9ceeffcbd 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 5336163c4f..770cd676ed 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 d246343d26..11cf4e6221 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 be9f64f54f..cc767928e9 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 c39b9e35c4..205ab16436 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 5f65f777dd..4caf9eb7aa 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 fb6c41d221..ebace57085 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 3b3198fc95..7074c8102b 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 deb5e4e299..fcf35cf32a 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 c036dfdb2e..f9a0be82b9 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 f6c236ca15..b6d5446ce0 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 ee56dd0c6e..d313deaa92 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 276a3b8d0d..a64c3291f2 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 918800c32e..f56e641c8e 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 cdab219a80..c11469e8e1 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 b931177013..9e4da4d8a4 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 a3624b381d..7f0078bb44 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 653b87fa3d..cce34d2f24 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 cd546797ae..5c6225284f 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 e658833186..986141ccda 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 8544ea9bb7..2e24d57857 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 e472b1bb65..21cb505e3d 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 88e88dc3e6..89fd12cf7d 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 043116087b..269cf0531e 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 518c716c35..dca8737f26 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 0000000000..c8188d904b --- /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 0000000000..33839c8887 --- /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 0000000000..bc0d01dd8f --- /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 0000000000..f50c4b9b25 --- /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 0000000000..dcd5f06d0c --- /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 0000000000..a8273cfdeb --- /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 0000000000..1268e86079 --- /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 0000000000..e4de22f4fd --- /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 0000000000..b50e022510 --- /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 90ea97309e..96b6bce013 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 8abbae4220..2daa19ffe6 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 7af28b4a41..ab3b73cdbf 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 2ed12f1173..2d8578d0e3 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 52651452ca..e33370e7fb 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 1002d63f30..fd8c3a3e65 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 7604c209af..0000000000 --- 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 03222ca999..50702de79b 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 62df19d5dd..0e61d58db1 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 0000000000..76198b6c05 --- /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 68fea1b2a4..01e3c664d2 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 d886eef1e8..a4e9469997 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 d54d339a51..947ab871c9 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 5efde47fc0..5c0f93e93d 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 2947ea587c..ced75e39a4 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 411dbb988c..e9fdbd5307 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 2b09a9324a..74f9907b66 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 7b9629e0de..47328e6fa8 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 63aafeb582..8bbc8d06c3 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 ac49d5d6be..afea8e24f3 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 e8c55d3e49..99beec24bf 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 3126cde640..94ff50ba91 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 9a8ee374dd..c7851bc5a2 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 c5914bb587..03f6c8d17f 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 94b91be6c0..94ed8ac6c2 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 0000000000..fbf35abdef 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 0000000000..250a82be85 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 63bbcc6879..b54a3b3853 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 95f6394590..6e8a9004a6 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 db0b10a104..a63f92049a 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 0000000000..3489ca3e15 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 7c6863012b..f91e6de8f2 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 e371694b6c..1eecff6c89 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 ef15dcda4e..2ad134d963 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 81982a0cb7..3cc4044525 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 c8e6ea76d4..0e93357e9d 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 8c02ddb5b4..21c926651c 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 a25661cc08..29938de29d 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 ce3a875649..910a31fc17 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 0b74101ec9..8248e05778 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 1d4e67fd60..28d3dc6735 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 d9db1b83de..e3a82f7ee9 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 f49bcd878d..662f74e7a5 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 4a7a260665..526352d0be 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 d045d6b254..b45be28c06 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 d9c536be6c..d90dec63ab 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 404b9d4043..89df9d6889 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 3a32cb8168..04359f62e2 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 242c094023..c7d967e815 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 4115198e06..950e3019b2 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 6affb0e3c2..0375ccaa70 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 c1249bf962..af61ae25ce 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 4f42cd10b6..b3aad59735 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 d17cf6ee97..9e66d9b1c2 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 3abd5ebbd7..4895423f5e 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 097685c71d..9a427ad6fb 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 52c4d6b59f..d02fbf8d5b 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 bcd722c96b..ab5aa85a0f 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 ce499f11c5..a38d05c935 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 3ea42298e3..efe51a5568 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 4f8dc14018..e13406ab28 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 5d7c8595bb..c371f13ee3 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 b64e51ddbc..6765aaa98d 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 f1fd37d984..16cc4b4571 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 5a614592d6..00849a70c7 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 55c390aaa9..65e50cb55d 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 b5e648653a..bf10035db9 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 91b99cf672..8b84b7b543 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 d6dc3d2a16..e1514d1bde 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 240ed4d32c..c91427b976 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 e631b97ebc..7bb402ba3e 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 aa1cf4ca4d..270325ca9b 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 0e980613d6..6710dc1332 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 d8509a510f..be00c5c1ae 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 ee9adea291..1b8b486713 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 c482e0db21..3caabbf9d9 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 3d812f2fef..db4291d93e 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 752be57d8f..6665a1c2b6 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 b261433ea3..ab51e76032 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 7eabf85a29..d446c21281 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 612d6ab4b7..ce06096ef4 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 bd45395c0d..446edf4787 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 ffece4ca03..6d75570f0e 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 655a2f76a7..1de7b20fca 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 a14d2cad1f..332ed3b331 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 127e498e22..d7f91f8132 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 47296e85ad..2f7fedada2 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 2e550b5c7d..3f482d5ccf 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 e5444171eb..9985f7c56a 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 77e7a83bc5..87fd5b3cc0 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 77c9e19e81..6b3e758e90 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 b3cb0af028..3dd4e2cec6 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 74237046e2..04d64df9f2 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 d75f5782a8..25fee81844 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 160c63d1f5..6f78b3a820 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 d73dec5177..9706d29945 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 fe61b64971..a4aac8563f 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 925b02ead8..e3ee37f2a0 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 011629a152..202d8f229c 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 ab94bf3fe0..9b25bf1d2c 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 e11d695a5d..d9064b764a 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 55ff5d6eb3..914a083c5b 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 3e1fd695df..4efbb34970 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 2a07a4de4e..b291d8d40b 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 32c80e7b34..348715b151 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 25f9504c6b..dab8e1257a 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 2d5d30ef69..9c74790de4 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 52bac57877..21d13d1e3b 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 8208b0bf92..0d97cf44e0 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 0363e5effe..2bca816f34 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 06bcfc8530..c1850574c5 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 2ec3f494b3..eaba95e28b 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 3b950aae12..b95f17f8d7 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 0fa6340c03..fd5369c05a 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 4fb6c76269..7a846fad7f 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 7912a06f8b..9d99aaf706 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 9660d48c13..eb22702486 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 00b2347b46..a1c80f6d5d 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 3d7ce663ac..b31c342b14 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 7474c75173..f5e7449143 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 6d4a237fa6..4fdccce68c 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 8ac529fd93..d859a72729 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 8b6b73b8dc..9040e35ca1 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 c87f00cacc..b40530537d 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 d3082bb146..74b888be6b 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 2e5830b432..842cd36f51 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 891e7156f0..b3c418cdd3 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 ba4923e0e7..7ff6e2d303 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 db5ba36207..bacb92bcef 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 94a6c1e7e1..23077d3190 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 f511399c21..c581b1826c 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 9c6404df83..fa959cf317 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 f7777bfe59..2528798901 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 4e05d4b115..1edbec2af6 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 0559204e26..46391d79d5 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 be4cd9990a..2ebe6e95ef 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 ca2ed7a42a..a18a7e0bfa 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 c82908eb62..0178175604 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 f94e753b4b..111d71d51a 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 80ef803fc0..591e4506a7 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 8de2dfc54b..f79015a82f 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 700b9beb4d..21bb943905 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 0ea496386f..28bc282ae2 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 73ebc3a3a5..31e27ea453 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 a5655f9c8f..e478f3c242 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 2d8103e3a2..3d92a00373 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 6b233f565b..2f4f969e63 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 58750503eb..a82df55580 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 fc880498a4..985d715bff 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 c666bdb1bb..d3c414ff98 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 b02f62f316..4461a7f1a4 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 5acb9a4546..1bdea077e1 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 80d3734f3e..baedb710c9 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 dd194d2c9b..9582c594bb 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 024e408a20..d646753410 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 17b85fc3a8..d151e640d3 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 cc8674f206..669ab3ebba 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 327085dc37..11dd067ace 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 2fe6da29f8..f236049a7c 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 38b91cca88..0074e0ffbb 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 923dcfd53c..dc4065daee 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 ff8140db90..4f7f8ca3b9 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 e3dd073d98..c44383dd59 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 f9cf6b2e3d..952bee8356 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 46b1cb16f0..04227fd5d4 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 75873e43a5..a343df23f7 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 4aba6793a7..f5dac8813c 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 f4f749fb57..4a886bbfb7 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 7efe69a435..caaeb7057f 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 2efb8db8b2..04624fe560 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 d5700592e4..37abf11e92 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 399fe35133..76ea47f7d2 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 7c07d670b5..f05ec68ac0 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 83eccc85a4..55a4132060 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 a43f980192..08b44edc4e 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 40f392e24e..dddb8ce976 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 7307b3c3cd..4e3f77b0ea 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 cf06ec003f..a1ad0c915f 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 921b10c9b8..9553b60f79 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 1434459c3d..d6bf99ddf4 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 6eb032bad6..6c2678fea9 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 bb465bd949..3a8bbd48ae 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 fad8709bbb..fb96cc7cce 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 dd7e56b796..cb483e04fb 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 c25839a87a..63cfcbc64c 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 1f3eef8f34..b44fc72b8f 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 61ff085b6d..1ff0a0e862 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 c0c3a5c988..28bde2e276 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 7a8dce32b3..924ec152f6 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 cbe5ee43b3..0cbd8474f9 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 2596d508c0..3391f7f859 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 a438cbe1e9..b308ce59c9 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 88a470d088..835111b1d7 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 e5343a59ed..a08e6c3f44 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 bb80968c1b..3af6acb99e 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 f4fb598a08..602cc083ca 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 2b349d7f5d..175bfe0107 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 df82cf7690..39cc18c616 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 19c16b7358..906350fd67 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 e7f3c2d30b..5dd123050f 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 8569a012ed..25331eeaf2 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 ac97981767..a663a6386b 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 4a65c20630..825cc55816 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 5291ce51d4..6ac7099d0b 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 af10d76aff..a073605021 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 cedc660917..4d93d28cd8 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 4377136bec..c6a69398b2 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 8bca7b52cd..291c5eca45 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 da440eaf8b..0430995064 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 6254b76fbb..7a9af66368 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 fc587cb8c0..6034fcc641 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 273c032994..6bbf45589f 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 df8f32fff8..e4bb08f3e8 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 0f0b2e3080..5c60751cf3 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 49cf5087c0..b7b6a29d0d 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 a229bf163f..ecf7111a42 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 8e61c7b7d3..b9c239faf6 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 9f940752e8..c9b2f0ac5f 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 ba21120dac..58788723d2 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 343cf63fbb..bec4c9d2f9 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 c16d677a70..d4383ba908 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 e2cbf9768c..ea38113247 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 3852600916..1e2bc8cc65 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 879cdca52b..5289a375ca 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 46de869095..d0e52f084b 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 9f2599867a..ee7d2112b8 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 2983abc996..358d13f106 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 defb291fca..1936b115cc 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 5788e09651..93d796ca9c 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 c0baeb0aa7..a11ed9be4e 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 b96dc916f1..02a2a172cf 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 f8d4e646fc..44c45e4a99 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 a51cde6acb..5567566d5a 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 7e5fa8b4c8..929f5514a3 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 69ae043721..844fd8e7bb 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 5722745a57..7a6f504887 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 348f7a206b..e02d791316 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 d45f874124..7937c16d4d 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 54a7b249b8..d9b1312603 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 76e8080b72..ad026fe003 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 436e4ca456..717f55ad63 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 c095733623..c10c8a621d 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 1629ed336b..476f16484f 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 3a1dea1e96..184541bf63 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 1048d35229..53afe9584b 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 bdb521203b..73bd6d769f 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 7e0955c1b9..edf6d8aa2e 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 9108abcdfe..a9a6992ee9 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 721778cdd7..5a49a31a29 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 86f05c79c2..1914ade3c4 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 9954642d15..352bce6e45 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 6df5916813..74216b9a2e 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 720b1e96ee..80f7468142 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 6060522cb1..b94c99517c 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 e992afe443..89cc50ea82 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 6bedf4cd01..0343d6b3ff 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 254496586c..b8255dad44 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 b5b23a6845..b71757c7c1 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 41e15b0725..d1dc9e44ec 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 a4fba8f60b..4737c4259a 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 282ca0cef1..db52a76917 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 7da2fc7b7b..9ef771b167 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 a16bf5bb37..014b7d4251 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 9b6d8e9164..a1019a56b9 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 e492f452bf..d5d501d475 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 db0d7fcae7..6b3f5e0fa3 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 6345c79edd..eaf89e5f78 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 0aab3c217c..4f5fc36bbe 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 df5af5ae98..575ffb613e 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 6e87fb0dcd..61f995103b 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 c82528572a..2de5796c8d 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 68c0f78012..e6ff55b242 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 e521785972..a7f16e38ec 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 464709daa7..268b18abf9 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 ab85499bd8..5c867743b5 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 d6efec5060..5280d49b2f 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 94214d1e4b..4f64b89c48 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 bb6b0cfec8..e94c55fbf2 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 78f625abb1..f2f5362b3e 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 90a9c1d51d..eacf7a7c01 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 e8c11d5eba..748d021e33 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 6c9ec75de8..adc5e48c9f 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 05acbcd676..1c877c0129 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 3e9664a12a..2b4c010265 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 8e827d8c86..3604ce4c91 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 f171cac1ce..fccf3f566a 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 bbf6ade32d..a65a8b11b0 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 716eee1a79..9ae01e8c99 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 cb166a52a1..4bf9738844 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 b0c93f1cd1..e8ace3d943 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 3e1d4314b1..3f21184de9 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 5c9d0fd53d..63760754d5 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 47875554c1..9be827d7a4 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 d63783979b..586f15063d 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 ac8928c306..893e9a1569 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 04b9138e33..581e92c918 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 349efb3d3a..f7d7345607 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 cab850b882..11e2e143f2 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 d374803448..b88d5eb40d 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 982f45ff02..45d82c59c9 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 63b3afe242..de9050bc91 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 6a218ff1c4..1fc69a3499 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 71e2d1782e..0237ae19c0 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 294ea6099c..7d2195b4c5 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 879a0ba203..1b7e5b6ae4 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 c890be8112..837d5ce44c 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 e3b71218ec..16e1fbffeb 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 4b626a7537..f2d1a8b5e6 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 f2b3864f6e..91d6e879ba 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 22fc18babf..c7add65988 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 7d021003ce..777935ecf3 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 1e06d01697..a094d6017d 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 00530d867a..df454d1168 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 2d82b71f0a..864acfd0b0 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 8ef0d3afdb..ae99aaf3fa 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 05a53ab599..2302294844 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 4c87acba20..d83892a4c3 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 d92ae45335..3e7ecac435 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 f78efbebed..3cf5c1638a 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 2e8f2b5589..3122f27511 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 de5ecafdb7..221aec588a 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 98148ef402..974c80b862 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 a4710dc43c..41a3556c35 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 885a697805..29569f6a7a 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 7a0c954ffb..c59ff59216 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 1a6919bbf6..47cbbab958 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 347a574727..4507339b19 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 be50c44607..cad5232be5 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 4aec99e933..b56cab9942 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 8449e5a33d..54f3297485 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 7392d54b92..963b2a1f11 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 927b567987..516adc16fa 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 7f7c5ed272..247164486f 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 5554a95a2b..bdee8e497f 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 b29083a01e..52de984e6e 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 e9fefb59d2..e371348a80 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 531b5ebcc7..b82884ad7d 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 b939b51bb0..4184feccea 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 67683c80de..54539dc84d 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 be6181d5f3..efc7a24f31 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 d0253cbadd..589cb64d42 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 c7dc623724..0fb1a653e1 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 6548a0276b..5620518d9f 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 17b4412636..77a5a9f8ed 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 3740ab7bb0..c9db0e71a1 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 ede58ecacb..9373505f27 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 545b48b7a5..09db3ab062 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 865def0e7b..4524e2b452 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 69158e9323..93af36a415 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 7da688b7f4..b18db6ab2b 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 a8f7dc7760..29028b2223 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 b77af2c2e4..766980da4b 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 7b7528c357..beb8b66e8e 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 f4c2e333c0..9a73e827f8 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 9980a72fc2..d8b1d6a1e7 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 c496303ba7..f0a09d7083 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 9600aeb500..bcf17e34a1 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 6372ae2193..4b95210e8f 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 5b9a349e8b..c93e5a453b 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 ba71718e48..4e791416bd 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 165bd1f507..d4abd3cdbd 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 fada11b05f..3d9d0f58fc 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 460f249126..b00875f0ea 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 a671930306..9f9b0fee20 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 14e830e54f..d32e84f8b6 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 888a486314..1e5e48f4dd 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 75f88be2e0..111041cb52 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 f169bf4d82..93b5d9fd5b 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 b257fdafe8..a9e1703d78 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 8f2cfc5943..03319bb3a8 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 2003dc273e..1d78bb78c9 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 c7a0cda09c..7806471586 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 60218fad01..ac2966daff 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 32dbe83fa5..023d6ccec9 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 7045d052fd..bab8c25f96 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 b5a8a00711..89d11ae6a1 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 ed6aebb8bd..d2a38d0160 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 8dd8ba644d..e21aa7521d 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 f9b9f705fb..bf78bfde8b 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 137aa4eb1f..bdc3aa05ef 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 d390ce55b8..a445c04df4 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 950d2989ba..b3514dfc55 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 a1bb5740f6..4870bbe950 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 3d385edabc..8c07173125 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 b4ff9015ca..f3cca6e482 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 513e38a225..47d4e442bf 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 2948ea615b..2bf7cc84cb 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 282b6f64f7..5b9466f5e2 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 1649f7f4e0..1e6b9e66c5 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 c5a4ef2ba8..e704c91cd5 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 14083a1115..33a4d8172b 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 b1b9d9db17..a49f98b0cc 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 695834739e..99434ebf14 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 44b01488a5..30b78e0e17 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 833d738b72..bac548f7c8 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 99c8bc3031..f80354f00d 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 23ddae5b63..453363e076 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 ab8edf45ff..f95b10ddd5 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 8b08a15c07..7dd53dc47f 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 5cc6cf5012..df1655ca06 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 c9ef267aa2..ec48fe61cb 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 58b1922554..5a71a33f07 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 11d33380dd..250e678114 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 5b4e06a714..6b39bf1614 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 dd279d1f0d..0739b28b26 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 9fd2ae66da..c96355b58d 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 2d88b709d3..e16b458ab6 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 75e1a82a0e..66b24a5d3f 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 ac59df5bba..f3a9588ada 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 d01c259980..8cdba6a257 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 dbe2033b9a..de69e00c8f 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 b57f5d6046..83eeb175d0 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 4503186a13..ba0e43ab9b 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 67a5ad50c6..502bce58aa 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 0ebaddd9b3..429b39857f 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 a3d5f00b27..75a1549c6f 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 ef0e7a54b9..0de3bd36c7 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 281640fd70..0ff33b8234 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 8d9b9b147f..4713bac1cd 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 560a77a8a8..dadcffc3ff 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 fe21d05dd4..b4f1d01370 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 90767598ff..39b7e1439c 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 665eb0d630..f1eb19eb74 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 15cc27ddfb..97fdde4c18 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 9aaf647099..b585fc4a09 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 917f601c74..ad054a7130 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 558ed877d9..9a78193b46 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 82ff9146ef..4dcbdc6e9d 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 c467fc848e..1f9ef74e54 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 fb4c2c44cb..54d4ffe53a 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 429c43be7e..fc6ae2366a 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 e9d4a5d873..e0c396f547 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 11a664c211..10aa196c4e 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 897ffa8c1a..c11a89d995 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 6136864cf3..e800e84d00 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 4b1d67a55a..86601bfa1e 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 10a3b9c487..d28d7b15b6 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 f743233550..ad5a1c1b42 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 97605a7801..8eee9df35f 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 f0a86173b9..f6fb6736e7 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 01ebc8c57c..7efef865cf 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 21e8630394..b5cd9e5f55 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 7b54ead385..403b9160f7 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 4d292fea76..f5d4df7193 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 b13e087ed1..afa6bb4595 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 0e612ab944..09fc769dd9 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 bc4616c94b..ecfacb733e 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 b6cf3820e0..653c31e346 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 1f3a566c68..ae28974e40 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 0a793a5e0c..5bf2488341 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 2a7bbcf604..4f80dd195a 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 f26e298ea8..072a208af9 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 d9e1932ba1..be42780f46 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 181f328b4e..749a9e5be9 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 17c5e4350e..96806dc329 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 7093d9b2ba..5404634ab1 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 50b92351b6..114c603ed0 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 d26fbb30bc..d93b653436 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 fc7354ad87..c9d163c3bb 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 73e645acc3..fc19d3311a 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 a4f327a16c..0ad410030a 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 17c3b88cbf..ae2dea023f 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 23e4c515b0..005b7e204e 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 9815ca2de7..5c6f721dc0 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 3cc46c1332..567bb69431 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 05c685afe0..d9ab530b1e 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 6d63e7ae27..fcc285fb8b 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 c73cd8ab25..98eacdf549 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 2dbdf71f07..15747e8d93 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 48f150b0d1..23ec6e2b7b 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 20d369f80b..d9eaecc16d 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 4d04f5e3c3..c68029951d 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 b340e7719e..5c7432454d 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 a129f00192..f4d5cebad9 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 73e6998399..39ebc8678a 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 e8822faa4f..9eba8eab37 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 4537f7506f..54f6d7cd52 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 2ae907a8ee..4b693d75bc 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 3bab79725e..4187d273d8 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 2c006cae16..ede9921a16 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 4cc35d7528..829119d817 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 9fe76bf9fe..c837b25f76 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 15b655dc68..aa2c783b50 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 f11253d41b..fa1345c3dc 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 7f819bce56..8c7f8f147a 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 c842cf3b26..7f8cb296d7 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 a664808d44..a3e52593a3 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 78953a1b68..0452d8f00e 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 76a95fb537..13d301240d 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 579debcc06..c31af991ab 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 66993b29be..deefb0e56a 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 0814a13c21..4564070d09 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 d9d5500fbd..b6f532b55c 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 f04c43e231..98478476fe 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 089992f65e..c0f8ccc63e 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 8b4572fc36..9c15d2dd3e 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 46a6da1205..1763bb631a 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 ad297f4d07..57a03c9e82 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 36071a9cfc..7234289c36 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 2c9058fc65..468d2eaf31 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 df55723b2a..b849d536b0 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 d3a7af1d21..fed35a8464 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 9b5107ecfa..efd970ea19 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 bec00b0675..ad3af8c462 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 b28b48d98f..ee0c442249 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 2fd0bbc715..83c4293657 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 34e6f65933..73dcd7f0ee 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 121421ab28..a5d1e631f6 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 661626e31d..a14a2eaf0b 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 a84dea0e80..5d4e668979 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 ba857632fd..17bcad6f12 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 a45820cbc0..c3cb81cc39 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 7dc48cbb39..2fe07542c7 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 01edc35ff2..ea05564d41 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 3c217f6899..4d7226a0b1 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 2053dc0eeb..2f661b9c5e 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 502cad9078..d7be271f41 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 c492bad1db..a59165e1a5 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 4409ebd5a8..cb4c68c4b7 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 370ead73a6..3c25e933fb 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 77bd167c4d..ee6f092191 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 1efc1e552e..13a3dcf613 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 99cd0e1ebb..d4317a29c0 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 fcfcc5af77..89fe4af635 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 838083d3a9..b7426ed657 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 72b8baf6a1..b021c4b0b4 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 7a89c81562..3abbe8c383 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 da10d78aaf..e41daa22d8 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 20f18f7574..b515afdfe1 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 87ffdf9531..ef56fb7397 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 3910ecb03d..ae9d841daa 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 f400af1b27..e5e5586d50 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 94f5ca95bb..6f72372f88 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 f62f70c935..b5ed3e15ce 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 ca5d162a5a..edfde382d3 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 e87ba9c3ec..40d08fa599 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 fced276c12..b7ffe4245b 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 6bc762e985..4535a175af 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 050737712b..caece78a0b 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 33fb5ac34d..6e1c38a943 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 5fcebe0046..95a8b7043a 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 e0ba81d7b1..7a91a6429d 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 bfe39501a2..72c62bfcbf 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 7861b2bd2a..2e7a12a6db 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 96a036ed6b..0303f1e398 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 168ad55d84..a1153e1bab 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 0dc8477672..6e13ef4047 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 37d50e6371..bdbadfa27e 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 48024e37e5..29d22cae9e 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 094c59c85a..f80294a816 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 47ddd16db1..6ed743af7c 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 bc524515cc..f5126adec5 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 ede9fb4b00..79c380eaf0 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 3b193d4ce8..e98a0b8de8 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 7cf6164642..4aca550867 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 be2b84c07b..ee582ca9ab 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 fd097d34ba..372a89ce9d 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 9a1d7f6882..e86498ddf4 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 25ef3e210c..84e52f12d6 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 5d9a7b269f..d42bf34d0e 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 4e3a18f548..b99d49ebc7 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 e765b3c7b6..f9988fcbb2 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 176de9bce6..30e9b08a5a 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 be9739329f..3a4daa666a 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 563271eee7..bfcbaddeeb 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 a528d76997..6fc1d20256 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 daabea473d..ac9dcd6684 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 92b1bb8988..2f615748fe 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 53fb0f56d3..7bab92de7f 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 ea1dcc28c5..550e3e6fe7 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 be5827a2e8..0eaaae1f47 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 82d1d59f95..3b2333e489 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 266e3c003b..0ee0234961 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 e6498ec735..c7db582d06 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 dfc3afdbd3..fd99a8239c 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 3c14ad61a0..ea7b6fe807 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 9e13dc7dbe..dff0940bfe 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 3b31351f2e..18c2057275 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 5dd5c0570b..9089802988 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 34f579d320..18fa8c0a57 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 84de2ceaf6..ddb45cfe20 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 85e290cb7e..ae4a4acc75 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 fe1fa1b997..4f1877f979 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 64b9e65670..eeae42794e 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 beb0e3196e..d08f367ccc 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 a828848726..e1b842a1ef 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 c50a137d25..4c2699194d 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 81ad7a2e81..33e82c8da6 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 0271e8ff0f..ea24836f7f 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 ef49db72dc..1586dfe0f6 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 011eca0ece..a7f12de205 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 0a133ea2f1..943d4fe23c 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 511ae3227d..9d2da84540 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 963abd0790..5ce09ffa69 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 5b418bbf4b..d356c019fc 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 75d999fbe1..e7c91123cd 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 c3d526a9ee..e4e80e829e 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 8e81f4cb8a..713960cf62 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 3a1454a7a8..02c0ffe10b 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 9bb667f1c1..465b83db80 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 3683f58167..985765375f 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 7fba53a6cc..3a51aecaf6 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 08df6e0845..ebf092c844 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 5d8e961590..cc57069c25 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 e47d01c67d..c4e477de6a 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 5fdd39e476..92c240a646 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 1a9cc59c5d..24da9c8893 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 c9c4fed604..baee11baae 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 f0a598bbfd..a1ab81689d 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 55b177622d..e188763215 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 9bce02e79c..c89ab9b9eb 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 f9f0ab77f7..c377951455 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 d69f77f64d..992b2c68f8 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 ba5802d342..afe81808dd 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 a879e2930b..207629f6cc 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 4b64c72394..88d209d265 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 288a46a126..411040fa4d 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 77d33e7ec9..f98be12953 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 460eb9bfb1..e085c98156 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 aa54f188b7..8c3cb383ff 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 8537cf8f3d..79b7ca80c3 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 508558d564..f7bc5996a3 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 29b9ac7508..a482dba476 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 4870651afc..f3c5c6f1ee 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 7337c8947d..122cc1e59e 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 d6211daee9..eb8602f8c5 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 421c7345bd..6a7943a998 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 86f77c95b5..f12c29de47 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 b2574fdca1..7269dd8223 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 c688949398..ae85c3ffed 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 b634294d07..efa1de6189 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 f9d9a77c90..d7c97e6310 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 bf41176495..e19141b4de 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 c48abcad04..505b595512 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 c9313e752b..bc96b64a00 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 44f6fa9796..90261697c9 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 fd57219c06..868cdb0bf2 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 caa3b7deb5..f3783635aa 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 a69977a0b4..547b2238b1 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 499c11a7bb..928bba6419 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 fc3c1ad909..63202c5321 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 fd2c4d546f..88115f5fa1 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 7899f376d5..12e50744c3 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 8bead3b108..b55923a48f 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 24b77a90a2..41fc745657 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 e8b7a7d061..ba92bcb2e8 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 001c63b12b..d4003d6ab5 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 90ab31ac5e..2e8dbf175c 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 8469523146..ad2e5ed1b7 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 5a003de1fe..45917e2f57 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 213395f7ea..02746c98df 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 0c83650fc8..aaf695702d 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 992ff48887..1db5b104f2 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 79d632ca8b..c3c4639830 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 36db14887a..4a165a15b8 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 852e19b594..1ee555597f 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 5ae7d43b2d..34d29ed792 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 5119641b70..70467c449a 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 cd3b46c358..c3b92d956d 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 615a09630b..5cfc3714d1 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 f9635b0b08..97d56ff61e 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 ede75cb922..bd190eed3b 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 40828dc94e..d42beae155 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 01fdca4b2e..f6a11de5b5 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 8855ea430e..541846aa2b 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 ab15c1dbc1..e192edeccd 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 7fb374015e..7b920b0ba8 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 ab9152ccab..c327cc105e 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 5e70abd2d6..790bd09520 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 bb3198f43e..35d48120e9 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 7a42956aaf..89d91bef37 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 fac6ad19b9..6f7de6902f 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 362984b341..725f8a6c81 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 85376504cc..43cadd1a88 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 ed6aa7554d..1c395a6195 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 841deff30a..31a4e651ab 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 9c98ae36de..61559f2293 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 6987745785..0403f77796 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 fece0c9ac1..f96547bfea 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 01658ac083..810d330ef0 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 c1622b2b59..e2ac70d93e 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 90c0977f56..0731a879a5 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 b7a273bd55..f3bc1912e9 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 325536c497..3ab7367a25 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 3e1a5344b6..5cb1afd853 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 720a1fb83b..739b3a3164 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 5df7647429..9148450229 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 ef9e0f0c80..12f1c52c4c 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 19a74baefe..a2d58b879c 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 9643e16df9..859d103ea6 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 cc7c31c156..35fdffafa0 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 c5903349a6..594cfbb5b8 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 a820e25ba9..97ce16b7f6 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 64165c7364..f7b0b72a8b 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 e870f9defe..d50801ee76 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 cc8e99d3fa..9050ed5057 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 2665427add..efcc71ffa9 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 5413d5e969..9e173140c7 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 d9a5a0be3c..4c349b5835 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 3e7ccda843..cc73b4e853 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 c264f85256..da1f57bc93 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 af691f5e54..9d79ce4a2a 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 75cf580307..10f5d04cf2 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 07ebc58d0b..cc08c00256 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 510faec69d..fbb8c404e6 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 4c65e53c7f..49ad91c895 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 e0e98f7467..1c87b3e140 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 8acfb7de74..534203ba70 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 6c38718483..437ef92c68 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 ef546995a8..5ff68583a0 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 10f92e11aa..46726eaa2d 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 853e7fb4db..08e6c8a0f1 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 5d0f273630..eb417004f5 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 8ee0d3b933..b892f246d9 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 6c17b08fca..cde71ac125 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 3e281c681d..588020a1d9 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 29599ffc20..9b1b03c04c 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 ea7c279b51..0c95d531f1 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 7604bf920d..29109ecbdc 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 8d039e704c..fa1e53b78f 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 54fc4c1cd7..7bed6fcc46 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 3eed0f1a8d..814e123c8c 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 640314e4d1..ec84917ea4 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 ccea84fe05..54e56f72e8 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 db98a053d8..c483daca87 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 2b3fd99fcb..ed486388d8 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 4e04e305e9..f5e6554052 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 ea04350bf3..5558123f93 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 369033fb4c..caf268c966 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 ccf57ec935..eac894378f 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 c93e921a9c..6121116435 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 640ad49c18..ed7a8a35e0 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 f31f2d168f..4376f8f125 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 f703e96a25..0588027ab6 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 7523c67bf7..8c9d4fe441 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 e279b0a3c9..0f00616bd6 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 a947291fb9..9113df51ec 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 dfd4d8f0e5..137be1bb37 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 4b984376bb..6ece175d8f 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 af05ce0bc6..1d9344f220 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 bb0af3b93e..b054cca741 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 e853b4af5d..f54eeac952 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 0000000000..12ef9e5fce Binary files /dev/null and b/sound/weapons/empty.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 548d5fabb9..d95ef20d0c 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"