Merge branch 'master' into content-stuff

This commit is contained in:
Mosley
2024-10-24 15:21:03 -05:00
36 changed files with 273242 additions and 61 deletions

View File

@@ -9,18 +9,18 @@ on:
- upstream-merge - upstream-merge
jobs: jobs:
run_linters: run_linters:
if: "!contains(github.event.head_commit.message, '[ci skip]')" if: ( !contains(github.event.head_commit.message, '[ci skip]') )
name: Run Linters name: Run Linters
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
- name: Restore SpacemanDMM cache - name: Restore SpacemanDMM cache
uses: actions/cache@v2 uses: actions/cache@v4
with: with:
path: ~/SpacemanDMM path: ~/SpacemanDMM
key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }} key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }}
- name: Restore Yarn cache - name: Restore Yarn cache
uses: actions/cache@v2 uses: actions/cache@v4
with: with:
path: tgui/.yarn/cache path: tgui/.yarn/cache
key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }} key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }}
@@ -30,7 +30,7 @@ jobs:
${{ runner.os }}- ${{ runner.os }}-
- name: Install Tools - name: Install Tools
run: | run: |
pip3 install setuptools pip3 install setuptools --upgrade
bash tools/ci/install_node.sh bash tools/ci/install_node.sh
bash tools/ci/install_spaceman_dmm.sh dreamchecker bash tools/ci/install_spaceman_dmm.sh dreamchecker
tools/bootstrap/python -c '' tools/bootstrap/python -c ''
@@ -52,13 +52,13 @@ jobs:
outputFile: output-annotations.txt outputFile: output-annotations.txt
compile_all_maps: compile_all_maps:
if: "!contains(github.event.head_commit.message, '[ci skip]')" if: ( !contains(github.event.head_commit.message, '[ci skip]') )
name: Compile Maps name: Compile Maps
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Restore BYOND cache - name: Restore BYOND cache
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: ~/BYOND path: ~/BYOND
key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }} key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }}
@@ -67,9 +67,8 @@ jobs:
bash tools/ci/install_byond.sh bash tools/ci/install_byond.sh
source $HOME/BYOND/byond/bin/byondsetup source $HOME/BYOND/byond/bin/byondsetup
tools/build/build --ci dm -DCIBUILDING -DCITESTING -DALL_MAPS tools/build/build --ci dm -DCIBUILDING -DCITESTING -DALL_MAPS
run_all_tests: run_all_tests:
if: "!contains(github.event.head_commit.message, '[ci skip]')" if: ( !contains(github.event.head_commit.message, '[ci skip]') )
name: Integration Tests name: Integration Tests
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
services: services:
@@ -81,14 +80,14 @@ jobs:
- 3306 - 3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Restore BYOND cache - name: Restore BYOND cache
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: ~/BYOND path: ~/BYOND
key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }} key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }}
- name: Restore Yarn cache - name: Restore Yarn cache
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: tgui/.yarn/cache path: tgui/.yarn/cache
key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }} key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }}
@@ -116,15 +115,14 @@ jobs:
source $HOME/BYOND/byond/bin/byondsetup source $HOME/BYOND/byond/bin/byondsetup
tools/build/build --ci -DCIBUILDING tools/build/build --ci -DCIBUILDING
bash tools/ci/run_server.sh bash tools/ci/run_server.sh
test_windows: test_windows:
if: "!contains(github.event.head_commit.message, '[ci skip]')" if: ( !contains(github.event.head_commit.message, '[ci skip]') )
name: Windows Build name: Windows Build
runs-on: windows-latest runs-on: windows-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Restore Yarn cache - name: Restore Yarn cache
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: tgui/.yarn/cache path: tgui/.yarn/cache
key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }} key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }}
@@ -141,7 +139,7 @@ jobs:
md deploy md deploy
bash tools/deploy.sh ./deploy bash tools/deploy.sh ./deploy
- name: Deploy artifact - name: Deploy artifact
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v4
with: with:
name: deploy name: deploy
path: deploy path: deploy

View File

@@ -8,9 +8,9 @@ jobs:
if: "!contains(github.event.head_commit.message, '[ci skip]')" if: "!contains(github.event.head_commit.message, '[ci skip]')"
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Setup cache - name: Setup cache
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: ~/SpacemanDMM path: ~/SpacemanDMM
key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }} key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }}

View File

@@ -11,7 +11,7 @@ jobs:
name: Update the TGS DMAPI name: Update the TGS DMAPI
steps: steps:
- name: Clone - name: Clone
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Branch - name: Branch
run: | run: |

1
_maps/4nalstation.dm Normal file
View File

@@ -0,0 +1 @@
#define FORCE_MAP "_maps/4nalstation.json"

30
_maps/4nalstation.json Normal file
View File

@@ -0,0 +1,30 @@
{
"version": 1,
"map_name": "4Nal Station",
"map_path": "splurt_maps/map_files/4Nalstation",
"map_file": "4NaL_Station.dmm",
"shuttles": {
"cargo": "cargo_box",
"ferry": "ferry_fancy",
"whiteship": "whiteship_fournal",
"emergency": "emergency_fournal"
},
"traits": [
{
"Up": 1,
"Baseturf": "/turf/open/openspace",
"Linkage": "Cross"
},
{
"Up": 1,
"Down": -1,
"Baseturf": "/turf/open/openspace",
"Linkage": "Cross"
},
{
"Down": -1,
"Baseturf": "/turf/open/openspace",
"Linkage": "Cross"
}
]
}

View File

@@ -18,6 +18,7 @@
#include "map_files\SyndicateStation\SyndicateBoxStation.dmm" #include "map_files\SyndicateStation\SyndicateBoxStation.dmm"
#include "splurt_maps\map_files\Smexistation\Snaxi_Splurt.dmm" #include "splurt_maps\map_files\Smexistation\Snaxi_Splurt.dmm"
#include "map_files\BoxedInStation\BoxedInStation.dmm" #include "map_files\BoxedInStation\BoxedInStation.dmm"
#include "splurt_maps\map_files\4Nalstation\4Nal_station.dmm"
#ifdef CIBUILDING #ifdef CIBUILDING
#include "templates.dm" #include "templates.dm"

View File

@@ -0,0 +1,500 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/template_noop,
/area/template_noop)
"b" = (
/obj/machinery/light/small,
/obj/structure/closet/emcloset,
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"e" = (
/obj/structure/chair/comfy/shuttle,
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"f" = (
/obj/structure/window/shuttle,
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"g" = (
/obj/structure/chair/comfy/shuttle{
dir = 4
},
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"h" = (
/obj/machinery/requests_console{
department = "Arrival shuttle";
name = "Arrivals Shuttle console"
},
/turf/closed/wall/mineral/titanium,
/area/shuttle/arrival)
"i" = (
/obj/docking_port/mobile/arrivals{
dir = 1;
dwidth = 1;
height = 32;
name = "fournal arrivals shuttle";
width = 9
},
/obj/structure/shuttle/engine/propulsion,
/turf/open/space/basic,
/area/shuttle/arrival)
"j" = (
/obj/machinery/computer{
dir = 4;
name = "Shuttle computer"
},
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"k" = (
/obj/machinery/computer{
dir = 8;
name = "Shuttle computer"
},
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"m" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/arrival)
"n" = (
/obj/structure/closet/wardrobe/white,
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"o" = (
/obj/machinery/door/airlock/shuttle{
name = "Arrival Shuttle Airlock"
},
/obj/structure/fans/tiny,
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"p" = (
/obj/machinery/light/small,
/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"r" = (
/obj/structure/chair/comfy/shuttle{
dir = 1
},
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"u" = (
/obj/machinery/holopad,
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"v" = (
/obj/effect/spawner/structure/window/shuttle,
/obj/structure/grille,
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"x" = (
/obj/structure/closet/wardrobe/mixed,
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"y" = (
/obj/machinery/door/airlock/shuttle{
name = "Arrival Shuttle Airlock"
},
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"z" = (
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"A" = (
/obj/machinery/status_display/evac,
/turf/closed/wall/mineral/titanium,
/area/shuttle/arrival)
"B" = (
/obj/structure/chair/comfy/shuttle{
dir = 8
},
/obj/machinery/light{
dir = 4
},
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"F" = (
/obj/structure/shuttle/engine/heater,
/turf/closed/wall/mineral/titanium,
/area/shuttle/arrival)
"G" = (
/obj/structure/extinguisher_cabinet{
pixel_x = 26
},
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"I" = (
/obj/structure/shuttle/engine/propulsion,
/turf/open/space/basic,
/area/shuttle/arrival)
"J" = (
/obj/machinery/computer{
dir = 2;
name = "Shuttle computer"
},
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"M" = (
/obj/structure/chair/comfy/shuttle{
desc = "A comfortable looking seat that's clearly an upgrade for a Captain.";
dir = 1;
name = "Captain's Chair"
},
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"N" = (
/obj/structure/chair/comfy/shuttle{
dir = 8
},
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"Q" = (
/obj/machinery/vending/wallmed{
name = "Emergency NanoMed";
use_power = 0
},
/turf/closed/wall/mineral/titanium,
/area/shuttle/arrival)
"R" = (
/obj/structure/closet/emcloset,
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"T" = (
/obj/structure/table/reinforced,
/obj/item/storage/secure/briefcase{
pixel_x = -2;
pixel_y = 4
},
/obj/item/storage/toolbox/emergency,
/obj/machinery/light{
dir = 8
},
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"U" = (
/obj/machinery/status_display/ai,
/turf/closed/wall/mineral/titanium,
/area/shuttle/arrival)
"V" = (
/obj/structure/table/reinforced,
/obj/item/storage/dice,
/obj/machinery/light{
dir = 8
},
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
"X" = (
/obj/structure/extinguisher_cabinet{
pixel_x = -25
},
/turf/open/floor/oldshuttle,
/area/shuttle/arrival)
(1,1,1) = {"
a
a
a
a
a
m
m
m
m
m
m
a
a
a
a
a
a
m
m
m
a
a
a
a
a
a
a
a
a
a
a
a
"}
(2,1,1) = {"
a
a
m
m
m
m
V
g
g
T
m
m
a
a
a
a
m
m
m
m
m
a
a
a
a
a
a
a
a
a
F
i
"}
(3,1,1) = {"
a
v
m
b
Q
X
z
z
z
z
r
m
m
a
m
m
m
m
a
a
m
m
a
a
a
a
a
a
a
m
F
I
"}
(4,1,1) = {"
v
v
j
z
A
z
N
N
N
z
z
x
m
m
m
m
m
a
a
a
m
m
a
a
a
a
a
a
m
F
I
a
"}
(5,1,1) = {"
v
J
M
z
y
z
f
f
f
e
u
z
R
m
m
a
a
a
a
a
a
m
m
a
a
a
a
a
F
I
a
a
"}
(6,1,1) = {"
v
v
k
z
U
z
g
g
g
z
z
n
m
m
a
a
a
a
a
a
a
m
m
a
a
a
a
m
m
a
a
a
"}
(7,1,1) = {"
a
v
m
p
h
G
z
z
z
z
r
m
m
a
a
a
a
a
a
a
a
a
m
m
m
a
m
m
a
a
a
a
"}
(8,1,1) = {"
a
a
m
m
m
m
B
z
z
B
m
m
a
a
a
a
a
a
a
a
a
a
a
m
m
m
m
a
a
a
a
a
"}
(9,1,1) = {"
a
a
a
a
a
m
m
o
o
m
m
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -91,7 +91,11 @@
. = 1 . = 1
//Please don't roast me too hard //Please don't roast me too hard
//Oh don't worry, We Will.
/client/MouseMove(object, location, control, params) /client/MouseMove(object, location, control, params)
if(!COOLDOWN_FINISHED(src, next_mousemove))
return
COOLDOWN_START(src, next_mousemove, 0) //COOLDOWN_FINISHED() sees the world tick and cooldown timer being equal as a state wherein the cooldown has not finished. So the cooldown timer here is 0 to throttle only for the rest of the tick.
mouseParams = params mouseParams = params
mouse_location_ref = WEAKREF(location) mouse_location_ref = WEAKREF(location)
mouse_object_ref = WEAKREF(object) mouse_object_ref = WEAKREF(object)
@@ -105,6 +109,9 @@
..() ..()
/client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params) /client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params)
if(!COOLDOWN_FINISHED(src, next_mousedrag))
return
COOLDOWN_START(src, next_mousedrag, 0) //See comment in MouseMove() for why this is 0.
mouseParams = params mouseParams = params
mouse_location_ref = WEAKREF(over_location) mouse_location_ref = WEAKREF(over_location)
mouse_object_ref = WEAKREF(over_object) mouse_object_ref = WEAKREF(over_object)

View File

@@ -348,5 +348,7 @@
/datum/config_entry/str_list/randomizing_station_name_message /datum/config_entry/str_list/randomizing_station_name_message
default = list() default = list()
/datum/config_entry/flag/toast_notification_on_init
/// Gives the ability to send players a maptext popup. /// Gives the ability to send players a maptext popup.
/datum/config_entry/flag/popup_admin_pm /datum/config_entry/flag/popup_admin_pm

View File

@@ -223,6 +223,10 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
// Sort subsystems by display setting for easy access. // Sort subsystems by display setting for easy access.
sortTim(subsystems, GLOBAL_PROC_REF(cmp_subsystem_display)) sortTim(subsystems, GLOBAL_PROC_REF(cmp_subsystem_display))
if(world.system_type == MS_WINDOWS && CONFIG_GET(flag/toast_notification_on_init) && !length(GLOB.clients))
world.shelleo("start /min powershell -ExecutionPolicy Bypass -File tools/initToast/initToast.ps1 -name \"[world.name]\" -icon %CD%\\icons\\ui_icons\\common\\tg_16.png -port [world.port]")
// Set world options. // Set world options.
world.change_fps(CONFIG_GET(number/fps)) world.change_fps(CONFIG_GET(number/fps))
var/initialized_tod = REALTIMEOFDAY var/initialized_tod = REALTIMEOFDAY

View File

@@ -668,6 +668,7 @@ RLD
icon_state = "arcd" icon_state = "arcd"
item_state = "oldrcd" item_state = "oldrcd"
has_ammobar = FALSE has_ammobar = FALSE
upgrade = TRUE
// RAPID LIGHTING DEVICE // RAPID LIGHTING DEVICE

View File

@@ -6,10 +6,12 @@
can_unwrench = TRUE can_unwrench = TRUE
construction_type = /obj/item/pipe/binary construction_type = /obj/item/pipe/binary
interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE
pipe_state = "relief_valve-t"
shift_underlay_only = FALSE
var/opened = FALSE var/opened = FALSE
var/open_pressure = ONE_ATMOSPHERE * 3 var/open_pressure = ONE_ATMOSPHERE * 3
var/close_pressure = ONE_ATMOSPHERE var/close_pressure = ONE_ATMOSPHERE
pipe_state = "relief_valve-t"
/obj/machinery/atmospherics/components/binary/relief_valve/layer1 /obj/machinery/atmospherics/components/binary/relief_valve/layer1
piping_layer = PIPING_LAYER_MIN piping_layer = PIPING_LAYER_MIN

View File

@@ -24,11 +24,13 @@
return ..() return ..()
/obj/machinery/atmospherics/components/unary/portables_connector/update_icon_nopipes() /obj/machinery/atmospherics/components/unary/portables_connector/update_icon_nopipes()
icon_state = "connector" cut_overlays()
if(showpipe) if(showpipe)
var/image/cap = getpipeimage(icon, "connector_cap", initialize_directions, piping_layer = piping_layer) var/image/cap = getpipeimage(icon, "connector_cap", initialize_directions, piping_layer = piping_layer)
add_overlay(cap) add_overlay(cap)
icon_state = "connector"
/obj/machinery/atmospherics/components/unary/portables_connector/process_atmos() /obj/machinery/atmospherics/components/unary/portables_connector/process_atmos()
if(!connected_device) if(!connected_device)
return return
@@ -37,7 +39,7 @@
/obj/machinery/atmospherics/components/unary/portables_connector/can_unwrench(mob/user) /obj/machinery/atmospherics/components/unary/portables_connector/can_unwrench(mob/user)
. = ..() . = ..()
if(. && connected_device) if(. && connected_device)
to_chat(user, "<span class='warning'>You cannot unwrench [src], detach [connected_device] first!</span>") to_chat(user, span_warning("You cannot unwrench [src], detach [connected_device] first!"))
return FALSE return FALSE
/obj/machinery/atmospherics/components/unary/portables_connector/portableConnectorReturnAir() /obj/machinery/atmospherics/components/unary/portables_connector/portableConnectorReturnAir()

View File

@@ -189,3 +189,7 @@
/// AFK tracking /// AFK tracking
var/last_activity = 0 var/last_activity = 0
/// The next point in time at which the client is allowed to send a mousemove() or mousedrag()
COOLDOWN_DECLARE(next_mousemove)
COOLDOWN_DECLARE(next_mousedrag)

View File

@@ -356,7 +356,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
///loadout stuff ///loadout stuff
var/gear_points = 10 var/gear_points = 10
var/list/gear_categories var/list/gear_categories
var/list/loadout_data = list() var/list/loadout_data
var/list/unlockable_loadout_data = list() var/list/unlockable_loadout_data = list()
var/loadout_slot = 1 //goes from 1 to MAXIMUM_LOADOUT_SAVES var/loadout_slot = 1 //goes from 1 to MAXIMUM_LOADOUT_SAVES
var/gear_category var/gear_category
@@ -533,7 +533,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
//calculate your gear points from the chosen item //calculate your gear points from the chosen item
gear_points = CONFIG_GET(number/initial_gear_points) gear_points = CONFIG_GET(number/initial_gear_points)
var/list/chosen_gear = loadout_data["SAVE_[loadout_slot]"] var/list/chosen_gear = loadout_data["SAVE_[loadout_slot]"]
if(chosen_gear) if(islist(chosen_gear))
loadout_errors = 0 loadout_errors = 0
for(var/loadout_item in chosen_gear) for(var/loadout_item in chosen_gear)
var/loadout_item_path = loadout_item[LOADOUT_ITEM] var/loadout_item_path = loadout_item[LOADOUT_ITEM]
@@ -1229,6 +1229,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "</tr></table>" dat += "</tr></table>"
if(LOADOUT_CHAR_TAB) if(LOADOUT_CHAR_TAB)
dat += "<table align='center' width='100%'>" dat += "<table align='center' width='100%'>"
dat += "<tr><td colspan=4><center><b>Loadout slot</b></center></td></tr>"
dat += "<tr><td colspan=4><center>"
for(var/iteration in 1 to MAXIMUM_LOADOUT_SAVES)
dat += "<a [loadout_slot == iteration ? "class='linkOn'" : "href='?_src_=prefs;preference=gear;select_slot=[iteration]'"]>[iteration]</a>"
dat += "</center></td></tr>"
dat += "<tr><td colspan=4><center><i style=\"color: grey;\">You can only choose one item per category, unless it's an item that spawns in your backpack or hands.</center></td></tr>" dat += "<tr><td colspan=4><center><i style=\"color: grey;\">You can only choose one item per category, unless it's an item that spawns in your backpack or hands.</center></td></tr>"
dat += "<tr><td colspan=4><center><b>" dat += "<tr><td colspan=4><center><b>"
@@ -4148,6 +4153,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
qdel(offer_datum) qdel(offer_datum)
if(href_list["preference"] == "gear") if(href_list["preference"] == "gear")
if(href_list["select_slot"])
var/chosen = text2num(href_list["select_slot"])
if(!chosen)
return
chosen = floor(chosen)
if(chosen > MAXIMUM_LOADOUT_SAVES || chosen < 1)
return
loadout_slot = chosen
if(href_list["clear_loadout"]) if(href_list["clear_loadout"])
loadout_data["SAVE_[loadout_slot]"] = list() loadout_data["SAVE_[loadout_slot]"] = list()
save_preferences() save_preferences()

View File

@@ -1122,7 +1122,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
belly_prefs = json_from_file["belly_prefs"] belly_prefs = json_from_file["belly_prefs"]
//gear loadout //gear loadout
if(S["loadout"]) if(istext(S["loadout"]))
loadout_data = safe_json_decode(S["loadout"]) loadout_data = safe_json_decode(S["loadout"])
var/list/sanitize_current_slot = loadout_data["SAVE_[loadout_slot]"] var/list/sanitize_current_slot = loadout_data["SAVE_[loadout_slot]"]
if(LAZYLEN(sanitize_current_slot)) if(LAZYLEN(sanitize_current_slot))
@@ -1150,6 +1150,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
loadout_data["SAVE_[loadout_slot]"] = list() loadout_data["SAVE_[loadout_slot]"] = list()
else else
loadout_data = list() loadout_data = list()
//let's remember their last used slot, i'm sure "oops i brought the wrong stuff" will be an issue now
S["loadout_slot"] >> loadout_slot
//try to fix any outdated data if necessary //try to fix any outdated data if necessary
//preference updating will handle saving the updated data for us. //preference updating will handle saving the updated data for us.
@@ -1384,6 +1386,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["pregnancy_inflation"] >> pregnancy_inflation S["pregnancy_inflation"] >> pregnancy_inflation
S["pregnancy_breast_growth"] >> pregnancy_breast_growth S["pregnancy_breast_growth"] >> pregnancy_breast_growth
//SPLURT EDIT END //SPLURT EDIT END
loadout_slot = sanitize_num_clamp(loadout_slot, 1, MAXIMUM_LOADOUT_SAVES, 1, TRUE)
cit_character_pref_load(S) cit_character_pref_load(S)
@@ -1628,10 +1632,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//SPLURT EDIT END //SPLURT EDIT END
//gear loadout //gear loadout
if(length(loadout_data)) if(islist(loadout_data))
S["loadout"] << safe_json_encode(loadout_data) S["loadout"] << safe_json_encode(loadout_data)
else else
S["loadout"] << safe_json_encode(list()) S["loadout"] << safe_json_encode(list())
WRITE_FILE(S["loadout_slot"], loadout_slot)
if(length(tcg_cards)) if(length(tcg_cards))
S["tcg_cards"] << safe_json_encode(tcg_cards) S["tcg_cards"] << safe_json_encode(tcg_cards)

View File

@@ -13,28 +13,40 @@
. = ..() . = ..()
AddComponent(/datum/component/plumbing/simple_supply, bolt) AddComponent(/datum/component/plumbing/simple_supply, bolt)
/obj/machinery/plumbing/grinder_chemical/can_be_rotated(mob/user,rotation_type) /obj/machinery/plumbing/grinder_chemical/examine(mob/user)
. = ..()
. += span_notice("The input direction for this item can be rotated by using CTRL+SHIFT+CLICK")
/obj/machinery/plumbing/grinder_chemical/CtrlShiftClick(mob/user)
if(anchored) if(anchored)
to_chat(user, "<span class='warning'>It is fastened to the floor!</span>") to_chat(user, "<span class='warning'>It is fastened to the floor!</span>")
return FALSE return FALSE
switch(eat_dir) switch(eat_dir)
if(WEST) if(WEST)
balloon_alert(user, "set to north")
eat_dir = NORTH eat_dir = NORTH
return TRUE return TRUE
if(EAST) if(EAST)
balloon_alert(user, "set to south")
eat_dir = SOUTH eat_dir = SOUTH
return TRUE return TRUE
if(NORTH) if(NORTH)
balloon_alert(user, "set to east")
eat_dir = EAST eat_dir = EAST
return TRUE return TRUE
if(SOUTH) if(SOUTH)
balloon_alert(user, "set to west")
eat_dir = WEST eat_dir = WEST
return TRUE return TRUE
return TRUE
/obj/machinery/plumbing/grinder_chemical/CanAllowThrough(atom/movable/AM) /obj/machinery/plumbing/grinder_chemical/CanAllowThrough(atom/movable/AM)
. = ..() . = ..()
if(!anchored) if(!anchored)
return return
var/move_dir = get_dir(loc, AM.loc) var/move_dir = get_dir(loc, AM.loc)
if(move_dir == eat_dir) if(move_dir == eat_dir)
return TRUE return TRUE
@@ -61,4 +73,8 @@
return return
I.on_grind() I.on_grind()
reagents.add_reagent_list(I.grind_results) reagents.add_reagent_list(I.grind_results)
if(I.reagents) //If the thing has any reagents inside of it, grind them up.
I.reagents.trans_to(reagents, I.reagents.total_volume)
qdel(I) qdel(I)

View File

@@ -307,7 +307,7 @@
dwidth = 11 dwidth = 11
height = 22 height = 22
width = 35 width = 35
shuttlekeys = list("whiteship_meta", "whiteship_pubby", "whiteship_box", "whiteship_cere", "whiteship_kilo", "whiteship_donut", "whiteship_delta") shuttlekeys = list("whiteship_meta", "whiteship_pubby", "whiteship_box", "whiteship_cere", "whiteship_kilo", "whiteship_donut", "whiteship_delta", "whiteship_fournal")
/obj/docking_port/stationary/picked /obj/docking_port/stationary/picked
///Holds a list of map name strings for the port to pick from ///Holds a list of map name strings for the port to pick from
@@ -329,7 +329,7 @@
dwidth = 11 dwidth = 11
height = 22 height = 22
width = 35 width = 35
shuttlekeys = list("whiteship_meta", "whiteship_pubby", "whiteship_box", "whiteship_cere", "whiteship_kilo", "whiteship_donut", "whiteship_delta") shuttlekeys = list("whiteship_meta", "whiteship_pubby", "whiteship_box", "whiteship_cere", "whiteship_kilo", "whiteship_donut", "whiteship_delta", "whiteship_fournal")
/obj/docking_port/mobile /obj/docking_port/mobile
name = "shuttle" name = "shuttle"

View File

@@ -543,3 +543,7 @@ RANDOMIZING_STATION_NAME_MESSAGE %NEW_STATION_NAME%? %NEW_STATION_NAME%! %NEW_ST
RANDOMIZING_STATION_NAME_MESSAGE A popular social network application had already claimed the trademark of %CURRENT_STATION_NAME%, the station has been renamed to %NEW_STATION_NAME%. RANDOMIZING_STATION_NAME_MESSAGE A popular social network application had already claimed the trademark of %CURRENT_STATION_NAME%, the station has been renamed to %NEW_STATION_NAME%.
RANDOMIZING_STATION_NAME_MESSAGE We're pulling a prank on %RANDOM_CREWMEMBER%, so we've changed the station's name to %NEW_STATION_NAME%. RANDOMIZING_STATION_NAME_MESSAGE We're pulling a prank on %RANDOM_CREWMEMBER%, so we've changed the station's name to %NEW_STATION_NAME%.
RANDOMIZING_STATION_NAME_MESSAGE %RANDOM_NAME% made us change the station name, which is now %NEW_STATION_NAME%. RANDOMIZING_STATION_NAME_MESSAGE %RANDOM_NAME% made us change the station name, which is now %NEW_STATION_NAME%.
## Comment to disable sending a toast notification on the host server when initializations complete.
## Even if this is enabled, a notification will only be sent if there are no clients connected.
TOAST_NOTIFICATION_ON_INIT

View File

@@ -8,14 +8,15 @@ export BYOND_MAJOR=515
export BYOND_MINOR=1634 export BYOND_MINOR=1634
#rust_g git tag #rust_g git tag
export RUST_G_VERSION=3.0.0 export RUST_G_VERSION=3.3.0
#node version #node version
export NODE_VERSION=16 export NODE_VERSION_LTS=20.13.0
export NODE_VERSION_PRECISE=16.13.1 # compatiblility mode MUST work with windows 7
export NODE_VERSION_COMPAT=20.2.0
# SpacemanDMM git tag # SpacemanDMM git tag
export SPACEMAN_DMM_VERSION=suite-1.8 export SPACEMAN_DMM_VERSION=suite-1.9
# Python version for mapmerge and other tools # Python version for mapmerge and other tools
export PYTHON_VERSION=3.9.0 export PYTHON_VERSION=3.9.0

View File

@@ -17,3 +17,8 @@
2024-10-16: 2024-10-16:
cyfause: cyfause:
- bugfix: allow facial hair on anthromorph species - bugfix: allow facial hair on anthromorph species
2024-10-24:
Sara:
- rscadd: Added a full new station.
- rscadd: Added new shuttles, arrival, escape, and whiteship.
- rscadd: Added new lore page for the station.

Binary file not shown.

After

Width:  |  Height:  |  Size: 795 B

View File

@@ -12,3 +12,18 @@
description = "An evacuation ship formerly used by NT SOCOM Divisions, it's long since been outclassed, de-milled, and cast aside as an evacuation ship for when a shuttle is in very, very plausible danger. It's not the best, but almost nothing can make it worse." description = "An evacuation ship formerly used by NT SOCOM Divisions, it's long since been outclassed, de-milled, and cast aside as an evacuation ship for when a shuttle is in very, very plausible danger. It's not the best, but almost nothing can make it worse."
credit_cost = 7500 credit_cost = 7500
admin_notes = "Built with a lot of fans and RWalls to resist bombing and atmospheric attacks. Might be a bit large for certain stations." admin_notes = "Built with a lot of fans and RWalls to resist bombing and atmospheric attacks. Might be a bit large for certain stations."
/datum/map_template/shuttle/arrival/fournal
suffix = "fournal"
name = "arrival shuttle (fournal)"
/datum/map_template/shuttle/whiteship/fournal
suffix = "fournal"
name = "KnotTailus"
/datum/map_template/shuttle/emergency/fournal
suffix = "fournal"
name = "The DreadKnotted"
description = "Cere's taller but lankier cousin, this is more an art peice included when we got our advanced location, big, 'stylish', and well stocked."
admin_notes = "Seriously big, even larger than the Delta shuttle, and probably will get a few groans."
credit_cost = 10000

View File

@@ -9,3 +9,11 @@
/area/engineering/break_room/atmos /area/engineering/break_room/atmos
name = "Atmospherics Break Room" name = "Atmospherics Break Room"
/area/ruin/powered/ylva
name = "Tower of Ylva"
icon_state = "purple"
/area/ruin/unpowered/ylvaturf
name = "Ylva Outskirts"
icon_state = "spacecontent26"

View File

@@ -0,0 +1,9 @@
/turf/open/floor/plasteel/dark/texcorner
icon = 'modular_splurt/icons/turf/floors.dmi'
icon_state = "textured_darkcorner"
base_icon_state = "textured_darkcorner"
/turf/open/floor/plasteel/hallway
icon = 'icons/turf/floors.dmi'
icon_state = "hallway_floor"
base_icon_state = "hallway_floor"

View File

@@ -0,0 +1,22 @@
/obj/item/paper/fluff/instaloss_regret
name = "Semen and femcum stained note"
info = {""<b>—3rd—</b>
I finally got all the materials together, had to steal most of them from that witch everyone loves, but I did. Today's the day that I perform my first summoning. I think I will go for a low-class cubus, probably of the suc variety, after all a sexy, busty lady such as I can't be tempted by a lowly whore!
<br><br>
<b>—7th—</b>
I was wrong... It appears using that witch's reagents changed the result, something obvious in hindsight... along with assuming that I could control a cubus... I ended up calling a hellhound cubus, it finally left a few hours ago, but with the swell of my belly and the leak of my breast I fear it left a gift... I dare not leave this room for now, as my reputation would be ruined, I'll just let this pass... at least their type seem to gestate fast.
<br><br>
<b>—26th—</b>
He's back, come for his child like any caring father, and seems to be here for me as well, I'm not even sure I want to resist, my knees shake, my heart quickens, and I go slicker than snowmelt in his presence..."
<br>
<br><br>
Most of the rest of the note is illegible, smeared ink, off-white stains, and worse smudge it. On the back remains a single note in a different script, seemingly burned in with exactness rather than inked.
<br><br>
'I will help you, you bratty child, even if I believe you deserve such a fate for stealing from my poor student...
<br>
<br><br>
<i>~Ylva, Chosen of the Wilds Near and Far'</i>"}
/obj/item/paper/fluff/fournal_lore
name = "Placeholder"
info = {"Placeholder until I get time to lore"}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -4685,6 +4685,7 @@
#include "modular_splurt\code\game\turfs\simulated\chasm.dm" #include "modular_splurt\code\game\turfs\simulated\chasm.dm"
#include "modular_splurt\code\game\turfs\simulated\floor\fancy_floor.dm" #include "modular_splurt\code\game\turfs\simulated\floor\fancy_floor.dm"
#include "modular_splurt\code\game\turfs\simulated\floor\mineral_floor.dm" #include "modular_splurt\code\game\turfs\simulated\floor\mineral_floor.dm"
#include "modular_splurt\code\game\turfs\simulated\floor\plasteel_floor.dm"
#include "modular_splurt\code\game\turfs\simulated\floor\plating\asteroid.dm" #include "modular_splurt\code\game\turfs\simulated\floor\plating\asteroid.dm"
#include "modular_splurt\code\game\turfs\simulated\wall\mineral_walls.dm" #include "modular_splurt\code\game\turfs\simulated\wall\mineral_walls.dm"
#include "modular_splurt\code\game\turfs\simulated\wall\misc_walls.dm" #include "modular_splurt\code\game\turfs\simulated\wall\misc_walls.dm"
@@ -5014,6 +5015,7 @@
#include "modular_splurt\code\modules\mob\living\simple_animal\hostile\werewolves\icewolf.dm" #include "modular_splurt\code\modules\mob\living\simple_animal\hostile\werewolves\icewolf.dm"
#include "modular_splurt\code\modules\mob\living\simple_animal\hostile\werewolves\themosley.dm" #include "modular_splurt\code\modules\mob\living\simple_animal\hostile\werewolves\themosley.dm"
#include "modular_splurt\code\modules\mob\living\simple_animal\hostile\werewolves\werewolf.dm" #include "modular_splurt\code\modules\mob\living\simple_animal\hostile\werewolves\werewolf.dm"
#include "modular_splurt\code\modules\paperwork\4nal_paperwork.dm"
#include "modular_splurt\code\modules\paperwork\pen.dm" #include "modular_splurt\code\modules\paperwork\pen.dm"
#include "modular_splurt\code\modules\power\cell.dm" #include "modular_splurt\code\modules\power\cell.dm"
#include "modular_splurt\code\modules\power\reactor\fluffed.dm" #include "modular_splurt\code\modules\power\reactor\fluffed.dm"

View File

@@ -16,13 +16,13 @@ if [ "$TG_BOOTSTRAP_CACHE" ]; then
fi fi
OldPWD="$PWD" OldPWD="$PWD"
cd "$Bootstrap/../.." cd "$Bootstrap/../.."
. ./dependencies.sh # sets NODE_VERSION_PRECISE . ./dependencies.sh # sets NODE_VERSION_LTS
cd "$OldPWD" cd "$OldPWD"
NodeVersion="$NODE_VERSION_PRECISE" NodeVersion="$NODE_VERSION_LTS"
NodeFullVersion="node-v$NodeVersion-win-x64" NodeFullVersion="node-v$NodeVersion-win-x64"
NodeDir="$Cache/$NodeFullVersion" NodeDir="$Cache/$NodeFullVersion"
NodeExe="$NodeDir/node.exe" NodeExe="$NodeDir/node.exe"
Log="$Cache/last-command.log" is_vendored="1"
# If a bootstrapped Node is not present, search on $PATH. # If a bootstrapped Node is not present, search on $PATH.
if [ "$(uname)" = "Linux" ] || [ ! -f "$NodeExe" ]; then if [ "$(uname)" = "Linux" ] || [ ! -f "$NodeExe" ]; then
@@ -39,6 +39,7 @@ if [ "$(uname)" = "Linux" ] || [ ! -f "$NodeExe" ]; then
fi fi
elif command -v node >/dev/null 2>&1; then elif command -v node >/dev/null 2>&1; then
NodeExe="node" NodeExe="node"
is_vendored="0"
else else
echo echo
if command -v apt-get >/dev/null 2>&1; then if command -v apt-get >/dev/null 2>&1; then
@@ -62,23 +63,11 @@ if [ "$(uname)" = "Linux" ] || [ ! -f "$NodeExe" ]; then
fi fi
fi fi
# Cheap shell function if tee.exe is not available
if ! command -v tee >/dev/null 2>&1; then
tee() {
# Fudge: assume $1 is always "-a"
while read -r line; do
echo "$line" >> "$2"
echo "$line"
done
}
fi
# Invoke Node with all command-line arguments # Invoke Node with all command-line arguments
mkdir -p "$Cache" if [ "$is_vendored" = "1" ]; then
printf '%s\n' "$NodeExe" "$@" > "$Log" PATH="$(readlink -f "$NodeDir"):$PATH"
printf -- '---\n' >> "$Log" echo "Using vendored Node $("$NodeExe" --version)"
exec 4>&1 else
PATH="$(readlink -f "$NodeDir"):$PATH" # Set PATH so that recursive calls find it echo "Using system-wide Node $("$NodeExe" --version)"
exitstatus=$({ { set +e; "$NodeExe" "$@" 2>&1 3>&-; printf %s $? >&3; } 4>&- | tee -a "$Log" 1>&4; } 3>&1) fi
exec 4>&- exec "$NodeExe" "$@"
exit "$exitstatus"

View File

@@ -29,7 +29,16 @@ $Cache = "$BaseDir\.cache"
if ($Env:TG_BOOTSTRAP_CACHE) { if ($Env:TG_BOOTSTRAP_CACHE) {
$Cache = $Env:TG_BOOTSTRAP_CACHE $Cache = $Env:TG_BOOTSTRAP_CACHE
} }
$NodeVersion = Extract-Variable -Path "$BaseDir\..\..\dependencies.sh" -Key "NODE_VERSION_PRECISE" # Get OS version
$OSMajor = (Get-WmiObject -Class Win32_OperatingSystem).Version.Split(".")[0]
# Set Node version based on OS version
if ($OSMajor -lt 10) {
# Anything under Windows 10
$NodeVersion = Extract-Variable -Path "$BaseDir\..\..\dependencies.sh" -Key "NODE_VERSION_COMPAT"
}
else {
$NodeVersion = Extract-Variable -Path "$BaseDir\..\..\dependencies.sh" -Key "NODE_VERSION_LTS"
}
$NodeSource = "https://nodejs.org/download/release/v$NodeVersion/win-x64/node.exe" $NodeSource = "https://nodejs.org/download/release/v$NodeVersion/win-x64/node.exe"
$NodeTargetDir = "$Cache\node-v$NodeVersion-x64" $NodeTargetDir = "$Cache\node-v$NodeVersion-x64"
$NodeTarget = "$NodeTargetDir\node.exe" $NodeTarget = "$NodeTargetDir\node.exe"

View File

@@ -5,6 +5,6 @@ source dependencies.sh
if [[ -e ~/.nvm/nvm.sh ]]; then if [[ -e ~/.nvm/nvm.sh ]]; then
source ~/.nvm/nvm.sh source ~/.nvm/nvm.sh
nvm install $NODE_VERSION nvm install $NODE_VERSION_COMPAT
nvm use $NODE_VERSION nvm use $NODE_VERSION_COMPAT
fi fi

View File

@@ -0,0 +1,32 @@
param([string]$name, [string]$icon, [Int32]$port=80)
$hkcu = [Microsoft.Win32.RegistryKey]::OpenBaseKey('CurrentUser','default')
$amuid_hkey = $hkcu.CreateSubKey('SOFTWARE\Classes\AppUserModelId\Tgstation.Tgstation', $true, [Microsoft.Win32.RegistryOptions]::Volatile)
if ($name) { $amuid_hkey.SetValue('DisplayName', $name) }
if ($icon) { $amuid_hkey.SetValue('IconUri', $icon) }
[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null
$notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('Tgstation.Tgstation')
[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom, ContentType = WindowsRuntime] > $null
$xml = New-Object Windows.Data.Xml.Dom.XmlDocument
$xml.LoadXml(@"
<toast>
<visual>
<binding template="ToastGeneric">
<text>Initialization Complete</text>
</binding>
</visual>
<actions>
<action content="Launch Dream Seeker" activationType="protocol" arguments="byond://127.0.0.1:$port"/>
</actions>
</toast>
"@)
[Windows.UI.Notifications.ToastNotification, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null
$toast = New-Object Windows.UI.Notifications.ToastNotification $xml
$notifier.Show($toast)

View File

@@ -1,5 +1,5 @@
pygit2==1.11.1 pygit2==1.11.1
bidict==0.22.0 bidict==0.22.1
Pillow==10.3.0 Pillow==10.3.0
# changelogs # changelogs