diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index dc93324bff..ae75317255 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -55,9 +55,9 @@ jobs: name: Compile Maps runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Restore BYOND cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/BYOND key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }} @@ -70,7 +70,7 @@ jobs: run_all_tests: if: "!contains(github.event.head_commit.message, '[ci skip]')" name: Integration Tests - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 services: mysql: image: mysql:latest @@ -80,14 +80,14 @@ jobs: - 3306 options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Restore BYOND cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/BYOND key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }} - name: Restore Yarn cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: tgui/.yarn/cache key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }} @@ -104,9 +104,6 @@ jobs: mysql -u root -proot tg_ci_prefixed < SQL/tgstation_schema_prefixed.sql - name: Install rust-g run: | - sudo dpkg --add-architecture i386 - sudo apt update || true - sudo apt install -o APT::Immediate-Configure=false libssl1.1:i386 bash tools/ci/install_rust_g.sh - name: Install auxmos run: | @@ -124,9 +121,9 @@ jobs: name: Windows Build runs-on: windows-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Restore Yarn cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: tgui/.yarn/cache key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }} @@ -143,7 +140,7 @@ jobs: md deploy bash tools/deploy.sh ./deploy - name: Deploy artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: deploy path: deploy diff --git a/.github/workflows/generate_documentation.yml b/.github/workflows/generate_documentation.yml index 39d956277f..3f3603538a 100644 --- a/.github/workflows/generate_documentation.yml +++ b/.github/workflows/generate_documentation.yml @@ -8,9 +8,9 @@ jobs: if: "!contains(github.event.head_commit.message, '[ci skip]')" runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Setup cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/SpacemanDMM key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }} diff --git a/.github/workflows/update_tgs_dmapi.yml b/.github/workflows/update_tgs_dmapi.yml index c68b21b0bd..53eaf69316 100644 --- a/.github/workflows/update_tgs_dmapi.yml +++ b/.github/workflows/update_tgs_dmapi.yml @@ -11,7 +11,7 @@ jobs: name: Update the TGS DMAPI steps: - name: Clone - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Branch run: | diff --git a/.tgs.yml b/.tgs.yml index 22a65f0edc..66dc698137 100644 --- a/.tgs.yml +++ b/.tgs.yml @@ -3,7 +3,7 @@ version: 1 # The BYOND version to use (kept in sync with dependencies.sh by the "TGS Test Suite" CI job) # Must be interpreted as a string, keep quoted -byond: "514.1556" +byond: "514.1589" # Folders to create in "/Configuration/GameStaticFiles/" static_files: # Config directory should be static @@ -18,6 +18,6 @@ linux_scripts: PreCompile.sh: tools/tgs4_scripts/PreCompile.sh # Same as above for Windows hosted servers windows_scripts: - PreCompile.bat: tools/tgs_scripts/PreCompile.bat + PreCompile.bat: tools/tgs4_scripts/PreCompile.bat # The security level the game should be run at security: Trusted diff --git a/_maps/RandomRuins/SpaceRuins/DJstation.dmm b/_maps/RandomRuins/SpaceRuins/DJstation.dmm index 7cbee23c98..16cfb6a9e4 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation.dmm @@ -372,6 +372,10 @@ /obj/structure/disposaloutlet, /turf/open/floor/plating/airless, /area/space/nearstation) +"nZ" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall, +/area/ruin/space/djstation) "Co" = ( /obj/machinery/door/airlock/external{ name = "Ruskie DJ Station" @@ -551,7 +555,7 @@ aw aw aw aw -af +nZ af af aa diff --git a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm index c446f3c652..601e3c4795 100644 --- a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm +++ b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm @@ -4567,6 +4567,10 @@ icon_state = "damaged2" }, /area/ruin/space/derelict/singularity_engine) +"Yy" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall, +/area/ruin/space/derelict/hallway/primary) "ZB" = ( /obj/structure/lattice, /turf/template_noop, @@ -11294,7 +11298,7 @@ cs fZ fZ fZ -fZ +Yy fZ hD gL diff --git a/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm b/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm index 1681cf1e55..ddfebf4855 100644 --- a/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm +++ b/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm @@ -132,6 +132,10 @@ }, /turf/open/floor/plating/airless, /area/ruin/space/abandoned_tele) +"R" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall/r_wall, +/area/ruin/space/abandoned_tele) (1,1,1) = {" a @@ -306,7 +310,7 @@ a a b b -b +R b b a diff --git a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm index c6ce7bc4ec..701eec926a 100644 --- a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm +++ b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm @@ -839,6 +839,10 @@ "bX" = ( /turf/open/floor/plating/airless, /area/ruin/space/has_grav/abandonedzoo) +"kJ" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/abandonedzoo) "lo" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -993,7 +997,7 @@ aa at at aF -at +kJ aU ay ay diff --git a/_maps/RandomRuins/SpaceRuins/advancedlab.dmm b/_maps/RandomRuins/SpaceRuins/advancedlab.dmm index c12458ed16..87f9d0b9af 100644 --- a/_maps/RandomRuins/SpaceRuins/advancedlab.dmm +++ b/_maps/RandomRuins/SpaceRuins/advancedlab.dmm @@ -279,6 +279,10 @@ }, /turf/open/floor/wood, /area/ruin/space/has_grav/powered/advancedlab) +"W" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall, +/area/ruin/space/has_grav/powered/advancedlab) (1,1,1) = {" a @@ -448,7 +452,7 @@ f f f f -b +W b b b diff --git a/_maps/RandomRuins/SpaceRuins/arcade.dmm b/_maps/RandomRuins/SpaceRuins/arcade.dmm index c68d3b224e..ba77d05e8c 100644 --- a/_maps/RandomRuins/SpaceRuins/arcade.dmm +++ b/_maps/RandomRuins/SpaceRuins/arcade.dmm @@ -158,6 +158,10 @@ /obj/item/gun/energy/pumpaction/toy, /turf/open/floor/engine, /area/ruin/powered) +"P" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall/mineral/titanium/survival/pod, +/area/ruin/powered) (1,1,1) = {" a @@ -430,7 +434,7 @@ b c c c -d +P f l r diff --git a/_maps/RandomRuins/SpaceRuins/augmentationfacility.dmm b/_maps/RandomRuins/SpaceRuins/augmentationfacility.dmm index 2a25a3b6e7..d37a2a9e44 100644 --- a/_maps/RandomRuins/SpaceRuins/augmentationfacility.dmm +++ b/_maps/RandomRuins/SpaceRuins/augmentationfacility.dmm @@ -288,6 +288,10 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plasteel, /area/ruin/powered) +"Y" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall/r_wall/rust, +/area/ruin/powered) (1,1,1) = {" a @@ -492,7 +496,7 @@ a b c c -d +Y i p s diff --git a/_maps/RandomRuins/SpaceRuins/bigape.dmm b/_maps/RandomRuins/SpaceRuins/bigape.dmm index 93583e8ebf..a4301aaeec 100644 --- a/_maps/RandomRuins/SpaceRuins/bigape.dmm +++ b/_maps/RandomRuins/SpaceRuins/bigape.dmm @@ -71,6 +71,11 @@ /obj/item/grown/bananapeel, /turf/open/floor/plating/beach/sand, /area/ruin/powered) +"J" = ( +/obj/structure/fans/tiny/invisible, +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered) (1,1,1) = {" a @@ -102,7 +107,7 @@ a b b g -d +J d b b diff --git a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm index b78380e642..13e6fe7173 100644 --- a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm +++ b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm @@ -1894,6 +1894,10 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/derelictoutpost) +"Cx" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall, +/area/ruin/space/has_grav/derelictoutpost/cargostorage) "CH" = ( /obj/structure/alien/weeds{ color = "#4BAE56"; @@ -2877,7 +2881,7 @@ nD ab rY cm -dL +Cx eb dW es diff --git a/_maps/RandomRuins/SpaceRuins/bus.dmm b/_maps/RandomRuins/SpaceRuins/bus.dmm index 2f5c14191b..4924c3ea3e 100644 --- a/_maps/RandomRuins/SpaceRuins/bus.dmm +++ b/_maps/RandomRuins/SpaceRuins/bus.dmm @@ -334,6 +334,10 @@ /obj/item/stack/sheet/metal/fifty, /turf/open/floor/plating/asteroid/airless, /area/ruin/unpowered/no_grav) +"uJ" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/mineral/ash_rock, +/area/ruin/unpowered/no_grav) "XA" = ( /obj/structure/fluff/bus/passable/seat{ icon_state = "backseat" @@ -549,7 +553,7 @@ aa ab ab ab -ab +uJ ab ab ad diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm index 0dd669aafc..9e73cb13c4 100644 --- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm +++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm @@ -1325,6 +1325,10 @@ }, /turf/open/floor/plating/airless, /area/shuttle/caravan/freighter2) +"IG" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/mineral/random, +/area/ruin/unpowered) (1,1,1) = {" aa @@ -5236,7 +5240,7 @@ aa bt bt bt -bt +IG bt aa aa diff --git a/_maps/RandomRuins/SpaceRuins/clericden.dmm b/_maps/RandomRuins/SpaceRuins/clericden.dmm index 7e75689ac6..4d2ddf5bba 100644 --- a/_maps/RandomRuins/SpaceRuins/clericden.dmm +++ b/_maps/RandomRuins/SpaceRuins/clericden.dmm @@ -196,6 +196,10 @@ /obj/item/paper/fluff/ruins/clericsden/warning, /turf/open/floor/plating/asteroid/airless, /area/ruin/unpowered/no_grav) +"W" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall, +/area/ruin/unpowered/no_grav) (1,1,1) = {" a @@ -423,7 +427,7 @@ a e e d -d +W e O d diff --git a/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm b/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm index e9167a6a25..fb6291a9fe 100644 --- a/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm +++ b/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm @@ -339,6 +339,10 @@ "V" = ( /turf/closed/wall/r_wall/rust, /area/space/nearstation) +"Z" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall/r_wall/rust, +/area/ruin/space/has_grav/powered/ancient_shuttle) (1,1,1) = {" a @@ -432,7 +436,7 @@ a a a d -d +Z H b b diff --git a/_maps/RandomRuins/SpaceRuins/crashedclownship.dmm b/_maps/RandomRuins/SpaceRuins/crashedclownship.dmm index 3adef24b4e..f1a84270b5 100644 --- a/_maps/RandomRuins/SpaceRuins/crashedclownship.dmm +++ b/_maps/RandomRuins/SpaceRuins/crashedclownship.dmm @@ -157,6 +157,10 @@ /obj/item/shovel, /turf/open/floor/mineral/bananium/airless, /area/ruin/unpowered) +"I" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/mineral/random, +/area/ruin/unpowered/no_grav) (1,1,1) = {" a @@ -413,7 +417,7 @@ b c b b -b +I b b b diff --git a/_maps/RandomRuins/SpaceRuins/crashedship.dmm b/_maps/RandomRuins/SpaceRuins/crashedship.dmm index c0e0d1e0b0..a4d4265acc 100644 --- a/_maps/RandomRuins/SpaceRuins/crashedship.dmm +++ b/_maps/RandomRuins/SpaceRuins/crashedship.dmm @@ -2456,6 +2456,10 @@ /obj/structure/lattice, /turf/template_noop, /area/awaymission/BMPship/Midship) +"RA" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/mineral/random, +/area/awaymission/BMPship) (1,1,1) = {" aa @@ -3661,7 +3665,7 @@ ce ce aq gb -gb +RA gb gb gb diff --git a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm index ea821570bd..6161296f2a 100644 --- a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm @@ -3314,6 +3314,10 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/crusher) +"Qz" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall/mineral/iron, +/area/ruin/space/has_grav/deepstorage/kitchen) (1,1,1) = {" aa @@ -4582,7 +4586,7 @@ aN bb bw bM -af +Qz cq cM cX diff --git a/_maps/RandomRuins/SpaceRuins/derelict1.dmm b/_maps/RandomRuins/SpaceRuins/derelict1.dmm index 123f49eff7..de91e02c0f 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict1.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict1.dmm @@ -87,6 +87,10 @@ /obj/item/organ/alien/plasmavessel/small, /turf/open/floor/plating/airless, /area/ruin/unpowered) +"O" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall, +/area/ruin/unpowered) (1,1,1) = {" a @@ -873,7 +877,7 @@ c c f n -c +O c c q diff --git a/_maps/RandomRuins/SpaceRuins/derelict2.dmm b/_maps/RandomRuins/SpaceRuins/derelict2.dmm index 61c0913ac6..24402a3d0e 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict2.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict2.dmm @@ -113,6 +113,10 @@ /obj/machinery/light/small, /turf/open/floor/plasteel, /area/ruin/space/has_grav/powered/dinner_for_two) +"I" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall, +/area/ruin/space/has_grav/powered/dinner_for_two) (1,1,1) = {" a @@ -329,7 +333,7 @@ a a a a -f +I j i i diff --git a/_maps/RandomRuins/SpaceRuins/derelict3.dmm b/_maps/RandomRuins/SpaceRuins/derelict3.dmm index 37b726dc75..467d146bca 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict3.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict3.dmm @@ -17,6 +17,10 @@ /obj/structure/lattice, /turf/template_noop, /area/space/nearstation) +"A" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall, +/area/ruin/unpowered/no_grav) (1,1,1) = {" a @@ -930,7 +934,7 @@ b b b c -c +A c c b diff --git a/_maps/RandomRuins/SpaceRuins/derelict4.dmm b/_maps/RandomRuins/SpaceRuins/derelict4.dmm index 5aeb872327..02d1192d59 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict4.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict4.dmm @@ -89,6 +89,10 @@ /obj/structure/girder, /turf/open/floor/plating/airless, /area/ruin/unpowered) +"S" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/mineral, +/area/ruin/unpowered) (1,1,1) = {" a @@ -517,7 +521,7 @@ b b b b -b +S b b d diff --git a/_maps/RandomRuins/SpaceRuins/derelict5.dmm b/_maps/RandomRuins/SpaceRuins/derelict5.dmm index 93486d1056..37a27970d1 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict5.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict5.dmm @@ -72,6 +72,10 @@ /obj/machinery/door/airlock/external, /turf/open/floor/plating, /area/ruin/unpowered) +"V" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall, +/area/ruin/unpowered) (1,1,1) = {" a @@ -769,7 +773,7 @@ j f f e -e +V p l e diff --git a/_maps/RandomRuins/SpaceRuins/derelict6.dmm b/_maps/RandomRuins/SpaceRuins/derelict6.dmm index 0a53b517d6..b947251f8a 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict6.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict6.dmm @@ -516,6 +516,10 @@ }, /turf/template_noop, /area/ruin/unpowered) +"BF" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall, +/area/ruin/unpowered) (1,1,1) = {" aa @@ -803,7 +807,7 @@ ag ag ag ag -ai +BF ai aS aW diff --git a/_maps/RandomRuins/SpaceRuins/emptyshell.dmm b/_maps/RandomRuins/SpaceRuins/emptyshell.dmm index 7cbaa3a0b6..1e8646351c 100644 --- a/_maps/RandomRuins/SpaceRuins/emptyshell.dmm +++ b/_maps/RandomRuins/SpaceRuins/emptyshell.dmm @@ -57,6 +57,10 @@ /obj/structure/lattice, /turf/template_noop, /area/space/nearstation) +"V" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall/r_wall, +/area/ruin/unpowered) (1,1,1) = {" a @@ -215,7 +219,7 @@ a b a c -c +V d d d diff --git a/_maps/RandomRuins/SpaceRuins/gasthelizards.dmm b/_maps/RandomRuins/SpaceRuins/gasthelizards.dmm index b82f89d087..04745fa56b 100644 --- a/_maps/RandomRuins/SpaceRuins/gasthelizards.dmm +++ b/_maps/RandomRuins/SpaceRuins/gasthelizards.dmm @@ -364,6 +364,10 @@ "W" = ( /turf/open/floor/plating, /area/ruin/space/has_grav/gasthelizard) +"Y" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall, +/area/ruin/space/has_grav/gasthelizard) "Z" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -584,7 +588,7 @@ a a b c -c +Y c c c diff --git a/_maps/RandomRuins/SpaceRuins/gondolaasteroid.dmm b/_maps/RandomRuins/SpaceRuins/gondolaasteroid.dmm index ab5086e534..b0fb9c22c2 100644 --- a/_maps/RandomRuins/SpaceRuins/gondolaasteroid.dmm +++ b/_maps/RandomRuins/SpaceRuins/gondolaasteroid.dmm @@ -82,6 +82,10 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating/asteroid/airless, /area/ruin/space/has_grav) +"L" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/mineral/random, +/area/ruin/space/has_grav) "T" = ( /obj/machinery/door/airlock/survival_pod/glass{ dir = 4 @@ -622,7 +626,7 @@ b b b b -b +L b b b diff --git a/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm b/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm index d8677f11d8..31fbf7bbe2 100644 --- a/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm +++ b/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm @@ -201,6 +201,10 @@ initial_gas_mix = "TEMP=2.7" }, /area/ruin/unpowered/no_grav) +"S" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall/r_wall/rust, +/area/ruin/space/has_grav/hilbertresearchfacility) "U" = ( /turf/open/floor/plasteel/stairs/medium{ initial_gas_mix = "TEMP=2.7" @@ -357,7 +361,7 @@ a a b c -c +S c c c diff --git a/_maps/RandomRuins/SpaceRuins/intactemptyship.dmm b/_maps/RandomRuins/SpaceRuins/intactemptyship.dmm index 9bb394663a..dbab0e2984 100644 --- a/_maps/RandomRuins/SpaceRuins/intactemptyship.dmm +++ b/_maps/RandomRuins/SpaceRuins/intactemptyship.dmm @@ -145,6 +145,10 @@ /obj/structure/bed, /turf/open/floor/mineral/titanium/purple, /area/ruin/space/has_grav/powered/authorship) +"X" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall/mineral/plastitanium, +/area/ruin/space/has_grav/powered/authorship) (1,1,1) = {" a @@ -193,7 +197,7 @@ c p t p -c +X A n c diff --git a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm index a4d5564ca3..945c3cf88d 100644 --- a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm @@ -2098,6 +2098,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 6 }, +/obj/machinery/spaceship_navigation_beacon/invion, /turf/closed/wall, /area/ruin/space/has_grav/listeningstation) "RA" = ( diff --git a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm index dbe8722b83..11d7646000 100644 --- a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm +++ b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm @@ -59,6 +59,10 @@ }, /turf/open/floor/mineral/titanium/blue, /area/ruin/space/has_grav/powered/mechtransport) +"o" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall/mineral/titanium, +/area/ruin/space/has_grav/powered/mechtransport) "p" = ( /obj/machinery/door/airlock/hatch{ name = "Cockpit"; @@ -320,7 +324,7 @@ X b d d -d +o u A y diff --git a/_maps/RandomRuins/SpaceRuins/miracle.dmm b/_maps/RandomRuins/SpaceRuins/miracle.dmm index ba22f46236..8a77885868 100644 --- a/_maps/RandomRuins/SpaceRuins/miracle.dmm +++ b/_maps/RandomRuins/SpaceRuins/miracle.dmm @@ -1,6 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( /obj/item/storage/backpack/satchel/flat/secret/miracle_ruin, +/obj/machinery/spaceship_navigation_beacon/invion, /turf/open/floor/fakespace{ initial_gas_mix = "TEMP=2.7" }, diff --git a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm index 9ac2fed86f..3465f024ea 100644 --- a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm +++ b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm @@ -928,6 +928,10 @@ /obj/item/organ/tail/cat, /turf/open/floor/plasteel/freezer, /area/ruin/space/has_grav/powered/cat_man) +"qI" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall, +/area/ruin/space/has_grav/powered/cat_man) "Bl" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -1690,7 +1694,7 @@ aa aa ab ab -ad +qI ad ad ad diff --git a/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm b/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm index f54cf1b062..9079cc3cb5 100644 --- a/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm @@ -905,6 +905,10 @@ /obj/machinery/teleport/hub, /turf/open/floor/plating, /area/tcommsat/chamber) +"iO" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall/r_wall, +/area/tcommsat/chamber) (1,1,1) = {" aa @@ -3061,7 +3065,7 @@ ag ag ag ag -ag +iO aT bc bs diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index f2c7d6c59b..60f947be89 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -5057,6 +5057,10 @@ }, /turf/open/floor/plasteel/white, /area/ruin/space/has_grav/ancientstation) +"TY" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/template_noop, +/area/template_noop) "Un" = ( /obj/structure/cable{ icon_state = "4-8" @@ -7907,7 +7911,7 @@ cX bD aa aa -aa +TY bD fQ gI diff --git a/_maps/RandomRuins/SpaceRuins/oldteleporter.dmm b/_maps/RandomRuins/SpaceRuins/oldteleporter.dmm index 0ff8aaf97d..5b4568d4ce 100644 --- a/_maps/RandomRuins/SpaceRuins/oldteleporter.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldteleporter.dmm @@ -68,6 +68,10 @@ }, /turf/open/floor/plasteel/airless, /area/ruin/space/oldteleporter) +"o" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall/r_wall, +/area/ruin/space/oldteleporter) (1,1,1) = {" a @@ -146,7 +150,7 @@ a b b d -d +o g e l diff --git a/_maps/RandomRuins/SpaceRuins/onehalf.dmm b/_maps/RandomRuins/SpaceRuins/onehalf.dmm index 42185f116b..39f1215a0a 100644 --- a/_maps/RandomRuins/SpaceRuins/onehalf.dmm +++ b/_maps/RandomRuins/SpaceRuins/onehalf.dmm @@ -1209,6 +1209,10 @@ }, /turf/template_noop, /area/template_noop) +"Cu" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall, +/area/ruin/space/has_grav/onehalf/drone_bay) "Ky" = ( /turf/template_noop, /area/space/nearstation) @@ -1774,7 +1778,7 @@ aa aa ar ar -ar +Cu bs bH ar diff --git a/_maps/RandomRuins/SpaceRuins/originalcontent.dmm b/_maps/RandomRuins/SpaceRuins/originalcontent.dmm index 2945a06b25..e406573177 100644 --- a/_maps/RandomRuins/SpaceRuins/originalcontent.dmm +++ b/_maps/RandomRuins/SpaceRuins/originalcontent.dmm @@ -913,6 +913,10 @@ }, /turf/open/indestructible/paper, /area/ruin/powered) +"Mh" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/open/indestructible/paper, +/area/ruin/powered) "Ns" = ( /obj/item/paper/secretrecipe, /turf/open/indestructible/paper, @@ -1561,7 +1565,7 @@ af af af af -af +Mh af af al diff --git a/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm b/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm index 347d0a093f..163eb253a1 100644 --- a/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm +++ b/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm @@ -95,6 +95,10 @@ /obj/structure/shuttle/engine/propulsion/burst, /turf/template_noop, /area/ruin/powered) +"M" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/indestructible/oldshuttle, +/area/ruin/powered) (1,1,1) = {" a @@ -322,7 +326,7 @@ a a e c -c +M c c c diff --git a/_maps/RandomRuins/SpaceRuins/skelter.dmm b/_maps/RandomRuins/SpaceRuins/skelter.dmm index 694d093eeb..47824eec63 100644 --- a/_maps/RandomRuins/SpaceRuins/skelter.dmm +++ b/_maps/RandomRuins/SpaceRuins/skelter.dmm @@ -4193,6 +4193,10 @@ }, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/skelter/sec) +"GU" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall/mineral/titanium, +/area/ruin/space/has_grav/skelter) "JR" = ( /obj/effect/turf_decal/weather, /turf/open/floor/plating/airless{ @@ -4492,7 +4496,7 @@ hu hS ip gg -ae +GU ae ae ah diff --git a/_maps/RandomRuins/SpaceRuins/spacediner.dmm b/_maps/RandomRuins/SpaceRuins/spacediner.dmm index 755e5531bb..7e6c7ac218 100644 --- a/_maps/RandomRuins/SpaceRuins/spacediner.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacediner.dmm @@ -842,6 +842,7 @@ /area/ruin/space/diner/interior) "cl" = ( /obj/structure/grille/broken, +/obj/machinery/spaceship_navigation_beacon/invion, /turf/open/floor/plating, /area/ruin/space/diner/interior) "cm" = ( diff --git a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm index a2c7b18966..80e98cad2d 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm @@ -383,6 +383,10 @@ }, /turf/open/floor/plating/asteroid, /area/ruin/powered) +"sU" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/mineral/random, +/area/ruin/powered) "wU" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/effect/turf_decal/bot, @@ -1020,7 +1024,7 @@ aZ aZ bb bb -bb +sU af aq af diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm index 43aaaf835b..ddf26ff433 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm @@ -5017,6 +5017,10 @@ /obj/structure/pool/Lboard, /turf/open/pool, /area/ruin/space/has_grav/hotel/pool) +"pV" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall, +/area/ruin/space/has_grav/hotel/guestroom/room_4) "sN" = ( /obj/machinery/door/airlock/external/glass, /obj/structure/cable/yellow{ @@ -7313,7 +7317,7 @@ aa ab ac ag -ap +pV ap ap ap diff --git a/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm b/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm index aa5126fb65..570b3cfb6b 100644 --- a/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm +++ b/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm @@ -368,6 +368,10 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/turretedoutpost) +"pa" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/turretedoutpost) "tK" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -597,7 +601,7 @@ ac ac ac ac -ad +pa ad aI aI diff --git a/_maps/RandomRuins/SpaceRuins/vaporwave.dmm b/_maps/RandomRuins/SpaceRuins/vaporwave.dmm index a1b2271d96..c7a5c336e3 100644 --- a/_maps/RandomRuins/SpaceRuins/vaporwave.dmm +++ b/_maps/RandomRuins/SpaceRuins/vaporwave.dmm @@ -208,6 +208,10 @@ /obj/machinery/light/small, /turf/open/floor/plasteel/vaporwave, /area/ruin/space/has_grav/powered/aesthetic) +"Q" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall, +/area/ruin/space/has_grav/powered/aesthetic) "R" = ( /obj/machinery/light/small{ dir = 1 @@ -461,7 +465,7 @@ a a d d -f +Q f g f diff --git a/_maps/RandomRuins/SpaceRuins/way_home.dmm b/_maps/RandomRuins/SpaceRuins/way_home.dmm index ed455736c2..bcc73edc13 100644 --- a/_maps/RandomRuins/SpaceRuins/way_home.dmm +++ b/_maps/RandomRuins/SpaceRuins/way_home.dmm @@ -12,6 +12,10 @@ /obj/structure/signpost/salvation, /turf/open/floor/plating/asteroid/airless, /area/ruin/space/way_home) +"S" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/mineral/random, +/area/ruin/space/way_home) (1,1,1) = {" a @@ -266,7 +270,7 @@ b b b b -b +S b b c diff --git a/_maps/RandomRuins/SpaceRuins/whiteshipdock.dmm b/_maps/RandomRuins/SpaceRuins/whiteshipdock.dmm index ca0a4b55aa..7c7bc27fe8 100644 --- a/_maps/RandomRuins/SpaceRuins/whiteshipdock.dmm +++ b/_maps/RandomRuins/SpaceRuins/whiteshipdock.dmm @@ -6,6 +6,10 @@ /obj/docking_port/stationary/picked/whiteship, /turf/open/space, /area/space) +"Z" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/open/space/basic, +/area/space) (1,1,1) = {" a @@ -29,7 +33,7 @@ a a a a -a +Z "} (2,1,1) = {" a diff --git a/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm b/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm index 873d805a03..378e0f0aaa 100644 --- a/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm +++ b/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm @@ -1,74 +1,62 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"b" = ( -/turf/closed/wall/mineral/titanium, -/area/ruin/space/has_grav/whiteship/box) -"c" = ( +"ak" = ( +/obj/machinery/door/airlock/titanium, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"d" = ( +"bG" = ( +/obj/machinery/door/window/northright, +/obj/effect/decal/remains/human, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/space/has_grav/whiteship/box) +"ei" = ( +/turf/closed/wall/mineral/titanium, +/area/ruin/space/has_grav/whiteship/box) +"ej" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/ruin/space/has_grav/whiteship/box) +"fa" = ( +/obj/item/multitool, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"he" = ( +/obj/structure/shuttle/engine/propulsion/right{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/ruin/space/has_grav/whiteship/box) +"jN" = ( /obj/structure/shuttle/engine/propulsion/left{ dir = 8 }, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/whiteship/box) -"e" = ( -/obj/structure/table, -/obj/item/radio/off, -/turf/open/floor/mineral/titanium/white, -/area/ruin/space/has_grav/whiteship/box) -"f" = ( -/obj/structure/table, -/obj/item/screwdriver, -/obj/structure/light_construct{ - dir = 1 - }, -/turf/open/floor/mineral/titanium/white, -/area/ruin/space/has_grav/whiteship/box) -"g" = ( -/obj/machinery/computer/pod{ - dir = 8; - id = "oldship_ruin_gun" - }, -/turf/open/floor/mineral/titanium/white, -/area/ruin/space/has_grav/whiteship/box) -"h" = ( +"lC" = ( /obj/structure/shuttle/engine/propulsion{ dir = 8 }, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/whiteship/box) -"i" = ( -/obj/structure/shuttle/engine/heater{ +"oG" = ( +/obj/structure/frame/computer{ + anchored = 1; dir = 8 }, -/obj/structure/window/reinforced{ +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"ps" = ( +/obj/structure/chair{ dir = 4 }, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/whiteship/box) -"j" = ( -/turf/closed/wall/mineral/titanium/interior, -/area/ruin/space/has_grav/whiteship/box) -"k" = ( -/obj/structure/rack, -/obj/item/clothing/suit/space/hardsuit/medical, -/obj/item/clothing/mask/breath, +/obj/effect/decal/remains/human, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"l" = ( -/turf/open/floor/plating, -/area/ruin/space/has_grav/whiteship/box) -"m" = ( -/obj/item/stock_parts/cell{ - charge = 100; - maxcharge = 15000 - }, +"qi" = ( +/obj/structure/table, +/obj/item/gun/energy/laser/retro, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"n" = ( +"qF" = ( /obj/structure/rack, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/emergency_oxygen, @@ -77,94 +65,164 @@ /obj/item/storage/toolbox/mechanical, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"o" = ( -/obj/machinery/door/airlock/public/glass, +"qS" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"rh" = ( +/obj/structure/light_construct/small, /turf/open/floor/plating, /area/ruin/space/has_grav/whiteship/box) -"p" = ( -/obj/machinery/mass_driver{ - dir = 4; - icon_state = "mass_driver"; - id = "oldship_ruin_gun" +"rn" = ( +/obj/structure/light_construct/small{ + dir = 1 }, /turf/open/floor/plating, /area/ruin/space/has_grav/whiteship/box) -"q" = ( +"ry" = ( +/obj/structure/table, +/obj/item/screwdriver, +/obj/structure/light_construct{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"sW" = ( +/obj/machinery/computer{ + desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; + dir = 8; + name = "Broken Computer" + }, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"td" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/space/has_grav/whiteship/box) +"uU" = ( +/obj/structure/rack, +/obj/item/clothing/suit/space/hardsuit/medical, +/obj/item/clothing/mask/breath, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"vM" = ( +/obj/structure/table, +/obj/item/radio/off, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"vR" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"wr" = ( +/obj/structure/light_construct/small{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"xi" = ( +/obj/structure/light_construct, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"xV" = ( /obj/machinery/door/poddoor{ id = "oldship_ruin_gun"; name = "pod bay door" }, /turf/open/floor/plating, /area/ruin/space/has_grav/whiteship/box) -"r" = ( -/obj/structure/shuttle/engine/propulsion/right{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/whiteship/box) -"s" = ( -/obj/structure/light_construct/small, -/turf/open/floor/plating, -/area/ruin/space/has_grav/whiteship/box) -"t" = ( -/obj/machinery/door/airlock/titanium, -/turf/open/floor/plating, -/area/ruin/space/has_grav/whiteship/box) -"u" = ( -/obj/structure/frame/computer{ - anchored = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/mineral/titanium/white, -/area/ruin/space/has_grav/whiteship/box) -"v" = ( +"yu" = ( /obj/machinery/computer{ desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; name = "Broken Computer" }, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"w" = ( -/obj/machinery/door/airlock/titanium, +"yv" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular{ + pixel_x = 6; + pixel_y = -5 + }, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"x" = ( +"zF" = ( +/obj/machinery/door/window, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/space/has_grav/whiteship/box) +"Be" = ( +/obj/structure/light_construct{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"BC" = ( +/obj/structure/light_construct{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"Cb" = ( +/obj/structure/light_construct/small{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"Dg" = ( +/obj/structure/table, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"Ew" = ( /obj/structure/chair{ dir = 1 }, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"y" = ( -/obj/item/shard{ - icon_state = "medium" +"GC" = ( +/obj/structure/chair, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"Kp" = ( +/obj/machinery/computer/pod{ + dir = 8; + id = "oldship_ruin_gun" }, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"z" = ( -/obj/structure/light_construct, -/turf/open/floor/mineral/titanium/white, +"Lf" = ( +/obj/structure/shuttle/engine/heater{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav/whiteship/box) -"A" = ( +"Nj" = ( /obj/structure/light_construct{ dir = 1 }, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"B" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plating, -/area/ruin/space/has_grav/whiteship/box) -"C" = ( -/obj/structure/table, +"NT" = ( +/obj/structure/frame/computer{ + anchored = 1; + dir = 1 + }, +/obj/structure/light_construct, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"D" = ( -/obj/machinery/door/window, -/turf/open/floor/mineral/titanium/purple, +"Os" = ( +/turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"E" = ( +"Qs" = ( /obj/structure/bed, /obj/item/bedsheet, /obj/structure/window/reinforced, @@ -173,125 +231,67 @@ }, /turf/open/floor/mineral/titanium/purple, /area/ruin/space/has_grav/whiteship/box) -"F" = ( -/obj/structure/table, -/obj/item/gun/energy/laser/retro, +"RD" = ( +/obj/item/shard{ + icon_state = "medium" + }, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"G" = ( +"RY" = ( +/obj/machinery/door/airlock/public/glass, +/turf/open/floor/plating, +/area/ruin/space/has_grav/whiteship/box) +"Sy" = ( /obj/machinery/door/airlock/public/glass, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"H" = ( -/obj/structure/light_construct{ - dir = 4 +"Tc" = ( +/turf/closed/wall/mineral/titanium/interior, +/area/ruin/space/has_grav/whiteship/box) +"Wq" = ( +/obj/machinery/mass_driver{ + dir = 4; + icon_state = "mass_driver"; + id = "oldship_ruin_gun" + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/whiteship/box) +"WD" = ( +/obj/item/stock_parts/cell{ + charge = 100; + maxcharge = 15000 }, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"I" = ( -/obj/structure/light_construct/small{ - dir = 4 - }, +"Xe" = ( +/obj/item/scalpel, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"J" = ( -/obj/structure/light_construct{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/white, -/area/ruin/space/has_grav/whiteship/box) -"K" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/decal/remains/human, -/turf/open/floor/mineral/titanium/white, -/area/ruin/space/has_grav/whiteship/box) -"L" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 8; - name = "Broken Computer" - }, -/turf/open/floor/mineral/titanium/white, -/area/ruin/space/has_grav/whiteship/box) -"M" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/mineral/titanium/white, -/area/ruin/space/has_grav/whiteship/box) -"N" = ( -/obj/structure/light_construct/small{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/white, -/area/ruin/space/has_grav/whiteship/box) -"O" = ( +"Xp" = ( +/turf/template_noop, +/area/template_noop) +"Xq" = ( /obj/structure/table, /obj/item/tank/internals/oxygen, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"P" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/mineral/titanium/white, -/area/ruin/space/has_grav/whiteship/box) -"Q" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/space/has_grav/whiteship/box) -"R" = ( -/obj/machinery/door/window/northright, -/obj/effect/decal/remains/human, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/space/has_grav/whiteship/box) -"S" = ( -/obj/item/multitool, -/turf/open/floor/mineral/titanium/white, -/area/ruin/space/has_grav/whiteship/box) -"T" = ( -/obj/structure/light_construct/small{ - dir = 1 - }, +"XE" = ( +/obj/machinery/door/airlock/titanium, /turf/open/floor/plating, /area/ruin/space/has_grav/whiteship/box) -"U" = ( -/obj/structure/chair, -/turf/open/floor/mineral/titanium/white, -/area/ruin/space/has_grav/whiteship/box) -"V" = ( +"Ya" = ( /obj/structure/frame/computer{ - anchored = 1; + anchored = 1 + }, +/obj/machinery/light{ dir = 1 }, -/obj/structure/light_construct, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"W" = ( -/obj/item/scalpel, -/turf/open/floor/mineral/titanium/white, +"Zh" = ( +/turf/open/floor/plating, /area/ruin/space/has_grav/whiteship/box) -"X" = ( -/obj/structure/table, -/obj/item/storage/firstaid/regular{ - pixel_x = 6; - pixel_y = -5 - }, -/turf/open/floor/mineral/titanium/white, -/area/ruin/space/has_grav/whiteship/box) -"Y" = ( -/obj/structure/frame/computer{ - anchored = 1; - dir = 8 - }, -/turf/open/floor/mineral/titanium/white, -/area/ruin/space/has_grav/whiteship/box) -"Z" = ( +"Zz" = ( /obj/machinery/sleeper{ dir = 8 }, @@ -299,809 +299,813 @@ /obj/structure/light_construct, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) +"ZI" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall/mineral/titanium, +/area/ruin/space/has_grav/whiteship/box) (1,1,1) = {" -a -a -a -a -a -a -a -a -b -b -t -b -b -a -a -a -a -a -a -a -a +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp +ei +ei +XE +ei +ei +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp "} (2,1,1) = {" -a -a -a -a -a -a -a -a -b -j -c -j -b -a -a -a -a -a -a -a -a +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp +ei +Tc +Os +Tc +ei +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp "} (3,1,1) = {" -a -a -a -a -a -a -a -a -b -c -c -c -b -a -a -a -a -a -a -a -a +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp +ei +Os +Os +Os +ei +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp "} (4,1,1) = {" -a -a -a -a -a -a -a -a -b -c -c -c -b -a -a -a -a -a -a -a -a +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp +ei +Os +Os +Os +ei +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp "} (5,1,1) = {" -a -a -a -a -a -a -a -a -b -c -c -c -b -a -a -a -a -a -a -a -a +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp +ei +Os +Os +Os +ei +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp "} (6,1,1) = {" -a -a -a -a -a -a -a -a -b -c -c -z -b -a -a -a -a -a -a -a -a +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp +ei +Os +Os +xi +ei +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp "} (7,1,1) = {" -a -a -a -a -a -a -a -a -b -c -c -c -b -a -a -a -a -a -a -a -a +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp +ei +Os +Os +Os +ei +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp "} (8,1,1) = {" -a -a -a -a -a -a -a -a -b -c -c -c -b -a -a -a -a -a -a -a -a +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp +ei +Os +Os +Os +ei +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp "} (9,1,1) = {" -a -a -a -a -a -a -a -a -b -c -c -M -b -a -a -a -a -a -a -a -a +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp +ei +Os +Os +vR +ei +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp "} (10,1,1) = {" -a -a -a -a -a -a -a -a -b -j -c -j -b -a -a -a -a -a -a -a -a +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp +ei +Tc +Os +Tc +ei +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp "} (11,1,1) = {" -a -a -a -a -a -a -a -a -b -b -w -b -b -a -a -a -a -a -a -a -a +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp +ei +ei +ak +ei +ei +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp "} (12,1,1) = {" -a -a -a -a -a -a -a -a -a -b -c -b -a -a -a -a -a -a -a -a -a +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp +ei +Os +ei +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp "} (13,1,1) = {" -a -a -a -a -a -a -a -a -b -b -w -b -b -a -a -a -a -a -a -a -a +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp +ei +ei +ak +ei +ei +Xp +Xp +Xp +Xp +Xp +Xp +Xp +Xp "} (14,1,1) = {" -a -a -a -a -a -a -a -b -b -j -c -j -b -b -a -a -a -a -a -a -a +Xp +Xp +Xp +Xp +Xp +Xp +Xp +ei +ei +Tc +Os +Tc +ei +ei +Xp +Xp +Xp +Xp +Xp +Xp +Xp "} (15,1,1) = {" -b -d -h -h -h -r -a -b -j -c -c -c -j -b -a -d -h -h -h -r -b +ei +jN +lC +lC +lC +he +Xp +ei +Tc +Os +Os +Os +Tc +ei +Xp +jN +lC +lC +lC +he +ei "} (16,1,1) = {" -b -b -i -i -i -b -b -b -A -c -c -c -z -b -b -b -i -i -i -b -b +ei +ei +Lf +Lf +Lf +ei +ei +ei +Nj +Os +Os +Os +xi +ei +ei +ei +Lf +Lf +Lf +ei +ei "} (17,1,1) = {" -a -b -j -l -l -j -b -j -c -c -c -c -c -j -b -j -l -l -j -b -a +Xp +ei +Tc +Zh +Zh +Tc +ei +Tc +Os +Os +Os +Os +Os +Tc +ei +Tc +Zh +Zh +Tc +ei +Xp "} (18,1,1) = {" -a -a -b -j -l -s -b -c -c -c -c -c -c -P -b -T -l -j -b -a -a +Xp +Xp +ei +Tc +Zh +rh +ei +Os +Os +Os +Os +Os +Os +qS +ei +rn +Zh +Tc +ei +Xp +Xp "} (19,1,1) = {" -a -a -a -b -b -t -b -b -b -B -G -B -b -b -b -t -b -b -a -a -a +Xp +Xp +Xp +ei +ei +XE +ei +ei +ei +ej +Sy +ej +ei +ei +ei +XE +ei +ei +Xp +Xp +Xp "} (20,1,1) = {" -a -a -a -b -b -c -c -c -c -c -c -c -c -c -c -c -b -b -a -a -a +Xp +Xp +Xp +ei +ei +Os +Os +Os +Os +Os +Os +Os +Os +Os +Os +Os +ei +ei +Xp +Xp +Xp "} (21,1,1) = {" -a -a -b -b -j -m -c -c -c -c -H -c -c -c -c -c -b -b -b -a -a +Xp +Xp +ei +ei +Tc +WD +Os +Os +Os +Os +BC +Os +Os +Os +Os +Os +ei +ei +ei +Xp +Xp "} (22,1,1) = {" -a -b -b -j -c -c -c -c -b -b -b -b -b -b -c -c -b -b -b -b -a +Xp +ei +ei +Tc +Os +Os +Os +Os +ei +ei +ei +ei +ei +ei +Os +Os +ei +ei +ei +ei +Xp "} (23,1,1) = {" -b -b -b -b -b -b -j -c -b -D -c -N -c -w -c -c -w -c -j -b -a +ei +ei +ei +ei +ei +ei +Tc +Os +ei +zF +Os +wr +Os +ak +Os +Os +ak +Os +Tc +ei +Xp "} (24,1,1) = {" -t -c -c -k -k -j -b -z -b -E -c -O -Q -b -A -c -b -c -X -b -b +XE +Os +Os +uU +uU +Tc +ei +xi +ei +Qs +Os +Xq +td +ei +Nj +Os +ei +Os +yv +ei +ei "} (25,1,1) = {" -b -c -c -c -c -n -b -c -w -c -I -c -R -b -c -c -b -c -c -j -b +ei +Os +Os +Os +Os +qF +ei +Os +ak +Os +Cb +Os +bG +ei +Os +Os +ei +Os +Os +Tc +ei "} (26,1,1) = {" -b -e -c -c -c -c -b -c -b -b -b -b -b -b -c -m -B -W -c -c -b +ei +vM +Os +Os +Os +Os +ei +Os +ei +ei +ei +ei +ei +ei +Os +WD +ej +Xe +Os +Os +ei "} (27,1,1) = {" -b -f -c -c -c -c -w -c -c -c -J -c -c -c -c -c -B -c -c -Z -b +ei +ry +Os +Os +Os +Os +ak +Os +Os +Os +Be +Os +Os +Os +Os +Os +ej +Os +Os +Zz +ei "} (28,1,1) = {" -b -c -c -c -c -c -b -j -c -c -c -c -c -c -c -S -B -c -c -c -b +ei +Os +Os +Os +Os +Os +ei +Tc +Os +Os +Os +Os +Os +Os +Os +fa +ej +Os +Os +Os +ei "} (29,1,1) = {" -b -c -c -c -c -j -b -b -b -B -G -B -b -b -b -b -b -c -c -c -b +ei +Os +Os +Os +Os +Tc +ZI +ei +ei +ej +Sy +ej +ei +ei +ei +ei +ei +Os +Os +Os +ei "} (30,1,1) = {" -b -c -c -c -j -b -j -c -c -c -c -c -c -C -C -C -b -c -c -j -b +ei +Os +Os +Os +Tc +ei +Tc +Os +Os +Os +Os +Os +Os +Dg +Dg +Dg +ei +Os +Os +Tc +ei "} (31,1,1) = {" -t -c -g -c -b -j -c -c -c -c -c -c -c -c -c -c -j -j -Y -b -a +XE +Os +Kp +Os +ei +Tc +Os +Os +Os +Os +Os +Os +Os +Os +Os +Os +Tc +Tc +oG +ei +Xp "} (32,1,1) = {" -b -b -b -o -b -u -x -c -c -c -c -c -c -c -c -U -V -b -b -b -a +ei +ei +ei +RY +ei +Ya +Ew +Os +Os +Os +Os +Os +Os +Os +Os +GC +NT +ei +ei +ei +Xp "} (33,1,1) = {" -a -a -b -p -b -v -x -c -c -C -K -C -c -c -c -c -j -b -b -a -a +Xp +Xp +ei +Wq +ei +yu +Ew +Os +Os +Dg +ps +Dg +Os +Os +Os +Os +Tc +ei +ei +Xp +Xp "} (34,1,1) = {" -a -a -b -q -b -j -y -c -c -F -L -C -c -c -c -j -b -b -a -a -a +Xp +Xp +ei +xV +ei +Tc +RD +Os +Os +qi +sW +Dg +Os +Os +Os +Tc +ei +ei +Xp +Xp +Xp "} (35,1,1) = {" -a -a -a -a -b -b -b -B -B -B -B -B -B -B -b -b -b -a -a -a -a +Xp +Xp +Xp +Xp +ei +ei +ei +ej +ej +ej +ej +ej +ej +ej +ei +ei +ei +Xp +Xp +Xp +Xp "} diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 53de44a385..3ed5035579 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -5404,6 +5404,9 @@ }, /turf/open/floor/plasteel/dark, /area/slavers) +"nh" = ( +/turf/open/indestructible/hotelwood, +/area/ruin/powered) "ni" = ( /obj/machinery/newscaster/security_unit, /turf/closed/indestructible/riveted, @@ -8035,6 +8038,14 @@ }, /turf/open/floor/mineral/titanium/blue, /area/centcom/holding) +"sm" = ( +/obj/structure/sign/poster/contraband/tools, +/turf/closed/indestructible{ + icon = 'icons/turf/walls/wood_wall.dmi'; + icon_state = "wood"; + smooth = 1 + }, +/area/ruin/powered) "sp" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -10759,6 +10770,13 @@ /obj/structure/chair, /turf/open/floor/mineral/titanium, /area/centcom/evac) +"yi" = ( +/turf/closed/indestructible{ + icon = 'icons/turf/walls/wood_wall.dmi'; + icon_state = "wood"; + smooth = 1 + }, +/area/ruin/powered) "yj" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom Security"; @@ -12583,6 +12601,10 @@ }, /turf/open/floor/engine/cult, /area/wizard_station) +"Ck" = ( +/obj/effect/holodeck_effect/mobspawner/bigmommyclaw, +/turf/open/floor/holofloor/basalt, +/area/holodeck/rec_center/wildlife) "Cl" = ( /turf/closed/indestructible/start_area, /area/start) @@ -16521,6 +16543,14 @@ }, /turf/open/floor/plasteel, /area/tdome/tdomeadmin) +"Ki" = ( +/obj/structure/sign/poster/contraband/kudzu, +/turf/closed/indestructible{ + icon = 'icons/turf/walls/wood_wall.dmi'; + icon_state = "wood"; + smooth = 1 + }, +/area/ruin/powered) "Kj" = ( /obj/machinery/door/airlock/external{ name = "Backup Emergency Escape Shuttle" @@ -17522,6 +17552,12 @@ "MI" = ( /turf/open/floor/plating, /area/syndicate_mothership) +"MJ" = ( +/obj/structure/table/wood, +/obj/item/storage/firstaid/fire, +/obj/item/storage/firstaid/brute, +/turf/open/indestructible/hotelwood, +/area/ruin/powered) "ML" = ( /obj/structure/table/wood/fancy, /turf/open/indestructible/hotelwood, @@ -17762,6 +17798,14 @@ /obj/item/mop, /turf/open/indestructible/hotelwood, /area/centcom/holding) +"Nt" = ( +/obj/structure/sign/poster/contraband/lamarr, +/turf/closed/indestructible{ + icon = 'icons/turf/walls/wood_wall.dmi'; + icon_state = "wood"; + smooth = 1 + }, +/area/ruin/powered) "Nu" = ( /turf/open/floor/wood, /area/syndicate_mothership) @@ -18154,6 +18198,14 @@ /obj/structure/table, /turf/open/floor/plasteel/cafeteria, /area/slavers) +"OD" = ( +/obj/structure/sign/poster/contraband/bulldog, +/turf/closed/indestructible{ + icon = 'icons/turf/walls/wood_wall.dmi'; + icon_state = "wood"; + smooth = 1 + }, +/area/ruin/powered) "OE" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -18346,6 +18398,14 @@ /obj/machinery/light, /turf/open/floor/plasteel/dark, /area/centcom/supplypod) +"Pt" = ( +/obj/structure/sign/poster/official/wtf_is_co2, +/turf/closed/indestructible{ + icon = 'icons/turf/walls/wood_wall.dmi'; + icon_state = "wood"; + smooth = 1 + }, +/area/ruin/powered) "Pv" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -18774,6 +18834,10 @@ /obj/item/clothing/head/welding, /turf/open/floor/plasteel/dark, /area/slavers) +"QI" = ( +/obj/effect/holodeck_effect/mobspawner/femclaw, +/turf/open/floor/holofloor/basalt, +/area/holodeck/rec_center/wildlife) "QK" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -19024,6 +19088,10 @@ /obj/effect/turf_decal/loading_area, /turf/open/floor/plating, /area/syndicate_mothership) +"RC" = ( +/obj/effect/holodeck_effect/mobspawner/newclaw, +/turf/open/floor/holofloor/basalt, +/area/holodeck/rec_center/wildlife) "RD" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -19386,6 +19454,12 @@ /obj/item/mop, /turf/open/floor/plasteel/cafeteria, /area/centcom/holding) +"SO" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/ruin/powered) "SP" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/space/basic, @@ -19702,6 +19776,14 @@ }, /turf/open/floor/plasteel/freezer, /area/syndicate_mothership) +"TQ" = ( +/obj/structure/sign/poster/contraband/ambrosia_vulgaris, +/turf/closed/indestructible{ + icon = 'icons/turf/walls/wood_wall.dmi'; + icon_state = "wood"; + smooth = 1 + }, +/area/ruin/powered) "TR" = ( /obj/machinery/computer/arcade/tetris, /turf/open/floor/plasteel, @@ -19742,6 +19824,10 @@ /obj/item/reagent_containers/glass/beaker, /turf/open/floor/plasteel/cafeteria, /area/centcom/holding) +"TW" = ( +/obj/effect/mob_spawn/human/ghostcafeVR, +/turf/open/indestructible/hotelwood, +/area/ruin/powered) "TX" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -20021,6 +20107,12 @@ }, /turf/open/floor/wood, /area/centcom/holding) +"UK" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/ruin/powered) "UL" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -20229,6 +20321,10 @@ }, /turf/open/floor/plasteel/dark, /area/slavers) +"Vs" = ( +/obj/machinery/vr_sleeper, +/turf/open/indestructible/hotelwood, +/area/ruin/powered) "Vt" = ( /obj/item/paper/fluff/stations/centcom/disk_memo, /obj/structure/noticeboard{ @@ -20270,9 +20366,6 @@ }, /turf/open/space, /area/space) -"Vy" = ( -/turf/open/chasm/lavaland, -/area/holodeck/rec_center/wildlife) "Vz" = ( /obj/machinery/vending/wallmed{ name = "Emergency NanoMed"; @@ -20478,6 +20571,10 @@ }, /turf/open/floor/plating, /area/syndicate_mothership) +"Wk" = ( +/obj/effect/holodeck_effect/mobspawner/alphaclaw, +/turf/open/floor/holofloor/basalt, +/area/holodeck/rec_center/wildlife) "Wp" = ( /obj/machinery/processor, /obj/machinery/light{ @@ -20576,6 +20673,14 @@ }, /turf/open/floor/plasteel, /area/centcom/supplypod/loading/one) +"WL" = ( +/obj/structure/sign/poster/official/walk, +/turf/closed/indestructible{ + icon = 'icons/turf/walls/wood_wall.dmi'; + icon_state = "wood"; + smooth = 1 + }, +/area/ruin/powered) "WM" = ( /obj/structure/extinguisher_cabinet{ pixel_y = 32 @@ -20888,6 +20993,13 @@ "XN" = ( /turf/open/floor/carpet/red, /area/centcom/holding) +"XO" = ( +/obj/structure/flora/ausbushes/fernybush, +/obj/structure/flora/ausbushes/ppflowers, +/obj/structure/flora/ausbushes/palebush, +/obj/structure/window/reinforced/fulltile, +/turf/open/indestructible/hotelwood, +/area/ruin/powered) "XR" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/turf_decal/delivery, @@ -51042,12 +51154,12 @@ aa aa aa aa -aa -aa -Nd -Nd -Nd -Nd +yi +Pt +yi +yi +yi +sm Nd Zv VA @@ -51299,12 +51411,12 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa +yi +Vs +nh +UK +nh +XO Nd Dn ZW @@ -51556,12 +51668,12 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa +yi +Vs +nh +MJ +nh +Vs Nd TZ yf @@ -51813,12 +51925,12 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa +yi +Vs +nh +XO +nh +Vs Nd Nd Nd @@ -52070,13 +52182,13 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa +yi +Vs +nh +XO +nh +Vs +Nd aa aa aa @@ -52327,13 +52439,13 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa +yi +Vs +nh +TW +nh +Vs +Nd aa aa aa @@ -52584,13 +52696,13 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa +yi +Vs +nh +SO +nh +XO +Nd aa aa aa @@ -52841,13 +52953,13 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa +yi +WL +TQ +OD +Ki +Nt +Nd aa aa aa @@ -80914,16 +81026,16 @@ aa "} (232,1,1) = {" ac -Vy -Vy -Vy ap ap ap ap -Vy -Vy -Vy +ap +ap +ap +ap +ap +ap bj bt bI @@ -81171,16 +81283,16 @@ aa "} (233,1,1) = {" ac -Vy -aB -ap -ap -ap -ap -ap ap aB -Vy +ap +ap +ap +ap +ap +ap +Ck +ap bj Xg TF @@ -81428,16 +81540,16 @@ aa "} (234,1,1) = {" ac -Vy ap ap ap -aB -aB +ap +ap +RC +ap ap ap ap -Vy bj bu bJ @@ -81685,16 +81797,16 @@ aa "} (235,1,1) = {" ac -Vy +ap +Wk ap ap ap ap ap ap +QI ap -ap -Vy bj bv bK @@ -81942,16 +82054,16 @@ aa "} (236,1,1) = {" ac -Vy -Vy -Vy -Vy -Vy -Vy -Vy -Vy -Vy -Vy +ap +ap +ap +ap +ap +ap +ap +ap +ap +ap bj RD Va diff --git a/_maps/map_files/generic/SpaceDock.dmm b/_maps/map_files/generic/SpaceDock.dmm index 1188aa25fb..023dbdd99f 100644 --- a/_maps/map_files/generic/SpaceDock.dmm +++ b/_maps/map_files/generic/SpaceDock.dmm @@ -15,6 +15,10 @@ }, /turf/open/space, /area/space) +"Q" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/open/space/basic, +/area/space) (1,1,1) = {" a @@ -271,7 +275,7 @@ a a a a -a +Q "} (2,1,1) = {" a diff --git a/code/__DEFINES/_flags/do_after.dm b/code/__DEFINES/_flags/do_after.dm index 26802736cf..1661d60271 100644 --- a/code/__DEFINES/_flags/do_after.dm +++ b/code/__DEFINES/_flags/do_after.dm @@ -1,32 +1,11 @@ -/// Requires absolute stillness from the user -#define DO_AFTER_DISALLOW_MOVING_ABSOLUTE_USER (1<<0) -/// Requires absolute stillness from the target -#define DO_AFTER_DISALLOW_MOVING_ABSOLUTE_TARGET (1<<1) -/// Requires that the user is on a turf. -#define DO_AFTER_REQUIRES_USER_ON_TURF (1<<2) -/// Requires relative stillness to our target via dx and dy coordinate difference but only if both are spacedrifting. Specify DO_AFTER_ALLOW_NONSPACEDRIFT_RELATIVITY to say otherwise. -#define DO_AFTER_DISALLOW_MOVING_RELATIVE (1<<3) -/// Breaks if active hand item changes. Requires a tool be specified, otherwise defaults to active item -#define DO_AFTER_DISALLOW_ACTIVE_ITEM_CHANGE (1<<4) -/// Breaks if the user has no free hands. If a tool is specified, allows that as well. -#define DO_AFTER_REQUIRE_FREE_HAND_OR_TOOL (1<<5) -/// Do not display progressbar. -#define DO_AFTER_NO_PROGRESSBAR (1<<6) -/// Do not check do_after_coefficient() -#define DO_AFTER_NO_COEFFICIENT (1<<7) -/// For relative stillness, allow non spacedrift relative movement -#define DO_AFTER_ALLOW_NONSPACEDRIFT_RELATIVITY (1<<8) - -/// Ignores checks. -#define DO_AFTER_PROCEED "PROCEED" -/// Uses all other checks -#define DO_AFTER_CONTINUE "CONTINUE" -/// Breaks -#define DO_AFTER_STOP "STOP" - -/// Stage - initiating a do_after -#define DO_AFTER_STARTING 1 -/// Stage - main loop of a do_after -#define DO_AFTER_PROGRESSING 2 -/// Stage - Last check of a do_after -#define DO_AFTER_FINISHING 3 +// timed_action_flags parameter for `/proc/do_after` +/// Can do the action even if target is not added to doafters +#define IGNORE_TARGET_IN_DOAFTERS (1<<0) +/// Can do the action even if mob moves location +#define IGNORE_USER_LOC_CHANGE (1<<1) +/// Can do the action even if the target moves location +#define IGNORE_TARGET_LOC_CHANGE (1<<2) +/// Can do the action even if the item is no longer being held +#define IGNORE_HELD_ITEM (1<<3) +/// Can do the action even if the mob is incapacitated (ex. handcuffed) +#define IGNORE_INCAPACITATED (1<<4) diff --git a/code/__DEFINES/rust_g.dm b/code/__DEFINES/rust_g.dm index 48a2ee5389..e354105cc9 100644 --- a/code/__DEFINES/rust_g.dm +++ b/code/__DEFINES/rust_g.dm @@ -38,8 +38,15 @@ #define RUST_G (__rust_g || __detect_rust_g()) #endif +// Handle 515 call() -> call_ext() changes +#if DM_VERSION >= 515 +#define RUSTG_CALL call_ext +#else +#define RUSTG_CALL call +#endif + /// Gets the version of rust_g -/proc/rustg_get_version() return call(RUST_G, "get_version")() +/proc/rustg_get_version() return RUSTG_CALL(RUST_G, "get_version")() /** @@ -51,7 +58,7 @@ * * patterns - A non-associative list of strings to search for * * replacements - Default replacements for this automaton, used with rustg_acreplace */ -#define rustg_setup_acreplace(key, patterns, replacements) call(RUST_G, "setup_acreplace")(key, json_encode(patterns), json_encode(replacements)) +#define rustg_setup_acreplace(key, patterns, replacements) RUSTG_CALL(RUST_G, "setup_acreplace")(key, json_encode(patterns), json_encode(replacements)) /** * Sets up the Aho-Corasick automaton using supplied options. @@ -63,7 +70,7 @@ * * patterns - A non-associative list of strings to search for * * replacements - Default replacements for this automaton, used with rustg_acreplace */ -#define rustg_setup_acreplace_with_options(key, options, patterns, replacements) call(RUST_G, "setup_acreplace")(key, json_encode(options), json_encode(patterns), json_encode(replacements)) +#define rustg_setup_acreplace_with_options(key, options, patterns, replacements) RUSTG_CALL(RUST_G, "setup_acreplace")(key, json_encode(options), json_encode(patterns), json_encode(replacements)) /** * Run the specified replacement engine with the provided haystack text to replace, returning replaced text. @@ -72,7 +79,7 @@ * * key - The key for the automaton * * text - Text to run replacements on */ -#define rustg_acreplace(key, text) call(RUST_G, "acreplace")(key, text) +#define rustg_acreplace(key, text) RUSTG_CALL(RUST_G, "acreplace")(key, text) /** * Run the specified replacement engine with the provided haystack text to replace, returning replaced text. @@ -82,7 +89,7 @@ * * text - Text to run replacements on * * replacements - Replacements for this call. Must be the same length as the set-up patterns */ -#define rustg_acreplace_with_replacements(key, text, replacements) call(RUST_G, "acreplace_with_replacements")(key, text, json_encode(replacements)) +#define rustg_acreplace_with_replacements(key, text, replacements) RUSTG_CALL(RUST_G, "acreplace_with_replacements")(key, text, json_encode(replacements)) /** * This proc generates a cellular automata noise grid which can be used in procedural generation methods. @@ -98,7 +105,7 @@ * * height: The height of the grid. */ #define rustg_cnoise_generate(percentage, smoothing_iterations, birth_limit, death_limit, width, height) \ - call(RUST_G, "cnoise_generate")(percentage, smoothing_iterations, birth_limit, death_limit, width, height) + RUSTG_CALL(RUST_G, "cnoise_generate")(percentage, smoothing_iterations, birth_limit, death_limit, width, height) /** * This proc generates a grid of perlin-like noise @@ -114,32 +121,38 @@ * * upper_range: upper bound of values selected for. (exclusive) */ #define rustg_dbp_generate(seed, accuracy, stamp_size, world_size, lower_range, upper_range) \ - call(RUST_G, "dbp_generate")(seed, accuracy, stamp_size, world_size, lower_range, upper_range) + RUSTG_CALL(RUST_G, "dbp_generate")(seed, accuracy, stamp_size, world_size, lower_range, upper_range) -#define rustg_dmi_strip_metadata(fname) call(RUST_G, "dmi_strip_metadata")(fname) -#define rustg_dmi_create_png(path, width, height, data) call(RUST_G, "dmi_create_png")(path, width, height, data) -#define rustg_dmi_resize_png(path, width, height, resizetype) call(RUST_G, "dmi_resize_png")(path, width, height, resizetype) +#define rustg_dmi_strip_metadata(fname) RUSTG_CALL(RUST_G, "dmi_strip_metadata")(fname) +#define rustg_dmi_create_png(path, width, height, data) RUSTG_CALL(RUST_G, "dmi_create_png")(path, width, height, data) +#define rustg_dmi_resize_png(path, width, height, resizetype) RUSTG_CALL(RUST_G, "dmi_resize_png")(path, width, height, resizetype) +/** + * input: must be a path, not an /icon; you have to do your own handling if it is one, as icon objects can't be directly passed to rustg. + * + * output: json_encode'd list. json_decode to get a flat list with icon states in the order they're in inside the .dmi + */ +#define rustg_dmi_icon_states(fname) RUSTG_CALL(RUST_G, "dmi_icon_states")(fname) -#define rustg_file_read(fname) call(RUST_G, "file_read")(fname) -#define rustg_file_exists(fname) call(RUST_G, "file_exists")(fname) -#define rustg_file_write(text, fname) call(RUST_G, "file_write")(text, fname) -#define rustg_file_append(text, fname) call(RUST_G, "file_append")(text, fname) -#define rustg_file_get_line_count(fname) text2num(call(RUST_G, "file_get_line_count")(fname)) -#define rustg_file_seek_line(fname, line) call(RUST_G, "file_seek_line")(fname, "[line]") +#define rustg_file_read(fname) RUSTG_CALL(RUST_G, "file_read")(fname) +#define rustg_file_exists(fname) RUSTG_CALL(RUST_G, "file_exists")(fname) +#define rustg_file_write(text, fname) RUSTG_CALL(RUST_G, "file_write")(text, fname) +#define rustg_file_append(text, fname) RUSTG_CALL(RUST_G, "file_append")(text, fname) +#define rustg_file_get_line_count(fname) text2num(RUSTG_CALL(RUST_G, "file_get_line_count")(fname)) +#define rustg_file_seek_line(fname, line) RUSTG_CALL(RUST_G, "file_seek_line")(fname, "[line]") #ifdef RUSTG_OVERRIDE_BUILTINS #define file2text(fname) rustg_file_read("[fname]") #define text2file(text, fname) rustg_file_append(text, "[fname]") #endif -#define rustg_git_revparse(rev) call(RUST_G, "rg_git_revparse")(rev) -#define rustg_git_commit_date(rev) call(RUST_G, "rg_git_commit_date")(rev) +#define rustg_git_revparse(rev) RUSTG_CALL(RUST_G, "rg_git_revparse")(rev) +#define rustg_git_commit_date(rev) RUSTG_CALL(RUST_G, "rg_git_commit_date")(rev) -#define rustg_hash_string(algorithm, text) call(RUST_G, "hash_string")(algorithm, text) -#define rustg_hash_file(algorithm, fname) call(RUST_G, "hash_file")(algorithm, fname) -#define rustg_hash_generate_totp(seed) call(RUST_G, "generate_totp")(seed) -#define rustg_hash_generate_totp_tolerance(seed, tolerance) call(RUST_G, "generate_totp_tolerance")(seed, tolerance) +#define rustg_hash_string(algorithm, text) RUSTG_CALL(RUST_G, "hash_string")(algorithm, text) +#define rustg_hash_file(algorithm, fname) RUSTG_CALL(RUST_G, "hash_file")(algorithm, fname) +#define rustg_hash_generate_totp(seed) RUSTG_CALL(RUST_G, "generate_totp")(seed) +#define rustg_hash_generate_totp_tolerance(seed, tolerance) RUSTG_CALL(RUST_G, "generate_totp_tolerance")(seed, tolerance) #define RUSTG_HASH_MD5 "md5" #define RUSTG_HASH_SHA1 "sha1" @@ -158,41 +171,117 @@ #define RUSTG_HTTP_METHOD_PATCH "patch" #define RUSTG_HTTP_METHOD_HEAD "head" #define RUSTG_HTTP_METHOD_POST "post" -#define rustg_http_request_blocking(method, url, body, headers, options) call(RUST_G, "http_request_blocking")(method, url, body, headers, options) -#define rustg_http_request_async(method, url, body, headers, options) call(RUST_G, "http_request_async")(method, url, body, headers, options) -#define rustg_http_check_request(req_id) call(RUST_G, "http_check_request")(req_id) +#define rustg_http_request_blocking(method, url, body, headers, options) RUSTG_CALL(RUST_G, "http_request_blocking")(method, url, body, headers, options) +#define rustg_http_request_async(method, url, body, headers, options) RUSTG_CALL(RUST_G, "http_request_async")(method, url, body, headers, options) +#define rustg_http_check_request(req_id) RUSTG_CALL(RUST_G, "http_check_request")(req_id) #define RUSTG_JOB_NO_RESULTS_YET "NO RESULTS YET" #define RUSTG_JOB_NO_SUCH_JOB "NO SUCH JOB" #define RUSTG_JOB_ERROR "JOB PANICKED" -#define rustg_json_is_valid(text) (call(RUST_G, "json_is_valid")(text) == "true") +#define rustg_json_is_valid(text) (RUSTG_CALL(RUST_G, "json_is_valid")(text) == "true") -#define rustg_log_write(fname, text, format) call(RUST_G, "log_write")(fname, text, format) -/proc/rustg_log_close_all() return call(RUST_G, "log_close_all")() +#define rustg_log_write(fname, text, format) RUSTG_CALL(RUST_G, "log_write")(fname, text, format) +/proc/rustg_log_close_all() return RUSTG_CALL(RUST_G, "log_close_all")() -#define rustg_noise_get_at_coordinates(seed, x, y) call(RUST_G, "noise_get_at_coordinates")(seed, x, y) +#define rustg_noise_get_at_coordinates(seed, x, y) RUSTG_CALL(RUST_G, "noise_get_at_coordinates")(seed, x, y) + +/** + * Register a list of nodes into a rust library. This list of nodes must have been serialized in a json. + * Node {// Index of this node in the list of nodes + * unique_id: usize, + * // Position of the node in byond + * x: usize, + * y: usize, + * z: usize, + * // Indexes of nodes connected to this one + * connected_nodes_id: Vec} + * It is important that the node with the unique_id 0 is the first in the json, unique_id 1 right after that, etc. + * It is also important that all unique ids follow. {0, 1, 2, 4} is not a correct list and the registering will fail + * Nodes should not link across z levels. + * A node cannot link twice to the same node and shouldn't link itself either + */ +#define rustg_register_nodes_astar(json) RUSTG_CALL(RUST_G, "register_nodes_astar")(json) + +/** + * Add a new node to the static list of nodes. Same rule as registering_nodes applies. + * This node unique_id must be equal to the current length of the static list of nodes + */ +#define rustg_add_node_astar(json) RUSTG_CALL(RUST_G, "add_node_astar")(json) + +/**² + * Remove every link to the node with unique_id. Replace that node by null + */ +#define rustg_remove_node_astart(unique_id) RUSTG_CALL(RUST_G, "remove_node_astar")(unique_id) + +/** + * Compute the shortest path between start_node and goal_node using A*. Heuristic used is simple geometric distance + */ +#define rustg_generate_path_astar(start_node_id, goal_node_id) RUSTG_CALL(RUST_G, "generate_path_astar")(start_node_id, goal_node_id) #define RUSTG_REDIS_ERROR_CHANNEL "RUSTG_REDIS_ERROR_CHANNEL" -#define rustg_redis_connect(addr) call(RUST_G, "redis_connect")(addr) -/proc/rustg_redis_disconnect() return call(RUST_G, "redis_disconnect")() -#define rustg_redis_subscribe(channel) call(RUST_G, "redis_subscribe")(channel) -/proc/rustg_redis_get_messages() return call(RUST_G, "redis_get_messages")() -#define rustg_redis_publish(channel, message) call(RUST_G, "redis_publish")(channel, message) +#define rustg_redis_connect(addr) RUSTG_CALL(RUST_G, "redis_connect")(addr) +/proc/rustg_redis_disconnect() return RUSTG_CALL(RUST_G, "redis_disconnect")() +#define rustg_redis_subscribe(channel) RUSTG_CALL(RUST_G, "redis_subscribe")(channel) +/proc/rustg_redis_get_messages() return RUSTG_CALL(RUST_G, "redis_get_messages")() +#define rustg_redis_publish(channel, message) RUSTG_CALL(RUST_G, "redis_publish")(channel, message) -#define rustg_sql_connect_pool(options) call(RUST_G, "sql_connect_pool")(options) -#define rustg_sql_query_async(handle, query, params) call(RUST_G, "sql_query_async")(handle, query, params) -#define rustg_sql_query_blocking(handle, query, params) call(RUST_G, "sql_query_blocking")(handle, query, params) -#define rustg_sql_connected(handle) call(RUST_G, "sql_connected")(handle) -#define rustg_sql_disconnect_pool(handle) call(RUST_G, "sql_disconnect_pool")(handle) -#define rustg_sql_check_query(job_id) call(RUST_G, "sql_check_query")("[job_id]") +/** + * Connects to a given redis server. + * + * Arguments: + * * addr - The address of the server, for example "redis://127.0.0.1/" + */ +#define rustg_redis_connect_rq(addr) RUSTG_CALL(RUST_G, "redis_connect_rq")(addr) +/** + * Disconnects from a previously connected redis server + */ +/proc/rustg_redis_disconnect_rq() return RUSTG_CALL(RUST_G, "redis_disconnect_rq")() +/** + * https://redis.io/commands/lpush/ + * + * Arguments + * * key (string) - The key to use + * * elements (list) - The elements to push, use a list even if there's only one element. + */ +#define rustg_redis_lpush(key, elements) RUSTG_CALL(RUST_G, "redis_lpush")(key, json_encode(elements)) +/** + * https://redis.io/commands/lrange/ + * + * Arguments + * * key (string) - The key to use + * * start (string) - The zero-based index to start retrieving at + * * stop (string) - The zero-based index to stop retrieving at (inclusive) + */ +#define rustg_redis_lrange(key, start, stop) RUSTG_CALL(RUST_G, "redis_lrange")(key, start, stop) +/** + * https://redis.io/commands/lpop/ + * + * Arguments + * * key (string) - The key to use + * * count (string|null) - The amount to pop off the list, pass null to omit (thus just 1) + * + * Note: `count` was added in Redis version 6.2.0 + */ +#define rustg_redis_lpop(key, count) RUSTG_CALL(RUST_G, "redis_lpop")(key, count) -#define rustg_time_microseconds(id) text2num(call(RUST_G, "time_microseconds")(id)) -#define rustg_time_milliseconds(id) text2num(call(RUST_G, "time_milliseconds")(id)) -#define rustg_time_reset(id) call(RUST_G, "time_reset")(id) +#define rustg_sql_connect_pool(options) RUSTG_CALL(RUST_G, "sql_connect_pool")(options) +#define rustg_sql_query_async(handle, query, params) RUSTG_CALL(RUST_G, "sql_query_async")(handle, query, params) +#define rustg_sql_query_blocking(handle, query, params) RUSTG_CALL(RUST_G, "sql_query_blocking")(handle, query, params) +#define rustg_sql_connected(handle) RUSTG_CALL(RUST_G, "sql_connected")(handle) +#define rustg_sql_disconnect_pool(handle) RUSTG_CALL(RUST_G, "sql_disconnect_pool")(handle) +#define rustg_sql_check_query(job_id) RUSTG_CALL(RUST_G, "sql_check_query")("[job_id]") -#define rustg_raw_read_toml_file(path) json_decode(call(RUST_G, "toml_file_to_json")(path) || "null") +#define rustg_time_microseconds(id) text2num(RUSTG_CALL(RUST_G, "time_microseconds")(id)) +#define rustg_time_milliseconds(id) text2num(RUSTG_CALL(RUST_G, "time_milliseconds")(id)) +#define rustg_time_reset(id) RUSTG_CALL(RUST_G, "time_reset")(id) + +/// Returns the timestamp as a string +/proc/rustg_unix_timestamp() + return RUSTG_CALL(RUST_G, "unix_timestamp")() + +#define rustg_raw_read_toml_file(path) json_decode(RUSTG_CALL(RUST_G, "toml_file_to_json")(path) || "null") /proc/rustg_read_toml_file(path) var/list/output = rustg_raw_read_toml_file(path) @@ -201,11 +290,20 @@ else CRASH(output["content"]) -#define rustg_unzip_download_async(url, unzip_directory) call(RUST_G, "unzip_download_async")(url, unzip_directory) -#define rustg_unzip_check(job_id) call(RUST_G, "unzip_check")("[job_id]") +#define rustg_raw_toml_encode(value) json_decode(RUSTG_CALL(RUST_G, "toml_encode")(json_encode(value))) -#define rustg_url_encode(text) call(RUST_G, "url_encode")("[text]") -#define rustg_url_decode(text) call(RUST_G, "url_decode")(text) +/proc/rustg_toml_encode(value) + var/list/output = rustg_raw_toml_encode(value) + if (output["success"]) + return output["content"] + else + CRASH(output["content"]) + +#define rustg_unzip_download_async(url, unzip_directory) RUSTG_CALL(RUST_G, "unzip_download_async")(url, unzip_directory) +#define rustg_unzip_check(job_id) RUSTG_CALL(RUST_G, "unzip_check")("[job_id]") + +#define rustg_url_encode(text) RUSTG_CALL(RUST_G, "url_encode")("[text]") +#define rustg_url_decode(text) RUSTG_CALL(RUST_G, "url_decode")(text) #ifdef RUSTG_OVERRIDE_BUILTINS #define url_encode(text) rustg_url_encode(text) @@ -226,6 +324,6 @@ * * node_max: maximum amount of nodes in a region */ #define rustg_worley_generate(region_size, threshold, node_per_region_chance, size, node_min, node_max) \ - call(RUST_G, "worley_generate")(region_size, threshold, node_per_region_chance, size, node_min, node_max) + RUSTG_CALL(RUST_G, "worley_generate")(region_size, threshold, node_per_region_chance, size, node_min, node_max) diff --git a/code/__DEFINES/species.dm b/code/__DEFINES/species.dm index 122b882278..42ef3a8146 100644 --- a/code/__DEFINES/species.dm +++ b/code/__DEFINES/species.dm @@ -7,6 +7,9 @@ #define SPECIES_UMAMMAL "undead_mammal" #define SPECIES_MAMMAL_SYNTHETIC "mammal_synthetic" #define SPECIES_ARACHNID "arachnid" +#define SPECIES_TESHARI "teshari" +#define SPECIES_VOX "vox" +#define SPECIES_XENOCHIMERA "xenochimera" #define SPECIES_INSECT "insect" #define SPECIES_UINSECT "undead_insect" #define SPECIES_DULLAHAN "dullahan" diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index 22c3827022..6187a67825 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "6.5.2" +#define TGS_DMAPI_VERSION "6.5.3" // All functions and datums outside this document are subject to change with any version and should not be relied on. @@ -154,7 +154,7 @@ #define TGS_TOPIC var/tgs_topic_return = TgsTopic(args[1]); if(tgs_topic_return) return tgs_topic_return /** - * Call this as late as possible in [world/proc/Reboot]. + * Call this as late as possible in [world/proc/Reboot] (BEFORE ..()). */ /world/proc/TgsReboot() return diff --git a/code/__HELPERS/_extools_api.dm b/code/__HELPERS/_extools_api.dm index 7bff3f06c0..d52ad5bd6f 100644 --- a/code/__HELPERS/_extools_api.dm +++ b/code/__HELPERS/_extools_api.dm @@ -7,14 +7,15 @@ /proc/auxtools_stack_trace(msg) CRASH(msg) -GLOBAL_LIST_EMPTY(auxtools_initialized) +//glob doesn't exist yet at some gas new calls, imma use it anyways +GLOBAL_REAL_VAR(list/__auxtools_initialized) = list() #define AUXTOOLS_CHECK(LIB)\ - if (!GLOB.auxtools_initialized[LIB]) {\ + if (!__auxtools_initialized[LIB]) {\ if (fexists(LIB)) {\ var/string = call(LIB,"auxtools_init")();\ if(findtext(string, "SUCCESS")) {\ - GLOB.auxtools_initialized[LIB] = TRUE;\ + __auxtools_initialized[LIB] = TRUE;\ } else {\ CRASH(string);\ }\ @@ -24,7 +25,7 @@ GLOBAL_LIST_EMPTY(auxtools_initialized) }\ #define AUXTOOLS_SHUTDOWN(LIB)\ - if (GLOB.auxtools_initialized[LIB] && fexists(LIB)){\ + if (__auxtools_initialized[LIB] && fexists(LIB)){\ call(LIB,"auxtools_shutdown")();\ - GLOB.auxtools_initialized[LIB] = FALSE;\ + __auxtools_initialized[LIB] = FALSE;\ }\ diff --git a/code/__HELPERS/do_after.dm b/code/__HELPERS/do_after.dm index eb63727166..7bf176c38e 100644 --- a/code/__HELPERS/do_after.dm +++ b/code/__HELPERS/do_after.dm @@ -1,168 +1,6 @@ -/** - * Higher overhead "advanced" version of do_after. - * @params - * - atom/user is the atom doing the action or the "physical" user - * - delay is time in deciseconds - * - atom/target is the atom the action is being done to, defaults to user - * - do_after_flags see __DEFINES/flags/do_after.dm for details. - * - datum/callback/extra_checks - Every time this ticks, extra_checks() is invoked with (user, delay, target, time_left, do_after_flags, required_mobility_flags, required_combat_flags, mob_redirect, stage, initially_held_item, tool, passed_in). - * Stage can be DO_AFTER_STARTING, DO_AFTER_PROGRESSING, DO_AFTER_FINISHING - * If it returns DO_AFTER_STOP, this breaks. - * If it returns nothing, all other checks are done. - * If it returns DO_AFTER_PROCEED, all other checks are ignored. - * passed_in is a list[PROGRESS_MULTIPLIER], for modification. - * - required_mobility_flags is checked with CHECK_ALL_MOBILITY. Will immediately fail if the user isn't a mob. - * - requried_combat_flags is checked with CHECK_MULTIPLE_BITFIELDS. Will immediately fail if the user isn't a mob. - * - mob/living/mob_redirect - advanced option: If this is specified, movement and mobility/combat flag checks will use this instead of user. Progressbars will also go to this. - * - obj/item/tool - The tool we're using. See do_after flags for details. - */ -#define INVOKE_CALLBACK cb_return = extra_checks?.Invoke(user, delay, target, timeleft, do_after_flags, required_mobility_flags, required_combat_flags, mob_redirect, stage, initially_held_item, tool, passed_in) -#define CHECK_FLAG_FAILURE ((required_mobility_flags || required_combat_flags) && (!living_user || (required_mobility_flags && !CHECK_ALL_MOBILITY(living_user, required_mobility_flags)) || (required_combat_flags && !CHECK_MULTIPLE_BITFIELDS(living_user.combat_flags, required_combat_flags)))) -#define TIMELEFT (timeleft) -/proc/do_after_advanced(atom/user, delay, atom/target, do_after_flags, datum/callback/extra_checks, required_mobility_flags, required_combat_flags, mob/living/mob_redirect, obj/item/tool) - // CHECK AND SET VARIABLES - if(!user) - return FALSE - if(!target) - target = user - if((user.loc == null) || (target.loc == null)) - return FALSE - var/mob/living/living_user = mob_redirect - if(!living_user && isliving(user)) - living_user = user - var/stage = DO_AFTER_STARTING - var/startlocuser = user.loc - var/startloctarget = target.loc - var/turf/userturf = get_turf(user) - var/turf/targetturf = get_turf(target) - if(!userturf || !targetturf) - return FALSE - if((do_after_flags & DO_AFTER_REQUIRES_USER_ON_TURF) && !isturf(user.loc)) - return FALSE - if(!(do_after_flags & DO_AFTER_NO_COEFFICIENT) && living_user) - delay *= living_user.cached_multiplicative_actions_slowdown - var/timeleft = delay - var/obj/item/initially_held_item = mob_redirect?.get_active_held_item() - var/atom/movable/AM_user = ismovable(user) && user - var/drifting = AM_user?.Process_Spacemove(NONE) && AM_user.inertia_dir - var/initial_dx = targetturf.x - userturf.x - var/initial_dy = targetturf.y - userturf.y - var/dx = initial_dx - var/dy = initial_dy - // DO OUR STARTING CHECKS - var/cb_return - var/list/passed_in = list(1) - INVOKE_CALLBACK - if(cb_return == DO_AFTER_STOP) - return FALSE - else if(cb_return != DO_AFTER_PROCEED) - if(CHECK_FLAG_FAILURE) - return FALSE - // SETUP LOOP - var/datum/progressbar/progbar - if(living_user) - if(!(do_after_flags & DO_AFTER_NO_PROGRESSBAR)) - progbar = new(living_user, delay, target) - // MAIN LOOP - . = TRUE - if(!delay) - return - var/obj/item/held - var/locchanged - var/ctu - var/ctt - var/tick_time = world.time - while(timeleft > 0) - stoplag(1) - var/timepassed = world.time - tick_time - tick_time = world.time - progbar?.update(TIMELEFT) - if(QDELETED(user) || QDELETED(target) || (user.loc == null) || (target.loc == null)) - . = FALSE - break - INVOKE_CALLBACK - timeleft -= timepassed * passed_in[1] - if(cb_return == DO_AFTER_STOP) - . = FALSE - break - else if(cb_return == DO_AFTER_PROCEED) - continue - // otherwise, go through our normal checks. - if(((do_after_flags & DO_AFTER_DISALLOW_MOVING_ABSOLUTE_USER) && (user.loc != startlocuser)) || ((do_after_flags & DO_AFTER_DISALLOW_MOVING_ABSOLUTE_TARGET) && (target.loc != startloctarget))) - . = FALSE - break - else if(do_after_flags & DO_AFTER_DISALLOW_MOVING_RELATIVE) - ctu = get_turf(user) - ctt = get_turf(target) - locchanged = (userturf != ctu) || (targetturf != ctt) - userturf = ctu - targetturf = ctt - dx = targetturf.x - userturf.x - dy = targetturf.y - userturf.y - if((dx != initial_dx) || (dy != initial_dy)) - . = FALSE - break - if(locchanged && !drifting && !(do_after_flags & DO_AFTER_ALLOW_NONSPACEDRIFT_RELATIVITY)) - . = FALSE - break - if(!AM_user.inertia_dir) - drifting = FALSE - if((do_after_flags & DO_AFTER_REQUIRES_USER_ON_TURF) && !isturf(user.loc)) - return FALSE - if(CHECK_FLAG_FAILURE) - . = FALSE - break - held = living_user?.get_active_held_item() - if((do_after_flags & DO_AFTER_DISALLOW_ACTIVE_ITEM_CHANGE) && (held != (tool || initially_held_item))) - . = FALSE - break - if((do_after_flags & DO_AFTER_REQUIRE_FREE_HAND_OR_TOOL) && (!living_user?.is_holding(tool) && !length(living_user?.get_empty_held_indexes()))) - . = FALSE - break - - // CLEANUP - progbar.end_progress() - // If we failed, just return. - if(!.) - return FALSE - // DO FINISHING CHECKS - if(QDELETED(user) || QDELETED(target)) - return FALSE - INVOKE_CALLBACK - if(cb_return == DO_AFTER_STOP) - return FALSE - else if(cb_return == DO_AFTER_PROCEED) - return TRUE - if(CHECK_FLAG_FAILURE) - return FALSE - if(((do_after_flags & DO_AFTER_DISALLOW_MOVING_ABSOLUTE_USER) && (user.loc != startlocuser)) || ((do_after_flags & DO_AFTER_DISALLOW_MOVING_ABSOLUTE_TARGET) && (target.loc != startloctarget))) - return FALSE - else if(do_after_flags & DO_AFTER_DISALLOW_MOVING_RELATIVE) - ctu = get_turf(user) - ctt = get_turf(target) - locchanged = (userturf != ctu) || (targetturf != ctt) - userturf = ctu - targetturf = ctt - dx = targetturf.x - userturf.x - dy = targetturf.y - userturf.y - if((dx != initial_dx) || (dy != initial_dy)) - return FALSE - if(locchanged && !drifting && !(do_after_flags & DO_AFTER_ALLOW_NONSPACEDRIFT_RELATIVITY)) - return FALSE - if((do_after_flags & DO_AFTER_REQUIRES_USER_ON_TURF) && !isturf(user.loc)) - return FALSE - held = living_user?.get_active_held_item() - if((do_after_flags & DO_AFTER_DISALLOW_ACTIVE_ITEM_CHANGE) && (held != (tool || initially_held_item))) - return FALSE - if((do_after_flags & DO_AFTER_REQUIRE_FREE_HAND_OR_TOOL) && (!living_user?.is_holding(tool) && !length(living_user?.get_empty_held_indexes()))) - return FALSE - -#undef INVOKE_CALLBACK -#undef CHECK_FLAG_FAILURE - -/proc/do_mob(mob/user , mob/target, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks = null, ignorehelditem = FALSE, resume_time = 0 SECONDS) +/proc/do_mob(mob/user, mob/target, time = 3 SECONDS, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks, resume_time = 0 SECONDS) if(!user || !target) - return 0 + return FALSE var/user_loc = user.loc var/drifting = 0 @@ -181,31 +19,27 @@ var/endtime = world.time+time var/starttime = world.time - . = 1 + . = TRUE while (world.time + resume_time < endtime) stoplag(1) if (progress) if(!QDELETED(progbar)) progbar.update(world.time - starttime + resume_time) - if(QDELETED(user) || QDELETED(target)) - . = 0 - break - if(uninterruptible) - continue - if(!(target in user.do_afters)) - . = FALSE - break - - if(!(target in user.do_afters)) - . = FALSE - break if(drifting && !user.inertia_dir) - drifting = 0 + drifting = FALSE user_loc = user.loc - if((!drifting && user.loc != user_loc) || target.loc != target_loc || (!ignorehelditem && user.get_active_held_item() != holding) || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke())) - . = 0 + if( + QDELETED(user) || QDELETED(target) \ + || (!(timed_action_flags & IGNORE_TARGET_IN_DOAFTERS) && !(target in user.do_afters)) \ + || (!(timed_action_flags & IGNORE_USER_LOC_CHANGE) && !drifting && user.loc != user_loc) \ + || (!(timed_action_flags & IGNORE_TARGET_LOC_CHANGE) && target.loc != target_loc) \ + || (!(timed_action_flags & IGNORE_HELD_ITEM) && user.get_active_held_item() != holding) \ + || (!(timed_action_flags & IGNORE_INCAPACITATED) && user.incapacitated()) \ + || (extra_checks && !extra_checks.Invoke()) \ + ) + . = FALSE break if(!QDELETED(progbar)) @@ -229,29 +63,25 @@ checked_health["health"] = health return ..() -/proc/do_after(mob/user, var/delay, needhand = 1, atom/target = null, progress = 1, datum/callback/extra_checks = null, required_mobility_flags = (MOBILITY_USE|MOBILITY_MOVE), resume_time = 0 SECONDS) +/proc/do_after(mob/user, delay, atom/target, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks, resume_time = 0 SECONDS) if(!user) - return 0 - var/atom/Tloc = null + return FALSE + var/atom/target_loc = null if(target && !isturf(target)) - Tloc = target.loc + target_loc = target.loc if(target) LAZYADD(user.do_afters, target) LAZYADD(target.targeted_by, user) - var/atom/Uloc = user.loc + var/atom/user_loc = user.loc - var/drifting = 0 + var/drifting = FALSE if(!user.Process_Spacemove(0) && user.inertia_dir) - drifting = 1 + drifting = TRUE var/holding = user.get_active_held_item() - var/holdingnull = 1 //User's hand started out empty, check for an empty hand - if(holding) - holdingnull = 0 //Users hand started holding something, check to see if it's still holding that - delay *= user.cached_multiplicative_actions_slowdown var/datum/progressbar/progbar @@ -260,8 +90,7 @@ var/endtime = world.time + delay var/starttime = world.time - . = 1 - var/mob/living/L = isliving(user) && user //evals to last thing eval'd + . = TRUE while (world.time + resume_time < endtime) stoplag(1) if (progress) @@ -269,36 +98,32 @@ progbar.update(world.time - starttime + resume_time) if(drifting && !user.inertia_dir) - drifting = 0 - Uloc = user.loc + drifting = FALSE + user_loc = user.loc - if(L && !CHECK_ALL_MOBILITY(L, required_mobility_flags)) - . = 0 - break - - if(QDELETED(user) || user.stat || (!drifting && user.loc != Uloc) || (extra_checks && !extra_checks.Invoke())) - . = 0 - break - - if(!QDELETED(Tloc) && (QDELETED(target) || Tloc != target.loc)) - if((Uloc != Tloc || Tloc != user) && !drifting) - . = 0 - break - - if(target && !(target in user.do_afters)) + if( + QDELETED(user) \ + || (!(timed_action_flags & IGNORE_USER_LOC_CHANGE) && !drifting && user.loc != user_loc) \ + || (!(timed_action_flags & IGNORE_HELD_ITEM) && user.get_active_held_item() != holding) \ + || (!(timed_action_flags & IGNORE_INCAPACITATED) && user.incapacitated()) \ + || (extra_checks && !extra_checks.Invoke()) \ + ) . = FALSE break - if(needhand) - //This might seem like an odd check, but you can still need a hand even when it's empty - //i.e the hand is used to pull some item/tool out of the construction - if(!holdingnull) - if(!holding) - . = 0 - break - if(user.get_active_held_item() != holding) - . = 0 - break + if( + !(timed_action_flags & IGNORE_TARGET_LOC_CHANGE) \ + && !drifting \ + && !QDELETED(target_loc) \ + && (QDELETED(target) || target_loc != target.loc) \ + && ((user_loc != target_loc || target_loc != user)) \ + ) + . = FALSE + break + + if(target && !(timed_action_flags & IGNORE_TARGET_IN_DOAFTERS) && !(target in user.do_afters)) + . = FALSE + break if(!QDELETED(progbar)) progbar.end_progress() @@ -310,16 +135,16 @@ LAZYREMOVE(user.do_afters, target) LAZYREMOVE(target.targeted_by, user) -/proc/do_after_mob(mob/user, var/list/targets, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks) +/proc/do_after_mob(mob/user, list/targets, time = 3 SECONDS, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks) if(!user || !targets) - return 0 + return FALSE if(!islist(targets)) targets = list(targets) var/user_loc = user.loc - var/drifting = 0 + var/drifting = FALSE if(!user.Process_Spacemove(0) && user.inertia_dir) - drifting = 1 + drifting = TRUE var/list/originalloc = list() for(var/atom/target in targets) @@ -337,26 +162,39 @@ var/endtime = world.time + time var/starttime = world.time . = 1 - mainloop: - while(world.time < endtime) - stoplag(1) - if(progress) - if(!QDELETED(progbar)) - progbar.update(world.time - starttime) - if(QDELETED(user) || !targets) - . = 0 + while(world.time < endtime) + stoplag(1) + + if(!QDELETED(progbar)) + progbar.update(world.time - starttime) + if(QDELETED(user) || !length(targets)) + . = FALSE + break + + if(drifting && !user.inertia_dir) + drifting = FALSE + user_loc = user.loc + + if( + !((timed_action_flags & IGNORE_USER_LOC_CHANGE) && !drifting && user_loc != user.loc) \ + || (!(timed_action_flags & IGNORE_HELD_ITEM) && user.get_active_held_item() != holding) \ + || (!(timed_action_flags & IGNORE_INCAPACITATED) && user.incapacitated()) \ + || (extra_checks && !extra_checks.Invoke()) \ + ) + . = FALSE + break + + for(var/t in targets) + var/atom/target = t + if( + (QDELETED(target)) \ + || (!(timed_action_flags & IGNORE_TARGET_LOC_CHANGE) && originalloc[target] != target.loc) \ + ) + . = FALSE break - if(uninterruptible) - continue - if(drifting && !user.inertia_dir) - drifting = 0 - user_loc = user.loc - - for(var/atom/target in targets) - if((!drifting && user_loc != user.loc) || QDELETED(target) || originalloc[target] != target.loc || user.get_active_held_item() != holding || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke())) - . = 0 - break mainloop + if(!.) // In case the for-loop found a reason to break out of the while. + break if(!QDELETED(progbar)) progbar.end_progress() diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 698d20ff11..2720f87c3d 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1340,7 +1340,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) return temp //same as do_mob except for movables and it allows both to drift and doesn't draw progressbar -/proc/do_atom(atom/movable/user , atom/movable/target, time = 30, uninterruptible = 0,datum/callback/extra_checks = null) +/proc/do_atom(atom/movable/user, atom/movable/target, time = 3 SECONDS, timed_action_flags = NONE, datum/callback/extra_checks) if(!user || !target) return TRUE var/user_loc = user.loc @@ -1359,11 +1359,10 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) . = TRUE while (world.time < endtime) stoplag(1) + if(QDELETED(user) || QDELETED(target)) - . = 0 + . = FALSE break - if(uninterruptible) - continue if(drifting && !user.inertia_dir) drifting = FALSE @@ -1373,7 +1372,11 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) target_drifting = FALSE target_loc = target.loc - if((!drifting && user.loc != user_loc) || (!target_drifting && target.loc != target_loc) || (extra_checks && !extra_checks.Invoke())) + if( + (!(timed_action_flags & IGNORE_USER_LOC_CHANGE) && !drifting && user.loc != user_loc) \ + || (!(timed_action_flags& IGNORE_TARGET_LOC_CHANGE) && !target_drifting && target.loc != target_loc) \ + || (extra_checks && !extra_checks.Invoke()) \ + ) . = FALSE break diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 506639928e..5bce26d514 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -335,7 +335,7 @@ GLOBAL_LIST_INIT(unlocked_mutant_parts, list("horns", "insect_fluff")) GLOBAL_LIST_INIT(colored_mutant_parts, list("insect_wings" = "wings_color", "deco_wings" = "wings_color", "horns" = "horns_color")) //body ids that have greyscale sprites -GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant","jelly","slime","golem","slimelumi","stargazer","mush","ethereal","snail","c_golem","b_golem","mammal","xeno","ipc","insect","synthliz","avian","aquatic", "shadekin")) +GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant","jelly","slime","golem","slimelumi","stargazer","mush","ethereal","snail","c_golem","b_golem","mammal","xeno","ipc","insect","synthliz","avian","aquatic", "shadekin", "teshari", "vox")) //body ids that have prosthetic sprites GLOBAL_LIST_INIT(prosthetic_limb_types, list("xion","bishop","cybersolutions","grayson","hephaestus","nanotrasen","talon","veymed")) //I don't know if i can module this to splurt @@ -344,7 +344,7 @@ GLOBAL_LIST_INIT(prosthetic_limb_types, list("xion","bishop","cybersolutions","g GLOBAL_LIST_INIT(nongendered_limb_types, list("fly", "zombie" ,"synth", "shadow", "cultgolem", "agent", "plasmaman", "clockgolem", "clothgolem")) //list of eye types, corresponding to a respective left and right icon state for the set of eyes -GLOBAL_LIST_INIT(eye_types, list("normal", "insect", "moth", "double", "double2", "double3", "spider", "cyclops", "third", "spectre", "shadekin", "noodle", "none")) +GLOBAL_LIST_INIT(eye_types, list("normal", "insect", "moth", "double", "double2", "double3", "spider", "cyclops", "third", "spectre", "shadekin", "teshari", "vox", "noodle", "none")) //list linking bodypart bitflags to their actual names GLOBAL_LIST_INIT(bodypart_names, list(num2text(HEAD) = "Head", num2text(CHEST) = "Chest", num2text(LEG_LEFT) = "Left Leg", num2text(LEG_RIGHT) = "Right Leg", num2text(ARM_LEFT) = "Left Arm", num2text(ARM_RIGHT) = "Right Arm")) diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 3bab2bfdf3..e760ea12e6 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -29,11 +29,7 @@ SUBSYSTEM_DEF(air) var/list/hotspots = list() var/list/networks = list() var/list/pipenets_needing_rebuilt = list() - var/list/deferred_airs = list() - var/cur_deferred_airs = 0 - var/max_deferred_airs = 0 var/list/obj/machinery/atmos_machinery = list() - var/list/obj/machinery/atmos_air_machinery = list() var/list/pipe_init_dirs_cache = list() //atmos singletons @@ -56,9 +52,7 @@ SUBSYSTEM_DEF(air) // Max number of turfs to look for a space turf, and max number of turfs that will be decompressed. var/equalize_hard_turf_limit = 2000 // Whether equalization is enabled. Can be disabled for performance reasons. - var/equalize_enabled = TRUE - // Whether equalization should be enabled. - var/should_do_equalization = TRUE + var/equalize_enabled = FALSE // When above 0, won't equalize; performance handling var/eq_cooldown = 0 // Whether turf-to-turf heat exchanging should be enabled. @@ -97,7 +91,6 @@ SUBSYSTEM_DEF(air) msg += "LT:[low_pressure_turfs]|" msg += "ET:[num_equalize_processed]|" msg += "GT:[num_group_turfs_processed]|" - msg += "DF:[max_deferred_airs]|" msg += "GA:[get_amt_gas_mixes()]|" msg += "MG:[get_max_gas_mixes()]" return ..() @@ -108,8 +101,8 @@ SUBSYSTEM_DEF(air) setup_atmos_machinery() setup_pipenets() gas_reactions = init_gas_reactions() - should_do_equalization = CONFIG_GET(flag/atmos_equalize_enabled) auxtools_update_reactions() + equalize_enabled = CONFIG_GET(flag/atmos_equalize_enabled) return ..() /datum/controller/subsystem/air/proc/extools_update_ssair() @@ -157,6 +150,35 @@ SUBSYSTEM_DEF(air) if(state != SS_RUNNING) return resumed = FALSE + currentpart = SSAIR_ACTIVETURFS + + if(currentpart == SSAIR_ACTIVETURFS) + timer = TICK_USAGE_REAL + process_turfs(resumed) + if(state != SS_RUNNING) + return + resumed = 0 + currentpart = SSAIR_EXCITEDGROUPS + + if(currentpart == SSAIR_EXCITEDGROUPS) + process_excited_groups(resumed) + if(state != SS_RUNNING) + return + resumed = 0 + currentpart = equalize_enabled ? SSAIR_EQUALIZE : SSAIR_FINALIZE_TURFS + + if(currentpart == SSAIR_EQUALIZE) + equalize_turfs(resumed) + if(state != SS_RUNNING) + return + resumed = 0 + currentpart = SSAIR_FINALIZE_TURFS + + if(currentpart == SSAIR_FINALIZE_TURFS) + finish_turf_processing(resumed) + if(state != SS_RUNNING) + return + resumed = FALSE currentpart = SSAIR_PIPENETS if(currentpart == SSAIR_PIPENETS || !resumed) @@ -167,7 +189,6 @@ SUBSYSTEM_DEF(air) return resumed = 0 currentpart = SSAIR_ATMOSMACHINERY - // This is only machinery like filters, mixers that don't interact with air if(currentpart == SSAIR_ATMOSMACHINERY) timer = TICK_USAGE_REAL process_atmos_machinery(resumed) @@ -184,34 +205,6 @@ SUBSYSTEM_DEF(air) if(state != SS_RUNNING) return resumed = 0 - currentpart = SSAIR_FINALIZE_TURFS - // This literally just waits for the turf processing thread to finish, doesn't do anything else. - // this is necessary cause the next step after this interacts with the air--we get consistency - // issues if we don't wait for it, disappearing gases etc. - if(currentpart == SSAIR_FINALIZE_TURFS) - finish_turf_processing(resumed) - if(state != SS_RUNNING) - cur_thread_wait_ticks++ - return - resumed = 0 - thread_wait_ticks = MC_AVERAGE(thread_wait_ticks, cur_thread_wait_ticks) - cur_thread_wait_ticks = 0 - currentpart = SSAIR_DEFERRED_AIRS - if(currentpart == SSAIR_DEFERRED_AIRS) - timer = TICK_USAGE_REAL - process_deferred_airs(resumed) - cost_deferred_airs = MC_AVERAGE(cost_deferred_airs, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) - if(state != SS_RUNNING) - return - resumed = 0 - currentpart = SSAIR_ATMOSMACHINERY_AIR - if(currentpart == SSAIR_ATMOSMACHINERY_AIR) - timer = TICK_USAGE_REAL - process_atmos_air_machinery(resumed) - cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) - if(state != SS_RUNNING) - return - resumed = 0 currentpart = SSAIR_HOTSPOTS if(currentpart == SSAIR_HOTSPOTS) @@ -221,7 +214,7 @@ SUBSYSTEM_DEF(air) if(state != SS_RUNNING) return resumed = 0 - currentpart = heat_enabled ? SSAIR_TURF_CONDUCTION : SSAIR_ACTIVETURFS + currentpart = heat_enabled ? SSAIR_TURF_CONDUCTION : SSAIR_REBUILD_PIPENETS // Heat -- slow and of questionable usefulness. Off by default for this reason. Pretty cool, though. if(currentpart == SSAIR_TURF_CONDUCTION) timer = TICK_USAGE_REAL @@ -231,48 +224,7 @@ SUBSYSTEM_DEF(air) if(state != SS_RUNNING) return resumed = 0 - currentpart = SSAIR_ACTIVETURFS - // This simply starts the turf thread. It runs in the background until the FINALIZE_TURFS step, at which point it's waited for. - // This also happens to do all the commented out stuff below, all in a single separate thread. This is mostly so that the - // waiting is consistent. - if(currentpart == SSAIR_ACTIVETURFS) - run_delay_heuristics() - timer = TICK_USAGE_REAL - process_turfs(resumed) - cost_turfs = MC_AVERAGE(cost_turfs, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) - if(state != SS_RUNNING) - return - resumed = 0 - /* - // Monstermos and/or Putnamos--making large pressure deltas move faster - if(currentpart == SSAIR_EQUALIZE) - timer = TICK_USAGE_REAL - process_turf_equalize(resumed) - cost_equalize = MC_AVERAGE(cost_equalize, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) - if(state != SS_RUNNING) - return - resumed = 0 - currentpart = SSAIR_EXCITEDGROUPS - // Making small pressure deltas equalize immediately so they don't process anymore - if(currentpart == SSAIR_EXCITEDGROUPS) - timer = TICK_USAGE_REAL - process_excited_groups(resumed) - cost_groups = MC_AVERAGE(cost_groups, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) - if(state != SS_RUNNING) - return - resumed = 0 - currentpart = SSAIR_TURF_POST_PROCESS - // Quick multithreaded "should we display/react?" checks followed by finishing those up before the next step - if(currentpart == SSAIR_TURF_POST_PROCESS) - timer = TICK_USAGE_REAL - post_process_turfs(resumed) - cost_post_process = MC_AVERAGE(cost_post_process, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) - if(state != SS_RUNNING) - return - resumed = 0 - currentpart = SSAIR_HOTSPOTS - */ - currentpart = SSAIR_REBUILD_PIPENETS + currentpart = SSAIR_REBUILD_PIPENETS /datum/controller/subsystem/air/proc/process_pipenets(resumed = 0) if (!resumed) @@ -293,32 +245,6 @@ SUBSYSTEM_DEF(air) if(istype(atmos_machine, /obj/machinery/atmospherics)) pipenets_needing_rebuilt += atmos_machine -/datum/controller/subsystem/air/proc/process_deferred_airs(resumed = 0) - cur_deferred_airs = deferred_airs.len - max_deferred_airs = max(cur_deferred_airs,max_deferred_airs) - while(deferred_airs.len) - var/list/cur_op = deferred_airs[deferred_airs.len] - deferred_airs.len-- - var/datum/gas_mixture/air1 - var/datum/gas_mixture/air2 - if(isopenturf(cur_op[1])) - var/turf/open/T = cur_op[1] - air1 = T.return_air() - else - air1 = cur_op[1] - if(isopenturf(cur_op[2])) - var/turf/open/T = cur_op[2] - air2 = T.return_air() - else - air2 = cur_op[2] - if(istype(cur_op[3], /datum/callback)) - var/datum/callback/cb = cur_op[3] - cb.Invoke(air1, air2) - else - air1.transfer_ratio_to(air2, cur_op[3]) - if(MC_TICK_CHECK) - return - /datum/controller/subsystem/air/proc/process_atmos_machinery(resumed = 0) var/seconds = wait * 0.1 if (!resumed) @@ -333,22 +259,6 @@ SUBSYSTEM_DEF(air) if(MC_TICK_CHECK) return -/datum/controller/subsystem/air/proc/process_atmos_air_machinery(resumed = 0) - var/seconds = wait * 0.1 - if (!resumed) - src.currentrun = atmos_air_machinery.Copy() - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - while(currentrun.len) - var/obj/machinery/M = currentrun[currentrun.len] - currentrun.len-- - if(!M || (M.process_atmos(seconds) == PROCESS_KILL)) - atmos_air_machinery.Remove(M) - if(MC_TICK_CHECK) - return - -/datum/controller/subsystem/air/proc/process_turf_heat() - /datum/controller/subsystem/air/proc/process_hotspots(resumed = 0) if (!resumed) src.currentrun = hotspots.Copy() @@ -376,78 +286,31 @@ SUBSYSTEM_DEF(air) return /datum/controller/subsystem/air/proc/process_turf_equalize(resumed = 0) - if(process_turf_equalize_auxtools(resumed,TICK_REMAINING_MS)) + if(process_turf_equalize_auxtools(TICK_REMAINING_MS)) pause() - /* - //cache for sanic speed - var/fire_count = times_fired - if (!resumed) - src.currentrun = active_turfs.Copy() - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - while(currentrun.len) - var/turf/open/T = currentrun[currentrun.len] - currentrun.len-- - if (T) - T.equalize_pressure_in_zone(fire_count) - //equalize_pressure_in_zone(T, fire_count) - if (MC_TICK_CHECK) - return - */ - -/datum/controller/subsystem/air/proc/run_delay_heuristics() - if(should_do_equalization) - if(!equalize_enabled) - cost_equalize = 0 - if(should_do_equalization) - eq_cooldown-- - if(eq_cooldown <= 0) - equalize_enabled = TRUE - else - equalize_enabled = FALSE - var/total_thread_time = cost_turfs + cost_equalize + cost_groups + cost_post_process - if(total_thread_time) - var/wait_ms = wait * 100 - var/delay_threshold = 1-(total_thread_time/wait_ms + cur_deferred_airs / 50) - share_max_steps = max(1,round(share_max_steps_target * delay_threshold, 1)) - eq_cooldown += (1-delay_threshold) * (cost_equalize / total_thread_time) * 2 - if(eq_cooldown > 0.5) - equalize_enabled = FALSE - excited_group_pressure_goal = max(0,excited_group_pressure_goal_target * delay_threshold) - /datum/controller/subsystem/air/proc/process_turfs(resumed = 0) - if(process_turfs_auxtools(resumed,TICK_REMAINING_MS)) + if(process_turfs_auxtools(TICK_REMAINING_MS)) pause() - /* - //cache for sanic speed - var/fire_count = times_fired - if (!resumed) - src.currentrun = active_turfs.Copy() - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - while(currentrun.len) - var/turf/open/T = currentrun[currentrun.len] - currentrun.len-- - if (T) - T.process_cell(fire_count) - if (MC_TICK_CHECK) - return - */ /datum/controller/subsystem/air/proc/process_excited_groups(resumed = 0) - if(process_excited_groups_auxtools(resumed,TICK_REMAINING_MS)) + if(process_excited_groups_auxtools(TICK_REMAINING_MS)) pause() /datum/controller/subsystem/air/proc/finish_turf_processing(resumed = 0) - if(finish_turf_processing_auxtools(TICK_REMAINING_MS) || thread_running()) + if(finish_turf_processing_auxtools(TICK_REMAINING_MS)) + pause() + +/datum/controller/subsystem/air/proc/equalize_turfs(resumed = 0) + if(equalize_turfs_auxtools(TICK_REMAINING_MS)) pause() /datum/controller/subsystem/air/proc/post_process_turfs(resumed = 0) - if(post_process_turfs_auxtools(resumed,TICK_REMAINING_MS)) + if(post_process_turfs_auxtools(TICK_REMAINING_MS)) pause() /datum/controller/subsystem/air/proc/finish_turf_processing_auxtools() +/datum/controller/subsystem/air/proc/equalize_turfs_auxtools() /datum/controller/subsystem/air/proc/process_turfs_auxtools() /datum/controller/subsystem/air/proc/post_process_turfs_auxtools() /datum/controller/subsystem/air/proc/process_turf_equalize_auxtools() @@ -456,6 +319,7 @@ SUBSYSTEM_DEF(air) /datum/controller/subsystem/air/proc/get_max_gas_mixes() /datum/controller/subsystem/air/proc/turf_process_time() /datum/controller/subsystem/air/proc/heat_process_time() +/datum/controller/subsystem/air/proc/process_turf_heat() /datum/controller/subsystem/air/StartLoadingMap() map_loading = TRUE @@ -478,7 +342,7 @@ SUBSYSTEM_DEF(air) CHECK_TICK /datum/controller/subsystem/air/proc/setup_atmos_machinery() - for (var/obj/machinery/atmospherics/AM in atmos_machinery + atmos_air_machinery) + for (var/obj/machinery/atmospherics/AM in atmos_machinery) AM.atmosinit() CHECK_TICK @@ -486,7 +350,7 @@ SUBSYSTEM_DEF(air) // all atmos machinery has to initalize before the first // pipenet can be built. /datum/controller/subsystem/air/proc/setup_pipenets() - for (var/obj/machinery/atmospherics/AM in atmos_machinery + atmos_air_machinery) + for (var/obj/machinery/atmospherics/AM in atmos_machinery) AM.build_network() CHECK_TICK diff --git a/code/datums/components/storage/concrete/rped.dm b/code/datums/components/storage/concrete/rped.dm index 9d85dc6173..bf96ae436f 100644 --- a/code/datums/components/storage/concrete/rped.dm +++ b/code/datums/components/storage/concrete/rped.dm @@ -37,7 +37,7 @@ to_chat(M, "You start dumping out tier/cell rating [lowest_rating] parts from [parent].") var/turf/T = get_turf(A) var/datum/progressbar/progress = new(M, length(things), T) - while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress, TRUE, M))) + while (do_after(M, 1 SECONDS, T, NONE, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress, TRUE, M))) stoplag(1) progress.end_progress() A.do_squish(0.8, 1.2) @@ -81,7 +81,7 @@ to_chat(M, "You start dumping out tier/cell rating [lowest_rating] parts from [parent].") var/turf/T = get_turf(A) var/datum/progressbar/progress = new(M, length(things), T) - while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress, TRUE, M))) + while (do_after(M, 10, T, NONE, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress, TRUE, M))) stoplag(1) progress.end_progress() A.do_squish(0.8, 1.2) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 40daac88cf..76c5830765 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -213,7 +213,7 @@ return var/datum/progressbar/progress = new(M, len, I.loc) var/list/rejections = list() - while(do_after(M, 10, TRUE, parent, FALSE, CALLBACK(src, .proc/handle_mass_pickup, things, I.loc, rejections, progress))) + while(do_after(M, 1 SECONDS, parent, NONE, FALSE, CALLBACK(src, .proc/handle_mass_pickup, things, I.loc, rejections, progress))) stoplag(1) progress.end_progress() to_chat(M, "You put everything you could [insert_preposition] [parent].") @@ -271,7 +271,7 @@ var/turf/T = get_turf(A) var/list/things = contents() var/datum/progressbar/progress = new(M, length(things), T) - while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress, TRUE, M))) + while(do_after(M, 1 SECONDS, T, NONE, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress, TRUE, M))) stoplag(1) progress.end_progress() A.do_squish(0.8, 1.2) @@ -438,7 +438,7 @@ if(isrevenant(M)) INVOKE_ASYNC(GLOBAL_PROC, .proc/RevenantThrow, over_object, M, source) return - if(check_locked(null, M) || !M.CanReach(A) || (!M.CanReach(over_object) && !istype(over_object, /atom/movable/screen))) + if(check_locked(null, M) || !M.CanReach(A)) return playsound(A, "rustle", 50, TRUE, -5) A.do_jiggle() @@ -674,7 +674,7 @@ var/atom/A = parent update_actions() for(var/mob/M in range(1, A)) - if(M.active_storage == src) + if(M.active_storage == src && (M != user)) close(M) /datum/component/storage/proc/signal_take_obj(datum/source, atom/movable/AM, new_loc, force = FALSE) diff --git a/code/datums/elements/scavenging.dm b/code/datums/elements/scavenging.dm index 1993005be7..e6e3279a6b 100644 --- a/code/datums/elements/scavenging.dm +++ b/code/datums/elements/scavenging.dm @@ -98,7 +98,7 @@ if(len_messages >= 3) msg_blind = "[search_texts[3]]" user.visible_message("[user] [search_texts[1]] [source].", msg_first_person, msg_blind) - if(do_after(user, scavenge_time * speed_multi, TRUE, source, TRUE, CALLBACK(src, .proc/set_progress, source, world.time), resume_time = progress_done * speed_multi)) + if(do_after(user, scavenge_time * speed_multi, source, NONE, TRUE, CALLBACK(src, .proc/set_progress, source, world.time), resume_time = progress_done * speed_multi)) spawn_loot(source, user) players_busy_scavenging -= user diff --git a/code/datums/elements/strippable.dm b/code/datums/elements/strippable.dm index 85fea3533e..5b2480a5bc 100644 --- a/code/datums/elements/strippable.dm +++ b/code/datums/elements/strippable.dm @@ -295,7 +295,7 @@ if(istype(gloves)) strip_mod = gloves.strip_mod - if (!do_mob(user, source, (strip_delay || item.strip_delay) / strip_mod, ignorehelditem = TRUE)) + if (!do_mob(user, source, (strip_delay || item.strip_delay) / strip_mod, timed_action_flags = IGNORE_HELD_ITEM)) return FALSE return TRUE diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index 824b0551e1..700407b140 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -37,6 +37,8 @@ else if(!originmastercommit) msg += "No commit information" + msg += "Running rust-g version [rustg_get_version()]" + return msg.Join("\n") /datum/getrev/proc/GetTestMergeInfo(header = TRUE) diff --git a/code/datums/screentips/screentips.dm b/code/datums/screentips/screentips.dm index 899d0d7f50..94dedbeac9 100644 --- a/code/datums/screentips/screentips.dm +++ b/code/datums/screentips/screentips.dm @@ -18,7 +18,7 @@ GLOBAL_LIST_INIT_TYPED(screentip_context_icons, /image, prepare_screentip_contex * - allow_image = boolean (not required) */ /proc/build_context(list/context, key, allow_image) - if(!(length(context) && length(context[key]) && key)) + if(!length(context) || !length(context[key]) || !key) return "" var/list/to_add for(var/intent in context[key]) diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index add0668950..c666c70463 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -32,11 +32,17 @@ if(!cached_map) return - discover_port_offset() + //SPLURT EDIT + var/offset = discover_offset(/obj/docking_port/mobile) + + port_x_offset = offset[1] + port_y_offset = offset[2] + //SPLURT EDIT END if(!cached_map) cached_map = null +/* SPLURT EDIT - Refractored in modular /datum/map_template/shuttle/proc/discover_port_offset() var/key var/list/models = cached_map.grid_models @@ -56,6 +62,7 @@ return ++xcrd --ycrd +*/ /datum/map_template/shuttle/load(turf/T, centered = FALSE, orientation = SOUTH, annihilate = default_annihilate, force_cache = FALSE, rotate_placement_to_orientation = FALSE, register = TRUE) . = ..() diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 05865d904c..0d44c3b554 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -977,7 +977,7 @@ if(usr != owner) return to_chat(owner, "You attempt to remove the durathread strand from around your neck.") - if(do_after(owner, 35, null, owner)) + if(do_after(owner, 3.5 SECONDS, owner)) if(isliving(owner)) var/mob/living/L = owner to_chat(owner, "You successfully remove the durathread strand.") diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm index 26881fe94c..34c83b9a8e 100644 --- a/code/datums/status_effects/gas.dm +++ b/code/datums/status_effects/gas.dm @@ -27,7 +27,7 @@ /datum/status_effect/freon/proc/owner_resist() to_chat(owner, "You start breaking out of the ice cube!") - if(do_mob(owner, owner, 40)) + if(do_mob(owner, owner, 4 SECONDS)) if(!QDELETED(src)) to_chat(owner, "You break out of the ice cube!") owner.remove_status_effect(/datum/status_effect/freon) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index e0409d4259..6927890e79 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -924,7 +924,7 @@ if(STR == src_object) progress.end_progress() return - while (do_after(user, 10, TRUE, src, FALSE, CALLBACK(STR, /datum/component/storage.proc/handle_mass_item_insertion, things, src_object, user, progress))) + while(do_after(user, 1 SECONDS, src, NONE, FALSE, CALLBACK(STR, /datum/component/storage.proc/handle_mass_item_insertion, things, src_object, user, progress))) stoplag(1) progress.end_progress() to_chat(user, "You dump as much of [src_object.parent]'s contents into [STR.insert_preposition]to [src] as you can.") diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index 5200ab839e..7eb6c79eef 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -73,11 +73,11 @@ /obj/machinery/air_sensor/Initialize(mapload) . = ..() - SSair.atmos_air_machinery += src + SSair.atmos_machinery += src set_frequency(frequency) /obj/machinery/air_sensor/Destroy() - SSair.atmos_air_machinery -= src + SSair.atmos_machinery -= src SSradio.remove_object(src, frequency) return ..() diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 20d3a7af61..d4112b1418 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -440,9 +440,10 @@ GLOBAL_LIST_EMPTY(cryopod_computers) else if(ishuman(mob_occupant)) var/mob/living/carbon/human/H = mob_occupant - var/mob/living/carbon/human/H_original_caharcter = H.mind.original_character.resolve() - if(H.mind && H.client && H.client.prefs && H == H_original_caharcter) - H.SaveTCGCards() + if(H.mind && H.client && H.client.prefs) + var/mob/living/carbon/human/H_original_character = H.mind.original_character?.resolve() + if(H_original_character && H == H_original_character) + H.SaveTCGCards() var/list/gear = list() if(iscarbon(mob_occupant)) // sorry simp-le-mobs deserve no mercy diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 0e1a67316b..7b0ff1d319 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -191,7 +191,7 @@ if(is_holding_pressure()) // tell the user that this is a bad idea, and have a do_after as well to_chat(user, "As you begin crowbarring \the [src] a gush of air blows in your face... maybe you should reconsider?") - if(!do_after(user, 15, TRUE, src)) // give them a few seconds to reconsider their decision. + if(!do_after(user, 1.5 SECONDS, src)) // give them a few seconds to reconsider their decision. return log_game("[key_name_admin(user)] has opened a firelock with a pressure difference at [AREACOORD(loc)]") // there bibby I made it logged just for you. Enjoy. // since we have high-pressure-ness, close all other firedoors on the tile diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 30c8eb3a86..93b85bb45b 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -222,7 +222,7 @@ usr.visible_message("[usr] switches [on ? "on" : "off"] \the [src].", "You switch [on ? "on" : "off"] \the [src].") update_icon() if (on) - SSair.atmos_air_machinery += src + SSair.atmos_machinery += src . = TRUE if("mode") setMode = params["mode"] diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index 91d37e08f7..5cf563b9da 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -25,7 +25,7 @@ . = ..() if(stored) to_chat(user, "You start struggling to pry the [stored] from the [src]...") - if(!do_after(user, 30 SECONDS, TRUE, src)) + if(!do_after(user, 30 SECONDS, src)) to_chat(user, "Your fingers slip as you fail to pry the [stored] from the [src], clicking it right back into the slot!") return user.put_in_hands(stored) @@ -83,7 +83,6 @@ use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 100 - // SKYRAT EDIT: Adds a circuit for the message server. circuit = /obj/item/circuitboard/machine/telecomms/message_server id = "Messaging Server" diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index bdfb9798b7..00fde9f9f5 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -112,7 +112,7 @@ var/new_appearance = show_radial_menu(user, src, possible_appearances, custom_check = CALLBACK(src, .proc/check_menu, user, crayon), radius = 36, require_near = TRUE) if(!new_appearance) return - if(!do_after(user, 10, FALSE, src, TRUE)) + if(!do_after(user, 1 SECONDS, src, timed_action_flags = IGNORE_HELD_ITEM)) return FALSE if(!check_menu(user, crayon)) return FALSE diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index aea961860d..880358a2c1 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -447,7 +447,7 @@ M.visible_message("[user] hastily places [src] on [M]'s chest!", \ "[user] hastily places [src] on [M]'s chest!") busy = TRUE - if(do_after(user, isnull(defib?.disarm_shock_time)? disarm_shock_time : defib.disarm_shock_time, target = M)) + if(do_after(user, isnull(defib?.disarm_shock_time)? disarm_shock_time : defib.disarm_shock_time, M)) M.visible_message("[user] zaps [M] with [src]!", \ "[user] zaps [M] with [src]!") M.DefaultCombatKnockdown(140) @@ -477,7 +477,7 @@ "You overcharge the paddles and begin to place them onto [H]'s chest...") busy = TRUE update_icon() - if(do_after(user, 30, target = H)) + if(do_after(user, 3 SECONDS, H)) user.visible_message("[user] places [src] on [H]'s chest.", "You place [src] on [H]'s chest and begin to charge them.") var/turf/T = get_turf(defib) @@ -486,7 +486,7 @@ T.audible_message("\The [defib] lets out an urgent beep and lets out a steadily rising hum...") else user.audible_message("[src] let out an urgent beep.") - if(do_after(user, 30, target = H)) //Takes longer due to overcharging + if(do_after(user, 3 SECONDS, H)) //Takes longer due to overcharging if(!H) busy = FALSE update_icon() @@ -542,7 +542,7 @@ primetimer2 = 20 deathtimer = DEFIB_TIME_LOSS * 10 - if(do_after(user, primetimer, target = H)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process + if(do_after(user, primetimer, H)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process user.visible_message("[user] places [src] on [H]'s chest.", "You place [src] on [H]'s chest.") playsound(src, 'sound/machines/defib_charge.ogg', 75, 0) // patients rot when they are killed, and die when they are dead @@ -551,7 +551,7 @@ var/total_burn = 0 var/total_brute = 0 var/obj/item/organ/heart = H.getorgan(/obj/item/organ/heart) - if(do_after(user, primetimer2, target = H)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total + if(do_after(user, primetimer2, H)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total for(var/obj/item/carried_item in H.contents) if(istype(carried_item, /obj/item/clothing/suit/space)) if((!combat && !req_defib) || (req_defib && !defib.combat)) diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm index e028d0d797..c2e16c978d 100644 --- a/code/game/objects/items/devices/dogborg_sleeper.dm +++ b/code/game/objects/items/devices/dogborg_sleeper.dm @@ -100,7 +100,7 @@ voracious = FALSE user.visible_message("[hound.name] is carefully inserting [target.name] into their [src.name].", "You start placing [target] into your [src.name]...") - if(do_after (user, 100, target = target) && !target.buckled && !target.anchored && !patient) + if(do_after(user, 10 SECONDS, target) && !target.buckled && !target.anchored && !patient) if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. return //If they moved away, you can't eat them. @@ -147,7 +147,7 @@ "[voracious ? "You start struggling inside of [src.name]'s tight, flexible confines," : "You start pounding against the metallic walls of [src.name],"] managing to trigger a hidden emergency release... (this will take about [DisplayTimeText(breakout_time)].)", \ "You hear a [voracious ? "couple of thumps" : "loud banging noise"] coming from within [hound].") escape_pending = TRUE - if(do_after(user, breakout_time, target = src)) + if(do_after(user, breakout_time, src, IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM)) user.visible_message("[user] successfully broke out of [hound.name]!", \ "You successfully break out of [hound.name]!") go_out(user, hound) @@ -499,7 +499,7 @@ voracious = FALSE user.visible_message("[hound.name] is ingesting [target] into their [src.name].", "You start ingesting [target] into your [src.name]...") - if(do_after(user, 30, target = target) && !patient && !target.buckled) + if(do_after(user, 3 SECONDS, target) && !patient && !target.buckled) //if(patient) //to_chat(user,"Your [src.name] is already occupied.") diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm index 39c8143ee9..046f7ea1ab 100644 --- a/code/game/objects/items/eightball.dm +++ b/code/game/objects/items/eightball.dm @@ -62,7 +62,7 @@ shaking = TRUE start_shaking(user) - if(do_after(user, shake_time, needhand=TRUE, target=user, progress=TRUE)) + if(do_after(user, shake_time)) var/answer = get_answer() say(answer) diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index 7227b10298..f83d01f4ef 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -11,7 +11,7 @@ /obj/item/book/granter/proc/turn_page(mob/user) playsound(user, pick('sound/effects/pageturn1.ogg','sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg'), 30, 1) - if(do_after(user,50, TRUE, user)) + if(do_after(user, 5 SECONDS, src)) if(remarks.len) to_chat(user, "[pick(remarks)]") else @@ -53,7 +53,7 @@ on_reading_stopped() reading = FALSE return - if(do_after(user,50, TRUE, user)) + if(do_after(user, 5 SECONDS, src)) on_reading_finished(user) reading = FALSE return TRUE diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index f0cd0fc1e7..f868dfd3b9 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -139,7 +139,7 @@ /obj/item/restraints/handcuffs/cable/attack_self(mob/user) to_chat(user, "You start unwinding the cable restraints back into coil") - if(!do_after(user, 25, TRUE, user)) + if(!do_after(user, 25, user)) return qdel(src) var/obj/item/stack/cable_coil/coil = new(get_turf(user)) diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index 59ca56ff8a..e03b246402 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -244,7 +244,7 @@ if(staffcooldown + staffwait > world.time) return user.visible_message("[user] chants deeply and waves [user.p_their()] staff!") - if(do_after(user, 20,1,src)) + if(do_after(user, 2 SECONDS, src)) target.add_atom_colour(conversion_color, WASHABLE_COLOUR_PRIORITY) //wololo staffcooldown = world.time diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index f0aeead3ef..81c40ec910 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -309,7 +309,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ "You begin whittling [src] into a sharp point at one end.", \ "You hear wood carving.") // 8 Second Timer - if(!do_after(user, 80, TRUE, src)) + if(!do_after(user, 8 SECONDS, src)) return // Make Stake var/obj/item/stake/basic/new_item = new(user.loc) diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index 152091b6a3..c376b4c066 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -164,7 +164,7 @@ var/man = C == user ? "your" : "[C]'\s" user.visible_message("[user] attempts to remove the durathread strand from around [man] neck.", \ "You attempt to remove the durathread strand from around [man] neck.") - if(do_after(user, 15, null, C)) + if(do_after(user, 1.5 SECONDS, C)) user.visible_message("[user] succesfuly removes the durathread strand.", "You succesfuly remove the durathread strand.") C.remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 8e7f5a35f8..d90d44ddfd 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -468,7 +468,7 @@ user.visible_message("[src] begins to shake violently!", \ "You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \ "You hear banging from [src].") - if(do_after(user,(breakout_time), target = src, required_mobility_flags = MOBILITY_RESIST)) + if(do_after(user, breakout_time, src, IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM)) if(!user || user.stat != CONSCIOUS || user.loc != src || opened || (!locked && !welded) ) return //we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 9d8e103beb..d46a40d598 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -48,7 +48,7 @@ GM.visible_message("[user] starts to give [GM] a swirlie!", "[user] starts to give you a swirlie...") swirlie = GM var/was_alive = (swirlie.stat != DEAD) - if(do_after(user, 3 SECONDS, target = src)) + if(do_after(user, 3 SECONDS, src)) GM.visible_message("[user] gives [GM] a swirlie!", "[user] gives you a swirlie!", "You hear a toilet flushing.") if(iscarbon(GM)) var/mob/living/carbon/C = GM @@ -535,7 +535,7 @@ "You start washing your [washing_face ? "face" : "hands"]...") busy = TRUE - if(!do_after(user, 40, target = src)) + if(!do_after(user, 4 SECONDS, src)) busy = FALSE return @@ -617,7 +617,7 @@ if(user.a_intent != INTENT_HARM) to_chat(user, "You start washing [O]...") busy = TRUE - if(!do_after(user, 40, target = src)) + if(!do_after(user, 4 SECONDS, src)) busy = FALSE return 1 busy = FALSE diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index dcf687d53f..0e32c170d7 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -55,7 +55,7 @@ . = ..() if(dropping == user && isliving(user)) var/mob/living/L = user - if(L.resting && do_after(L, max(10, L.getStaminaLoss()*0.5), 0, src)) + if(L.resting && do_after(L, max(10, L.getStaminaLoss()*0.5), src, IGNORE_HELD_ITEM)) if(Adjacent(L, src)) step(L, get_dir(L, src)) playsound(L, "rustle", 25, 1) @@ -223,8 +223,6 @@ air.copy_from_turf(src) update_air_ref(planetary_atmos ? 1 : 2) - update_visuals() - ImmediateCalculateAdjacentTurfs() /turf/open/proc/GetHeatCapacity() diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index efe84828d7..8ca1832db5 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -144,10 +144,6 @@ /turf/open/floor/blob_act(obj/structure/blob/B) return -/turf/open/floor/update_icon() - . = ..() - update_visuals() - /turf/open/floor/attack_paw(mob/user) return attack_hand(user) diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 0c5455b8b7..1052e62e07 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -127,10 +127,9 @@ var/flags = NONE if(defer_change) // TODO: make the defer change var a var for any changeturf flag flags = CHANGETURF_DEFER_CHANGE - var/turf/open/mined = ScrapeAway(null, flags) + ScrapeAway(null, flags) addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE) playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE) //beautiful destruction - mined.update_visuals() /turf/closed/mineral/attack_animal(mob/living/simple_animal/user, list/modifiers) if((user.environment_smash & ENVIRONMENT_SMASH_WALLS) || (user.environment_smash & ENVIRONMENT_SMASH_RWALLS)) diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/simulated/wall/misc_walls.dm index a8d1cf2ed4..5686a2dc02 100644 --- a/code/game/turfs/simulated/wall/misc_walls.dm +++ b/code/game/turfs/simulated/wall/misc_walls.dm @@ -92,7 +92,7 @@ if(!istype(I, /obj/item/pickaxe/drill/jackhammer)) return FALSE to_chat(user, "You begin to smash though [src]...") - if(!do_after(user, 70, TRUE, src)) + if(!do_after(user, 7 SECONDS, src)) return FALSE I.play_tool_sound(src) visible_message("[user] smashes through [src] with [I]!", "You hear the grinding of metal.") diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index a42215e511..826132e860 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -388,7 +388,7 @@ GLOBAL_LIST_EMPTY(station_turfs) var/list/things = src_object.contents() var/datum/progressbar/progress = new(user, things.len, src) - while (do_after(usr, 1 SECONDS, TRUE, src, FALSE, CALLBACK(src_object, /datum/component/storage.proc/mass_remove_from_storage, src, things, progress, TRUE, user))) + while (do_after(usr, 1 SECONDS, src, NONE, FALSE, CALLBACK(src_object, /datum/component/storage.proc/mass_remove_from_storage, src, things, progress, TRUE, user))) stoplag(1) progress.end_progress() diff --git a/code/game/world.dm b/code/game/world.dm index 145d634b92..c7537d0064 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -279,6 +279,7 @@ GLOBAL_LIST(topic_status_cache) log_world("World hard rebooted at [TIME_STAMP("hh:mm:ss", FALSE)]") shutdown_logging() // See comment below. TgsEndProcess() + return ..() log_world("World rebooted at [TIME_STAMP("hh:mm:ss", FALSE)]") shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss. diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index acc431a40c..add69e3e44 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -91,7 +91,8 @@ GLOBAL_PROTECT(admin_verbs_admin) /client/proc/revokediscordbypass, //SPLURT /client/proc/addvpnbypass, //SPLURT /client/proc/revokevpnbypass, //SPLURT - /datum/admins/proc/open_borgopanel + /datum/admins/proc/open_borgopanel, + /datum/admins/proc/change_laws //change AI laws ) GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel, /client/proc/DB_ban_panel, /client/proc/stickybanpanel)) GLOBAL_PROTECT(admin_verbs_ban) diff --git a/code/modules/admin/verbs/borgpanel.dm b/code/modules/admin/verbs/borgpanel.dm index 4b60ecc0ff..ec03afff36 100644 --- a/code/modules/admin/verbs/borgpanel.dm +++ b/code/modules/admin/verbs/borgpanel.dm @@ -214,3 +214,25 @@ borg.lawsync() . = TRUE + +/datum/admins/proc/change_laws() + set category = "Admin.Player Interaction" + set name = "Change Silicon Laws" + set desc = "Change Silicon Laws" + + if(!check_rights(R_ADMIN)) + return + var/chosensilicon = input("Select a Silicon", "Select a Silicon", null, null) as null|anything in GLOB.silicon_mobs + if (!istype(chosensilicon, /mob/living/silicon)) + to_chat(usr, "Silicon is required for law changes", confidential=TRUE) + return + var/chosen = pick_closest_path(null, make_types_fancy(typesof(/obj/item/aiModule))) + if (!chosen) + return + var/new_board = new chosen(src) + var/obj/item/aiModule/chosenboard = new_board + var/mob/living/silicon/beepboop = chosensilicon + chosenboard.install(beepboop.laws, usr) + message_admins("[key_name_admin(usr)] added [chosenboard] to [ADMIN_LOOKUPFLW(beepboop)].") + log_admin("[key_name(usr)] added [chosenboard] to [key_name(beepboop)].") + qdel(new_board) diff --git a/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm b/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm index 5e6989806a..06eabd4739 100644 --- a/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm +++ b/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm @@ -81,7 +81,7 @@ // Make Attempt... to_chat(user, "You put all your weight into embedding the stake into [target]'s chest...") playsound(user, 'sound/magic/Demon_consume.ogg', 50, 1) - if(!do_mob(user, C, staketime, 0, 1, extra_checks=CALLBACK(C, /mob/living/carbon/proc/can_be_staked))) // user / target / time / uninterruptable / show progress bar / extra checks + if(!do_mob(user, C, staketime, NONE, extra_checks=CALLBACK(C, /mob/living/carbon/proc/can_be_staked))) // user / target / time / uninterruptable / show progress bar / extra checks return // Drop & Embed Stake user.visible_message("[user.name] drives the [src] into [target]'s chest!", \ diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm index 81ebdbe4e2..a4bdcfee54 100644 --- a/code/modules/antagonists/bloodsucker/powers/feed.dm +++ b/code/modules/antagonists/bloodsucker/powers/feed.dm @@ -146,7 +146,7 @@ to_chat(user, "You lean quietly toward [target] and secretly draw out your fangs...") else to_chat(user, "You pull [target] close to you and draw out your fangs...") - if(!do_mob(user, target, feed_time, 0, 1, extra_checks = CALLBACK(src, .proc/ContinueActive, user, target)))//sleep(10) + if(!do_mob(user, target, feed_time, NONE, extra_checks = CALLBACK(src, .proc/ContinueActive, user, target)))//sleep(10) to_chat(user, "Your feeding was interrupted.") //DeactivatePower(user,target) return @@ -207,7 +207,7 @@ //user.mobility_flags &= ~MOBILITY_MOVE // user.canmove = 0 // Prevents spilling blood accidentally. // Abort? A bloody mistake. - if(!do_mob(user, target, 20, 0, 0, extra_checks=CALLBACK(src, .proc/ContinueActive, user, target))) + if(!do_mob(user, target, 2 SECONDS, NONE, extra_checks=CALLBACK(src, .proc/ContinueActive, user, target))) // May have disabled Feed during do_mob if(!active || !ContinueActive(user, target)) break diff --git a/code/modules/antagonists/changeling/powers/linglink.dm b/code/modules/antagonists/changeling/powers/linglink.dm index b82f215a04..067399fb9a 100644 --- a/code/modules/antagonists/changeling/powers/linglink.dm +++ b/code/modules/antagonists/changeling/powers/linglink.dm @@ -59,7 +59,7 @@ target.reagents.add_reagent(/datum/reagent/medicine/salbutamol, 40) // So they don't choke to death while you interrogate them sleep(1800) SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]", "[i]")) - if(!do_mob(user, target, 20)) + if(!do_mob(user, target, 2 SECONDS)) to_chat(user, "Our link with [target] has ended!") changeling.islinking = 0 target.mind.linglink = 0 diff --git a/code/modules/antagonists/eldritch_cult/eldritch_book.dm b/code/modules/antagonists/eldritch_cult/eldritch_book.dm index 808932443f..ba7fcb0be1 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_book.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_book.dm @@ -43,7 +43,7 @@ /obj/item/forbidden_book/proc/get_power_from_influence(atom/target, mob/user) var/obj/effect/reality_smash/RS = target to_chat(user, "You start drawing power from influence...") - if(do_after(user,10 SECONDS,TRUE,RS)) + if(do_after(user, 10 SECONDS, RS)) qdel(RS) charge += 1 @@ -57,7 +57,7 @@ var/A = get_turf(target) to_chat(user, "You start drawing a rune...") - if(do_after(user,30 SECONDS,FALSE, user)) + if(do_after(user, 30 SECONDS, user)) new /obj/effect/eldritch/big(A) @@ -65,7 +65,7 @@ /obj/item/forbidden_book/proc/remove_rune(atom/target,mob/user) to_chat(user, "You start removing a rune...") - if(do_after(user,2 SECONDS,FALSE, user)) + if(do_after(user, 2 SECONDS, user)) qdel(target) /obj/item/forbidden_book/ui_interact(mob/user, datum/tgui/ui = null) diff --git a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm index 61ff54c5e9..97b76090a7 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm @@ -958,7 +958,7 @@ halo = halo || mutable_appearance('icons/effects/effects.dmi', "at_shield2", EFFECTS_LAYER) user.add_overlay(halo) playsound(get_turf(user), Snd, 50, 0) - if(do_mob(user,user,50,1)) + if(do_mob(user, user, 5 SECONDS)) user.cut_overlay(halo) user.emote("clap1") user.say("DOM'ENO ISPLETIMAS") diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index 3a173d55c7..885921a944 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -32,7 +32,7 @@ draining = TRUE essence_drained += rand(15, 20) to_chat(src, "You search for the soul of [target].") - if(do_after(src, rand(10, 20), 0, target)) //did they get deleted in that second? + if(do_after(src, rand(10, 20), target)) //did they get deleted in that second? if(target.ckey) to_chat(src, "[target.p_their(TRUE)] soul burns with intelligence.") essence_drained += rand(20, 30) @@ -41,7 +41,7 @@ essence_drained += rand(40, 50) else to_chat(src, "[target.p_their(TRUE)] soul is weak and faltering.") - if(do_after(src, rand(15, 20), 0, target)) //did they get deleted NOW? + if(do_after(src, rand(15, 20), target)) //did they get deleted NOW? switch(essence_drained) if(1 to 30) to_chat(src, "[target] will not yield much essence. Still, every bit counts.") @@ -51,7 +51,7 @@ to_chat(src, "Such a feast! [target] will yield much essence to you.") if(90 to INFINITY) to_chat(src, "Ah, the perfect soul. [target] will yield massive amounts of essence to you.") - if(do_after(src, rand(15, 25), 0, target)) //how about now + if(do_after(src, rand(15, 25), target)) //how about now if(!target.stat) to_chat(src, "[target.p_theyre(TRUE)] now powerful enough to fight off your draining.") to_chat(target, "You feel something tugging across your body before subsiding.") @@ -73,7 +73,7 @@ draining = FALSE return var/datum/beam/B = Beam(target,icon_state="drain_life",time=INFINITY) - if(do_after(src, 46, 0, target)) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining. + if(do_after(src, 4.6 SECONDS, target)) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining. change_essence_amount(essence_drained, FALSE, target) if(essence_drained <= 90 && target.stat != DEAD) essence_regen_cap += 5 diff --git a/code/modules/arousal/genitals_sprite_accessories.dm b/code/modules/arousal/genitals_sprite_accessories.dm index 65c71edb30..604963948a 100644 --- a/code/modules/arousal/genitals_sprite_accessories.dm +++ b/code/modules/arousal/genitals_sprite_accessories.dm @@ -15,6 +15,11 @@ alt_aroused = TRUE feat_taur = "cock_taur" +/datum/sprite_accessory/penis/teshari + icon_state = "taperedteshari" + name = "Teshari" + icon = 'modular_splurt/icons/obj/genitals/teshari_penis.dmi' + /datum/sprite_accessory/penis/human icon_state = "human" name = "Human" diff --git a/code/modules/arousal/organs/breasts.dm b/code/modules/arousal/organs/breasts.dm index 983ceee290..6c0409037e 100644 --- a/code/modules/arousal/organs/breasts.dm +++ b/code/modules/arousal/organs/breasts.dm @@ -67,7 +67,7 @@ //this is far too lewd wah /obj/item/organ/genital/breasts/modify_size(modifier, min = -INFINITY, max = INFINITY) - var/new_value = clamp(size + modifier, max(min, min_size ? min_size : -INFINITY), min(max_size ? max_size : INFINITY, max)) + var/new_value = clamp(size + modifier, max(min, min_size ? GLOB.breast_values[min_size] : -INFINITY), min(max_size ? GLOB.breast_values[max_size] : INFINITY, max)) if(new_value == size) return prev_size = size diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 0be44958f2..123f5936f4 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -56,53 +56,35 @@ /turf/open/assume_air_moles(datum/gas_mixture/giver, moles) if(!giver) return FALSE - if(SSair.thread_running()) - SSair.deferred_airs += list(list(giver, air, moles / giver.total_moles())) - else - giver.transfer_to(air, moles) - update_visuals() + giver.transfer_to(air, moles) return TRUE /turf/open/assume_air_ratio(datum/gas_mixture/giver, ratio) if(!giver) return FALSE - if(SSair.thread_running()) - SSair.deferred_airs += list(list(giver, air, ratio)) - else - giver.transfer_ratio_to(air, ratio) - update_visuals() + giver.transfer_ratio_to(air, ratio) return TRUE /turf/open/transfer_air(datum/gas_mixture/taker, moles) if(!taker || !return_air()) // shouldn't transfer from space return FALSE - if(SSair.thread_running()) - SSair.deferred_airs += list(list(air, taker, moles / air.total_moles())) - else - air.transfer_to(taker, moles) - update_visuals() + air.transfer_to(taker, moles) return TRUE /turf/open/transfer_air_ratio(datum/gas_mixture/taker, ratio) if(!taker || !return_air()) return FALSE - if(SSair.thread_running()) - SSair.deferred_airs += list(list(air, taker, ratio)) - else - air.transfer_ratio_to(taker, ratio) - update_visuals() + air.transfer_ratio_to(taker, ratio) return TRUE /turf/open/remove_air(amount) var/datum/gas_mixture/ours = return_air() var/datum/gas_mixture/removed = ours.remove(amount) - update_visuals() return removed /turf/open/remove_air_ratio(ratio) var/datum/gas_mixture/ours = return_air() var/datum/gas_mixture/removed = ours.remove_ratio(ratio) - update_visuals() return removed /turf/open/proc/copy_air_with_tile(turf/open/T) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index a59cd5b304..40b2515353 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -39,7 +39,6 @@ var/construction_type var/pipe_state //icon_state as a pipe item var/on = FALSE - var/interacts_with_air = FALSE /obj/machinery/atmospherics/Initialize(mapload) . = ..() @@ -73,10 +72,7 @@ armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 100, ACID = 70) ..() if(process) - if(interacts_with_air) - SSair.atmos_air_machinery += src - else - SSair.atmos_machinery += src + SSair.atmos_machinery += src SetInitDirections() /obj/machinery/atmospherics/Destroy() @@ -84,7 +80,6 @@ nullifyNode(i) SSair.atmos_machinery -= src - SSair.atmos_air_machinery -= src SSair.pipenets_needing_rebuilt -= src dropContents() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm index 4dd7b672a7..0232802756 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm @@ -16,8 +16,6 @@ level = 1 - interacts_with_air = TRUE - var/frequency = 0 var/id = null var/datum/radio_frequency/radio_connection diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm index c1990a0ffe..0492f529ad 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -16,7 +16,6 @@ var/datum/radio_frequency/radio_connection level = 1 - interacts_with_air = TRUE layer = GAS_SCRUBBER_LAYER pipe_state = "injector" diff --git a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm index 7cfdb9d63c..0b10f088d3 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm @@ -6,7 +6,6 @@ can_unwrench = TRUE level = 1 - interacts_with_air = TRUE layer = GAS_SCRUBBER_LAYER pipe_state = "pvent" diff --git a/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm b/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm index ee4223b157..8eb11024f7 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm @@ -5,7 +5,6 @@ icon_state = "relief_valve-e-map" can_unwrench = TRUE interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE - interacts_with_air = TRUE var/opened = FALSE var/open_pressure = ONE_ATMOSPHERE * 3 var/close_pressure = ONE_ATMOSPHERE diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 41da00980d..db0f09ba64 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -15,8 +15,6 @@ level = 1 layer = GAS_SCRUBBER_LAYER - interacts_with_air = TRUE - var/id_tag = null var/pump_direction = RELEASING diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 4ced6c0554..072babdf3e 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -13,8 +13,6 @@ level = 1 layer = GAS_SCRUBBER_LAYER - interacts_with_air = TRUE - var/id_tag = null var/scrubbing = SCRUBBING //0 = siphoning, 1 = scrubbing diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index 47deaba3c7..7830286138 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -12,7 +12,6 @@ icon_state = "miner" density = FALSE resistance_flags = INDESTRUCTIBLE|ACID_PROOF|FIRE_PROOF - interacts_with_air = TRUE var/spawn_id = null var/spawn_temp = T20C var/spawn_mol = MOLES_CELLSTANDARD * 10 diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm index b71c16b2ff..1bdc9185e5 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm @@ -6,7 +6,6 @@ buckle_lying = 1 var/icon_temperature = T20C //stop small changes in temperature causing icon refresh resistance_flags = LAVA_PROOF | FIRE_PROOF - interacts_with_air = TRUE /obj/machinery/atmospherics/pipe/heat_exchanging/Initialize(mapload) . = ..() diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 9f5dc87c30..fcfdd54aa9 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -16,7 +16,7 @@ /obj/machinery/portable_atmospherics/New() ..() - SSair.atmos_air_machinery += src + SSair.atmos_machinery += src air_contents = new(volume) air_contents.set_temperature(T20C) @@ -24,7 +24,7 @@ return 1 /obj/machinery/portable_atmospherics/Destroy() - SSair.atmos_air_machinery -= src + SSair.atmos_machinery -= src disconnect() qdel(air_contents) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 5afd5abe3e..ca2d45526d 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -115,7 +115,7 @@ MOVED TO: modular_splurt/code/module/clothing/clothing.dm to_chat(user, "You require 3 [S.name] to repair [src].") return to_chat(user, "You begin fixing the damage to [src] with [S]...") - if(do_after(user, 6 SECONDS, TRUE, src)) + if(do_after(user, 6 SECONDS, src)) if(S.use(3)) repair(user, params) return 1 diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index e17396626c..606c361ab0 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -180,7 +180,7 @@ return user.visible_message("[user] begins [tied ? "unknotting" : "tying"] the laces of [user.p_their()] [src.name].", "You begin [tied ? "unknotting" : "tying"] the laces of your [src.name]...") - if(do_after(user, lace_time, needhand=TRUE, target=our_guy, extra_checks=CALLBACK(src, .proc/still_shoed, our_guy))) + if(do_after(user, lace_time, our_guy, extra_checks = CALLBACK(src, .proc/still_shoed, our_guy))) to_chat(user, "You [tied ? "unknot" : "tie"] the laces of your [src.name].") if(tied == SHOES_UNTIED) adjust_laces(SHOES_TIED, user) @@ -204,7 +204,7 @@ if(HAS_TRAIT(user, TRAIT_CLUMSY)) // based clowns trained their whole lives for this mod_time *= 0.75 - if(do_after(user, mod_time, needhand=TRUE, target=our_guy, extra_checks=CALLBACK(src, .proc/still_shoed, our_guy))) + if(do_after(user, mod_time, our_guy, extra_checks = CALLBACK(src, .proc/still_shoed, our_guy))) to_chat(user, "You [tied ? "untie" : "knot"] the laces on [loc]'s [src.name].") if(tied == SHOES_UNTIED) adjust_laces(SHOES_KNOTTED, user) @@ -285,6 +285,6 @@ to_chat(user, "You begin [tied ? "untying" : "tying"] the laces on [src]...") - if(do_after(user, lace_time, needhand=TRUE, target=src,extra_checks=CALLBACK(src, .proc/still_shoed, user))) + if(do_after(user, lace_time, src, extra_checks = CALLBACK(src, .proc/still_shoed, user))) to_chat(user, "You [tied ? "untie" : "tie"] the laces on [src].") adjust_laces(tied ? SHOES_TIED : SHOES_UNTIED, user) diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm index 73026e546a..f48c660667 100644 --- a/code/modules/hydroponics/grown/kudzu.dm +++ b/code/modules/hydroponics/grown/kudzu.dm @@ -44,7 +44,7 @@ /obj/item/seeds/kudzu/attack_self(mob/user) user.visible_message("[user] begins throwing seeds on the ground...") - if(do_after(user, 50, needhand = TRUE, target = user.drop_location(), progress = TRUE)) + if(do_after(user, 5 SECONDS, target = user.drop_location())) plant(user) to_chat(user, "You plant the kudzu. You monster.") diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index 2330e93147..2b1a934c21 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -17,8 +17,8 @@ plasma_outfit = /datum/outfit/plasmaman/detective considered_combat_role = TRUE - access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) + access = list(ACCESS_SEC_DOORS, ACCESS_SECURITY, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_SEC_DOORS, ACCESS_SECURITY, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_SEC @@ -27,7 +27,7 @@ display_order = JOB_DISPLAY_ORDER_DETECTIVE blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/monophobia) threat = 1 - + family_heirlooms = list( /obj/item/reagent_containers/food/drinks/flask/det ) diff --git a/code/modules/library/lib_codex_gigas.dm b/code/modules/library/lib_codex_gigas.dm index 26fa5b6f3d..21296bcba9 100644 --- a/code/modules/library/lib_codex_gigas.dm +++ b/code/modules/library/lib_codex_gigas.dm @@ -52,7 +52,7 @@ correctness = 100 correctness -= U.getOrganLoss(ORGAN_SLOT_BRAIN) * 0.5 //Brain damage makes researching hard. speed += U.getOrganLoss(ORGAN_SLOT_BRAIN) * 3 - if(do_after(user, speed, 0, user)) + if(do_after(user, speed, user)) var/usedName = devilName if(!prob(correctness)) usedName += "x" diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index b848f49d0c..2c689f8ebe 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -127,7 +127,7 @@ return user.visible_message("[user] starts to pour the contents of [O] onto [src].", "You start to slowly pour the contents of [O] onto [src].") - if(!do_after(user, 60, TRUE, src)) + if(!do_after(user, 6 SECONDS, src)) to_chat(user, "You failed to pour [O] onto [src]!") return @@ -157,7 +157,7 @@ return user.visible_message("[user] starts to pour the contents of [O] onto [src].", "You start to slowly pour the contents of [O] onto [src].") - if(!do_after(user, 60, TRUE, src)) + if(!do_after(user, 6 SECONDS, src)) to_chat(user, "You failed to pour [O] onto [src]!") return diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 3ec63cea1a..a24c4a932e 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -268,7 +268,7 @@ MarkResistTime() visible_message("[src] attempts to unbuckle [p_them()]self!", \ "You attempt to unbuckle yourself... (This will take around [round(buckle_cd/600,1)] minute\s, and you need to stay still.)") - if(do_after(src, buckle_cd, 0, target = src, required_mobility_flags = MOBILITY_RESIST)) + if(do_after(src, buckle_cd, src, timed_action_flags = IGNORE_HELD_ITEM)) if(!buckled) return buckled.user_unbuckle_mob(src, src) @@ -305,13 +305,16 @@ if(I.item_flags & BEING_REMOVED) to_chat(src, "You're already attempting to remove [I]!") return + var/obj/item/restraints/R = istype(I, /obj/item/restraints) ? I : null + var/allow_breakout_movement = NONE + if(R?.allow_breakout_movement) + allow_breakout_movement = (IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE) I.item_flags |= BEING_REMOVED breakouttime = I.breakouttime - var/datum/cuffbreak_checker/cuffbreak_checker = new(get_turf(src), istype(I, /obj/item/restraints)? I : null) if(!cuff_break) visible_message("[src] attempts to remove [I]!") to_chat(src, "You attempt to remove [I]... (This will take around [DisplayTimeText(breakouttime)] and you need to stand still.)") - if(do_after_advanced(src, breakouttime, src, NONE, CALLBACK(cuffbreak_checker, /datum/cuffbreak_checker.proc/check_movement), required_mobility_flags = MOBILITY_RESIST)) + if(do_after(src, breakouttime, target = src, timed_action_flags = allow_breakout_movement)) clear_cuffs(I, cuff_break) else to_chat(src, "You fail to remove [I]!") @@ -320,7 +323,7 @@ breakouttime = 50 visible_message("[src] is trying to break [I]!") to_chat(src, "You attempt to break [I]... (This will take around 5 seconds and you need to stand still.)") - if(do_after_advanced(src, breakouttime, src, NONE, CALLBACK(cuffbreak_checker, /datum/cuffbreak_checker.proc/check_movement), required_mobility_flags = MOBILITY_RESIST)) + if(do_after(src, breakouttime, target = src, timed_action_flags = allow_breakout_movement)) clear_cuffs(I, cuff_break) else to_chat(src, "You fail to break [I]!") @@ -328,28 +331,8 @@ else if(cuff_break == INSTANT_CUFFBREAK) clear_cuffs(I, cuff_break) - QDEL_NULL(cuffbreak_checker) I.item_flags &= ~BEING_REMOVED -/datum/cuffbreak_checker - var/turf/last - var/obj/item/restraints/cuffs - -/datum/cuffbreak_checker/New(turf/initial_turf, obj/item/restraints/R) - last = initial_turf - if(R) - cuffs = R - -/datum/cuffbreak_checker/proc/check_movement(atom/user, delay, atom/target, time_left, do_after_flags, required_mobility_flags, required_combat_flags, mob_redirect, stage, initially_held_item, tool, list/passed_in) - if(get_turf(user) != last) - last = get_turf(user) - passed_in[1] = 0.5 - if(cuffs && !cuffs.allow_breakout_movement) - return DO_AFTER_STOP - else - passed_in[1] = 1 - return DO_AFTER_CONTINUE - /mob/living/carbon/proc/uncuff() if (handcuffed) var/obj/item/W = handcuffed diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index c574e77a68..7be24f08d6 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -198,7 +198,7 @@ //rock paper scissors emote handling /mob/living/carbon/human/proc/beginRockPaperScissors(var/chosen_move) GLOB.rockpaperscissors_players[src] = list(chosen_move, ROCKPAPERSCISSORS_NOT_DECIDED) - do_after_advanced(src, ROCKPAPERSCISSORS_TIME_LIMIT, src, DO_AFTER_REQUIRES_USER_ON_TURF|DO_AFTER_NO_COEFFICIENT|DO_AFTER_NO_PROGRESSBAR|DO_AFTER_DISALLOW_MOVING_ABSOLUTE_USER, CALLBACK(src, .proc/rockpaperscissors_tick)) + do_after(src, ROCKPAPERSCISSORS_TIME_LIMIT, src, extra_checks = CALLBACK(src, .proc/rockpaperscissors_tick)) var/new_entry = GLOB.rockpaperscissors_players[src] if(new_entry[2] == ROCKPAPERSCISSORS_NOT_DECIDED) to_chat(src, "You put your hand back down.") @@ -240,10 +240,10 @@ src.visible_message("[opponent] wins!") //make the progress bar end so that each player can handle the result - return DO_AFTER_STOP + return FALSE //no opponent was found, so keep searching - return DO_AFTER_PROCEED + return TRUE //the actual emotes /datum/emote/living/carbon/human/rockpaperscissors diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5aca20825d..b0cea6783f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -792,7 +792,7 @@ //src is the user that will be carrying, target is the mob to be carried /mob/living/carbon/human/proc/can_piggyback(mob/living/target) - return (iscarbon(target) || ispAI(target)) && target.stat == CONSCIOUS + return (iscarbon(target) || ispAI(target)) && target.stat == CONSCIOUS && CHECK_MOBILITY(src, MOBILITY_STAND) /mob/living/carbon/human/proc/can_be_firemanned(mob/living/carbon/target) return (ishuman(target) && !CHECK_MOBILITY(target, MOBILITY_STAND)) || ispAI(target) @@ -811,7 +811,7 @@ //Joe Medic starts quickly/expertly lifting Grey Tider onto their back.. "[carrydelay < 35 ? "Using your gloves' nanochips, you" : "You"] [skills_space]start to lift [target] onto your back[carrydelay == 40 ? ", while assisted by the nanochips in your gloves.." : "..."]") //(Using your gloves' nanochips, you/You) ( /quickly/expertly) start to lift Grey Tider onto your back(, while assisted by the nanochips in your gloves../...) - if(do_after(src, carrydelay, TRUE, target)) + if(do_after(src, carrydelay, target, extra_checks = CALLBACK(src, PROC_REF(can_be_firemanned), target))) //Second check to make sure they're still valid to be carried if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE)) buckle_mob(target, TRUE, TRUE, 90, 1, 0, TRUE) @@ -826,7 +826,7 @@ /mob/living/carbon/human/proc/piggyback(mob/living/carbon/target) if(can_piggyback(target)) visible_message("[target] starts to climb onto [src]...") - if(do_after(target, 15, target = src, required_mobility_flags = MOBILITY_STAND)) + if(do_after(target, 1.5 SECONDS, src, extra_checks = CALLBACK(src, PROC_REF(can_piggyback), target))) if(can_piggyback(target)) if(target.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE)) target.visible_message("[target] can't hang onto [src]!") diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 08fd74fa0f..7264487871 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -546,7 +546,7 @@ if(src == M) if(has_status_effect(STATUS_EFFECT_CHOKINGSTRAND)) to_chat(src, "You attempt to remove the durathread strand from around your neck.") - if(do_after(src, 35, null, src)) + if(do_after(src, 3.5 SECONDS, src)) to_chat(src, "You succesfuly remove the durathread strand.") remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND) return diff --git a/code/modules/mob/living/carbon/human/human_mobility.dm b/code/modules/mob/living/carbon/human/human_mobility.dm index dc498c4153..99577f4b05 100644 --- a/code/modules/mob/living/carbon/human/human_mobility.dm +++ b/code/modules/mob/living/carbon/human/human_mobility.dm @@ -35,7 +35,7 @@ standupwarning = "[src] struggles to stand up." var/usernotice = automatic ? "You are now getting up. (Auto)" : "You are now getting up." visible_message("[standupwarning]", usernotice, vision_distance = 5) - if(do_after(src, totaldelay, target = src, required_mobility_flags = MOBILITY_RESIST)) + if(do_after(src, totaldelay, target = src, timed_action_flags = (IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM))) set_resting(FALSE, TRUE) combat_flags &= ~COMBAT_FLAG_RESISTING_REST diff --git a/code/modules/mob/living/carbon/human/human_stripping.dm b/code/modules/mob/living/carbon/human/human_stripping.dm index b028db5cda..489c8f66d9 100644 --- a/code/modules/mob/living/carbon/human/human_stripping.dm +++ b/code/modules/mob/living/carbon/human/human_stripping.dm @@ -67,7 +67,7 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( if (!istype(jumpsuit)) return null to_chat(source, "[user] is trying to adjust your [jumpsuit.name].") - if (!do_mob(user, source, jumpsuit.strip_delay * 0.5, ignorehelditem = TRUE)) + if (!do_mob(user, source, jumpsuit.strip_delay * 0.5, timed_action_flags = IGNORE_HELD_ITEM)) return to_chat(source, "[user] successfully adjusted your [jumpsuit.name].") jumpsuit.toggle_jumpsuit_adjust() @@ -103,7 +103,7 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( source.visible_message("[user] tries to [hardsuit.suittoggled ? "retract" : "extend"] [source]'s helmet.", \ "[user] tries to [hardsuit.suittoggled ? "retract" : "extend"] [source]'s helmet.", \ target = user, target_message = "You try to [hardsuit.suittoggled ? "retract" : "extend"] [source]'s helmet.") - if(!do_mob(user, source, hardsuit_head ? hardsuit_head.strip_delay : POCKET_STRIP_DELAY, ignorehelditem = TRUE)) + if(!do_mob(user, source, hardsuit_head ? hardsuit_head.strip_delay : POCKET_STRIP_DELAY, timed_action_flags = IGNORE_HELD_ITEM)) return null if((source.head != hardsuit_head) && source.head) return null @@ -286,7 +286,7 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( to_chat(user, span_notice("You try to [isnull(carbon_source.internal) ? "open": "close"] the valve on [source]'s [item.name]...")) - if(!do_mob(user, carbon_source, INTERNALS_TOGGLE_DELAY, ignorehelditem = TRUE)) + if(!do_mob(user, carbon_source, INTERNALS_TOGGLE_DELAY, timed_action_flags = IGNORE_HELD_ITEM)) return null if(carbon_source.internal) diff --git a/code/modules/mob/living/carbon/human/species_types/arachnid.dm b/code/modules/mob/living/carbon/human/species_types/arachnid.dm index 6dc19d928a..819f347353 100644 --- a/code/modules/mob/living/carbon/human/species_types/arachnid.dm +++ b/code/modules/mob/living/carbon/human/species_types/arachnid.dm @@ -92,7 +92,7 @@ var/nutrition_threshold = NUTRITION_LEVEL_FED if (H.nutrition >= nutrition_threshold) to_chat(H, "You begin spinning some web...") - if(!do_after(H, 10 SECONDS, 1, T)) + if(!do_after(H, 10 SECONDS, T)) to_chat(H, "Your web spinning was interrupted!") return H.adjust_nutrition(-E.spinner_rate) @@ -152,7 +152,7 @@ to_chat(H, "You cannot wrap this.") return H.visible_message("[H] starts to wrap [A] into a cocoon!","You start to wrap [A] into a cocoon.") - if(!do_after(H, 10 SECONDS, 1, A)) + if(!do_after(H, 10 SECONDS, A)) to_chat(H, "Your web spinning was interrupted!") return H.adjust_nutrition(E.spinner_rate * -3) diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index 4fda302032..8a483ea385 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -153,7 +153,7 @@ var/static/mutable_appearance/overcharge //shameless copycode from lightning spell overcharge = overcharge || mutable_appearance('icons/effects/effects.dmi', "electricity", EFFECTS_LAYER) H.add_overlay(overcharge) - if(do_mob(H, H, 50, 1)) + if(do_after(H, 5 SECONDS, timed_action_flags = (IGNORE_USER_LOC_CHANGE|IGNORE_HELD_ITEM|IGNORE_INCAPACITATED))) H.flash_lighting_fx(5, 7, current_color) var/obj/item/organ/stomach/ethereal/stomach = H.getorganslot(ORGAN_SLOT_STOMACH) playsound(H, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) @@ -169,7 +169,6 @@ to_chat(H, "You're pretty sure you just felt your heart stop for a second there..") H.playsound_local(H, 'sound/effects/singlebeat.ogg', 100, 0) H.Paralyze(100) - return /datum/species/ethereal/proc/get_charge(mob/living/carbon/H) //this feels like it should be somewhere else. Eh? var/obj/item/organ/stomach/ethereal/stomach = H.getorganslot(ORGAN_SLOT_STOMACH) diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index cfbc36cde8..85e85828b0 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -199,7 +199,7 @@ H.mob_transforming = TRUE - if(do_after(owner, delay=60, needhand=FALSE, target=owner, progress=TRUE)) + if(do_after(owner, 6 SECONDS, owner)) if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT) make_dupe() else diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index ad1ac131e7..7af123f9da 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -155,6 +155,8 @@ There are several things that need to be remembered: target_overlay = "[target_overlay]_d" var/alt_worn = U.mob_overlay_icon || 'icons/mob/clothing/uniform.dmi' + if(dna.species.icon_uniform) + alt_worn = dna.species.icon_uniform var/variant_flag = NONE if((DIGITIGRADE in dna.species.species_traits) && U.mutantrace_variation & STYLE_DIGITIGRADE && !(U.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) @@ -382,7 +384,10 @@ There are several things that need to be remembered: if(hud_used.inventory_shown) client.screen += gloves update_observer_view(gloves,1) - overlays_standing[GLOVES_LAYER] = gloves.build_worn_icon(default_layer = GLOVES_LAYER, default_icon_file = 'icons/mob/clothing/hands.dmi') + var/icon_chosen = 'icons/mob/clothing/hands.dmi' + if(dna.species.icon_hands) + icon_chosen = dna.species.icon_hands + overlays_standing[GLOVES_LAYER] = gloves.build_worn_icon(default_layer = GLOVES_LAYER, default_icon_file = icon_chosen) gloves_overlay = overlays_standing[GLOVES_LAYER] if(OFFSET_GLOVES in dna.species.offset_features) gloves_overlay.pixel_x += dna.species.offset_features[OFFSET_GLOVES][1] @@ -443,7 +448,10 @@ There are several things that need to be remembered: client.screen += glasses //Either way, add the item to the HUD update_observer_view(glasses,1) if(!(head && (head.flags_inv & HIDEEYES)) && !(wear_mask && (wear_mask.flags_inv & HIDEEYES))) - overlays_standing[GLASSES_LAYER] = glasses.build_worn_icon(default_layer = GLASSES_LAYER, default_icon_file = 'icons/mob/clothing/eyes.dmi', override_state = glasses.icon_state) + var/icon_chosen = 'icons/mob/clothing/eyes.dmi' + if(dna.species.icon_eyes) + icon_chosen = dna.species.icon_eyes + overlays_standing[GLASSES_LAYER] = glasses.build_worn_icon(default_layer = GLASSES_LAYER, default_icon_file = icon_chosen, override_state = glasses.icon_state) var/mutable_appearance/glasses_overlay = overlays_standing[GLASSES_LAYER] if(glasses_overlay) if(OFFSET_GLASSES in dna.species.offset_features) @@ -469,8 +477,10 @@ There are several things that need to be remembered: if(hud_used.inventory_shown) //if the inventory is open client.screen += ears //add it to the client's screen update_observer_view(ears,1) - - overlays_standing[EAR_LEFT_LAYER] = ears.build_worn_icon(default_layer = EAR_LEFT_LAYER, default_icon_file = 'modular_sand/icons/mob/clothing/ears.dmi', use_mob_overlay_icon = FALSE) + var/icon_chosen = 'modular_sand/icons/mob/clothing/ears.dmi' + if(dna.species.icon_ears) + icon_chosen = dna.species.icon_ears + overlays_standing[EAR_LEFT_LAYER] = ears.build_worn_icon(default_layer = EAR_LEFT_LAYER, default_icon_file = icon_chosen, use_mob_overlay_icon = FALSE) var/mutable_appearance/ears_overlay = overlays_standing[EAR_LEFT_LAYER] if(OFFSET_EARS in dna.species.offset_features) ears_overlay.pixel_x += dna.species.offset_features[OFFSET_EARS][1] @@ -495,8 +505,10 @@ There are several things that need to be remembered: if(hud_used.inventory_shown) //if the inventory is open client.screen += ears_extra //add it to the client's screen update_observer_view(ears_extra,1) - - overlays_standing[EAR_RIGHT_LAYER] = ears_extra.build_worn_icon(default_layer = EAR_RIGHT_LAYER, default_icon_file = 'modular_sand/icons/mob/clothing/ears_extra.dmi', use_mob_overlay_icon = FALSE) + var/icon_chosen = 'modular_sand/icons/mob/clothing/ears_extra.dmi' + if(dna.species.icon_ears) + icon_chosen = dna.species.icon_ears + overlays_standing[EAR_RIGHT_LAYER] = ears_extra.build_worn_icon(default_layer = EAR_RIGHT_LAYER, default_icon_file = icon_chosen, use_mob_overlay_icon = FALSE) var/mutable_appearance/ears_overlay = overlays_standing[EAR_RIGHT_LAYER] if(OFFSET_EARS in dna.species.offset_features) ears_overlay.pixel_x += dna.species.offset_features[OFFSET_EARS][1] @@ -529,6 +541,8 @@ There are several things that need to be remembered: update_observer_view(shoes,1) var/alt_icon = S.mob_overlay_icon || 'icons/mob/clothing/feet.dmi' + if(dna.species.icon_feet) + alt_icon = dna.species.icon_feet var/variation_flag = NONE if((DIGITIGRADE in dna.species.species_traits) && S.mutantrace_variation & STYLE_DIGITIGRADE && !(S.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) alt_icon = S.anthro_mob_worn_overlay || 'icons/mob/clothing/feet_digi.dmi' @@ -558,7 +572,12 @@ There are several things that need to be remembered: var/t_state = s_store.item_state if(!t_state) t_state = s_store.icon_state - overlays_standing[SUIT_STORE_LAYER] = mutable_appearance(((s_store.mob_overlay_icon) ? s_store.mob_overlay_icon : 'icons/mob/clothing/belt_mirror.dmi'), t_state, -SUIT_STORE_LAYER) + + var/icon_chosen = 'icons/mob/clothing/belt_mirror.dmi' + if(dna.species.icon_belt) + icon_chosen = dna.species.icon_belt + + overlays_standing[SUIT_STORE_LAYER] = mutable_appearance(((s_store.mob_overlay_icon) ? s_store.mob_overlay_icon : icon_chosen), t_state, -SUIT_STORE_LAYER) var/mutable_appearance/s_store_overlay = overlays_standing[SUIT_STORE_LAYER] if(OFFSET_S_STORE in dna.species.offset_features) s_store_overlay.pixel_x += dna.species.offset_features[OFFSET_S_STORE][1] @@ -586,6 +605,8 @@ There are several things that need to be remembered: remove_overlay(HEAD_LAYER) var/obj/item/clothing/head/H = head var/alt_icon = H.mob_overlay_icon || 'icons/mob/clothing/head.dmi' + if(dna.species.icon_head) + alt_icon = dna.species.icon_head var/muzzled = FALSE var/variation_flag = NONE if(dna.species.mutant_bodyparts["mam_snouts"] && dna.features["mam_snouts"] != "None") @@ -619,8 +640,10 @@ There are several things that need to be remembered: if(client && hud_used && hud_used.hud_shown) client.screen += belt update_observer_view(belt) - - overlays_standing[BELT_LAYER] = belt.build_worn_icon(default_layer = BELT_LAYER, default_icon_file = 'icons/mob/clothing/belt.dmi') + var/icon_chosen = 'icons/mob/clothing/belt.dmi' + if(dna.species.icon_belt) + icon_chosen = dna.species.icon_belt + overlays_standing[BELT_LAYER] = belt.build_worn_icon(default_layer = BELT_LAYER, default_icon_file = icon_chosen) var/mutable_appearance/belt_overlay = overlays_standing[BELT_LAYER] if(OFFSET_BELT in dna.species.offset_features) belt_overlay.pixel_x += dna.species.offset_features[OFFSET_BELT][1] @@ -645,6 +668,8 @@ There are several things that need to be remembered: update_observer_view(wear_suit,1) var/worn_icon = wear_suit.mob_overlay_icon || 'icons/mob/clothing/suit.dmi' + if(dna.species.icon_suit) + worn_icon = dna.species.icon_suit var/worn_state = wear_suit.icon_state var/center = FALSE var/dimension_x = 32 @@ -735,6 +760,8 @@ There are several things that need to be remembered: var/obj/item/clothing/mask/M = wear_mask remove_overlay(FACEMASK_LAYER) var/alt_icon = M.mob_overlay_icon || 'icons/mob/clothing/mask.dmi' + if(dna.species.icon_mask) + alt_icon = dna.species.icon_mask var/muzzled = FALSE var/variation_flag = NONE if(head && (head.flags_inv & HIDEMASK)) diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index cd9cd5db4c..cea51b4cd2 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -110,7 +110,10 @@ if(wear_neck) if(!(head && (head.flags_inv & HIDENECK))) - overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = 'icons/mob/clothing/neck.dmi', override_state = wear_neck.icon_state) + var/chosen_icon = 'icons/mob/clothing/neck.dmi' + if(dna.species.icon_neck) + chosen_icon = dna.species.icon_neck + overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = chosen_icon, override_state = wear_neck.icon_state) update_hud_neck(wear_neck) apply_overlay(NECK_LAYER) @@ -123,7 +126,10 @@ inv?.update_icon() if(back) - overlays_standing[BACK_LAYER] = back.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = 'icons/mob/clothing/back.dmi', override_state = back.icon_state) + var/chosen_icon = 'icons/mob/clothing/back.dmi' + if(dna.species.icon_back) + chosen_icon = dna.species.icon_back + overlays_standing[BACK_LAYER] = back.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = chosen_icon, override_state = back.icon_state) update_hud_back(back) apply_overlay(BACK_LAYER) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index e055081123..3f16412e6d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -970,7 +970,7 @@ else to_chat(src,"You try to remove [who]'s [what.name].") what.add_fingerprint(src) - if(do_mob(src, who, round(what.strip_delay / strip_mod), ignorehelditem = TRUE)) + if(do_mob(src, who, round(what.strip_delay / strip_mod), timed_action_flags = IGNORE_HELD_ITEM)) if(what && Adjacent(who)) if(islist(where)) var/list/L = where diff --git a/code/modules/mob/living/living_active_block.dm b/code/modules/mob/living/living_active_block.dm index 124b28c269..65a474c782 100644 --- a/code/modules/mob/living/living_active_block.dm +++ b/code/modules/mob/living/living_active_block.dm @@ -48,7 +48,7 @@ animate(src, pixel_x = get_standard_pixel_x_offset(), pixel_y = get_standard_pixel_y_offset(), time = 2.5, FALSE, SINE_EASING | EASE_IN) /mob/living/proc/continue_starting_active_block() - return (combat_flags & COMBAT_FLAG_ACTIVE_BLOCK_STARTING)? DO_AFTER_CONTINUE : DO_AFTER_STOP + return (combat_flags & COMBAT_FLAG_ACTIVE_BLOCK_STARTING) /mob/living/get_standard_pixel_x_offset() . = ..() @@ -102,7 +102,7 @@ var/delay = data.block_start_delay combat_flags |= COMBAT_FLAG_ACTIVE_BLOCK_STARTING animate(src, pixel_x = get_standard_pixel_x_offset(), pixel_y = get_standard_pixel_y_offset(), time = delay, FALSE, SINE_EASING | EASE_IN) - if(!do_after_advanced(src, delay, src, DO_AFTER_REQUIRES_USER_ON_TURF|DO_AFTER_NO_COEFFICIENT, CALLBACK(src, .proc/continue_starting_active_block), MOBILITY_USE, null, null, I)) + if(!do_after(src, delay, src, (IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE), extra_checks = CALLBACK(src, .proc/continue_starting_active_block))) to_chat(src, "You fail to raise [I].") combat_flags &= ~(COMBAT_FLAG_ACTIVE_BLOCK_STARTING) animate(src, pixel_x = get_standard_pixel_x_offset(), pixel_y = get_standard_pixel_y_offset(), time = 2.5, FALSE, SINE_EASING | EASE_IN, ANIMATION_END_NOW) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 4f6b6aa351..9973b6472e 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -365,7 +365,7 @@ playsound(src, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2) C.visible_message("[process_emote("CAPTURE_ONE", C)]",\ "[process_emote("CAPTURE_TWO", C)]") - if(do_after(src, 60, FALSE, C)) + if(do_after(src, 60, C)) attempt_handcuff(C) /mob/living/simple_animal/bot/secbot/proc/attempt_handcuff(mob/living/carbon/C) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index d9ea6f4a8a..b7545de517 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -17,7 +17,7 @@ if("Cannibalize") if(D.health < D.maxHealth) D.visible_message("[D] begins to cannibalize parts from [src].", "You begin to cannibalize parts from [src]...") - if(do_after(D, 60, 0, target = src)) + if(do_after(D, 6 SECONDS, src)) D.visible_message("[D] repairs itself using [src]'s remains!", "You repair yourself using [src]'s remains.") D.adjustBruteLoss(-src.maxHealth) new /obj/effect/decal/cleanable/oil/streak(get_turf(src)) @@ -44,7 +44,7 @@ to_chat(user, "You can't seem to find the [pick(faux_gadgets)]! Without it, [src] [pick(faux_problems)].") return user.visible_message("[user] begins to reactivate [src].", "You begin to reactivate [src]...") - if(do_after(user, 30, 1, target = src)) + if(do_after(user, 3 SECONDS, src)) revive(full_heal = 1) user.visible_message("[user] reactivates [src]!", "You reactivate [src].") alert_drones(DRONE_NET_CONNECT) diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index 9ade9f097f..3c50cc2024 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -53,7 +53,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list( if(vent_found_parent && (vent_found_parent.members.len || vent_found_parent.other_atmosmch)) visible_message("[src] begins climbing into the ventilation system..." ,"You begin climbing into the ventilation system...") - if(!do_after(src, 25, target = vent_found, required_mobility_flags = MOBILITY_MOVE)) + if(!do_after(src, 25, target = vent_found)) return if(!client) diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index 80cf0a3d95..42e9a3dff0 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -1,3 +1,5 @@ +#define MOD_ACTIVATION_STEP_FLAGS IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM|IGNORE_INCAPACITATED + /// Creates a radial menu from which the user chooses parts of the suit to deploy/retract. Repeats until all parts are extended or retracted. /obj/item/mod/control/proc/choose_deploy(mob/user) if(!length(mod_parts)) @@ -132,31 +134,31 @@ playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000) return TRUE - if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE)) + if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)))) to_chat(wearer, span_notice("[boots] [active ? "relax their grip on your legs" : "seal around your feet"].")) playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) seal_part(boots, seal = !active) else return toggle_activate_fail() - if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE)) + if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)))) to_chat(wearer, span_notice("[gauntlets] [active ? "become loose around your fingers" : "tighten around your fingers and wrists"].")) playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) seal_part(gauntlets, seal = !active) else return toggle_activate_fail() - if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE)) + if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)))) to_chat(wearer, span_notice("[chestplate] [active ? "releases your chest" : "cinches tightly against your chest"].")) playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) seal_part(chestplate,seal = !active) else return toggle_activate_fail() - if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE)) + if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)))) to_chat(wearer, span_notice("[helmet] hisses [active ? "open" : "closed"].")) playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) seal_part(helmet, seal = !active) else return toggle_activate_fail() - if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE)) + if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)))) to_chat(wearer, span_notice("Systems [active ? "shut down. Parts unsealed. Goodbye" : "started up. Parts sealed. Welcome"], [wearer].")) if(ai) to_chat(ai, span_notice("SYSTEMS [active ? "DEACTIVATED. GOODBYE" : "ACTIVATED. WELCOME"]: \"[ai]\"")) @@ -240,3 +242,6 @@ for(var/obj/item/part in mod_parts) seal_part(part, seal = TRUE) finish_activation(on = TRUE) + +/obj/item/mod/control/proc/has_wearer() + return wearer diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 9e779b9c1b..d45b5ad9e1 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -587,7 +587,7 @@ By design, d1 is the smallest direction and d2 is the highest to_chat(user, "You don't have enough cable coil to make restraints out of them") return to_chat(user, "You start making some cable restraints.") - if(!do_after(user, 30, TRUE, user, TRUE) || !use(15)) + if(!do_after(user, 3 SECONDS, user) || !use(15)) to_chat(user, "You fail to make cable restraints, you need to be standing still to do it") return var/obj/item/restraints/handcuffs/cable/result = new(get_turf(user)) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 5352ea7c4e..69011e658d 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -195,7 +195,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/Initialize(mapload) . = ..() uid = gl_uid++ - SSair.atmos_air_machinery += src + SSair.atmos_machinery += src countdown = new(src) countdown.start() GLOB.poi_list |= src @@ -214,7 +214,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/Destroy() investigate_log("has been destroyed.", INVESTIGATE_SUPERMATTER) - SSair.atmos_air_machinery -= src + SSair.atmos_machinery -= src QDEL_NULL(radio) GLOB.poi_list -= src QDEL_NULL(countdown) diff --git a/code/modules/reagents/reagent_containers/rags.dm b/code/modules/reagents/reagent_containers/rags.dm index 74cf6aea5e..7ba7b855d1 100644 --- a/code/modules/reagents/reagent_containers/rags.dm +++ b/code/modules/reagents/reagent_containers/rags.dm @@ -37,14 +37,14 @@ var/log_object = "a damp rag containing [reagentlist]" if(user.a_intent == INTENT_HARM && !C.is_mouth_covered()) C.visible_message("[user] is trying to smother \the [C] with \the [src]!", "[user] is trying to smother you with \the [src]!", "You hear some struggling and muffled cries of surprise.") - if(do_after(user, 20, target = C)) + if(do_after(user, 2 SECONDS, C)) reagents.reaction(C, INGEST) reagents.trans_to(C, 5, log = "rag smother") C.visible_message("[user] has smothered \the [C] with \the [src]!", "[user] has smothered you with \the [src]!", "You hear some struggling and a heavy breath taken.") log_combat(user, C, "smothered", log_object) else C.visible_message("[user] is trying to wipe \the [C] with \the [src].") - if(do_after(user, 20, target = C)) + if(do_after(user, 2 SECONDS, C)) reagents.reaction(C, TOUCH) reagents.remove_all(5) C.visible_message("[user] has wiped \the [C] with \the [src].") @@ -52,7 +52,7 @@ else if(istype(A) && (src in user)) user.visible_message("[user] starts to wipe down [A] with [src]!", "You start to wipe down [A] with [src]...") - if(do_after(user, action_speed, target = A)) + if(do_after(user, action_speed, A)) user.visible_message("[user] finishes wiping off [A]!", "You finish wiping off [A].") SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) @@ -92,7 +92,7 @@ . = ..() if(reagents.total_volume && user.canUseTopic(src, BE_CLOSE)) to_chat(user, "You start squeezing \the [src] dry...") - if(do_after(user, action_speed, TRUE, src)) + if(do_after(user, action_speed, src)) var/msg = "You squeeze \the [src]" var/obj/item/target if(Adjacent(user)) //Allows the user to drain the reagents into a beaker if adjacent (no telepathy). diff --git a/code/modules/research/techweb/_techweb_node.dm b/code/modules/research/techweb/_techweb_node.dm index 8ea4b95d03..7a58179a2d 100644 --- a/code/modules/research/techweb/_techweb_node.dm +++ b/code/modules/research/techweb/_techweb_node.dm @@ -106,4 +106,5 @@ "destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "bepis", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab", "paystand", "space_heater", "beaker", "large_beaker", "xlarge_beaker", "bucket", "hypovial", "large_hypovial", "syringe", "pillbottle", "sec_shellclip", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_islug", "sec_dart", "sec_38", "sec_38lethal", - "rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass", "salestagger", "light_replacer") + "rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass", "salestagger", "light_replacer", + "shuttle_creator", "engine_plasma", "engine_heater", "shuttle_control", "shuttle_docker","spaceship_navigation_beacon") diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index 2220a70546..c9f0236af5 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -120,7 +120,7 @@ if(designate_time && (landing_clear != SHUTTLE_DOCKER_BLOCKED)) to_chat(current_user, "Targeting transit location, please wait [DisplayTimeText(designate_time)]...") designating_target_loc = the_eye.loc - var/wait_completed = do_after(current_user, designate_time, FALSE, designating_target_loc, TRUE, CALLBACK(src, /obj/machinery/computer/camera_advanced/shuttle_docker/proc/canDesignateTarget)) + var/wait_completed = do_after(current_user, designate_time, designating_target_loc, timed_action_flags = IGNORE_HELD_ITEM, extra_checks = CALLBACK(src, /obj/machinery/computer/camera_advanced/shuttle_docker/proc/canDesignateTarget)) designating_target_loc = null if(!current_user) return diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm index 524d66da46..c790902556 100644 --- a/code/modules/spells/spell_types/lichdom.dm +++ b/code/modules/spells/spell_types/lichdom.dm @@ -46,7 +46,7 @@ playsound(user, 'sound/effects/pope_entry.ogg', 100) - if(!do_after(M, 50, needhand=FALSE, target=marked_item)) + if(!do_after(M, 5 SECONDS, marked_item, timed_action_flags = (IGNORE_USER_LOC_CHANGE|IGNORE_HELD_ITEM))) to_chat(M, "Your soul snaps back to your body as you stop ensouling [marked_item]!") return diff --git a/code/modules/spells/spell_types/lightning.dm b/code/modules/spells/spell_types/lightning.dm index d0c3c4166c..f5aaca2a87 100644 --- a/code/modules/spells/spell_types/lightning.dm +++ b/code/modules/spells/spell_types/lightning.dm @@ -27,7 +27,7 @@ halo = halo || mutable_appearance('icons/effects/effects.dmi', "electricity", EFFECTS_LAYER) user.add_overlay(halo) playsound(get_turf(user), Snd, 50, 0) - if(do_mob(user,user,100,1)) + if(do_mob(user, user, 10 SECONDS)) if(ready && cast_check(skipcharge=1)) choose_targets() else diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 5e4fb22904..fc165c4fb0 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -574,8 +574,8 @@ var/tbrute = round( (brute_dam/max_damage)*3, 1 ) var/tburn = round( (burn_dam/max_damage)*3, 1 ) if((tbrute != brutestate) || (tburn != burnstate)) - brutestate = tbrute - burnstate = tburn + brutestate = min(tbrute, 3) + burnstate = min(tburn, 3) //So, WHY NOBODY THOUGHT ON THIS BEFORE??? //Comicao1 return TRUE return FALSE diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 5166673a1c..b86e9430aa 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -97,6 +97,7 @@ #include "medical_wounds.dm" #include "merge_type.dm" // #include "metabolizing.dm" +#include "modular_map_loader.dm" //SPLURT EDIT // #include "ntnetwork_tests.dm" // #include "outfit_sanity.dm" // #include "pills.dm" diff --git a/code/modules/unit_tests/modular_map_loader.dm b/code/modules/unit_tests/modular_map_loader.dm new file mode 100644 index 0000000000..df247e720a --- /dev/null +++ b/code/modules/unit_tests/modular_map_loader.dm @@ -0,0 +1,10 @@ +/datum/unit_test/modular_map_loader + +/datum/unit_test/modular_map_loader/Run() + for (var/obj/modular_map_root/map_root_type as anything in subtypesof(/obj/modular_map_root)) + var/config_file = initial(map_root_type.config_file) + if (!fexists(config_file)) + Fail("[map_root_type] points to a config file which does not exist!") + continue + if (rustg_read_toml_file(config_file) == null) + Fail("[map_root_type] points to a config file which is invalid!") diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm index 7bb4e878ec..7c1fa8f61a 100644 --- a/code/modules/vehicles/sealed.dm +++ b/code/modules/vehicles/sealed.dm @@ -25,7 +25,7 @@ return FALSE if(occupant_amount() >= max_occupants) return FALSE - if(do_after(M, get_enter_delay(M), FALSE, src, TRUE)) + if(do_after(M, get_enter_delay(M), src, timed_action_flags = IGNORE_HELD_ITEM)) mob_enter(M) return TRUE return FALSE diff --git a/code/modules/vore/eating/belly_obj.dm b/code/modules/vore/eating/belly_obj.dm index 3d8870d41a..07e01e4580 100644 --- a/code/modules/vore/eating/belly_obj.dm +++ b/code/modules/vore/eating/belly_obj.dm @@ -539,7 +539,7 @@ //Handle a mob struggling // Called from /mob/living/carbon/relaymove() -/obj/belly/proc/relay_resist(var/mob/living/R) +/obj/belly/proc/relay_resist(mob/living/R) if (!(R in contents)) return // User is not in this belly @@ -547,7 +547,7 @@ to_chat(R,"You attempt to climb out of \the [lowertext(name)]. (This will take around [escapetime/10] seconds.)") to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]!") - if(do_after(R, owner, escapetime)) + if(do_after(R, escapetime, owner, (IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM))) if((owner.stat || escapable) && (R.loc == src)) //Can still escape? release_specific_contents(R) return @@ -604,7 +604,7 @@ if(prob(escapechance)) //Let's have it check to see if the prey escapes first. to_chat(R,"You start to climb out of \the [lowertext(name)].") to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]!") - if(do_after(R, escapetime)) + if(do_after(R, escapetime, owner, (IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM))) if((escapable) && (R.loc == src)) //Can still escape? release_specific_contents(R) to_chat(R,"You climb out of \the [lowertext(name)].") diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm index 99c1236d9c..d5a3627684 100644 --- a/code/modules/vore/eating/living.dm +++ b/code/modules/vore/eating/living.dm @@ -152,7 +152,7 @@ swallow_time = istype(prey, /mob/living/carbon/human) ? belly.human_prey_swallow_time : belly.nonhuman_prey_swallow_time //Timer and progress bar - if(!do_after(user, swallow_time, TRUE, prey)) + if(!do_after(user, swallow_time, prey)) return FALSE // Prey escaped (or user disabled) before timer expired. if(!prey.Adjacent(user)) //double check'd just in case they moved during the timer and the do_mob didn't fail for whatever reason diff --git a/config/entries/general.txt b/config/entries/general.txt index b0d80af990..40e572a408 100644 --- a/config/entries/general.txt +++ b/config/entries/general.txt @@ -335,6 +335,9 @@ ROUNDSTART_RACES dullahan ROUNDSTART_RACES spectre_bot ROUNDSTART_RACES vampire_roundstart ROUNDSTART_RACES shadekin +ROUNDSTART_RACES teshari +ROUNDSTART_RACES vox +ROUNDSTART_RACES xenochimera ROUNDSTART_RACES undead_mammal ROUNDSTART_RACES undead_insect ROUNDSTART_RACES ghoul_lizard diff --git a/config/modular_maps/Config Files/README.md b/config/modular_maps/Config Files/README.md new file mode 100644 index 0000000000..4f04073cf5 --- /dev/null +++ b/config/modular_maps/Config Files/README.md @@ -0,0 +1,3 @@ +Add the config files for modular maps here. + +**These are fully cached so keep this directory empty by default.** diff --git a/config/modular_maps/README.md b/config/modular_maps/README.md new file mode 100644 index 0000000000..8f674e87e6 --- /dev/null +++ b/config/modular_maps/README.md @@ -0,0 +1,3 @@ +Add modular maps here. + +**These are fully cached so keep this directory empty by default.** diff --git a/dependencies.sh b/dependencies.sh index 69689cbb2b..1c523eff05 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -5,23 +5,23 @@ # byond version export BYOND_MAJOR=514 -export BYOND_MINOR=1582 +export BYOND_MINOR=1589 #rust_g git tag -export RUST_G_VERSION=0.7.0 +export RUST_G_VERSION=3.0.0 #node version export NODE_VERSION=12 export NODE_VERSION_PRECISE=12.22.4 # SpacemanDMM git tag -export SPACEMAN_DMM_VERSION=suite-1.7 +export SPACEMAN_DMM_VERSION=suite-1.7.3 # Python version for mapmerge and other tools export PYTHON_VERSION=3.7.9 # Auxmos git tag -export AUXMOS_VERSION=v2.2.1 +export AUXMOS_VERSION=v2.4.1 # Extools git tag export EXTOOLS_VERSION=v0.0.7 diff --git a/html/changelogs/archive/2023-08.yml b/html/changelogs/archive/2023-08.yml index 90b5ec3f65..3e982e3e0d 100644 --- a/html/changelogs/archive/2023-08.yml +++ b/html/changelogs/archive/2023-08.yml @@ -72,3 +72,13 @@ - tweak: mapping fixes! Yawet330: - bugfix: config_wak_run -> config_walk_run +2023-08-23: + BongaTheProto: + - rscadd: Chameleon suit is now a donator reward +2023-08-25: + BongaTheProto: + - code_imp: adds modular ruins + - code_imp: updates rust-g to v3.0.0 +2023-08-27: + KeplerWasTaken: + - rscadd: Medikitty bot animations diff --git a/html/changelogs/archive/2023-09.yml b/html/changelogs/archive/2023-09.yml new file mode 100644 index 0000000000..dbd0cc39d3 --- /dev/null +++ b/html/changelogs/archive/2023-09.yml @@ -0,0 +1,68 @@ +2023-09-01: + 777joshua777: + - code_imp: changed a line of code on ears.dm + BongaTheProto: + - bugfix: cum overlays work now + - bugfix: breasts will now work properly with size limits set + - rscadd: you may now coat objects or people in jizz using your pussy, breasts and + penis + Tsurupeta: + - bugfix: fixes cryoing characters without mind +2023-09-03: + miguelop1: + - bugfix: as it has been clasified as a bug, it is a fix. +2023-09-04: + BongaTheProto: + - code_imp: adds the other updates of rust-g +2023-09-07: + Anonymous: + - soundadd: Another scream to the *scream2. + BongaTheProto: + - rscadd: Twink Juice (3 Vodka, 2 Berry Juice, 1 Lube) + - rscadd: Midnight Tears (3 Navy Rum, 5 Curacao, 1 Sugar, 1 Bitters, 15 Soda Water) + - rscadd: Midnight Sky (3 Navy Rum, 2 Curacao, 2 Sugar, 1 Bitters, 15 Space Cola, + 2 Ice) + - rscadd: Midnight Joy (3 Navy Rum, 5 Pineapple Juice, 1 Sugar, 1 Bitters, 15 Soda + Water) + - rscadd: Hierophant Bird, Club, and Arena reskin + - rscadd: New ghost cafe VR section + - rscadd: Orderable a543 (Lethal and Rubber) bullets + - rscadd: Printable (after research) a543 (Lethal and Rubber) bullets + - rscadd: Orderable Pink M46A1 Full-Auto Rifles + - rscadd: goosehonk emote + - rscadd: goosehonkb emote + - bugfix: Unholy toilet can now be cleaned properly + - bugfix: Spelling Mistake in .45 revolver + - bugfix: Spelling Mistake in Emergency Beach Radiation Protection Crate + - bugfix: Spelling Mistake in Latex Adjustment Override description + - bugfix: Spelling Mistake in Hunting Shotgun Single-Pack description + - bugfix: Moans are now effected by the play lewd sounds preference + - bugfix: Eyepatch HUDs can now be crafted again (If you can't still, make sure + to re-click the crafting tab.) + - bugfix: generate_documentation works again + - tweak: Carving stones are now generally more fun + - tweak: Funclaw holosimulation can no longer round remove, has more funclaws +2023-09-08: + Vhariik: + - rscadd: Navbeacons to all maps +2023-09-11: + Comicao1: + - rscadd: Adds new code for species. (So they have unique clothing types.) + - bugfix: Fixed errors related to damage bodysprites + - rscadd: Added teshari species. + - rscadd: Teshari hair. + - rscadd: Teshari penises. + - rscadd: Teshari eye types. + - rscadd: Teshari clothing (uniform, suits, cloaks, shoes, hats...) + - rscadd: Teshari language. + - rscadd: Xenochimera species. + - rscadd: Xenochimera abilities. + - rscadd: Vox species + - rscadd: Vox emotes + - rscadd: Vox clothing (uniform, suits, shoes, hats...) + - rscadd: Vox eye types. + - rscadd: Vox lungs. + - rscadd: Vox language. +2023-09-13: + Vhariik: + - bugfix: fixed syndie modsuit visor overlay diff --git a/icons/emoji_32.dmi b/icons/emoji_32.dmi index 5da4a28f22..b673744a29 100644 Binary files a/icons/emoji_32.dmi and b/icons/emoji_32.dmi differ diff --git a/icons/mob/clothing/modsuit/mod_clothing.dmi b/icons/mob/clothing/modsuit/mod_clothing.dmi index f8dba0a006..c29ffb5073 100644 Binary files a/icons/mob/clothing/modsuit/mod_clothing.dmi and b/icons/mob/clothing/modsuit/mod_clothing.dmi differ diff --git a/icons/mob/clothing/modsuit/mod_clothing_anthro.dmi b/icons/mob/clothing/modsuit/mod_clothing_anthro.dmi index a18800875c..867d5fc0fc 100644 Binary files a/icons/mob/clothing/modsuit/mod_clothing_anthro.dmi and b/icons/mob/clothing/modsuit/mod_clothing_anthro.dmi differ diff --git a/icons/mob/dam_mob.dmi b/icons/mob/dam_mob.dmi index c34b57b434..d462a1e982 100644 Binary files a/icons/mob/dam_mob.dmi and b/icons/mob/dam_mob.dmi differ diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi index ec48e5f016..99e3833be7 100644 Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index 6d63d30122..bc83059508 100644 Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index a4a86dc237..06520eb5e9 100644 Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ diff --git a/modular_sand/code/datums/elements/holder_micro.dm b/modular_sand/code/datums/elements/holder_micro.dm index ec90217153..6ed2ff7601 100644 --- a/modular_sand/code/datums/elements/holder_micro.dm +++ b/modular_sand/code/datums/elements/holder_micro.dm @@ -79,8 +79,8 @@ source.visible_message(span_warning("[user] starts picking up [source]."), \ span_userdanger("[user] starts picking you up!")) source.balloon_alert(user, "picking up") - var/time_required = COMPARE_SIZES(source, user) * 40 //Scale how fast the pickup will be depending on size difference - if(!do_after(user, time_required, target = source)) + var/time_required = COMPARE_SIZES(source, user) * 4 SECONDS //Scale how fast the pickup will be depending on size difference + if(!do_after(user, time_required, source)) return FALSE if(user.get_active_held_item()) @@ -108,14 +108,14 @@ slot_flags = ITEM_SLOT_FEET | ITEM_SLOT_HEAD | ITEM_SLOT_ID | ITEM_SLOT_BACK | ITEM_SLOT_NECK w_class = null //handled by their size -//TODO: add a timer to escape someone's grip dependant on size diff /obj/item/clothing/head/mob_holder/micro/container_resist(mob/living/user) if(user.incapacitated()) to_chat(user, span_warning("You can't escape while you're restrained like this!")) return - var/mob/living/L = loc + var/mob/living/L = get_atom_on_turf(src, /mob/living) visible_message(span_warning("[src] begins to squirm in [L]'s grasp!")) - if(!do_after(user, 12 SECONDS, target = src, required_mobility_flags = MOBILITY_RESIST)) + var/time_required = COMPARE_SIZES(L, user) / 4 SECONDS //Scale how fast the resisting will be depending on size difference + if(!do_after(user, time_required, L, IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM)) if(!user || user.stat != CONSCIOUS || user.loc != src) return to_chat(loc, span_warning("[src] stops resisting.")) diff --git a/modular_sand/code/datums/interactions/lewd_definitions.dm b/modular_sand/code/datums/interactions/lewd_definitions.dm index 363ed73990..0f56bc23eb 100644 --- a/modular_sand/code/datums/interactions/lewd_definitions.dm +++ b/modular_sand/code/datums/interactions/lewd_definitions.dm @@ -794,7 +794,7 @@ else H.mob_climax(TRUE, "sex", partner, !cumin, target_gen) set_lust(0) - SEND_SIGNAL(src, COMSIG_MOB_CAME, target_orifice, partner) + SEND_SIGNAL(src, COMSIG_MOB_CAME, target_orifice, partner, cumin, last_genital) return TRUE diff --git a/modular_sand/code/game/machinery/cryptominers.dm b/modular_sand/code/game/machinery/cryptominers.dm index 20f5bd69b4..e7c8b74a20 100644 --- a/modular_sand/code/game/machinery/cryptominers.dm +++ b/modular_sand/code/game/machinery/cryptominers.dm @@ -110,7 +110,7 @@ balloon_alert(user, "Configuring new account...") // Perform interaction timer - if(!do_after(user, 5 SECONDS, target = src)) + if(!do_after(user, 5 SECONDS, src)) // Warn in local chat user.visible_message(span_warning("[user] fails to link \the [src] to a new account!"), span_warning("You fail to link \the [src] to a new account!")) @@ -149,7 +149,7 @@ balloon_alert(user, "Resetting account...") // Perform interaction timer - if(!do_after(user, 5 SECONDS, target = src)) + if(!do_after(user, 5 SECONDS, src)) // Warn in local chat user.visible_message(span_warning("[user] fails to reset \the [src]."), span_warning("You fail to reset \the [src].")) diff --git a/modular_sand/code/game/objects/items/borg_shapeshifter.dm b/modular_sand/code/game/objects/items/borg_shapeshifter.dm index 0216524d69..f9917d3ce7 100644 --- a/modular_sand/code/game/objects/items/borg_shapeshifter.dm +++ b/modular_sand/code/game/objects/items/borg_shapeshifter.dm @@ -589,7 +589,7 @@ f = user.filters[start+i] animate(f, offset=f:offset, time=0, loop=3, flags=ANIMATION_PARALLEL) animate(offset=f:offset-1, time=rand()*20+10) - if (do_after(user, 50, target=user) && user.cell.use(activationCost)) + if (do_after(user, 5 SECONDS, user) && user.cell.use(activationCost)) playsound(src, 'sound/effects/bamf.ogg', 100, TRUE, -6) to_chat(user, span_notice("You are now disguised as the Nanotrasen cyborg \"[friendlyName]\".")) activate(user, module_selection) diff --git a/modular_sand/code/game/objects/items/cosmetics.dm b/modular_sand/code/game/objects/items/cosmetics.dm index 10db30229e..d60207c0a4 100644 --- a/modular_sand/code/game/objects/items/cosmetics.dm +++ b/modular_sand/code/game/objects/items/cosmetics.dm @@ -17,7 +17,7 @@ balloon_alert(user, "headgear in the way!") return user.visible_message(span_notice("[user] tries to change [H]'s hairstyle using [src]."), span_notice("You try to change [H]'s hairstyle using [src].")) - if(new_style && do_after(user, 60, target = H)) + if(new_style && do_after(user, 6 SECONDS, H)) user.visible_message(span_notice("[user] successfully changes [H]'s hairstyle using [src]."), span_notice("You successfully change [H]'s hairstyle using [src].")) H.balloon_alert(user, "changed hairstyle") H.hair_style = new_style @@ -39,7 +39,7 @@ balloon_alert(user, "mask in the way!") return user.visible_message(span_notice("[user] tries to change [H]'s facial hair style using [src]."), span_notice("You try to change [H]'s facial hair style using [src].")) - if(new_style && do_after(user, 60, target = H)) + if(new_style && do_after(user, 6 SECONDS, H)) user.visible_message(span_notice("[user] successfully changes [H]'s facial hair style using [src]."), span_notice("You successfully change [H]'s facial hair style using [src].")) H.balloon_alert(user, "changed facial hair style") H.facial_hair_style = new_style diff --git a/modular_sand/code/game/objects/items/devices/dogborg_sleeper.dm b/modular_sand/code/game/objects/items/devices/dogborg_sleeper.dm index c0dbc0d4a4..ec630928cd 100644 --- a/modular_sand/code/game/objects/items/devices/dogborg_sleeper.dm +++ b/modular_sand/code/game/objects/items/devices/dogborg_sleeper.dm @@ -36,7 +36,7 @@ to_chat(user,span_warning("[I] is too large to fit into your [src]")) return user.visible_message(span_warning("[hound.name] is ingesting [I] into their [src.name]."), span_notice("You start ingesting [target] into your [src.name]...")) - if(do_after(user, 15, target = target) && length(contents) < max_item_count) + if(do_after(user, 1.5 SECONDS, target) && length(contents) < max_item_count) I.forceMove(src) I.visible_message(span_warning("[hound.name]'s garbage processor groans lightly as [I] slips inside."), span_notice("Your garbage compactor groans lightly as [I] slips inside.")) playsound(hound, 'sound/machines/disposalflush.ogg', 50, 1) @@ -60,7 +60,7 @@ to_chat(user,span_warning("[trashman] is buckled and can not be put into your [src].")) return user.visible_message(span_warning("[hound.name] is ingesting [trashman] into their [src]."), span_notice("You start ingesting [trashman] into your [src.name]...")) - if(do_after(user, 30, target = trashman) && !patient && !trashman.buckled && length(contents) < max_item_count) + if(do_after(user, 3 SECONDS, trashman) && !patient && !trashman.buckled && length(contents) < max_item_count) trashman.forceMove(src) trashman.reset_perspective(src) update_gut(user) diff --git a/modular_sand/code/modules/admin/verbs/fix_air.dm b/modular_sand/code/modules/admin/verbs/fix_air.dm index 4281491e39..928e7e23ca 100644 --- a/modular_sand/code/modules/admin/verbs/fix_air.dm +++ b/modular_sand/code/modules/admin/verbs/fix_air.dm @@ -19,4 +19,3 @@ continue GM.parse_gas_string(F.initial_gas_mix) F.copy_air(GM) - F.update_visuals() diff --git a/modular_sand/code/modules/clothing/outfits/standard.dm b/modular_sand/code/modules/clothing/outfits/standard.dm index 9e7b25fb7f..c29677d695 100644 --- a/modular_sand/code/modules/clothing/outfits/standard.dm +++ b/modular_sand/code/modules/clothing/outfits/standard.dm @@ -4,10 +4,10 @@ icon_state = "cent_headset_alt" item_state = "cent_headset_alt" bowman = TRUE - + /obj/item/gun/energy/taser/debug ammo_type = list(/obj/item/ammo_casing/energy/electrode/debug) - + /obj/item/ammo_casing/energy/electrode/debug e_cost = 1 diff --git a/modular_sand/code/modules/mining/lavaland/necropolis_chests.dm b/modular_sand/code/modules/mining/lavaland/necropolis_chests.dm index 85f7e6b0eb..f3b4cf3978 100644 --- a/modular_sand/code/modules/mining/lavaland/necropolis_chests.dm +++ b/modular_sand/code/modules/mining/lavaland/necropolis_chests.dm @@ -41,7 +41,7 @@ /obj/item/shield/riot/tower/swat/gladiator/AltClick(mob/user) if(isliving(user)) - if(do_after(user, 20, target = src)) + if(do_after(user, 2 SECONDS, src)) new /obj/vehicle/ridden/lavaboat/dragon/gladiator(get_turf(user)) qdel(src) @@ -61,7 +61,7 @@ /obj/vehicle/ridden/lavaboat/dragon/gladiator/AltClick(mob/user) ..() if(isliving(user)) - if(do_after(user, 20, target = src)) + if(do_after(user, 2 SECONDS, src)) new /obj/item/shield/riot/tower/swat/gladiator(get_turf(user)) qdel(src) @@ -1022,7 +1022,7 @@ //Apply a temp buff until the necklace is used /obj/item/clothing/neck/necklace/necklace_of_the_forsaken/proc/temp_buff(mob/living/carbon/human/user) to_chat(user, span_warning("You feel as if you have a second chance at something, but you're not sure what.")) - if(do_after(user, 40, target = user)) + if(do_after(user, 4 SECONDS, user)) to_chat(user, span_notice("The ember warms you...")) ADD_TRAIT(user, TRAIT_NOHARDCRIT, "necklace_of_the_forsaken")//less chance of being gibbed active_owner = user diff --git a/modular_sand/code/modules/mob/living/simple_animal/bot/hugbot.dm b/modular_sand/code/modules/mob/living/simple_animal/bot/hugbot.dm index 5250ceaffc..2a3194445c 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/bot/hugbot.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/bot/hugbot.dm @@ -155,13 +155,13 @@ speak(message) playsound(src, messagevoice[message], 70, FALSE) - if(do_after(H, 3 SECONDS, target=src)) + if(do_after(H, 3 SECONDS, src)) tip_over(H) else if(H.a_intent == INTENT_HELP && mode == BOT_TIPPED) H.visible_message(span_notice("[H] begins righting [src]."), span_notice("You begin righting [src]...")) balloon_alert(H, "righting") - if(do_after(H, 3 SECONDS, target=src)) + if(do_after(H, 3 SECONDS, src)) set_right(H) else ..() diff --git a/modular_splurt/_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant_birdie.dmm b/modular_splurt/_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant_birdie.dmm new file mode 100644 index 0000000000..571fbc0aad --- /dev/null +++ b/modular_splurt/_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant_birdie.dmm @@ -0,0 +1,592 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/riveted/hierophant/coolbird, +/area/space) +"r" = ( +/mob/living/simple_animal/hostile/megafauna/hierophant/coolbird{ + pixel_x = -14 + }, +/turf/open/indestructible/hierophant/coolbird/two, +/area/space) +"v" = ( +/turf/open/indestructible/hierophant/coolbird/two, +/area/space) +"R" = ( +/turf/open/indestructible/hierophant/coolbird, +/area/space) + +(1,1,1) = {" +a +a +a +R +R +R +a +a +R +R +R +R +R +R +R +a +a +R +R +R +a +a +a +"} +(2,1,1) = {" +a +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +a +"} +(3,1,1) = {" +a +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +a +"} +(4,1,1) = {" +R +R +R +R +R +R +R +R +R +R +a +a +a +R +R +R +R +R +R +R +R +R +R +"} +(5,1,1) = {" +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +"} +(6,1,1) = {" +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +"} +(7,1,1) = {" +a +R +R +R +R +R +a +a +R +R +R +R +R +R +R +a +a +R +R +R +R +R +a +"} +(8,1,1) = {" +a +R +R +R +R +R +a +a +R +R +R +a +R +R +R +a +a +R +R +R +R +R +a +"} +(9,1,1) = {" +R +R +R +R +R +R +R +R +v +v +v +v +v +v +v +R +R +R +R +R +R +R +R +"} +(10,1,1) = {" +R +R +R +R +R +R +R +R +v +v +v +v +v +v +v +R +R +R +R +R +R +R +R +"} +(11,1,1) = {" +R +R +R +a +R +R +R +R +v +v +v +v +v +v +v +R +R +R +R +a +R +R +R +"} +(12,1,1) = {" +R +R +R +a +R +R +R +a +v +v +v +r +v +v +v +a +R +R +R +a +R +R +R +"} +(13,1,1) = {" +R +R +R +a +R +R +R +R +v +v +v +v +v +v +v +R +R +R +R +a +R +R +R +"} +(14,1,1) = {" +R +R +R +R +R +R +R +R +v +v +v +v +v +v +v +R +R +R +R +R +R +R +R +"} +(15,1,1) = {" +R +R +R +R +R +R +R +R +v +v +v +v +v +v +v +R +R +R +R +R +R +R +R +"} +(16,1,1) = {" +a +R +R +R +R +R +a +a +R +R +R +a +R +R +R +a +a +R +R +R +R +R +a +"} +(17,1,1) = {" +a +R +R +R +R +R +a +a +R +R +R +R +R +R +R +a +a +R +R +R +R +R +a +"} +(18,1,1) = {" +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +"} +(19,1,1) = {" +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +"} +(20,1,1) = {" +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +"} +(21,1,1) = {" +a +R +R +R +R +R +R +R +R +R +a +a +a +R +R +R +R +R +R +R +R +R +a +"} +(22,1,1) = {" +a +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +R +a +"} +(23,1,1) = {" +a +a +R +R +R +R +a +a +R +R +R +R +R +R +R +a +a +R +R +R +a +a +a +"} diff --git a/modular_splurt/_maps/RandomRuins/SpaceRuins/radiostation.dmm b/modular_splurt/_maps/RandomRuins/SpaceRuins/radiostation.dmm index 8da26c8a5c..a2629faf63 100644 --- a/modular_splurt/_maps/RandomRuins/SpaceRuins/radiostation.dmm +++ b/modular_splurt/_maps/RandomRuins/SpaceRuins/radiostation.dmm @@ -750,6 +750,7 @@ pixel_y = 8; name = "Radio Broadcaster" }, +/obj/machinery/spaceship_navigation_beacon/invion, /turf/closed/wall, /area/ruin/space/radiostation/control_room) "Rm" = ( diff --git a/modular_splurt/_maps/RandomRuins/SpaceRuins/spacehotelsplurt.dmm b/modular_splurt/_maps/RandomRuins/SpaceRuins/spacehotelsplurt.dmm index 3bf53dedae..bfdad29f60 100644 --- a/modular_splurt/_maps/RandomRuins/SpaceRuins/spacehotelsplurt.dmm +++ b/modular_splurt/_maps/RandomRuins/SpaceRuins/spacehotelsplurt.dmm @@ -1180,6 +1180,10 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/hotel/power) +"fU" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/hotel) "fV" = ( /obj/structure/toilet/secret/low_loot{ dir = 8 @@ -11182,7 +11186,7 @@ Tg rf GG Tg -Tg +fU WV Xb Tg diff --git a/modular_splurt/_maps/RandomRuins/SpaceRuins/syndielistenspace.dmm b/modular_splurt/_maps/RandomRuins/SpaceRuins/syndielistenspace.dmm index 25aba3405e..9fd32a6974 100644 --- a/modular_splurt/_maps/RandomRuins/SpaceRuins/syndielistenspace.dmm +++ b/modular_splurt/_maps/RandomRuins/SpaceRuins/syndielistenspace.dmm @@ -1428,6 +1428,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/listeningstation) +"Ly" = ( +/obj/machinery/spaceship_navigation_beacon/invion, +/turf/closed/wall, +/area/ruin/space/has_grav/listeningstation) "LL" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -1990,7 +1994,7 @@ ac aS ac ac -ac +Ly ac ac ac diff --git a/modular_splurt/code/datums/elements/crawl_under.dm b/modular_splurt/code/datums/elements/crawl_under.dm index 8d6bb253b5..42b31b7c7b 100644 --- a/modular_splurt/code/datums/elements/crawl_under.dm +++ b/modular_splurt/code/datums/elements/crawl_under.dm @@ -49,7 +49,7 @@ if(QDELETED(source) || QDELETED(user)) //sanity return to_chat(user, span_notice("You start crawling under [source]..")) - if(!do_after(user, 20, FALSE, source) || (user.mobility_flags & MOBILITY_STAND || user.incapacitated(TRUE, FALSE, TRUE))) + if(!do_after(user, 20, source) || (user.mobility_flags & MOBILITY_STAND || user.incapacitated(TRUE, FALSE, TRUE))) to_chat(user, span_warning("You fail to crawl under [source]!")) return diff --git a/modular_splurt/code/datums/interactions/lewd/_lewd.dm b/modular_splurt/code/datums/interactions/lewd/_lewd.dm index 0fc1fd2430..85d48c6f0d 100644 --- a/modular_splurt/code/datums/interactions/lewd/_lewd.dm +++ b/modular_splurt/code/datums/interactions/lewd/_lewd.dm @@ -239,7 +239,7 @@ else H.mob_climax(TRUE, "sex", partner, !cumin, target_gen) set_lust(0) - SEND_SIGNAL(src, COMSIG_MOB_CAME, target_orifice, partner) + SEND_SIGNAL(src, COMSIG_MOB_CAME, target_orifice, partner, cumin, last_genital) /mob/living/get_unconsenting(extreme, list/ignored_mobs, var/unholy) for(var/mob/M in range(7, src)) diff --git a/modular_splurt/code/datums/traits/trait_actions.dm b/modular_splurt/code/datums/traits/trait_actions.dm index 0a9ffaba7e..4b62fc2631 100644 --- a/modular_splurt/code/datums/traits/trait_actions.dm +++ b/modular_splurt/code/datums/traits/trait_actions.dm @@ -1656,7 +1656,7 @@ to_chat(U, span_warning("[C] already has a limb attached there!")) return C.visible_message(span_warning("[U] is attempting to attach [L] onto [C]!"), span_userdanger("[U] is attempting to re-attach one of your limbs!")) - if(do_after(U,40,target = C) && C.Adjacent(U)) + if(do_after(U, 40, target = C) && C.Adjacent(U)) L.attach_limb(C) C.visible_message(span_warning("[U] successfully attaches [L] onto [C]"), span_userdanger("[U] has successfully attached a [L.name] onto you; you can use that limb again!")) return @@ -1678,7 +1678,7 @@ return C.visible_message(span_warning("[U] is attempting to remove one of [C]'s limbs!"), span_userdanger("[U] is attempting to disconnect one of your limbs!")) var/obj/item/bodypart/B = C.get_bodypart(U.zone_selected) - if(C.Adjacent(U) && do_after(U,40,target = C)) + if(C.Adjacent(U) && do_after(U, 40, target = C)) var/obj/item/bodypart/D = C.get_bodypart(U.zone_selected) if(B != D) to_chat(U, span_warning("You cannot target a different limb while already removing another!")) diff --git a/modular_splurt/code/game/atoms.dm b/modular_splurt/code/game/atoms.dm index 86b510a692..bb0f26f087 100644 --- a/modular_splurt/code/game/atoms.dm +++ b/modular_splurt/code/game/atoms.dm @@ -1,5 +1,5 @@ /atom - var/icon/cum_splatter_icon + var/mutable_appearance/cum_splatter_icon /atom/log_message(message, message_type, color=null, log_globally=TRUE) //This is only a "temporal" measure until cit and tg decide to fix their shit if(!log_globally) diff --git a/modular_splurt/code/game/machinery/limbgrower.dm b/modular_splurt/code/game/machinery/limbgrower.dm index 8b98b7a523..a84c8c5e10 100644 --- a/modular_splurt/code/game/machinery/limbgrower.dm +++ b/modular_splurt/code/game/machinery/limbgrower.dm @@ -1,6 +1,8 @@ /obj/machinery/limbgrower/Initialize(mapload) var/list/extra_cat = list( - "shadekin" + "shadekin", + "teshari", + "vox" ) LAZYADD(categories, extra_cat) . = ..() @@ -8,3 +10,34 @@ /datum/species/mammal/shadekin limbs_id = SPECIES_SHADEKIN icon_limbs = 'modular_splurt/icons/mob/human_parts_greyscale.dmi' + +/datum/species/mammal/teshari + limbs_id = SPECIES_TESHARI + icon_limbs = 'modular_splurt/icons/mob/teshari.dmi' + icon_accessories = 'modular_splurt/icons/mob/clothing/species/teshari/accessories.dmi' + icon_back = 'modular_splurt/icons/mob/clothing/species/teshari/back.dmi' + icon_belt = 'modular_splurt/icons/mob/clothing/species/teshari/belt.dmi' + icon_ears = 'modular_splurt/icons/mob/clothing/species/teshari/ears.dmi' + icon_eyes = 'modular_splurt/icons/mob/clothing/species/teshari/eyes.dmi' + icon_feet = 'modular_splurt/icons/mob/clothing/species/teshari/feet.dmi' + icon_feet64 = 'modular_splurt/icons/mob/clothing/species/teshari/feet_64.dmi' + icon_hands = 'modular_splurt/icons/mob/clothing/species/teshari/hands.dmi' + icon_head = 'modular_splurt/icons/mob/clothing/species/teshari/head.dmi' + icon_mask = 'modular_splurt/icons/mob/clothing/species/teshari/mask.dmi' + icon_neck = 'modular_splurt/icons/mob/clothing/species/teshari/neck.dmi' + icon_uniform = 'modular_splurt/icons/mob/clothing/species/teshari/uniform.dmi' + icon_suit = 'modular_splurt/icons/mob/clothing/species/teshari/suit.dmi' + +/datum/species/vox + limbs_id = SPECIES_VOX + icon_limbs = 'modular_splurt/icons/mob/vox.dmi' + icon_back = 'modular_splurt/icons/mob/clothing/species/vox/back.dmi' + icon_ears = 'modular_splurt/icons/mob/clothing/species/vox/ears.dmi' + icon_eyes = 'modular_splurt/icons/mob/clothing/species/vox/eyes.dmi' + icon_feet = 'modular_splurt/icons/mob/clothing/species/vox/feet.dmi' + icon_feet64 = 'modular_splurt/icons/mob/clothing/species/vox/feet.dmi' + icon_hands = 'modular_splurt/icons/mob/clothing/species/vox/hands.dmi' + icon_head = 'modular_splurt/icons/mob/clothing/species/vox/head.dmi' + icon_mask = 'modular_splurt/icons/mob/clothing/species/vox/face.dmi' + icon_uniform = 'modular_splurt/icons/mob/clothing/species/vox/uniform.dmi' + icon_suit = 'modular_splurt/icons/mob/clothing/species/vox/suit.dmi' diff --git a/modular_splurt/code/game/machinery/research_table.dm b/modular_splurt/code/game/machinery/research_table.dm index 899910fac5..ef9067420b 100644 --- a/modular_splurt/code/game/machinery/research_table.dm +++ b/modular_splurt/code/game/machinery/research_table.dm @@ -40,7 +40,7 @@ if(user.a_intent == INTENT_HELP) if(panel_open && !slaver_mode) // Do not let slaver version switch to science mode, they should only generate credits. user.visible_message(span_notice("[user] begins changing the generation type on \the [src]."), span_notice("You begin changing the generation type on \the [src].")) - if(do_after(user, 5 SECONDS, TRUE, src)) + if(do_after(user, 5 SECONDS, src)) point_type = point_type == POINT_TYPE_SCIENCE ? POINT_TYPE_CARGO : POINT_TYPE_SCIENCE var/generation_message = null switch(point_type) @@ -54,7 +54,7 @@ return STOP_ATTACK_PROC_CHAIN else user.visible_message(span_notice("[user] begins reconfiguring \the [src]."), span_notice("You begin reconfiguring \the [src].")) - if(do_after(user, 5 SECONDS, TRUE, src)) + if(do_after(user, 5 SECONDS, src)) configured = !configured user.visible_message(span_notice("[user] finished reconfiguring \the [src]."), span_notice("The research table is now [configured ? "configured" : "not configured"].")) else @@ -102,7 +102,7 @@ /obj/machinery/research_table/proc/handle_unbuckling(mob/living/buckled_mob, user) if(buckled_mob == user) - if(do_after(user, self_unbuckle_time, FALSE, src)) + if(do_after(user, self_unbuckle_time, src)) return TRUE else return FALSE diff --git a/modular_splurt/code/game/objects/items/carvingstones/carvingstones.dm b/modular_splurt/code/game/objects/items/carvingstones/carvingstones.dm index fe96fcc459..bb6b1086b1 100644 --- a/modular_splurt/code/game/objects/items/carvingstones/carvingstones.dm +++ b/modular_splurt/code/game/objects/items/carvingstones/carvingstones.dm @@ -1,80 +1,77 @@ /obj/item/toy/carvingstone - var/on_break_sound = 'modular_splurt/sound/carvings/hello.ogg' + var/stone_sound = 'modular_splurt/sound/carvings/hello.ogg' name = "Hello Carving Stone" desc = "This stone has a face that looks happy to see you carved onto it." - icon = 'modular_splurt/icons/carvingstones/Carving_Stones.dmi' + attack_verb = list("bonked", "bapped") + icon = 'modular_splurt/icons/obj/carvingstones/carving_stones.dmi' icon_state = "hello" item_state = "minimeteor" w_class = WEIGHT_CLASS_TINY + var/sound_cooldown_last = 0 + var/sound_cooldown = 0.8 SECONDS /obj/item/toy/carvingstone/helpme - on_break_sound = 'modular_splurt/sound/carvings/help_me.ogg' + stone_sound = 'modular_splurt/sound/carvings/help_me.ogg' name = "Help Me Carving Stone" desc = "This stone has a face that looks like it's calling out for help carved onto it." icon_state = "help_me" /obj/item/toy/carvingstone/verygood - on_break_sound = 'modular_splurt/sound/carvings/very_good.ogg' + stone_sound = 'modular_splurt/sound/carvings/very_good.ogg' name = "Very Good Carving Stone" desc = "This carved stone has a face that looks like it's amused onto it." icon_state = "very_good" /obj/item/toy/carvingstone/imsorry - on_break_sound = 'modular_splurt/sound/carvings/im_sorry.ogg' + stone_sound = 'modular_splurt/sound/carvings/im_sorry.ogg' name = "I'm Sorry Carving Stone" desc = "This carved stone has a face that looks apologetic carved onto it." icon_state = "im_sorry" /obj/item/toy/carvingstone/thankyou - on_break_sound = 'modular_splurt/sound/carvings/thank_you.ogg' + stone_sound = 'modular_splurt/sound/carvings/thank_you.ogg' name = "Thank You Carving Stone" desc = "This carved stone has a face that looks grateful carved onto it." icon_state = "thank_you" +/obj/item/toy/carvingstone/attack(atom/target, mob/living/user, proximity_flag, clickparams) + . = ..() + MakeStoneSound(target) + /obj/item/toy/carvingstone/throw_impact(atom/hit_atom) - BreakStone(hit_atom) + ..() + MakeStoneSound(hit_atom) + MakeHitSound(hit_atom) /obj/item/toy/carvingstone/attack_self(mob/user) - BreakStone(user) + ..() + if(sound_cooldown_last < world.time) + MakeStoneSound(user) + sound_cooldown_last = world.time + sound_cooldown -/obj/item/toy/carvingstone/afterattack(atom/O, mob/user, proximity) - BreakStone(O) - -/obj/item/toy/carvingstone/proc/BreakStone(atom/movable/hit_atom) - hit_atom.visible_message("The [src] breaks") +/obj/item/toy/carvingstone/proc/MakeStoneSound(atom/movable/hit_atom) var/turf/T = get_turf(hit_atom) - playsound(T, on_break_sound, 100, FALSE) - qdel(src) + playsound(T, stone_sound, 100, FALSE) + +/obj/item/toy/carvingstone/proc/MakeHitSound(atom/movable/hit_atom) + var/turf/T = get_turf(hit_atom) + playsound(T, hitsound, 100, FALSE) + /datum/supply_pack/costumes_toys/carvingstones name = "Carving Stones Crate" - desc = "Let your friends or foes know what you think about them, via stone-to-face communication!" + desc = "Let your friends and foes know what you think about them, via stone-to-face communication!" cost = 400 contains = list(/obj/item/toy/carvingstone, /obj/item/toy/carvingstone, - /obj/item/toy/carvingstone, - /obj/item/toy/carvingstone, - /obj/item/toy/carvingstone, - /obj/item/toy/carvingstone/helpme, - /obj/item/toy/carvingstone/helpme, - /obj/item/toy/carvingstone/helpme, /obj/item/toy/carvingstone/helpme, /obj/item/toy/carvingstone/helpme, /obj/item/toy/carvingstone/verygood, /obj/item/toy/carvingstone/verygood, - /obj/item/toy/carvingstone/verygood, - /obj/item/toy/carvingstone/verygood, - /obj/item/toy/carvingstone/verygood, - /obj/item/toy/carvingstone/thankyou, - /obj/item/toy/carvingstone/thankyou, - /obj/item/toy/carvingstone/thankyou, /obj/item/toy/carvingstone/thankyou, /obj/item/toy/carvingstone/thankyou, /obj/item/toy/carvingstone/imsorry, /obj/item/toy/carvingstone/imsorry, - /obj/item/toy/carvingstone/imsorry, - /obj/item/toy/carvingstone/imsorry, - /obj/item/toy/carvingstone/imsorry ) crate_name = "Carving Stones Crate" crate_type = /obj/structure/closet/crate/wooden diff --git a/modular_splurt/code/game/objects/items/hierobird/hierobird.dm b/modular_splurt/code/game/objects/items/hierobird/hierobird.dm new file mode 100644 index 0000000000..79668ad632 --- /dev/null +++ b/modular_splurt/code/game/objects/items/hierobird/hierobird.dm @@ -0,0 +1,39 @@ +/obj/item/hierophant_club/coolbird + icon = 'modular_splurt/icons/obj/hierobird/hierophant_bird_club.dmi' + desc = "The strange technology of this large club allows various nigh-magical feats. Smells of Bymoridth; comes from a cool bird." + lefthand_file = 'modular_splurt/icons/obj/hierobird/hierophant_bird_club_inhand_left.dmi' + righthand_file = 'modular_splurt/icons/obj/hierobird/hierophant_bird_club_inhand_right.dmi' + +/turf/closed/indestructible/riveted/hierophant/coolbird + icon = 'modular_splurt/icons/obj/hierobird/hierophant_bird_walls.dmi' + +/turf/open/indestructible/hierophant/coolbird + icon = 'modular_splurt/icons/obj/hierobird/hierophant_bird_floors.dmi' + baseturfs = /turf/open/indestructible/hierophant/coolbird + +/turf/open/indestructible/hierophant/coolbird/two + +/mob/living/simple_animal/hostile/megafauna/hierophant/coolbird + icon = 'modular_splurt/icons/obj/hierobird/hierophant_bird.dmi' + name = "Hierophant" + desc = "A penguin-like entity, he's holding what appears to be a scepter of some sort..." + +/obj/item/hierophant_club/coolbird/ui_action_click(mob/user, action) + ..() + if (beacon) + beacon.icon = 'modular_splurt/icons/obj/hierobird/hierophant_bird_club.dmi' + +/* +/datum/map_template/ruin/lavaland/hierophantbird + name = "Hierophant Bird's Arena" + id = "birdophant" + description = "A strange, square chunk of gold of massive size. Inside awaits only death and many, many squares." + prefix = "modular_splurt/_maps/RandomRuins/LavaRuins" + suffix = "lavaland_surface_hierophant_birdie.dmm" + allow_duplicates = FALSE + placement_weight = 1 + +/datum/map_template/ruin/lavaland/hierophant + always_place = TRUE + never_spawn_with = list(/datum/map_template/ruin/lavaland/hierophantbird) +*/ diff --git a/modular_splurt/code/game/objects/items/implants/implant_slaver.dm b/modular_splurt/code/game/objects/items/implants/implant_slaver.dm index 54ec564bd6..79154ca9c5 100644 --- a/modular_splurt/code/game/objects/items/implants/implant_slaver.dm +++ b/modular_splurt/code/game/objects/items/implants/implant_slaver.dm @@ -8,7 +8,7 @@ . = ..() imp_in.visible_message(span_notice("[imp_in] begins fiddling with a subtle bump on their arm."), span_notice("You prepare to teleport.")) - if(do_mob(imp_in, imp_in, 5 SECONDS, ignorehelditem = TRUE)) + if(do_mob(imp_in, imp_in, 5 SECONDS, IGNORE_HELD_ITEM)) playsound(get_turf(imp_in.loc), 'sound/magic/blink.ogg', 50, 1) imp_in.visible_message(span_notice("[imp_in] vanishes from sight!"), \ span_notice("You activate [src], sending you to the slaver mothership!")) diff --git a/modular_splurt/code/game/objects/items/lewd_items/lewd.dm b/modular_splurt/code/game/objects/items/lewd_items/lewd.dm index 7b46674ce4..56aee1ce0b 100644 --- a/modular_splurt/code/game/objects/items/lewd_items/lewd.dm +++ b/modular_splurt/code/game/objects/items/lewd_items/lewd.dm @@ -1,5 +1,5 @@ /obj/item/key/latex name = "Latex Adjustment Override" - desc = "This is a strange device that ensurs your 'gifts' are recieved perminantly" + desc = "This is a strange device that ensures your 'gifts' are recieved permanently" icon = 'modular_splurt/icons/obj/lewd_items/lewd_items.dmi' icon_state = "lustwish_discount" diff --git a/modular_splurt/code/game/objects/structures/bathroom.dm b/modular_splurt/code/game/objects/structures/bathroom.dm index 774ba2f3e7..d75f5a9bb8 100644 --- a/modular_splurt/code/game/objects/structures/bathroom.dm +++ b/modular_splurt/code/game/objects/structures/bathroom.dm @@ -31,8 +31,11 @@ if(!do_after(H, 130, target = src)) H.visible_message(span_notice("[H] gives up!"), span_warning("Fuck this shit.")) return - H.visible_message(span_notice("[H] finishes cleaning \the [src]!"), span_notice("You're finally done. Thank fuck.'")) - new /obj/structure/urinal(loc, dir, TRUE) + H.visible_message(span_notice("[H] finishes cleaning \the [src]!"), span_notice("You're finally done. Thank fuck.")) + var /obj/structure/urinal/cleaned = new /obj/structure/urinal(loc, dir, TRUE) + cleaned.pixel_y = src.pixel_y + cleaned.pixel_x = src.pixel_x + qdel(src) return return ..() diff --git a/modular_splurt/code/modules/antagonists/qareen/qareen_abilities.dm b/modular_splurt/code/modules/antagonists/qareen/qareen_abilities.dm index 4af34c922c..439d1a2053 100644 --- a/modular_splurt/code/modules/antagonists/qareen/qareen_abilities.dm +++ b/modular_splurt/code/modules/antagonists/qareen/qareen_abilities.dm @@ -33,12 +33,12 @@ face_atom(target) draining = TRUE to_chat(src, span_revennotice("You search for the lifespring of [target].")) - if(do_after(src, rand(10, 20), 0, target)) //did they get deleted in that second? + if(do_after(src, rand(10, 20), target)) //did they get deleted in that second? for(var/obj/item/organ/genital/G in target.internal_organs) if(!(G.genital_flags & GENITAL_FUID_PRODUCTION)) continue // var/datum/reagents/fluid_source = G.climaxable(target) - if(do_after(src, rand(10, 20), 0, target)) //did they get deleted in that second? + if(do_after(src, rand(10, 20), target)) //did they get deleted in that second? // var/main_fluid = lowertext(fluid_source.get_master_reagent_name()) // doesn't work no more (should delete probably) var/main_fluid = G.get_fluid_name() var/fluid_ammount = G.get_fluid() @@ -57,7 +57,7 @@ - if(do_after(src, rand(15, 20), 0, target)) //did they get deleted NOW? + if(do_after(src, rand(15, 20), target)) //did they get deleted NOW? switch(essence_drained) if(0 to 4) to_chat(src, span_revennotice("[target] is almost barren of essence. Still, every bit counts.")) @@ -67,7 +67,7 @@ to_chat(src, span_revenboldnotice("Such a feast! [target] will yield much essence to you.")) if(30 to INFINITY) to_chat(src, span_revenbignotice("Ah, a sexually furstrated person. [target] will yield massive amounts of essence to you.")) - if(do_after(src, rand(15, 25), 0, target)) //how about now + if(do_after(src, rand(15, 25), target)) //how about now if(target.stat) to_chat(src, span_revenwarning("[target.p_theyre(TRUE)] now too weak to provide anything of worth.")) to_chat(target, span_boldannounce("You feel something tugging across your body before subsiding.")) @@ -90,7 +90,7 @@ draining = FALSE return var/datum/beam/B = Beam(target,icon_state="drain_life",time=INFINITY) - if(do_after(src, 46, 0, target)) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining. + if(do_after(src, 46, target)) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining. change_essence_amount(essence_drained, FALSE, target) for(var/obj/item/organ/genital/G in target.internal_organs) var/datum/reagents/fluid_source = G.climaxable(target) diff --git a/modular_splurt/code/modules/arousal/arousal.dm b/modular_splurt/code/modules/arousal/arousal.dm index b5370894f0..714e7a3d84 100644 --- a/modular_splurt/code/modules/arousal/arousal.dm +++ b/modular_splurt/code/modules/arousal/arousal.dm @@ -114,18 +114,21 @@ var/percentage = ((get_lust() / (get_lust_tolerance() * 3)) * 100) return percentage -/atom/proc/add_cum_overlay() //This can go in a better spot, for now its here. - cum_splatter_icon = icon(initial(icon), initial(icon_state), dir = 1) - cum_splatter_icon.Blend("#fff", ICON_ADD) - cum_splatter_icon.Blend(icon('modular_splurt/icons/effects/cumoverlay.dmi', "cum_obj"), ICON_MULTIPLY) +/atom/proc/add_cum_overlay(cum_color) //This can go in a better spot, for now its here. + wash_cum() + cum_splatter_icon = mutable_appearance('modular_splurt/icons/effects/cumoverlay.dmi', "cum_obj", color = cum_color) + add_overlay(cum_splatter_icon) + +/mob/living/carbon/human/add_cum_overlay(cum_color, large = FALSE) + wash_cum() + cum_splatter_icon = mutable_appearance('modular_splurt/icons/effects/cumoverlay.dmi', large ? "cum_large" : "cum_normal", color = cum_color) add_overlay(cum_splatter_icon) /atom/proc/wash_cum() - cut_overlay(mutable_appearance('modular_splurt/icons/effects/cumoverlay.dmi', "cum_normal")) - cut_overlay(mutable_appearance('modular_splurt/icons/effects/cumoverlay.dmi', "cum_large")) if(cum_splatter_icon) cut_overlay(cum_splatter_icon) - return TRUE + QDEL_NULL(cum_splatter_icon) + return TRUE //arousal hud display diff --git a/modular_splurt/code/modules/arousal/genitals.dm b/modular_splurt/code/modules/arousal/genitals.dm index f6e48e6df4..e854d9cd2a 100644 --- a/modular_splurt/code/modules/arousal/genitals.dm +++ b/modular_splurt/code/modules/arousal/genitals.dm @@ -5,6 +5,7 @@ var/datum/reagent/original_fluid_id var/datum/reagent/default_fluid_id var/list/writtentext = "" + var/list/obj/item/equipment = list() /obj/item/organ/genital/modify_size(modifier, min, max) . = ..() @@ -31,6 +32,11 @@ return linked_organ.fluid_id return +/obj/item/organ/genital/proc/splash_cum(mob/living/carbon/human/orgasming, target_orifice, atom/partner, cumin, genital) + SIGNAL_HANDLER + + return !(!owner || cumin || genital != src) + /obj/item/organ/genital/proc/get_fluid_name() var/milkies = get_fluid_id() var/message @@ -53,9 +59,6 @@ else if(linked_organ?.genital_flags & GENITAL_FUID_PRODUCTION) linked_organ?.fluid_id = new_fluidtype -/obj/item/organ/genital - var/list/obj/item/equipment = list() - /mob/living/carbon/human/update_genitals() . = ..() diff --git a/modular_splurt/code/modules/arousal/organs/breasts.dm b/modular_splurt/code/modules/arousal/organs/breasts.dm index a4f3688d00..beeebefe4f 100644 --- a/modular_splurt/code/modules/arousal/organs/breasts.dm +++ b/modular_splurt/code/modules/arousal/organs/breasts.dm @@ -1,6 +1,18 @@ /obj/item/organ/genital/breasts default_fluid_id = /datum/reagent/consumable/milk +/obj/item/organ/genital/breasts/Insert(mob/living/carbon/M, special, drop_if_replaced) + . = ..() + if(!.) + return + RegisterSignal(owner, COMSIG_MOB_CAME, .proc/splash_cum) + +/obj/item/organ/genital/breasts/Remove(special) + . = ..() + var/mob/living/carbon/human/C = . + if(!QDELETED(C)) + UnregisterSignal(C, COMSIG_MOB_CAME) + /obj/item/organ/genital/breasts/get_features(mob/living/carbon/human/H) var/datum/dna/D = H.dna if(D.features["breasts_fluid"]) @@ -38,3 +50,34 @@ owner.visible_message("\The [owner]'s [pick(GLOB.breast_nouns)] swell up with the surge of [lowertext(source_gen.get_fluid_name())] from \the [partner]'s [source_gen.name]", ignored_mobs = owner.get_unconsenting()) fluid_id = source_gen.get_fluid_id() climax_fluids.clear_reagents() + +/obj/item/organ/genital/breasts/splash_cum(mob/living/carbon/human/orgasming, target_orifice, atom/partner, cumin, genital) + . = ..() + if(!.) + return + + // determine size stage + var/width_multiplier = 0 + switch(round(size * get_size(owner))) + if(10 to 20) + width_multiplier = 1 + if(20 to INFINITY) + width_multiplier = 2 + + // get affected objects + var/turf/target_turf = owner.loc + var/list/atom/cumsplashed_items = list() + if(!istype(target_turf)) + return + for(var/i in 0 to width_multiplier) + target_turf = get_step(target_turf, owner.dir) + for(var/object in target_turf.contents) + if(isturf(object)) + continue + LAZYADD(cumsplashed_items, object) + if(cumsplashed_items.len) + break + + // splash affected objects + for(var/atom/object in cumsplashed_items) + object.add_cum_overlay(initial(fluid_id.color), width_multiplier > 1 ? TRUE : FALSE) diff --git a/modular_splurt/code/modules/arousal/organs/penis.dm b/modular_splurt/code/modules/arousal/organs/penis.dm index 78e015ea0b..3dde725a1c 100644 --- a/modular_splurt/code/modules/arousal/organs/penis.dm +++ b/modular_splurt/code/modules/arousal/organs/penis.dm @@ -1,3 +1,15 @@ +/obj/item/organ/genital/penis/Insert(mob/living/carbon/M, special, drop_if_replaced) + . = ..() + if(!.) + return + RegisterSignal(owner, COMSIG_MOB_CAME, .proc/splash_cum) + +/obj/item/organ/genital/penis/Remove(special) + . = ..() + var/mob/living/carbon/human/C = . + if(!QDELETED(C)) + UnregisterSignal(C, COMSIG_MOB_CAME) + /obj/item/organ/genital/penis/get_features(mob/living/carbon/human/H) . = ..() original_fluid_id = fluid_id @@ -35,3 +47,36 @@ if(linked_organ) linked_organ.fluid_id = source_gen.get_fluid_id() target.clear_reagents() + +/obj/item/organ/genital/penis/splash_cum(mob/living/carbon/human/orgasming, target_orifice, atom/partner, cumin, genital) + . = ..() + if(!. || !linked_organ) + return + + // determine size stage + var/length_multiplier = 0 + switch(round(length * get_size(owner))) + if(16 to 32) + length_multiplier = 1 + if(32 to INFINITY) + length_multiplier = 2 + else + return + + // get affected objects + var/turf/target_turf = owner.loc + var/list/atom/cumsplashed_items = list() + if(!istype(target_turf)) + return + for(var/i in 0 to length_multiplier) + target_turf = get_step(target_turf, owner.dir) + for(var/object in target_turf.contents) + if(isturf(object)) + continue + LAZYADD(cumsplashed_items, object) + if(cumsplashed_items.len) + break + + // splash affected objects + for(var/atom/object in cumsplashed_items) + object.add_cum_overlay(initial(linked_organ.fluid_id.color), length_multiplier > 1 ? TRUE : FALSE) diff --git a/modular_splurt/code/modules/arousal/organs/vagina.dm b/modular_splurt/code/modules/arousal/organs/vagina.dm new file mode 100644 index 0000000000..600a63d5a6 --- /dev/null +++ b/modular_splurt/code/modules/arousal/organs/vagina.dm @@ -0,0 +1,30 @@ +/obj/item/organ/genital/vagina/Insert(mob/living/carbon/M, special, drop_if_replaced) + . = ..() + if(!.) + return + RegisterSignal(owner, COMSIG_MOB_CAME, .proc/splash_cum) + +/obj/item/organ/genital/vagina/Remove(special) + . = ..() + var/mob/living/carbon/human/C = . + if(!QDELETED(C)) + UnregisterSignal(C, COMSIG_MOB_CAME) + +/obj/item/organ/genital/vagina/splash_cum(mob/living/carbon/human/orgasming, target_orifice, atom/partner, cumin, genital) + . = ..() + if(!. || !linked_organ) + return + + if(get_size(owner) < 1.25) + return + + // get target objects + var/turf/target_turf = get_turf(owner) + if(!istype(target_turf)) + return + + // splash affected objects + for(var/atom/object in target_turf.contents) + if(!istype(object) || isturf(object) || object == owner) + continue + object.add_cum_overlay(initial(linked_organ.fluid_id.color), get_size(owner) >= 1.5) diff --git a/modular_splurt/code/modules/arousal/toys/dildos.dm b/modular_splurt/code/modules/arousal/toys/dildos.dm index 0dd77f4583..4cc0c6f939 100644 --- a/modular_splurt/code/modules/arousal/toys/dildos.dm +++ b/modular_splurt/code/modules/arousal/toys/dildos.dm @@ -5,7 +5,7 @@ attack_verb = list("penetrated", "slapped", "gaped", "prolapsed", "inseminated", "destroyed", "broke", "demolished", "whacked") /obj/item/dildo/flared/gigantic/suicide_act(mob/living/user) - if(do_after(user,45,target=src)) + if(do_after(user, 45, target=src)) user.visible_message(span_suicide("[user] tears-up and gags as they try to deepthroat the [src]! WHY WOULD THEY DO THAT? It looks like [user.p_theyre()] trying to commit suicide!!")) playsound(loc, 'sound/weapons/gagging.ogg', 50, 2, -1) user.Stun(400) diff --git a/modular_splurt/code/modules/cargo/packs/emergency.dm b/modular_splurt/code/modules/cargo/packs/emergency.dm index 4b99b13067..4eb0cb40ab 100644 --- a/modular_splurt/code/modules/cargo/packs/emergency.dm +++ b/modular_splurt/code/modules/cargo/packs/emergency.dm @@ -1,5 +1,5 @@ /datum/supply_pack/emergency/radiatione_emergency_bikini - name = "Emergenc Beach Radiation Protection Crate" + name = "Emergency Beach Radiation Protection Crate" desc = "Survive(?) the Nuclear Summer and Supermatter Engine alike with two sets of Radkinis. Each set contains a mask, bikini, and Geiger counter. We'll even throw in a few pill bottles that are able to handles radiation and the affects of the poisoning." cost = 2000 contains = list(/obj/item/clothing/mask/gas/radmask, diff --git a/modular_splurt/code/modules/cargo/packs/goodies.dm b/modular_splurt/code/modules/cargo/packs/goodies.dm index b452cd9002..465b700273 100644 --- a/modular_splurt/code/modules/cargo/packs/goodies.dm +++ b/modular_splurt/code/modules/cargo/packs/goodies.dm @@ -111,13 +111,13 @@ contains = list( /obj/item/gunpart/riflebrush2stock, /obj/item/gunpart/riflebrush2barrel, /obj/item/ammo_box/g45l) /datum/supply_pack/goody/revolver45_single - name = ".45 Reolver Single-Pack" + name = ".45 Revolver Single-Pack" desc = "Contains a parts kit to assemble a 45 Revolver Gun. Comes with a box of .45 Long" cost = 800 contains = list( /obj/item/gunpart/revolver45cylinder, /obj/item/gunpart/revolver45frame, /obj/item/ammo_box/g45l) /datum/supply_pack/goody/huntingshotgun_single name = "Hunting Shotgun Single-Pack" - desc = "Contains a parts kit to assemble a hutning shotgun." + desc = "Contains a parts kit to assemble a hunting shotgun." cost = 1700 contains = list(/obj/item/gunpart/shotgunhutningstock, /obj/item/gunpart/shotgunhutningbarrel, /obj/item/storage/box/lethalshot) diff --git a/modular_splurt/code/modules/cargo/packs/misc.dm b/modular_splurt/code/modules/cargo/packs/misc.dm index 98bdc574ac..cb4af91dee 100644 --- a/modular_splurt/code/modules/cargo/packs/misc.dm +++ b/modular_splurt/code/modules/cargo/packs/misc.dm @@ -576,3 +576,133 @@ /obj/item/cane/plague ) crate_name = "plague doctor crate" + +/datum/supply_pack/randomised/costumes/tesh_cloaks_vr + name = "Teshari cloaks" + + contains = list( + /obj/item/clothing/neck/cloak/teshari/standard/white, + /obj/item/clothing/neck/cloak/teshari/standard/white_grey, + /obj/item/clothing/neck/cloak/teshari/standard/red_grey, + /obj/item/clothing/neck/cloak/teshari/standard/orange_grey, + /obj/item/clothing/neck/cloak/teshari/standard/yellow_grey, + /obj/item/clothing/neck/cloak/teshari/standard/green_grey, + /obj/item/clothing/neck/cloak/teshari/standard/blue_grey, + /obj/item/clothing/neck/cloak/teshari/standard/purple_grey, + /obj/item/clothing/neck/cloak/teshari/standard/pink_grey, + /obj/item/clothing/neck/cloak/teshari/standard/brown_grey, + /obj/item/clothing/neck/cloak/teshari/standard/rainbow, + /obj/item/clothing/neck/cloak/teshari/standard/orange + ) + cost = 40 + + + +/datum/supply_pack/randomised/costumes/tesh_cloaks_b_vr + name = "Teshari cloaks (black)" + + contains = list( + /obj/item/clothing/neck/cloak/teshari, + /obj/item/clothing/neck/cloak/teshari/standard/black_red, + /obj/item/clothing/neck/cloak/teshari/standard/black_orange, + /obj/item/clothing/neck/cloak/teshari/standard/black_yellow, + /obj/item/clothing/neck/cloak/teshari/standard/black_green, + /obj/item/clothing/neck/cloak/teshari/standard/black_blue, + /obj/item/clothing/neck/cloak/teshari/standard/black_purple, + /obj/item/clothing/neck/cloak/teshari/standard/black_pink, + /obj/item/clothing/neck/cloak/teshari/standard/black_brown, + /obj/item/clothing/neck/cloak/teshari/standard/black_grey, + /obj/item/clothing/neck/cloak/teshari/standard/black_white, + /obj/item/clothing/neck/cloak/teshari/standard/black_glow, + /obj/item/clothing/neck/cloak/teshari/standard/dark_retrowave + ) + cost = 40 + + + +/datum/supply_pack/randomised/costumes/tesh_beltcloaks_vr + name = "Teshari cloaks (belted)" + + contains = list( + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/orange_grey, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/rainbow, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/lightgrey_grey, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/white_grey, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/red_grey, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/orange, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/yellow_grey, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/green_grey, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/blue_grey, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/purple_grey, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/pink_grey, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/brown_grey + ) + cost = 40 + + + +/datum/supply_pack/randomised/costumes/tesh_beltcloaks_b_vr + name = "Teshari cloaks (belted, black)" + + contains = list( + /obj/item/clothing/suit/hooded/teshari/beltcloak, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_orange, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_grey, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_midgrey, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_lightgrey, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_white, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_red, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_yellow, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_green, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_blue, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_purple, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_pink, + /obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_brown + ) + cost = 40 + + + +/datum/supply_pack/randomised/costumes/tesh_hoodcloaks_vr + name = "Teshari cloaks (hooded)" + + contains = list( + /obj/item/clothing/suit/hooded/teshari/standard/orange_grey, + /obj/item/clothing/suit/hooded/teshari/standard/lightgrey_grey, + /obj/item/clothing/suit/hooded/teshari/standard/white_grey, + /obj/item/clothing/suit/hooded/teshari/standard/red_grey, + /obj/item/clothing/suit/hooded/teshari/standard/orange, + /obj/item/clothing/suit/hooded/teshari/standard/yellow_grey, + /obj/item/clothing/suit/hooded/teshari/standard/green_grey, + /obj/item/clothing/suit/hooded/teshari/standard/blue_grey, + /obj/item/clothing/suit/hooded/teshari/standard/purple_grey, + /obj/item/clothing/suit/hooded/teshari/standard/pink_grey, + /obj/item/clothing/suit/hooded/teshari/standard/brown_grey + ) + cost = 40 + + + +/datum/supply_pack/randomised/costumes/tesh_hoodcloaks_b_vr + name = "Teshari cloaks (hooded, black)" + + contains = list( + /obj/item/clothing/suit/hooded/teshari, + /obj/item/clothing/suit/hooded/teshari/standard/black_orange, + /obj/item/clothing/suit/hooded/teshari/standard/black_grey, + /obj/item/clothing/suit/hooded/teshari/standard/black_midgrey, + /obj/item/clothing/suit/hooded/teshari/standard/black_lightgrey, + /obj/item/clothing/suit/hooded/teshari/standard/black_white, + /obj/item/clothing/suit/hooded/teshari/standard/black_red, + /obj/item/clothing/suit/hooded/teshari/standard/black, + /obj/item/clothing/suit/hooded/teshari/standard/black_yellow, + /obj/item/clothing/suit/hooded/teshari/standard/black_green, + /obj/item/clothing/suit/hooded/teshari/standard/black_blue, + /obj/item/clothing/suit/hooded/teshari/standard/black_purple, + /obj/item/clothing/suit/hooded/teshari/standard/black_pink, + /obj/item/clothing/suit/hooded/teshari/standard/black_brown + ) + cost = 40 + + diff --git a/modular_splurt/code/modules/client/loadout/donator/first_tier.dm b/modular_splurt/code/modules/client/loadout/donator/first_tier.dm index beeb3f3af9..ce763274e1 100644 --- a/modular_splurt/code/modules/client/loadout/donator/first_tier.dm +++ b/modular_splurt/code/modules/client/loadout/donator/first_tier.dm @@ -13,6 +13,12 @@ ckeywhitelist = list() donator_group_id = DONATOR_GROUP_TIER_1 +/datum/gear/donator/uniform/chameleon + name = "Chameleon suit" + path = /obj/item/clothing/under/chameleon + ckeywhitelist = list() + donator_group_id = DONATOR_GROUP_TIER_1 + //Head /datum/gear/donator/head/crown/fancy name = "magnificent crown" diff --git a/modular_splurt/code/modules/client/loadout/neck.dm b/modular_splurt/code/modules/client/loadout/neck.dm index 6fa1c5bdfb..5e1b89e29c 100644 --- a/modular_splurt/code/modules/client/loadout/neck.dm +++ b/modular_splurt/code/modules/client/loadout/neck.dm @@ -52,3 +52,35 @@ path = /obj/item/clothing/neck/petcollar/poly loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC loadout_initial_colors = list("#00bb70", "#FFC600") + +/datum/gear/neck/teshari + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION + +/datum/gear/neck/teshari/standard + name = "Teshari Cloak" + path = /obj/item/clothing/neck/cloak/teshari + + +/datum/gear/neck/teshari/black_red + name = "Teshari Cloak Black Red" + path = /obj/item/clothing/neck/cloak/teshari/standard/black_red + +/datum/gear/neck/teshari/white + name = "Teshari Cloak White" + path = /obj/item/clothing/neck/cloak/teshari/standard/white + +/datum/gear/neck/teshari/rainbow + name = "Teshari Cloak Rainbow" + path = /obj/item/clothing/neck/cloak/teshari/standard/rainbow + +/datum/gear/neck/teshari/orange + name = "Teshari Cloak orange" + path = /obj/item/clothing/neck/cloak/teshari/standard/orange + +/datum/gear/neck/teshari/dark_retrowave + name = "Teshari Cloak Dark Retrowave" + path = /obj/item/clothing/neck/cloak/teshari/standard/dark_retrowave + +/datum/gear/neck/teshari/black_glow + name = "Teshari Cloak Dark Black Glow" + path = /obj/item/clothing/neck/cloak/teshari/standard/black_glow diff --git a/modular_splurt/code/modules/clothing/outfits/standard.dm b/modular_splurt/code/modules/clothing/outfits/standard.dm new file mode 100644 index 0000000000..89e34afd8a --- /dev/null +++ b/modular_splurt/code/modules/clothing/outfits/standard.dm @@ -0,0 +1,4 @@ +/datum/outfit/vox + name = "Vox" + r_hand = /obj/item/tank/internals/plasmaman/belt/full + mask = /obj/item/clothing/mask/breath diff --git a/modular_splurt/code/modules/clothing/suits/cloaks.dm b/modular_splurt/code/modules/clothing/suits/cloaks.dm index bbbf127829..64e64151cb 100644 --- a/modular_splurt/code/modules/clothing/suits/cloaks.dm +++ b/modular_splurt/code/modules/clothing/suits/cloaks.dm @@ -50,3 +50,713 @@ . = ..() */ + +// Standard Cloaks +/obj/item/clothing/neck/cloak/teshari + name = "black cloak" + desc = "It drapes over a Teshari's shoulders and closes at the neck with pockets convienently placed inside." + icon = 'modular_splurt/icons/mob/clothing/species/teshari/tesh_items.dmi' + icon_state = "tesh_cloak_bn" + + + +/obj/item/clothing/neck/cloak/teshari/standard/black_red + name = "black and red cloak" + icon_state = "tesh_cloak_br" + +/obj/item/clothing/neck/cloak/teshari/standard/black_orange + name = "black and orange cloak" + icon_state = "tesh_cloak_bo" + +/obj/item/clothing/neck/cloak/teshari/standard/black_yellow + name = "black and yellow cloak" + icon_state = "tesh_cloak_by" + +/obj/item/clothing/neck/cloak/teshari/standard/black_green + name = "black and green cloak" + icon_state = "tesh_cloak_bgr" + +/obj/item/clothing/neck/cloak/teshari/standard/black_blue + name = "black and blue cloak" + icon_state = "tesh_cloak_bbl" + +/obj/item/clothing/neck/cloak/teshari/standard/black_purple + name = "black and purple cloak" + icon_state = "tesh_cloak_bp" + +/obj/item/clothing/neck/cloak/teshari/standard/black_pink + name = "black and pink cloak" + icon_state = "tesh_cloak_bpi" + +/obj/item/clothing/neck/cloak/teshari/standard/black_brown + name = "black and brown cloak" + icon_state = "tesh_cloak_bbr" + +/obj/item/clothing/neck/cloak/teshari/standard/black_grey + name = "black and grey cloak" + icon_state = "tesh_cloak_bg" + +/obj/item/clothing/neck/cloak/teshari/standard/black_white + name = "black and white cloak" + icon_state = "tesh_cloak_bw" + +/obj/item/clothing/neck/cloak/teshari/standard/white + name = "white cloak" + icon_state = "tesh_cloak_wn" + +/obj/item/clothing/neck/cloak/teshari/standard/white_grey + name = "white and grey cloak" + icon_state = "tesh_cloak_wg" + +/obj/item/clothing/neck/cloak/teshari/standard/red_grey + name = "red and grey cloak" + icon_state = "tesh_cloak_rg" + +/obj/item/clothing/neck/cloak/teshari/standard/orange_grey + name = "orange and grey cloak" + icon_state = "tesh_cloak_og" + +/obj/item/clothing/neck/cloak/teshari/standard/yellow_grey + name = "yellow and grey cloak" + icon_state = "tesh_cloak_yg" + +/obj/item/clothing/neck/cloak/teshari/standard/green_grey + name = "green and grey cloak" + icon_state = "tesh_cloak_gg" + +/obj/item/clothing/neck/cloak/teshari/standard/blue_grey + name = "blue and grey cloak" + icon_state = "tesh_cloak_blug" + +/obj/item/clothing/neck/cloak/teshari/standard/purple_grey + name = "purple and grey cloak" + icon_state = "tesh_cloak_pg" + +/obj/item/clothing/neck/cloak/teshari/standard/pink_grey + name = "pink and grey cloak" + icon_state = "tesh_cloak_pig" + +/obj/item/clothing/neck/cloak/teshari/standard/brown_grey + name = "brown and grey cloak" + icon_state = "tesh_cloak_brg" + +/obj/item/clothing/neck/cloak/teshari/standard/rainbow + name = "rainbow cloak" + icon_state = "tesh_cloak_rainbow" + +/obj/item/clothing/neck/cloak/teshari/standard/orange + name = "orange cloak" + icon_state = "tesh_cloak_on" + +/obj/item/clothing/neck/cloak/teshari/standard/dark_retrowave + name = "dark aesthetic cloak" + icon_state = "tesh_cloak_dretrowave" + +/obj/item/clothing/neck/cloak/teshari/standard/black_glow + name = "black and glowing cloak" + icon_state = "tesh_cloak_bglowing" + + +// Job Cloaks +/obj/item/clothing/neck/cloak/teshari/jobs/cap + name = "site manager cloak" + desc = "A soft Teshari cloak made for the Site Manager" + icon_state = "tesh_cloak_cap" + +//Cargo + +/obj/item/clothing/neck/cloak/teshari/jobs/qm + name = "quartermaster cloak" + desc = "A soft Teshari cloak made for the Quartermaster" + icon_state = "tesh_cloak_qm" + +/obj/item/clothing/neck/cloak/teshari/jobs/cargo + name = "cargo cloak" + desc = "A soft Teshari cloak made for the Cargo department" + icon_state = "tesh_cloak_car" + +/obj/item/clothing/neck/cloak/teshari/jobs/mining + name = "mining cloak" + desc = "A soft Teshari cloak made for Mining" + icon_state = "tesh_cloak_mine" + +//Engineering + +/obj/item/clothing/neck/cloak/teshari/jobs/ce + name = "cheif engineer cloak" + desc = "A soft Teshari cloak made the Chief Engineer" + icon_state = "tesh_cloak_ce" + +/obj/item/clothing/neck/cloak/teshari/jobs/engineer + name = "engineering cloak" + desc = "A soft Teshari cloak made for the Engineering department" + icon_state = "tesh_cloak_engie" + +/obj/item/clothing/neck/cloak/teshari/jobs/atmos + name = "atmospherics cloak" + desc = "A soft Teshari cloak made for the Atmospheric Technician" + icon_state = "tesh_cloak_atmos" + +//Medical + +/obj/item/clothing/neck/cloak/teshari/jobs/cmo + name = "chief medical officer cloak" + desc = "A soft Teshari cloak made the Cheif Medical Officer" + icon_state = "tesh_cloak_cmo" + +/obj/item/clothing/neck/cloak/teshari/jobs/medical + name = "medical cloak" + desc = "A soft Teshari cloak made for the Medical department" + icon_state = "tesh_cloak_doc" + +/obj/item/clothing/neck/cloak/teshari/jobs/chemistry + name = "chemist cloak" + desc = "A soft Teshari cloak made for the Chemist" + icon_state = "tesh_cloak_chem" + +/obj/item/clothing/neck/cloak/teshari/jobs/viro + name = "virologist cloak" + desc = "A soft Teshari cloak made for the Virologist" + icon_state = "tesh_cloak_viro" + +/obj/item/clothing/neck/cloak/teshari/jobs/para + name = "paramedic cloak" + desc = "A soft Teshari cloak made for the Paramedic" + icon_state = "tesh_cloak_para" + +/obj/item/clothing/neck/cloak/teshari/jobs/psych + name = " psychiatrist cloak" + desc = "A soft Teshari cloak made for the Psychiatrist" + icon_state = "tesh_cloak_psych" + +//Science + +/obj/item/clothing/neck/cloak/teshari/jobs/rd + name = "research director cloak" + desc = "A soft Teshari cloak made for the Research Director" + icon_state = "tesh_cloak_rd" + +/obj/item/clothing/neck/cloak/teshari/jobs/sci + name = "scientist cloak" + desc = "A soft Teshari cloak made for the Science department" + icon_state = "tesh_cloak_sci" + +/obj/item/clothing/neck/cloak/teshari/jobs/robo + name = "roboticist cloak" + desc = "A soft Teshari cloak made for the Roboticist" + icon_state = "tesh_cloak_robo" + +//Security + +/obj/item/clothing/neck/cloak/teshari/jobs/hos + name = "head of security cloak" + desc = "A soft Teshari cloak made for the Head of Security" + icon_state = "tesh_cloak_hos" + +/obj/item/clothing/neck/cloak/teshari/jobs/sec + name = "security cloak" + desc = "A soft Teshari cloak made for the Security department" + icon_state = "tesh_cloak_sec" + +/obj/item/clothing/neck/cloak/teshari/jobs/iaa + name = "internal affairs cloak" + desc = "A soft Teshari cloak made for the Internal Affairs Agent" + icon_state = "tesh_cloak_iaa" + +//Service + +/obj/item/clothing/neck/cloak/teshari/jobs/hop + name = "head of personnel cloak" + desc = "A soft Teshari cloak made for the Head of Personnel" + icon_state = "tesh_cloak_hop" + +/obj/item/clothing/neck/cloak/teshari/jobs/service + name = "service cloak" + desc = "A soft Teshari cloak made for the Service department" + icon_state = "tesh_cloak_serv" + +//Misc + +/obj/item/clothing/suit/hooded/toggle/labcoat/teshari + name = "Teshari labcoat" + desc = "A small suit that protects against minor chemical spills. This one is a good fit on Teshari." + icon = 'modular_splurt/icons/mob/clothing/species/teshari/tesh_items.dmi' + icon_state = "tesh_labcoat" + + +/obj/item/clothing/suit/hooded/toggle/tesharicoat + name = "small black coat" + desc = "A coat that seems too small to fit a human." + icon = 'modular_splurt/icons/mob/clothing/species/teshari/tesh_items.dmi' + icon_state = "tesharicoat" + + + +/obj/item/clothing/suit/hooded/toggle/tesharicoatwhite + name = "small coat" + desc = "A coat that seems too small to fit a human." + icon = 'modular_splurt/icons/mob/clothing/species/teshari/tesh_items.dmi' + icon_state = "tesharicoatwhite" + + + +//Hooded teshari cloaks +/obj/item/clothing/suit/hooded/teshari + name = "Hooded Teshari Cloak" + desc = "A soft teshari cloak with an added hood." + icon = 'modular_splurt/icons/mob/clothing/species/teshari/tesh_items.dmi' + icon_state = "tesh_hcloak_bo" + + + + + hoodtype = /obj/item/clothing/head/hooded/tesh_hood + + +/obj/item/clothing/head/hooded/tesh_hood + name = "Cloak Hood" + desc = "A hood attached to a teshari cloak." + icon = 'modular_splurt/icons/mob/clothing/species/teshari/tesh_items.dmi' + //default_worn_icon = 'icons/inventory/suit/mob_teshari.dmi' + icon_state = "tesh_hood_bo" + + + + body_parts_covered = HEAD + +/obj/item/clothing/suit/hooded/teshari/standard/black_orange + name = "black and orange hooded cloak" + icon_state = "tesh_hcloak_bo" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_orange + +/obj/item/clothing/suit/hooded/teshari/standard/black_grey + name = "black and grey hooded cloak" + icon_state = "tesh_hcloak_bg" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_grey + +/obj/item/clothing/suit/hooded/teshari/standard/black_midgrey + name = "black and medium grey hooded cloak" + icon_state = "tesh_hcloak_bmg" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_midgrey + +/obj/item/clothing/suit/hooded/teshari/standard/black_lightgrey + name = "black and light grey hooded cloak" + icon_state = "tesh_hcloak_blg" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_lightgrey + +/obj/item/clothing/suit/hooded/teshari/standard/black_white + name = "black and white hooded cloak" + icon_state = "tesh_hcloak_bw" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_white + +/obj/item/clothing/suit/hooded/teshari/standard/black_red + name = "black and red hooded cloak" + icon_state = "tesh_hcloak_br" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_red + +/obj/item/clothing/suit/hooded/teshari/standard/black + name = "black hooded cloak" + icon_state = "tesh_hcloak_bn" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black + +/obj/item/clothing/suit/hooded/teshari/standard/black_yellow + name = "black and yellow hooded cloak" + icon_state = "tesh_hcloak_by" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_yellow + +/obj/item/clothing/suit/hooded/teshari/standard/black_green + name = "black and green hooded cloak" + icon_state = "tesh_hcloak_bgr" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_green + +/obj/item/clothing/suit/hooded/teshari/standard/black_blue + name = "black and blue hooded cloak" + icon_state = "tesh_hcloak_bbl" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_blue + +/obj/item/clothing/suit/hooded/teshari/standard/black_purple + name = "black and purple hooded cloak" + icon_state = "tesh_hcloak_bp" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_purple + +/obj/item/clothing/suit/hooded/teshari/standard/black_pink + name = "black and pink hooded cloak" + icon_state = "tesh_hcloak_bpi" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_pink + +/obj/item/clothing/suit/hooded/teshari/standard/black_brown + name = "black and brown hooded cloak" + icon_state = "tesh_hcloak_bbr" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_brown + +/obj/item/clothing/suit/hooded/teshari/standard/orange_grey + name = "orange and grey hooded cloak" + icon_state = "tesh_hcloak_og" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/orange_grey + +///obj/item/clothing/suit/hooded/teshari/standard/rainbow +// name = "rainbow hooded cloak" +// icon_state = "tesh_hcloak_rainbow" +// hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/rainbow + +/obj/item/clothing/suit/hooded/teshari/standard/lightgrey_grey + name = "light grey and grey hooded cloak" + icon_state = "tesh_hcloak_lgg" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/lightgrey_grey + +/obj/item/clothing/suit/hooded/teshari/standard/white_grey + name = "white and grey hooded cloak" + icon_state = "tesh_hcloak_wg" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/white_grey + +/obj/item/clothing/suit/hooded/teshari/standard/red_grey + name = "red and grey hooded cloak" + icon_state = "tesh_hcloak_rg" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/red_grey + +/obj/item/clothing/suit/hooded/teshari/standard/orange + name = "orange hooded cloak" + icon_state = "tesh_hcloak_on" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/orange + +/obj/item/clothing/suit/hooded/teshari/standard/yellow_grey + name = "yellow and grey hooded cloak" + icon_state = "tesh_hcloak_yg" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/yellow_grey + +/obj/item/clothing/suit/hooded/teshari/standard/green_grey + name = "green and grey hooded cloak" + icon_state = "tesh_hcloak_gg" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/green_grey + +/obj/item/clothing/suit/hooded/teshari/standard/blue_grey + name = "blue and grey hooded cloak" + icon_state = "tesh_hcloak_blug" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/blue_grey + +/obj/item/clothing/suit/hooded/teshari/standard/purple_grey + name = "purple and grey hooded cloak" + icon_state = "tesh_hcloak_pg" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/purple_grey + +/obj/item/clothing/suit/hooded/teshari/standard/pink_grey + name = "pink and grey hooded cloak" + icon_state = "tesh_hcloak_pig" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/pink_grey + +/obj/item/clothing/suit/hooded/teshari/standard/brown_grey + name = "brown and grey hooded cloak" + icon_state = "tesh_hcloak_brg" + hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/brown_grey + +//The actual hoods +/obj/item/clothing/head/hooded/tesh_hood/standard/black_orange + name = "black and orange cloak hood" + icon_state = "tesh_hood_bo" + +/obj/item/clothing/head/hooded/tesh_hood/standard/black_grey + name = "black and grey cloak hood" + icon_state = "tesh_hood_bg" + +/obj/item/clothing/head/hooded/tesh_hood/standard/black_midgrey + name = "black and medium grey cloak hood" + icon_state = "tesh_hood_bmg" + +/obj/item/clothing/head/hooded/tesh_hood/standard/black_lightgrey + name = "black and light grey cloak hood" + icon_state = "tesh_hood_blg" + +/obj/item/clothing/head/hooded/tesh_hood/standard/black_white + name = "black and white cloak hood" + icon_state = "tesh_hood_bw" + +/obj/item/clothing/head/hooded/tesh_hood/standard/black_red + name = "black and red cloak hood" + icon_state = "tesh_hood_br" + +/obj/item/clothing/head/hooded/tesh_hood/standard/black + name = "black cloak hood" + icon_state = "tesh_hood_bn" + +/obj/item/clothing/head/hooded/tesh_hood/standard/black_yellow + name = "black and yellow cloak hood" + icon_state = "tesh_hood_by" + +/obj/item/clothing/head/hooded/tesh_hood/standard/black_green + name = "black and green cloak hood" + icon_state = "tesh_hood_bgr" + +/obj/item/clothing/head/hooded/tesh_hood/standard/black_blue + name = "black and blue cloak hood" + icon_state = "tesh_hood_bbl" + +/obj/item/clothing/head/hooded/tesh_hood/standard/black_purple + name = "black and purple cloak hood" + icon_state = "tesh_hood_bp" + +/obj/item/clothing/head/hooded/tesh_hood/standard/black_pink + name = "black and pink cloak hood" + icon_state = "tesh_hood_bpi" + +/obj/item/clothing/head/hooded/tesh_hood/standard/black_brown + name = "black and brown cloak hood" + icon_state = "tesh_hood_bbr" + +/obj/item/clothing/head/hooded/tesh_hood/standard/orange_grey + name = "orange and grey cloak hood" + icon_state = "tesh_hood_og" + +/obj/item/clothing/head/hooded/tesh_hood/standard/rainbow + name = "rainbow cloak hood" + icon_state = "tesh_hood_rainbow" + +/obj/item/clothing/head/hooded/tesh_hood/standard/lightgrey_grey + name = "light grey and grey cloak hood" + icon_state = "tesh_hood_lgg" + +/obj/item/clothing/head/hooded/tesh_hood/standard/white_grey + name = "white and grey cloak hood" + icon_state = "tesh_hood_wg" + +/obj/item/clothing/head/hooded/tesh_hood/standard/red_grey + name = "red and grey cloak hood" + icon_state = "tesh_hood_rg" + +/obj/item/clothing/head/hooded/tesh_hood/standard/orange + name = "orange cloak hood" + icon_state = "tesh_hood_on" + +/obj/item/clothing/head/hooded/tesh_hood/standard/yellow_grey + name = "yellow and grey cloak hood" + icon_state = "tesh_hood_yg" + +/obj/item/clothing/head/hooded/tesh_hood/standard/green_grey + name = "green and grey cloak hood" + icon_state = "tesh_hood_gg" + +/obj/item/clothing/head/hooded/tesh_hood/standard/blue_grey + name = "blue and grey cloak hood" + icon_state = "tesh_hood_blug" + +/obj/item/clothing/head/hooded/tesh_hood/standard/purple_grey + name = "purple and grey cloak hood" + icon_state = "tesh_hood_pg" + +/obj/item/clothing/head/hooded/tesh_hood/standard/pink_grey + name = "pink and grey cloak hood" + icon_state = "tesh_hood_pig" + +/obj/item/clothing/head/hooded/tesh_hood/standard/brown_grey + name = "brown and grey cloak hood" + icon_state = "tesh_hood_brg" + +//Belted cloaks +/obj/item/clothing/suit/hooded/teshari/beltcloak + name = "belted cloak" + desc = "A more ridged and stylized Teshari cloak." + icon = 'modular_splurt/icons/mob/clothing/species/teshari/tesh_items.dmi' + icon_state = "tesh_beltcloak_bo" + + + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_orange + name = "black belted cloak (orange)" + icon_state = "tesh_beltcloak_bo" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_grey + name = "black belted cloak" + icon_state = "tesh_beltcloak_bg" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_midgrey + name = "black belted cloak (medium grey)" + icon_state = "tesh_beltcloak_bmg" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_lightgrey + name = "black belted cloak (light grey)" + icon_state = "tesh_beltcloak_blg" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_white + name = "black belted cloak (white)" + icon_state = "tesh_beltcloak_bw" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_red + name = "black belted cloak (red)" + icon_state = "tesh_beltcloak_br" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black + name = "black simple belted cloak" + icon_state = "tesh_beltcloak_bn" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_yellow + name = "black belted cloak (yellow)" + icon_state = "tesh_beltcloak_by" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_green + name = "black belted cloak (green)" + icon_state = "tesh_beltcloak_bgr" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_blue + name = "black belted cloak (blue)" + icon_state = "tesh_beltcloak_bbl" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_purple + name = "black belted cloak (purple)" + icon_state = "tesh_beltcloak_bp" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_pink + name = "black belted cloak (pink)" + icon_state = "tesh_beltcloak_bpi" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_brown + name = "black belted cloak (brown)" + icon_state = "tesh_beltcloak_bbr" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/orange_grey + name = "orange belted cloak" + icon_state = "tesh_beltcloak_og" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/rainbow + name = "rainbow belted cloak" + icon_state = "tesh_beltcloak_rainbow" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/lightgrey_grey + name = "light grey belted cloak" + icon_state = "tesh_beltcloak_lgg" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/white_grey + name = "white belted cloak" + icon_state = "tesh_beltcloak_wg" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/red_grey + name = "red belted cloak" + icon_state = "tesh_beltcloak_rg" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/orange + name = "orange simple belted cloak" + icon_state = "tesh_beltcloak_on" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/yellow_grey + name = "yellow belted cloak" + icon_state = "tesh_beltcloak_yg" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/green_grey + name = "green belted cloak" + icon_state = "tesh_beltcloak_gg" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/blue_grey + name = "blue belted cloak" + icon_state = "tesh_beltcloak_blug" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/purple_grey + name = "purple belted cloak" + icon_state = "tesh_beltcloak_pg" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/pink_grey + name = "pink belted cloak" + icon_state = "tesh_beltcloak_pig" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/brown_grey + name = "brown belted cloak" + icon_state = "tesh_beltcloak_brg" + +//Belted job cloaks +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/cargo + name = "cargo belted cloak" + desc = "A soft Teshari cloak made for the Cargo department" + icon_state = "tesh_beltcloak_car" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/mining + name = "mining belted cloak" + desc = "A soft Teshari cloak made for Mining" + icon_state = "tesh_beltcloak_mine" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/command + name = "command belted cloak" + desc = "A soft Teshari cloak made for the Command department" + icon_state = "tesh_beltcloak_comm" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/ce + name = "chief engineer belted cloak" + desc = "A soft Teshari cloak made the Chief Engineer" + icon_state = "tesh_beltcloak_ce" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/engineer + name = "engineering belted cloak" + desc = "A soft Teshari cloak made for the Engineering department" + icon_state = "tesh_beltcloak_engie" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/atmos + name = "atmospherics belted cloak" + desc = "A soft Teshari cloak made for the Atmospheric Technician" + icon_state = "tesh_beltcloak_atmos" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/cmo + name = "chief medical officer belted cloak" + desc = "A soft Teshari cloak made the Chief Medical Officer" + icon_state = "tesh_beltcloak_cmo" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/medical + name = "medical belted cloak" + desc = "A soft Teshari cloak made for the Medical department" + icon_state = "tesh_beltcloak_doc" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/chemistry + name = "chemist belted cloak" + desc = "A soft Teshari cloak made for the Chemist" + icon_state = "tesh_beltcloak_chem" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/viro + name = "virologist belted cloak" + desc = "A soft Teshari cloak made for the Virologist" + icon_state = "tesh_beltcloak_viro" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/para + name = "paramedic belted cloak" + desc = "A soft Teshari cloak made for the Paramedic" + icon_state = "tesh_beltcloak_para" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/sci + name = "scientist belted cloak" + desc = "A soft Teshari cloak made for the Science department" + icon_state = "tesh_beltcloak_sci" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/robo + name = "roboticist belted cloak" + desc = "A soft Teshari cloak made for the Roboticist" + icon_state = "tesh_beltcloak_robo" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/sec + name = "security belted cloak" + desc = "A soft Teshari cloak made for the Security department" + icon_state = "tesh_beltcloak_sec" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/qm + name = "quartermaster belted cloak" + desc = "A soft Teshari cloak made for the Quartermaster" + icon_state = "tesh_beltcloak_qm" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/service + name = "service belted cloak" + desc = "A soft Teshari cloak made for the Service department" + icon_state = "tesh_beltcloak_serv" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/iaa + name = "internal affairs belted cloak" + desc = "A soft Teshari cloak made for the Internal Affairs Agent" + icon_state = "tesh_beltcloak_iaa" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/wrdn + name = "warden belted cloak" + desc = "A soft Teshari cloak made for the Warden" + icon_state = "tesh_beltcloak_wrdn" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/hos + name = "security chief belted cloak" + desc = "A soft Teshari cloak made for the Head of Security" + icon_state = "tesh_beltcloak_hos" + +/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/jani + name = "janitor belted cloak" + desc = "A soft Teshari cloak made for the Janitor" + icon_state = "tesh_beltcloak_jani" + diff --git a/modular_splurt/code/modules/crafting/eyepatchhud.dm b/modular_splurt/code/modules/crafting/eyepatchhud.dm new file mode 100644 index 0000000000..2b00e08aa3 --- /dev/null +++ b/modular_splurt/code/modules/crafting/eyepatchhud.dm @@ -0,0 +1,20 @@ +/datum/crafting_recipe/hudsunsec + parts = list() + +/datum/crafting_recipe/hudsunmed + parts = list() + +/datum/crafting_recipe/diagnostic_sunglasses + parts = list() + +/datum/crafting_recipe/secpatch + parts = list() + +/datum/crafting_recipe/medpatch + parts = list() + +/datum/crafting_recipe/diagpatch + parts = list() + +/datum/crafting_recipe/mesonpatch + parts = list() diff --git a/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm b/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm index 813e34f041..c92ea91b2d 100644 --- a/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm +++ b/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm @@ -301,3 +301,49 @@ ) mix_message = "The lights flicker for a moment..." mix_sound = 'sound/weapons/taser.ogg' + +/datum/chemical_reaction/twinkjuice + name = "Twink Juice" + id = /datum/reagent/consumable/ethanol/twinkjuice + results = list(/datum/reagent/consumable/ethanol/twinkjuice = 6) + required_reagents = list( + /datum/reagent/consumable/ethanol/vodka = 3, + /datum/reagent/consumable/berryjuice = 2, + /datum/reagent/lube = 1 + ) + mix_message = "Oooo you like kissing booooys" + mix_sound = 'modular_splurt/sound/voice/waa.ogg' + +/datum/chemical_reaction/midnight_tears + name = "Midnight Tears" + id = /datum/reagent/consumable/ethanol/midnight_tears + results = list(/datum/reagent/consumable/ethanol/midnight_tears = 20) + required_reagents = list( + /datum/reagent/consumable/ethanol/rum = 3, + /datum/reagent/consumable/ethanol/curacao = 5, + /datum/reagent/consumable/sugar = 1, + /datum/reagent/consumable/sodawater = 15 + ) + +/datum/chemical_reaction/midnight_sky + name = "Midnight Sky" + id = /datum/reagent/consumable/ethanol/midnight_sky + results = list(/datum/reagent/consumable/ethanol/midnight_sky = 25) + required_reagents = list( + /datum/reagent/consumable/ethanol/navy_rum = 3, + /datum/reagent/consumable/ethanol/curacao = 2, + /datum/reagent/consumable/sugar = 2, + /datum/reagent/consumable/space_cola = 15, + /datum/reagent/consumable/ice = 2 + ) + +/datum/chemical_reaction/midnight_joy + name = "Midnight Joy" + id = /datum/reagent/consumable/ethanol/midnight_joy + results = list(/datum/reagent/consumable/ethanol/midnight_joy = 25) + required_reagents = list( + /datum/reagent/consumable/ethanol/rum = 3, + /datum/reagent/consumable/pineapplejuice = 5, + /datum/reagent/consumable/sugar = 1, + /datum/reagent/consumable/sodawater = 15 + ) diff --git a/modular_splurt/code/modules/ghostcafe/ghostvr.dm b/modular_splurt/code/modules/ghostcafe/ghostvr.dm new file mode 100644 index 0000000000..4542fe6fac --- /dev/null +++ b/modular_splurt/code/modules/ghostcafe/ghostvr.dm @@ -0,0 +1,45 @@ +/obj/effect/mob_spawn/human/ghostcafeVR/special(mob/living/carbon/human/new_spawn) + if(new_spawn.client) + new_spawn.client.prefs.copy_to(new_spawn) + var/datum/outfit/O = new /datum/outfit/ghostcafeVR() + O.equip(new_spawn, FALSE, new_spawn.client) + SSjob.equip_loadout(null, new_spawn) + SSjob.post_equip_loadout(null, new_spawn) + SSquirks.AssignQuirks(new_spawn, new_spawn.client, TRUE, TRUE, null, FALSE, new_spawn) + ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, GHOSTROLE_TRAIT) + ADD_TRAIT(new_spawn, TRAIT_EXEMPT_HEALTH_EVENTS, GHOSTROLE_TRAIT) + ADD_TRAIT(new_spawn, TRAIT_NO_MIDROUND_ANTAG, GHOSTROLE_TRAIT) //The mob can't be made into a random antag, they are still eligible for ghost roles popups. + +/datum/outfit/ghostcafeVR + name = "ID, jumpsuit and shoes" + uniform = /obj/item/clothing/under/color/random + shoes = /obj/item/clothing/shoes/sneakers/black + +/datum/outfit/ghostcafeVR/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) + ..() + if (isplasmaman(H)) + head = /obj/item/clothing/head/helmet/space/plasmaman + uniform = /obj/item/clothing/under/plasmaman + l_hand= /obj/item/tank/internals/plasmaman/belt/full + mask = /obj/item/clothing/mask/breath + return + +/datum/outfit/ghostcafeVR/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) + H.internal = H.get_item_for_held_index(1) + H.update_internals_hud_icon(1) + +/obj/effect/mob_spawn/human/ghostcafeVR + name = "Ghost Cafe VR Sleeper" + uses = -1 + icon = 'icons/obj/machines/sleeper.dmi' + icon_state = "sleeper" + mob_name = "a ghost cafe VR visitor" + roundstart = FALSE + anchored = TRUE + density = FALSE + death = FALSE + assignedrole = "Ghost Cafe VR Visitor" + short_desc = "You are a Ghost Cafe VR Visitor!" + flavour_text = "You know one thing for sure. You arent actually alive. Are you in a simulation?" + skip_reentry_check = TRUE + banType = ROLE_GHOSTCAFE diff --git a/modular_splurt/code/modules/holodeck/holo_effect.dm b/modular_splurt/code/modules/holodeck/holo_effect.dm index 349ca781f1..fe65b7471b 100644 --- a/modular_splurt/code/modules/holodeck/holo_effect.dm +++ b/modular_splurt/code/modules/holodeck/holo_effect.dm @@ -2,6 +2,18 @@ /obj/effect/holodeck_effect/mobspawner/funclaw mobtype = /mob/living/simple_animal/hostile/deathclaw/funclaw/gentle +/obj/effect/holodeck_effect/mobspawner/alphaclaw + mobtype = /mob/living/simple_animal/hostile/deathclaw/funclaw/gentle/newclaw/alphaclaw + +/obj/effect/holodeck_effect/mobspawner/newclaw + mobtype = /mob/living/simple_animal/hostile/deathclaw/funclaw/gentle/newclaw + +/obj/effect/holodeck_effect/mobspawner/femclaw + mobtype = /mob/living/simple_animal/hostile/deathclaw/funclaw/femclaw + +/obj/effect/holodeck_effect/mobspawner/bigmommyclaw + mobtype = /mob/living/simple_animal/hostile/deathclaw/funclaw/femclaw/mommyclaw + // Holodeck mob: Friendly Bee /obj/effect/holodeck_effect/mobspawner/bumbles mobtype = /mob/living/simple_animal/pet/bumbles diff --git a/modular_splurt/code/modules/language/language_holder.dm b/modular_splurt/code/modules/language/language_holder.dm new file mode 100644 index 0000000000..a526fa7c16 --- /dev/null +++ b/modular_splurt/code/modules/language/language_holder.dm @@ -0,0 +1,4 @@ +/datum/language_holder/synthetic/New() + . = ..() + understood_languages += list(/datum/language/schechi = list(LANGUAGE_ATOM)) + spoken_languages += list(/datum/language/schechi = list(LANGUAGE_ATOM)) diff --git a/modular_splurt/code/modules/mapping/map_template.dm b/modular_splurt/code/modules/mapping/map_template.dm new file mode 100644 index 0000000000..a3b7348968 --- /dev/null +++ b/modular_splurt/code/modules/mapping/map_template.dm @@ -0,0 +1,17 @@ +/// Takes in a type path, locates an instance of that type in the cached map, and calculates its offset from the origin of the map, returns this offset in the form list(x, y). +/datum/map_template/proc/discover_offset(obj/marker) + var/key + var/list/models = cached_map.grid_models + for(key in models) + if(findtext(models[key], "[marker]")) // Yay compile time checks + break // This works by assuming there will ever only be one mobile dock in a template at most + + for(var/datum/grid_set/gset as anything in cached_map.gridSets) + var/ycrd = gset.ycrd + for(var/line in gset.gridLines) + var/xcrd = gset.xcrd + for(var/j in 1 to length(line) step cached_map.key_len) + if(key == copytext(line, j, j + cached_map.key_len)) + return list(xcrd, ycrd) + ++xcrd + --ycrd diff --git a/modular_splurt/code/modules/mapping/modular_map_loader/README.md b/modular_splurt/code/modules/mapping/modular_map_loader/README.md new file mode 100644 index 0000000000..1009191b4e --- /dev/null +++ b/modular_splurt/code/modules/mapping/modular_map_loader/README.md @@ -0,0 +1,132 @@ +# Modular Map Loader + +## Concept + +Modular map loading is a system to allow maps to be generated with random variants by selecting from a set of pre-made modules. The system is designed to be as simple as possible for mappers to use, with a minimum of interaction with the code required. + +## Implementation + +### /obj/modular_map_root + +This root object handled picking and loading in map modules. It has two variables, and one proc. + +* `var/config_file` - A string, points to a TOML configuration file, which is used to hold the information necessary to pull the correct map files and place them on the correct roots. This will be the same for all roots on a map. +* `var/key` - A string, used to pull a list of `.dmm` files from the configuration file. +* `load_map()` - Called asynchronously in the root's `Initialize()`. This proc creates a new instance of `/datum/map_template/map_module`, ingests the configuration file `config_file` points to, and picks a `.dmm` file path which maps to the root's `key`, by picking a random filename from among those which `key` maps to, and appending it to a folder path. This file path is passed into the map templace instance's `load()`, and the template takes over. + +INITIALIZE_IMMEDIATE is used to ensure the ruins are loaded at the right time to avoid runtime errors related to lighting. + +### /datum/map_template/map_module + +This map templace subtype is responsible for loading in the module, it has two variables and two relevant procs. + +* `var/x_offset` and `var/y_offset` - Integers, used to store the offsets used to correctly align the module when it is loaded. +* `load()` - Extends the functionality of the general map template's `load()` to allow a map to be specified at runtime. This means `preload_size()` must be called again here as the template's map file has been changed. The origin turf for the map to be loaded from is set using the offsets, and the map is loaded as per the parent. +* `preload_size()` - Extends the functionality of the general map template's `preload_size()` to run the `discover_offset` proc, calculating the offset of `/obj/modular_map_connector` and setting the offset variables accordingly. + +### /obj/modular_map_connector + +This object is used only to determine the offsets to be used on loading, and has no other functionality. + +### TOML configuration + +This TOML file is used to map between a list of `.dmm` files and a string key. The file consists of two parts. The first is a line + +``` +directory = "_maps/etc/" +``` + +which points at a folder containing the `.dmm` files of the modules used in the map. The second is a series of tables + +``` +[rooms.example] +modules = ["example_1.dmm", "example_2.dmm"] +``` + +which contains the mapping between the key `"example"` and the list of filenames `["example_1.dmm", "example_2.dmm"]`. + +### /datum/unit_test/modular_map_loader + +This is the unit test for modular map loading. It performs two checks on every subtype of `/obj/modular_map_root`. First it checks if the file `config_file` points at, and if it does not the test is failed because the file does not exist. If it does exist, it then attempts to read the file, if this is null it means the fild is not valid TOML, and the test is failed because the TOML file is invalid. + +## How-To + +This section will cover the basics of how to use map modules as a mapper. If you want a concrete example to look at, the space ruin `_maps/RandomRuins/SpaceRuins/DJstation.dmm` and its associated code, configuration and modules employ all the techniques covered in this tutorial. + +### The Main Map + +First we need to create a map, as we usually would. Let's say we want to create a new space ruin `foobar.dmm`, and we put it in the appropriate folder as usual, `_maps/RandomRuins/SpaceRuins/foobar.dmm`. We now need to create three more things. + +* `code/modules/ruins/spaceruin_code/foobar.dm` - A code file like would be used to store any code specific to this map. +* `strings/modular_maps/foobar.toml`- A configuration file, this will be looked at in more detail later. +* `_maps/RandomRuins/SpaceRuins/foobar/` - A new subfolder, which is where we will put the `.dmm` files for the modules. + +In `code/modules/ruins/spaceruin_code/foobar.dm` we need to add a small piece of code to define a new modular map root type for our map, which should look like this + +``` +/obj/modular_map_root/foobar + config_file = "strings/modular_maps/foobar.toml" +``` + +This means when we place root objects `/obj/modular_map_root` in our new map, we use this subtype that points to the correct configuration file. + +When creating our main map, we place one of these roots in the location we want to generate a module at. Typically this would be placed at a natural landmark, such as a doorway. We then edit the varaibles of the placed root object, and set the `key` var to some string, let's use `key = vault`. Make the rest of the map, ensuring that every root you want to use a unique set of modules has a unique `key`. + +### Module Maps + +Now we need to make the modules to be placed on our roots. These will be saved in the folder we created earlier, `_maps/RandomRuins/SpaceRuins/foobar/`. Modules do not have to be the same size, so long as all modules will fit properly on the root without running into other parts of the map. + +When making a module, you need to include a connector object `/obj/modular_map_connector`. When the module is loaded, it will be offset so this connector is placed on top of the root on the main map. + +We will be making the first variant of our vault module, so we save this as `vault_1.dmm`, following the format `[key]_[number].dmm`. Keep doing this until all your modules have been made. + +If you wish, you can also place another root on a module, if for some reason that module's position is dependent on the current one. IF you do this, make sure you've placed a root with the same key on every variant of the current module (unless you only want it to appear on certain varaints of this one.) + +### Configuration + +Now we go back to our configuration file `strings/modular_maps/foobar.toml`. Say we ended up using three different sets of modules in our map, `vault`, `airlock` and `bathroom`, each of which have two variants. We want our `.toml` file to look like this + +``` +directory = "_maps/RandomRuins/SpaceRuins/foobar/" + +[rooms.vault] +modules = ["vault_1.dmm", "vault_2.dmm"] + +[rooms.airlock] +modules = ["airlock_1.dmm", "airlock_2.dmm"] + +[rooms.bathroom] +modules = ["bathroom_1.dmm", "bathroom_2.dmm"] +``` + +Let's break down what is happening here. + +`directory = "_maps/RandomRuins/SpaceRuins/foobar/"` points to the folder where our modules are stored. + +`[rooms.vault]` identifies the following line as being the modules for a root with `key = vault`. + +`modules = ["vault_1.dmm", "vault_2.dmm"]` specifies which map files within the folder are to be associated with this key. + +Once this configuration is done, the map should be fully functional. Compile and run, place your map somewhere, and continue doing this until you have satisfied yourself that everything looks how you expected it to. Remember to do everything else you need to do when adding any new ruin, or whatever kind of map you made. + +### Common Mistakes + +> My map has modules that didn't load! + +Check your configuration is correct. Do the filenames given for the problem root match the names of the map files? Is the key specified in the configuration file the same as the one on the root in the map? + +> A module is loading in the wrong location! + +Check the positioning of the connector is correct, and that only one is placed on the module. + +> My ruin is spawning too close to or overlapping with something! + +Make sure your main map is large enough to fully contain the most expansive variation that can possibly be chosen. + +> Parts of my map are overlapping with each other! + +Make sure modules placed adjacent or close to each other have no combination of variants which can overlap with each other, this may take some trial and error in complicated cases. + +> My map still isn't working and I don't know what's wrong! + +Ping @Maintainer in our coding channels if you need any help or find any problems diff --git a/modular_splurt/code/modules/mapping/modular_map_loader/modular_map_loader.dm b/modular_splurt/code/modules/mapping/modular_map_loader/modular_map_loader.dm new file mode 100644 index 0000000000..d1f3d4b15d --- /dev/null +++ b/modular_splurt/code/modules/mapping/modular_map_loader/modular_map_loader.dm @@ -0,0 +1,77 @@ +/obj/modular_map_root + invisibility = INVISIBILITY_ABSTRACT + icon = 'icons/obj/device.dmi' + icon_state = "pinonclose" + + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + anchored = TRUE + + /// Points to a .toml file storing configuration data about the modules associated with this root + var/config_file = null + /// Key used to look up the appropriate map paths in the associated .toml file + var/key = null + +INITIALIZE_IMMEDIATE(/obj/modular_map_root) + +/obj/modular_map_root/Initialize(mapload) + . = ..() + INVOKE_ASYNC(src, .proc/load_map) + +/// Randonly selects a map file from the TOML config specified in config_file, loads it, then deletes itself. +/obj/modular_map_root/proc/load_map() + var/turf/spawn_area = get_turf(src) + + var/datum/map_template/map_module/map = new() + + if(!config_file) + return + + if(!key) + return + + var/config = rustg_read_toml_file(config_file) + + var/mapfile = config["directory"] + pick(config["rooms"][key]["modules"]) + + map.load(spawn_area, FALSE, mapfile = mapfile) + + qdel(src, force=TRUE) + +/datum/map_template/map_module + name = "Base Map Module Template" + + var/x_offset = 0 + var/y_offset = 0 + +/datum/map_template/map_module/load(turf/T, centered = FALSE, orientation = SOUTH, annihilate = default_annihilate, force_cache = FALSE, rotate_placement_to_orientation = FALSE, mapfile = null) + + if(!mapfile) + return + + mappath = mapfile + + preload_size(mappath) // We need to run this here as the map path has been null until now + + T = locate(T.x - x_offset, T.y - y_offset, T.z) + . = ..() + +/datum/map_template/map_module/preload_size(path, cache) + . = ..(path, TRUE) // Done this way because we still want to know if someone actualy wanted to cache the map + if(!cached_map) + return + + var/list/offset = discover_offset(/obj/modular_map_connector) + + x_offset = offset[1] - 1 + y_offset = offset[2] - 1 + + if(!cache) + cached_map = null + +/obj/modular_map_connector + invisibility = INVISIBILITY_ABSTRACT + icon = 'icons/obj/device.dmi' + icon_state = "pinonclose" + + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + anchored = TRUE diff --git a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/ears.dm b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/ears.dm index 91a5f32bd9..ee435adc5a 100644 --- a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/ears.dm +++ b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/ears.dm @@ -7,7 +7,7 @@ /datum/sprite_accessory/ears/mam_ears/gret name = "Gret" icon_state = "gret" - color_src = SKINTONE + color_src = MUTCOLORS icon = 'modular_splurt/icons/mob/mam_ears.dmi' /datum/sprite_accessory/ears/mam_ears/goathorns diff --git a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/hair_head.dm b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/hair_head.dm index bbe533a9f6..e667f2906a 100644 --- a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/hair_head.dm +++ b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/hair_head.dm @@ -170,3 +170,211 @@ name = "Phoebe" icon = 'modular_splurt/icons/mob/hair.dmi' icon_state = "hair_phoebe" + + +/datum/sprite_accessory/hair/teshari + name = "Teshari Default" + icon_state = "teshari_default" + icon = 'modular_splurt/icons/mob/hair.dmi' + +/datum/sprite_accessory/hair/teshari/altdefault + name = "Teshari Alt. Default" + icon_state = "teshari_ears" + +/datum/sprite_accessory/hair/teshari/tight + name = "Teshari Tight" + icon_state = "teshari_tight" + +/datum/sprite_accessory/hair/teshari/excited + name = "Teshari Spiky" + icon_state = "teshari_spiky" + +/datum/sprite_accessory/hair/teshari/spike + name = "Teshari Spike" + icon_state = "teshari_spike" + +/datum/sprite_accessory/hair/teshari/long + name = "Teshari Overgrown" + icon_state = "teshari_long" + +/datum/sprite_accessory/hair/teshari/burst + name = "Teshari Starburst" + icon_state = "teshari_burst" + +/datum/sprite_accessory/hair/teshari/shortburst + name = "Teshari Short Starburst" + icon_state = "teshari_burst_short" + +/datum/sprite_accessory/hair/teshari/mohawk + name = "Teshari Mohawk" + icon_state = "teshari_mohawk" + +/datum/sprite_accessory/hair/teshari/pointy + name = "Teshari Pointy" + icon_state = "teshari_pointy" + +/datum/sprite_accessory/hair/teshari/upright + name = "Teshari Upright" + icon_state = "teshari_upright" + +/datum/sprite_accessory/hair/teshari/mane + name = "Teshari Mane" + icon_state = "teshari_mane" + +/datum/sprite_accessory/hair/teshari/droopy + name = "Teshari Droopy" + icon_state = "teshari_droopy" + +/datum/sprite_accessory/hair/teshari/mushroom + name = "Teshari Mushroom" + icon_state = "teshari_mushroom" + +/datum/sprite_accessory/hair/teshari/twies + name = "Teshari Twies" + icon_state = "teshari_twies" + +/datum/sprite_accessory/hair/teshari/backstrafe + name = "Teshari Backstrafe" + icon_state = "teshari_backstrafe" + +/datum/sprite_accessory/hair/teshari/_longway + name = "Teshari Long way" + icon_state = "teshari_longway" + +/datum/sprite_accessory/hair/teshari/tree + name = "Teshari Tree" + icon_state = "teshari_tree" + +/datum/sprite_accessory/hair/teshari/fluffymohawk + name = "Teshari Fluffy Mohawk" + icon_state = "teshari_fluffymohawk" + +//Teshari face things +/datum/sprite_accessory/facial_hair/teshari + name = "Teshari Beard" + icon_state = "teshari_chin" + gender = NEUTER + icon = 'modular_splurt/icons/mob/hair.dmi' + +/datum/sprite_accessory/facial_hair/teshari/scraggly + name = "Teshari Scraggly" + icon_state = "teshari_scraggly" + +/datum/sprite_accessory/facial_hair/teshari/chops + name = "Teshari Chops" + icon_state = "teshari_gap" + +/datum/sprite_accessory/ears/mam_ears/teshari + name = "Teshari (COLORABLE)" + + icon_state = "teshari" + color_src = MUTCOLORS2 + icon = 'modular_splurt/icons/mob/ears.dmi' + +/datum/sprite_accessory/ears/mam_ears/tesharihigh + name = "Teshari upper ears (COLORABLE)" + + icon_state = "tesharihigh" + color_src = MUTCOLORS + icon = 'modular_splurt/icons/mob/ears.dmi' + +/datum/sprite_accessory/ears/mam_ears/tesharilow + name = "Teshari lower ears (COLORABLE)" + + icon_state = "tesharilow" + color_src = MUTCOLORS + icon = 'modular_splurt/icons/mob/ears.dmi' + +/datum/sprite_accessory/tails/mam_tails/teshari + icon = 'modular_splurt/icons/mob/tail.dmi' + recommended_species = list("teshari") + color_src = MATRIXED + +/datum/sprite_accessory/tails/mam_tails/teshari/tesharitailhc + name = "teshari tail, colorable" + icon_state = "tesharicolorable" + matrixed_sections = MATRIX_RED + +/datum/sprite_accessory/tails/mam_tails/teshari/tesharitailfeatheredhc + name = "teshari tail w/ feathers, colorable" + icon_state = "tesharifeatherscolorable" + matrixed_sections = MATRIX_RED + + + + + +/datum/sprite_accessory/mam_body_markings/tesh_feathers + name = "Teshari Feathers" + icon = 'modular_splurt/icons/mob/mam_markings.dmi' + icon_state = "tesh_feathers" + covered_limbs = list("Left Foot" = MATRIX_GREEN, "Right Foot" = MATRIX_GREEN, "Left Hand" = MATRIX_GREEN, "Right Hand" = MATRIX_GREEN) + recommended_species = list("teshari") + +/datum/sprite_accessory/mam_body_markings/teshi_small_feathers + name = "Teshari small wingfeathers" + icon = 'modular_splurt/icons/mob/mam_markings.dmi' + icon_state = "tesh_sf" + covered_limbs = list("Left Foot" = MATRIX_GREEN, "Right Foot" = MATRIX_GREEN, "Left Hand" = MATRIX_GREEN, "Right Hand" = MATRIX_GREEN, "Chest" = MATRIX_GREEN) + recommended_species = list("teshari") + +/datum/sprite_accessory/mam_body_markings/tesh_skull + name = "Teshari Skull Face" + icon = 'modular_splurt/icons/mob/mam_markings.dmi' + icon_state = "tesh_skull" + covered_limbs = list("Head" = MATRIX_GREEN) + recommended_species = list("teshari") + +/datum/sprite_accessory/mam_body_markings/vr_teshari_large_eyes + name = "Teshari large eyes" + icon = 'modular_splurt/icons/mob/mam_markings.dmi' + icon_state = "teshlarge_eyes" + covered_limbs = list("Head" = MATRIX_GREEN) + recommended_species = list("teshari") + +/datum/sprite_accessory/mam_body_markings/vr_teshari_coat + name = "Teshari coat" + icon = 'modular_splurt/icons/mob/mam_markings.dmi' + icon_state = "tesh_coat" + covered_limbs = list("Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN, "Chest" = MATRIX_GREEN, "Head" = MATRIX_GREEN) + recommended_species = list("teshari") + +/datum/sprite_accessory/mam_body_markings/vr_teshari_pattern_male + name = "Teshari male pattern" + icon = 'modular_splurt/icons/mob/mam_markings.dmi' + icon_state = "tesh_pattern_male" + covered_limbs = list("Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN, "Left Hand" = MATRIX_GREEN, "Right Hand" = MATRIX_GREEN, "Chest" = MATRIX_GREEN, "Head" = MATRIX_GREEN) + recommended_species = list("teshari") + +/datum/sprite_accessory/mam_body_markings/vr_teshari_pattern_female + name = "Teshari female pattern" + icon = 'modular_splurt/icons/mob/mam_markings.dmi' + icon_state = "tesh_pattern_fem" + covered_limbs = list("Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Hand" = MATRIX_GREEN, "Right Hand" = MATRIX_GREEN, "Chest" = MATRIX_GREEN, "Groin" = MATRIX_GREEN, "Head" = MATRIX_GREEN) + recommended_species = list("teshari") + +/datum/sprite_accessory/mam_body_markings/vr_tesh_beak + name = "Teshari beak, pointed" + icon = 'modular_splurt/icons/mob/mam_markings.dmi' + icon_state = "tesh_beak" + covered_limbs = list("Head" = MATRIX_GREEN) + recommended_species = list("teshari") + +/datum/sprite_accessory/mam_body_markings/vr_tesh_beak_alt + name = "Teshari beak, rounded" + icon = 'modular_splurt/icons/mob/mam_markings.dmi' + icon_state = "tesh_beak_alt" + covered_limbs = list("Head" = MATRIX_GREEN) + recommended_species = list("teshari") + + + + + + + + + + + + diff --git a/modular_splurt/code/modules/mob/living/carbon/human/human.dm b/modular_splurt/code/modules/mob/living/carbon/human/human.dm index 3017490811..07d15c0bf2 100644 --- a/modular_splurt/code/modules/mob/living/carbon/human/human.dm +++ b/modular_splurt/code/modules/mob/living/carbon/human/human.dm @@ -20,6 +20,12 @@ /mob/living/carbon/human/species/mammal/shadekin race = /datum/species/mammal/shadekin +/mob/living/carbon/human/species/mammal/teshari + race = /datum/species/mammal/teshari + +/mob/living/carbon/human/species/mammal/vox + race = /datum/species/vox + /mob/living/carbon/human/is_literate() // Check for D4C craving if(HAS_TRAIT(src, TRAIT_DUMB_CUM_CRAVE)) diff --git a/modular_splurt/code/modules/mob/living/carbon/human/species.dm b/modular_splurt/code/modules/mob/living/carbon/human/species.dm index 0ed5a22b75..c6e6b5b977 100644 --- a/modular_splurt/code/modules/mob/living/carbon/human/species.dm +++ b/modular_splurt/code/modules/mob/living/carbon/human/species.dm @@ -1,3 +1,19 @@ +/datum/species + var/icon_accessories + var/icon_back + var/icon_belt + var/icon_ears + var/icon_eyes + var/icon_feet + var/icon_feet64 + var/icon_hands + var/icon_head + var/icon_mask + var/icon_neck + var/icon_suit + var/icon_uniform + + /datum/species/althelp(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) if(user == target && istype(user)) if(HAS_TRAIT(user, TRAIT_FLOORED)) diff --git a/modular_splurt/code/modules/mob/living/carbon/human/species_types/arachnid.dm b/modular_splurt/code/modules/mob/living/carbon/human/species_types/arachnid.dm index e3553f13c8..0546b1f28b 100644 --- a/modular_splurt/code/modules/mob/living/carbon/human/species_types/arachnid.dm +++ b/modular_splurt/code/modules/mob/living/carbon/human/species_types/arachnid.dm @@ -28,7 +28,7 @@ var/nutrition_threshold = NUTRITION_LEVEL_FED if (H.nutrition >= nutrition_threshold) to_chat(H, "You begin spinning some web...") - if(!do_after(H, 10 SECONDS, 1, T)) + if(!do_after(H, 10 SECONDS, T)) to_chat(H, span_warning("Your web spinning was interrupted!")) return H.adjust_nutrition(-spinner_rate) @@ -86,7 +86,7 @@ to_chat(H, span_warning("[L] resists your attempts to wrap [L.p_them()]!")) return H.visible_message(span_danger("[H] starts to wrap [A] into a cocoon!"),span_warning("You start to wrap [A] into a cocoon.")) - if(!do_after(H, 10 SECONDS, 1, A)) + if(!do_after(H, 10 SECONDS, A)) to_chat(H, span_warning("Your web spinning was interrupted!")) return H.adjust_nutrition(spinner_rate * -3) diff --git a/modular_splurt/code/modules/mob/living/carbon/human/species_types/teshari.dm b/modular_splurt/code/modules/mob/living/carbon/human/species_types/teshari.dm new file mode 100644 index 0000000000..1cb171d13c --- /dev/null +++ b/modular_splurt/code/modules/mob/living/carbon/human/species_types/teshari.dm @@ -0,0 +1,193 @@ +#define TESHARI_TEMP_OFFSET -30 // K, added to comfort/damage limit etc +#define TESHARI_BURNMOD 1.25 // They take more damage from practically everything +#define TESHARI_BRUTEMOD 1.2 +#define TESHARI_HEATMOD 1.3 +#define TESHARI_COLDMOD 0.67 // Except cold. + + +/datum/species/mammal/teshari + name = "Teshari" + id = SPECIES_TESHARI + say_mod = "mars" + eye_type = "teshari" + mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "mam_tail" = "teshari tail, colorable", "mam_ears" = "None", "mam_body_markings" = list()) + allowed_limb_ids = null + override_bp_icon = 'modular_splurt/icons/mob/teshari.dmi' + damage_overlay_type = "teshari" + species_language_holder = /datum/language_holder/teshari + exotic_blood_color = "#D514F7" + disliked_food = GROSS | GRAIN + liked_food = MEAT + payday_modifier = 0.75 + attack_verb = "claw" + attack_sound = 'sound/weapons/slash.ogg' + miss_sound = 'sound/weapons/slashmiss.ogg' + ass_image = 'icons/ass/asslizard.png' + + species_traits = list(MUTCOLORS, + EYECOLOR, + NO_UNDERWEAR, + HAIR, + FACEHAIR, + MARKINGS + ) + + coldmod = TESHARI_COLDMOD + heatmod = TESHARI_HEATMOD + brutemod = TESHARI_BRUTEMOD + burnmod = TESHARI_BURNMOD + + +/datum/species/mammal/teshari/on_species_gain(mob/living/carbon/human/C, datum/species/old_species, pref_load) + if(ishuman(C)) + C.verbs += /mob/living/carbon/human/proc/sonar_ping + C.verbs += /mob/living/carbon/human/proc/hide + C.setMaxHealth(50) + C.physiology.hunger_mod *= 2 + C.add_movespeed_modifier(/datum/movespeed_modifier/teshari) + +/datum/movespeed_modifier/teshari + multiplicative_slowdown = -0.2 + +/datum/emote/sound/teshari + mob_type_allowed_typecache = list(/mob/living/carbon/human) + emote_type = EMOTE_AUDIBLE + +/datum/language_holder/teshari + understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/schechi = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/schechi = list(LANGUAGE_ATOM)) + +/datum/language/schechi + +/datum/emote/living/audio/teshari/teshsqueak + key = "surprised" + key_third_person = "surprised" + message = "chirps in surprise!" + message_mime = "lets out an inaudible chirp!" + emote_sound = 'modular_splurt/sound/voice/teshsqueak.ogg' // Copyright CC BY 3.0 InspectorJ (freesound.org) for the source audio. + emote_cooldown = 2.1 SECONDS + +/datum/emote/living/audio/teshari/teshsqueak/run_emote(mob/user, params) + var/datum/dna/D = user.has_dna() + if(D.species.name != "Teshari") + return + // Return normally + . = ..() + +/datum/emote/living/audio/teshari/teshchirp + key = "tchirp" + key_third_person = "tchirp" + message = "chirps!" + message_mime = "lets out an inaudible chirp!" + emote_sound = 'modular_splurt/sound/voice/teshchirp.ogg' // Copyright CC BY 3.0 InspectorJ (freesound.org) for the source audio. + emote_cooldown = 2.1 SECONDS + +/datum/emote/living/audio/teshari/teshchirp/run_emote(mob/user, params) + var/datum/dna/D = user.has_dna() + if(D.species.name != "Teshari") + return + // Return normally + . = ..() + +/datum/emote/living/audio/teshari/trill + key = "trill" + key_third_person = "trill" + message = "trills!" + message_mime = "lets out an inaudible chirp!" + emote_sound = 'modular_splurt/sound/voice/teshtrill.ogg' // Copyright CC BY 3.0 InspectorJ (freesound.org) for the source audio. + emote_cooldown = 2.1 SECONDS + +/datum/emote/living/audio/teshari/trill/run_emote(mob/user, params) + var/datum/dna/D = user.has_dna() + if(D.species.name != "Teshari") + return + // Return normally + . = ..() + +/datum/emote/living/audio/teshari/teshscream + key = "teshscream" + key_third_person = "teshscream" + message = "screams!" + message_mime = "lets out an inaudible screams!" + emote_sound = 'modular_splurt/sound/voice/teshscream.ogg' // Copyright CC BY 3.0 InspectorJ (freesound.org) for the source audio. + emote_cooldown = 2.1 SECONDS + +/datum/emote/living/audio/teshari/teshscream/run_emote(mob/user, params) + var/datum/dna/D = user.has_dna() + if(D.species.name != "Teshari") + return + // Return normally + . = ..() + +/mob/living/carbon/human + var/next_sonar_ping = 0 + var/hiding = 0 + +/mob/living/carbon/human/proc/hide() + set name = "Hide" + set desc = "Allows to hide beneath tables or certain items. Toggled on or off." + set category = "Abilities" + + if(stat == DEAD || restrained() || buckled|| has_buckled_mobs()) //VORE EDIT: Check for has_buckled_mobs() (taur riding) + return + + if(hiding) + plane = initial(plane) + layer = initial(layer) + to_chat(usr, "You have stopped hiding.") + hiding = 0 + else + hiding = 1 + layer = BELOW_OBJ_LAYER //Just above cables with their 2.44 + plane = GAME_PLANE + to_chat(src,"You are now hiding.") + + +/mob/living/carbon/human/proc/sonar_ping() + set name = "Listen In" + set desc = "Allows you to listen in to movement and noises around you." + set category = "Abilities" + + if(incapacitated()) + to_chat(src, "You need to recover before you can use this ability.") + return + if(world.time < next_sonar_ping) + to_chat(src, "You need another moment to focus.") + return + var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) + if(ears.deaf > 0) + to_chat(src, "You are for all intents and purposes currently deaf!") + return + next_sonar_ping += 10 SECONDS + var/heard_something = FALSE + to_chat(src, "You take a moment to listen in to your environment...") + for(var/mob/living/L in range(client.view, src)) + var/turf/T = get_turf(L) + if(!T || L == src || L.stat == DEAD) + continue + heard_something = TRUE + var/feedback = list() + feedback += "There are noises of movement " + var/direction = get_dir(src, L) + if(direction) + feedback += "towards the [dir2text(direction)], " + switch(get_dist(src, L) / 7) + if(0 to 0.2) + feedback += "very close by." + if(0.2 to 0.4) + feedback += "close by." + if(0.4 to 0.6) + feedback += "some distance away." + if(0.6 to 0.8) + feedback += "further away." + else + feedback += "far away." + else // No need to check distance if they're standing right on-top of us + feedback += "right on top of you." + feedback += "" + to_chat(src,jointext(feedback,null)) + if(!heard_something) + to_chat(src, "You hear no movement but your own.") + diff --git a/modular_splurt/code/modules/mob/living/carbon/human/species_types/vox.dm b/modular_splurt/code/modules/mob/living/carbon/human/species_types/vox.dm new file mode 100644 index 0000000000..a6da9f28c3 --- /dev/null +++ b/modular_splurt/code/modules/mob/living/carbon/human/species_types/vox.dm @@ -0,0 +1,76 @@ +/datum/species/vox + name = "Vox" + id = SPECIES_VOX + override_bp_icon = 'modular_splurt/icons/mob/vox.dmi' + species_language_holder = /datum/language_holder/vox + + + breathid = "tox" + + mutantlungs = /obj/item/organ/lungs/vox + + species_traits = list(MUTCOLORS, + EYECOLOR, + NO_UNDERWEAR, + HAIR, + FACEHAIR, + MARKINGS + ) + + exotic_blood_color = "#9066BD" + //flesh_color = "#808D11" + + + attack_verb = "claw" + attack_sound = 'sound/weapons/slash.ogg' + miss_sound = 'sound/weapons/slashmiss.ogg' + + say_mod = "shrieks" + eye_type = "vox" + mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "mam_tail" = "teshari tail, colorable", "mam_ears" = "None", "mam_body_markings" = list()) + allowed_limb_ids = null + damage_overlay_type = "vox" + +/datum/species/vox/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE) + var/datum/outfit/vox/O = new /datum/outfit/vox + H.equipOutfit(O, visualsOnly) + H.internal = H.get_item_for_held_index(2) + H.update_internals_hud_icon(1) + return 0 + +/datum/species/vox/on_species_gain(mob/living/carbon/human/C, datum/species/old_species, pref_load) + if(ishuman(C)) + C.add_movespeed_modifier(/datum/movespeed_modifier/vox) + ..() + +/datum/movespeed_modifier/vox + multiplicative_slowdown = -0.2 + + +/datum/language_holder/vox + understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/schechi = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/schechi = list(LANGUAGE_ATOM)) + +/datum/language/vox + +/datum/emote/sound/vox + mob_type_allowed_typecache = list(/mob/living/carbon/human) + emote_type = EMOTE_AUDIBLE + + +/datum/emote/living/audio/vox/shriek + key = "shriek" + key_third_person = "shrieks" + message = "shrieks!" + message_mime = "lets out an inaudible shriek!" + emote_sound = 'modular_splurt/sound/voice/shriek1.ogg' // Copyright CC BY 3.0 InspectorJ (freesound.org) for the source audio. + emote_cooldown = 2.1 SECONDS + +/datum/emote/living/audio/vox/shriek/run_emote(mob/user, params) + var/datum/dna/D = user.has_dna() + if(D.species.name != "Vox") + return + // Return normally + . = ..() diff --git a/modular_splurt/code/modules/mob/living/carbon/human/species_types/xenochimera.dm b/modular_splurt/code/modules/mob/living/carbon/human/species_types/xenochimera.dm new file mode 100644 index 0000000000..d8409ab295 --- /dev/null +++ b/modular_splurt/code/modules/mob/living/carbon/human/species_types/xenochimera.dm @@ -0,0 +1,281 @@ +// Xenochimera thing mostly +#define REVIVING_NOW -1 +#define REVIVING_DONE 0 +#define REVIVING_READY 1 + + +/datum/species/mammal/xenochimera + name = "Xenochimera" + id = SPECIES_XENOCHIMERA + mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "mam_snouts" = "None", "mam_tail" = "None", "mam_ears" = "None", "deco_wings" = "None", + "taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian") + species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,LIPS,WINGCOLOR,HAS_FLESH,HAS_BONE) + mutanteyes = /obj/item/organ/eyes/night_vision + brutemod = 0.8 //About as tanky to brute as a Unathi. They'll probably snap and go feral when hurt though. + burnmod = 1.15 //As vulnerable to burn as a Tajara. + +/datum/species/mammal/xenochimera/on_species_gain(mob/living/carbon/human/C, datum/species/old_species, pref_load) + if(ishuman(C)) + C.verbs += /mob/living/carbon/human/proc/reconstitute_form + C.verbs += /mob/living/carbon/human/proc/sonar_ping + C.verbs += /mob/living/carbon/human/proc/tie_hair + C.add_movespeed_modifier(/datum/movespeed_modifier/xenochimera) + +/datum/species/mammal/xenochimera/spec_life(mob/living/carbon/human/H) + //If they're KO'd/dead, or reviving, they're probably not thinking a lot about much of anything. + //if(!H.stat || !(H.revive_ready == REVIVING_NOW || H.revive_ready == REVIVING_DONE)) + // handle_feralness(H) + + //While regenerating + if(H.revive_ready == REVIVING_NOW || H.revive_ready == REVIVING_DONE) + H.Paralyze(1000) + var/regen_sounds = list( + 'modular_splurt/sound/effects/regen_1.ogg', + 'modular_splurt/sound/effects/regen_2.ogg', + 'modular_splurt/sound/effects/regen_4.ogg', + 'modular_splurt/sound/effects/regen_3.ogg', + 'modular_splurt/sound/effects/regen_5.ogg' + ) + if(prob(2)) // 2% chance of playing squelchy noise while reviving, which is run roughly every 2 seconds/tick while regenerating. + playsound(H, pick(regen_sounds), 30) + H.visible_message("

[H.name]'s motionless form shudders grotesquely, rippling unnaturally.

") + + //Cold/pressure effects when not regenerating + else + var/datum/gas_mixture/environment = H.loc.return_air() + var/pressure2 = environment.return_pressure() + var/adjusted_pressure2 = H.calculate_affecting_pressure(pressure2) + + //Very low pressure damage + if(adjusted_pressure2 <= 20) + H.take_overall_damage(LOW_PRESSURE_DAMAGE, 0) + + + //Cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage or trigger feral. + //NB: 'body_temperature' used here is the 'setpoint' species var + var/body_temperature = 310.15 + var/temp_diff = body_temperature - H.bodytemperature + if(temp_diff >= 50) + H.eye_blurry = max(5,H.eye_blurry) + +/datum/movespeed_modifier/xenochimera + multiplicative_slowdown = -0.1 + +/mob/living/carbon/human/proc/reconstitute_form() //Scree's race ability.in exchange for: No cloning. + set name = "Reconstitute Form" + set category = "Abilities" + + // Sanity is mostly handled in chimera_regenerate() + if(stat == DEAD) + var/confirm = tgui_alert(usr, "Are you sure you want to regenerate your corpse? This process can take up to thirty minutes.", "Confirm Regeneration", list("Yes", "No")) + if(confirm == "Yes") + chimera_regenerate() + else if (quickcheckuninjured()) + var/confirm = tgui_alert(usr, "Are you sure you want to regenerate? As you are uninjured this will only take 30 seconds and match your appearance to your character slot.", "Confirm Regeneration", list("Yes", "No")) + if(confirm == "Yes") + chimera_regenerate() + else + var/confirm = tgui_alert(usr, "Are you sure you want to completely reconstruct your form? This process can take up to fifteen minutes, depending on how hungry you are, and you will be unable to move.", "Confirm Regeneration", list("Yes", "No")) + if(confirm == "Yes") + chimera_regenerate() + +/mob/living/carbon/human/proc/tie_hair() + set name = "Tie Hair" + set desc = "Style your hair." + set category = "IC" + + if(incapacitated()) + to_chat(src, "You can't mess with your hair right now!") + return + + if(hair_style) + var/selected_string + var/list/datum/sprite_accessory/hair/valid_hairstyles = list() + for(var/hair_string in GLOB.hair_styles_list) + valid_hairstyles.Add(hair_string) + selected_string = tgui_input_list(usr, "Select a new hairstyle", "Your hairstyle", valid_hairstyles) + if(incapacitated()) + to_chat(src, "You can't mess with your hair right now!") + return + else if(selected_string && hair_style != selected_string) + hair_style = selected_string + regenerate_icons() + visible_message("[src] pauses a moment to style their hair.") + else + to_chat(src, "You're already using that style.") + +/mob/living/carbon/human + var/revive_ready = REVIVING_READY // Only used for creatures that have the xenochimera regen ability, so far. + var/revive_finished = 0 // Only used for xenochimera regen, allows us to find out when the regen will finish. + +/mob/living/carbon/human/proc/chimera_regenerate() + //If they're already regenerating + switch(revive_ready) + if(REVIVING_NOW) + to_chat(src, "You are already reconstructing, just wait for the reconstruction to finish!") + return + if(REVIVING_DONE) + to_chat(src, "Your reconstruction is done, but you need to hatch now.") + return + if(revive_ready > world.time) + to_chat(src, "You can't use that ability again so soon!") + return + + var/time = min(900, (120+780/(1 + nutrition/100))) //capped at 15 mins, roughly 6 minutes at 250 (yellow) nutrition, 4.1 minutes at 500 (grey), cannot be below 2 mins + if (quickcheckuninjured()) //if you're completely uninjured, then you get a speedymode - check health first for quickness + time = 30 + + //Clicked regen while dead. + if(stat == DEAD) + + //reviving from dead takes extra nutriment to be provided from outside OR takes twice as long and consumes extra at the end + if(!nutrition > 0) + time = time*2 + + to_chat(src, "You begin to reconstruct your form. You will not be able to move during this time. It should take aproximately [round(time)] seconds.") + + //Scary spawnerization. + revive_ready = REVIVING_NOW + revive_finished = (world.time + time SECONDS) // When do we finish reviving? Allows us to find out when we're done, called by the alert currently. + throw_alert("regen", /atom/movable/screen/alert/xenochimera/reconstitution) + spawn(time SECONDS) + // check to see if they've been fixed by outside forces in the meantime such as defibbing + if(stat != DEAD) + to_chat(src, "Your body has recovered from its ordeal, ready to regenerate itself again.") + revive_ready = REVIVING_READY //reset their cooldown + clear_alert("regen") + throw_alert("hatch", /atom/movable/screen/alert/xenochimera/readytohatch) + + // Was dead, still dead. + else + to_chat(src, "Consciousness begins to stir as your new body awakens, ready to hatch.") + verbs |= /mob/living/carbon/human/proc/hatch + revive_ready = REVIVING_DONE + clear_alert("regen") + throw_alert("hatch", /atom/movable/screen/alert/xenochimera/readytohatch) + + + //Clicked regen while NOT dead + else + to_chat(src, "You begin to reconstruct your form. You will not be able to move during this time. It should take aproximately [round(time)] seconds.") + + //Waiting for regen after being alive + revive_ready = REVIVING_NOW + revive_finished = (world.time + time SECONDS) // When do we finish reviving? Allows us to find out when we're done, called by the alert currently. + throw_alert("regen", /atom/movable/screen/alert/xenochimera/reconstitution) + spawn(time SECONDS) + + //Slightly different flavour messages + if(stat != DEAD || nutrition > 0) + to_chat(src, "Consciousness begins to stir as your new body awakens, ready to hatch..") + else + to_chat(src, "Consciousness begins to stir as your battered body struggles to recover from its ordeal..") + verbs |= /mob/living/carbon/human/proc/hatch + revive_ready = REVIVING_DONE + + clear_alert("regen") + throw_alert("hatch", /atom/movable/screen/alert/xenochimera/readytohatch) + +/mob/living/carbon/human/proc/hatch() + set name = "Hatch" + set category = "Abilities" + + if(revive_ready != REVIVING_DONE) + //Hwhat? + verbs -= /mob/living/carbon/human/proc/hatch + return + + var/confirm = tgui_alert(usr, "Are you sure you want to hatch right now? This will be very obvious to anyone in view.", "Confirm Regeneration", list("Yes", "No")) + if(confirm == "Yes") + + //Dead when hatching + if(stat == DEAD) + + //Reviving from ded takes extra nutrition - if it isn't provided from outside sources, it comes from you + if(!nutrition > 0) + nutrition=nutrition * 0.75 + chimera_hatch() + + visible_message("

The former corpse staggers to its feet, all its former wounds having vanished...

") //Bloody hell... + clear_alert("hatch") + return + + //Alive when hatching + else + chimera_hatch() + + visible_message("

[src] rises to \his feet.

") //Bloody hell... + clear_alert("hatch") + +/mob/living/carbon/human/proc/chimera_hatch() + verbs -= /mob/living/carbon/human/proc/hatch + to_chat(src, "Your new body awakens, bursting free from your old skin.") + //Modify and record values (half nutrition and braindamage) + var/old_nutrition = nutrition + var/uninjured=quickcheckuninjured() + //I did have special snowflake code, but this is easier. + revive() + cure_husk() + + + if(!uninjured) + nutrition = old_nutrition * 0.5 + //Drop everything + for(var/obj/item/W in src) + dropItemToGround(W, 1) + //Visual effects + var/T = get_turf(src) + + new /obj/effect/gibspawner/human(T, src) + visible_message("

The lifeless husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.

") //Bloody hell... + + else //lower cost for doing a quick cosmetic revive + nutrition = old_nutrition * 0.9 + + //Unfreeze some things + //does_not_breathe = FALSE + //update_canmove() + //weakened = 2 + SetParalyzed(0) + revive_ready = world.time + 10 MINUTES //set the cooldown CHOMPEdit: Reduced this to 10 minutes, you're playing with fire if you're reviving that often. + + +/atom/movable/screen/alert/xenochimera/reconstitution + name = "Reconstructing Form" + desc = "You're still rebuilding your body! Click the alert to find out how long you have left." + icon_state = "regenerating" + + // Commenting this out for now, will revisit later once I can figure out how to override Click() appropriately. +/atom/movable/screen/alert/xenochimera/reconstitution/Click() + if(ishuman(usr)) // If you're somehow able to click this while not a chimera, this should prevent weird runtimes. Will need changing if regeneration is ever opened to non-chimera using the same alert. + var/mob/living/carbon/human/H = usr + if(istype(H.dna.species, /datum/species/mammal/xenochimera)) + if(H.revive_ready == REVIVING_NOW) + to_chat(usr, "We are currently reviving, and will be done in [(H.revive_finished - world.time) / 10] seconds.") + else if(H.revive_ready == REVIVING_DONE) + to_chat(usr, "You should have a notification + alert for this! Bug report that this is still here!") + + +/atom/movable/screen/alert/xenochimera/readytohatch + name = "Ready to Hatch" + desc = "You're done reconstructing your cells! Click me to Hatch!" + icon_state = "hatch_ready" + + // Commenting this out for now, will revisit later once I can figure out how to override Click() appropriately. +/atom/movable/screen/alert/xenochimera/readytohatch/Click() + if(ishuman(usr)) // If you're somehow able to click this while not a chimera, this should prevent weird runtimes. Will need changing if regeneration is ever opened to non-chimera using the same alert. + var/mob/living/carbon/human/H = usr + if(istype(H.dna.species, /datum/species/mammal/xenochimera)) + if(H.revive_ready == REVIVING_DONE) // Sanity check. + H.hatch() // Hatch. + + +/mob/living/carbon/human/proc/quickcheckuninjured() + if (getBruteLoss() || getFireLoss() || getToxLoss() || getOxyLoss()) //fails if they have any of the main damage types + return FALSE + return TRUE + +#undef REVIVING_NOW +#undef REVIVING_DONE +#undef REVIVING_READY + diff --git a/modular_splurt/code/modules/mob/living/emotes.dm b/modular_splurt/code/modules/mob/living/emotes.dm index cddf25ec73..de90be9231 100644 --- a/modular_splurt/code/modules/mob/living/emotes.dm +++ b/modular_splurt/code/modules/mob/living/emotes.dm @@ -314,7 +314,7 @@ sound = pick('modular_splurt/sound/voice/moan_f1.ogg', 'modular_splurt/sound/voice/moan_f2.ogg', 'modular_splurt/sound/voice/moan_f3.ogg', 'modular_splurt/sound/voice/moan_f4.ogg', 'modular_splurt/sound/voice/moan_f5.ogg', 'modular_splurt/sound/voice/moan_f6.ogg', 'modular_splurt/sound/voice/moan_f7.ogg') if(isalien(user)) sound = 'sound/voice/hiss6.ogg' - playsound(user.loc, sound, 50, 1, 4, 1.2) + playlewdinteractionsound(user.loc, sound, 50, 1, 4, 1.2) message = "moans!" else if(miming) message = "acts out a moan." @@ -956,6 +956,15 @@ emote_sound = 'modular_splurt/sound/voice/rizz.ogg' emote_cooldown = 1.43 SECONDS +/datum/emote/living/audio/buff + key = "buff" + key_third_person = "buffs" + message = "shows off their muscles." + message_param = "shows off their muscles to %t." + emote_sound = 'modular_splurt/sound/voice/buff.ogg' + emote_cooldown = 4.77 SECONDS + emote_pitch_variance = FALSE + /datum/emote/living/audio/merowr key = "merowr" key_third_person = "merowrs" @@ -1029,6 +1038,30 @@ emote_sound = 'modular_splurt/sound/voice/moo.ogg' emote_cooldown = 1.7 SECONDS +/datum/emote/living/audio/untitledgoose + key = "goosehonk" + key_third_person = "honks" + message = "honks!" + message_mime = "looks like a duck from hell!" + emote_sound = 'modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_01.ogg' + emote_cooldown = 0.8 SECONDS + +/datum/emote/living/audio/untitledgoose/run_emote(mob/user, params) + emote_sound = pick('modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_01.ogg', 'modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_02.ogg','modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_03.ogg','modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_06.ogg') + . = ..() + +/datum/emote/living/audio/untitledgooseB + key = "goosehonkb" + key_third_person = "honks differently" + message = "honks differently!" + message_mime = "looks like a duck from hell!" + emote_sound = 'modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_01.ogg' + emote_cooldown = 0.8 SECONDS + +/datum/emote/living/audio/untitledgooseB/run_emote(mob/user, params) + emote_sound = pick('modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_02.ogg', 'modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_03.ogg', 'modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_04.ogg', 'modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_06.ogg', 'modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_07.ogg', 'modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_08.ogg', 'modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_09.ogg') + . = ..() + /datum/emote/living/audio/scream2 key = "scream2" key_third_person = "screams2" @@ -1039,5 +1072,5 @@ emote_pitch_variance = FALSE /datum/emote/living/audio/scream2/run_emote(mob/user, params) - emote_sound = pick('modular_splurt/sound/voice/cscream1.ogg', 'modular_splurt/sound/voice/cscream2.ogg', 'modular_splurt/sound/voice/cscream3.ogg', 'modular_splurt/sound/voice/cscream4.ogg', 'modular_splurt/sound/voice/cscream5.ogg', 'modular_splurt/sound/voice/cscream6.ogg', 'modular_splurt/sound/voice/cscream7.ogg', 'modular_splurt/sound/voice/cscream8.ogg', 'modular_splurt/sound/voice/cscream9.ogg', 'modular_splurt/sound/voice/cscream10.ogg') + emote_sound = pick('modular_splurt/sound/voice/cscream1.ogg', 'modular_splurt/sound/voice/cscream2.ogg', 'modular_splurt/sound/voice/cscream3.ogg', 'modular_splurt/sound/voice/cscream4.ogg', 'modular_splurt/sound/voice/cscream5.ogg', 'modular_splurt/sound/voice/cscream6.ogg', 'modular_splurt/sound/voice/cscream7.ogg', 'modular_splurt/sound/voice/cscream8.ogg', 'modular_splurt/sound/voice/cscream9.ogg', 'modular_splurt/sound/voice/cscream10.ogg', 'modular_splurt/sound/voice/cscream11.ogg') . = ..() diff --git a/modular_splurt/code/modules/mob/living/living.dm b/modular_splurt/code/modules/mob/living/living.dm index 6d36fd208a..dc951ce656 100644 --- a/modular_splurt/code/modules/mob/living/living.dm +++ b/modular_splurt/code/modules/mob/living/living.dm @@ -69,7 +69,7 @@ . = ..() if(iswendigo(pulledby)) //Grip is too strong, nonetheless. to_chat(src, "The grip is too strong! I need some time...") - if(do_after(src, 200, target=pulledby)) + if(do_after(src, 200, target = pulledby)) to_chat(src, "I break free off [pulledby]'s grip!") return TRUE diff --git a/modular_splurt/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/modular_splurt/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index 78cbd2fd7b..460543e779 100644 --- a/modular_splurt/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/modular_splurt/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -84,12 +84,14 @@ icon_state = "543box" ammo_type = /obj/item/ammo_casing/a543 max_ammo = 40 + icon = 'modular_splurt/icons/obj/ammo.dmi' /obj/item/ammo_box/a543/rubber name = "ammo box (.5x43mm Rubber)" icon_state = "543box" ammo_type = /obj/item/ammo_casing/a543/rubber max_ammo = 40 + icon = 'modular_splurt/icons/obj/ammo.dmi' /obj/item/ammo_box/a308 name = "stripper clip (.308)" @@ -262,3 +264,33 @@ materials = list(/datum/material/iron = 35000) build_path = /obj/item/ammo_box/a308 category = list("hacked", "Security") + +/datum/design/a543_lethal + name = "Ammo box (.5x43mm Lethal)" + desc = "A 40 round ammunition box that stores .5x43mm lethal bullets." + id = "a543_lethal" + materials = list(/datum/material/iron = 48000, /datum/material/silver = 12000) + build_path = /obj/item/ammo_box/a543/lethal + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + category = list("Ammo") + build_type = PROTOLATHE + +/datum/design/a543_rubber + name = "Ammo box (.5x43mm Rubber)" + desc = "A 40 round ammunition box that stores .5x43mm rubber bullets." + id = "a543_rubber" + materials = list(/datum/material/iron = 36000, /datum/material/silver = 6000) + build_path = /obj/item/ammo_box/a543/rubber + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + category = list("Ammo") + build_type = PROTOLATHE + +/datum/supply_pack/security/armory/ammo5x43mm + name = ".5x43mm Ammunition Crate" + desc = "Contains two boxes of .5x43mm rubber bullets and two boxes of .5x43mm lethal bullets. Requires Armory access to open." + cost = 8500 + contains = list(/obj/item/ammo_box/a543/rubber, + /obj/item/ammo_box/a543/rubber, + /obj/item/ammo_box/a543/lethal, + /obj/item/ammo_box/a543/lethal) + crate_name = ".5x43mm ammunition crate" diff --git a/modular_splurt/code/modules/projectiles/guns/ballistic/automatic.dm b/modular_splurt/code/modules/projectiles/guns/ballistic/automatic.dm index c20a6a38fb..e95909a5b4 100644 --- a/modular_splurt/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/modular_splurt/code/modules/projectiles/guns/ballistic/automatic.dm @@ -262,3 +262,11 @@ /obj/item/gun/ballistic/automatic/smg22/nomag spawnwithmagazine = FALSE + +/datum/supply_pack/security/armory/m46a1 + name = "Pink M46A1 Full-Auto Rifle Crate" + desc = "Contains two high-powered, fully automatic rifles rifles chambered in .5x43mm. Requires Armory access to open." + cost = 25000 + contains = list(/obj/item/gun/ballistic/automatic/m46a1, + /obj/item/gun/ballistic/automatic/m46a1) + crate_name = "m46a1 rifles crate" diff --git a/modular_splurt/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/modular_splurt/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 03eea01004..4d8d4ff0c4 100644 --- a/modular_splurt/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/modular_splurt/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -382,3 +382,111 @@ C.adjustOxyLoss(0.25) . = 1 return ..() + +/datum/reagent/consumable/ethanol/twinkjuice + name = "Twink Juice" + description = "A long slender fruity drink with a green thick liquid inside. It smells nice and, and probably tastes fruity." + color = "#3fd2ff" + taste_description = "a concoction of dubious origins, and dubious purposes" + glass_icon = 'modular_splurt/icons/obj/drinks.dmi' + glass_icon_state = "twinkdrink" + glass_name = "glass of Boy Kisser" + glass_desc = "Looking at this, you think about backyards" + pH = 6.5 + value = REAGENT_VALUE_UNCOMMON + boozepwr = 5 + quality = DRINK_FANTASTIC + var/drinkerWasAlreadySubmissive = FALSE + +/datum/reagent/consumable/ethanol/twinkjuice/on_mob_metabolize(mob/living/L) + ..() + if (ishuman(L)) + var/mob/living/carbon/human/M = L + if(M.client?.prefs.cit_toggles & NO_APHRO) + M.log_message("drank [src], but ignored it due to aphrodisiac preference.", LOG_EMOTE) + return + + if(!M.has_quirk(/datum/quirk/well_trained)) + M.log_message("is now under the effect of [src].", LOG_EMOTE) + M.add_quirk(/datum/quirk/well_trained, APHRO_TRAIT) + else + drinkerWasAlreadySubmissive = TRUE + +/datum/reagent/consumable/ethanol/twinkjuice/on_mob_end_metabolize(mob/living/L) + if (ishuman(L)) + var/mob/living/carbon/human/M = L + if(M.has_quirk(/datum/quirk/well_trained) && !drinkerWasAlreadySubmissive) + M.log_message("is no longer under the effect of [src].", LOG_EMOTE) + M.remove_quirk(/datum/quirk/well_trained, APHRO_TRAIT) + + +/datum/reagent/consumable/ethanol/midnight_tears + name = "Midnight Tears" + description = "A reflection of what your Heart feels a weak call for love.\n-Leo Oxto" + glass_icon = 'modular_splurt/icons/obj/drinks.dmi' + glass_icon_state = "midnight_tears" + glass_name = "glass of Midnight Tears" + taste_description = "the warm feeling of a hug" + color = "#005DE9" + +/datum/reagent/consumable/ethanol/midnight_tears/on_mob_life(mob/living/carbon/C) + ..() + if ishuman(C) + var/mob/living/carbon/human/H = C + if(!H.dna || !H.dna.species || !H.dna.species.can_wag_tail(H)) + return + if(!H.dna.species.is_wagging_tail()) + H.dna.species.start_wagging_tail(H) + +/datum/reagent/consumable/ethanol/midnight_sky + name = "Midnight Sky" + description = "An escape from all your troubles, may it help you find love and joy.\n-Leo Oxto" + glass_icon = 'modular_splurt/icons/obj/drinks.dmi' + glass_icon_state = "midnight_sky" + glass_name = "glass of Midnight Sky" + taste_description = "a calm taste like the calm night" + color = "#060709" + +/datum/reagent/consumable/ethanol/midnight_sky/on_mob_life(mob/living/carbon/C) + ..() + C.adjustBruteLoss(-0.5) + C.adjustFireLoss(-0.5) + . = TRUE + +/datum/reagent/consumable/ethanol/midnight_joy + name = "Midnight Joy" + description = " Be sure to spread this feeling, for some lack it in their life, be the reason they have a smile on their face.\n-Leo Oxto" + glass_icon = 'modular_splurt/icons/obj/drinks.dmi' + glass_icon_state = "midnight_joy" + glass_name = "glass of Midnight Joy" + taste_description = "sweet joy" + color = "#FFF393" + +/datum/reagent/consumable/ethanol/midnight_joy/on_mob_life(mob/living/carbon/C) + ..() + if (prob(7)) + C.emote("giggle") + +/obj/item/storage/box/drinkingglasses/midnight + name = "Midnight Drinking Box" + desc = "A box containing two glasses of each of the three midnight drinks." + +/obj/item/storage/box/drinkingglasses/midnight/PopulateContents() + new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/midnight_joy(src) + new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/midnight_joy(src) + new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/midnight_sky(src) + new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/midnight_sky(src) + new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/midnight_tears(src) + new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/midnight_tears(src) + +/obj/item/reagent_containers/food/drinks/drinkingglass/filled/midnight_joy + name = "Midnight Joy" + list_reagents = list(/datum/reagent/consumable/ethanol/midnight_joy = 50) + +/obj/item/reagent_containers/food/drinks/drinkingglass/filled/midnight_sky + name = "Midnight Sky" + list_reagents = list(/datum/reagent/consumable/ethanol/midnight_sky = 50) + +/obj/item/reagent_containers/food/drinks/drinkingglass/filled/midnight_tears + name = "Midnight Tears" + list_reagents = list(/datum/reagent/consumable/ethanol/midnight_tears = 50) diff --git a/modular_splurt/code/modules/research/techweb/nodes/ballistics.dm b/modular_splurt/code/modules/research/techweb/nodes/ballistics.dm new file mode 100644 index 0000000000..67979fab05 --- /dev/null +++ b/modular_splurt/code/modules/research/techweb/nodes/ballistics.dm @@ -0,0 +1,2 @@ +/datum/techweb_node/ballistic_weapons + design_ids = list("mag_oldsmg", "mag_oldsmg_ap", "mag_oldsmg_ic", "mag_oldsmg_rubber", "mag_oldsmg_tx", "a543_rubber", "a543_lethal") diff --git a/modular_splurt/code/modules/research/xenoarch/artifact.dm b/modular_splurt/code/modules/research/xenoarch/artifact.dm index 946ce62622..bde1d1cdd8 100644 --- a/modular_splurt/code/modules/research/xenoarch/artifact.dm +++ b/modular_splurt/code/modules/research/xenoarch/artifact.dm @@ -29,7 +29,7 @@ /obj/item/ancientartifact/useless/attackby(obj/item/W, mob/user, params) if(istype(W,/obj/item/xenoarch/help/research)) - if(!do_after(user,100,target=src)) + if(!do_after(user, 100, target=src)) to_chat(user,"You must stand still to analyze.") return SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = 2000)) @@ -46,7 +46,7 @@ /obj/item/ancientartifact/faunafossil/attackby(obj/item/W, mob/user, params) if(istype(W,/obj/item/xenoarch/help/research)) - if(!do_after(user,100,target=src)) + if(!do_after(user, 100, target=src)) to_chat(user,"You must stand still to analyze.") return SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = 4000)) @@ -63,14 +63,14 @@ /obj/item/ancientartifact/florafossil/attackby(obj/item/W, mob/user, params) if(istype(W,/obj/item/xenoarch/help/research)) - if(!do_after(user,100,target=src)) + if(!do_after(user, 100, target=src)) to_chat(user,"You must stand still to analyze.") return SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = 4000)) to_chat(user,"You successfully researched the artifact. You have gained 4000 research points.") qdel(src) if(istype(W,/obj/item/xenoarch/help/plant)) - if(!do_after(user,50,target=src)) + if(!do_after(user, 50, target=src)) to_chat(user,"You need to stand still to extract the seeds.") return var/seed = pick(list( /obj/item/seeds/amauri, diff --git a/modular_splurt/code/modules/research/xenoarch/strange_rock.dm b/modular_splurt/code/modules/research/xenoarch/strange_rock.dm index b665002ae4..a8a5fe9ace 100644 --- a/modular_splurt/code/modules/research/xenoarch/strange_rock.dm +++ b/modular_splurt/code/modules/research/xenoarch/strange_rock.dm @@ -42,7 +42,7 @@ tryagain = TRUE var/obj/item/xenoarch/clean/hammer/HM = W playsound(loc, HM.usesound, 50, 1, -1) - if(!do_after(user,HM.cleanspeed,target = src)) + if(!do_after(user, HM.cleanspeed, target = src)) to_chat(user,"You must stand still to clean.") tryagain = FALSE return @@ -60,7 +60,7 @@ tryagain = TRUE var/obj/item/xenoarch/clean/brush/HM = W playsound(loc, HM.usesound, 50, 1, -1) - if(!do_after(user,HM.brushspeed,target = src)) + if(!do_after(user, HM.brushspeed, target = src)) to_chat(user,"You must stand still to clean.") tryagain = FALSE return @@ -83,7 +83,7 @@ if(istype(W,/obj/item/xenoarch/help/scanner)) var/obj/item/xenoarch/help/scanner/HM = W playsound(loc, HM.usesound, 50, 1, -1) - if(!do_after(user,30,target = src)) + if(!do_after(user, 30, target = src)) to_chat(user,"You must stand still to scan.") return playsound(loc, HM.usesound, 50, 1, -1) @@ -92,7 +92,7 @@ if(istype(W,/obj/item/xenoarch/help/scanneradv)) var/obj/item/xenoarch/help/scanneradv/HM = W playsound(loc, HM.usesound, 50, 1, -1) - if(!do_after(user,10,target = src)) + if(!do_after(user, 10, target = src)) to_chat(user,"You must stand still to scan.") return playsound(loc, HM.usesound, 50, 1, -1) @@ -102,7 +102,7 @@ if(istype(W,/obj/item/xenoarch/help/measuring)) var/obj/item/xenoarch/help/measuring/HM = W playsound(loc, HM.usesound, 50, 1, -1) - if(!do_after(user,10,target = src)) + if(!do_after(user, 10, target = src)) to_chat(user,"You must stand still to measure.") return if(!dugdepth) diff --git a/modular_splurt/code/modules/research/xenoarch/tools.dm b/modular_splurt/code/modules/research/xenoarch/tools.dm index a793c793da..44591fdae7 100644 --- a/modular_splurt/code/modules/research/xenoarch/tools.dm +++ b/modular_splurt/code/modules/research/xenoarch/tools.dm @@ -140,7 +140,7 @@ if(!istype(target,/obj/item)) return var/datum/export_report/ex = new - if(!do_after(user,300,target=target)) + if(!do_after(user, 300, target=target)) to_chat(user,"You need to stand still to export items.") return export_item_and_contents(target, export_categories , dry_run = FALSE, external_report = ex) diff --git a/modular_splurt/code/modules/shuttle/gigab.dm b/modular_splurt/code/modules/shuttle/gigab.dm new file mode 100644 index 0000000000..61431c56fe --- /dev/null +++ b/modular_splurt/code/modules/shuttle/gigab.dm @@ -0,0 +1,5 @@ +/obj/machinery/spaceship_navigation_beacon/invion + name = "wall" + icon = 'modular_splurt/icons/obj/objects.dmi' + icon_state = "invisible" + invisibility = INVISIBILITY_ABSTRACT diff --git a/modular_splurt/code/modules/surgery/organs/lungs.dm b/modular_splurt/code/modules/surgery/organs/lungs.dm index 639e304de8..ec89182492 100644 --- a/modular_splurt/code/modules/surgery/organs/lungs.dm +++ b/modular_splurt/code/modules/surgery/organs/lungs.dm @@ -1,3 +1,14 @@ /obj/item/organ/lungs/ipc name = "IPC cooling system" desc = "Helps regulate the body temperature of synthetic beings. Helpful!" + +/obj/item/organ/lungs/vox + name = "plasma filter" + desc = "A spongy rib-shaped mass for filtering plasma from the air." + icon_state = "lungs-plasma" + breathing_class = BREATH_PLASMA + maxHealth = INFINITY//I don't understand how plamamen work, so I'm not going to try t give them special lungs atm + +/obj/item/organ/lungs/vox/populate_gas_info() + ..() + gas_max -= GAS_PLASMA diff --git a/modular_splurt/icons/mob/catmedbot.dmi b/modular_splurt/icons/mob/catmedbot.dmi index b276ab8c54..1c6d6bbb23 100644 Binary files a/modular_splurt/icons/mob/catmedbot.dmi and b/modular_splurt/icons/mob/catmedbot.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/teshari/accessories.dmi b/modular_splurt/icons/mob/clothing/species/teshari/accessories.dmi new file mode 100644 index 0000000000..ee27184181 Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/teshari/accessories.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/teshari/back.dmi b/modular_splurt/icons/mob/clothing/species/teshari/back.dmi new file mode 100644 index 0000000000..bcecaae765 Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/teshari/back.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/teshari/belt.dmi b/modular_splurt/icons/mob/clothing/species/teshari/belt.dmi new file mode 100644 index 0000000000..eadfe01a6e Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/teshari/belt.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/teshari/ears.dmi b/modular_splurt/icons/mob/clothing/species/teshari/ears.dmi new file mode 100644 index 0000000000..0d74260887 Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/teshari/ears.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/teshari/eyes.dmi b/modular_splurt/icons/mob/clothing/species/teshari/eyes.dmi new file mode 100644 index 0000000000..4868ae09f7 Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/teshari/eyes.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/teshari/feet.dmi b/modular_splurt/icons/mob/clothing/species/teshari/feet.dmi new file mode 100644 index 0000000000..53a2f1f70e Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/teshari/feet.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/teshari/feet_64.dmi b/modular_splurt/icons/mob/clothing/species/teshari/feet_64.dmi new file mode 100644 index 0000000000..72d7453676 Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/teshari/feet_64.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/teshari/hands.dmi b/modular_splurt/icons/mob/clothing/species/teshari/hands.dmi new file mode 100644 index 0000000000..885c3895fa Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/teshari/hands.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/teshari/head.dmi b/modular_splurt/icons/mob/clothing/species/teshari/head.dmi new file mode 100644 index 0000000000..16ef5634cb Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/teshari/head.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/teshari/mask.dmi b/modular_splurt/icons/mob/clothing/species/teshari/mask.dmi new file mode 100644 index 0000000000..b84fb3ae96 Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/teshari/mask.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/teshari/neck.dmi b/modular_splurt/icons/mob/clothing/species/teshari/neck.dmi new file mode 100644 index 0000000000..35118102fc Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/teshari/neck.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/teshari/suit.dmi b/modular_splurt/icons/mob/clothing/species/teshari/suit.dmi new file mode 100644 index 0000000000..6fc1411dd4 Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/teshari/suit.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/teshari/tesh_items.dmi b/modular_splurt/icons/mob/clothing/species/teshari/tesh_items.dmi new file mode 100644 index 0000000000..2a5179e00c Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/teshari/tesh_items.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/teshari/uniform.dmi b/modular_splurt/icons/mob/clothing/species/teshari/uniform.dmi new file mode 100644 index 0000000000..3abaf61753 Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/teshari/uniform.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/vox/back.dmi b/modular_splurt/icons/mob/clothing/species/vox/back.dmi new file mode 100644 index 0000000000..b3c7e2dde1 Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/vox/back.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/vox/ears.dmi b/modular_splurt/icons/mob/clothing/species/vox/ears.dmi new file mode 100644 index 0000000000..09fea15502 Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/vox/ears.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/vox/eyes.dmi b/modular_splurt/icons/mob/clothing/species/vox/eyes.dmi new file mode 100644 index 0000000000..f6cfbf5b2e Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/vox/eyes.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/vox/face.dmi b/modular_splurt/icons/mob/clothing/species/vox/face.dmi new file mode 100644 index 0000000000..de6101e2a7 Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/vox/face.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/vox/feet.dmi b/modular_splurt/icons/mob/clothing/species/vox/feet.dmi new file mode 100644 index 0000000000..8512234e6d Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/vox/feet.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/vox/hands.dmi b/modular_splurt/icons/mob/clothing/species/vox/hands.dmi new file mode 100644 index 0000000000..936dbc337a Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/vox/hands.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/vox/head.dmi b/modular_splurt/icons/mob/clothing/species/vox/head.dmi new file mode 100644 index 0000000000..c1fa4ed377 Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/vox/head.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/vox/suit.dmi b/modular_splurt/icons/mob/clothing/species/vox/suit.dmi new file mode 100644 index 0000000000..b2e41a9422 Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/vox/suit.dmi differ diff --git a/modular_splurt/icons/mob/clothing/species/vox/uniform.dmi b/modular_splurt/icons/mob/clothing/species/vox/uniform.dmi new file mode 100644 index 0000000000..03c5ce75f4 Binary files /dev/null and b/modular_splurt/icons/mob/clothing/species/vox/uniform.dmi differ diff --git a/modular_splurt/icons/mob/ears.dmi b/modular_splurt/icons/mob/ears.dmi new file mode 100644 index 0000000000..660a01e6b8 Binary files /dev/null and b/modular_splurt/icons/mob/ears.dmi differ diff --git a/modular_splurt/icons/mob/hair.dmi b/modular_splurt/icons/mob/hair.dmi index 46abc169e7..07e756f8f4 100644 Binary files a/modular_splurt/icons/mob/hair.dmi and b/modular_splurt/icons/mob/hair.dmi differ diff --git a/modular_splurt/icons/mob/mam_markings.dmi b/modular_splurt/icons/mob/mam_markings.dmi index 76921764ee..20a3b335df 100644 Binary files a/modular_splurt/icons/mob/mam_markings.dmi and b/modular_splurt/icons/mob/mam_markings.dmi differ diff --git a/modular_splurt/icons/mob/mam_markingsdel.dmi b/modular_splurt/icons/mob/mam_markingsdel.dmi new file mode 100644 index 0000000000..4d6d00fb07 Binary files /dev/null and b/modular_splurt/icons/mob/mam_markingsdel.dmi differ diff --git a/modular_splurt/icons/mob/tail.dmi b/modular_splurt/icons/mob/tail.dmi new file mode 100644 index 0000000000..3e62fee997 Binary files /dev/null and b/modular_splurt/icons/mob/tail.dmi differ diff --git a/modular_splurt/icons/mob/teshari.dmi b/modular_splurt/icons/mob/teshari.dmi new file mode 100644 index 0000000000..82186a36cd Binary files /dev/null and b/modular_splurt/icons/mob/teshari.dmi differ diff --git a/modular_splurt/icons/mob/teshari_parts.dmi b/modular_splurt/icons/mob/teshari_parts.dmi new file mode 100644 index 0000000000..b22395a92d Binary files /dev/null and b/modular_splurt/icons/mob/teshari_parts.dmi differ diff --git a/modular_splurt/icons/mob/vox.dmi b/modular_splurt/icons/mob/vox.dmi new file mode 100644 index 0000000000..e2fbae0c9f Binary files /dev/null and b/modular_splurt/icons/mob/vox.dmi differ diff --git a/modular_splurt/icons/obj/carvingstones/carving_stones.dmi b/modular_splurt/icons/obj/carvingstones/carving_stones.dmi new file mode 100644 index 0000000000..3560cac25f Binary files /dev/null and b/modular_splurt/icons/obj/carvingstones/carving_stones.dmi differ diff --git a/modular_splurt/icons/obj/drinks.dmi b/modular_splurt/icons/obj/drinks.dmi index 55d640912e..2c8f6b8827 100644 Binary files a/modular_splurt/icons/obj/drinks.dmi and b/modular_splurt/icons/obj/drinks.dmi differ diff --git a/modular_splurt/icons/obj/gems/gems_machine.dmi b/modular_splurt/icons/obj/gems/gems_machine.dmi new file mode 100644 index 0000000000..5fa9ea426d Binary files /dev/null and b/modular_splurt/icons/obj/gems/gems_machine.dmi differ diff --git a/modular_splurt/icons/obj/gems/gems_processed.dmi b/modular_splurt/icons/obj/gems/gems_processed.dmi new file mode 100644 index 0000000000..a341042627 Binary files /dev/null and b/modular_splurt/icons/obj/gems/gems_processed.dmi differ diff --git a/modular_splurt/icons/obj/gems/gems_raw.dmi b/modular_splurt/icons/obj/gems/gems_raw.dmi new file mode 100644 index 0000000000..3ac8348a05 Binary files /dev/null and b/modular_splurt/icons/obj/gems/gems_raw.dmi differ diff --git a/modular_splurt/icons/obj/genitals/teshari_penis.dmi b/modular_splurt/icons/obj/genitals/teshari_penis.dmi new file mode 100644 index 0000000000..9931509ae9 Binary files /dev/null and b/modular_splurt/icons/obj/genitals/teshari_penis.dmi differ diff --git a/modular_splurt/icons/obj/hierobird/hierophant_bird.dmi b/modular_splurt/icons/obj/hierobird/hierophant_bird.dmi new file mode 100644 index 0000000000..2b73122d72 Binary files /dev/null and b/modular_splurt/icons/obj/hierobird/hierophant_bird.dmi differ diff --git a/modular_splurt/icons/obj/hierobird/hierophant_bird_club.dmi b/modular_splurt/icons/obj/hierobird/hierophant_bird_club.dmi new file mode 100644 index 0000000000..f67f8ad62d Binary files /dev/null and b/modular_splurt/icons/obj/hierobird/hierophant_bird_club.dmi differ diff --git a/modular_splurt/icons/obj/hierobird/hierophant_bird_club_inhand_left.dmi b/modular_splurt/icons/obj/hierobird/hierophant_bird_club_inhand_left.dmi new file mode 100644 index 0000000000..802e331177 Binary files /dev/null and b/modular_splurt/icons/obj/hierobird/hierophant_bird_club_inhand_left.dmi differ diff --git a/modular_splurt/icons/obj/hierobird/hierophant_bird_club_inhand_right.dmi b/modular_splurt/icons/obj/hierobird/hierophant_bird_club_inhand_right.dmi new file mode 100644 index 0000000000..a2c7534a9d Binary files /dev/null and b/modular_splurt/icons/obj/hierobird/hierophant_bird_club_inhand_right.dmi differ diff --git a/modular_splurt/icons/obj/hierobird/hierophant_bird_floors.dmi b/modular_splurt/icons/obj/hierobird/hierophant_bird_floors.dmi new file mode 100644 index 0000000000..42df1b113e Binary files /dev/null and b/modular_splurt/icons/obj/hierobird/hierophant_bird_floors.dmi differ diff --git a/modular_splurt/icons/obj/hierobird/hierophant_bird_walls.dmi b/modular_splurt/icons/obj/hierobird/hierophant_bird_walls.dmi new file mode 100644 index 0000000000..6f81934176 Binary files /dev/null and b/modular_splurt/icons/obj/hierobird/hierophant_bird_walls.dmi differ diff --git a/modular_splurt/icons/obj/objects.dmi b/modular_splurt/icons/obj/objects.dmi index 482a918c34..e05cf67951 100644 Binary files a/modular_splurt/icons/obj/objects.dmi and b/modular_splurt/icons/obj/objects.dmi differ diff --git a/modular_splurt/sound/effects/hatch.ogg b/modular_splurt/sound/effects/hatch.ogg new file mode 100644 index 0000000000..3ac74fdec1 Binary files /dev/null and b/modular_splurt/sound/effects/hatch.ogg differ diff --git a/modular_splurt/sound/effects/hatch_notification.ogg b/modular_splurt/sound/effects/hatch_notification.ogg new file mode 100644 index 0000000000..f821a898b7 Binary files /dev/null and b/modular_splurt/sound/effects/hatch_notification.ogg differ diff --git a/modular_splurt/sound/effects/regen_1.ogg b/modular_splurt/sound/effects/regen_1.ogg new file mode 100644 index 0000000000..199e7db780 Binary files /dev/null and b/modular_splurt/sound/effects/regen_1.ogg differ diff --git a/modular_splurt/sound/effects/regen_2.ogg b/modular_splurt/sound/effects/regen_2.ogg new file mode 100644 index 0000000000..a15d979797 Binary files /dev/null and b/modular_splurt/sound/effects/regen_2.ogg differ diff --git a/modular_splurt/sound/effects/regen_3.ogg b/modular_splurt/sound/effects/regen_3.ogg new file mode 100644 index 0000000000..5546c2b25f Binary files /dev/null and b/modular_splurt/sound/effects/regen_3.ogg differ diff --git a/modular_splurt/sound/effects/regen_4.ogg b/modular_splurt/sound/effects/regen_4.ogg new file mode 100644 index 0000000000..a5d706e7ce Binary files /dev/null and b/modular_splurt/sound/effects/regen_4.ogg differ diff --git a/modular_splurt/sound/effects/regen_5.ogg b/modular_splurt/sound/effects/regen_5.ogg new file mode 100644 index 0000000000..b85eced5ab Binary files /dev/null and b/modular_splurt/sound/effects/regen_5.ogg differ diff --git a/modular_splurt/sound/voice/buff.ogg b/modular_splurt/sound/voice/buff.ogg new file mode 100644 index 0000000000..e2cb73510f Binary files /dev/null and b/modular_splurt/sound/voice/buff.ogg differ diff --git a/modular_splurt/sound/voice/cscream11.ogg b/modular_splurt/sound/voice/cscream11.ogg new file mode 100644 index 0000000000..a101b2de50 Binary files /dev/null and b/modular_splurt/sound/voice/cscream11.ogg differ diff --git a/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_02.ogg b/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_02.ogg new file mode 100644 index 0000000000..b57d2aa2c5 Binary files /dev/null and b/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_02.ogg differ diff --git a/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_03.ogg b/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_03.ogg new file mode 100644 index 0000000000..27622f671a Binary files /dev/null and b/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_03.ogg differ diff --git a/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_04.ogg b/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_04.ogg new file mode 100644 index 0000000000..9445045ff0 Binary files /dev/null and b/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_04.ogg differ diff --git a/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_06.ogg b/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_06.ogg new file mode 100644 index 0000000000..b77c7a9eed Binary files /dev/null and b/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_06.ogg differ diff --git a/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_07.ogg b/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_07.ogg new file mode 100644 index 0000000000..f073929b5e Binary files /dev/null and b/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_07.ogg differ diff --git a/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_08.ogg b/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_08.ogg new file mode 100644 index 0000000000..fd61b53edc Binary files /dev/null and b/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_08.ogg differ diff --git a/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_09.ogg b/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_09.ogg new file mode 100644 index 0000000000..1c06a77907 Binary files /dev/null and b/modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_09.ogg differ diff --git a/modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_01.ogg b/modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_01.ogg new file mode 100644 index 0000000000..172d7a1637 Binary files /dev/null and b/modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_01.ogg differ diff --git a/modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_02.ogg b/modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_02.ogg new file mode 100644 index 0000000000..ff210eed4d Binary files /dev/null and b/modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_02.ogg differ diff --git a/modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_03.ogg b/modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_03.ogg new file mode 100644 index 0000000000..d7280a1c4a Binary files /dev/null and b/modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_03.ogg differ diff --git a/modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_06.ogg b/modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_06.ogg new file mode 100644 index 0000000000..9a0a068e77 Binary files /dev/null and b/modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_06.ogg differ diff --git a/modular_splurt/sound/voice/shriek1.ogg b/modular_splurt/sound/voice/shriek1.ogg new file mode 100644 index 0000000000..bb13db1ca0 Binary files /dev/null and b/modular_splurt/sound/voice/shriek1.ogg differ diff --git a/modular_splurt/sound/voice/teshchirp.ogg b/modular_splurt/sound/voice/teshchirp.ogg new file mode 100644 index 0000000000..f13c80dd33 Binary files /dev/null and b/modular_splurt/sound/voice/teshchirp.ogg differ diff --git a/modular_splurt/sound/voice/teshscream.ogg b/modular_splurt/sound/voice/teshscream.ogg new file mode 100644 index 0000000000..9beb0106a3 Binary files /dev/null and b/modular_splurt/sound/voice/teshscream.ogg differ diff --git a/modular_splurt/sound/voice/teshsqueak.ogg b/modular_splurt/sound/voice/teshsqueak.ogg new file mode 100644 index 0000000000..41d205ab9f Binary files /dev/null and b/modular_splurt/sound/voice/teshsqueak.ogg differ diff --git a/modular_splurt/sound/voice/teshtrill.ogg b/modular_splurt/sound/voice/teshtrill.ogg new file mode 100644 index 0000000000..db30e988e5 Binary files /dev/null and b/modular_splurt/sound/voice/teshtrill.ogg differ diff --git a/rust_g.dll b/rust_g.dll index 2197a22465..1b5f515b34 100644 Binary files a/rust_g.dll and b/rust_g.dll differ diff --git a/tgstation.dme b/tgstation.dme index 14d63d1a11..8e91a0e8a3 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4472,6 +4472,7 @@ #include "modular_splurt\code\game\objects\items\devices\PDA\radio.dm" #include "modular_splurt\code\game\objects\items\devices\radio\electropack.dm" #include "modular_splurt\code\game\objects\items\devices\radio\headset.dm" +#include "modular_splurt\code\game\objects\items\hierobird\hierobird.dm" #include "modular_splurt\code\game\objects\items\implants\implant_aphropumps.dm" #include "modular_splurt\code\game\objects\items\implants\implant_disrobe.dm" #include "modular_splurt\code\game\objects\items\implants\implant_gfluid.dm" @@ -4596,6 +4597,7 @@ #include "modular_splurt\code\modules\arousal\organs\butt.dm" #include "modular_splurt\code\modules\arousal\organs\penis.dm" #include "modular_splurt\code\modules\arousal\organs\testicles.dm" +#include "modular_splurt\code\modules\arousal\organs\vagina.dm" #include "modular_splurt\code\modules\arousal\organs\womb.dm" #include "modular_splurt\code\modules\arousal\toys\dildos.dm" #include "modular_splurt\code\modules\atmospherics\auxgm\gas_types.dm" @@ -4678,6 +4680,7 @@ #include "modular_splurt\code\modules\clothing\masks\miscellaneous.dm" #include "modular_splurt\code\modules\clothing\neck\_neck.dm" #include "modular_splurt\code\modules\clothing\outfits\ert.dm" +#include "modular_splurt\code\modules\clothing\outfits\standard.dm" #include "modular_splurt\code\modules\clothing\shoes\_shoes.dm" #include "modular_splurt\code\modules\clothing\shoes\magboots.dm" #include "modular_splurt\code\modules\clothing\shoes\miscellaneous.dm" @@ -4703,6 +4706,7 @@ #include "modular_splurt\code\modules\clothing\underwear\boxers.dm" #include "modular_splurt\code\modules\clothing\underwear\shirts.dm" #include "modular_splurt\code\modules\clothing\underwear\socks.dm" +#include "modular_splurt\code\modules\crafting\eyepatchhud.dm" #include "modular_splurt\code\modules\custom_loadout\first_tier.dm" #include "modular_splurt\code\modules\discord\accountlink.dm" #include "modular_splurt\code\modules\discord\discord_link_record.dm" @@ -4723,6 +4727,7 @@ #include "modular_splurt\code\modules\food_and_drinks\recipes\tablecraft\recipes_burger.dm" #include "modular_splurt\code\modules\food_and_drinks\recipes\tablecraft\recipes_donut.dm" #include "modular_splurt\code\modules\food_and_drinks\recipes\tablecraft\recipes_seafood.dm" +#include "modular_splurt\code\modules\ghostcafe\ghostvr.dm" #include "modular_splurt\code\modules\holiday\holidays.dm" #include "modular_splurt\code\modules\holodeck\holo_effect.dm" #include "modular_splurt\code\modules\hydroponics\botany_flora.dm" @@ -4753,10 +4758,13 @@ #include "modular_splurt\code\modules\keybindings\keybind\communication.dm" #include "modular_splurt\code\modules\keybindings\keybind\human.dm" #include "modular_splurt\code\modules\keybindings\keybind\movement.dm" +#include "modular_splurt\code\modules\language\language_holder.dm" #include "modular_splurt\code\modules\language\signlanguage.dm" #include "modular_splurt\code\modules\language\xenocommon.dm" #include "modular_splurt\code\modules\mapping\lavaland_jungle_gen.dm" +#include "modular_splurt\code\modules\mapping\map_template.dm" #include "modular_splurt\code\modules\mapping\mapping_helpers\baseturf.dm" +#include "modular_splurt\code\modules\mapping\modular_map_loader\modular_map_loader.dm" #include "modular_splurt\code\modules\mentor\mentor_mouse.dm" #include "modular_splurt\code\modules\mentor\mentor_verbs.dm" #include "modular_splurt\code\modules\mining\equipment\kinetic_crusher.dm" @@ -4812,7 +4820,10 @@ #include "modular_splurt\code\modules\mob\living\carbon\human\species_types\podpeople.dm" #include "modular_splurt\code\modules\mob\living\carbon\human\species_types\shadekin.dm" #include "modular_splurt\code\modules\mob\living\carbon\human\species_types\spectrebot.dm" +#include "modular_splurt\code\modules\mob\living\carbon\human\species_types\teshari.dm" #include "modular_splurt\code\modules\mob\living\carbon\human\species_types\vampire.dm" +#include "modular_splurt\code\modules\mob\living\carbon\human\species_types\vox.dm" +#include "modular_splurt\code\modules\mob\living\carbon\human\species_types\xenochimera.dm" #include "modular_splurt\code\modules\mob\living\carbon\human\species_types\zombies2.dm" #include "modular_splurt\code\modules\mob\living\silicon\silicon.dm" #include "modular_splurt\code\modules\mob\living\silicon\pai\pai.dm" @@ -4905,6 +4916,7 @@ #include "modular_splurt\code\modules\research\designs\tool_designs.dm" #include "modular_splurt\code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm" #include "modular_splurt\code\modules\research\designs\machine_designs\machine_designs_all_misc.dm" +#include "modular_splurt\code\modules\research\techweb\nodes\ballistics.dm" #include "modular_splurt\code\modules\research\techweb\nodes\biotech_nodes.dm" #include "modular_splurt\code\modules\research\techweb\nodes\bluespace_nodes.dm" #include "modular_splurt\code\modules\research\techweb\nodes\janitor_nodes.dm" @@ -4931,6 +4943,7 @@ #include "modular_splurt\code\modules\ruins\objects_and_mobs\ash_walker_den.dm" #include "modular_splurt\code\modules\ruins\objects_and_mobs\radio.dm" #include "modular_splurt\code\modules\ruins\spaceruin_code\hilbertshotel.dm" +#include "modular_splurt\code\modules\shuttle\gigab.dm" #include "modular_splurt\code\modules\shuttle\slaver.dm" #include "modular_splurt\code\modules\smithing\anvil.dm" #include "modular_splurt\code\modules\smithing\finished_items.dm" diff --git a/tools/ci/install_rust_g.sh b/tools/ci/install_rust_g.sh index 2309f9d952..c237162d8f 100755 --- a/tools/ci/install_rust_g.sh +++ b/tools/ci/install_rust_g.sh @@ -4,6 +4,6 @@ set -euo pipefail source dependencies.sh mkdir -p ~/.byond/bin -wget -O ~/.byond/bin/librust_g.so "https://github.com/tgstation/rust-g/releases/download/$RUST_G_VERSION/librust_g.so" +wget -nv -O ~/.byond/bin/librust_g.so "https://github.com/tgstation/rust-g/releases/download/$RUST_G_VERSION/librust_g.so" chmod +x ~/.byond/bin/librust_g.so ldd ~/.byond/bin/librust_g.so