flake-app #1
18 changed files with 302 additions and 125 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -4,4 +4,4 @@ obj
|
||||||
client
|
client
|
||||||
*.sarif
|
*.sarif
|
||||||
.direnv
|
.direnv
|
||||||
|
out
|
||||||
|
|
7
.gitmodules
vendored
7
.gitmodules
vendored
|
@ -1,3 +1,4 @@
|
||||||
[submodule "tanks-backend/servicepoint"]
|
[submodule "tanks-backend/servicepoint-binding-csharp"]
|
||||||
path = tanks-backend/servicepoint
|
path = tanks-backend/servicepoint-binding-csharp
|
||||||
url = https://github.com/cccb/servicepoint.git
|
url = https://git.berlin.ccc.de/servicepoint/servicepoint-binding-csharp.git
|
||||||
|
branch = main
|
||||||
|
|
85
README.md
85
README.md
|
@ -2,7 +2,56 @@
|
||||||
|
|
||||||
<!-- TODO: image -->
|
<!-- TODO: image -->
|
||||||
|
|
||||||
### Backend
|
## Building and running
|
||||||
|
|
||||||
|
### With Nix
|
||||||
|
|
||||||
|
Using the power of nix, you can just `nix run git+https://git.berlin.ccc.de/vinzenz/servicepoint-tanks`!
|
||||||
|
|
||||||
|
To build from local source:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# no submodules required
|
||||||
|
git clone https://github.com/kaesaecracker/servicepoint-tanks.git
|
||||||
|
cd servicepoint-tanks
|
||||||
|
nix build .#
|
||||||
|
result/bin/TanksServer
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also use the provided devShells (`nix develop .#`) and follow the manual steps.
|
||||||
|
|
||||||
|
For proper IDE suggestions, you may need to initialize the submodules. They are not used for building by Nix though.
|
||||||
|
|
||||||
|
### The hard way
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# initialize the submodules
|
||||||
|
git clone https://github.com/kaesaecracker/servicepoint-tanks.git
|
||||||
|
cd servicepoint-tanks
|
||||||
|
git submodule update --init --recursive
|
||||||
|
|
||||||
|
# build
|
||||||
|
cd tank-frontent
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
cd ../tanks-backend
|
||||||
|
dotnet build
|
||||||
|
```
|
||||||
|
|
||||||
|
The Docker builds are currently broken and need some updates for the new library repo structure.
|
||||||
|
<!-- TODO currently broken
|
||||||
|
|
||||||
|
# build with docker/podman - probably broken rifht
|
||||||
|
cd tanks-backend
|
||||||
|
docker build .
|
||||||
|
cd ../tank-frontend
|
||||||
|
docker build .
|
||||||
|
cd ..
|
||||||
|
docker build .
|
||||||
|
```
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Backend
|
||||||
|
|
||||||
<!-- TODO: image -->
|
<!-- TODO: image -->
|
||||||
|
|
||||||
|
@ -18,7 +67,7 @@
|
||||||
- some values (like tank speed) can be configured but are fixed at run time
|
- some values (like tank speed) can be configured but are fixed at run time
|
||||||
- By default, the backend also hosts the frontend
|
- By default, the backend also hosts the frontend
|
||||||
|
|
||||||
### Frontend
|
## Frontend
|
||||||
|
|
||||||
<!-- TODO: image -->
|
<!-- TODO: image -->
|
||||||
|
|
||||||
|
@ -28,9 +77,9 @@
|
||||||
- Sends user input to server
|
- Sends user input to server
|
||||||
- real time communication via WebSockets, HTTP for the REST
|
- real time communication via WebSockets, HTTP for the REST
|
||||||
|
|
||||||
### Binary formats
|
## Binary formats
|
||||||
|
|
||||||
#### Controls WebSocket
|
### Controls WebSocket
|
||||||
|
|
||||||
- Client sends 2 byte messages.
|
- Client sends 2 byte messages.
|
||||||
- on or off: `0x01` or `0x02`
|
- on or off: `0x01` or `0x02`
|
||||||
|
@ -55,31 +104,3 @@
|
||||||
- 10: bullet
|
- 10: bullet
|
||||||
- 11: (reserved)
|
- 11: (reserved)
|
||||||
- client responds with empty message to request the next frame
|
- client responds with empty message to request the next frame
|
||||||
|
|
||||||
# Building
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# checkout repo and submodules
|
|
||||||
git clone https://github.com/kaesaecracker/servicepoint-tanks.git
|
|
||||||
cd servicepoint-tanks
|
|
||||||
git submodule update --init
|
|
||||||
cd tanks-backend/servicepoint
|
|
||||||
git submodule update --init
|
|
||||||
cd ../..
|
|
||||||
|
|
||||||
# build with nix-shell
|
|
||||||
nix-shell
|
|
||||||
cd tank-frontent
|
|
||||||
npm install
|
|
||||||
npm run build
|
|
||||||
cd ../tanks-backend
|
|
||||||
dotnet build
|
|
||||||
|
|
||||||
# build with docker/podman
|
|
||||||
cd tanks-backend
|
|
||||||
docker build .
|
|
||||||
cd ../tank-frontend
|
|
||||||
docker build .
|
|
||||||
cd ..
|
|
||||||
docker build .
|
|
||||||
```
|
|
||||||
|
|
43
flake.lock
generated
43
flake.lock
generated
|
@ -1,5 +1,47 @@
|
||||||
{
|
{
|
||||||
"nodes": {
|
"nodes": {
|
||||||
|
"binding": {
|
||||||
|
"inputs": {
|
||||||
|
"binding": "binding_2",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1759096792,
|
||||||
|
"narHash": "sha256-CW4D1yJecw7Id6AxIEJOW3OpcX3Y4Ehng76/YlR1I9w=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "8df2996504866f3193fbe51860ab173d25724e5e",
|
||||||
|
"revCount": 307,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.berlin.ccc.de/servicepoint/servicepoint-binding-csharp.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.berlin.ccc.de/servicepoint/servicepoint-binding-csharp.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"binding_2": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"binding",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1759093963,
|
||||||
|
"narHash": "sha256-nis9Xps/P1f/v9FC3LoMLGGCOMMbdrOniDSklqLsH8o=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "44ef4bb6d707c46af1bed6244f17a16f26f246c1",
|
||||||
|
"revCount": 304,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.berlin.ccc.de/servicepoint/servicepoint-binding-uniffi.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.berlin.ccc.de/servicepoint/servicepoint-binding-uniffi.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1758589230,
|
"lastModified": 1758589230,
|
||||||
|
@ -18,6 +60,7 @@
|
||||||
},
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
|
"binding": "binding",
|
||||||
"nixpkgs": "nixpkgs"
|
"nixpkgs": "nixpkgs"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
93
flake.nix
93
flake.nix
|
@ -1,31 +1,41 @@
|
||||||
{
|
{
|
||||||
description = "Dev shell flake for servicepoint-tanks";
|
description = "flake for servicepoint-tanks";
|
||||||
|
|
||||||
inputs = {
|
inputs = {
|
||||||
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-25.05";
|
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-25.05";
|
||||||
|
|
||||||
|
binding = {
|
||||||
|
url = "git+https://git.berlin.ccc.de/servicepoint/servicepoint-binding-csharp.git";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs =
|
outputs =
|
||||||
{ self, nixpkgs }:
|
{
|
||||||
|
self,
|
||||||
|
nixpkgs,
|
||||||
|
binding,
|
||||||
|
}:
|
||||||
let
|
let
|
||||||
supported-systems = [
|
supported-systems = [
|
||||||
"x86_64-linux"
|
"x86_64-linux"
|
||||||
"aarch64-linux"
|
"aarch64-linux"
|
||||||
];
|
];
|
||||||
forAllSystems =
|
forAllSystems =
|
||||||
f:
|
fn:
|
||||||
nixpkgs.lib.genAttrs supported-systems (
|
nixpkgs.lib.genAttrs supported-systems (
|
||||||
system:
|
system:
|
||||||
f rec {
|
fn {
|
||||||
pkgs = nixpkgs.legacyPackages.${system};
|
|
||||||
lib = nixpkgs.lib;
|
|
||||||
inherit system;
|
inherit system;
|
||||||
|
inherit (nixpkgs) lib;
|
||||||
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
selfPkgs = self.packages.${system};
|
selfPkgs = self.packages.${system};
|
||||||
|
bindingPkgs = binding.packages.${system};
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
devShells = forAllSystems (
|
apps = forAllSystems (
|
||||||
{
|
{
|
||||||
pkgs,
|
pkgs,
|
||||||
lib,
|
lib,
|
||||||
|
@ -33,30 +43,87 @@
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
{
|
{
|
||||||
frontend = pkgs.mkShell {
|
default = {
|
||||||
|
type = "app";
|
||||||
|
program = "${lib.getBin selfPkgs.servicepoint-tanks}/bin/TanksServer";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
devShells = forAllSystems (
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
selfPkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
frontend-set = {
|
||||||
inputsFrom = [ selfPkgs.servicepoint-tanks-frontend ];
|
inputsFrom = [ selfPkgs.servicepoint-tanks-frontend ];
|
||||||
|
packages = with pkgs; [
|
||||||
|
typescript
|
||||||
|
nodejs
|
||||||
|
];
|
||||||
};
|
};
|
||||||
default = import ./shell.nix {
|
backend-set = {
|
||||||
inherit pkgs lib;
|
inputsFrom = [ selfPkgs.servicepoint-tanks ];
|
||||||
|
packages = with pkgs; [
|
||||||
|
nuget-to-json
|
||||||
|
cargo-tarpaulin
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
frontend = pkgs.mkShell frontend-set;
|
||||||
|
backend = pkgs.mkShell backend-set;
|
||||||
|
default = pkgs.mkShell (frontend-set // backend-set);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
packages = forAllSystems (
|
packages = forAllSystems (
|
||||||
{ pkgs, lib, ... }:
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
selfPkgs,
|
||||||
|
bindingPkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
{
|
{
|
||||||
servicepoint-tanks-frontend = pkgs.buildNpmPackage (finalAttrs: {
|
servicepoint-tanks-frontend = pkgs.buildNpmPackage (finalAttrs: {
|
||||||
pname = "tank-frontend";
|
pname = "servicepoint-tanks-frontend";
|
||||||
version = "0.0.0";
|
version = "0.0.0";
|
||||||
|
|
||||||
src = ./tank-frontend;
|
src = ./tank-frontend;
|
||||||
|
|
||||||
npmDepsHash = "sha256-HvwoSeKHBDkM/5OHDkgSOxfHx1gbnKif/3QfDb6r5mE=";
|
npmDepsHash = "sha256-HvwoSeKHBDkM/5OHDkgSOxfHx1gbnKif/3QfDb6r5mE=";
|
||||||
|
|
||||||
installPhase = ''
|
installPhase = ''
|
||||||
cp -rv dist/ $out
|
cp -rv dist/ $out
|
||||||
'';
|
'';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
servicepoint-tanks-assets = ./tanks-backend/TanksServer/assets;
|
||||||
|
|
||||||
|
servicepoint-tanks = pkgs.buildDotnetModule {
|
||||||
|
pname = "servicepoint-tanks";
|
||||||
|
version = "0.0.0";
|
||||||
|
|
||||||
|
dotnet-sdk = pkgs.dotnetCorePackages.sdk_8_0;
|
||||||
|
dotnet-runtime = pkgs.dotnetCorePackages.runtime_8_0;
|
||||||
|
|
||||||
|
src = ./tanks-backend;
|
||||||
|
projectFile = "TanksServer/TanksServer.csproj";
|
||||||
|
nugetDeps = ./tanks-backend/deps.json;
|
||||||
|
|
||||||
|
selfContainedBuild = true;
|
||||||
|
|
||||||
|
buildInputs = [ bindingPkgs.servicepoint-binding-csharp ];
|
||||||
|
|
||||||
|
runtimeDeps = [ bindingPkgs.servicepoint-binding-uniffi ];
|
||||||
|
|
||||||
|
makeWrapperArgs = [
|
||||||
|
"--set-default TANKSSERVER_CLIENT ${selfPkgs.servicepoint-tanks-frontend}"
|
||||||
|
"--set-default TANKSSERVER_ASSETS ${selfPkgs.servicepoint-tanks-assets}"
|
||||||
|
];
|
||||||
|
};
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
35
shell.nix
35
shell.nix
|
@ -1,35 +0,0 @@
|
||||||
{
|
|
||||||
pkgs ? import <nixpkgs> { },
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
let
|
|
||||||
rust-toolchain = pkgs.symlinkJoin {
|
|
||||||
name = "rust-toolchain";
|
|
||||||
paths = with pkgs; [
|
|
||||||
rustc
|
|
||||||
cargo
|
|
||||||
rustPlatform.rustcSrc
|
|
||||||
rustfmt
|
|
||||||
clippy
|
|
||||||
];
|
|
||||||
};
|
|
||||||
in
|
|
||||||
pkgs.mkShell {
|
|
||||||
nativeBuildInputs = with pkgs.buildPackages; [
|
|
||||||
rust-toolchain
|
|
||||||
|
|
||||||
pkg-config
|
|
||||||
xe
|
|
||||||
xz
|
|
||||||
cargo-tarpaulin
|
|
||||||
gnumake
|
|
||||||
iconv
|
|
||||||
|
|
||||||
typescript
|
|
||||||
nodejs
|
|
||||||
|
|
||||||
dotnet-sdk_8
|
|
||||||
];
|
|
||||||
|
|
||||||
RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}";
|
|
||||||
}
|
|
|
@ -10,19 +10,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "shared", "shared", "{12DB7D
|
||||||
..\.envrc = ..\.envrc
|
..\.envrc = ..\.envrc
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "servicepoint", "servicepoint", "{A10FB29A-9078-4E90-9CE1-E6C2B5209E19}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "servicepoint-binding-csharp", "servicepoint-binding-csharp", "{919DCD05-B92D-48A6-BB1F-8ABD460BD788}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "crates", "crates", "{656A7CBA-9445-41CC-B1AF-A6897AAC9F17}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServicePoint", "servicepoint-binding-csharp\ServicePoint\ServicePoint.csproj", "{3C856AD4-DBC6-419D-8373-9D99A2E2AA04}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "servicepoint_binding_uniffi", "servicepoint_binding_uniffi", "{5FD9FAD7-07BA-4DF9-8C84-15A9558373F1}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServicePoint.Tests", "servicepoint-binding-csharp\ServicePoint.Tests\ServicePoint.Tests.csproj", "{D0B09E1D-B20F-4883-8D32-5E5420224CC3}"
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "libraries", "libraries", "{6082A0DC-5345-48C8-BA2E-667754A2F0E9}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "csharp", "csharp", "{D8A3290B-5DFB-43C6-99EE-56AB5F53F468}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServicePoint", "servicepoint\crates\servicepoint_binding_uniffi\libraries\csharp\ServicePoint\ServicePoint.csproj", "{D1DDCD0D-6152-45E6-B673-DD78C466BDC3}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServicePoint.Tests", "servicepoint\crates\servicepoint_binding_uniffi\libraries\csharp\ServicePoint.Tests\ServicePoint.Tests.csproj", "{EF42D6B7-70B1-490B-BB5F-5A44D1309A7C}"
|
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
@ -34,21 +26,17 @@ Global
|
||||||
{D88BF376-47A4-4C72-ADD1-983F9285C351}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{D88BF376-47A4-4C72-ADD1-983F9285C351}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{D88BF376-47A4-4C72-ADD1-983F9285C351}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{D88BF376-47A4-4C72-ADD1-983F9285C351}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{D88BF376-47A4-4C72-ADD1-983F9285C351}.Release|Any CPU.Build.0 = Release|Any CPU
|
{D88BF376-47A4-4C72-ADD1-983F9285C351}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{D1DDCD0D-6152-45E6-B673-DD78C466BDC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{3C856AD4-DBC6-419D-8373-9D99A2E2AA04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{D1DDCD0D-6152-45E6-B673-DD78C466BDC3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{3C856AD4-DBC6-419D-8373-9D99A2E2AA04}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{D1DDCD0D-6152-45E6-B673-DD78C466BDC3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{3C856AD4-DBC6-419D-8373-9D99A2E2AA04}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{D1DDCD0D-6152-45E6-B673-DD78C466BDC3}.Release|Any CPU.Build.0 = Release|Any CPU
|
{3C856AD4-DBC6-419D-8373-9D99A2E2AA04}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{EF42D6B7-70B1-490B-BB5F-5A44D1309A7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{D0B09E1D-B20F-4883-8D32-5E5420224CC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{EF42D6B7-70B1-490B-BB5F-5A44D1309A7C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{D0B09E1D-B20F-4883-8D32-5E5420224CC3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{EF42D6B7-70B1-490B-BB5F-5A44D1309A7C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{D0B09E1D-B20F-4883-8D32-5E5420224CC3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{EF42D6B7-70B1-490B-BB5F-5A44D1309A7C}.Release|Any CPU.Build.0 = Release|Any CPU
|
{D0B09E1D-B20F-4883-8D32-5E5420224CC3}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(NestedProjects) = preSolution
|
GlobalSection(NestedProjects) = preSolution
|
||||||
{656A7CBA-9445-41CC-B1AF-A6897AAC9F17} = {A10FB29A-9078-4E90-9CE1-E6C2B5209E19}
|
{3C856AD4-DBC6-419D-8373-9D99A2E2AA04} = {919DCD05-B92D-48A6-BB1F-8ABD460BD788}
|
||||||
{5FD9FAD7-07BA-4DF9-8C84-15A9558373F1} = {656A7CBA-9445-41CC-B1AF-A6897AAC9F17}
|
{D0B09E1D-B20F-4883-8D32-5E5420224CC3} = {919DCD05-B92D-48A6-BB1F-8ABD460BD788}
|
||||||
{6082A0DC-5345-48C8-BA2E-667754A2F0E9} = {5FD9FAD7-07BA-4DF9-8C84-15A9558373F1}
|
|
||||||
{D8A3290B-5DFB-43C6-99EE-56AB5F53F468} = {6082A0DC-5345-48C8-BA2E-667754A2F0E9}
|
|
||||||
{D1DDCD0D-6152-45E6-B673-DD78C466BDC3} = {D8A3290B-5DFB-43C6-99EE-56AB5F53F468}
|
|
||||||
{EF42D6B7-70B1-490B-BB5F-5A44D1309A7C} = {D8A3290B-5DFB-43C6-99EE-56AB5F53F468}
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|
|
@ -4,7 +4,7 @@ namespace TanksServer.GameLogic;
|
||||||
|
|
||||||
internal sealed class CollideBullets : ITickStep
|
internal sealed class CollideBullets : ITickStep
|
||||||
{
|
{
|
||||||
private readonly Sprite _explosiveSprite = Sprite.FromImageFile("assets/explosion.png");
|
private readonly Sprite _explosiveSprite = Sprite.FromImageFile(Path.Combine(Program.AssetsDir, "explosion.png"));
|
||||||
private readonly Predicate<Bullet> _removeBulletsPredicate;
|
private readonly Predicate<Bullet> _removeBulletsPredicate;
|
||||||
private readonly MapEntityManager _entityManager;
|
private readonly MapEntityManager _entityManager;
|
||||||
private readonly MapService _map;
|
private readonly MapService _map;
|
||||||
|
|
|
@ -22,9 +22,10 @@ internal sealed class MapService
|
||||||
|
|
||||||
public MapService()
|
public MapService()
|
||||||
{
|
{
|
||||||
foreach (var file in Directory.EnumerateFiles("./assets/maps/", "*.txt"))
|
var dir = Path.Combine(Program.AssetsDir, "maps");
|
||||||
|
foreach (var file in Directory.EnumerateFiles(dir, "*.txt"))
|
||||||
LoadMapString(file);
|
LoadMapString(file);
|
||||||
foreach (var file in Directory.EnumerateFiles("./assets/maps/", "*.png"))
|
foreach (var file in Directory.EnumerateFiles(dir, "*.png"))
|
||||||
LoadMapPng(file);
|
LoadMapPng(file);
|
||||||
Current = GetRandomMap();
|
Current = GetRandomMap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
global using System;
|
global using System;
|
||||||
global using System.Collections.Concurrent;
|
global using System.Collections.Concurrent;
|
||||||
global using System.Collections.Generic;
|
global using System.Collections.Generic;
|
||||||
|
global using System.IO;
|
||||||
global using System.Linq;
|
global using System.Linq;
|
||||||
global using System.Threading;
|
global using System.Threading;
|
||||||
global using System.Threading.Tasks;
|
global using System.Threading.Tasks;
|
||||||
|
|
|
@ -4,11 +4,11 @@ namespace TanksServer.Graphics;
|
||||||
|
|
||||||
internal sealed class DrawPowerUpsStep(MapEntityManager entityManager) : IDrawStep
|
internal sealed class DrawPowerUpsStep(MapEntityManager entityManager) : IDrawStep
|
||||||
{
|
{
|
||||||
private readonly Sprite _genericSprite = Sprite.FromImageFile("assets/powerup_generic.png");
|
private readonly Sprite _genericSprite = Sprite.FromImageFile(Path.Combine(Program.AssetsDir, "powerup_generic.png"));
|
||||||
private readonly Sprite _smartSprite = Sprite.FromImageFile("assets/powerup_smart.png");
|
private readonly Sprite _smartSprite = Sprite.FromImageFile(Path.Combine(Program.AssetsDir, "powerup_smart.png"));
|
||||||
private readonly Sprite _magazineSprite = Sprite.FromImageFile("assets/powerup_magazine.png");
|
private readonly Sprite _magazineSprite = Sprite.FromImageFile(Path.Combine(Program.AssetsDir, "powerup_magazine.png"));
|
||||||
private readonly Sprite _explosiveSprite = Sprite.FromImageFile("assets/powerup_explosive.png");
|
private readonly Sprite _explosiveSprite = Sprite.FromImageFile(Path.Combine(Program.AssetsDir, "powerup_explosive.png"));
|
||||||
private readonly Sprite _fastSprite = Sprite.FromImageFile("assets/powerup_fastbullet.png");
|
private readonly Sprite _fastSprite = Sprite.FromImageFile(Path.Combine(Program.AssetsDir, "powerup_fastbullet.png"));
|
||||||
|
|
||||||
public void Draw(GamePixelGrid pixels)
|
public void Draw(GamePixelGrid pixels)
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,7 +5,7 @@ namespace TanksServer.Graphics;
|
||||||
internal sealed class DrawTanksStep(MapEntityManager entityManager) : IDrawStep
|
internal sealed class DrawTanksStep(MapEntityManager entityManager) : IDrawStep
|
||||||
{
|
{
|
||||||
private readonly SpriteSheet _tankSprites =
|
private readonly SpriteSheet _tankSprites =
|
||||||
SpriteSheet.FromImageFile("assets/tank.png", (int)MapService.TileSize, (int)MapService.TileSize);
|
SpriteSheet.FromImageFile(Path.Combine(Program.AssetsDir, "tank.png"), (int)MapService.TileSize, (int)MapService.TileSize);
|
||||||
|
|
||||||
public void Draw(GamePixelGrid pixels)
|
public void Draw(GamePixelGrid pixels)
|
||||||
{
|
{
|
||||||
|
|
|
@ -11,22 +11,44 @@ namespace TanksServer;
|
||||||
|
|
||||||
public static class Program
|
public static class Program
|
||||||
{
|
{
|
||||||
|
internal static string AssetsDir = (Environment.GetEnvironmentVariable("TANKSSERVER_ASSETS") ?? "./assets") + "/";
|
||||||
|
|
||||||
[RequiresUnreferencedCode("Calls Endpoints.Map")]
|
[RequiresUnreferencedCode("Calls Endpoints.Map")]
|
||||||
[RequiresDynamicCode("Calls Endpoints.Map")]
|
[RequiresDynamicCode("Calls Endpoints.Map")]
|
||||||
public static async Task Main(string[] args)
|
public static async Task Main(string[] args)
|
||||||
{
|
{
|
||||||
var app = Configure(args);
|
var app = Configure(args);
|
||||||
|
|
||||||
var clientFileProvider = new PhysicalFileProvider(Path.Combine(app.Environment.ContentRootPath, "client"));
|
app.Logger.LogInformation("Running in {}", app.Environment.ContentRootPath);
|
||||||
|
|
||||||
app.UseDefaultFiles(new DefaultFilesOptions { FileProvider = clientFileProvider });
|
AddStaticClientHost(app);
|
||||||
app.UseStaticFiles(new StaticFileOptions { FileProvider = clientFileProvider });
|
|
||||||
|
|
||||||
app.Services.GetRequiredService<Endpoints>().Map(app);
|
app.Services.GetRequiredService<Endpoints>().Map(app);
|
||||||
|
|
||||||
await app.RunAsync();
|
await app.RunAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void AddStaticClientHost(WebApplication app)
|
||||||
|
{
|
||||||
|
var clientDir = Environment.GetEnvironmentVariable("TANKSSERVER_CLIENT");
|
||||||
|
bool required = clientDir != null;
|
||||||
|
|
||||||
|
clientDir ??= Path.Combine(app.Environment.ContentRootPath, "client");
|
||||||
|
bool available = Directory.Exists(clientDir);
|
||||||
|
|
||||||
|
if (!available)
|
||||||
|
{
|
||||||
|
if (required)
|
||||||
|
throw new InvalidOperationException($"The environment variable TANKSSERVER_CLIENT is set, but the specified directory {clientDir} does not exist.");
|
||||||
|
app.Logger.LogError("Not providing static file host for client because {} does not exist", clientDir);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var clientFileProvider = new PhysicalFileProvider(clientDir);
|
||||||
|
app.UseDefaultFiles(new DefaultFilesOptions { FileProvider = clientFileProvider });
|
||||||
|
app.UseStaticFiles(new StaticFileOptions { FileProvider = clientFileProvider });
|
||||||
|
}
|
||||||
|
|
||||||
[RequiresUnreferencedCode("Calls Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure<TOptions>(IConfiguration)")]
|
[RequiresUnreferencedCode("Calls Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure<TOptions>(IConfiguration)")]
|
||||||
[RequiresDynamicCode("Calls Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure<TOptions>(IConfiguration)")]
|
[RequiresDynamicCode("Calls Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure<TOptions>(IConfiguration)")]
|
||||||
private static WebApplication Configure(string[] args)
|
private static WebApplication Configure(string[] args)
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PublishAot>true</PublishAot>
|
<!--<PublishAot>true</PublishAot>-->
|
||||||
<IsAotCompatible>true</IsAotCompatible>
|
<IsAotCompatible>true</IsAotCompatible>
|
||||||
<InvariantGlobalization>true</InvariantGlobalization>
|
<InvariantGlobalization>true</InvariantGlobalization>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
@ -26,11 +26,12 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="./assets/**" CopyToOutputDirectory="PreserveNewest" CopyToPublishDirectory="Always"/>
|
<None Include="./assets/**" CopyToOutputDirectory="PreserveNewest" CopyToPublishDirectory="Always" Condition="'$(ContinuousIntegrationBuild)'!='true'" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\servicepoint\crates\servicepoint_binding_uniffi\libraries\csharp\ServicePoint\ServicePoint.csproj" />
|
<ProjectReference Include="..\servicepoint-binding-uniffi\SericePoint\ServicePoint.csproj" Condition="'$(ContinuousIntegrationBuild)'!='true'" />
|
||||||
|
<PackageReference Include="ServicePoint" Version="*" Condition="'$(ContinuousIntegrationBuild)'=='true'"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
57
tanks-backend/deps.json
Normal file
57
tanks-backend/deps.json
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"pname": "DotNext",
|
||||||
|
"version": "5.3.0",
|
||||||
|
"hash": "sha256-q+VOteFEYhqkndjZq08ZGNlbR/SIqj/mwkAythFCo+c="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pname": "DotNext.Threading",
|
||||||
|
"version": "5.3.0",
|
||||||
|
"hash": "sha256-P8ITHieqi7fZSKJsyQNm0iusf9J1c+dmeiXLFrtr+d8="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pname": "Microsoft.Extensions.Configuration.Abstractions",
|
||||||
|
"version": "8.0.0",
|
||||||
|
"hash": "sha256-4eBpDkf7MJozTZnOwQvwcfgRKQGcNXe0K/kF+h5Rl8o="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pname": "Microsoft.Extensions.Configuration.Binder",
|
||||||
|
"version": "8.0.0",
|
||||||
|
"hash": "sha256-GanfInGzzoN2bKeNwON8/Hnamr6l7RTpYLA49CNXD9Q="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pname": "Microsoft.Extensions.DependencyInjection.Abstractions",
|
||||||
|
"version": "8.0.0",
|
||||||
|
"hash": "sha256-75KzEGWjbRELczJpCiJub+ltNUMMbz5A/1KQU+5dgP8="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pname": "Microsoft.Extensions.Options",
|
||||||
|
"version": "8.0.0",
|
||||||
|
"hash": "sha256-n2m4JSegQKUTlOsKLZUUHHKMq926eJ0w9N9G+I3FoFw="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pname": "Microsoft.Extensions.Options.ConfigurationExtensions",
|
||||||
|
"version": "8.0.0",
|
||||||
|
"hash": "sha256-A5Bbzw1kiNkgirk5x8kyxwg9lLTcSngojeD+ocpG1RI="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pname": "Microsoft.Extensions.Primitives",
|
||||||
|
"version": "8.0.0",
|
||||||
|
"hash": "sha256-FU8qj3DR8bDdc1c+WeGZx/PCZeqqndweZM9epcpXjSo="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pname": "SixLabors.ImageSharp",
|
||||||
|
"version": "3.1.5",
|
||||||
|
"hash": "sha256-3UehX9T+I81nfgv2dTHlpoPgYzXFk7kHr1mmlQOCBfw="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pname": "System.IO.Hashing",
|
||||||
|
"version": "8.0.0",
|
||||||
|
"hash": "sha256-szOGt0TNBo6dEdC3gf6H+e9YW3Nw0woa6UnCGGGK5cE="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pname": "System.Threading.Channels",
|
||||||
|
"version": "8.0.0",
|
||||||
|
"hash": "sha256-c5TYoLNXDLroLIPnlfyMHk7nZ70QAckc/c7V199YChg="
|
||||||
|
}
|
||||||
|
]
|
10
tanks-backend/gen-deps.sh
Executable file
10
tanks-backend/gen-deps.sh
Executable file
|
@ -0,0 +1,10 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
# first time
|
||||||
|
# dotnet restore --packages out
|
||||||
|
# nuget-to-json out > deps.json
|
||||||
|
|
||||||
|
# update
|
||||||
|
nix build .#servicepoint-tanks-backend.fetch-deps
|
||||||
|
./result deps.json
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit 93657c9f85d021c04270e1f5af573a6cda51f18a
|
|
1
tanks-backend/servicepoint-binding-csharp
Submodule
1
tanks-backend/servicepoint-binding-csharp
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit dcf8d12a8a23286aa1054e45f15f9757ec9cfcb6
|
Loading…
Add table
Add a link
Reference in a new issue