NetDex is a multiplayer card game project built with Godot 4.6 + C#. The current implemented game mode is Omi (Sri Lankan trick-taking card game), with architecture prepared for additional game types later.
- Host-authoritative multiplayer backend (no external dedicated server)
- LAN room discovery + direct IP join fallback
- 4 player seats + spectator support
- Reconnect pause/timeout handling
- Omi rules engine with deterministic state machine
- Host-side AI bots (Easy / Normal / Strong)
- In-game animations for deal, trump announcement, and trick resolution pacing
- Cross-platform updater flow using GitHub Releases
| Area | Status | Notes |
|---|---|---|
| LAN host/join | Implemented | ENet + UDP discovery |
| Direct IP join | Implemented | Fallback when discovery blocked |
| Spectators | Implemented | Spectator snapshots supported |
| AI seats | Implemented | Host controls auto-fill + difficulty |
| Reconnect timeout | Implemented | Pause + forfeit path |
| Updater macOS | Implemented | Download + digest + helper relaunch |
| Updater Windows | Implemented | Download + digest + helper relaunch |
| Updater Linux | Implemented | Download + digest + helper relaunch |
| Updater Android | Implemented | Browser handoff to APK |
| Updater iOS | Manual | Release page handoff only |
- Godot Engine
4.6 - C# (
net9.0,Godot.NET.Sdk/4.6.1) - ENet high-level multiplayer
- UDP LAN discovery (
PacketPeerUdp) - GitHub Releases API for update metadata
src/- Godot project root (project.godot, scenes, scripts, export presets)docs/- architecture, flow, and generated reference docssrc/tools/- utility scripts (release and docs checks)
dotnet build src/NetDex.slnOpen this project file:
src/project.godot
- Run one instance as host.
- Run additional instances as clients/spectators.
- If discovery binding fails, ensure only expected number of instances are active and use direct IP fallback.
- Keep all devices on same subnet/Wi-Fi.
- Host room from one device.
- Join from others via discovery list or direct host IP.
- Android networking requires export permissions (
internet,access_network_state,access_wifi_state,change_wifi_multicast_state). - Updater behavior is platform-specific and documented in
docs/flows/updater-lifecycle.md.
Automated release workflow:
- Workflow file:
.github/workflows/release.yml - Auto trigger: push to
mainwhen the head commit message includes both footers:Release: vMAJOR.MINOR.PATCHorRelease: vMAJOR.MINOR.PATCH-suffixRelease-Type: prereleaseorRelease-Type: release
- Manual trigger: GitHub Actions
Releaseworkflow viaworkflow_dispatchwith:tagrelease_typetarget_ref
Expected release assets:
netdex-macos-universal.zipnetdex-windows-x86_64.zipnetdex-windows-arm64.zipnetdex-linux-x64.zipnetdex-android-arm64.apk
Useful scripts:
bash src/tools/release/package_release.sh
bash src/tools/release/verify_release_assets.sh <owner> <repo>CI note:
- Android export is currently forced to unsigned inside CI (
package/signed=false) so the pipeline can publish cross-platform artifacts without keystore secrets.
Start here:
docs/README.md
Important references:
docs/reference/autoloads.mddocs/reference/rpc-map.mddocs/reference/signals-and-events.mddocs/_manifest.md
When changing code in src/scripts or scenes in src/scenes, update docs and run coverage checks:
bash src/tools/docs/check_docs_coverage.sh
bash src/tools/docs/check_docs_links.sh