Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
388 commits
Select commit Hold shift + click to select a range
5497848
Fix commands sending before lot state, and free roam desync
riperiperi Jan 28, 2026
4cba8a3
Fix time being initially incorrect when joining a property
riperiperi Jan 28, 2026
f27afce
Fix some visual bugs with particle shaders
riperiperi Jan 28, 2026
96fddc1
Keep world scroll anchor over lot transitions
riperiperi Jan 29, 2026
c8e5048
WIP surround puppets
riperiperi Jan 30, 2026
9d48e6b
More work on puppets
riperiperi Jan 30, 2026
48e9fe9
Avoid crash before lot loads
riperiperi Jan 30, 2026
b7c6b32
Fix some more oversights
riperiperi Jan 30, 2026
dfe1a18
Some more puppet fixes
riperiperi Jan 30, 2026
f8beb80
Fix leftovers when sims leave a property
riperiperi Jan 30, 2026
4556340
Don't update puppets when a lot is still loading
riperiperi Jan 30, 2026
433f567
Indexer mistake...
riperiperi Jan 30, 2026
a3857e2
Add leaving special flag
riperiperi Jan 30, 2026
5e608c8
Make a little more resilient to missing animation name
riperiperi Jan 30, 2026
bf444b7
Puppet interpolation and smooth playback
riperiperi Jan 30, 2026
e380b51
Fix cases where initial data could be missing
riperiperi Jan 31, 2026
671b9d9
Fix missing line
riperiperi Jan 31, 2026
20e3ff7
Update logic for outdated lots
riperiperi Jan 31, 2026
d30abfe
Allow NPCs as surround puppets
riperiperi Jan 31, 2026
f3ea720
Sync appearances for puppets
riperiperi Jan 31, 2026
74ffb82
Subworld inheritance
riperiperi Jan 31, 2026
d40eda1
Only play lot join bell for self when joining a new lot
riperiperi Feb 1, 2026
22d82d0
Avoid drawing with incomplete puppets
riperiperi Feb 1, 2026
6907235
Open live panel automatically when an EOD is shown and it's hidden
riperiperi Feb 1, 2026
177ea85
Fix 3d thumbnail behaviour
riperiperi Feb 1, 2026
f3c2bf7
Slightly faster lot adjacency check
riperiperi Feb 1, 2026
cff88b7
Fix relationship update in sqlite
riperiperi Feb 1, 2026
cc8b72d
Optimize StateFromDB a little for avatars with a lot of relationships
riperiperi Feb 1, 2026
df31cc6
Move entity lists to special class
riperiperi Feb 1, 2026
7c9dc60
Avoid heap allocations for temp registers and params
riperiperi Feb 2, 2026
c606218
Optimize some VMThread hot paths for SetToNext loops
riperiperi Feb 2, 2026
9549dd9
Fix special frame deserialization
riperiperi Feb 2, 2026
aab7da2
Broadcast hollow lot updates
riperiperi Feb 2, 2026
5300b79
Don't reload all lots when doing a hollow sync
riperiperi Feb 2, 2026
8ffc3fa
Fix TTS gender selection
riperiperi Feb 2, 2026
151d117
Add some more validation for transition info
riperiperi Feb 2, 2026
03ec6a8
Merge changes from archive branch
riperiperi Feb 3, 2026
14f45ec
Minor fixes for chat commands and sandbox terrain restore
riperiperi Feb 3, 2026
d3787a6
Add third person mode to the direct control
riperiperi Feb 3, 2026
83971cc
Fix 3rd person over transitions
riperiperi Feb 3, 2026
6bb9abc
Add initial implementation of the TileRaycaster
riperiperi Feb 4, 2026
2e8eb2e
Fix some issues with go here interaction when looking upwards
riperiperi Feb 4, 2026
c67a896
Add special button for debug category instead of weird shortcut
riperiperi Feb 4, 2026
90ff398
Add some logic to allow users to cancel interactions and sitting with…
riperiperi Feb 5, 2026
022324d
Fix bounds check for go here transition
riperiperi Feb 5, 2026
1d139a1
Fix various lot lifecycle issues
riperiperi Feb 5, 2026
e594f9d
Avoid inbox saying it has new messages every login
riperiperi Feb 6, 2026
51a18ca
Clients running in 3D mode can now generate facade thumbnails
riperiperi Feb 7, 2026
5075036
Fix desync from FSOF generation
riperiperi Feb 7, 2026
d7e333c
Small optimization for FSOF generation (and slot position in general)
riperiperi Feb 7, 2026
d2d9269
Make less mistakes
riperiperi Feb 7, 2026
ec934e0
Add archive mode discord RPC
riperiperi Feb 8, 2026
ad61ccd
Fix a pixel alignment issue
riperiperi Feb 8, 2026
c1c0b59
Only save lot thumbnail and facade if a change is made
riperiperi Feb 8, 2026
971b8b2
Fix github actions build hopefully
riperiperi Feb 8, 2026
458dc32
Fix desync when loading job lot
riperiperi Feb 8, 2026
b417445
Add credits UI
riperiperi Feb 9, 2026
d38cc80
Exit button on credits screen
riperiperi Feb 9, 2026
cf48d13
Archive Data Pass + fixes
riperiperi Feb 22, 2026
36ad5e6
Don't try to start the server when the data download fails.
riperiperi Feb 22, 2026
b8acf8e
Enable direct control no matter what
riperiperi Feb 22, 2026
74abc9b
3D by default
riperiperi Feb 22, 2026
3a10f81
Fix extract path
riperiperi Feb 22, 2026
7293201
Fix crash showing discord button in quick start
riperiperi Feb 22, 2026
87db9a6
Properly handle download failure
riperiperi Feb 22, 2026
fcd4f02
Actually fix failed download handling
riperiperi Feb 22, 2026
35ec393
Normalize camera controls and rain between refresh rates
riperiperi Feb 22, 2026
760222d
UI event configuration
riperiperi Feb 23, 2026
80a9c2b
Move empty events.json to the correct place
riperiperi Feb 23, 2026
47db7e5
Make event categories look more like tabs
riperiperi Feb 23, 2026
ac32683
Fix an issue where OK dialogs would be a bit cutoff
riperiperi Feb 23, 2026
43eed6a
Show timed event durations on the event config
riperiperi Feb 23, 2026
da7e8a0
WIP city editor
riperiperi Mar 16, 2026
0058817
City painter previews
riperiperi Mar 28, 2026
ffb4630
Fix switching graphic in Volcanic
riperiperi Mar 31, 2026
7c26a2c
Add end table patch for all beds
riperiperi Apr 6, 2026
17502f7
Fix incorrect blend mode for dynamic object layer in 2D
riperiperi Apr 7, 2026
4ebb4d9
Add support for new DBPF remesh package
riperiperi Apr 11, 2026
33650aa
Add dgrp aliasing for simitone, lowercase on all filenames
riperiperi Apr 11, 2026
0a9a428
Only rewrite chunk ID for meshes.
riperiperi Apr 11, 2026
301b60c
Make city editor optional
riperiperi Apr 12, 2026
92fbe99
Remove funny log
riperiperi Apr 12, 2026
c939510
Add money/skill speed scaling controls
riperiperi Apr 13, 2026
1d1dbc1
Add starting funds configuration
riperiperi Apr 13, 2026
074f245
Fix typo
riperiperi Apr 14, 2026
845b9ee
Add new city painter graphics
riperiperi Apr 17, 2026
89044ba
City editor tools v1
riperiperi Apr 22, 2026
2d4f065
Undo/Redo, City Painter fixes and improvements
riperiperi Apr 24, 2026
589c646
Add dynamic city map mode
riperiperi Apr 27, 2026
7ff117e
Fix some issues with other users joining dynamic cities
riperiperi Apr 27, 2026
5460b63
Fix HIT crash
riperiperi Apr 27, 2026
7a26b11
Add validation and lot updates for city editor
riperiperi May 2, 2026
274b0de
Better city dataservice tracking, finalize some features
riperiperi May 3, 2026
abb2ef9
Nullify altitude command if there's no bitmap after trimming.
riperiperi May 3, 2026
dddef37
Add city modification indicator
riperiperi May 3, 2026
1133619
Fix some issues with the city modification highlight
riperiperi May 3, 2026
c12a231
Show avatars who caused city changes
riperiperi May 3, 2026
a2b1bce
Forgot to set these
riperiperi May 3, 2026
ddcb7a5
Fix button state for city edits
riperiperi May 3, 2026
d67b77b
Improvements to world bounds handling
riperiperi May 3, 2026
59ac262
Fix colour mismatch for city cursor
riperiperi May 3, 2026
35d0dd8
Add server connection, Archive maker and Keyboard navigation (#292)
SegerEnd May 4, 2026
acfce6c
Merge remote-tracking branch 'origin/archive-experiment' into archive…
riperiperi May 4, 2026
4f58f39
Fix OpenGL issues
riperiperi May 5, 2026
14b5927
Properly initialize motive data to avoid data type issues
riperiperi May 5, 2026
018fbfc
Add UV offset to fix 2D mode visuals on opengl
riperiperi May 5, 2026
fbb5402
Only use the 2d uv offset on macos.
riperiperi May 5, 2026
fd52070
Add readonly flag that disables some things in the server global link
riperiperi May 6, 2026
7f6160c
Fix threading issue when initializing subworlds
riperiperi May 6, 2026
8906031
InitSubworlds also needs to happen on main thread now
riperiperi May 7, 2026
0cd28f4
Various optimizations
riperiperi May 7, 2026
556f13a
Allow save avatar in spectator mode
riperiperi May 8, 2026
b3ca6ce
Update lot title when resync occurs
riperiperi May 9, 2026
6c30d8d
Improve resync rules for transitioning to spectator mode
riperiperi May 9, 2026
0753d57
Focus rule changes
riperiperi May 9, 2026
ab9d314
Improve mouse wheel scrolling behaviour
riperiperi May 9, 2026
ee3d3ab
Fix the archive controller sticking around in sandbox mode
riperiperi May 9, 2026
b9beaa3
Clear focus when clicking on city view
riperiperi May 9, 2026
3f01614
Fix focus behaviour on combobox
riperiperi May 9, 2026
b91b4cc
New join server dialog, WIP new update stuff
riperiperi Jun 16, 2026
4278cd7
chore: trigger build
riperiperi Jun 16, 2026
3fd8a4a
fix: UpdateBuilder path
riperiperi Jun 16, 2026
062e402
fix: use actual repo root
riperiperi Jun 16, 2026
7c34503
fix: try 2
riperiperi Jun 16, 2026
7f046f8
fix: wrong argument order
riperiperi Jun 16, 2026
0f588dc
fix: mysterious stream close
riperiperi Jun 16, 2026
d3077ae
fix: manifest uploading troubles
riperiperi Jun 17, 2026
40ce79c
fix: another way of saving manifest
riperiperi Jun 17, 2026
0a13361
fix: prerelease
riperiperi Jun 17, 2026
a0fd875
fix: place delta info in delta zip
riperiperi Jun 17, 2026
092a8c8
fix: fetch git history when building delta
riperiperi Jun 17, 2026
4a95d02
fix: make commit detection more lenient, fix capture groups
riperiperi Jun 17, 2026
e40d3e7
fix: delta calculation
riperiperi Jun 17, 2026
0a31224
fix: some more issues
riperiperi Jun 17, 2026
ce69b64
fix: maybe fix deltas
riperiperi Jun 17, 2026
224a002
chore: add more logging
riperiperi Jun 17, 2026
973ebb5
fix: another try
riperiperi Jun 17, 2026
1c08f18
fix: tell me why
riperiperi Jun 17, 2026
eaaaa98
fix: user agent
riperiperi Jun 17, 2026
9cb6af5
fix: apparently this doesn't validate
riperiperi Jun 17, 2026
ff372ab
build: try and ensure determinism
riperiperi Jun 17, 2026
7aeeb10
feat: use encryption
riperiperi Jun 17, 2026
1785bd0
build: spam arguments to try and force determinisim
riperiperi Jun 17, 2026
971321f
fix: test determinism again
riperiperi Jun 17, 2026
ebe3278
fix: add ci/determinism flags
riperiperi Jun 17, 2026
b91c3c7
fix: test determinism again again
riperiperi Jun 17, 2026
aa2cad0
feat: new update system
riperiperi Jun 21, 2026
235ef38
feat: working join history
riperiperi Jun 21, 2026
ef6986f
build: increase worker update check delay to 120 seconds
riperiperi Jun 27, 2026
82d3e4d
fix: properly dispose lot when leaving sandbox mode
riperiperi Jul 1, 2026
fa71db5
fix: ui element rounding issues at 1x dpi
riperiperi Jul 1, 2026
eaf024f
fix: UpdateBuilder includes
riperiperi Jul 2, 2026
7622b4d
feat: use moderation level to show/hide city admin ui
riperiperi Jul 3, 2026
23b1a36
feat: add super admin permissions for localhost
riperiperi Jul 3, 2026
aaa2a81
fix: some issues with list box UI
riperiperi Jul 3, 2026
3a76e6d
chore: remove comment I left for myself
riperiperi Jul 3, 2026
0589f41
fix: mail avatar search
riperiperi Jul 3, 2026
c2bb76a
feat: update discord rpc for new join dialog
riperiperi Jul 3, 2026
05ea81f
fix: join list deletion, discord join behaviour
riperiperi Jul 5, 2026
d33b1df
fix: add some obfuscation to RPC secret
riperiperi Jul 5, 2026
e63635a
fix: join history deletion, rpc join without lot ID
riperiperi Jul 5, 2026
67e90a3
fix: rain cross-fade
riperiperi Jul 7, 2026
b423af2
fix: crossroads surround for all XML lots
riperiperi Jul 7, 2026
b54e007
fix: hide unused environment subpanels in house mode
riperiperi Jul 7, 2026
8174419
fix: FSO.IDE debug mode
riperiperi Jul 12, 2026
8018421
fix: lingering snow when loading a lot saved in winter
riperiperi Jul 12, 2026
ab1de89
fix: respect user mod level change when on unowned lot
riperiperi Jul 12, 2026
54a5774
fix: don't show free roam interactions when disabled
riperiperi Jul 12, 2026
e60147f
fix: Mina.NET stack overflow
riperiperi Jul 13, 2026
dad8ceb
fix: avoid city map visually overlapping the active lot in many cases
riperiperi Jul 14, 2026
67086f0
fix: use abandon counter for lot timeout (so debugger/suspend doesn't…
riperiperi Jul 14, 2026
4c89dab
fix: generate missing catalog thumbnails, reduce memory leaked
riperiperi Jul 16, 2026
22a5d30
chore: update readme, pull request template based off monogame
riperiperi Jul 16, 2026
d595560
chore: make this a little clearer
riperiperi Jul 16, 2026
7585542
docs: add fso.remeshes reference
riperiperi Jul 16, 2026
37396f9
feat: implement avatar control flags, cache shared avatars for archive
riperiperi Jul 17, 2026
481e8d4
feat: implement allow lot creation flag
riperiperi Jul 17, 2026
045642e
fix: terrain controller not respecting lot creation flag
riperiperi Jul 17, 2026
fa42538
fix: don't show forests on water in 3d mode
riperiperi Jul 17, 2026
fc956a9
fix: sandbox mode multiplayer server
riperiperi Jul 18, 2026
b3ef8fb
Merge branch 'archive-experiment-temp' of https://github.com/riperipe…
riperiperi Jul 18, 2026
b78736b
fix: sandbox mode multiplayer client
riperiperi Jul 18, 2026
37db4e6
feat: implement debug mode flags
riperiperi Jul 18, 2026
5b3919c
feat: show display name in lot chat history unless disabled
riperiperi Jul 18, 2026
b0efb50
fix: macos publish
riperiperi Jul 18, 2026
1470c63
build: add macos ci
riperiperi Jul 19, 2026
31ed0d7
build: fix incorrect artifact name
riperiperi Jul 19, 2026
e07fc45
build: don't try to restore npm packages
riperiperi Jul 19, 2026
9fe7e93
build: update github actions scripts
riperiperi Jul 19, 2026
aee1aeb
build: try to fix artifact download again
riperiperi Jul 19, 2026
c1be0ef
build: try fix this again
riperiperi Jul 19, 2026
7235ffd
build: attempt to fix macos code signing
riperiperi Jul 19, 2026
01cd2cc
build: another code signing attempt
riperiperi Jul 19, 2026
d2e5a73
build: fix cli patcher return to game
riperiperi Jul 19, 2026
0964665
fix: some macos issues
riperiperi Jul 19, 2026
2ad0b0f
fix: dpi / null ref exception with trade panel (ty Seger)
riperiperi Jul 20, 2026
e2c1450
feat: add builtin TSO installer that appears when TSO can't be found
riperiperi Jul 25, 2026
81cbb66
fix: issue where some computers would break using ts1 trees
riperiperi Jul 25, 2026
44f927c
fix: mmo server version tracking, remove dead code
riperiperi Jul 25, 2026
815fe29
fix: mmo server lots getting stuck on spectator mode when rejoining a…
riperiperi Jul 25, 2026
c8fe180
fix: increase default settings
riperiperi Jul 25, 2026
81b112d
fix(installer): create target directory before disk space check
riperiperi Jul 25, 2026
38b4793
fix: roof not clearing when floor is empty (ty Seger)
riperiperi Jul 25, 2026
755b5ba
fix: move updater cleanup to happen even in archive mode
riperiperi Jul 25, 2026
1bb28bd
fix: prevent avatar icons from getting disposed by the queue
riperiperi Jul 26, 2026
8310d2b
build: add Windows installer
riperiperi Jul 26, 2026
1b8d7e0
Simitone changes from Archive -> Archive Experiment (#304)
riperiperi Jul 27, 2026
8f5eab5
fix: workaround amd bug where the lighting above floor 0 is incorrect
riperiperi Jul 27, 2026
32de9da
fix: cast to integer to calculate lightmap base
riperiperi Jul 28, 2026
1a0a100
fix: moderation_level not being respected when joining lot
riperiperi Jul 29, 2026
82c16dd
fix: restaurant job doubled up music, fix jukebox animation on job lot
riperiperi Jul 29, 2026
feb96e6
feat: improved terrain rendering
riperiperi Jul 30, 2026
6cf5d44
fix: specular discontinuity between lots
riperiperi Jul 30, 2026
22ed6fd
fix: don't terrain prep hollow lots - they should be up to date with …
riperiperi Jul 30, 2026
981ecc1
fix: connecting to any lot after being booted due to a crash
riperiperi Jul 30, 2026
84ba42c
fix: (dj station) expected anim event count behaviour, affected fso o…
riperiperi Jul 31, 2026
6ae0727
fix: drivable sleigh door animation
riperiperi Jul 31, 2026
d7c893d
build: make the update worker a little more resilient
riperiperi Jul 31, 2026
9a909ad
fix: attack interaction (thanks wyatt for helping investigation)
riperiperi Aug 1, 2026
e1fadc7
fix: use custom thumbnail for archive save when available
riperiperi Aug 1, 2026
57179ef
fix: ask archive server for city thumbnail
riperiperi Aug 1, 2026
fd71f25
fix: avoid lot facade generator leaving disposed indices bound
riperiperi Aug 1, 2026
9131a2e
fix: update monogame to 3.8.5 non-preview (shouldn't change much)
riperiperi Aug 2, 2026
9c3cff7
fix: rewrite archive save local dir if data is detected in data/ folder
riperiperi Aug 2, 2026
664c73f
fix: single file update, use CLI updater on windows
riperiperi Aug 2, 2026
fe0dd79
build: reorder installer build to include correct version
riperiperi Aug 2, 2026
449fa8b
build: FSO.Packager update to support remesh channels and versions
riperiperi Aug 3, 2026
ed3f415
build: update worker to handle remesh updates
riperiperi Aug 3, 2026
36d025f
feat: automatic remesh download when configured on update json
riperiperi Aug 3, 2026
f87d7f5
fix: allow admin sims to Add Ticket at restaurant
riperiperi Aug 3, 2026
39b6052
feat: add catalog flags for regional catalog items, mystic bomb debug…
riperiperi Aug 5, 2026
30cdf02
fix: issue where rejoining the city without a lotid would use the pre…
riperiperi Aug 5, 2026
2ded64d
build: add installer.json generator for the freeso website download page
riperiperi Aug 7, 2026
5f14eb9
feat: add auto-join behaviour for the final town hall
riperiperi Aug 9, 2026
93dcddb
fix: maintain chat history visibility throughout session
riperiperi Aug 9, 2026
98eca1f
fix: surrounding lot object placements now match the free roam version
riperiperi Aug 9, 2026
8c4eb1a
fix: improve size info/add low space warning for downloading archive …
riperiperi Aug 9, 2026
e159180
fix: use localized job lot titles
riperiperi Aug 9, 2026
8a00a78
fix: object crash when GetSuit called by nightclub npcs
riperiperi Aug 9, 2026
1638bde
fix: add missing tuning to empty archive save
riperiperi Aug 10, 2026
e2265ba
fix: thread safety on ReceiveOnlyServiceProvider
riperiperi Aug 10, 2026
457f8b9
fix: add hollow.fsoh regeneration task, optimize hot paths, fix some …
riperiperi Aug 12, 2026
80ecbe7
fix: auto focus to simantics dialogs, remove invalid focus
riperiperi Aug 13, 2026
c48f439
fix: weather lighting flash during lot transitions and reload
riperiperi Aug 14, 2026
9804987
fix: some fixes to direct control on pets
riperiperi Aug 14, 2026
034ee0b
fix: add FreeSO object credits
riperiperi Aug 14, 2026
bc76a17
fix: pet thumbnails getting disposed
riperiperi Aug 14, 2026
790104f
fix: some more things involving custom GUID avatars
riperiperi Aug 15, 2026
e12b655
fix: add hints for archive host and city editor
riperiperi Aug 15, 2026
4ed593c
fix: cleanup archive dialogs, move strings to uitext
riperiperi Aug 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
13 changes: 13 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
.git
**/bin
**/obj
**/node_modules
docker/nfs
**/publish
**/debug
**/release
**/dist
*.DotSettings.user
.vs/
.idea/
**/.DS_Store
14 changes: 14 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
### Summary

<!--
Explain what this PR changes and why you're changing it.
If this is a gameplay change, you should take extra care to explain why you think the change makes sense,
and demonstrate that you understand the full impact of the change when operating as an MMO server.

It usually saves time to ask _before_ making gameplay changes, as if it doesn't fit the game design it could be rejected outright.
-->

### Contributor Declaration

- [ ] I certify that no LLM's were used to generate any code or documentation in this contribution.

200 changes: 200 additions & 0 deletions .github/workflows/dotnet.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
name: Build FreeSO

on:
push:
branches: [ "**" ]
pull_request:
branches: [ "master" ]

jobs:

build-win:
strategy:
matrix:
configuration: [Release]

runs-on: windows-latest # For a list of available runner types, refer to
# https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idruns-on

steps:
- name: Checkout
uses: actions/checkout@v5

# Install the .NET Core workload
- name: Install .NET Core
uses: actions/setup-dotnet@v5
with:
dotnet-version: 9.0.x

- run: dotnet publish TSOClient/FSO.IDE -c Release /p:ContinuousIntegrationBuild=true /p:Deterministic=true /p:EnableSourceLink=false /p:IncludeSourceRevisionInInformationalVersion=false -r win-x64 --self-contained -o Artifacts/Client
- run: dotnet publish TSOClient/FSO.Server.Core -c Release /p:ContinuousIntegrationBuild=true /p:Deterministic=true /p:EnableSourceLink=false /p:IncludeSourceRevisionInInformationalVersion=false -r win-x64 --self-contained -o Artifacts/Server

- name: Upload client artifacts
uses: actions/upload-artifact@v7
with:
name: FreeSOClient
path: Artifacts/Client

- name: Upload server artifacts
uses: actions/upload-artifact@v7
with:
name: FreeSOServer
path: Artifacts/Server

build-mac:
strategy:
matrix:
configuration: [Release]

runs-on: macos-latest

steps:
- name: Checkout
uses: actions/checkout@v5

# Install the .NET Core workload
- name: Install .NET Core
uses: actions/setup-dotnet@v5
with:
dotnet-version: 9.0.x

- run: dotnet publish TSOClient/FSO.Unix -c Release /p:ContinuousIntegrationBuild=true /p:Deterministic=true /p:EnableSourceLink=false /p:IncludeSourceRevisionInInformationalVersion=false /p:ForceSign=true -r osx-arm64 --self-contained -o Artifacts/Client
- run: dotnet publish TSOClient/FSO.Server.Core -c Release /p:ContinuousIntegrationBuild=true /p:Deterministic=true /p:EnableSourceLink=false /p:IncludeSourceRevisionInInformationalVersion=false -r osx-arm64 --self-contained -o Artifacts/Server

- name: Tar client
run: tar -czvf mac.tar.gz -C Artifacts/Client FreeSO.app

- name: Upload client artifacts
uses: actions/upload-artifact@v7
with:
name: FreeSOClientMac
path: mac.tar.gz
archive: false

- name: Tar server
run: tar -czvf mac-server.tar.gz -C Artifacts/Server .

- name: Upload server artifacts
uses: actions/upload-artifact@v7
with:
name: FreeSOServerMac
path: mac-server.tar.gz
archive: false

create-release:
needs: [build-win, build-mac]
runs-on: macos-latest
permissions:
contents: write
environment:
name: "Release"

steps:
- name: Checkout
uses: actions/checkout@v5
with:
fetch-depth: 0

- uses: actions/setup-node@v7
with:
node-version: 24

- name: Install .NET Core
uses: actions/setup-dotnet@v5
with:
dotnet-version: 9.0.x

- name: Download Client
uses: actions/download-artifact@v8
with:
name: FreeSOClient
path: tempUpdate/windows

- name: Download Server
uses: actions/download-artifact@v8
with:
name: FreeSOServer
path: tempUpdate/windows-server

- name: Download Client (mac)
uses: actions/download-artifact@v8
with:
name: mac.tar.gz
path: tempUpdate

- name: Download Server (mac)
uses: actions/download-artifact@v8
with:
name: mac-server.tar.gz
path: tempUpdate

- name: Untar client (mac)
run: mkdir tempUpdate/mac/ && tar -xzvf tempUpdate/mac.tar.gz -C tempUpdate/mac/

- name: Untar server (mac)
run: mkdir tempUpdate/mac-server/ && tar -xzvf tempUpdate/mac-server.tar.gz -C tempUpdate/mac-server/

- name: Install create-dmg
run: |
npm install --global create-dmg

- name: Building Release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
FSO_UPDATE_GITHUB_REPO: ${{ github.repository }}
FSO_UPDATE_CHANNEL_URL: ${{ vars.FSO_UPDATE_CHANNEL_URL }}
FSO_UPDATE_PUBLIC_KEY: ${{ secrets.FSO_UPDATE_PUBLIC_KEY }}
FSO_UPDATE_PRIVATE_KEY: ${{ secrets.FSO_UPDATE_PRIVATE_KEY }}
FSO_UPDATE_TARGETS: "windows,mac"
run: |
dotnet run -c Release -- "../../../tempUpdate/"
working-directory: Other/tools/FSO.UpdateBuilder

- name: Upload release manifest
uses: actions/upload-artifact@v7
with:
name: ReleaseManifest
path: tempUpdate/windows/version.json
archive: false

release-msi:
needs: [create-release]
runs-on: windows-latest
permissions:
contents: write

steps:
- name: Checkout
uses: actions/checkout@v5

- name: Install .NET Core
uses: actions/setup-dotnet@v5
with:
dotnet-version: 9.0.x

- name: Download Client
uses: actions/download-artifact@v8
with:
name: FreeSOClient
path: Artifacts/Client

- name: Download Version Manifest
uses: actions/download-artifact@v8
with:
name: version.json
path: Artifacts/Client

- name: Building Windows Installer (.msi)
run: dotnet build TSOClient/FSO.Installer.Windows -c Release -o Artifacts/Installer

- name: Updating Release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
FSO_UPDATE_GITHUB_REPO: ${{ github.repository }}
FSO_UPDATE_CHANNEL_URL: ${{ vars.FSO_UPDATE_CHANNEL_URL }}
FSO_UPDATE_PUBLIC_KEY: ${{ secrets.FSO_UPDATE_PUBLIC_KEY }}
FSO_UPDATE_PRIVATE_KEY: ${{ secrets.FSO_UPDATE_PRIVATE_KEY }}
FSO_UPDATE_TARGETS: "windows,mac"
run: |
dotnet run -c Release -- --windowsMsi
working-directory: Other/tools/FSO.UpdateBuilder
11 changes: 10 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -85,4 +85,13 @@ TSOClient/tso.client/GlobalSettings1.Designer.cs
TSOClient/.vs/config/applicationhost.config
*.nvuser

TSOClient/Mario
# Rider IDE
.idea/

# Docker
docker/nfs/
docker/archives/

TSOClient/Mario

Artifacts/
43 changes: 43 additions & 0 deletions Documentation/Generating Archive Data.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
Here's the full process used to generate the FreeSO archive data from server data exported using mariadb-dump on The Save Date.

- Build and configure FSO.Server.Core to point to a non-existent sqlite database file, and a copy of the NFS that you want to migrate to archive. These operations are destructive, so make sure you copy the NFS if you want to keep the original.
- Add `"engine": "sqlite",` to the database object, and then use a connection string like this:
- `Data Source=fsoarchive.db;Version=3;UTF8Encoding=True`
- `dotnet run sqlite-import <dumpDir>`
- This imports the database from an SQL dump made with MariaDB dump 10.19. There should be one file per table, with triggers and functions, and the first alphabetically should be `fso_fso_auth_attempts.sql`.
- `dotnet run archive-convert`
- This converts the database into the archive format. This involved deleting all users, user related tables, authentication and adding tables/columns for archive features. All existing avatars are transferred to an "archive user" with ID 1.
- `dotnet run backup-selection`
- This step scans all lot saves to find cases where a roommate has left and taken a large number of objects with them. If this is the case, then the entry for that lot is updated to load that backup instead.
- When possible, the lot will attempt to "steal" recovered objects from the owner's inventory if it's not on another lot.
- This is useful for restoring the state of "abandoned" properties, after players have left and become roommate somewhere else.
- `dotnet run data-trim -a`
- This step trims excess data to reduce the filesize of the archive, and can remove any data that might be personally identifying such as inbox, bookmarks etc. (the -a flag)
- This is a destructive process. The following information will be lost:
- Relationships with an invalid source, or insignificant value (-5 to 5).
- Object inventory data for objects that are on a lot (as the lot has authority in this case)
- Object inventory and plugin data for objects that have been deleted
- Lot backups apart from the newest and the oldest (or whatever `backup-selection` picked)
- Usually there are 10, trimming down to 2 backups saves a lot of space.
- Lot data that doesn't have a database entry (likely deleted)
- All rows in server state tables:
- `fso_auth_attempts`, `fso_auth_tickets`, `fso_lot_server_tickets`, `fso_shard_tickets`, `fso_tasks`, `fso_transactions`
- If the `-a` flag is provided (anonymize), all rows in these tables:
- `fso_inbox`, `fso_bookmarks`, `fso_bulletin_posts (deleted=1)`, `fso_election_votes`, `fso_election_freevotes`, `fso_election_candidates`, `fso_ip_ban`, `fso_lot_visits`, `fso_nhood_ban`, `fso_lot_admit`
- `from_user_id` from `fso_mayor_ratings` gets cleared somehow
- `dotnet run plugin-anonymize <input-file>`
- This step tries to find objects with specific plugin data (signs, draw a card) that could potentially contain private information.
- Any signs or card dispensers that are in a user's inventory have their plugin data deleted.
- If on a lot, the tool loads the lot and determines if the object is accessible to fresh visitors. If it isn't, the data is deleted.
- allow all or ban list, and you can route to the object from the mailbox with visitor status. There's some special logic that allows routing through teleporters.
- Without an input file, the tool will output a list of all data for the user to review in `pluginReview.json` local to the game executable, and the automated decisions it made based on routing.
- You can feed this data back in immediately with `dotnet run plugin-anonymize pluginReview.json`, though it's recommended to do a pass through the data for anything that might be offensive, or to manually allow data that doesn't appear to be private.
- `dotnet run import-archive-featured <shardId> <json>`
- A tool for importing manually featured lots for the archive data. Just a JSON array containing objects with `name`, `lot_id`, `category`, `description`.
- Manual Cleanup
- Feel free to perform manual cleanups on the database file with a tool like https://sqlitebrowser.org/ .
- If you want to make sure something is definitely deleted/committed before distribution, run:
- `PRAGMA wal_checkpoint(TRUNCATE)`
- `vacuum`
- `PRAGMA wal_checkpoint(TRUNCATE)`
- You can also load up the save with the archive client and make changes there. This was done with the FreeSO archive data to finish the final town hall, cleanup the event lots, import some special lot data, and add a few easter eggs.
Binary file added Documentation/media/3d.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Documentation/media/band.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ protected override List<Color> OnGetPaletteToCache(Int32 colorCount)
ToList();

// workaround for backgrounds, the most prevalent color
DistinctColorInfo background = colorInfoList.MaxBy(info => info.Count);
DistinctColorInfo background = Enumerable.MaxBy(colorInfoList, info => info.Count);
colorInfoList.Remove(background);
colorCount--;

Expand Down
Loading
Loading