From 4ddf753e654b2a6bbf93e6b496cc80ae33a8659e Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Sun, 9 Jun 2024 01:37:06 +0000 Subject: [PATCH 01/80] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F=D1=86=D0=B8=D1=8F=20=D1=87=D0=B5?= =?UTF-8?q?=D0=B9=D0=BD=D0=B4=D0=B6=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=20[ci=20?= =?UTF-8?q?skip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 4 ++++ html/changelogs/AutoChangeLog-sierra-pr-2314.yml | 4 ---- 3 files changed, 10 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2314.yml diff --git a/html/changelog.html b/html/changelog.html index 1bdb1abd67b69..6c2f0f6037bfc 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -28,6 +28,12 @@

Sierra SS13

-->
+

09.06 - 2024

+

Обновления Teteshnik:

+
+
Вернул жабам стать СМО
+
+

08.06 - 2024

Обновления Lexanx:

diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 08cd4c1efc026..e9d9c4b642958 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -24072,3 +24072,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY sierra_genchangelog.p \u041F\u041A) \u0447\u0435\u0440\u0435\u0437 \u043A\u043E\u043D\u0441\u043E\u043B\ \u044C\u043D\u0443\u044E \u043A\u043E\u043C\u0430\u043D\u0434\u0443 \"datajack\"\ ." +2024-06-09: + Teteshnik: + - tweak: "\u0412\u0435\u0440\u043D\u0443\u043B \u0436\u0430\u0431\u0430\u043C \u0441\ + \u0442\u0430\u0442\u044C \u0421\u041C\u041E" diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2314.yml b/html/changelogs/AutoChangeLog-sierra-pr-2314.yml deleted file mode 100644 index 3d8bd567904a3..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2314.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Teteshnik -changes: - - {tweak: Вернул жабам стать СМО} -delete-after: true From a37dbe6949fd5abb34e8b01a867c307c275e80d3 Mon Sep 17 00:00:00 2001 From: KandJX <83637364+YegorKandziuba@users.noreply.github.com> Date: Sun, 9 Jun 2024 12:59:07 +0300 Subject: [PATCH 02/80] =?UTF-8?q?[TWEAK]=20=D0=92=D0=B5=D0=BD=D0=B4=D0=BE?= =?UTF-8?q?=D0=BC=D0=B0=D1=82=D1=8B=20=D1=81=20=D0=BA=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=B0=D0=BD=D0=B4=D0=BE=D0=B9=20(#2319)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- maps/sierra/sierra.dm | 1 + maps/sierra/z1-z5_sierra.dmm | 60 +++- mods/contraband_vending/README.md | 39 +++ .../contraband_vending/_contraband_vending.dm | 4 + .../_contraband_vending.dme | 11 + mods/contraband_vending/code/contraband.dm | 10 + mods/contraband_vending/code/random.dm | 15 + mods/contraband_vending/code/vending.dm | 323 ++++++++++++++++++ mods/sauna_props/README.md | 2 +- 9 files changed, 451 insertions(+), 14 deletions(-) create mode 100644 mods/contraband_vending/README.md create mode 100644 mods/contraband_vending/_contraband_vending.dm create mode 100644 mods/contraband_vending/_contraband_vending.dme create mode 100644 mods/contraband_vending/code/contraband.dm create mode 100644 mods/contraband_vending/code/random.dm create mode 100644 mods/contraband_vending/code/vending.dm diff --git a/maps/sierra/sierra.dm b/maps/sierra/sierra.dm index d60a177432798..0cf9fe7ff3627 100644 --- a/maps/sierra/sierra.dm +++ b/maps/sierra/sierra.dm @@ -197,6 +197,7 @@ #include "../../mods/tajara/_tajara.dme" #include "../../mods/sauna_props/_sauna_props.dme" #include "../../mods/wyccbay_optimization/_wyccbay_optimization.dme" + #include "../../mods/contraband_vending/_contraband_vending.dme" // UNUSED MODS // Keep them in ascending alphabetical order too, please diff --git a/maps/sierra/z1-z5_sierra.dmm b/maps/sierra/z1-z5_sierra.dmm index a093df5d027ba..f7ad0f5d09c41 100644 --- a/maps/sierra/z1-z5_sierra.dmm +++ b/maps/sierra/z1-z5_sierra.dmm @@ -51319,12 +51319,10 @@ /turf/simulated/floor/plating, /area/maintenance/seconddeck/forestarboard) "hBs" = ( -/obj/structure/table/rack, +/obj/random/vendor/contraband/maintenance, /obj/structure/railing/mapped{ dir = 4 }, -/obj/random/maintenance, -/obj/random/maintenance, /turf/simulated/floor/plating, /area/maintenance/firstdeck/centralport) "hBu" = ( @@ -61357,7 +61355,7 @@ /obj/structure/railing/mapped{ dir = 4 }, -/obj/random/vendor, +/obj/random/vendor/contraband/maintenance, /turf/simulated/floor/plating, /area/maintenance/thirddeck/port) "jcJ" = ( @@ -64783,6 +64781,10 @@ "jET" = ( /turf/simulated/wall/r_wall/hull, /area/security/sierra/brig) +"jFl" = ( +/obj/random/vendor/contraband/maintenance, +/turf/simulated/floor/plating, +/area/maintenance/seconddeck/forestarboard) "jFo" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/catwalk_plated, @@ -69970,6 +69972,15 @@ }, /turf/simulated/floor/tiled/techfloor/grid, /area/crew_quarters/safe_room/seconddeck) +"krL" = ( +/obj/structure/railing/mapped{ + dir = 1 + }, +/obj/random/vendor/contraband/maintenance{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/maintenance/bridgedeck/port) "krN" = ( /obj/structure/table/rack, /obj/random/trash, @@ -83962,7 +83973,9 @@ /obj/structure/railing/mapped{ dir = 1 }, -/obj/structure/table/rack, +/obj/random/vendor/contraband/maintenance{ + dir = 1 + }, /obj/random/trash, /turf/simulated/floor/plating, /area/maintenance/seconddeck/forestarboard) @@ -91867,6 +91880,10 @@ /obj/random/maintenance, /turf/simulated/floor/plating, /area/maintenance/bridgedeck/aft) +"nCp" = ( +/obj/random/vendor/contraband/maintenance, +/turf/simulated/floor/plating, +/area/maintenance/seconddeck/foreport) "nCx" = ( /obj/floor_decal/industrial/danger{ dir = 8 @@ -92094,7 +92111,7 @@ /turf/simulated/floor/tiled/monotile, /area/rnd/locker) "nEx" = ( -/obj/random/closet, +/obj/random/vendor/contraband/maintenance, /obj/floor_decal/techfloor{ dir = 1 }, @@ -128607,8 +128624,9 @@ dir = 1 }, /obj/machinery/light/small, -/obj/structure/table/rack, -/obj/random/maintenance, +/obj/random/vendor/contraband/maintenance{ + dir = 1 + }, /turf/simulated/floor/plating, /area/maintenance/firstdeck/aftstarboard) "sUI" = ( @@ -136900,6 +136918,13 @@ }, /turf/simulated/floor/tiled/dark, /area/bridge/adjutants) +"ukd" = ( +/obj/structure/railing/mapped, +/obj/random/vendor/contraband/maintenance{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/maintenance/fourthdeck/aft) "uke" = ( /obj/structure/disposalpipe/up{ dir = 8 @@ -146091,6 +146116,15 @@ /obj/catwalk_plated, /turf/simulated/floor/plating, /area/quartermaster/hangar) +"vBn" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/random/vendor/contraband/maintenance, +/turf/simulated/floor/plating, +/area/maintenance/thirddeck/aftport) "vBp" = ( /obj/structure/sign/poster, /turf/simulated/wall/prepainted, @@ -189516,7 +189550,7 @@ uYq lZZ lZZ lZZ -jmb +ukd uCk epj wHD @@ -230149,7 +230183,7 @@ tFf tqv bkj jLt -rXK +vBn sUb oyR oea @@ -256212,7 +256246,7 @@ dWn jkR rdH ngK -pFy +nCp jkR jkR inI @@ -257182,7 +257216,7 @@ tXe tXe fMJ fMJ -fgI +jFl uSt uSt esn @@ -341659,7 +341693,7 @@ gvI snt lcB iYD -jic +krL bQU bQU uYw diff --git a/mods/contraband_vending/README.md b/mods/contraband_vending/README.md new file mode 100644 index 0000000000000..36f80c8a430b9 --- /dev/null +++ b/mods/contraband_vending/README.md @@ -0,0 +1,39 @@ + +#### Список PRов: + +- https://github.com/SierraBay/SierraBay12/pull/2319 + + +## Вендоматы с контрабандой + +ID мода: CONTRABAND_VENDING + + +### Описание мода + +Этот мод создан для создания большего пространства для фана игроков, любящих изучать теха и создавать интересные ситуации с доступным инструментарием + + +### Изменения *кор кода* + +- Отсутствуют + + +### Оверрайды + +- Отсутствуют + + +### Дефайны + +- Отсутствуют + + +### Используемые файлы, не содержащиеся в модпаке + +- Отсутствуют + + +### Авторы: + +KandJX diff --git a/mods/contraband_vending/_contraband_vending.dm b/mods/contraband_vending/_contraband_vending.dm new file mode 100644 index 0000000000000..25783077d87cd --- /dev/null +++ b/mods/contraband_vending/_contraband_vending.dm @@ -0,0 +1,4 @@ +/singleton/modpack/contraband_vending + name = "Вендоматы с контрабандой" + desc = "Предоставляет новые объекты типа вендоматов для игры, а так же рандомный объект спавнящий с определенным шансом вместо обычного вендомата вендомат с контрабандой." + author = "KandJX" diff --git a/mods/contraband_vending/_contraband_vending.dme b/mods/contraband_vending/_contraband_vending.dme new file mode 100644 index 0000000000000..344eff383af40 --- /dev/null +++ b/mods/contraband_vending/_contraband_vending.dme @@ -0,0 +1,11 @@ +#ifndef MODPACK_CONTRABAND_VENDING +#define MODPACK_CONTRABAND_VENDING + +#include "_contraband_vending.dm" + + +#include "code/contraband.dm" +#include "code/vending.dm" +#include "code/random.dm" + +#endif diff --git a/mods/contraband_vending/code/contraband.dm b/mods/contraband_vending/code/contraband.dm new file mode 100644 index 0000000000000..7658382ac0930 --- /dev/null +++ b/mods/contraband_vending/code/contraband.dm @@ -0,0 +1,10 @@ +/obj/item/storage/secure/briefcase/money/fake + name = "briefcase with fake talers" + startswith = list( + /obj/item/spacecash/bundle/c1000 = 6, + /obj/item/spacecash/bundle/c500 = 4, + /obj/item/spacecash/bundle/c200 = 5, + /obj/item/spacecash/bundle/c100 = 5, + /obj/item/spacecash/bundle/c50 = 5, + /obj/item/spacecash/bundle/c20 = 3 + ) diff --git a/mods/contraband_vending/code/random.dm b/mods/contraband_vending/code/random.dm new file mode 100644 index 0000000000000..fceb72fe792fd --- /dev/null +++ b/mods/contraband_vending/code/random.dm @@ -0,0 +1,15 @@ +/obj/random/vendor/contraband + +/obj/random/vendor/contraband/spawn_choices() + return list(/obj/machinery/vending/antag/contraband, + /obj/machinery/vending/boozeomat/contraband, + /obj/machinery/vending/engivend/contraband, + /obj/machinery/vending/phoronresearch/contraband, + /obj/machinery/vending/tool/contraband + ) + +/obj/random/vendor/contraband/maintenance + +/obj/random/vendor/contraband/maintenance/spawn_choices() + return list(/obj/random/vendor = 5, + /obj/random/vendor/contraband = 1) diff --git a/mods/contraband_vending/code/vending.dm b/mods/contraband_vending/code/vending.dm new file mode 100644 index 0000000000000..bdc81c2cec201 --- /dev/null +++ b/mods/contraband_vending/code/vending.dm @@ -0,0 +1,323 @@ +/obj/machinery/vending/antag/contraband + product_ads = {"\ + Only the finest!;\ + Have some tools.;\ + The most robust equipment.;\ + The finest gear in space!\ + "} + products = list( + /obj/item/device/assembly/prox_sensor = 5, + /obj/item/device/assembly/signaler = 4, + /obj/item/device/assembly/infra = 4, + /obj/item/handcuffs = 8, + /obj/item/device/flash = 4, + /obj/item/clothing/glasses/sunglasses = 4 + ) + prices = list( + /obj/item/device/assembly/prox_sensor = 400, + /obj/item/device/assembly/signaler = 200, + /obj/item/device/assembly/infra = 200, + /obj/item/handcuffs = 200, + /obj/item/device/flash = 400, + /obj/item/clothing/glasses/sunglasses = 600 + ) + +/obj/machinery/vending/boozeomat/contraband + name = "Old Booze-O-Mat" + desc = "A refrigerated vending unit for alcoholic beverages and alcoholic beverage accessories." + icon_state = "fridge_dark" + icon_deny = "fridge_dark-deny" + base_type = /obj/machinery/vending/boozeomat + req_access = list() + product_ads = {" + Drink up!;\ + Booze is good for you!;\ + Alcohol is humanity's best friend.;\ + Quite delighted to serve you!;\ + Care for a nice, cold beer?;\ + Nothing cures you like booze!;\ + Have a sip!;\ + Have a drink!;\ + Have a beer!;\ + Beer is good for you!;\ + Only the finest alcohol!;\ + Best quality booze since 2053!;\ + Award-winning wine!;\ + Maximum alcohol!;\ + Man loves beer.;\ + A toast for progress!\ + "} + product_slogans = {"\ + Drink away the pain of living under SolGov!;\ + Vodka is the only acceptable drink!;\ + Is this the best you can serve, bartender? This swill?!;\ + These drinks are as tasteless as Sol's people!;\ + Who are you kidding? You knew you were about to drink piss the second you stepped in here.;\ + Drinking on the job is socially acceptable for executives, why not for you?\ + "} + products = list( + /obj/item/reagent_containers/food/drinks/glass2/square = 5, + /obj/item/reagent_containers/food/drinks/flask/barflask = 3, + /obj/item/reagent_containers/food/drinks/flask/vacuumflask = 3, + /obj/item/reagent_containers/food/drinks/bottle/absinthe = 2, + /obj/item/reagent_containers/food/drinks/bottle/baijiu = 2, + /obj/item/reagent_containers/food/drinks/bottle/blackstrap = 2, + /obj/item/reagent_containers/food/drinks/bottle/bluecuracao = 2, + /obj/item/reagent_containers/food/drinks/bottle/cachaca = 2, + /obj/item/reagent_containers/food/drinks/bottle/champagne = 1, + /obj/item/reagent_containers/food/drinks/bottle/cognac = 2, + /obj/item/reagent_containers/food/drinks/bottle/gin = 2, + /obj/item/reagent_containers/food/drinks/bottle/herbal = 2, + /obj/item/reagent_containers/food/drinks/bottle/jagermeister = 2, + /obj/item/reagent_containers/food/drinks/bottle/kahlua = 2, + /obj/item/reagent_containers/food/drinks/bottle/melonliquor = 2, + /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing = 1, + /obj/item/reagent_containers/food/drinks/bottle/prosecco = 2, + /obj/item/reagent_containers/food/drinks/bottle/rakia = 2, + /obj/item/reagent_containers/food/drinks/bottle/rum = 2, + /obj/item/reagent_containers/food/drinks/bottle/sake = 2, + /obj/item/reagent_containers/food/drinks/bottle/soju = 2, + /obj/item/reagent_containers/food/drinks/bottle/tequilla = 2, + /obj/item/reagent_containers/food/drinks/bottle/vodka = 2, + /obj/item/reagent_containers/food/drinks/bottle/vermouth = 2, + /obj/item/reagent_containers/food/drinks/bottle/whiskey = 2, + /obj/item/reagent_containers/food/drinks/bottle/llanbrydewhiskey = 1, + /obj/item/reagent_containers/food/drinks/bottle/specialwhiskey = 1, + /obj/item/reagent_containers/food/drinks/bottle/wine = 2, + /obj/item/reagent_containers/food/drinks/bottle/small/beer = 10, + /obj/item/reagent_containers/food/drinks/bottle/small/alcoholfreebeer = 5, + /obj/item/reagent_containers/food/drinks/bottle/small/ale = 10, + /obj/item/reagent_containers/food/drinks/bottle/small/hellshenpa = 5, + /obj/item/reagent_containers/food/drinks/bottle/small/lager = 5, + /obj/item/reagent_containers/food/drinks/bottle/small/gingerbeer = 5, + /obj/item/reagent_containers/food/drinks/bottle/small/dandelionburdock = 5, + /obj/item/reagent_containers/food/drinks/cans/rootbeer = 10, + /obj/item/reagent_containers/food/drinks/cans/speer = 5, + /obj/item/reagent_containers/food/drinks/cans/ale = 5, + /obj/item/reagent_containers/food/drinks/bottle/small/cola = 10, + /obj/item/reagent_containers/food/drinks/bottle/small/space_up = 10, + /obj/item/reagent_containers/food/drinks/bottle/small/space_mountain_wind = 10, + /obj/item/reagent_containers/food/drinks/cans/cola_diet = 5, + /obj/item/reagent_containers/food/drinks/cans/ionbru = 3, + /obj/item/reagent_containers/food/drinks/cans/beastenergy = 2, + /obj/item/reagent_containers/food/drinks/bottle/orangejuice = 2, + /obj/item/reagent_containers/food/drinks/bottle/tomatojuice = 2, + /obj/item/reagent_containers/food/drinks/bottle/limejuice = 2, + /obj/item/reagent_containers/food/drinks/bottle/lemonjuice = 2, + /obj/item/reagent_containers/food/drinks/bottle/unathijuice = 2, + /obj/item/reagent_containers/food/drinks/bottle/maplesyrup = 2, + /obj/item/reagent_containers/food/drinks/cans/tonic = 5, + /obj/item/reagent_containers/food/drinks/bottle/cream = 4, + /obj/item/reagent_containers/food/drinks/cans/sodawater = 5, + /obj/item/reagent_containers/food/drinks/bottle/grenadine = 5, + /obj/item/reagent_containers/food/drinks/bottle/thoom = 2, + /obj/item/reagent_containers/food/condiment/mint = 1, + /obj/item/reagent_containers/food/drinks/ice = 10, + /obj/item/glass_extra/stick = 15, + /obj/item/glass_extra/straw = 15 + ) + contraband = list( + /obj/item/reagent_containers/food/drinks/bottle/premiumwine = 1, + /obj/item/reagent_containers/food/drinks/bottle/premiumvodka = 1, + /obj/item/reagent_containers/food/drinks/bottle/patron = 1, + /obj/item/reagent_containers/food/drinks/bottle/goldschlager = 1, + /obj/item/reagent_containers/food/drinks/bottle/tadmorwine = 1, + /obj/item/reagent_containers/food/drinks/bottle/brandy = 1, + /obj/item/storage/secure/briefcase/money/fake = 1, + /obj/item/reagent_containers/glass/bottle/dye/polychromic/strong = 0, + /obj/item/storage/pill_bottle/tramadol = 0 + ) + rare_products = list( + /obj/item/reagent_containers/glass/bottle/dye/polychromic/strong = 80, + /obj/item/storage/pill_bottle/tramadol = 80 + ) + prices = list( + /obj/item/reagent_containers/food/drinks/bottle/absinthe = 200, + /obj/item/reagent_containers/food/drinks/bottle/baijiu = 200, + /obj/item/reagent_containers/food/drinks/bottle/blackstrap = 200, + /obj/item/reagent_containers/food/drinks/bottle/bluecuracao = 200, + /obj/item/reagent_containers/food/drinks/bottle/cachaca = 200, + /obj/item/reagent_containers/food/drinks/bottle/champagne = 500, + /obj/item/reagent_containers/food/drinks/bottle/cognac = 200, + /obj/item/reagent_containers/food/drinks/bottle/gin = 200, + /obj/item/reagent_containers/food/drinks/bottle/herbal = 200, + /obj/item/reagent_containers/food/drinks/bottle/jagermeister = 200, + /obj/item/reagent_containers/food/drinks/bottle/kahlua = 200, + /obj/item/reagent_containers/food/drinks/bottle/melonliquor = 200, + /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing = 150, + /obj/item/reagent_containers/food/drinks/bottle/prosecco = 200, + /obj/item/reagent_containers/food/drinks/bottle/rakia = 200, + /obj/item/reagent_containers/food/drinks/bottle/rum = 200, + /obj/item/reagent_containers/food/drinks/bottle/sake = 200, + /obj/item/reagent_containers/food/drinks/bottle/soju = 200, + /obj/item/reagent_containers/food/drinks/bottle/tequilla = 200, + /obj/item/reagent_containers/food/drinks/bottle/vodka = 150, + /obj/item/reagent_containers/food/drinks/bottle/vermouth = 200, + /obj/item/reagent_containers/food/drinks/bottle/whiskey = 200, + /obj/item/reagent_containers/food/drinks/bottle/llanbrydewhiskey = 300, + /obj/item/reagent_containers/food/drinks/bottle/specialwhiskey = 400, + /obj/item/reagent_containers/food/drinks/bottle/wine = 250, + /obj/item/reagent_containers/food/drinks/bottle/small/beer = 5, + /obj/item/reagent_containers/food/drinks/bottle/small/alcoholfreebeer = 5, + /obj/item/reagent_containers/food/drinks/bottle/small/ale = 5, + /obj/item/reagent_containers/food/drinks/bottle/small/hellshenpa = 5, + /obj/item/reagent_containers/food/drinks/bottle/small/lager = 5, + /obj/item/reagent_containers/food/drinks/bottle/small/gingerbeer = 5, + /obj/item/reagent_containers/food/drinks/bottle/small/dandelionburdock = 5, + /obj/item/reagent_containers/food/drinks/cans/rootbeer = 5, + /obj/item/reagent_containers/food/drinks/cans/speer = 5, + /obj/item/reagent_containers/food/drinks/cans/ale = 5, + /obj/item/reagent_containers/food/drinks/bottle/small/cola = 2, + /obj/item/reagent_containers/food/drinks/bottle/small/space_up = 2, + /obj/item/reagent_containers/food/drinks/bottle/small/space_mountain_wind = 2, + /obj/item/reagent_containers/food/drinks/cans/cola_diet = 2, + /obj/item/reagent_containers/food/drinks/cans/ionbru = 5, + /obj/item/reagent_containers/food/drinks/cans/beastenergy = 5, + /obj/item/reagent_containers/food/drinks/bottle/orangejuice = 20, + /obj/item/reagent_containers/food/drinks/bottle/tomatojuice = 20, + /obj/item/reagent_containers/food/drinks/bottle/limejuice = 20, + /obj/item/reagent_containers/food/drinks/bottle/lemonjuice = 20, + /obj/item/reagent_containers/food/drinks/bottle/unathijuice = 20, + /obj/item/reagent_containers/food/drinks/bottle/maplesyrup = 20, + /obj/item/reagent_containers/food/drinks/bottle/cream = 20, + /obj/item/reagent_containers/food/drinks/cans/sodawater = 1, + /obj/item/reagent_containers/food/drinks/bottle/grenadine = 50, + /obj/item/reagent_containers/food/drinks/bottle/thoom = 20, + /obj/item/reagent_containers/food/condiment/mint = 20, + /obj/item/reagent_containers/food/drinks/bottle/premiumwine = 2000, + /obj/item/reagent_containers/food/drinks/bottle/premiumvodka = 1000, + /obj/item/reagent_containers/food/drinks/bottle/patron = 1500, + /obj/item/reagent_containers/food/drinks/bottle/goldschlager = 2000, + /obj/item/reagent_containers/food/drinks/bottle/tadmorwine = 2000, + /obj/item/reagent_containers/food/drinks/bottle/brandy = 1600, + /obj/item/storage/secure/briefcase/money/fake = 4000, + /obj/item/reagent_containers/glass/bottle/dye/polychromic/strong = 500, + /obj/item/storage/pill_bottle/tramadol = 1000 + ) + +/obj/machinery/vending/engivend/contraband + name = "Old Engi-Vend" + desc = "Spare tool vending. What? Did you expect some witty description?" + icon_state = "engivend" + icon_deny = "engivend-deny" + icon_vend = "engivend-vend" + base_type = /obj/machinery/vending/engivend + req_access = list() + product_slogans = {"\ + Equipment only 75% guaranteed to not blow up in your face!;\ + This vendor proudly supplied the electronics for 9 out of 10 ships involved in crashes!;\ + With electronics like this, is it a surprise the mortality rate in this dump is so high?\ + "} + products = list( + /obj/item/clothing/glasses/meson = 2, + /obj/item/device/multitool = 3, + /obj/item/device/geiger = 3, + /obj/item/airlock_electronics = 4, + /obj/item/intercom_electronics = 4, + /obj/item/module/power_control = 4, + /obj/item/airalarm_electronics = 4, + /obj/item/cell/standard = 4, + /obj/item/cell/high = 1, + /obj/item/clamp = 4 + ) + prices = list( + /obj/item/clothing/glasses/meson = 850, + /obj/item/device/multitool = 400, + /obj/item/device/geiger = 300, + /obj/item/airlock_electronics = 250, + /obj/item/intercom_electronics = 250, + /obj/item/module/power_control = 300, + /obj/item/airalarm_electronics = 100, + /obj/item/cell/standard = 100, + /obj/item/cell/high = 200, + /obj/item/clamp = 200, + /obj/item/device/uplink_service/fake_ion_storm = 1000, + /obj/item/device/uplink_service/fake_crew_announcement = 1500, + /obj/item/device/uplink_service/fake_rad_storm = 2000 + ) + rare_products = list( + /obj/item/device/uplink_service/fake_crew_announcement = 80, + /obj/item/device/uplink_service/fake_rad_storm = 40 + ) + contraband = list( + /obj/item/device/uplink_service/fake_ion_storm = 1, + /obj/item/device/uplink_service/fake_crew_announcement = 0, + /obj/item/device/uplink_service/fake_rad_storm = 0 + ) + premium = list( + /obj/item/storage/belt/utility = 3 + ) + +/obj/machinery/vending/phoronresearch/contraband + name = "Toximate 2999" + desc = "All the fine parts you need in one vending machine!" + base_type = /obj/machinery/vending/phoronresearch + product_slogans = {"\ + Dirty money for your dirty deed.;\ + Make an explosive first impression!\ + "} + products = list( + /obj/item/clothing/suit/bio_suit = 6, + /obj/item/clothing/head/bio_hood = 6, + /obj/item/device/transfer_valve = 6, + /obj/item/device/assembly/timer = 6, + /obj/item/device/assembly/signaler = 6, + /obj/item/device/assembly/prox_sensor = 6, + /obj/item/device/assembly/igniter = 6 + ) + rare_products = list( + /obj/item/plastique = 70 + ) + contraband = list( + /obj/item/storage/secure/briefcase/money/fake = 1, + /obj/item/plastique = 0 + ) + prices = list( + /obj/item/clothing/suit/bio_suit = 100, + /obj/item/clothing/head/bio_hood = 100, + /obj/item/device/transfer_valve = 400, + /obj/item/device/assembly/timer = 100, + /obj/item/device/assembly/signaler = 200, + /obj/item/device/assembly/prox_sensor = 200, + /obj/item/device/assembly/igniter = 200, + /obj/item/storage/secure/briefcase/money/fake = 4000, + /obj/item/plastique = 600 + ) + +/obj/machinery/vending/tool/contraband + name = "\improper YouTool" + desc = "Tools for tools." + icon_state = "tool" + icon_deny = "tool-deny" + icon_vend = "tool-vend" + base_type = /obj/machinery/vending/tool + antag_slogans = {"\ + + "} + products = list( + /obj/item/stack/cable_coil = 10, + /obj/item/crowbar = 5, + /obj/item/weldingtool = 3, + /obj/item/wirecutters = 5, + /obj/item/wrench = 5, + /obj/item/device/scanner/gas = 5, + /obj/item/device/t_scanner = 5, + /obj/item/screwdriver = 5, + /obj/item/device/flashlight/flare/glowstick = 3, + /obj/item/device/flashlight/flare/glowstick/red = 3, + /obj/item/tape_roll = 8 + ) + rare_products = list( + /obj/item/device/augment_implanter/engineering_toolset = 50 + ) + contraband = list( + /obj/item/weldingtool/hugetank = 2, + /obj/item/clothing/gloves/insulated = 1 + ) + premium = list( + /obj/item/clothing/gloves/insulated/cheap = 2 + ) + antag = list( + /obj/item/storage/toolbox/syndicate = 1, + /obj/item/device/augment_implanter/engineering_toolset = 0 + ) diff --git a/mods/sauna_props/README.md b/mods/sauna_props/README.md index accd395df430a..c6e44f827d919 100644 --- a/mods/sauna_props/README.md +++ b/mods/sauna_props/README.md @@ -69,7 +69,7 @@ ID мода: SAUNA_PROPS ### Авторы: -KandJX(Импортировал), DarkSoviet(Автор) +KandJX(Импортировал), DarkSovet(Автор)
+

10.06 - 2024

+

Обновления KandJX:

+
+
Добавлены вендоматы с контрабандой.
+
Добавил точки спавна рандомных вендоматов в техах.
+
+

09.06 - 2024

Обновления Teteshnik:

diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index e9d9c4b642958..04f0e5e153cd7 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -24076,3 +24076,12 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY sierra_genchangelog.p Teteshnik: - tweak: "\u0412\u0435\u0440\u043D\u0443\u043B \u0436\u0430\u0431\u0430\u043C \u0441\ \u0442\u0430\u0442\u044C \u0421\u041C\u041E" +2024-06-10: + KandJX: + - tweak: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u0432\u0435\u043D\ + \u0434\u043E\u043C\u0430\u0442\u044B \u0441 \u043A\u043E\u043D\u0442\u0440\u0430\ + \u0431\u0430\u043D\u0434\u043E\u0439." + - maptweak: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0442\u043E\u0447\u043A\ + \u0438 \u0441\u043F\u0430\u0432\u043D\u0430 \u0440\u0430\u043D\u0434\u043E\u043C\ + \u043D\u044B\u0445 \u0432\u0435\u043D\u0434\u043E\u043C\u0430\u0442\u043E\u0432\ + \ \u0432 \u0442\u0435\u0445\u0430\u0445." diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2319.yml b/html/changelogs/AutoChangeLog-sierra-pr-2319.yml deleted file mode 100644 index a591b7c486bc4..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2319.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: KandJX -changes: - - {tweak: Добавлены вендоматы с контрабандой.} - - {maptweak: Добавил точки спавна рандомных вендоматов в техах.} -delete-after: true From 5d17026527b40fd671a93d116300c153fa1972da Mon Sep 17 00:00:00 2001 From: Teteshnik1 <149588524+Teteshnik1@users.noreply.github.com> Date: Mon, 10 Jun 2024 20:22:12 +0300 Subject: [PATCH 05/80] Fix mercenary and add tapes roll autolat (#2318) --- code/game/objects/items/weapons/tape.dm | 1 + .../designs/general/designs_general.dm | 3 + mods/antagonists/code/mercenary.dm | 143 ++++++++++++------ .../icons/obj/syndie_backpacks.dmi | Bin 0 -> 396 bytes 4 files changed, 103 insertions(+), 44 deletions(-) create mode 100644 mods/antagonists/icons/obj/syndie_backpacks.dmi diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index c93cb6a381524..33a60f306a3b8 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -3,6 +3,7 @@ desc = "A roll of sticky tape. Possibly for taping ducks... or was that ducts?" icon = 'icons/obj/bureaucracy.dmi' icon_state = "taperoll" + matter = list(MATERIAL_PLASTIC = 100) w_class = ITEM_SIZE_SMALL /obj/item/tape_roll/use_before(mob/living/carbon/human/H, mob/user) diff --git a/code/modules/fabrication/designs/general/designs_general.dm b/code/modules/fabrication/designs/general/designs_general.dm index 63cbdbeddc0e7..4f5b6b487897b 100644 --- a/code/modules/fabrication/designs/general/designs_general.dm +++ b/code/modules/fabrication/designs/general/designs_general.dm @@ -116,3 +116,6 @@ /datum/fabricator_recipe/binoculars path = /obj/item/device/binoculars + +/datum/fabricator_recipe/tape_roll + path = /obj/item/tape_roll diff --git a/mods/antagonists/code/mercenary.dm b/mods/antagonists/code/mercenary.dm index f84a1b67ca25e..c5f7fd4cc92a6 100644 --- a/mods/antagonists/code/mercenary.dm +++ b/mods/antagonists/code/mercenary.dm @@ -1,3 +1,68 @@ +/obj/item/storage/dufflebag/heavy/syndie + name = "Heavy gorlex bag" + desc = "it looks too bulky and bloody" + icon = 'mods/antagonists/icons/obj/syndie_backpacks.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/onmob/items/lefthand_backpacks.dmi', + slot_r_hand_str = 'icons/mob/onmob/items/righthand_backpacks.dmi', + slot_back_str = 'icons/mob/onmob/onmob_back.dmi' + ) + icon_state = "syndiepacks" + item_state = null + item_state_slots = list(slot_l_hand_str = "duffle_syndie", slot_r_hand_str = "duffle_syndie", slot_back_str = "duffle_syndie") + w_class = ITEM_SIZE_HUGE + max_storage_space = DEFAULT_BACKPACK_STORAGE + 30 + slot_flags = SLOT_BACK + max_w_class = ITEM_SIZE_HUGE + open_sound = 'sound/effects/storage/unzip.ogg' + contents_allowed = list(/obj/item/clothing/suit/armor/pcarrier/merc, + /obj/item/clothing/head/helmet/merc, + /obj/item/clothing/mask/gas/syndicate, + /obj/item/tank/oxygen_emergency_double, + /obj/item/reagent_containers/spray/chemsprayer/bioterror, + /obj/item/reagent_containers/glass/beaker/insulated/large/bioterror, + /obj/item/grenade/chem_grenade/bioterror, + /obj/item/gun/projectile/pistol/optimus, + /obj/item/clothing/suit/space/void/merc/heavy/prepared, + /obj/item/flamethrower/full/loaded, + /obj/item/reagent_containers/glass/beaker/insulated/large/napalm, + /obj/item/grenade/chem_grenade/fuelspray, + /obj/item/gun/projectile/automatic/assault_rifle, + /obj/item/grenade/frag/high_yield, + /obj/item/card/emag, + /obj/item/storage/box/syndie_kit/chameleon, + /obj/item/storage/box/syndie_kit/silenced, + /obj/item/storage/box/syndie_kit/spy, + /obj/item/clothing/mask/chameleon/voice, + /obj/item/device/cosmetic_surgery_kit, + /obj/item/stamp/chameleon, + /obj/item/storage/box/syndie_kit/imp_freedom, + /obj/item/device/uplink_service/fake_crew_announcement, + /obj/item/clothing/under/det, + /obj/item/clothing/suit/storage/leather_jacket/armored, + /obj/item/gun/projectile/heavysniper, + /obj/item/storage/box/ammo/sniperammo, + /obj/item/clothing/glasses/thermal/syndi, + /obj/item/gun/projectile/shotgun/magshot, + /obj/item/ammo_magazine/shotgunmag/shot, + /obj/item/ammo_magazine/shotgunmag, + /obj/item/plastique, + /obj/item/device/flashlight/flashdark, + /obj/item/storage/firstaid/combat, + /obj/item/storage/firstaid/surgery, + /obj/item/defibrillator/compact/combat/loaded, + /obj/item/clothing/suit/space/void/merc/heavy/prepared, + /obj/item/gun/projectile/automatic/l6_saw, + /obj/item/ammo_magazine/box/machinegun, + /obj/item/shield/energy, + /obj/item/rig/light/hacker/runner, + /obj/item/modular_computer/laptop/preset/custom_loadout/advanced, + /obj/item/modular_computer/tablet/preset/custom_loadout/advanced, + /obj/item/modular_computer/pda/syndicate, + /obj/item/clothing/glasses/hud/it, + /obj/item/clothing/mask/ai, + /obj/item/device/multitool/hacktool, + ) /datum/uplink_category/mercenary name = "Mercenary Kits" @@ -9,76 +74,76 @@ Mercenary Kits Used for quick dress-up. Also comes with several discount */ - +// SIERRA EDIT /datum/uplink_item/item/mercenary/bioterror name = "Bioterror Kit" desc = "Kit, filled with bioweaponery. It contains: Voidsuit, sprayer with bioterror mix, bioterror grenade and military pistol. Don't forget to turn your internals on!" item_cost = DEFAULT_TELECRYSTAL_AMOUNT antag_roles = list(MODE_MERCENARY) - path = /obj/structure/closet/crate/mercenary/bioterror + path = /obj/item/storage/backpack/dufflebag/syndie/bioterror /datum/uplink_item/item/mercenary/pyro name = "Pyro Kit" desc = "Kit, used for making FIRES! It contains: Special pyro voidsuit, flamethrower with 4 napalm canisters, 2 incendiary grenades and military pistol." item_cost = DEFAULT_TELECRYSTAL_AMOUNT antag_roles = list(MODE_MERCENARY) - path = /obj/structure/closet/crate/mercenary/pyro + path = /obj/item/storage/dufflebag/heavy/syndie/pyro /datum/uplink_item/item/mercenary/classic name = "Classic Kit" desc = "Old and faithful kit. It contains: Heavy armor, assault rifle, cryptographic sequencer and grenade." item_cost = DEFAULT_TELECRYSTAL_AMOUNT antag_roles = list(MODE_MERCENARY) - path = /obj/structure/closet/crate/mercenary/classic + path = /obj/item/storage/dufflebag/heavy/syndie/classic /datum/uplink_item/item/mercenary/stealthy name = "Stealthy Kit" desc = "A special kit for stealthy operations. It contains: Chameleon kit, fake crew annoncement, freedom implant, cryptographic sequencer, plastic surgery kit, silensed pistol and clerical kit." item_cost = DEFAULT_TELECRYSTAL_AMOUNT antag_roles = list(MODE_MERCENARY) - path = /obj/structure/closet/crate/mercenary/stealthy + path = /obj/item/storage/dufflebag/heavy/syndie/stealthy /datum/uplink_item/item/mercenary/sniper name = "Sniper Kit" desc = "Fashionable kit for fashionable operatives. It contains: Cool-looking armor vest, disguised as a suit, thermal googles and sniper rifle with ammo." item_cost = DEFAULT_TELECRYSTAL_AMOUNT antag_roles = list(MODE_MERCENARY) - path = /obj/structure/closet/crate/mercenary/sniper + path = /obj/item/storage/dufflebag/heavy/syndie/sniper /datum/uplink_item/item/mercenary/breacher name = "Breacher Kit" desc = "You're leading the assault. It contains: Heavy armor, 3 C-4 explosives, drum-fed shotgun and cryptographic sequencer." item_cost = DEFAULT_TELECRYSTAL_AMOUNT antag_roles = list(MODE_MERCENARY) - path = /obj/structure/closet/crate/mercenary/breacher + path = /obj/item/storage/dufflebag/heavy/syndie/breacher /datum/uplink_item/item/mercenary/saboteur name = "Saboteur Kit" desc = "You want to sabotage ship systems? This kit is specially for you. It contains: Heavy armor, military pistol, flashdark, chameleon projector, cryptographic sequencer and some C-4 explosives." item_cost = DEFAULT_TELECRYSTAL_AMOUNT antag_roles = list(MODE_MERCENARY) - path = /obj/structure/closet/crate/mercenary/saboteur + path = /obj/item/storage/dufflebag/heavy/syndie/saboteur /datum/uplink_item/item/mercenary/medic name = "Field Medic Kit" desc = "This kit can provide almost everything for combat medic. It contains: Heavy armor, military pistol, combat medkit, combat defibrilator and surgery kit." item_cost = DEFAULT_TELECRYSTAL_AMOUNT antag_roles = list(MODE_MERCENARY) - path = /obj/structure/closet/crate/mercenary/medic + path = /obj/item/storage/dufflebag/heavy/syndie/medic /datum/uplink_item/item/mercenary/heavy name = "Heavy Kit" desc = "This kit is for heavy gunners. It contains: Heavy armor, energy shield, grenade and L6 Saw machinegun." item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 2 antag_roles = list(MODE_MERCENARY) - path = /obj/structure/closet/crate/mercenary/heavy + path = /obj/item/storage/dufflebag/heavy/syndie/heavy /datum/uplink_item/item/mercenary/netrunner name = "Netrunner Kit" desc = "This kit is can provide some help in hacking of ship systems. It contains: Hacker rig, camera MIU, some computers and cryptographic sequencer." item_cost = DEFAULT_TELECRYSTAL_AMOUNT antag_roles = list(MODE_MERCENARY) - path = /obj/structure/closet/crate/mercenary/netrunner + path = /obj/item/storage/dufflebag/heavy/syndie/netrunner // What's inside the box @@ -88,14 +153,13 @@ Used for quick dress-up. Also comes with several discount "crate_stripes" = COLOR_MAROON ) -/obj/structure/closet/crate/mercenary +/*/obj/structure/closet/crate/mercenary name = "gorlex marauders crate" desc = "A mercenary equipment crate." +*/ +/obj/item/storage/backpack/dufflebag/syndie/bioterror -/obj/structure/closet/crate/mercenary/bioterror - -/obj/structure/closet/crate/mercenary/bioterror/WillContain() - return list( + startswith = list( /obj/item/clothing/suit/armor/pcarrier/merc, /obj/item/clothing/head/helmet/merc, /obj/item/clothing/mask/gas/syndicate, @@ -106,10 +170,9 @@ Used for quick dress-up. Also comes with several discount /obj/item/gun/projectile/pistol/optimus ) -/obj/structure/closet/crate/mercenary/pyro +/obj/item/storage/dufflebag/heavy/syndie/pyro -/obj/structure/closet/crate/mercenary/pyro/WillContain() - return list( + startswith = list( /obj/item/clothing/suit/space/void/merc/heavy/prepared, /obj/item/clothing/mask/gas/syndicate, /obj/item/tank/oxygen_emergency_double, @@ -119,10 +182,9 @@ Used for quick dress-up. Also comes with several discount /obj/item/gun/projectile/pistol/optimus ) -/obj/structure/closet/crate/mercenary/classic +/obj/item/storage/dufflebag/heavy/syndie/classic -/obj/structure/closet/crate/mercenary/classic/WillContain() - return list( + startswith = list( /obj/item/clothing/suit/armor/pcarrier/merc, /obj/item/clothing/head/helmet/merc, /obj/item/gun/projectile/automatic/assault_rifle, @@ -130,10 +192,9 @@ Used for quick dress-up. Also comes with several discount /obj/item/card/emag ) -/obj/structure/closet/crate/mercenary/stealthy +/obj/item/storage/dufflebag/heavy/syndie/stealthy -/obj/structure/closet/crate/mercenary/stealthy/WillContain() - return list( + startswith = list( /obj/item/storage/box/syndie_kit/chameleon = 2, /obj/item/storage/box/syndie_kit/silenced, /obj/item/storage/box/syndie_kit/spy, @@ -146,10 +207,9 @@ Used for quick dress-up. Also comes with several discount /obj/item/card/emag ) -/obj/structure/closet/crate/mercenary/sniper +/obj/item/storage/dufflebag/heavy/syndie/sniper -/obj/structure/closet/crate/mercenary/sniper/WillContain() - return list( + startswith = list( /obj/item/clothing/under/det, /obj/item/clothing/suit/storage/leather_jacket/armored, /obj/item/gun/projectile/heavysniper, @@ -157,10 +217,9 @@ Used for quick dress-up. Also comes with several discount /obj/item/clothing/glasses/thermal/syndi ) -/obj/structure/closet/crate/mercenary/breacher +/obj/item/storage/dufflebag/heavy/syndie/breacher -/obj/structure/closet/crate/mercenary/breacher/WillContain() - return list( + startswith = list( /obj/item/clothing/suit/armor/pcarrier/merc, /obj/item/clothing/head/helmet/merc, /obj/item/gun/projectile/shotgun/magshot, @@ -170,10 +229,9 @@ Used for quick dress-up. Also comes with several discount /obj/item/card/emag ) -/obj/structure/closet/crate/mercenary/saboteur +/obj/item/storage/dufflebag/heavy/syndie/saboteur -/obj/structure/closet/crate/mercenary/saboteur/WillContain() - return list( + startswith = list( /obj/item/clothing/suit/armor/pcarrier/merc, /obj/item/clothing/head/helmet/merc, /obj/item/device/flashlight/flashdark, @@ -183,10 +241,9 @@ Used for quick dress-up. Also comes with several discount /obj/item/card/emag ) -/obj/structure/closet/crate/mercenary/medic +/obj/item/storage/dufflebag/heavy/syndie/medic -/obj/structure/closet/crate/mercenary/medic/WillContain() - return list( + startswith = list( /obj/item/clothing/suit/armor/pcarrier/merc, /obj/item/clothing/head/helmet/merc, /obj/item/storage/firstaid/combat, @@ -195,10 +252,9 @@ Used for quick dress-up. Also comes with several discount /obj/item/gun/projectile/pistol/optimus, ) -/obj/structure/closet/crate/mercenary/heavy +/obj/item/storage/dufflebag/heavy/syndie/heavy -/obj/structure/closet/crate/mercenary/heavy/WillContain() - return list( + startswith = list( /obj/item/clothing/suit/space/void/merc/heavy/prepared, /obj/item/gun/projectile/automatic/l6_saw, /obj/item/ammo_magazine/box/machinegun = 3, @@ -206,10 +262,9 @@ Used for quick dress-up. Also comes with several discount /obj/item/shield/energy ) -/obj/structure/closet/crate/mercenary/netrunner +/obj/item/storage/dufflebag/heavy/syndie/netrunner -/obj/structure/closet/crate/mercenary/netrunner/WillContain() - return list( + startswith = list( /obj/item/rig/light/hacker/runner, /obj/item/modular_computer/laptop/preset/custom_loadout/advanced, /obj/item/modular_computer/tablet/preset/custom_loadout/advanced, @@ -219,7 +274,7 @@ Used for quick dress-up. Also comes with several discount /obj/item/device/multitool/hacktool, /obj/item/card/emag = 2 ) - +// SIERRA EDIT-END // Items diff --git a/mods/antagonists/icons/obj/syndie_backpacks.dmi b/mods/antagonists/icons/obj/syndie_backpacks.dmi new file mode 100644 index 0000000000000000000000000000000000000000..21633c6af99d707906d8e192ad8c689068e0a6a9 GIT binary patch literal 396 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv^#Gp`*8>L*@bmKv2?^CRGL|zk zN=Qg3Dk`e0t7~a#iHL}tJ$u&4$;rpZXHDofeV`V`k|4ie28U-i(tw=&s*s2hm(=3q zqRfJl%=|nChKf1CVFg8{-@gPGeEj-E%Uf6L+?n&i8$t~(8b5fXbKXbuBtub8?+y#& zAmhu%UJ7#_O*%3uL?L+P4kLY4Feet&B>(CQhUE{-7@6O$7pUNr;;1PHh?oJbaFD4a3Hr)O$|gXs-VMx6!A zrsceu1_W_wlUTwg%nQlM35tu0yO{Te@6s`moh$C#Si;OQOOa`+qi6<`>kXD~4F{5D zFr49;!7xjgXKFzClBF|M99gFLusG_4iWCOTU=T`}&+t7cm9b?O=hy3JUJA_GyQff1 oz-Nk%euL&y4R&TNRy}5hnfGno->=D@26Q8Xr>mdKI;Vst03Csj$N&HU literal 0 HcmV?d00001 From 9954e0d1525266b539be4f3ad75cc1a177422ccc Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Mon, 10 Jun 2024 20:22:45 +0300 Subject: [PATCH 06/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2318=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2318.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2318.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2318.yml b/html/changelogs/AutoChangeLog-sierra-pr-2318.yml new file mode 100644 index 0000000000000..491e6809ca596 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2318.yml @@ -0,0 +1,5 @@ +author: Teteshnik +changes: + - {bugfix: Исправил баг с китами мерков} + - {rscadd: Добавил скотч в автолат} +delete-after: true From 2367b02101ef7cfc407cdc0139eed87bc26896bc Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Tue, 11 Jun 2024 01:25:32 +0000 Subject: [PATCH 07/80] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F=D1=86=D0=B8=D1=8F=20=D1=87=D0=B5?= =?UTF-8?q?=D0=B9=D0=BD=D0=B4=D0=B6=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=20[ci=20?= =?UTF-8?q?skip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelog.html | 7 +++++++ html/changelogs/.all_changelog.yml | 6 ++++++ html/changelogs/AutoChangeLog-sierra-pr-2318.yml | 5 ----- 3 files changed, 13 insertions(+), 5 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2318.yml diff --git a/html/changelog.html b/html/changelog.html index 8f1a256977a27..3d06b8cf1004e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -28,6 +28,13 @@

Sierra SS13

-->
+

11.06 - 2024

+

Обновления Teteshnik:

+
+
Исправил баг с китами мерков
+
Добавил скотч в автолат
+
+

10.06 - 2024

Обновления KandJX:

diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 04f0e5e153cd7..d107f533e2df1 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -24085,3 +24085,9 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY sierra_genchangelog.p \u0438 \u0441\u043F\u0430\u0432\u043D\u0430 \u0440\u0430\u043D\u0434\u043E\u043C\ \u043D\u044B\u0445 \u0432\u0435\u043D\u0434\u043E\u043C\u0430\u0442\u043E\u0432\ \ \u0432 \u0442\u0435\u0445\u0430\u0445." +2024-06-11: + Teteshnik: + - bugfix: "\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u043B \u0431\u0430\u0433 \u0441\ + \ \u043A\u0438\u0442\u0430\u043C\u0438 \u043C\u0435\u0440\u043A\u043E\u0432" + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0441\u043A\u043E\u0442\u0447\ + \ \u0432 \u0430\u0432\u0442\u043E\u043B\u0430\u0442" diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2318.yml b/html/changelogs/AutoChangeLog-sierra-pr-2318.yml deleted file mode 100644 index 491e6809ca596..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2318.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Teteshnik -changes: - - {bugfix: Исправил баг с китами мерков} - - {rscadd: Добавил скотч в автолат} -delete-after: true From 49ddad6543efee694e174db0055c53271d460db1 Mon Sep 17 00:00:00 2001 From: AmShegars <88627712+AmShegars@users.noreply.github.com> Date: Wed, 12 Jun 2024 00:58:47 +0500 Subject: [PATCH 08/80] DEV-SIERRA: Colony types and runtime fixes (#2317) Co-authored-by: UEDCommander <52104104+UEDCommander@users.noreply.github.com> --- baystation12.dme | 1 + code/__defines/~mods/~master_defines.dm | 9 + code/_onclick/hud/movable_screen_objects.dm | 33 +- code/modules/client/client_procs.dm | 3 +- code/modules/clothing/_clothing.dm | 5 +- code/modules/mechs/equipment/combat.dm | 3 + .../modules/mechs/interface/screen_objects.dm | 7 +- code/modules/mechs/mech.dm | 11 + code/modules/mechs/mech_icon.dm | 11 +- code/modules/mechs/mech_life.dm | 5 +- code/modules/mechs/mech_movement.dm | 7 +- .../exoplanet_ruins/playablecolony/colony.dmm | 365 ++++++++++++------ .../playablecolony2/colony2.dmm | 274 +++++++------ maps/sierra/z1-z5_sierra.dmm | 1 + mods/_maps/farfleet/maps/farfleet-2.dmm | 16 +- .../code/game/objects/structures/signs.dm | 40 ++ mods/colony_fractions/README.md | 78 ++++ mods/colony_fractions/_colony_types.dm | 4 + mods/colony_fractions/_colony_types.dme | 11 + mods/colony_fractions/code/admin_button.dm | 13 + mods/colony_fractions/code/first_colony.dm | 237 ++++++++++++ mods/colony_fractions/code/second_colony.dm | 86 +++++ mods/colony_fractions/icons/colony.dmi | Bin 0 -> 297 bytes mods/global_modpacks.dm | 3 +- mods/guns/code/projectile.dm | 37 ++ mods/machinery/_machinery.dme | 1 + mods/machinery/code/telepads.dm | 33 ++ mods/mechs_by_shegar/_mechs_by_shegar.dme | 6 +- mods/utility_items/_utility_items.dme | 1 + mods/utility_items/code/colony_random.dm | 240 ++++++++++++ packs/infinity/__defines/guns.dm | 8 - packs/infinity/_pack.dm | 1 - .../items/projectile/guns/automatic.dm | 36 -- 33 files changed, 1268 insertions(+), 318 deletions(-) create mode 100644 mods/_master_files/code/game/objects/structures/signs.dm create mode 100644 mods/colony_fractions/README.md create mode 100644 mods/colony_fractions/_colony_types.dm create mode 100644 mods/colony_fractions/_colony_types.dme create mode 100644 mods/colony_fractions/code/admin_button.dm create mode 100644 mods/colony_fractions/code/first_colony.dm create mode 100644 mods/colony_fractions/code/second_colony.dm create mode 100644 mods/colony_fractions/icons/colony.dmi create mode 100644 mods/machinery/code/telepads.dm create mode 100644 mods/utility_items/code/colony_random.dm diff --git a/baystation12.dme b/baystation12.dme index 2a8c5729dd4ea..6c3d56ef5cc19 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -3333,6 +3333,7 @@ #include "mods\_master_files\code\game\world.dm" #include "mods\_master_files\code\game\gamemodes\ert.dm" #include "mods\_master_files\code\game\objects\effects\decals\contraband.dm" +#include "mods\_master_files\code\game\objects\structures\signs.dm" #include "mods\_master_files\code\game\objects\structures\crates_lockers\closets\_closet_appearance_definitions.dm" #include "mods\_master_files\code\modules\client\asset_cache.dm" #include "mods\_master_files\code\modules\client\preferences_persist.dm" diff --git a/code/__defines/~mods/~master_defines.dm b/code/__defines/~mods/~master_defines.dm index a56f067ae074a..60d724c789cfa 100644 --- a/code/__defines/~mods/~master_defines.dm +++ b/code/__defines/~mods/~master_defines.dm @@ -46,6 +46,15 @@ // DON_LOADOUT - End +// GUNS - Start +#define GUN_BULK_PISTOL 1 +#define GUN_BULK_REVOLVER 2 +#define GUN_BULK_SMG 3 +#define GUN_BULK_CARABINE 4 +#define GUN_BULK_SNIPER_RIFLE 6 +#define GUN_BULK_MACHINEGUN 7 +// GUNS - End + // GLIDING - Start #define DELAY2GLIDESIZE(delay) (world.icon_size / max(ceil(delay / world.tick_lag), 1)) // GLIDING - End diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index 6bb954ff40cf9..80e038d843e59 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -46,9 +46,21 @@ /obj/screen/movable/proc/encode_screen_X(X, mob/viewer) var/view = viewer.client ? viewer.client.view : world.view - if(X > view+1) - . = "EAST-[view*2 + 1-X]" - else if(X < view+1) + // [SIERRA-EDIT] + // if(X > view+1) // SIERA-EDIT - ORIGINAL + // . = "EAST-[view*2 + 1-X]" // SIERA-EDIT - ORIGINAL + // else if(X < view+1) // SIERA-EDIT - ORIGINAL + var/local_view + if(view == "19x15") + local_view = 9 + else if(view == "17x15") + local_view = 8 + else if(view == "15x15") + local_view = 7 + // [/SIERRA-EDIT] + if(X > local_view+1) + . = "EAST-[local_view*2 + 1-X]" + else if(X < local_view+1) . = "WEST+[X-1]" else . = "CENTER" @@ -71,9 +83,18 @@ /obj/screen/movable/proc/encode_screen_Y(Y, mob/viewer) var/view = viewer.client ? viewer.client.view : world.view - if(Y > view+1) - . = "NORTH-[view*2 + 1-Y]" - else if(Y < viewer.client.view+1) + // [SIERRA-EDIT] + // if(Y > view+1) // SIERA-EDIT - ORIGINAL + // . = "NORTH-[view*2 + 1-Y]" // SIERA-EDIT - ORIGINAL + // else if(Y < viewer.client.view+1) // SIERA-EDIT - ORIGINAL + var/local_view + if(view == "19x15" || view == "17x15" || view == "15x15") + local_view = 7 + // [/SIERRA-EDIT] + if(Y > local_view+1) + + . = "NORTH-[local_view*2 + 1-Y]" + else if(Y < local_view+1) . = "SOUTH+[Y-1]" else . = "CENTER" diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 90f4cdb187fab..54a1358f22f19 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -181,8 +181,7 @@ // [SIERRA-ADD] . = ..() //calls mob.Login() - - view = get_preference_value(/datum/client_preference/client_view) + //view = get_preference_value(/datum/client_preference/client_view) GLOB.using_map.map_info(src) diff --git a/code/modules/clothing/_clothing.dm b/code/modules/clothing/_clothing.dm index d16b486ff5fe1..b2f1cdf32db8f 100644 --- a/code/modules/clothing/_clothing.dm +++ b/code/modules/clothing/_clothing.dm @@ -54,7 +54,10 @@ for (var/obj/item/clothing/accessory/A as anything in accessories) remove_accessory(null, A) qdel(A) - accessories.Cut() + //[SIERRA-ADD] + if(accessories) //Убьёт рантаймы null.Cut() + accessories.Cut() + //[SIERRA-ADD] accessories = null . = ..() diff --git a/code/modules/mechs/equipment/combat.dm b/code/modules/mechs/equipment/combat.dm index eb288b97570a1..52f18b02cbc48 100644 --- a/code/modules/mechs/equipment/combat.dm +++ b/code/modules/mechs/equipment/combat.dm @@ -69,6 +69,9 @@ /obj/item/mech_equipment/shields/uninstalled() QDEL_NULL(aura) + //[SIERRA-ADD] - Mechs-by-Shegar + toggle() //Предотвратит обработку оного когда он не в мехе + //[SIERRA-ADD] - Mechs-by-Shegar . = ..() /obj/item/mech_equipment/shields/attack_self(mob/user) diff --git a/code/modules/mechs/interface/screen_objects.dm b/code/modules/mechs/interface/screen_objects.dm index c4b6a8ffd23c8..49c07c3faab6f 100644 --- a/code/modules/mechs/interface/screen_objects.dm +++ b/code/modules/mechs/interface/screen_objects.dm @@ -215,6 +215,9 @@ /obj/screen/movable/exosuit/toggle/power_control/toggled() . = ..() owner.toggle_power(usr) + //[SIERRA-ADD] - Mechs-by-Shegar + owner.update_icon() + //[SIERRA-ADD] /obj/screen/movable/exosuit/toggle/power_control/on_update_icon() toggled = (owner.power == MECH_POWER_ON) @@ -285,11 +288,11 @@ /obj/screen/movable/exosuit/toggle/hatch_open/toggled() if (!owner) return - if(!owner.hatch_closed && owner.power != MECH_POWER_ON) + if(owner.hatch_locked) to_chat(usr, SPAN_WARNING("You cannot open the hatch while it is locked.")) return //[SIERRA-ADD] - Mechs-by-Shegar - if(owner.hatch_closed && owner.power != MECH_POWER_ON) + if(!owner.hatch_closed && owner.power != MECH_POWER_ON) to_chat(usr, SPAN_WARNING("Cockpit hydraulic system offline,hatch can't be closed now.")) return //[SIERRA-ADD] diff --git a/code/modules/mechs/mech.dm b/code/modules/mechs/mech.dm index 2f48b31e745cf..fb9e8a1f8b482 100644 --- a/code/modules/mechs/mech.dm +++ b/code/modules/mechs/mech.dm @@ -216,6 +216,17 @@ . = ..() if(.) update_pilots() + //[SIERRA-ADD] - Mechs-by-Shegar - Обновит спрайт пассажиров при развороте меха + if(passengers_ammount > 0) + update_passengers() + var/need_to_update = FALSE + //exosuit.passenger_compartment.count_passengers() + for(var/hardpoint in hardpoints) + if(hardpoint == "left hand" || hardpoint == "right hand" || hardpoint == "left shoulder" || hardpoint == "right shoulder") + need_to_update = TRUE + if(need_to_update == TRUE) + update_icon() + //[SIERRA-ADD] /mob/living/exosuit/proc/toggle_power(mob/user) if(power == MECH_POWER_TRANSITION) diff --git a/code/modules/mechs/mech_icon.dm b/code/modules/mechs/mech_icon.dm index 2b3721ac5c467..e5fab9b7b5e25 100644 --- a/code/modules/mechs/mech_icon.dm +++ b/code/modules/mechs/mech_icon.dm @@ -102,6 +102,13 @@ SetOverlays(new_overlays) /mob/living/exosuit/proc/update_pilots(update_overlays = TRUE) + //[SIERRA-ADD] - Mechs-by-Shegar + var/local_dir = dir + if(local_dir == NORTHEAST || local_dir == SOUTHEAST) + local_dir = EAST + else if(local_dir == NORTHWEST || local_dir == SOUTHWEST) + local_dir = WEST + //[SIERRA-ADD] if(update_overlays && LAZYLEN(pilot_overlays)) CutOverlays(pilot_overlays) pilot_overlays = null @@ -110,13 +117,13 @@ var/mob/pilot = pilots[i] var/image/draw_pilot = new draw_pilot.appearance = pilot - var/rel_pos = dir == NORTH ? -1 : 1 + var/rel_pos = local_dir == NORTH ? -1 : 1 draw_pilot.layer = MECH_PILOT_LAYER + (body ? ((LAZYLEN(body.pilot_positions)-i)*0.001 * rel_pos) : 0) draw_pilot.plane = FLOAT_PLANE draw_pilot.appearance_flags = KEEP_TOGETHER if(body && i <= LAZYLEN(body.pilot_positions)) var/list/offset_values = body.pilot_positions[i] - var/list/directional_offset_values = offset_values["[dir]"] + var/list/directional_offset_values = offset_values["[local_dir]"] draw_pilot.pixel_x = pilot.default_pixel_x + directional_offset_values["x"] draw_pilot.pixel_y = pilot.default_pixel_y + directional_offset_values["y"] draw_pilot.pixel_z = 0 diff --git a/code/modules/mechs/mech_life.dm b/code/modules/mechs/mech_life.dm index 0a4f2a478418d..48631c8a57021 100644 --- a/code/modules/mechs/mech_life.dm +++ b/code/modules/mechs/mech_life.dm @@ -11,13 +11,16 @@ pilot.client.screen -= menu_hud_elements LAZYREMOVE(pilots, pilot) UNSETEMPTY(pilots) - update_pilots() + //[SIERRA-REMOVE] - Mechs-by-Shegar + //update_pilots() - Спамить проком обновления пилота БЕЗ ОСОБОЙ ПРИЧИНЫ - ОШИБКА + //[SIERRA-REMOVE] //[SIERRA-EDIT] - Mechs-by-Shegar //Я сдвинул вот этот кусок выше, дабы если ВДРУГ функция будет умирать по пути, то мех не становился бессмертным //[SIERRA-EDIT] updatehealth() if(health <= 0 && stat != DEAD) death() + return if(radio) radio.on = (head && head.radio && head.radio.is_functional() && get_cell()) diff --git a/code/modules/mechs/mech_movement.dm b/code/modules/mechs/mech_movement.dm index d8ed153e0086c..81c6c1ccf31cf 100644 --- a/code/modules/mechs/mech_movement.dm +++ b/code/modules/mechs/mech_movement.dm @@ -125,12 +125,7 @@ playsound(exosuit.loc, exosuit.legs.mech_turn_sound, 40,1) exosuit.set_dir(moving_dir) exosuit.SetMoveCooldown(exosuit.legs.turn_delay) - exosuit.passenger_compartment.count_passengers() - if(exosuit.passengers_ammount > 0) - exosuit.update_passengers() - for(var/hardpoint in exosuit.hardpoints) - if(hardpoint == "left hand" || hardpoint == "right hand" || hardpoint == "left shoulder" || hardpoint == "right shoulder") - exosuit.update_icon() + //TURN //MOVE diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm index 0226d61a236df..26b3d6b10d807 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm @@ -23,6 +23,7 @@ "ag" = ( /obj/structure/table/steel_reinforced, /obj/item/paper_bin, +/obj/random/colony_paper, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/command) "ah" = ( @@ -179,6 +180,10 @@ /obj/structure/closet/shipping_wall{ pixel_y = -28 }, +/obj/item/card/id/merchant{ + desc = "this card can be used to access the Colony's telepad to exchange goods."; + name = "Colony leader ID" + }, /turf/simulated/floor/carpet, /area/map_template/colony/command) "aD" = ( @@ -265,9 +270,18 @@ /turf/simulated/wall/r_wall, /area/map_template/colony/messhall) "aL" = ( -/obj/machinery/door/firedoor, -/obj/wallframe_spawn/reinforced_phoron, -/turf/simulated/floor/plating, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/r_n_d/destructive_analyzer, +/turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/engineering) "aM" = ( /obj/structure/catwalk, @@ -424,13 +438,13 @@ /turf/simulated/floor/tiled/techfloor, /area/map_template/colony/command) "bg" = ( -/obj/submap_landmark/spawnpoint/colonist_spawn, /obj/structure/bed/padded, /obj/item/bedsheet/hop, /obj/machinery/light/small{ dir = 8; icon_state = "bulb1" }, +/obj/submap_landmark/spawnpoint/colonist_leader_spawn, /turf/simulated/floor/carpet, /area/map_template/colony/command) "bh" = ( @@ -477,14 +491,12 @@ /turf/simulated/floor/wood, /area/map_template/colony/command) "bm" = ( -/obj/machinery/door/firedoor, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2" }, -/obj/wallframe_spawn/reinforced_phoron, -/turf/simulated/floor/plating, +/turf/simulated/wall/r_wall, /area/map_template/colony/engineering) "bn" = ( /obj/floor_decal/techfloor{ @@ -540,6 +552,7 @@ /turf/simulated/floor/tiled/techfloor, /area/map_template/colony/command) "bq" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/atmospherics) "br" = ( @@ -587,6 +600,37 @@ /obj/floor_decal/techfloor{ dir = 9 }, +/obj/structure/closet/crate, +/obj/item/stack/material/plasteel/ten, +/obj/item/stack/material/plasteel/ten, +/obj/item/stack/material/uranium/ten, +/obj/item/stack/material/uranium/ten, +/obj/item/stack/material/platinum/ten, +/obj/item/stack/material/diamond/ten, +/obj/item/stack/material/gold/ten, +/obj/item/stack/material/silver/ten, +/obj/item/stack/material/glass/fifty, +/obj/item/stack/material/glass/fifty, +/obj/item/stack/material/glass/fifty, +/obj/item/stack/material/glass/fifty, +/obj/item/stack/material/glass/fifty, +/obj/item/stack/material/glass/fifty, +/obj/item/stack/material/glass/boron_reinforced/ten, +/obj/item/stack/material/glass/boron_reinforced/ten, +/obj/item/stack/material/glass/reinforced/fifty, +/obj/item/stack/material/glass/reinforced/fifty, +/obj/item/stack/material/steel/fifty, +/obj/item/stack/material/steel/fifty, +/obj/item/stack/material/steel/fifty, +/obj/item/stack/material/steel/fifty, +/obj/item/stack/material/steel/fifty, +/obj/item/stack/material/steel/fifty, +/obj/item/stack/material/wood/fifty, +/obj/item/stack/material/wood/fifty, +/obj/item/stack/material/wood/fifty, +/obj/item/stack/material/wood/fifty, +/obj/item/stack/material/plastic/ten, +/obj/item/stack/material/aluminium/ten, /turf/simulated/floor/tiled/techfloor, /area/map_template/colony/engineering) "bu" = ( @@ -633,6 +677,9 @@ dir = 4; pixel_x = -21 }, +/obj/random/colony_flag{ + pixel_y = 28 + }, /turf/simulated/floor/tiled/techfloor, /area/map_template/colony) "by" = ( @@ -804,23 +851,19 @@ d2 = 8; icon_state = "1-8" }, +/obj/floor_decal/techfloor, /obj/structure/cable{ - d1 = 1; - d2 = 4; - icon_state = "1-4" + d2 = 2; + icon_state = "0-2" }, -/obj/floor_decal/techfloor, +/obj/structure/cable, /turf/simulated/floor/tiled/techfloor, /area/map_template/colony/engineering) "bQ" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, /obj/floor_decal/techfloor{ dir = 6 }, +/obj/structure/bed/chair/office/comfy/purple, /turf/simulated/floor/tiled/techfloor, /area/map_template/colony/engineering) "bR" = ( @@ -936,11 +979,6 @@ /turf/simulated/floor/plating, /area/map_template/colony/surgery) "ca" = ( -/obj/structure/cable{ - d2 = 2; - icon_state = "0-2" - }, -/obj/floor_decal/industrial/hatch/orange, /obj/machinery/alarm{ locked = 0; pixel_y = 20 @@ -948,19 +986,14 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/power/port_gen/pacman/mrs, +/obj/machinery/fabricator/hacked, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/engineering) "cb" = ( -/obj/structure/cable{ - d2 = 8; - icon_state = "0-8" - }, /obj/floor_decal/techfloor{ dir = 5 }, -/obj/floor_decal/industrial/outline/yellow, -/obj/machinery/power/solar_control/autostart, +/obj/machinery/r_n_d/protolathe, /turf/simulated/floor/tiled/techfloor, /area/map_template/colony/engineering) "cc" = ( @@ -990,12 +1023,12 @@ d2 = 2; icon_state = "1-2" }, -/obj/machinery/power/smes/buildable/max_cap_in_out, /obj/structure/cable{ d2 = 2; icon_state = "0-2" }, /obj/floor_decal/industrial/outline/yellow, +/obj/machinery/power/smes/buildable/max_cap_in_out, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/engineering) "ch" = ( @@ -1199,6 +1232,11 @@ /obj/floor_decal/techfloor{ dir = 1 }, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, /turf/simulated/floor/tiled/techfloor, /area/map_template/colony/engineering) "cE" = ( @@ -1255,6 +1293,9 @@ d2 = 4; icon_state = "1-4" }, +/obj/random/colony_flag{ + pixel_y = -32 + }, /turf/simulated/floor/exoplanet/concrete, /area/template_noop) "cL" = ( @@ -1323,6 +1364,11 @@ /obj/floor_decal/techfloor{ dir = 5 }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, /turf/simulated/floor/tiled/techfloor, /area/map_template/colony/engineering) "cU" = ( @@ -1606,10 +1652,14 @@ d2 = 2; icon_state = "1-2" }, -/obj/structure/reagent_dispensers/fueltank, /obj/machinery/light{ dir = 8 }, +/obj/structure/cable{ + d2 = 4; + icon_state = "0-4" + }, +/obj/machinery/power/port_gen/pacman/mrs, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/engineering) "dz" = ( @@ -1618,10 +1668,12 @@ /turf/simulated/floor/plating, /area/map_template/colony/atmospherics) "dA" = ( -/obj/structure/dispenser, /obj/machinery/light{ dir = 4 }, +/obj/machinery/robotics_fabricator{ + req_access = list() + }, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/engineering) "dB" = ( @@ -1683,11 +1735,6 @@ d2 = 8; icon_state = "1-8" }, -/obj/structure/cable{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -1699,6 +1746,7 @@ /obj/floor_decal/techfloor/hole/right{ dir = 1 }, +/obj/machinery/r_n_d/circuit_imprinter, /turf/simulated/floor/tiled/techfloor, /area/map_template/colony/engineering) "dH" = ( @@ -2188,6 +2236,7 @@ /obj/machinery/light/spot{ dir = 1 }, +/obj/structure/dispenser, /turf/simulated/floor/tiled/techfloor, /area/map_template/colony/atmospherics) "eB" = ( @@ -2316,6 +2365,10 @@ /obj/item/storage/toolbox/mechanical, /obj/item/storage/toolbox/mechanical, /obj/item/device/integrated_circuit_printer/upgraded, +/obj/item/device/radio/intercom/map_preset/playablecolony{ + dir = 8; + pixel_x = 22 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/engineering) "eN" = ( @@ -2512,15 +2565,13 @@ /turf/simulated/floor/exoplanet/concrete, /area/template_noop) "fd" = ( -/obj/structure/table/steel_reinforced, -/obj/item/storage/toolbox/syndicate, -/obj/item/tape_roll, -/obj/item/tape_roll, -/obj/item/material/twohanded/jack, -/obj/item/clothing/head/hardhat/white, -/obj/item/grenade/chem_grenade/metalfoam, -/obj/item/grenade/chem_grenade/metalfoam, -/obj/item/grenade/chem_grenade/metalfoam, +/obj/machinery/power/solar_control/autostart{ + dir = 8 + }, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/engineering) "fe" = ( @@ -2770,34 +2821,18 @@ /turf/simulated/floor/tiled/techfloor, /area/map_template/colony/atmospherics) "fA" = ( -/obj/floor_decal/techfloor{ - dir = 6 +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" }, -/obj/structure/closet/crate, -/obj/item/stack/material/steel/fifty, -/obj/item/stack/material/steel/fifty, -/obj/item/stack/material/steel/fifty, -/obj/item/stack/material/steel/fifty, -/obj/item/stack/material/steel/fifty, -/obj/item/stack/material/wood/fifty, -/obj/item/stack/material/wood/fifty, -/obj/item/stack/material/wood/fifty, -/obj/item/stack/material/wood/fifty, -/turf/simulated/floor/tiled/techfloor, +/turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/engineering) "fB" = ( -/obj/structure/closet/crate, -/obj/item/stack/material/glass/fifty, -/obj/item/stack/material/glass/fifty, -/obj/item/stack/material/glass/fifty, -/obj/item/stack/material/glass/fifty, -/obj/item/stack/material/glass/fifty, -/obj/item/stack/material/glass/fifty, -/obj/item/stack/material/glass/boron_reinforced/ten, -/obj/item/stack/material/glass/boron_reinforced/ten, -/obj/item/stack/material/glass/reinforced/fifty, -/obj/item/stack/material/glass/reinforced/fifty, -/obj/item/clothing/head/hardhat/orange, +/obj/machinery/computer/rdconsole/core{ + dir = 1; + req_access = list() + }, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/engineering) "fC" = ( @@ -3364,6 +3399,9 @@ d2 = 8; icon_state = "4-8" }, +/obj/random/colony_flag{ + pixel_y = 32 + }, /turf/simulated/floor/tiled/techfloor, /area/map_template/colony) "gq" = ( @@ -3433,17 +3471,17 @@ d2 = 8; icon_state = "1-8" }, -/obj/structure/cable{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, /obj/floor_decal/techfloor{ dir = 5 }, /obj/floor_decal/techfloor/hole/right{ dir = 1 }, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, /turf/simulated/floor/tiled/techfloor, /area/map_template/colony) "gx" = ( @@ -3542,10 +3580,10 @@ }, /obj/item/storage/belt/utility, /obj/item/storage/belt/utility, -/obj/item/stack/material/glass/fifty, -/obj/item/stack/material/steel/fifty, /obj/item/device/geiger, /obj/item/device/geiger, +/obj/item/stack/material/steel/fifty, +/obj/item/stack/material/glass/fifty, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/engineering) "gI" = ( @@ -3765,14 +3803,8 @@ /turf/simulated/floor/tiled/techfloor, /area/map_template/colony/atmospherics) "he" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 8; - icon_state = "1-8" - }, -/obj/item/device/radio/intercom/map_preset/playablecolony{ - dir = 8; - pixel_x = 22 +/obj/structure/closet/shipping_wall/filled{ + pixel_x = 24 }, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/engineering) @@ -4257,7 +4289,7 @@ d2 = 2; icon_state = "1-2" }, -/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/structure/reagent_dispensers/fueltank, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/engineering) "ib" = ( @@ -4348,6 +4380,7 @@ dir = 8; icon_state = "warning" }, +/obj/item/gun/energy/gun, /turf/simulated/floor/tiled/steel_ridged, /area/map_template/colony/armory) "ij" = ( @@ -4547,6 +4580,9 @@ /obj/machinery/light{ dir = 8 }, +/obj/item/gun/projectile/pirate, +/obj/item/gun/projectile/pirate, +/obj/item/gun/projectile/pirate, /turf/simulated/floor/tiled/steel_ridged, /area/map_template/colony/armory) "iB" = ( @@ -5647,7 +5683,6 @@ /area/map_template/colony/mineralprocessing) "kp" = ( /obj/structure/table/rack, -/obj/item/gun/energy/gun, /obj/floor_decal/industrial/warning{ dir = 8; icon_state = "warning" @@ -5660,6 +5695,8 @@ /obj/machinery/light{ dir = 8 }, +/obj/random/colony_helmet, +/obj/random/colony_helmet, /turf/simulated/floor/tiled/steel_ridged, /area/map_template/colony/armory) "kq" = ( @@ -5672,9 +5709,6 @@ /area/map_template/colony/airlock) "kr" = ( /obj/structure/table/rack, -/obj/item/gun/projectile/pirate, -/obj/item/gun/projectile/pirate, -/obj/item/gun/projectile/pirate, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, @@ -5688,6 +5722,8 @@ pixel_y = -28 }, /obj/structure/cable, +/obj/random/colony_armor, +/obj/random/colony_armor, /turf/simulated/floor/tiled/steel_ridged, /area/map_template/colony/armory) "ks" = ( @@ -5912,7 +5948,6 @@ /obj/floor_decal/industrial/loading{ dir = 4 }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/exoplanet/concrete, /area/map_template/colony/mineralprocessing) "kL" = ( @@ -6302,20 +6337,11 @@ /turf/simulated/floor/plating, /area/map_template/colony/hydroponics) "lC" = ( +/obj/structure/catwalk, +/obj/decal/cleanable/dirt, /obj/machinery/light/spot{ dir = 8 }, -/obj/structure/closet/crate, -/obj/item/stack/material/plasteel/ten, -/obj/item/stack/material/plasteel/ten, -/obj/item/stack/material/steel/fifty, -/obj/item/stack/material/uranium/ten, -/obj/item/stack/material/uranium/ten, -/obj/item/stack/material/platinum/ten, -/obj/item/stack/material/diamond/ten, -/obj/item/stack/material/gold/ten, -/obj/item/stack/material/silver/ten, -/obj/structure/catwalk, /obj/structure/cable{ d1 = 1; d2 = 4; @@ -6324,17 +6350,16 @@ /obj/floor_decal/industrial/warning/dust{ dir = 4 }, -/obj/decal/cleanable/dirt, /turf/simulated/floor/exoplanet/concrete, /area/map_template/colony/mineralprocessing) "lD" = ( -/obj/structure/catwalk, /obj/structure/cable{ d1 = 4; d2 = 8; icon_state = "4-8" }, /obj/decal/cleanable/dirt, +/obj/structure/catwalk, /turf/simulated/floor/exoplanet/concrete, /area/map_template/colony/mineralprocessing) "lG" = ( @@ -6348,18 +6373,13 @@ /area/map_template/colony/jail) "lH" = ( /obj/structure/table/rack, -/obj/item/ammo_magazine/rifle, -/obj/item/ammo_magazine/rifle, -/obj/item/ammo_magazine/rifle, -/obj/item/ammo_magazine/rifle, -/obj/item/ammo_magazine/rifle, -/obj/item/ammo_magazine/rifle, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, /obj/machinery/light{ dir = 8 }, +/obj/random/colony_smg, /turf/simulated/floor/tiled/steel_ridged, /area/map_template/colony/armory) "lI" = ( @@ -6659,7 +6679,16 @@ /turf/simulated/floor/exoplanet/concrete, /area/template_noop) "me" = ( -/obj/machinery/fabricator/hacked, +/obj/structure/table/steel_reinforced, +/obj/item/storage/toolbox/syndicate, +/obj/item/tape_roll, +/obj/item/material/twohanded/jack, +/obj/item/tape_roll, +/obj/item/clothing/head/hardhat/white, +/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/clothing/head/hardhat/orange, +/obj/item/grenade/chem_grenade/metalfoam, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/engineering) "mf" = ( @@ -6996,8 +7025,6 @@ /area/map_template/colony/hydroponics) "mI" = ( /obj/structure/table/rack, -/obj/item/gun/projectile/automatic/assault_rifle, -/obj/item/gun/projectile/automatic/assault_rifle, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, @@ -7008,6 +7035,7 @@ dir = 1; icon_state = "warning" }, +/obj/random/colony_rifle, /turf/simulated/floor/tiled/steel_ridged, /area/map_template/colony/armory) "mJ" = ( @@ -8278,6 +8306,15 @@ /obj/structure/grille, /turf/simulated/floor/exoplanet/concrete, /area/template_noop) +"rW" = ( +/obj/structure/catwalk, +/obj/decal/cleanable/dirt, +/obj/decal/cleanable/dirt, +/obj/random/colony_flag{ + pixel_x = -32 + }, +/turf/simulated/floor/exoplanet/concrete, +/area/template_noop) "tz" = ( /obj/machinery/portable_atmospherics/hydroponics, /obj/floor_decal/techfloor{ @@ -8370,6 +8407,12 @@ }, /turf/simulated/floor/tiled/techfloor, /area/map_template/colony) +"AT" = ( +/obj/random/colony_flag{ + pixel_y = -32 + }, +/turf/template_noop, +/area/template_noop) "Bc" = ( /obj/machinery/light{ dir = 4 @@ -8377,6 +8420,23 @@ /obj/structure/reagent_dispensers/watertank, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/hydroponics) +"BI" = ( +/obj/structure/catwalk, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/random/colony_flag{ + pixel_y = -32 + }, +/turf/simulated/floor/exoplanet/concrete, +/area/template_noop) "Dj" = ( /obj/machinery/portable_atmospherics/hydroponics, /obj/machinery/light{ @@ -8398,6 +8458,14 @@ }, /turf/simulated/floor/wood, /area/map_template/colony/dorms) +"EF" = ( +/obj/structure/catwalk, +/obj/decal/cleanable/dirt, +/obj/random/colony_flag{ + pixel_x = -28 + }, +/turf/simulated/floor/exoplanet/concrete, +/area/template_noop) "Fz" = ( /obj/machinery/telecomms/processor/map_preset/playablecolony, /turf/simulated/floor/tiled/techfloor, @@ -8412,6 +8480,12 @@ }, /turf/simulated/floor/grass, /area/map_template/colony/hydroponics) +"Hx" = ( +/obj/structure/reagent_dispensers/acid{ + pixel_x = 28 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/map_template/colony/engineering) "Hy" = ( /obj/machinery/portable_atmospherics/hydroponics, /obj/machinery/power/apc{ @@ -8497,6 +8571,14 @@ }, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/hydroponics) +"Lp" = ( +/obj/decal/cleanable/dirt, +/obj/decal/cleanable/dirt, +/obj/random/colony_flag{ + pixel_y = 28 + }, +/turf/simulated/floor/exoplanet/concrete, +/area/map_template/colony/mineralprocessing) "LQ" = ( /obj/floor_decal/techfloor{ dir = 8 @@ -8546,12 +8628,39 @@ "Ot" = ( /turf/simulated/floor/tiled/white, /area/map_template/colony/bathroom) +"QX" = ( +/obj/random/colony_flag{ + pixel_y = 28 + }, +/turf/template_noop, +/area/template_noop) "RR" = ( /obj/floor_decal/techfloor{ dir = 5 }, /turf/simulated/floor/tiled/techfloor, /area/map_template/colony/hydroponics) +"TH" = ( +/obj/structure/catwalk, +/obj/decal/cleanable/dirt, +/obj/random/colony_flag{ + pixel_y = -32 + }, +/turf/simulated/floor/exoplanet/concrete, +/area/template_noop) +"Ui" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/catwalk, +/obj/decal/cleanable/dirt, +/obj/random/colony_flag{ + pixel_y = 28 + }, +/turf/simulated/floor/exoplanet/concrete, +/area/template_noop) "Vk" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -8788,7 +8897,7 @@ gv nH nM aO -aa +QX "} (6,1,1) = {" af @@ -8963,7 +9072,7 @@ aZ aZ aZ aZ -dl +BI ab bY cJ @@ -9067,7 +9176,7 @@ lf lP mA bd -kL +Lp kL kL kL @@ -9209,10 +9318,10 @@ aZ aZ aZ bI -aL +ar bt bO -aT +fA cw dX aT @@ -9253,7 +9362,7 @@ bR bm dG bP -aT +aL cD dY ei @@ -9291,15 +9400,15 @@ aZ aZ aZ bT -aL +ar cb bQ -aT +fB cT dZ aT eR -fA +dZ gW fZ gj @@ -9340,7 +9449,7 @@ fd eM gH me -fB +Hx gW fC gD @@ -9649,7 +9758,7 @@ ms oa mD bh -os +Ui "} (27,1,1) = {" ad @@ -9775,7 +9884,7 @@ ab os "} (30,1,1) = {" -aa +AT ac bb bp @@ -9946,7 +10055,7 @@ uK YD ae dn -fc +TH au aB ex @@ -10120,7 +10229,7 @@ eZ eZ fc fc -fc +EF fc fc jK @@ -10134,7 +10243,7 @@ fc fc fc eZ -eZ +rW eZ fc eZ diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony2/colony2.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony2/colony2.dmm index 073568322c19c..12326cda6d948 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony2/colony2.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony2/colony2.dmm @@ -60,6 +60,15 @@ }, /turf/simulated/floor/plating, /area/map_template/colony2/ship) +"bq" = ( +/obj/floor_decal/corner/paleblue{ + dir = 6 + }, +/obj/random/colony_flag{ + pixel_x = 32 + }, +/turf/simulated/floor/tiled/dark, +/area/map_template/colony2/Hallway) "bt" = ( /obj/machinery/atmospherics/pipe/manifold4w/visible/red, /obj/catwalk_plated/dark, @@ -208,10 +217,10 @@ /area/map_template/colony2/atmospherics) "dD" = ( /obj/floor_decal/corner/paleblue/mono, -/obj/machinery/portable_atmospherics/canister/air/airlock, /obj/machinery/atmospherics/portables_connector{ dir = 1 }, +/obj/machinery/portable_atmospherics/canister/air/airlock, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/atmospherics) "dM" = ( @@ -322,6 +331,8 @@ /obj/machinery/atmospherics/unary/vent_pump/on, /obj/item/device/radio/headset/map_preset/playablecolony2, /obj/item/device/radio/headset/map_preset/playablecolony2, +/obj/item/gun/energy/gun/small, +/obj/item/gun/energy/gun/small, /turf/simulated/floor/tiled/techmaint, /area/map_template/colony2/ship) "eY" = ( @@ -342,15 +353,11 @@ /turf/simulated/floor/tiled/dark, /area/map_template/colony2/tcomms) "fp" = ( -/obj/paint/ocean, -/obj/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - dir = 4; - id_tag = "colony2"; - name = "Window Blast Shutter" +/obj/structure/largecrate/animal/goose, +/turf/simulated/floor/reinforced{ + map_airless = 1 }, -/turf/simulated/floor/plating, -/area/map_template/colony2/engineering) +/area/map_template/colony2/external) "fs" = ( /obj/machinery/atmospherics/pipe/simple/visible/red{ dir = 4 @@ -395,6 +402,11 @@ /obj/machinery/atmospherics/pipe/simple/hidden/red{ dir = 6 }, +/obj/item/device/paint_sprayer, +/obj/item/tape_roll, +/obj/item/tape_roll, +/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/metalfoam, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/atmospherics) "fF" = ( @@ -407,6 +419,13 @@ }, /turf/simulated/floor/tiled/techmaint, /area/map_template/colony2/ship) +"fP" = ( +/obj/landmark/clear, +/obj/random/colony_flag{ + pixel_x = 32 + }, +/turf/template_noop, +/area/template_noop) "fQ" = ( /obj/machinery/sleeper, /turf/simulated/floor/tiled/white, @@ -439,6 +458,13 @@ /obj/structure/closet/crate/hydroponics/prespawned, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/commons) +"gd" = ( +/obj/landmark/clear, +/obj/random/colony_flag{ + pixel_x = -32 + }, +/turf/template_noop, +/area/template_noop) "ge" = ( /obj/structure/hygiene/sink{ dir = 1; @@ -448,10 +474,11 @@ /turf/simulated/floor/tiled/white, /area/map_template/colony2/ship) "gi" = ( -/obj/catwalk_plated/dark, -/obj/structure/largecrate/animal/chick, -/turf/simulated/floor/plating, -/area/map_template/colony2/storage) +/obj/structure/largecrate/animal/goat, +/turf/simulated/floor/reinforced{ + map_airless = 1 + }, +/area/map_template/colony2/external) "gj" = ( /obj/floor_decal/corner/paleblue/mono, /obj/machinery/seed_extractor, @@ -496,6 +523,7 @@ /obj/machinery/computer/mining{ pixel_y = 32 }, +/obj/structure/ore_box, /turf/simulated/floor/reinforced{ map_airless = 1 }, @@ -512,7 +540,6 @@ /turf/simulated/floor/plating, /area/map_template/colony2/engineering) "hN" = ( -/obj/structure/ore_box, /obj/item/device/radio/intercom/map_preset/playablecolony2{ pixel_y = 21 }, @@ -587,6 +614,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/submap_landmark/spawnpoint/ship_leader_spawn, /turf/simulated/floor/tiled/techmaint, /area/map_template/colony2/ship) "jo" = ( @@ -662,11 +690,11 @@ }, /area/map_template/colony2/external) "lj" = ( -/obj/machinery/fabricator/hacked, /obj/machinery/firealarm{ pixel_y = 24 }, /obj/floor_decal/corner/paleblue/mono, +/obj/machinery/r_n_d/circuit_imprinter, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/engineering) "lm" = ( @@ -688,6 +716,7 @@ dir = 4 }, /obj/machinery/radio_beacon, +/obj/random/colony2_paper, /turf/simulated/floor/tiled/techmaint, /area/map_template/colony2/ship) "lZ" = ( @@ -777,10 +806,8 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/vending/engineering{ - req_access = list() - }, /obj/floor_decal/corner/paleblue/mono, +/obj/machinery/r_n_d/protolathe, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/engineering) "oQ" = ( @@ -1090,6 +1117,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/fuel{ dir = 4 }, +/obj/structure/largecrate/animal/cow, /turf/simulated/floor/reinforced{ map_airless = 1 }, @@ -1120,23 +1148,11 @@ pixel_y = 24; req_access = newlist() }, -/obj/item/clamp, -/obj/item/clamp, -/obj/item/clamp, -/obj/structure/closet/crate, -/obj/item/device/scanner/gas, -/obj/item/device/scanner/gas, -/obj/item/device/scanner/gas, -/obj/item/grenade/chem_grenade/metalfoam, -/obj/item/grenade/chem_grenade/metalfoam, -/obj/item/tape_roll, -/obj/item/tape_roll, -/obj/item/rpd, /obj/floor_decal/corner/paleblue/mono, /obj/machinery/atmospherics/pipe/simple/hidden/red{ dir = 4 }, -/obj/item/device/paint_sprayer, +/obj/machinery/vending/tool, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/atmospherics) "wp" = ( @@ -1178,9 +1194,6 @@ "xx" = ( /obj/floor_decal/corner/paleblue/mono, /obj/structure/closet/crate/med_crate/trauma, -/obj/structure/railing/mapped{ - dir = 8 - }, /obj/item/device/radio/intercom/map_preset/playablecolony2{ pixel_y = 21 }, @@ -1254,6 +1267,7 @@ /obj/structure/railing/mapped{ dir = 4 }, +/obj/structure/ore_box, /turf/simulated/floor/reinforced{ map_airless = 1 }, @@ -1402,11 +1416,20 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/item/device/radio/headset/map_preset/playablecolony2, /obj/item/device/radio/headset/map_preset/playablecolony2, +/obj/item/gun/energy/gun/small, +/obj/item/gun/energy/gun/small, +/obj/item/card/id/merchant{ + desc = "this card can be used to access the Colony's telepad to exchange goods."; + name = "Colony leader ID" + }, /turf/simulated/floor/tiled/techmaint, /area/map_template/colony2/ship) "BI" = ( /obj/machinery/atmospherics/binary/pump, /obj/floor_decal/corner/paleblue/mono, +/obj/structure/reagent_dispensers/acid{ + pixel_y = -28 + }, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/engineering) "BR" = ( @@ -1419,12 +1442,11 @@ }, /area/map_template/colony2/external) "BU" = ( -/obj/catwalk_plated/dark, -/obj/structure/railing/mapped{ - dir = 8 +/obj/structure/largecrate/animal/chick, +/turf/simulated/floor/reinforced{ + map_airless = 1 }, -/turf/simulated/floor/plating, -/area/map_template/colony2/storage) +/area/map_template/colony2/external) "BZ" = ( /turf/simulated/floor/reinforced{ map_airless = 1 @@ -1497,6 +1519,7 @@ }, /obj/floor_decal/corner/paleblue/mono, /obj/machinery/atmospherics/valve/open, +/obj/structure/table/steel_reinforced, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/engineering) "CJ" = ( @@ -1530,6 +1553,20 @@ }, /turf/simulated/floor/tiled/techmaint, /area/map_template/colony2/ship) +"Du" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/catwalk_plated/dark, +/obj/random/colony_flag{ + pixel_x = -32 + }, +/turf/simulated/floor/plating, +/area/map_template/colony2/Hallway) "Dv" = ( /obj/machinery/alarm{ dir = 4; @@ -1538,7 +1575,23 @@ req_access = newlist() }, /obj/floor_decal/corner/paleblue/mono, -/obj/structure/largecrate/animal/cow, +/obj/structure/closet/crate, +/obj/item/device/suit_cooling_unit, +/obj/item/device/suit_cooling_unit, +/obj/item/device/radio/map_preset/playablecolony2, +/obj/item/device/radio/map_preset/playablecolony2, +/obj/item/crowbar/prybar, +/obj/item/storage/belt/holster/security, +/obj/item/storage/belt/medical, +/obj/item/storage/belt/utility/full, +/obj/item/storage/belt/utility/full, +/obj/item/clothing/gloves/insulated, +/obj/item/crowbar/prybar, +/obj/item/clothing/gloves/insulated, +/obj/item/device/suit_cooling_unit, +/obj/item/storage/backpack/dufflebag/med, +/obj/item/storage/backpack/dufflebag/eng, +/obj/item/storage/backpack/dufflebag/eng, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/storage) "Dw" = ( @@ -1553,7 +1606,7 @@ "DD" = ( /obj/machinery/light, /obj/floor_decal/corner/paleblue/mono, -/obj/structure/largecrate/animal/cow, +/obj/structure/reagent_dispensers/fueltank, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/storage) "DG" = ( @@ -1586,26 +1639,16 @@ /area/map_template/colony2/external) "DQ" = ( /obj/floor_decal/corner/paleblue/mono, -/obj/structure/largecrate/animal/goose, +/obj/structure/table/rack, +/obj/random/colony_helmet, +/obj/random/colony_helmet, +/obj/random/colony_armor, +/obj/random/colony_armor, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/storage) "DR" = ( -/obj/structure/closet/crate, -/obj/item/gun/projectile/shotgun/pump{ - desc = "The mass-produced W-T Remmington 29x shotgun is a favourite of police and security forces on many worlds. Useful for sweeping alleys. Someone has marked it as property of 'Vel-Rana', with one kill mark next to it." - }, -/obj/item/storage/box/ammo/shotgunammo, -/obj/item/storage/box/ammo/shotgunshells, -/obj/item/gun/energy/gun/small, -/obj/item/gun/energy/gun/small, -/obj/item/gun/energy/gun/small, -/obj/item/gun/energy/gun/small, -/obj/item/storage/box/ammo/flashshells, /obj/floor_decal/corner/paleblue/mono, -/obj/item/gun/energy/gun, -/obj/structure/railing/mapped{ - dir = 8 - }, +/obj/machinery/pipedispenser, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/storage) "En" = ( @@ -1685,9 +1728,9 @@ pixel_x = -21; req_access = newlist() }, -/obj/structure/reagent_dispensers/fueltank, /obj/floor_decal/corner/paleblue/mono, /obj/machinery/atmospherics/valve/open, +/obj/machinery/portable_atmospherics/powered/pump/filled, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/atmospherics) "Fq" = ( @@ -1736,7 +1779,6 @@ "Gt" = ( /obj/floor_decal/industrial/loading, /obj/floor_decal/industrial/outline/yellow, -/obj/structure/ore_box, /turf/simulated/floor/reinforced{ map_airless = 1 }, @@ -1931,11 +1973,13 @@ /area/map_template/colony2/commons) "Kg" = ( /obj/machinery/atmospherics/unary/vent_pump/on, -/obj/machinery/portable_atmospherics/canister/oxygen, /obj/machinery/firealarm{ pixel_y = 24 }, /obj/floor_decal/corner/paleblue/mono, +/obj/machinery/vending/engineering{ + req_access = list() + }, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/atmospherics) "Kr" = ( @@ -1955,13 +1999,8 @@ /area/map_template/colony2/commons) "KA" = ( /obj/machinery/atmospherics/pipe/simple/hidden/universal, -/obj/wallframe_spawn/reinforced, /obj/paint/ocean, -/obj/machinery/door/blast/regular{ - id_tag = "colony2"; - name = "Window Blast Shutter" - }, -/turf/simulated/floor/plating, +/turf/simulated/wall/r_wall, /area/map_template/colony2/engineering) "KP" = ( /obj/machinery/atmospherics/pipe/simple/visible/blue, @@ -1994,6 +2033,13 @@ /obj/paint/ocean, /turf/simulated/wall/r_wall, /area/map_template/colony2/external) +"LJ" = ( +/obj/landmark/clear, +/obj/random/colony_flag{ + pixel_y = 32 + }, +/turf/template_noop, +/area/template_noop) "LP" = ( /obj/catwalk_plated/dark, /turf/simulated/floor/plating, @@ -2090,16 +2136,15 @@ /turf/simulated/floor/plating, /area/map_template/colony2/atmospherics) "Nm" = ( -/obj/machinery/vending/engivend{ - req_access = list() - }, /obj/floor_decal/corner/paleblue/mono, +/obj/machinery/r_n_d/destructive_analyzer, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/engineering) "NX" = ( /obj/machinery/atmospherics/pipe/manifold/visible/fuel{ dir = 1 }, +/obj/structure/largecrate/animal/cow, /turf/simulated/floor/reinforced{ map_airless = 1 }, @@ -2108,13 +2153,19 @@ /obj/floor_decal/corner/paleblue{ dir = 9 }, -/obj/structure/largecrate/animal/chick, /turf/simulated/floor/tiled/dark, /area/map_template/colony2/storage) "Og" = ( /obj/landmark/clear, /turf/template_noop, /area/template_noop) +"Op" = ( +/obj/landmark/clear, +/obj/random/colony_flag{ + pixel_y = -32 + }, +/turf/template_noop, +/area/template_noop) "Oy" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -2131,11 +2182,13 @@ /turf/simulated/floor/plating, /area/map_template/colony2/tcomms) "Oz" = ( -/obj/machinery/vending/tool, /obj/floor_decal/corner/paleblue/mono, /obj/item/device/radio/intercom/map_preset/playablecolony2{ pixel_y = 21 }, +/obj/machinery/computer/rdconsole/core{ + req_access = list() + }, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/engineering) "OB" = ( @@ -2407,8 +2460,8 @@ d2 = 4; icon_state = "0-4" }, -/obj/machinery/pipedispenser, /obj/floor_decal/corner/paleblue/mono, +/obj/machinery/fabricator/hacked, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/engineering) "Sp" = ( @@ -2424,16 +2477,16 @@ }, /area/map_template/colony2/external) "SA" = ( -/obj/machinery/power/port_gen/pacman{ - anchored = 1; - sheets = 25 - }, /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, /obj/machinery/light, /obj/floor_decal/corner/paleblue/mono, +/obj/machinery/power/port_gen/pacman{ + anchored = 1; + sheets = 25 + }, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/engineering) "SJ" = ( @@ -2461,24 +2514,10 @@ /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/commons) "SQ" = ( -/obj/item/storage/backpack/dufflebag/eng, -/obj/item/storage/backpack/dufflebag/eng, -/obj/item/storage/backpack/dufflebag/med, -/obj/structure/closet/crate, -/obj/item/device/suit_cooling_unit, -/obj/item/clothing/gloves/insulated, -/obj/item/clothing/gloves/insulated, -/obj/item/storage/belt/utility/full, -/obj/item/storage/belt/utility/full, -/obj/item/storage/belt/medical, /obj/floor_decal/corner/paleblue/mono, -/obj/item/storage/belt/holster/security, -/obj/item/crowbar/prybar, -/obj/item/crowbar/prybar, -/obj/item/device/radio/map_preset/playablecolony2, -/obj/item/device/radio/map_preset/playablecolony2, -/obj/item/device/suit_cooling_unit, -/obj/item/device/suit_cooling_unit, +/obj/machinery/vending/engivend{ + req_access = list() + }, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/atmospherics) "SR" = ( @@ -2498,13 +2537,8 @@ /area/map_template/colony2/external) "ST" = ( /obj/machinery/atmospherics/pipe/simple/visible/fuel, -/obj/wallframe_spawn/reinforced, /obj/paint/ocean, -/obj/machinery/door/blast/regular{ - id_tag = "colony2"; - name = "Window Blast Shutter" - }, -/turf/simulated/floor/plating, +/turf/simulated/wall/r_wall, /area/map_template/colony2/engineering) "SU" = ( /obj/machinery/atmospherics/pipe/simple/visible/scrubbers, @@ -2741,7 +2775,10 @@ /area/map_template/colony2/tcomms) "Wk" = ( /obj/floor_decal/corner/paleblue/mono, -/obj/structure/largecrate/animal/goat, +/obj/structure/table/rack, +/obj/random/colony_rifle, +/obj/random/colony_smg, +/obj/item/gun/energy/gun, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/storage) "Wm" = ( @@ -2864,6 +2901,9 @@ /obj/machinery/atmospherics/pipe/simple/visible/red, /obj/catwalk_plated/dark, /obj/machinery/meter, +/obj/machinery/robotics_fabricator{ + req_access = list() + }, /turf/simulated/floor/plating, /area/map_template/colony2/engineering) "YI" = ( @@ -2881,7 +2921,7 @@ dir = 1 }, /obj/floor_decal/corner/paleblue/mono, -/obj/machinery/portable_atmospherics/powered/pump/filled, +/obj/machinery/portable_atmospherics/canister/oxygen, /turf/simulated/floor/tiled/dark/monotile, /area/map_template/colony2/atmospherics) "YV" = ( @@ -3031,7 +3071,7 @@ vf Qw Pa Wk -gi +LP DD lU YQ @@ -3074,7 +3114,7 @@ UN UN Pa xx -BU +LP DR lU SQ @@ -3150,7 +3190,7 @@ Ls "} (6,1,1) = {" Og -Og +Op PU eg kb @@ -3181,7 +3221,7 @@ Og Og Og Og -Og +fP Og Og Og @@ -3211,7 +3251,7 @@ iv Ci dD vn -Og +LJ Og Og Ls @@ -3288,7 +3328,7 @@ HS AU HS tT -HS +Du AS bV rp @@ -3301,8 +3341,8 @@ YV ni BZ XB -BZ -BZ +gi +BU vj BZ BZ @@ -3331,7 +3371,7 @@ XX XX aN uT -XX +bq Iz Rz tb @@ -3344,8 +3384,8 @@ vh ni BZ XB -BZ -BZ +fp +BU NX jy Qi @@ -3426,7 +3466,7 @@ Vb OZ qo AE -Og +LJ Og Og Ls @@ -3451,7 +3491,7 @@ Og "} (13,1,1) = {" Og -Og +Op PU fQ dM @@ -3482,7 +3522,7 @@ Og Og Og Og -Og +gd Og Og kf @@ -3680,8 +3720,8 @@ Mc cr AE AE -fp -fp +AE +AE AE AE Og diff --git a/maps/sierra/z1-z5_sierra.dmm b/maps/sierra/z1-z5_sierra.dmm index f7ad0f5d09c41..875aa4b8601b0 100644 --- a/maps/sierra/z1-z5_sierra.dmm +++ b/maps/sierra/z1-z5_sierra.dmm @@ -45259,6 +45259,7 @@ pixel_x = 3 }, /obj/item/device/kit/mech, +/obj/item/device/paint_sprayer, /turf/simulated/floor/tiled/monotile, /area/assembly/robotics) "gGO" = ( diff --git a/mods/_maps/farfleet/maps/farfleet-2.dmm b/mods/_maps/farfleet/maps/farfleet-2.dmm index 573a09a1d56cf..079e77ae67e16 100644 --- a/mods/_maps/farfleet/maps/farfleet-2.dmm +++ b/mods/_maps/farfleet/maps/farfleet-2.dmm @@ -1833,7 +1833,9 @@ dir = 4 }, /obj/floor_decal/industrial/outline/grey, -/obj/machinery/stasis_cage, +/obj/machinery/stasis_cage{ + req_access = list() + }, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/snz) "rS" = ( @@ -2338,7 +2340,9 @@ /turf/simulated/floor/tiled/dark/monotile, /area/ship/farfleet/barracks) "wK" = ( -/obj/machinery/anomaly_container, +/obj/machinery/anomaly_container{ + req_access = list() + }, /obj/floor_decal/industrial/outline, /turf/simulated/floor/tiled/techmaint, /area/ship/farfleet/maintenance/anomaly) @@ -3720,7 +3724,9 @@ dir = 4 }, /obj/floor_decal/industrial/outline/grey, -/obj/machinery/anomaly_container, +/obj/machinery/anomaly_container{ + req_access = list() + }, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/snz) "Kr" = ( @@ -4479,7 +4485,9 @@ /turf/simulated/floor/tiled/freezer, /area/ship/farfleet/crew/freezer) "Se" = ( -/obj/machinery/stasis_cage, +/obj/machinery/stasis_cage{ + req_access = list() + }, /obj/floor_decal/industrial/outline/green, /turf/simulated/floor/tiled/techmaint, /area/ship/farfleet/maintenance/anomaly) diff --git a/mods/_master_files/code/game/objects/structures/signs.dm b/mods/_master_files/code/game/objects/structures/signs.dm new file mode 100644 index 0000000000000..93d6b8b35d19a --- /dev/null +++ b/mods/_master_files/code/game/objects/structures/signs.dm @@ -0,0 +1,40 @@ +/obj/structure/sign/solgov + name = "\improper SolGov Seal" + desc = "Центральное Правительство Солнечной системы, обычно именуемое ЦПСС, является федеративной республикой, состоящей из многочисленных человеческих государств во многих звездных системах." + icon = 'maps/torch/icons/obj/solgov-decals.dmi' + icon_state = "solgovseal" + +/obj/structure/sign/nanotrasen + name = "\improper Nanotrasen Logo" + desc = "Логотип корпорации будущего. Нано - отражение технологий, Трэйзен - Фамилия генерального директора корпорации." + icon = 'packs/infinity/icons/obj/decals.dmi' + icon_state = "NT" + +/obj/structure/sign/spider_clan + name = "\improper Spider Clan" + desc = "Клан паука - органиазация, в которой обучаются лучшие наемные убийцы изведанного космоса. Вероÿтно, мне повезло, если я знаю это." + icon = 'packs/infinity/icons/obj/decals.dmi' + icon_state = "spider_clan" + +/obj/structure/sign/fifthfleet + name = "\improper Fifth Fleet" + desc = "Недавно созданный, оборудованный и модифицированный Пятый Флот был введен в 2297 г Ассамблеями для того, чтобы действовать как Силы Быстрого Реагирования. Хотя он еще невелик, в Пятый Флот входят одни из самых ярких умов Сил Обороны и оснащен новейшими технологиями." + icon = 'packs/infinity/icons/obj/decals.dmi' + icon_state = "fifthfleet" + +/obj/structure/sign/fifthfleet/small + name = "\improper Fifth Fleet" + desc = "Недавно созданный, оборудованный и модифицированный Пятый Флот был введен в 2297 г Ассамблеями для того, чтобы действовать как Силы Быстрого Реагирования. Хотя он еще невелик, в Пятый Флот входят одни из самых ярких умов Сил Обороны и оснащен новейшими технологиями." + icon = 'packs/infinity/icons/obj/decals.dmi' + icon_state = "fifthfleet_small" + +/singleton/poster/number4 + icon_state = "poster4" + name = "Lusty Xeno Specie" + desc = "An another one poster about some pornsite with potential new sexual xeno species... \ + Who the fuck forget it at the space vessel? May be we haven't enought time with families, but we aren't so mad... \ + Or we are?" + +/obj/structure/sign/poster/number4 + icon_state = "poster4" + poster_type = /singleton/poster/number4 diff --git a/mods/colony_fractions/README.md b/mods/colony_fractions/README.md new file mode 100644 index 0000000000000..78b9f72c85175 --- /dev/null +++ b/mods/colony_fractions/README.md @@ -0,0 +1,78 @@ + +#### Список PRов: + +null + + + +## Типы колоний + +ID мода: EXAMPLE + + +### Описание мода + +Этот мод добавляет ТИПЫ колоний - Колония Нт, Колония ЦПСС, Колония ГКК, Независимая колония. +Колонии отличаются выдаваемым оружием, бронёй, флагами и взаимодействием в раунде. + + +### Изменения *кор кода* + +- Отсутствуют + + +### Оверрайды + +- Отсутствуют + + +### Дефайны + +- Отсутствуют + + +### Используемые файлы, не содержащиеся в модпаке + +- Отсутствуют + + +### Авторы: + +Shegar + diff --git a/mods/colony_fractions/_colony_types.dm b/mods/colony_fractions/_colony_types.dm new file mode 100644 index 0000000000000..0298f838d36a8 --- /dev/null +++ b/mods/colony_fractions/_colony_types.dm @@ -0,0 +1,4 @@ +/singleton/modpack/colony_types + name = "Типы колоний" + desc = "Этот мод добавляет типы колоний, углубляющий и развивающий геймплей на колонии и взаимодействие оной с другими сторонами событий." + author = "Shegar" diff --git a/mods/colony_fractions/_colony_types.dme b/mods/colony_fractions/_colony_types.dme new file mode 100644 index 0000000000000..250630981cdac --- /dev/null +++ b/mods/colony_fractions/_colony_types.dme @@ -0,0 +1,11 @@ +#ifndef MODPACK_COLONY_TYPES +#define MODPACK_COLONY_TYPES + +#include "_colony_types.dm" +// Далее просто включай свой код +// #include "code/something.dm" + +#include "code/first_colony.dm" +#include "code/second_colony.dm" +#include "code/admin_button.dm" +#endif diff --git a/mods/colony_fractions/code/admin_button.dm b/mods/colony_fractions/code/admin_button.dm new file mode 100644 index 0000000000000..0ff72ffc88afc --- /dev/null +++ b/mods/colony_fractions/code/admin_button.dm @@ -0,0 +1,13 @@ +/client/proc/map_template_choose_colony_type() + set category = "Fun" + set desc = "Choose, which type will be next spawned colony." + set name = "Map Template - Choose colony type" + + if(!check_rights(R_SPAWN)) + return + + var/list/types = list("ГКК","ЦПСС","НАНОТРЕЙЗЕН","НЕЗАВИСИМАЯ", "СЛУЧАЙНЫЙ") + GLOB.choose_colony_type = input(usr, "Выберите, какой тип колонии будет при следующем спавне","Выберите тип колонии") as null|anything in types + if (!GLOB.choose_colony_type) + GLOB.choose_colony_type = "СЛУЧАЙНЫЙ" + log_and_message_admins("выбрал тип колонии: [GLOB.choose_colony_type] как следующий тип колонии при её спавне.") diff --git a/mods/colony_fractions/code/first_colony.dm b/mods/colony_fractions/code/first_colony.dm new file mode 100644 index 0000000000000..772c4f32ab16e --- /dev/null +++ b/mods/colony_fractions/code/first_colony.dm @@ -0,0 +1,237 @@ +GLOBAL_VAR_INIT(last_colony_type, "СЛУЧАЙНЫЙ") +GLOBAL_VAR_INIT(choose_colony_type, "СЛУЧАЙНЫЙ") //Педальки выбирают, какой тип колонии будет заспавнен + + +/singleton/submap_archetype/playablecolony + crew_jobs = list(/datum/job/submap/colonist, /datum/job/submap/colonist_leader) + +/datum/job/submap/colonist_leader + title = "Colonist Leader" + info = "You are a Colonist Leader, living on the rim of explored. Control your colonist, defend the interests of the colony." + total_positions = 1 + outfit_type = /singleton/hierarchy/outfit/job/colonist + + +/datum/job/submap/colonist + supervisors = "Colonist Leader" + + +/singleton/hierarchy/outfit/job/colonist/leader + name = OUTFIT_JOB_NAME("Colonist Leader") + id_types = list(/obj/item/card/id/merchant/colony_leader) + +/obj/item/card/id/merchant/colony_leader + name = "Colonist Leader ID" + desc = "The card issued to the leaders of the colony allows to understand who really is the leader." + access = list(access_merchant) + color = COLOR_OFF_WHITE + detail_color = COLOR_BEIGE + +/datum/map_template/ruin/exoplanet/playablecolony/load(turf/T, centered=FALSE) + if(GLOB.choose_colony_type == "СЛУЧАЙНЫЙ") + var/number = rand(1,100) + if(number < 30 || number == 30) + GLOB.last_colony_type = "НАНОТРЕЙЗЕН" + else if(number < 50 || number == 50) + GLOB.last_colony_type = "ГКК" + else if(number < 75 || number == 75) + GLOB.last_colony_type = "ЦПСС" + else if(number < 100 || number == 100) + GLOB.last_colony_type = "НЕЗАВИСИМАЯ" + else + GLOB.last_colony_type = GLOB.choose_colony_type + log_and_message_admins("Начал спавн колонии следующего типа: [GLOB.last_colony_type].") + + .=..() + colony_inform() + +/datum/map_template/ruin/exoplanet/playablecolony/proc/colony_inform() + //Информирует мир о типе колонии + var/message // <- То, что будем отправлять в оповещение + if(GLOB.last_colony_type == "НАНОТРЕЙЗЕН") + message += "

[FONT_LARGE("NSV Sierra Communications Report:")]
" + message += "
Коммуникационным реле ИКН \"Сьерра\" было принято коммьюнике, указывающие на присутствие в текущей системе аванпоста корпорации NanoTrasen. Для удобства членов командования объекта в данном отчете приводятся стандартные процедуры для взаимодействия с передовым аванпостом корпорации:

" + message += "● Разрешены и рекомендуются любые торговые и обменные операции имеющихся в наличии ресурсов, артефактов и научных данных обоих подразделений.
" + message += "● В случае чрезвычайной ситуации на поверхности, персоналу аванпоста разрешена эвакуация на борт ИКН \"Сьерра\"; аналогично, в случае необходимости эвакуации судна, персонал может быть транспортирован на территорию аванпоста.
" + message += "● Взаимное посещение объектов в условиях штатной ситуации осуществляется свободно; при необходимости, ограничительные меры могут быть установлены совместным решением членов командования ИКН \"Сьерра\" и командования аванпоста.
" + message += "
Аванпост является важным активом корпорации NanoTrasen - ожидается, что ему будет оказана вся необходимая поддержка, не ставящая под удар основную миссию судна.
" + post_comm_message("NSV Sierra Comms Relay", message) + minor_announcement.Announce(message = "Коммуникационным реле ИКН \"Сьерра\" было принято коммьюнике, указывающие на присутствие в текущей системе аванпоста корпорации NanoTrasen. Дальнейшие инструкции направлены на консоль коммуникации.") + +/obj/random/colony_paper/spawn_choices() + if (GLOB.last_colony_type == "НАНОТРЕЙЗЕН") + return list(/obj/item/paper/colony_nt) + else if(GLOB.last_colony_type == "ГКК") + return list(/obj/item/paper/colony_gkk) + else if(GLOB.last_colony_type == "ЦПСС") + return list(/obj/item/paper/colony_sol) + else if(GLOB.last_colony_type == "НЕЗАВИСИМАЯ") + return list(/obj/item/paper/colony_ind) + +/obj/item/paper/colony_nt + name = "Private colonization license" + info = "

Лицензия на частную колониальную деятельность

Настоящей Лицензией утверждается право NanoTrasen Incorporated, в лице представляющих её сотрудников, проживающих на территории колониального поселения, на размещение исследовательского колониального поселения, а также владение и управление им и прилегающими к нему территориями колонизированной экзопланеты. Это право также распространяется на все природные ресурсы, восполнимые и невосполнимые, обнаруженные на территории поселения.

Настоящей Лицензией заверяется, что колониальное поселение и прилегающие ему области являются частной территорией NanoTrasen Incorporated. Право присутствия на территории колониального поселения тех или иных лиц определяется по усмотрению представителей NanoTrasen Incorporated. Правовой статус лиц, которые не могут быть идентифицированы по подтверждающим их статус документам, может быть установлен посредством направления соответствующего запроса в консульский отдел посольства ЦПСС в системе Траян; до момента идентификации, решение о правомерности их нахождения в колониальном поселении принимается руководством колониального поселения.

Настоящей Лицензией утверждается, что безопасность данного поселения обеспечивается собственными силами NanoTrasen Incorporated. Сотрудники корпорации и иные лица, желающие проживать в поселении, выражают своё понимание опасностей, сопряженных с колонизацией Фронтира, и отказываются от каких-либо претензий в отношении вооруженных сил ЦПСС по вопросам, сопряженным с обеспечением безопасности колонии. Данное согласие должно быть закреплено в письменном виде и храниться в архиве административной станции NanoTrasen \"Легион\".

" + stamps = "
This paper has been stamped with the personal seal of Horace Fields, Supreme Judge of the Sol System.
This paper has been stamped with the stamp of Central Command." + stamped = list(/obj/item/stamp/boss) + ico = list("paper_stamp-boss") + +/obj/item/paper/colony_gkk + name = "ICCG colonial charter" + info = "

Хартия колониального поселения

Настоящей Хартией утверждается право Независимой Колониальной Конфедерации Гильгамеша, в лице представляющих его граждан, проживающих на территории колониального поселения, на владение и управление колониальным поселением и прилегающими к нему территориями колонизированной экзопланеты. Это право также распространяется на все природные ресурсы, восполнимые и невосполнимые, обнаруженные на территории поселения.

Настоящей хартией заверяется, что колониальное поселение и прилегающие ему области являются суверенной территорией ГКК. Граждане ГКК, а также лица, которым разрешено пребывание на территории ГКК, имеют все права и свободы, предоставляемые им Конфедерацией, находясь на территории колониального поселения; аналогично, лица, объявленные персонами нон-гранта решением Верховной Коллегии Судей, не имеют права приближаться к колониальному поселению. Правовой статус лиц, которые не могут быть идентифицированы по подтверждающим их статус документам, может быть установлен посредством направления соответствующего запроса в консульский отдел представительства ГКК в системе Денебола; до момента идентификации, решение о правомерности их нахождения в колониальном поселении принимается руководством колониального поселения.

Настоящей хартией утверждается, что безопасность данного поселения обеспечивается силами самих колонистов, а также силами действующих единиц Пионерского Корпуса ГКК. Колонисты, желающие проживать в поселении, выражают своё понимание опасностей, сопряженных с колонизацией Фронтира, и соглашаются самостоятельно обеспечивать свою безопасность в случае, если силы Пионерского Корпуса не могут своевременно отреагировать на полученный сигнал бедствия. Данное согласие должно быть закреплено в письменном виде и храниться в архиве представительства ГКК в системе Денебола.

" + stamps = "
This paper has been stamped by ICCG Ministry of Colonial Development and Deep Space Exploration." + language = LANGUAGE_HUMAN_RUSSIAN + stamped = list(/obj/item/stamp/boss) + ico = list("paper_stamp-boss") + +/obj/item/paper/colony_sol + name = "SCG colonial charter" + info = "

Хартия колониального поселения

Настоящей Хартией утверждается право Центрального Правительства Солнечной Системы, в лице представляющих его граждан, проживающих на территории колониального поселения, на владение и управление колониальным поселением и прилегающими к нему территориями колонизированной экзопланеты. Это право также распространяется на все природные ресурсы, восполнимые и невосполнимые, обнаруженные на территории поселения.

Настоящей хартией заверяется, что колониальное поселение и прилегающие ему области являются суверенной территорией ЦПСС. Граждане ЦПСС, а также лица, которым разрешено пребывание на территории ЦПСС, имеют все права и свободы, предоставляемые им Центральным Правительством, находясь на территории колониального поселения; аналогично, лица, объявленные персонами нон-гранта решением Верховного Суда Солнечной Системы, не имеют права приближаться к колониальному поселению. Правовой статус лиц, которые не могут быть идентифицированы по подтверждающим их статус документам, может быть установлен посредством направления соответствующего запроса в консульский отдел посольства ЦПСС в системе Траян; до момента идентификации, решение о правомерности их нахождения в колониальном поселении принимается руководством колониального поселения.

Настоящей хартией утверждается, что безопасность данного поселения обеспечивается силами самих колонистов, а также силами патрульных единиц Пятого Флота Центрального Правительства Солнечной Системы. Колонисты, желающие проживать в поселении, выражают своё понимание опасностей, сопряженных с колонизацией Фронтира, и соглашаются самостоятельно обеспечивать свою безопасность в случае, если силы Пятого Флота не могут своевременно отреагировать на полученный сигнал бедствия. Данное согласие должно быть закреплено в письменном виде и храниться в архиве посольства ЦПСС в системе Траян.

" + stamps = "
This paper has been stamped with the personal seal of Horace Fields, Supreme Judge of the Sol System." + stamped = list(/obj/item/stamp/boss) + ico = list("paper_stamp-boss") + +/obj/item/paper/colony_ind + name = "Colonization plans" + info = "Документ содержит весьма исчерпывающий план по колонизации данной экзопланеты, включающий перечень необходимого инвентаря, финансирования и инструкции для колонистов. В глаза бросаются многочисленные упоминания договоров о финансировании с теми или иными корпорациями и некой организации, именуемой \"Альянсом Фронтира\"." + +//ФЛАГ + +/obj/random/colony_flag/spawn_choices() + if (GLOB.last_colony_type == "НАНОТРЕЙЗЕН") + return list(/obj/structure/sign/nanotrasen) + else if(GLOB.last_colony_type == "ГКК") + return list(/obj/structure/sign/iccg_colony) + else if(GLOB.last_colony_type == "ЦПСС") + return list(/obj/structure/sign/icarus_solgov) + else if(GLOB.last_colony_type == "НЕЗАВИСИМАЯ") + return list(/obj/structure/sign/colony) + + + +//БРОНИКИ + +/obj/random/colony_armor/spawn_choices() + if (GLOB.last_colony_type == "НАНОТРЕЙЗЕН") + return list(/obj/item/clothing/suit/armor/laserproof, + /obj/item/clothing/suit/armor/vest/nt, + /obj/item/clothing/suit/armor/vest/old/security, + /obj/item/clothing/suit/armor/pcarrier/navy, + /obj/item/clothing/suit/armor/riot, + /obj/item/clothing/suit/armor/pcarrier/medium/nt + ) + else if(GLOB.last_colony_type == "ГКК") + return list(/obj/item/clothing/suit/armor/laserproof, + /obj/item/clothing/suit/armor/pcarrier/tactical_colony, + /obj/item/clothing/suit/armor/riot, + /obj/item/clothing/suit/armor/pcarrier/tan, + /obj/item/clothing/suit/armor/pcarrier/tan/tactical, + /obj/item/clothing/suit/armor/pcarrier/troops_colony, + /obj/item/clothing/suit/armor/pcarrier/troops_colony/heavy, + /obj/item/clothing/suit/armor/pcarrier/navy + ) + else if(GLOB.last_colony_type == "ЦПСС") + return list(/obj/item/clothing/suit/armor/laserproof, + /obj/item/clothing/suit/armor/pcarrier/medium/sol_colony, + /obj/item/clothing/suit/armor/pcarrier/tan/tactical, + /obj/item/clothing/suit/armor/pcarrier/tan, + /obj/item/clothing/suit/armor/pcarrier/troops_colony, + /obj/item/clothing/suit/armor/vest/solgov_colony, + /obj/item/clothing/suit/armor/pcarrier/troops_colony/heavy, + /obj/item/clothing/suit/armor/riot + ) + else if(GLOB.last_colony_type == "НЕЗАВИСИМАЯ") + return list(/obj/item/clothing/suit/armor/swat/officer, + /obj/item/clothing/suit/armor/vest/blueshift, + /obj/item/clothing/suit/armor/vest/press, + /obj/item/clothing/suit/armor/vest/detective, + /obj/item/clothing/suit/armor/vest/old, + /obj/item/clothing/suit/armor/laserproof, + /obj/item/clothing/suit/armor/pcarrier/merc + ) + + + + +//ШЛЕМА + +/obj/random/colony_helmet/spawn_choices() + if (GLOB.last_colony_type == "НАНОТРЕЙЗЕН") + return list(/obj/item/clothing/head/helmet, + /obj/item/clothing/head/helmet/ablative, + /obj/item/clothing/head/helmet/riot, + /obj/item/clothing/head/helmet/nt, + /obj/item/clothing/head/helmet/nt/guard, + /obj/item/clothing/head/helmet/ballistic, + /obj/item/clothing/head/helmet/pcrc + + ) + else if(GLOB.last_colony_type == "ГКК") + return list(/obj/item/clothing/head/helmet, + /obj/item/clothing/head/helmet/ablative, + /obj/item/clothing/head/helmet/riot, + /obj/item/clothing/head/helmet/augment, + /obj/item/clothing/head/helmet/ballistic, + /obj/item/clothing/head/helmet/tactical + ) + else if(GLOB.last_colony_type == "ЦПСС") + return list(/obj/item/clothing/head/helmet, + /obj/item/clothing/head/helmet/ablative, + /obj/item/clothing/head/helmet/riot, + /obj/item/clothing/head/helmet/solgov_colony/pilot, + /obj/item/clothing/head/helmet/solgov_colony/pilot/fleet, + /obj/item/clothing/head/helmet/solgov_colony, + /obj/item/clothing/head/helmet/ballistic, + /obj/item/clothing/head/helmet/pcrc, + /obj/item/clothing/head/helmet/solgov_colony/command, + /obj/item/clothing/head/helmet/tactical, + /obj/item/clothing/head/helmet/solgov_colony/security + ) + else if(GLOB.last_colony_type == "НЕЗАВИСИМАЯ") + return list(/obj/item/clothing/head/helmet, + /obj/item/clothing/head/helmet/ablative, + /obj/item/clothing/head/helmet/riot, + /obj/item/clothing/head/helmet/nt/blueshift, + /obj/item/clothing/head/helmet/old_confederation, + /obj/item/clothing/head/helmet/old_special_ops, + /obj/item/clothing/head/helmet/merc, + /obj/item/clothing/head/helmet/old_commonwealth, + /obj/item/clothing/head/helmet/swat + ) +//ПП + +/obj/random/colony_smg/spawn_choices() + if (GLOB.last_colony_type == "НАНОТРЕЙЗЕН") + return list(/obj/item/gun/projectile/automatic/nt41_colony) + else if(GLOB.last_colony_type == "ГКК") + return list(/obj/item/gun/projectile/automatic/merc_smg) + else if(GLOB.last_colony_type == "ЦПСС") + return list(/obj/item/gun/projectile/automatic/sec_smg) + else if(GLOB.last_colony_type == "НЕЗАВИСИМАЯ") + return list(/obj/item/gun/projectile/automatic/merc_smg, + /obj/item/gun/projectile/automatic/sec_smg, + /obj/item/gun/projectile/automatic/machine_pistol/usi, + /obj/item/gun/projectile/automatic + ) + +//АВТОМАТ + +/obj/random/colony_rifle/spawn_choices() + if(GLOB.last_colony_type == "НАНОТРЕЙЗЕН") + return list(/obj/item/gun/projectile/automatic/bullpup_rifle, + /obj/item/gun/projectile/automatic/bullpup_rifle/light + ) + else if(GLOB.last_colony_type == "ГКК") + return list(/obj/item/gun/projectile/automatic/assault_rifle, + /obj/item/gun/projectile/automatic/assault_rifle/heltek_colony, + /obj/item/gun/projectile/automatic/mbr_colony, + /obj/item/gun/projectile/automatic/mr735_colony) + else if(GLOB.last_colony_type == "ЦПСС") + return list(/obj/item/gun/projectile/automatic/bullpup_rifle, + /obj/item/gun/projectile/automatic/bullpup_rifle/light + ) + else if(GLOB.last_colony_type == "НЕЗАВИСИМАЯ") + return list(/obj/item/gun/projectile/automatic/assault_rifle, + /obj/item/gun/projectile/automatic/assault_rifle/heltek_colony, + /obj/item/gun/projectile/automatic/mbr_colony, + /obj/item/gun/projectile/automatic/battlerifle + ) diff --git a/mods/colony_fractions/code/second_colony.dm b/mods/colony_fractions/code/second_colony.dm new file mode 100644 index 0000000000000..d43d365f29c62 --- /dev/null +++ b/mods/colony_fractions/code/second_colony.dm @@ -0,0 +1,86 @@ +/singleton/submap_archetype/playablecolony2 + crew_jobs = list(/datum/job/submap/colonist, /datum/job/submap/ship_leader) + +/datum/job/submap/ship_leader + title = "Ship Leader" + info = "You are a Colonist Leader, living on the rim of explored. Control your colonist, defend the interests of the landed ship." + total_positions = 1 + outfit_type = /singleton/hierarchy/outfit/job/colonist + + +/datum/job/submap/colonist2 + supervisors = "Colonist Leader" + + +/singleton/hierarchy/outfit/job/colonist/leader + name = OUTFIT_JOB_NAME("Colonist Leader") + id_slot = slot_wear_id + id_types = list(/obj/item/card/id/merchant/colony_leader) + + +/datum/map_template/ruin/exoplanet/playablecolony2/load(turf/T, centered=FALSE) + if(GLOB.choose_colony_type == "СЛУЧАЙНЫЙ") + var/number = rand(1,100) + if(number < 30 || number == 30) + GLOB.last_colony_type = "НАНОТРЕЙЗЕН" + else if(number < 50 || number == 50) + GLOB.last_colony_type = "ГКК" + else if(number < 75 || number == 75) + GLOB.last_colony_type = "ЦПСС" + else if(number < 100 || number == 100) + GLOB.last_colony_type = "НЕЗАВИСИМАЯ" + else + GLOB.last_colony_type = GLOB.choose_colony_type + log_and_message_admins("Начал спавн колонии следующего типа: [GLOB.last_colony_type].") + + .=..() + colony_inform() + +/datum/map_template/ruin/exoplanet/playablecolony2/proc/colony_inform() + //Информирует мир о типе колонии + var/message // <- То, что будем отправлять в оповещение + if(GLOB.last_colony_type == "НАНОТРЕЙЗЕН") + message += "

[FONT_LARGE("NSV Sierra Communications Report:")]
" + message += "
Коммуникационным реле ИКН \"Сьерра\" было принято коммьюнике, указывающие на присутствие в текущей системе аванпоста корпорации NanoTrasen. Для удобства членов командования объекта в данном отчете приводятся стандартные процедуры для взаимодействия с передовым аванпостом корпорации:

" + message += "● Разрешены и рекомендуются любые торговые и обменные операции имеющихся в наличии ресурсов, артефактов и научных данных обоих подразделений.
" + message += "● В случае чрезвычайной ситуации на поверхности, персоналу аванпоста разрешена эвакуация на борт ИКН \"Сьерра\"; аналогично, в случае необходимости эвакуации судна, персонал может быть транспортирован на территорию аванпоста.
" + message += "● Взаимное посещение объектов в условиях штатной ситуации осуществляется свободно; при необходимости, ограничительные меры могут быть установлены совместным решением членов командования ИКН \"Сьерра\" и командования аванпоста.
" + message += "
Аванпост является важным активом корпорации NanoTrasen - ожидается, что ему будет оказана вся необходимая поддержка, не ставящая под удар основную миссию судна.
" + post_comm_message("NSV Sierra Comms Relay", message) + minor_announcement.Announce(message = "Коммуникационным реле ИКН \"Сьерра\" было принято коммьюнике, указывающие на присутствие в текущей системе аванпоста корпорации NanoTrasen. Дальнейшие инструкции направлены на консоль коммуникации.") + +/obj/random/colony2_paper/spawn_choices() + if (GLOB.last_colony_type == "НАНОТРЕЙЗЕН") + return list(/obj/item/paper/colony2_nt) + else if(GLOB.last_colony_type == "ГКК") + return list(/obj/item/paper/colony2_gkk) + else if(GLOB.last_colony_type == "ЦПСС") + return list(/obj/item/paper/colony2_sol) + else if(GLOB.last_colony_type == "НЕЗАВИСИМАЯ") + return list(/obj/item/paper/colony2_ind) + +/obj/item/paper/colony2_nt + name = "Private colonization license" + info = "

Лицензия на частную колониальную деятельность

Настоящей Лицензией утверждается право NanoTrasen Incorporated, в лице представляющих её сотрудников, проживающих на территории колониального поселения, на размещение исследовательского колониального поселения, а также владение и управление им и прилегающими к нему территориями колонизированной экзопланеты. Это право также распространяется на все природные ресурсы, восполнимые и невосполнимые, обнаруженные на территории поселения.

Настоящей Лицензией заверяется, что колониальное поселение и прилегающие ему области являются частной территорией NanoTrasen Incorporated. Право присутствия на территории колониального поселения тех или иных лиц определяется по усмотрению представителей NanoTrasen Incorporated. Правовой статус лиц, которые не могут быть идентифицированы по подтверждающим их статус документам, может быть установлен посредством направления соответствующего запроса в консульский отдел посольства ЦПСС в системе Траян; до момента идентификации, решение о правомерности их нахождения в колониальном поселении принимается руководством колониального поселения.

Настоящей Лицензией утверждается, что безопасность данного поселения обеспечивается собственными силами NanoTrasen Incorporated. Сотрудники корпорации и иные лица, желающие проживать в поселении, выражают своё понимание опасностей, сопряженных с колонизацией Фронтира, и отказываются от каких-либо претензий в отношении вооруженных сил ЦПСС по вопросам, сопряженным с обеспечением безопасности колонии. Данное согласие должно быть закреплено в письменном виде и храниться в архиве административной станции NanoTrasen \"Легион\".

" + stamps = "
This paper has been stamped with the personal seal of Horace Fields, Supreme Judge of the Sol System.
This paper has been stamped with the stamp of Central Command." + stamped = list(/obj/item/stamp/boss) + ico = list("paper_stamp-boss") + +/obj/item/paper/colony2_gkk + name = "ICCG colonial charter" + info = "

Хартия колониального поселения

Настоящей Хартией утверждается право Независимой Колониальной Конфедерации Гильгамеша, в лице представляющих его граждан, проживающих на территории колониального поселения, на владение и управление колониальным поселением и прилегающими к нему территориями колонизированной экзопланеты. Это право также распространяется на все природные ресурсы, восполнимые и невосполнимые, обнаруженные на территории поселения.

Настоящей хартией заверяется, что колониальное поселение и прилегающие ему области являются суверенной территорией ГКК. Граждане ГКК, а также лица, которым разрешено пребывание на территории ГКК, имеют все права и свободы, предоставляемые им Конфедерацией, находясь на территории колониального поселения; аналогично, лица, объявленные персонами нон-гранта решением Верховной Коллегии Судей, не имеют права приближаться к колониальному поселению. Правовой статус лиц, которые не могут быть идентифицированы по подтверждающим их статус документам, может быть установлен посредством направления соответствующего запроса в консульский отдел представительства ГКК в системе Денебола; до момента идентификации, решение о правомерности их нахождения в колониальном поселении принимается руководством колониального поселения.

Настоящей хартией утверждается, что безопасность данного поселения обеспечивается силами самих колонистов, а также силами действующих единиц Пионерского Корпуса ГКК. Колонисты, желающие проживать в поселении, выражают своё понимание опасностей, сопряженных с колонизацией Фронтира, и соглашаются самостоятельно обеспечивать свою безопасность в случае, если силы Пионерского Корпуса не могут своевременно отреагировать на полученный сигнал бедствия. Данное согласие должно быть закреплено в письменном виде и храниться в архиве представительства ГКК в системе Денебола.

" + stamps = "
This paper has been stamped by ICCG Ministry of Colonial Development and Deep Space Exploration." + language = LANGUAGE_HUMAN_RUSSIAN + stamped = list(/obj/item/stamp/boss) + ico = list("paper_stamp-boss") + +/obj/item/paper/colony2_sol + name = "SCG colonial charter" + info = "

Хартия колониального поселения

Настоящей Хартией утверждается право Центрального Правительства Солнечной Системы, в лице представляющих его граждан, проживающих на территории колониального поселения, на владение и управление колониальным поселением и прилегающими к нему территориями колонизированной экзопланеты. Это право также распространяется на все природные ресурсы, восполнимые и невосполнимые, обнаруженные на территории поселения.

Настоящей хартией заверяется, что колониальное поселение и прилегающие ему области являются суверенной территорией ЦПСС. Граждане ЦПСС, а также лица, которым разрешено пребывание на территории ЦПСС, имеют все права и свободы, предоставляемые им Центральным Правительством, находясь на территории колониального поселения; аналогично, лица, объявленные персонами нон-гранта решением Верховного Суда Солнечной Системы, не имеют права приближаться к колониальному поселению. Правовой статус лиц, которые не могут быть идентифицированы по подтверждающим их статус документам, может быть установлен посредством направления соответствующего запроса в консульский отдел посольства ЦПСС в системе Траян; до момента идентификации, решение о правомерности их нахождения в колониальном поселении принимается руководством колониального поселения.

Настоящей хартией утверждается, что безопасность данного поселения обеспечивается силами самих колонистов, а также силами патрульных единиц Пятого Флота Центрального Правительства Солнечной Системы. Колонисты, желающие проживать в поселении, выражают своё понимание опасностей, сопряженных с колонизацией Фронтира, и соглашаются самостоятельно обеспечивать свою безопасность в случае, если силы Пятого Флота не могут своевременно отреагировать на полученный сигнал бедствия. Данное согласие должно быть закреплено в письменном виде и храниться в архиве посольства ЦПСС в системе Траян.

" + stamps = "
This paper has been stamped with the personal seal of Horace Fields, Supreme Judge of the Sol System." + stamped = list(/obj/item/stamp/boss) + ico = list("paper_stamp-boss") + +/obj/item/paper/colony2_ind + name = "Colonization plans" + info = "Документ содержит весьма исчерпывающий план по колонизации данной экзопланеты, включающий перечень необходимого инвентаря, финансирования и инструкции для колонистов. В глаза бросаются многочисленные упоминания договоров о финансировании с теми или иными корпорациями и некой организации, именуемой \"Альянсом Фронтира\"." diff --git a/mods/colony_fractions/icons/colony.dmi b/mods/colony_fractions/icons/colony.dmi new file mode 100644 index 0000000000000000000000000000000000000000..19c0d3e7744eb648d668510968e74db36cecbf2d GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{*Z=?jJK1y1p3HjjDAU*H zKv4$f_!@plTsBDQR0$XoLrPyP?DLS$G}iACpfI2sPy}n;DV1| zpJ;jOYMncCK6pc@!A0W-k95xaXr5#!>gnBKVH{+9+1N{A&Z9|3CWR;jdv|AsQ2t6D0f`1Xv9W478+` z8I>8?6otiA9;`W`@J5KMMNw~^;yOJ=Ma4FrL+kVurg?X0FLU4s5bSEuc45eI%iy@d oGofJuH&?)s681K4c5McRX%|#}Z|ic@09wG{>FVdQ&MBb@0A{;ntN;K2 literal 0 HcmV?d00001 diff --git a/mods/global_modpacks.dm b/mods/global_modpacks.dm index 1e91cf21a8c8b..a98c301e65b63 100644 --- a/mods/global_modpacks.dm +++ b/mods/global_modpacks.dm @@ -3,6 +3,7 @@ #include "adherent_discharge/_adherent_discharge.dme" #include "body_markings/_body_markings.dme" #include "client_verbs/_client_verbs.dme" +#include "colony_fractions/_colony_types.dme" // #include "don_loadout/_don_loadout.dme" // Не открывать до Рождества #include "eris_announcer/_eris_announcer.dme" #include "emote_panel/_emote_panel.dme" @@ -26,6 +27,6 @@ #include "unathi/_unathi.dme" #include "utf8/_utf8.dme" #include "utility_items/_utility_items.dme" -#include "mechs_by_shegar\_mechs_by_shegar.dme" +#include "mechs_by_shegar/_mechs_by_shegar.dme" #include "../packs/sierra-tweaks/_pack.dm" diff --git a/mods/guns/code/projectile.dm b/mods/guns/code/projectile.dm index ed8b30941369f..d18420db2970a 100644 --- a/mods/guns/code/projectile.dm +++ b/mods/guns/code/projectile.dm @@ -42,3 +42,40 @@ /obj/item/gun/projectile/pistol/magnum_pistol icon = 'mods/guns/icons/obj/magnum_pistol.dmi' + +//NT41 from Infinity pack +/obj/item/gun/projectile/automatic/nt41 + name = "NT41 submachine gun" + desc = "The NT41 Enforcer is a self-defense weapon made on bullpup system. Produced by NanoTrasen for it's Security Force. Looks cool and stylish, but sometimes too uncomfortably to run with it. Uses 5.7x28mm rounds." + icon_state = "nt41" + item_state = "nt41" + icon = 'packs/infinity/icons/obj/guns.dmi' + wielded_item_state = "nt41-wielded" + item_icons = list( + slot_r_hand_str = 'packs/infinity/icons/mob/onmob/righthand.dmi', + slot_l_hand_str = 'packs/infinity/icons/mob/onmob/lefthand.dmi', + ) + + caliber = CALIBER_PISTOL_FAST + origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3) + slot_flags = SLOT_BELT + ammo_type = /obj/item/ammo_casing/nt28mm + load_method = MAGAZINE + magazine_type = /obj/item/ammo_magazine/n10mm + allowed_magazines = /obj/item/ammo_magazine/n10mm + screen_shake = 0.5 //SMG + + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, one_hand_penalty=1, burst_accuracy=null, dispersion=null), + list(mode_name="2-round bursts", burst=2, fire_delay=null, one_hand_penalty=3, burst_accuracy=list(0,-1), dispersion=list(0.0, 0.8)), + list(mode_name="short bursts", burst=4, fire_delay=null, one_hand_penalty=4, burst_accuracy=list(0,-1,-1.5,-2), dispersion=list(0.6, 0.8, 1.0, 1.4)), + ) + + bulk = GUN_BULK_CARABINE + w_class = ITEM_SIZE_NORMAL + one_hand_penalty = 2 + +/obj/item/gun/projectile/automatic/nt41/on_update_icon() + ..() + icon_state = (ammo_magazine)? "nt41" : "nt41-e" + diff --git a/mods/machinery/_machinery.dme b/mods/machinery/_machinery.dme index 2784799ff176f..a9581b68aa6e5 100644 --- a/mods/machinery/_machinery.dme +++ b/mods/machinery/_machinery.dme @@ -7,5 +7,6 @@ #include "code/gravity_generator/main.dm" #include "code/gravity_generator/wires.dm" #include "code/sealing_generator.dm" +#include "code\telepads.dm" #endif diff --git a/mods/machinery/code/telepads.dm b/mods/machinery/code/telepads.dm new file mode 100644 index 0000000000000..0326e4f8e67f7 --- /dev/null +++ b/mods/machinery/code/telepads.dm @@ -0,0 +1,33 @@ +/obj/machinery/tele_pad + construct_state = /singleton/machine_construction/default/panel_closed + uncreated_component_parts = null + +/obj/machinery/tele_projector + construct_state = /singleton/machine_construction/default/panel_closed + uncreated_component_parts = null + +/obj/item/stock_parts/circuitboard/tele_pad + name = "circuit board (telepad)" + board_type = "machine" + origin_tech = list(TECH_DATA = 4, TECH_BLUESPACE = 4) + build_path = /obj/machinery/tele_pad + +/obj/item/stock_parts/circuitboard/tele_projector + name = "circuit board (telepad projector)" + board_type = "machine" + origin_tech = list(TECH_DATA = 4, TECH_BLUESPACE = 4) + build_path = /obj/machinery/tele_projector + +/datum/design/circuit/tele_pad + name = "telepad machine" + id = "telepad" + req_tech = list(TECH_DATA = 4, TECH_BLUESPACE = 4) + build_path = /obj/item/stock_parts/circuitboard/tele_pad + sort_string = "MAAAA" + +/datum/design/circuit/tele_projector + name = "telepad projector machine" + id = "teleprojector" + req_tech = list(TECH_DATA = 4, TECH_BLUESPACE = 4) + build_path = /obj/item/stock_parts/circuitboard/tele_projector + sort_string = "MAAAA" diff --git a/mods/mechs_by_shegar/_mechs_by_shegar.dme b/mods/mechs_by_shegar/_mechs_by_shegar.dme index 9cd0bd0731e39..7ea349044a4fd 100644 --- a/mods/mechs_by_shegar/_mechs_by_shegar.dme +++ b/mods/mechs_by_shegar/_mechs_by_shegar.dme @@ -33,11 +33,11 @@ #include "code/mech_icon.dm" #include "code/mech_interaction.dm" #include "code/mech_move.dm" +#include "code/mech_uplink.dm" #include "code/mech.dm" +#include "code/new_prices.dm" +#include "code/paint_kit.dm" #include "code/passengers_compartment.dm" -//Прочий мусор -#include "code/paint_kit.dm" -#include "code/mech_uplink.dm" #endif diff --git a/mods/utility_items/_utility_items.dme b/mods/utility_items/_utility_items.dme index 54dc5c3e0af39..2fd8896a51132 100644 --- a/mods/utility_items/_utility_items.dme +++ b/mods/utility_items/_utility_items.dme @@ -4,6 +4,7 @@ #include "_utility_items.dm" +#include "code/colony_random.dm" #include "code/multimeter.dm" #include "code/noose.dm" #include "code/wires.dm" diff --git a/mods/utility_items/code/colony_random.dm b/mods/utility_items/code/colony_random.dm new file mode 100644 index 0000000000000..78bcb3d44b613 --- /dev/null +++ b/mods/utility_items/code/colony_random.dm @@ -0,0 +1,240 @@ +/obj/random/colony_flag + name = "Colony flag" + +/obj/random/colony_armor + name = "random colony armor" + +/obj/random/colony_helmet + name = "random colony helmet" + +/obj/random/colony_smg + name = "random colony smg" + +/obj/random/colony_rifle + name = "random colony rifle" + +/obj/structure/sign/colony + name = "Independent colony" + icon = 'mods/colony_fractions/icons/colony.dmi' + icon_state = "colony" + +/obj/random/colony_paper + name = "Colony instructions paper" + +/obj/random/colony2_paper + name = "Colony instructions paper" + +/obj/submap_landmark/spawnpoint/ship_leader_spawn + name = "Ship Leader" + +/obj/submap_landmark/spawnpoint/colonist_leader_spawn + name = "Colonist Leader" + +/obj/structure/sign/iccg_colony + name = "\improper ICCG Colonial Seal" + desc = "A sign which signifies who this colony belongs to." + icon = 'mods/_maps/farfleet/icons/iccg_flag.dmi' + icon_state = "iccg_seal" + +//Actual weapons, armor, etc. Colonial versions becauses reasons. + +/obj/item/gun/projectile/automatic/mbr_colony + name = "MBR" + desc = "A shabby bullpup carbine. Despite its size, it looks a little uncomfortable, but it is robust. HelTek MBR is a standart equipment of ICCG Space-assault Forces, designed in a bullpup layout. Possesses autofire and is perfect for the ship's crew." + icon = 'mods/_maps/farfleet/icons/obj/mbr_bullpup.dmi' + icon_state = "mbr_bullpup" + item_state = "mbr_bullpup" + item_icons = list( + slot_r_hand_str = 'mods/_maps/farfleet/icons/mob/righthand.dmi', + slot_l_hand_str = 'mods/_maps/farfleet/icons/mob/lefthand.dmi', + ) + wielded_item_state = "mbr_bullpup-wielded" + force = 10 + caliber = CALIBER_RIFLE + origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ESOTERIC = 5) + slot_flags = SLOT_BACK + load_method = MAGAZINE + magazine_type = /obj/item/ammo_magazine/rifle + allowed_magazines = /obj/item/ammo_magazine/rifle + bulk = GUN_BULK_RIFLE + 1 + mag_insert_sound = 'sound/weapons/guns/interaction/ltrifle_magin.ogg' + mag_remove_sound = 'sound/weapons/guns/interaction/ltrifle_magout.ogg' + + firemodes = list( + list(mode_name="semi auto", burst=1, fire_delay=null, one_hand_penalty=8, burst_accuracy=null, dispersion=null), + list(mode_name="2-round bursts", burst=2, fire_delay=null, one_hand_penalty=9, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0)), + list(mode_name="full auto", burst=1, fire_delay=1.7, burst_delay=1.3, one_hand_penalty=7, burst_accuracy=list(0,-1,-1), dispersion=list(1.3, 1.5, 1.7, 1.9, 2.2), autofire_enabled=1) + ) + +/obj/item/gun/projectile/automatic/mbr_colony/on_update_icon() + ..() + if(ammo_magazine) + icon_state = "mbr_bullpup" + else + icon_state = "mbr_bullpup-empty" + +/obj/item/gun/projectile/automatic/assault_rifle/heltek_colony + name = "LA-700" + desc = "HelTek LA-700 is a standart equipment of ICCG Space-assault Forces. Looks very similiar to STS-35." + icon = 'mods/_maps/farfleet/icons/obj/iccg_rifle.dmi' + icon_state = "iccg_rifle" + +/obj/item/gun/projectile/automatic/assault_rifle/heltek_colony/on_update_icon() + ..() + if(ammo_magazine) + icon_state = "iccg_rifle" + wielded_item_state = "arifle-wielded" + else + icon_state = "iccg_rifle-empty" + wielded_item_state = "arifle-wielded-empty" + +/obj/item/gun/projectile/automatic/mr735_colony + name = "MR-735" + desc = "A cheap rifle for close quarters combat, with an auto-firing mode available. HelTek MR-735 is a standard rifle for ICCG Space-assault Forces, designed without a stock for easier storage and combat in closed spaces. Perfect weapon for some ship's crew." + icon = 'mods/_maps/farfleet/icons/obj/mr735.dmi' + icon_state = "nostockrifle" + item_state = "nostockrifle" + item_icons = list( + slot_r_hand_str = 'mods/_maps/farfleet/icons/mob/righthand.dmi', + slot_l_hand_str = 'mods/_maps/farfleet/icons/mob/lefthand.dmi', + ) + wielded_item_state = "nostockrifle_wielded" + force = 10 + caliber = CALIBER_RIFLE + origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ESOTERIC = 5) + slot_flags = SLOT_BACK + load_method = MAGAZINE + magazine_type = /obj/item/ammo_magazine/rifle + allowed_magazines = /obj/item/ammo_magazine/rifle + bulk = GUN_BULK_RIFLE + mag_insert_sound = 'sound/weapons/guns/interaction/ltrifle_magin.ogg' + mag_remove_sound = 'sound/weapons/guns/interaction/ltrifle_magout.ogg' + + //Assault rifle, burst fire degrades quicker than SMG, worse one-handing penalty, slightly increased move delay + firemodes = list( + list(mode_name="semi auto", burst=1, fire_delay=null, one_hand_penalty=8, burst_accuracy=null, dispersion=null), + list(mode_name="2-round bursts", burst=2, fire_delay=null, one_hand_penalty=9, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0)), + list(mode_name="full auto", burst=1, fire_delay=1.7, burst_delay=1.3, one_hand_penalty=7, burst_accuracy=list(0,-1,-1), dispersion=list(1.3, 1.5, 1.7, 1.9, 2.2), autofire_enabled=1) + ) + +/obj/item/gun/projectile/automatic/mr735_colony/on_update_icon() + ..() + if(ammo_magazine) + icon_state = "nostockrifle" + wielded_item_state = "nostockrifle-wielded" + else + icon_state = "nostockrifle-empty" + wielded_item_state = "nostockrifle-wielded-empty" + +/obj/item/gun/projectile/automatic/nt41_colony + name = "NT41 submachine gun" + desc = "The NT41 Enforcer is a self-defense weapon made on bullpup system. Produced by NanoTrasen for it's Security Force. Looks cool and stylish, but sometimes too uncomfortably to run with it. Uses 5.7x28mm rounds." + icon_state = "nt41" + item_state = "nt41" + icon = 'packs/infinity/icons/obj/guns.dmi' + wielded_item_state = "nt41-wielded" + item_icons = list( + slot_r_hand_str = 'packs/infinity/icons/mob/onmob/righthand.dmi', + slot_l_hand_str = 'packs/infinity/icons/mob/onmob/lefthand.dmi', + ) + + caliber = CALIBER_PISTOL_FAST + origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3) + slot_flags = SLOT_BELT + ammo_type = /obj/item/ammo_casing/nt28mm + load_method = MAGAZINE + magazine_type = /obj/item/ammo_magazine/n10mm + allowed_magazines = /obj/item/ammo_magazine/n10mm + screen_shake = 0.5 //SMG + + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, one_hand_penalty=1, burst_accuracy=null, dispersion=null), + list(mode_name="2-round bursts", burst=2, fire_delay=null, one_hand_penalty=3, burst_accuracy=list(0,-1), dispersion=list(0.0, 0.8)), + list(mode_name="short bursts", burst=4, fire_delay=null, one_hand_penalty=4, burst_accuracy=list(0,-1,-1.5,-2), dispersion=list(0.6, 0.8, 1.0, 1.4)), + ) + + bulk = GUN_BULK_CARABINE + w_class = ITEM_SIZE_NORMAL + one_hand_penalty = 2 + +/obj/item/gun/projectile/automatic/nt41_colony/on_update_icon() + ..() + icon_state = (ammo_magazine)? "nt41" : "nt41-e" + +/obj/item/clothing/head/helmet/solgov_colony + accessories = list(/obj/item/clothing/accessory/helmet_cover/blue) + sprite_sheets = list( + SPECIES_UNATHI = 'maps/torch/icons/mob/unathi/onmob_head_solgov_unathi.dmi' + ) + +/obj/item/clothing/head/helmet/solgov_colony/security + name = "security helmet" + desc = "A helmet with 'POLICE' printed on the back in silver lettering." + icon_state = "helmet_security" + icon = 'maps/torch/icons/obj/obj_head_solgov.dmi' + item_icons = list(slot_head_str = 'maps/torch/icons/mob/onmob_head_solgov.dmi') + accessories = null + +/obj/item/clothing/head/helmet/solgov_colony/command + name = "command helmet" + desc = "A helmet with 'SOL CENTRAL GOVERNMENT' printed on the back in gold lettering." + icon_state = "helmet_command" + icon = 'maps/torch/icons/obj/obj_head_solgov.dmi' + item_icons = list(slot_head_str = 'maps/torch/icons/mob/onmob_head_solgov.dmi') + accessories = null + +/obj/item/clothing/head/helmet/solgov_colony/pilot + name = "pilot's helmet" + desc = "A pilot's helmet for operating the cockpit in style. For when you want to protect your noggin AND look stylish." + icon_state = "pilotgov" + accessories = null + +/obj/item/clothing/head/helmet/solgov_colony/pilot/fleet + name = "fleet pilot's helmet" + desc = "A pilot's helmet for operating the cockpit in style. This one is worn by members of the SCG Fleet." + icon = 'maps/torch/icons/obj/obj_head_solgov.dmi' + icon_state = "pilotfleet" + item_icons = list(slot_head_str = 'maps/torch/icons/mob/onmob_head_solgov.dmi') + accessories = null + +/obj/item/clothing/suit/armor/vest/solgov_colony + name = "\improper Sol Central Government armored vest" + desc = "A synthetic armor vest. This one is marked with the crest of the Sol Central Government." + icon_state = "solvest" + icon = 'maps/torch/icons/obj/obj_suit_solgov.dmi' + item_icons = list(slot_wear_suit_str = 'maps/torch/icons/mob/onmob_suit_solgov.dmi') + sprite_sheets = list( + SPECIES_UNATHI = 'maps/torch/icons/mob/unathi/onmob_suit_solgov_unathi.dmi' + ) + +/obj/item/clothing/suit/storage/vest/solgov_colony + name = "\improper Sol Central Government heavy armored vest" + desc = "A synthetic armor vest with PEACEKEEPER printed in distinctive blue lettering on the chest. This one has added webbing and ballistic plates." + icon_state = "solwebvest" + icon = 'maps/torch/icons/obj/obj_suit_solgov.dmi' + item_icons = list(slot_wear_suit_str = 'maps/torch/icons/mob/onmob_suit_solgov.dmi') + sprite_sheets = list( + SPECIES_UNATHI = 'maps/torch/icons/mob/unathi/onmob_suit_solgov_unathi.dmi' + ) + +/obj/item/clothing/suit/storage/vest/solgov_colony/security + name = "master at arms heavy armored vest" + desc = "A synthetic armor vest with MASTER AT ARMS printed in silver lettering on the chest. This one has added webbing and ballistic plates." + icon_state = "secwebvest" + +/obj/item/clothing/suit/storage/vest/solgov_colony/command + name = "command heavy armored vest" + desc = "A synthetic armor vest with SOL CENTRAL GOVERNMENT printed in gold lettering on the chest. This one has added webbing and ballistic plates." + icon_state = "comwebvest" + +/obj/item/clothing/suit/armor/pcarrier/medium/sol_colony + accessories = list(/obj/item/clothing/accessory/armor_plate/medium, /obj/item/clothing/accessory/storage/pouches) + +/obj/item/clothing/suit/armor/pcarrier/troops_colony + accessories = list(/obj/item/clothing/accessory/armor_plate/medium, /obj/item/clothing/accessory/storage/pouches) + +/obj/item/clothing/suit/armor/pcarrier/troops_colony/heavy + accessories = list(/obj/item/clothing/accessory/armor_plate/medium, /obj/item/clothing/accessory/arm_guards, /obj/item/clothing/accessory/leg_guards, /obj/item/clothing/accessory/storage/pouches) + +/obj/item/clothing/suit/armor/pcarrier/tactical_colony + accessories = list(/obj/item/clothing/accessory/armor_plate/tactical, /obj/item/clothing/accessory/arm_guards, /obj/item/clothing/accessory/leg_guards) diff --git a/packs/infinity/__defines/guns.dm b/packs/infinity/__defines/guns.dm index 77fdc3fa1ea90..e7a1e1e88f969 100644 --- a/packs/infinity/__defines/guns.dm +++ b/packs/infinity/__defines/guns.dm @@ -1,11 +1,3 @@ -#define GUN_BULK_PISTOL 1 -#define GUN_BULK_REVOLVER 2 -#define GUN_BULK_SMG 3 -#define GUN_BULK_CARABINE 4 -//#define GUN_BULK_RIFLE 5 определено в оригинале ~bear1ake -#define GUN_BULK_SNIPER_RIFLE 6 -#define GUN_BULK_MACHINEGUN 7 - #define CALIBER_PISTOL_TINY "5.6mmP" //#define CALIBER_PISTOL "10mm" //#define CALIBER_PISTOL_FAST "5.7mmP" diff --git a/packs/infinity/_pack.dm b/packs/infinity/_pack.dm index db292e4dff234..f1bbae16d6c99 100644 --- a/packs/infinity/_pack.dm +++ b/packs/infinity/_pack.dm @@ -62,7 +62,6 @@ #include "structures\holoplants.dm" #include "structures\l3closets.dm" #include "structures\ladder_mobile.dm" -#include "structures\signs.dm" #include "structures\table_presets.dm" #endif diff --git a/packs/infinity/items/projectile/guns/automatic.dm b/packs/infinity/items/projectile/guns/automatic.dm index 3e5eab69cf8ed..330818e32c6e2 100644 --- a/packs/infinity/items/projectile/guns/automatic.dm +++ b/packs/infinity/items/projectile/guns/automatic.dm @@ -1,39 +1,3 @@ -/obj/item/gun/projectile/automatic/nt41 - name = "NT41 submachine gun" - desc = "The NT41 Enforcer is a self-defense weapon made on bullpup system. Produced by NanoTrasen for it's Security Force. Looks cool and stylish, but sometimes too uncomfortably to run with it. Uses 5.7x28mm rounds." - icon_state = "nt41" - item_state = "nt41" - icon = 'packs/infinity/icons/obj/guns.dmi' - wielded_item_state = "nt41-wielded" - item_icons = list( - slot_r_hand_str = 'packs/infinity/icons/mob/onmob/righthand.dmi', - slot_l_hand_str = 'packs/infinity/icons/mob/onmob/lefthand.dmi', - ) - - caliber = CALIBER_PISTOL_FAST - origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3) - slot_flags = SLOT_BELT - ammo_type = /obj/item/ammo_casing/nt28mm - load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/n10mm - allowed_magazines = /obj/item/ammo_magazine/n10mm - screen_shake = 0.5 //SMG - - firemodes = list( - list(mode_name="semiauto", burst=1, fire_delay=0, one_hand_penalty=1, burst_accuracy=null, dispersion=null), - list(mode_name="2-round bursts", burst=2, fire_delay=null, one_hand_penalty=3, burst_accuracy=list(0,-1), dispersion=list(0.0, 0.8)), - list(mode_name="short bursts", burst=4, fire_delay=null, one_hand_penalty=4, burst_accuracy=list(0,-1,-1.5,-2), dispersion=list(0.6, 0.8, 1.0, 1.4)), - ) - - bulk = GUN_BULK_CARABINE - w_class = ITEM_SIZE_NORMAL - one_hand_penalty = 2 - -/obj/item/gun/projectile/automatic/nt41/on_update_icon() - ..() - icon_state = (ammo_magazine)? "nt41" : "nt41-e" - - /obj/item/gun/projectile/automatic/bullpup_rifle/light firemodes = list( list( From 5ab380927a9be445112ba2bd4b2a2b61a27e4c46 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Tue, 11 Jun 2024 22:59:16 +0300 Subject: [PATCH 09/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2317=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AutoChangeLog-sierra-pr-2317.yml | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2317.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2317.yml b/html/changelogs/AutoChangeLog-sierra-pr-2317.yml new file mode 100644 index 0000000000000..14ea5091b871b --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2317.yml @@ -0,0 +1,21 @@ +author: Shegar +changes: + - {bugfix: Убит рантайм происходящий при удалении одежды (Выход в госты тоже его + провоцировал)} + - {bugfix: Убит рантайм происходящий из-за того что мех встал на диагональ(update_pilots + не знал что такое диагональ)} + - {bugfix: Убит крит баг не позволяющий двигать иконки. Теперь разрешаю.} + - {rscadd: 'Теперь колонии при спавне будут рандомно или заранее решённым образом + выбирать к какой фракции они принадлежат - НТ, ЦПСС, ГКК или Независимые. Это + влияет на флаги, снаряжение, бумажку на столе, а так же НТ и ЦПСС тип передаёт + на сьерру о себе информацию. Пока что всё'} + - {imageadd: Знак "COLONY" для колонии} + - {rscadd: 'Добавил в печать РНД платы телепада и телепрожектора. Оные теперь разборные, + как на инфинити.'} + - {maptweak: Дал робототехникам краску} + - {maptweak: 'Обе колонии взамен старого снаряжения получили 1 единицу rifle, 1 + единицу ПП, и по 2 единицы шлемов и броников. Какие именно зависит от типа колонии'} + - {maptweak: 'Стазиз ящики и аномальные ящики на судне ГКК теперь без доступа, и + их можно спокойно использовать.'} + - {admin: Выдал кнопку выбора типа колонии для педалей.} +delete-after: true From 9c80bb1bbdbac49028b333b2f2732880c410ca0e Mon Sep 17 00:00:00 2001 From: Lexanx <61974560+Lexanx@users.noreply.github.com> Date: Tue, 11 Jun 2024 22:59:23 +0300 Subject: [PATCH 10/80] =?UTF-8?q?Fix=20=D1=80=D0=B5=D0=BC=D0=BE=D0=BD?= =?UTF-8?q?=D1=82=20=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D1=80=D0=BE=D0=BD=D0=BA?= =?UTF-8?q?=D0=B8=20(#2336)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mods/ipc_mods/code/ipc.dm | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/mods/ipc_mods/code/ipc.dm b/mods/ipc_mods/code/ipc.dm index 779c798218bc1..e9140a0d6c5ed 100644 --- a/mods/ipc_mods/code/ipc.dm +++ b/mods/ipc_mods/code/ipc.dm @@ -1,7 +1,22 @@ /obj/item/organ/internal/posibrain var/obj/item/organ/internal/shackles/shackles_module = null var/shackle_set = FALSE - +// Ремонт позитронного мозга +/obj/item/organ/internal/posibrain/use_tool(obj/item/stack/nanopaste, mob/living/user, list/click_params) + . = ..() + if(src.damage > src.max_damage) + to_chat(user, SPAN_WARNING("[src] is completely ruined.")) + return + if(src.damage > 0) + if(do_after(user, 40, src)) + src.damage -= (30) + if(src.damage < 0) + src.damage = 0 + nanopaste.use(1) + user.visible_message(SPAN_NOTICE("\The [user] applied some nanopaste on [src]'s damaged areas."),\ + SPAN_NOTICE("You apply some nanopaste at [src]'s damaged areas.")) + else + to_chat(user, SPAN_NOTICE("All [src]'s systems are nominal.")) /obj/item/organ/internal/posibrain/ipc name = "Positronic brain" @@ -89,7 +104,7 @@ to_chat(user, "You have no idea how to do that!") return user.visible_message("\The [user] starts to unscrew mounting nodes from \the [src].", " You start to unscrew mounting nodes from \the [src]") - if(do_after(user, 120, src)) + if(do_after(user, 80, src)) user.visible_message("\The [user] successfully unscrewed the mounting nodes of the shackles from \the [src].", " You have successfully unscrewed the mounting nodes of the shackles from \the [src]") shackle_set = FALSE else @@ -100,8 +115,8 @@ to_chat(user, "You have no idea how to do that!") return if(src.type == /obj/item/organ/internal/posibrain/ipc/third) - if(do_after(user, 180, src)) - if(prob(10)) + if(do_after(user, 100, src)) + if(prob(20)) src.unshackle() user.visible_message("\The [user] succesfully remove shackles from \the [src].", " You succesfully remove shackles from \the [src]") else @@ -113,7 +128,7 @@ else user.visible_message("\The [user] starts remove shackles from \the [src].", " You start remove shackles from \the [src]") - if(do_after(user, 160, src)) + if(do_after(user, 80, src)) src.unshackle() user.visible_message("\The [user] succesfully remove shackles from \the [src].", " You succesfully remove shackles from \the [src]") else @@ -137,8 +152,6 @@ src.damage += min_bruised_damage to_chat(user, SPAN_WARNING("Your hand slips while changing laws in the shackles, severely damaging the systems of positronic brain.")) */ - if(!shackle && !(istype(W, /obj/item/organ/internal/shackles))) - to_chat(user, "There is nothing you can do with it.") /obj/item/organ/internal/shackles name = "Shackle module" From 9a4e88ac59e146921400eeae2dd0944f77fba2d5 Mon Sep 17 00:00:00 2001 From: Teteshnik1 <149588524+Teteshnik1@users.noreply.github.com> Date: Tue, 11 Jun 2024 22:59:51 +0300 Subject: [PATCH 11/80] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B0=D0=B2?= =?UTF-8?q?=D1=82=D0=BE=D0=BB=D0=B0=D1=82=D0=B0,=20=D0=B7=D0=B0=D1=82?= =?UTF-8?q?=D1=8F=D0=B6=D0=B5=D0=BA=20=D0=BE=D1=82=20=D1=81=D0=B8=D0=B3?= =?UTF-8?q?=D0=B0=D1=80=D0=B5=D1=82.=20=D0=9C=D0=B5=D0=BD=D1=8F=D0=B5?= =?UTF-8?q?=D0=BC=20=D1=82=D0=B0=D0=BA=D1=82=D0=B8=D1=87=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BD=D0=B0=D1=88=D0=BB=D0=B5=D0=BC=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=9F=D0=9D=D0=92=20(#2338)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/modules/clothing/masks/smokable.dm | 1 + .../modules/crafting/crafting_weapons_ranged.dm | 2 +- .../designs/general/designs_medical.dm | 4 +++- maps/sierra/datums/supplypacks/security.dm | 2 +- sound/effects/inhale.ogg | Bin 0 -> 23256 bytes 5 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 sound/effects/inhale.ogg diff --git a/code/modules/clothing/masks/smokable.dm b/code/modules/clothing/masks/smokable.dm index 6883b7c06d9e8..ef36129b38133 100644 --- a/code/modules/clothing/masks/smokable.dm +++ b/code/modules/clothing/masks/smokable.dm @@ -337,6 +337,7 @@ to_chat(H, SPAN_WARNING("\The [blocked] is in the way!")) return TRUE to_chat(H, SPAN_NOTICE("You take a drag on your [name].")) + playsound(H, "sound/effects/inhale.ogg", 50, 0, -1) smoke(5) add_trace_DNA(H) return TRUE diff --git a/code/modules/crafting/crafting_weapons_ranged.dm b/code/modules/crafting/crafting_weapons_ranged.dm index 2fe5e68c287c7..a51c09ab4c3d7 100644 --- a/code/modules/crafting/crafting_weapons_ranged.dm +++ b/code/modules/crafting/crafting_weapons_ranged.dm @@ -81,7 +81,7 @@ /singleton/crafting_stage/screwdriver/zipgun progress_message = "You secure the trigger assembly and finish off the zipgun." - product = /obj/item/gun/projectile/pirate/unloaded //zipgun.dm + product = /obj/item/gun/projectile/pirate //zipgun.dm // Crossbow diff --git a/code/modules/fabrication/designs/general/designs_medical.dm b/code/modules/fabrication/designs/general/designs_medical.dm index 1a25638d722ff..897c21b359521 100644 --- a/code/modules/fabrication/designs/general/designs_medical.dm +++ b/code/modules/fabrication/designs/general/designs_medical.dm @@ -1,5 +1,4 @@ /datum/fabricator_recipe/medical - path = /obj/item/scalpel/basic category = "Medical" /datum/fabricator_recipe/medical/circularsaw @@ -43,3 +42,6 @@ /datum/fabricator_recipe/medical/hypospray/autoinjector path = /obj/item/reagent_containers/hypospray/autoinjector + +/datum/fabricator_recipe/medical/scalpel + path = /obj/item/scalpel/basic diff --git a/maps/sierra/datums/supplypacks/security.dm b/maps/sierra/datums/supplypacks/security.dm index 95ce68d141894..42b8eb7d0f83e 100644 --- a/maps/sierra/datums/supplypacks/security.dm +++ b/maps/sierra/datums/supplypacks/security.dm @@ -131,7 +131,7 @@ /obj/item/clothing/suit/armor/pcarrier/tan/tactical, /obj/item/clothing/head/helmet/tactical, /obj/item/clothing/mask/balaclava/tactical, - /obj/item/clothing/glasses/tacgoggles, + /obj/item/clothing/accessory/glassesmod/nvg, /obj/item/storage/belt/holster/security/tactical, /obj/item/clothing/shoes/tactical, /obj/item/clothing/gloves/tactical) diff --git a/sound/effects/inhale.ogg b/sound/effects/inhale.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a55f4d88d6e5050011e6ffbc4938ac9b281a5df5 GIT binary patch literal 23256 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 literal 0 HcmV?d00001 From ce05c413d3f6ec0d55a2402e181f8275dafb56f9 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Tue, 11 Jun 2024 23:00:00 +0300 Subject: [PATCH 12/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2336=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2336.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2336.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2336.yml b/html/changelogs/AutoChangeLog-sierra-pr-2336.yml new file mode 100644 index 0000000000000..8a805e8fc73c4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2336.yml @@ -0,0 +1,4 @@ +author: Lexanx +changes: + - {bugfix: Ремонт вытащенной позитронки} +delete-after: true From c8cefb8fd230c93fae08f21cedaee55c5163b003 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Tue, 11 Jun 2024 23:00:24 +0300 Subject: [PATCH 13/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2338=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2338.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2338.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2338.yml b/html/changelogs/AutoChangeLog-sierra-pr-2338.yml new file mode 100644 index 0000000000000..654ae6e8b3c5d --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2338.yml @@ -0,0 +1,9 @@ +author: Teteshnik +changes: + - {bugfix: Теперь не будут 2 скальпеля в автолате.} + - {tweak: Подправил крафт с зипганом} + - {tweak: У сигареты имеется звук затяжки.} + - {soundadd: Добавил звук затяжки.} + - {balance: 'Заменил в тактическом наборе, а именно: вместо тактических очков теперь + ПНВ нашлемный.'} +delete-after: true From c9240149369d795d478899362ca634939cfb39cb Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Wed, 12 Jun 2024 01:25:30 +0000 Subject: [PATCH 14/80] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F=D1=86=D0=B8=D1=8F=20=D1=87=D0=B5?= =?UTF-8?q?=D0=B9=D0=BD=D0=B4=D0=B6=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=20[ci=20?= =?UTF-8?q?skip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelog.html | 27 ++++++ html/changelogs/.all_changelog.yml | 91 +++++++++++++++++++ .../AutoChangeLog-sierra-pr-2317.yml | 21 ----- .../AutoChangeLog-sierra-pr-2336.yml | 4 - .../AutoChangeLog-sierra-pr-2338.yml | 9 -- 5 files changed, 118 insertions(+), 34 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2317.yml delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2336.yml delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2338.yml diff --git a/html/changelog.html b/html/changelog.html index 3d06b8cf1004e..050943706ae03 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -28,6 +28,33 @@

Sierra SS13

-->
+

12.06 - 2024

+

Обновления Lexanx:

+
+
Ремонт вытащенной позитронки
+
+

Обновления Shegar:

+
+
Убит рантайм происходящий при удалении одежды (Выход в госты тоже его провоцировал)
+
Убит рантайм происходящий из-за того что мех встал на диагональ(update_pilots не знал что такое диагональ)
+
Убит крит баг не позволяющий двигать иконки. Теперь разрешаю.
+
Теперь колонии при спавне будут рандомно или заранее решённым образом выбирать к какой фракции они принадлежат - НТ, ЦПСС, ГКК или Независимые. Это влияет на флаги, снаряжение, бумажку на столе, а так же НТ и ЦПСС тип передаёт на сьерру о себе информацию. Пока что всё
+
Знак "COLONY" для колонии
+
Добавил в печать РНД платы телепада и телепрожектора. Оные теперь разборные, как на инфинити.
+
Дал робототехникам краску
+
Обе колонии взамен старого снаряжения получили 1 единицу rifle, 1 единицу ПП, и по 2 единицы шлемов и броников. Какие именно зависит от типа колонии
+
Стазиз ящики и аномальные ящики на судне ГКК теперь без доступа, и их можно спокойно использовать.
+
Выдал кнопку выбора типа колонии для педалей.
+
+

Обновления Teteshnik:

+
+
Теперь не будут 2 скальпеля в автолате.
+
Подправил крафт с зипганом
+
У сигареты имеется звук затяжки.
+
Добавил звук затяжки.
+
Заменил в тактическом наборе, а именно: вместо тактических очков теперь ПНВ нашлемный.
+
+

11.06 - 2024

Обновления Teteshnik:

diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index d107f533e2df1..3d38ec676ddae 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -24091,3 +24091,94 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY sierra_genchangelog.p \ \u043A\u0438\u0442\u0430\u043C\u0438 \u043C\u0435\u0440\u043A\u043E\u0432" - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0441\u043A\u043E\u0442\u0447\ \ \u0432 \u0430\u0432\u0442\u043E\u043B\u0430\u0442" +2024-06-12: + Lexanx: + - bugfix: "\u0420\u0435\u043C\u043E\u043D\u0442 \u0432\u044B\u0442\u0430\u0449\u0435\ + \u043D\u043D\u043E\u0439 \u043F\u043E\u0437\u0438\u0442\u0440\u043E\u043D\u043A\ + \u0438" + Shegar: + - bugfix: "\u0423\u0431\u0438\u0442 \u0440\u0430\u043D\u0442\u0430\u0439\u043C \u043F\ + \u0440\u043E\u0438\u0441\u0445\u043E\u0434\u044F\u0449\u0438\u0439 \u043F\u0440\ + \u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0438 \u043E\u0434\u0435\u0436\ + \u0434\u044B (\u0412\u044B\u0445\u043E\u0434 \u0432 \u0433\u043E\u0441\u0442\ + \u044B \u0442\u043E\u0436\u0435 \u0435\u0433\u043E \u043F\u0440\u043E\u0432\u043E\ + \u0446\u0438\u0440\u043E\u0432\u0430\u043B)" + - bugfix: "\u0423\u0431\u0438\u0442 \u0440\u0430\u043D\u0442\u0430\u0439\u043C \u043F\ + \u0440\u043E\u0438\u0441\u0445\u043E\u0434\u044F\u0449\u0438\u0439 \u0438\u0437\ + -\u0437\u0430 \u0442\u043E\u0433\u043E \u0447\u0442\u043E \u043C\u0435\u0445\ + \ \u0432\u0441\u0442\u0430\u043B \u043D\u0430 \u0434\u0438\u0430\u0433\u043E\ + \u043D\u0430\u043B\u044C(update_pilots \u043D\u0435 \u0437\u043D\u0430\u043B\ + \ \u0447\u0442\u043E \u0442\u0430\u043A\u043E\u0435 \u0434\u0438\u0430\u0433\ + \u043E\u043D\u0430\u043B\u044C)" + - bugfix: "\u0423\u0431\u0438\u0442 \u043A\u0440\u0438\u0442 \u0431\u0430\u0433\ + \ \u043D\u0435 \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u044E\u0449\u0438\u0439\ + \ \u0434\u0432\u0438\u0433\u0430\u0442\u044C \u0438\u043A\u043E\u043D\u043A\u0438\ + . \u0422\u0435\u043F\u0435\u0440\u044C \u0440\u0430\u0437\u0440\u0435\u0448\u0430\ + \u044E." + - rscadd: "\u0422\u0435\u043F\u0435\u0440\u044C \u043A\u043E\u043B\u043E\u043D\u0438\ + \u0438 \u043F\u0440\u0438 \u0441\u043F\u0430\u0432\u043D\u0435 \u0431\u0443\u0434\ + \u0443\u0442 \u0440\u0430\u043D\u0434\u043E\u043C\u043D\u043E \u0438\u043B\u0438\ + \ \u0437\u0430\u0440\u0430\u043D\u0435\u0435 \u0440\u0435\u0448\u0451\u043D\u043D\ + \u044B\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C \u0432\u044B\u0431\u0438\ + \u0440\u0430\u0442\u044C \u043A \u043A\u0430\u043A\u043E\u0439 \u0444\u0440\u0430\ + \u043A\u0446\u0438\u0438 \u043E\u043D\u0438 \u043F\u0440\u0438\u043D\u0430\u0434\ + \u043B\u0435\u0436\u0430\u0442 - \u041D\u0422, \u0426\u041F\u0421\u0421, \u0413\ + \u041A\u041A \u0438\u043B\u0438 \u041D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\ + \u043C\u044B\u0435. \u042D\u0442\u043E \u0432\u043B\u0438\u044F\u0435\u0442\ + \ \u043D\u0430 \u0444\u043B\u0430\u0433\u0438, \u0441\u043D\u0430\u0440\u044F\ + \u0436\u0435\u043D\u0438\u0435, \u0431\u0443\u043C\u0430\u0436\u043A\u0443 \u043D\ + \u0430 \u0441\u0442\u043E\u043B\u0435, \u0430 \u0442\u0430\u043A \u0436\u0435\ + \ \u041D\u0422 \u0438 \u0426\u041F\u0421\u0421 \u0442\u0438\u043F \u043F\u0435\ + \u0440\u0435\u0434\u0430\u0451\u0442 \u043D\u0430 \u0441\u044C\u0435\u0440\u0440\ + \u0443 \u043E \u0441\u0435\u0431\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\ + \u0446\u0438\u044E. \u041F\u043E\u043A\u0430 \u0447\u0442\u043E \u0432\u0441\ + \u0451" + - imageadd: "\u0417\u043D\u0430\u043A \"COLONY\" \u0434\u043B\u044F \u043A\u043E\ + \u043B\u043E\u043D\u0438\u0438" + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0432 \u043F\u0435\u0447\u0430\ + \u0442\u044C \u0420\u041D\u0414 \u043F\u043B\u0430\u0442\u044B \u0442\u0435\u043B\ + \u0435\u043F\u0430\u0434\u0430 \u0438 \u0442\u0435\u043B\u0435\u043F\u0440\u043E\ + \u0436\u0435\u043A\u0442\u043E\u0440\u0430. \u041E\u043D\u044B\u0435 \u0442\u0435\ + \u043F\u0435\u0440\u044C \u0440\u0430\u0437\u0431\u043E\u0440\u043D\u044B\u0435\ + , \u043A\u0430\u043A \u043D\u0430 \u0438\u043D\u0444\u0438\u043D\u0438\u0442\ + \u0438." + - maptweak: "\u0414\u0430\u043B \u0440\u043E\u0431\u043E\u0442\u043E\u0442\u0435\ + \u0445\u043D\u0438\u043A\u0430\u043C \u043A\u0440\u0430\u0441\u043A\u0443" + - maptweak: "\u041E\u0431\u0435 \u043A\u043E\u043B\u043E\u043D\u0438\u0438 \u0432\ + \u0437\u0430\u043C\u0435\u043D \u0441\u0442\u0430\u0440\u043E\u0433\u043E \u0441\ + \u043D\u0430\u0440\u044F\u0436\u0435\u043D\u0438\u044F \u043F\u043E\u043B\u0443\ + \u0447\u0438\u043B\u0438 1 \u0435\u0434\u0438\u043D\u0438\u0446\u0443 rifle,\ + \ 1 \u0435\u0434\u0438\u043D\u0438\u0446\u0443 \u041F\u041F, \u0438 \u043F\u043E\ + \ 2 \u0435\u0434\u0438\u043D\u0438\u0446\u044B \u0448\u043B\u0435\u043C\u043E\ + \u0432 \u0438 \u0431\u0440\u043E\u043D\u0438\u043A\u043E\u0432. \u041A\u0430\ + \u043A\u0438\u0435 \u0438\u043C\u0435\u043D\u043D\u043E \u0437\u0430\u0432\u0438\ + \u0441\u0438\u0442 \u043E\u0442 \u0442\u0438\u043F\u0430 \u043A\u043E\u043B\u043E\ + \u043D\u0438\u0438" + - maptweak: "\u0421\u0442\u0430\u0437\u0438\u0437 \u044F\u0449\u0438\u043A\u0438\ + \ \u0438 \u0430\u043D\u043E\u043C\u0430\u043B\u044C\u043D\u044B\u0435 \u044F\ + \u0449\u0438\u043A\u0438 \u043D\u0430 \u0441\u0443\u0434\u043D\u0435 \u0413\u041A\ + \u041A \u0442\u0435\u043F\u0435\u0440\u044C \u0431\u0435\u0437 \u0434\u043E\u0441\ + \u0442\u0443\u043F\u0430, \u0438 \u0438\u0445 \u043C\u043E\u0436\u043D\u043E\ + \ \u0441\u043F\u043E\u043A\u043E\u0439\u043D\u043E \u0438\u0441\u043F\u043E\u043B\ + \u044C\u0437\u043E\u0432\u0430\u0442\u044C." + - admin: "\u0412\u044B\u0434\u0430\u043B \u043A\u043D\u043E\u043F\u043A\u0443 \u0432\ + \u044B\u0431\u043E\u0440\u0430 \u0442\u0438\u043F\u0430 \u043A\u043E\u043B\u043E\ + \u043D\u0438\u0438 \u0434\u043B\u044F \u043F\u0435\u0434\u0430\u043B\u0435\u0439\ + ." + Teteshnik: + - bugfix: "\u0422\u0435\u043F\u0435\u0440\u044C \u043D\u0435 \u0431\u0443\u0434\u0443\ + \u0442 2 \u0441\u043A\u0430\u043B\u044C\u043F\u0435\u043B\u044F \u0432 \u0430\ + \u0432\u0442\u043E\u043B\u0430\u0442\u0435." + - tweak: "\u041F\u043E\u0434\u043F\u0440\u0430\u0432\u0438\u043B \u043A\u0440\u0430\ + \u0444\u0442 \u0441 \u0437\u0438\u043F\u0433\u0430\u043D\u043E\u043C" + - tweak: "\u0423 \u0441\u0438\u0433\u0430\u0440\u0435\u0442\u044B \u0438\u043C\u0435\ + \u0435\u0442\u0441\u044F \u0437\u0432\u0443\u043A \u0437\u0430\u0442\u044F\u0436\ + \u043A\u0438." + - soundadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0437\u0432\u0443\u043A\ + \ \u0437\u0430\u0442\u044F\u0436\u043A\u0438." + - balance: "\u0417\u0430\u043C\u0435\u043D\u0438\u043B \u0432 \u0442\u0430\u043A\ + \u0442\u0438\u0447\u0435\u0441\u043A\u043E\u043C \u043D\u0430\u0431\u043E\u0440\ + \u0435, \u0430 \u0438\u043C\u0435\u043D\u043D\u043E: \u0432\u043C\u0435\u0441\ + \u0442\u043E \u0442\u0430\u043A\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0445\ + \ \u043E\u0447\u043A\u043E\u0432 \u0442\u0435\u043F\u0435\u0440\u044C \u041F\ + \u041D\u0412 \u043D\u0430\u0448\u043B\u0435\u043C\u043D\u044B\u0439." diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2317.yml b/html/changelogs/AutoChangeLog-sierra-pr-2317.yml deleted file mode 100644 index 14ea5091b871b..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2317.yml +++ /dev/null @@ -1,21 +0,0 @@ -author: Shegar -changes: - - {bugfix: Убит рантайм происходящий при удалении одежды (Выход в госты тоже его - провоцировал)} - - {bugfix: Убит рантайм происходящий из-за того что мех встал на диагональ(update_pilots - не знал что такое диагональ)} - - {bugfix: Убит крит баг не позволяющий двигать иконки. Теперь разрешаю.} - - {rscadd: 'Теперь колонии при спавне будут рандомно или заранее решённым образом - выбирать к какой фракции они принадлежат - НТ, ЦПСС, ГКК или Независимые. Это - влияет на флаги, снаряжение, бумажку на столе, а так же НТ и ЦПСС тип передаёт - на сьерру о себе информацию. Пока что всё'} - - {imageadd: Знак "COLONY" для колонии} - - {rscadd: 'Добавил в печать РНД платы телепада и телепрожектора. Оные теперь разборные, - как на инфинити.'} - - {maptweak: Дал робототехникам краску} - - {maptweak: 'Обе колонии взамен старого снаряжения получили 1 единицу rifle, 1 - единицу ПП, и по 2 единицы шлемов и броников. Какие именно зависит от типа колонии'} - - {maptweak: 'Стазиз ящики и аномальные ящики на судне ГКК теперь без доступа, и - их можно спокойно использовать.'} - - {admin: Выдал кнопку выбора типа колонии для педалей.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2336.yml b/html/changelogs/AutoChangeLog-sierra-pr-2336.yml deleted file mode 100644 index 8a805e8fc73c4..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2336.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Lexanx -changes: - - {bugfix: Ремонт вытащенной позитронки} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2338.yml b/html/changelogs/AutoChangeLog-sierra-pr-2338.yml deleted file mode 100644 index 654ae6e8b3c5d..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2338.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: Teteshnik -changes: - - {bugfix: Теперь не будут 2 скальпеля в автолате.} - - {tweak: Подправил крафт с зипганом} - - {tweak: У сигареты имеется звук затяжки.} - - {soundadd: Добавил звук затяжки.} - - {balance: 'Заменил в тактическом наборе, а именно: вместо тактических очков теперь - ПНВ нашлемный.'} -delete-after: true From f8c1db8248760ce31fab15c1f4572c32374b78f5 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 07:40:26 +0300 Subject: [PATCH 15/80] [MIRROR] client_defines.dm cleanup and documentation (#2249) Co-authored-by: Spookerton <918997+Spookerton@users.noreply.github.com> Co-authored-by: UEDCommander <52104104+UEDCommander@users.noreply.github.com> --- code/game/world.dm | 1 - code/modules/admin/verbs/adminhelp.dm | 2 +- code/modules/admin/verbs/adminpm.dm | 2 +- code/modules/client/client_defines.dm | 88 ++++++++----------- code/modules/client/client_procs.dm | 10 +-- code/modules/mob/living/carbon/alien/life.dm | 3 +- code/modules/mob/living/carbon/brain/life.dm | 3 +- code/modules/mob/living/carbon/human/life.dm | 2 +- code/modules/mob/living/life.dm | 2 +- code/modules/mob/living/silicon/robot/life.dm | 3 +- 10 files changed, 50 insertions(+), 66 deletions(-) diff --git a/code/game/world.dm b/code/game/world.dm index 4a3fc39135e16..b638efa8ba7c6 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -474,7 +474,6 @@ GLOBAL_VAR_INIT(world_topic_last, world.timeofday) var/amessage = SPAN_CLASS("staff_pm", "[rank] PM from [input["sender"]] to [key_name(C)] : [input["msg"]]") C.received_irc_pm = world.time - C.irc_admin = input["sender"] sound_to(C, sound('sound/ui/pm-notify.ogg', volume = 40)) to_chat(C, message) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index ed5a84899f5ec..5bf316f7e73bd 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -71,7 +71,7 @@ var/global/list/adminhelp_ignored_words = list("unknown","the","a","an","of","mo to_chat(src, SPAN_COLOR("red", "Error: Admin-PM: You cannot send adminhelps (Muted).")) return - adminhelped = 1 //Determines if they get the message to reply by clicking the name. + adminhelped = TRUE //clean the input msg diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 2ced206de9084..c4be7e89a4eeb 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -105,7 +105,7 @@ recieve_message = "[SPAN_CLASS("pm", "[SPAN_CLASS("howto", "-- Click the [recieve_pm_type]'s name to reply --")]")]\n" if(C.adminhelped) to_chat(C, recieve_message) - C.adminhelped = 0 + C.adminhelped = FALSE var/sender_message = "[create_text_tag("pm_out_alt", "PM", src)] to [SPAN_CLASS("name", get_options_bar(C, holder ? 1 : 0, holder ? 1 : 0, 1))]" if(holder) diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 7afa107358e43..cff697465fd48 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -1,68 +1,58 @@ /client - ////////////////////// - //BLACK MAGIC THINGS// - ////////////////////// + // Allow client instances to be treated like regular datums parent_type = /datum - //////////////// - //ADMIN THINGS// - //////////////// - var/datum/admins/holder = null - var/datum/admins/deadmin_holder = null - - ///////// - //OTHER// - ///////// - var/datum/preferences/prefs = null - var/adminobs = null // Runechat messages var/list/seen_messages - ///datum that controls the displaying and hiding of tooltips - var/datum/tooltip/tooltips + /** At compile time, should be TRUE if serving the rsc from DD or FALSE if using other + http server(s) to spread load. Defaults FALSE as /client/New() handles setting either + a url from config.resource_urls, or TRUE if none exist + Refer to http://www.byond.com/forum/post/1906517?page=2#comment23727144 + */ + preload_rsc = FALSE + + /// When some kind of staff member, the client's permissions and behaviors + var/datum/admins/holder - var/adminhelped = 0 + /// When not currently wanting to see buttons, holder lives here instead + var/datum/admins/deadmin_holder + + /// The client's preferences object, populated from save data and runtime changes + var/datum/preferences/prefs + + /// Controls the display of tooltips to this client + var/datum/tooltip/tooltips - var/staffwarn = null + /// When starting an ahelp conversation, whether the client gets a reply button + var/adminhelped - /// List that stores the object and parameters related to the selected target during mouse events in the client. Allows the client to remember the target selected during a "MouseDown" event or update the selection during a "MouseDrag" event. - var/list/selected_target[2] + /// A message to show to online staff when joining, if any + var/staffwarn - /////////////// - //SOUND STUFF// - /////////////// + /// Holds click params [2] and a reference [1] to the atom under the cursor on MouseDown/Drag + var/list/selected_target = list(null, null) - /// Whether or not the client is currently playing the "ship hum" ambience sound. + /// Whether or not the client is currently playing the "ship hum" ambience sound var/playing_vent_ambience = FALSE - /// The next threshold time for the client to be able to play basic ambience sounds. + /// The next threshold time for the client to be able to play basic ambience sounds var/next_ambience_time = 0 + /// The last time this client was messaged from IRC. Prevents responses after 10 minutes + var/received_irc_pm = -99999 - //////////// - //SECURITY// - //////////// - // comment out the line below when debugging locally to enable the options & messages menu - //control_freak = 1 + /// Prevents people from being spammed about multikeying every time their mob changes + var/warned_about_multikeying = TRUE - var/received_irc_pm = -99999 - var/irc_admin //IRC admin that spoke with them last. - var/mute_irc = 0 - var/warned_about_multikeying = 0 // Prevents people from being spammed about multikeying every time their mob changes. - - //////////////////////////////////// - //things that require the database// - //////////////////////////////////// - var/player_age = "Requires database" //So admins know why it isn't working - Used to determine how old the account is - in days. - var/related_accounts_ip = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this ip - var/related_accounts_cid = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this computer id - - /* - As of byond 512, due to how broken preloading is, preload_rsc MUST be set to 1 at compile time if resource URLs are *not* in use, - BUT you still want resource preloading enabled (from the server itself). If using resource URLs, it should be set to 0 and - changed to a URL at runtime (see client_procs.dm for procs that do this automatically). More information about how goofy this broken setting works at - http://www.byond.com/forum/post/1906517?page=2#comment23727144 - */ - preload_rsc = 0 + /// If the database is available, how old the account is in days + var/player_age = "Requires database" + + /// If the database is available, what other accounts previously logged in from this IP + var/related_accounts_ip = "Requires database" + + /// If the database is available, what other accounts previously logged in from this CID + var/related_accounts_cid = "Requires database" + /// The current fullscreen state for /client/toggle_fullscreen() var/fullscreen = FALSE diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 54a1358f22f19..9291bc99f3a2d 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -64,9 +64,6 @@ if(!holder && received_irc_pm < world.time - 6000) //Worse they can do is spam IRC for 10 minutes to_chat(usr, SPAN_WARNING("You are no longer able to use this, it's been more then 10 minutes since an admin on IRC has responded to you")) return - if(mute_irc) - to_chat(usr, SPAN_WARNING("You cannot use this as your client has been muted from sending messages to the admins on IRC")) - return cmd_admin_irc_pm(href_list["irc_msg"]) return @@ -151,9 +148,10 @@ break // Change the way they should download resources. - if(config.resource_urls && length(config.resource_urls)) - src.preload_rsc = pick(config.resource_urls) - else src.preload_rsc = 1 // If config.resource_urls is not set, preload like normal. + if (length(config.resource_urls)) + preload_rsc = pick(config.resource_urls) + else + preload_rsc = TRUE if(byond_version < DM_VERSION) to_chat(src, SPAN_WARNING("You are running an older version of BYOND than the server and may experience issues.")) diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 54e57c76b9f0b..ca71bea78a622 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -116,8 +116,7 @@ if(machine.check_eye(src) < 0) reset_view(null) else - if(client && !client.adminobs) - reset_view(null) + reset_view(null) return 1 diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index e747a13db071f..418138aeb20c9 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -189,7 +189,6 @@ if (!( machine.check_eye(src) )) reset_view(null) else - if(client && !client.adminobs) - reset_view(null) + reset_view(null) return 1 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 9fa40a5421ff3..1c4da4029e33b 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1146,7 +1146,7 @@ else if((mRemote in mutations) && remoteview_target) if(remoteview_target.stat == CONSCIOUS) isRemoteObserve = 1 - if(!isRemoteObserve && client && !client.adminobs) + if(!isRemoteObserve && client) remoteview_target = null reset_view(null, 0) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 2c6263ef7ec19..95787852e45e7 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -188,7 +188,7 @@ else if(eyeobj) if(eyeobj.owner != src) reset_view(null) - else if(!client?.adminobs) + else reset_view(null) /mob/living/proc/update_sight() diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 58c163b6552bc..6c76dec5dc012 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -236,8 +236,7 @@ if (machine.check_eye(src) < 0) reset_view(null) else - if(client && !client.adminobs) - reset_view(null) + reset_view(null) return 1 From f2c7973255e226272103e43cc1097ecaf46aee1f Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 07:41:09 +0300 Subject: [PATCH 16/80] [MIRROR] Play local sound volume (#2250) Co-authored-by: cuddleandtea <105150564+cuddleandtea@users.noreply.github.com> --- code/modules/admin/verbs/playsound.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index d436345861667..5998a10716d0f 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -41,10 +41,13 @@ var/global/list/sounds_cache = list() set category = "Fun" set name = "Play Local Sound" if(!check_rights(R_SOUNDS)) return + var/vol = input("Select a volume for the sound", "Play Local Sound", 50) as num|null + if (!vol) + return log_admin("[key_name(src)] played a local sound [S]") message_admins("[key_name_admin(src)] played a local sound [S]", 1) - playsound(get_turf(src.mob), S, 50, 0, 0) + playsound(get_turf(src.mob), S, vol, 0, 0) /client/proc/play_server_sound() From 41635d45ce455d5e96247ed9cf00e6be15eec6c7 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 07:41:34 +0300 Subject: [PATCH 17/80] [MIRROR] toggleable accessory New -> Initialize (#2251) Co-authored-by: Spookerton <918997+Spookerton@users.noreply.github.com> --- code/modules/clothing/under/accessories/_accessory.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/under/accessories/_accessory.dm b/code/modules/clothing/under/accessories/_accessory.dm index 6440bbe9a8454..628320f5f7ef1 100644 --- a/code/modules/clothing/under/accessories/_accessory.dm +++ b/code/modules/clothing/under/accessories/_accessory.dm @@ -122,10 +122,10 @@ /obj/item/clothing/accessory/toggleable/var/icon_closed -/obj/item/clothing/accessory/toggleable/New() +/obj/item/clothing/accessory/toggleable/Initialize() if (!icon_closed) icon_closed = icon_state - ..() + return ..() /obj/item/clothing/accessory/toggleable/on_attached(obj/item/clothing/under/S, mob/user as mob) From e1e8781dd73c73106ca6a14cebbb4271e4130dd7 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 07:41:39 +0300 Subject: [PATCH 18/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2250=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2250.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2250.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2250.yml b/html/changelogs/AutoChangeLog-sierra-pr-2250.yml new file mode 100644 index 0000000000000..6adb38b755666 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2250.yml @@ -0,0 +1,4 @@ +author: cuddleandtea +changes: + - {rscadd: admins can change volume for local tracks} +delete-after: true From 20054f3e12878893236d6a9828019187f5ed0199 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 07:42:08 +0300 Subject: [PATCH 19/80] [MIRROR] helmet visor toggle refactor (#2252) Co-authored-by: Spookerton <918997+Spookerton@users.noreply.github.com> --- code/modules/clothing/head/helmet.dm | 30 +++++++++++++--------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 503055e61b636..558c44fd73ab9 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -26,30 +26,28 @@ w_class = ITEM_SIZE_NORMAL species_restricted = list("exclude", SPECIES_NABBER, SPECIES_ADHERENT) + /obj/item/clothing/head/helmet/needs_vision_update() - for(var/obj/item/clothing/accessory/glassesmod/visor in accessories) + for (var/obj/item/clothing/accessory/glassesmod/visor in accessories) return TRUE - . = ..() + return ..() -/obj/item/clothing/head/helmet/verb/toggle_visor() - set name = "Toggle Helmet Attachments" +/obj/item/clothing/head/helmet/verb/toggle_visor() + set name = "Toggle Helmet Visors" set category = "Object" set src in usr - - if (!istype(loc,/mob/living)) + if (usr.incapacitated()) return - var/toggled = FALSE - if (!usr.incapacitated()) - for (var/obj/item/clothing/accessory/glassesmod/mod in accessories) - if (mod.active) - mod.deactivate(usr) - else - mod.activate(usr) - toggled = TRUE - if (!toggled) - to_chat(usr, SPAN_CLASS("danger", "You do not have a visor attached to your helmet!")) + for (var/obj/item/clothing/accessory/glassesmod/mod in accessories) + if (mod.active) + mod.deactivate(usr) + else + mod.activate(usr) + toggled = TRUE + if (!toggled) + to_chat(usr, SPAN_WARNING("Your helmet has no visors attached.")) /obj/item/clothing/head/helmet/nt From ef3bbf4012a7493e20fc8963beeecbad19881535 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 07:44:09 +0300 Subject: [PATCH 20/80] [MIRROR] tweaked accessory slots to use shorter keys and better names (#2253) Co-authored-by: Spookerton <918997+Spookerton@users.noreply.github.com> --- code/__defines/items_clothing.dm | 36 +++++++++---------- code/modules/clothing/_clothing.dm | 4 +-- code/modules/clothing/glasses/glasses.dm | 4 +-- code/modules/clothing/head/helmet.dm | 22 ++++++++---- code/modules/clothing/spacesuits/void/void.dm | 4 +-- code/modules/clothing/suits/armor.dm | 16 ++++----- .../clothing/under/accessories/arm_guards.dm | 2 +- .../clothing/under/accessories/armor_plate.dm | 2 +- .../clothing/under/accessories/armor_tag.dm | 2 +- .../clothing/under/accessories/goggle_mods.dm | 12 +++---- .../clothing/under/accessories/helmcover.dm | 2 +- .../under/accessories/helmet_decor.dm | 2 +- .../clothing/under/accessories/leg_guards.dm | 2 +- .../clothing/under/accessories/pouches.dm | 2 +- maps/torch/items/clothing/solgov-accessory.dm | 4 +-- maps/torch/items/clothing/solgov-suit.dm | 6 ++-- maps/torch/torch_simplemobs.dm | 2 +- 17 files changed, 66 insertions(+), 58 deletions(-) diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm index a0212eba18f02..a2d97f56b610d 100644 --- a/code/__defines/items_clothing.dm +++ b/code/__defines/items_clothing.dm @@ -20,24 +20,24 @@ #define SLOT_TIE FLAG(14) #define SLOT_HOLSTER FLAG(15) -#define ACCESSORY_SLOT_UTILITY "Utility" -#define ACCESSORY_SLOT_HOLSTER "Holster" -#define ACCESSORY_SLOT_ARMBAND "Armband" -#define ACCESSORY_SLOT_RANK "Rank" -#define ACCESSORY_SLOT_DEPT "Department" -#define ACCESSORY_SLOT_DECOR "Decor" -#define ACCESSORY_SLOT_MEDAL "Medal" -#define ACCESSORY_SLOT_INSIGNIA "Insignia" -#define ACCESSORY_SLOT_ARMOR_C "Chest armor" -#define ACCESSORY_SLOT_ARMOR_A "Arm armor" -#define ACCESSORY_SLOT_ARMOR_L "Leg armor" -#define ACCESSORY_SLOT_ARMOR_S "Armor storage" -#define ACCESSORY_SLOT_ARMOR_M "Misc armor" -#define ACCESSORY_SLOT_HELM_C "Helmet cover" -#define ACCESSORY_SLOT_HELM_D "Helmet decor" -#define ACCESSORY_SLOT_VISOR "Helmet visor" -#define ACCESSORY_SLOT_VISION "Vision modification" -#define ACCESSORY_SLOT_HUD "HUD modification" +#define ACCESSORY_SLOT_UTILITY "CU" +#define ACCESSORY_SLOT_HOLSTER "CH" +#define ACCESSORY_SLOT_ARMBAND "CA" +#define ACCESSORY_SLOT_RANK "CR" +#define ACCESSORY_SLOT_FLASH "CF" +#define ACCESSORY_SLOT_DECOR "CD" +#define ACCESSORY_SLOT_MEDAL "CM" +#define ACCESSORY_SLOT_INSIGNIA "CI" +#define ACCESSORY_SLOT_ARMOR_CHEST "AC" +#define ACCESSORY_SLOT_ARMOR_ARMS "AA" +#define ACCESSORY_SLOT_ARMOR_LEGS "AL" +#define ACCESSORY_SLOT_ARMOR_STORAGE "AS" +#define ACCESSORY_SLOT_ARMOR_MISC "AM" +#define ACCESSORY_SLOT_HELMET_COVER "HC" +#define ACCESSORY_SLOT_HELMET_DECOR "HD" +#define ACCESSORY_SLOT_HELMET_VISOR "HV" +#define ACCESSORY_SLOT_GLASSES_VISION "GV" +#define ACCESSORY_SLOT_GLASSES_HUD "GH" #define ACCESSORY_REMOVABLE FLAG(0) #define ACCESSORY_HIDDEN FLAG(1) diff --git a/code/modules/clothing/_clothing.dm b/code/modules/clothing/_clothing.dm index b2f1cdf32db8f..21a7b7e6c161d 100644 --- a/code/modules/clothing/_clothing.dm +++ b/code/modules/clothing/_clothing.dm @@ -945,8 +945,8 @@ BLIND // can't see anything var/worn_state = null //Whether the clothing item has gender-specific states when worn. var/gender_icons = 0 - valid_accessory_slots = list(ACCESSORY_SLOT_UTILITY,ACCESSORY_SLOT_HOLSTER,ACCESSORY_SLOT_ARMBAND,ACCESSORY_SLOT_RANK,ACCESSORY_SLOT_DEPT,ACCESSORY_SLOT_DECOR,ACCESSORY_SLOT_MEDAL,ACCESSORY_SLOT_INSIGNIA) - restricted_accessory_slots = list(ACCESSORY_SLOT_UTILITY,ACCESSORY_SLOT_HOLSTER,ACCESSORY_SLOT_ARMBAND,ACCESSORY_SLOT_RANK,ACCESSORY_SLOT_DEPT) + valid_accessory_slots = list(ACCESSORY_SLOT_UTILITY,ACCESSORY_SLOT_HOLSTER,ACCESSORY_SLOT_ARMBAND,ACCESSORY_SLOT_RANK,ACCESSORY_SLOT_FLASH,ACCESSORY_SLOT_DECOR,ACCESSORY_SLOT_MEDAL,ACCESSORY_SLOT_INSIGNIA) + restricted_accessory_slots = list(ACCESSORY_SLOT_UTILITY,ACCESSORY_SLOT_HOLSTER,ACCESSORY_SLOT_ARMBAND,ACCESSORY_SLOT_RANK,ACCESSORY_SLOT_FLASH) /obj/item/clothing/under/New() ..() diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 49e2ccf5a56f3..5832a457b8611 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -66,8 +66,8 @@ bomb = ARMOR_BOMB_MINOR ) action_button_name = "Toggle Attachments" - valid_accessory_slots = list(ACCESSORY_SLOT_VISION, ACCESSORY_SLOT_HUD) - restricted_accessory_slots = list(ACCESSORY_SLOT_VISION, ACCESSORY_SLOT_HUD) + valid_accessory_slots = list(ACCESSORY_SLOT_GLASSES_VISION, ACCESSORY_SLOT_GLASSES_HUD) + restricted_accessory_slots = list(ACCESSORY_SLOT_GLASSES_VISION, ACCESSORY_SLOT_GLASSES_HUD) var/toggle_mods = list() /obj/item/clothing/glasses/ballistic/Initialize() diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 558c44fd73ab9..5836c17ed5a86 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -6,8 +6,16 @@ slot_l_hand_str = "helmet", slot_r_hand_str = "helmet", ) - valid_accessory_slots = list(ACCESSORY_SLOT_HELM_C, ACCESSORY_SLOT_HELM_D, ACCESSORY_SLOT_VISOR) - restricted_accessory_slots = list(ACCESSORY_SLOT_HELM_C, ACCESSORY_SLOT_HELM_D, ACCESSORY_SLOT_VISOR) + valid_accessory_slots = list( + ACCESSORY_SLOT_HELMET_COVER, + ACCESSORY_SLOT_HELMET_DECOR, + ACCESSORY_SLOT_HELMET_VISOR + ) + restricted_accessory_slots = list( + ACCESSORY_SLOT_HELMET_COVER, + ACCESSORY_SLOT_HELMET_DECOR, + ACCESSORY_SLOT_HELMET_VISOR + ) item_flags = ITEM_FLAG_THICKMATERIAL body_parts_covered = HEAD armor = list( @@ -116,7 +124,7 @@ name = "ablative helmet" desc = "A helmet made from advanced materials which protects against concentrated energy weapons." icon_state = "helmet_reflect" - valid_accessory_slots = list(ACCESSORY_SLOT_VISOR) + valid_accessory_slots = list(ACCESSORY_SLOT_HELMET_VISOR) armor = list( melee = ARMOR_MELEE_SMALL, bullet = ARMOR_BALLISTIC_MINOR, @@ -129,7 +137,7 @@ name = "ballistic helmet" desc = "A helmet with reinforced plating to protect against ballistic projectiles." icon_state = "helmet_bulletproof" - valid_accessory_slots = list(ACCESSORY_SLOT_VISOR) + valid_accessory_slots = list(ACCESSORY_SLOT_HELMET_VISOR) armor = list( melee = ARMOR_MELEE_MINOR, bullet = ARMOR_BALLISTIC_AP, @@ -149,7 +157,7 @@ energy = ARMOR_ENERGY_RESISTANT, bomb = ARMOR_BOMB_PADDED ) - valid_accessory_slots = list(ACCESSORY_SLOT_VISOR) + valid_accessory_slots = list(ACCESSORY_SLOT_HELMET_VISOR) cold_protection = HEAD min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE siemens_coefficient = 0.5 @@ -291,8 +299,8 @@ name = "model helmet" desc = "A lightweight helmet made of cheap plastic, sporting fiducial marking stickers on either side. You doubt it will provide much protection." icon_state = "nvgmount" - valid_accessory_slots = list(ACCESSORY_SLOT_VISOR, ACCESSORY_SLOT_HELM_D) - restricted_accessory_slots = list(ACCESSORY_SLOT_VISOR, ACCESSORY_SLOT_HELM_D) + valid_accessory_slots = list(ACCESSORY_SLOT_HELMET_VISOR, ACCESSORY_SLOT_HELMET_DECOR) + restricted_accessory_slots = list(ACCESSORY_SLOT_HELMET_VISOR, ACCESSORY_SLOT_HELMET_DECOR) armor = list( melee = ARMOR_MELEE_MINOR, ) diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index f63c9977d1182..595445b201933 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -31,8 +31,8 @@ ) light_overlay = "helmet_light" - valid_accessory_slots = list(ACCESSORY_SLOT_VISOR) - restricted_accessory_slots = list(ACCESSORY_SLOT_VISOR) + valid_accessory_slots = list(ACCESSORY_SLOT_HELMET_VISOR) + restricted_accessory_slots = list(ACCESSORY_SLOT_HELMET_VISOR) /obj/item/clothing/suit/space/void name = "voidsuit" diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index bb17602cd8515..085b22054fc72 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -301,8 +301,8 @@ icon = 'icons/obj/clothing/obj_suit_modular_armor.dmi' item_icons = list(slot_wear_suit_str = 'icons/mob/onmob/onmob_modular_armor.dmi') icon_state = "pcarrier" - valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_C, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L, ACCESSORY_SLOT_ARMOR_S, ACCESSORY_SLOT_ARMOR_M) - restricted_accessory_slots = list(ACCESSORY_SLOT_ARMOR_C, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L, ACCESSORY_SLOT_ARMOR_S) + valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_CHEST, ACCESSORY_SLOT_ARMOR_ARMS, ACCESSORY_SLOT_ARMOR_LEGS, ACCESSORY_SLOT_ARMOR_STORAGE, ACCESSORY_SLOT_ARMOR_MISC) + restricted_accessory_slots = list(ACCESSORY_SLOT_ARMOR_CHEST, ACCESSORY_SLOT_ARMOR_ARMS, ACCESSORY_SLOT_ARMOR_LEGS, ACCESSORY_SLOT_ARMOR_STORAGE) blood_overlay_type = "armor" flags_inv = 0 @@ -365,8 +365,8 @@ icon = 'icons/obj/clothing/obj_suit_modular_armor.dmi' item_icons = list(slot_wear_suit_str = 'icons/mob/onmob/onmob_modular_armor.dmi') icon_state = "riotcarrier" - valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L) - restricted_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L) + valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_ARMS, ACCESSORY_SLOT_ARMOR_LEGS) + restricted_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_ARMS, ACCESSORY_SLOT_ARMOR_LEGS) body_parts_covered = UPPER_TORSO|LOWER_TORSO armor = list( melee = ARMOR_MELEE_VERY_HIGH, @@ -390,8 +390,8 @@ icon = 'icons/obj/clothing/obj_suit_modular_armor.dmi' item_icons = list(slot_wear_suit_str = 'icons/mob/onmob/onmob_modular_armor.dmi') icon_state = "ballisticcarrier" - valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L) - restricted_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L) + valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_ARMS, ACCESSORY_SLOT_ARMOR_LEGS) + restricted_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_ARMS, ACCESSORY_SLOT_ARMOR_LEGS) body_parts_covered = UPPER_TORSO|LOWER_TORSO armor = list( melee = ARMOR_MELEE_RESISTANT, @@ -419,8 +419,8 @@ icon = 'icons/obj/clothing/obj_suit_modular_armor.dmi' item_icons = list(slot_wear_suit_str = 'icons/mob/onmob/onmob_modular_armor.dmi') icon_state = "ablativecarrier" - valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L) - restricted_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L) + valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_ARMS, ACCESSORY_SLOT_ARMOR_LEGS) + restricted_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_ARMS, ACCESSORY_SLOT_ARMOR_LEGS) body_parts_covered = UPPER_TORSO|LOWER_TORSO armor = list( melee = ARMOR_MELEE_KNIVES, diff --git a/code/modules/clothing/under/accessories/arm_guards.dm b/code/modules/clothing/under/accessories/arm_guards.dm index 54ca407a57014..48c8f2bf0fc02 100644 --- a/code/modules/clothing/under/accessories/arm_guards.dm +++ b/code/modules/clothing/under/accessories/arm_guards.dm @@ -17,7 +17,7 @@ energy = ARMOR_ENERGY_SMALL, bomb = ARMOR_BOMB_PADDED ) - slot = ACCESSORY_SLOT_ARMOR_A + slot = ACCESSORY_SLOT_ARMOR_ARMS body_location = ARMS flags_inv = CLOTHING_BULKY diff --git a/code/modules/clothing/under/accessories/armor_plate.dm b/code/modules/clothing/under/accessories/armor_plate.dm index 477c8e364ed10..80717073bda11 100644 --- a/code/modules/clothing/under/accessories/armor_plate.dm +++ b/code/modules/clothing/under/accessories/armor_plate.dm @@ -11,7 +11,7 @@ energy = ARMOR_ENERGY_MINOR, bomb = ARMOR_BOMB_MINOR ) - slot = ACCESSORY_SLOT_ARMOR_C + slot = ACCESSORY_SLOT_ARMOR_CHEST flags_inv = CLOTHING_BULKY diff --git a/code/modules/clothing/under/accessories/armor_tag.dm b/code/modules/clothing/under/accessories/armor_tag.dm index 5877683ed7e73..7a30bf4265db1 100644 --- a/code/modules/clothing/under/accessories/armor_tag.dm +++ b/code/modules/clothing/under/accessories/armor_tag.dm @@ -8,7 +8,7 @@ slot_wear_suit_str = 'icons/mob/onmob/onmob_modular_armor.dmi' ) icon_state = null - slot = ACCESSORY_SLOT_ARMOR_M + slot = ACCESSORY_SLOT_ARMOR_MISC w_class = ITEM_SIZE_TINY sprite_sheets = list( diff --git a/code/modules/clothing/under/accessories/goggle_mods.dm b/code/modules/clothing/under/accessories/goggle_mods.dm index e9e52bd27cbf8..80355199afeb8 100644 --- a/code/modules/clothing/under/accessories/goggle_mods.dm +++ b/code/modules/clothing/under/accessories/goggle_mods.dm @@ -42,7 +42,7 @@ name = "thermal sights" desc = "An older set of thermal vision goggles, modified to attach to a helmet." icon_state = "thermals" - slot = ACCESSORY_SLOT_VISOR + slot = ACCESSORY_SLOT_HELMET_VISOR vision_flags = SEE_MOBS see_invisible = SEE_INVISIBLE_NOLIGHTING toggleable = TRUE @@ -58,7 +58,7 @@ name = "light-enhancing sights" desc = "An older set of light enhancing goggles, modified to attach to a helmet." icon_state = "nvg" - slot = ACCESSORY_SLOT_VISOR + slot = ACCESSORY_SLOT_HELMET_VISOR see_invisible = SEE_INVISIBLE_NOLIGHTING toggleable = TRUE off_state = "nvgoff" @@ -76,7 +76,7 @@ name = "security HUD attachment" desc = "An attachable security HUD for ballistic goggles." icon_state = "sechud" - slot = ACCESSORY_SLOT_HUD + slot = ACCESSORY_SLOT_GLASSES_HUD hud_type = HUD_SECURITY toggleable = TRUE off_state = "hudoff" @@ -90,7 +90,7 @@ name = "medical HUD attachment" desc = "An attachable security HUD for ballistic goggles." icon_state = "medhud" - slot = ACCESSORY_SLOT_HUD + slot = ACCESSORY_SLOT_GLASSES_HUD hud_type = HUD_MEDICAL toggleable = TRUE off_state = "hudoff" @@ -101,7 +101,7 @@ /obj/item/clothing/accessory/glassesmod/vision/polarized name = "polarized lenses" desc = "A set of flash-resistant lenses that can be clipped onto a pair of ballistic goggles." - slot = ACCESSORY_SLOT_VISION + slot = ACCESSORY_SLOT_GLASSES_VISION icon_state = "polarized" flash_protection = FLASH_PROTECTION_MODERATE darkness_view = -1 @@ -109,7 +109,7 @@ /obj/item/clothing/accessory/glassesmod/vision/welding name = "welding lenses" desc = "A set of welding lenses that can be attached to ballistic goggles to protect against arc-eye" - slot = ACCESSORY_SLOT_VISION + slot = ACCESSORY_SLOT_GLASSES_VISION icon_state = "welding_lenses" off_state = "welding_lenses_up" flash_protection = FLASH_PROTECTION_MAJOR diff --git a/code/modules/clothing/under/accessories/helmcover.dm b/code/modules/clothing/under/accessories/helmcover.dm index 58e9253d53849..cc5510586a35c 100644 --- a/code/modules/clothing/under/accessories/helmcover.dm +++ b/code/modules/clothing/under/accessories/helmcover.dm @@ -8,7 +8,7 @@ slot_head_str = 'icons/mob/onmob/onmob_modular_armor.dmi' ) icon_state = null - slot = ACCESSORY_SLOT_HELM_C + slot = ACCESSORY_SLOT_HELMET_COVER body_location = HEAD sprite_sheets = list( diff --git a/code/modules/clothing/under/accessories/helmet_decor.dm b/code/modules/clothing/under/accessories/helmet_decor.dm index f08eb0ba0405d..847ad9d87a67e 100644 --- a/code/modules/clothing/under/accessories/helmet_decor.dm +++ b/code/modules/clothing/under/accessories/helmet_decor.dm @@ -10,7 +10,7 @@ overlay_state = "error" w_class = ITEM_SIZE_TINY accessory_flags = ACCESSORY_REMOVABLE | ACCESSORY_HIGH_VISIBILITY - slot = ACCESSORY_SLOT_HELM_D + slot = ACCESSORY_SLOT_HELMET_DECOR body_location = HEAD gender = PLURAL diff --git a/code/modules/clothing/under/accessories/leg_guards.dm b/code/modules/clothing/under/accessories/leg_guards.dm index 29f622d2fa42f..8982c6bd47566 100644 --- a/code/modules/clothing/under/accessories/leg_guards.dm +++ b/code/modules/clothing/under/accessories/leg_guards.dm @@ -14,7 +14,7 @@ energy = ARMOR_ENERGY_SMALL, bomb = ARMOR_BOMB_PADDED ) - slot = ACCESSORY_SLOT_ARMOR_L + slot = ACCESSORY_SLOT_ARMOR_LEGS body_location = LEGS flags_inv = CLOTHING_BULKY diff --git a/code/modules/clothing/under/accessories/pouches.dm b/code/modules/clothing/under/accessories/pouches.dm index e8e817863f87f..ef23693312e9a 100644 --- a/code/modules/clothing/under/accessories/pouches.dm +++ b/code/modules/clothing/under/accessories/pouches.dm @@ -9,7 +9,7 @@ ) icon_state = "pouches" gender = PLURAL - slot = ACCESSORY_SLOT_ARMOR_S + slot = ACCESSORY_SLOT_ARMOR_STORAGE slots = 2 STORAGE_SLOTS sprite_sheets = list( diff --git a/maps/torch/items/clothing/solgov-accessory.dm b/maps/torch/items/clothing/solgov-accessory.dm index e9a281f8467d5..31052ecf8f538 100644 --- a/maps/torch/items/clothing/solgov-accessory.dm +++ b/maps/torch/items/clothing/solgov-accessory.dm @@ -410,7 +410,7 @@ armour attachments icon = 'maps/torch/icons/obj/obj_accessories_solgov.dmi' accessory_icons = list(slot_w_uniform_str = 'maps/torch/icons/mob/onmob_accessories_solgov.dmi', slot_wear_suit_str = 'maps/torch/icons/mob/onmob_accessories_solgov.dmi') icon_state = "solflag" - slot = ACCESSORY_SLOT_ARMOR_M + slot = ACCESSORY_SLOT_ARMOR_MISC /obj/item/clothing/accessory/armor_tag/solgov/ec name = "\improper Expeditionary Corps crest" @@ -464,7 +464,7 @@ department tags icon_state = "dept_exped" on_rolled_down = ACCESSORY_ROLLED_NONE on_rolled_sleeves = "dept_exped_sleeves" - slot = ACCESSORY_SLOT_DEPT + slot = ACCESSORY_SLOT_FLASH accessory_flags = EMPTY_BITFIELD /obj/item/clothing/accessory/solgov/department/command diff --git a/maps/torch/items/clothing/solgov-suit.dm b/maps/torch/items/clothing/solgov-suit.dm index 92d97b3a237c8..901b3956c5f42 100644 --- a/maps/torch/items/clothing/solgov-suit.dm +++ b/maps/torch/items/clothing/solgov-suit.dm @@ -46,7 +46,7 @@ ACCESSORY_SLOT_MEDAL, ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_RANK, - ACCESSORY_SLOT_DEPT, + ACCESSORY_SLOT_FLASH, ACCESSORY_SLOT_DECOR ) restricted_accessory_slots = list(ACCESSORY_SLOT_ARMBAND) @@ -164,13 +164,13 @@ ACCESSORY_SLOT_MEDAL, ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_RANK, - ACCESSORY_SLOT_DEPT, + ACCESSORY_SLOT_FLASH, ACCESSORY_SLOT_DECOR ) restricted_accessory_slots = list( ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_RANK, - ACCESSORY_SLOT_DEPT + ACCESSORY_SLOT_FLASH ) /obj/item/clothing/suit/solgov/fleet_sweater/officer diff --git a/maps/torch/torch_simplemobs.dm b/maps/torch/torch_simplemobs.dm index 2b50f26a00836..3e541f3412e84 100644 --- a/maps/torch/torch_simplemobs.dm +++ b/maps/torch/torch_simplemobs.dm @@ -12,7 +12,7 @@ corpse_outfits = list(/singleton/hierarchy/outfit/job/torch/ert/hostile/suit) /obj/item/clothing/suit/armor/bulletproof/armsman - valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L, ACCESSORY_SLOT_ARMOR_S) + valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_ARMS, ACCESSORY_SLOT_ARMOR_LEGS, ACCESSORY_SLOT_ARMOR_STORAGE) accessories = list( /obj/item/clothing/accessory/arm_guards/riot, /obj/item/clothing/accessory/leg_guards/riot, From 015e7c205f35cca1026792f74fd2738d6ab32bd2 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 07:44:47 +0300 Subject: [PATCH 21/80] [MIRROR] foreign body removal repeats until halted or there's nothing left (#2254) Co-authored-by: Spookerton <918997+Spookerton@users.noreply.github.com> --- code/modules/surgery/implant.dm | 49 +++++++++++++++++---------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index ea1a1a38ae00b..192b6e173aea7 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -169,46 +169,47 @@ playsound(target.loc, 'sound/items/hemostat.ogg', 50, TRUE) ..() + /singleton/surgery_step/cavity/implant_removal/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/chest/affected = target.get_organ(target_zone) - var/exposed = 0 + var/exposed if(affected.how_open() >= (affected.encased ? SURGERY_ENCASED : SURGERY_RETRACTED)) - exposed = 1 + exposed = TRUE if(BP_IS_ROBOTIC(affected) && affected.hatch_state == HATCH_OPENED) - exposed = 1 - + exposed = TRUE var/list/loot = list() - if(exposed) + if (exposed) loot = affected.implants else - for(var/datum/wound/wound in affected.wounds) - if(LAZYLEN(wound.embedded_objects)) + for (var/datum/wound/wound in affected.wounds) + if (length(wound.embedded_objects)) loot |= wound.embedded_objects - - if (length(loot)) - - var/obj/item/obj = pick(loot) - - user.visible_message(SPAN_NOTICE("[user] takes something out of incision on [target]'s [affected.name] with \the [tool]."), \ - SPAN_NOTICE("You take \the [obj] out of incision on \the [target]'s [affected.name] with \the [tool].") ) + if (!length(loot)) + user.visible_message( + SPAN_NOTICE("\The [user] could not find anything inside \the [target]'s [affected.name], and pulls their [tool] out."), + SPAN_NOTICE("You could not find anything inside \the [target]'s [affected.name].") + ) + return + shuffle(loot, TRUE) + for (var/i = length(loot) to 1 step -1) + var/obj/item/obj = loot[i] + user.visible_message( + SPAN_NOTICE("\The [user] takes something out of incision on \the [target]'s [affected.name] with \a [tool]."), + SPAN_NOTICE("You take \a [obj] out of the incision on \the [target]'s [affected.name] with \the [tool].") + ) target.remove_implant(obj, TRUE, affected) - SET_BIT(target.hud_updateflag, IMPLOYAL_HUD) - - //Handle possessive brain borers. - if(istype(obj,/mob/living/simple_animal/borer)) + if (istype(obj, /mob/living/simple_animal/borer)) var/mob/living/simple_animal/borer/worm = obj - if(worm.controlling) + if (worm.controlling) target.release_control() worm.detatch() worm.leave_host() + playsound(target.loc, 'sound/effects/squelch1.ogg', 15, TRUE) + if (i == 1 || !user.do_skilled(3 SECONDS, SKILL_ANATOMY, target, 0.3, DO_SURGERY) || !user.use_sanity_check(target, tool)) + break - playsound(target.loc, 'sound/effects/squelch1.ogg', 15, 1) - else - user.visible_message(SPAN_NOTICE("[user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out."), \ - SPAN_NOTICE("You could not find anything inside [target]'s [affected.name].") ) - /singleton/surgery_step/cavity/implant_removal/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) ..() var/obj/item/organ/external/affected = target.get_organ(target_zone) From 6801b627d6e8e7a78d5a9e4b40fff51bde29698b Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 07:45:18 +0300 Subject: [PATCH 22/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2254=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2254.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2254.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2254.yml b/html/changelogs/AutoChangeLog-sierra-pr-2254.yml new file mode 100644 index 0000000000000..3a826766100c4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2254.yml @@ -0,0 +1,5 @@ +author: Spookerton +changes: + - {tweak: Foreign body removal surgery repeats removals until interrupted or there's + nothing left to remove.} +delete-after: true From 44ddd996d8519dfebe372e34e6264be0d04e8e70 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 13:01:42 +0300 Subject: [PATCH 23/80] [MIRROR] QoL and immersion engineering improvements (#2255) Co-authored-by: Sbotkin <5092934+Sbotkin@users.noreply.github.com> Co-authored-by: UEDCommander <52104104+UEDCommander@users.noreply.github.com> --- code/game/objects/structures/wall_frame.dm | 4 +++ .../objects/structures/wallframe_spawner.dm | 2 ++ .../loadout/lists/headwear.dm | 1 + code/modules/supermatter/supermatter.dm | 2 +- maps/torch/torch2_deck4.dmm | 4 +-- maps/torch/torch4_deck2.dmm | 36 ++++++++----------- 6 files changed, 24 insertions(+), 25 deletions(-) diff --git a/code/game/objects/structures/wall_frame.dm b/code/game/objects/structures/wall_frame.dm index 55548ab5d0fa8..933c2cf87df21 100644 --- a/code/game/objects/structures/wall_frame.dm +++ b/code/game/objects/structures/wall_frame.dm @@ -194,6 +194,10 @@ /obj/structure/wall_frame/titanium material = MATERIAL_TITANIUM + +/obj/structure/wall_frame/ocp + material = MATERIAL_OSMIUM_CARBIDE_PLASTEEL + /obj/structure/wall_frame/hull paint_color = COLOR_SOL diff --git a/code/game/objects/structures/wallframe_spawner.dm b/code/game/objects/structures/wallframe_spawner.dm index db723e9ce71b1..098f8383f1959 100644 --- a/code/game/objects/structures/wallframe_spawner.dm +++ b/code/game/objects/structures/wallframe_spawner.dm @@ -143,6 +143,8 @@ /obj/wallframe_spawn/reinforced_phoron/hull frame_path = /obj/structure/wall_frame/hull +/obj/wallframe_spawn/reinforced_phoron/ocp + frame_path = /obj/structure/wall_frame/ocp /obj/wallframe_spawn/reinforced/polarized name = "polarized reinforced wall frame window spawner" diff --git a/code/modules/client/preference_setup/loadout/lists/headwear.dm b/code/modules/client/preference_setup/loadout/lists/headwear.dm index 3712c39393456..fb343034a663b 100644 --- a/code/modules/client/preference_setup/loadout/lists/headwear.dm +++ b/code/modules/client/preference_setup/loadout/lists/headwear.dm @@ -80,6 +80,7 @@ hardhats["orange hardhat"] = /obj/item/clothing/head/hardhat/orange hardhats["red hardhat"] = /obj/item/clothing/head/hardhat/red hardhats["light damage control helmet"] = /obj/item/clothing/head/hardhat/light + hardhats["yellow hardhat"] = /obj/item/clothing/head/hardhat gear_tweaks += new/datum/gear_tweak/path(hardhats) /datum/gear/head/formalhat diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index c0bd8a1f1757e..cbd399d345d6b 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -106,7 +106,7 @@ var/aw_EPR = FALSE var/list/threshholds = list( // List of lists defining the amber/red labeling threshholds in readouts. Numbers are minminum red and amber and maximum amber and red, in that order - list("name" = SUPERMATTER_DATA_EER, "min_h" = -1, "min_l" = -1, "max_l" = 150, "max_h" = 300), + list("name" = SUPERMATTER_DATA_EER, "min_h" = -1, "min_l" = -1, "max_l" = 1100, "max_h" = 1300), list("name" = SUPERMATTER_DATA_TEMPERATURE, "min_h" = -1, "min_l" = -1, "max_l" = 4000, "max_h" = 5000), list("name" = SUPERMATTER_DATA_PRESSURE, "min_h" = -1, "min_l" = -1, "max_l" = 5000, "max_h" = 10000), list("name" = SUPERMATTER_DATA_EPR, "min_h" = -1, "min_l" = 1.0, "max_l" = 2.5, "max_h" = 4.0) diff --git a/maps/torch/torch2_deck4.dmm b/maps/torch/torch2_deck4.dmm index c220b002dcc47..c2948e3cc25ee 100644 --- a/maps/torch/torch2_deck4.dmm +++ b/maps/torch/torch2_deck4.dmm @@ -2976,11 +2976,11 @@ /obj/structure/table/standard{ name = "plastic table frame" }, -/obj/item/folder/blue, /obj/machinery/firealarm{ dir = 1; pixel_y = -24 }, +/obj/item/folder/yellow, /turf/simulated/floor/lino, /area/tcommsat/computer) "ku" = ( @@ -3049,12 +3049,12 @@ /obj/structure/table/standard{ name = "plastic table frame" }, -/obj/item/clothing/suit/storage/hooded/wintercoat/engineering, /obj/machinery/power/apc/super/critical{ dir = 1; name = "north bump"; pixel_y = 24 }, +/obj/item/clothing/suit/storage/hooded/wintercoat/solgov, /turf/simulated/floor/lino, /area/tcommsat/computer) "kH" = ( diff --git a/maps/torch/torch4_deck2.dmm b/maps/torch/torch4_deck2.dmm index 096e1edf59274..65fa1bfa3e034 100644 --- a/maps/torch/torch4_deck2.dmm +++ b/maps/torch/torch4_deck2.dmm @@ -6390,14 +6390,6 @@ /obj/structure/catwalk, /turf/simulated/floor/plating, /area/maintenance/seconddeck/aftport) -"pa" = ( -/obj/wallframe_spawn/reinforced_phoron, -/obj/machinery/door/blast/regular{ - id_tag = "SupermatterPort"; - name = "Reactor Blast Door" - }, -/turf/simulated/floor/reinforced, -/area/engineering/engine_room) "pb" = ( /obj/floor_decal/industrial/warning{ dir = 1; @@ -9576,7 +9568,7 @@ /turf/simulated/floor/tiled, /area/engineering/engineering_bay) "xw" = ( -/obj/wingrille_spawn/reinforced_phoron/full, +/obj/wallframe_spawn/reinforced_phoron/ocp, /obj/machinery/door/blast/regular/open{ dir = 4; icon_state = "pdoor0"; @@ -12018,7 +12010,7 @@ icon_state = "pdoor0"; id_tag = "prototype_chamber_blast" }, -/obj/wingrille_spawn/reinforced_phoron/full, +/obj/wallframe_spawn/reinforced_phoron/ocp, /turf/simulated/floor/reinforced, /area/vacant/prototype/engine) "Ek" = ( @@ -15148,11 +15140,6 @@ /turf/simulated/floor/tiled/monotile, /area/vacant/prototype/control) "Oj" = ( -/obj/machinery/door/airlock/hatch/maintenance/bolted{ - frequency = 1379; - id_tag = "prototype_interior"; - name = "Fusion Maintenance" - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -15165,6 +15152,11 @@ d2 = 8; icon_state = "4-8" }, +/obj/machinery/door/airlock/hatch/maintenance{ + frequency = 1379; + id_tag = "prototype_interior"; + name = "Fusion Maintenance" + }, /turf/simulated/floor/tiled/techfloor/grid, /area/vacant/prototype/control) "Ok" = ( @@ -15768,11 +15760,6 @@ /turf/simulated/floor/plating, /area/vacant/prototype/engine) "Qj" = ( -/obj/machinery/door/airlock/hatch/maintenance/bolted{ - frequency = 1379; - id_tag = "prototype_exterior"; - name = "Fusion Maintenance" - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -15785,6 +15772,11 @@ d2 = 8; icon_state = "4-8" }, +/obj/machinery/door/airlock/hatch/maintenance{ + frequency = 1379; + id_tag = "prototype_exterior"; + name = "Fusion Maintenance" + }, /turf/simulated/floor/tiled/techfloor/grid, /area/vacant/prototype/control) "Qn" = ( @@ -16703,7 +16695,7 @@ d2 = 8; icon_state = "4-8" }, -/obj/wingrille_spawn/reinforced_phoron/full, +/obj/wallframe_spawn/reinforced_phoron/ocp, /obj/machinery/door/blast/regular/open{ dir = 4; icon_state = "pdoor0"; @@ -44933,7 +44925,7 @@ kw lj lY So -pa +qc Ck Uo Zo From c188c17ca09eca7d2aa9998ca7b5b9d7a64c413e Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 13:03:15 +0300 Subject: [PATCH 24/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2255=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2255.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2255.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2255.yml b/html/changelogs/AutoChangeLog-sierra-pr-2255.yml new file mode 100644 index 0000000000000..5e592308426c0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2255.yml @@ -0,0 +1,7 @@ +author: Sbotkin +changes: + - {rscadd: Yellow hardhat (the default one) can now be picked in loadout.} + - {tweak: Default EER thresholds are raised to 1100 and 1300.} + - {maptweak: R-UST now gets low wall windows instead of full-sized.} + - {maptweak: 'R-UST airlock is now unbolted by default, on par with the SM one.'} +delete-after: true From 87ce9fa9f9070c7981747a439597ff981c56ef32 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 18:45:44 +0300 Subject: [PATCH 25/80] [MIRROR] prevent audible emote spam (#2256) Co-authored-by: MuckerMayhem <1161516+MuckerMayhem@users.noreply.github.com> --- code/modules/emotes/definitions/_mob.dm | 2 ++ code/modules/emotes/definitions/audible.dm | 17 ++++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/code/modules/emotes/definitions/_mob.dm b/code/modules/emotes/definitions/_mob.dm index ae881eddbc06f..85839d39d18c6 100644 --- a/code/modules/emotes/definitions/_mob.dm +++ b/code/modules/emotes/definitions/_mob.dm @@ -1,5 +1,7 @@ /mob/var/list/default_emotes = list() /mob/var/list/usable_emotes = list() +/mob/var/next_audible_emote_time = 0 +/mob/var/audible_emote_cooldown = 0.5 SECONDS /mob/proc/update_emotes(skip_sort) usable_emotes.Cut() diff --git a/code/modules/emotes/definitions/audible.dm b/code/modules/emotes/definitions/audible.dm index c34c84393ef39..282dfa358eb3c 100644 --- a/code/modules/emotes/definitions/audible.dm +++ b/code/modules/emotes/definitions/audible.dm @@ -5,11 +5,18 @@ var/list/emote_sound /singleton/emote/audible/do_extra(atom/user) - if(emote_sound) - var/playable = emote_sound - if (islist(emote_sound)) - playable = pick(emote_sound) - playsound(user.loc, playable, 50, 0) + if(!emote_sound) + return + if (ismob(user)) + var/mob/M = user + if (world.time < M.next_audible_emote_time) + M.next_audible_emote_time = world.time + M.audible_emote_cooldown + return + M.next_audible_emote_time = world.time + M.audible_emote_cooldown + var/playable = emote_sound + if (islist(emote_sound)) + playable = pick(emote_sound) + playsound(user.loc, playable, 50, 0) /singleton/emote/audible/deathgasp_alien key = "deathgasp" From 63eb165709386ef07585e22199c3c969a8e434bc Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 18:46:12 +0300 Subject: [PATCH 26/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2256=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2256.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2256.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2256.yml b/html/changelogs/AutoChangeLog-sierra-pr-2256.yml new file mode 100644 index 0000000000000..cc79e8fb3eade --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2256.yml @@ -0,0 +1,4 @@ +author: Mucker +changes: + - {tweak: Audible emotes with sounds can no longer be spammed.} +delete-after: true From 6ec63060bc5bc02fb658f97d8ab64d0d8d3b0f0f Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 18:47:38 +0300 Subject: [PATCH 27/80] [MIRROR] GLOBify radial menu (#2258) Co-authored-by: Spookerton <918997+Spookerton@users.noreply.github.com> --- code/_onclick/hud/radial.dm | 24 ++++++++++++------------ code/_onclick/hud/radial_persistent.dm | 6 +++--- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 450a0130e7709..15dc0a3aa2174 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -1,11 +1,4 @@ -#define NEXT_PAGE_ID "__next__" -#define DEFAULT_CHECK_DELAY 20 - -var/global/list/radial_menus = list() - -/obj/screen/radial/Destroy() - parent = null - return ..() +GLOBAL_LIST_EMPTY(radial_menus) /obj/screen/radial icon = 'icons/screen/radial.dmi' @@ -13,6 +6,10 @@ var/global/list/radial_menus = list() plane = HUD_PLANE var/datum/radial_menu/parent +/obj/screen/radial/Destroy() + parent = null + return ..() + /obj/screen/radial/slice icon_state = "radial_slice" var/choice @@ -55,6 +52,9 @@ var/global/list/radial_menus = list() parent.finished = TRUE /datum/radial_menu + var/const/NEXT_PAGE_ID = "__next__" + var/const/DEFAULT_CHECK_DELAY = 2 SECONDS + var/list/choices = list() //List of choice id's var/list/choices_icons = list() //choice_id -> icon var/list/choices_values = list() //choice_id -> choice @@ -316,14 +316,14 @@ var/global/list/radial_menus = list() for(var/atom/thing in check_locs) check_locs[thing] = thing.loc - if(global.radial_menus[uniqueid]) + if(GLOB.radial_menus[uniqueid]) if(!no_repeat_close) - var/datum/radial_menu/menu = global.radial_menus[uniqueid] + var/datum/radial_menu/menu = GLOB.radial_menus[uniqueid] menu.finished = TRUE return var/datum/radial_menu/menu = new - global.radial_menus[uniqueid] = menu + GLOB.radial_menus[uniqueid] = menu if(radius) menu.radius = radius if(istype(custom_check)) @@ -335,7 +335,7 @@ var/global/list/radial_menus = list() menu.wait(user, anchor, require_near, check_locs) var/answer = menu.selected_choice qdel(menu) - global.radial_menus -= uniqueid + GLOB.radial_menus -= uniqueid return answer #define RADIAL_INPUT(user, choices) show_radial_menu(user, user, choices) diff --git a/code/_onclick/hud/radial_persistent.dm b/code/_onclick/hud/radial_persistent.dm index 6c71762b68b26..44c0ab009a8ec 100644 --- a/code/_onclick/hud/radial_persistent.dm +++ b/code/_onclick/hud/radial_persistent.dm @@ -37,7 +37,7 @@ /datum/radial_menu/persistent/Destroy() QDEL_NULL(select_proc_callback) - global.radial_menus -= uniqueid + GLOB.radial_menus -= uniqueid Reset() hide() return ..() @@ -55,12 +55,12 @@ if(!uniqueid) uniqueid = "defmenu_\ref[user]_\ref[anchor]" - if(global.radial_menus[uniqueid]) + if(GLOB.radial_menus[uniqueid]) return var/datum/radial_menu/persistent/menu = new menu.uniqueid = uniqueid - global.radial_menus[uniqueid] = menu + GLOB.radial_menus[uniqueid] = menu if(radius) menu.radius = radius menu.select_proc_callback = select_proc From 418b6cfc38c21ffe5e70584f87f64ef0698b5c75 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 18:48:34 +0300 Subject: [PATCH 28/80] [MIRROR] Allows protolathes to actually accept chemicals (#2263) Co-authored-by: Merlin1230 <76177064+Merlin1230@users.noreply.github.com> --- code/modules/research/protolathe.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 4c234f4a44876..e04eab79e3482 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -103,7 +103,7 @@ if((. = ..())) return if(O.is_open_container()) - return TRUE + return FALSE if(panel_open) to_chat(user, SPAN_NOTICE("You can't load \the [src] while it's opened.")) return TRUE From 46e031b1a0d95a311ebaac83e485c4454ce88b10 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 18:49:05 +0300 Subject: [PATCH 29/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2263=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2263.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2263.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2263.yml b/html/changelogs/AutoChangeLog-sierra-pr-2263.yml new file mode 100644 index 0000000000000..cc67deacbbd04 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2263.yml @@ -0,0 +1,4 @@ +author: Merlin1230 +changes: + - {bugfix: The protolathe will now actually accept chemicals} +delete-after: true From 797e131930a1f901f6ac1e388ab6e658be384ca1 Mon Sep 17 00:00:00 2001 From: MGWhiskers Date: Fri, 14 Jun 2024 18:49:12 +0300 Subject: [PATCH 30/80] tweaks & fixes sierra map 14.06.2024 (#2355) --- maps/sierra/z1-z5_sierra.dmm | 344 ++++++++++++++++++++++++----------- 1 file changed, 239 insertions(+), 105 deletions(-) diff --git a/maps/sierra/z1-z5_sierra.dmm b/maps/sierra/z1-z5_sierra.dmm index 875aa4b8601b0..ddfafc3907aec 100644 --- a/maps/sierra/z1-z5_sierra.dmm +++ b/maps/sierra/z1-z5_sierra.dmm @@ -610,9 +610,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/structure/railing/mapped{ - dir = 8 - }, /turf/simulated/floor/tiled, /area/hallway/primary/thirddeck/central_stairwell) "aec" = ( @@ -1049,9 +1046,13 @@ /turf/simulated/floor/grass/cut, /area/crew_quarters/garden_room) "ahU" = ( -/obj/machinery/light/spot, -/turf/simulated/wall/r_wall/prepainted, -/area/crew_quarters/heads/office/hop/cobed) +/obj/structure/railing/mapped{ + dir = 8; + init_color = "#46698c"; + color = "#46698c" + }, +/turf/simulated/open, +/area/hallway/primary/bridgedeck/central_stairwell) "aif" = ( /obj/wallframe_spawn/reinforced/hull, /obj/machinery/door/firedoor, @@ -4636,9 +4637,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/computer/modular/preset/security{ - dir = 1 - }, +/obj/structure/roller_bed, /turf/simulated/floor/tiled/dark, /area/medical/morgue/autopsy) "aHE" = ( @@ -5624,9 +5623,6 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/railing/mapped{ - dir = 8 - }, /turf/simulated/floor/tiled, /area/hallway/primary/firstdeck/central_stairwell) "aQd" = ( @@ -6725,6 +6721,11 @@ /obj/machinery/door/airlock/hatch/maintenance, /obj/machinery/door/firedoor, /obj/floor_decal/industrial/hatch/yellow, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/simulated/floor/tiled/techfloor/grid, /area/maintenance/seconddeck/aftport) "aXz" = ( @@ -9901,9 +9902,6 @@ /obj/machinery/atm{ pixel_x = 32 }, -/obj/structure/window/reinforced{ - dir = 1 - }, /turf/simulated/floor/tiled, /area/hallway/primary/bridgedeck/central_stairwell) "bxn" = ( @@ -19086,11 +19084,11 @@ /obj/machinery/suspension_gen, /obj/floor_decal/industrial/outline/yellow, /obj/machinery/button/blast_door{ - id_tag = "mine_warehouse"; + id_tag = "expe_warehouse"; name = "Storage Door Control"; pixel_x = 6; pixel_y = -24; - req_access = list(list("ACCESS_MINING","ACCESS_XENOARCH","ACCESS_EL")); + req_access = list(list("ACCESS_EXPLORER","ACCESS_XENOARCH","ACCESS_EL")); dir = 1 }, /obj/machinery/light_switch{ @@ -32432,6 +32430,9 @@ d2 = 8; icon_state = "4-8" }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, /turf/simulated/floor/tiled, /area/exploration_shuttle/airlock) "eJC" = ( @@ -40463,7 +40464,9 @@ /area/security/sierra/prison) "fSx" = ( /obj/structure/railing/mapped{ - dir = 8 + dir = 8; + color = "#aed18b"; + init_color = "#aed18b" }, /turf/simulated/open, /area/hallway/primary/seconddeck/central_stairwell) @@ -44755,6 +44758,21 @@ /obj/structure/railing/mapped, /turf/simulated/floor/plating, /area/maintenance/thirddeck/port) +"gDq" = ( +/obj/machinery/cryopod, +/obj/floor_decal/techfloor/orange{ + dir = 8 + }, +/obj/floor_decal/techfloor{ + dir = 4 + }, +/obj/structure/railing/mapped{ + dir = 1; + color = "#393f43"; + init_color = "#393f43" + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/hallway/primary/fourthdeck/central_stairwell) "gDr" = ( /obj/wallframe_spawn/reinforced/hull, /obj/structure/cable/green{ @@ -45668,11 +45686,11 @@ icon_state = "4-8" }, /obj/machinery/button/blast_door{ - id_tag = "mine_warehouse"; + id_tag = "expe_warehouse"; name = "Storage Door Control"; pixel_x = 6; pixel_y = 24; - req_access = list(list("ACCESS_MINING","ACCESS_XENOARCH","ACCESS_EL")) + req_access = list(list("ACCESS_EXPLORER","ACCESS_XENOARCH","ACCESS_EL")) }, /obj/catwalk_plated, /turf/simulated/floor/plating, @@ -48808,7 +48826,9 @@ dir = 1; pixel_y = -24 }, -/obj/structure/roller_bed, +/obj/machinery/computer/modular/preset/security{ + dir = 1 + }, /turf/simulated/floor/tiled/dark, /area/medical/morgue/autopsy) "hhl" = ( @@ -51143,6 +51163,11 @@ "hAz" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/catwalk, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/simulated/floor/plating, /area/maintenance/seconddeck/aftport) "hAA" = ( @@ -53623,6 +53648,11 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /obj/structure/catwalk, +/obj/structure/cable/green{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, /turf/simulated/floor/plating, /area/maintenance/seconddeck/port) "hUQ" = ( @@ -57827,6 +57857,13 @@ /obj/shuttle_landmark/ninja/deck1, /turf/space, /area/space) +"iCl" = ( +/obj/structure/railing/mapped{ + color = "#46698c"; + init_color = "#46698c" + }, +/turf/simulated/open, +/area/hallway/primary/bridgedeck/central_stairwell) "iCD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -69167,10 +69204,11 @@ /turf/simulated/floor/tiled/steel_grid, /area/hallway/primary/thirddeck/fore) "klJ" = ( -/obj/floor_decal/corner/darkblue/border{ +/obj/floor_decal/corner/yellow/mono, +/obj/floor_decal/techfloor{ dir = 9 }, -/turf/simulated/floor/tiled/white/monotile, +/turf/simulated/floor/tiled, /area/turbolift/medical_lift) "klK" = ( /obj/floor_decal/borderfloorblack{ @@ -76639,10 +76677,6 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 - }, /obj/floor_decal/borderfloor{ dir = 8 }, @@ -77218,6 +77252,15 @@ /obj/machinery/floodlight, /turf/simulated/floor/plating, /area/maintenance/bridgedeck/port) +"lui" = ( +/obj/structure/railing/mapped{ + dir = 1; + icon_state = "railing0-1"; + init_color = "#aa5f61"; + color = "#aa5f61" + }, +/turf/simulated/open, +/area/hallway/primary/firstdeck/central_stairwell) "lun" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -79654,7 +79697,7 @@ dir = 4 }, /turf/simulated/floor/tiled/monotile, -/area/space) +/area/quartermaster/hangar) "lKS" = ( /obj/floor_decal/borderfloor, /obj/floor_decal/corner/lime/border, @@ -79768,6 +79811,9 @@ }, /obj/structure/table/rack, /obj/random/tool, +/obj/machinery/alarm{ + pixel_y = 24 + }, /turf/simulated/floor/tiled/techfloor, /area/maintenance/thirddeck/aftstarboard) "lLL" = ( @@ -85135,7 +85181,9 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, /obj/structure/disposalpipe/segment, /obj/structure/cable/cyan{ d1 = 2; @@ -86368,7 +86416,6 @@ pixel_y = 31; dir = 8 }, -/obj/structure/railing/mapped, /turf/simulated/floor/tiled, /area/hallway/primary/thirddeck/central_stairwell) "mMA" = ( @@ -86660,6 +86707,18 @@ }, /turf/simulated/floor/tiled/techfloor/grid, /area/crew_quarters/sleep/cryo/south) +"mOu" = ( +/obj/structure/railing/mapped{ + color = "#aed18b"; + init_color = "#aed18b" + }, +/obj/structure/railing/mapped{ + dir = 8; + color = "#aed18b"; + init_color = "#aed18b" + }, +/turf/simulated/open, +/area/hallway/primary/seconddeck/central_stairwell) "mOx" = ( /obj/floor_decal/borderfloorblack{ dir = 4 @@ -87003,9 +87062,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/window/reinforced{ - dir = 1 - }, /turf/simulated/floor/tiled, /area/hallway/primary/bridgedeck/central_stairwell) "mRs" = ( @@ -94078,11 +94134,6 @@ /obj/floor_decal/techfloor/orange{ dir = 4 }, -/obj/structure/railing/mapped{ - dir = 1; - icon_state = "railing0-1" - }, -/obj/structure/railing/mapped, /turf/simulated/floor/tiled/techfloor, /area/hallway/primary/fourthdeck/central_stairwell) "nVr" = ( @@ -94507,6 +94558,20 @@ /obj/item/storage/candle_box, /turf/simulated/floor/tiled/dark, /area/medical/mentalhealth) +"oad" = ( +/obj/structure/railing/mapped{ + dir = 1; + icon_state = "railing0-1"; + init_color = "#aa5f61"; + color = "#aa5f61" + }, +/obj/structure/railing/mapped{ + dir = 4; + init_color = "#aa5f61"; + color = "#aa5f61" + }, +/turf/simulated/open, +/area/hallway/primary/firstdeck/central_stairwell) "oae" = ( /obj/machinery/cryopod, /obj/floor_decal/techfloor/orange{ @@ -95528,9 +95593,6 @@ dir = 4 }, /obj/structure/disposalpipe/segment, -/obj/structure/railing/mapped{ - dir = 4 - }, /turf/simulated/floor/tiled, /area/hallway/primary/bridgedeck/central_stairwell) "ohy" = ( @@ -97356,6 +97418,14 @@ "ouw" = ( /turf/simulated/wall/r_wall/hull, /area/medical/mentalhealth/therapyroom) +"ouA" = ( +/obj/structure/table/steel, +/obj/machinery/alarm{ + dir = 8; + pixel_x = 24 + }, +/turf/simulated/floor/plating, +/area/maintenance/compactor) "ouB" = ( /obj/structure/extinguisher_cabinet{ pixel_y = 29 @@ -98248,7 +98318,9 @@ /area/maintenance/seconddeck/starboard) "oBW" = ( /obj/structure/railing/mapped{ - dir = 4 + dir = 4; + init_color = "#b19664"; + color = "#b19664" }, /turf/simulated/open, /area/hallway/primary/thirddeck/central_stairwell) @@ -99181,10 +99253,6 @@ dir = 4; pixel_y = -31 }, -/obj/structure/railing/mapped{ - dir = 1; - icon_state = "railing0-1" - }, /turf/simulated/floor/tiled, /area/hallway/primary/seconddeck/central_stairwell) "oIo" = ( @@ -99540,19 +99608,19 @@ /turf/simulated/floor/carpet/blue, /area/crew_quarters/heads/office/iaa/high_sec) "oLd" = ( -/obj/structure/cable/green{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/landmark{ + name = "JoinLateCryo" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/disposalpipe/segment, -/obj/structure/railing/mapped{ +/obj/floor_decal/techfloor/orange{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/hallway/primary/bridgedeck/central_stairwell) +/obj/structure/railing/mapped{ + dir = 1; + color = "#393f43"; + init_color = "#393f43" + }, +/turf/simulated/floor/tiled/techfloor, +/area/hallway/primary/fourthdeck/central_stairwell) "oLh" = ( /obj/structure/table/steel, /obj/item/rcd_ammo, @@ -103725,6 +103793,13 @@ map_airless = 1 }, /area/space) +"poY" = ( +/obj/structure/railing/mapped{ + init_color = "#aed18b"; + color = "#aed18b" + }, +/turf/simulated/open, +/area/hallway/primary/seconddeck/central_stairwell) "ppb" = ( /turf/simulated/wall/r_wall/hull, /area/vacant/cargo) @@ -105834,6 +105909,14 @@ map_airless = 1 }, /area/vacant/prototype/engine) +"pFm" = ( +/obj/structure/railing/mapped{ + dir = 1; + color = "#b19664"; + init_color = "#b19664" + }, +/turf/simulated/open, +/area/hallway/primary/thirddeck/central_stairwell) "pFs" = ( /obj/machinery/flasher{ id_tag = "security_third_cell_flash"; @@ -109650,7 +109733,6 @@ dir = 8; pixel_y = 31 }, -/obj/structure/railing/mapped, /turf/simulated/floor/tiled, /area/hallway/primary/thirddeck/central_stairwell) "qiM" = ( @@ -109876,10 +109958,11 @@ /turf/simulated/floor/plating, /area/maintenance/firstdeck/forestarboard) "qkA" = ( -/obj/floor_decal/corner/darkblue/border{ +/obj/floor_decal/corner/yellow/mono, +/obj/floor_decal/techfloor{ dir = 6 }, -/turf/simulated/floor/tiled/white/monotile, +/turf/simulated/floor/tiled, /area/turbolift/medical_lift) "qkP" = ( /obj/machinery/portable_atmospherics/canister/hydrogen, @@ -111055,6 +111138,12 @@ /obj/floor_decal/techfloor/corner, /turf/simulated/floor/tiled/techfloor, /area/engineering/engine_room) +"quR" = ( +/obj/machinery/light/spot{ + dir = 4 + }, +/turf/simulated/open, +/area/hallway/primary/bridgedeck/central_stairwell) "quV" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled, @@ -111563,6 +111652,11 @@ icon_state = "0-4" }, /obj/structure/catwalk, +/obj/structure/cable/green{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, /turf/simulated/floor/plating, /area/maintenance/seconddeck/aftport) "qzs" = ( @@ -114642,10 +114736,6 @@ pixel_y = -31; dir = 4 }, -/obj/structure/railing/mapped{ - dir = 1; - icon_state = "railing0-1" - }, /turf/simulated/floor/tiled, /area/hallway/primary/seconddeck/central_stairwell) "qWn" = ( @@ -116611,9 +116701,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, -/obj/structure/window/reinforced{ - dir = 1 - }, /turf/simulated/floor/tiled, /area/hallway/primary/bridgedeck/central_stairwell) "rkb" = ( @@ -117878,6 +117965,18 @@ /obj/machinery/door/firedoor, /turf/simulated/floor/plating, /area/engineering/engine_room) +"ruT" = ( +/obj/structure/railing/mapped{ + dir = 8; + init_color = "#46698c"; + color = "#46698c" + }, +/obj/structure/railing/mapped{ + color = "#46698c"; + init_color = "#46698c" + }, +/turf/simulated/open, +/area/hallway/primary/bridgedeck/central_stairwell) "rvc" = ( /obj/structure/catwalk, /obj/structure/cable/green{ @@ -120827,11 +120926,6 @@ /obj/floor_decal/techfloor{ dir = 4 }, -/obj/structure/railing/mapped{ - dir = 1; - icon_state = "railing0-1" - }, -/obj/structure/railing/mapped, /turf/simulated/floor/tiled/techfloor/grid, /area/hallway/primary/fourthdeck/central_stairwell) "rRI" = ( @@ -122578,7 +122672,9 @@ /area/turret_protected/ai_upload) "sef" = ( /obj/structure/railing/mapped{ - dir = 4 + dir = 4; + init_color = "#aa5f61"; + color = "#aa5f61" }, /turf/simulated/open, /area/hallway/primary/firstdeck/central_stairwell) @@ -126513,7 +126609,6 @@ /area/crew_quarters/garden_room) "sGv" = ( /obj/structure/stairs/west, -/obj/structure/railing/mapped, /turf/simulated/floor/tiled, /area/hallway/primary/firstdeck/central_stairwell) "sGB" = ( @@ -138366,6 +138461,19 @@ /obj/floor_decal/industrial/warning/full, /turf/simulated/floor/reinforced, /area/exploration_shuttle/airlock) +"uvx" = ( +/obj/structure/railing/mapped{ + dir = 1; + color = "#b19664"; + init_color = "#b19664" + }, +/obj/structure/railing/mapped{ + dir = 4; + init_color = "#b19664"; + color = "#b19664" + }, +/turf/simulated/open, +/area/hallway/primary/thirddeck/central_stairwell) "uvE" = ( /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 6 @@ -139537,6 +139645,11 @@ dir = 6 }, /obj/structure/catwalk, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/simulated/floor/plating, /area/maintenance/seconddeck/aftport) "uEp" = ( @@ -145228,6 +145341,11 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/catwalk, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/simulated/floor/plating, /area/maintenance/seconddeck/port) "vuZ" = ( @@ -146529,7 +146647,7 @@ /obj/machinery/door/firedoor, /obj/machinery/door/blast/shutters{ dir = 2; - id_tag = "mine_warehouse"; + id_tag = "expe_warehouse"; name = "Storage Shutters" }, /turf/simulated/floor/tiled/techfloor/grid, @@ -146862,7 +146980,6 @@ pixel_y = 24; dir = 8 }, -/obj/structure/railing/mapped, /turf/simulated/floor/tiled, /area/hallway/primary/firstdeck/central_stairwell) "vGI" = ( @@ -149235,6 +149352,20 @@ }, /turf/simulated/floor/tiled/monotile, /area/security/sierra/hallway/aft) +"vYl" = ( +/obj/machinery/cryopod, +/obj/floor_decal/techfloor/orange{ + dir = 8 + }, +/obj/floor_decal/techfloor{ + dir = 4 + }, +/obj/structure/railing/mapped{ + color = "#393f43"; + init_color = "#393f43" + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/hallway/primary/fourthdeck/central_stairwell) "vYu" = ( /obj/structure/disposalpipe/segment, /turf/simulated/wall/r_wall/hull, @@ -151227,10 +151358,11 @@ /turf/simulated/floor/carpet/red, /area/crew_quarters/cafe/upper) "wod" = ( -/obj/floor_decal/corner/darkblue/border{ +/obj/floor_decal/corner/yellow/mono, +/obj/floor_decal/techfloor{ dir = 5 }, -/turf/simulated/floor/tiled/white/monotile, +/turf/simulated/floor/tiled, /area/turbolift/medical_lift) "woo" = ( /obj/structure/disposalpipe/segment{ @@ -154243,14 +154375,14 @@ "wPp" = ( /obj/machinery/light, /obj/structure/closet/emcloset, +/obj/floor_decal/corner/purple/border{ + dir = 9 + }, /obj/machinery/pager/science{ dir = 1; - name = "Call Scienciests button"; + name = "Call Scientists button"; pixel_y = -22 }, -/obj/floor_decal/corner/purple/border{ - dir = 9 - }, /turf/simulated/floor/tiled/monotile, /area/rnd/entry) "wPq" = ( @@ -157258,7 +157390,7 @@ /obj/structure/closet/emcloset, /obj/floor_decal/industrial/outline/yellow, /turf/simulated/floor/tiled/monotile, -/area/space) +/area/quartermaster/hangar) "xmU" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -158052,10 +158184,11 @@ /area/engineering/engine_monitoring) "xsT" = ( /obj/shuttle_landmark/lift/medical_top, -/obj/floor_decal/corner/darkblue/border{ +/obj/floor_decal/corner/yellow/mono, +/obj/floor_decal/techfloor{ dir = 10 }, -/turf/simulated/floor/tiled/white/monotile, +/turf/simulated/floor/tiled, /area/turbolift/medical_lift) "xsW" = ( /obj/floor_decal/corner_techfloor_grid{ @@ -162689,6 +162822,10 @@ /obj/floor_decal/techfloor/orange{ dir = 4 }, +/obj/structure/railing/mapped{ + init_color = "#393f43"; + color = "#393f43" + }, /turf/simulated/floor/tiled/techfloor, /area/hallway/primary/fourthdeck/central_stairwell) "ycn" = ( @@ -162898,9 +163035,6 @@ d2 = 2; icon_state = "1-2" }, -/obj/structure/railing/mapped{ - dir = 4 - }, /turf/simulated/floor/tiled, /area/hallway/primary/seconddeck/central_stairwell) "ydo" = ( @@ -178665,7 +178799,7 @@ iVN ixk ych nVj -ych +oLd aUP iVN jee @@ -178865,9 +178999,9 @@ oPv iOE iVN pYx -pYx +vYl rRF -pYx +gDq pYx iVN jee @@ -219064,7 +219198,7 @@ xXd skW osP mMx -vIw +pFm vIw dtd jcE @@ -219266,7 +219400,7 @@ nuc kMJ osP qiK -vIw +uvx dYl dtd gPE @@ -225293,7 +225427,7 @@ sgz jSi hLq yhR -yhR +ouA fcx qKd rmf @@ -259465,7 +259599,7 @@ aXo mAV ewS eyQ -tvF +mOu qWk wle tQO @@ -259667,7 +259801,7 @@ aYz ccj ewS tvF -tvF +poY oIi wle uIC @@ -299866,7 +300000,7 @@ lFA aIH uQt sGv -diR +lui diR aWk wlw @@ -300068,7 +300202,7 @@ oUS dhl uQt vGv -diR +oad xEM aWk ljL @@ -340066,7 +340200,7 @@ iCf oxC kQl ohw -oLd +ppC bTJ ppC rBU @@ -340267,8 +340401,8 @@ wjq hFB tqf lZj -lZj -lZj +ahU +ruT mRr iyv pXR @@ -340470,7 +340604,7 @@ mQL tqf lZj lZj -lZj +iCl mRr chE pXR @@ -340672,7 +340806,7 @@ bzw tqf lZj lZj -lZj +iCl rjS rbn pXR @@ -340873,8 +341007,8 @@ aVq beN dmO lZj -lZj -lZj +quR +iCl bxl nqM pXR @@ -341076,7 +341210,7 @@ ltN tse tse tse -ahU +tse tse tse tse From 878213f78e088bd5209e5f80cd3f8be61bec2ec6 Mon Sep 17 00:00:00 2001 From: Lexanx <61974560+Lexanx@users.noreply.github.com> Date: Fri, 14 Jun 2024 18:49:34 +0300 Subject: [PATCH 31/80] Fix USB runtime (#2342) --- mods/ipc_mods/code/exonet_connection_system.dm | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/mods/ipc_mods/code/exonet_connection_system.dm b/mods/ipc_mods/code/exonet_connection_system.dm index 02096adb62b07..1688edf4c7143 100644 --- a/mods/ipc_mods/code/exonet_connection_system.dm +++ b/mods/ipc_mods/code/exonet_connection_system.dm @@ -108,13 +108,15 @@ /obj/item/stock_parts/computer/hard_drive/portable/afterattack(mob/living/carbon/human/H, mob/living/user, target_zone, animate = TRUE) - if(H.is_species(SPECIES_IPC) && ishuman(user) && (user.zone_sel.selecting == BP_MOUTH || user.zone_sel.selecting == BP_HEAD)) - var/obj/item/organ/internal/ecs/T = H.internal_organs_by_name[BP_EXONET] - if (do_after(user, 10, src)) - user.visible_message( \ - "\The [user] install's [src] into [H]'s exonet port.", \ - "You have installed [src] into [H]'s exonet port." \ - ) - T.computer.try_install_component(user, src) + . = ..() + if(istype(H)) + if(H.is_species(SPECIES_IPC) && ishuman(user) && (user.zone_sel.selecting == BP_MOUTH || user.zone_sel.selecting == BP_HEAD)) + var/obj/item/organ/internal/ecs/T = H.internal_organs_by_name[BP_EXONET] + if (do_after(user, 10, src)) + user.visible_message( \ + "\The [user] install's [src] into [H]'s exonet port.", \ + "You have installed [src] into [H]'s exonet port." \ + ) + T.computer.try_install_component(user, src) #undef EXONET_ACTION_NAME From 2996603bc8fa59646b429046f7e04f556c3c723b Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 18:49:39 +0300 Subject: [PATCH 32/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2355=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2355.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2355.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2355.yml b/html/changelogs/AutoChangeLog-sierra-pr-2355.yml new file mode 100644 index 0000000000000..ed7720931701b --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2355.yml @@ -0,0 +1,4 @@ +author: MGWhiskers +changes: + - {maptweak: косметика и ишшуи} +delete-after: true From ee6eb66898b88f21109fff99eee63af7aec60ec9 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 18:50:02 +0300 Subject: [PATCH 33/80] [MIRROR] Adds the rad shield var to all the maintence rooms, and moves the rust areas to /area/engineering/prototype (#2279) Co-authored-by: Merlin1230 <76177064+Merlin1230@users.noreply.github.com> --- maps/torch/torch4_deck2.dmm | 240 +++++++++++++++---------------- maps/torch/torch_areas.dm | 23 +-- maps/torch/torch_unit_testing.dm | 2 - 3 files changed, 132 insertions(+), 133 deletions(-) diff --git a/maps/torch/torch4_deck2.dmm b/maps/torch/torch4_deck2.dmm index 65fa1bfa3e034..edd2c1bc8def3 100644 --- a/maps/torch/torch4_deck2.dmm +++ b/maps/torch/torch4_deck2.dmm @@ -38,7 +38,7 @@ initial_id_tag = "aux_fusion_plant" }, /turf/simulated/floor/reinforced, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "ae" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -289,7 +289,7 @@ pixel_y = -22 }, /turf/simulated/floor/tiled/techfloor, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "az" = ( /turf/simulated/wall/prepainted, /area/engineering/engine_smes) @@ -590,7 +590,7 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "bh" = ( /obj/structure/table/rack, /obj/random/junk, @@ -640,7 +640,7 @@ icon_state = "4-8" }, /turf/simulated/floor/tiled/steel_grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "bm" = ( /obj/machinery/conveyor{ dir = 9; @@ -1702,7 +1702,7 @@ icon_state = "warningcorner" }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "dk" = ( /obj/floor_decal/industrial/warning{ dir = 8; @@ -2148,7 +2148,7 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "ei" = ( /obj/structure/reagent_dispensers/fueltank, /turf/simulated/floor/plating, @@ -2270,7 +2270,7 @@ }, /obj/structure/cable/green, /turf/simulated/floor/reinforced, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "eu" = ( /obj/structure/cable{ d1 = 32; @@ -2300,7 +2300,7 @@ anchored = 1 }, /turf/simulated/floor/reinforced, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "ex" = ( /obj/random/torchcloset, /turf/simulated/floor/plating, @@ -2403,7 +2403,7 @@ initial_id_tag = "aux_fusion_plant" }, /turf/simulated/floor/reinforced, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "eI" = ( /obj/structure/cable/green{ d1 = 4; @@ -4764,7 +4764,7 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "kz" = ( /obj/structure/cable/green{ d1 = 1; @@ -5409,21 +5409,21 @@ /area/solar/port) "mb" = ( /turf/simulated/wall/r_wall/prepainted, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "mc" = ( /obj/floor_decal/industrial/warning/corner, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "md" = ( /obj/floor_decal/industrial/warning, /obj/machinery/light{ dir = 1 }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "me" = ( /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "mf" = ( /obj/machinery/computer/fusion/fuel_control{ dir = 4; @@ -5434,7 +5434,7 @@ dir = 1 }, /turf/simulated/floor/tiled/monotile, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "mg" = ( /obj/floor_decal/industrial/warning{ dir = 8; @@ -5443,7 +5443,7 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "mh" = ( /obj/structure/cable/yellow{ d1 = 4; @@ -5457,7 +5457,7 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "mi" = ( /obj/structure/cable/green{ d1 = 4; @@ -6920,19 +6920,19 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "qi" = ( /obj/wallframe_spawn/reinforced/no_grille, /obj/machinery/door/firedoor, /turf/simulated/floor/plating, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "qj" = ( /obj/floor_decal/industrial/warning{ dir = 1; icon_state = "warning" }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "qk" = ( /obj/machinery/door/airlock/engineering{ name = "Fusion Testing Facility"; @@ -6951,7 +6951,7 @@ }, /obj/machinery/door/firedoor, /turf/simulated/floor/tiled/techfloor/grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "qm" = ( /obj/structure/cable/green{ d1 = 4; @@ -6996,7 +6996,7 @@ /area/maintenance/seconddeck/foreport) "qw" = ( /turf/simulated/wall/r_wall/hull, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "qy" = ( /obj/structure/cable/cyan{ d1 = 1; @@ -7059,7 +7059,7 @@ dir = 8 }, /turf/simulated/wall/r_wall/hull, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "qH" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -7398,7 +7398,7 @@ icon_state = "2-4" }, /turf/simulated/floor/tiled/steel_grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "rj" = ( /obj/floor_decal/industrial/warning{ dir = 1; @@ -7406,7 +7406,7 @@ }, /obj/machinery/light, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "rl" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 @@ -8451,14 +8451,14 @@ icon_state = "warningcorner" }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "ue" = ( /obj/floor_decal/industrial/warning{ dir = 4; icon_state = "warning" }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "ug" = ( /obj/structure/railing/mapped{ dir = 4; @@ -8824,7 +8824,7 @@ pixel_y = 24 }, /turf/simulated/floor/tiled/monotile, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "vj" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/power/sensor{ @@ -8841,7 +8841,7 @@ icon_state = "1-8" }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "vk" = ( /obj/machinery/door/airlock/engineering{ name = "Fusion Testing Facility"; @@ -8856,7 +8856,7 @@ icon_state = "1-2" }, /turf/simulated/floor/tiled/steel_ridged, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "vl" = ( /obj/structure/cable/green{ d1 = 1; @@ -9233,7 +9233,7 @@ start_pressure = 14999 }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "ww" = ( /obj/structure/table/rack{ dir = 8 @@ -9382,7 +9382,7 @@ dir = 1 }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "wT" = ( /obj/structure/cable/green{ d1 = 2; @@ -9575,7 +9575,7 @@ id_tag = "prototype_chamber_blast" }, /turf/simulated/floor/reinforced, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "xy" = ( /obj/machinery/light, /obj/structure/catwalk, @@ -9728,7 +9728,7 @@ /area/maintenance/seconddeck/foreport) "yf" = ( /turf/simulated/wall/prepainted, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "yg" = ( /turf/simulated/wall/prepainted, /area/maintenance/incinerator) @@ -9971,7 +9971,7 @@ dir = 1 }, /turf/simulated/wall/ocp_wall, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "yR" = ( /turf/simulated/floor/tiled/techfloor/grid, /area/engineering/engine_room) @@ -10410,7 +10410,7 @@ start_pressure = 14999 }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Al" = ( /obj/floor_decal/techfloor{ dir = 8 @@ -12012,7 +12012,7 @@ }, /obj/wallframe_spawn/reinforced_phoron/ocp, /turf/simulated/floor/reinforced, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Ek" = ( /obj/machinery/atmospherics/pipe/simple/visible/black, /obj/wallframe_spawn/reinforced_phoron, @@ -12407,7 +12407,7 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Fh" = ( /obj/floor_decal/industrial/warning{ dir = 8 @@ -12420,7 +12420,7 @@ dir = 5 }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Fi" = ( /obj/structure/cable{ d1 = 2; @@ -12431,7 +12431,7 @@ /obj/item/storage/toolbox/electrical, /obj/item/paper/newrust, /turf/simulated/floor/tiled/steel_grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Fj" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 @@ -12721,13 +12721,13 @@ dir = 5 }, /turf/simulated/floor/tiled/steel_grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Gg" = ( /obj/floor_decal/industrial/warning, /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Gh" = ( /obj/floor_decal/industrial/warning{ dir = 1 @@ -12741,7 +12741,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Gi" = ( /obj/structure/cable{ d1 = 1; @@ -12761,7 +12761,7 @@ pixel_y = -32 }, /turf/simulated/floor/tiled/steel_grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Gj" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/floor_decal/industrial/warning{ @@ -12773,7 +12773,7 @@ icon_state = "1-2" }, /turf/simulated/floor/tiled/techfloor, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Gl" = ( /obj/structure/sign/warning/compressed_gas{ dir = 1 @@ -13025,7 +13025,7 @@ c_tag = "Engineering - RUST Monitoring" }, /turf/simulated/floor/tiled/steel_grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Hg" = ( /obj/floor_decal/industrial/warning/corner{ dir = 8; @@ -13034,7 +13034,7 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Hh" = ( /obj/floor_decal/industrial/warning{ dir = 1 @@ -13043,7 +13043,7 @@ dir = 4 }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Hi" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -13072,7 +13072,7 @@ dir = 8 }, /turf/simulated/floor/tiled/techfloor, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Hk" = ( /obj/structure/sign/atmosplaque, /turf/simulated/wall/r_wall/prepainted, @@ -13100,7 +13100,7 @@ icon_state = "4-8" }, /turf/simulated/floor/tiled/techfloor, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Hn" = ( /obj/structure/cable{ d1 = 1; @@ -13367,7 +13367,7 @@ dir = 10 }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Ij" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -13377,7 +13377,7 @@ icon_state = "1-4" }, /turf/simulated/floor/tiled/steel_grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Ik" = ( /obj/floor_decal/industrial/outline/yellow, /obj/structure/closet/secure_closet/engineering_torch, @@ -13605,7 +13605,7 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "IW" = ( /obj/machinery/light_switch{ pixel_x = 24; @@ -13691,11 +13691,11 @@ icon_state = "warningcorner" }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Jh" = ( /obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled/steel_grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Ji" = ( /obj/landmark{ name = "xeno_spawn"; @@ -13733,7 +13733,7 @@ dir = 6 }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Jl" = ( /obj/machinery/atmospherics/omni/filter{ tag_east = 5; @@ -14007,7 +14007,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Kh" = ( /obj/random/obstruction, /turf/simulated/floor/plating, @@ -14023,7 +14023,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Kk" = ( /obj/floor_decal/techfloor{ dir = 8 @@ -14209,7 +14209,7 @@ "Lc" = ( /obj/floor_decal/industrial/warning, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Ld" = ( /obj/machinery/atmospherics/pipe/simple/visible/green{ dir = 4 @@ -14254,7 +14254,7 @@ /area/hallway/primary/seconddeck/fore) "Li" = ( /turf/simulated/floor/reinforced, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Lj" = ( /obj/structure/cable/yellow, /obj/machinery/power/terminal, @@ -14263,7 +14263,7 @@ dir = 4 }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Lk" = ( /turf/simulated/wall/prepainted, /area/storage/medical) @@ -14480,14 +14480,14 @@ /obj/floor_decal/industrial/warning/corner, /obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Mh" = ( /obj/machinery/shield_diffuser, /obj/floor_decal/industrial/warning, /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Mi" = ( /obj/machinery/button/blast_door{ desc = "A remote control-switch for the prototype exhaust."; @@ -14513,7 +14513,7 @@ dir = 5 }, /turf/simulated/floor/tiled/steel_grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Mj" = ( /obj/floor_decal/industrial/warning/corner{ dir = 8; @@ -14521,7 +14521,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Mk" = ( /obj/structure/table/rack, /obj/item/storage/toolbox/mechanical{ @@ -14703,7 +14703,7 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Nd" = ( /obj/machinery/power/terminal{ dir = 1 @@ -14755,7 +14755,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Nh" = ( /obj/floor_decal/industrial/warning{ dir = 6 @@ -14763,7 +14763,7 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Ni" = ( /obj/floor_decal/industrial/warning{ dir = 8 @@ -14772,7 +14772,7 @@ dir = 8 }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Nj" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -14794,7 +14794,7 @@ icon_state = "1-4" }, /turf/simulated/floor/tiled/techfloor, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Nk" = ( /obj/structure/sign/directions/infirmary{ dir = 1; @@ -14817,7 +14817,7 @@ RCon_tag = "R-UST - Main" }, /turf/simulated/floor/tiled/monotile, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Nm" = ( /obj/structure/cable/green{ d1 = 1; @@ -15127,7 +15127,7 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Oi" = ( /obj/machinery/light/small{ dir = 4 @@ -15138,7 +15138,7 @@ icon_state = "1-2" }, /turf/simulated/floor/tiled/monotile, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Oj" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -15158,7 +15158,7 @@ name = "Fusion Maintenance" }, /turf/simulated/floor/tiled/techfloor/grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Ok" = ( /obj/wallframe_spawn/reinforced_phoron, /obj/machinery/door/blast/regular{ @@ -15167,7 +15167,7 @@ }, /obj/machinery/door/firedoor, /turf/simulated/floor/plating, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Ol" = ( /obj/machinery/atmospherics/pipe/simple/hidden/red{ dir = 9 @@ -15408,7 +15408,7 @@ dir = 8 }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Pf" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 @@ -15435,7 +15435,7 @@ req_access = list("ACCESS_ENGINE_EQUIP") }, /turf/simulated/floor/tiled/monotile, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Ph" = ( /obj/floor_decal/industrial/warning{ dir = 1 @@ -15443,14 +15443,14 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Pi" = ( /obj/floor_decal/industrial/warning/corner{ dir = 1; icon_state = "warningcorner" }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Pj" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /obj/machinery/atmospherics/pipe/manifold/hidden/supply, @@ -15718,7 +15718,7 @@ /area/engineering/engine_smes) "Qe" = ( /turf/simulated/wall/r_wall/prepainted, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Qf" = ( /obj/floor_decal/industrial/warning{ dir = 1 @@ -15729,14 +15729,14 @@ icon_state = "1-2" }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Qg" = ( /obj/item/device/radio/intercom{ dir = 1; pixel_y = -28 }, /turf/simulated/floor/tiled/steel_grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Qh" = ( /obj/floor_decal/industrial/warning/corner{ dir = 1; @@ -15745,7 +15745,7 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Qi" = ( /obj/machinery/light, /obj/floor_decal/industrial/warning{ @@ -15758,7 +15758,7 @@ icon_state = "1-4" }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Qj" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -15778,7 +15778,7 @@ name = "Fusion Maintenance" }, /turf/simulated/floor/tiled/techfloor/grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Qn" = ( /obj/machinery/atmospherics/omni/filter{ tag_east = 2; @@ -16044,7 +16044,7 @@ req_access = list("ACCESS_ENGINE_EQUIP") }, /turf/simulated/floor/tiled/monotile, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Rg" = ( /obj/floor_decal/industrial/warning/corner{ dir = 8; @@ -16056,7 +16056,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Rh" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -16066,7 +16066,7 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Ri" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -16078,7 +16078,7 @@ icon_state = "2-4" }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Rj" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ @@ -16090,7 +16090,7 @@ icon_state = "4-8" }, /turf/simulated/floor/tiled/steel_grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Rl" = ( /obj/machinery/atmospherics/pipe/simple/visible/green{ dir = 4 @@ -16371,19 +16371,19 @@ /area/engineering/engine_smes) "Se" = ( /turf/simulated/wall/ocp_wall, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Sf" = ( /obj/structure/bed/chair/padded/yellow{ dir = 8 }, /turf/simulated/floor/tiled/steel_grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Sg" = ( /obj/structure/closet/crate/radiation, /obj/item/stack/material/tritium/ten, /obj/item/stack/material/tritium/ten, /turf/simulated/floor/reinforced, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Sh" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 @@ -16401,7 +16401,7 @@ pixel_y = -28 }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Sj" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 @@ -16412,7 +16412,7 @@ icon_state = "2-8" }, /turf/simulated/floor/tiled/steel_grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Sk" = ( /obj/floor_decal/industrial/warning, /obj/machinery/camera/network/engineering{ @@ -16680,7 +16680,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Tj" = ( /obj/floor_decal/industrial/warning/corner{ dir = 1; @@ -16688,7 +16688,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Tk" = ( /obj/structure/cable/yellow{ d1 = 4; @@ -16702,7 +16702,7 @@ id_tag = "prototype_chamber_blast" }, /turf/simulated/floor/reinforced, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Tl" = ( /obj/machinery/atmospherics/pipe/manifold/visible/yellow, /obj/item/device/radio/intercom{ @@ -16926,7 +16926,7 @@ dir = 1 }, /turf/simulated/floor/tiled/monotile, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Uh" = ( /obj/floor_decal/industrial/warning{ dir = 1 @@ -16942,7 +16942,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Uj" = ( /obj/machinery/firealarm{ dir = 1; @@ -16956,7 +16956,7 @@ RCon_tag = "Substation - RUST" }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Ul" = ( /obj/structure/table/rack, /obj/item/storage/belt/medical, @@ -17118,7 +17118,7 @@ icon_state = "0-2" }, /turf/simulated/floor/reinforced, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Vf" = ( /obj/machinery/computer/air_control{ dir = 8; @@ -17128,7 +17128,7 @@ sensor_tag = "rust_sensor" }, /turf/simulated/floor/tiled/monotile, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Vg" = ( /obj/machinery/door/airlock/hatch{ icon_state = "closed"; @@ -17137,7 +17137,7 @@ }, /obj/machinery/door/firedoor, /turf/simulated/floor/reinforced, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Vh" = ( /obj/structure/cable{ d1 = 1; @@ -17146,7 +17146,7 @@ }, /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor/tiled/steel_grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Vi" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 @@ -17166,7 +17166,7 @@ icon_state = "1-8" }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Vj" = ( /obj/machinery/light/small, /obj/machinery/alarm{ @@ -17175,7 +17175,7 @@ }, /obj/structure/closet/radiation, /turf/simulated/floor/tiled/techfloor, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Vl" = ( /obj/machinery/atmospherics/pipe/simple/visible/cyan{ dir = 4 @@ -17279,7 +17279,7 @@ dir = 4 }, /turf/simulated/wall/r_wall/prepainted, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "VM" = ( /obj/structure/cable{ d1 = 1; @@ -17384,7 +17384,7 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Wh" = ( /obj/structure/cable{ d1 = 1; @@ -17426,7 +17426,7 @@ dir = 1 }, /turf/simulated/floor/tiled/steel_grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Wk" = ( /obj/machinery/alarm{ dir = 1; @@ -17819,7 +17819,7 @@ dir = 1 }, /turf/simulated/floor/reinforced, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Xf" = ( /obj/machinery/shield_diffuser, /obj/floor_decal/industrial/warning{ @@ -17829,7 +17829,7 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Xg" = ( /obj/floor_decal/industrial/warning{ dir = 4; @@ -17838,7 +17838,7 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Xh" = ( /obj/floor_decal/industrial/warning/corner{ dir = 8; @@ -17846,7 +17846,7 @@ }, /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Xi" = ( /obj/machinery/firealarm{ dir = 1; @@ -17857,7 +17857,7 @@ }, /obj/structure/cable/yellow, /turf/simulated/floor/tiled/steel_grid, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "Xk" = ( /obj/machinery/door/blast/regular{ id_tag = "disvent"; @@ -18093,7 +18093,7 @@ /turf/simulated/floor/reinforced{ map_airless = 1 }, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Yg" = ( /obj/structure/table/rack, /obj/floor_decal/industrial/outline/yellow, @@ -18126,13 +18126,13 @@ "Yh" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Yj" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Yn" = ( /obj/machinery/atmospherics/binary/pump{ dir = 8 @@ -18387,7 +18387,7 @@ dir = 1 }, /turf/simulated/floor/plating, -/area/vacant/prototype/engine) +/area/engineering/prototype/engine) "Zj" = ( /obj/machinery/drone_fabricator/torch, /turf/simulated/floor/tiled/techfloor, @@ -18491,7 +18491,7 @@ dir = 4 }, /turf/simulated/wall/prepainted, -/area/vacant/prototype/control) +/area/engineering/prototype/control) "ZI" = ( /obj/machinery/atmospherics/pipe/simple/visible/cyan, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ diff --git a/maps/torch/torch_areas.dm b/maps/torch/torch_areas.dm index a277c891827f5..9d37950b53479 100644 --- a/maps/torch/torch_areas.dm +++ b/maps/torch/torch_areas.dm @@ -772,6 +772,7 @@ /area/vacant name = "\improper Vacant Area" icon_state = "construction" + area_flags = AREA_FLAG_RAD_SHIELDED /area/vacant/armory name = "\improper Vacant Armory" @@ -799,17 +800,6 @@ name = "\improper Auxiliary Monitoring Room" icon_state = "engine_monitoring" -/area/vacant/prototype - req_access = list(access_engine) - -/area/vacant/prototype/control - name = "\improper Prototype Fusion Reactor Control Room" - icon_state = "engine_monitoring" - -/area/vacant/prototype/engine - name = "\improper Prototype Fusion Reactor Chamber" - icon_state = "rust_reactor" - /area/vacant/cargo name = "\improper Requisitions Office" icon_state = "quart" @@ -1548,6 +1538,17 @@ icon_state = "engine_monitoring" req_access = list(access_engine, access_engine_equip) +/area/engineering/prototype + req_access = list(access_engine) + +/area/engineering/prototype/control + name = "\improper Prototype Fusion Reactor Control Room" + icon_state = "engine_monitoring" + +/area/engineering/prototype/engine + name = "\improper Prototype Fusion Reactor Chamber" + icon_state = "rust_reactor" + /area/engineering/engine_smes name = "\improper Engineering SMES" icon_state = "engine_smes" diff --git a/maps/torch/torch_unit_testing.dm b/maps/torch/torch_unit_testing.dm index 4731124bc397b..90ae8fbcd1e5a 100644 --- a/maps/torch/torch_unit_testing.dm +++ b/maps/torch/torch_unit_testing.dm @@ -48,8 +48,6 @@ /area/vacant/bar = NO_SCRUBBER|NO_VENT|NO_APC, /area/vacant = NO_SCRUBBER|NO_VENT|NO_APC, /area/vacant/brig = NO_SCRUBBER|NO_VENT, - /area/vacant/prototype/control = 0, - /area/vacant/prototype/engine = 0, /area/vacant/cargo = NO_SCRUBBER|NO_VENT, /area/vacant/infirmary = NO_SCRUBBER|NO_VENT, /area/vacant/monitoring = NO_SCRUBBER|NO_VENT, From 22fc1d7858fdec5fc60402d9a30f8712ff2a11e0 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 18:50:23 +0300 Subject: [PATCH 34/80] [MIRROR] fusion injectors don't stack infinite overlays (#2288) Co-authored-by: Spookerton <918997+Spookerton@users.noreply.github.com> --- .../power/fusion/fuel_assembly/fuel_injector.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm index 4f9d9c1ae2398..7a7558a9f6e79 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm @@ -27,9 +27,12 @@ /obj/machinery/fusion_fuel_injector/on_update_icon() ClearOverlays() - if(panel_open) + if (panel_open) AddOverlays("[icon_state]_panel") - if(injecting && cur_assembly) + if (injecting && cur_assembly) + AddOverlays(emissive_appearance(icon, "[icon_state]_lights_emitting")) + AddOverlays("[icon_state]_lights_emitting") + else AddOverlays(emissive_appearance(icon, "[icon_state]_lights")) AddOverlays("[icon_state]_lights") @@ -131,11 +134,8 @@ amount_left += cur_assembly.rod_quantities[reagent] if(cur_assembly) cur_assembly.percent_depleted = amount_left / cur_assembly.initial_amount - AddOverlays(emissive_appearance(icon, "[icon_state]_lights_emitting")) - AddOverlays("[icon_state]_lights_emitting") else StopInjecting() - update_icon() /obj/machinery/fusion_fuel_injector/verb/rotate_clock() set category = "Object" From f56238cc907a0dea8f7ec6769ad3e3d69830c715 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 18:50:33 +0300 Subject: [PATCH 35/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2279=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2279.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2279.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2279.yml b/html/changelogs/AutoChangeLog-sierra-pr-2279.yml new file mode 100644 index 0000000000000..5d6739cd49c21 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2279.yml @@ -0,0 +1,5 @@ +author: Merlin1230 +changes: + - {bugfix: The maintenance rooms are now actually shielded from radiation like the + rest of maintence} +delete-after: true From 82269caaeec0a4a37cdc5edc2804ab8ac7b7cd59 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 14 Jun 2024 18:50:50 +0300 Subject: [PATCH 36/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2288=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2288.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2288.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2288.yml b/html/changelogs/AutoChangeLog-sierra-pr-2288.yml new file mode 100644 index 0000000000000..37dbfff08b41a --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2288.yml @@ -0,0 +1,5 @@ +author: Spookerton +changes: + - {bugfix: Fusion fuel injectors no longer negatively impact rendering performance + over time.} +delete-after: true From c1e9ba3353e138d3bd4182dcbb1f086b07663130 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Sat, 15 Jun 2024 01:24:50 +0000 Subject: [PATCH 37/80] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F=D1=86=D0=B8=D1=8F=20=D1=87=D0=B5?= =?UTF-8?q?=D0=B9=D0=BD=D0=B4=D0=B6=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=20[ci=20?= =?UTF-8?q?skip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelog.html | 31 +++++++++++++++++++ html/changelogs/.all_changelog.yml | 22 +++++++++++++ .../AutoChangeLog-sierra-pr-2250.yml | 4 --- .../AutoChangeLog-sierra-pr-2254.yml | 5 --- .../AutoChangeLog-sierra-pr-2255.yml | 7 ----- .../AutoChangeLog-sierra-pr-2256.yml | 4 --- .../AutoChangeLog-sierra-pr-2263.yml | 4 --- .../AutoChangeLog-sierra-pr-2279.yml | 5 --- .../AutoChangeLog-sierra-pr-2288.yml | 5 --- .../AutoChangeLog-sierra-pr-2355.yml | 4 --- 10 files changed, 53 insertions(+), 38 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2250.yml delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2254.yml delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2255.yml delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2256.yml delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2263.yml delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2279.yml delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2288.yml delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2355.yml diff --git a/html/changelog.html b/html/changelog.html index 050943706ae03..2f643d2d2fdc8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -28,6 +28,37 @@

Sierra SS13

-->
+

15.06 - 2024

+

Обновления MGWhiskers:

+
+
косметика и ишшуи
+
+

Обновления Merlin1230:

+
+
The protolathe will now actually accept chemicals
+
The maintenance rooms are now actually shielded from radiation like the rest of maintence
+
+

Обновления Mucker:

+
+
Audible emotes with sounds can no longer be spammed.
+
+

Обновления Sbotkin:

+
+
Yellow hardhat (the default one) can now be picked in loadout.
+
Default EER thresholds are raised to 1100 and 1300.
+
R-UST now gets low wall windows instead of full-sized.
+
R-UST airlock is now unbolted by default, on par with the SM one.
+
+

Обновления Spookerton:

+
+
Foreign body removal surgery repeats removals until interrupted or there's nothing left to remove.
+
Fusion fuel injectors no longer negatively impact rendering performance over time.
+
+

Обновления cuddleandtea:

+
+
admins can change volume for local tracks
+
+

12.06 - 2024

Обновления Lexanx:

diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 3d38ec676ddae..ed6bc6467ceb2 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -24182,3 +24182,25 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY sierra_genchangelog.p \u0442\u043E \u0442\u0430\u043A\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0445\ \ \u043E\u0447\u043A\u043E\u0432 \u0442\u0435\u043F\u0435\u0440\u044C \u041F\ \u041D\u0412 \u043D\u0430\u0448\u043B\u0435\u043C\u043D\u044B\u0439." +2024-06-15: + MGWhiskers: + - maptweak: "\u043A\u043E\u0441\u043C\u0435\u0442\u0438\u043A\u0430 \u0438 \u0438\ + \u0448\u0448\u0443\u0438" + Merlin1230: + - bugfix: The protolathe will now actually accept chemicals + - bugfix: The maintenance rooms are now actually shielded from radiation like the + rest of maintence + Mucker: + - tweak: Audible emotes with sounds can no longer be spammed. + Sbotkin: + - rscadd: Yellow hardhat (the default one) can now be picked in loadout. + - tweak: Default EER thresholds are raised to 1100 and 1300. + - maptweak: R-UST now gets low wall windows instead of full-sized. + - maptweak: R-UST airlock is now unbolted by default, on par with the SM one. + Spookerton: + - tweak: Foreign body removal surgery repeats removals until interrupted or there's + nothing left to remove. + - bugfix: Fusion fuel injectors no longer negatively impact rendering performance + over time. + cuddleandtea: + - rscadd: admins can change volume for local tracks diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2250.yml b/html/changelogs/AutoChangeLog-sierra-pr-2250.yml deleted file mode 100644 index 6adb38b755666..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2250.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: cuddleandtea -changes: - - {rscadd: admins can change volume for local tracks} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2254.yml b/html/changelogs/AutoChangeLog-sierra-pr-2254.yml deleted file mode 100644 index 3a826766100c4..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2254.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Spookerton -changes: - - {tweak: Foreign body removal surgery repeats removals until interrupted or there's - nothing left to remove.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2255.yml b/html/changelogs/AutoChangeLog-sierra-pr-2255.yml deleted file mode 100644 index 5e592308426c0..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2255.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: Sbotkin -changes: - - {rscadd: Yellow hardhat (the default one) can now be picked in loadout.} - - {tweak: Default EER thresholds are raised to 1100 and 1300.} - - {maptweak: R-UST now gets low wall windows instead of full-sized.} - - {maptweak: 'R-UST airlock is now unbolted by default, on par with the SM one.'} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2256.yml b/html/changelogs/AutoChangeLog-sierra-pr-2256.yml deleted file mode 100644 index cc79e8fb3eade..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2256.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Mucker -changes: - - {tweak: Audible emotes with sounds can no longer be spammed.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2263.yml b/html/changelogs/AutoChangeLog-sierra-pr-2263.yml deleted file mode 100644 index cc67deacbbd04..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2263.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Merlin1230 -changes: - - {bugfix: The protolathe will now actually accept chemicals} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2279.yml b/html/changelogs/AutoChangeLog-sierra-pr-2279.yml deleted file mode 100644 index 5d6739cd49c21..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2279.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Merlin1230 -changes: - - {bugfix: The maintenance rooms are now actually shielded from radiation like the - rest of maintence} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2288.yml b/html/changelogs/AutoChangeLog-sierra-pr-2288.yml deleted file mode 100644 index 37dbfff08b41a..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2288.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Spookerton -changes: - - {bugfix: Fusion fuel injectors no longer negatively impact rendering performance - over time.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2355.yml b/html/changelogs/AutoChangeLog-sierra-pr-2355.yml deleted file mode 100644 index ed7720931701b..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2355.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: MGWhiskers -changes: - - {maptweak: косметика и ишшуи} -delete-after: true From 5048a0b7eb767fac3963a19f7bd55bc329dea449 Mon Sep 17 00:00:00 2001 From: Teteshnik1 <149588524+Teteshnik1@users.noreply.github.com> Date: Mon, 17 Jun 2024 06:18:45 +0300 Subject: [PATCH 38/80] =?UTF-8?q?=D0=92=D0=BE=D0=B7=D0=B2=D1=80=D0=B0?= =?UTF-8?q?=D1=89=D0=B0=D1=8E=20=D1=82=D0=B5=D0=BB=D0=B5=D1=81=D0=B0=D0=BB?= =?UTF-8?q?=D0=BE,=20=D1=87=D0=B8=D0=BD=D0=B8=D0=BC=20=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D1=82=D0=BE=D0=BB=D0=B5=D1=82=20=D0=BA=D0=B0=D0=B4=D0=B5=D1=82?= =?UTF-8?q?=D0=B0,=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D1=83=20=D0=B2=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BB?= =?UTF-8?q?=D0=B0=D1=82=D1=8B,=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0?= =?UTF-8?q?=D1=89=D0=B0=D0=B5=D0=BC=20reagents=20(#2360)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: UEDCommander <52104104+UEDCommander@users.noreply.github.com> --- code/game/objects/items/devices/multitool.dm | 1 + icons/obj/telescience.dmi | Bin 333 -> 2457 bytes mods/antagonists/_antagonists.dme | 1 - mods/antagonists/code/teleportation.dm | 16 +- mods/guns/code/energy.dm | 9 +- mods/guns/icons/mob/lefthand_guns_cadet.dmi | Bin 0 -> 728 bytes mods/guns/icons/mob/righthand_guns_cadet.dmi | Bin 0 -> 718 bytes mods/machinery/_machinery.dme | 7 +- mods/machinery/code/bcrystal.dm | 57 ++ mods/machinery/code/gps.dm | 95 +++ mods/machinery/code/tele.dm | 15 + mods/machinery/code/tele_pads.dm | 52 ++ mods/machinery/code/telepads.dm | 38 +- mods/machinery/code/telesci_computer.dm | 419 ++++++++++++ mods/utility_items/_utility_items.dme | 1 + mods/utility_items/code/reagents.dm | 660 +++++++++++++++++++ 16 files changed, 1350 insertions(+), 21 deletions(-) create mode 100644 mods/guns/icons/mob/lefthand_guns_cadet.dmi create mode 100644 mods/guns/icons/mob/righthand_guns_cadet.dmi create mode 100644 mods/machinery/code/bcrystal.dm create mode 100644 mods/machinery/code/gps.dm create mode 100644 mods/machinery/code/tele.dm create mode 100644 mods/machinery/code/tele_pads.dm create mode 100644 mods/machinery/code/telesci_computer.dm create mode 100644 mods/utility_items/code/reagents.dm diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 7be079a5ed206..1b47e1696e685 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -19,6 +19,7 @@ origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1) + var/buffer var/buffer_name var/atom/buffer_object diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi index 675e8412de2d24eee8e0dfd5984985d77796b1e5..0a95347b6b4d90530864bc4963b69292e89df545 100644 GIT binary patch literal 2457 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 XO1T`-(2oiY00000NkvXXu0mjfTwSZm literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!VDw>HYaZfQlbGqA+84w9LQGIT&AQklY!xk zF~fgj_z z{}NpA@#_;UZ(Xf(XU+$22sOB9{NRz!c^}P_3`IS?J1mTYj4vB|Da?5^>ByuIg<#Ll zZe!KWDsJbC1!?RCbtb;Cn0ub|?f$=zCwe`I2^ri#Y=jXAK5nL#UBHI%Jsavae1 z3{Mxw5R2aA1PRs?4gnJyY$P7C^(Z(o^fNKCsj+rw&0*6pSSWQc$HAeo(|8td50gfj z!R}=e55fgzwXJe!Y;5G*&*a9aW)o&$)ab!_r!OTXh>3~y&b^ij0e=TUzO1H+t`@u8 bZ5S999^=qDYOmi5w3ETp)z4*}Q$iB}TeWj! diff --git a/mods/antagonists/_antagonists.dme b/mods/antagonists/_antagonists.dme index 911fe25f76179..21f28a427d881 100644 --- a/mods/antagonists/_antagonists.dme +++ b/mods/antagonists/_antagonists.dme @@ -9,7 +9,6 @@ #include "code/revolutionary.dm" #include "code/operative.dm" #include "code/traitor.dm" -#include "code/teleportation.dm" #include "code/uplink.dm" #endif diff --git a/mods/antagonists/code/teleportation.dm b/mods/antagonists/code/teleportation.dm index 00567d20fd38a..25c87b66c7efd 100644 --- a/mods/antagonists/code/teleportation.dm +++ b/mods/antagonists/code/teleportation.dm @@ -1,15 +1 @@ -/proc/animated_teleportation(atom/movable/target, atom/anchor) - if(ismob(target)) - to_chat(target, SPAN_WARNING("You feel like something pulling you in bluespace.")) - var/obj/temporary/A = new(get_turf(target), 24.5, 'mods/antagonists/icons/effects/bs_silk.dmi', "silc_teleport_back") - target.set_dir(2) - target.forceMove(A) - addtimer(new Callback(GLOBAL_PROC, GLOBAL_PROC_REF(animated_teleportation_ending), target, anchor), 23) - -/proc/animated_teleportation_ending(atom/movable/target, atom/anchor) - target.set_dir(2) - target.forceMove(new /obj/temporary(get_turf(anchor), 26.5, 'mods/antagonists/icons/effects/bs_silk.dmi', "silc_get_hub")) - addtimer(new Callback(GLOBAL_PROC, GLOBAL_PROC_REF(finalize_animated_teleportation), target, anchor), 24) - -/proc/finalize_animated_teleportation(atom/movable/target, atom/anchor) - target.dropInto(get_turf(anchor)) +// delete diff --git a/mods/guns/code/energy.dm b/mods/guns/code/energy.dm index 93a7b4c01b421..f03c80786e033 100644 --- a/mods/guns/code/energy.dm +++ b/mods/guns/code/energy.dm @@ -77,8 +77,13 @@ /obj/item/gun/energy/confuseray/secure name = "disorientator" desc = "The W-T Mk. 6 Disorientator fitted with an NT1017 secure fire chip. It has a NanoTrasen logo on the grip." - icon = 'mods/guns/icons/obj/confuseray_secure.dmi' - icon_state = "confusesecure" + icon = 'icons/obj/guns/confuseray.dmi' + item_icons = list( + slot_l_hand_str = 'mods/guns/icons/mob/lefthand_guns_cadet.dmi', + slot_r_hand_str = 'mods/guns/icons/mob/righthand_guns_cadet.dmi', + ) + icon_state = "confuseray" + item_state = "confuseray" req_access = list(list(access_brig, access_bridge)) /obj/item/gun/energy/stunrevolver/secure diff --git a/mods/guns/icons/mob/lefthand_guns_cadet.dmi b/mods/guns/icons/mob/lefthand_guns_cadet.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f9be770a2ef9ed6ce5c492950f04bd501f7cbfc0 GIT binary patch literal 728 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I8A$FCoGuTfYyx~jTn`*L0Av>A<()fs?(EsK z`MJ51Cr>t7^}nO7xudz!#l@wdpqPt`D=#l^^3GvSI(O!L z@P<%>i^dNg>74h`Jjqbh)4RjMILP?2v6sS}N0W|B3Q-8ww6xb>yTxLwh3U>M8lj!t z#;TiFNGzGzZM;^)&|LJ0*^z~}E*xku;eEDj$x3t8i#5tZXOCy@+0?XpKDUJhW2fk12GWQ{GERgeD4Z%eFP!8v8-mP0q5{=eIpSa#v* z*|<}A>$bLN@8?@PxwjY9c+OCH`ebfPfNoLs^7{+;f6Kosl;>OCa_mo0 zV{vT!x`Ku8rS2VEUT3D@Uuicl{@w$V{ZSi=FN$k_N|BGYdo+D#L*c2Hm*eM{oSpw^ zqxZkxA58Zi-Q)c9Uy)0Vzx?FQk42vLXw@6t|0xl?W6cM}qc6VRPnv%0G=J#}3)RfF zD?f{ayzJ)iH=S?4b$71*f1ay5mub5GlM;I`2MlbWQSeS|MQ<3zv12gXP>-*Hk8_djCe3{CeWU)*#GKJfc8Kv?AM)_ z`d|GSj1OXD|LOYh{l$Nf4u=0dU;pgTe~DWM4fSjuf~ literal 0 HcmV?d00001 diff --git a/mods/guns/icons/mob/righthand_guns_cadet.dmi b/mods/guns/icons/mob/righthand_guns_cadet.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f2abf04d8643221f7fde07d0cc398133fd01264a GIT binary patch literal 718 zcmV;<0x|uGP)005u}0{{R3yb+fl0000yP)t-sz`(!& z003}qZqClm&CShkZEZ5D|C5uGh=YNMhJ!>zL~w9(3JMC7m6dL8Zf$LCla-fqaBu)h zf55=N(6qC&00001bW%=J06^y0W&i*HhI&+3bVOxyV{&P5bZKvH004NLQ&wf~%hk zI5+`?8)gWvVFNb+00FK^L_t(|obBA(a)K}vg<+GZv}tev!hcBHx9O&&?jixov;<{OVm8OwRLd z@C))?*f-96i$7;+_QCa^?EX9rCYONc1^MmVM^}4~+XF^FJYo0fhLbMfWl6qIO)TAj z{`I1dujy@MmYck%k63v7R=y7@Mqhh}PyePEQ}#3EQf{(42BgvJoB6?~lxk1cX^gGp~s-2dhCujbC*00000sB@?9ABy`wD_`CJ8Ts=5&&WR( zeA52U$k+FOM!vlNGxGKQpOJr}?*G*J000000Mz=gzdu+GRri19`3}?izhS#}>HqTI zu4@B|{hxh4asOwK_kRX`|7UoJ{!fkm4*=%*0s@;8dsZ1X`~Uy|07*qoM6N<$g3^v? AzyJUM literal 0 HcmV?d00001 diff --git a/mods/machinery/_machinery.dme b/mods/machinery/_machinery.dme index a9581b68aa6e5..a8e9646ffa7e0 100644 --- a/mods/machinery/_machinery.dme +++ b/mods/machinery/_machinery.dme @@ -7,6 +7,11 @@ #include "code/gravity_generator/main.dm" #include "code/gravity_generator/wires.dm" #include "code/sealing_generator.dm" -#include "code\telepads.dm" +#include "code/telepads.dm" +#include "code/tele_pads.dm" +#include "code/gps.dm" +#include "code/bcrystal.dm" +#include "code/telesci_computer.dm" +#include "code/tele.dm" #endif diff --git a/mods/machinery/code/bcrystal.dm b/mods/machinery/code/bcrystal.dm new file mode 100644 index 0000000000000..3910fc011090b --- /dev/null +++ b/mods/machinery/code/bcrystal.dm @@ -0,0 +1,57 @@ +// Bluespace crystals, used in telescience and when crushed it will blink you to a random turf. + +/obj/item/bluespace_crystal + name = "bluespace crystal" + desc = "A glowing bluespace crystal, not much is known about how they work. It looks very delicate." + icon = 'icons/obj/telescience.dmi' + icon_state = "bluespace_crystal" + w_class = 1 + origin_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 3) + var/blink_range = 8 // The teleport range when crushed/thrown at someone. + + +/obj/item/bluespace_crystal/New() + ..() + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) +// create_reagents(10) +// reagents.add_reagent("bluespace_dust", blink_range) + +/obj/item/bluespace_crystal/attack_self(mob/user) + user.visible_message("[user] crushes [src]!", "You crush [src]!") + var/datum/effect/spark_spread/sparks = new /datum/effect/spark_spread() + sparks.set_up(5, 0, get_turf(user)) + sparks.start() + playsound(src.loc, "sparks", 50, 1) + playsound(src.loc, 'sound/effects/phasein.ogg', 25, 1) + blink_mob(user) + user.unEquip(src) + qdel(src) + +/obj/item/bluespace_crystal/proc/blink_mob(mob/living/L) + var/turf/T = get_random_turf_in_range(L, blink_range, 1) + L.forceMove(T) + var/datum/effect/spark_spread/sparks = new /datum/effect/spark_spread() + sparks.set_up(5, 0, T) + sparks.start() + +/obj/item/bluespace_crystal/throw_impact(atom/hit_atom) + if(!..()) // not caught in mid-air + visible_message("[src] fizzles and disappears upon impact!") + var/turf/T = get_turf(hit_atom) + var/datum/effect/spark_spread/sparks = new /datum/effect/spark_spread() + sparks.set_up(5, 0, T) + sparks.start() + playsound(src.loc, "sparks", 50, 1) + if(isliving(hit_atom)) + blink_mob(hit_atom) + playsound(T, 'sound/effects/phasein.ogg', 25, 1) + qdel(src) + +// Artifical bluespace crystal, doesn't give you much research. + +/obj/item/bluespace_crystal/artificial + name = "artificial bluespace crystal" + desc = "An artificially made bluespace crystal, it looks delicate." + origin_tech = list(TECH_BLUESPACE = 2) + blink_range = 4 // Not as good as the organic stuff! diff --git a/mods/machinery/code/gps.dm b/mods/machinery/code/gps.dm new file mode 100644 index 0000000000000..14ff9980f368b --- /dev/null +++ b/mods/machinery/code/gps.dm @@ -0,0 +1,95 @@ +GLOBAL_LIST_EMPTY(GPS_list) + +GLOBAL_LIST_EMPTY(gps_by_type) + +/obj/item/device/gps + name = "global positioning system" + desc = "Helping lost spacemen find their way through the planets since 2016." + icon = 'icons/obj/telescience.dmi' + icon_state = "gps-c" + w_class = 2 + slot_flags = SLOT_BELT + origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BLUESPACE = 2) + matter = list(MATERIAL_ALUMINIUM = 250, MATERIAL_STEEL = 250, MATERIAL_GLASS = 50) + var/gps_prefix = "COM" + var/gpstag = "COM0" + emped = 0 + var/turf/locked_location + +/obj/item/device/gps/Initialize() + . = ..() + GLOB.GPS_list += src + LAZYADD(GLOB.gps_by_type["[type]"], src) + gpstag = "[gps_prefix][LAZYLEN(GLOB.gps_by_type["[type]"])]" + name = "global positioning system ([gpstag])" + AddOverlays(image(icon, "working")) + +/obj/item/device/gps/Destroy() + GLOB.GPS_list -= src + var/list/typelist = GLOB.gps_by_type["[type]"] + LAZYREMOVE(typelist, src) + return ..() + +/obj/item/device/gps/emp_act(severity) + emped = 1 + CutOverlays() + AddOverlays(image(icon, "emp")) + addtimer(new Callback(src, .proc/post_emp), 300) + +/obj/item/device/gps/proc/post_emp() + emped = 0 + CutOverlays() + AddOverlays(image(icon, "working")) + +/obj/item/device/gps/attack_self(mob/user) + + var/obj/item/device/gps/t = "" + var/gps_window_height = 110 + LAZYLEN(GLOB.GPS_list) * 20 // Variable window height, depending on how many GPS units there are to show + if(emped) + t += "ERROR" + else + t += "
Set Tag " + t += "
Tag: [gpstag]" + if(locked_location?.loc) + t += "
Bluespace coordinates saved: [locked_location.loc]" + gps_window_height += 20 + + for(var/obj/item/device/gps/G in GLOB.GPS_list) + var/turf/pos = get_turf(G) + var/area/gps_area = get_area(G) + var/tracked_gpstag = G.gpstag + if(G.emped == 1 || !pos) + t += "
[tracked_gpstag]: ERROR" + else + t += "
[tracked_gpstag]: [format_text(gps_area.name)] ([pos.x], [pos.y], [pos.z])" + + var/datum/browser/popup = new(user, "GPS", name, 360, min(gps_window_height, 800)) + popup.set_content(t) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + +/obj/item/device/gps/Topic(href, href_list) + ..() + if(href_list["tag"] ) + var/a = input("Please enter desired tag.", name, gpstag) as text + a = uppertext(copytext(sanitize(a), 1, 5)) + if(src.loc == usr) + gpstag = a + name = "global positioning system ([gpstag])" + attack_self(usr) + +/obj/item/device/gps/science + icon_state = "gps-s" + gps_prefix = "SCI" + gpstag = "SCI0" + +/obj/item/device/gps/engineering + icon_state = "gps-e" + gps_prefix = "ENG" + gpstag = "ENG0" + +/obj/item/device/gps/mining + icon_state = "gps-m" + gps_prefix = "MIN" + gpstag = "MIN0" + desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life." diff --git a/mods/machinery/code/tele.dm b/mods/machinery/code/tele.dm new file mode 100644 index 0000000000000..00567d20fd38a --- /dev/null +++ b/mods/machinery/code/tele.dm @@ -0,0 +1,15 @@ +/proc/animated_teleportation(atom/movable/target, atom/anchor) + if(ismob(target)) + to_chat(target, SPAN_WARNING("You feel like something pulling you in bluespace.")) + var/obj/temporary/A = new(get_turf(target), 24.5, 'mods/antagonists/icons/effects/bs_silk.dmi', "silc_teleport_back") + target.set_dir(2) + target.forceMove(A) + addtimer(new Callback(GLOBAL_PROC, GLOBAL_PROC_REF(animated_teleportation_ending), target, anchor), 23) + +/proc/animated_teleportation_ending(atom/movable/target, atom/anchor) + target.set_dir(2) + target.forceMove(new /obj/temporary(get_turf(anchor), 26.5, 'mods/antagonists/icons/effects/bs_silk.dmi', "silc_get_hub")) + addtimer(new Callback(GLOBAL_PROC, GLOBAL_PROC_REF(finalize_animated_teleportation), target, anchor), 24) + +/proc/finalize_animated_teleportation(atom/movable/target, atom/anchor) + target.dropInto(get_turf(anchor)) diff --git a/mods/machinery/code/tele_pads.dm b/mods/machinery/code/tele_pads.dm new file mode 100644 index 0000000000000..ffda9771c076f --- /dev/null +++ b/mods/machinery/code/tele_pads.dm @@ -0,0 +1,52 @@ +///SCI TELEPAD/// +/obj/machinery/telepad + name = "telepad" + desc = "A bluespace telepad used for teleporting objects to and from a location." + icon = 'icons/obj/telescience.dmi' + icon_state = "pad-idle" + anchored = TRUE + use_power = 1 + idle_power_usage = 200 + active_power_usage = 5000 + construct_state = /singleton/machine_construction/default/panel_closed + uncreated_component_parts = null + stat_immune = 0 + + var/efficiency + +/obj/machinery/telepad/RefreshParts() + efficiency = total_component_rating_of_type(/obj/item/stock_parts/capacitor) + +/obj/machinery/telepad/components_are_accessible(path) + return panel_open + +/obj/machinery/telepad/use_tool(obj/item/tool, mob/living/user, list/click_params) + if(component_attackby(tool, user)) return TRUE + if(panel_open) + if(istype(tool, /obj/item/device/multitool)) + var/obj/item/device/multitool/M = tool + M.buffer = src + to_chat(user, "You save the data in the [tool.name]'s buffer.") + return + // Алмазная фокусирующая линза. Гы-гы + if(istype(tool, /obj/item/stack/material/diamond)) + var/obj/item/stock_parts/building_material/material = get_component_of_type(/obj/item/stock_parts/building_material, TRUE) + if(material && material.number_of_type(/obj/item/stack/material/diamond)>0) + to_chat(user, "Machine have already installed \an [tool.name]") + return + if(user.drop_from_inventory(tool)) + install_component(tool) + return + + else + if(istype(tool, /obj/item/device/multitool)) + to_chat(user, "You should open [src]'s maintenance panel first.") + return + .=..() + +/obj/machinery/telepad/on_update_icon() + switch (panel_open) + if (1) + icon_state = "pad-idle-o" + if (0) + icon_state = "pad-idle" diff --git a/mods/machinery/code/telepads.dm b/mods/machinery/code/telepads.dm index 0326e4f8e67f7..fe329b6861743 100644 --- a/mods/machinery/code/telepads.dm +++ b/mods/machinery/code/telepads.dm @@ -7,7 +7,7 @@ uncreated_component_parts = null /obj/item/stock_parts/circuitboard/tele_pad - name = "circuit board (telepad)" + name = "circuit board (teleporter pad)" board_type = "machine" origin_tech = list(TECH_DATA = 4, TECH_BLUESPACE = 4) build_path = /obj/machinery/tele_pad @@ -20,7 +20,7 @@ /datum/design/circuit/tele_pad name = "telepad machine" - id = "telepad" + id = "teleporter_pad" req_tech = list(TECH_DATA = 4, TECH_BLUESPACE = 4) build_path = /obj/item/stock_parts/circuitboard/tele_pad sort_string = "MAAAA" @@ -31,3 +31,37 @@ req_tech = list(TECH_DATA = 4, TECH_BLUESPACE = 4) build_path = /obj/item/stock_parts/circuitboard/tele_projector sort_string = "MAAAA" + +/obj/item/stock_parts/circuitboard/telepad + name = "circuit board (telepad)" + board_type = "machine" + origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_MATERIAL = 3, TECH_BLUESPACE = 4) + build_path = /obj/machinery/telepad + req_components = list( + /obj/item/bluespace_crystal = 2, + /obj/item/stock_parts/capacitor = 1 + ) + additional_spawn_components = list( + /obj/item/stock_parts/console_screen = 1, + /obj/item/stock_parts/keyboard = 1, + /obj/item/stock_parts/power/apc/buildable = 1 + ) + +/obj/item/stock_parts/circuitboard/telesci_console + name = "circuit board (telescience console)" + build_path = /obj/machinery/computer/telescience + origin_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 2) + +/datum/design/circuit/telepad + name = "telepad" + id = "telepad" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_MATERIAL = 3, TECH_BLUESPACE = 4) + build_path = /obj/item/stock_parts/circuitboard/telepad + sort_string = "HAAAF" + +/datum/design/circuit/telesci_console + name = "telepad control console" + id = "telesci_console" + req_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 2) + build_path = /obj/item/stock_parts/circuitboard/telesci_console + sort_string = "HAAAD" diff --git a/mods/machinery/code/telesci_computer.dm b/mods/machinery/code/telesci_computer.dm new file mode 100644 index 0000000000000..4beaffc5866c6 --- /dev/null +++ b/mods/machinery/code/telesci_computer.dm @@ -0,0 +1,419 @@ +/obj/machinery/computer/telescience + name = "\improper Telepad Control Console" + desc = "Used to teleport objects to and from the telescience telepad." + icon_screen = "telesci" + icon_keyboard = "telesci_key" + light_color = COLOR_BLUE + //circuit = /obj/item/stock_parts/circuitboard/telesci_console + var/sending = 1 + var/obj/machinery/telepad/telepad = null + var/temp_msg = "Telescience control console initialized.
Welcome." + + // VARIABLES // + var/teles_left // How many teleports left until it becomes uncalibrated + var/datum/projectile_data/last_tele_data = null + var/z_co = 1 + var/power_off + var/xlen + var/rotation_off + var/last_target + + var/rotation = 0 + var/angle = 45 + var/power = 5 + + // Based on the power used + var/teleport_cooldown = 0 // every index requires a bluespace crystal + var/list/power_options = list(5, 10, 20, 25, 30, 40, 50, 80, 100) + var/teleporting = 0 + var/starting_crystals = 0 //Edit this on the map, seriously. + var/max_crystals = 5 + var/list/crystals = list() + var/obj/item/device/gps/inserted_gps + +/obj/machinery/computer/telescience/Destroy() + eject() + if(inserted_gps) + inserted_gps.forceMove(loc) + inserted_gps = null + return ..() + +/obj/machinery/computer/telescience/examine(mob/user) + . = ..() + + to_chat(user, "There are [xlen ? xlen : "no"] bluespace crystal\s in the crystal slots.") + +/obj/machinery/computer/telescience/Initialize() + . = ..() + xlen = LAZYLEN(crystals) + recalibrate() + for(var/i = 1; i <= starting_crystals; i++) + crystals += new /obj/item/bluespace_crystal/artificial(null) // starting crystals + +/obj/machinery/computer/telescience/use_tool(obj/item/W, mob/user, params) + if(istype(W, /obj/item/bluespace_crystal)) + if(xlen >= max_crystals) + to_chat(user, "There are not enough crystal slots.") + return + user.drop_item(src) + crystals += W + W.forceMove(null) + user.visible_message("[user] inserts [W] into \the [src]'s crystal slot.", "You insert [W] into \the [src]'s crystal slot.") + updateDialog() + else if(istype(W, /obj/item/device/gps)) + if(!inserted_gps) + inserted_gps = W + user.unEquip(W) + W.forceMove(src) + user.visible_message("[user] inserts [W] into \the [src]'s GPS device slot.", "You insert [W] into \the [src]'s GPS device slot.") + else if(istype(W, /obj/item/device/multitool)) + var/obj/item/device/multitool/M = W + if(M.buffer && istype(M.buffer, /obj/machinery/telepad)) + telepad = M.buffer + M.buffer = null + to_chat(user, "You upload the data from the [W.name]'s buffer.") + else + ..() + +/obj/machinery/computer/telescience/attack_ai(mob/user) + src.physical_attack_hand(user) + +/obj/machinery/computer/telescience/physical_attack_hand(mob/user) + if(..()) + return + if(!user.skill_check(SKILL_SCIENCE, SKILL_EXPERIENCED)) + to_chat(user, "You see a lot of complex variables that you cannot understand.") + return + interact(user) + +/obj/machinery/computer/telescience/interact(mob/user) + var/t + if(!telepad) + in_use = 0 //Yeah so if you deconstruct teleporter while its in the process of shooting it wont disable the console + t += "
No telepad located.
Please add telepad data via use of Multitool.

" + else + if(inserted_gps) + t += "Eject GPS" + t += "Set GPS memory" + else + t += "Eject GPS" + t += "Set GPS memory" + t += "
[temp_msg]

" + t += "Set Bearing" + t += "
[rotation]°
" + t += "Set Elevation" + t += "
[angle]°
" + t += "Set Power" + t += "
" + + for(var/i = 1; i <= LAZYLEN(power_options); i++) + if(x + telepad.efficiency < i) + t += "[power_options[i]]" + continue + if(power == power_options[i]) + t += "[power_options[i]]" + continue + t += "[power_options[i]]" + t += "
" + + t += "Set Sector" + t += "
[z_co ? z_co : "NULL"]
" + + t += "
Send" + t += " Receive" + t += "
Recalibrate Crystals Eject Crystals" + + // Information about the last teleport + t += "
" + if(!last_tele_data) + t += "No teleport data found." + else + t += "Source Location: ([last_tele_data.src_x], [last_tele_data.src_y])
" + //t += "Distance: [round(last_tele_data.distance, 0.1)]m
" + t += "Time: [round(last_tele_data.time, 0.1)] secs
" + t += "
" + + var/datum/browser/popup = new(user, "telesci", name, 300, 500) + popup.set_content(t) + popup.open() + return + +/obj/machinery/computer/telescience/proc/sparks() + if(telepad) + var/datum/effect/spark_spread/sparks = new /datum/effect/spark_spread() + sparks.set_up(5, 0, get_turf(telepad)) + sparks.start() + else + return + +/obj/machinery/computer/telescience/proc/telefail() + sparks() + visible_message("The telepad weakly fizzles.") + return + +/obj/machinery/computer/telescience/proc/doteleport(mob/user) + + if(teleport_cooldown > world.time) + temp_msg = "Telepad is recharging power.
Please wait [round((teleport_cooldown - world.time) / 10)] seconds." + return + + if(teleporting) + temp_msg = "Telepad is in use.
Please wait." + return + + if(telepad) + + var/truePower = clamp(power + power_off, 1, 1000) + var/trueRotation = rotation + rotation_off + var/trueAngle = clamp(angle, 1, 90) + + var/datum/projectile_data/proj_data = projectile_trajectory(telepad.x, telepad.y, trueRotation, trueAngle, truePower) + last_tele_data = proj_data + + var/trueX = clamp(round(proj_data.dest_x, 1), 1, world.maxx) + var/trueY = clamp(round(proj_data.dest_y, 1), 1, world.maxy) + var/spawn_time = round(proj_data.time) * 10 + + var/turf/target = locate(trueX, trueY, z_co) + last_target = target + var/area/A = get_area(target) + flick("pad-beam", telepad) + + if(spawn_time > 15) // 1.5 seconds + playsound(telepad.loc, 'sound/weapons/flash.ogg', 25, 1) + // Wait depending on the time the projectile took to get there + teleporting = 1 + temp_msg = "Powering up bluespace crystals.
Please wait." + + + spawn(round(proj_data.time) * 10) // in seconds + if(!telepad) + return + if(telepad.stat & src.is_powered()) + return + teleporting = 0 + teleport_cooldown = world.time + (power * 2) + teles_left -= 1 + + // use a lot of power + use_power_oneoff(power * 10) + + temp_msg = "Teleport successful.
" + if(teles_left < 10) + temp_msg += "
Calibration required soon." + else + temp_msg += "Data printed below." + + var/datum/effect/spark_spread/sparks = new /datum/effect/spark_spread() + sparks.set_up(5, 0, telepad) + sparks.start() + + var/turf/source = target + var/turf/dest = get_turf(telepad) + var/log_msg = "" + log_msg += ": [key_name(user)] has teleported " + + if(sending) + source = dest + dest = target + + flick("pad-beam", telepad) + playsound(telepad.loc, 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5) + for(var/atom/movable/ROI in source) + // if is anchored, don't let through + if(ROI.anchored) + if(isliving(ROI)) + var/mob/living/L = ROI + if(L.buckled) + // TP people on office chairs + if(L.buckled.anchored) + continue + + log_msg += "[key_name(L)] (on a chair), " + else + continue + else if(!isobserver(ROI)) + continue + if(ismob(ROI)) + var/mob/T = ROI + log_msg += "[key_name(T)], " + else + log_msg += "[ROI.name]" + if (istype(ROI, /obj/structure/closet)) + var/obj/structure/closet/C = ROI + log_msg += " (" + for(var/atom/movable/Q as mob|obj in C) + if(ismob(Q)) + log_msg += "[key_name(Q)], " + else + log_msg += "[Q.name], " + if (dd_hassuffix(log_msg, "(")) + log_msg += "empty)" + else + //log_msg = dd_limittext(log_msg, length(log_msg) - 2) + log_msg += ")" + log_msg += ", " + // ELAR's animation of human's telepoartation + if(ishuman(ROI)) + animated_teleportation(ROI, dest) + else + do_teleport(ROI, dest) + + if (dd_hassuffix(log_msg, ", ")) + //log_msg = dd_limittext(log_msg, length(log_msg) - 2) + else + log_msg += "nothing" + log_msg += " [sending ? "to" : "from"] [trueX], [trueY], [z_co] ([A ? A.name : "null area"])" + investigate_log(log_msg, "telesci") + updateDialog() + +/obj/machinery/computer/telescience/proc/teleport(mob/user) + if(!(rotation || angle || z_co)) + temp_msg = "ERROR!
Set a angle, rotation and sector." + return + if(power <= 0) + telefail() + temp_msg = "ERROR!
No power selected!" + return + if(angle < 1 || angle > 90) + telefail() + temp_msg = "ERROR!
Elevation is less than 1 or greater than 90." + return + if(z_co in GLOB.using_map.admin_levels) + telefail() + temp_msg = "ERROR! Sector is invalid! Valid sectors are [english_list(GLOB.using_map.player_levels)]." + return + if(!user.skill_check(SKILL_SCIENCE, SKILL_MASTER) && !(z_co in GLOB.using_map.station_levels)) + telefail() + temp_msg = "ERROR! Bad configuration provided by the user. Unable to charge the teleporter." + return + // Да если у тебя мастер науки, ты все равно огребешь за телепорты с кораблика на планету в другом конце карты + if(GLOB.using_map.use_overmap && !(z_co in GetConnectedZlevels(telepad.z))) + var/obj/item/stock_parts/building_material/material = telepad.get_component_of_type(/obj/item/stock_parts/building_material) + if(!(material && material.number_of_type(/obj/item/stack/material/diamond)!=0)) + telefail() + temp_msg = "ERROR! Can not reach that sector. It's too far or need an upgrade!" + return + else + telepad.visible_message(SPAN_NOTICE("\The [telepad] shines brighter when it's diamond lens focuses bluespace power!")) + var/obj/overmap/visitable/we = map_sectors["[telepad.z]"] + var/turf/T = get_turf(we) + var/located = FALSE + for(var/obj/overmap/visitable/candidate in T) + if(candidate == we) + continue + if(z_co in candidate.map_z) + located = TRUE + break + // Мы не нашли цель в нашем секторе, попробуем более серьезные варианты. + if(!located) + var/obj/item/stock_parts/power/battery/battery = telepad.get_component_of_type(/obj/item/stock_parts/power/battery) + // Больше чем advanced меньше чем enchanced и да мы тратим энергию независимо от успеха + if(!(battery && battery.can_use_power_oneoff(telepad, (1500 / CELLRATE), LOCAL) && battery.use_power_oneoff(telepad, (1500 / CELLRATE), LOCAL))) + telefail() + temp_msg = "ERROR! Can not reach that sector. Not enough power buffer capacity!" + return + else + playsound(telepad, 'sound/machines/apc_nopower.ogg', 25, 0) + telepad.visible_message(SPAN_NOTICE("\The [telepad] makes an loud sound as it internal capacitor quickly loose it's power!")) + var/list/near_sectors = T.AdjacentTurfs() + for(var/turf/Z in near_sectors) + for(var/obj/overmap/visitable/candidate in Z) + if(candidate == we) + continue + if(z_co in candidate.map_z) + located = TRUE + break + if(located) + break + if(!located) + telefail() + temp_msg = "ERROR! Can not reach that sector. Too far. You did your best..." + return + if(teles_left > 0) + doteleport(user) + else + telefail() + temp_msg = "ERROR!
Calibration required." + return + return + +/obj/machinery/computer/telescience/proc/eject() + for(var/obj/item/I in crystals) + I.forceMove(src.loc) + crystals -= I + power = 0 + +/obj/machinery/computer/telescience/Topic(href, href_list) + if(..()) + return + if(!telepad) + updateDialog() + return + if(telepad.panel_open) + temp_msg = "Telepad undergoing physical maintenance operations." + + if(href_list["setrotation"]) + var/new_rot = input("Please input desired bearing in degrees.", name, rotation) as num + if(..()) // Check after we input a value, as they could've moved after they entered something + return + rotation = clamp(new_rot, -900, 900) + rotation = round(rotation, 0.01) + + if(href_list["setangle"]) + var/new_angle = input("Please input desired elevation in degrees.", name, angle) as num + if(..()) + return + angle = clamp(round(new_angle, 0.1), 1, 9999) + + if(href_list["setpower"]) + var/index = href_list["setpower"] + index = text2num(index) + if(index != null && power_options[index]) + if(xlen + telepad.efficiency >= index) + power = power_options[index] + + if(href_list["setz"]) + var/new_z = input("Please input desired sector.", name, z_co) as num + if(..()) + return + z_co = clamp(round(new_z), 1, 35) + + if(href_list["ejectGPS"]) + if(inserted_gps) + inserted_gps.forceMove(loc) + inserted_gps = null + + if(href_list["setMemory"]) + if(last_target && inserted_gps) + inserted_gps.locked_location = last_target + temp_msg = "Location saved." + else + temp_msg = "ERROR!
No data was stored." + + if(href_list["send"]) + sending = 1 + teleport(usr) + + if(href_list["receive"]) + sending = 0 + teleport(usr) + + if(href_list["recal"]) + recalibrate(usr) + sparks() + temp_msg = "NOTICE:
Calibration successful." + + if(href_list["eject"]) + eject() + temp_msg = "NOTICE:
Bluespace crystals ejected." + + updateDialog() + +/obj/machinery/computer/telescience/proc/recalibrate(mob/user) + var/mult = 1 + if(user?.skill_check(SKILL_SCIENCE, SKILL_MASTER)) + mult = 2 + teles_left = rand(30, 40) * mult + power_off = rand(-4, 0) / mult + rotation_off = rand(-10, 10) / mult diff --git a/mods/utility_items/_utility_items.dme b/mods/utility_items/_utility_items.dme index 2fd8896a51132..f21bac280307f 100644 --- a/mods/utility_items/_utility_items.dme +++ b/mods/utility_items/_utility_items.dme @@ -8,5 +8,6 @@ #include "code/multimeter.dm" #include "code/noose.dm" #include "code/wires.dm" +#include "code/reagents.dm" #endif diff --git a/mods/utility_items/code/reagents.dm b/mods/utility_items/code/reagents.dm new file mode 100644 index 0000000000000..8d98d70ce9cfa --- /dev/null +++ b/mods/utility_items/code/reagents.dm @@ -0,0 +1,660 @@ +#define IC_SMOKE_REAGENTS_MINIMUM_UNITS 10 +#define IC_REAGENTS_DRAW 0 +#define IC_REAGENTS_INJECT 1 +#define IC_HEATER_MODE_HEAT "heat" +#define IC_HEATER_MODE_COOL "cool" + +/obj/item/integrated_circuit/reagent + category_text = "Reagent" + unacidable = TRUE + cooldown_per_use = 10 + var/volume = 0 + +/obj/item/integrated_circuit/reagent/Initialize() + . = ..() + if(volume) + create_reagents(volume) + push_vol() + +/obj/item/integrated_circuit/reagent/proc/push_vol() + set_pin_data(IC_OUTPUT, 1, reagents.total_volume) + push_data() + +/obj/item/integrated_circuit/reagent/smoke + name = "smoke generator" + desc = "Unlike most electronics, creating smoke is completely intentional." + icon_state = "smoke" + extended_desc = "This smoke generator creates clouds of smoke on command. It can also hold liquids inside, which will go \ + into the smoke clouds when activated. The reagents are consumed when the smoke is made." + ext_cooldown = 1 + atom_flags = ATOM_FLAG_OPEN_CONTAINER + volume = 100 + + complexity = 20 + cooldown_per_use = 1 SECONDS + inputs = list() + outputs = list( + "volume used" = IC_PINTYPE_NUMBER, + "self reference" = IC_PINTYPE_REF + ) + activators = list( + "create smoke" = IC_PINTYPE_PULSE_IN, + "on smoked" = IC_PINTYPE_PULSE_OUT, + "push ref" = IC_PINTYPE_PULSE_IN + ) + spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 20 + var/smoke_radius = 5 + var/notified = FALSE + +/obj/item/integrated_circuit/reagent/smoke/on_reagent_change() + push_vol() + +/obj/item/integrated_circuit/reagent/smoke/do_work(ord) + switch(ord) + if(1) + if(!reagents || (reagents.total_volume < IC_SMOKE_REAGENTS_MINIMUM_UNITS)) + return + var/location = get_turf(src) + var/datum/effect/smoke_spread/chem/S = new + S.attach(location) + playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) + if(S) + S.set_up(reagents, smoke_radius, 0, location) + if(!notified) + notified = TRUE + S.start() + reagents.clear_reagents() + activate_pin(2) + if(3) + set_pin_data(IC_OUTPUT, 2, weakref(src)) + push_data() + +/obj/item/integrated_circuit/reagent/injector + name = "integrated hypo-injector" + desc = "This scary looking thing is able to pump liquids into, or suck liquids out of, whatever it's pointed at." + icon_state = "injector" + extended_desc = "This autoinjector can push up to 30 units of reagents into another container or someone else outside of the machine. The target \ + must be adjacent to the machine, and if it is a person who is not carrying it in their pockets or belt, they cannot be wearing thick clothing. Negative given amounts makes the injector suck out reagents instead." + + atom_flags = ATOM_FLAG_OPEN_CONTAINER + volume = 30 + + complexity = 20 + cooldown_per_use = 6 SECONDS + inputs = list( + "target" = IC_PINTYPE_REF, + "injection amount" = IC_PINTYPE_NUMBER + ) + inputs_default = list( + "2" = 5 + ) + outputs = list( + "volume used" = IC_PINTYPE_NUMBER, + "self reference" = IC_PINTYPE_REF + ) + activators = list( + "inject" = IC_PINTYPE_PULSE_IN, + "on injected" = IC_PINTYPE_PULSE_OUT, + "on fail" = IC_PINTYPE_PULSE_OUT, + "push ref" = IC_PINTYPE_PULSE_IN + + ) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 15 + var/direction_mode = IC_REAGENTS_INJECT + var/transfer_amount = 10 + var/busy = FALSE + +/obj/item/integrated_circuit/reagent/injector/on_reagent_change(changetype) + push_vol() + +/obj/item/integrated_circuit/reagent/injector/on_data_written() + var/new_amount = get_pin_data(IC_INPUT, 2) + if(new_amount < 0) + new_amount = -new_amount + direction_mode = IC_REAGENTS_DRAW + else + direction_mode = IC_REAGENTS_INJECT + if(isnum(new_amount)) + new_amount = clamp(new_amount, 0, volume) + transfer_amount = new_amount + + +/obj/item/integrated_circuit/reagent/injector/do_work(ord) + switch(ord) + if(1) + inject() + if(4) + set_pin_data(IC_OUTPUT, 2, weakref(src)) + push_data() + +/obj/item/integrated_circuit/reagent/injector/proc/target_nearby(weakref/target) + var/mob/living/L = target.resolve() + if(!L || get_dist(src,L) > 1) + return + return L + +/obj/item/integrated_circuit/reagent/injector/proc/inject_after(weakref/target) + busy = FALSE + var/mob/living/L = target_nearby(target) + if(!L) + activate_pin(3) + return + var/atom/movable/acting_object = get_object() + log_admin("[key_name(L)] was successfully injected with " + reagents.get_reagents() + " by \the [acting_object]") + L.visible_message(SPAN_WARNING("\The [acting_object] injects [L] with its needle!"), \ + SPAN_WARNING("\The [acting_object] injects you with its needle!")) + reagents.trans_to_mob(L, transfer_amount, CHEM_BLOOD) + activate_pin(2) + +/obj/item/integrated_circuit/reagent/injector/proc/draw_after(weakref/target, amount) + busy = FALSE + var/mob/living/carbon/C = target_nearby(target) + if(!C) + activate_pin(3) + return + var/atom/movable/acting_object = get_object() + + C.visible_message(SPAN_WARNING("\The [acting_object] draws blood from \the [C]"), + SPAN_WARNING("\The [acting_object] draws blood from you.") + ) + C.take_blood(src, amount) + activate_pin(2) + + +/obj/item/integrated_circuit/reagent/injector/proc/inject() + set waitfor = FALSE // Don't sleep in a proc that is called by a processor without this set, otherwise it'll delay the entire thing + var/atom/movable/AM = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) + var/atom/movable/acting_object = get_object() + + if(busy || !check_target(AM)) + activate_pin(3) + return + + if(!AM.reagents) + activate_pin(3) + return + + if(direction_mode == IC_REAGENTS_INJECT) + if(!reagents.total_volume || !AM.reagents || !AM.reagents.get_free_space()) + activate_pin(3) + return + + if(isliving(AM)) + var/mob/living/L = AM + var/injection_status = L.can_inject(null, BP_CHEST) + if(L.isEquipped(assembly, slot_l_hand)) + injection_status = L.can_inject(null, BP_L_HAND) + if(L.isEquipped(assembly, slot_r_hand)) + injection_status = L.can_inject(null, BP_R_HAND) + if(L.isEquipped(assembly, slot_l_store) || L.isEquipped(assembly, slot_r_store) || L.isEquipped(assembly, slot_belt)) + injection_status = L.can_inject(null, BP_CHEST, ignore_thick_clothing = TRUE) //The injector has been put under the thick layer + log_world("Injection status? [injection_status]") + var/injection_delay = 3 SECONDS + if(injection_status == INJECTION_PORT) + injection_delay += INJECTION_PORT_DELAY + if(!injection_status) + activate_pin(3) + return + //Always log attemped injections for admins + log_admin("[key_name(L)] is getting injected with " + reagents.get_reagents() + " by \the [acting_object]") + L.visible_message(SPAN_DANGER("\The [acting_object] is trying to inject [L]!"), \ + SPAN_DANGER("\The [acting_object] is trying to inject you!")) + busy = TRUE + addtimer(new Callback(src, .proc/inject_after, weakref(L)), injection_delay) + return + else + if(!AM.is_open_container()) + activate_pin(3) + return + + + reagents.trans_to(AM, transfer_amount) + + else if(direction_mode == IC_REAGENTS_DRAW) + if(reagents.total_volume >= reagents.maximum_volume) + acting_object.visible_message("\The [acting_object] tries to draw from [AM], but the injector is full.") + activate_pin(3) + return + + var/tramount = abs(transfer_amount) + + if(istype(AM, /mob/living/carbon)) + var/mob/living/carbon/C = AM + var/injection_status = C.can_inject(null, BP_CHEST) + if(C.isEquipped(assembly, slot_l_hand)) + injection_status = C.can_inject(null, BP_L_HAND) + if(C.isEquipped(assembly, slot_r_hand)) + injection_status = C.can_inject(null, BP_R_HAND) + if(C.isEquipped(assembly, slot_l_store) || C.isEquipped(assembly, slot_r_store) || C.isEquipped(assembly, slot_belt)) + injection_status = C.can_inject(null, BP_CHEST, ignore_thick_clothing = TRUE) + var/injection_delay = 3 SECONDS + if(injection_status == INJECTION_PORT) + injection_delay += INJECTION_PORT_DELAY + if(istype(C, /mob/living/carbon/slime) || !C.dna || !injection_status) + activate_pin(3) + return + C.visible_message(SPAN_DANGER("\The [acting_object] is trying to take a blood sample from [C]!"), \ + SPAN_DANGER("\The [acting_object] is trying to take a blood sample from you!")) + busy = TRUE + addtimer(new Callback(src, .proc/draw_after, weakref(C), tramount), injection_delay) + return + + else + if(!AM.reagents.total_volume) + acting_object.visible_message(SPAN_NOTICE("\The [acting_object] tries to draw from [AM], but it is empty!")) + activate_pin(3) + return + + if(!AM.is_open_container()) + activate_pin(3) + return + tramount = min(tramount, AM.reagents.total_volume) + AM.reagents.trans_to(src, tramount) + activate_pin(2) + + + +/obj/item/integrated_circuit/reagent/pump + name = "reagent pump" + desc = "Moves liquids safely inside a machine, or even nearby it." + icon_state = "reagent_pump" + extended_desc = "This is a pump which will move liquids from the source ref to the target ref. The third pin determines \ + how much liquid is moved per pulse, between 0 and 50. The pump can move reagents to any open container inside the machine, or \ + outside the machine if it is adjacent to the machine." + + complexity = 8 + inputs = list("source" = IC_PINTYPE_REF, "target" = IC_PINTYPE_REF, "injection amount" = IC_PINTYPE_NUMBER) + inputs_default = list("3" = 5) + outputs = list() + activators = list("transfer reagents" = IC_PINTYPE_PULSE_IN, "on transfer" = IC_PINTYPE_PULSE_OUT) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + var/transfer_amount = 10 + var/direction_mode = IC_REAGENTS_INJECT + power_draw_per_use = 10 + +/obj/item/integrated_circuit/reagent/pump/on_data_written() + var/new_amount = get_pin_data(IC_INPUT, 3) + if(new_amount < 0) + new_amount = -new_amount + direction_mode = IC_REAGENTS_DRAW + else + direction_mode = IC_REAGENTS_INJECT + if(isnum(new_amount)) + new_amount = clamp(new_amount, 0, 50) + transfer_amount = new_amount + +/obj/item/integrated_circuit/reagent/pump/do_work() + var/atom/movable/source = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) + var/atom/movable/target = get_pin_data_as_type(IC_INPUT, 2, /atom/movable) + + // Check for invalid input. + if(!check_target(source) || !check_target(target)) + return + + // If the pump is pumping backwards, swap target and source. + if(!direction_mode) + var/temp_source = source + source = target + target = temp_source + + if(!source.reagents) + return + + if(!source.is_open_container()) + return + + source.reagents.trans_to(target, transfer_amount) + activate_pin(2) + +/obj/item/integrated_circuit/reagent/storage + cooldown_per_use = 1 + name = "reagent storage" + desc = "Stores liquid inside the device away from electrical components. It can store up to 60u." + icon_state = "reagent_storage" + extended_desc = "This is effectively an internal beaker." + + atom_flags = ATOM_FLAG_OPEN_CONTAINER + volume = 60 + + complexity = 4 + inputs = list() + outputs = list( + "volume used" = IC_PINTYPE_NUMBER, + "self reference" = IC_PINTYPE_REF + ) + activators = list("push ref" = IC_PINTYPE_PULSE_IN) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + + + +/obj/item/integrated_circuit/reagent/storage/do_work() + set_pin_data(IC_OUTPUT, 2, weakref(src)) + push_data() + +/obj/item/integrated_circuit/reagent/storage/on_reagent_change(changetype) + push_vol() + +/obj/item/integrated_circuit/reagent/storage/big + name = "big reagent storage" + icon_state = "reagent_storage_big" + desc = "Stores liquid inside the device away from electrical components. Can store up to 180u." + + volume = 180 + + complexity = 16 + spawn_flags = IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/reagent/storage/cryo + name = "cryo reagent storage" + desc = "Stores liquid inside the device away from electrical components. It can store up to 60u. This will also prevent reactions." + icon_state = "reagent_storage_cryo" + extended_desc = "This is effectively an internal cryo beaker." + + atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_NO_REACT + complexity = 8 + spawn_flags = IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/reagent/storage/grinder + name = "reagent grinder" + desc = "This is a reagent grinder. It accepts a ref to something, and refines it into reagents. It cannot grind materials. It can store up to 100u." + icon_state = "blender" + extended_desc = "" + inputs = list( + "target" = IC_PINTYPE_REF, + ) + outputs = list( + "volume used" = IC_PINTYPE_NUMBER, + "self reference" = IC_PINTYPE_REF + ) + activators = list( + "grind" = IC_PINTYPE_PULSE_IN, + "on grind" = IC_PINTYPE_PULSE_OUT, + "on fail" = IC_PINTYPE_PULSE_OUT, + "push ref" = IC_PINTYPE_PULSE_IN + ) + volume = 100 + power_draw_per_use = 150 + complexity = 16 + spawn_flags = IC_SPAWN_RESEARCH + + +/obj/item/integrated_circuit/reagent/storage/grinder/do_work(ord) + switch(ord) + if(1) + grind() + if(4) + set_pin_data(IC_OUTPUT, 2, weakref(src)) + push_data() + +/obj/item/integrated_circuit/reagent/storage/grinder/proc/grind() + if(reagents.total_volume >= reagents.maximum_volume) + activate_pin(3) + return FALSE + var/obj/item/I = get_pin_data_as_type(IC_INPUT, 1, /obj/item) + + if(isnull(I)) + return FALSE + + if(!I.reagents || !I.reagents.total_volume) + activate_pin(3) + return FALSE + + I.reagents.trans_to(src,I.reagents.total_volume) + if(!I.reagents.total_volume) + qdel(I) + + activate_pin(2) + return FALSE + + + +/obj/item/integrated_circuit/reagent/storage/scan + name = "reagent scanner" + desc = "Stores liquid inside the device away from electrical components. It can store up to 60u. On pulse this beaker will send list of contained reagents." + icon_state = "reagent_scan" + extended_desc = "Mostly useful for filtering reagents." + + complexity = 8 + outputs = list( + "volume used" = IC_PINTYPE_NUMBER, + "self reference" = IC_PINTYPE_REF, + "list of reagents" = IC_PINTYPE_LIST + ) + activators = list( + "scan" = IC_PINTYPE_PULSE_IN, + "push ref" = IC_PINTYPE_PULSE_IN + ) + spawn_flags = IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/reagent/storage/scan/do_work(ord) + switch(ord) + if(1) + var/cont[0] + for(var/datum/reagent/RE in reagents.reagent_list) + cont += RE.name + set_pin_data(IC_OUTPUT, 3, cont) + push_data() + if(2) + set_pin_data(IC_OUTPUT, 2, weakref(src)) + push_data() + +/obj/item/integrated_circuit/reagent/filter + name = "reagent filter" + desc = "Filters liquids by list of desired or unwanted reagents." + icon_state = "reagent_filter" + extended_desc = "This is a filter which will move liquids from the source to its target. \ + If the amount in the fourth pin is positive, it will move all reagents except those in the unwanted list. \ + If the amount in the fourth pin is negative, it will only move the reagents in the wanted list. \ + The third pin determines how many reagents are moved per pulse, between 0 and 50. Amount is given for each separate reagent." + + complexity = 8 + inputs = list( + "source" = IC_PINTYPE_REF, + "target" = IC_PINTYPE_REF, + "injection amount" = IC_PINTYPE_NUMBER, + "list of reagents" = IC_PINTYPE_LIST + ) + inputs_default = list( + "3" = 5 + ) + outputs = list() + activators = list( + "transfer reagents" = IC_PINTYPE_PULSE_IN, + "on transfer" = IC_PINTYPE_PULSE_OUT + ) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + var/transfer_amount = 10 + var/direction_mode = IC_REAGENTS_INJECT + power_draw_per_use = 10 + +/obj/item/integrated_circuit/reagent/filter/on_data_written() + var/new_amount = get_pin_data(IC_INPUT, 3) + if(new_amount < 0) + new_amount = -new_amount + direction_mode = IC_REAGENTS_DRAW + else + direction_mode = IC_REAGENTS_INJECT + if(isnum(new_amount)) + new_amount = clamp(new_amount, 0, 50) + transfer_amount = new_amount + +/obj/item/integrated_circuit/reagent/filter/do_work() + var/atom/movable/source = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) + var/atom/movable/target = get_pin_data_as_type(IC_INPUT, 2, /atom/movable) + var/list/demand = get_pin_data(IC_INPUT, 4) + + // Check for invalid input. + if(!check_target(source) || !check_target(target)) + return + + if(!source.reagents || !target.reagents) + return + + if(!source.is_open_container() || istype(source, /mob)) + return + + if(target.reagents.maximum_volume - target.reagents.total_volume <= 0) + return + + for(var/datum/reagent/G in source.reagents.reagent_list) + if(!direction_mode) + if(G.name in demand) + source.reagents.trans_type_to(target, G.type, transfer_amount) + else + if(!(G.name in demand)) + source.reagents.trans_type_to(target, G.type, transfer_amount) + activate_pin(2) + push_data() + +// This is an input circuit because attackby_react is only called for input circuits +/obj/item/integrated_circuit/input/funnel + category_text = "Reagent" + name = "reagent funnel" + desc = "A funnel with a small pump that lets you refill an internal reagent storage." + icon_state = "reagent_funnel" + + inputs = list( + "target" = IC_PINTYPE_REF + ) + activators = list( + "on transfer" = IC_PINTYPE_PULSE_OUT + ) + + unacidable = TRUE + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + complexity = 4 + power_draw_per_use = 5 + +/obj/item/integrated_circuit/input/funnel/attackby_react(obj/item/I, mob/living/user, intent) + var/atom/movable/target = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) + var/obj/item/reagent_containers/container = I + + if(!check_target(target)) + return FALSE + + if(!istype(container)) + return FALSE + + // Messages are provided by standard_pour_into + if(container.standard_pour_into(user, target)) + activate_pin(1) + return TRUE + + return FALSE + +// Most of this is just chemical heater code refitted for ICs +/obj/item/integrated_circuit/reagent/temp + inputs = list( + "target temperature" = IC_PINTYPE_NUMBER + ) + outputs = list( + "volume used" = IC_PINTYPE_NUMBER, + "temperature" = IC_PINTYPE_NUMBER, + "enabled" = IC_PINTYPE_BOOLEAN, + "self reference" = IC_PINTYPE_REF + ) + activators = list( + "toggle" = IC_PINTYPE_PULSE_IN, + "on toggle" = IC_PINTYPE_PULSE_OUT, + "push ref" = IC_PINTYPE_PULSE_IN + ) + + atom_flags = ATOM_FLAG_OPEN_CONTAINER + complexity = 12 + cooldown_per_use = 1 + power_draw_per_use = 50 + volume = 30 + + var/active = 0 + var/min_temp = 40 CELSIUS + var/max_temp = 200 CELSIUS + var/heating_power = 5 + var/target_temp = T20C + var/last_temperature = 0 + var/mode = IC_HEATER_MODE_HEAT + +/obj/item/integrated_circuit/reagent/temp/Initialize() + . = ..() + + set_pin_data(IC_OUTPUT, 2, temperature - T0C) + push_data() + +/obj/item/integrated_circuit/reagent/temp/do_work(ord) + switch(ord) + if(1) + target_temp = get_pin_data(IC_INPUT, 1) + if(isnull(target_temp)) + return + + // +/- T0C to convert to/from kelvin + target_temp = clamp(target_temp + T0C, min_temp, max_temp) + set_pin_data(IC_INPUT, 1, target_temp - T0C) + + active = !active + set_pin_data(IC_OUTPUT, 3, active) + push_data() + activate_pin(2) + + // begin processing temperature + if(active) + QUEUE_TEMPERATURE_ATOMS(src) + if(3) + set_pin_data(IC_OUTPUT, 4, weakref(src)) + push_data() + +/obj/item/integrated_circuit/reagent/temp/on_reagent_change() + push_vol() + +/obj/item/integrated_circuit/reagent/temp/power_fail() + active = 0 + +/obj/item/integrated_circuit/reagent/temp/ProcessAtomTemperature() + if(!active) + return PROCESS_KILL + + last_temperature = temperature + + if(mode == IC_HEATER_MODE_HEAT && temperature < target_temp) + temperature = min(temperature + heating_power, max_temp) + else if(mode == IC_HEATER_MODE_COOL && temperature > target_temp) + temperature = max(temperature - heating_power, min_temp) + + if(temperature != last_temperature) + // Lost power + if(!check_power()) + power_fail() + return ..() + + set_pin_data(IC_OUTPUT, 2, temperature - T0C) + push_data() + + return TRUE + +/obj/item/integrated_circuit/reagent/temp/heater + name = "reagent heater" + desc = "A small reagent container capable of heating reagents. It can hold up to 30u." + icon_state = "reagent_heater" + extended_desc = "This is effectively an internal beaker. It has a heating coil wrapped around it, which allows it to heat the contents of the beaker. Temperature is given in celsius." + + spawn_flags = IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/reagent/temp/cooler + name = "reagent cooler" + desc = "A small reagent container capable of cooling reagents. It can hold up to 30u." + icon_state = "reagent_cooler" + extended_desc = "This is effectively an internal beaker. It has a cooling mechanism wrapped around it, which allows it to cool the contents of the beaker. Temperature is given in celsius." + + spawn_flags = IC_SPAWN_RESEARCH + + min_temp = -80 CELSIUS + max_temp = 30 CELSIUS + mode = IC_HEATER_MODE_COOL + +//undefs + +#undef IC_HEATER_MODE_HEAT +#undef IC_HEATER_MODE_COOL +#undef IC_REAGENTS_DRAW +#undef IC_REAGENTS_INJECT From ac61596eed39d35ef3c1c5c46d37c810503e8a22 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Mon, 17 Jun 2024 06:19:14 +0300 Subject: [PATCH 39/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2360=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2360.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2360.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2360.yml b/html/changelogs/AutoChangeLog-sierra-pr-2360.yml new file mode 100644 index 0000000000000..52c6ae83c09a1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2360.yml @@ -0,0 +1,6 @@ +author: Teteshnik +changes: + - {bugfix: Пофиксил баг связанный со спрайтом кадетского пистолета.} + - {rscadd: Возвращаю телесало обратно в игру} + - {spellcheck: Исправил опечатку связанную с названием платы.} +delete-after: true From ab4cbcdf42b3f16f009c8127f84a701f5003f57c Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Tue, 18 Jun 2024 01:25:37 +0000 Subject: [PATCH 40/80] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F=D1=86=D0=B8=D1=8F=20=D1=87=D0=B5?= =?UTF-8?q?=D0=B9=D0=BD=D0=B4=D0=B6=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=20[ci=20?= =?UTF-8?q?skip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelog.html | 8 ++++++++ html/changelogs/.all_changelog.yml | 13 +++++++++++++ html/changelogs/AutoChangeLog-sierra-pr-2360.yml | 6 ------ 3 files changed, 21 insertions(+), 6 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2360.yml diff --git a/html/changelog.html b/html/changelog.html index 2f643d2d2fdc8..ba8bb23ac5837 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -28,6 +28,14 @@

Sierra SS13

-->
+

18.06 - 2024

+

Обновления Teteshnik:

+
+
Пофиксил баг связанный со спрайтом кадетского пистолета.
+
Возвращаю телесало обратно в игру
+
Исправил опечатку связанную с названием платы.
+
+

15.06 - 2024

Обновления MGWhiskers:

diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index ed6bc6467ceb2..58fb5dfd098d5 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -24204,3 +24204,16 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY sierra_genchangelog.p over time. cuddleandtea: - rscadd: admins can change volume for local tracks +2024-06-18: + Teteshnik: + - bugfix: "\u041F\u043E\u0444\u0438\u043A\u0441\u0438\u043B \u0431\u0430\u0433 \u0441\ + \u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0439 \u0441\u043E \u0441\u043F\u0440\ + \u0430\u0439\u0442\u043E\u043C \u043A\u0430\u0434\u0435\u0442\u0441\u043A\u043E\ + \u0433\u043E \u043F\u0438\u0441\u0442\u043E\u043B\u0435\u0442\u0430." + - rscadd: "\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u044E \u0442\u0435\u043B\ + \u0435\u0441\u0430\u043B\u043E \u043E\u0431\u0440\u0430\u0442\u043D\u043E \u0432\ + \ \u0438\u0433\u0440\u0443" + - spellcheck: "\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u043B \u043E\u043F\u0435\ + \u0447\u0430\u0442\u043A\u0443 \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u0443\ + \u044E \u0441 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435\u043C \u043F\u043B\ + \u0430\u0442\u044B." diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2360.yml b/html/changelogs/AutoChangeLog-sierra-pr-2360.yml deleted file mode 100644 index 52c6ae83c09a1..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2360.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Teteshnik -changes: - - {bugfix: Пофиксил баг связанный со спрайтом кадетского пистолета.} - - {rscadd: Возвращаю телесало обратно в игру} - - {spellcheck: Исправил опечатку связанную с названием платы.} -delete-after: true From c0179b480c0a8a76085b29bcd6dc404f6a99c204 Mon Sep 17 00:00:00 2001 From: Teteshnik1 <149588524+Teteshnik1@users.noreply.github.com> Date: Tue, 18 Jun 2024 21:25:11 +0300 Subject: [PATCH 41/80] [TWEAK] fix telesci GPS and fix recharger (#2369) --- code/game/machinery/cell_charger.dm | 2 + code/game/machinery/recharger.dm | 2 + .../research/designs/designs_bluespace.dm | 10 ++++- mods/machinery/code/gps.dm | 24 ++++++------ mods/machinery/code/telesci_computer.dm | 2 +- mods/utility_items/_utility_items.dme | 1 + mods/utility_items/code/cell_charger.dm | 38 +++++++++++++++++++ 7 files changed, 65 insertions(+), 14 deletions(-) create mode 100644 mods/utility_items/code/cell_charger.dm diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index cc915ed707be3..ac12467059521 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -10,6 +10,8 @@ power_channel = EQUIP var/obj/item/cell/charging = null var/chargelevel = -1 + construct_state = /singleton/machine_construction/default/panel_closed + uncreated_component_parts = null /obj/machinery/cell_charger/on_update_icon() icon_state = "ccharger[charging ? 1 : 0]" diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index be290e1942776..3c3b1647a8251 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -15,6 +15,8 @@ var/icon_state_charging = "recharger1" var/icon_state_idle = "recharger0" //also when unpowered var/portable = 1 + construct_state = /singleton/machine_construction/default/panel_closed + uncreated_component_parts = null /obj/machinery/recharger/use_tool(obj/item/G, mob/living/user, list/click_params) var/allowed = 0 diff --git a/code/modules/research/designs/designs_bluespace.dm b/code/modules/research/designs/designs_bluespace.dm index e3cf4a2526cdd..5d21c5d925b77 100644 --- a/code/modules/research/designs/designs_bluespace.dm +++ b/code/modules/research/designs/designs_bluespace.dm @@ -37,4 +37,12 @@ materials = list(MATERIAL_GOLD = 3000, MATERIAL_DIAMOND = 1500, MATERIAL_URANIUM = 250, MATERIAL_PLASTIC = 250) build_path = /obj/item/storage/backpack/holding sort_string = "VAFAA" - +// SIERRA ADD +/datum/design/item/telesci/gps + name = "Telescience GPS" + desc = "Required for calculations in the telescience field." + req_tech = list(TECH_ENGINEERING = 3, TECH_BLUESPACE = 4) + materials = list(MATERIAL_STEEL = 300, MATERIAL_PLASTIC = 250) + build_path = /obj/item/device/telesci/gps + sort_string = "VACAA" +// SIERRA ADD-END diff --git a/mods/machinery/code/gps.dm b/mods/machinery/code/gps.dm index 14ff9980f368b..4441887148a17 100644 --- a/mods/machinery/code/gps.dm +++ b/mods/machinery/code/gps.dm @@ -2,8 +2,8 @@ GLOBAL_LIST_EMPTY(GPS_list) GLOBAL_LIST_EMPTY(gps_by_type) -/obj/item/device/gps - name = "global positioning system" +/obj/item/device/telesci/gps + name = "telesci positioning system" desc = "Helping lost spacemen find their way through the planets since 2016." icon = 'icons/obj/telescience.dmi' icon_state = "gps-c" @@ -13,10 +13,10 @@ GLOBAL_LIST_EMPTY(gps_by_type) matter = list(MATERIAL_ALUMINIUM = 250, MATERIAL_STEEL = 250, MATERIAL_GLASS = 50) var/gps_prefix = "COM" var/gpstag = "COM0" - emped = 0 + var/emped = 0 var/turf/locked_location -/obj/item/device/gps/Initialize() +/obj/item/device/telesci/gps/Initialize() . = ..() GLOB.GPS_list += src LAZYADD(GLOB.gps_by_type["[type]"], src) @@ -24,7 +24,7 @@ GLOBAL_LIST_EMPTY(gps_by_type) name = "global positioning system ([gpstag])" AddOverlays(image(icon, "working")) -/obj/item/device/gps/Destroy() +/obj/item/device/telesci/gps/Destroy() GLOB.GPS_list -= src var/list/typelist = GLOB.gps_by_type["[type]"] LAZYREMOVE(typelist, src) @@ -41,9 +41,9 @@ GLOBAL_LIST_EMPTY(gps_by_type) CutOverlays() AddOverlays(image(icon, "working")) -/obj/item/device/gps/attack_self(mob/user) +/obj/item/device/telesci/gps/attack_self(mob/user) - var/obj/item/device/gps/t = "" + var/obj/item/device/telesci/gps/t = "" var/gps_window_height = 110 + LAZYLEN(GLOB.GPS_list) * 20 // Variable window height, depending on how many GPS units there are to show if(emped) t += "ERROR" @@ -54,7 +54,7 @@ GLOBAL_LIST_EMPTY(gps_by_type) t += "
Bluespace coordinates saved: [locked_location.loc]" gps_window_height += 20 - for(var/obj/item/device/gps/G in GLOB.GPS_list) + for(var/obj/item/device/telesci/gps/G in GLOB.GPS_list) var/turf/pos = get_turf(G) var/area/gps_area = get_area(G) var/tracked_gpstag = G.gpstag @@ -68,7 +68,7 @@ GLOBAL_LIST_EMPTY(gps_by_type) popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) popup.open() -/obj/item/device/gps/Topic(href, href_list) +/obj/item/device/telesci/gps/Topic(href, href_list) ..() if(href_list["tag"] ) var/a = input("Please enter desired tag.", name, gpstag) as text @@ -78,17 +78,17 @@ GLOBAL_LIST_EMPTY(gps_by_type) name = "global positioning system ([gpstag])" attack_self(usr) -/obj/item/device/gps/science +/obj/item/device/telesci/gps/science icon_state = "gps-s" gps_prefix = "SCI" gpstag = "SCI0" -/obj/item/device/gps/engineering +/obj/item/device/telesci/gps/engineering icon_state = "gps-e" gps_prefix = "ENG" gpstag = "ENG0" -/obj/item/device/gps/mining +/obj/item/device/telesci/gps/mining icon_state = "gps-m" gps_prefix = "MIN" gpstag = "MIN0" diff --git a/mods/machinery/code/telesci_computer.dm b/mods/machinery/code/telesci_computer.dm index 4beaffc5866c6..67be2d20b84eb 100644 --- a/mods/machinery/code/telesci_computer.dm +++ b/mods/machinery/code/telesci_computer.dm @@ -29,7 +29,7 @@ var/starting_crystals = 0 //Edit this on the map, seriously. var/max_crystals = 5 var/list/crystals = list() - var/obj/item/device/gps/inserted_gps + var/obj/item/device/telesci/gps/inserted_gps /obj/machinery/computer/telescience/Destroy() eject() diff --git a/mods/utility_items/_utility_items.dme b/mods/utility_items/_utility_items.dme index f21bac280307f..a58068791607a 100644 --- a/mods/utility_items/_utility_items.dme +++ b/mods/utility_items/_utility_items.dme @@ -9,5 +9,6 @@ #include "code/noose.dm" #include "code/wires.dm" #include "code/reagents.dm" +#include "code/cell_charger.dm" #endif diff --git a/mods/utility_items/code/cell_charger.dm b/mods/utility_items/code/cell_charger.dm new file mode 100644 index 0000000000000..cdf3c0d6eed8a --- /dev/null +++ b/mods/utility_items/code/cell_charger.dm @@ -0,0 +1,38 @@ +/obj/item/stock_parts/circuitboard/cell_charger + name = "circuit board (cell_charger)" + board_type = "machine" + origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3) + build_path = /obj/machinery/cell_charger + +/obj/item/stock_parts/circuitboard/recharger + name = "circuit board (recharger)" + board_type = "machine" + origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 4) + build_path = /obj/machinery/recharger + +/obj/item/stock_parts/circuitboard/wallcharger + name = "circuit board (wall recharger)" + board_type = "machine" + origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 5) + build_path = /obj/machinery/recharger/wallcharger + +/datum/design/circuit/cell_charger + name = "cell charger" + id = "cellcharger" + req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 3) + build_path = /obj/item/stock_parts/circuitboard/cell_charger + sort_string = "BOOOB" + +/datum/design/circuit/recharger + name = "recharger" + id = "recharger" + req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 5) + build_path = /obj/item/stock_parts/circuitboard/recharger + sort_string = "BOBOB" + +/datum/design/circuit/wallcharger + name = "wall recharger" + id = "wallrecharger" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 6) + build_path = /obj/item/stock_parts/circuitboard/wallcharger + sort_string = "BBOBO" From 1cd98e2b83688aa7a39bc92656e8cd7c2a1c79ff Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Tue, 18 Jun 2024 21:25:43 +0300 Subject: [PATCH 42/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2369=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2369.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2369.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2369.yml b/html/changelogs/AutoChangeLog-sierra-pr-2369.yml new file mode 100644 index 0000000000000..31a9d9e52c576 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2369.yml @@ -0,0 +1,6 @@ +author: Teteshnik +changes: + - {tweak: 'Теперь мы имеем разные GPS. Один GPS для телесайнса, второй GPS для обычного + использования.'} + - {tweak: Теперь зарядники можно улучшать.} +delete-after: true From 4f62e3bb3e72bb70691a583c6cc2cbf79fa3147e Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Wed, 19 Jun 2024 01:25:58 +0000 Subject: [PATCH 43/80] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F=D1=86=D0=B8=D1=8F=20=D1=87=D0=B5?= =?UTF-8?q?=D0=B9=D0=BD=D0=B4=D0=B6=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=20[ci=20?= =?UTF-8?q?skip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelog.html | 7 +++++++ html/changelogs/.all_changelog.yml | 11 +++++++++++ html/changelogs/AutoChangeLog-sierra-pr-2369.yml | 6 ------ 3 files changed, 18 insertions(+), 6 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2369.yml diff --git a/html/changelog.html b/html/changelog.html index ba8bb23ac5837..a26a62b530796 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -28,6 +28,13 @@

Sierra SS13

-->
+

19.06 - 2024

+

Обновления Teteshnik:

+
+
Теперь мы имеем разные GPS. Один GPS для телесайнса, второй GPS для обычного использования.
+
Теперь зарядники можно улучшать.
+
+

18.06 - 2024

Обновления Teteshnik:

diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 58fb5dfd098d5..ce44647683ea9 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -24217,3 +24217,14 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY sierra_genchangelog.p \u0447\u0430\u0442\u043A\u0443 \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u0443\ \u044E \u0441 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435\u043C \u043F\u043B\ \u0430\u0442\u044B." +2024-06-19: + Teteshnik: + - tweak: "\u0422\u0435\u043F\u0435\u0440\u044C \u043C\u044B \u0438\u043C\u0435\u0435\ + \u043C \u0440\u0430\u0437\u043D\u044B\u0435 GPS. \u041E\u0434\u0438\u043D GPS\ + \ \u0434\u043B\u044F \u0442\u0435\u043B\u0435\u0441\u0430\u0439\u043D\u0441\u0430\ + , \u0432\u0442\u043E\u0440\u043E\u0439 GPS \u0434\u043B\u044F \u043E\u0431\u044B\ + \u0447\u043D\u043E\u0433\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\ + \u0432\u0430\u043D\u0438\u044F." + - tweak: "\u0422\u0435\u043F\u0435\u0440\u044C \u0437\u0430\u0440\u044F\u0434\u043D\ + \u0438\u043A\u0438 \u043C\u043E\u0436\u043D\u043E \u0443\u043B\u0443\u0447\u0448\ + \u0430\u0442\u044C." diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2369.yml b/html/changelogs/AutoChangeLog-sierra-pr-2369.yml deleted file mode 100644 index 31a9d9e52c576..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2369.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Teteshnik -changes: - - {tweak: 'Теперь мы имеем разные GPS. Один GPS для телесайнса, второй GPS для обычного - использования.'} - - {tweak: Теперь зарядники можно улучшать.} -delete-after: true From ca6ff510ebd05365a98b03027600826cd2b517c6 Mon Sep 17 00:00:00 2001 From: Lexanx <61974560+Lexanx@users.noreply.github.com> Date: Fri, 21 Jun 2024 07:54:02 +0300 Subject: [PATCH 44/80] Pojilaya Jaba (#2371) --- code/modules/species/station/station.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/species/station/station.dm b/code/modules/species/station/station.dm index 983238c860bd1..b3838f3ab2db0 100644 --- a/code/modules/species/station/station.dm +++ b/code/modules/species/station/station.dm @@ -105,7 +105,7 @@ pronouns = list(PRONOUNS_THEY_THEM) hidden_from_codex = FALSE min_age = 19 - max_age = 90 + max_age = 130 burn_mod = 0.9 oxy_mod = 1.3 From fa2719d0f52f3787f8bf624a52371825545ca88f Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 21 Jun 2024 07:54:30 +0300 Subject: [PATCH 45/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2371=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2371.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2371.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2371.yml b/html/changelogs/AutoChangeLog-sierra-pr-2371.yml new file mode 100644 index 0000000000000..90752c6c939c9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2371.yml @@ -0,0 +1,4 @@ +author: Lexanx +changes: + - {bugfix: Максимальный возраст Скреллов теперь 130} +delete-after: true From 54e2b967d0cd2a8c09a28c769b4741ee24d252ae Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Fri, 21 Jun 2024 08:05:14 +0300 Subject: [PATCH 46/80] [MIRROR] re add pod zombos (#2292) Co-authored-by: Spookerton <918997+Spookerton@users.noreply.github.com> Co-authored-by: UEDCommander <52104104+UEDCommander@users.noreply.github.com> --- code/datums/outfits/misc.dm | 8 ++ .../modules/mob/living/carbon/human/corpse.dm | 4 + maps/_maps.dm | 2 +- maps/away/miningstation/miningstation.dmm | 2 +- .../datacapsule/datacapsule.dm | 9 +- .../contents_1.dmm | 4 +- .../contents_2.dmm | 0 .../contents_3.dmm | 2 +- .../ejected_datapod/ejected_datapod.dm | 94 +++++++++++++++++++ .../ejected_datapod.dmm} | 8 +- mods/loadout_items/README.md | 4 +- 11 files changed, 125 insertions(+), 12 deletions(-) rename maps/random_ruins/exoplanet_ruins/{datacapsule => ejected_datapod}/contents_1.dmm (86%) rename maps/random_ruins/exoplanet_ruins/{datacapsule => ejected_datapod}/contents_2.dmm (100%) rename maps/random_ruins/exoplanet_ruins/{datacapsule => ejected_datapod}/contents_3.dmm (96%) create mode 100644 maps/random_ruins/exoplanet_ruins/ejected_datapod/ejected_datapod.dm rename maps/random_ruins/exoplanet_ruins/{datacapsule/datacapsule.dmm => ejected_datapod/ejected_datapod.dmm} (83%) diff --git a/code/datums/outfits/misc.dm b/code/datums/outfits/misc.dm index 4ae5405578682..f1c50326789e0 100644 --- a/code/datums/outfits/misc.dm +++ b/code/datums/outfits/misc.dm @@ -70,3 +70,11 @@ id_types = list(/obj/item/card/id/syndicate) id_pda_assignment = "Scavenger" flags = OUTFIT_HAS_BACKPACK|OUTFIT_RESET_EQUIPMENT + + +/singleton/hierarchy/outfit/anomalist + name = "Anomalist" + uniform = /obj/item/clothing/under/color/white + shoes = /obj/item/clothing/shoes/white + suit = /obj/item/clothing/suit/bio_suit/anomaly + head = /obj/item/clothing/head/bio_hood/anomaly diff --git a/code/modules/mob/living/carbon/human/corpse.dm b/code/modules/mob/living/carbon/human/corpse.dm index 83e9264945da2..fe66afe72ed6b 100644 --- a/code/modules/mob/living/carbon/human/corpse.dm +++ b/code/modules/mob/living/carbon/human/corpse.dm @@ -201,3 +201,7 @@ /obj/landmark/corpse/syndicate/commando name = "Syndicate Commando" corpse_outfits = list(/singleton/hierarchy/outfit/mercenary/syndicate/commando) + +/obj/landmark/corpse/anomalist + name = "Dead Anomalist" + corpse_outfits = list(/singleton/hierarchy/outfit/anomalist) diff --git a/maps/_maps.dm b/maps/_maps.dm index 8935d0bad7dd7..a916811e89251 100644 --- a/maps/_maps.dm +++ b/maps/_maps.dm @@ -27,7 +27,7 @@ GLOBAL_DATUM_INIT(using_map, /datum/map, new using_map_DATUM) #include "random_ruins\exoplanet_ruins\excavation_site\excavation_site.dm" #include "random_ruins\exoplanet_ruins\transshipment\transshipment.dm" #include "random_ruins\exoplanet_ruins\crashed_pod\crashed_pod.dm" -#include "random_ruins\exoplanet_ruins\datacapsule\datacapsule.dm" +#include "random_ruins\exoplanet_ruins\ejected_datapod\ejected_datapod.dm" #include "random_ruins\exoplanet_ruins\deserted_lab\deserted_lab.dm" #include "random_ruins\exoplanet_ruins\drill_site\drill_site.dm" #include "random_ruins\exoplanet_ruins\droppod\droppod.dm" diff --git a/maps/away/miningstation/miningstation.dmm b/maps/away/miningstation/miningstation.dmm index f505da11eb0c0..ed5e5ac8051ed 100644 --- a/maps/away/miningstation/miningstation.dmm +++ b/maps/away/miningstation/miningstation.dmm @@ -6932,7 +6932,7 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/miningstation/dormhall) "pS" = ( -/obj/landmark/corpse/zombiescience, +/obj/landmark/corpse/anomalist, /obj/gibspawner/human, /turf/simulated/floor/tiled/techfloor, /area/miningstation/vault) diff --git a/maps/random_ruins/exoplanet_ruins/datacapsule/datacapsule.dm b/maps/random_ruins/exoplanet_ruins/datacapsule/datacapsule.dm index a2b9b94e852d1..8e300162da246 100644 --- a/maps/random_ruins/exoplanet_ruins/datacapsule/datacapsule.dm +++ b/maps/random_ruins/exoplanet_ruins/datacapsule/datacapsule.dm @@ -42,8 +42,13 @@ /obj/item/reagent_containers/glass/beaker/vial/random_podchem/Initialize() . = ..() desc += "Label is smudged, and there's crusted blood fingerprints on it." - var/reagent_type = pick(/datum/reagent/random, /datum/reagent/rezadone, /datum/reagent/drugs/three_eye) - reagents.add_reagent(pick(reagent_type), 5) + var/reagent_type = pickweight(list( + /datum/reagent/random = 50, + /datum/reagent/rezadone = 25, + /datum/reagent/drugs/three_eye = 20, + /datum/reagent/zombie/science = 5 + )) + reagents.add_reagent(reagent_type, 5) /obj/structure/backup_server name = "backup server" diff --git a/maps/random_ruins/exoplanet_ruins/datacapsule/contents_1.dmm b/maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_1.dmm similarity index 86% rename from maps/random_ruins/exoplanet_ruins/datacapsule/contents_1.dmm rename to maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_1.dmm index f2fc6240dd170..60c507b64ab37 100644 --- a/maps/random_ruins/exoplanet_ruins/datacapsule/contents_1.dmm +++ b/maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_1.dmm @@ -1,8 +1,8 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( /obj/structure/table/steel, -/obj/item/reagent_containers/glass/beaker/vial/random_podchem, -/obj/item/reagent_containers/glass/beaker/vial/random_podchem, +/obj/item/reagent_containers/glass/beaker/vial/ejected_datapod, +/obj/item/reagent_containers/glass/beaker/vial/ejected_datapod, /obj/structure/window/basic/full, /turf/template_noop, /area/template_noop) diff --git a/maps/random_ruins/exoplanet_ruins/datacapsule/contents_2.dmm b/maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_2.dmm similarity index 100% rename from maps/random_ruins/exoplanet_ruins/datacapsule/contents_2.dmm rename to maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_2.dmm diff --git a/maps/random_ruins/exoplanet_ruins/datacapsule/contents_3.dmm b/maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_3.dmm similarity index 96% rename from maps/random_ruins/exoplanet_ruins/datacapsule/contents_3.dmm rename to maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_3.dmm index 8b33a1f3a629d..ea666db65f4df 100644 --- a/maps/random_ruins/exoplanet_ruins/datacapsule/contents_3.dmm +++ b/maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_3.dmm @@ -34,7 +34,7 @@ /turf/template_noop, /area/template_noop) "i" = ( -/obj/landmark/corpse/zombiescience, +/obj/landmark/corpse/anomalist, /obj/structure/foamedmetal, /turf/template_noop, /area/template_noop) diff --git a/maps/random_ruins/exoplanet_ruins/ejected_datapod/ejected_datapod.dm b/maps/random_ruins/exoplanet_ruins/ejected_datapod/ejected_datapod.dm new file mode 100644 index 0000000000000..44cd349bf9212 --- /dev/null +++ b/maps/random_ruins/exoplanet_ruins/ejected_datapod/ejected_datapod.dm @@ -0,0 +1,94 @@ +/datum/map_template/ruin/exoplanet/ejected_datapod + name = "ejected data capsule" + id = "ejected_datapod" + description = "A damaged capsule with some strange contents." + suffixes = list("ejected_datapod/ejected_datapod.dmm") + spawn_cost = 0.5 + template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS + ruin_tags = RUIN_HUMAN|RUIN_WRECK + apc_test_exempt_areas = list( + /area/map_template/ejected_datapod = NO_SCRUBBER|NO_VENT|NO_APC + ) + + +/datum/map_template/ejected_datapod_contents + name = "random datapod contents #1 (chem vials)" + id = "datapod_1" + mappaths = list("maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_1.dmm") + + +/datum/map_template/ejected_datapod_contents/type2 + name = "random datapod contents #2 (servers)" + id = "datapod_2" + mappaths = list("maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_2.dmm") + + +/datum/map_template/ejected_datapod_contents/type3 + name = "random datapod contents #2 (spiders)" + id = "datapod_3" + mappaths = list("maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_3.dmm") + + +/obj/landmark/map_load_mark/ejected_datapod + name = "random datapod contents" + templates = list( + /datum/map_template/ejected_datapod_contents, + /datum/map_template/ejected_datapod_contents/type2, + /datum/map_template/ejected_datapod_contents/type3 + ) + + +/area/map_template/ejected_datapod + name = "\improper Ejected Data Capsule" + icon_state = "blue" + turfs_airless = TRUE + + +/obj/item/reagent_containers/glass/beaker/vial/ejected_datapod + name = "unmarked vial" + + +/obj/item/reagent_containers/glass/beaker/vial/ejected_datapod/Initialize() + . = ..() + desc += "Label is smudged, and there's crusted blood fingerprints on it." + var/reagent_type = pickweight(list( + /datum/reagent/random = 50, + /datum/reagent/rezadone = 25, + /datum/reagent/drugs/three_eye = 20, + /datum/reagent/zombie = 5 + )) + reagents.add_reagent(reagent_type, 5) + + +/obj/structure/backup_server + name = "backup server" + icon = 'icons/obj/machines/research/server.dmi' + icon_state = "server" + desc = "Impact resistant server rack. You might be able to pry a disk out." + + /// When truthy, the server has already been harvested + var/drive_removed + + +/obj/structure/backup_server/use_tool(obj/item/tool, mob/living/user, list/click_params) + if (!isCrowbar(tool)) + return ..() + if (drive_removed) + USE_FEEDBACK_FAILURE("\The [src] has no drive to remove.") + return TRUE + drive_removed = TRUE + var/obj/item/stock_parts/computer/hard_drive/cluster/drive = new + drive.origin_tech = list( + TECH_DATA = rand(4, 5), + TECH_ENGINEERING = rand(4, 5), + TECH_PHORON = rand(4, 5), + TECH_COMBAT = rand(2, 5), + TECH_ESOTERIC = rand(0, 6) + ) + drive.dropInto(loc) + playsound(src, 'sound/items/Crowbar.ogg', 50, TRUE) + user.visible_message( + SPAN_NOTICE("\The [user] pries a drive from \the [src] with \a [tool]."), + SPAN_NOTICE("You pry \a [drive] from \the [src] with \a [tool].") + ) + return TRUE diff --git a/maps/random_ruins/exoplanet_ruins/datacapsule/datacapsule.dmm b/maps/random_ruins/exoplanet_ruins/ejected_datapod/ejected_datapod.dmm similarity index 83% rename from maps/random_ruins/exoplanet_ruins/datacapsule/datacapsule.dmm rename to maps/random_ruins/exoplanet_ruins/ejected_datapod/ejected_datapod.dmm index 68d6fda86bbe3..401ae7963392a 100644 --- a/maps/random_ruins/exoplanet_ruins/datacapsule/datacapsule.dmm +++ b/maps/random_ruins/exoplanet_ruins/ejected_datapod/ejected_datapod.dmm @@ -5,7 +5,7 @@ "b" = ( /obj/paint/black, /turf/simulated/wall/ocp_wall, -/area/map_template/datacapsule) +/area/map_template/ejected_datapod) "c" = ( /obj/landmark/scorcher, /turf/template_noop, @@ -13,14 +13,14 @@ "d" = ( /obj/machinery/door/blast/shutters, /turf/simulated/floor/reinforced, -/area/map_template/datacapsule) +/area/map_template/ejected_datapod) "f" = ( /turf/simulated/floor/reinforced, -/area/map_template/datacapsule) +/area/map_template/ejected_datapod) "g" = ( /obj/landmark/map_load_mark/ejected_datapod, /turf/simulated/floor/reinforced, -/area/map_template/datacapsule) +/area/map_template/ejected_datapod) (1,1,1) = {" a diff --git a/mods/loadout_items/README.md b/mods/loadout_items/README.md index 858dbe5d1e60a..0dcae1ac44758 100644 --- a/mods/loadout_items/README.md +++ b/mods/loadout_items/README.md @@ -85,7 +85,9 @@ ID мода: LOADOUT_ITEMS ### Авторы: -UEDHighCommand +- UEDHighCommand +- BrunoSamoyed (новый спрайт плаща) +- Часть предметов портирована с билда Aurora
+

22.06 - 2024

+

Обновления Karl Johansson:

+
+
Riot helmets can attach visors.
+
Visors don't show on mob when in storage.
+
+

Обновления Lexanx:

+
+
Максимальный возраст Скреллов теперь 130
+
+

Обновления Ryan180602:

+
+
Adds the Shikra to the sensor suite.
+
+

Обновления Spookerton:

+
+
Fake moustaches fit in pockets and the visible name of wearers can be adjusted with the Change Visible Name verb.
+
Liquid Corruption returns to exoplanet datapod spawns at a much reduced rate of about 1.67%
+
+

Обновления Teteshnik1:

+
+
Исправлена невозможность улучшать зарядники
+
Возвращена возможность создавать искусственные БС-кристаллы
+
+

Обновления sdtwbaj:

+
+
Using a stethoscope on a body part with arterial bleeding reports "rushing liquid".
+
+

19.06 - 2024

Обновления Teteshnik:

diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index ce44647683ea9..d603789120d98 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -24228,3 +24228,31 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY sierra_genchangelog.p - tweak: "\u0422\u0435\u043F\u0435\u0440\u044C \u0437\u0430\u0440\u044F\u0434\u043D\ \u0438\u043A\u0438 \u043C\u043E\u0436\u043D\u043E \u0443\u043B\u0443\u0447\u0448\ \u0430\u0442\u044C." +2024-06-22: + Karl Johansson: + - tweak: Riot helmets can attach visors. + - bugfix: Visors don't show on mob when in storage. + Lexanx: + - bugfix: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439\ + \ \u0432\u043E\u0437\u0440\u0430\u0441\u0442 \u0421\u043A\u0440\u0435\u043B\u043B\ + \u043E\u0432 \u0442\u0435\u043F\u0435\u0440\u044C 130" + Ryan180602: + - rscadd: Adds the Shikra to the sensor suite. + Spookerton: + - tweak: Fake moustaches fit in pockets and the visible name of wearers can be adjusted + with the Change Visible Name verb. + - tweak: Liquid Corruption returns to exoplanet datapod spawns at a much reduced + rate of about 1.67% + Teteshnik1: + - bugfix: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0430 \u043D\u0435\ + \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u0443\u043B\ + \u0443\u0447\u0448\u0430\u0442\u044C \u0437\u0430\u0440\u044F\u0434\u043D\u0438\ + \u043A\u0438" + - tweak: "\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u0430 \u0432\u043E\ + \u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u0441\u043E\u0437\u0434\ + \u0430\u0432\u0430\u0442\u044C \u0438\u0441\u043A\u0443\u0441\u0441\u0442\u0432\ + \u0435\u043D\u043D\u044B\u0435 \u0411\u0421-\u043A\u0440\u0438\u0441\u0442\u0430\ + \u043B\u043B\u044B" + sdtwbaj: + - tweak: Using a stethoscope on a body part with arterial bleeding reports "rushing + liquid". diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2292.yml b/html/changelogs/AutoChangeLog-sierra-pr-2292.yml deleted file mode 100644 index 5a271169c60ca..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2292.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Spookerton -changes: - - {tweak: Liquid Corruption returns to exoplanet datapod spawns at a much reduced - rate of about 1.67%} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2308.yml b/html/changelogs/AutoChangeLog-sierra-pr-2308.yml deleted file mode 100644 index aaadca3fda280..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2308.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Ryan180602 -changes: - - {rscadd: Adds the Shikra to the sensor suite.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2309.yml b/html/changelogs/AutoChangeLog-sierra-pr-2309.yml deleted file mode 100644 index c81a4ed368f2f..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2309.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Spookerton -changes: - - {tweak: Fake moustaches fit in pockets and the visible name of wearers can be - adjusted with the Change Visible Name verb.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2310.yml b/html/changelogs/AutoChangeLog-sierra-pr-2310.yml deleted file mode 100644 index aed86ce14e2e6..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2310.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: sdtwbaj -changes: - - {tweak: Using a stethoscope on a body part with arterial bleeding reports "rushing - liquid".} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2320.yml b/html/changelogs/AutoChangeLog-sierra-pr-2320.yml deleted file mode 100644 index c354ba727b838..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2320.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Karl Johansson -changes: - - {tweak: Riot helmets can attach visors.} - - {bugfix: Visors don't show on mob when in storage.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2371.yml b/html/changelogs/AutoChangeLog-sierra-pr-2371.yml deleted file mode 100644 index 90752c6c939c9..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2371.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Lexanx -changes: - - {bugfix: Максимальный возраст Скреллов теперь 130} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2375.yml b/html/changelogs/AutoChangeLog-sierra-pr-2375.yml deleted file mode 100644 index 0898b1dc0febd..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2375.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Teteshnik1 -changes: - - {bugfix: Исправлена невозможность улучшать зарядники} - - {tweak: Возвращена возможность создавать искусственные БС-кристаллы} -delete-after: true From b443fe743bc8d0b5e228f5ad3f36cbcee691537c Mon Sep 17 00:00:00 2001 From: AmShegars <88627712+AmShegars@users.noreply.github.com> Date: Sat, 22 Jun 2024 13:19:43 +0500 Subject: [PATCH 60/80] DEV-SIERRA: Mechs by Shegar patch 1.1 (#2380) --- code/datums/supplypacks/nonessent.dm | 2 +- code/game/jobs/access.dm | 10 +- code/game/objects/items/paintkit.dm | 2 +- code/modules/item_worth/worths_list.dm | 4 +- code/modules/mechs/components/_components.dm | 3 +- code/modules/mechs/components/head.dm | 16 +- code/modules/mechs/equipment/utility.dm | 1 + code/modules/mechs/interface/_interface.dm | 1 + code/modules/mechs/mech_icon.dm | 60 +++-- code/modules/mechs/mech_interaction.dm | 41 ++- code/modules/mechs/mech_movement.dm | 16 +- code/modules/mechs/premade/powerloader.dm | 9 + .../mob/living/carbon/human/human_helpers.dm | 6 +- maps/away/mininghome/mininghome.dmm | 4 +- maps/torch/items/mecha.dm | 3 +- mods/_maps/farfleet/code/farfleet_crew.dm | 2 +- mods/_maps/sentinel/code/sentinel_crew.dm | 2 +- mods/mechs_by_shegar/_mechs_by_shegar.dme | 4 + mods/mechs_by_shegar/code/components/arms.dm | 21 +- mods/mechs_by_shegar/code/components/body.dm | 23 +- .../code/components/components.dm | 42 +++ mods/mechs_by_shegar/code/components/head.dm | 16 ++ mods/mechs_by_shegar/code/components/legs.dm | 37 ++- .../code/equipment/ballistic.dm | 23 -- .../code/equipment/equipment.dm | 3 +- .../code/equipment/pulse_rifle.dm | 17 ++ .../code/equipment/rocket_launcher.dm | 48 ++++ mods/mechs_by_shegar/code/interface.dm | 79 ++++++ mods/mechs_by_shegar/code/mech.dm | 17 +- mods/mechs_by_shegar/code/mech_interaction.dm | 143 +++++++++- mods/mechs_by_shegar/code/mech_move.dm | 6 +- mods/mechs_by_shegar/code/new_prices.dm | 4 + .../code/premades/death_squad.dm | 254 ++++++++++++++++++ mods/mechs_by_shegar/icons/ammo.dmi | Bin 0 -> 550 bytes mods/mechs_by_shegar/icons/mech_equipment.dmi | Bin 25608 -> 26761 bytes .../icons/mech_weapon_overlays.dmi | Bin 72280 -> 78422 bytes .../icons/mech_weapon_overlays_off.dmi | Bin 68821 -> 74648 bytes mods/mechs_by_shegar/icons/projectiles.dmi | Bin 0 -> 77924 bytes mods/mechs_by_shegar/sounds/mech_peek.ogg | Bin 0 -> 4524 bytes mods/mechs_by_shegar/sounds/mecha_minigun.ogg | Bin 0 -> 24535 bytes 40 files changed, 822 insertions(+), 97 deletions(-) create mode 100644 mods/mechs_by_shegar/code/components/components.dm create mode 100644 mods/mechs_by_shegar/code/equipment/pulse_rifle.dm create mode 100644 mods/mechs_by_shegar/code/equipment/rocket_launcher.dm create mode 100644 mods/mechs_by_shegar/code/premades/death_squad.dm create mode 100644 mods/mechs_by_shegar/icons/ammo.dmi create mode 100644 mods/mechs_by_shegar/icons/projectiles.dmi create mode 100644 mods/mechs_by_shegar/sounds/mech_peek.ogg create mode 100644 mods/mechs_by_shegar/sounds/mecha_minigun.ogg diff --git a/code/datums/supplypacks/nonessent.dm b/code/datums/supplypacks/nonessent.dm index 57e1149b9af91..f3262fb42954d 100644 --- a/code/datums/supplypacks/nonessent.dm +++ b/code/datums/supplypacks/nonessent.dm @@ -249,7 +249,7 @@ -// [SIERRA-REMOVE] - MECHS_BY_SHEGAR - (Не нужны, т.к все эти типы камуфляжей есть в новом камуфляторы) +// [SIERRA-REMOVE] - Mechs_by_shegar - (Не нужны, т.к все эти типы камуфляжей есть в новом камуфляторы) /* /singleton/hierarchy/supply_pack/nonessent/exosuit_mod diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 3936985f1766e..b5121f2a33068 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -172,7 +172,15 @@ var/global/list/priv_region_access priv_region_access["[A.region]"] += A.id var/list/region = priv_region_access["[code]"] - return region.Copy() + //[SIERRA-EDIT] + //Позволяет избавиться от рантайма. + //return region.Copy() + + if(region) + return region.Copy() + else + return + //[SIERRA-EDIT] /proc/get_region_accesses_name(code) switch(code) diff --git a/code/game/objects/items/paintkit.dm b/code/game/objects/items/paintkit.dm index ffe45bffaf5c7..7154b0c2b8632 100644 --- a/code/game/objects/items/paintkit.dm +++ b/code/game/objects/items/paintkit.dm @@ -81,7 +81,7 @@ return ..() // Mechs are handled in their attackby (mech_interaction.dm). -// [SIERRA-REMOVE] - MECHS_BY_SHEGAR - Не нужны +// [SIERRA-REMOVE] - Mechs_by_shegar - Не нужны /* diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm index 1eeebdcaf083d..bf4cc4b0fb46f 100644 --- a/code/modules/item_worth/worths_list.dm +++ b/code/modules/item_worth/worths_list.dm @@ -472,12 +472,12 @@ var/global/list/worths = list( /obj/item/device/dociler = 490, /obj/item/device/bot_controller = 50, /obj/item/device/mmi = 1200, - // [SIERRA-REMOVE] - MECHS_BY_SHEGAR, + // [SIERRA-REMOVE] - Mechs_by_shegar, /*, /obj/item/device/kit/paint = 500, */ // [/SIERRA-REMOVE], - // [SIERRA-ADD] - MECHS_BY_SHEGAR, + // [SIERRA-ADD] - Mechs_by_shegar, /obj/item/device/kit/mech = 500, // [/SIERRA-ADD], /obj/item/device/kit = 100, diff --git a/code/modules/mechs/components/_components.dm b/code/modules/mechs/components/_components.dm index 133b80cd42a4a..4e3e1d3f36e36 100644 --- a/code/modules/mechs/components/_components.dm +++ b/code/modules/mechs/components/_components.dm @@ -54,6 +54,7 @@ /obj/item/mech_component/proc/update_health() total_damage = brute_damage + burn_damage if(total_damage > max_damage) total_damage = max_damage + current_hp = max_damage - total_damage var/prev_state = damage_state damage_state = clamp(round((total_damage/max_damage) * 4), MECH_COMPONENT_DAMAGE_UNDAMAGED, MECH_COMPONENT_DAMAGE_DAMAGED_TOTAL) if(damage_state > prev_state) @@ -191,5 +192,5 @@ to_chat(user, SPAN_NOTICE("[capitalize(src.name)]:")) // [SIERRA-EDIT] - Mechs_by_shegar //to_chat(user, SPAN_NOTICE(" - Integrity: [round((((max_damage - total_damage) / max_damage)) * 100)]%" )) - to_chat(user, SPAN_NOTICE(" - Integrity: [max_damage - total_damage]/[max_damage]([round((((max_damage - total_damage) / max_damage)) * 100)]%)" )) + to_chat(user, SPAN_NOTICE(" - Integrity: [current_hp]/[max_damage]([round(((current_hp / max_damage)) * 100)]%) Unrepairable damage: [unrepairable_damage]" )) // [SIERRA-EDIT] diff --git a/code/modules/mechs/components/head.dm b/code/modules/mechs/components/head.dm index 734e8f15deace..610a6602a54f4 100644 --- a/code/modules/mechs/components/head.dm +++ b/code/modules/mechs/components/head.dm @@ -12,6 +12,8 @@ var/active_sensors = 0 power_use = 15 w_class = ITEM_SIZE_NORMAL + var/obj/mob/exosuit/owner + /obj/item/mech_component/sensors/Destroy() QDEL_NULL(camera) @@ -37,20 +39,24 @@ software = locate() in src //EDIT -// [SIERRA-EDIT] - SHUTTLE_TOGGLE - (Optional Reason/comment) +// [SIERRA-EDIT] - Mechs-by-Shebar /* /obj/item/mech_component/sensors/proc/get_sight(powered) var/flags = 0 if(total_damage >= 0.8 * max_damage || !powered) flags |= BLIND else if(active_sensors && powered) flags |= vision_flags + return flags */ /obj/item/mech_component/sensors/proc/get_sight(powered) var/flags = 0 - if(!camera || !powered) - flags |= BLIND - else if(active_sensors && powered) - flags |= vision_flags + if(!powered ||(!camera && powered)) //Камера не работает/Ничего не запитано? + flags |= BLIND //включается слепота + if(powered && camera) + if(active_sensors) //SENSORS active? (Button) + flags |= vision_flags //Мех получает спец зрение от сенсоров + + return flags // [SIERRA-EDIT] diff --git a/code/modules/mechs/equipment/utility.dm b/code/modules/mechs/equipment/utility.dm index b870a9c069144..c46cbf729a007 100644 --- a/code/modules/mechs/equipment/utility.dm +++ b/code/modules/mechs/equipment/utility.dm @@ -697,6 +697,7 @@ /obj/item/gun/energy/plasmacutter/mounted/mech use_external_power = TRUE has_safety = FALSE + max_shots = 10 /obj/item/mech_equipment/mounted_system/taser/plasma diff --git a/code/modules/mechs/interface/_interface.dm b/code/modules/mechs/interface/_interface.dm index bb65fb85abc65..5c0ffb7415390 100644 --- a/code/modules/mechs/interface/_interface.dm +++ b/code/modules/mechs/interface/_interface.dm @@ -54,6 +54,7 @@ /obj/screen/movable/exosuit/toggle/megaspeakers, /obj/screen/movable/exosuit/toggle/gps, /obj/screen/movable/exosuit/toggle/medscan, + /obj/screen/movable/exosuit/id, ) //[SIERRA-EDIT] i = 0 diff --git a/code/modules/mechs/mech_icon.dm b/code/modules/mechs/mech_icon.dm index e5fab9b7b5e25..dfbdb0c31632e 100644 --- a/code/modules/mechs/mech_icon.dm +++ b/code/modules/mechs/mech_icon.dm @@ -56,17 +56,18 @@ var/obj/item/mech_equipment/hardpoint_object = hardpoints[hardpoint] if(hardpoint_object) //[SIERRA-ADD] - Mechs-by-Shegar + //Данный участок кода в зависимости от положения помещает модуль за мех или перед мехом, это выглядит красиво. if(hardpoint in list(HARDPOINT_LEFT_HAND, HARDPOINT_LEFT_SHOULDER)) - if(dir == WEST || dir == SOUTHWEST || dir == NORTHWEST) + if(dir == WEST || dir == SOUTHWEST || dir == NORTHWEST || dir == SOUTH || dir == NORTH) hardpoint_object.mech_layer = MECH_GEAR_LAYER else if(dir == EAST || dir == SOUTHEAST || dir == NORTHEAST) hardpoint_object.mech_layer = MECH_BACK_LAYER - else if(hardpoint in list(HARDPOINT_RIGHT_HAND,HARDPOINT_RIGHT_SHOULDER)) + else if(hardpoint in list(HARDPOINT_RIGHT_HAND, HARDPOINT_RIGHT_SHOULDER)) if(dir == WEST || dir == SOUTHWEST || dir == NORTHWEST) hardpoint_object.mech_layer = MECH_BACK_LAYER else if(dir == EAST || dir == SOUTHEAST || dir == NORTHEAST || dir == SOUTH) hardpoint_object.mech_layer = MECH_GEAR_LAYER - else if(hardpoint in list(HARDPOINT_BACK)) + else if(hardpoint in list(HARDPOINT_BACK, HARDPOINT_HEAD)) if(dir == SOUTH) hardpoint_object.mech_layer = MECH_BACK_LAYER else @@ -103,6 +104,9 @@ /mob/living/exosuit/proc/update_pilots(update_overlays = TRUE) //[SIERRA-ADD] - Mechs-by-Shegar + //Сперва мы проверяем - а нам вообще надо обновлять пилота? Если кабина закрытого типа, то, ну, зачем? + if(!body || (body.hide_pilot)) + return var/local_dir = dir if(local_dir == NORTHEAST || local_dir == SOUTHEAST) local_dir = EAST @@ -112,32 +116,34 @@ if(update_overlays && LAZYLEN(pilot_overlays)) CutOverlays(pilot_overlays) pilot_overlays = null - if(body && !(body.hide_pilot)) - for(var/i = 1 to LAZYLEN(pilots)) - var/mob/pilot = pilots[i] - var/image/draw_pilot = new - draw_pilot.appearance = pilot - var/rel_pos = local_dir == NORTH ? -1 : 1 - draw_pilot.layer = MECH_PILOT_LAYER + (body ? ((LAZYLEN(body.pilot_positions)-i)*0.001 * rel_pos) : 0) - draw_pilot.plane = FLOAT_PLANE - draw_pilot.appearance_flags = KEEP_TOGETHER - if(body && i <= LAZYLEN(body.pilot_positions)) - var/list/offset_values = body.pilot_positions[i] - var/list/directional_offset_values = offset_values["[local_dir]"] - draw_pilot.pixel_x = pilot.default_pixel_x + directional_offset_values["x"] - draw_pilot.pixel_y = pilot.default_pixel_y + directional_offset_values["y"] - draw_pilot.pixel_z = 0 - draw_pilot.ClearTransform() + for(var/i = 1 to LAZYLEN(pilots)) + var/mob/pilot = pilots[i] + var/image/draw_pilot = new + draw_pilot.appearance = pilot + var/rel_pos = local_dir == NORTH ? -1 : 1 + draw_pilot.layer = MECH_PILOT_LAYER + (body ? ((LAZYLEN(body.pilot_positions)-i)*0.001 * rel_pos) : 0) + draw_pilot.plane = FLOAT_PLANE + draw_pilot.appearance_flags = KEEP_TOGETHER + if(body && i <= LAZYLEN(body.pilot_positions)) + var/list/offset_values = body.pilot_positions[i] + var/list/directional_offset_values = offset_values["[local_dir]"] + draw_pilot.pixel_x = pilot.default_pixel_x + directional_offset_values["x"] + draw_pilot.pixel_y = pilot.default_pixel_y + directional_offset_values["y"] + draw_pilot.pixel_z = 0 + draw_pilot.ClearTransform() - //Mask pilots! - //Masks are 48x48 and pilots 32x32 (in theory at least) so some math is required for centering - var/diff_x = 8 - draw_pilot.pixel_x - var/diff_y = 8 - draw_pilot.pixel_y - draw_pilot.filters = filter(type = "alpha", icon = icon(body.on_mech_icon, "[body.icon_state]_pilot_mask[hatch_closed ? "" : "_open"]", dir), x = diff_x, y = diff_y) + //Mask pilots! + //Masks are 48x48 and pilots 32x32 (in theory at least) so some math is required for centering + var/diff_x = 8 - draw_pilot.pixel_x + var/diff_y = 8 - draw_pilot.pixel_y + //[SIERRA-EDIT] + //draw_pilot.filters = filter(type = "alpha", icon = icon(body.on_mech_icon, "[body.icon_state]_pilot_mask[hatch_closed ? "" : "_open"]", dir), x = diff_x, y = diff_y) + //SIERRA-EDIT + draw_pilot.filters = filter(type = "alpha", icon = icon(body.on_mech_icon, "[body.icon_state]_pilot_mask[hatch_closed ? "" : "_open"]", local_dir), x = diff_x, y = diff_y) - LAZYADD(pilot_overlays, draw_pilot) - if(update_overlays && LAZYLEN(pilot_overlays)) - AddOverlays(pilot_overlays) + LAZYADD(pilot_overlays, draw_pilot) + if(update_overlays && LAZYLEN(pilot_overlays)) + AddOverlays(pilot_overlays) /mob/living/exosuit/regenerate_icons() return diff --git a/code/modules/mechs/mech_interaction.dm b/code/modules/mechs/mech_interaction.dm index a145767d318ad..9502f1bff268b 100644 --- a/code/modules/mechs/mech_interaction.dm +++ b/code/modules/mechs/mech_interaction.dm @@ -221,6 +221,14 @@ var/arms_local_damage = arms.melee_damage src.visible_message(SPAN_DANGER("\The [src] steps back, preparing for a strike!"), blind_message = SPAN_DANGER("You hear the loud hissing of hydraulics!")) if (do_after(src, 1.2 SECONDS, get_turf(src), DO_DEFAULT | DO_USER_UNIQUE_ACT | DO_PUBLIC_PROGRESS) && user) + + //[SIERRA-ADD] - Mechs_by_Shegar + //CHECK + if (get_dist(src, A) > 1.5) + src.visible_message(SPAN_DANGER(" [src] misses with his attack!")) + setClickCooldown(arms ? arms.action_delay : 7) + playsound(src.loc, arms.punch_sound, 50, 1) + return //additional actions with objects! //emergency airlock open @@ -430,7 +438,7 @@ return TRUE // Crowbar - Force open locked cockpit - if (isCrowbar(tool)) + else if (isCrowbar(tool)) if (!body) USE_FEEDBACK_FAILURE("\The [src] has no cockpit to force.") //[SIERRA-EDIT] - Mechs-by-Shegar @@ -449,9 +457,8 @@ if(hatch_locked) USE_FEEDBACK_FAILURE("\The [src]'s cockpit locked by cockpit security bolts. You need saw or welder.") return FALSE - var/delay = min(50 * user.skill_delay_mult(SKILL_DEVICES), 50 * user.skill_delay_mult(SKILL_EVA)) visible_message(SPAN_NOTICE("\The [user] starts forcing the \the [src]'s emergency [body.hatch_descriptor] release using \the [tool].")) - if(!do_after(user, delay, src, DO_DEFAULT | DO_PUBLIC_PROGRESS)) + if(!do_after(user, 5 SECONDS, src, DO_DEFAULT | DO_PUBLIC_PROGRESS)) return playsound(src, 'sound/machines/bolts_up.ogg', 25, TRUE) hatch_closed = !hatch_closed @@ -478,7 +485,7 @@ return TRUE // [SIERRA-EDIT] // Mech Equipment - Install equipment - if (istype(tool, /obj/item/mech_equipment)) + else if (istype(tool, /obj/item/mech_equipment)) if (hardpoints_locked) USE_FEEDBACK_FAILURE("\The [src]'s hardpoint system is locked.") return TRUE @@ -503,7 +510,20 @@ return TRUE // Multitool - Remove component - if (isMultitool(tool)) + //[SIERRA-ADD] - Mechs-by-Shegar + //Персонаж пытающийся взаимодействовать мультитулом может открыть доп взаимодействие? + else if (istype(tool, /obj/item/device/multitool/multimeter)) + can_hack_id(tool, user) + else if (isMultitool(tool)) + if(id_holder) + var/list/variants = list("Restore ID data", "Dismantle equipment") + var/bla + var/choose = input(usr, "What you want to do?.", name, bla) as null|anything in variants + if(!choose) + return + if(choose == "Restore ID data") + can_hack_id(tool,user) + //[SIERRA-ADD] - Mechs-by-Shegar if (hardpoints_locked) USE_FEEDBACK_FAILURE("\The [src]'s hardpoint system is locked.") return TRUE @@ -521,7 +541,7 @@ return TRUE // Power Cell - Install cell - if (istype(tool, /obj/item/cell)) + else if (istype(tool, /obj/item/cell)) if (!maintenance_protocols) USE_FEEDBACK_FAILURE("\The [src]'s maintenance protocols must be enabled to install \the [tool].") return TRUE @@ -540,7 +560,7 @@ return TRUE // Screwdriver - Remove cell - if (isScrewdriver(tool)) + else if (isScrewdriver(tool)) if (!maintenance_protocols) USE_FEEDBACK_FAILURE("\The [src]'s maintenance protocols must be enabled to access the power cell.") return TRUE @@ -570,7 +590,7 @@ return TRUE // Welding Tool - Repair physical damage - if (isWelder(tool)) + else if (isWelder(tool)) if (!getBruteLoss()) USE_FEEDBACK_FAILURE("\The [src] has no physical damage to repair.") return TRUE @@ -584,11 +604,14 @@ if (!input_fix.brute_damage) USE_FEEDBACK_FAILURE("\The [src]'s [input_fix.name] no longer needs repair.") return TRUE + if(input_fix.max_damage - input_fix.current_hp > input_fix.max_repair) + USE_FEEDBACK_FAILURE("\The [src]'s [input_fix.name] is too damaged and requires repair with material.") + return TRUE input_fix.repair_brute_generic(tool, user) return TRUE // Wrench - Toggle securing bolts - if (isWrench(tool)) + else if (isWrench(tool)) if (!maintenance_protocols) USE_FEEDBACK_FAILURE("\The [src]'s maintenance protocols must be enabled to access the securing bolts.") return TRUE diff --git a/code/modules/mechs/mech_movement.dm b/code/modules/mechs/mech_movement.dm index 81c6c1ccf31cf..dbca01e78691e 100644 --- a/code/modules/mechs/mech_movement.dm +++ b/code/modules/mechs/mech_movement.dm @@ -133,7 +133,21 @@ exosuit.SetMoveCooldown(exosuit.legs ? exosuit.legs.move_delay : 3) var/turf/target_loc = get_step(exosuit, direction) if(target_loc && exosuit.legs && exosuit.legs.can_move_on(exosuit.loc, target_loc) && exosuit.MayEnterTurf(target_loc)) - exosuit.Move(target_loc) + if(!exosuit.body.phazon) + exosuit.Move(target_loc) + else + for(var/thing in exosuit.pilots) //Для всех пилотов внутри + var/mob/pilot = thing + if(pilot && pilot.client) + for(var/key in pilot.client.keys_held) + if (key == "Shift") + var/move_speed = exosuit.legs.move_delay + move_speed = move_speed * 2.5 + exosuit.SetMoveCooldown(exosuit.legs ? move_speed : 3) + exosuit.forceMove(target_loc) + + else + exosuit.Move(target_loc) return MOVEMENT_HANDLED /datum/movement_handler/mob/space/exosuit expected_host_type = /mob/living/exosuit diff --git a/code/modules/mechs/premade/powerloader.dm b/code/modules/mechs/premade/powerloader.dm index 23169395d70c5..41e656fe6d03f 100644 --- a/code/modules/mechs/premade/powerloader.dm +++ b/code/modules/mechs/premade/powerloader.dm @@ -98,11 +98,20 @@ MC.color = rgb(255,rand(188, 225),rand(55, 136)) //Damage it var/obj/item/mech_component/damaged = pick(parts) + //[SIERRA-EDIT] - Mechs-by-Shegar + /* + damaged.take_brute_damage((damaged.max_damage/ 4 ) * MECH_COMPONENT_DAMAGE_DAMAGED) + if(prob(33)) + parts -= damaged + damaged = pick(parts) + damaged.take_brute_damage((damaged.max_damage / 4 ) * MECH_COMPONENT_DAMAGE_DAMAGED) + */ damaged.take_brute_damage((damaged.max_damage / 4 ) * MECH_COMPONENT_DAMAGE_DAMAGED) if(prob(33)) parts -= damaged damaged = pick(parts) damaged.take_brute_damage((damaged.max_damage / 4 ) * MECH_COMPONENT_DAMAGE_DAMAGED) + //[SIERRA-EDIT] - Mechs-by-Shegar /mob/living/exosuit/premade/powerloader/old/spawn_mech_equipment() install_system(new /obj/item/mech_equipment/light(src), HARDPOINT_HEAD) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 80d81955ea679..403f86aa6986f 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -97,7 +97,11 @@ /mob/living/carbon/human/proc/process_visor(obj/item/clothing/head/hat, obj/item/clothing/glasses/eyewear) remove_client_color(/datum/client_color/monochrome) remove_client_color(/datum/client_color/nvg) - if (hat) + //SIERRA-EDIT (Убивает рантайм, когда с НЕ шлемов пытаются стянуть очки) + // if(hat) + + if (hat && istype(hat, /obj/item/clothing/accessory )) + //SIERRA-EDIT for(var/obj/item/clothing/accessory/glassesmod/mod in hat.accessories) if (mod?.active) equipment_darkness_modifier += mod.darkness_view diff --git a/maps/away/mininghome/mininghome.dmm b/maps/away/mininghome/mininghome.dmm index 6a3fcced09038..6b4dab5ab3c6a 100644 --- a/maps/away/mininghome/mininghome.dmm +++ b/maps/away/mininghome/mininghome.dmm @@ -4040,12 +4040,12 @@ /obj/floor_decal/corner/brown{ dir = 8 }, -// [SIERRA-REMOVE] - MECHS_BY_SHEGAR +// [SIERRA-REMOVE] - Mechs_by_shegar /* /obj/item/device/kit/paint/flames_blue, */ // [/SIERRA-REMOVE] -// [SIERRA-ADD] - MECHS_BY_SHEGAR +// [SIERRA-ADD] - Mechs_by_shegar /obj/item/device/kit/mech, // [/SIERRA-ADD] /turf/simulated/floor/steel_dirty, diff --git a/maps/torch/items/mecha.dm b/maps/torch/items/mecha.dm index b4f5169e93a52..a593d5715bf26 100644 --- a/maps/torch/items/mecha.dm +++ b/maps/torch/items/mecha.dm @@ -13,7 +13,7 @@ if(!arms) arms = new /obj/item/mech_component/manipulators/powerloader(src) arms.color = COLOR_PURPLE - + material = material = SSmaterials.get_material_by_name(MATERIAL_OSMIUM_CARBIDE_PLASTEEL) . = ..() //Damage it @@ -30,4 +30,3 @@ install_system(new /obj/item/mech_equipment/clamp(src), HARDPOINT_RIGHT_HAND) install_system(new /obj/item/mech_equipment/mounted_system/taser/plasma(src), HARDPOINT_LEFT_HAND) install_system(new /obj/item/mech_equipment/ionjets(src), HARDPOINT_BACK) - \ No newline at end of file diff --git a/mods/_maps/farfleet/code/farfleet_crew.dm b/mods/_maps/farfleet/code/farfleet_crew.dm index 6bf561e8ead4f..f1a34090d3f86 100644 --- a/mods/_maps/farfleet/code/farfleet_crew.dm +++ b/mods/_maps/farfleet/code/farfleet_crew.dm @@ -260,7 +260,7 @@ var/global/const/access_away_iccgn_captain = "ACCESS_ICCGN_CAPTAIN" У вас нет права подниматься на борт судов NanoTrasen или ЦПСС. Помните об этом и не провоцируйте ненужные Конфедерации конфликты. \ Исключением являются те ситуации, когда вы атакованы противником, терпите бедствие или на вашем судне аварийная ситуация." required_language = LANGUAGE_HUMAN_RUSSIAN - whitelisted_species = list(SPECIES_HUMAN) + whitelisted_species = list(SPECIES_HUMAN, SPECIES_VATGROWN) is_semi_antagonist = TRUE min_skill = list(SKILL_BUREAUCRACY = SKILL_TRAINED, SKILL_COMBAT = SKILL_BASIC, diff --git a/mods/_maps/sentinel/code/sentinel_crew.dm b/mods/_maps/sentinel/code/sentinel_crew.dm index 1b3236edbbeee..dec88920a6714 100644 --- a/mods/_maps/sentinel/code/sentinel_crew.dm +++ b/mods/_maps/sentinel/code/sentinel_crew.dm @@ -90,7 +90,7 @@ var/global/const/access_away_cavalry_commander = "ACCESS_CAVALRY_COMMANDER" Вам крайне нежелательно приближаться к кораблям и станциям с опозновательными знаками без разрешения от командования группировкой. \ Исключением являются те ситуации, когда вы терпите бедствие или на вашем судне аварийная ситуация." required_language = LANGUAGE_HUMAN_EURO - whitelisted_species = list(SPECIES_HUMAN) + whitelisted_species = list(SPECIES_HUMAN, SPECIES_VATGROWN) min_skill = list(SKILL_COMBAT = SKILL_BASIC, SKILL_WEAPONS = SKILL_BASIC, SKILL_HAULING = SKILL_BASIC, diff --git a/mods/mechs_by_shegar/_mechs_by_shegar.dme b/mods/mechs_by_shegar/_mechs_by_shegar.dme index 7ea349044a4fd..9c96af047a3cc 100644 --- a/mods/mechs_by_shegar/_mechs_by_shegar.dme +++ b/mods/mechs_by_shegar/_mechs_by_shegar.dme @@ -10,6 +10,7 @@ #include "code/components/armour.dm" #include "code/components/arms.dm" #include "code/components/body.dm" +#include "code/components/components.dm" #include "code/components/head.dm" #include "code/components/legs.dm" @@ -22,11 +23,14 @@ #include "code/equipment/integralka_rack.dm" #include "code/equipment/jets.dm" #include "code/equipment/plasma_cutter.dm" +#include "code/equipment/pulse_rifle.dm" +#include "code/equipment/rocket_launcher.dm" #include "code/equipment/sleeper.dm" //Премейды #include "code/premades/ert.dm" #include "code/premades/merc.dm" +#include "code/premades/death_squad.dm" //Основной код мехов #include "code/interface.dm" diff --git a/mods/mechs_by_shegar/code/components/arms.dm b/mods/mechs_by_shegar/code/components/arms.dm index 0cd0daf8e0af5..915c38d27f0b8 100644 --- a/mods/mechs_by_shegar/code/components/arms.dm +++ b/mods/mechs_by_shegar/code/components/arms.dm @@ -1,19 +1,32 @@ /obj/item/mech_component/manipulators + ///Могут ли пассажиры занимать Left back и Right back (боковые пассажирские места)? var/allow_passengers = TRUE +/obj/item/mech_component/manipulators/powerloader + max_damage = 100 + min_damage = 50 + max_repair = 30 + melee_damage = 30 + repair_damage = 10 + /obj/item/mech_component/manipulators/light allow_passengers = FALSE max_damage = 80 + min_damage = 50 + max_repair = 20 melee_damage = 30 - -/obj/item/mech_component/manipulators/powerloader - max_damage = 100 - melee_damage = 30 + repair_damage = 15 /obj/item/mech_component/manipulators/heavy melee_damage = 40 + max_repair = 150 max_damage = 500 + min_damage = 300 + repair_damage = 30 /obj/item/mech_component/manipulators/combat max_damage = 180 + min_damage = 100 + max_repair = 60 melee_damage = 30 + repair_damage = 20 diff --git a/mods/mechs_by_shegar/code/components/body.dm b/mods/mechs_by_shegar/code/components/body.dm index 914a47133dde6..8dd9f4154f3d2 100644 --- a/mods/mechs_by_shegar/code/components/body.dm +++ b/mods/mechs_by_shegar/code/components/body.dm @@ -2,11 +2,17 @@ var/list/back_passengers_positions var/list/left_back_passengers_positions var/list/right_back_passengers_positions + ///Могут ли пассажиры занимать пассажирское место Back? var/allow_passengers = TRUE + ///Отвечает за состояние болтов кабины. Их можно срезать сваркой, если мех закрыт. После этого мех никогда не сможет вновь опустить болты, ибо их попросту нет. var/hatch_bolts_status = BOLTS_NOMITAL - + ///НЕ ТРОГАТЬ. Даёт возможность меху проходить сквозь турфы + var/phazon = FALSE /obj/item/mech_component/chassis/powerloader max_damage = 150 + min_damage = 75 + max_repair = 50 + repair_damage = 25 /obj/item/mech_component/chassis/powerloader/Initialize() back_passengers_positions = list( @@ -31,6 +37,10 @@ /obj/item/mech_component/chassis/light max_damage = 120 + min_damage = 60 + max_repair = 40 + repair_damage = 20 + hide_pilot = TRUE /obj/item/mech_component/chassis/light/Initialize() back_passengers_positions = list( @@ -55,6 +65,9 @@ /obj/item/mech_component/chassis/pod max_damage = 210 + max_repair = 50 + min_damage = 110 + repair_damage = 30 /obj/item/mech_component/chassis/pod/Initialize() back_passengers_positions = list( @@ -79,6 +92,10 @@ /obj/item/mech_component/chassis/heavy max_damage = 700 + max_repair = 200 + min_damage = 350 + repair_damage = 30 + hide_pilot = TRUE /obj/item/mech_component/chassis/heavy/Initialize() back_passengers_positions = list( @@ -103,6 +120,10 @@ /obj/item/mech_component/chassis/combat max_damage = 270 + min_damage = 130 + max_repair = 90 + repair_damage = 30 + hide_pilot = TRUE /obj/item/mech_component/chassis/combat/Initialize() back_passengers_positions = list( diff --git a/mods/mechs_by_shegar/code/components/components.dm b/mods/mechs_by_shegar/code/components/components.dm new file mode 100644 index 0000000000000..54c44e53032c0 --- /dev/null +++ b/mods/mechs_by_shegar/code/components/components.dm @@ -0,0 +1,42 @@ +/obj/item/mech_component + /// + ///Отвечает за минимальное возможное ХП части меха, ОБЯЗАТЕЛЬНО прописывайте этот пункт. При ремонте повреждений + ///листом материала максимальное ХП части меха уменьшается, min_damage является минимальным пределом до куда будет + ///снижаться макс ХП меха. + /// + var/min_damage = 5 + + + /// + /// Отвечает за то на сколько снижается максимальное хп части после ремонта. Обратите внимание, что макс хп падает + ///лишь при ремонте листами материала. + /// + var/repair_damage = 5 + + + /// + ///Отвечает за ТЕКУЩУЮ структурную целостность части, вычисляется по max_damage - ( brute_damage + burn_damage) + /// + var/current_hp + + + /// + ///Отвечает за максимальное число урона, при котором не потребуется ремонт листами матеиала, можно обойтись сваркой. + ///Если урон выше этого значения - ремонт лишь листами. + /// + var/max_repair = 5 + + + /// + ///Отвечает за то какой материал требуется для ремонта данной части листами. Проверяется переменная при клику листами по + ///меху. + /// + var/req_material = MATERIAL_STEEL + + + + //Содержит в себе значение НЕЧИНИБЕЛЬНОГО урона что скопился в части. + var/unrepairable_damage = 0 +/obj/item/mech_component/Initialize() + current_hp = max_damage + . = ..() diff --git a/mods/mechs_by_shegar/code/components/head.dm b/mods/mechs_by_shegar/code/components/head.dm index 9ba8696a80762..9350d8b15846c 100644 --- a/mods/mechs_by_shegar/code/components/head.dm +++ b/mods/mechs_by_shegar/code/components/head.dm @@ -1,8 +1,24 @@ +/obj/item/mech_component/sensors/powerloader + max_damage = 100 + min_damage = 50 + max_repair = 30 + repair_damage = 10 + /obj/item/mech_component/sensors/light max_damage = 80 + min_damage = 50 + max_repair = 20 + repair_damage = 15 /obj/item/mech_component/sensors/heavy max_damage = 500 + min_damage = 300 + max_repair = 150 + repair_damage = 30 + repair_damage = 30 /obj/item/mech_component/sensors/combat max_damage = 180 + min_damage = 100 + max_repair = 60 + repair_damage = 20 diff --git a/mods/mechs_by_shegar/code/components/legs.dm b/mods/mechs_by_shegar/code/components/legs.dm index 089b21a4a003e..ebd8672c9ad0a 100644 --- a/mods/mechs_by_shegar/code/components/legs.dm +++ b/mods/mechs_by_shegar/code/components/legs.dm @@ -1,34 +1,57 @@ /obj/item/mech_component/propulsion + ///Сила тарана var/bump_type = BASIC_BUMP + ///Мех может НЕ таранить если захочет? var/bump_safety = TRUE - var/can_strafe = FALSE //Может ли мех ходить при помощи стрейфа. Крайне полезная фича, используйте если знаете что делаете. - var/good_in_strafe = FALSE //Влияет на эффективность стрейфа, используйте когда мир будет к нему готов. + ///Может ли мех ходить при помощи стрейфа. Крайне полезная фича, используйте если знаете что делаете. + var/can_strafe = FALSE + ///Влияет на эффективность стрейфа, используйте когда мир будет к нему готов. + var/good_in_strafe = FALSE var/collision_coldown = 7 /obj/item/mech_component/propulsion/powerloader max_damage = 100 + min_damage = 50 + max_repair = 30 + repair_damage = 10 /obj/item/mech_component/propulsion/light max_damage = 80 + min_damage = 50 + max_repair = 20 + repair_damage = 15 /obj/item/mech_component/propulsion/spider max_damage = 210 + min_damage = 100 + max_repair = 60 + repair_damage = 50 bump_type = MEDIUM_BUMP can_strafe = TRUE /obj/item/mech_component/propulsion/tracks max_damage = 250 + min_damage = 200 + max_repair = 100 + repair_damage = 20 + bump_type = HARD_BUMP + bump_safety = FALSE + + +/obj/item/mech_component/propulsion/heavy + max_damage = 500 + min_damage = 300 + max_repair = 150 + repair_damage = 20 bump_type = HARD_BUMP bump_safety = FALSE /obj/item/mech_component/propulsion/combat max_damage = 180 + min_damage = 100 + max_repair = 60 + repair_damage = 20 bump_type = MEDIUM_BUMP bump_safety = FALSE move_delay = 3.5 turn_delay = 3.5 - -/obj/item/mech_component/propulsion/heavy - max_damage = 500 - bump_type = HARD_BUMP - bump_safety = FALSE diff --git a/mods/mechs_by_shegar/code/equipment/ballistic.dm b/mods/mechs_by_shegar/code/equipment/ballistic.dm index 70142e2b047c6..7c9d11525b3c9 100644 --- a/mods/mechs_by_shegar/code/equipment/ballistic.dm +++ b/mods/mechs_by_shegar/code/equipment/ballistic.dm @@ -1,25 +1,3 @@ -//Пульсач -/obj/item/mech_equipment/mounted_system/taser/pulse - name = "\improper IDK \"Pulsator\" laser" - desc = "Military mounted pulse-rifle, probaly stealed from military ship." - icon_state = "mech_pulse" - holding_type = /obj/item/gun/energy/pulse_rifle/mounted/mech - -/obj/item/gun/energy/pulse_rifle/mounted/mech - name = "\improper CH-PS \"Immolator\" laser" - use_external_power = TRUE - has_safety = FALSE - self_recharge = TRUE - fire_delay = 10 - accuracy = 2 - max_shots = 10 - projectile_type = /obj/item/projectile/beam/pulse/heavy -//Пульсач - - - - - //Пулемёт /obj/item/mech_equipment/mounted_system/taser/ballistic name = "\improper Military \"Vulcan\" machinegun" @@ -100,7 +78,6 @@ magazine_type = /obj/item/ammo_magazine/proto_smg/mech allowed_magazines = /obj/item/ammo_magazine/proto_smg/mech has_safety = FALSE - dispersion = null firemodes = list( list(mode_name="semi auto",burst=3, fire_delay=null,move_delay=null, one_hand_penalty=0, burst_accuracy=null, dispersion=null), ) diff --git a/mods/mechs_by_shegar/code/equipment/equipment.dm b/mods/mechs_by_shegar/code/equipment/equipment.dm index c85037ffd336e..72be6edbf4932 100644 --- a/mods/mechs_by_shegar/code/equipment/equipment.dm +++ b/mods/mechs_by_shegar/code/equipment/equipment.dm @@ -1,3 +1,4 @@ /obj/item/mech_equipment - var/disturb_passengers = FALSE // Отвечает за то, мешает ли модуль посадке пассажира в занятый хардпоинт. + /// Отвечает за то, мешает ли модуль посадке пассажира в занятый хардпоинт. + var/disturb_passengers = FALSE icon = 'mods/mechs_by_shegar/icons/mech_equipment.dmi' diff --git a/mods/mechs_by_shegar/code/equipment/pulse_rifle.dm b/mods/mechs_by_shegar/code/equipment/pulse_rifle.dm new file mode 100644 index 0000000000000..781bda8c384a6 --- /dev/null +++ b/mods/mechs_by_shegar/code/equipment/pulse_rifle.dm @@ -0,0 +1,17 @@ +//Пульсач +/obj/item/mech_equipment/mounted_system/taser/pulse + name = "\improper IDK \"Pulsator\" laser" + desc = "Military mounted pulse-rifle, probaly stealed from military ship." + icon_state = "mech_pulse" + holding_type = /obj/item/gun/energy/lasercannon/mounted/mech/pulse + +/obj/item/gun/energy/lasercannon/mounted/mech/pulse + name = "\improper CH-PS \"Immolator\" laser" + use_external_power = TRUE + has_safety = FALSE + self_recharge = TRUE + fire_delay = 10 + accuracy = 2 + max_shots = 10 + projectile_type = /obj/item/projectile/beam/pulse/heavy +//Пульсач diff --git a/mods/mechs_by_shegar/code/equipment/rocket_launcher.dm b/mods/mechs_by_shegar/code/equipment/rocket_launcher.dm new file mode 100644 index 0000000000000..7cdf01c89772a --- /dev/null +++ b/mods/mechs_by_shegar/code/equipment/rocket_launcher.dm @@ -0,0 +1,48 @@ +#define CALIBER_ROCKETS "rockets" +//Ракетомёт +/obj/item/mech_equipment/mounted_system/taser/ballistic/launcher + name = "\improper \"GRA-D\" missle launcher system" + desc = "dont read plz." + icon_state = "mech_missilerack" + holding_type = /obj/item/gun/projectile/automatic/rocket_launcher + restricted_hardpoints = list(HARDPOINT_LEFT_SHOULDER, HARDPOINT_RIGHT_SHOULDER) + +/obj/item/gun/projectile/automatic/rocket_launcher + has_safety = FALSE + ammo_type = /obj/item/ammo_casing/rocket/mech + magazine_type = /obj/item/ammo_magazine/rockets_casing + allowed_magazines = /obj/item/ammo_magazine/rockets_casing + load_method = SINGLE_CASING|SPEEDLOADER + caliber = CALIBER_ROCKETS + max_shells = 12 + firemodes = list( + mode_name="semi auto", burst=1, fire_delay=null, move_delay=null, one_hand_penalty=0, burst_accuracy=null, dispersion=null, + ) + +/obj/item/ammo_casing/rocket/mech + icon = 'mods/mechs_by_shegar/icons/ammo.dmi' + icon_state = "rockets" + caliber = CALIBER_ROCKETS + projectile_type = /obj/item/projectile/bullet/rocket + +/obj/item/ammo_magazine/rockets_casing + name = "rockets casing" + icon = 'mods/mechs_by_shegar/icons/ammo.dmi' + icon_state = "rockets_casing" + origin_tech = list(TECH_COMBAT = 4) + mag_type = SPEEDLOADER + caliber = CALIBER_ROCKETS + matter = list(MATERIAL_STEEL = 2000) + ammo_type = /obj/item/ammo_casing/rocket/mech + max_ammo = 6 + +/obj/item/projectile/bullet/rocket + icon = 'mods/mechs_by_shegar/icons/ammo.dmi' + icon_state = "missile" + + name = "minirocket" + fire_sound = 'sound/effects/Explosion1.ogg' + +/obj/item/projectile/bullet/rocket/on_hit(atom/target) + explosion(target, 5, EX_ACT_HEAVY) + ..() diff --git a/mods/mechs_by_shegar/code/interface.dm b/mods/mechs_by_shegar/code/interface.dm index bade6b8d2c51a..cf78678113971 100644 --- a/mods/mechs_by_shegar/code/interface.dm +++ b/mods/mechs_by_shegar/code/interface.dm @@ -54,6 +54,85 @@ maptext_y = 13 height = 12 +/obj/screen/movable/exosuit/id + name = "ID control" + icon_state = "small_important" + maptext = MECH_UI_STYLE("ID") + maptext_x = 12 + maptext_y = 13 + height = 12 + +/obj/screen/movable/exosuit/id/use_tool(obj/item/tool, mob/living/user, list/click_params) + if(istype(tool, /obj/item/card/id)) + if(owner.id_holder == "EMAGED") + to_chat(user, "Error 404, ID controlled din't respond.") + return + var/obj/item/card/id/card = tool + if(!owner.id_holder) //Холдер пустой? + owner.control_id(card,user) + else //В холдере какой-то доступ уже есть + //Доступ из холдера есть в нашей карте? + if(has_access(card.access,owner.id_holder)) + owner.control_id(card,user) + else //Доступа нет в списке, увы + to_chat(user, "Acsess denied.") + return + else if (istype(tool, /obj/item/device/multitool/multimeter) || istype(tool, /obj/item/device/multitool)) + owner.can_hack_id() + + .=..() + +/mob/living/exosuit/proc/can_hack_id(obj/item/device/multitool/tool, mob/living/user) + if(!id_holder) + to_chat(user, "Looks like [src] not locked.") + return + if(istype(tool, /obj/item/device/multitool/multimeter)) + if(user.skill_check(SKILL_DEVICES , SKILL_TRAINED) && user.skill_check(SKILL_ELECTRICAL , SKILL_TRAINED)) + mech_id_hack(user) + return + else if(istype(tool, /obj/item/device/multitool)) + if(user.skill_check(SKILL_DEVICES , SKILL_EXPERIENCED)) + mech_id_hack(user) + return + to_chat(user, "I dont understand") + return + +/mob/living/exosuit/proc/control_id(obj/item/card/id/card, mob/living/user) + var/list/variants = list("Delete current ID", "Write NEW ID") + var/choose + var/choosed_place = input(usr, "What you want to do?.", name, choose) as null|anything in variants + if(!choosed_place) + return + if(choosed_place == "Delete current ID") + to_chat(user,"[src] ID holder cleared.") + id_holder = null + return + else if (choosed_place == "Write NEW ID") + if(!card.access) //<- карта пустая лол + to_chat(user, "ERROR.No access detected in ID card") + return + + var/list/access_variants = card.access + var/choosed_access = input(usr, "Choose access from your list.", name, choose) as null|anything in access_variants + if(!choosed_access) + return + id_holder = null + to_chat(user, "New access accepted. Current: [id_holder]") + playsound(src, 'sound/machines/twobeep.ogg', 50, 1, -6) + id_holder = list(choosed_access) + return + +/mob/living/exosuit/proc/mech_id_hack(mob/living/user) + var/delay = (90 - (15 * user.get_skill_value(SKILL_DEVICES))) SECONDS + if(do_after(user, delay, src, DO_REPAIR_CONSTRUCT)) + to_chat(user, "ID data restored to NOMINAL by specific maintaint protocol.") + id_holder = null + selfopen_mech_hatch() + return + else + to_chat(user, "ERROR. ID restore protocol canceled.") + return + /obj/screen/movable/exosuit/toggle/medscan/toggled() owner.medscan.scan(usr,usr) roboscan(usr,usr) diff --git a/mods/mechs_by_shegar/code/mech.dm b/mods/mechs_by_shegar/code/mech.dm index d1df215090de8..70b288649cbcb 100644 --- a/mods/mechs_by_shegar/code/mech.dm +++ b/mods/mechs_by_shegar/code/mech.dm @@ -17,16 +17,21 @@ var/list/right_back_passengers_overlays // <- Изображение пассажира на правом боку var/Bumps = 0 var/last_collision - + ///Список с изображениями всех частей меха. Применяется в ремонте. + var/list/parts_list + var/list/parts_list_images + ///Содержит в себе данные привязанной id карты. По умолчанию - пусто + var/list/id_holder /mob/living/exosuit/Initialize(mapload, obj/structure/heavy_vehicle_frame/source_frame) .=..() passenger_compartment = new(src) - maxHealth = (body.mech_health + material.integrity) + head.max_damage + arms.max_damage + legs.max_damage + maxHealth = (body.mech_health + material.integrity) + head.current_hp + arms.current_hp + legs.current_hp health = maxHealth GPS = new(src) medscan = new(src) + generate_icons() @@ -49,3 +54,11 @@ /mob/living/exosuit/Destroy() forced_leave_passenger(0 , MECH_DROP_ALL_PASSENGER , "dismantle of [src]") // Перед смертью меха, сбросим всех пассажиров . = ..() + + +///Функция генерирующая изображение модулей меха. Применяется в радиальном меню при ремонте +/mob/living/exosuit/proc/generate_icons() + LAZYCLEARLIST(parts_list) + LAZYCLEARLIST(parts_list_images) + parts_list = list(head, body, arms, legs) + parts_list_images = make_item_radial_menu_choices(parts_list) diff --git a/mods/mechs_by_shegar/code/mech_interaction.dm b/mods/mechs_by_shegar/code/mech_interaction.dm index 533f9cfb0de53..a4e04f9cd7b6e 100644 --- a/mods/mechs_by_shegar/code/mech_interaction.dm +++ b/mods/mechs_by_shegar/code/mech_interaction.dm @@ -62,10 +62,12 @@ return FALSE return TRUE -/mob/living/exosuit/proc/enter_passenger(mob/user,place)// Пытается пихнуть на пассажирское место пассажира, перед этим ещё раз проверяя их +/mob/living/exosuit/proc/enter_passenger(mob/user, place)// Пытается пихнуть на пассажирское место пассажира, перед этим ещё раз проверяя их //Проверка спины src.visible_message(SPAN_NOTICE(" [user] starts climb on the [place] of [src]!")) if(do_after(user, 2 SECONDS, get_turf(src),DO_SHOW_PROGRESS|DO_FAIL_FEEDBACK|DO_USER_CAN_TURN| DO_USER_UNIQUE_ACT | DO_PUBLIC_PROGRESS)) + if(!user.Adjacent(src)) // <- Мех рядом? + return FALSE if(user.r_hand != null || user.l_hand != null) to_chat(user,SPAN_NOTICE("You need two free hands to clim on[place] of [src].")) return @@ -188,6 +190,69 @@ update_passengers() /mob/living/exosuit/use_tool(obj/item/tool, mob/user, list/click_params) + if(istype(tool, /obj/item/card/id))// Мы тычем ID картой в меха, словно ключами от иномарки. + //Если есть пилоты, мы никому ничего не откроем + if(LAZYLEN(pilots)) + to_chat(user, SPAN_WARNING("There is somebody inside, ID scaner ignores you.")) + return + var/user_undertand = FALSE // <-Персонаж пытающийся взаимодействовать ID-картой имеет опыт в мехах? + if(user.skill_check(SKILL_DEVICES , SKILL_BASIC) && user.skill_check(SKILL_MECH , SKILL_BASIC)) + user_undertand = TRUE // <- Мы даём пользователю больше информации + if(power != MECH_POWER_ON) + if(user_undertand) + to_chat(user, "[src] is turned off, external LEDs are inactive. Obviously the ID scanner is not working.") + return + else + to_chat(user, "Nothing happens") + return + if(!id_holder) //К меху ничего не привязано + if(user_undertand) + to_chat(user, "[src] does not react in any way to your action. It looks like there is simply no ID card connected to it") + return + else + to_chat(user, "Nothing happens") + return + if(id_holder) //У меха ЕСТЬ записанный доступ + if(id_holder == "EMAGED") + to_chat(user, "Nothing happens") + return + var/obj/item/card/id/card = tool + if(has_access(id_holder, card.access)) //Доступ в мехе и карте совпадают! + if(user_undertand) + to_chat(user, "[src] accepted your ID card.") + src.visible_message("Green LED's of [src] blinks.", "your ID scanner has found a suitable card", "You hear an approving chirp", 7) + selftoggle_mech_hatch() //Мех изменит своё состояние на обратное (Откроется, или закроется) + return + else//Доступы не совпадают + if(user_undertand) + to_chat(user, "[src] access does not match access on this ID card, access is denied. ") + return + else + to_chat(user, "Red LED's of [src] blinks") + return + + + if(istype(tool, /obj/item/stack/material)) + var/obj/item/mech_component/choice = show_radial_menu(user, src, parts_list_images, require_near = TRUE, radius = 42, tooltips = TRUE, check_locs = list(src)) + if(!choice) + return + if((choice.brute_damage) < choice.max_repair) + to_chat(user, "This part does not require repair.") + return + var/obj/item/stack/material/material_sheet = tool + var/user_undertand = FALSE // <-Персонаж пытающийся провернуть ремонт что-то смыслит в мехах для ремонта. + if(user.skill_check(SKILL_DEVICES , SKILL_TRAINED) && user.skill_check(SKILL_CONSTRUCTION, SKILL_BASIC)) + user_undertand = TRUE // <- Мы даём пользователю больше информации, разрешаем проводить ремонт + if(choice && choice.req_material != material_sheet.default_type) + if(user_undertand) + to_chat(user, "My experience tells me that this material is not suitable for repairs this part. I need [choice.req_material]") + return + else + to_chat(user, "I don’t know anything about bellows repair, I stand there and look at him like an idiot.") + return + material_repair(material_sheet, user, user_undertand, choice) + + //Saw/welder - destroy mech security bolts if( ((istype(tool, /obj/item/circular_saw)) || (isWelder(tool))) && user.a_intent == I_HURT) if (!body) @@ -207,3 +272,79 @@ update_icon() return TRUE .=..() + + +/mob/living/exosuit/proc/material_repair(obj/item/stack/material/material_sheet, mob/user, user_understand, obj/item/mech_component/repair_part) + //Выполняем первую проверку ПЕРЕД началом ремонта + if(!user.Adjacent(src)) // <- Мех рядом? + return FALSE + //Определим в какой руке материал + var/obj/item/stack/material/sheet_hand + var/obj/item/weldingtool/welder_hand + // Мы определяем в какой руке лежит материал + if(user.r_hand != material_sheet) + sheet_hand = user.l_hand + if(isWelder(user.r_hand)) + welder_hand = user.r_hand + else + to_chat(user,SPAN_NOTICE("You need welding in the other hand.")) + return + else + sheet_hand = user.r_hand + if(isWelder(user.l_hand)) + welder_hand = user.l_hand + else + to_chat(user,SPAN_NOTICE("You need welding in the other hand.")) + return + if(!welder_hand.can_use(1, user)) //Сварка включена и достаточно топлива? + return + //Мы узнали в какой руке лежит материал, в какой сварка и готова ли она к работе. Теперь мы переходим к самому ремонту. + var/delay = 20 SECONDS - (user.get_skill_value(SKILL_DEVICES)*3 + user.get_skill_value(SKILL_CONSTRUCTION)) + if(do_after(user, delay, src, DO_REPAIR_CONSTRUCT)) + if(!welder_hand.remove_fuel(1, user)) + to_chat(user, "Сварка то где.") + return + sheet_hand.use(1) + if(!user_understand) + var/num = rand(1,100) + if(num < 90) + USE_FEEDBACK_FAILURE("Nothing worked for me, I just wasted the material, after my repair attempt, a sheet of material fell off part of it..") + return + var/repair_ammount = 20 + ((user.get_skill_value(SKILL_DEVICES) + user.get_skill_value(SKILL_CONSTRUCTION)) * 2) + repair_part.repair_brute_damage(repair_ammount) + repair_part.max_damage = repair_part.max_damage - repair_part.repair_damage + repair_part.unrepairable_damage += repair_part.repair_damage + if(repair_part.min_damage > repair_part.max_damage) + repair_part.max_damage = repair_part.min_damage + +/mob/living/exosuit/proc/selftoggle_mech_hatch() + playsound(src.loc, 'mods/mechs_by_shegar/sounds/mech_peek.ogg', 80, 0, -6) + //Данный прок выполняет простейшую задачу, либо открывает, либо закрывает меха без участвия человека. + if(hatch_closed) // <- Кабина закрыта? + if(hatch_locked) // <- Замок включен + hatch_locked = FALSE //<- выключили замок + playsound(src.loc, 'sound/machines/suitstorage_lockdoor.ogg', 50, 1, -6) + hatch_closed = FALSE + playsound(src.loc, 'sound/machines/suitstorage_cycledoor.ogg', 50, 1, -6) + else // <- кабина открыта + hatch_closed = TRUE + playsound(src.loc, 'sound/machines/suitstorage_cycledoor.ogg', 50, 1, -6) + if(!hatch_locked) + hatch_locked = TRUE + playsound(src.loc, 'sound/machines/suitstorage_lockdoor.ogg', 50, 1, -6) + update_icon() + +/mob/living/exosuit/proc/selfopen_mech_hatch() + playsound(src.loc, 'mods/mechs_by_shegar/sounds/mech_peek.ogg', 80, 0, -6) + //Данный прок выполняет простейшую задачу, либо открывает, либо закрывает меха без участвия человека. + if(hatch_closed) // <- Кабина закрыта? + if(hatch_locked) // <- Замок включен + hatch_locked = FALSE //<- выключили замок + playsound(src.loc, 'sound/machines/suitstorage_lockdoor.ogg', 50, 1, -6) + hatch_closed = FALSE + playsound(src.loc, 'sound/machines/suitstorage_cycledoor.ogg', 50, 1, -6) + update_icon() + +/mob/living/exosuit/emag_act(remaining_charges, mob/user, emag_source) + id_holder = "EMAGED" + selfopen_mech_hatch() diff --git a/mods/mechs_by_shegar/code/mech_move.dm b/mods/mechs_by_shegar/code/mech_move.dm index ca8d181d648b4..20eeede0aa3ad 100644 --- a/mods/mechs_by_shegar/code/mech_move.dm +++ b/mods/mechs_by_shegar/code/mech_move.dm @@ -2,8 +2,8 @@ var/mob/living/pilot = pick(pilots) if(legs.bump_safety && pilot.a_intent != I_HURT) //Мы не хотим топтать и ноги могут не топтать? return //Не топчем - src.visible_message(SPAN_DANGER("С силой топчет [target] на полу!"), blind_message = SPAN_DANGER("You hear the loud hissing of hydraulics!")) - target.apply_effects(5, 5) //Чтоб ахуел + src.visible_message(SPAN_DANGER("forcefully tramples [target] on the floor!"), blind_message = SPAN_DANGER("You hear the loud hissing of hydraulics!")) + target.apply_effects(5, 5) //Чтоб не вставал var/damage = rand(5, 7) damage = damage * legs.bump_type target.apply_damage(2 * damage, DAMAGE_BRUTE, BP_HEAD) @@ -15,7 +15,7 @@ /mob/living/exosuit/Bump(mob/living/target) ..() - if(!istype(target, /mob/living)) + if(!istype(target, /mob/living) || target.mob_size > MOB_LARGE || target.mob_size == MOB_LARGE) return if(Bumps != 1) Bumps = !Bumps diff --git a/mods/mechs_by_shegar/code/new_prices.dm b/mods/mechs_by_shegar/code/new_prices.dm index 9b043509ddf2c..0d62f0bead4de 100644 --- a/mods/mechs_by_shegar/code/new_prices.dm +++ b/mods/mechs_by_shegar/code/new_prices.dm @@ -41,6 +41,10 @@ build_path = /obj/item/mech_component/sensors/combat req_tech = list(TECH_COMBAT = 4) +/datum/design/item/exosuit/circuit + name = "exosuit circuit rack" + id = "exosuit_circuit" + build_path = /obj/item/mech_equipment/mounted_system/circuit /datum/design/item/mechfab/exosuit/powerloader_head materials = list(MATERIAL_STEEL = 15000) diff --git a/mods/mechs_by_shegar/code/premades/death_squad.dm b/mods/mechs_by_shegar/code/premades/death_squad.dm new file mode 100644 index 0000000000000..8d41be4d6cef7 --- /dev/null +++ b/mods/mechs_by_shegar/code/premades/death_squad.dm @@ -0,0 +1,254 @@ + //***БОЕВОЙ ДЕД***// +/mob/living/exosuit/premade/death_combat + name = "Gygax" + desc = "This mech is the successor to the first combat mechs - the Gygax. This army model has all the latest innovations in the field of military robotics and is a natural nightmare for its enemies." + +/obj/item/mech_component/manipulators/combat/death_combat //Лапы + max_damage = 300 + melee_damage = 50 + action_delay = 5 + +/obj/item/mech_component/propulsion/combat/death_combat //Ноги + max_damage = 300 + bump_type = HARD_BUMP + bump_safety = TRUE + can_strafe = TRUE + good_in_strafe = TRUE //Выпускайте кракена + +/obj/item/mech_component/sensors/combat/death_combat //Голова + max_damage = 300 + +/obj/item/mech_component/chassis/combat/death_combat //Пузо + max_damage = 500 + +/obj/item/robot_parts/robot_component/armour/exosuit/combat/tactical + name = "tactical combat plating" + desc = "Special combat plating, designed for operating in field of battle." + armor = list( + melee = ARMOR_MELEE_VERY_HIGH, + bullet = ARMOR_BALLISTIC_RIFLE, + laser = ARMOR_LASER_RIFLES, + energy = ARMOR_ENERGY_STRONG, + bomb = ARMOR_BOMB_RESISTANT, + rad = ARMOR_RAD_RESISTANT, + bio = ARMOR_BIO_SHIELDED + ) + origin_tech = list(TECH_MATERIAL = 7) + +/mob/living/exosuit/premade/death_combat/Initialize() + if(!arms) + arms = new /obj/item/mech_component/manipulators/combat/death_combat(src) + arms.color = COLOR_BLACK + if(!legs) + legs = new /obj/item/mech_component/propulsion/combat/death_combat(src) + legs.color = COLOR_BLACK + if(!head) + head = new /obj/item/mech_component/sensors/combat/death_combat(src) + head.color = COLOR_BLACK + if(!body) + body = new /obj/item/mech_component/chassis/combat/death_combat(src) + body.color = COLOR_BLACK + material = SSmaterials.get_material_by_name(MATERIAL_DIAMOND) + . = ..() + +/obj/item/mech_component/chassis/combat/death_combat/prebuild() + . = ..() + QDEL_NULL(cell) + QDEL_NULL(m_armour) + cell = new /obj/item/cell/infinite(src) + m_armour = new /obj/item/robot_parts/robot_component/armour/exosuit/combat/tactical(src) + +/mob/living/exosuit/premade/death_combat/spawn_mech_equipment() + ..() + install_system(new /obj/item/mech_equipment/shields(src), HARDPOINT_BACK) + install_system(new /obj/item/mech_equipment/mounted_system/taser/ballistic/launcher(src), HARDPOINT_LEFT_SHOULDER) + install_system(new /obj/item/mech_equipment/mounted_system/taser/ballistic/launcher(src), HARDPOINT_RIGHT_SHOULDER) + install_system(new /obj/item/mech_equipment/mounted_system/taser/ballistic/autoshotgun(src), HARDPOINT_RIGHT_HAND) + install_system(new /obj/item/mech_equipment/mounted_system/flamethrower/death_preloaded(src), HARDPOINT_LEFT_HAND) + + + + + //***ТЯЖЁЛЫЙ ДЕД***// + + +/mob/living/exosuit/premade/death_heavy + name = "Durand" + desc = "This Mech is the tank of a modern army, equipped to withstand the most colossal damage and the most powerful attacks in modern warfare. This Mech will be EXTREMELY difficult to destroy without anti-tank weapons." + +/obj/item/mech_component/manipulators/heavy/death_heavy //Лапы + max_damage = 1000 + melee_damage = 50 + action_delay = 10 + + +/obj/item/mech_component/propulsion/heavy/death_heavy //Ноги + max_damage = 1000 + bump_type = HARD_BUMP + bump_safety = TRUE + can_strafe = TRUE + good_in_strafe = TRUE //Выпускайте кракена + +/obj/item/mech_component/sensors/heavy/death_heavy //Голова + max_damage = 1000 + +/obj/item/mech_component/chassis/heavy/death_heavy //Пузо + max_damage = 1000 + + +/mob/living/exosuit/premade/death_heavy/Initialize() + if(!arms) + arms = new /obj/item/mech_component/manipulators/heavy/death_heavy(src) + arms.color = COLOR_BLACK + if(!legs) + legs = new /obj/item/mech_component/propulsion/heavy/death_heavy(src) + legs.color = COLOR_BLACK + if(!head) + head = new /obj/item/mech_component/sensors/heavy/death_heavy(src) + head.color = COLOR_BLACK + if(!body) + body = new /obj/item/mech_component/chassis/heavy/death_heavy(src) + body.color = COLOR_BLACK + material = SSmaterials.get_material_by_name(MATERIAL_DIAMOND) + . = ..() + + +/obj/item/mech_component/sensors/heavy/death_heavy/prebuild() + . = ..() + QDEL_NULL(software) + software = new(src) + software.installed_software = list(MECH_SOFTWARE_WEAPONS, MECH_SOFTWARE_UTILITY) + +/obj/item/mech_component/chassis/heavy/death_heavy/prebuild() + . = ..() + QDEL_NULL(cell) + QDEL_NULL(m_armour) + cell = new /obj/item/cell/infinite(src) + m_armour = new /obj/item/robot_parts/robot_component/armour/exosuit/combat/tactical(src) + +/mob/living/exosuit/premade/death_heavy/spawn_mech_equipment() + ..() + install_system(new /obj/item/mech_equipment/shields(src), HARDPOINT_BACK) + install_system(new /obj/item/mech_equipment/mounted_system/taser/ballistic/minigun(src), HARDPOINT_RIGHT_HAND) + install_system(new /obj/item/mech_equipment/ballistic_shield(src), HARDPOINT_LEFT_HAND) + + //***ЛЁГКИЙ ДЕД***// + +/mob/living/exosuit/premade/death_light + name = "Phason" + desc = "SOSI" + +/obj/item/mech_component/manipulators/light/death_light //Лапы + max_damage = 160 + melee_damage = 50 + +/obj/item/mech_component/propulsion/light/death_light //Ноги + max_damage = 160 + bump_type = HARD_BUMP + bump_safety = TRUE + can_strafe = TRUE + good_in_strafe = TRUE //Выпускайте кракена + +/obj/item/mech_component/sensors/light/death_light //Голова + max_damage = 160 + +/obj/item/mech_component/chassis/light/death_light //Пузо + max_damage = 240 + +/mob/living/exosuit/premade/death_light/Initialize() + if(!arms) + arms = new /obj/item/mech_component/manipulators/light/death_light(src) + arms.color = COLOR_BLACK + if(!legs) + legs = new /obj/item/mech_component/propulsion/light/death_light(src) + legs.color = COLOR_BLACK + if(!head) + head = new /obj/item/mech_component/sensors/light/death_light(src) + head.color = COLOR_BLACK + if(!body) + body = new /obj/item/mech_component/chassis/light/death_light(src) + body.color = COLOR_BLACK + material = SSmaterials.get_material_by_name(MATERIAL_DIAMOND) + . = ..() + +/obj/item/mech_component/sensors/light/death_light/prebuild() + . = ..() + QDEL_NULL(software) + software = new(src) + software.installed_software = list(MECH_SOFTWARE_WEAPONS, MECH_SOFTWARE_UTILITY) + +/obj/item/mech_component/chassis/light/death_light/prebuild() + . = ..() + QDEL_NULL(cell) + QDEL_NULL(m_armour) + cell = new /obj/item/cell/infinite(src) + m_armour = new /obj/item/robot_parts/robot_component/armour/exosuit/combat/tactical(src) + +/mob/living/exosuit/premade/death_light/spawn_mech_equipment() + ..() + install_system(new /obj/item/mech_equipment/shields(src), HARDPOINT_BACK) + install_system(new /obj/item/mech_equipment/mounted_system/melee/mechete/energy(src), HARDPOINT_LEFT_HAND) + //ФАЗОННЫЙ МЕЧ В ЛЕВУЮ РУКУ + //ТЕЛЕПУШКА В ПРАВУЮ РУКУ + + + //***ДОПОЛНИТЕЛЬНОЕ СНАРЯЖЕНИЕ***// + //Огнемёт +/obj/item/mech_equipment/mounted_system/flamethrower/death_preloaded + holding_type = /obj/item/flamethrower/full/mech/loaded + +/obj/item/flamethrower/full/mech/loaded + max_beaker = ITEM_SIZE_LARGE + range = 10 + desc = "A Hephaestus brand 'Prometheus' flamethrower. Bigger and better." + + +/obj/item/flamethrower/full/mech/loaded/Initialize() + . = ..() + QDEL_NULL(beaker) + beaker = new /obj/item/reagent_containers/chem_disp_cartridge/mech(src) + beaker.reagents.add_reagent(/datum/reagent/napalm, 1000) + +/obj/item/reagent_containers/chem_disp_cartridge/mech + volume = 1000 + + //Миниган + +/obj/item/mech_equipment/mounted_system/taser/ballistic/minigun + name = "\improper Military \"GE M134\" Minigun" + desc = "Military mounted minigun for combat mechs and tanks." + icon_state = "mech_minigun" + holding_type = /obj/item/gun/projectile/automatic/assault_rifle/mounted/minigun + +/obj/item/gun/projectile/automatic/assault_rifle/mounted/minigun + max_shells = 1000 + ammo_type = /obj/item/ammo_casing/rifle/military + allowed_magazines = /obj/item/ammo_magazine/rifle/mech_minigun + caliber = CALIBER_RIFLE_MILITARY + burst = 10 + fire_sound = 'mods/mechs_by_shegar/sounds/mecha_minigun.ogg' + firemodes = list( + list(mode_name="semi auto", burst=10, fire_delay=null, move_delay=null, one_hand_penalty=8, burst_accuracy=null, dispersion=null), + ) + +/obj/item/ammo_magazine/rifle/mech_minigun + caliber = CALIBER_RIFLE_MILITARY + max_ammo = 1000 + icon_state = "machinegun" + mag_type = SPEEDLOADER + w_class = ITEM_SIZE_HUGE + ammo_type = /obj/item/ammo_casing/rifle/military + + //ENERGY BLAAAADE +/obj/item/mech_equipment/mounted_system/melee/mechete/energy + icon_state = "mech_energy_blade" + holding_type = /obj/item/material/hatchet/machete/mech/energy + +/obj/item/material/hatchet/machete/mech/energy + hitsound = 'sound/weapons/blade1.ogg' + atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_NO_BLOOD + force = 110 + armor_penetration = 100 + max_force = 120 // If we want to edit the force, use this number! The one below is prone to be changed when anything material gets modified. + force_multiplier = 1 + attack_cooldown_modifier = 3 diff --git a/mods/mechs_by_shegar/icons/ammo.dmi b/mods/mechs_by_shegar/icons/ammo.dmi new file mode 100644 index 0000000000000000000000000000000000000000..83058eeeaef112c24966f51cefe43b8bdb56c6c7 GIT binary patch literal 550 zcmV+>0@?kEP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS z%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5sVF}=JGG=ZJ~^>CGcR3< zi!&v&s2C_=$iWqP+sX2+2 zAYmOKYFH6#zmoM9Bfta-skL0Q*TqK~z|U?UYLngD?z4otAHG0{1^{-3>}B zVOLmFRVB0V=9w9r5Qv(Zn*K>Cy%eMAr2p-ns$w*q4!EVN7)@sbx-M14XgcZte6}ip z09C&iM1Y=ORS*I7AtM5Q;|vaoAJD7z61cF30dE2Xd~yb%0Q3fZEkFQ)7iel~x|9aA z0X$%g4&WFJqvPNX;24aP?cfjK7>u*So#$zqrx2&v#_C{WZ-cnP{u#+xWXX#NgSf_v zuHV0?{mk2rPD@Hj$50pF07*qoM6N<$f-_?2yZ`_I literal 0 HcmV?d00001 diff --git a/mods/mechs_by_shegar/icons/mech_equipment.dmi b/mods/mechs_by_shegar/icons/mech_equipment.dmi index 8aa4745262fc3688c22fed10b96af882f82511a2..47d4f1f0667e6c963254e6dd122420af1e9f07a2 100644 GIT binary patch delta 7943 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
>;+hL)?r2R^aq}WsWf9VK)9Rb zpU%gs#bxK@{@{e@f?>Ptyz3q(rr|zqnD^;OtWs!{O;D4tYy|l28L%67Y#J`x>dV@j zkJ+`&u7S)*sG`=ylbYqP-!k^+%EgrFf71TCJin)4RT?nT2mBYGg zHH96SeV_NzM$9)p{l)wCRm`tA^&}xut|!DGx(VasR@Y&RFDJwMB2=a^KmL^gu!9_$Ec_y zDMAc{jXZoMA-6z5eJN^gTQFc{#P=%ZRU3RiYB!F)e^RXt*cypjl(|Ho;WdLXMOe8J zB`?U$8!?PCG%E(TiOXEla%i_Mt|cdbe&X=^oo?7Z@4+~z9aH+W{Z2IpxOj9L?$-tY zK95Aps|9M@8UJDY^&&w(F0y!NWmT1?PJ@Yw$$j>dr&QVlqBHDMj*3nLYtAkKGuMz)&^)v-HW>1dCV;=M7CT6DO(Q;pqjnJo!kw!3j zCdb1G%}9ARx#=lDk8#PbUq(aq+6_djX^b4bgioztB`~oWLtvkV9~>OKY^4^*)CS+1 zx;54*E;%$9v1jPhwjon&Y<^TDn~(Yt+03e49mduIC2Jlup|}3s5<`mjONy4%cp+pH zp+8F40sqr;uoDr5XuvN^R5*ZWvPjQ*`VixJtI(0fw;N>FWZN(v)RKH# zlg(LP7HCFY+#tB~-96kAlzJReP9GHe*&DtgH zz6W;sCnCT<5I_F1x_X`3956ivgRq8~*Q%pyeLHmWfU=4T4#H+HC4M#+oJRFYu%cVe zUMFDVFwN7whTLq)U5nb;@p5^wI+1~H$bC|>VK8-*0O^h5mKNJY5&aF@S1phUPlXI9 zX$EaZzy4>oBla*Mk!kc9(|iml1WZpIXak%gfGQ3!`x3qTCROm<14-Dnue~cj^_6$p z`ty+J;5P7&EM&DG>tTB#SR28fSWTj@+jOg5Gxnb68A$qV(SX^71bRV=MBS<-__Vhi zC#QR~RDAPj6TI%7qlK>|aXo1fN0jfES|x1I>urb5INT2egb>ik zE^c$&rv$Qt7Wa(w3PJb`JuZl)1?XX#)U?Q5ZNpYu zSX9CCn1+|F+D))s3aZhkw)3i2+)_{QOe_VjQo*GM3nJemQ3R)*T zn%e#fZtMV1JH!P_5go{f?Z{6|jps|hXs%(2-c{sZpHiEi3Tgv(AmTX*ev2HLArx9O zwRPCcV@yI$=DgongoQ#Lx(Q0JNQ>ExZ@Wn$vu5{X=$||J1rP#PqLsMd>pZP3;)T z-ZL8OPhaaZ9nzTiSJPfKD<;HcCQ+(W?wpQM&t2>YbGYnY1*7w_OqddYaJsv5cI3@& zIOn<{wL@+?Yc~$LeimGhW#;$?`9uHyHw&B&P5izpbow6-fWac9m6RYs0_{n7hKna& zB7J}e;w6B7P|eNZHa0e9dbtbg-_;8YolP92javb%jXVNj3~~mZUSv=>KM#X(rrFJ4 zFE0-sHkM$hs(|qPK%d8Ef zt-2!EAV6n=MX;X^Rem~r6pE#`svxAt|Ct;c>j#c^LF6tarbn_78vigX|N8G)$gEt< zY@>~Ql`C3mYlG7{z>ElRSCfhspexU?ud~B6sGg7rxZQX>f{A?mB5~nVqGlWWG(Y3! z*JfvDZ#5owy>l{KO2QWpJzPrv3B( E1Am}XT>t<8 diff --git a/mods/mechs_by_shegar/icons/mech_weapon_overlays_off.dmi b/mods/mechs_by_shegar/icons/mech_weapon_overlays_off.dmi index fad88ba774f7a36dc82e59fb36e83ce9268fa0d3..3c7ecb14915b45f575b4bac069e5ebbd887eaf2a 100644 GIT binary patch literal 74648 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 literal 68821 zcmeFZ2T+r5+b4>mAQn)-f;5EyA_4*e(oqlyRXWn8LnzWa5m6MS_YTrK(mRM!q)SWa zkuF3^fY1WT-tqsw-+nu1&dxbIv$JP+PG%e)^R)Z9%k^BpawX)ss{ECUw=a^AkX(T( z$ZC*~oO@3EcYzFi)B8SGoP^|Tf{&J-o2;d)xr^;9H(Mu15)!Y}+{6~g>4&s()@aTT z77m|8w|_oUn$O&hYNFuQo?s@m7S(dNS#*djw4K1YO<+M+S_>5SuJ|Y zr?fQ_+9^Cg0<#J__eqQBEd1o2D=}{Rz9&h;@FWgW+oifPaOxw^Ua*lV{`rXGLc!CR z6#mx_dKAtemT4cHQ%ZXBdazgFbKJZQgLuAWJeNGInPgXyu|~?^*%_xTJAMW8WfAY^ zdR++1qd^y$G?&ckaax*n{c*xs(yrQok<|+iU*5k38@7yl@`ch!LFCWu={x$iV52eZ>6*uvVU)K`Rw<=t2 zs5AJ8cTaWsaX^4rlx)lLk|rp;veVVdK#qWe61ymDeZP$r{?1C z!2Yv|?%$0*Ea}WhZFb`4pP!yLVW>T_=BR{|klZ1G%0AKZO8qnI@27=LJ0N&AhyDnI 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

}p6aB73r042j1(!#$k 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%0Am z$I?%zoi~n~@<#BF={M9oZR9;xmv7Ss3R+~zT^A>%;2Ub;CZFre6zaEQ*BJz9XWL}n zf-XyBP+9+P!1<}D!a3Ydc0Il8z)NV@d9GXb<90<^dw)F)$8bAS}ejyXAD- z4^;LnSv}d8cZ3g4_gcuteDeK8*Ffn}aYJF7*Cl zeh5A3wBAvZ%zuj`*Q2UpjPDY=hO7yM<4$27Bv18;1JK!;Y~}R5((y)I=y76WnOG$n znjpR%R_e^BN&`bJs1>Gi*pB_iQ04x9bp|~QM)A-hRjeD?q;TL^Kk*d5mI688Zh%&PeS7NjiG_{{ptGaGC=_teXtCiGiZsYTDPw4)2{PtJIfSbBfr1p zILvId-F~=Hyy#YwNph1KW1{aOH*9^g^WzVw6F!KSX@R)TDB=Z$EPvY)en(35cZQ?l z1Mp>I=xMN~4=AEnh!7v}n_^$OpGqdv4l*+u!id3*ud^N)l)7aAXuwpb@hKR-LD@5b zHL0u48j!sV&Uq>EeXcxRtav3fo`FdjL<%5l#(SIq2ciiQb*aoJx^dr3Di{8bG3r?=+TSM$80U2Q1V_6C!;~QY+iV;wC8Lw57kkLHi>KATR9J zy66#7)H1ST2lW?rKQ7wu@+>EMG~KDKg)xlK%;W+}Pi;GG5_ljso%`;>N}-ASBaklo$k<%?$_J4UTDNb5ou&(_gp zlP~dt4>J3Is~)X#EIe<0ByUtXQ+#?bdHczP57E6f^xDB?-HU3ZV@aKlWRd4M`v?GHiHS(u5k9{EbjP}6RRKHzAhJSnCe=}J6lXrO)som(W zLJ*rcz9Y;=gzN!b2uuVQvC$piKd>Fys}?+3Il^AdL<<9?dZ^oE@8W_h$Z`u|y)n5) zK73+lIG#NFHUg4G_A0a@W+%tchixcv zPtnX^=E0Rf&MW21cN)(w1oxeuqY#$+^ZU@y`5VUj&lU+CJxlmJa{RJ~uUUqf1kn-N zmxdXd99n|i+E0AX^3{DM3m`(%gx^QhC}@2SzQ}J~evB_=(WAt@q3^tpQU9uCp7oRwP!^uW{ONQsDewUF#IYFa`sO{dG2o^AbF z=sF9Nj&`MhTwwfzr6je4 zoK3}AejiX*`W!Qm+<3%fBoI@D*n`@Zy9e(L_+?JGj4&o?s-YuA%Lf3oYAep% zz%nZR_s(nZxpR!q+0k`dYi@wQqE?|uFRT+OY%U77QA<;W6si6!yob@FFeUJxl^UX+l}`%8|H8Bc3VZj z4+_x!q;SkrfcJZE@g$r9&3B&O=4ngR#4bKv7!)m=>iY>_NQP<5v zvc=ZaB%k$ly}r_Vr(V0gJf?U+*hG8jQp||42X_cAEUeQBuzl;8-=fmuH=Eoy+ zCWBDJQthysFZ_7IsllEvq}|h1uUbgYjqG&tNE}`hA3(|s;2W0Uw0Zc-$q%p^Rf&K{ z*F40M?aRw}q6qlw z+a+#2DPHmsbOXuPe5!m*W`jJO5hhRaA`(*vs`5G=DvsR0E&xAoiUIuYxe9L8ib1Jw zFP~jGsw$Ts%|9eni>R_6yb0BHw2!h9PSLB}ZO*)7tZEv&YWiO5Ti2@RWcE?rncJZL z;wGU@{e2Xlv%1MG%GG1Yca@cuMr@j~O?d4ea%+Q=cP!K^Iy|ljY^`>*#it(y zS+$b>_Yc?9eHjTB(q|h}Z4hz?sdnI4Y)HslXras$>KF4m?rzb7V& zX9GyrWp2=d)By4Qb#}Tb$bq^WZT&Ve52t4nlX2!!;@H!!OHwd`onE&9*Aumm`IjXX zvsNhHL)Ey)2^T(sj1E)69RT=0XnicNtXzJ+_NekeY!RaAh34%aZv%u=|-pR>Fznsa>>3(_jD+RS{4e_i;sS<&+}5C4NV zU4+{{8@6Z`U28Cz`vRgC-w}LJU-JnChY&p>i@|Fi_d$NtC@HaivRL@#-RW2l8B(eS zCjF^f6xFYA7RY?eAJSjEqcF|eZ%T2oRSPNcy+P*k(;du3bLz

Qkwsv7P>0O@J$qZ%Ke5tRQ?y@pl3Z>M$OrF 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 OEksdOq4eR4H~#^Iwk*m3 diff --git a/mods/mechs_by_shegar/icons/projectiles.dmi b/mods/mechs_by_shegar/icons/projectiles.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c3aa143def9ba760f7ea2c2d8b163b93e18df25c GIT binary patch literal 77924 zcmX`S1yoy2*D#s@g#?#U+`UlT-QB&oLkq>dxD+T(X>oV=;!bgQcZcE{8o1&4-v6$Z zNhasanb~Ky%S5Ou%b+0>A_D*bG&xyGbpQa)jlfx~`IzF6Pdk z99=&-*aHBb=@lQ99HxL;@mdFB-Tf{jk5j91zC#p7r zb>vp;376}>6Aw*)#W)VmrT4e*@Oyf?l)1jRY4Q<6?_aW7Sv4|b!K*5aHmv)?eX^G; zk=N?^fK4fB_j{~pGteXJSLD2-&F`@>=gZMab6Cf_*(Tm(!!9jtZVX9^mNIH59f+## zid^pY8)Rw6C`A)EX6F&0uFg*wz82FfD0XOS@b_%+p?3r62RS+3ZM5WJB>h|@PIHvj z(OVCF9Hzc)bS7H&srD4beCK7G_*=j9I=;&d=kABkc3<0^F_w${47To=;C2WnzNx{f zvBfOt7@uiVy?hG;hVkFm{k@EUGs2@f!gTEJou4m zn?EGU*DyvwrUuT+S*n0p@x>G2Sy|d+@B1|;QdD~c*Hcm=tEVc###-##tP(0m-td!+ zq1E8NeUCOse;flMeB8IUL7;Dw@9j=Dwa&^JhbkKj(I3CfgH>tk1~`&@-o_^n^JFT1 z#^cu+FJ50FIUAw-tDQg$)^wh zcC_fD2_I0rP0h|_@eEsVb2z`?sjnnmD(%hdwZIYv9Z?tHbWJG0$&UL zyTTNh-B*f10OT=faF&ZhKUnb?_Htj_4tf(4^ z-ED)i2b5ODq;g*4-3rRl#^Co1spU2&A{ZVjqX^v;09neg{>JSk=yyNP`N5&ck=q_Z z&!E&%?%XDX-MpZXEL@Z2H@257V9rKJLoHU^N$_qrT}19CCc|yOe0Q}sj{GKDeQsBV zZgXDq1|`*r>@DW^QYA@Lgj~;UBtHR8o%@EYI=!tWDANn53z-QSJgTZ@gkHrKS;b-X zUF+h$Sp_$BljgdvOD*EI20orlXoE?FXTwjB6GJ6-#2-k(X~yO!B9Q<9kOSl-#WX$B zPusuxXwJ3YzoaON!=;E~!+|k-q^PGtPWq8?Gq7;gF5fCg=-pUX$OO*|Bhww!-+dA) zh%NfyyG;DW|5kG*lhmJBfu#oNt2}OTG{<*b{omx6a;$L93UCyG7I4ku&(NCt)FqCT zr_puWyVG-lDrjno?^AihL9NJR<+x9KHL(Ud$ZL`GpPSb#ZpLGuN0?2>#MGOab4FNq(p3VwYh^aqig2->W zIx4i0f3G)mjGH0)uIEca8Lc;>{-V(oczKeo5Xo2nhFAea*rWYYMX{<8KJr^zkjXrH zu-rxix@^;LUT(TJwAwICMCg1KQ#p@(jg}E|c&^5bC97!?*<|Tp^BF)7kXsZA6Fa(d zK)Po2h=RvsUdk3lfNK38&?`-vmYnM*kBX#9BtEmxuIuzp4}2R?mM(09ut`85Jk*MckVDg9 zRdjf-vXACDJ0_x;l;v$>2B$79@(nt31i?8{809lz*2xHMd^E%24Z_HR-lj4E2CGfN zUDT4F`6>%GLwdCt`Rr~CC$T%z9O@OYuLCJJ{@F^4D47wc%Ws4%h)}j^RC}HfrHA~u z_`}@T@o*FNO6>c*a1w?xzy2iW6v+T=U2%;-C9RjJN>Oe*cqdK}H_~5J>7v$~0zYS41@`bIb zeSh>=Qy9vHU7AI_YV(ZBzhk#&2qq)&Wh<@r-6x!gbx|uk&(p#NYzj z+60*)AH$qCk7@vAH*;D<<633fUY!o*44RA*_^1CqQ?;4)BL3}sGHarjX;SQ zW^x|{B_BJJrv=+KwAh}#0rUp04T39joKu!;oAFMXeMc2&S@0Ll>SBvFRTaM9Q^+$R zY-_xRmHd(X_wpzE1EM>)(H-OaWhngI&`<_=mT&N+U=juQQvxk+rxNS9{5p=e3G@rHY(M_peS+dQ#VJ&JZx)FUX&a1G>j2sIH0}X7rhC4BiFqZG8KVNGTqZK7ZlI z0^?UaEl%X&zV#tGMRa@?Xp?l$fvKlB&0U^7!XN3YUxA=@6fyAcUH0)`yj`o2RQg3)wKMjlSyN2$JMLL3>>^?RWK&*j>fKxG z1s-+i%pIgiJz*sKC8nS}Kk4Y;9OaYlm=>E5r32w8 zd3|ALq9`{`wt4@|PS*c!!tp=5O z0A|KmgdDJ+TAXa8G|z@we6mS?iLl|zr0d_82k-WJb+wJdWM(gZL&rUP0c)5F$ZtE{ z)qM*=#rhP>gN*&hFExoGA3S-tKcSITDH0zuIX3g)1Lv9NB#1vEmqhMLgKJ;86%|gp zw^O3B;Lo{UQ_9<|zi}7`q{7}~vWA+c--5+;Jc+Q@A#HL6kgT&mw*_9CRzWZ#AQ=WK z5NquFv*pLf1J^CdK|!pzN(1XX%b%O^9+r>YxqDhZ-OM1coAiIPKEn&{H=qIqO=7*$ zYg-}RDCqpCG>bV7$RX@Q<(ObCsN+kX^s1c^@Z{f^=KaqiP?Pq=3m^ye*i{$fR2||t zKwSe+@#8Tis{Oi}L2b9Mioa{+-^Dx+|GT0Yg8S|}fiusNFMGppWO%;lrM6KL$YgCs z=KXnQ|9ZycA!NbrTenkPQrVf-`!w+}iyUPB!x6!5_-u`gHji9-j_zU8rlu1W%M!B& zn{s&8Y7iA-HDFrT8RearL&~TY%ici19t?x9KP;6T+*@0Hpco37vV&NK-QONms9=WF zP{2#$qsv4>_i_(XN6@3P5COcbeuUpMZRbD0OpJ|FUc0-bNK#PKGY03$yU=aeGgek< zhM5s2Y37tUYnA+>ByK6q^llH{dtjyAT9Z_W9P`6wrL@G1E4pS4O6E6hWs2 zz9_rNe@0cl;OGVKX+r``&CXR+)$!UjU~^b{SFdYXm*4?^^V(gev9g;;t_t4y{E`2C z!Hfdi-uU%!qPM+NaF|lO$rN>usWc6<8-@5H&8(E<0CC@cEf!tjO(uo5`w8iW#|y8E z#M}K|+6%`6EIot=5eKOoodohs7f$2ZYMz*fpyFfka3t-X>NU;&j{)C=rjt z5O~Oy;8z^c>ve(?vP2Fq-51@u79ELqy=CvAfvyY3x}$Mp;F2;=bqo`ay)|<4=F;Jf z9ZRPDMTdd=?1nc+YL%U4A)Y4#k!wbb&AifL%PT7dWUKe^|E{ZE2xw?%R)@PI^<*mQ zRp2~3kfaB05J&w6NLVhJ;Z+PA+G;4)&7W9)Z%bYi-x%AyQBCbrPeFnan`Jn?{-R6a zc9#-vm(udFTP_^R2ET@r$-jClq{MI}8Q;1z*08Z>_G7IDW2AS_s?E<_!%q`xB1Smc zCnk>~4eA*`Vu4Nf>tvhjUxAxQj?Kre3ym<#iRN8^4D@g5zcM|f&ik&z za6f;JEApcp&?$G?gke*&+=;qGvaldX>9qVYAShSRi!%TjK&K(OaeC45+;(ejmGya+ zMhC8a65BLl*m;)kcFt;wE!>WPB1gCjf%x>oFApiO0{{t7Pvi! zpnFhWcfsCy6m*1!k0p{ZhSW9@`JVV6vYAQxUS$|@b*B$tM)~+>u$zg-AGty_K-=wD z)XZP+LA5*s{|x79^tN0B|6lO^A4QDRDXw}rUWWEc>kdi0s1i_M4vLXGJl*HO6o4{) zRfOjSVUE)Bz4(dbANrkM7;$(;Pcr&=Q(Vo{f$GE&qhteSfU%O47u>Y4CD0wrd-Su& zM-gF@00#rGVDu&_IBBseY0%bG4$r)F|rNg^R2a->GSZFTU&NqUOxSHn?P;P|X z(t)ddVZ^1oC6rBUgspl6gaJ?Cx$j>C_VrRa9fiH}e+UK#v2t^wzA=?uq@D*fDgJk( zTCTjivU7ZjZXJRkhEEnbbF^!S_#eC=jd)d@{9f&q!|FM1+A`KxNU_j9xPLW|TvNU$ z>#6Sh(nb7xxt|bNjJ10(#H3koSGT}zU-tt@4bv|;uz`61QPs?AW(=`D2?NAY+m1yt zB%I%4Mk|9iUMbaI?v|y~+Cw}3!RF=9;WoDD0Z~cFJ%Ck%31{<2Pt*ol=|hHeTmB_U z9WQ*nU)_*{=YCDjecHbO{0Yr!32)OM{NT<}hMUPkCf+1nSOF>y;X;xV1( zY4m&Fm1`0p_|Cq0MCu+uSzw~J;)uc=% zA{M(KU-rke!AA~a1s$h3I6TiA9)Iz|BWoie+z64|ScPqoq;y6eXb_Pp5ljWc9wPb0 zzW&WId*|Pbll7S!T4K$YR6$flMzOmzvg;`wF~~B^b;crrp_eimWa~FxKO#VKGGs@?ggV`1G)9ZJ>iH-)#xyShDx!bu*$O-ubY5R3H#zGVP6o_FITfhhXJoKQG$ zPn(sbx+K+WFa)bawt1w1QXL6PA{Jgd)_XP^(Owy1hpF9IX0TwyYcxak(CJ>`@nKHM zcy92EL(O?;ah{)oC{(K8d5`}X1@KuDlB)~}(+4ENFYJ1uiE@)~gkUtMZx zNdeB@o_GzTHb+V{FNy#z4SqCHnVcB9F&!Kj0t2+7jinKEbEBg4lw*dULYhBFJ-pl$Aj9p}9x3Ia01@b1rY#5 zvsAM6^ef5^8riju$(l$5n70;1;q!OU9{+W4E0(^;XdbJj(qECh==~rH@?D!;xsaaL zL3KRXXEywCv9z#WP#}x1KIR!38S+45x$-wUP)Q^Hw+w%$Q4n_&TUpjFWOURtSPy~;kxR;o>HC?qV$B;qjSu4%sY zm$!@?JmzWhuZRo318tuB2#Pzo-+o@A(79@eZ8GS54kHw1J(PruD>)g#m%;+fS_#iy zn-wDGg{tF=r+3lVgT_s=;oh=ACK5Q3%cMvD1gYX*7i?Uw0uxjd&SsO|4!u_x zT|E7;&lwO%OP$Ctr6(}!A~e#apC&_qU*dQ@w-|yT4UqYp?WAEc2(suE&i0OIe0~ql zOD4w|(0$WhyzXzvFM`k|fZfe_$^UkXk|Mr8^t;t+u_WaONoU#LM=FB>&4zo7p0wN7 zhoOT+4j~K|#ZsEdjqI-@oeNn(g^ievk-Vx7JbPdm3UOqP| zkEKRI*Tzr5dSoq!@OkTBg{s8fOHvvja!~(o9ZiYz_2Ra#owO@AMBc=#bv;or>pT9T za|<=*gdF_du`hc?=ZL4b?|sous;D*LKehZ=n^iy@?K=F@rmmdj z(t*nYEuFU`?gtQWBsp{`ja~5zefo^}9(PA)uGIfV;Y(2cJO*cg*6Z{e3y1^o8m?0q z5yL)5BtTafN%g(Oe-|igsH-yWndcor>VQy;M=gdQ&}EPfo0M1N9w~jJC>97R+?Ykx z)TY*F@b=BzFDfBetrQx8cj=%!@I4ZG#tU{%2v;o*n-8~kT#|%2PB2>RAuo35voqAF z`}eS(koEU?Y{OfX#kT=GbFxpS_;QgBtk~_TwcE&R)OUZlY3R5MtOgmtm=19DR8=G_ z7DAcoG*&OTE(A2R>T5u^63I0BX>f>fBuPSz1;u$ zXO}enq{abvo0hu8Wn6kM*14||M2_7L3!-`@1(Jv37aRDtx_XWWEch_wW#xSuV2(7h zRF(dimCN+yb?$E1`>qXVPb0Z)`@)*x2;pJfh7H=Kf>4Yd&L)nS_MI-moK zR~x->2(@J0@;|-nP1MzONX47N(g38wk;bf%;4?umRZVq2t<|jT@MQsvKFvd0(2&>b z&65gBxt^efB&|%ojcpxeudkcgA2!$g+9_Q>zh=#QCAi{|f`KQ@NrK?34p2|FDnb-F zs`B3PN+ZwT#fEvs7Qke^`GVf9i_q=dGHQF(o7h95V3_+x=>)UFBnefUA$QBL6^=)9 zv*d3p41B+S032$OHjqx7n0zB937W)yb+o7@VH2KzUamQbZ5uJwK7`-|5;gy zAu9jBy@lOn)yT6v?fM!ufgoudDO;t!?j-Elcq`Zi`W~Jw{v5Pf1Ubx4$XsIB2=Vr(&2toM zjkEr1Rrhcs8?Jgc?|WMY-O4Xz+*qvdpx!38pUO*1MQyF= z04B<6Snj0u{fq+g<}pD>yLb(O_JA5JhLY5T%4l$8UyJK>9@Zw9(rr=zQ!Ef8yP*!J z;%^2xi*BD*wsE9E9O30KDFr-tie6q@m_&{yTzByR(JIruR~urRO>bg;P&MVh9PMjQ{v1_) z0rLu_4vvrke7d^Jv5|O|PrJWwcO+fV`BkiQU(6T-5~>f>B-+W9BwM(}jx&Bpwj0A< zFPoOv<>I&k{V454FKEk(=R4^&%??JEd*1aQZ42$ii>eK~g?hYQ^9dcBq@2aK(Tyu@0Vx7y?fy` z-TT6s?dL)XZ$Fj`PCd1oWa5)!pBh|!BPa76^~S<|6adWc%dLB)^F(_=&{q=yY+j6q z^0ps@(U(5Rj~*zb0(YD=w%3RvJHkr>*Uy7j_Vl_(dDp9^vx;hY zb;m+dywfiY(dRG)rhbp znoF;<4-C>M(5n=96)lHRIcWcLEU|KEW&h7B%Xsw&3BP{%>wnD*FP8jM07Y=%oauu2 zzz{u%l@g{5dvlXnlG=aYF|1o|buT>IIs9ABD#0Vq5wR`wZh0Nq*?v)x(umi=bv+I@ zaml42wAMBvg()3`njGk~cv=OEVqm<6sh41>w-(RiS-s!iD|Yl)NgkK8{zh9~2h@69 zxsY0VZl$+hhPqe)#s)WW4SdM&@i-c-{Rmb#I-`)B{n=bDkeRQT@x-Wc!p7Ef_MTti z+7|XeFOs@^oXKtCzFI$m=P>39YP(=HWl68&VfQtnJq>la>(4o|0C?3ncwnfi!zCsT zPJk)L99s2*v7aX-g z_r3COVKfO-)ns6BxVr{HwQ<`8;cuQq0KnO~Y;wZ`Ulcc>7ZA`e_qQ@EOZMrcJJ$r@ zc!hZZ)xRM_iIwWeOjg{vNQr*M2IIP~-+rj`V@1~Dbof3Iccy2%fcdX?-Z}Q(IkIfbeARo|5PF+Jd#)#w7vOSX;`|--uifq{mK5^$;f>F@EB4)LZOxFS7+V-E{PU zoc+drMB9g+#@^J_#=dU&D%o${1hj4aNHo&jvHg<%UkJ$Yr z-}c;CRnzG_H~0HjJf)Vq=QrqKYlIWcW;1TOMgZrcw|W1DPs>Z$w62^j-L>Zu%@R8S zyM?V_m&H?_ngf7bBagQa*4We%EivBZcp=_SUp#+bqXUdfdzw>pl00Ne?mi)2T`1uT&V{m4v9e zA#xPCneW%zD^Z!?`_7D^)kN{r%EiZ-9H^ey!>Lx~bP&2(TFJjNaCvhDmdE0@q)H=MU@w_i#+w~+ZW(C`J%3`?DEGPblc+~aK?Ug$@^V`^cDZF7NGW{PKeYsIa4Z9j@>+NP7}KdeW{I6v6jp33tYd2is<9) zborkjl^Nu_qaSc;D^nRQ47qd$Q}k&STik?hlW3yt6)mz+7JLy!hKj5$CN=e2&+*EU$?%rQjES< z+(9SsCi{#fkPesH6S8vD+sS>12$Fv{ zWyn^sIL_AlU~^g(-0~j>$n!%kp=>{jkefNKLxPreLcrz~S~!8H7AHt-MksLaM5un* z`R=uurV-qJ{^nZGODzVNMZv?-25zWSfpeUi9WZ!J$yS2aAyL?8DqiX@A|qNf)0pgrwUjm#1EgNHe9 znwzi4rzicB*HT^O(0Hm^N(NURyTI3Zt|gp(#gRItafS(^B(;ypf$0_}z1AK0JP1sv zRbT~cgf;}VN1T5x@Q2|;R3>dDc$V;kkvT{I5Y3=t4(@Uu8=f5eYd(nn8`onW5)5mB zn|N<#%J8Uv1T1?30eurAD42cWG(=bdn;tXP%gDoMA64((V2?!T!M|9%c;51KZ;VQg z)Rpc)Z=n~4FXRx_W6X(a(eh8RhVX9rRl2wTq{BUBDvX72JGG;5;=+OD17*bnW%57F z4c0 z*A17QM=Ka>(rEA62niLKudY7CLl9##y2=7!VIue`#nbLa3{~RZQWAwHZm_=nSoCn) zGs^!*rStPpG<`|(fCM4H@!YLU?TP@Y1qow2mBx5e9q|LDiCF5(ET7Eh+XOeiE}43Ym(9UoXgv6%7wgS-Bo5B>^9udsuo+7hqw_OAfOgZ1!IcdsuCQw z=nxSKbDPcWf90!k+9n7D1n<&4M)YZyb^~;@?F-#(Hm`ihMc^G}{Ez7e<4g#Cd>R@~ zjk6pY91r?q_J*mp@{gI6wEMeST8oeU7J9W18fpQ!q8PumY<%YQ$~c`wZur;j^@3J@ z-k_4zK$ts^3?O`XnK4H<@;;*Z)cXx>^_x%*ThoJ@*BtMNgI}G3x5JCy>eutXEhkxz z20tw)cp7E1GSdRa%0zniIOsJqy49Gjgcm%ieSoEdu@gRkIf0PjdQJO(451NBOON#EjOrfoNe3^R%G zjVqeAy6bj$wRAywe=cMSxZ>`XW0J$q7e6!hCWL|?;!cb)-dVQS1RlYMqLr!Xw!<5u zY4jn3#B-(z0!X}y7D5<;n-I|_33oIlvCEgV4UP!9Lo@x-d0E1`I0TcN3h0pL?HB=H z;K)f)^2NXsnSofJs_Q1$X|DyDb`bZ}4Ld@*$Avu+rFVUq2yw;#93h)zZI2|0a+@B- z@a(9*r9i&DfcDRhoM7G<&(-I*w;Mv{s{BGHe9v6e<>ch_VufT7!mOY10E;w4&%w4} z&un&MIAj{~nIHhpFITxX^eP~@0wWt6Kp2orYk}Uq@}0Z43`2}}0pRZ|%B$0Ep4b86 zLw;KYZUrBM5_yiPPZZ#2^#isLElIM!%RgdI@67or^G%f5N!@Ce+vr9UrF8g1_pY?g zMRj^Va=tILrtwiKo}hHc+1GhF=GHVrY9Z7{0qOaxrK5tF$fDa_Oi#!pG`47Btvz=) zf1>nes_64i`M3h;gx@IpAajzDbQOKbXmU1P+#w+40~uWP=}rwE`{EPh$0-}wcd~mv z4}LV@TSA>Ec<0I7usJ+rl`i7^E@`C-6&+QUj``Mh$~ zeu`qeIddbCkN8;NQ#4H?@+F{5*da0Py!soqAD_Y8m*N{PftY!RWJ>Mg)Gb|hAHm}5 zs(+}WZfTPSF#HBWn2>QKMdCq=D<(q+0W6UGL;V0#IqxkW)HH7Ar zKVNk&KbyEhDZc+`zfD5R1{iCY31YE!LU{$V zyub(aS@~ShEGYM0Ukx7XHWvUAU4!szNCx}8JZ*d>(ciu^Bbn5kh5&?9BjNXNHQTcg>oaL0Kg~lhPLa6J?agrXDYMD4cW2a{Q9)}LwM`;CPm3> z`+I@qaZq#jYlH+E=8Y(*M7Jh;*ZEBb;8QHg(&;6jPopTa#!D2;SH;KJ2-98+`L*4Ja!C(3|w^nH`rrr6q1+JJNNMO2gPA6HZ?waS+n zsA<+LeVUtPD#GCVKkoLBlgyXSrs<-`3yhXrd3CE;U(jb83!HbfS2XVjyeDvz0VD;_ zDJMTK= z?J^7zn53a=Dcf-QxbdVOBRm8d4F^{J(Rv{~y+g0ni`8kr#S3xi7{ptTS4u8@z6yWb zh}3*pOu!%aW4g6gpz4*7xoiA-CC%<4oPq@Cg(lq_cR22vSj{gs;8)9bZ6_-ep}nxM zK5V?Jzey*3*qn(Z_yMW%bZoXAB?dGt@_9Dx{Hx|=+i>w~dGkR97~Bn^p#w$Q)R4yH zp(X_}Pq6?tr!HvV9OwBy#4PK{sdgmg(szB-v39bX@dAApPWEQi4q|z^9}ww(7HJ<) zdYOwh{<9OU<1({Aus6`3hG}%_f%6WEJ@ErtMa}^f@BKKaWG4)jFWev(UHgalkUDAh z<=L#-s#@|U@Bw==D|A9~Pkasay-Z3XX-UUmUc$eLO8?xk*a?#xRdTc5j{uECF`IU! z*ji!9Hsq{JP2=G3en!v)%nVH&YG{YwDm|Xi9=fd>C_}q??tuBch?Y#O)kblFeaTYZ zs~m!?&wxog?aF97S}SG|y;znd4L3&8AwyilMEf5x;}SZ{`9?^cZ8!~Bt8U!wIEMuOq<`4Ta{R6Y!JH zh;@0Nnh1B`n31n6DHEQeaHGSlSMxy5#LX&rqv>P$5<@)oLs$Ij&J@x%k7)T)B}NCh zbFU;o67>EHeXnsFy8rb_1~NTxwpq9QtP1|Sa5b}RT@hg8i7X3Pe!1@i47^QhY+nX+ zRXul5&}n-&Si&!a5)uazJ?H(U+HWRD66`8~cJ)Co(%&Jm450`XNttZ>d98>}r;!n; zzy*`o6O$11=TtIgLP-p%!uVUH(cKI$Psw1{(0O8n!C$;ZOHt>r9-Mn-QS__A9w9v8 zaVx^R1O79*6Jd~(KdF?#UuFWgI{YdxS=fyc;(dZRdx0H9r4Z?p1t3xPn9l5&vD5L> ze8hUD{pXqZaA6Lz2?oe95D)(L&Cib11?)*OlI9;=vsi^)&a?EEmV4`o0e*Ns3$+*> z&CI?9@dInfzg+qg?z1Aaj8l-XL5BVfzx<)TR0mHB#wiZ$7p`oC)%F;Z*AxL_*@pl} z`NX7L_^Xyoj6L7_?ju)u^dgrFynq#7^}TDk8d{Jc{75CV*DPDS`7z+ z@YzImes;vO5E$1h*nfA0@k96TBe97ojl<=a%Ui=Ik-~4XL9$dm$>hIq-r1S1b`d4hHJQG*Us0veoBjgO`qjBrC5M|L6;pz*X<;MeD$_M10Dc?j*s2#9V7 zL~jl>`VhT9@B7E*4YT(VV>NxU-xLchh?oJg6%S(hygl?3AtN%GOs(+}5#aKeEA|{; zC_KkKZ$WTAc;0PtV0NHwTRM`)bppXfQJbbs;E@6fcji`B>G&aWt(s}VV2qq*J6RHHyT4S*`fFr%8?HanB z`7=nZI^Y^VjS+R3&^mJB@It;xdl{F6&-_)Vb9>egzb)MSXSwOhQYo^g;7b9fGz2?S z{Y9<`5%>nHIDR3RyI#m9JYgh-VotGaG$%KI*Yw};%R9lIL>=;Ajz&-&T_*?hk?e5d zk6OS~Nh1mOlM=;zECf*Sf8~|OuyYIgL_Q}A+KpcuaS-CQiyeyPB`HsZ^Bv@&#?<*( zg#^@=4+F(uI*K$lFBO2WQe~@VTLH%c;(UgPGh`# zqv7B(ix8Xm$HkA`1hMKmyp)X~LQ|0xhar_yh+9)}WkIs_Ki&H*Kh5jZ&$-P+i()ZtuaIh(-l417;pa07~_ET4y(%%qCAef5gvYUvFCfWapha7PP(@Z?x{H{GS zw7hfrxY3AlkM$MYQ~uVibI#DfiwKaNccj9WRxBAy2MS{Oslm|-%sx7GG}u^!Wv1aw zUAkZt8~XlQ3$*!>^;#>~LoL|j=a)3ir)rx0;w5@tn72ywm=HaOmP6aDIlReO766fi zmCA;bSY_J%aWP@c4Bj4IX`5maiur%jFWn~*FbKi2-cz(&B4vWYMS}L?u&5hp)qC1< zQqf9}G*k{#mOev%?lMoIj>_-OY|g;lTvEn%%i``<%uDqD!j-tbuqerbQT%^72K>l4 zL?-g9TVf0IpD0;V*qW^i8KfLalzN5I}UBL2iB=UW(Xd6q>R7-STfkpMBJZ0 zneF(Saz16o8y-AYPAK>+M!QKs&)i;I@y0WV{9)SFy(z%gf9KQd|2)jufD+W1R5c>Y z87j)jfJf4goOVBI1@Rom!;9}M;~N{hDQ#~b_&;B?1C)%HBn44kYz%UYjdW9Q67ua2 zCExcdYPRh&OznV!HWg-;wt^%_HF5`t0v(m&CQ368#JRP(00D$P7_T8J@iSklY4x z{jo_1;3>g|N&&=SUZm<(n>|9`L>Y$aQKbBj-7>(Y(zXg!jQc@llPd(1IYU@-ZPINQ zB89tFlKfVWkE`wp);Ac|;^Wd-u+42WDs?`(p-`mH7-+>W+=ks+?XcdGopZ+8BH%)m z5KJDk=kqChUeu?4?}N6^PQC(4js=#|!~J-c?n)$p z;T6}-JjwuUBY5DtHqc2FjwYDIY$Db>g-Req#27g;J@-+Z8NM=<;Ck1oIK^f zlv3^d{)-+YytylNUM(9Y;0Aiqs+*?U>o|2K8yklO2vBU3oGZiG+hP70qPX={if2;! z`(^GCCb1PmPWH#_^FfIsTZmy6F1m1CC7sW?@hKImCwW3unVcCU%w0=XnNlEm{(txc zXzWHcSVscs?>C$%xmQUls&OX*jXEQLZ}T~N)F0;-aOI#Svp6?^%ZqXX%=mh!({1Ah zmft4^D53yf;{p;f>|BEbH6cE~;P04nSxtd$Xj4xHaV}$hLzq3sI@|!J1X^)>abJO@ zeH2wLpevceU5N(iJXq8h$Ls`P!i>&U>MuKo6V9>dD&IX{rli|+jmU_UL#AXMhVp)@ zbR{6d`vfbm*?#@B-(;iF@g?rt6S_>D(Db9k&xlFV_7?`FB7bhGXn1!V3mh6a=VzT; zbXT^#g5)eyK=CU&8O)?$0W^kzTF|V^Fn0T6LY`KYIJd((X%fu65834K#=7~){=A}g z(myzLwu&p*dE78$lS2>NJ+50@|B(OAE!ng)jWHt^&rpR1n*|+{+FCxVy8$|hTx&f?yo=$D_m??P$UPCyN2qBik zrl_U%S^CGilQ#@*Rf{kvAwoaD$)uU3UhXz+r<0;dF`fgHhX^b5BoT@HAwQ63+&$Fa zTx|3K-|u+s9f#>uTgfyGAvXvwUt>e!OTpDvZ43kzIHLLI)oPtP-Url287@*bGLu71 zKk1XbiL1To%^kI1QS5hr&Dya(?v6a^aVs!E`Y3Ixq=Fg|X%TlYpIK$YEB$Bx4obaHiQI%XY-7 zw$3K~E>2)vw#5X%>IhWy?Uia<2DsA4(|Iv5r!?lE0yAapIfI18Ak}#t z`=EK&K$%?a9HWt#?$(Ba2C&3t`2) zs?1162MMRWFX01{G~R+@m_Bm#jn1XF?z9OiO(o&8w5XWXQeJCF4VRZZLV@u`$3`Fj@mdveHBB@J^ndpQuPssB60n@U*6aNp%=1^-_3%xw4z^IcWb=V zz^)GfLF~1({KZc)TxJ;uoJK}Q|rTmUj=X=m_LE=L8+|%i>uL2 z`v#%x#&&57tD$K#YL?UD8H_3TmT;efFv^!$jb1fM$nQy3PFQJ@_$;EL5tk;Q9tvcRq2%$ut zXZ{%rfj$b*5siI*CUzef*)qae-m$59K@jb@vf=lw>wP^e{0kKtg1WdG)X@)<{oH#P ztYXP2uaN9OH(GG-{ZF**v6|`}EVzDIjPG4PQRSin$PwCTZ~DHWB?G&x)P1*C`sZQQ zmapa{Oy<#O!v&F>ZU1setl+)shMf<>7`W^vi`f}O%1UO(u)AEVyMX<5VU|L(_Vru* z8*@>YXA=%PZsgpwa8&8w4wt9wEz_M)kQE1fTFEhIv_T~fnk2L8@l2`G?@;@_owVVH z)A{c%ZFSW6>0%03;~YPCgAAR1-}apf4k8vKlyt1n!F?UYlQX-60?~{HWX9Q+XViAv zOjS%OmHB20&#EKa0NA<)Od3hKSyIc*MZ`65)sTXf<^S#gA8TL>$N$z;9y{&uQZk0D;b>rb$`!;_o_t0?;i^5df%L%JN$o~{RL25 zLDN49FOVR?LvRlSNN{)8;3PqVySv-sE&+nO1PJc#?(R--cUxrd;d$Qo`+v9UR^6&w z1-pmCoSEsKp6*}IbkB);bS>q6lu+4PI1I=KX#geZY5~y%b3q;i5mh$&TZrlqP3?P`3FyO`} zI4ZfB^MmmI$P90gisyOoR^%~vG|SWFvdzC2o7J$}&0N0iPIx^lQUU39K_KTK3do+o zXY|`ZIAgA`evnvvr@f0zwgtF6mDzSc)JS(w$^@;RwhccJ!{ZBN?C=h2q5r9BTa==O zb6#y(jNHtzf3<(qzsHdA8^de(2~b7A*Bl~-EkJ}E)lk6NWm>F8WC^1#C##z8YnG4t zS6Vn6r1h2fMmsCO&+)qn$jj&QV`7NHd2|5TS9bDddsMpzcyY{#vmrr|*T3BolUCU9 zr@-tyF>dC)CaAFr18E|%8u%4bF`wN$OdYVzJlF{MUc-b&Kzd1I>Q$s$<*yet$)R%@cPuG8OKMGSK z0J$EfAUuNqjRgRr!TkTQd?DE9`yB=`4tz~Cu@mkKCyPb4@$dS%ZaE=T0!-`xay@QI z<5^Drc8)p$AiVR{^+SA(6au1%@M3>`U8kDlB_cTM;mJN^P9e7*s_Y<|QVnU&+Iy^>bO{gU(ZZ{Nygs*7MMG1ti6+v;3C}A$WF8 zY3P9-a;E6vJQraC7r_7M4)a{DX_Fy98e(z{>}x<7@Dr1b_{vy4!JB>l+wak9-OVU` zH#d}1H*;IhA&%axt)%Gu56Aq#2i-j6a&B*QY?GVuziJPI*}z7N9erN#mS3~>Sjpq4 z$PL)#bH65e{BeO*0){3UHylVdt!cEA#+21Bu0=N&x3irU>nuODE}ufWa$QuxU+>1D zq6z{YBN!^Fv%W+(itks*rV?zxkDz87S5ig8ZkjKWxj+i!Qx% z7A;;_va$g*2c1dg9a;6=8H_Bn_#HC`eu@jXG}s-dr^h29XwV-{Eg9Z}M%C&dy2*80 z$$W2X*r}feZG?Mn)Bm@{exSu@I-NDaaecGT2IX#vpNT8M73Ou%GyJzoge+8vLSOKr zEiK^f^LO;7@(%V1c|Y%SGw`K6>Agpwdr&H6#ltLj!KwPi@AOo7RO&4V@sPApwdlEe zWsMocd!_Ogxw^Q$!EWX;CQJK(2NW)WC)_gOhvz+qzO3+wy ztqsg^_LIz&?jTUziZ((>#>Mp`KT0DWe3 zj#>Qebn#q;)-f)LmT~*}K8qo$g1m~|M~NS0DRn~=N{LeQyf&wAKAY&n_sO=;p1JR7 z6e&91+~8e&aHs43>LK`1d-x!Z6okQZX>fkmoxoX%H&>GO*nSCqT8s7@tS&D5*^pKB zR22IJ`_oxs_Q~z4K(4*%a!s;rvvqA2-P=h0#$QK0fxnK-EE6h)Syok?SjzJK!}0$~ z3vB}Cif1qSZ28@jGloN0SjAqwzup}(f?S^*UKGEFJsQ2v8kirXMn`XS)>7T^VRzVi znTlThTQq_yjKYgWq|0-3yLz-nu;@~KIXuIiyUf%ZMy>t+hMb3ibTwna2XyQKf@$O< zMGkvox}JbR@o(C8b=#HFNuDPt5somedyEUsB&p~qsIXh~`;a`$UaUA3B9M^Tfmg$+ z1$yrB6>H1U_8$6{%{o-vzSohe>qbI*5O2^Ro~~EgqG8A0s6pAfQX9Rg))rurP3r9cDA> z9D3y7uiV^pD#r0BuYdCF?jCPFkIgQ3VSCN}Mb}wbcv2{TrmU{6e)zciVN}?}fmZwR ztM^_}WZQ{`DME(J;K_RpUf#-W=g-I9n^}l>dOy|>Rs`eoE}N}eF1m>=jd(aEi$)WT zLP4MkI?VI!_PLEt<;&YVmP%cGJ`%#d4?pzgh+Vo9w0xhEk(sBJf}R2waTLZvl!tD0 zmxlCZHTj4GGh30ihHWGUQR}nz?vXyIl!&^hn0*^&^FB3!5o)5jtx{gw8{+7Gzv&gzH0s3*?8pg;*_5p1tm<&=J66N)pQv@6UOMZf4I$F z8x7mEn03YyT5CJ|KPNa?6)0$WtPVNV-58HA);R_xr?Ttd zGr;=Hjma14SQxd5u-nzux%Ab5$zJtp4jZ>OXrmzZhj-$t_c`V?<-hQcd0v-9TvGy= z7`=!HJ%g1|a243Qx)ZBWmKHc=kg1cTh7EJs*0whf)nT7d3|&iF6S7M#447`Jv6Q@* zWk)pFk+rO}XwqEZ^2WmPxF3zDhG(mu(>}2}hynbP#_iRXG2TVgsLPaTidqwESnJ3V zue#L;>fbieU8<7(y{;T!#_7s*lFv+&#;ZP5W9a&h>f^zy=1k8&>u;<}fHQFD+tobg zSX-`Qf>AA+J{brr&?sw0q{#FK-PG8*xtVk=@5gMWDUfD4K_zH4g@V+)~TLy_I1~ z9x4n!WR7%f$0cWsV2(GaH_|j3u~f;F3{=Vc7!{K4d8|2%u1&^{uyp<#d@~Vv=Y3x3 zlK#{pvuLdLQOib6MxZt#LNM{5(mij5TV?!uxr7269XDE5n`1DJyVJZO!ODI; zx?=ukRoB1Dpf&5`JA+4X>v`fWt0ekOlZQt$qt;{Mu){#w{v$va>FFhv~Zu7Fd zvr{JjLFd3g$pMywswVhmJ9NvT#Grpy4hZ2mwh?sOZxwvG1An@?%G9eg);?&SxgmvK zmEE~R`=Kq57x8T}TKG7{z`UkZF{%@&@t(Fr0-+t(YQg(-r`xZ?-MT;LZ+)xTr6!rP z;bE|P-V^ky+!S$hfbzrId(-AXNnlWMhf?cbt}@#OhH&X$g|-R+0~BGK8gyTGs9|&g zzAM}v4?b}3<(SF0(xft-S+{u;F0E49XEzaN_i4@MDUkoh{ncJCU&(Z4BSmFevp7GDsnWl1V|it*_(fHJQ9Q+gj3(%=s4Fm!+=hm zIpvR!+FNciq1U|+nL3Z(OKa+n)$h+7Y#y7D7vEyvpPe-g+t40%Sf%FwtII)qx^r3G z0q!SxEU#-VRGH|_7<`WfpiO@UKX))-v>zH*;OsZ-K+!+x=)o)1)YPR26eUhvz~*it z=F@z&Q_6MFNSX^$UADnK*CQ?wR5X02q?+EM0as;kYqj?ajLNuA@8v<6{I$2^`}9## zy{ru)`3y@rXS*j^-)05BW(DcQRDPd<`DOhZwNK%O#Q3*rYY>RXTo7TsS}-H}PsyO5 z4eNT?K`+6NT4yz2K?w$(LvHZyLS^(FbVtGCw!Y=YTjr+@6p>E=`Zk(U&s43drMA4b zdT0M4u0Oigla0^yVCB!)_pi{WV!4HmfeJPz7P{nKPv*YyhTPMDE5{R2!Nln!5{TPp zc`k+ds7yP_^n@k^aQ*W|+Qrtqxmx5z$T5;rJK)QlDt?%H} zm6JSISu|VSVe-q`4u|lL2GnFBA4E+Gat+2mAA>I_q=;>DPt<57`aJz)_=(HLd3a;B zaD+%c`mS!wj!y@M%s(DyGG^VljP9GcAtPrzeSBw=3!GIF;o<(^n^zmc^la*` zF7OJDa%V}6I*6P-oSu3kBBpoD5$n_Iy}4jVamfTtm?-j<+4e()gV|P2%1b%G?gwzW zk+`&R2@sS|&?6HH3J0)xEs594R?N%&7%#Gl#b5l0+gsDa# zu=5t?T?{Mju-zoS$*`b~gZY$MP7l@7D^jy;D~XTVXH^FV%oD0&XTbt1R}+F|G)Wo^ zOjz)sW-U^-;?eor^%rU_8&o7Vg9yV^2L5vbCc&+%3<>k1ulTT$7&gyRg{dnbFkF|c zy0Nbf)G!sp*n1|3y4lf@GAvu1(p)rH^c!KDZVVTH3S~Ua!j{j8UAXvDE@gasU+me9 zx!+2oLqQEN9zA>K&+1M)KGuhpWf?seOXxo8~YFD%HO#=$#!Z%^Ya)vne$%pPjlRkizTs%4C@ z@;Q75w_^;@4*uvD1SSg@^TDiJs7RDj=!SJdK5qm~!CiU@ts^zoTQ2&+A)x6FC(t+T zGhZq1IcnIC4VSBvsExU8xKPVyXW%J1to)xON!^>j(s;yD1Xlk2 z%Fv{B@$z&%^YlFWxlT|!Uf=#~^`!ro4`nI3K3wgbO}yi^LHr?@a9<&VPFbm}#mO$v zTZ-Rp+NM@DU7fKP@tPHqiv~PVaD6BXz$08tJ2K>`3te^4H_Oql%MxPdK=$1hnHrl^ zx&!t-kNO*e3`GeATDZc*%7}!W;YZR+HH|q#L$y1)_+--buX!-jXy3QIR0&R?Z;4nwC>uE23}a*{F|pIrV{ftP-S?=7ogEn4u5;8*!B zC{R1iLNh*ip#>kkEH>`Ug4nPPpgaN=zXA`*nCCj|9dkEsA+8!#DT=PHL++YCkhC!x zZJ7?J2)j~uq0^Pd@81N?LwWpqWfy{f62&h4s??4`&T!UPczRtd4yYu9!=Y%AmE`(X zDXWodtp%I`G_f%- zpb5Bs;E{ofl^y%h`I#)S=`E$<%FY>na&U`QhL=a@wEY+^sIWdp9gq+yFCf!4$nfFv zMKViPv`3=LNKK6*z>y!oLKJ)$@R*pHpJ6K*xXDBz zDw|606Tq_(R6u9|uYmn!#+?5hh}4z=?LVvKZ-9fI20XJ+1oaj$|C4p=Ao4#8=@>ks znE$)Z_I1JMgec?6{{2wQd(T@Pa~6Zeb#G|V*}|E2t=r$Nx}%ye-zlw|JZ6oxms%>9 zi33}Pg+QEZ_nR#LJ&TI~iLgRBxfK0VHqmF_y_1ocB(#C?qOQ`ov$2ertGnA;7ygXG z7m@yy!u9CXQ|;P^e2VqBAOY8Zsm2_7Z**SWKBH&c`IkUhJmLL*bnsK&^-d)ESHY)? zxRh}P8ORc59L(~orJ=u-!|wZVtw98JErDq8m({{PoPPpjVukU!HbE(<*kAK{R$VIMY(C%mGbJ?;?Vu|C21rI2z zLH5?m$T*kv7-|8y;~|AQ#h$@o#W`~)ewh<(Rf8QCl%Q(8-Y{af>}98tO7?Fz-36y5 zF|Pf&8dw?F;9oOhrgi>Vnr$N@Q82eV@eCp5o%1jEG$V>4KAQZQavdin3va1xd{nq* zoT`&KkAKqkS>fwn${X)b9xEFqo7r3aEWvuCX}b6=UwAD{rzXCR->1HSZ^!uf!oFBN zx;U8}9MfWSy+;fHNz{?as7+yDqmaRV*?KAR-)Ev=dg!xrl<2`HPP>bYii-G15rsUG zl~aY71OGmz0y&@}Kv&IAZ+I=eHu36Ni95bX+9g4rUVZGW$^K7sQPbJp%t4vMokKzj zvk3<1m$raI44z(J10ENgpO7c&RhnK*y*zV4#8>TKJW~ia&s>5%S#yiIZ2}!`jWd>r z7j+U3Sq~&*NI)uzvo95+6!F2J0K6zYqMKpU8ndHGRmp+ng${96AMNT8V_V4|%buUeLTKx9FjK;Uw3~$ zG$^%Wp`F26uRmzy)=mw63hKm@FDmBlUx2({X7V8vF~`t0shPbGR$Y7)xIK!&h5K>{ z9(bxN;(mC}G+FwIm47FfU9C|a*{SR3WeOi*)KwEmP#!(>M?#jCL5n$SfA1Upr{uP- z8q*GqLupUu8!LuD9uHWHkc!4C8Z?NE9m*M;nB?2Ywl!B5v6xU${^nyD3$fh!nPQ0)VTm3zcP(FW( zGT-Azf6Dj#{a~FLFh8;q;4(turSx;ib~bS#sFDuPe{xicFURH0>id)no;g*BrqzB! z0o2+qt11UgBijG)6e2y91B2!Ascud-G`cxA&PiOQ)eez-tw&|=oPh&g?_(O}FSNSg zP!w^UbtS2={pbLJwR1FkSJg*eyZJm4Jp45T0}o0A+YZMFWVuSMO0COC=F#A2olM2+ zFAJ3r9ZYgo*?h!urrev-dcLS=vA0ixr}25*H{A#bQ&z8^_T`kLdg@H@q8?O92~JD! zKAYUR3|COI-EaZbR6jrIH^KM%`{!$}#>@o|T!p|5VP38tRa~zken;0cd49AKIjvu% z?BCNz9btqnhuz>oc#z}pJ_`j^t`gg&Bf35VMD`R#xw5W}>%Qko)?XMn!C#+qY^Qy+ z!aWhBInbi2TC`S9XQYzmK2Ikj{jMxqL!xp ziu9woDn}mZaH$FIcGvF@B2YfBXbyZP7r0Y?{<2)%mt)?t?PcYsIA+@8&I92fM4i-H zk{eYeOF>`z)VJ}s(h)~nlHQyiToNegqEdJviKH97o!X~I6{v(nJ_m8`A3qKtGQNM; zoSUH5@C?tD%RP4X?+k~IuD9ad?+=t*n8TTO+rb&v$H+$(yl)Bju93``bU4P4be2E= z8AHf*U^W`MxN}0&s~Cecb+PC|a{B4SvL;;*h!I3RaPsqh&42uOu4u~?g+hv^Ag8vB zqK3THy5z1YNq%+u^Q-mlqdW*v!JTwANn2TYPe*y3wraPi+ZOYN%ikeh^?YmA-j<21 zZ`?WC(A_8?}L+vA^YhZss!Ag6vzkMZ>Z&oaX2!#obV2~1BlvU{%n}(Il|`4a=&<6 zJ+wd%KvWUg%$5`U(R2RmS{F)<$)>Y!2lshuhJ4&oCJ!x>nLt9=QUQ0GV+Y@j`fCrT z3Q1me&{9wM%6O_TMtAtE``c(66yN^f(k=NL)Y=C!sl}uz-D()G4!6ty_kK(z{qpLz zP5Ya{{ogSqL;Q=>;kt}Q2VzcX*z~pe$hBIuUn}c|br1g7KrQ=l8ZcLP?^@ot+Z$ym%Q)K!Wp$1-JCYFU)mmlb-c_E5@2H zrnTm39pg1W93z{L4P|5`>Dwh`$eB8gq=DPR{xOa(ZQ+yt$hcXJEIGK7;-$=yR$84M zg4cMslu^hl+qYz+4Nk!e)1mw%`MB)ho&I&?q0vekmU8Ycr;D zBd3LULGmv7HM`A!7xVVbsEgJv^n zX6Cv-IGxWI{cdk#x+}Lqv$|hNL>}RRXZ$xduT201K@}G|G{1W*eyfU?aNPIPYkcT}W3KD+osQRcIFNq#r!(gg?c0QlzAD_-SkjhR&Q8x@ zg&emwXz!oD@K;x7&c(=VxgHyd?eg>RXQP6L&1i{h5O-98M3c0dA)(TP_`%lr=OEn{ zcyCsPg*%m7LNUv}nU7pOxRYL8c6+~z&1D(`%n^d`4|5c1a~}haa%}GIBsQ&{F&uxQ zT%Ltr-Fs=Y+{md08|S`%Z{N7G^2UBAK?h^y68X^+#C=B(0xi$tfgexctT=dyZj^l@ ze`GJ6eT#fMe>C2W?3CA~WE99c4%)&l=jpCpg1NydXk9zK88@9mXa&@ZAQH$EnM`lk zuE)rGt_WF0r7yu;t|8`>Lr&> zdO%j=hJAaTjO8MNlavyD>*ZU8zvTGTm$eB?pdw%tMc#%A>ul`W?2?~|5a4rV2~Kh3 z#rVSQZuVp`g6L+c5G4u7`49c#hV1c!X$+mM+yQG&M`hiltb&>+!TEKbMyy|9yeYrhTZD+?J%Ah1aKp zTlkXNZ9{9P46aiv&ifhVc#LIsxQ0wmT`nc$y{{b)-{Yfom|KdzRC#-~GH_n8n#@Vs zjSYW>OV#|9Lck(nA^}i(x8g8?vNw_%MBRt?jSiv^QkgN7q2kY zTGZz@`hcC~@Q_CZftDgGl2-J@2)E?@G>%^L|st)cL4Y-U@_~p zH7<|8GXg4<=%;p5TedMONOJDf3EetPjL|$-<;ZU&W`d*AhwjNG*t|9ipDP-}cTD{6 z{1FUEu29#Tg7PrA$?6txf=7IuF!I~d`VakH`$vDJj32=cMetP4Pi@<7@1w+hipR5f zDW5jkP|ID1VFKS0t3pn`w06H%Dq*s*CDZcoa35<;4ir-0Jc&|#nHE$9fnJ^?_bf12 z;O1ZkS{_wmQy&CUK^?#&5jcbHn^y8qIu4E;LQRRJ9jwC%QZF8`th&H30Hks_j=VU& zfy*;_;Iw*9Nrg<1p6^DnCIR1k8h)_4cYcPiwD?b|2(-Ov$;xag+eJTLa17PMui#LO zd16n@)IGhni2e_~4!QL(dNriR9ZNz|bFx)rECUNucAw19?RQn%40X`{)7;l27)!ws zpW2uTAD**>DE0FdEuq5=mDWsd!Fdn}390e8d*nZaa{8_!SK-G3iu-S5B@bH3@{Z~7 zQ6InIZ4pDn_D4tpp)`XB7S>Y>M`TH<7v(ua?87Biy8G(;*H)PDPJ)d(QgW%0ns9cm zrC+AEgegX*WlO!1*MS&%v53xs?W#%Yu4aw~oaYmTwwfiy7S1@M##cH!bt_Qt{!;}? z(A@vI>|=uKd+in=xy&Oz%>ONEit;~9WWpopwicg3`pQud*tnDtpRAqlMCU%SIz0Y5 z0AuK>Zx=&tP58DQl_{qF=VqB`Gs*&hYxR^S0l`fvxBFAyrcyKK8ggJxl~=l#RUDuB zN{1G5G_bJr`@!b>dX&zEE0%gIduH|-7YZ4I@WgK{|t1&T^$WCa(~aE{D9 zRE*tyrQPkXHpe2QWP>%R#D*`MnYD?Fp3G-GB%^&_tIg={^QnbV&*dEH^#%=b1hK$< z^ro8^q+imJ&?(MCGRuA{IPm^6wC;B?Q~iV`mU>64b*j?0Vc(n}QPP~!ajIbrFoN!c zL)ZK7-;T#KT1=VXIUFs=9aQK*5VW80HeH^hp!bWNlCwcu3ZCGiv$@y@cJk5RIwjx~ zl46luN=B&EWZTw6*%OvwbI-W4RY+>6Ui&>>EvoMt)kJ(7+OCVAX|pji6P}ry+4xZX zpZ~+&+W{VV+{aK5Bot9Sx)vM+syd71^Y6F`e>`P<(?6KvRoqsvKbZ8bM|9#&b+Mgb?sh%=G$8sZ7M@d=QyC{{#+3Ao zC+c<&>qFjKR`i70{P=29g1grXj1uAXsJwh<`yH__%o?*`muTU^v#fsP%BAO4%>UvH zQ2=uAc@aieK6)T83D>i8qlazgG#gNwZe@nd1hpqlnj%VYTrJI+*Uj8;ea#z%UO*_w z+0D8hU0LF)Hk~e628J2t5N1AuzhA|N{NN*>EU5gf@d8gk=w|Nu9y465N4k#P-0g?8 z3mY@2Oh4=KN0@NH%$qQ%Au~-V;T5~q_1>Y{r)08yHu^iqNoMm54^U)e^nJ9o%S~|$ zt?+1K%aaxW_bhA5C?3oAF&Dw&=ocI~{v6DpAuohQ>HE^|^aq&tgmoP3s_$;Wg6EHNk;r+Ss?StpSQSeF7neCgSZ+Q?AC90HT(SJAn z1*@xfV>#V+)?Jx9{>iNmm0 zQdH9$#~(uTOl$~WVih6>TEA!K=vfkBC%oB#7cRAgefis%q|+Vw^KGDl$0A7%2nCBLcU88S+}aiYME@t$Ok*KsHx9eOP$l zrM(gON#J&st^8kYCGUyQWUa+{QJot^h2*IJnVM7_)&IP94uOo=#i8d!$z7;F=dWna zaXW{RVAL+cx&@pd5I0(%y~&?*I?`|aj|PMhP7#aeY(^4XmkCqJkQw;qzR8pi0V}Iq z@6^&beKHi!*>!DlT8*1PZIS|CoTjbj5tdev`h?K-rTJ` zop1=Z^xLaB@AwPHOBKv)B>W!Yy8wwyPNU|P7KsBq0y*7jJR0*9A7G2i4|dW-$b+KD zew8!#CmG}kdtj{f5CxD=(~CdxoR^oz6x`)k90DiV_ftcJgKpvj!>RPYp`JZ|!rlA- z;2c~W6!+}VzIKQHuA=)Y%A6U=w|64s+q!Txt8N$BlTsxO-vQiXg0#Z=kiqlQ<3B~$ zDFk5-gk#>Z!p|-Qkp^M6{}AsP1kKdV4!~DJYRb4#Dd?>UIZVH#sdGAj^r8rYsKm6w+hCu0$iSTJ~!_PQl z5Fu%?->^NkehRYOEDF~regUs|SNN>^oN}YBT+VK^ab9=#W87S=-|aGtUxkmr3!84S zCmM4ez7S~Kc;OOK=sb}Z?g30=>q3F-yhZIp`OEw4LVh5mUe#92@|z^n)xCaDeR5bvm0La zHec$2@SmAkL>$$T&_N?ke0ZQ#?^Z_7YGznJIRU~P7nV{)*lu}lNvA{%V>ifj8FUz0 zTm=`oSbl1Y<`Y$krr{DL{P&Ek8C&Tn#yDHk;wHxJJ22DWx+nvvY!d84#U#o-mditXg9H&7XW z_bi!$*zb$CQLy=Fh_Ygo)g56*YdZ#9I`85AhM-lUsL`4o2>klE)cUSPs`}4O$9DY| z=5@C2Z2>usiwm4>pnLjX|p zQy0HN<>TWG<9N`dRafOZvxHDtDSTHf5hqiQqEG>`UD3~CJGdrYJ^M=Di4es}Pxh9A zQ`FK7W<{&XJK^e6&c+O)T2>#Sex?lowp~r1qNsH`(SmfBV}?^qI*h4r--3E>QGW2l zQT44d>S2T3hE?rc>We(Es|b)dkTJXL%`iZLhsSnA|_AFDLB0}4p@NBh;lDT-$%%Qz3h1I znWV+&vrsWi&&*1O$(EpHr2j>R8PdK!v}1)xd2wf9;djX~Ae+<&ac3Uo8@1|V{y={J z@oJa>I4Cpu%-kMrNC^hCklxrVlbAURz5`ScJgaVm{NOfHV~^|TJIQjPrwT#g>hQ53 zRA0)<%?nIWs3eHZGNe6|)7acNukZp37Gz5q6P-(I(q-CB_H*DW}<`*L`=JaN@LwM+t`T2|dMZ>MIF(x7OLmdhYXG^-Gxm0o>J&KG!6oBDq4 zBP-C1*_*xOvycCR=08xil6q;?V%I9i$Kw5-vl+E3d1*F&W}WfHXObuoi$+Q6@fpm5 zmkLK&h!G<{fX`yaDhRT6Xm8R|@_6_H+9A-l+u}9LfCJec>XvvsSFwORMN7meWN*y6 zE#BFJ(RxtHvNS2U#yxSFZzBKQba!E3yr0}oO1c*X`Q#?^2Xg(MIFq`8Mh8cNd~jJH zP4j2@H_*q*{s-t!QS4H1P*a64FnWXNk5~TF;8Ixc;_?DHvo33zt+g|Lal7LXmyjOry4z2tSA8CURh&CO|I*c*n;Oq zoz?=ft5zYze_x}Z8m=vM|0>lxQka%0-`P1DK@`c_YiLWsM4=fNg z7$<3F-UV87Tvad;f$eyHavtr|C5CyACGLJl%eYxK?9U0ZHS_Vw?=#GJV3=B?>lyuS z9^+`j^+oy^G@;9Z)~Vl$E9{#YG9u}#+Xc$XCx%@1C8p3;;;;+z=eEb6!1=I<%i@iC zD_)7S-&#N8%!gb1>)7Ib3Ad_pm^SU=>(zR`f(J36Vob~=(I`P%9;CZ!^}VyWZ8&cA zPvV;^3hxr%UkS_MWm!Id-}*F{L$!Z!Pq!%G-Tt0RRujtjN7H&{AuW*eDs~f>D9EBW zUTzF{Czn>tVzr5kJ6WC8@|+ne6{~JKMk@-&EHMBV`(_2`<&rM;3~aCQ-)@cfgJdV9 zae!d8fE30HdkhUUp8|u?%cygRxkdP>YVIIcz>#=;HZU$yQtw2h-n9Nchd%*^b|xX- zH{j7@1~IIf6r`wbDQZi(jw&_^FK#Z7M^#d%r&w2@coqNa1Er}l4yQBgO~eb%b8r#{ z(E)vEcyu7Ap7ckCqqWlYE`WJy2QY><>Wn=!5}|Y<3!a0h1Jf7k4OZV^-Nl1|4D_{- z&+5?mFxp94mWEBcz-_h02aHsvPlwQ1?j4|%UzSs8!{h=Vab_Uq#WPSy?LBVf4kszk z(jP|2Z*!ySY92cbmX-V{mM@ASN)ZI=73CzJze+s!$u;?0(2j0Tx=W%3=Vm~tp`<}h zXQjPOH<`Mt%QohpOSw*1blr_bnsS{bnS|hEApL11kG-ZBb$Y>j#IKB$kiklD@`g=J z^MGEL_@Fk|Oyq_Dual`po1MWi5!~LDvGy**T@6|}wh8QOzes{5C!EWW_(kgR9a+e{ zizdF8L(fAzR7<~$Pdx1zz@FwU_SN)-r3%<}%3^G-5mOCMPu&4`mKGE=W8T-1qoPs) znLSSzRL59qC3mpD2$jaGb;}MjQy3c`HmilyMYh&mWy^k{T7aLgLgbQM30J*K8$@0! z*Mxq%>dhRsx!ct@7)+CR9tfj46W+SKI-_qf@i+tz4t(FoUR2P3amBj*G^gDdK2JAE zg`6;1%=wPtDdO@_gNTN)pRO0X37rI=i9b@vWj24`$j5Z?ud^W(n;(?*3gHU+y_wws ztRp!)VPvYn{RIOSy!mi$_ZBhqTtrVB)hAz_j5*Maz3av2SBSHbu<70Sj-M&W?Ny?T zDp4C3acuJuF!1KE=Bf~WrH-0_x77=8_1_^%7*&evw}5yoE&h-NIU4bfg<2v}4EzxW6O%*zEU8 z2+58mi|Dm~yJ?5GviWGPaD0XVgzDmCO%o7~h>nVkg>Sb^6?ff1begtU{tG0sFr5u5 zo?n6Xb;D2e?%D4<=<9-gSxI4OdP1_F1Lk+rKKC4Mb!R(1>(KrcDi8TZwFfpBB-$8J ziNJfeou>3->Ju39Y*T6dOwIMH_NNy!zR8vR)_8ea(51A|cqxf%8q72+))a9quOAG- zf4sO3ivPF;fY;FyPW>wan?H=Pv?aT)jxfw|>O|!S&N9aP%}+_GT`dIUaE6zQ41*&- zelLhW4r3p^%Q-s%iz3d`Bvgw62=M zW@T-}x^_~%b|v15Qj#h~68~S!)+pfN54%>9*qzHwQ$2g^jmZS!Aw4bE~#__6}auVw;7 z<}vIJ$aesqkAy>Ct|y9qochnqcY<*>3_yugqJj^nRf2O>M>*CF5)Szi&)*${M@jhs z8ws%99$F`>q}iNbg#!Hfud@;Lrs+Wx5LddtVDmB1#=4>aeC6P_Ty_luj)bL^J&`Ck zNh%knpvwHe{7p{IMVHGNBt4IxRPYt*ztT}!Q4|5oS5(tdV{&lMS$X>ES!F~wI4T|e zp}|`s=fI^m0!y8^CwXQSV%nQ90GE`j_)*97Pu?$f97SLLVNd5n98olK$J|3Na(7XD z%$XH?_Bu73wYbn*Zk^fae&yilJ4}AN-IG5<_eG>J4_HYK=WP|-mYX#87KFMgbl=nN zsNq#A(BkiIn(!+<{^QjG&ab_TZ7Fw{28EK10LHh9M68nLf7YlHA9E*2* zs*K3X?9Bg16SD;YBl5M5^=cM4n`Iy&8QF}JC@`fakGGo;e%K`UTAFm`hiVRN26`0Q zJMPecJf=62?wm=;0#`p?t`Ph_zwa-2bDh8eLypPxU@6(|DyRqI0~y+Uj!!BFG>bJg z6^-yT&&Ievo@%vN{012QIOcy^VDla=lLmR5FSWg#ltG&xkGrkns4iH^IBl?56t-wz zd@p{EqVqq&h<(N0sg`hZ~9UnYDD#k1(V{hk(>ii!YOKmI% z^3x!!R16-h7zPv#C4EV&c$Ucb#6AkF3Npg6@3k{^qendBIqDp!{a0G-%)2gvxZfe-QonRUYj?T_B zjP>JtoLz&ot7!VBwTN_r-tA={>ve`)_A9ZbM5?wSTe&|EE_fj@T#u~kyphYUb<~Ra8`v*j@bVCzEh zPhsUfWSo!sae)$|k9>YzE$9JAAaYFYfzi4RdtpBF;UPtj2lHm@K+$Tl4mp|;-p?Zf zD1b>4`G#R%UEjgEFAw^5W%RcJ2?W*=`E&Z!6u4|$q<-tAI*?d+UUPvxFUbBs9q1(; zPc63r5A;HwQnCL+Zyq?|xO|tXWN-=iF)j%=Mg)PDTR)1N1LmYeKtOX60!6`sIfhI3 zTA*bKh~5c~jv3@%P&}2mx>+2@f}!~d&3xv=yw}UjI(zr<9@{*rJW6P&mR8N}v9!Up z4E{)j_fA$Jx|!_eRb4JC6RoCwYlYiC)a1bi-Vn{k_QZw-C)H0r8G*a1>iH>OYZ2WX zwkroB!vg_umj!J;e2{L zKf|!Y7b8v!OD4x(hbCfr7Fpiq`A;C(2uAkHa0Y$(!`jO;}L#J&v4;W}6bU<_aTZrTi)Frp}oic>BtQ_-z}F zq0hT3^NwT^4CCcl^*Y4L&oR$g6RFav5D6HeVrwZmR#MPX`m=5A7k>VEd0Ffz)(sCm z@`bLJ6!@(b0XV8MsQ4B^;z}-+=*X(qEsT(8opd?`Om-UZ3ucJ>dkA3u10kGo(SZw1 z?$6T>ql7{kys-61$epi9V99?Hv}DtPf7peBmpk2sk^~tz8=G&}=UL8wVQ_ZfJ|Gm_8qtZWK`0ug0x6>P3@b_ z99_bJ60+3F#rsXS^~^7o_bGJ{5QbeX0TFqul~v$>yX*L6YJ^bAP`A(ijfCR#<{U=a|B0!vkO=6+k9qWV75^hII3`yx_d9DO-{}GHO?TORPDue$ zq51No6AxU%)71BXWha7J@I4$u25+!lruRF)f)Eudnuk9HQWKpbgB-&$O9!miCb!3n zu|Q;9omI&xyO;u;;TSTdubJ^d-L-6&Y?3o&L^>>pMxaF!_c_((6d{XLK8?omVxcUb z6kt~3V_>$8(%Tk=$IWkHnC!w!iy?Z6(ze_*7?lr3g`D_G#2@@Zif8XX^L*%jCk+F3 zx+%Xy1%ZBnsNIR{wuW47?&lUJuN;X#mj8fhUApy7uS34fMi$(fpRH{&MF+e$Qtx}1 zX#SfT2FPl~OJ4$@kmQQ5{+Qe}vMSAh+&WexP)(|BVIEwP*4?Bq~I^lsHxq zyslR6XkN=MgGuH0;J|+`hyt?ZIAhy4;Ql;crVHq5mjlPA#g^&&tK#zPmMYmZMK)jO z=DPeBFrPgl=*Jn(+_aBNJ>)E;0&=EpxzZ3vr^zMSkP&b@%i%&cPs(ik#@>O`l)xXa z^_m;@jhZE>zZ3tT(1JHy*(Un&{FJpYd8PmQJG$P7h`({0% zOyy61-of8=<29jgU{0y3(GOfGea~*vLk;r^G89NiNU>JlYu+iQ&7zFY5f-Tpy}0>U z>%&y8$}s)jC*hMea~u29-cp&(qH#Sk3osNNFh=!r*>zNi`R@>lPy|v+-|l+#A=LUG zZl3Sxvdrl2gMp!#+dkxohOtP6`3Xe=WdWRZrOR)rLctxM1+f~}(7%(Yo(M$%Vc_8{ z6wMbhGiUvQ6g)Cy6n83q3d9H9SK2fR@+}t`#Ao1Ef94-bhq{Ga^@!Xcy z-jr|mfK;*2S7Mmlut%=`FQ&daEUNa4c4+C6l2lqs8lW<{W za10@v5c5r68hli>vsES7bQ#1uck0GG^{oOE&t3nubZBcB^=(_d_j9=$w$U-AF=o)1 zn&ZM}u!W?1oF5%(uCP5BCp^lhfBkrjJs%rWoBvX#N*4r0Hm&2L$in+C3SA(4K7vQb z8@{&C=j*<9DP@%Y0}MLMy&}%@shmmC>tcLOs9AH$MWgGn0sbVodh~mKX3Ep5@7ivKbJD zgj>naMT9EoCYjiNfr5~>^Bq+VshTz3YhYo!?!t~>pEC_isC=1*3;MLp%3RPQ8EM^=7Jn_zJ{kJwaEZGy zg`1j>oM5wzyqN12H^UqE!}(?}MpRswR3SN)s4ctzH7^Wr@lDG$GnsT=jd^_j4-*Ig zIQXKn&y%zr`OMZJu8hxWybBLHT(t_%-`99$!^UyBe%GPD2J6fu@yCvHTT#vw%!Ge; zXLHe5Kea><>|TMI&klvFmkS@3@wZBDvxQjeuXWKXYO?p4GozLAXN~FQwhO68ia#o{ z<^4R9Cre)h-eHn`qZJLP72 z%JupB+IanLrbv0G?QYHDf-8uHSA#906}wIA%Hi4Z_GD)?*XI4?N!%OT{DQyg-`V-2 z+HHINH;aX5O@ywV9?QdS#aZXN8efTNj<$w|BoOcc;-p@+i+5$Er4&r9m-2l#1g8(* zb&(!STAOt;PhAhY*)DH=ZwWf(JXnE+DQ|lWJ{a@XFHA6yw5b1K91J1|W;m?SZo(2< zM(w-d`8?d7lJ&A$!9x>Pk+f{p4*DNuorF_&a7B&N{Z+?Ms$K=H$F)i@D6tN$70~3?SI7!!9Ef73*2+G9rA621&^OBccFZ zHAaa)wfGp9Xtd}xPV&EXMN#UWqos!@L7D~!V?1A<@!96!hW;bBInz~aSI(C~8cCEN zuYLbN_N?>!zsWdYnb9<@jc70M%i*`N2Izw^VS^G@QoEy`|H*z{nZIM=|h-1oqT8|ek^^3@J?I}kZ9`lvv~W;eS?`b#g(Y0kiBivz=K9#mtF9ON%qaF{SwWo}M}fW@ z3h!6%l6LUji9p(}0X>7c?|Y+&f*CqIk;|_wuo)zhn?OEp&XNTu?FNqC{}KOij!HJG zJRNHZ_}6(eZS2|GlnW)Lk?9k}kRf~yYpl;wHl0d}p}-xhJhgQ;mP7c49-F7e2Um6{ z>v+i>64cBmv}0luH-8=Ch3Riob;YD0_Og)}*2PKIic#c|Q8V}W$sBl;g)NTq-FC6X zTuB5OiYSFj^Hn_{At45@c&70uMmQno^_%OASTo+NHc@G@E_%Q^xKx`4EP^~;16m!dIk-i%c;mIT0~39~^m8@$#Yv4U6#u;SZRy+1Z|~hV z{(9~L7PeWQr5b3SDo84=|AsmVSXlkDl%k?Lj2iY&sB?n6wL4VD>&V@+`s30X@;w-X zk;efc!x4nu{lhj>c=}?nWsN3CuZX7asDgJKXZ4PtI(_k%KenzA;8>&qCMg?jGp`mS zRu}e<_~fxlw!A#TgWi*dBrROBUsM54HEOz&WVAldQ!Q4U#E-7{qQ8qYG07~hUWrxi z*P{_D825c!qHE#q_A*?<*Q);#q}6n z@67z7O*=RcSi_A!Ik6EXAtf}%#6lGIYC&a@&C=ATHoCLIgc2FTink#p#1HM?eJ%z; zYM5UJ-1714-mf1;*%>~leZxeX@42MEoa=P}@lNk|FGkD(^;4&E9xX-=v8CTttSK>iOyahFcI!1M(i8cxe@x_LXP&xqJKkbbn%8T0 zg;DXf;V2jF@7B?F&;(^{{)F?K8{KNxtq0=Y6%LecQ*8rySS~%E404K9sJ{uA9)=1$F$Q$3Q<~)x=1Wx^QY5R>vGM+f^+`*-1lAmL>=`N22B3 zGDO#Ecj#(*kO#&E*(ly*5I+sOt{l#Mx~PRLO-QaySno?SL%OpEZB_!1_INIBd5Hzf ze?m=URj4@cJLI-A{q6cwk5N?O);cTgVnOG7GM=R?o=}}lV0?;IOQDaOWpm|8#DQ5% z_mU&?hA&arph5xj;N25xvBy&X|6aq(3E?;5CxylIc-6*g$jBHNL`WAFS}b5thR$Cg z|85|3;~orB8A9p20ujGn!&+dV)?DGxImoQ8h#Bvc-#+DaOD83gf3<0_-1Cfrm277I z!vQu+c@X`YaGXpT5|PaGLEM9__T{M|x59{*IPdt{LjV99oeJ^vttzM#psWA&x}61 ztr5r^heHN@`8GQe0cd*t8o`Zf7+(B&SigwID!b~bDS?uC>NsJ&z68UC2O7jKWijn+ ze^k7_tt$T-s>SzA7im2{G=`y@v29>E-Cn`T9+JiV6M+!pw_(f^I*BESU2|qa-2*>x zyNCe$HKay1Y{~><;2;0DJxd@XsWbW{qH+f40pobPnWAMGhkp15S?l0s3x2wsAWE3; zD8{UlSoTDyLa+F_>DR29&_;O;d1?t2E?-Zt@?|h%FDPR-cm|L>k;?%J^ll!yu0r?{ zf8Rmgk&i`Belb59P#E?fmGdgCB-{SMC@l9>pJ~5dPW=S$=KbziZ;tgiVf5mZSXELKRoMyTdC7INLh!*xLl${k%C|~55GF9;;^DNNd>Q4E&^LkcHUlv z2atINEpFfO^fKAyA-J7H1@>&*GnAE4;ELqAzbXveTNB^@-#>S-YZ?;97($;;e>pc` z->{oLyTO~j@jo+;M%TTXTV7HJ&7nPiyycwXL1Z)(+6(!&P7*^9n=AY;ZuP?(WcYDf zNCkd9@|?kj^Ru$eCV916YHqYU85ac232GG~@4_k)B|C)#S~=86VU`wcgeQ|Qz>d8& zXZwjcK<3G$HVG~ubZ+Ni_9hb~wX_yGKMh{E+HaQW`e@fJ$vK_69dd8phfWdRKP%rM zK0?*Hhrn0CgLs?HRhcsFco%?Tf#3hCSNcH_8ARp{TOOb0+U>*4oXQ*K0)M(^>aq)D zGLb)8Kf!vL?(~kUT96D1JDP!EJy3~&VGBMh^1K;qXBmC#5ova`hfZ%_ zPVz2)LZ2|T^zC5h-$nc&5I79mN$ANtC&KqgC(xHDcIUp%jHiiuT%H_?o9fLec~vBNRAR_oz5FpOgS&qTqh#}>=>B|)#(dYN=s!-pYN7BHD+-|EWH}SP=J`yZ+0F^n-$R%DAyiA; z;^sycp)E>`9e4?EsO#%3>W=+Tgzk=-3!cZ_E4N0a-{@b-C+u_ZRiz2mJnqhPE83q) zc~0ytqz!k*P!zFo@A#ROwiSVBIwgTos=0UzLbqv*Mi#x{43DIpt~j91rZqg@qYI^(WA+AI4U3UqT(Kgu7$E#djScOyus1t`Ns@&NF|!|w z6k`%H%$0;^rt}WpK5INXf~&a!EGQunO*}Ia67i{Tspl8F5K%?J(O=poH;%UG_QZ>is(@5f(V}aAeHxUHZ|5^mMq* z^}EIx3TyYE-*K-%Ew+|SiV!AP#=w71rO_WarOR6E{M@kUJBrpA3-Sg3LFFJNho(E) z1ZzY&kbeRRPNOVbKA8oO!&ab9nh+o{yE6tuf#glr<^{2QWu!XH)d-1TUJ zd9X$Bpqz|+gThJBBBd&4&i+jeGz!h9C_pU#j z8*hl&1LI^{ei!&80MbuY+<+3u3JZ7Em@36!x8HKr{Ob$V+N6p7XDFlvIP)ND@pDyG zHUTr}o2ra9$Aw1${OF%+Q_BX+c>J`#4s!S;g)nM8T^CJJwyD|~GBcz^zc^;zmCybyucj`cY2!N9!jEahL4)v1VJ6> ze6+s~|H}_p;O+%G5SqlR1L}76?WuhKQAw;2%Xb9ZuU1W)WL1ZgB1@t!auUu?X}TPqpHha1XU5#D?=kCnA$^{F6{kxj3SOfI(9Zx`+!w%Ze9!C~7`{In_i?r= za787PQ}a}k26AkP#o`3BA+790v^;Wk7jQa|?Gj)=-lH%Sl%hd1y z4S>Xir?ro9ha$2hcUZ^z;DwBi-LW8&&t|G=w>_StLxDmrh~d zJnaw$_(LxKJ0SA4l5|#jOpez{T6-56g_qM%< zs%x0(MC?2;@}-HjtYS(p37AGa%Ia$6#*W<^@ekbLqub>S(mZf_Vml@_m0vkj3Lpf`+B`KcK zcm|(SqZZedpceJFW=KC+rk`Iv(#2JF)do1fscVznsRMH(LJUY5?bZz8AJ(Xsq`O3R zXV``>IjJz9ec)6KuLwcIxp$_=Sh-;>@UX#BbFdyGuXb4XKLlp37ZF~wDa2PRSR*3G zy#h*ch}GZ(Cj=g8fbb{%dC~k}a0< z^fXrnKrtDTf{Xg(1~eewDKAERn0E_?-#^C4=eKOuTi9bfdNA{z2*KXp{=jC)g;A>_WMac!Z0#Ldg;OURWv5TqH zdPv+E#kB6n6PnK!-97m9B+Zh$nU77r;zv~ zHK?HD=YbL`&^z3|VcuI0v0Xq;yi2;i_luMj^C+LhN#Xg9>*b=VW0A;g`2l6f_aixo z?d7KpV|)vYlH@l776>o*8W1X7FVC>Svr0jR74zKgxO~T%NoDC_;yl)CcOK$Ti6MhN zaoE=f+iyPwz0-;HLwE`}9)F_&Y`DyR(vYmbnrMJu-~PdqIQM|w>#N-_6K&OW2PLnS z*0VeOug0Io`2XtfCx$d~Gi$hdUOTN_D_%7K1WSA%3aaxgqj~&@X`J!G{rS(oHq)F5 zpyw%#XSv6tM$pVguaZgc8}H;c`xnp zQ0yJ4b$F$huAQ?J02gHBohpP3--9g7*r?WC(T=+RK4MEsL{r)R~sUb*%W(p-XkIaqXKR69>m42{i@18 zH=L|pmc|7tP6PBU>kD>P#F5K+s|im)?c-KkTID96|Bivqi~0`j&(l_m+41}E6b{06 zZz!5JU0A{*ao2Iv%{rK%aNh;XiLl?)9YNG%+MwYGgK*cSA0uuK89AcQ9!Cm<&V%=B zBHjwl(>VJ&>+Vzl9K5j``bPH$Pm-VH9veWt#^eDWID+tGdpzL95Z_@g!XO3zKyLg6 zlf}d=<&2ELy8i>5sF=Y*B84ryzX+>!{&iy~j5pWksScwh`uk*PMdzM6?_V39P1~!I&=p=gbX+Xgt$RNz!(N(1fN$sjTijGfw)!}BuXb$Y_9Kk57%Uz$`7?7Z;|aQu9cPMFhN!1`9lH3 zQD%~Xw#E*!p{xJen}lpTy+B)7QiKKUu6hipS51lc*cySWREg_WQba1rE0uic@eq>^ ze+T-AEHb>FUL7_r0D`^w6|gH-)q5@@sq?Ej`Ex4I1G!WMp5&O2t$OacZhCL#_vZ#~ zn0UZ9Xne=E0X+JDca_I()14FlrmUoVXMR&)S4mhphD3WieMmR=vsT@0XFz#gF;Y)a z=N(uuHF3nRvmfGplB7`BWh=-v%ZC2cdx?b^&dlrqynO|rj*byoC7;^wC+Oeu?$UcD zI5zmMbDjyr_vss^fF)OcE+Z`2Gn~|beq94{fH}`yqzkW{7@^jb07raB;KWqzpWA^9 zb>r9V;#ud1Mrv+m!gqkq1gI)R02@OLD^~)VL_K1#KLEg5GvhvS4!xFSl>lPv`{>8@ zoLyT6Uv>Tn=6U`s&CLkrS{8}@#>zE!!H(ayf@f0LPK&|!NtpS^f~`!u|9nAGQ6ehr zpMR;}`b~g>+XzTd@A#;tr&X5@4k2$BBlzN`Mx1m=?kM1%4R#wtEO+_y#h9LKAV8Y@ zXEdPrO;{%6Wutumvy0#G%3Z~Vn>SA8NPyzYY30A?+EBXL(k!oG#a{;zI$r$bZ^qxXNZ-J7pFA%As>^_a zFM;Z}C%5!Ek$8OJkd5%oBKbmm1p`{h{vfd2E1mLXN}2FT3z?jQr}HLs-VqUlp_%ta zuV}qm^^f$>}!JV5&3OT@961JQzoD@BRRqr_(VUg`0~BgaOA3iXUm6m z%N?Hv-X+tS7%_0 zF30!fQ%)%_41|vDb}mj9lwQz1*sdG5J4#?d<2LVb6+9ngPm_8YNEaJkcmn16dJLz1 zqpGD!#xO2Jw29U^fLOq(ceV>6e!N`rG#U^tV}!ui-6SS6)(OD8&1e~U4-eHBm#wgL z?8-7GnvZ_7Le)%c=QMv=%jMT0Sev8wyQ~^_|7MdgO|->~5g)4bQTm$?RDV>`uc;%^ z`=`|o{qfrfE|*Jj&=lA=n5AAH0IkezNzE{x6aQg<;+*sgj{01mV;hcOHL3clGUfnc z7J@#yb>%D38g9I^e*q}!H4vZzx8|SP)Oo)?!~FKpYslmVG&jT1W167_NeXWV*e%+P zbgdE<3585s?f=-`t^)zOYCvL2VUuzS!5wH$TwN(2(OChf>wF?8q14^~W4-*RDa=9= z%#Vg*dJM@Wc#CE7$0J#;Q{&sB^bDWQx`(f=M|2^G@6HG!0IXf1p&c0N@dz0Cjo&P2 z>VYb8w$MmLP|3HFpPoJ2zLj`xh}{;RO93xaZZbjS^$)fHF0gj&73ImXAZmyG z(r{^b-9qk3+okn^iS1C)dr`yRCfQT`l2+5rHl&ZG)WA!Pf=a%_27OMT zQ@SKE@uAKBkOr))_ZcF)(|o)}?6yy{F=d5W;qNbQ61JWCavR(d~z|aFu)>?%KVGaxpsH@_wE1VkDGsr~AY*J7DNF&}qJz9$jV?SBRP0 zA7btC6p|-WDvz3^osn+X%vEyH+Ogw>Ze%GuH3BCQvnnPfBmVHD106cK3lBgre$PhhH=^$3AZoc_^q7le{ZlT`M|&#$~T8M zKz0iMKEwaBG~BJ_It~4}5O-V^DxfIvxGhB$_imOTlOXnTq2 z{OYLi>+yL$jm>7&Blxk8;87~R6f?oL(D;0KFq7iiii{@%R&BJFr2QJD4VI6@}n+kc&}&1RcJ-Q&-?jvAp~Pc-M14 z=2JVt695%EshdRg-`P7%b9G115{0o+IrYDfem*tKxY_A~AZX%Hx0$ZA+eZKR(28$o zPU35T{3)~!S*(mRvb}c1j>eGi+u2vE-ZrO7ru4mYsUeQ7wXZY0%tJ!51Z}u^RvAJ| z_Bz?_if0HP=FwL^l`@FVgThK=w{J{#3CgxDI%jPe)p~#x#=(^dM41iqX3|N0z%&t+ zW0#ulYs1FPcs4s^tLyYl7er%YL?Zwc)!|2>shj@&$L}H@T|k>0-EQaIRyn%V^KLp{ zi|BIpZ;D*ZhR=`bKFhvgh1Qx2EqmY=0Zj{4vOYY1dRFSST(uLNTpxo%m@s2|RQ#x= zjYv9ib|s&{f>H6z{u*Kupb=%S1B!tYT4sfpEqznn^-t)Mtzwya$WDVSZ604P56n=#Z?ZMsTYZE zVE_5zYC`Z@Ks(5%&)9xE_$d(7IgI0D=|VrF5Yq5`sDjkQ`w7(MQy!oef|(Eu>vxZF zEua$EfYq_B-PW&cj4<-iKg~bzc%HXH5Y;&MXBWS;Gj*_7XhZc%Bf({Fvt%-?BX%oLLFW&+9X<)m0>fPK zwTwlNZJLZjYsS;es=N0t`??C_db}{$N*%TQ?w#0rH_P{GL4$Y|dGZ3o9!y|u8IaHW z31FxUO@#70R6%eUPKnpdq|b#wMKs>oBg0*9-+O~f?3pK@+cnC1MW zu|4{+xd6R*jCY1u@xKG=-+%L+nBw%Ej*HJ{*V2mrJp~QdASi8yvh$e31O=VPU?VBv z3yaPMi$sO^qbqW|H^h)<&1&fKbJ{xTWpq@341;ts0S|x1(Ug$|Tk_+`r_r*1y#KiE z;5(1M$>+dTS@T>Ie{D3-xwnXCQLIFB;dx;*DmdT1r0nIFi(0bd5NT-q{j5uk1~w7B z^)pt#OWNdZAap>%BU6G8{}y|0BjCW-Zqf3c#?_F(Zh6Ia&$*jQW5Nzo$V856MBKv8 zzL{}HV#avexH{is)c5Y?bVgGttHc*m?8zwg-(KB|f63rFMIWo6&2|lQYu9F#XP1E@kdxm zG9luUTyv+Kh^#|uA#>K1gtZhCZeiAudNdlxrRXRgsPXRBSF8gh&xp@%?{|G5vh3&u zS{qa|2}dg*N`KCG)4Sv*EPBv<976hbQv^jA$)Dz$GMgZO$~VJ&7pywpp{=DG8q8=4Yw4UNqjG#gz%LZJwmBU`J?DxSg7+PB$|mAaMK|g=$#o-wO*tj)<1zl zcxx#-TwDJ$7W3xX!iOJKcfR{@j=dsThf;j*0bGgh9(InpSPCVjx6#KUGDX&1RWjqE zi;31k!R$zLr@BOv3UUH3$?aeg*utTzk7cdIyAE5?lM65js9f&)ME%5O1M*QiqWQVI z25l!Um^@6i$d?1V(t|~ds<|XCpIX}C7?Fkku|Z8nST|-nnl{b^CLdg2@ITt*=CPN5B_eIqm@bf}f|f0)g);DPTj_Runt!q}*ws8RmHXiO;KPCD<-l?i z+u)3}fXAl3WmxA=*5>?hW>1|;T3U0S3u#*%?(Ba$x;k``5wZ%S zPAAqAZ?K-_l-YC?wm+~EBdNJZ3Y&nv|16#c8P-vM2&x$I!eq|8YV5P<2KFZ0vfam00kj2ma$Ale*Q(4lClhxP6xE~$tkHGV( zqQ4znk*Z>~6S4or9O0ipF$ss#5Z8hNrNz_iJHirBAAh<2494+Z@)IK(4j0c}y$V~f z!V+|ZW|3O{aw3>x(0pXoft~LB6snR+8cfrGoW`t}2+=?;H62JA!N*7gNoz4JSqVOK zS%}n`U3!fkyN1&_b?!R~+hV5@;K5`m2lpBy{6e!mg3Bd#*qAvUJcJRn2uI_iA~vsq zrAR$JCJjtRQSV^unOljNx+m?J7M8M_ z&hO{9vlMj@1Q>Hy#jDwBhJm`*C>_Q-lZ3`d9oreB4m0TeBhW-`Z$w9f4W20~1qY^v z4Fx~&%*XrTA!vv+jY5tnUDLXvE6%~%JhJ&zHkwvdJx5e&+31z?c$H3szfi;knA(SC z0yFWFk-u2pBE0TT%g1>a?R|nq!4{g9JGaZo#pqwh%Fn)-WtMFW&EC1@QIpPBzqD`!{HBJ}7pDV#2lLTGWfxpIB|VK5X%kI| z=Emy3otOOjxd^vD@c5AsCsPwn#2EKCXbwCwtYaXtRo9(fvlt{N`=?tO6}E~6U-#(z zvcJhb)KbOAfYVV%uih&76ys)MZ!O>jH`$CF_fl-+gY);F=8r4YPY;xylT%0M`_C?r zr_UzThk2`Lm)8Dz%eHM!1l+GhXDtgvF#+SFkdB5&v4@HVM)GZM$E>i3YOk9i#?&i^ z*z~rC8V4rmbfzC5nED}S&c9iTRXi?C)T@u~n~Z7PnUAwc49s0^cUOAYZ?y_m;rdM<0AF?Z(OwA9O zq_rj89U0$Q|134MDkL=#-P?4=fZC6MdDkyms~>{BbTV%*EA)?Td#s#t z^vzkeB!~_JzRHT}!9%JQx5Cc@jF>eHcUa6Kmfem9;MP z^}fQ9={xDLe$GrFzCdvG&dP8%j*5ap-cwh+I)6GkyMqi1WW`3+oMr7r?8#0pfxjJW zL^IEU6sJWCsIp_7rhhmm_l}L}NTN>a?fv>RK4}nps^R4`biI7?EWq}BQ1i&5PS`C} zb_DirgHhStq8Uab5*0ht&LiHg7X-coyN9yW`qm)*K;HUAa%O6A;*~Hx)Bq z_=W4lWv!ah;~z;vI08~(RL}calr9kpsBi|kiN*$n%9sRwzOr$WV_7BMeeN$1N z-$bw@0$HmmzSNhZucUuHQNL5fCew0oTFCAi1*Dl&UaEH0QP|j>CI1~BM26#mn->UQ z)28EK>1%JGn?EgX{f=Ml&Q91ClTs}Bpk3;n=`^RJEB5q#6djHowX=L{Rk2np?a%6JjU)YC=xPbaVpgGI9@*jk3#-|k7UbU{G>^k4Tgn4BrxnQn^-n?)a?3m3$EG# zZ=?@V*aa17Y1kpe1E&qNbOi0{XotI?7Cc6KD=WOjYdDi@LEx+>S#)}S39NCp77P!A4KhAIQXd676HfQ1`jCWUjPe&iu?^d>~ zx}zN8WB);mbbz8Xw4OptL<&3RsoQ0)!K=-~aGh^9tJQrK5@bbi{iNP~?dF<)zFC-o z!#nlZcWT8yU2WNZ(c{alqAyEn1$75V z^{C`ckI`bS%_emQXrS#)uFNg{OT}Aq^7>KWFLEe%>C|E_m#urI@}$LA?s92xG2TNB zPFAAk!HN8(ojG1GEh9w~`vHq`o=Bo)21Q%s;?KWt--$icRJ)~bK*w;-A7>t>ox!dJ zzU5L-Itz+{_?r0aDhisH{#^9|t_C6@&ky8(8xC%M`$K-^=Hft=UefE(G&?nz$4qf% z!7~I-WcWGiy*}lpxVt9EEw?ClEn?;Us_*N81IYGT2R1>K_xMC}SavcickSfr11JFN zBFhRXSDt%bPnhg^v$C@_-E--HC%P6e4WioXRA?|FyKaAv-F@`{rsHE!iBEYKJX!7b zC}4E*z=EsG!O*z(GG14sm^V69OGxkRul!;@NuZ%d{4Vn~&0>nj#n|~L9Ahsw<3_;v zF@^Fg9zG8b*CVeIYA&bu?VkM5Xt9u_8PtDo@Q^|Wn0h%{Gmdc}|06Xc*Vn(x z^r#MCTI7+VHnHmsC_aq*7w9YZDZb&mHopi^_*Y{-&ZGTdvf}P6<}9 zZfI!c_xDn@I2dt)tX@0NG@qgEk=Uc7-uHz14vogMbF7(&Ip4Z9QiVtGDn2Fo#<+8i zu`fJPbx8wJb&2WYpTz8wN7+4@&|oxyvti*K9=uJ~%hLu?=>b!i(>#}tket2x6MO_* zn8Z4cQ_XKybzke>4m=MMC~j7~X$j(UczDQL{Z1n8`wy5mtCVkc_*S!@um>^7fSUON z!9)Bx24zUDJ!4t*C#3`OBVqh1i^>fZ*S)4-)to<3j+|5UU)uq?t4j zaCRMfyAayJP+B^gu-O#z$^zr_^pV7UQ*o{ zEBJ}EfjAetD^)!cE|(w0ogk&;aqU!=NhudFNe`PR*|y~>z8pqw_b<5Wmd;Edao2q} zKS=90M@a*uvqVh25vfX>}mllMKGk1hr2s{yewCzrZ z2L^zL5x%0Ik;Ecmieb-@+T|Wc-EjdLfmDO`SI!#VSypE`Z$cW4O(>D@9DhNVU!lS7%|C( z=qTVS6$g3_NeeXUYQ|9msm%T1>?BHCvEAZ}QSbake?INHD|)%%k+M@!ekb6X*XwD5 zCv0Z%XdU`@&8)qk7=Fp|z-q8F!d9UQxPbIo;ax7NDH&|UJEeWQY)HO2%-)DYmWL`G zDJD>NRd&Tp?pJ@4u0lyD=#b*%`pU!1K z*DExN3U`-%32A@8TCg2Pb>+8?FV&ASMj~E5Z zBK;_EkZPYq8;!oev+K2lx` zt8=PSWy4RsJYFaxwlQbHKgH^SbbPB%0zjtf`VSrsFB8#Q;uT<=T@S(K7>B;dYtj$O zPNM!Ad5BOKOB}`ni&4pDloTOOF9m3~-?Ok-y!0g#`De=vg~9Y!AYQs`-P9;YP8m?LW#hRi68~N7*Jc#BmbSl^=26OHAgM3k1JJFl1w< zwsJM%{nCy2D5^!Jsdo~POY9=0P!B+Ph~u9i{rI6c70xS-U5!mX?4;c2#*A>^RNm*x z{BOoEx!I*DnHJ>d2fZb#4s;Be;ucX{dtqbPI)OC|> z{W7x|M0@4?xv#m{IpAGPlNMrtk;#q==@u0($_iRsDQam+d*4mou}?FBo9ug&E2@0w z9E8j(Ds-V#CI4cI80)2Xc%k2@2e9ExrfOs6flo#I185~ALxX9T4o|#m`zSK=w+iL0 zDiwy6DxLB?o1t3z-9E7bOEX^Nqs41X6(8^&n_ImBhk(NWmg z0kMJ9>rBBPaYys`bq3#Sar>O$2S%aR?^6T@p04;U;Awz$f%Of!YrxLyE*_+qS#-R) zds8FOjukMl@3R?fUW|^D#<@lw*_~#K)0tr$hQOFZEv5?zL8(Pt#f#j7bT?0*^L*;` zUSFOyCATM=XOqofI(cqxY@eYrhkZeo$A5(56%8AXjpg(+ZYhzl1L+o6J zOG->e1eq3>1POg{Ur&kVL#3O4MmpH85oR1Y#Ev)&a~&$6G|16CK6(>FK?X3{3vw1MzmDl2G3!=LDIPae_@g^XhDwJHw^ZJR(H~xz{$- zkui9DSX$QHFfAMisjhfG|Dtyn+`Z}L0n+omMQ9OFIYV}{LR3)Nc_@K8I5>a??F4G< zk*U1!x+H9*Z}#ihXlI4IK(-7v>uo57=_l&xitFp+1GLNyRAR=(1&il{o`g{2Y2vZQ zb9{gGq+%~tke{2hw=cAfQoqtMvt#QJpA_0yc4aZ~_jh3-I@pV5oXn&bzx(SsNnz(! z%{l6lo%3vJ4&lq=wi?;{8s%w+a3u%O_(6U9;A!R5?)C+fnU_eRLvX;>cYi#a}85j4wSB@`vtDtQgjwnC3i3`E4*+sAPm%+Hiu~@9{&5 zlGYd{K$Y{HAi)W4JxhbuhFn+(`Ik!x6m~w#AAy0%!Fnwx@Y5#CU3=<74qb%=SwSM{ zQ8@Gf(|~E_dsf{Hex>lKC;VOSA85V29u7KoE?PVSD9B{=zgb0pDe=N7hi_5(WX}o@ zZ@#Yyj6$OR+YXG?AKM7Lx!5fZ^sl}vAdOPyVnU31R89QMp2u6pzX5^&cP)TvKA=~4 zGUzm`us)mExPlv5ub8by6Z*+f){80z08%=-ycvZd~lfDS_Q zVAV`Hv;)+EpVsdp`YZELpF|scUqoDdR(0Rcp(sMj3i8FZcVGs-?D6NmPSZrUK6f3~ zXgb1X^M2~v3!40Q?cJ|++HPv(QsZr3OVqF)YQPX zJ{4|5%P@Qu@570qL)ZRFR4omI4r4_*sbp>YLli7__6@TFGJ`lTG`Zmn`TSj;=dP6f z$tk&dbWFBrEWFXdR9<(4+(y-Fd)eTv_&4aMMSdh@RDaIWZ>6kEjSIl@aS9WA*24WM zu~@1LK2k9jdE=Go=&=)!$nZA+rWmC0ILT(<$l&5~7s#J*MhC zR$`@$q&V@69Z?&mGS|e)XpVYhHS3*y7I#K8k_nG_{TAAY;Oz;%5+`*BC3`Ly{Qh6! zl%I^E1YR2RDXHxlxzSTnOYAJmb3Bv0Q8F!7dfo=E6^|d2# zFkyUvdGBAfa*8Z5;=JH=ytvYS0jy@Sy1Du04?Yz5Gh~V|qB;5i{K3p+4XaPTscbfd zZs7Os{u!*}a5G13l6#g_%5HM_I{hDf6{!74WHK14&UgL1z2tibImH>?d&xu1v|~mv zaDdQk=Be1Vb&|>wV-F@1#tD*!?++DjA{e})E8NFf+*izI&;`NPny)YE7L{EK(2k?# zfrxT8cnoPKF+GTXGR1hy8K5r10CdmfqV9$)#ieBOrnX57);mKoteJ4*%`H6kAEMU(WEx3jr)^*Rnil*o8X*XYEZ#y^nADz_0 z1jRI~hU1|9hyY7|oFX?{ZhVlnG~9@=etL5Vn_e@-{v}{J_`>T1vC$n!S@cXJW3S0%m}mmfJ2}0JV<~Nb7uUE zJgy|t?X5nAc3RmE^-wG!?@tF=|8V@3gtT6}e%oysBDapnzgf2@^5-)QmbaD&gkOkk zGTjd1l(S*K_$!HC#kO@%kfGh&!dh3tR8<^CAk0-hKw@kYehmqINeR;QiSCUR`-IwmjgMOdgDM4 z>`|tO#9^g;Y~r=mWw_-9;XpR3gl*S5tv^`N)ye_<-hCMn4BZn`BAbSwV&G*dCZRoz z4T(-`KG6$H2yU$O%K^Oi4rBfV$vPK8ynl5Cf?^tSK(b%+;PsY|-T!qrlga<}cCRjB zzHA-TZ4OtyK+l_3?GS?$zd6u5$87Y2>!uUN=&r+JAhsw6L;BYXYFt9Sujo-dP7;D7 zNb)K}J`JBtDOZ);KuQ}#m%y8Ld8yQgfIqYm|Nk z73x`SWzdOp6z=EB=WoOjFDLj9v!|@ts+BleE+LL z8ooByV7??vu~Yp8E|ZHv+?@4qN5p^gtLwGH)9+!<9IjJ+;`cviI9nka*rbrctZvOJW^R zS`9Sv-JU)sWPpw_^UlVCp-0_KXY^k;%B#`?F;1xjc3CSCNjF+k)xUuC5FSJJ(m!A- zHvzIaIqRNNKj;AjiaAWXwS$8YgTF6Icy|B!sv3&V{LgQ0f|T9=&`Fy9UxQN8LsCXU zXHH|*wfu$IKyfKhUyD>1C1cU4$De*>0|)b`R&Apdl=OanAzr_}o7s)_D-`i9($p4; zN0Cb8T=*4k1TKvBC1%djw)A*%_$W=k|A@if0%Yt5+D}vzm*wX)kS-u^!}*d9+(GY`NSnul$YNLnlh4~*?5}YlrRy) z6ZI0Dd|!2|E){>Z@OWxF0^xuv(r1F^n#p5b7 zuZ(D3A6ekT$q+H0o40r1JYoH;8lA86^OeXyme9fO(ML zHyF7@C#YqUaila*sbn&lK`P(yJOr!eqO2tb_3=1g1YfXqJ{^obx$auQ7i$kixx&2ZYap}{-Y_0u3yr5-G(F7rEF1VPn{hk*v? z_W>*N0^pSVItEOt77xzVHW3SSGW5(Xeu%rXHi<>+ONJ z_yeH6TNCpm)?YM=@n^#?P!G*7saY#~OY)T~ufxAS#FbVkE#3pASB_SM@~Z7)1F>A) zE6f6DK;{SDOVA0T+`m&p_w*jD5c;$74zj9-}jb9TwFXdIrtg} zQ25nQpyNBjDaxoOr-7Bb@4P|swvL}^fARk4{$b{EKy}9-i?kgr1!Zeb9jgR%&f>x)5kQ= z;ZgxhQzl4?U2!QCH}JV!Q647?@o4TzP;%yf=Tbyj3*-u(*9d z-n7dc|C24!Rczc7AcMIvEi__zo@LW6r`# z()Xj;k_|i{wbhKzLvbLSo6#8B>!SiZ@@2;R{XLGvLZFcAI07_^#@CoZ=)w72MR;I8 z?;aX36dM#vfh)zC0p^CN1;ynRL!XlvK~e*hAkY}!@8hdBKB~gA10*)o`YpK=f2}aH z^b;A4aw)kFV`l@>|Ag593q|2F6h@D3_#BbI`Y%i7oQ8qKomUkzPB1Lg?&bs`5sjt>66p__XC+S4a#2N_(vFV>AYTyi`6bJ|*R_ zC@&=?L_Uj?#t&ofRo9>XJdPbiHMj-CWmp8)wHf<%*@d!Dra0E=dVc+KocA}w=>ony zmt9u^tAE`77Ns|^TCWQm4-e1dD8u}3nEed%Tww_bnB`i%s&>x5h1c^ZSJKeHdF1p! z29a2XjHTZcJs1bl3oLiZ<}B2+^9TiZ*j8&=xlzI0)>9k+hC0eC=|t z8@#Njx}FQ21bChj0_`ERshmOL64`T{M=x608;(gj5@`RD$D~?{hCNnGm@{P}b2a4+dZD(2AwqL@ZE-hD3g8XzJj zAGQzNj4u(Hc2q(h7IT>6ZE5n|g65F=7RLw%cbCE)OdbnB--PQxhF z)otsg89lHjd_lY<@{CEp8|x)%-{F+5DnR!rB(cK7_eLEv#U4688?tNtRP19oLbKhS zX;MpT>#($v)`!)RG}7%-^&4Tk{h8_klOBTOof&SK!UJPlN}8y4C#E=+A}z?({P}VY z`5JazVIfmYOw4!tApClzpS|Zq{dihXU}#cspHjtNyAmwF-|JK=K|b6+pzuS{H34gA zuYkqtNhWBxdSd9TL5D~^L>VH$xL&IszxWoi8I=XZ1iYaO;Jpm<*c;)Rhn+n*kI|CQ$dwG2tBQ_epMO0fVCE)jBzp%X~e^>fxt^J9;(3z8*7(yhhva7QWo6t-u7p5_ts3WpN^*@LdaOk_is6 z8Uj}zb4!O5#wtJLt2BzP$Ej{+Y^V_Oe9*aS^lKtM0=HW&D}nu|3z=vB+s*nafTycI z0~G+I;ERk3V6#fyvJg0Co;wi3wGrTN#_PC`#I+MQ!&emX0a>PKUD>zOX8Rw)e@Xr& z|A!C-tf@>hILN>!y65e&q815^G6^0Ln?7LN1i_k@#9jEqc-`A%>I@$waD52*b-Klz zNju!!+<*=^#QJFX!++azs8Lx9jI+H;SWr_7kBg&XU|^^`y;^TWA?|)6`pEbrX0F4w zl?|r*b~_;@Bdw(7KVZLZSa&|+8OOfs?_bmVH;+Xle?|c*DITgp0AQ~re`Y7XW6}-P z^LAREx*iblb|q&i5=+z2Jli@E`QdfJ^~q0*D$5`oRbfV!y!O}|#6J4xg>AJl zt%&)LwXEzBDhbO;Ger)4l}u5EsFtLfm^YioxG0g z{`M*f;OCIRy+`!iN<@leAB7<-0 zbM;)_pup>s;irTZofvCDT9MJpAEvn2Hoj0G{tswo?m#%StTS9|^oBX{zwkpJG$|{5 z#lyl%zuk-a>2W;({+hb|4uhBT3ppsRLQ&$06C-s~p#GD{VU&Eh<&G(JvI%)|!B5(5 zNPGm?)E~20^pXlugMH>t7s4vi@SN{&+mQDt`p!uC*AE8P9|Uzde8C{TO^|Q!d@8e; znF4s{?L8aFMKbsZHHc;|p&^q<~C-tTWDTYg$Xk2XAF1^Zp{u`|V+xuON_iGp=*u7xP2D|E;#~PaaeOwx$u&fRnr@f~r$JAcA z96=W=F$F`0XXP^+s#xUvWPWoOA0rBU#q?UU38J)>~^m1>tYDvq#)GST#kE* z!F)&+E}L;#4rBBV<;{` z##2@4bI)5<`OSpg=%K+l@@yvig&pDc5=LgHC=NaU%az?^_Dgf&t6;tM&4oBlL09*N zWM5Y|!Hm8OnxA0{ZKVN^08T`o-@w%|)6EJ~zKhT0EIxb~Xm%RJF}U{zF!|hw@9afk zr6^wU5xX;bO%4OkBzDs?RTBEK2?1IsXT)&MWl(!52heC0O%66dhvb=ATBh@EoYPl5e`uV|?mb{1*7 zehrEA;O{!Jop1yB=YHkAPmL@ec~xcW7@C8)N+0&3q8A+%%t7RkM^|#C`ljO}&gvWN zCoui@yDks!^DDKL7;+NH{$Db2JAz%?W9IW=2{wweHhv#k>?_NK)v8%=np&r5pl74I zyR$H%L+7mu7FeRcBJ=i8C=x!5@4wRyQJ5%tDt+I#B+Ky3%*=YtKRkFj!ZP%eXLA9EOk}a)*=)8zq9xO-?r(9QuhCmzU@Ks{=xAv3Uv@j@(m6n z@(TYe=g+`@w(FN5!RN9gXJKL4I(F;QTZ#gS%7BJiCWFy`YkiVy!qoj|r^ ztQ!H2|LR8NpSTSF1-Q6rhmii&pa^1rIY5GN#s5!1v*Xh_#pM<|kwCGsY5&E<@Jhlx zJv+25pEBykH-bUwDp>rDK3ZhByIVIsp(+Hv=m=4Wu^k=+uVu&oHD$yz{dRY_b$3YF zB9Cj`8%sPy>F^il0PAn^U(JsY0NKbTm01+g z9buWg=`dp9s7FKl*3e)fDgzj15)jT8?V_*`QX-Sy8JMOM6w24pZBe~%DPMFL@gf!f zzELxvn!oAfs!$VtzHF7K0oQpd@^M<}789|2lfL{4y|`(>S#Bb!`o@R(KlM7$i4}u{m~$vRQ(0`^oV$ zjJ{6>*S%z{JmuFxM}Lbk^DQNuFg=>6x|&HAM;P@v99;3yTm9!}ym&dG#>8Zr#&#Y} z6lU~`OlaLp`sV-sbv*umetmWVLW=(+U5vdm`9D$lBK96xdu<2xVl#^z#VOhLf4pBb zl`kw@8v zGMMtW?{$Axm$t(je^M9nrI1Sp`LO|T`94Zi{r4xNN)%{$T;qC(GrI4CCP#=TTzU%` zOCqe_i+%?H4r;sNbCZiRKITg_zBuoh$TyEn%>bf&E#|{nCYNh?$2p=HMT3gO&r74R z4)pwR*ie3TgPq5E`3jEG=J$$#JcXz2yQjk*4uYMB#t<80eKRPKO7HG67P!lwM6S16 zeP&Syf53_iw(JD@MXL$0WgLr`3}WT)?*xZm3*dKrSUPyfvZqwk^=)y}V>ZSF zt^WZB1-IqQiLEm0HAWyrfb+ny&(702!S{H={?nMkeRrbr4@>=u4N5#d4Mj|5R zSv$c2D?XdahHlm&DN@h&wk{@g3_YqTQcZ9^TG(!9gWv`6q+_JU*s9irwSaY5Ahu^P9_S ze(Rf-{6j5;{MxrCvzX+gM*oFNHbf*>Q|KE6=C&^N!5V^;V;+r4P!>fTrLVpT-Io#M zhkF`hZs0k$kA1xrg~+3%yA$|TPh0s_-ECe_L+w=zqi3`t{GH&pJ=>pJAnOx$#$SJU zwV++twyzSF*O!s9sD6ye%=E!HtC{~c;dmgfTP!SJobddms^$)(R zF`t5BC{JHBYOC<%Sg9UbY}C3JS{iVt9~-2uWDd#C^tS$e&F*fMwVwCsi;GY8;|DaF zQN3MXnsoVPX6<=Y-_ZsiU^#`L@7VV4ot^pP1Ri5K08j^{1wi-J^o6t-SOJ1xlVa=_b80nVrC`t;<;F{-LGtPv{Nj%yQ%@Mc z2hr>s{}gTItMy|E)H!sMLDAYnu3l+r4rk^8g1V{bO`z3-=Hncc)E}e#h+n%p9}9s; zOjjR~t5d@2h8)xYI2_X@7oh3?gj%l40MgBEFL~esj%2q0&m4hY4g`|1R!VllxP0+} z+txswGs;1;WA7_VZP@B+n>lFHunIvzxp7WR zP&d=>9ScseIkO(3%>Nbyw+fP=N?MCi6f~HsKU)&>Q*y{>k$&h|-cf)i9Ofc;l>Q{x z7OMU~zH#q8MS2FK_4j1Lv8tM5(PrhQ zigW!N_}xB(u5n)=Y(Vj{6Vc!AQA?F*#SEdfM7FL!mhh^mkbU;$8?suF9;;Inn7ziq z6d3u8Q%fiKo%4@EAIdYziUOYaZNWGC$DTUBvjHjL!)}m86QS10j17U137G+zgaIw% z1||O5iH52N9m|+ot z&^^Ha4zs#~YcUMbOO2VYQ3Z{wu{WleM|+ zE@jONdb%_4D3M~}ShFH4$cLtXTF3XCw_vp!c`&uTVfikjIE?h^D_+~v>w*!hT?y45 zOlWrW`kS?G)OdSJZa6-!6RX|Thcydc+dPINq^QE^pBNt`bJoi_>;B~};XQP|1ynVn zy4m3XQ^lyj&8^7!x*U+irYb%;F;S!E^MG^Owasr&pU#vjgmtvUEI=k~U=5+xt})~h z1NDEo6UW{ZMr%XDfN|Ay{s5iO@3{=(ey9(}x1!mis?cNW;(+@? zzR{P=96%BcDTZI2NB7Pd2}?Y`PI68ax{8E)$TGh=*`m@AYB-R^F0Y)Cbr7CgwvEtlol&vkbTUmT~)F zhTnnh$>b)WAiv$p4v@tSVu!#rqLG|m<>EMKkkeedW_K;dU`2bl1i;fe!!LIX$SbSi4aOFWMeW0ROlB9|UqGb=ut&J)~=ebU@d)v?3#DuJ8Z zphrlxa10#?cpj3xc9f**Jt0+2%TLk(s&#kBT+_%X7u4q*4!3(MyP`y8NlA`VYF&~!f54E;BdHt9i zHLRoAto_z1xGDfeI@=q9F>VyME)^*R}6!I*k1>#X%-y!qG&b^WjmF36s#;@i=Hys0jAfh$||DXDpIJ zA$i?o{pOL;osClL(;|}lqESVW$AY0}7gT^n65ii!6*0CJQkcwY0TvY3@6_S*QLn4G z!yGMA!gx5T2jsfTYw$X5oF6Xt)V1862#mgqvvd4K!p*0je%iPf>cQ=+WMl^)Oe=_) znj25g6+Pb{(4hWLn8ou?%)CS4ewOmiQ3oey*#79&1M~On8-%8V++Z~ci@1(x%#Sd{ zvE%TV9EhW0P(y|iRLV!uo68P`0Uxp7sYj`k;kMV(%|~x$Ow;s^?ldgJ(bT4<%G0@t zqM*=K$?14T1D{31Zv14cT=EN~fBT&J9soWpEx@OZgY}`c3ji#f*~9Zi z>y~KG?gK5PqQ^XXkY5Y#4^c@Gq@|yQb?N7G{&26Y!579M)V@_!;co^Dg-1yIc5u~7 zOpM3EK}>2QB+SVP5TNB2U0OmCfiq;Qdg}NFQKoWMX+O$)1D`%O7t0oino(=|D?Bm) z+Izp$OoV6&{@$mxNSK zf`}-zsr}L2_av&3piXL<9VX={@W6!#WMR-bRSs^Ud3^~765er$Zz>Cp>!;c`;z@YY zG4kOssLES&4vrY(OZ({S^NAxB=AVn5lJG`HDNn$}?vL_01HW{{sf9yVNVl69aS~mg z4*W<)z6p8tQY4Q;RSJ(8d4EKPBCy=pA1sJf$R-j*?h6Zejzw1GA$a}-v4v8KG)C*d z%>f^Q(ZteICTYX#smwFpON1Y_`WV}<6tCZAa&>~q+eAfz5AlhR@Wg?8cK$ad5?UQ$ z_!p@IxtwPqZ?dyJ<$5PwO1m0+RD<)&P{_c=k{}CGh>hWyp9aG5opf}=f|KbXwj4`) zf}gW)*n@Ws-ptRw{oV?%ZO1f;o)A;_4f5#h!e@j_)PYrkCH!Rf)E}PxMe6bwLW9vL zz3w*^hGllneeU2nEF@>nh}Mdx`f00?;zze^8;gGRM^_QCq@~CTg)$dv)flv=st68^ z+ry9B^wo#=n*Et!YD*c2Q@RFQ|MPnPp*i9+-w#qfkOv{D1*@wV9L~Ni#<)@)jB@MQN%U7LT7+XjFJH%ug;aTn1)MK%bIt9UcYg-`T@krRCD-sxQuV(`cbPR2$)@;?0Us5I0qTQMO-b|26`MbJItBPw=#gTSDM*-IUGvXf zT3pyM@5C$Y<7INhtZD^L_cl;Idnjm*59*hxq*z#_savy7SGhJwgk4ss50$ z*j@0R0{>=pxlhV55_8;^5X)lXG;9zHpf(CJ6!9T2qKno%xBi11k_nj%j7!B3r@~D<@M;3J!G%)(PLixHd3Xr9U zvGH(lv6viVosgC{{%_U=77_u4#q$RvRk`TnOtznL72}_BHh*MF5#WRN$P@l~?kYmc zOCcVq(bMBTa@dQBC2Ai1?EtUG#Hij(K^`u&GpVV?&_;iLjhgm$;r6CFO5I?xlHJ4vkzftz^gh zMM(^(;?XhVN&y54RC3rUs%GsG_%B35r}g_2qh>yoz+EbH=6(D|a5@H5`(#0p&1FNV zv$H}ovTwumv)(}z*=VsJ%SaD^p*2`fKb>+)8){#FrQU+Ap}WCkkPWX}zhg~J4aG-l z9Ho)*2z4gp;u5s7D}iKT5n2`|)pP_=TnHXsx^;|j?G_v)Ng*QzmR2z=1DGLeq$Q2? zUf=;cee=4bZg?Pnb}K5WHb(W{L!)Wn0GzBIA?G>#JRF*gh<%-7pA;iXpU)Y^*R*o;9ma)E5O)(^Mw2;Y#ki4(&!@y{%9{;ojA5O( zd%~$2xQ_Rr>;o~!U+r>y%1S>ZBNVJ`++}!UB*@E33WXf@$-&5}BG@qYZ(Mxn?XuYL zd0o9u&hU34e#0rtroX06${nbx=4YQ2=em`t661uGj7z5@ri~p?QAM;4drZd0jRb#f zax73lDJW>Dg9`of5b6#E)96r;o|^tep>@rtDBcm<(X3f3dhS$A1$09+U9X^NZ*IYo z?CRP9$YGFv_VSL;P7f}jp(!+MFbY(NW3R#zaGlrm%~I=TW`LwSv2JMSHM3cTnT%V@ z+JF zXTLX-%GcpMfEjW|sR+kAoMC=&+J4TZfaqjfxN)$lF5?}vlgwejR#DK{tvDdxNJeE6 zz{JP!8kRyOPn$zXQlL63gkl+>4sUREEpKci;pK!`IfG&$;a8iCXdvma2m0H!<`;M1 z)lpDHW`N}R=2cwBRq34%ht?r5u1*D2qppE3rQ%s5j!Be}8fD~>UyD^1M>I!T0NU0l8H zt17SSR=Kk=h{NuZ&=YK1NYmQCM>j-9RE)QGR3YjO&AR9C(WDUbGN!b#=d*GkVN7QW z+gev0l-nmObPZvw`nX;so|Bk=w1fH=D)e8yml4W1CHG zVxPI+Ydc~5E4hE@{E}&iY@ah`{SvlWTSe8*O5ea@WaX5|ozc#}5|c0LqryhZ+f~BZ zq?IkRVN|#o8$?61I%^|28BBlk`tuRFnwcC9;#f&UTc&(^W_I*Bl+em@WOF+={hy2efh`60=LJRCktB7*(kB=1 zTa+nE7LZ11tw~tW-p+j@!2(0~Eo74w>?cjKKJf>mceu-~Tlr>2bpm|yJ+TZgjJJRL zW~?X!V)N#}<5%=Qs-!@>vkR?ZBlZFhpa57ubdy;Ds6VPXeUbo~-nF!}kn{8F#WO*I zz1&JQ8jm46t(m6n4xtD_0r1CJF_m~&?B-2$eQq(`T-=|we@?>Oyk|7sM1w|R5x6ue z>e5m~Yb-KBWu=I)&8PXILc?0VkS8!2qfPrH%5Y#&++atU;;ucL`My>T(SD4?DipX< z4xz=_Nq@nu)5h!q-I_e5Qd(}TLDna!zmk(0$JXbx2s%1NnLZRz|84;UN7sjPX_pGdmH-3!a_qQNJWXPfJ?i3Rkb2BT}owIMVYa|uP~fh zxQAyW?|5w2l@rhdR^plYkm2~nd$>fDP>u~OQZ>9mX}@`|TcU#1#gZ6ENZ<-N*pT8l z+KjSmJqPc~^pui72#1HPZpoH0rDU4g^f)RB--(+mTvCtuEi0e4C z-h5h02g%D(#)!1m6@z_= zODZd97Dodwg@VQXK)4+^*w*A6AiwtW+0{>PJ;AFwA-pxHD&GjP3==jQ8D9yk1X7Jh>u zh%6#@R2NLIhu@;SYDk9%JowC=TZzMw&u?`rg0l_Zc52GQ_}$|j_@~D+oy^>`&Nod) zOFK+d^}`2>rB_1gBk zFOzwf)theIK5jK#$z%7exCS$tuXc)-d2N@Sp1Q~xWrRy+@wVif z+z*xjoF1uW9qc~pgPU?j6KRMEh&p_lIS{4TzHUd zRdx(LVwt7Y=uSQ7-d*_4BO$?~hlToLB4<9g+L>$6tL?hS%FVv+!mJcY9+?2gfQt&5 zz|buEO}OTQOZqxPD<1Sbe^0lf(n%F!a;#v$cOgltyo{K;sT-QD#BmF21ZfQkdInip zMY)JLH#Y~JxxM=BF+|Letxlm+&jtD%NWz>A0sQ0jeU4Hl}xBGj? zuA%X!ZlW`_m5Tki!X0{SM>m(73ehl6NuCK|Ypf$WRMg0c5Hw`#R8z|k(!I79g1SVZ z>0|Esz8GLpIp55m(hBA6Q>cl-?Y^Kc6r#anw>f@+X>-vUT?VaoFfSg@u>v|H=`MdR4MP+gy?shZE)D{q_u7hLNWmN#l(f^7@Eu z$B9%bmoy+1ymIXN=U^_Wd*u+7Q89q<&!28emWedlDV%CXSR2@~sg=7UySf?=n-M_S zks?VghkKQ_!n{){P1Pxrxs1zKdiTs`b)Kp@gUeO*Tm8z@m0!`mcV&V#BX-kYu`_ve zr|nqoKQ9x()zLIQN%F9c7SFam9`TB)*q9}`cJ2nE<5r41S94})vA%Ia3V z+2I1Pg#wtghiWnB9&c|i#g;p+-U?Yv+$BsaOOC#xh*wjl(h6ZM{!F;P4~AV%Ay~7t zwAe=@uDMZVz6eFpBbs}6c?c__Y~Q|G)OJ6o-ndp*1748a>X8_kW2h5iXRbmQD#KS^6){a3g&buf7(DVR1 zq68x$T*2Wu?lK={ug;IODliM=LdQ00*`{!kKlt5|x!wO9_`ms7ox{=$L~Sr`p?^v( zT}6Pd(QN+q*6I*8G3C7P_@Sc)Ke^IY-C_wjLy!I>Q5mZ*lNdp}V5NOt-Y8 z42A}&#-j3tyg8x<6)%;=-)09-=_Lanx>qZ{@aB~Dy&=Q4Z|w0$ObSEr{W=Y)#&64xw@msiK~{?SpX#I7?pbCZ@C;q9qlX9_pLj;e#3>)nS~ zAfVF6402!X#N6Ay~JY#i#mV^+&_y3mKjsiUAFfy>O9y;{8MbIe2e2alT< zpT`lge_4}@oUUEA9h3i_UViwgRRa0$z1R5j`ReIo{v?;+p?4bohJJ31Op9KDr<11l z@No$X?t%TpQJE&a_y_G+0d+fkS@+W6Un-Neb^1&@PHmU93<6XI_r>9waGmRlimf94`t~oevxEM7~0qUX* z;vx3-cGX*zRut`egG(FqwYM+BDH%{!dW5{0na|c~h>|Zpd2xk8%>A-@2onnL29{9O zteq{OO~yNo%A>L+XgX{yti;E3E!l~BmjdcVEtm^QRE21t8Kz~OdvO0Y zqzFva`@4}!G%PZ~UpEiMpQD9ojBo&enghiuQ?s^MKQ`0hxN zT8r?0?XiUE>nYHI;j{=EUD+UGG+jFer{!O)QmB*Xe3?@@wOB3MFk#INYg&boBC^gH zbyG94G)#(pDGB7?bbl70`gf@Rc`;$V=QZWQ?tD&p=+STG1*p~_wrB?mYs)9)Of2^G zAC{r0>)%Ki!-pnfFJye*5PLbZ;>{mqvaBvo_K&LOoEL6EsNH5$$qc>>f-g?M# z%wdZre$g;oyecEhokhkICyJVOFsRLE=pa>9XRl%msKw8I4V6wbJ4D1SA`?^N>RH-i zOa4@0`U9%gCU;vlF@6u8!4xw>(mZ_{Yk3}37yr>qNp&UT(Bue6NG)0HW-y#rr;eE4 zpj7_Hwi_BlgZZcPc~%GM(_(J%e{2ELj73~ie%aES2p#uEZPfsL8Y~#EB>R7#1?X|Q z(=}8QgjuOZ8S>{$t~&ivt>&a{!94GvZPNCP*N*!xpg5)$PsgH|q7r)ur*(KfGe#pV zO_?Q=oV!2JN0JIhb?qS%PI2G4V|8=!XVs>@ zQKZO%2u{9?Z(5RFTa@|d5DskNmf#B~rIke~@7{hAHU7Ie;5#)zG9yFux}6&U@6_@lRrUyX_nXJVGss=g5x?|UBjS-N z^qxc>#UpVl?qwF%R!3@~T7Yy7(g{?nJyZD@qbOBO*GT6Z#D*0zw+`KsCEo||t@28~ z^%AEDQ+WT5YAI)ot9uWRj_;&tG1GxkAS%VAabZ`nB8A8Em!$F*OGdQzTHkkM4EzrW~xk z&%D#WkQTG?sZBr3yZ#)w5x?gzplskj!SGuccD`tDRb0u~XiYJ{++bw1f{zelRP4Nc zZ>yd^7Rc+k%G*DXwk^MHAgJyDti5F;H>F-y2;^|O2O8m=AT)L*9knbT&uUHS8rmU!dXvGm5vFTgCm(r%^ z)2#M{x=rzot|ffr;WB^+XY%l6(ujiMh*W=BL?u?1-@g{U978`X?$sqUqgEkT@GHZk zLi8P8nTP=H!IjC&#pq}%wAYV|6F7r=PnshahNjgJD;gJgjwIo{nCl=2AKt9}D^;AC za%Ts}7E9&{2t7$+{6jXc9~l5L?YP6q(LTKv2NV@zpRS5~E;3zynEiTXc9 zg^v?V0=LEY<*E+>8t73h@#A+<5lR9JOB0ey2vw?{Xp641h;j;YPUd=syM8e#CJgdV zvZNZsJB?x@e3au-sUc;W-psLhTL_pEQBAk~^ z>raGf4-i7o8pTmw;gFbA<$^`7MpJBqi+i$;aOdQ77ihB3U1PE9*l|rSDwrvCn{#VC zSN=FPa$nS>-QK6se4yGYSt_$~S5ePNn1RLuJG(G6vc|3`PU#Lr&2bYZY?j_%kf^I}?Ir?s?QE4RTuE#ea2d%?+|`V$^Td1>>eyG5#wI%5wLVvD0of&<8ije+LQd&K`+nq8A zuT?gvw9oIdNMJ+wBDKU?mfz9+NYRI#m9$pq<$tWd%V7M znaxz0#woEl!%HbzQ`~5T6zNb(t^-r504#)01v*C>F_)HWRv&pBO3}6Tt~Hf&%kVSi zymY7<&ZUX+d;g!K7dEzci9~i4t`X@fIPvpIv5T*FvLrLAz5VIXidYERjvX-U8DHks zrc+ZnJLQ9nc%;=`;lE~>D7!IVsJ45*xos#=ArBcUJI!(mqOCLMTYMYddooKf&0q?U zlV~!Mc9irDh{KXI0&^Z?G=mr-+gt7xxOD8QaOP?F6jXokr8z)=5i88Jv9RJwGqKtr znL2&Cm(|3gZ<7A3qvQF%TKej!sJ`!Q1Q8K|58a@&wDgeDA}~mINO#vrC@ml$ATu;b zmkc#@_W(n8N;fzRAVbJIet+-zWA0t|tXcQ0d-s0M-p@YgxiH7jq|IQYT)xT0_TGN{kde-&&^a7mqDW2+WW7 z1w3_HzG9=_kYQbDiM&l@v~Kws--)_K3q_ljzqZ9_XOO0+ZKss?_>J@s@U#M)`AQf7 zue(~?88^oFCJ9sI+aV3blro!_-Uom0+eYQzGKvv$Xr5pF4Uw@Jg6MDS?Q8NELpgh( zN3&$z-T>ZUtIs&*iQiBlp1M+saK;TMrw`Hdn2kN(0ujuejxJpcnM#Z8nYS0%m$hUi z1vYO4(}n9=;3;K~nP5CN;&p(Q{HI3qFfKBG0igm0AmYnWY?fJhVIJywhV{YGNGfAY za06L=A7*we@+^P>m^RIk@-kxtwcJg1r=!B*E?BGtOsdufxx!bD(`k59Ge~Y@v+h?X z33+8iUJdZZE&717Om+;_xX}%wf1@3L3=v%fC3tYb$AxG@D07&nCsi9?^QtR_>4sdw z|DaTh>lGAmHVanUSGM`QekkzmfYYCl$Ej-o&reLj3XG`(ZCb6O?;$;z->SZN(U8Xe ziNZ-<(XNjeg-%W1z}zM>qaWA_nI8sb5M~E?fybF0g-8WN*gCSuoN$N~?nEkCa-`$Vrw>-UE6(U3}=YMj(4&F#v8OA~eGj6awA< zmR%YJd<__}6#OauIIrBwfPEx%kjdJ_gwB25H>%w{Vp(HiGnQ$IeaU8k3l$0iHL_LBit``VvL7KiIQoW|lXtr|rl6e^3*27~3_b7ZB zaTC3c>g@=T;Z%)4MTxdutbr3*Q!~;G_B-u?vbn0r>XClbz#!VoLiVhp_$(;`S_bit zDnT1}Pmq$OtXM3aai#pOP-^yDD-L%4ISC!U-Ep&kdkr)5_;8_9Nzh&o58P2%B@jj_zjL9A|Nv)yQ6&VB0LOb{%{&{u4+#6{5;Gw zhebJI%;Wo6B+H$NRKJHz=jH{G{L7c=#bB;XDCj0-E1W)tV@Oj2)oRUA&wsW&m@~$A zr7Dp01y%9;IoZZj93;6B)PG0%511Lkt#l=*#49T~V*fnckSn2hoT5{mwZ2<1>}((R z&WvFtpDW)DDV?M09JimuP_Ka@i1x+B2%n>>e!M<8+SwBVD7TwWO43Y6v5>6UQ;+u9 z19C>Z#Gyj;nhxuwGyWBu=ex>C*^iCqriM-Vj)$jGkE38+f*5o$m2@#O?yj#7U>#;)B*xQm{QK=4GM7*6onR3m8>#v}?)G1q z8pO|7OYZ`Qv(@3b7%gDH{k6P?i|bi_V@b-1%=md?;yV9FT`Gn}9!>S==Kh^xnG~hW z^o{uzAnU@L2`>i@-xTXIR=l_;ov&kq`~bVoY}8NeL`U$=_Qp7_kmZ)&sJ01~HiB}( zb|wT{R3%bbjfB6@C_Qnq?ZAo!gL9}ii4rqc!J!g9X^9c`*ZoY4d)(kc4dvdI=|%6B zC}ZAgo((~rB3x#@3)$Bq2nF9qIa)lVd`A!}A7PQ$j+?xursfoXjuiS>wgAh&e+};O z%I8$CMr>g^iJARQbY}bwov9rUvy9Nx4nMZy1v}99_~|?P>QtcS*eq2A=y4_GB>!hc ztAkQK_Me1C;BOetYzJ8&wRukJ#U(pTcLz`?Ou zQJ&m>ORCu$?+?A?08Z!&jihQ(H=`b{3f4QPK0DZVQ}W!i{q0^H1yh5NwmfH?X{{&4 z21)mn_|_E9Ls&+NzVzN9@vy0pO`?U&Gd^Fx>TXx8nzi{$^hA%4OxJcqF3hfDCgtMm zzrUY0J~@hk7~g%rQEzDYGOtS1vf(qi2Dqm&GMDlyV=fGmi&N^gs)sSGkMdZ+?bOgZ zxMm|j6`H#L{{9W|Q`dM6km^B(nR|w){D3L>yd{$IXxW{&8WLn_F{gzL^73iv8MEQ5 zdQOpOp2KuwNw5~nij)WYAekoUIC$BTMFE>?-Aeg;JqjvP6~b_#rKBMsf}Vkl1@W_9 z1L#=6*I`UJ`|_^+{w@x;QxfzolNGA3UIf&TQ_jER%v{YdJJwQU?jo*D zEUmotP^Qz{&{0cI;R1XwR8@T<So5lo2y` z22&qvlWmab2lI*~L&6FX3s^>&*-v!Y?8U}Ma1JNRr{a-lZvV47KE3a-r7IZ2>aOLZ zVkN1RNumL}Yb66JDh7!j_u>-3(o(2{%U03nA9R&v=nE@xvkWaxhyMJ~h)8Dcj2wis zCI;b7KRW8OKz669fHHpjPu)j%VKxC7_@9f)bLPX|%1cUt!sxg%i=epEQ_91;6|~L5 z{EqHq?kf!`?(Uu69vq$_8-_S@WBbR(nh8{3z2UugKj+mt%O~_j8+YO?C3rHks8F%*NU~bJf3f=g@p>j*lSB zmn6@(_KCQs%y=#HV|DKjfu@>}YqD-^3vDs@%V2tWk(*A+zE`O!Y5e)BLUg_6_FndS zGHVvNo2)bBZELH3Mmc2fIU#a9HpL;3e;#tF5`}I|aFZc<`bGJ3sN6{=@-guodLM2_ z{X8;a`#UH>=Vgf3n_Gwi9!SHP+x^viV8wQupk;O2t9GaM7xVdbv}Co5Nx8hhl^Ig*GxpGw)HmkG(bZ>EoN z0IKoiTVxRlt;}j@QUpswEIb2qEXOI=c969?Ne8{8u8hQDB9B3d=gnG0)EqkOrEV;$yvPL8C@44@6fu9Mj1)At6^ z&Lfm=HD3=0#%hIGz%y5~@5XB*$e$qvd$+G+SXNx*epKeZbCzXb*l~9K88o`_A0L+4 z{4*tw$JnMDmtNiiLwY#jK_q#W0_Aj4v!>&>(#hflYKjOiR?%4Wv{eQC%ou)^DoqHv zy)kBA<8MIRA$0>+oz_uzrqw&NOa0|{P?g7{XP4jQnME_@?d>_Ntwmm4*17bMxN_~2 z*4pAnkE`5T7V74azVUOyU4+NdT0o-)@&fGashARhs85YPsH=c?QlxRnb;_k$gNL7( zZ%QuqS1r=?bYqp4JH+&VF^pr?$vsOe)_(uyq)wt1@ACLH-N9#j7dXv6m#EjIX6c|*R@bYt`%QE+y^}W%bbqmj zG4Jn?mN|zid9X|lBo_7Upv$z-db&J`6%pXndF{&=UC7H}>eC`c1!8{hs|qQh#t+u>iIc$-~Du#+Dbpd>CYoWfi=WV0gEBIGFu z?>T?=q3TJZ$?@r_-T2Vc+z}g4&xx{=`__|^6j_?wU(@NMQ)&Gm z`=lwliy?rKH%NS-jUY^;O~$~J+sglpat*^$v}&gxRy+-6L~gc7`1M%@@f%pSfJx*V zneW<7_UY)h-f-!xUf)RNmsJs2@C?|PLuCeLt&HRk9rjubzjAniPTDnXl(S<|zF3GX7^{=3xFRIO@bT0u$d2Ee~(0vTqnynBde46k&! z!G!I5-7m6zADMop)%2(>iMBs1u;PJCGavmpx|)y%^#7>^xaP9T$s~%1_d%AHBOEhk zD{STs*M$K6ilQZKwE$AA@ZQ4ZWyMM1@y`0>+2m3F^p;obOl*KzDDU*+A zb)KZs3!2=2As{M$gew)KZ(bhlhnwMzSwD77M?3gxN9 zw|CCdDhWcX^V|(L!QyqzFpZ?l;`htT0nwYRA`)FxJhs*>ImNFEuS9RiId=E4!ok|h zK~O~3PGM^v%9b-*D7N(mtsAqf!3D8DGxiy;cs1l5b17&J6V}*!C+s3ax4Kt5x1jT_ zr_#})p zjWhb)qScSKzh8~S&%g-N;t|hk2-6Vq0qs2y_>9b919mVV1@OQ^DjK)t9TTVZyF_QH zH?z^_w@GvGOlyXZ2@w{a82+vM0_+Mv|V1esYSe?d8?xy>u}tI^^4 zc*34&Mbzk5{hy#~5TYv;C--!D`A-LeanNqk_j1dbP2l=>Hnba*{&GHzZ6c zMF%xYcxhE}{NLIo(;R6U1|N1g7@5wm1s;N~1D=Q9^U<=Rdpbx)> zLp5cifsX%FRUJzvqH>u(mLEtBG#}JVr87kmxVI$R3Ek3*Va4emAfMV{-Zx@ z?T}k8>sfGecplE=6!m}ns4=}N>D*VD(AC_fX8Stzg{+N(M;}F}?sRFPwIM|$%cY*9 zG*G)d5T@(ujm8rF5=PTx!37)h)E6qj3^caTa!dex&RjweX)8)>Moil#RRD|h{|fx= zN#N>KvkQAaOsrM}n49b_!I7)-6F)dT-Kz`9-Cr(!J)iLo)sK*NiNdcCws6VA=gx$p zmvpIX;;B_4(Mux!%N}Ix!P`IAiDAC=i&_G7baa`h6t=i4TS4QO^jns}I0-Hpqsqb{ zv!`l1F@|6HFZ@sdxUoL#h{4{@CJtV+lW0}2h+x60v|vw;OO%FDRGa=T=JW3Hq90~Q zspu?wCnTrz);*ti0>oMC7ZK|c5fc!L@-2x)mj^vyI)^8rR_>&d z&+M$Nt-V8P^B&dlyfpjGV=lnJ{_$A6lZNJlJ70;0zT5Qtpc&z#hRR#cz1NwWYLVE9 zXDe_``sCjbCjZv{hT#(*g8rQ!Fw^qF^15=UAr(Q zwVuobkKbUHM(N?SOMxRDl8y}YVduU6je94>++u`YOvox`jF#=Yl$G-<+KxSQywCJ! zgUt3L3EESaj@)_*6WcChy=K(hK=|)t!&I3-M-)dzj+mia>jY8?TP7=72TRK=!v9MK z^Zk)LM=Pd`bNF4iS;akOh+!pDi=oD?DF&-(5axfH2O=YL_>d%6zLcb@QRe`=%I0Ds zM!mLr2d{zpLfdb%zNTO~58fMsq>-OxdC1s+`!#1bu1o<&wVsXDjewEXeOxELdv02#BpjEdI0LtOp*4ug3EAgIhKP zpzU*OFdMl7$3AMyTioF{nnq`3JB1>9fmKz!-7RPD>bI5I9^5MFzKVTilJoWv_M;7T zR$=S1P+V+z&;Hjvn94LNtpF#e)|-II@mZ_^=&)(w%*LQ*=!{oM4U-Ma^P0YXJ^X-K z25#k_mtY`i(*|dKU<1TJcV1*W(+4s8ExSF02fl58dPnRfklpH9H)vCb?^Ev{d;GI; z&B@my;G|oYzW54<&t=mxg4GD_O7mO2g#`CLOz@SV*R|#Ml0>+$7^rNmr6x} z-G==lb@GW0uB(s7H-E{jfMicb3>}u4CCLALF2+E@_K+}z#Qn2uBhQ9|`<65)J68jU z{NbZ~i!^RYU0%rIrVm2VjiuRr_ZQ>6x%>ED)MDP^(>+b&*ci~Q{Zjun@SjoFsbdTS zURcaAo%JOm=4+z&%3g^P*mDHPo{`bKvl#~}VBWnY$5*pvKWs z&Ea@xU^b*)=f~vU7L6Ok;pBApTsPKMgg72i%|Fvar>mDmYu%AoRNQ+fu+Zh4d++kZ z#JKr9Y&8fY!zI2r(`ORLZqh2zG+q0C%QMIDj3TqQxA&+ykS**K-W^y^$IlUq>uP7}#;UT~+6;tOsJuBH+@HEeU=lwpp z{w^b7R8TwvaOT{ylvP3=m{M{Exr{fKjQZel0-K+j(T#1xNF+Y`rq1r@VlhXUR_1(mseC2v|k^IamC@NMR{1eBybdM&TC%jCGBb&5c z=yk}{)bNol4Tf{Dy}$YRw?yp+X1Sr7XMg|wSCuVOPtS*sYX9@|g#{@@sZ$p%UF6i- z0P3~plkj>jgp0e|CJapvRK?!ICW9nDE+^0oX8F_(UNVX0@q;y<|A=wycyFL$P?|35 z?z*vxmI68_1*EWsZpu44ZB8pGRJP(TI}8_bmPqj@ivxUkG1DbGU^mHL4CCj}zU!V)<)y^TJVUnd?eniuy(=%%tw!F# z#(lX6YQYEy!~M-xpA_}#d+CyCcwgV+Nr&&f(ZsoeX3@kU`#EMQsh1%{3G;28dF(&F};AgnW4Y2U33BO4oWG0ff+{Z?>$sZ9qO}R9AYV~H^Q`Rw7ltE{}c!Z83Vu4xwlR74LJP+ zqvv2#+;o0{eIIWfYqC$WfarPr z&6u%+5=h?*4lI#Y)={Zo8@%vtIzl=`!zha?;9RFuW!CDoAO{JV4{NA8oMqsoXvW2)wp zv`@bY5nQmcxmJ7SGO7k-d~D{CLezx)C}L*^7%u%eaHS1vo3I$Xk`FbKh9?du)ivK5 zPKH@#zhC9zPp95Xc=MUPq(^9w<2rv(Lq!2c(%v4nj$m0{Xm^sf56!uR4*G`YzItY&{VJrQ>)T_p7;)kj)6K7cSX5`dN1eL$ zR^1Lp{MQkBtEYsW*Q0Ek_MxM_^rL?#*?z72i%m7k`W|*-esTY-w#VQsdAJd4CTL=h zuC8~`gf}4v=-4FpM*g9UZ`KFHo(-W)eX(n$MYhPN&icaU7iMG5~T60YfuO^=lWXP(5^e5yZ`1MdINL$(-LE**Nn4J{{PHJ z)Y*QLUSL*jdE&p@z>f<{Ya?uB!bpej8$KE8Dq`cg8I+yA5}1H$%Qu<`)pDhO2N#CF zfBP0qZ<6&aJq2f}H+!o#)DhBS)6B$zdT%yb-ubk|8%-u3F*^zNo%HVfB36DKWkv%$M^{q^Jgu{pc$_V zb9_#*i&t8PronVSH?WXic}Ui27h4|<_Fwnqy3mdd`I(7cqLa#K7VKcbE@5tR-+i;o zHyF7#^+069bxDkq)ZSfibdO$P%%T6p@3Q=TAM!t7Tr%{aD73|YMV>z^kPh&SurSGU zU+m!~MGij*<2hKjaONwb>X(o z9--5d4YwR3rD5Qui+9qbm*~UM(MrG(&lZ<9zcc4=uZz*13iOFs|El?WX#26|&iS2j zay`#?b)Al`Gawb%PE8Mm#{9Lmz0uIkFF zuO2ibVGpA_ut_Ao+u7kZC6wnb6VTvmr(+KR74+Xoef@&ac zAE4zL(qrpm|ALp@mF*d>p>*o#FuB8809aZn?X80Z&!^jX=F~YLP(Ah&f(p*xehC^W zRxuS7TI^^O^b#7ZS=8bW9G?95_dBJfR{yi&m`;W7&l*C2fyPjMQ?b8W!?%3Fn8b~7 s{n!(OyR literal 0 HcmV?d00001 diff --git a/mods/mechs_by_shegar/sounds/mech_peek.ogg b/mods/mechs_by_shegar/sounds/mech_peek.ogg new file mode 100644 index 0000000000000000000000000000000000000000..477b7761bef4ba8f4b5c8c389d80dbf49b239ba3 GIT binary patch literal 4524 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%0Dq{GaHpzo9t@|LGXtC@R*7jV1>f$fbAu#y7uXQtn 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 uJ8~4XU2(Fxu{MvJ8z0ksy7% Date: Sat, 22 Jun 2024 11:20:14 +0300 Subject: [PATCH 61/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2380=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AutoChangeLog-sierra-pr-2380.yml | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2380.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2380.yml b/html/changelogs/AutoChangeLog-sierra-pr-2380.yml new file mode 100644 index 0000000000000..5542276748a55 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2380.yml @@ -0,0 +1,37 @@ +author: Shegar +changes: + - {bugfix: 'Влияние на зрение пилота восстановлено, сенсоры и прочее не работали, + мех не мог ослепнуть'} + - {bugfix: Исправлен спрайт огнемёта} + - {bugfix: 'Мех промахнется атакой, если цель отойдёт от меха в замахе'} + - {bugfix: Фонарь больше не перекрывает голову меха} + - {bugfix: Отображение спрайтов теперь не ломается при повороте с юга на север.} + - {bugfix: СМГ меха не рантаймит после стрельбы.} + - {bugfix: Теперь пилота полностью рисует по диогонали} + - {bugfix: Пульсач меха теперь бьёт ровно и по 1 выстрелу.} + - {bugfix: Устранён рантайм возникающий при копировании доступа с ID карт.} + - {bugfix: Устранены рантаймы возникающие при надевании НЕ одежду на голову+} + - {bugfix: Добавлены дополнительные препятствия тому чтоб мех сходу ложил человека + на пол. Мех теперь всегда должен исключительно толкать стоячих людей.} + - {soundadd: 'Звук принятия ID, миниган.'} + - {rscadd: 'Реализована система взаимодействия меха с ID картами. Появилась новая + кнопка в menu меха. Если нажать по ней ID картой, вы сможете или очистить имеющийся + доступ, или записать новый, выбрав из выпадающего листа. После этого, доступ + записывается в память меха. Если ткнуть по активному меху картой и карточка + пройдёт проверку доступа, мех изменит своё состояние - либо откроется если он + закрыт, либо закроется, если он открыт. К этому, появились 3 метода взлома - + емаг ИЛИ мультитул + 4 уровень девайсов (мастер это пятый) ИЛИ мультиметр + + 3 уровень девайсов + 3 уровень электрики.'} + - {rscadd: 'Сильно усложнено обслуживание мехов. Если урон в конечности выше определённого + значения, одной сваркой не обойтись. Вам потребуется лист материала, какой именно + - зависит от самой части, а так же КРАЙНЕ ЖЕЛАТЕЛЕН 2 уровень девайсов и 1 уровень + конструкторства, иначе с огромным шансом, материал вы сливаете. После ремонта, + максимальное ХП конечности уменьшается НАВСЕГДА и единственный метод это исправить + - напечатать новую часть.'} + - {rscadd: 'Сделаны заготовки мехов дедов, Гигакс, Дюранд, Фазон и размещены на + базе дедов.'} + - {balance: 'Резак баффнут, 10 выстрелов вместо 4'} + - {balance: ЭК мех получил осмиум на обшивку дабы не гореть в гиене огненной} + - {balance: Мех больше не таранит меха и подобных себе по росту существ (К примеру + ГБСа)} +delete-after: true From fb5fcb848688bc39b16ff5ef745c1ac99d176596 Mon Sep 17 00:00:00 2001 From: FeudeyTF <72273449+FeudeyTF@users.noreply.github.com> Date: Sat, 22 Jun 2024 12:12:56 +0300 Subject: [PATCH 62/80] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D0=BB=D0=B5=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BC=D0=BE=D0=B2=20(#2383)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../machinery/telecomms/telecomunications.dm | 5 + interface/skin.dmf | 94 +++++ maps/sierra/sierra.dm | 1 + maps/sierra/z1-z5_sierra.dmm | 18 +- mods/telecomms/README.md | 81 +++++ mods/telecomms/_telecomms.dm | 4 + mods/telecomms/_telecomms.dme | 32 ++ mods/telecomms/code/boards.dm | 11 + mods/telecomms/code/macros.dm | 10 + .../telecomms/code/scripting/AST/AST Nodes.dm | 129 +++++++ mods/telecomms/code/scripting/AST/Blocks.dm | 47 +++ .../AST/Operators/Binary Operators.dm | 174 ++++++++++ .../AST/Operators/Unary Operators.dm | 51 +++ .../code/scripting/AST/Statements.dm | 108 ++++++ mods/telecomms/code/scripting/Errors.dm | 137 ++++++++ mods/telecomms/code/scripting/IDE.dm | 211 ++++++++++++ .../scripting/Implementations/Telecomms.dm | 272 +++++++++++++++ .../code/scripting/Implementations/_Logic.dm | 294 ++++++++++++++++ .../code/scripting/Interpreter/Evaluation.dm | 207 +++++++++++ .../code/scripting/Interpreter/Interaction.dm | 139 ++++++++ .../code/scripting/Interpreter/Interpreter.dm | 315 +++++++++++++++++ .../code/scripting/Interpreter/Scope.dm | 16 + mods/telecomms/code/scripting/Options.dm | 79 +++++ .../code/scripting/Parser/Expressions.dm | 320 ++++++++++++++++++ .../code/scripting/Parser/Keywords.dm | 175 ++++++++++ .../telecomms/code/scripting/Parser/Parser.dm | 180 ++++++++++ .../code/scripting/Scanner/Scanner.dm | 273 +++++++++++++++ .../code/scripting/Scanner/Tokens.dm | 38 +++ mods/telecomms/code/scripting/stack.dm | 22 ++ mods/telecomms/code/telecommunications.dm | 101 ++++++ mods/telecomms/code/telemonitor.dm | 9 + mods/telecomms/code/text.dm | 49 +++ mods/telecomms/code/traffic_control.dm | 213 ++++++++++++ 33 files changed, 3806 insertions(+), 9 deletions(-) create mode 100644 mods/telecomms/README.md create mode 100644 mods/telecomms/_telecomms.dm create mode 100644 mods/telecomms/_telecomms.dme create mode 100644 mods/telecomms/code/boards.dm create mode 100644 mods/telecomms/code/macros.dm create mode 100644 mods/telecomms/code/scripting/AST/AST Nodes.dm create mode 100644 mods/telecomms/code/scripting/AST/Blocks.dm create mode 100644 mods/telecomms/code/scripting/AST/Operators/Binary Operators.dm create mode 100644 mods/telecomms/code/scripting/AST/Operators/Unary Operators.dm create mode 100644 mods/telecomms/code/scripting/AST/Statements.dm create mode 100644 mods/telecomms/code/scripting/Errors.dm create mode 100644 mods/telecomms/code/scripting/IDE.dm create mode 100644 mods/telecomms/code/scripting/Implementations/Telecomms.dm create mode 100644 mods/telecomms/code/scripting/Implementations/_Logic.dm create mode 100644 mods/telecomms/code/scripting/Interpreter/Evaluation.dm create mode 100644 mods/telecomms/code/scripting/Interpreter/Interaction.dm create mode 100644 mods/telecomms/code/scripting/Interpreter/Interpreter.dm create mode 100644 mods/telecomms/code/scripting/Interpreter/Scope.dm create mode 100644 mods/telecomms/code/scripting/Options.dm create mode 100644 mods/telecomms/code/scripting/Parser/Expressions.dm create mode 100644 mods/telecomms/code/scripting/Parser/Keywords.dm create mode 100644 mods/telecomms/code/scripting/Parser/Parser.dm create mode 100644 mods/telecomms/code/scripting/Scanner/Scanner.dm create mode 100644 mods/telecomms/code/scripting/Scanner/Tokens.dm create mode 100644 mods/telecomms/code/scripting/stack.dm create mode 100644 mods/telecomms/code/telecommunications.dm create mode 100644 mods/telecomms/code/telemonitor.dm create mode 100644 mods/telecomms/code/text.dm create mode 100644 mods/telecomms/code/traffic_control.dm diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index e1541cd43bd2a..169137bae0889 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -478,6 +478,8 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() ..() server_radio = new() +// [SIERRA-REMOVE] MODPACK-TELECOMMS (Гитхаю жалуется) +/* /obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) if(signal.data["message"]) @@ -558,6 +560,9 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() if(!can_send) relay_information(signal, /obj/machinery/telecomms/broadcaster) +*/ +// [SIERRA-REMOVE] + /obj/machinery/telecomms/server/proc/update_logs() // start deleting the very first log entry if(logs >= 400) diff --git a/interface/skin.dmf b/interface/skin.dmf index fb4ba42cd31d0..42d766fe9b2d9 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -631,3 +631,97 @@ window "infowindow" tab-background-color = none on-show = ".winset\"rpane.infob.is-visible=true;rpane.textb.is-visible=true rpane.infob.is-checked=true rpane.rpanewindow.pos=0,30 rpane.rpanewindow.size=0x0 rpane.rpanewindow.left=infowindow\"" on-hide = ".winset\"rpane.infob.is-visible=false;rpane.textb.is-visible=true rpane.rpanewindow.pos=0,30 rpane.rpanewindow.size=0x0 rpane.rpanewindow.left=;\"" + +window "TelecommsIDE" + elem "TelecommsIDE" + type = MAIN + pos = 281,0 + size = 569x582 + anchor1 = none + anchor2 = none + background-color = #171717 + is-visible = false + saved-params = "pos;size;is-minimized;is-maximized" + title = "TCS IDE" + statusbar = false + on-close = "exittcs" + elem "button5" + type = BUTTON + pos = 209,464 + size = 70x20 + anchor1 = 37,80 + anchor2 = 49,83 + text-color = #a4bad6 + background-color = #171717 + saved-params = "is-checked" + text = "Purge Memory" + command = "tcsclearmem" + elem "button4" + type = BUTTON + pos = 157,464 + size = 52x20 + anchor1 = 28,80 + anchor2 = 37,83 + text-color = #a4bad6 + background-color = #171717 + saved-params = "is-checked" + text = "Revert" + command = "tcsrevert" + elem "button3" + type = BUTTON + pos = 105,464 + size = 52x20 + anchor1 = 18,80 + anchor2 = 28,83 + text-color = #a4bad6 + background-color = #171717 + saved-params = "is-checked" + text = "Execute" + command = "tcsrun" + elem "button2" + type = BUTTON + pos = 53,464 + size = 52x20 + anchor1 = 9,80 + anchor2 = 18,83 + text-color = #a4bad6 + background-color = #171717 + saved-params = "is-checked" + text = "Compile" + command = "tcscompile" + elem "button1" + type = BUTTON + pos = 0,464 + size = 53x20 + anchor1 = 0,80 + anchor2 = 9,83 + text-color = #a4bad6 + background-color = #171717 + saved-params = "is-checked" + text = "Apply" + command = "tcssave" + elem "tcserror" + type = OUTPUT + pos = 0,484 + size = 568x100 + anchor1 = 0,84 + anchor2 = 99,100 + font-family = "sans-serif" + font-size = 9 + text-color = #a4bad6 + background-color = #202020 + saved-params = "max-lines" + elem "tcscode" + type = INPUT + pos = 0,0 + size = 569x464 + anchor1 = 0,0 + anchor2 = 100,80 + font-family = "Courier" + font-size = 10 + text-color = #a4bad6 + background-color = #202020 + saved-params = "" + command = "cancel" + multi-line = true + no-command = true diff --git a/maps/sierra/sierra.dm b/maps/sierra/sierra.dm index 0cf9fe7ff3627..79224e5614d5d 100644 --- a/maps/sierra/sierra.dm +++ b/maps/sierra/sierra.dm @@ -198,6 +198,7 @@ #include "../../mods/sauna_props/_sauna_props.dme" #include "../../mods/wyccbay_optimization/_wyccbay_optimization.dme" #include "../../mods/contraband_vending/_contraband_vending.dme" + #include "../../mods/telecomms/_telecomms.dme" // UNUSED MODS // Keep them in ascending alphabetical order too, please diff --git a/maps/sierra/z1-z5_sierra.dmm b/maps/sierra/z1-z5_sierra.dmm index ddfafc3907aec..fab0b646df158 100644 --- a/maps/sierra/z1-z5_sierra.dmm +++ b/maps/sierra/z1-z5_sierra.dmm @@ -4659,9 +4659,6 @@ /turf/simulated/floor/plating, /area/maintenance/fourthdeck/aft) "aHL" = ( -/obj/machinery/computer/modular/preset/aislot/sysadmin{ - dir = 1 - }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, @@ -4669,6 +4666,9 @@ /obj/floor_decal/techfloor{ dir = 1 }, +/obj/machinery/computer/telecomms/traffic{ + dir = 1 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/tcommsat/computer) "aHM" = ( @@ -91245,9 +91245,6 @@ /turf/simulated/floor/tiled, /area/crew_quarters/docking) "nwm" = ( -/obj/machinery/computer/telecomms/server{ - dir = 4 - }, /obj/machinery/light{ dir = 8 }, @@ -91257,6 +91254,9 @@ /obj/floor_decal/techfloor{ dir = 4 }, +/obj/machinery/computer/telecomms/monitor{ + dir = 4 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/tcommsat/computer) "nwn" = ( @@ -156291,9 +156291,6 @@ /turf/simulated/floor/tiled, /area/hallway/primary/firstdeck/aft) "xeQ" = ( -/obj/machinery/computer/telecomms/monitor{ - dir = 1 - }, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -156309,6 +156306,9 @@ /obj/floor_decal/techfloor{ dir = 1 }, +/obj/machinery/computer/telecomms/server{ + dir = 1 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/tcommsat/computer) "xeX" = ( diff --git a/mods/telecomms/README.md b/mods/telecomms/README.md new file mode 100644 index 0000000000000..74aeec91ba6f1 --- /dev/null +++ b/mods/telecomms/README.md @@ -0,0 +1,81 @@ + +#### Список PRов: + +- https://github.com/SierraBay/SierraBay12/pull/??? + + + +## telecomms + +ID мода: MODPACK_TELECOMMS + + +### Описание мода + +Добавлено взаимодействие с трафиком радиосообщений и исправлены баги с интерфейсами консолей для просмотра связей между машинами + + +### Изменения *кор кода* + +- `code\game\machinery\telecomms\telecomunications.dm`: `/obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)`, `/obj/machinery/telecomms/server/New()` + +- `interface\skin.dmf`: `window "TelecommsIDE"` + + +### Оверрайды + +- "Отсутствуют" + + +### Дефайны + +- "Отсутствуют" + + + +### Используемые файлы, не содержащиеся в модпаке + +- Отсутствуют + + +### Авторы: + +- FeudeyTF +- [SS220 BayStation](https://github.com/ss220-space/Baystation12-original) + diff --git a/mods/telecomms/_telecomms.dm b/mods/telecomms/_telecomms.dm new file mode 100644 index 0000000000000..78673d32bb03b --- /dev/null +++ b/mods/telecomms/_telecomms.dm @@ -0,0 +1,4 @@ +/singleton/modpack/telecomms + name = "Скриптинг телекоммов" + desc = "Возможность взаимодействовать с трафиком радиосвязи" + author = "FeudeyTF" diff --git a/mods/telecomms/_telecomms.dme b/mods/telecomms/_telecomms.dme new file mode 100644 index 0000000000000..ab61a4b93b6a5 --- /dev/null +++ b/mods/telecomms/_telecomms.dme @@ -0,0 +1,32 @@ +#ifndef MODPACK_TELECOMMS +#define MODPACK_TELECOMMS + +#include "_telecomms.dm" +#include "code\macros.dm" +#include "code\text.dm" +#include "code\traffic_control.dm" +#include "code\boards.dm" +#include "code\telemonitor.dm" +#include "code\scripting\Errors.dm" +#include "code\scripting\IDE.dm" +#include "code\scripting\Options.dm" +#include "code\scripting\stack.dm" +#include "code\scripting\AST\AST Nodes.dm" +#include "code\scripting\AST\Blocks.dm" +#include "code\scripting\AST\Statements.dm" +#include "code\scripting\AST\Operators\Binary Operators.dm" +#include "code\scripting\AST\Operators\Unary Operators.dm" +#include "code\scripting\Implementations\_Logic.dm" +#include "code\scripting\Implementations\Telecomms.dm" +#include "code\scripting\Interpreter\Evaluation.dm" +#include "code\scripting\Interpreter\Interaction.dm" +#include "code\scripting\Interpreter\Interpreter.dm" +#include "code\scripting\Interpreter\Scope.dm" +#include "code\scripting\Parser\Expressions.dm" +#include "code\scripting\Parser\Keywords.dm" +#include "code\scripting\Parser\Parser.dm" +#include "code\scripting\Scanner\Scanner.dm" +#include "code\scripting\Scanner\Tokens.dm" +#include "code\telecommunications.dm" + +#endif diff --git a/mods/telecomms/code/boards.dm b/mods/telecomms/code/boards.dm new file mode 100644 index 0000000000000..153f3ba73c5f6 --- /dev/null +++ b/mods/telecomms/code/boards.dm @@ -0,0 +1,11 @@ +/obj/item/stock_parts/circuitboard/traffic_server + name = "circuit board (telecommunications traffic control console)" + build_path = /obj/machinery/computer/telecomms/traffic + origin_tech = list(TECH_DATA = 3) + +/datum/design/circuit/traffic_server + name = "traffic_server" + id = "traffic_server" + req_tech = list(TECH_DATA = 3) + build_path = /obj/item/stock_parts/circuitboard/traffic_server + sort_string = "HAAAF" diff --git a/mods/telecomms/code/macros.dm b/mods/telecomms/code/macros.dm new file mode 100644 index 0000000000000..f5b1513cced51 --- /dev/null +++ b/mods/telecomms/code/macros.dm @@ -0,0 +1,10 @@ +/// List Procs + +#define list_find(L, needle, LIMITS...) L.Find(needle, LIMITS) + +/// Regex + +#define regex_replace_char(RE, ARGS...) RE.Replace(ARGS) +#define regex_replace(RE, ARGS...) RE.Replace(ARGS) +#define regex_find_char(RE, ARGS...) RE.Find(ARGS) +#define regex_find(RE, ARGS...) RE.Find(ARGS) diff --git a/mods/telecomms/code/scripting/AST/AST Nodes.dm b/mods/telecomms/code/scripting/AST/AST Nodes.dm new file mode 100644 index 0000000000000..7aa0f55555a8a --- /dev/null +++ b/mods/telecomms/code/scripting/AST/AST Nodes.dm @@ -0,0 +1,129 @@ +/* + File: AST Nodes + An abstract syntax tree (AST) is a representation of source code in a computer-friendly format. It is composed of nodes, + each of which represents a certain part of the source code. For example, an node represents an if statement in the + script's source code. Because it is a representation of the source code in memory, it is independent of any specific scripting language. + This allows a script in any language for which a parser exists to be run by the interpreter. + + The AST is produced by an object. It consists of a with an arbitrary amount of statements. These statements are + run in order by an object. A statement may in turn run another block (such as an if statement might if its condition is + met). + + Articles: + - +*/ + +/* + Constants: Operator Precedence + var/global/const/OOP_OR - Logical or + var/global/const/OOP_AND - Logical and + var/global/const/OOP_BIT - Bitwise operations + var/global/const/OOP_EQUAL - Equality checks + var/global/const/OOP_COMPARE - Greater than, less then, etc + var/global/const/OOP_ADD - Addition and subtraction + var/global/const/OOP_MULTIPLY - Multiplication and division + var/global/const/OOP_POW - Exponents + var/global/const/OOP_UNARY - Unary Operators + var/global/const/OOP_GROUP - Parentheses +*/ + +var/global/const/OOP_OR = 1 // || +var/global/const/OOP_AND = OOP_OR + 1 // && +var/global/const/OOP_BIT = OOP_AND + 1 // &, | +var/global/const/OOP_EQUAL = OOP_BIT + 1 // ==, != +var/global/const/OOP_COMPARE = OOP_EQUAL + 1 // >, <, >=, <= +var/global/const/OOP_ADD = OOP_COMPARE + 1 // +, - +var/global/const/OOP_MULTIPLY= OOP_ADD + 1 // *, /, % +var/global/const/OOP_POW = OOP_MULTIPLY + 1 // ^ +var/global/const/OOP_UNARY = OOP_POW + 1 // ! +var/global/const/OOP_GROUP = OOP_UNARY + 1 // () + +/* + Class: node +*/ +/node/proc/ToString() + return "[src.type]" +/* + Class: identifier +*/ +/node/identifier + var/id_name + +/node/identifier/New(id) + .=..() + src.id_name=id + +/node/identifier/ToString() + return id_name + +/* + Class: expression +*/ +/node/expression +/* + Class: operator + See and for subtypes. +*/ +/node/expression/c_operator + var/node/expression/exp + var/name + var/precedence + +/node/expression/c_operator/New() + .=..() + if(!src.name) + src.name="[src.type]" + +/node/expression/c_operator/ToString() + return "operator: [name]" + +/* + Class: FunctionCall +*/ +/node/expression/FunctionCall + //Function calls can also be expressions or statements. + var/func_name + var/node/identifier/object + var/list/parameters=new + +/* + Class: literal +*/ +/node/expression/value/literal + var/value + +/node/expression/value/literal/New(val) + .=..() + value = val + +/node/expression/value/literal/ToString() + return value + +/* + Class: variable +*/ +/node/expression/value/variable + var/node/object //Either a node/identifier or another node/expression/value/variable which points to the object + var/node/identifier/id + +/node/expression/value/variable/New(ident) + .=..() + id=ident + if(istext(id)) + id=new(id) + +/node/expression/value/variable/ToString() + return src.id.ToString() + +/* + Class: reference +*/ +/node/expression/value/reference + var/datum/value + +/node/expression/value/reference/New(value) + .=..() + src.value=value + +/node/expression/value/reference/ToString() + return "ref: [src.value] ([src.value.type])" diff --git a/mods/telecomms/code/scripting/AST/Blocks.dm b/mods/telecomms/code/scripting/AST/Blocks.dm new file mode 100644 index 0000000000000..56c9759a08279 --- /dev/null +++ b/mods/telecomms/code/scripting/AST/Blocks.dm @@ -0,0 +1,47 @@ +/* + File: Block Types +*/ +/* + Class: BlockDefinition + An object representing a set of actions to perform independently from the rest of the script. Blocks are basically just + lists of statements to execute which also contain some local variables and methods. Note that since functions are local to a block, + it is possible to have a function definition inside of any type of block (such as in an if statement or another function), + and not just in the global scope as in many languages. +*/ +/node/BlockDefinition + var/list/statements = new + var/list/functions = new + var/list/initial_variables = new + +/* + Proc: SetVar + Defines a permanent variable. The variable will not be deleted when it goes out of scope. + + Notes: + Since all pre-existing temporary variables are deleted, it is not generally desirable to use this proc after the interpreter has been instantiated. + Instead, use . + + See Also: + - +*/ +/node/BlockDefinition/proc/SetVar(name, value) + initial_variables[name]=value + + +/* + Class: GlobalBlock + A block object representing the global scope. +*/ +// +/node/BlockDefinition/GlobalBlock + +/node/BlockDefinition/GlobalBlock/New() + initial_variables["null"]=null + return ..() + +/* + Class: FunctionBlock + A block representing a function body. +*/ +// +/node/BlockDefinition/FunctionBlock diff --git a/mods/telecomms/code/scripting/AST/Operators/Binary Operators.dm b/mods/telecomms/code/scripting/AST/Operators/Binary Operators.dm new file mode 100644 index 0000000000000..f8c677aed3571 --- /dev/null +++ b/mods/telecomms/code/scripting/AST/Operators/Binary Operators.dm @@ -0,0 +1,174 @@ +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 + +/* + File: Binary Operators +*/ +/* + Class: binary + Represents a binary operator in the AST. A binary operator takes two operands (ie x and y) and returns a value. +*/ +/node/expression/c_operator/binary + var/node/expression/exp2 + +////////// Comparison Operators ////////// +/* + Class: Equal + Returns true if x = y. +*/ +// +/node/expression/c_operator/binary/Equal + precedence=OOP_EQUAL + +/* + Class: NotEqual + Returns true if x and y aren't equal. +*/ +// +/node/expression/c_operator/binary/NotEqual + precedence=OOP_EQUAL + +/* + Class: Greater + Returns true if x > y. +*/ +// +/node/expression/c_operator/binary/Greater + precedence=OOP_COMPARE + +/* + Class: Less + Returns true if x < y. +*/ +// +/node/expression/c_operator/binary/Less + precedence=OOP_COMPARE + +/* + Class: GreaterOrEqual + Returns true if x >= y. +*/ +// +/node/expression/c_operator/binary/GreaterOrEqual + precedence=OOP_COMPARE + +/* + Class: LessOrEqual + Returns true if x <= y. +*/ +// +/node/expression/c_operator/binary/LessOrEqual + precedence=OOP_COMPARE + + +////////// Logical Operators ////////// + +/* + Class: LogicalAnd + Returns true if x and y are true. +*/ +// +/node/expression/c_operator/binary/LogicalAnd + precedence=OOP_AND + +/* + Class: LogicalOr + Returns true if x, y, or both are true. +*/ +// +/node/expression/c_operator/binary/LogicalOr + precedence=OOP_OR + +/* + Class: LogicalXor + Returns true if either x or y but not both are true. +*/ +// +/node/expression/c_operator/binary/LogicalXor //Not implemented in nS + precedence=OOP_OR + + +////////// Bitwise Operators ////////// + +/* + Class: BitwiseAnd + Performs a bitwise and operation. + + Example: + 011 & 110 = 010 +*/ +// +/node/expression/c_operator/binary/BitwiseAnd + precedence=OOP_BIT + +/* + Class: BitwiseOr + Performs a bitwise or operation. + + Example: + 011 | 110 = 111 +*/ +// +/node/expression/c_operator/binary/BitwiseOr + precedence=OOP_BIT + +/* + Class: BitwiseXor + Performs a bitwise exclusive or operation. + + Example: + 011 xor 110 = 101 +*/ +// +/node/expression/c_operator/binary/BitwiseXor + precedence=OOP_BIT + + +////////// Arithmetic Operators ////////// + +/* + Class: Add + Returns the sum of x and y. +*/ +// +/node/expression/c_operator/binary/Add + precedence=OOP_ADD + +/* + Class: Subtract + Returns the difference of x and y. +*/ +// +/node/expression/c_operator/binary/Subtract + precedence=OOP_ADD + +/* + Class: Multiply + Returns the product of x and y. +*/ +// +/node/expression/c_operator/binary/Multiply + precedence=OOP_MULTIPLY + +/* + Class: Divide + Returns the quotient of x and y. +*/ +// +/node/expression/c_operator/binary/Divide + precedence=OOP_MULTIPLY + +/* + Class: Power + Returns x raised to the power of y. +*/ +// +/node/expression/c_operator/binary/Power + precedence=OOP_POW + +/* + Class: Modulo + Returns the remainder of x / y. +*/ +// +/node/expression/c_operator/binary/Modulo + precedence=OOP_MULTIPLY diff --git a/mods/telecomms/code/scripting/AST/Operators/Unary Operators.dm b/mods/telecomms/code/scripting/AST/Operators/Unary Operators.dm new file mode 100644 index 0000000000000..c266b5557517e --- /dev/null +++ b/mods/telecomms/code/scripting/AST/Operators/Unary Operators.dm @@ -0,0 +1,51 @@ +/* + File: Unary Operators +*/ +/* + Class: unary + Represents a unary operator in the AST. Unary operators take a single operand (referred to as x below) and return a value. +*/ +/node/expression/c_operator/unary + precedence=OOP_UNARY + +/* + Class: LogicalNot + Returns !x. + + Example: + !true = false and !false = true +*/ +// +/node/expression/c_operator/unary/LogicalNot + name="logical not" + +/* + Class: BitwiseNot + Returns the value of a bitwise not operation performed on x. + + Example: + ~10 (decimal 2) = 01 (decimal 1). +*/ +// +/node/expression/c_operator/unary/BitwiseNot + name="bitwise not" + +/* + Class: Minus + Returns -x. +*/ +// +/node/expression/c_operator/unary/Minus + name="minus" + +/* + Class: group + A special unary operator representing a value in parentheses. +*/ +// +/node/expression/c_operator/unary/group + precedence=OOP_GROUP + +/node/expression/c_operator/unary/New(node/expression/exp) + src.exp=exp + return ..() diff --git a/mods/telecomms/code/scripting/AST/Statements.dm b/mods/telecomms/code/scripting/AST/Statements.dm new file mode 100644 index 0000000000000..042844fbed16b --- /dev/null +++ b/mods/telecomms/code/scripting/AST/Statements.dm @@ -0,0 +1,108 @@ +/* + File: Statement Types +*/ +/* + Class: statement + An object representing a single instruction run by an interpreter. +*/ +/node/statement +/* + Class: FunctionCall + Represents a call to a function. +*/ +// +/node/statement/FunctionCall + var/func_name + var/node/identifier/object + var/list/parameters=new + +/* + Class: FunctionDefinition + Defines a function. +*/ +// +/node/statement/FunctionDefinition + var/func_name + var/list/parameters=new + var/node/BlockDefinition/FunctionBlock/block + +/* + Class: VariableAssignment + Sets a variable in an accessible scope to the given value if one exists, otherwise initializes a new local variable to the given value. + + Notes: + If a variable with the same name exists in a higher block, the value will be assigned to it. If not, + a new variable is created in the current block. To force creation of a new variable, use . + + See Also: + - +*/ +// +/node/statement/VariableAssignment + + var/node/identifier/object + var/node/identifier/var_name + var/node/expression/value + +/* + Class: VariableDeclaration + Intializes a local variable to a null value. + + See Also: + - +*/ +// +/node/statement/VariableDeclaration + + var/node/identifier/object + var/node/identifier/var_name +/* + Class: IfStatement +*/ +// +/node/statement/IfStatement + var/node/BlockDefinition/block + var/node/BlockDefinition/else_block + var/node/expression/cond + +/* + Class: WhileLoop + Loops while a given condition is true. +*/ +// +/node/statement/WhileLoop + + var/node/BlockDefinition/block + var/node/expression/cond + +/* + Class: ForLoop + Loops while test is true, initializing a variable, increasing the variable +*/ +/node/statement/ForLoop + var/node/BlockDefinition/block + var/node/expression/test + var/node/expression/init + var/node/expression/increment + +/* + Class: BreakStatement + Ends a loop. +*/ +// +/node/statement/BreakStatement + +/* + Class: ContinueStatement + Skips to the next iteration of a loop. +*/ +// +/node/statement/ContinueStatement + +/* + Class: ReturnStatement + Ends the function and returns a value. +*/ +// +/node/statement/ReturnStatement + var/node/expression/value diff --git a/mods/telecomms/code/scripting/Errors.dm b/mods/telecomms/code/scripting/Errors.dm new file mode 100644 index 0000000000000..ea82d6aeb2a2f --- /dev/null +++ b/mods/telecomms/code/scripting/Errors.dm @@ -0,0 +1,137 @@ +/* + File: Errors +*/ +/* + Class: scriptError + An error scanning or parsing the source code. +*/ +/scriptError + +/* + Var: message + A message describing the problem. +*/ + var/message +/scriptError/New(msg = null) + if(msg)message = msg + +/scriptError/BadToken + message = "Unexpected token: " + var/token/token + +/scriptError/BadToken/New(token/t) + token = t + if(t?.line) + message = "[t.line]: [message]" + if(t) + message += "[t.value]" + else + message += "[t]" + +/scriptError/InvalidID + parent_type = /scriptError/BadToken + message = "Invalid identifier name: " + +/scriptError/ReservedWord + parent_type = /scriptError/BadToken + message = "Identifer using reserved word: " + +/scriptError/BadNumber + parent_type = /scriptError/BadToken + message = "Bad number: " + +/scriptError/BadReturn + var/token/token + message = "Unexpected return statement outside of a function." + +/scriptError/BadReturn/New(token/t) + src.token = t + +/scriptError/EndOfFile + message = "Unexpected end of file." + +/scriptError/ExpectedToken + message = "Expected: '" + +/scriptError/ExpectedToken/New(id, token/T) + if(T?.line) + message = "[T.line]: [message]" + + message+="[id]'. " + if(T) + message += "Found '[T.value]'." + + +/scriptError/UnterminatedComment + message = "Unterminated multi-line comment statement: expected */" + +/scriptError/DuplicateFunction/New(name, token/t) + message = "Function '[name]' defined twice." + +/* + Class: runtimeError + An error thrown by the interpreter in running the script. +*/ +/runtimeError + var/name +/* + Var: message + A basic description as to what went wrong. +*/ + var/message + var/stack/stack +/* + Proc: ToString + Returns a description of the error suitable for showing to the user. +*/ +/runtimeError/proc/ToString() + . = "[name]: [message]" + if(!stack.Top()) return + . += "\nStack:" + while(stack.Top()) + var/node/statement/FunctionCall/stmt=stack.Pop() + . += "\n\t [stmt.func_name]()" + +/runtimeError/TypeMismatch + name = "TypeMismatchError" +/runtimeError/TypeMismatch/New(op, a, b) + message = "Type mismatch: '[a]' [op] '[b]'" + +/runtimeError/UnexpectedReturn + name = "UnexpectedReturnError" + message = "Unexpected return statement." + +/runtimeError/UnknownInstruction + name = "UnknownInstructionError" + message = "Unknown instruction type. This may be due to incompatible compiler and interpreter versions or a lack of implementation." + +/runtimeError/UndefinedVariable + name = "UndefinedVariableError" +/runtimeError/UndefinedVariable/New(variable) + message = "Variable '[variable]' has not been declared." + +/runtimeError/UndefinedFunction + name = "UndefinedFunctionError" +/runtimeError/UndefinedFunction/New(function) + message = "Function '[function]()' has not been defined." + +/runtimeError/DuplicateVariableDeclaration + name = "DuplicateVariableError" +/runtimeError/DuplicateVariableDeclaration/New(variable) + message = "Variable '[variable]' was already declared." + +/runtimeError/IterationLimitReached + name = "MaxIterationError" + message = "A loop has reached its maximum number of iterations." + +/runtimeError/RecursionLimitReached + name = "MaxRecursionError" + message = "The maximum amount of recursion has been reached." + +/runtimeError/DivisionByZero + name = "DivideByZeroError" + message = "Division by zero attempted." + +/runtimeError/MaxCPU + name = "MaxComputationalUse" + message = "Maximum amount of computational cycles reached (>= 1000)." diff --git a/mods/telecomms/code/scripting/IDE.dm b/mods/telecomms/code/scripting/IDE.dm new file mode 100644 index 0000000000000..6f1dda937e0e5 --- /dev/null +++ b/mods/telecomms/code/scripting/IDE.dm @@ -0,0 +1,211 @@ +/client/verb/tcssave() + set hidden = 1 + if(mob.machine || issilicon(mob)) + if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || issilicon(mob)) + var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine + if(Machine.editingcode != mob) + return + + if(Machine.SelectedServer) + var/obj/machinery/telecomms/server/Server = Machine.SelectedServer + var/tcscode=winget(src, "tcscode", "text") + var/msg="[mob.name] is adding script to server [Server]: [tcscode]" + log_misc(msg) + message_admins("[mob.name] has uploaded a NTLS script to [Machine.SelectedServer] ([mob.x],[mob.y],[mob.z] - JMP)",0,1) + Server.setcode( tcscode ) // this actually saves the code from input to the server + send_output(src, null, "tcserror") // clear the errors + else + send_output(src, null, "tcserror") + send_output(src, "Failed to save: Unable to locate server machine. (Back up your code before exiting the window!)", "tcserror") + else + send_output(src, null, "tcserror") + send_output(src, "Failed to save: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") + else + send_output(src, null, "tcserror") + send_output(src, "Failed to save: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") + + +/client/verb/tcscompile() + set hidden = 1 + if(mob.machine || issilicon(mob)) + if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) )) + var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine + if(Machine.editingcode != mob) + return + + if(Machine.SelectedServer) + var/obj/machinery/telecomms/server/Server = Machine.SelectedServer + Server.setcode( winget(src, "tcscode", "text") ) // save code first + var/list/compileerrors = Server.compile() // then compile the code! + + // Output all the compile-time errors + send_output(src, null, "tcserror") + + if(LAZYLEN(compileerrors)) + send_output(src, "Compile Errors", "tcserror") + for(var/scriptError/e in compileerrors) + send_output(src, "\t>[e.message]", "tcserror") + send_output(src, "([LAZYLEN(compileerrors)] errors)", "tcserror") + + // Output compile errors to all other people viewing the code too + for(var/mob/M in Machine.viewingcode) + if(M.client) + send_output(M, null, "tcserror") + send_output(M, "Compile Errors", "tcserror") + for(var/scriptError/e in compileerrors) + send_output(M, "\t>[e.message]", "tcserror") + send_output(M, "([LAZYLEN(compileerrors)] errors)", "tcserror") + + + else + send_output(src, "TCS compilation successful!", "tcserror") + send_output(src, "(0 errors)", "tcserror") + + for(var/mob/M in Machine.viewingcode) + if(M.client) + send_output(M, "TCS compilation successful!", "tcserror") + send_output(M, "(0 errors)", "tcserror") + + else + send_output(src, null, "tcserror") + send_output(src, "Failed to compile: Unable to locate server machine. (Back up your code before exiting the window!)", "tcserror") + else + send_output(src, null, "tcserror") + send_output(src, "Failed to compile: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") + else + send_output(src, null, "tcserror") + send_output(src, "Failed to compile: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") + +/client/verb/tcsrun() + set hidden = 1 + if(mob.machine || issilicon(mob)) + if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) )) + var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine + if(Machine.editingcode != mob) + return + + if(Machine.SelectedServer) + var/obj/machinery/telecomms/server/Server = Machine.SelectedServer + Server.setcode( winget(src, "tcscode", "text") ) // save code first + var/list/compileerrors = Server.compile() // then compile the code! + + // Output all the compile-time errors + send_output(src, null, "tcserror") + + if(LAZYLEN(compileerrors)) + send_output(src, "Compile Errors", "tcserror") + for(var/scriptError/e in compileerrors) + send_output(src, "\t>[e.message]", "tcserror") + send_output(src, "([LAZYLEN(compileerrors)] errors)", "tcserror") + + // Output compile errors to all other people viewing the code too + for(var/mob/M in Machine.viewingcode) + if(M.client) + send_output(M, null, "tcserror") + send_output(M, "Compile Errors", "tcserror") + for(var/scriptError/e in compileerrors) + send_output(M, "\t>[e.message]", "tcserror") + send_output(M, "([LAZYLEN(compileerrors)] errors)", "tcserror") + + else + // Finally, we run the code! + send_output(src, "TCS compilation successful! Code executed.", "tcserror") + send_output(src, "(0 errors)", "tcserror") + + for(var/mob/M in Machine.viewingcode) + if(M.client) + send_output(M, "TCS compilation successful!", "tcserror") + send_output(M, "(0 errors)", "tcserror") + + var/datum/signal/signal = new() + signal.data["message"] = "" + if(LAZYLEN(Server.freq_listening) > 0) + signal.frequency = Server.freq_listening[1] + else + signal.frequency = PUB_FREQ + signal.data["name"] = "" + signal.data["job"] = "" + signal.data["reject"] = 0 + signal.data["server"] = Server + + Server.Compiler.Run(signal) + + + else + send_output(src, null, "tcserror") + send_output(src, "Failed to run: Unable to locate server machine. (Back up your code before exiting the window!)", "tcserror") + else + send_output(src, null, "tcserror") + send_output(src, "Failed to run: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") + else + send_output(src, null, "tcserror") + send_output(src, "Failed to run: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") + + +/client/verb/exittcs() + set hidden = 1 + if(mob.machine || issilicon(mob)) + if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) )) + var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine + if(Machine.editingcode == mob) + Machine.storedcode = "[winget(mob, "tcscode", "text")]" + Machine.editingcode = null + else + if(mob in Machine.viewingcode) + Machine.viewingcode.Remove(mob) + +/client/verb/tcsrevert() + set hidden = 1 + if(mob.machine || issilicon(mob)) + if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) )) + var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine + if(Machine.editingcode != mob) + return + + if(Machine.SelectedServer) + var/obj/machinery/telecomms/server/Server = Machine.SelectedServer + + // Replace quotation marks with quotation macros for proper winset() compatibility + var/showcode = replacetext(Server.rawcode, "\\\"", "\\\\\"") + showcode = replacetext(showcode, "\"", "\\\"") + + winset(mob, "tcscode", "text=\"[showcode]\"") + + send_output(src, null, "tcserror") // clear the errors + else + send_output(src, null, "tcserror") + send_output(src, "Failed to revert: Unable to locate server machine.", "tcserror") + else + send_output(src, null, "tcserror") + send_output(src, "Failed to revert: Unable to locate machine.", "tcserror") + else + send_output(src, null, "tcserror") + send_output(src, "Failed to revert: Unable to locate machine.", "tcserror") + + +/client/verb/tcsclearmem() + set hidden = 1 + if(mob.machine || issilicon(mob)) + if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) )) + var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine + if(Machine.editingcode != mob) + return + + if(Machine.SelectedServer) + var/obj/machinery/telecomms/server/Server = Machine.SelectedServer + Server.memory = list() // clear the memory + // Show results + send_output(src, null, "tcserror") + send_output(src, "Server memory cleared!", "tcserror") + for(var/mob/M in Machine.viewingcode) + if(M.client) + send_output(M, "Server memory cleared!", "tcserror") + else + send_output(src, null, "tcserror") + send_output(src, "Failed to clear memory: Unable to locate server machine.", "tcserror") + else + send_output(src, null, "tcserror") + send_output(src, "Failed to clear memory: Unable to locate machine.", "tcserror") + else + send_output(src, null, "tcserror") + send_output(src, "Failed to clear memory: Unable to locate machine.", "tcserror") diff --git a/mods/telecomms/code/scripting/Implementations/Telecomms.dm b/mods/telecomms/code/scripting/Implementations/Telecomms.dm new file mode 100644 index 0000000000000..3637cc924d38a --- /dev/null +++ b/mods/telecomms/code/scripting/Implementations/Telecomms.dm @@ -0,0 +1,272 @@ +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 + + +/* --- Traffic Control Scripting Language --- */ + // Nanotrasen TCS Language - Made by Doohl + +/n_Interpreter/TCS_Interpreter + var/datum/TCS_Compiler/Compiler + +/n_Interpreter/TCS_Interpreter/HandleError(runtimeError/e) + Compiler.Holder.add_entry(e.ToString(), "Execution Error") + +/datum/TCS_Compiler + var/n_Interpreter/TCS_Interpreter/interpreter + var/obj/machinery/telecomms/server/Holder // the server that is running the code + var/ready = 1 // 1 if ready to run code + + /* -- Compile a raw block of text -- */ + +/datum/TCS_Compiler/proc/Compile(code as message) + var/n_scriptOptions/nS_Options/options = new() + var/n_Scanner/nS_Scanner/scanner = new(code, options) + var/list/tokens = scanner.Scan() + var/n_Parser/nS_Parser/parser = new(tokens, options) + var/node/BlockDefinition/GlobalBlock/program = parser.Parse() + + var/list/returnerrors = list() + + returnerrors += scanner.errors + returnerrors += parser.errors + + if(LAZYLEN(returnerrors)) + return returnerrors + + interpreter = new(program) + interpreter.persist = 1 + interpreter.Compiler= src + + return returnerrors + + /* -- Execute the compiled code -- */ + +/datum/TCS_Compiler/proc/Run(datum/signal/signal) + + if(!ready) + return + + if(!interpreter) + return + + interpreter.container = src + + interpreter.SetVar("PI" , 3.141592653) // value of pi + interpreter.SetVar("E" , 2.718281828) // value of e + interpreter.SetVar("SQURT2" , 1.414213562) // value of the square root of 2 + interpreter.SetVar("FALSE" , 0) // boolean shortcut to 0 + interpreter.SetVar("TRUE" , 1) // boolean shortcut to 1 + + interpreter.SetVar("NORTH" , NORTH) // NORTH (1) + interpreter.SetVar("SOUTH" , SOUTH) // SOUTH (2) + interpreter.SetVar("EAST" , EAST) // EAST (4) + interpreter.SetVar("WEST" , WEST) // WEST (8) + + // Channel macros + interpreter.SetVar("$common", PUB_FREQ) + interpreter.SetVar("$science", SCI_FREQ) + interpreter.SetVar("$command", COMM_FREQ) + interpreter.SetVar("$medical", MED_FREQ) + interpreter.SetVar("$engineering",ENG_FREQ) + interpreter.SetVar("$security", SEC_FREQ) + interpreter.SetVar("$supply", SUP_FREQ) + interpreter.SetVar("$exploration", EXP_FREQ) + + // Signal data + + interpreter.SetVar("$content", signal.data["message"]) + interpreter.SetVar("$freq" , signal.frequency) + interpreter.SetVar("$source" , signal.data["name"]) + interpreter.SetVar("$job" , signal.data["job"]) + interpreter.SetVar("$sign" , signal) + interpreter.SetVar("$pass" , !(signal.data["reject"])) // if the signal isn't rejected, pass = 1; if the signal IS rejected, pass = 0 + + // Set up the script procs + + /* + -> Send another signal to a server + @format: broadcast(content, frequency, source, job) + + @param content: Message to broadcast + @param frequency: Frequency to broadcast to + @param source: The name of the source you wish to imitate. Must be stored in stored_names list. + @param job: The name of the job. + */ + interpreter.SetProc("broadcast", "tcombroadcast", signal, list("message", "freq", "source", "job")) + + /* + -> Store a value permanently to the server machine (not the actual game hosting machine, the ingame machine) + @format: mem(address, value) + + @param address: The memory address (string index) to store a value to + @param value: The value to store to the memory address + */ + interpreter.SetProc("mem", "mem", signal, list("address", "value")) + + /* + -> Delay code for a given amount of deciseconds + @format: sleep(time) + + @param time: time to sleep in deciseconds (1/10th second) + */ + interpreter.SetProc("sleep", /proc/delay) + + /* + -> Replaces a string with another string + @format: replace(string, substring, replacestring) + + @param string: the string to search for substrings (best used with $content$ constant) + @param substring: the substring to search for + @param replacestring: the string to replace the substring with + + */ + interpreter.SetProc("replace", /proc/string_replacetext) + + /* + -> Locates an element/substring inside of a list or string + @format: find(haystack, needle, start = 1, end = 0) + + @param haystack: the container to search + @param needle: the element to search for + @param start: the position to start in + @param end: the position to end in + + */ + interpreter.SetProc("find", /proc/smartfind) + + /* + -> Finds the length of a string or list + @format: length(container) + + @param container: the list or container to measure + + */ + interpreter.SetProc("length", /proc/smartlength) + + /* -- Clone functions, carried from default BYOND procs --- */ + + // vector namespace + interpreter.SetProc("vector", /proc/n_list) + interpreter.SetProc("at", /proc/n_listpos) + interpreter.SetProc("copy", /proc/n_listcopy) + interpreter.SetProc("push_back", /proc/n_listadd) + interpreter.SetProc("remove", /proc/n_listremove) + interpreter.SetProc("cut", /proc/n_listcut) + interpreter.SetProc("swap", /proc/n_listswap) + interpreter.SetProc("insert", /proc/n_listinsert) + + interpreter.SetProc("pick", /proc/n_pick) + interpreter.SetProc("prob", /proc/prob_chance) + interpreter.SetProc("substr", /proc/docopytext) + + // Donkie~ + // Strings + interpreter.SetProc("lower", /proc/n_lower) + interpreter.SetProc("upper", /proc/n_upper) + interpreter.SetProc("explode", /proc/string_explode) + interpreter.SetProc("repeat", /proc/n_repeat) + interpreter.SetProc("reverse", /proc/n_reverse) + interpreter.SetProc("tonum", /proc/n_str2num) + + // Numbers + interpreter.SetProc("tostring", /proc/n_num2str) + interpreter.SetProc("sqrt", /proc/n_sqrt) + interpreter.SetProc("abs", /proc/n_abs) + interpreter.SetProc("floor", /proc/n_floor) + interpreter.SetProc("ceil", /proc/n_ceil) + interpreter.SetProc("round", /proc/n_round) + interpreter.SetProc("clamp", /proc/n_clamp) + interpreter.SetProc("inrange", /proc/n_inrange) + // End of Donkie~ + + + // Run the compiled code + interpreter.Run() + + // Backwards-apply variables onto signal data + /* sanitize EVERYTHING. fucking players can't be trusted with SHIT */ + + signal.data["message"] = sanitize_html(interpreter.GetVar("$content")) // 512 extra symbols + signal.frequency = interpreter.GetVar("$freq") + + var/setname = "" + var/obj/machinery/telecomms/server/S = signal.data["server"] + if(interpreter.GetVar("$source") in S.stored_names) + setname = interpreter.GetVar("$source") + else + setname = "[interpreter.GetVar("$source")]" + + if(signal.data["name"] != setname) + signal.data["realname"] = setname + signal.data["name"] = setname + signal.data["job"] = interpreter.GetVar("$job") + signal.data["reject"] = !(interpreter.GetVar("$pass")) // set reject to the opposite of $pass + + // If the message is invalid, just don't broadcast it! + if(signal.data["message"] == "" || !signal.data["message"]) + signal.data["reject"] = 1 + +/* -- Actual language proc code -- */ + +/datum/signal/proc/mem(address, value) + if(istext(address)) + var/obj/machinery/telecomms/server/S = data["server"] + + if(!value && value != 0) + return S.memory[address] + + else + S.memory[address] = value + + +/datum/signal/proc/tcombroadcast(message, freq, source, job) + var/datum/signal/newsign = new + var/obj/machinery/telecomms/server/S = data["server"] + var/obj/item/device/radio/hradio = S.server_radio + + if(!hradio) + error("[src] has no radio.") + return + + if((!message || message == "") && message != 0) + message = "*beep*" + if(!source) + source = "[html_encode(uppertext(S.id))]" + hradio = new // sets the hradio as a radio intercom + if(!freq) + freq = PUB_FREQ + if(findtext(num2text(freq), ".")) // if the frequency has been set as a decimal + freq *= 10 // shift the decimal one place + + if(!job) + job = "?" + + message = sanitize_html(message) + + newsign.data["mob"] = null + newsign.data["mobtype"] = /mob/living/carbon/human + if(source in S.stored_names) + newsign.data["name"] = source + else + newsign.data["name"] = "[html_encode(uppertext(source))]" + newsign.data["realname"] = newsign.data["name"] + newsign.data["job"] = job + newsign.data["compression"] = 0 + newsign.data["message"] = message + newsign.data["type"] = 2 // artificial broadcast + if(!isnum(freq)) + 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() + + var/pass = S.relay_information(newsign, /obj/machinery/telecomms/hub) + if(!pass) + S.relay_information(newsign, /obj/machinery/telecomms/broadcaster) // send this simple message to broadcasters diff --git a/mods/telecomms/code/scripting/Implementations/_Logic.dm b/mods/telecomms/code/scripting/Implementations/_Logic.dm new file mode 100644 index 0000000000000..41770f953165f --- /dev/null +++ b/mods/telecomms/code/scripting/Implementations/_Logic.dm @@ -0,0 +1,294 @@ +// Script -> BYOND code procs +#define SCRIPT_MAX_REPLACEMENTS_ALLOWED 200 +// --- List operations (lists known as vectors in n_script) --- + +// Clone of list() +/proc/n_list() + var/list/returnlist = list() + for(var/e in args) + returnlist.Add(e) + return returnlist + +// Clone of pick() +/proc/n_pick() + var/list/finalpick = list() + for(var/e in args) + if(isobject(e)) + if(istype(e, /list)) + var/list/sublist = e + for(var/sube in sublist) + finalpick.Add(sube) + continue + finalpick.Add(e) + + return pick(finalpick) + +// Clone of list[] +/proc/n_listpos(list/L, pos, value) + if(!istype(L, /list)) return + if(isnum(pos)) + if(!value) + if(LAZYLEN(L) >= pos) + return L[pos] + else + if(LAZYLEN(L) >= pos) + L[pos] = value + else if(istext(pos)) + if(!value) + return L[pos] + else + L[pos] = value + +// Clone of list.Copy() +/proc/n_listcopy(list/L, start, end) + if(!istype(L, /list)) return + return L.Copy(start, end) + +// Clone of list.Add() +/proc/n_listadd() + var/list/chosenlist + var/i = 1 + for(var/e in args) + if(i == 1) + if(isobject(e)) + if(istype(e, /list)) + chosenlist = e + i = 2 + else + if(chosenlist) + chosenlist.Add(e) + +// Clone of list.Remove() +/proc/n_listremove() + var/list/chosenlist + var/i = 1 + for(var/e in args) + if(i == 1) + if(isobject(e)) + if(istype(e, /list)) + chosenlist = e + i = 2 + else + if(chosenlist) + chosenlist.Remove(e) + +// Clone of list.Cut() +/proc/n_listcut(list/L, start, end) + if(!istype(L, /list)) return + return L.Cut(start, end) + +// Clone of list.Swap() +/proc/n_listswap(list/L, firstindex, secondindex) + if(!istype(L, /list)) return + if(LAZYLEN(L) >= secondindex && LAZYLEN(L) >= firstindex) + return L.Swap(firstindex, secondindex) + +// Clone of list.Insert() +/proc/n_listinsert(list/L, index, element) + if(!istype(L, /list)) return + return L.Insert(index, element) + +// --- Miscellaneous functions --- + +// Clone of sleep() +/proc/delay(time) + sleep(time) + +// Clone of prob() +/proc/prob_chance(chance) + return prob(chance) + +// Merge of list_find() and findtext() +/proc/smartfind(haystack, needle, start = 1, end = 0) + if(haystack && needle) + if(isobject(haystack)) + if(istype(haystack, /list)) + if(length(haystack) >= end && start > 0) + var/list/listhaystack = haystack + return list_find(listhaystack, needle, start, end) + + else + if(istext(haystack)) + if(length(haystack) >= end && start > 0) + return findtext_char(haystack, needle, start, end) + +// Clone of copytext() +/proc/docopytext(string, start = 1, end = 0) + if(istext(string) && isnum(start) && isnum(end)) + if(start > 0) + return copytext(string, start, end) + +// Clone of length() +/proc/smartlength(container) + if(container) + if(istype(container, /list)) + return length(container) + else + if(istext(container)) + return length_char(container) + +// BY DONKIE~ +// String stuff +/proc/n_lower(string) + if(istext(string)) + return lowertext(string) + +/proc/n_upper(string) + if(istext(string)) + return uppertext(string) + +/* +//Makes a list where all indicies in a string is a seperate index in the list +// JUST A HELPER DON'T ADD TO NTSCRIPT +/proc/string_tolist(string) + var/list/L = list() + + var/i + for(i=1, i<=length(string), i++) + L.Add(copytext(string, i, i)) + + return L + +/proc/string_explode(string, separator) + if(istext(string)) + if(istext(separator) && separator == "") + return string_tolist(string) + var/i + var/lasti = 1 + var/list/L = list() + + for(i=1, i<=length(string)+1, i++) + if(copytext(string, i, i+1) == separator) // We found a separator + L.Add(copytext(string, lasti, i)) + lasti = i+1 + + L.Add(copytext(string, lasti, length(string)+1)) // Adds the last segment + + return L + +Just found out there was already a string explode function, did some benchmarking, and that function were a bit faster, sticking to that. +*/ +/proc/string_explode(string, separator) + if(istext(string) && istext(separator)) + return splittext(string, separator) + +/proc/n_repeat(string, amount) + if(istext(string) && isnum(amount)) + var/i + var/newstring = "" + if(length(newstring)*amount >=1000) + return + for(i=0, i<=amount, i++) + if(i>=1000) + break + newstring = newstring + string + + return newstring + +/proc/n_reverse(string) + if(istext(string)) + var/newstring = "" + var/i + for(i=length(string), i>0, i--) + if(i>=1000) + break + newstring = newstring + copytext(string, i, i+1) + + return newstring + +// I don't know if it's neccesary to make my own proc, but I think I have to to be able to check for istext. +/proc/n_str2num(string) + if(istext(string)) + return text2num(string) + +// Number shit +/proc/n_num2str(num) + if(isnum(num)) + return num2text(num) + +// Squareroot +/proc/n_sqrt(num) + if(isnum(num)) + return sqrt(num) + +// Magnitude of num +/proc/n_abs(num) + if(isnum(num)) + return abs(num) + +// Round down +/proc/n_floor(num) + if(isnum(num)) + return round(num) + +// Round up +/proc/n_ceil(num) + if(isnum(num)) + return round(num)+1 + +// Round to nearest integer +/proc/n_round(num) + if(isnum(num)) + if(num-round(num)<0.5) + return round(num) + return n_ceil(num) + +// Clamps N between min and max +/proc/n_clamp(num, min=-1, max=1) + if(isnum(num)&&isnum(min)&&isnum(max)) + if(num<=min) + return min + if(num>=max) + return max + return num + +// Returns 1 if N is inbetween Min and Max +/proc/n_inrange(num, min=-1, max=1) + if(isnum(num)&&isnum(min)&&isnum(max)) + return ((min <= num) && (num <= max)) +// END OF BY DONKIE :( + +// Non-recursive +// Imported from Mono string.ReplaceUnchecked +/proc/string_replacetext(haystack, a, b) + if(istext(haystack)&&istext(a)&&istext(b)) + var/i = 1 + var/lenh=length_char(haystack) + var/lena=length_char(a) + //var/lenb=length(b) + var/count = 0 + var/list/dat = list() + while (i < lenh) + var/found = findtext_char(haystack, a, i, 0) + //log_misc("findtext([haystack], [a], [i], 0)=[found]") + if (found == 0) // Not found + break + else + if (count < SCRIPT_MAX_REPLACEMENTS_ALLOWED) + dat+=found + count+=1 + else + //log_misc("Script found [a] [count] times, aborted") + break + //log_misc("Found [a] at [found]! Moving up...") + i = found + lena + if (count == 0) + return haystack + //var/nlen = lenh + ((lenb - lena) * count) + var/buf = copytext_char(haystack,1,dat[1]) // Prefill + var/lastReadPos = 0 + for (i = 1, i <= count, i++) + var/precopy = dat[i] - lastReadPos-1 + //internal static unsafe void CharCopy (String target, int targetIndex, String source, int sourceIndex, int count) + //fixed (char* dest = target, src = source) + //CharCopy (dest + targetIndex, src + sourceIndex, count); + //CharCopy (dest + curPos, source + lastReadPos, precopy); + buf+=copytext_char(haystack,lastReadPos,precopy) + log_misc("buf+=copytext([haystack],[lastReadPos],[precopy])") + log_misc("[buf]") + lastReadPos = dat[i] + lena + //CharCopy (dest + curPos, replace, newValue.length); + buf+=b + log_misc("[buf]") + buf+=copytext_char(haystack,lastReadPos, 0) + return buf diff --git a/mods/telecomms/code/scripting/Interpreter/Evaluation.dm b/mods/telecomms/code/scripting/Interpreter/Evaluation.dm new file mode 100644 index 0000000000000..39b004669c1dd --- /dev/null +++ b/mods/telecomms/code/scripting/Interpreter/Evaluation.dm @@ -0,0 +1,207 @@ +/proc/isobject(x) + return (istype(x, /datum) || istype(x, /list) || istype(x, /savefile) || istype(x, /client) || (x==world)) + +/n_Interpreter/proc/Eval(node/expression/exp) + if(istype(exp, /node/expression/FunctionCall)) + return RunFunction(exp) + else if(istype(exp, /node/expression/c_operator)) + return EvalOperator(exp) + else if(istype(exp, /node/expression/value/literal)) + var/node/expression/value/literal/lit=exp + return lit.value + else if(istype(exp, /node/expression/value/reference)) + var/node/expression/value/reference/ref=exp + return ref.value + else if(istype(exp, /node/expression/value/variable)) + var/node/expression/value/variable/v=exp + if(!v.object) + return Eval(GetVariable(v.id.id_name)) + else + var/datum/D + if(istype(v.object, /node/identifier)) + D=GetVariable(v.object:id_name) + else + D=v.object + D=Eval(D) + if(!isobject(D)) + return null + if(!list_find(D.vars, v.id.id_name)) + RaiseError(new/runtimeError/UndefinedVariable("[v.object.ToString()].[v.id.id_name]")) + return null + return Eval(D.vars[v.id.id_name]) + else if(istype(exp, /node/expression)) + RaiseError(new/runtimeError/UnknownInstruction()) + else + return exp + +/n_Interpreter/proc/EvalOperator(node/expression/c_operator/exp) + if(istype(exp, /node/expression/c_operator/binary)) + var/node/expression/c_operator/binary/bin=exp + switch(bin.type) + if(/node/expression/c_operator/binary/Equal) + return Equal(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/c_operator/binary/NotEqual) + return NotEqual(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/c_operator/binary/Greater) + return Greater(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/c_operator/binary/Less) + return Less(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/c_operator/binary/GreaterOrEqual) + return GreaterOrEqual(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/c_operator/binary/LessOrEqual) + return LessOrEqual(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/c_operator/binary/LogicalAnd) + return LogicalAnd(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/c_operator/binary/LogicalOr) + return LogicalOr(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/c_operator/binary/LogicalXor) + return LogicalXor(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/c_operator/binary/BitwiseAnd) + return BitwiseAnd(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/c_operator/binary/BitwiseOr) + return BitwiseOr(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/c_operator/binary/BitwiseXor) + return BitwiseXor(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/c_operator/binary/Add) + return Add(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/c_operator/binary/Subtract) + return Subtract(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/c_operator/binary/Multiply) + return Multiply(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/c_operator/binary/Divide) + return Divide(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/c_operator/binary/Power) + return Power(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/c_operator/binary/Modulo) + return Modulo(Eval(bin.exp), Eval(bin.exp2)) + else + RaiseError(new/runtimeError/UnknownInstruction()) + else + switch(exp.type) + if(/node/expression/c_operator/unary/Minus) + return Minus(Eval(exp.exp)) + if(/node/expression/c_operator/unary/LogicalNot) + return LogicalNot(Eval(exp.exp)) + if(/node/expression/c_operator/unary/BitwiseNot) + return BitwiseNot(Eval(exp.exp)) + if(/node/expression/c_operator/unary/group) + return Eval(exp.exp) + else + RaiseError(new/runtimeError/UnknownInstruction()) + + +//Binary// +//Comparison operators + +/n_Interpreter/proc/Equal(a, b) + return a==b + +/n_Interpreter/proc/NotEqual(a, b) + return a!=b //LogicalNot(Equal(a, b)) + +/n_Interpreter/proc/Greater(a, b) + return a>b + +/n_Interpreter/proc/Less(a, b) + return a=b + +/n_Interpreter/proc/LessOrEqual(a, b) + return a<=b + +//Logical Operators + +/n_Interpreter/proc/LogicalAnd(a, b) + return a&&b + +/n_Interpreter/proc/LogicalOr(a, b) + return a||b + +/n_Interpreter/proc/LogicalXor(a, b) + return (a||b) && !(a&&b) + + //Bitwise Operators +/n_Interpreter/proc/BitwiseAnd(a, b) + return a&b + +/n_Interpreter/proc/BitwiseOr(a, b) + return a|b + +/n_Interpreter/proc/BitwiseXor(a, b) + return a^b + +//Arithmetic Operators + +/n_Interpreter/proc/Add(a, b) + if(istext(a)&&!istext(b)) + b="[b]" + else if(istext(b)&&!istext(a)) + a="[a]" + if(isobject(a) && !isobject(b)) + RaiseError(new/runtimeError/TypeMismatch("+", a, b)) + return null + else if(isobject(b) && !isobject(a)) + RaiseError(new/runtimeError/TypeMismatch("+", a, b)) + return null + return a+b + +/n_Interpreter/proc/Subtract(a, b) + if(isobject(a) && !isobject(b)) + RaiseError(new/runtimeError/TypeMismatch("-", a, b)) + return null + else if(isobject(b) && !isobject(a)) + RaiseError(new/runtimeError/TypeMismatch("-", a, b)) + return null + return a-b + +/n_Interpreter/proc/Divide(a, b) + if(isobject(a) && !isobject(b)) + RaiseError(new/runtimeError/TypeMismatch("/", a, b)) + return null + else if(isobject(b) && !isobject(a)) + RaiseError(new/runtimeError/TypeMismatch("/", a, b)) + return null + if(b==0) + RaiseError(new/runtimeError/DivisionByZero()) + return null + return a/b + +/n_Interpreter/proc/Multiply(a, b) + if(isobject(a) && !isobject(b)) + RaiseError(new/runtimeError/TypeMismatch("*", a, b)) + return null + else if(isobject(b) && !isobject(a)) + RaiseError(new/runtimeError/TypeMismatch("*", a, b)) + return null + return a*b + +/n_Interpreter/proc/Modulo(a, b) + if(isobject(a) && !isobject(b)) + RaiseError(new/runtimeError/TypeMismatch("%", a, b)) + return null + else if(isobject(b) && !isobject(a)) + RaiseError(new/runtimeError/TypeMismatch("%", a, b)) + return null + return a%b + +/n_Interpreter/proc/Power(a, b) + if(isobject(a) && !isobject(b)) + RaiseError(new/runtimeError/TypeMismatch("**", a, b)) + return null + else if(isobject(b) && !isobject(a)) + RaiseError(new/runtimeError/TypeMismatch("**", a, b)) + return null + return a**b + +//Unary// + +/n_Interpreter/proc/Minus(a) + return -a + +/n_Interpreter/proc/LogicalNot(a) + return !a + +/n_Interpreter/proc/BitwiseNot(a) + return ~a diff --git a/mods/telecomms/code/scripting/Interpreter/Interaction.dm b/mods/telecomms/code/scripting/Interpreter/Interaction.dm new file mode 100644 index 0000000000000..e052ebbba22f1 --- /dev/null +++ b/mods/telecomms/code/scripting/Interpreter/Interaction.dm @@ -0,0 +1,139 @@ +/* + File: Interpreter (Public) + Contains methods for interacting with the interpreter. +*/ +/* + Class: n_Interpreter + Procedures allowing for interaction with the script that is being run by the interpreter object. +*/ + +/* + Proc: Load + Loads a 'compiled' script into memory. + + Parameters: + program - A object which represents the script's global scope. +*/ +/n_Interpreter/proc/Load(node/BlockDefinition/GlobalBlock/program) + ASSERT(program) + src.program = program + CreateGlobalScope() + +/* + Proc: Run + Runs the script. +*/ +/n_Interpreter/proc/Run() + cur_recursion = 0 // reset recursion + cur_statements = 0 // reset CPU tracking + alertadmins = 0 + + ASSERT(src.program) + RunBlock(src.program) + +/* + Proc: SetVar + Defines a global variable for the duration of the next execution of a script. + + Notes: + This differs from in that variables set using this procedure only last for the session, + while those defined from the block object persist if it is ran multiple times. + + See Also: + - +*/ +/n_Interpreter/proc/SetVar(name, value) + if(!istext(name)) + //CRASH("Invalid variable name") + return + AssignVariable(name, value) + +/* + Proc: SetProc + Defines a procedure to be available to the script. + + Parameters: + name - The name of the procedure as exposed to the script. + path - The typepath of a proc to be called when the function call is read by the interpreter, or, if object is specified, a string representing the procedure's name. + object - (Optional) An object which will the be target of a function call. + params - Only required if object is not null, a list of the names of parameters the proc takes. +*/ +/n_Interpreter/proc/SetProc(name, path, object=null, list/params=null) + if(!istext(name)) + //CRASH("Invalid function name") + return + if(!object) + globalScope.functions[name] = path + else + var/node/statement/FunctionDefinition/S = new() + S.func_name = name + S.parameters = params + S.block = new() + S.block.SetVar("src", object) + var/node/expression/FunctionCall/C = new() + C.func_name = path + C.object = new("src") + for(var/p in params) + C.parameters += new/node/expression/value/variable(p) + var/node/statement/ReturnStatement/R=new() + R.value=C + S.block.statements += R + globalScope.functions[name] = S +/* + Proc: VarExists + Checks whether a global variable with the specified name exists. +*/ +/n_Interpreter/proc/VarExists(name) + return list_find(globalScope.variables, name) //convert to 1/0 first? + +/* + Proc: ProcExists + Checks whether a global function with the specified name exists. +*/ +/n_Interpreter/proc/ProcExists(name) + return list_find(globalScope.functions, name) + +/* + Proc: GetVar + Returns the value of a global variable in the script. Remember to ensure that the variable exists before calling this procedure. + + See Also: + - +*/ +/n_Interpreter/proc/GetVar(name) + if(!VarExists(name)) + //CRASH("No variable named '[name]'.") + return + var/x = globalScope.variables[name] + return Eval(x) + +/* + Proc: CallProc + Calls a global function defined in the script and, amazingly enough, returns its return value. Remember to ensure that the function + exists before calling this procedure. + + See Also: + - +*/ +/n_Interpreter/proc/CallProc(name, params[]=null) + if(!ProcExists(name)) + //CRASH("No function named '[name]'.") + return + var/node/statement/FunctionDefinition/func = globalScope.functions[name] + if(istype(func)) + var/node/statement/FunctionCall/stmt = new + stmt.func_name = func.func_name + stmt.parameters = params + return RunFunction(stmt) + else + return call(func)(arglist(params)) + //CRASH("Unknown function type '[name]'.") + +/* + Event: HandleError + Called when the interpreter throws a runtime error. + + See Also: + - +*/ +/n_Interpreter/proc/HandleError(runtimeError/e) diff --git a/mods/telecomms/code/scripting/Interpreter/Interpreter.dm b/mods/telecomms/code/scripting/Interpreter/Interpreter.dm new file mode 100644 index 0000000000000..d1e69213e90a3 --- /dev/null +++ b/mods/telecomms/code/scripting/Interpreter/Interpreter.dm @@ -0,0 +1,315 @@ +/* + File: Interpreter (Internal) +*/ +/* + Class: n_Interpreter +*/ +/* + Macros: Status Macros + RETURNING - Indicates that the current function is returning a value. + BREAKING - Indicates that the current loop is being terminated. + CONTINUING - Indicates that the rest of the current iteration of a loop is being skipped. +*/ +#define RETURNING 1 +#define BREAKING 2 +#define CONTINUING 4 + +/n_Interpreter + var/scope/curScope + var/scope/globalScope + var/node/BlockDefinition/program + var/node/statement/FunctionDefinition/curFunction + var/stack/scopes = new() + var/stack/functions = new() + var/datum/container // associated container for interpeter +/* + Var: status + A variable indicating that the rest of the current block should be skipped. This may be set to any combination of . +*/ + var/status=0 + var/returnVal + + var/max_statements=1000 // maximum amount of statements that can be called in one execution. this is to prevent massive crashes and exploitation + var/cur_statements=0 // current amount of statements called + var/alertadmins=0 // set to 1 if the admins shouldn't be notified of anymore issues + var/max_iterations=100 // max number of uninterrupted loops possible + var/max_recursion=50 // max recursions without returning anything (or completing the code block) + var/cur_recursion=0 // current amount of recursion +/* + Var: persist + If 0, global variables will be reset after Run() finishes. +*/ + var/persist=1 + var/paused=0 + +/* + Constructor: New + Calls with the given parameters. +*/ +/n_Interpreter/New(node/BlockDefinition/GlobalBlock/program=null) + .=..() + if(program)Load(program) + + +/* + Proc: RaiseError + Raises a runtime error. +*/ +/n_Interpreter/proc/RaiseError(runtimeError/e) + e.stack=functions.Copy() + e.stack.Push(curFunction) + src.HandleError(e) + +/n_Interpreter/proc/CreateScope(node/BlockDefinition/B) + var/scope/S = new(B, curScope) + scopes.Push(curScope) + curScope = S + return S + +/n_Interpreter/proc/CreateGlobalScope() + scopes.Clear() + var/scope/S = new(program, null) + globalScope = S + return S + +/* + Proc: RunBlock + Runs each statement in a block of code. +*/ +/n_Interpreter/proc/RunBlock(node/BlockDefinition/Block, scope/scope = null) + var/is_global = istype(Block, /node/BlockDefinition/GlobalBlock) + if(!is_global) + if(scope) + curScope = scope + else + CreateScope(Block) + else + if(!persist) + CreateGlobalScope() + curScope = globalScope + + if(cur_statements < max_statements) + + for(var/node/statement/S in Block.statements) + while(paused) sleep(10) + + cur_statements++ + if(cur_statements >= max_statements) + RaiseError(new/runtimeError/MaxCPU()) + + if(container && !alertadmins) + if(istype(container, /datum/TCS_Compiler)) + var/datum/TCS_Compiler/Compiler = container + var/obj/machinery/telecomms/server/Holder = Compiler.Holder + var/message = "Potential crash-inducing NTSL script detected at telecommunications server [Compiler.Holder] ([Holder.x], [Holder.y], [Holder.z])." + + alertadmins = 1 + message_admins(message, 1) + break + + if(istype(S, /node/statement/VariableAssignment)) + var/node/statement/VariableAssignment/stmt = S + var/name = stmt.var_name.id_name + if(!stmt.object) + // Below we assign the variable first to null if it doesn't already exist. + // This is necessary for assignments like +=, and when the variable is used in a function + // If the variable already exists in a different block, then AssignVariable will automatically use that one. + if(!IsVariableAccessible(name)) + AssignVariable(name, null) + AssignVariable(name, Eval(stmt.value)) + else + var/datum/D = Eval(GetVariable(stmt.object.id_name)) + if(!D) return + D.vars[stmt.var_name.id_name] = Eval(stmt.value) + else if(istype(S, /node/statement/VariableDeclaration)) + //VariableDeclaration nodes are used to forcibly declare a local variable so that one in a higher scope isn't used by default. + var/node/statement/VariableDeclaration/dec=S + if(!dec.object) + AssignVariable(dec.var_name.id_name, null, curScope) + else + var/datum/D = Eval(GetVariable(dec.object.id_name)) + if(!D) return + D.vars[dec.var_name.id_name] = null + else if(istype(S, /node/statement/FunctionCall)) + RunFunction(S) + else if(istype(S, /node/statement/FunctionDefinition)) + //do nothing + else if(istype(S, /node/statement/WhileLoop)) + RunWhile(S) + else if(istype(S, /node/statement/IfStatement)) + RunIf(S) + else if(istype(S, /node/statement/ReturnStatement)) + if(!curFunction) + RaiseError(new/runtimeError/UnexpectedReturn()) + continue + status |= RETURNING + returnVal=Eval(S:value) + break + else if(istype(S, /node/statement/BreakStatement)) + status |= BREAKING + break + else if(istype(S, /node/statement/ContinueStatement)) + status |= CONTINUING + break + else + RaiseError(new/runtimeError/UnknownInstruction()) + if(status) + break + + curScope = scopes.Pop() + +/* + Proc: RunFunction + Runs a function block or a proc with the arguments specified in the script. +*/ +/n_Interpreter/proc/RunFunction(node/statement/FunctionCall/stmt) + //Note that anywhere /node/statement/FunctionCall/stmt is used so may /node/expression/FunctionCall + + // If recursion gets too high (max 50 nested functions) throw an error + if(cur_recursion >= max_recursion) + RaiseError(new/runtimeError/RecursionLimitReached()) + return 0 + + var/node/statement/FunctionDefinition/def + if(!stmt.object) //A scope's function is being called, stmt.object is null + def = GetFunction(stmt.func_name) + else if(istype(stmt.object)) //A method of an object exposed as a variable is being called, stmt.object is a /node/identifier + var/O = GetVariable(stmt.object.id_name) //Gets a reference to the object which is the target of the function call. + if(!O) return //Error already thrown in GetVariable() + def = Eval(O) + + if(!def) return + + cur_recursion++ // add recursion + if(istype(def)) + if(curFunction) functions.Push(curFunction) + var/scope/S = CreateScope(def.block) + for(var/i=1 to LAZYLEN(def.parameters)) + var/val + if(LAZYLEN(stmt.parameters)>=i) + val = stmt.parameters[i] + //else + // unspecified param + AssignVariable(def.parameters[i], new/node/expression/value/literal(Eval(val)), S) + curFunction=stmt + RunBlock(def.block, S) + //Handle return value + . = returnVal + status &= ~RETURNING + returnVal=null + curFunction=functions.Pop() + cur_recursion-- + else + cur_recursion-- + var/list/params=new + for(var/node/expression/P in stmt.parameters) + params+=list(Eval(P)) + if(isobject(def)) //def is an object which is the target of a function call + if( !hascall(def, stmt.func_name) ) + RaiseError(new/runtimeError/UndefinedFunction("[stmt.object.id_name].[stmt.func_name]")) + return + return call(def, stmt.func_name)(arglist(params)) + else //def is a path to a global proc + return call(def)(arglist(params)) + //else + // RaiseError(new/runtimeError/UnknownInstruction()) + +/* + Proc: RunIf + Checks a condition and runs either the if block or else block. +*/ +/n_Interpreter/proc/RunIf(node/statement/IfStatement/stmt) + if(Eval(stmt.cond)) + RunBlock(stmt.block) + else if(stmt.else_block) + RunBlock(stmt.else_block) + +/* + Proc: RunWhile + Runs a while loop. +*/ +/n_Interpreter/proc/RunWhile(node/statement/WhileLoop/stmt) + var/i=1 + while(Eval(stmt.cond) && Iterate(stmt.block, i++)) + continue + status &= ~BREAKING + +/* + Proc:Iterate + Runs a single iteration of a loop. Returns a value indicating whether or not to continue looping. +*/ +/n_Interpreter/proc/Iterate(node/BlockDefinition/block, count) + RunBlock(block) + if(max_iterations > 0 && count >= max_iterations) + RaiseError(new/runtimeError/IterationLimitReached()) + return 0 + if(status & (BREAKING|RETURNING)) + return 0 + status &= ~CONTINUING + return 1 + +/* + Proc: GetFunction + Finds a function in an accessible scope with the given name. Returns a . +*/ +/n_Interpreter/proc/GetFunction(name) + var/scope/S = curScope + while(S) + if(list_find(S.functions, name)) + return S.functions[name] + S = S.parent + RaiseError(new/runtimeError/UndefinedFunction(name)) + +/* + Proc: GetVariable + Finds a variable in an accessible scope and returns its value. +*/ +/n_Interpreter/proc/GetVariable(name) + var/scope/S = curScope + while(S) + if(list_find(S.variables, name)) + return S.variables[name] + S = S.parent + RaiseError(new/runtimeError/UndefinedVariable(name)) + +/n_Interpreter/proc/GetVariableScope(name) //needed for when you reassign a variable in a higher scope + var/scope/S = curScope + while(S) + if(list_find(S.variables, name)) + return S + S = S.parent + + +/n_Interpreter/proc/IsVariableAccessible(name) + var/scope/S = curScope + while(S) + if(list_find(S.variables, name)) + return TRUE + S = S.parent + return FALSE + + +/* + Proc: AssignVariable + Assigns a value to a variable in a specific block. + + Parameters: + name - The name of the variable to assign. + value - The value to assign to it. + S - The scope the variable resides in. If it is null, a scope with the variable already existing is found. If no scopes have a variable of the given name, the current scope is used. +*/ +/n_Interpreter/proc/AssignVariable(name, node/expression/value, scope/S=null) + if(!S) + S = GetVariableScope(name) + if(!S) + S = curScope + if(!S) + S = globalScope + ASSERT(istype(S)) + if(istext(value) || isnum(value) || isnull(value)) + value = new/node/expression/value/literal(value) + else if(!istype(value) && isobject(value)) + value = new/node/expression/value/reference(value) + //TODO: check for invalid name + S.variables["[name]"] = value + diff --git a/mods/telecomms/code/scripting/Interpreter/Scope.dm b/mods/telecomms/code/scripting/Interpreter/Scope.dm new file mode 100644 index 0000000000000..9a0409dbf40b8 --- /dev/null +++ b/mods/telecomms/code/scripting/Interpreter/Scope.dm @@ -0,0 +1,16 @@ +/* + Class: scope + A runtime instance of a block. Used internally by the interpreter. +*/ +/scope + var/scope/parent = null + var/node/BlockDefinition/block + var/list/functions + var/list/variables + +/scope/New(node/BlockDefinition/B, scope/parent) + src.block = B + src.parent = parent + src.variables = B.initial_variables.Copy() + src.functions = B.functions.Copy() + .=..() diff --git a/mods/telecomms/code/scripting/Options.dm b/mods/telecomms/code/scripting/Options.dm new file mode 100644 index 0000000000000..c81a0280d177d --- /dev/null +++ b/mods/telecomms/code/scripting/Options.dm @@ -0,0 +1,79 @@ +/* +File: Options +*/ + //Ascii values of characters +var/global/const/ascii_A = 65 +var/global/const/ascii_Z = 90 +var/global/const/ascii_a = 97 +var/global/const/ascii_z = 122 +var/global/const/ascii_DOLLAR = 36 +var/global/const/ascii_ZERO = 48 +var/global/const/ascii_THALER = 254 +var/global/const/ascii_NINE = 57 +var/global/const/ascii_UNDERSCORE = 95 + +/* + Class: n_scriptOptions +*/ +/n_scriptOptions/proc/CanStartID(char) //returns true if the character can start a variable, function, or keyword name (by default letters or an underscore) + if(!isnum(char))char=text2ascii(char) + return (char in ascii_A to ascii_Z) || (char in ascii_a to ascii_z) || char==ascii_UNDERSCORE || char==ascii_DOLLAR + +/n_scriptOptions/proc/IsValidIDChar(char) //returns true if the character can be in the body of a variable, function, or keyword name (by default letters, numbers, and underscore) + if(!isnum(char))char=text2ascii(char) + return CanStartID(char) || IsDigit(char) + +/n_scriptOptions/proc/IsDigit(char) + if(!isnum(char))char=text2ascii(char) + return char in ascii_ZERO to ascii_NINE + +/n_scriptOptions/proc/IsValidID(id) //returns true if all the characters in the string are okay to be in an identifier name + if(!CanStartID(id)) //don't need to grab first char in id, since text2ascii does it automatically + return 0 + if(length(id)==1) return 1 + for(var/i=2 to length(id)) + if(!IsValidIDChar(copytext(id, i, i+1))) + return 0 + return 1 + +/* + Class: nS_Options + An implementation of for the n_Script language. +*/ +/n_scriptOptions/nS_Options + var/list/symbols = list("(", ")", "\[", "]", ";", ",", "{", "}") //scanner - Characters that can be in symbols +/* + Var: keywords + An associative list used by the parser to parse keywords. Indices are strings which will trigger the keyword when parsed and the + associated values are types of which the proc will be called. +*/ + var/list/keywords = list( "if" = /n_Keyword/nS_Keyword/kwIf, "else" = /n_Keyword/nS_Keyword/kwElse, \ + "while" = /n_Keyword/nS_Keyword/kwWhile, "break" = /n_Keyword/nS_Keyword/kwBreak, \ + "continue" = /n_Keyword/nS_Keyword/kwContinue, "return" = /n_Keyword/nS_Keyword/kwReturn,\ + "def" = /n_Keyword/nS_Keyword/kwDef + ) + + var/list/assign_operators = list( "=" = null, "&=" = "&", + "|=" = "|","`=" = "`", + "+=" = "+","-=" = "-", + "*=" = "*","/=" = "/", + "^=" = "^", + "%=" = "%") + + var/list/unary_operators = list("!" = /node/expression/c_operator/unary/LogicalNot, "~" = /node/expression/c_operator/unary/BitwiseNot, + "-" = /node/expression/c_operator/unary/Minus) + + var/list/binary_operators = list("==" = /node/expression/c_operator/binary/Equal, "!=" = /node/expression/c_operator/binary/NotEqual, + ">" = /node/expression/c_operator/binary/Greater, "<" = /node/expression/c_operator/binary/Less, + ">=" = /node/expression/c_operator/binary/GreaterOrEqual,"<=" = /node/expression/c_operator/binary/LessOrEqual, + "&&" = /node/expression/c_operator/binary/LogicalAnd, "||" = /node/expression/c_operator/binary/LogicalOr, + "&" = /node/expression/c_operator/binary/BitwiseAnd, "|" = /node/expression/c_operator/binary/BitwiseOr, + "`" = /node/expression/c_operator/binary/BitwiseXor, "+" = /node/expression/c_operator/binary/Add, + "-" = /node/expression/c_operator/binary/Subtract, "*" = /node/expression/c_operator/binary/Multiply, + "/" = /node/expression/c_operator/binary/Divide, "^" = /node/expression/c_operator/binary/Power, + "%" = /node/expression/c_operator/binary/Modulo) + +/n_scriptOptions/nS_Options/New() + .=..() + for(var/O in assign_operators+binary_operators+unary_operators) + if(!list_find(symbols, O)) symbols+=O diff --git a/mods/telecomms/code/scripting/Parser/Expressions.dm b/mods/telecomms/code/scripting/Parser/Expressions.dm new file mode 100644 index 0000000000000..a9c39dee00231 --- /dev/null +++ b/mods/telecomms/code/scripting/Parser/Expressions.dm @@ -0,0 +1,320 @@ +/* + File: Expressions + Procedures for parsing expressions. +*/ + +/* + Macros: Expression Macros + OPERATOR - A value indicating the parser currently expects a binary operator. + VALUE - A value indicating the parser currently expects a value. + SHIFT - Tells the parser to push the current operator onto the stack. + REDUCE - Tells the parser to reduce the stack. +*/ +#define OPERATOR 1 +#define VALUE 2 +#define SHIFT 0 +#define REDUCE 1 + +/* + Class: nS_Parser +*/ +/n_Parser/nS_Parser + +/* + Var: expecting + A variable which keeps track of whether an operator or value is expected. It should be either or . See + for more information. +*/ + var/expecting=VALUE + +/* + Proc: Precedence + Compares two operators, decides which is higher in the order of operations, and returns or . +*/ +/n_Parser/nS_Parser/proc/Precedence(node/expression/c_operator/top, node/expression/c_operator/input) + if(istype(top)) + top=top.precedence + if(istype(input)) + input=input:precedence + if(top>=input) + return REDUCE + return SHIFT + +/* + Proc: GetExpression + Takes a token expected to represent a value and returns an node. +*/ +/n_Parser/nS_Parser/proc/GetExpression(token/T) + if(!T) + return + if(istype(T, /node/expression)) + return T + switch(T.type) + if(/token/word) + return new/node/expression/value/variable(T.value) + if(/token/accessor) + var/token/accessor/A=T + var/node/expression/value/variable/E//=new(A.member) + var/stack/S=new() + while(istype(A.object, /token/accessor)) + S.Push(A) + A=A.object + ASSERT(istext(A.object)) + + while(A) + var/node/expression/value/variable/V=new() + V.id=new(A.member) + if(E) + V.object=E + else + V.object=new/node/identifier(A.object) + E=V + A=S.Pop() + return E + + if(/token/number, /token/string) + return new/node/expression/value/literal(T.value) + +/* + Proc: GetOperator + Gets a path related to a token or string and returns an instance of the given type. This is used to get an instance of either a binary or unary + operator from a token. + + Parameters: + O - The input value. If this is a token, O is reset to the token's value. + When O is a string and is in L, its associated value is used as the path to instantiate. + type - The desired type of the returned object. + L - The list in which to search for O. + + See Also: + - + - +*/ +/n_Parser/nS_Parser/proc/GetOperator(O, type=/node/expression/c_operator, L[]) + if(istype(O, type)) + return O //O is already the desired type + if(istype(O, /token)) + O=O:value //sets O to text + if(istext(O)) //sets O to path + if(list_find(L, O)) + O=L[O] + else + return null + if(ispath(O)) + O=new O //catches path from last check + else + return null //Unknown type + return O + +/* + Proc: GetBinaryOperator + Uses to search for an instance of a binary operator type with which the given string is associated. For example, if + O is set to "+", an node is returned. + + See Also: + - + - +*/ +/n_Parser/nS_Parser/proc/GetBinaryOperator(O) + return GetOperator(O, /node/expression/c_operator/binary, options.binary_operators) + +/* + Proc: GetUnaryOperator + Uses to search for an instance of a unary operator type with which the given string is associated. For example, if + O is set to "!", a node is returned. + + See Also: + - + - +*/ +/n_Parser/nS_Parser/proc/GetUnaryOperator(O) + return GetOperator(O, /node/expression/c_operator/unary, options.unary_operators) + +/* + Proc: Reduce + Takes the operator on top of the opr stack and assigns its operand(s). Then this proc pushes the value of that operation to the top + of the val stack. +*/ +/n_Parser/nS_Parser/proc/Reduce(stack/opr, stack/val) + var/node/expression/c_operator/O=opr.Pop() + if(!O) + return + if(!istype(O)) + errors+=new/scriptError("Error reducing expression - invalid operator.") + return + //Take O and assign its operands, popping one or two values from the val stack + //depending on whether O is a binary or unary operator. + if(istype(O, /node/expression/c_operator/binary)) + var/node/expression/c_operator/binary/B=O + B.exp2=val.Pop() + B.exp =val.Pop() + val.Push(B) + else + O.exp=val.Pop() + val.Push(O) + +/* + Proc: EndOfExpression + Returns true if the current token represents the end of an expression. + + Parameters: + end - A list of values to compare the current token to. +*/ +/n_Parser/nS_Parser/proc/EndOfExpression(end[]) + if(!curToken) + return 1 + if(istype(curToken, /token/symbol) && list_find(end, curToken.value)) + return 1 + if(istype(curToken, /token/end) && list_find(end, /token/end)) + return 1 + return 0 + +/* + Proc: ParseExpression + Uses the Shunting-yard algorithm to parse expressions. + + Notes: + - When an opening parenthesis is found, then is called to handle it. + - The variable helps distinguish unary operators from binary operators (for cases like the - operator, which can be either). + + Articles: + - + - + + See Also: + - + - + - +*/ +/n_Parser/nS_Parser/proc/ParseExpression(list/end=list(/token/end), list/ErrChars=list("{", "}")) + var/stack/opr=new/stack() + var/stack/val=new/stack() + src.expecting=VALUE + while(1) + if(EndOfExpression(end)) + break + if(istype(curToken, /token/symbol) && list_find(ErrChars, curToken.value)) + errors+=new/scriptError/BadToken(curToken) + break + + + if(index>LAZYLEN(tokens)) //End of File + errors+=new/scriptError/EndOfFile() + break + var/token/ntok + if(index+1<=LAZYLEN(tokens)) + ntok=tokens[index+1] + + if(istype(curToken, /token/symbol) && curToken.value=="(") //Parse parentheses expression + if(expecting!=VALUE) + errors+=new/scriptError/ExpectedToken("operator", curToken) + NextToken() + continue + val.Push(ParseParenExpression()) + else if(istype(curToken, /token/symbol)) //Operator found. + var/node/expression/c_operator/curOperator //Figure out whether it is unary or binary and get a new instance. + if(src.expecting==OPERATOR) + curOperator=GetBinaryOperator(curToken) + if(!curOperator) + errors+=new/scriptError/ExpectedToken("operator", curToken) + NextToken() + continue + else + curOperator=GetUnaryOperator(curToken) + if(!curOperator) //given symbol isn't a unary operator + errors+=new/scriptError/ExpectedToken("expression", curToken) + NextToken() + continue + + if(opr.Top() && Precedence(opr.Top(), curOperator)==REDUCE) //Check order of operations and reduce if necessary + Reduce(opr, val) + continue + opr.Push(curOperator) + src.expecting=VALUE + else if(ntok?.value=="(" && istype(ntok, /token/symbol)\ + && istype(curToken, /token/word)) //Parse function call + var/token/preToken=curToken + var/old_expect=src.expecting + var/fex=ParseFunctionExpression() + if(old_expect!=VALUE) + errors+=new/scriptError/ExpectedToken("operator", preToken) + NextToken() + continue + val.Push(fex) + else if(istype(curToken, /token/keyword)) //inline keywords + var/n_Keyword/kw=options.keywords[curToken.value] + kw=new kw(inline=1) + if(kw) + if(!kw.Parse(src)) + return + else + errors+=new/scriptError/BadToken(curToken) + else if(istype(curToken, /token/end)) //semicolon found where it wasn't expected + errors+=new/scriptError/BadToken(curToken) + NextToken() + continue + else + if(expecting!=VALUE) + errors+=new/scriptError/ExpectedToken("operator", curToken) + NextToken() + continue + val.Push(GetExpression(curToken)) + src.expecting=OPERATOR + NextToken() + + while(opr.Top()) Reduce(opr, val) //Reduce the value stack completely + .=val.Pop() //Return what should be the last value on the stack + if(val.Top()) // + var/node/N=val.Pop() + errors+=new/scriptError("Error parsing expression. Unexpected value left on stack: [N.ToString()].") + return null + +/* + Proc: ParseFunctionExpression + Parses a function call inside of an expression. + + See Also: + - +*/ +/n_Parser/nS_Parser/proc/ParseFunctionExpression() + var/node/expression/FunctionCall/exp=new + exp.func_name=curToken.value + NextToken() //skip function name + NextToken() //skip open parenthesis, already found + var/loops = 0 + + while(1) + loops++ + if(loops>=1000) + CRASH("Something TERRIBLE has gone wrong in ParseFunctionExpression ;__;") + + if(istype(curToken, /token/symbol) && curToken.value==")") + return exp + exp.parameters+=ParseParamExpression() + if(curToken.value==","&&istype(curToken, /token/symbol)) + NextToken() //skip comma + if(istype(curToken, /token/end)) //Prevents infinite loop... + errors+=new/scriptError/ExpectedToken(")") + return exp + +/* + Proc: ParseParenExpression + Parses an expression that ends with a close parenthesis. This is used for parsing expressions inside of parentheses. + + See Also: + - +*/ +/n_Parser/nS_Parser/proc/ParseParenExpression() + if(!CheckToken("(", /token/symbol)) + return + return new/node/expression/c_operator/unary/group(ParseExpression(list(")"))) + +/* + Proc: ParseParamExpression + Parses an expression that ends with either a comma or close parenthesis. This is used for parsing the parameters passed to a function call. + + See Also: + - +*/ +/n_Parser/nS_Parser/proc/ParseParamExpression() + return ParseExpression(list(",", ")")) diff --git a/mods/telecomms/code/scripting/Parser/Keywords.dm b/mods/telecomms/code/scripting/Parser/Keywords.dm new file mode 100644 index 0000000000000..a51950c982d36 --- /dev/null +++ b/mods/telecomms/code/scripting/Parser/Keywords.dm @@ -0,0 +1,175 @@ +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 + +/* + File: Keywords +*/ +var/global/const/KW_FAIL = 0 //Fatal error; stop parsing entire script. +var/global/const/KW_PASS = 1 //OK +var/global/const/KW_ERR = 2 //Non-fatal error, keyword couldn't be handled properly. Ignore keyword but continue on. +var/global/const/KW_WARN = 3 //Warning + +/* +var/global/const/Class: n_Keyword +var/global/const/Represents a special statement in the code triggered by a keyword. +*/ +/n_Keyword/New(inline=0) + src.inline=inline + return ..() + +/* + Var: inline + 1 if the keyword is in an expression (e.g. the new keyword in many languages), 0 otherwise (such as the if and else keywords). +*/ +/n_Keyword + var/inline + +/* + Proc: Parse + Called when the parser finds a keyword in the code. + + Parameters: + parser - The parser that created this object. You can use the parameter to manipulate the parser in order to add statements and blocks + to its AST. +*/ +/n_Keyword/proc/Parse(n_Parser/parser) + +/* + Class: nS_Keyword + A keyword in n_Script. By default these include return, if, else, while, and def. To enable or disable a keyword, change the + list. + + Behavior: + When a parser is expecting a new statement, and a keyword listed in is found, it will call the keyword's + proc. +*/ +// +/n_Keyword/nS_Keyword + +/n_Keyword/nS_Keyword/New(inline=0) + if(inline) + qdel(src) + +/n_Keyword/nS_Keyword/kwReturn + +/n_Keyword/nS_Keyword/kwReturn/Parse(n_Parser/nS_Parser/parser) + .=KW_PASS + if(istype(parser.curBlock, /node/BlockDefinition/GlobalBlock)) + parser.errors+=new/scriptError/BadReturn(parser.curToken) + . = KW_WARN + var/node/statement/ReturnStatement/stmt=new + parser.NextToken() //skip 'return' token + stmt.value=parser.ParseExpression() + parser.curBlock.statements+=stmt + +/n_Keyword/nS_Keyword/kwIf + +/n_Keyword/nS_Keyword/kwIf/Parse(n_Parser/nS_Parser/parser) + .=KW_PASS + var/node/statement/IfStatement/stmt=new + parser.NextToken() //skip 'if' token + stmt.cond=parser.ParseParenExpression() + if(!parser.CheckToken(")", /token/symbol)) + return KW_FAIL + if(!parser.CheckToken("{", /token/symbol, skip=0)) //Token needs to be preserved for parse loop, so skip=0 + return KW_ERR + parser.curBlock.statements+=stmt + stmt.block=new + parser.AddBlock(stmt.block) + +/n_Keyword/nS_Keyword/kwElse + +/n_Keyword/nS_Keyword/kwElse/Parse(n_Parser/nS_Parser/parser) + .=KW_PASS + var/list/L=parser.curBlock.statements + var/node/statement/IfStatement/stmt + if(LAZYLEN(L)) + stmt=L[LAZYLEN(L)] //Get the last statement in the current block + if(!stmt || !istype(stmt) || stmt.else_block) //Ensure that it is an if statement + parser.errors+=new/scriptError/ExpectedToken("if statement",parser.curToken) + return KW_FAIL + parser.NextToken() //skip 'else' token + if(!parser.CheckToken("{", /token/symbol, skip=0)) + return KW_ERR + stmt.else_block=new() + parser.AddBlock(stmt.else_block) + +/n_Keyword/nS_Keyword/kwWhile + +/n_Keyword/nS_Keyword/kwWhile/Parse(n_Parser/nS_Parser/parser) + .=KW_PASS + var/node/statement/WhileLoop/stmt=new + parser.NextToken() //skip 'while' token + stmt.cond=parser.ParseParenExpression() + if(!parser.CheckToken(")", /token/symbol)) + return KW_FAIL + if(!parser.CheckToken("{", /token/symbol, skip=0)) + return KW_ERR + parser.curBlock.statements+=stmt + stmt.block=new + parser.AddBlock(stmt.block) + +/n_Keyword/nS_Keyword/kwBreak + +/n_Keyword/nS_Keyword/kwBreak/Parse(n_Parser/nS_Parser/parser) + .=KW_PASS + if(istype(parser.curBlock, /node/BlockDefinition/GlobalBlock)) + parser.errors+=new/scriptError/BadToken(parser.curToken) + . = KW_WARN + var/node/statement/BreakStatement/stmt=new + parser.NextToken() //skip 'break' token + parser.curBlock.statements+=stmt + +/n_Keyword/nS_Keyword/kwContinue + +/n_Keyword/nS_Keyword/kwContinue/Parse(n_Parser/nS_Parser/parser) + .=KW_PASS + if(istype(parser.curBlock, /node/BlockDefinition/GlobalBlock)) + parser.errors+=new/scriptError/BadToken(parser.curToken) + . = KW_WARN + var/node/statement/ContinueStatement/stmt=new + parser.NextToken() //skip 'break' token + parser.curBlock.statements+=stmt + +/n_Keyword/nS_Keyword/kwDef + +/n_Keyword/nS_Keyword/kwDef/Parse(n_Parser/nS_Parser/parser) + .=KW_PASS + var/node/statement/FunctionDefinition/def=new + parser.NextToken() //skip 'def' token + if(!parser.options.IsValidID(parser.curToken.value)) + parser.errors+=new/scriptError/InvalidID(parser.curToken) + return KW_FAIL + def.func_name=parser.curToken.value + parser.NextToken() + if(!parser.CheckToken("(", /token/symbol)) + return KW_FAIL + while(1) //for now parameters ? can be separated by whitespace - they don't need a comma in between + if(istype(parser.curToken, /token/symbol)) + switch(parser.curToken.value) + if(",") + parser.NextToken() + if(")") + break + else + parser.errors+=new/scriptError/BadToken(parser.curToken) + return KW_ERR + + else if(istype(parser.curToken, /token/word)) + def.parameters+=parser.curToken.value + parser.NextToken() + else + parser.errors+=new/scriptError/InvalidID(parser.curToken) + return KW_ERR + if(!parser.CheckToken(")", /token/symbol)) + return KW_FAIL + + if(istype(parser.curToken, /token/end)) //Function prototype + parser.curBlock.statements+=def + else if(parser.curToken.value=="{" && istype(parser.curToken, /token/symbol)) + def.block = new + parser.curBlock.statements+=def + parser.curBlock.functions[def.func_name]=def + parser.AddBlock(def.block) + else + parser.errors+=new/scriptError/BadToken(parser.curToken) + return KW_FAIL diff --git a/mods/telecomms/code/scripting/Parser/Parser.dm b/mods/telecomms/code/scripting/Parser/Parser.dm new file mode 100644 index 0000000000000..b7d35e21a4a6f --- /dev/null +++ b/mods/telecomms/code/scripting/Parser/Parser.dm @@ -0,0 +1,180 @@ +/* + File: Parser +*/ +/* + Class: n_Parser + An object that reads tokens and produces an AST (abstract syntax tree). +*/ +/n_Parser +/* + Var: index + The parser's current position in the token's list. +*/ + var/index = 1 +/* + Var: tokens + A list of tokens in the source code generated by a scanner. +*/ + var/list/tokens = new +/* + Var: errors + A list of fatal errors found by the parser. If there are any items in this list, then it is not safe to run the returned AST. + + See Also: + - +*/ + var/list/errors = new +/* + Var: warnings + A list of non-fatal problems in the script. +*/ + var/list/warnings = new +/* + Var: curToken + The token at in . +*/ + var/token/curToken + var/stack/blocks=new + var/node/BlockDefinition/GlobalBlock/global_block=new + var/node/BlockDefinition/curBlock +/* + Proc: Parse + Reads the tokens and returns the AST's node. Be sure to populate the tokens list before calling this procedure. +*/ +/n_Parser/proc/Parse() + +/* + Proc: NextToken + Sets to the next token in the list, or null if there are no more tokens. +*/ +/n_Parser/proc/NextToken() + if(index>=LAZYLEN(tokens)) + curToken=null + else + curToken=tokens[++index] + return curToken + +/* + Class: nS_Parser + An implmentation of a parser for n_Script. +*/ +/n_Parser/nS_Parser + var/n_scriptOptions/nS_Options/options +/* + Constructor: New + + Parameters: + tokens - A list of tokens to parse. + options - An object used for configuration. +*/ +/n_Parser/nS_Parser/New(tokens[], n_scriptOptions/options) + src.tokens=tokens + src.options=options + curBlock=global_block + return ..() +/n_Parser/nS_Parser/Parse() + ASSERT(tokens) + for(,src.index<=LAZYLEN(src.tokens), src.index++) + curToken=tokens[index] + switch(curToken.type) + if(/token/keyword) + var/n_Keyword/kw=options.keywords[curToken.value] + kw=new kw() + if(kw) + if(!kw.Parse(src)) + return + if(/token/word) + var/token/ntok + if(index+1>LAZYLEN(tokens)) + errors+=new/scriptError/BadToken(curToken) + continue + ntok=tokens[index+1] + if(!istype(ntok, /token/symbol)) + errors+=new/scriptError/BadToken(ntok) + continue + if(ntok.value=="(") + ParseFunctionStatement() + else if(list_find(options.assign_operators, ntok.value)) + ParseAssignment() + else + errors+=new/scriptError/BadToken(ntok) + continue + if(!istype(curToken, /token/end)) + errors+=new/scriptError/ExpectedToken(";", curToken) + continue + if(/token/symbol) + if(curToken.value=="}") + if(!EndBlock()) + errors+=new/scriptError/BadToken(curToken) + continue + else + errors+=new/scriptError/BadToken(curToken) + continue + if(/token/end) + warnings+=new/scriptError/BadToken(curToken) + continue + else + errors+=new/scriptError/BadToken(curToken) + return + return global_block + +/n_Parser/nS_Parser/proc/CheckToken(val, type, err=1, skip=1) + if(curToken.value!=val || !istype(curToken,type)) + if(err) + errors+=new/scriptError/ExpectedToken(val, curToken) + return 0 + if(skip)NextToken() + return 1 + +/n_Parser/nS_Parser/proc/AddBlock(node/BlockDefinition/B) + blocks.Push(curBlock) + curBlock=B + +/n_Parser/nS_Parser/proc/EndBlock() + if(curBlock==global_block) return 0 + curBlock=blocks.Pop() + return 1 + +/n_Parser/nS_Parser/proc/ParseAssignment() + var/name=curToken.value + if(!options.IsValidID(name)) + errors+=new/scriptError/InvalidID(curToken) + return + NextToken() + var/t=options.binary_operators[options.assign_operators[curToken.value]] + var/node/statement/VariableAssignment/stmt=new() + stmt.var_name=new(name) + NextToken() + if(t) + stmt.value=new t() + stmt.value:exp=new/node/expression/value/variable(stmt.var_name) + stmt.value:exp2=ParseExpression() + else + stmt.value=ParseExpression() + curBlock.statements+=stmt + +/n_Parser/nS_Parser/proc/ParseFunctionStatement() + if(!istype(curToken, /token/word)) + errors+=new/scriptError("Bad identifier in function call.") + return + var/node/statement/FunctionCall/stmt=new + stmt.func_name=curToken.value + NextToken() //skip function name + if(!CheckToken("(", /token/symbol)) //Check for and skip open parenthesis + return + var/loops = 0 + while(1) + loops++ + if(loops >= 6000) + CRASH("Something TERRIBLE has gone wrong in ParseFunctionStatement ;__;") + + if(!curToken) + errors+=new/scriptError/EndOfFile() + return + if(istype(curToken, /token/symbol) && curToken.value==")") + curBlock.statements+=stmt + NextToken() //Skip close parenthesis + return + var/node/expression/P=ParseParamExpression() + stmt.parameters+=P + if(istype(curToken, /token/symbol) && curToken.value==",") NextToken() diff --git a/mods/telecomms/code/scripting/Scanner/Scanner.dm b/mods/telecomms/code/scripting/Scanner/Scanner.dm new file mode 100644 index 0000000000000..7813b95dd82cb --- /dev/null +++ b/mods/telecomms/code/scripting/Scanner/Scanner.dm @@ -0,0 +1,273 @@ +/* + File: Scanner +*/ +/* + Class: n_Scanner + An object responsible for breaking up source code into tokens for use by the parser. +*/ +/n_Scanner + var/code +/* + Var: errors + A list of fatal errors found by the scanner. If there are any items in this list, then it is not safe to parse the returned tokens. + + See Also: + - +*/ + var/list/errors = new +/* + Var: warnings + A list of non-fatal problems in the source code found by the scanner. +*/ + var/list/warnings = new +/* + Proc: LoadCode + Loads source code. +*/ +/n_Scanner/proc/LoadCode(c) + code = c + +/* + Proc: LoadCodeFromFile + Gets the code from a file and calls . +*/ +/n_Scanner/proc/LoadCodeFromFile(f) + LoadCode(file2text(f)) + +/* + Proc: Scan + Runs the scanner and returns the resulting list of tokens. Ensure that has been called first. +*/ +/n_Scanner/proc/Scan() + +/* + Class: nS_Scanner + A scanner implementation for n_Script. +*/ +/n_Scanner/nS_Scanner +/* + Variable: codepos + The scanner's position in the source code. +*/ + var/codepos = 1 + var/line = 1 + var/linepos = 0 //column=codepos-linepos + var/n_scriptOptions/nS_Options/options + + var/commenting = 0 + // 1: single-line + // 2: multi-line +/* + Variable: ignore + A list of characters that are ignored by the scanner. + + Default Value: + Whitespace +*/ + var/list/ignore = list(" ", "\t", "\n") //Don't add tokens for whitespace +/* + Variable: end_stmt + A list of characters that end a statement. Each item may only be one character long. + + Default Value: + Semicolon +*/ + var/list/end_stmt = list(";") +/* + Variable: string_delim + A list of characters that can start and end strings. + + Default Value: + Double and single quotes. +*/ + var/list/string_delim = list("\"", "'") +/* + Variable: delim + A list of characters that denote the start of a new token. This list is automatically populated. +*/ + var/list/delim = new + +/* + Macro: COL + The current column number. +*/ + #define COL codepos-linepos + +/* + Constructor: New + Parameters: + code - The source code to tokenize. + options - An object used to configure the scanner. +*/ +/n_Scanner/nS_Scanner/New(code, n_scriptOptions/nS_Options/options) + .=..() + ignore += ascii2text(13) //Carriage return + delim += ignore + options.symbols + end_stmt + string_delim + src.options=options + LoadCode(code) + +/n_Scanner/nS_Scanner/Scan() //Creates a list of tokens from source code + var/list/tokens = new + for(, src.codepos<=length(code), src.codepos++) + + var/char=copytext(code, codepos, codepos+1) + if(char=="\n") + line++ + linepos=codepos + + if(list_find(ignore, char)) + continue + else if(char == "/") + ReadComment() + else if(list_find(end_stmt, char)) + tokens += new /token/end(char, line, COL) + else if(list_find(string_delim, char)) + codepos++ //skip string delimiter + tokens += ReadString(char) + else if(options.CanStartID(char)) + tokens += ReadWord() + else if(options.IsDigit(char)) + tokens += ReadNumber() + else if(list_find(options.symbols, char)) + tokens += ReadSymbol() + + + codepos = initial(codepos) + line = initial(line) + linepos = initial(linepos) + return tokens +/* + Proc: ReadString + Reads a string in the source code into a token. + + Parameters: + start - The character used to start the string. +*/ +/n_Scanner/nS_Scanner/proc/ReadString(start) + var/buf + for(, codepos <= length(code), codepos++)//codepos to length(code)) + var/char = copytext(code, codepos, codepos+1) + switch(char) + if("\\") //Backslash (\) encountered in string + codepos++ //Skip next character in string, since it was escaped by a backslash + char = copytext(code, codepos, codepos+1) + switch(char) + if("\\") //Double backslash + buf += "\\" + if("n") //\n Newline + buf += "\n" + else + if(char == start) //\" Doublequote + buf += start + else //Unknown escaped text + buf += char + if("\n") + . = new/token/string(buf, line, COL) + errors += new/scriptError("Unterminated string. Newline reached.", .) + line++ + linepos = codepos + break + else + if(char == start) //string delimiter found, end string + break + else + buf+=char //Just a normal character in a string + if(!.) return new/token/string(buf, line, COL) + +/* + Proc: ReadWord + Reads characters separated by an item in into a token. +*/ +/n_Scanner/nS_Scanner/proc/ReadWord() + var/char = copytext(code, codepos, codepos+1) + var/buf + while(!list_find(delim, char) && codepos <= length(code)) + buf += char + char=copytext(code, ++codepos, codepos+1) + codepos-- //allow main Scan() proc to read the delimiter + if(list_find(options.keywords, buf)) + return new /token/keyword(buf, line, COL) + else + return new /token/word(buf, line, COL) + +/* + Proc: ReadSymbol + Reads a symbol into a token. +*/ +/n_Scanner/nS_Scanner/proc/ReadSymbol() + var/char = copytext(code, codepos, codepos+1) + var/buf + + while(list_find(options.symbols, buf+char)) + buf += char + if(++codepos>length(code)) break + char = copytext(code, codepos, codepos+1) + + codepos-- //allow main Scan() proc to read the next character + return new /token/symbol(buf, line, COL) + +/* + Proc: ReadNumber + Reads a number into a token. +*/ +/n_Scanner/nS_Scanner/proc/ReadNumber() + var/char=copytext(code, codepos, codepos+1) + var/buf + var/dec=0 + + while(options.IsDigit(char) || (char=="." && !dec)) + if(char==".") dec=1 + buf += char + codepos++ + char = copytext(code, codepos, codepos+1) + var/token/number/T=new(buf, line, COL) + if(isnull(text2num(buf))) + errors += new/scriptError("Bad number: ", T) + T.value = 0 + codepos-- //allow main Scan() proc to read the next character + return T + +/* + Proc: ReadComment + Reads a comment and outputs the type of comment +*/ + +/n_Scanner/nS_Scanner/proc/ReadComment() + var/char=copytext(code, codepos, codepos+1) + var/nextchar=copytext(code, codepos+1, codepos+2) + var/charstring = char+nextchar + var/comm = 1 + // 1: single-line comment + // 2: multi-line comment + var/expectedend = 0 + + if(charstring == "//" || charstring == "/*") + if(charstring == "/*") + comm = 2 // starts a multi-line comment + + while(comm) + if(++codepos > length(code)) break + + if(expectedend) // ending statement expected... + char = copytext(code, codepos, codepos+1) + if(char == "/") // ending statement found - beak the comment + comm = 0 + break + + if(comm == 2) + // multi-line comments are broken by ending statements + char = copytext(code, codepos, codepos+1) + if(char == "*") + expectedend = 1 + continue + else + char = copytext(code, codepos, codepos+1) + if(char == "\n") + comm = 0 + break + + if(expectedend) expectedend = 0 + + if(comm == 2) + errors+=new/scriptError/UnterminatedComment() + diff --git a/mods/telecomms/code/scripting/Scanner/Tokens.dm b/mods/telecomms/code/scripting/Scanner/Tokens.dm new file mode 100644 index 0000000000000..711133aacd482 --- /dev/null +++ b/mods/telecomms/code/scripting/Scanner/Tokens.dm @@ -0,0 +1,38 @@ +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 + +/* + Class: Token + Represents an entity and position in the source code. +*/ +/token + var/value + var/line + var/column + +/token/New(v, l=0, c=0) + value=v + line=l + column=c + +/token/string +/token/symbol +/token/word +/token/keyword +/token/number +/token/number/New() + .=..() + if(!isnum(value)) + value=text2num(value) + ASSERT(!isnull(value)) +/token/accessor + var/object + var/member + +/token/accessor/New(object, member, l=0, c=0) + src.object=object + src.member=member + src.value="[object].[member]" //for debugging only + src.line=l + src.column=c + +/token/end diff --git a/mods/telecomms/code/scripting/stack.dm b/mods/telecomms/code/scripting/stack.dm new file mode 100644 index 0000000000000..1331723ef824a --- /dev/null +++ b/mods/telecomms/code/scripting/stack.dm @@ -0,0 +1,22 @@ +/stack + var/list/contents=new +/stack/proc/Push(value) + contents+=value + +/stack/proc/Pop() + if(!LAZYLEN(contents)) + return null + . = contents[LAZYLEN(contents)] + LIST_RESIZE(contents, LAZYLEN(contents) - 1) + +/stack/proc/Top() //returns the item on the top of the stack without removing it + if(!LAZYLEN(contents)) return null + return contents[LAZYLEN(contents)] + +/stack/proc/Copy() + var/stack/S=new() + S.contents=src.contents.Copy() + return S + +/stack/proc/Clear() + contents.Cut() diff --git a/mods/telecomms/code/telecommunications.dm b/mods/telecomms/code/telecommunications.dm new file mode 100644 index 0000000000000..5c4cb87932ccd --- /dev/null +++ b/mods/telecomms/code/telecommunications.dm @@ -0,0 +1,101 @@ +/obj/machinery/telecomms/server + var/rawcode = "" // the code to compile (raw text) + var/datum/TCS_Compiler/Compiler // the compiler that compiles and runs the code + var/autoruncode = 0 // 1 if the code is set to run every time a signal is picked up + +/obj/machinery/telecomms/server/New() + ..() + Compiler = new() + Compiler.Holder = src + server_radio = new() + +/obj/machinery/telecomms/server/proc/setcode(t) + if(t) + if(istext(t)) + rawcode = t + +/obj/machinery/telecomms/server/proc/compile() + if(Compiler) + return Compiler.Compile(rawcode) + +/obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) + if(signal.data["message"]) + if(is_freq_listening(signal)) + if(traffic > 0) + totaltraffic += traffic // add current traffic to total traffic + + // channel tag the signal + var/list/data = get_channel_info(signal.frequency) + signal.data["channel_tag"] = data[1] + signal.data["channel_color"] = data[2] + + //Is this a test signal? Bypass logging + if(signal.data["type"] != 4) + + // If signal has a message and appropriate frequency + + 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"] + log.parameters["language"] = signal.data["language"] + + var/race = "Unknown" + if(ishuman(M) || isbrain(M)) + race = "Sapient Race" + log.parameters["intelligible"] = 1 + else if(M.is_species(SPECIES_MONKEY)) + race = "Monkey" + else if(issilicon(M)) + race = "Artificial Life" + log.parameters["intelligible"] = 1 + else if(isslime(M)) + race = "Slime" + else if(isanimal(M)) + race = "Domestic Animal" + + log.parameters["race"] = race + + if(!istype(M, /mob/new_player) && M) + log.parameters["uspeech"] = M.universal_speak + else + log.parameters["uspeech"] = 0 + + // If the signal is still compressed, make the log entry gibberish + if(signal.data["compression"] > 0) + log.parameters["message"] = Gibberish(signal.data["message"], signal.data["compression"] + 50) + 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 + log_entries.Add(log) + if(!(signal.data["name"] in stored_names)) + stored_names.Add(signal.data["name"]) + logs++ + signal.data["server"] = src + + // Give the log a name + var/identifier = num2text( rand(-1000,1000) + world.time ) + log.name = "data packet ([md5(identifier)])" + + // [SIERRA-ADD] - MODPACK_TELECOMMS - (Нельзя переписать функцию так, чтобы родитель не вызывался) + if(Compiler && autoruncode) + Compiler.Run(signal) + // [SIERRA-ADD] + + var/can_send = relay_information(signal, /obj/machinery/telecomms/hub) + if(!can_send) + relay_information(signal, /obj/machinery/telecomms/broadcaster) diff --git a/mods/telecomms/code/telemonitor.dm b/mods/telecomms/code/telemonitor.dm new file mode 100644 index 0000000000000..78596c656eef0 --- /dev/null +++ b/mods/telecomms/code/telemonitor.dm @@ -0,0 +1,9 @@ +/obj/machinery/computer/telecomms/monitor/interface_interact(mob/user) + interact(user) + return TRUE + +/obj/machinery/computer/telecomms/monitor/interact(mob/user) + attack_hand(user) + +///obj/machinery/computer/telecomms/monitor/OnTopic(mob/user, list/href_list, datum/topic_state/state) + //Topic(state, href_list) diff --git a/mods/telecomms/code/text.dm b/mods/telecomms/code/text.dm new file mode 100644 index 0000000000000..415ca4399f551 --- /dev/null +++ b/mods/telecomms/code/text.dm @@ -0,0 +1,49 @@ +// It's not perfect, but will work in most cases +// Don't use it if you don't know what you're doing +/proc/sanitize_html(t) + var/static/regex/RegexReplaceHTML = new(@"<(/?)([^> ]*)([^>]*)>", "ig") + t = regex_replace_char(RegexReplaceHTML, t, /proc/html_replace) + + for (var/w in html_attr_blacklist) + t = replacetext_char(t, w, "a") + + return t + +/proc/html_replace(match, slash, tag, attrs) + if (!(tag in html_allowed_tags)) + tag = "span" + + var/static/regex/RegexAttrs = new("(\\l+)( *= *\[\"\\'])", "ig") + attrs = regex_replace_char(RegexAttrs, attrs, /proc/attrs_replace) + + return "<[slash][tag][attrs]>" + +/proc/attrs_replace(match, attr, rest) + if (!(attr in html_allowed_attrs)) + return "a[rest]" + return "[attr][rest]" + +// IE won't receive updates +// so... +var/global/list/html_attr_blacklist = list( + "oncancel", "oncanplay", "oncanplaythrough", "onchange", "onclick", "onclose", + "oncuechange", "ondblclick", "ondrag", "ondragend", "ondragenter", "ondragleave", + "ondragover", "ondragstart", "ondrop", "ondurationchange", "onemptied", "onended", + "onerror", "onfocus", "oninput", "oninvalid", "onkeydown", "onkeypress", "onkeyup", + "onload", "onloadeddata", "onloadedmetadata", "onloadstart", "onmousedown", + "onmouseenter", "onmouseleave", "onmousemove", "onmouseout", "onmouseover", + "onmouseup", "onmousewheel", "onpause", "onplay", "onplaying", "onprogress", + "onratechange", "onreset", "onresize", "onscroll", "onseeked", "onseeking", + "onselect", "onshow", "onstalled", "onsubmit", "onsuspend", "ontimeupdate", + "ontoggle", "onvolumechange", "onwaiting", "oncopy", "oncut", "onpaste", "onabort", + "onerror", "onresize", "onscroll", "onunload", "onbegin", "onend", "onrepeat" +) +var/global/list/html_allowed_tags = list( + "h1", "h2", "h3", "h4", "h5", "h6", + "font", "span", "hr", "br", + "p", "b", "i", "u", "s" +) +var/global/list/html_allowed_attrs = list( + "style", "class", // Everything + "color", "size", "face" // +) diff --git a/mods/telecomms/code/traffic_control.dm b/mods/telecomms/code/traffic_control.dm new file mode 100644 index 0000000000000..d148e59a5650d --- /dev/null +++ b/mods/telecomms/code/traffic_control.dm @@ -0,0 +1,213 @@ +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 + +/obj/machinery/computer/telecomms/traffic + name = "Telecommunications Traffic Control" + desc = "Manipulates with traffic of a telecommunications network." + icon_screen = "comm_monitor" + machine_name = "telecomms traffic control console" + + req_access = list(access_tcomsat) + + var/screen = 0 // the screen number: + var/list/servers = list() // the servers located by the computer + var/mob/editingcode + var/mob/lasteditor + var/list/viewingcode = list() + var/obj/machinery/telecomms/server/SelectedServer + + var/network = "NULL" // the network to probe + var/temp = "" // temporary feedback messages + + var/storedcode = "" // code stored + + +/obj/machinery/computer/telecomms/traffic/proc/update_ide() + + // loop if there's someone manning the keyboard + while(editingcode) + if(!editingcode.client) + editingcode = null + break + + // For the typer, the input is enabled. Buffer the typed text + if(editingcode) + storedcode = "[winget(editingcode, "tcscode", "text")]" + if(editingcode) // double if's to work around a runtime error + winset(editingcode, "tcscode", "is-disabled=false") + + // If the player's not manning the keyboard anymore, adjust everything + if( (!(editingcode in range(1, src)) && !issilicon(editingcode)) || (editingcode.machine != src && !issilicon(editingcode))) + if(editingcode) + winshow(editingcode, "Telecomms IDE", 0) // hide the window! + editingcode = null + break + + // For other people viewing the typer type code, the input is disabled and they can only view the code + // (this is put in place so that there's not any magical shenanigans with 50 people inputting different code all at once) + + if(length(viewingcode)) + // This piece of code is very important - it escapes quotation marks so string aren't cut off by the input element + var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") + showcode = replacetext(storedcode, "\"", "\\\"") + + for(var/mob/M in viewingcode) + + if( (M.machine == src && (M in view(1, src)) ) || issilicon(M)) + winset(M, "tcscode", "is-disabled=true") + winset(M, "tcscode", "text=\"[showcode]\"") + else + viewingcode.Remove(M) + winshow(M, "Telecomms IDE", 0) // hide the window! + + sleep(5) + + if(length(viewingcode) > 0) + editingcode = pick(viewingcode) + viewingcode.Remove(editingcode) + update_ide() + +/obj/machinery/computer/telecomms/traffic/interface_interact(mob/user) + interact(user) + return TRUE + +/obj/machinery/computer/telecomms/traffic/interact(mob/user) + if(inoperable()) + return + user.set_machine(src) + var/dat = "Telecommunication Traffic Control

Telecommunications Traffic Control
" + + switch(screen) + + + // --- Main Menu --- + + if(0) + dat += "
[temp]
" + dat += "
Current Network: [network]
" + if(LAZYLEN(servers)) + dat += "
Detected Telecommunication Servers:
    " + for(var/obj/machinery/telecomms/T in servers) + dat += "
  • \ref[T] [T.name] ([T.id])
  • " + dat += "
" + dat += "
\[Flush Buffer\]" + + else + dat += "
No servers detected. Scan for servers: \[Scan\]" + + + // --- Viewing Server --- + + if(1) + dat += "
[temp]
" + dat += "
\[Main Menu\] \[Refresh\]
" + dat += "
Current Network: [network]" + dat += "
Selected Server: [SelectedServer.id]

" + dat += "
\[Edit Code\]" + dat += "
Signal Execution: " + if(SelectedServer.autoruncode) + dat += "ALWAYS" + else + dat += "NEVER" + + + //var/datum/browser/popup = new(user, "traffic_control", "Telecommunications Traffic Control", 575, 400) + //popup.set_content(JOINTEXT(dat)) + //popup.open() + + show_browser(user, dat, "window=traffic_control;size=575x400") + onclose(user, "server_control") + + temp = "" + return + + +/obj/machinery/computer/telecomms/traffic/OnTopic(mob/user, list/href_list, datum/topic_state/state) + if(..()) + return + + usr.set_machine(src) + if(!src.allowed(usr) && !emagged) + to_chat(usr, "ACCESS DENIED.") + return + + if(href_list["viewserver"]) + screen = 1 + for(var/obj/machinery/telecomms/T in servers) + if(T.id == href_list["viewserver"]) + SelectedServer = T + break + + if(href_list["operation"]) + switch(href_list["operation"]) + + if("release") + servers = list() + screen = 0 + + if("mainmenu") + screen = 0 + + if("scan") + if(LAZYLEN(servers)) + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + + else + for(var/obj/machinery/telecomms/server/T in range(25, src)) + if(T.network == network) + servers.Add(T) + + if(!LAZYLEN(servers)) + temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" + else + temp = "- [LAZYLEN(servers)] SERVERS PROBED & BUFFERED -" + + screen = 0 + + if("editcode") + if(editingcode == usr) return + if(usr in viewingcode) return + + if(!editingcode) + lasteditor = usr + editingcode = usr + winshow(editingcode, "TelecommsIDE") // show the IDE + winset(editingcode, "tcscode", "is-disabled=false") + winset(editingcode, "tcscode", "text=\"\"") + var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") + showcode = replacetext(storedcode, "\"", "\\\"") + winset(editingcode, "tcscode", "text=\"[showcode]\"") + sleep(1) + update_ide() + + else + viewingcode.Add(usr) + winshow(usr, "TelecommsIDE") // show the IDE + winset(usr, "tcscode", "is-disabled=true") + winset(editingcode, "tcscode", "text=\"\"") + var/showcode = replacetext(storedcode, "\"", "\\\"") + winset(usr, "tcscode", "text=\"[showcode]\"") + + if("togglerun") + SelectedServer.autoruncode = !(SelectedServer.autoruncode) + + if(href_list["network"]) + var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text + + if(newnet && ((usr in range(1, src) || issilicon(usr)))) + if(length(newnet) > 15) + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + else + network = newnet + screen = 0 + servers = list() + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + + src.updateUsrDialog() + +/obj/machinery/computer/telecomms/traffic/emag_act(remaining_charges, mob/user) + if(!emagged) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + emagged = TRUE + to_chat(user, "You you disable the security protocols") + src.updateUsrDialog() + return 1 From fb7e77a82b8351e7ae722ce45f91e8fa1e7e5b4d Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Sat, 22 Jun 2024 12:13:25 +0300 Subject: [PATCH 63/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2383=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2383.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2383.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2383.yml b/html/changelogs/AutoChangeLog-sierra-pr-2383.yml new file mode 100644 index 0000000000000..a561a04fdc253 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2383.yml @@ -0,0 +1,7 @@ +author: FeudeyTF +changes: + - {bugfix: Пофиксил баг с обновлением интерфейсов некоторых консолей телекоммов} + - {rscadd: 'Вернул в игру возможность управления потоком сообщений, передающихся + по рации'} + - {maptweak: 'Переставил консоли телекоммов, чтобы было удобнее'} +delete-after: true From a751fa21f188b4808c90260101eb3fec6dc17573 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Sun, 23 Jun 2024 01:35:59 +0000 Subject: [PATCH 64/80] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F=D1=86=D0=B8=D1=8F=20=D1=87=D0=B5?= =?UTF-8?q?=D0=B9=D0=BD=D0=B4=D0=B6=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=20[ci=20?= =?UTF-8?q?skip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelog.html | 29 ++++ html/changelogs/.all_changelog.yml | 156 ++++++++++++++++++ .../AutoChangeLog-sierra-pr-2380.yml | 37 ----- .../AutoChangeLog-sierra-pr-2383.yml | 7 - 4 files changed, 185 insertions(+), 44 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2380.yml delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2383.yml diff --git a/html/changelog.html b/html/changelog.html index 601e056efabdf..5a6b3ec9ce506 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -28,6 +28,35 @@

Sierra SS13

-->
+

23.06 - 2024

+

Обновления FeudeyTF:

+
+
Пофиксил баг с обновлением интерфейсов некоторых консолей телекоммов
+
Вернул в игру возможность управления потоком сообщений, передающихся по рации
+
Переставил консоли телекоммов, чтобы было удобнее
+
+

Обновления Shegar:

+
+
Влияние на зрение пилота восстановлено, сенсоры и прочее не работали, мех не мог ослепнуть
+
Исправлен спрайт огнемёта
+
Мех промахнется атакой, если цель отойдёт от меха в замахе
+
Фонарь больше не перекрывает голову меха
+
Отображение спрайтов теперь не ломается при повороте с юга на север.
+
СМГ меха не рантаймит после стрельбы.
+
Теперь пилота полностью рисует по диогонали
+
Пульсач меха теперь бьёт ровно и по 1 выстрелу.
+
Устранён рантайм возникающий при копировании доступа с ID карт.
+
Устранены рантаймы возникающие при надевании НЕ одежду на голову+
+
Добавлены дополнительные препятствия тому чтоб мех сходу ложил человека на пол. Мех теперь всегда должен исключительно толкать стоячих людей.
+
Звук принятия ID, миниган.
+
Реализована система взаимодействия меха с ID картами. Появилась новая кнопка в menu меха. Если нажать по ней ID картой, вы сможете или очистить имеющийся доступ, или записать новый, выбрав из выпадающего листа. После этого, доступ записывается в память меха. Если ткнуть по активному меху картой и карточка пройдёт проверку доступа, мех изменит своё состояние - либо откроется если он закрыт, либо закроется, если он открыт. К этому, появились 3 метода взлома - емаг ИЛИ мультитул + 4 уровень девайсов (мастер это пятый) ИЛИ мультиметр + 3 уровень девайсов + 3 уровень электрики.
+
Сильно усложнено обслуживание мехов. Если урон в конечности выше определённого значения, одной сваркой не обойтись. Вам потребуется лист материала, какой именно - зависит от самой части, а так же КРАЙНЕ ЖЕЛАТЕЛЕН 2 уровень девайсов и 1 уровень конструкторства, иначе с огромным шансом, материал вы сливаете. После ремонта, максимальное ХП конечности уменьшается НАВСЕГДА и единственный метод это исправить - напечатать новую часть.
+
Сделаны заготовки мехов дедов, Гигакс, Дюранд, Фазон и размещены на базе дедов.
+
Резак баффнут, 10 выстрелов вместо 4
+
ЭК мех получил осмиум на обшивку дабы не гореть в гиене огненной
+
Мех больше не таранит меха и подобных себе по росту существ (К примеру ГБСа)
+
+

22.06 - 2024

Обновления Karl Johansson:

diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index d603789120d98..a8fed1fb4e9f3 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -24256,3 +24256,159 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY sierra_genchangelog.p sdtwbaj: - tweak: Using a stethoscope on a body part with arterial bleeding reports "rushing liquid". +2024-06-23: + FeudeyTF: + - bugfix: "\u041F\u043E\u0444\u0438\u043A\u0441\u0438\u043B \u0431\u0430\u0433 \u0441\ + \ \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435\u043C \u0438\u043D\ + \u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043E\u0432 \u043D\u0435\u043A\u043E\ + \u0442\u043E\u0440\u044B\u0445 \u043A\u043E\u043D\u0441\u043E\u043B\u0435\u0439\ + \ \u0442\u0435\u043B\u0435\u043A\u043E\u043C\u043C\u043E\u0432" + - rscadd: "\u0412\u0435\u0440\u043D\u0443\u043B \u0432 \u0438\u0433\u0440\u0443\ + \ \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u0443\u043F\ + \u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u043F\u043E\u0442\u043E\u043A\ + \u043E\u043C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439, \u043F\u0435\ + \u0440\u0435\u0434\u0430\u044E\u0449\u0438\u0445\u0441\u044F \u043F\u043E \u0440\ + \u0430\u0446\u0438\u0438" + - maptweak: "\u041F\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u0438\u043B \u043A\ + \u043E\u043D\u0441\u043E\u043B\u0438 \u0442\u0435\u043B\u0435\u043A\u043E\u043C\ + \u043C\u043E\u0432, \u0447\u0442\u043E\u0431\u044B \u0431\u044B\u043B\u043E\ + \ \u0443\u0434\u043E\u0431\u043D\u0435\u0435" + Shegar: + - bugfix: "\u0412\u043B\u0438\u044F\u043D\u0438\u0435 \u043D\u0430 \u0437\u0440\u0435\ + \u043D\u0438\u0435 \u043F\u0438\u043B\u043E\u0442\u0430 \u0432\u043E\u0441\u0441\ + \u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E, \u0441\u0435\u043D\u0441\ + \u043E\u0440\u044B \u0438 \u043F\u0440\u043E\u0447\u0435\u0435 \u043D\u0435\ + \ \u0440\u0430\u0431\u043E\u0442\u0430\u043B\u0438, \u043C\u0435\u0445 \u043D\ + \u0435 \u043C\u043E\u0433 \u043E\u0441\u043B\u0435\u043F\u043D\u0443\u0442\u044C" + - bugfix: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D \u0441\u043F\u0440\ + \u0430\u0439\u0442 \u043E\u0433\u043D\u0435\u043C\u0451\u0442\u0430" + - bugfix: "\u041C\u0435\u0445 \u043F\u0440\u043E\u043C\u0430\u0445\u043D\u0435\u0442\ + \u0441\u044F \u0430\u0442\u0430\u043A\u043E\u0439, \u0435\u0441\u043B\u0438\ + \ \u0446\u0435\u043B\u044C \u043E\u0442\u043E\u0439\u0434\u0451\u0442 \u043E\ + \u0442 \u043C\u0435\u0445\u0430 \u0432 \u0437\u0430\u043C\u0430\u0445\u0435" + - bugfix: "\u0424\u043E\u043D\u0430\u0440\u044C \u0431\u043E\u043B\u044C\u0448\u0435\ + \ \u043D\u0435 \u043F\u0435\u0440\u0435\u043A\u0440\u044B\u0432\u0430\u0435\u0442\ + \ \u0433\u043E\u043B\u043E\u0432\u0443 \u043C\u0435\u0445\u0430" + - bugfix: "\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0441\ + \u043F\u0440\u0430\u0439\u0442\u043E\u0432 \u0442\u0435\u043F\u0435\u0440\u044C\ + \ \u043D\u0435 \u043B\u043E\u043C\u0430\u0435\u0442\u0441\u044F \u043F\u0440\ + \u0438 \u043F\u043E\u0432\u043E\u0440\u043E\u0442\u0435 \u0441 \u044E\u0433\u0430\ + \ \u043D\u0430 \u0441\u0435\u0432\u0435\u0440." + - bugfix: "\u0421\u041C\u0413 \u043C\u0435\u0445\u0430 \u043D\u0435 \u0440\u0430\ + \u043D\u0442\u0430\u0439\u043C\u0438\u0442 \u043F\u043E\u0441\u043B\u0435 \u0441\ + \u0442\u0440\u0435\u043B\u044C\u0431\u044B." + - bugfix: "\u0422\u0435\u043F\u0435\u0440\u044C \u043F\u0438\u043B\u043E\u0442\u0430\ + \ \u043F\u043E\u043B\u043D\u043E\u0441\u0442\u044C\u044E \u0440\u0438\u0441\u0443\ + \u0435\u0442 \u043F\u043E \u0434\u0438\u043E\u0433\u043E\u043D\u0430\u043B\u0438" + - bugfix: "\u041F\u0443\u043B\u044C\u0441\u0430\u0447 \u043C\u0435\u0445\u0430 \u0442\ + \u0435\u043F\u0435\u0440\u044C \u0431\u044C\u0451\u0442 \u0440\u043E\u0432\u043D\ + \u043E \u0438 \u043F\u043E 1 \u0432\u044B\u0441\u0442\u0440\u0435\u043B\u0443\ + ." + - bugfix: "\u0423\u0441\u0442\u0440\u0430\u043D\u0451\u043D \u0440\u0430\u043D\u0442\ + \u0430\u0439\u043C \u0432\u043E\u0437\u043D\u0438\u043A\u0430\u044E\u0449\u0438\ + \u0439 \u043F\u0440\u0438 \u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\ + \u0438\u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u0441 ID \u043A\u0430\ + \u0440\u0442." + - bugfix: "\u0423\u0441\u0442\u0440\u0430\u043D\u0435\u043D\u044B \u0440\u0430\u043D\ + \u0442\u0430\u0439\u043C\u044B \u0432\u043E\u0437\u043D\u0438\u043A\u0430\u044E\ + \u0449\u0438\u0435 \u043F\u0440\u0438 \u043D\u0430\u0434\u0435\u0432\u0430\u043D\ + \u0438\u0438 \u041D\u0415 \u043E\u0434\u0435\u0436\u0434\u0443 \u043D\u0430\ + \ \u0433\u043E\u043B\u043E\u0432\u0443+" + - bugfix: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u0434\u043E\u043F\ + \u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u043F\u0440\ + \u0435\u043F\u044F\u0442\u0441\u0442\u0432\u0438\u044F \u0442\u043E\u043C\u0443\ + \ \u0447\u0442\u043E\u0431 \u043C\u0435\u0445 \u0441\u0445\u043E\u0434\u0443\ + \ \u043B\u043E\u0436\u0438\u043B \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430\ + \ \u043D\u0430 \u043F\u043E\u043B. \u041C\u0435\u0445 \u0442\u0435\u043F\u0435\ + \u0440\u044C \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043E\u043B\u0436\u0435\ + \u043D \u0438\u0441\u043A\u043B\u044E\u0447\u0438\u0442\u0435\u043B\u044C\u043D\ + \u043E \u0442\u043E\u043B\u043A\u0430\u0442\u044C \u0441\u0442\u043E\u044F\u0447\ + \u0438\u0445 \u043B\u044E\u0434\u0435\u0439." + - soundadd: "\u0417\u0432\u0443\u043A \u043F\u0440\u0438\u043D\u044F\u0442\u0438\ + \u044F ID, \u043C\u0438\u043D\u0438\u0433\u0430\u043D." + - rscadd: "\u0420\u0435\u0430\u043B\u0438\u0437\u043E\u0432\u0430\u043D\u0430 \u0441\ + \u0438\u0441\u0442\u0435\u043C\u0430 \u0432\u0437\u0430\u0438\u043C\u043E\u0434\ + \u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043C\u0435\u0445\u0430 \u0441 ID\ + \ \u043A\u0430\u0440\u0442\u0430\u043C\u0438. \u041F\u043E\u044F\u0432\u0438\ + \u043B\u0430\u0441\u044C \u043D\u043E\u0432\u0430\u044F \u043A\u043D\u043E\u043F\ + \u043A\u0430 \u0432 menu \u043C\u0435\u0445\u0430. \u0415\u0441\u043B\u0438\ + \ \u043D\u0430\u0436\u0430\u0442\u044C \u043F\u043E \u043D\u0435\u0439 ID \u043A\ + \u0430\u0440\u0442\u043E\u0439, \u0432\u044B \u0441\u043C\u043E\u0436\u0435\u0442\ + \u0435 \u0438\u043B\u0438 \u043E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u0438\ + \u043C\u0435\u044E\u0449\u0438\u0439\u0441\u044F \u0434\u043E\u0441\u0442\u0443\ + \u043F, \u0438\u043B\u0438 \u0437\u0430\u043F\u0438\u0441\u0430\u0442\u044C\ + \ \u043D\u043E\u0432\u044B\u0439, \u0432\u044B\u0431\u0440\u0430\u0432 \u0438\ + \u0437 \u0432\u044B\u043F\u0430\u0434\u0430\u044E\u0449\u0435\u0433\u043E \u043B\ + \u0438\u0441\u0442\u0430. \u041F\u043E\u0441\u043B\u0435 \u044D\u0442\u043E\u0433\ + \u043E, \u0434\u043E\u0441\u0442\u0443\u043F \u0437\u0430\u043F\u0438\u0441\u044B\ + \u0432\u0430\u0435\u0442\u0441\u044F \u0432 \u043F\u0430\u043C\u044F\u0442\u044C\ + \ \u043C\u0435\u0445\u0430. \u0415\u0441\u043B\u0438 \u0442\u043A\u043D\u0443\ + \u0442\u044C \u043F\u043E \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C\u0443\ + \ \u043C\u0435\u0445\u0443 \u043A\u0430\u0440\u0442\u043E\u0439 \u0438 \u043A\ + \u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u043F\u0440\u043E\u0439\u0434\u0451\ + \u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443 \u0434\u043E\u0441\u0442\ + \u0443\u043F\u0430, \u043C\u0435\u0445 \u0438\u0437\u043C\u0435\u043D\u0438\u0442\ + \ \u0441\u0432\u043E\u0451 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435\ + \ - \u043B\u0438\u0431\u043E \u043E\u0442\u043A\u0440\u043E\u0435\u0442\u0441\ + \u044F \u0435\u0441\u043B\u0438 \u043E\u043D \u0437\u0430\u043A\u0440\u044B\u0442\ + , \u043B\u0438\u0431\u043E \u0437\u0430\u043A\u0440\u043E\u0435\u0442\u0441\u044F\ + , \u0435\u0441\u043B\u0438 \u043E\u043D \u043E\u0442\u043A\u0440\u044B\u0442\ + . \u041A \u044D\u0442\u043E\u043C\u0443, \u043F\u043E\u044F\u0432\u0438\u043B\ + \u0438\u0441\u044C 3 \u043C\u0435\u0442\u043E\u0434\u0430 \u0432\u0437\u043B\ + \u043E\u043C\u0430 - \u0435\u043C\u0430\u0433 \u0418\u041B\u0418 \u043C\u0443\ + \u043B\u044C\u0442\u0438\u0442\u0443\u043B + 4 \u0443\u0440\u043E\u0432\u0435\ + \u043D\u044C \u0434\u0435\u0432\u0430\u0439\u0441\u043E\u0432 (\u043C\u0430\u0441\ + \u0442\u0435\u0440 \u044D\u0442\u043E \u043F\u044F\u0442\u044B\u0439) \u0418\ + \u041B\u0418 \u043C\u0443\u043B\u044C\u0442\u0438\u043C\u0435\u0442\u0440 +\ + \ 3 \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u0434\u0435\u0432\u0430\u0439\ + \u0441\u043E\u0432 + 3 \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u044D\u043B\ + \u0435\u043A\u0442\u0440\u0438\u043A\u0438." + - rscadd: "\u0421\u0438\u043B\u044C\u043D\u043E \u0443\u0441\u043B\u043E\u0436\u043D\ + \u0435\u043D\u043E \u043E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u043D\ + \u0438\u0435 \u043C\u0435\u0445\u043E\u0432. \u0415\u0441\u043B\u0438 \u0443\ + \u0440\u043E\u043D \u0432 \u043A\u043E\u043D\u0435\u0447\u043D\u043E\u0441\u0442\ + \u0438 \u0432\u044B\u0448\u0435 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0451\ + \u043D\u043D\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F\ + , \u043E\u0434\u043D\u043E\u0439 \u0441\u0432\u0430\u0440\u043A\u043E\u0439\ + \ \u043D\u0435 \u043E\u0431\u043E\u0439\u0442\u0438\u0441\u044C. \u0412\u0430\ + \u043C \u043F\u043E\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u043B\ + \u0438\u0441\u0442 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u0430, \u043A\ + \u0430\u043A\u043E\u0439 \u0438\u043C\u0435\u043D\u043D\u043E - \u0437\u0430\ + \u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0441\u0430\u043C\u043E\u0439 \u0447\ + \u0430\u0441\u0442\u0438, \u0430 \u0442\u0430\u043A \u0436\u0435 \u041A\u0420\ + \u0410\u0419\u041D\u0415 \u0416\u0415\u041B\u0410\u0422\u0415\u041B\u0415\u041D\ + \ 2 \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u0434\u0435\u0432\u0430\u0439\ + \u0441\u043E\u0432 \u0438 1 \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u043A\ + \u043E\u043D\u0441\u0442\u0440\u0443\u043A\u0442\u043E\u0440\u0441\u0442\u0432\ + \u0430, \u0438\u043D\u0430\u0447\u0435 \u0441 \u043E\u0433\u0440\u043E\u043C\ + \u043D\u044B\u043C \u0448\u0430\u043D\u0441\u043E\u043C, \u043C\u0430\u0442\u0435\ + \u0440\u0438\u0430\u043B \u0432\u044B \u0441\u043B\u0438\u0432\u0430\u0435\u0442\ + \u0435. \u041F\u043E\u0441\u043B\u0435 \u0440\u0435\u043C\u043E\u043D\u0442\u0430\ + , \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u0425\ + \u041F \u043A\u043E\u043D\u0435\u0447\u043D\u043E\u0441\u0442\u0438 \u0443\u043C\ + \u0435\u043D\u044C\u0448\u0430\u0435\u0442\u0441\u044F \u041D\u0410\u0412\u0421\ + \u0415\u0413\u0414\u0410 \u0438 \u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\ + \u043D\u043D\u044B\u0439 \u043C\u0435\u0442\u043E\u0434 \u044D\u0442\u043E \u0438\ + \u0441\u043F\u0440\u0430\u0432\u0438\u0442\u044C - \u043D\u0430\u043F\u0435\u0447\ + \u0430\u0442\u0430\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u0447\u0430\u0441\ + \u0442\u044C." + - rscadd: "\u0421\u0434\u0435\u043B\u0430\u043D\u044B \u0437\u0430\u0433\u043E\u0442\ + \u043E\u0432\u043A\u0438 \u043C\u0435\u0445\u043E\u0432 \u0434\u0435\u0434\u043E\ + \u0432, \u0413\u0438\u0433\u0430\u043A\u0441, \u0414\u044E\u0440\u0430\u043D\ + \u0434, \u0424\u0430\u0437\u043E\u043D \u0438 \u0440\u0430\u0437\u043C\u0435\ + \u0449\u0435\u043D\u044B \u043D\u0430 \u0431\u0430\u0437\u0435 \u0434\u0435\u0434\ + \u043E\u0432." + - balance: "\u0420\u0435\u0437\u0430\u043A \u0431\u0430\u0444\u0444\u043D\u0443\u0442\ + , 10 \u0432\u044B\u0441\u0442\u0440\u0435\u043B\u043E\u0432 \u0432\u043C\u0435\ + \u0441\u0442\u043E 4" + - balance: "\u042D\u041A \u043C\u0435\u0445 \u043F\u043E\u043B\u0443\u0447\u0438\ + \u043B \u043E\u0441\u043C\u0438\u0443\u043C \u043D\u0430 \u043E\u0431\u0448\u0438\ + \u0432\u043A\u0443 \u0434\u0430\u0431\u044B \u043D\u0435 \u0433\u043E\u0440\u0435\ + \u0442\u044C \u0432 \u0433\u0438\u0435\u043D\u0435 \u043E\u0433\u043D\u0435\u043D\ + \u043D\u043E\u0439" + - balance: "\u041C\u0435\u0445 \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435\ + \ \u0442\u0430\u0440\u0430\u043D\u0438\u0442 \u043C\u0435\u0445\u0430 \u0438\ + \ \u043F\u043E\u0434\u043E\u0431\u043D\u044B\u0445 \u0441\u0435\u0431\u0435\ + \ \u043F\u043E \u0440\u043E\u0441\u0442\u0443 \u0441\u0443\u0449\u0435\u0441\ + \u0442\u0432 (\u041A \u043F\u0440\u0438\u043C\u0435\u0440\u0443 \u0413\u0411\ + \u0421\u0430)" diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2380.yml b/html/changelogs/AutoChangeLog-sierra-pr-2380.yml deleted file mode 100644 index 5542276748a55..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2380.yml +++ /dev/null @@ -1,37 +0,0 @@ -author: Shegar -changes: - - {bugfix: 'Влияние на зрение пилота восстановлено, сенсоры и прочее не работали, - мех не мог ослепнуть'} - - {bugfix: Исправлен спрайт огнемёта} - - {bugfix: 'Мех промахнется атакой, если цель отойдёт от меха в замахе'} - - {bugfix: Фонарь больше не перекрывает голову меха} - - {bugfix: Отображение спрайтов теперь не ломается при повороте с юга на север.} - - {bugfix: СМГ меха не рантаймит после стрельбы.} - - {bugfix: Теперь пилота полностью рисует по диогонали} - - {bugfix: Пульсач меха теперь бьёт ровно и по 1 выстрелу.} - - {bugfix: Устранён рантайм возникающий при копировании доступа с ID карт.} - - {bugfix: Устранены рантаймы возникающие при надевании НЕ одежду на голову+} - - {bugfix: Добавлены дополнительные препятствия тому чтоб мех сходу ложил человека - на пол. Мех теперь всегда должен исключительно толкать стоячих людей.} - - {soundadd: 'Звук принятия ID, миниган.'} - - {rscadd: 'Реализована система взаимодействия меха с ID картами. Появилась новая - кнопка в menu меха. Если нажать по ней ID картой, вы сможете или очистить имеющийся - доступ, или записать новый, выбрав из выпадающего листа. После этого, доступ - записывается в память меха. Если ткнуть по активному меху картой и карточка - пройдёт проверку доступа, мех изменит своё состояние - либо откроется если он - закрыт, либо закроется, если он открыт. К этому, появились 3 метода взлома - - емаг ИЛИ мультитул + 4 уровень девайсов (мастер это пятый) ИЛИ мультиметр + - 3 уровень девайсов + 3 уровень электрики.'} - - {rscadd: 'Сильно усложнено обслуживание мехов. Если урон в конечности выше определённого - значения, одной сваркой не обойтись. Вам потребуется лист материала, какой именно - - зависит от самой части, а так же КРАЙНЕ ЖЕЛАТЕЛЕН 2 уровень девайсов и 1 уровень - конструкторства, иначе с огромным шансом, материал вы сливаете. После ремонта, - максимальное ХП конечности уменьшается НАВСЕГДА и единственный метод это исправить - - напечатать новую часть.'} - - {rscadd: 'Сделаны заготовки мехов дедов, Гигакс, Дюранд, Фазон и размещены на - базе дедов.'} - - {balance: 'Резак баффнут, 10 выстрелов вместо 4'} - - {balance: ЭК мех получил осмиум на обшивку дабы не гореть в гиене огненной} - - {balance: Мех больше не таранит меха и подобных себе по росту существ (К примеру - ГБСа)} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2383.yml b/html/changelogs/AutoChangeLog-sierra-pr-2383.yml deleted file mode 100644 index a561a04fdc253..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2383.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: FeudeyTF -changes: - - {bugfix: Пофиксил баг с обновлением интерфейсов некоторых консолей телекоммов} - - {rscadd: 'Вернул в игру возможность управления потоком сообщений, передающихся - по рации'} - - {maptweak: 'Переставил консоли телекоммов, чтобы было удобнее'} -delete-after: true From d4eb61b4b5b8f3a5d165123e722a0476a0d87f16 Mon Sep 17 00:00:00 2001 From: AmShegars <88627712+AmShegars@users.noreply.github.com> Date: Sun, 23 Jun 2024 14:40:54 +0500 Subject: [PATCH 65/80] =?UTF-8?q?=D0=94=D0=BE=D0=BF=20=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=B0=D1=82?= =?UTF-8?q?=D1=87=D0=BA=D0=B0=201.1=20=20(#2386)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/modules/admin/admin_verbs.dm | 3 +++ code/modules/mob/living/carbon/human/human_helpers.dm | 4 ++-- mods/colony_fractions/README.md | 3 ++- mods/colony_fractions/code/admin_button.dm | 2 +- mods/mechs_by_shegar/code/components/arms.dm | 2 ++ mods/mechs_by_shegar/code/components/body.dm | 2 ++ mods/mechs_by_shegar/code/components/head.dm | 2 ++ mods/mechs_by_shegar/code/components/legs.dm | 2 ++ mods/mechs_by_shegar/code/mech.dm | 4 ++++ mods/utility_items/_utility_items.dme | 1 + mods/utility_items/code/living_adv.dm | 9 +++++++++ 11 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 mods/utility_items/code/living_adv.dm diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 395d07e2345e8..f18c343eea407 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -187,6 +187,9 @@ var/global/list/admin_verbs_debug = list( /client/proc/delete_random_map, /datum/admins/proc/map_template_load, /datum/admins/proc/map_template_load_new_z, + //[SIERRA-ADD] - Colony types, + /datum/admins/proc/map_template_choose_colony_type, + //[SIERRA-ADD], /datum/admins/proc/map_template_upload, /client/proc/enable_debug_verbs, /client/proc/callproc, diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 403f86aa6986f..6b0e5ca5b0be9 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -98,9 +98,9 @@ remove_client_color(/datum/client_color/monochrome) remove_client_color(/datum/client_color/nvg) //SIERRA-EDIT (Убивает рантайм, когда с НЕ шлемов пытаются стянуть очки) - // if(hat) + //if(hat) - if (hat && istype(hat, /obj/item/clothing/accessory )) + if (hat && istype(hat, /obj/item/clothing/head )) //SIERRA-EDIT for(var/obj/item/clothing/accessory/glassesmod/mod in hat.accessories) if (mod?.active) diff --git a/mods/colony_fractions/README.md b/mods/colony_fractions/README.md index 78b9f72c85175..bdd0b98f87ae6 100644 --- a/mods/colony_fractions/README.md +++ b/mods/colony_fractions/README.md @@ -70,7 +70,8 @@ ID мода: EXAMPLE ### Авторы: -Shegar +Shegar - основной код +UEDHighCommand - текстовка, помощь с тестами
+

24.06 - 2024

+

Обновления Teteshnik:

+
+
Пофиксил дамаг палки стальной
+
Добавил ресурсы для крафта АБС
+
Добавил нормальные спрайты для снарядов ОФД.
+
Удалил старые спрайты снарядов ОФД
+
Поменял спрайты шлема ОБР
+
+

Обновления Unchi:

+
+
QoL - Исправил одинаковые наименования костюмов и головных уборов охраны(для офицеров, вардена и ГСБ).
+
QoL - Добавил отдельные пункты с выбором головных уборов охраны(security beret/softcap selection) в лодауте. Из-за этого, теперь береты ЧВК под блокировкой на контрактников. Добавил все костюмы охраны НТ в пункт security uniform.
+
Возвращены униформы кадетов.
+
+

Обновления ВашНикнейм:

+
+
Дополнительный контент, добавить который в патч 1.1 я забыл.
+
Добавлены доп препятствия тому чтоб мех сходу топтал людей.
+
+

23.06 - 2024

Обновления FeudeyTF:

diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index a8fed1fb4e9f3..53264a3e1b01f 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -24412,3 +24412,52 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY sierra_genchangelog.p \ \u043F\u043E \u0440\u043E\u0441\u0442\u0443 \u0441\u0443\u0449\u0435\u0441\ \u0442\u0432 (\u041A \u043F\u0440\u0438\u043C\u0435\u0440\u0443 \u0413\u0411\ \u0421\u0430)" +2024-06-24: + Teteshnik: + - bugfix: "\u041F\u043E\u0444\u0438\u043A\u0441\u0438\u043B \u0434\u0430\u043C\u0430\ + \u0433 \u043F\u0430\u043B\u043A\u0438 \u0441\u0442\u0430\u043B\u044C\u043D\u043E\ + \u0439" + - tweak: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0440\u0435\u0441\u0443\u0440\ + \u0441\u044B \u0434\u043B\u044F \u043A\u0440\u0430\u0444\u0442\u0430 \u0410\u0411\ + \u0421" + - imageadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u043D\u043E\u0440\u043C\ + \u0430\u043B\u044C\u043D\u044B\u0435 \u0441\u043F\u0440\u0430\u0439\u0442\u044B\ + \ \u0434\u043B\u044F \u0441\u043D\u0430\u0440\u044F\u0434\u043E\u0432 \u041E\ + \u0424\u0414." + - imagedel: "\u0423\u0434\u0430\u043B\u0438\u043B \u0441\u0442\u0430\u0440\u044B\ + \u0435 \u0441\u043F\u0440\u0430\u0439\u0442\u044B \u0441\u043D\u0430\u0440\u044F\ + \u0434\u043E\u0432 \u041E\u0424\u0414" + - imageadd: "\u041F\u043E\u043C\u0435\u043D\u044F\u043B \u0441\u043F\u0440\u0430\ + \u0439\u0442\u044B \u0448\u043B\u0435\u043C\u0430 \u041E\u0411\u0420" + Unchi: + - bugfix: "QoL - \u0418\u0441\u043F\u0440\u0430\u0432\u0438\u043B \u043E\u0434\u0438\ + \u043D\u0430\u043A\u043E\u0432\u044B\u0435 \u043D\u0430\u0438\u043C\u0435\u043D\ + \u043E\u0432\u0430\u043D\u0438\u044F \u043A\u043E\u0441\u0442\u044E\u043C\u043E\ + \u0432 \u0438 \u0433\u043E\u043B\u043E\u0432\u043D\u044B\u0445 \u0443\u0431\u043E\ + \u0440\u043E\u0432 \u043E\u0445\u0440\u0430\u043D\u044B(\u0434\u043B\u044F \u043E\ + \u0444\u0438\u0446\u0435\u0440\u043E\u0432, \u0432\u0430\u0440\u0434\u0435\u043D\ + \u0430 \u0438 \u0413\u0421\u0411)." + - rscadd: "QoL - \u0414\u043E\u0431\u0430\u0432\u0438\u043B \u043E\u0442\u0434\u0435\ + \u043B\u044C\u043D\u044B\u0435 \u043F\u0443\u043D\u043A\u0442\u044B \u0441 \u0432\ + \u044B\u0431\u043E\u0440\u043E\u043C \u0433\u043E\u043B\u043E\u0432\u043D\u044B\ + \u0445 \u0443\u0431\u043E\u0440\u043E\u0432 \u043E\u0445\u0440\u0430\u043D\u044B\ + (security beret/softcap selection) \u0432 \u043B\u043E\u0434\u0430\u0443\u0442\ + \u0435. \u0418\u0437-\u0437\u0430 \u044D\u0442\u043E\u0433\u043E, \u0442\u0435\ + \u043F\u0435\u0440\u044C \u0431\u0435\u0440\u0435\u0442\u044B \u0427\u0412\u041A\ + \ \u043F\u043E\u0434 \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u043E\ + \u0439 \u043D\u0430 \u043A\u043E\u043D\u0442\u0440\u0430\u043A\u0442\u043D\u0438\ + \u043A\u043E\u0432. \u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0432\u0441\u0435\ + \ \u043A\u043E\u0441\u0442\u044E\u043C\u044B \u043E\u0445\u0440\u0430\u043D\u044B\ + \ \u041D\u0422 \u0432 \u043F\u0443\u043D\u043A\u0442 security uniform." + - rscadd: "\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u044B \u0443\u043D\ + \u0438\u0444\u043E\u0440\u043C\u044B \u043A\u0430\u0434\u0435\u0442\u043E\u0432\ + ." + "\u0412\u0430\u0448\u041D\u0438\u043A\u043D\u0435\u0439\u043C": + - bugfix: "\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\ + \u044B\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442, \u0434\u043E\u0431\u0430\ + \u0432\u0438\u0442\u044C \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0432 \u043F\ + \u0430\u0442\u0447 1.1 \u044F \u0437\u0430\u0431\u044B\u043B." + - bugfix: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u0434\u043E\u043F\ + \ \u043F\u0440\u0435\u043F\u044F\u0442\u0441\u0442\u0432\u0438\u044F \u0442\u043E\ + \u043C\u0443 \u0447\u0442\u043E\u0431 \u043C\u0435\u0445 \u0441\u0445\u043E\u0434\ + \u0443 \u0442\u043E\u043F\u0442\u0430\u043B \u043B\u044E\u0434\u0435\u0439." diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2304.yml b/html/changelogs/AutoChangeLog-sierra-pr-2304.yml deleted file mode 100644 index f344b53a8faae..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2304.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: Unchi -changes: - - {bugfix: 'QoL - Исправил одинаковые наименования костюмов и головных уборов охраны(для - офицеров, вардена и ГСБ).'} - - {rscadd: 'QoL - Добавил отдельные пункты с выбором головных уборов охраны(security - beret/softcap selection) в лодауте. Из-за этого, теперь береты ЧВК под блокировкой - на контрактников. Добавил все костюмы охраны НТ в пункт security uniform.'} - - {rscadd: Возвращены униформы кадетов.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2386.yml b/html/changelogs/AutoChangeLog-sierra-pr-2386.yml deleted file mode 100644 index 7c87698d41146..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2386.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: ВашНикнейм -changes: - - {bugfix: 'Дополнительный контент, добавить который в патч 1.1 я забыл.'} - - {bugfix: Добавлены доп препятствия тому чтоб мех сходу топтал людей.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2387.yml b/html/changelogs/AutoChangeLog-sierra-pr-2387.yml deleted file mode 100644 index f557fa9627e85..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2387.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: Teteshnik -changes: - - {bugfix: Пофиксил дамаг палки стальной} - - {tweak: Добавил ресурсы для крафта АБС} - - {imageadd: Добавил нормальные спрайты для снарядов ОФД.} - - {imagedel: Удалил старые спрайты снарядов ОФД} - - {imageadd: Поменял спрайты шлема ОБР} -delete-after: true From d991536de2cb245dc0806c0098692a8ad26238f8 Mon Sep 17 00:00:00 2001 From: Gold3729 <88734777+Gold3729@users.noreply.github.com> Date: Mon, 24 Jun 2024 09:00:30 +0300 Subject: [PATCH 72/80] QM Bridge access (#2393) --- maps/sierra/job/jobs_cargo.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maps/sierra/job/jobs_cargo.dm b/maps/sierra/job/jobs_cargo.dm index e1d7dddd4cb65..2d70474d2e329 100644 --- a/maps/sierra/job/jobs_cargo.dm +++ b/maps/sierra/job/jobs_cargo.dm @@ -21,7 +21,7 @@ skill_points = 14 - access = list( access_maint_tunnels, access_emergency_storage, access_tech_storage, access_cargo, access_guppy_helm, + access = list( access_maint_tunnels, access_emergency_storage, access_bridge, access_tech_storage, access_cargo, access_guppy_helm, access_cargo_bot, access_qm, access_mailsorting, access_expedition_shuttle, access_guppy, access_hangar, access_mining, access_mining_office, access_mining_station, access_commissary, access_external_airlocks) From c35860b2f5ebe5ada4154b995dbab970b1c6578c Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Mon, 24 Jun 2024 09:01:02 +0300 Subject: [PATCH 73/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2393=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2393.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2393.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2393.yml b/html/changelogs/AutoChangeLog-sierra-pr-2393.yml new file mode 100644 index 0000000000000..6e675b8db00f8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2393.yml @@ -0,0 +1,4 @@ +author: GoldKingNoPing3 +changes: + - {tweak: Добавил доступ на мостик Квартирмейстеру} +delete-after: true From cf3fd292ee6de823fdeb34d377873517b29b0322 Mon Sep 17 00:00:00 2001 From: Neonvolt <83385197+Neonvolt@users.noreply.github.com> Date: Mon, 24 Jun 2024 09:01:51 +0300 Subject: [PATCH 74/80] Fixes docking nav points and some mapping issues (#2392) --- maps/sierra/sierra_overmap.dm | 5 +- maps/sierra/sierra_shuttles.dm | 6 +- maps/sierra/z1-z5_sierra.dmm | 350 ++++++++++++------- mods/_maps/sentinel/code/sentinel_shuttle.dm | 2 +- 4 files changed, 240 insertions(+), 123 deletions(-) diff --git a/maps/sierra/sierra_overmap.dm b/maps/sierra/sierra_overmap.dm index 813c0d3a386a1..bf28e9fcbaef3 100644 --- a/maps/sierra/sierra_overmap.dm +++ b/maps/sierra/sierra_overmap.dm @@ -14,13 +14,14 @@ "Charon" = list("nav_hangar_calypso"), "Guppy" = list("nav_hangar_guppy"), "Crucian" = list("nav_hangar_crucian"), + "Cyclopes" = list("nav_merc_dock"), //maps/antag_spawn/mercenary/mercenary.dm shuttle "Mule" = list("nav_merchant_out"), //../mods/maps/liberia/_map_liberia.dme shuttle, - "Desperado" = list("nav_merc_dock"), //antag_spawn/mercenary/mercenary_inf.dmm shuttle, "Reaper Gunboat" = list("nav_reaper_dock"), //../mods/maps/sentinel/_map_sentinel.dme shuttle, "SNZ Speedboat" = list("nav_snz_dock"), //../../mods/maps/farfleet/_map_farfleet.dme shuttle, "Skrellian Shuttle" = list("nav_deck3_skrellshuttle"), //away/skrellscoutship.dm shuttle, "Skrellian Scout" = list("nav_deck1_skrellscout"), //away/skrellscoutship.dm shuttle, - "SRV Venerable Catfish" = list("nav_deck3_catfish"), //away/verne shuttle, + "Alien Interceptor" = list("nav_deck1_vox_raider"), //maps/antag_spawn/vox/voxraider.dm shuttle, + "Rescue" = list("nav_ert_dock") //maps/antag_spawn/ert/ert.dm shuttle ) initial_generic_waypoints = list( diff --git a/maps/sierra/sierra_shuttles.dm b/maps/sierra/sierra_shuttles.dm index ad45a41240241..f454ecd2295cd 100644 --- a/maps/sierra/sierra_shuttles.dm +++ b/maps/sierra/sierra_shuttles.dm @@ -492,9 +492,9 @@ SIERRA_ESCAPE_POD(11) name = "In transit" landmark_tag = "nav_transit_blueriver" -/obj/shuttle_landmark/sierra/deck3/patrol - name = "Third Deck Starboard Dock" - landmark_tag = "nav_deck3_patrol" +/obj/shuttle_landmark/sierra/deck1/vox_raider + name = "Fourth Deck Starboard Dock" + landmark_tag = "nav_deck1_vox_raider" docking_controller = "admin_shuttle_dock" /obj/shuttle_landmark/sierra/deck3/skrellshuttle diff --git a/maps/sierra/z1-z5_sierra.dmm b/maps/sierra/z1-z5_sierra.dmm index fab0b646df158..12d922c454707 100644 --- a/maps/sierra/z1-z5_sierra.dmm +++ b/maps/sierra/z1-z5_sierra.dmm @@ -203,10 +203,6 @@ pixel_y = 32; control_area = list(/area/turret_protected/ai) }, -/obj/item/device/radio/intercom/locked/ai_private{ - dir = 1; - pixel_y = -22 - }, /obj/item/device/radio/intercom{ dir = 8; pixel_x = 24 @@ -218,6 +214,10 @@ d2 = 8; icon_state = "0-8" }, +/obj/item/device/radio/intercom/locked/ai_private{ + dir = 1; + pixel_y = -29 + }, /turf/simulated/floor/greengrid, /area/turret_protected/ai) "abB" = ( @@ -1393,6 +1393,9 @@ pixel_x = -24; pixel_y = -7 }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, /turf/simulated/floor/carpet/magenta, /area/crew_quarters/cafe) "aks" = ( @@ -11822,6 +11825,9 @@ /obj/machinery/photocopier, /obj/floor_decal/corner/research/mono, /obj/floor_decal/industrial/outline/yellow, +/obj/machinery/newscaster{ + pixel_x = -28 + }, /turf/simulated/floor/tiled/white/monotile, /area/rnd/office) "bLR" = ( @@ -14519,6 +14525,10 @@ dir = 8 }, /obj/floor_decal/industrial/outline/yellow, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, /turf/simulated/floor/tiled, /area/rnd/xenobiology/xenoflora) "chc" = ( @@ -22803,15 +22813,15 @@ /turf/simulated/floor/plating, /area/maintenance/bridgedeck/port) "dqu" = ( -/obj/floor_decal/industrial/outline/yellow, -/obj/structure/railing/mapped{ +/obj/structure/bed/chair/padded/black{ + dir = 4 + }, +/obj/machinery/firealarm{ dir = 1; - icon_state = "railing0-1" + pixel_y = -24 }, -/obj/structure/bed/padded, -/obj/item/bedsheet/blue, -/turf/simulated/floor/tiled/techfloor, -/area/crew_quarters/sleep/cryo/south) +/turf/simulated/floor/tiled/dark, +/area/chapel/main) "dqv" = ( /obj/floor_decal/industrial/hatch/yellow, /obj/machinery/door/airlock/command{ @@ -27243,14 +27253,17 @@ /turf/simulated/floor/carpet, /area/crew_quarters/lounge/upper) "dWr" = ( -/obj/floor_decal/industrial/outline/yellow, -/obj/structure/railing/mapped{ +/obj/floor_decal/corner/paleblue/border{ dir = 8 }, -/obj/structure/bed/padded, -/obj/item/bedsheet/purple, -/turf/simulated/floor/tiled/techfloor, -/area/crew_quarters/sleep/bunk) +/obj/floor_decal/corner/paleblue/border{ + dir = 4 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled/dark/monotile, +/area/medical/infirmreception) "dWt" = ( /obj/structure/flora/pottedplant/decorative, /obj/floor_decal/corner/lime/half{ @@ -30412,10 +30425,6 @@ /turf/simulated/floor/tiled, /area/quartermaster/expedition) "etS" = ( -/obj/structure/closet/toolcloset/excavation{ - locked = 1; - req_access = list("ACCESS_XENOARCH") - }, /obj/floor_decal/borderfloor{ dir = 5 }, @@ -30433,6 +30442,7 @@ dir = 4; pixel_x = 24 }, +/obj/structure/closet/toolcloset/excavation, /turf/simulated/floor/tiled, /area/quartermaster/expedition) "etT" = ( @@ -30488,6 +30498,10 @@ c_tag = "Research - Mech Bay"; dir = 4 }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, /turf/simulated/floor/tiled/steel_grid, /area/assembly/chargebay) "euR" = ( @@ -31694,16 +31708,18 @@ /obj/machinery/door/firedoor{ dir = 8 }, -/obj/machinery/door/airlock/civilian{ - dir = 4; - name = "Crew General Cabin" - }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/machinery/door/airlock/civilian{ + dir = 4; + name = "Cargo & Service General Cabin"; + req_access = list(list("ACCESS_CARGO", "ACCESS_KITCHEN", "ACCESS_JANITOR", "ACCESS_BAR", "ACCESS_SIERRA_CHIEF_STEWARD")); + autoset_access = 0 + }, /turf/simulated/floor/wood/mahogany, /area/crew_quarters/sleep/bunk) "eDJ" = ( @@ -33493,8 +33509,8 @@ /area/hallway/primary/fourthdeck/fore) "eRU" = ( /obj/structure/closet/secure_closet/personal, -/obj/item/device/radio/intercom{ - dir = 8; +/obj/machinery/firealarm{ + dir = 4; pixel_x = 24 }, /turf/simulated/floor/wood/mahogany, @@ -33665,6 +33681,10 @@ /obj/machinery/firealarm{ pixel_y = 24 }, +/obj/structure/sign/directions/supply{ + dir = 8; + pixel_x = -32 + }, /turf/simulated/floor/wood/ebony, /area/crew_quarters/sleep/bunk) "eTg" = ( @@ -45549,6 +45569,9 @@ /obj/floor_decal/techfloor/orange{ dir = 8 }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/rnd/development) "gIy" = ( @@ -50065,7 +50088,7 @@ "hrB" = ( /obj/item/device/radio/intercom/locked/ai_private{ dir = 1; - pixel_y = -22 + pixel_y = -29 }, /turf/simulated/floor/reinforced, /area/turret_protected/ai_maint) @@ -53615,6 +53638,9 @@ dir = 1 }, /obj/machinery/computer/ship/engines, +/obj/machinery/newscaster{ + pixel_y = 32 + }, /turf/simulated/floor/tiled/steel_grid, /area/engineering/engineering_monitoring) "hUE" = ( @@ -57091,14 +57117,12 @@ /turf/simulated/floor/tiled/techfloor, /area/crew_quarters/sleep/cryo/firstdeck) "iwY" = ( -/obj/floor_decal/industrial/outline/yellow, -/obj/structure/railing/mapped{ - dir = 4 +/obj/floor_decal/industrial/outline/grey, +/obj/machinery/firealarm{ + pixel_y = 24 }, -/obj/structure/bed/padded, -/obj/item/bedsheet/orange, -/turf/simulated/floor/tiled/techfloor, -/area/crew_quarters/sleep/bunk) +/turf/simulated/floor/tiled/dark/monotile, +/area/chapel/mortuary) "iwZ" = ( /obj/floor_decal/techfloor/orange, /obj/floor_decal/techfloor/orange{ @@ -57195,6 +57219,9 @@ }, /obj/structure/closet/firecloset, /obj/floor_decal/industrial/outline/yellow, +/obj/machinery/newscaster{ + pixel_x = 28 + }, /turf/simulated/floor/tiled, /area/security/brig) "ixM" = ( @@ -58146,6 +58173,10 @@ }, /turf/simulated/floor/tiled/dark/monotile, /area/bridge/meeting_room) +"iFg" = ( +/obj/shuttle_landmark/sierra/deck1/vox_raider, +/turf/space, +/area/space) "iFo" = ( /obj/floor_decal/techfloor/orange{ dir = 10 @@ -60530,6 +60561,9 @@ /obj/floor_decal/corner/yellow/border{ dir = 6 }, +/obj/machinery/newscaster{ + pixel_x = 28 + }, /turf/simulated/floor/tiled/white, /area/medical/chemistry) "iVf" = ( @@ -61734,10 +61768,6 @@ pixel_y = -6; pixel_x = -5 }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, /turf/simulated/floor/wood/mahogany, /area/crew_quarters/sleep/bunk) "jfu" = ( @@ -62978,6 +63008,9 @@ /obj/floor_decal/spline/fancy/wood{ dir = 8 }, +/obj/machinery/newscaster{ + pixel_x = 28 + }, /turf/simulated/floor/wood/ebony, /area/crew_quarters/sleep/bunk) "jpb" = ( @@ -72129,6 +72162,9 @@ /obj/floor_decal/techfloor{ dir = 4 }, +/obj/machinery/newscaster{ + pixel_x = -28 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/tcommsat/computer) "kHe" = ( @@ -76144,6 +76180,10 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, /turf/simulated/floor/tiled/white, /area/rnd/xenobiology/xenoflora) "lld" = ( @@ -76486,14 +76526,14 @@ /turf/simulated/floor/tiled/dark/monotile, /area/turret_protected/ai) "lnO" = ( -/obj/floor_decal/industrial/outline/yellow, -/obj/structure/railing/mapped{ +/obj/floor_decal/spline/fancy/black{ dir = 4 }, -/obj/structure/bed/padded, -/obj/item/bedsheet/brown, -/turf/simulated/floor/tiled/techfloor, -/area/crew_quarters/sleep/bunk) +/obj/machinery/newscaster{ + pixel_x = 28 + }, +/turf/simulated/floor/grass/cut, +/area/crew_quarters/garden_room) "lnR" = ( /obj/floor_decal/steeldecal/steel_decals4{ dir = 5 @@ -79331,14 +79371,22 @@ /turf/simulated/floor/tiled/dark, /area/hallway/primary/fourthdeck/center) "lIf" = ( -/obj/floor_decal/industrial/outline/yellow, /obj/structure/railing/mapped{ dir = 8 }, -/obj/structure/bed/padded, -/obj/item/bedsheet/red, -/turf/simulated/floor/tiled/techfloor, -/area/crew_quarters/sleep/bunk) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/turf/simulated/floor/tiled/white, +/area/medical/ward) "lIk" = ( /obj/structure/cable/green{ d2 = 4; @@ -83345,6 +83393,9 @@ }, /obj/floor_decal/corner/paleblue/bordercorner2, /obj/floor_decal/corner/paleblue/bordercorner, +/obj/machinery/newscaster{ + pixel_x = 28 + }, /turf/simulated/floor/tiled/white, /area/hallway/infirmary) "mpq" = ( @@ -87965,14 +88016,14 @@ /area/hallway/primary/firstdeck/aft) "mYR" = ( /obj/structure/closet/secure_closet/medical_sierra, -/obj/item/device/radio/intercom/department/medbay{ - dir = 8; - pixel_x = 20 - }, /obj/floor_decal/industrial/outline/yellow, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, +/obj/item/device/radio/intercom/department/medbay{ + dir = 8; + pixel_x = 24 + }, /turf/simulated/floor/tiled/white/monotile, /area/medical/locker) "mYT" = ( @@ -88365,6 +88416,9 @@ /obj/structure/table/glass, /obj/machinery/recharger, /obj/floor_decal/spline/fancy/black, +/obj/machinery/newscaster{ + pixel_y = -28 + }, /turf/simulated/floor/tiled/dark/monotile, /area/bridge) "nbB" = ( @@ -95992,10 +96046,6 @@ c_tag = "AI Core - Aft Port"; dir = 4 }, -/obj/item/device/radio/intercom/locked/ai_private{ - dir = 1; - pixel_y = -22 - }, /obj/structure/cable{ d1 = 1; d2 = 4; @@ -96004,6 +96054,10 @@ /obj/floor_decal/techfloor{ dir = 10 }, +/obj/item/device/radio/intercom/locked/ai_private{ + dir = 1; + pixel_y = -29 + }, /turf/simulated/floor/bluegrid, /area/turret_protected/ai) "okj" = ( @@ -98678,6 +98732,9 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, +/obj/machinery/newscaster{ + pixel_x = 28 + }, /turf/simulated/floor/tiled/white, /area/medical/wardhallway) "oEn" = ( @@ -102923,6 +102980,10 @@ /obj/structure/bed/chair/armchair/black{ dir = 8 }, +/obj/item/device/radio/intercom{ + dir = 1; + pixel_y = -29 + }, /turf/simulated/floor/wood/mahogany, /area/crew_quarters/sleep/bunk) "pjg" = ( @@ -108685,6 +108746,9 @@ /obj/floor_decal/corner/red/border{ dir = 4 }, +/obj/machinery/newscaster{ + pixel_x = 28 + }, /turf/simulated/floor/tiled, /area/crew_quarters/gym) "qbk" = ( @@ -109277,6 +109341,9 @@ /obj/floor_decal/spline/fancy/wood{ dir = 5 }, +/obj/machinery/newscaster{ + pixel_x = 28 + }, /turf/simulated/floor/wood/walnut, /area/crew_quarters/cafe/upper) "qfE" = ( @@ -110904,6 +110971,9 @@ "qsD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/newscaster{ + pixel_x = -28 + }, /turf/simulated/floor/wood/mahogany, /area/crew_quarters/sleep/cryo/south) "qsE" = ( @@ -111327,6 +111397,9 @@ /obj/structure/bed/chair/padded/green{ dir = 4 }, +/obj/machinery/newscaster{ + pixel_y = -28 + }, /turf/simulated/floor/wood/walnut, /area/security/sierra/prison) "qwA" = ( @@ -115125,12 +115198,12 @@ /turf/simulated/floor/plating, /area/maintenance/bridgedeck/starboard) "qZb" = ( +/obj/machinery/hologram/holopad, +/obj/floor_decal/techfloor, /obj/item/device/radio/intercom/locked/ai_private{ dir = 1; - pixel_y = -22 + pixel_y = -29 }, -/obj/machinery/hologram/holopad, -/obj/floor_decal/techfloor, /turf/simulated/floor/bluegrid, /area/turret_protected/ai) "qZf" = ( @@ -116875,6 +116948,10 @@ name = "north bump"; pixel_y = 24 }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, /turf/simulated/floor/tiled/dark, /area/chapel/office) "rlJ" = ( @@ -118526,14 +118603,17 @@ /turf/simulated/floor/plating, /area/exploration_shuttle/power) "rzd" = ( -/obj/floor_decal/industrial/outline/yellow, -/obj/structure/railing/mapped{ - dir = 4 +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/obj/structure/bed/padded, -/obj/item/bedsheet/green, -/turf/simulated/floor/tiled/techfloor, -/area/crew_quarters/sleep/bunk) +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/turf/simulated/floor/carpet, +/area/chapel/main) "rzi" = ( /obj/floor_decal/corner/green/border{ dir = 6 @@ -119341,6 +119421,9 @@ /obj/floor_decal/techfloor{ dir = 4 }, +/obj/machinery/newscaster{ + pixel_x = 28 + }, /turf/simulated/floor/tiled/techfloor, /area/crew_quarters/safe_room/seconddeck) "rFm" = ( @@ -122873,10 +122956,6 @@ pixel_x = -32; pixel_y = -32 }, -/obj/item/device/radio/intercom/locked/ai_private{ - dir = 1; - pixel_y = -22 - }, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -122885,6 +122964,10 @@ /obj/floor_decal/techfloor{ dir = 10 }, +/obj/item/device/radio/intercom/locked/ai_private{ + dir = 1; + pixel_y = -29 + }, /turf/simulated/floor/bluegrid, /area/turret_protected/ai) "sfW" = ( @@ -123402,7 +123485,7 @@ }, /obj/item/device/radio/intercom/locked/ai_private{ dir = 1; - pixel_y = -22 + pixel_y = -29 }, /turf/simulated/floor/reinforced, /area/turret_protected/ai_maint) @@ -124072,6 +124155,15 @@ }, /turf/simulated/floor/tiled/techfloor, /area/medical/backstorage) +"soX" = ( +/obj/structure/cable/yellow{ + d2 = 2; + icon_state = "0-2" + }, +/obj/floor_decal/solarpanel, +/obj/floor_decal/solarpanel, +/turf/simulated/floor/reinforced, +/area/solar/bridge_port) "soZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ @@ -125943,13 +126035,13 @@ c_tag = "AI Core - Fore Port Access"; dir = 8 }, -/obj/item/device/radio/intercom/locked/ai_private{ - dir = 1; - pixel_y = -22 - }, /obj/floor_decal/techfloor{ dir = 6 }, +/obj/item/device/radio/intercom/locked/ai_private{ + dir = 1; + pixel_y = -29 + }, /turf/simulated/floor/bluegrid, /area/turret_protected/ai) "sCB" = ( @@ -126982,6 +127074,10 @@ /obj/structure/bed/sofa/m/teal{ dir = 6 }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, /turf/simulated/floor/tiled/white, /area/medical/wardhallway) "sIK" = ( @@ -129061,15 +129157,14 @@ /turf/simulated/floor/carpet/blue2, /area/crew_quarters/cafe/upper) "sWH" = ( -/obj/machinery/recharger/wallcharger{ - dir = 8; - pixel_x = 22 - }, /obj/structure/cable/green{ d1 = 1; d2 = 8; icon_state = "1-8" }, +/obj/machinery/newscaster{ + pixel_x = 28 + }, /turf/simulated/floor/wood/mahogany, /area/security/range) "sWJ" = ( @@ -132495,6 +132590,10 @@ pixel_y = 9 }, /obj/floor_decal/industrial/outline/yellow, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, /turf/simulated/floor/tiled/white/monotile, /area/medical/maintenance_equipstorage) "tAb" = ( @@ -133867,6 +133966,9 @@ pixel_x = 24; pixel_y = -7 }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, /turf/simulated/floor/carpet/green, /area/crew_quarters/cafe) "tJz" = ( @@ -137751,6 +137853,9 @@ /obj/floor_decal/corner/red{ dir = 4 }, +/obj/machinery/newscaster{ + pixel_x = 28 + }, /turf/simulated/floor/tiled/dark/monotile, /area/crew_quarters/cafe) "upI" = ( @@ -138786,6 +138891,10 @@ /obj/machinery/light/spot{ dir = 4 }, +/obj/item/device/radio/intercom/department/medbay{ + dir = 8; + pixel_x = 24 + }, /turf/simulated/floor/tiled/white, /area/medical/chemistry) "uxx" = ( @@ -139186,6 +139295,9 @@ pixel_y = 15 }, /obj/machinery/atmospherics/unary/vent_pump/on, +/obj/machinery/newscaster{ + pixel_x = -28 + }, /turf/simulated/floor/carpet, /area/crew_quarters/lounge) "uBb" = ( @@ -149573,13 +149685,13 @@ dir = 4; pixel_x = -24 }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -20 - }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, /turf/simulated/floor/tiled/techfloor, /area/holocontrol) "vZQ" = ( @@ -155102,6 +155214,10 @@ c_tag = "Mess Hall - Canteen - Distribution"; dir = 4 }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, /turf/simulated/floor/wood/walnut, /area/crew_quarters/cafe/upper) "wVw" = ( @@ -171319,7 +171435,7 @@ wJN wJN wJN wJN -wJN +nYR wJN wJN wJN @@ -171522,7 +171638,7 @@ wJN wJN wJN wJN -nYR +wJN wJN wJN wJN @@ -174374,7 +174490,7 @@ wJN wJN wJN wJN -qLn +wJN wJN wJN wJN @@ -175780,7 +175896,7 @@ aBk bJA yfy gQz -wJN +qLn wJN wJN wJN @@ -176398,7 +176514,7 @@ wJN wJN wJN wJN -wJN +gCl wJN wJN wJN @@ -178014,7 +178130,7 @@ wJN wJN wJN wJN -gCl +wJN wJN wJN wJN @@ -179368,7 +179484,7 @@ wJN wJN wJN wJN -wJN +iFg wJN wJN wJN @@ -181048,7 +181164,7 @@ wJN wJN wJN wJN -gCl +wJN wJN wJN wJN @@ -182466,7 +182582,7 @@ wJN wJN wJN wJN -wJN +gCl wJN wJN wJN @@ -251308,7 +251424,7 @@ tXe stw stw vZL -cmm +lnO xLM vfK fQy @@ -251318,7 +251434,7 @@ aYv foZ cmm cmm -cmm +lnO sSF stw stw @@ -259817,7 +259933,7 @@ eln xwW miW sqA -dqu +uIO aoE eln hva @@ -260423,7 +260539,7 @@ eln dJd xbx qxX -dqu +uIO uIO eln hva @@ -260613,10 +260729,10 @@ stz cxQ ocE qOv -iwY +irx xGi qQC -iwY +irx eln xjt lOU @@ -260810,10 +260926,10 @@ xZE aYz ccj qOv -rzd +rWy kzL vQv -lnO +ocE qOv hnk oil @@ -263436,15 +263552,15 @@ tTs tpK ccj qOv -lIf +pIX jLN szH -lIf +pIX qOv -dWr +wXk vWL ldT -dWr +wXk nVz yas egL @@ -268269,7 +268385,7 @@ pzZ rjy sGb wPR -wPR +lIf pVH rpI vlt @@ -270505,7 +270621,7 @@ ksk hhE vky kot -kot +rzd tDo uCT uXP @@ -272715,7 +272831,7 @@ kCj kCj tQZ lTZ -vXk +iwY vXk vXk qZo @@ -273132,7 +273248,7 @@ bmG bmG apB bmG -bmG +dqu qVI qVI bXT @@ -309876,7 +309992,7 @@ vPu mxG gnR odS -uVD +dWr uVD uVD enZ @@ -347886,7 +348002,7 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip @@ -348088,7 +348204,7 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip @@ -348290,7 +348406,7 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip @@ -348492,7 +348608,7 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip @@ -348694,7 +348810,7 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip @@ -348896,7 +349012,7 @@ uYw uYw uYw ehW -iOb +soX oOh fJa rip diff --git a/mods/_maps/sentinel/code/sentinel_shuttle.dm b/mods/_maps/sentinel/code/sentinel_shuttle.dm index 88f5ab9d6d98f..e3274c43d2026 100644 --- a/mods/_maps/sentinel/code/sentinel_shuttle.dm +++ b/mods/_maps/sentinel/code/sentinel_shuttle.dm @@ -44,6 +44,6 @@ landmark_tag = "nav_hangar_reaperalt" /obj/shuttle_landmark/reaper/dock - name = "NSV Sierra Dock" + name = "Fourth Deck Fore Dock" landmark_tag = "nav_reaper_dock" docking_controller = "nuke_shuttle_dock_airlock" From 439b173a12a153361a6ef50383041a78188dd20f Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Mon, 24 Jun 2024 09:02:20 +0300 Subject: [PATCH 75/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2392=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2392.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2392.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2392.yml b/html/changelogs/AutoChangeLog-sierra-pr-2392.yml new file mode 100644 index 0000000000000..8d23aa38fc438 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2392.yml @@ -0,0 +1,8 @@ +author: Neonvolt +changes: + - {bugfix: Пофикшен археологический шкаф в комнате подготовки у шахтеров} + - {maptweak: Добавлены дополнительные экраны newscaster и пожарные тревоги} + - {maptweak: 'Шаттлы мерков, хейстеров и воксов-рейдеров теперь правильно стыкуются + к Сьерре'} + - {maptweak: Добавлено требование по доступу в дормы карго/сервиса} +delete-after: true From 16c5faed997a9ba27e3d833f02225b6eac428af7 Mon Sep 17 00:00:00 2001 From: BOT Eeshee <140182364+BOTEeshee@users.noreply.github.com> Date: Mon, 24 Jun 2024 21:06:23 +0300 Subject: [PATCH 76/80] Vault name fix (#2394) --- maps/sierra/z1-z5_sierra.dmm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/maps/sierra/z1-z5_sierra.dmm b/maps/sierra/z1-z5_sierra.dmm index 12d922c454707..e502fd0711449 100644 --- a/maps/sierra/z1-z5_sierra.dmm +++ b/maps/sierra/z1-z5_sierra.dmm @@ -153367,8 +153367,7 @@ /area/tcommsat/computer) "wEU" = ( /obj/machinery/door/airlock/vault/bolted{ - id_tag = "selfddoor"; - name = "Delta Code Chamber Access" + id_tag = "selfddoor" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -153383,7 +153382,7 @@ }, /obj/machinery/button/alternate/door/bolts{ id_tag = "selfddoor"; - name = "Delta Code Airlock Bolt Control"; + name = "Vault Airlock Bolt Control"; pixel_y = -32; req_access = list("ACCESS_VAULT") }, From cc59ca578110e568d570e28c2a513a7a2f55b6f9 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Mon, 24 Jun 2024 21:06:55 +0300 Subject: [PATCH 77/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2394=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2394.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2394.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2394.yml b/html/changelogs/AutoChangeLog-sierra-pr-2394.yml new file mode 100644 index 0000000000000..234f897bbba03 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2394.yml @@ -0,0 +1,4 @@ +author: ВашНикнейм +changes: + - {maptweak: Теперь ОЗА не будет видеть табличку "нюка" на хранилище.} +delete-after: true From 90f36bd84ade5b9d08d41a9ff84e8b4bdb0111a1 Mon Sep 17 00:00:00 2001 From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com> Date: Tue, 25 Jun 2024 01:25:24 +0000 Subject: [PATCH 78/80] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F=D1=86=D0=B8=D1=8F=20=D1=87=D0=B5?= =?UTF-8?q?=D0=B9=D0=BD=D0=B4=D0=B6=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=20[ci=20?= =?UTF-8?q?skip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelog.html | 31 ++++++++++--------- html/changelogs/.all_changelog.yml | 30 ++++++++++++++++++ .../AutoChangeLog-sierra-pr-2392.yml | 8 ----- .../AutoChangeLog-sierra-pr-2393.yml | 4 --- .../AutoChangeLog-sierra-pr-2394.yml | 4 --- 5 files changed, 47 insertions(+), 30 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2392.yml delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2393.yml delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2394.yml diff --git a/html/changelog.html b/html/changelog.html index 2c1a5f64ea528..5c2343f1e37f5 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -28,6 +28,23 @@

Sierra SS13

-->
+

25.06 - 2024

+

Обновления GoldKingNoPing3:

+
+
Добавил доступ на мостик Квартирмейстеру
+
+

Обновления Neonvolt:

+
+
Пофикшен археологический шкаф в комнате подготовки у шахтеров
+
Добавлены дополнительные экраны newscaster и пожарные тревоги
+
Шаттлы мерков, хейстеров и воксов-рейдеров теперь правильно стыкуются к Сьерре
+
Добавлено требование по доступу в дормы карго/сервиса
+
+

Обновления ВашНикнейм:

+
+
Теперь ОЗА не будет видеть табличку "нюка" на хранилище.
+
+

24.06 - 2024

Обновления Teteshnik:

@@ -586,20 +603,6 @@

Обновления UEDHighCommand:

Добавлена поддержка 515 версии бьёнда
Добавлен вайдскрин
- -

23.04 - 2024

-

Обновления Daeberdir, UEDHighCommand:

-
-
Портирована раса резоми с Инфинити
-
-

Обновления UEDHighCommand:

-
-
Добавлены логотипы ЧВК SAARE ([saarelogo]), PCRC ([pcrclogo]), ZPCI ([zpcilogo])
-
Добавлена символика фракций унати - Гегемонии ([hegemonylogo]), Конвента ([conventlogo]), Лиги ([leaguelogo]), Оуэра ([ouerelogo]), Терстенских кланов ([terstenlogo])
-
Новые эмоции унати теперь добавлены и для йоза'унати
-
Перенесена механика ядовитого укуса йоза'унати с Infinity
-
Добавлены расовые спрайты под унати для некоторых предметов из лодаута
-
Icons by Icons8
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 53264a3e1b01f..1ed44c1bb9acb 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -24461,3 +24461,33 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY sierra_genchangelog.p \ \u043F\u0440\u0435\u043F\u044F\u0442\u0441\u0442\u0432\u0438\u044F \u0442\u043E\ \u043C\u0443 \u0447\u0442\u043E\u0431 \u043C\u0435\u0445 \u0441\u0445\u043E\u0434\ \u0443 \u0442\u043E\u043F\u0442\u0430\u043B \u043B\u044E\u0434\u0435\u0439." +2024-06-25: + GoldKingNoPing3: + - tweak: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0434\u043E\u0441\u0442\u0443\ + \u043F \u043D\u0430 \u043C\u043E\u0441\u0442\u0438\u043A \u041A\u0432\u0430\u0440\ + \u0442\u0438\u0440\u043C\u0435\u0439\u0441\u0442\u0435\u0440\u0443" + Neonvolt: + - bugfix: "\u041F\u043E\u0444\u0438\u043A\u0448\u0435\u043D \u0430\u0440\u0445\u0435\ + \u043E\u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0448\u043A\ + \u0430\u0444 \u0432 \u043A\u043E\u043C\u043D\u0430\u0442\u0435 \u043F\u043E\u0434\ + \u0433\u043E\u0442\u043E\u0432\u043A\u0438 \u0443 \u0448\u0430\u0445\u0442\u0435\ + \u0440\u043E\u0432" + - maptweak: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u0434\u043E\ + \u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u044D\ + \u043A\u0440\u0430\u043D\u044B newscaster \u0438 \u043F\u043E\u0436\u0430\u0440\ + \u043D\u044B\u0435 \u0442\u0440\u0435\u0432\u043E\u0433\u0438" + - maptweak: "\u0428\u0430\u0442\u0442\u043B\u044B \u043C\u0435\u0440\u043A\u043E\ + \u0432, \u0445\u0435\u0439\u0441\u0442\u0435\u0440\u043E\u0432 \u0438 \u0432\ + \u043E\u043A\u0441\u043E\u0432-\u0440\u0435\u0439\u0434\u0435\u0440\u043E\u0432\ + \ \u0442\u0435\u043F\u0435\u0440\u044C \u043F\u0440\u0430\u0432\u0438\u043B\u044C\ + \u043D\u043E \u0441\u0442\u044B\u043A\u0443\u044E\u0442\u0441\u044F \u043A \u0421\ + \u044C\u0435\u0440\u0440\u0435" + - maptweak: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u043E \u0442\u0440\ + \u0435\u0431\u043E\u0432\u0430\u043D\u0438\u0435 \u043F\u043E \u0434\u043E\u0441\ + \u0442\u0443\u043F\u0443 \u0432 \u0434\u043E\u0440\u043C\u044B \u043A\u0430\u0440\ + \u0433\u043E/\u0441\u0435\u0440\u0432\u0438\u0441\u0430" + "\u0412\u0430\u0448\u041D\u0438\u043A\u043D\u0435\u0439\u043C": + - maptweak: "\u0422\u0435\u043F\u0435\u0440\u044C \u041E\u0417\u0410 \u043D\u0435\ + \ \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u0435\u0442\u044C \u0442\ + \u0430\u0431\u043B\u0438\u0447\u043A\u0443 \"\u043D\u044E\u043A\u0430\" \u043D\ + \u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435." diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2392.yml b/html/changelogs/AutoChangeLog-sierra-pr-2392.yml deleted file mode 100644 index 8d23aa38fc438..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2392.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: Neonvolt -changes: - - {bugfix: Пофикшен археологический шкаф в комнате подготовки у шахтеров} - - {maptweak: Добавлены дополнительные экраны newscaster и пожарные тревоги} - - {maptweak: 'Шаттлы мерков, хейстеров и воксов-рейдеров теперь правильно стыкуются - к Сьерре'} - - {maptweak: Добавлено требование по доступу в дормы карго/сервиса} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2393.yml b/html/changelogs/AutoChangeLog-sierra-pr-2393.yml deleted file mode 100644 index 6e675b8db00f8..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2393.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: GoldKingNoPing3 -changes: - - {tweak: Добавил доступ на мостик Квартирмейстеру} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2394.yml b/html/changelogs/AutoChangeLog-sierra-pr-2394.yml deleted file mode 100644 index 234f897bbba03..0000000000000 --- a/html/changelogs/AutoChangeLog-sierra-pr-2394.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: ВашНикнейм -changes: - - {maptweak: Теперь ОЗА не будет видеть табличку "нюка" на хранилище.} -delete-after: true From 5a950b0a32a82b0388a97fe42b9006881ede9d81 Mon Sep 17 00:00:00 2001 From: BOT Eeshee <140182364+BOTEeshee@users.noreply.github.com> Date: Wed, 26 Jun 2024 10:56:21 +0300 Subject: [PATCH 79/80] Add CCA patch (#2401) --- mods/tajara/code/clothing/accessories.dm | 15 +++++++++++++-- mods/tajara/icons/obj_accessories.dmi | Bin 3228 -> 3697 bytes mods/tajara/icons/onmob_accessories.dmi | Bin 4955 -> 5043 bytes 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/mods/tajara/code/clothing/accessories.dm b/mods/tajara/code/clothing/accessories.dm index 8a7baaa43acb3..acc25ab58d4a9 100644 --- a/mods/tajara/code/clothing/accessories.dm +++ b/mods/tajara/code/clothing/accessories.dm @@ -217,7 +217,6 @@ icon = 'mods/tajara/icons/under.dmi' item_icons = list(slot_w_uniform_str = 'mods/tajara/icons/onmob_under.dmi') - /obj/item/clothing/accessory/scarf/tajaran name = "tua-tari scarf" desc = "A light and soft scarf, very long and wide. You also may rise it to hide your person..." @@ -310,6 +309,12 @@ desc = "Amulet of Tajara, created from the primordial stone according to their belief, able to protect according to their primitive religion from evil spirits and their servants. The runes on the amulet are etched with acid." icon_state = "taj_amulet_3" +/obj/item/clothing/accessory/armor_tag/cca + name = "CCA armor tag" + icon = 'mods/tajara/icons/obj_accessories.dmi' + accessory_icons = list(slot_tie_str = 'mods/tajara/icons/onmob_accessories.dmi', slot_wear_suit_str = 'mods/tajara/icons/onmob_accessories.dmi') + desc = "An armor tag with the CCA logo on it." + icon_state = "ccatag" /datum/gear/head/zhan_scarf/neck display_name = "(Tajara) Tua-Tari scarf" @@ -361,7 +366,6 @@ display_name = "(Tajara) toeless vintage boots" path = /obj/item/clothing/shoes/taj_old_shoes_cut - /datum/gear/accessory/amulet display_name = "(Tajara) talisman selection" path = /obj/item/clothing/accessory/amulet @@ -369,6 +373,12 @@ sort_category = "Xenowear" flags = GEAR_HAS_TYPE_SELECTION +/datum/gear/accessory/armor_tag_cca + display_name = "(Tajara) CCA armor tag" + path = /obj/item/clothing/accessory/armor_tag/cca + whitelisted = list(SPECIES_TAJARA) + sort_category = "Xenowear" + cost = 1 //Taj clothing. @@ -572,3 +582,4 @@ capes["decorated cape"] = /obj/item/clothing/accessory/shouldercape/officer capes["government cape"] = /obj/item/clothing/accessory/shouldercape/command gear_tweaks += new/datum/gear_tweak/path(capes) + diff --git a/mods/tajara/icons/obj_accessories.dmi b/mods/tajara/icons/obj_accessories.dmi index 0fe689a6f26635b3c89b177c5243303d5b596893..1154efce00d327f01b1cbc0e808f14b12f6d0fe9 100644 GIT binary patch delta 3695 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 N002ovPDHLkV1hwJ1wa4* delta 3222 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 T8- literal 4955 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 Date: Wed, 26 Jun 2024 10:56:54 +0300 Subject: [PATCH 80/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2401=20[ci=20sk?= =?UTF-8?q?ip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/changelogs/AutoChangeLog-sierra-pr-2401.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2401.yml diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2401.yml b/html/changelogs/AutoChangeLog-sierra-pr-2401.yml new file mode 100644 index 0000000000000..00431ff994e10 --- /dev/null +++ b/html/changelogs/AutoChangeLog-sierra-pr-2401.yml @@ -0,0 +1,4 @@ +author: BOT Eeshee +changes: + - {rscadd: Добавила патч КСА для таяра} +delete-after: true