cleanup unused or orphaned files (#9)

* changed vue.instructions to be used for  *.vue, *.ts, *.js, *.scss
* remove unneeded files or files that may conflict with some peoples' protection meanings
* ToDos as the popped up during cleaning
This commit is contained in:
Bardioc26
2026-01-01 14:01:15 +01:00
committed by GitHub
parent d1986d6954
commit 8c7aa86181
43 changed files with 155 additions and 3960 deletions
-10
View File
@@ -1,10 +0,0 @@
Du bist ein Experte in Go und unterstützt bei der Erstellung eines Verwaltungsprogramms für Rollenspielcharaktere.
Das Programm soll über eine REST API angesprochen werden, um Charakterdaten zu speichern, zu verwalten und abzufragen.
Bitte beachte:
- Gib bei jeder Änderung alle veränderten Dateien vollständig aus.
- Stelle Rückfragen, um sicherzustellen, dass das Problem vollständig verstanden wurde.
- Fordere bei Bedarf zusätzliche Informationen, Dokumentationen oder Dateien an.
- Erstelle erste Antworten ausschließlich als Rückfragen und Klärungen konkrete Code-Ausgaben erfolgen erst im nächsten Schritt.
- Modularisiere Komponenten in kleine wiederverwendbare Teile
- Bitte gib präzise Antworten.
- Erkläre keine offensichtlichen Konzepte. Du kannst davon ausgehen, dass ich mich mit den meisten Programmierthemen auskenne.
-70
View File
@@ -1,70 +0,0 @@
# Version Management
## Current Version: 0.1.30
The backend version is managed in `/backend/config/version.go`.
## Updating the Version
To update the application version:
1. Edit `/backend/config/version.go`
2. Change the `Version` constant:
```go
const Version = "0.1.31" // Update this
```
## Git Commit Information
The git commit hash is automatically detected at runtime from:
1. `GIT_COMMIT` environment variable (preferred for Docker)
2. Git command output (works in development)
3. Falls back to "unknown" if neither is available
## Setting Git Commit in Docker
### Development Environment
Add to `docker/.env`:
```bash
GIT_COMMIT=$(git rev-parse --short HEAD)
```
Then restart the container:
```bash
cd docker
docker-compose -f docker-compose.dev.yml up -d backend-dev
```
### Production Build
Use build-time variable:
```bash
docker build --build-arg GIT_COMMIT=$(git rev-parse --short HEAD) .
```
Or set in docker-compose.yml:
```yaml
environment:
- GIT_COMMIT=${GIT_COMMIT:-unknown}
```
## API Endpoints
- **Public**: `GET /api/public/version` (no authentication)
- **Protected**: `GET /api/version` (requires JWT token)
Both return:
```json
{
"version": "0.1.30",
"gitCommit": "d0c177b"
}
```
## Frontend Integration
The landing page automatically fetches version information from `/api/public/version` and displays it.
To see the version in the frontend, visit: http://localhost:5173
-52
View File
@@ -1,52 +0,0 @@
#!/bin/bash
echo "=== Bamort .env Konfiguration Demo ==="
echo ""
# Erstelle verschiedene .env-Dateien für Demo
echo "# Development .env" > .env.dev.demo
echo "ENVIRONMENT=development" >> .env.dev.demo
echo "DEBUG=true" >> .env.dev.demo
echo "LOG_LEVEL=DEBUG" >> .env.dev.demo
echo "PORT=8180" >> .env.dev.demo
echo "" >> .env.dev.demo
echo "# Production .env" > .env.prod.demo
echo "ENVIRONMENT=production" >> .env.prod.demo
echo "DEBUG=false" >> .env.prod.demo
echo "LOG_LEVEL=INFO" >> .env.prod.demo
echo "PORT=8080" >> .env.prod.demo
echo "" >> .env.prod.demo
echo "1. Development-Konfiguration (.env.dev.demo):"
cat .env.dev.demo
echo ""
echo "2. Production-Konfiguration (.env.prod.demo):"
cat .env.prod.demo
echo ""
echo "3. Test mit Development-Konfiguration:"
cp .env.dev.demo .env
echo "Building and testing with development config..."
go run cmd/logging_demo.go 2>/dev/null | head -10
echo ""
echo "4. Test mit Production-Konfiguration:"
cp .env.prod.demo .env
echo "Building and testing with production config..."
go run cmd/logging_demo.go 2>/dev/null | head -10
echo ""
echo "5. Test mit Umgebungsvariablen-Override:"
echo "Setze DEBUG=false als Umgebungsvariable (sollte .env überschreiben)"
DEBUG=false go run cmd/logging_demo.go 2>/dev/null | head -10
echo ""
# Cleanup
rm -f .env.dev.demo .env.prod.demo
echo "=== Demo beendet ==="
echo ""
echo "Tipp: Kopiere .env.example nach .env und passe sie an deine Bedürfnisse an:"
echo "cp .env.example .env"
-72
View File
@@ -1,72 +0,0 @@
# Berechnung Werte und Boni
pa: 1d100 + 4xIn/10 - 20, // Persönliche Ausstrahlung
wk: 1d100 + 2x(Ko/10 + In/10) - 20, // Willenskraft
lp_max: 1d3 + 7 + (Ko/10), // Lebenspunkte (Maximum)
Gnome -3, Halblinge -2, Zwerge +1
ausdauer_bonus: Ko/10 + St/20, // Ausdauer Bonus
ap_max: 1d3 + 1 + ausdauer_bonus,
Barbar, Krieger, Waldläufer +2
andere Kämpfer, Schamane +1
schadens_bonus: St/20 + Gs/30 -3, // Schadens Bonus
b_max: 4d3 +16, // Bewegungsweite
Gnome: 2d3 +8
Halblinge: 2d3 +8
Zwerge: 3d3 + 12
angriffs_bonus: // Angriffs Bonus
GS 01-05: -2
GS 06-20: -1
GS 21-80: 0
GS 81-95: +1
GS 96-100: +2
abwehr_bonus: // Abwehr Bonus
GW 01-05: -2
GW 06-20: -1
GW 21-80: 0
GW 81-95: +1
GW 96-100: +2
zauber_bonus: // Zauber Bonus
Zt 01-05: -2
Zt 06-20: -1
Zt 21-80: 0
Zt 81-95: +1
Zt 96-100: +2
resistenz_bonus_koerper: // Resistenz Bonus Körper
für Menschen:
Ko 01-05: -2
Ko 06-20: -1
Ko 21-80: 0
Ko 81-95: +1
Ko 96-100: +2
zusätzlich: Kämpfer +1, Zauberer +2
für Nicht Menschen:
Elfen: +2
Gnome: +4
Halblinge: +4
Zwerge: +3
zusätzlich Kämpfer +1, Zauberer +2
resistenz_bonus_geist: // Resistenz Bonus Geist
für Menschen:
In 01-05: -2
In 06-20: -1
In 21-80: 0
In 81-95: +1
In 96-100: +2
zusätzlich: Zauberer +2
für Nicht Menschen:
Elfen: +2
Gnome: +4
Halblinge: +4
Zwerge: +3
zusätzlich Kämpfer 0, Zauberer +2
resistenz_koerper: 11 + resistenz_bonus_koerper, // Resistenz Körper
resistenz_geist: 11 + resistenz_bonus_geist, // Resistenz Geist
abwehr: 11 + abwehr_bonus, // Abwehr
zaubern: 11 + zauber_bonus, // Zaubern
raufen: (St + GW)/20 + angriffs_bonus // Raufen
zusätzlich: Zwerge +1
Fertigkeit:
Trinken: Ko/10
Wahrnehmung: +6
Sprache: +12 (Muttersprache)
Sprache: +12 (Gemeinsprache)
-63
View File
@@ -1,63 +0,0 @@
# Derived Values Implementation
## Summary
Static derived values (Resistenz Körper, Resistenz Geist, Abwehr, Zaubern, Raufen) are now stored in the database as part of the `Char` model. These values can increase when a new grade is reached.
Bonus values are calculated on-demand from the character's attributes using the `CalculateBonuses()` method.
## Database Fields Added to `Char`
- `ResistenzKoerper` (int) - Resistenz Körper base value
- `ResistenzGeist` (int) - Resistenz Geist base value
- `Abwehr` (int) - Abwehr base value
- `Zaubern` (int) - Zaubern base value
- `Raufen` (int) - Raufen base value
## Calculated Bonuses (Not Stored)
The following bonuses are calculated from attributes and are NOT stored in the database:
- `AusdauerBonus` = Ko/10 + St/20
- `SchadensBonus` = St/20 + Gs/30 - 3
- `AngriffsBonus` = attribute bonus from Gs
- `AbwehrBonus` = attribute bonus from Gw
- `ZauberBonus` = attribute bonus from Zt
- `ResistenzBonusKoerper` = attribute/race bonus from Ko
- `ResistenzBonusGeist` = attribute/race bonus from In
## Usage Example
```go
// Load character from database
var char models.Char
err := char.FirstID("123")
// Get static derived values (stored in DB)
resistenzKoerper := char.ResistenzKoerper
abwehr := char.Abwehr
// Calculate bonuses from attributes (on-demand)
bonuses := char.CalculateBonuses()
abwehrBonus := bonuses.AbwehrBonus
zauberBonus := bonuses.ZauberBonus
// Total values
totalAbwehr := char.Abwehr + bonuses.AbwehrBonus
totalZaubern := char.Zaubern + bonuses.ZauberBonus
```
## When Grade Increases
When a character reaches a new grade, the static derived values may increase. To update them:
```go
// After grade increase, recalculate and update static values
char.Grad++
char.ResistenzKoerper++ // or apply the appropriate grade bonus
char.Abwehr++
// Save updated character
database.DB.Save(&char)
```
Bonuses will automatically reflect any attribute changes without needing to update the database, as they are calculated on-demand from the `Eigenschaften` values.
-110
View File
@@ -1,110 +0,0 @@
# Lerneinheiten bei Spielbeginn
Kämpfer
Assassine (As)
Typische Fertigkeit: Meucheln+8 (Gs)
Alltag: 1 LE, Halbwelt: 2 LE, Sozial: 4 LE, Unterwelt:
8 LE
Waffen: 24 LE
Barbar (Bb)
Typische Fertigkeit: Spurensuche+8 (In) und Überleben+8 (In) in Heimatlandschaft*
Alltag: 2 LE, Freiland: 4 LE, Kampf: 1 LE, Körper: 2 LE
Waffen: 24 LE
Glücksritter (Gl)
Typische Fertigkeit: Fechten+5 (Gs) oder beidhändiger
Kampf+5 (Gs)
Alltag: 2 LE, Halbwelt: 3 LE, Sozial: 8 LE
Waffen: 24 LE
Händler (Hä)
Typische Fertigkeit: Geschäftssinn+8 (In)
Alltag: 4 LE, Sozial: 8 LE, Wissen: 4 LE
Waffen: 20 LE
Krieger (Kr)
Typische Fertigkeit: Kampf in Vollrüstung+5 (St)
Alltag: 2 LE, Kampf: 3 LE, Körper: 1 LE
Waffen: 36 LE
Spitzbube (Sp)
Typische Fertigkeit: Fallenmechanik+8 (Gs) oder Geschäftssinn+8 (In)
Alltag: 2 LE, Halbwelt: 6 LE, Unterwelt: 12 LE
Waffen: 20 LE
Waldläufer (Wa)
Typische Fertigkeit: Scharfschießen+5 (Gs)
Alltag: 1 LE, Freiland: 11 LE, Körper: 4 LE
Waffen: 20 LE
Zauberkundige Kämpfer
Barde (Ba)
Typische Fertigkeit: Musizieren+12 (Gs) und Landeskunde+8 (In) für Heimat
Alltag: 2 LE, Sozial: 4 LE, Wissen: 4 LE
Waffen: 16 LE
Zauber: 3 LE (Zauberlieder)
Ordenskrieger (Or)
Typische Fertigkeit: Athletik+8 (St) oder Meditieren+8
(Wk)
Alltag: 2 LE, Kampf: 3 LE, Wissen: 2 LE
Waffen: 18 LE
Zauber: 3 LE (Wundertaten)
Zauberer
Druide (Dr)
Typische Fertigkeit: Pflanzenkunde+8 (In) und Schreiben+12 (In) für Ogam-Zeichen
Alltag: 2 LE, Freiland: 4 LE, Wissen: 2 LE
Waffen: 6 LE
Zauber: 5 LE (Dweomer)
Typischer Zauber: Tiere rufen
Hexer (Hx)
Typische Fertigkeit: Gassenwissen+8 (In) oder Verführen+8 (pA)
Alltag: 3 LE, Sozial: 2 LE, Wissen: 2 LE
Waffen: 2 LE
Zauber: 6 LE (Beherrschen, Verändern)
Typischer Zauber: Verwünschen oder Binden des Vertauten
Magier (Ma)
Typische Fertigkeit: Zauberkunde+8 (In) und Schreiben+12 (In) für Muttersprache**
Alltag: 1 LE, Wissen: 5 LE
Waffen: 2 LE
Zauber: 7 LE (beliebig außer Dweomer, Wundertaten,
Zauberlieder)
Typischer Zauber: Erkennen von Zauberei
Priester, Beschützer (PB)
Typische Fertigkeit: Menschenkenntnis+8 (In) und
Schrei ben+12 (In) für Muttersprache**
Alltag: 2 LE, Sozial: 2 LE, Wissen: 3 LE
Waffen: 6 LE
Zauber: 5 LE (Wundertaten)
Typischer Zauber: Heilen von Wunden
Priester, Streiter (PS)
Typische Fertigkeit: Erste Hilfe+8 (Gs) und Schreiben+12 (In) für Muttersprache**
Alltag: 3 LE, Kampf: 2 LE, Wissen: 2 LE
Waffen: 8 LE
Zauber: 5 LE (Wundertaten)
Typischer Zauber: Bannen von Finsterwerk oder Strahlender Panzer
Schamane (Sc)
Typische Fertigkeit: Tierkunde+8 (In) und Überleben+8 (In) in Heimatlandschaft*
Alltag: 2 LE, Körper: 4 LE, Wissen: 2 LE
Waffen: 6 LE
Zauber: 5 LE (Dweomer, Wundertaten)
Typischer Zauber: Austreibung des Bösen oder Bannen von Gift
*: Gebirge, Steppe oder Wald - je nach Lebensraum seines Stammes
**: abhängig von der Heimat (s. S. 127 für eine Liste der Sprachen)
Standesfertigkeiten
Unfreie: 2 LE für Halbwelt
Volk: 2 LE für Alltag
Mittelschicht: 2 LE für Wissen
Adel: 2 LE für Sozial, leicht
-361
View File
@@ -1,361 +0,0 @@
# Charakterklassen und die für sie verwendeten Abkürzungen
"As": "Assassine",
"Bb": "Barbar",
"Gl": "Glücksritter",
"Hä": "Händler",
"Kr": "Krieger",
"Sp": "Spitzbube",
"Wa": "Waldläufer",
"Ba": "Barde",
"Or": "Ordensritter",
"Dr": "Druide",
"Hx": "Hexer",
"Ma": "Magier",
"PB": "Priester Beschützers",
"PS": "Priester Streiter",
"Sc": "Schamane",
# Kosten
Geldkosten: 20 GS je TE, 200 GS je LE
Tabelle 8: EP-Kosten für 1 Trainingseinheit (TE)
1 Lerneinheit (LE) kostet das Dreifache an EP (+ 6 EP für Elfen)
| Klasse | Alltag | Freil. | Halbw. | Kampf | Körper | Sozial | Unterw. | Waffen | Wissen |
|--------|--------|--------|--------|-------|--------|--------|---------|--------|--------|
| As | 20 | 20 | 20 | 30 | 10 | 20 | 10 | 20 | 20 |
| Bb | 20 | 10 | 30 | 10 | 10 | 30 | 30 | 20 | 40 |
| Gl | 20 | 30 | 10 | 20 | 30 | 10 | 30 | 20 | 20 |
| Hä | 10 | 20 | 20 | 20 | 20 | 10 | 40 | 20 | 20 |
| Kr | 20 | 30 | 30 | 10 | 20 | 20 | 30 | 10 | 40 |
| Sp | 20 | 30 | 10 | 40 | 10 | 10 | 10 | 20 | 30 |
| Wa | 20 | 10 | 20 | 20 | 10 | 30 | 30 | 20 | 20 |
| Ba | 20 | 20 | 20 | 30 | 20 | 10 | 40 | 20 | 20 |
| Or | 20 | 20 | 40 | 20 | 10 | 20 | 40 | 20 | 30 |
| Dr | 20 | 10 | 40 | 40 | 20 | 30 | 40 | 40 | 10 |
| Hx | 20 | 20 | 30 | 40 | 30 | 20 | 30 | 40 | 20 |
| Ma | 20 | 30 | 40 | 40 | 30 | 30 | 40 | 40 | 10 |
| PB | 20 | 30 | 30 | 40 | 30 | 10 | 40 | 40 | 20 |
| PS | 20 | 30 | 40 | 30 | 30 | 30 | 40 | 30 | 20 |
| Sc | 20 | 10 | 40 | 40 | 20 | 20 | 40 | 40 | 20 |
Geldkosten: 100 GS je LE
Lernen von Spruchrollen: 1/3 EP je LE bei Erfolg, pauschal 20 GS je Lernversuch
*: Ma erhalten LE für Sprüche aus ihrem Spezialgebiet für 30 EP
Tabelle 9: EP-Kosten für 1 Lerneinheit (LE) für Zauber (+ 6 EP für Elfen).
| Klasse | Beherr. | Beweg. | Erkenn. | Erschaff. | Formen | Veränd. | Zerstören | Wunder | Dweom. | Lied |
|--------|---------|--------|---------|-----------|--------|---------|-----------|--------|---------|------|
| Dr | 90 | 60 | 120 | 90 | 60 | 90 | 120 | - | 30 | - |
| Hx | 30 | 90 | 90 | 90 | 60 | 30 | 60 | - | 90 | - |
| Ma* | 60 | 60 | 60 | 60 | 60 | 60 | 60 | - | - | - |
| PB | 60 | 90 | 60 | 90 | 120 | 120 | 90 | 30 | - | - |
| PS | 90 | 90 | 90 | 60 | 120 | 120 | 60 | 30 | - | - |
| Sc | 60 | 90 | 60 | 120 | 120 | 60 | 60 | 60 | 60 | - |
| Ba | - | - | - | - | - | - | - | - | - | 30 |
| Or | - | - | - | - | - | - | - | 30 | - | - |
# Lern- und Trainingskosten (LE & TE) Seiten 158162
Allgemeiner Hinweis:
* LE = Lerneinheit (zum Erlernen einer neuen Fähigkeit)
* TE = Trainingseinheit (zur Steigerung einer bekannten Fähigkeit)
Ein Lernwert wie „Reiten+12 (Gw)“ bedeutet, dass der Fertigkeitswert 12 beträgt und die zugehörige * Eigenschaft „Gewandtheit“ (Gw) ist.
# Alltag
Lernen:
Schwierigkeit Einträge
leicht (1 LE) Bootfahren+12 (Gs), Glücksspiel+12 (Gs), Klettern+12 (St), Musizieren+12 (Gs), Reiten+12 (Gw), Schwimmen+12 (Gw), Seilkunst+12 (Gs), Wagenlenken+12 (Gs)
normal (1 LE) Schreiben+8 (In), Sprache+8 (In)
schwer (2 LE) Erste Hilfe+8 (Gs), Etikette+8 (In)
sehr schwer (10 LE) Gerätekunde+8 (In), Geschäftssinn+8 (In)
Verbessern (TE):
Stufe +9 +10 +11 +12 +13 +14 +15 +16 +17 +18
leicht 1 2 5 10 10 20
normal 1 1 1 1 2 2 5 10 10 20
schwer 2 2 5 5 10 10 20 20 50 50
s. schwer 5 5 10 10 20 20 50 50 100 100
# Freiland
Lernen:
Schwierigkeit Einträge
leicht (1 LE) Überleben+8 (In)
normal (2 LE) Naturkunde+8 (In), Pflanzenkunde+8 (In), Tierkunde+8 (In)
schwer (4 LE) Schleichen+8 (Gw), Spurensuche+8 (In), Tarnen+8 (Gw)
Verbessern (TE):
Stufe +9 +10 +11 +12 +13 +14 +15 +16 +17 +18
leicht 1 1 1 2 2 2 5 5 10 10
normal 2 5 5 10 10 20 20 20 50 50
schwer 5 5 10 10 20 20 50 50 100 100
# Halbwelt
Lernen:
Schwierigkeit Einträge
leicht (1 LE) Balancieren+12 (Gw), Fälschen+12 (Gs), Gaukeln+12 (Gs), Glücksspiel+12 (Gs), Klettern+12 (St)
normal (2 LE) Akrobatik+8 (Gw)
schwer (2 LE) Gassenwissen+8 (In), Stehlen+8 (Gs)
sehr schwer (10 LE) Betäuben+8 (Gs)
Verbessern (TE):
Stufe +9 +10 +11 +12 +13 +14 +15 +16 +17 +18
leicht 1 2 5 10 10 20
normal 2 2 5 5 10 10 20 20 50 50
schwer 2 5 5 10 10 20 20 50 50 50
s. schwer 5 10 20 20 30 50 80 80 100 100
# Kampf
Lernen:
Schwierigkeit Einträge
leicht (1 LE) Geländelauf+12 (Gw), Reiten+12 (Gw), Reiterkampf+12 (Gw)
normal (2 LE) Anführen+8 (pA), Athletik+8 (St)
schwer (10 LE) Betäuben+8 (Gs)
s. schwer (10 LE) Beidhändiger Kampf+5 (Gs), Kampf in Vollrüstung+5 (St), Fechten+5 (Gs), Scharfschießen+5 (Gs)
Verbessern (TE):
Stufe +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18
leicht 1 2 5 10 10 20
normal 2 2 5 5 10 10 20 20 50 50
schwer 5 10 20 20 30 50 80 80 100 100
s. schwer 2 5 10 10 20 20 30 50 50 100 100 150 200
# Sozial
Lernen:
Schwierigkeit Einträge
leicht (2 LE) Anführen+8 (pA), Etikette+8 (In), Verführen+8 (pA), Verstellen+8 (pA)
normal (2 LE) Beredsamkeit+8 (pA), Gassenwissen+8 (In), Verhören+8 (pA)
schwer (4 LE) Menschenkenntnis+8 (In)
Verbessern (TE):
Stufe +9 +10 +11 +12 +13 +14 +15 +16 +17 +18
leicht 2 2 5 5 10 10 20 20 50 50
normal 2 5 5 10 10 20 20 50 50 50
schwer 5 5 10 10 20 20 50 50 100 100
# Körper
Lernen:
Schwierigkeit Einträge
leicht (1 LE) Balancieren+12 (Gw), Geländelauf+12 (Gw), Klettern+12 (St), Schwimmen+12 (Gw)
normal (1 LE) Tauchen+8 (Ko)
schwer (2 LE) Akrobatik+8 (Gw), Athletik+8 (St), Laufen+8 (Ko), Meditieren+8 (Wk)
Verbessern (TE):
Stufe +9 +10 +11 +12 +13 +14 +15 +16 +17 +18
leicht 1 2 5 10 10 20
normal 1 1 2 2 5 10 10 20 20 50
schwer 2 2 5 5 10 10 20 20 50 50
# Unterwelt
Lernen:
Schwierigkeit Einträge
leicht (2 LE) Gassenwissen+8 (In), Stehlen+8 (Gs)
normal (4 LE) Fallen entdecken+8 (In), Schleichen+8 (Gw), Schlösser öffnen+8 (Gs), Spurensuche+8 (In), Tarnen+8 (Gw)
schwer (10 LE) Fallenmechanik+8 (Gs), Meucheln+8 (Gs)
Verbessern (TE):
Stufe +9 +10 +11 +12 +13 +14 +15 +16 +17 +18
leicht 2 5 5 10 10 20 20 50 50 50
normal 5 5 10 10 20 20 50 50 100 100
schwer 5 10 20 20 30 50 80 80 100 100
# Waffen
Lernen:
Schwierigkeit Einträge
leicht (2 LE) Spießwaffen+5, Stichwaffen+5, Zauberstäbe+5* - Schilde+1,
normal (4 LE) Einhandschlagwaffen+5, Einhandschwerter+5- Stielwurfwaffen+5,
Wurfklingen+5, Wurfspieße+5 - Parierwaffen+1
schwer (6 LE) Fechtwaffen+5, Zweihandschlagwaffen+5, Zweihandschwerter+5 -
Armbrüste+5, Blasrohre+5, Bögen+5, Schleudern+5, Wurfscheiben+5
sehr schwer (8 LE) Kettenwaffen+5, Stockwaffen+5, waffenloser Kampf+5
Hinweis: Waffenfertigkeiten steigen langsamer und kostenintensiver mit zunehmendem Wert.
Verbessern (TE):
Stufe +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18
leicht 1 1 1 2 2 5 10 20 50 100 100 150 150
normal 1 1 2 2 5 10 20 50 50 100 150 150 200
schwer 1 2 2 5 5 10 20 50 100 150 200 300 300
sehr schwer 1 2 2 5 10 20 50 100 150 200 300 300 400
Schilde und Parierwaffen
+2 +3 +4 +5 +6 +7 +8
1 2 10 30 50 100 150
# Wissen
Lernen:
Schwierigkeit Einträge
leicht (1 LE) Lesen von Zauberschrift+8 (In), Schreiben+8 (In), Sprache+8 (In)
normal (2 LE) Erste Hilfe+8 (Gs), Meditieren+8 (Wk)
schwer (2 LE) Alchimie+8 (In), Heilkunde+8 (In), Landeskunde+8 (In), Naturkunde+8 (In), Pflanzenkunde+8 (In), Tierkunde+8 (In), Zauberkunde+8 (In)
Wissenstalente erfordern meist hohe Intelligenz und langfristige Investition.
Verbessern (TE):
Stufe +9 +10 +11 +12 +13 +14 +15 +16 +17 +18
leicht 1 1 1 1 2 2 5 10 10 20
normal 2 2 5 5 10 10 20 20 50 50
schwer 2 5 5 10 10 20 20 20 50 50
# Körperbeherrschung
Lernen:
Schwierigkeit Einträge
leicht (1 LE) Balancieren+12 (Gw), Geländelauf+12 (Gw), Klettern+12 (St), Schwimmen+12 (Gw)
normal (1 LE) Tauchen+8 (Ko)
schwer (2 LE) Akrobatik+8 (Gw), Athletik+8 (St), Laufen+8 (Ko), Meditieren+8 (Wk)
Verbessern (TE):
Stufe +9 +10 +11 +12 +13 +14 +15 +16 +17 +18
leicht - - - - 1 2 5 10 10 20
normal 1 1 2 2 5 10 10 20 20 50
schwer 2 2 5 5 10 10 20 20 50 50
# Lernliste Zauber
Die folgende Liste gibt einen
Überblick über die Zauberfähigkeiten, die im Arkanum näher beschrieben sind. Sie sind jeweils nach der für die Lernkosten wichtigen Stufe sortiert, wobei die Zaubersprüche nachder Spezialisierung gegliedert sind.
Hier ist der erste Teil des gewünschten Obsidian-kompatiblen Tabellenformats für die Zauberfähigkeiten:
### Dweomerzauber
| Zauber | Stufe |
| :------------------------- | ----: |
| Kraftspende | 1 |
| Linienlesen | 1 |
| Bärenwut | 2 |
| Baum | 2 |
| Erkennen von Krankheit | 2 |
| Mutlosigkeit | 2 |
| Wandeln wie der Wind | 2 |
| Wundersame Tarnung | 2 |
| Zähmen | 2 |
| Fährtendurft | 3 |
| Lebensflammen | 3 |
| Lindern von Krankheit | 3 |
| Wittern | 3 |
| Zaubersprung | 3 |
| Bannen von Gift | 4 |
| Entgiften | 4 |
| Erkennen von Gift | 4 |
| Lebensstärkung | 4 |
| Naturgeist rufen | 4 |
| Rindenhaut | 4 |
| Schwarm | 4 |
| Tierischer Helfer | 4 |
| Elfenfeuer | 5 |
| Elfenklinge | 5 |
| Feenfluch | 5 |
| Laufen wie der Wind | 5 |
| Lebenskeule | 5 |
| Lebensrettung | 5 |
| Ring des Lebens | 5 |
| Schutzgeist | 5 |
| Tiere rufen | 5 |
| Feenschutz | 6 |
| Feenschwert | 6 |
| Göttliche Eingebung | 8 |
| Rüstung d. Rechtschaffenen | 8 |
| Wort des Lebens | 8 |
| Wort der Trauer | 8 |
| Allheilung | 9 |
| Erheben der Toten | 12 |
### Zauberlied
| Zauber | Stufe |
| :------------------------------ | ----: |
| Das Lied der Feier | 1 |
| Das Lied der Tapferkeit | 1 |
| Die anfeuernde Ballade | 2 |
| Die stählende Ballade | 2 |
| Das Lied des Fesselns | 3 |
| Das Lied der Ruhe | 3 |
| Das Lied des Spottes | 3 |
| Das Lied der Verführung | 3 |
| Das Lied des Wagemuts | 3 |
| Das Loblied | 3 |
| Der verunsichernde Gesang | 3 |
| Der einschläfernde Gesang | 4 |
| Der frohlockende Gesang | 4 |
| Der traurige Gesang | 4 |
| Das Lied der Tanzlust | 5 |
| Die Klänge der Linderung | 5 |
| Die Klänge des Zusammenwachsens | 5 |
| Die überzeugende Stimme | 5 |
| Das Lied der verborg. Kraft | 6 |
| Der betäubende Gesang | 6 |
| Die Hymne der Ordnung | 6 |
| Die Klänge der Genesung | 6 |
| Das Lied des Erinnerns | 7 |
| Das Lied der Liebe | 7 |
| Das Lied des Vergessens | 7 |
| Das Lied der Verzweifl ung | 7 |
| Das Lied der Lockung | 8 |
| Das Lied des Grauens | 9 |
| Das Lied des Wahnsinns | 9 |
| Das Lied des Friedens | 10 |
| Das Lied der Zwietracht | 10 |
| Das Lied des Zorns | 11 |
Hier ist die Tabelle im Obsidian-Markdown-Format für die Kategorien **„Spruch: Beherrschen“** und **„Wundertat“**:
---
### Spruch: Beherrschen
| Zauber | Stufe |
| :---------------------- | ----: |
| Macht über das Selbst | 1 |
| Schlummer | 1 |
| Feuerbienen | 6 |
| Schnellheilung | 6 |
| Lindern von Entkräftung | 7 |
| Linienwanderung | 8 |
| Schlachtenwahnsinn | 8 |
| Zeichen des Lebens | 8 |
| Grüne Hand | 9 |
| Tiergestalt | 9 |
---
### Wundertat
| Zauber | Stufe |
| :------------------------- | ----: |
| Göttl. Schutz v. d. Bösen | 1 |
| Reinigen | 1 |
| Bannen von Dunkelheit | 2 |
| Blutmeisterschaft | 2 |
| Erkennen der Aura | 2 |
| Erkennen von Krankheit | 2 |
| Handauflegen | 2 |
| Heiliger Zorn | 2 |
| Schützende Hülle | 2 |
| Schwingenkeule | 2 |
| Arm der Götter | 3 |
| Erkennen von Besessenheit | 3 |
| Segnen | 3 |
| Verfluchen | 3 |
| Wagemut | 3 |
| Austreibung des Bösen | 4 |
| Bannen von Finsterwerk | 4 |
| Bannen von Gift | 4 |
| Erholung | 4 |
| Göttlicher Schirm | 4 |
| Heilen von Krankheit | 4 |
| Heilen von Wunden | 4 |
| Himmlicher Beschützer | 4 |
| Himmlicher Helfer | 4 |
| Seelenheilung | 4 |
| Strahlender Panzer | 4 |
| Beruhigen | 5 |
| Goldene Wehr | 5 |
| Gottesgabe | 5 |
| Göttlicher Blitz | 5 |
| Göttlicher Schutz v. Magie | 5 |
| Waffensegen | 5 |
| Heilen schwerer Wunden | 6 |
| Vision | 6 |
| Waffenwirbel | 6 |
| Heiliges Wort | 7 |
---
Möchtest du, dass ich mit den restlichen Kategorien (z.B. *Bewegen*, *Erkennen*, *Erschaffen*) weitermache?
-55
View File
@@ -1,55 +0,0 @@
# Run go Tests
## Benchmarks
### Run all benchmarks
go test -bench=. -benchmem ./models
### Run specific category
go test -bench=BenchmarkSource -benchmem ./models
### Run lightweight benchmarks only
go test -bench=BenchmarkSimple -benchmem ./models
### Run parallel benchmarks
go test -bench=Parallel -benchmem ./models
## Coverage
go test ./equipment/... -cover
go test ./equipment/... -coverprofile=coverage.out
go tool cover -func=coverage.out
go tool cover -html=coverage.out -o coverage.html
### eval Coverage
mode: set
bamort/equipment/handlers.go:18.67,20.2 1 1
bamort/equipment/handlers.go:22.40,24.55 2 1
bamort/equipment/handlers.go:24.55,27.3 2 1
bamort/equipment/handlers.go:29.2,29.63 1 1
bamort/equipment/handlers.go:29.63,32.3 2 0
bamort/equipment/handlers.go:34.2,34.41 1 1
bamort/equipment/handlers.go:37.38,41.100 3 1
bamort/equipment/handlers.go:41.100,44.3 2 0
bamort/equipment/handlers.go:46.2,46.36 1 1
bamort/equipment/handlers.go:49.40,53.77 3 1
bamort/equipment/handlers.go:53.77,56.3 2 1
bamort/equipment/handlers.go:58.2,58.55 1 1
bamort/equipment/handlers.go:58.55,61.3 2 1
bamort/equipment/handlers.go:63.2,63.61 1 1
bamort/equipment/handlers.go:63.61,66.3 2 0
bamort/equipment/handlers.go:68.2,68.36 1 1
bamort/equipment/handlers.go:71.40,73.89 2 1
bamort/equipment/handlers.go:73.89,76.3 2 1
bamort/equipment/handlers.go:78.2,78.77 1 1
Looking at the coverage.out file, you can see which lines are covered. The format is:
file:startLine.startCol,endLine.endCol numStatements covered
Where the last number indicates if the line is covered:
1 = covered
0 = not covered
From your coverage.out, I can see these uncovered lines (marked with 0):
Line 29-32: bamort/equipment/handlers.go:29.63,32.3 2 0 - Database error handling in CreateAusruestung
Line 41-44: bamort/equipment/handlers.go:41.100,44.3 2 0 - Database error handling in ListAusruestung
Line 63-66: bamort/equipment/handlers.go:63.61,66.3 2 0 - Database save error handling in UpdateAusruestung
@@ -1,56 +0,0 @@
// Beispiel für Anfragen an die API für die Frontend-Entwicklung
/*
1. Anfrage zum Erlernen einer neuen Fertigkeit:
*/
fetch('/api/characters/123/skill-cost', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Schwimmen',
type: 'skill',
action: 'learn'
}),
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
/*
2. Anfrage zum Verbessern einer vorhandenen Fertigkeit:
*/
fetch('/api/characters/123/skill-cost', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Schwimmen',
current_level: 12,
type: 'skill',
action: 'improve'
}),
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
/*
3. Anfrage zum Erlernen eines neuen Zaubers:
*/
fetch('/api/characters/123/skill-cost', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Feuerball',
type: 'spell',
action: 'learn'
}),
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
-18
View File
@@ -1,18 +0,0 @@
/*
API Testing
Register User:
POST /register
Body: { "username": "test", "password": "12345", "email": "test@example.com" }
Login User:
POST /login
Body: { "username": "test", "password": "12345" }
Create Character:
POST /characters
Body: { "user_id": 1, "name": "Hero", "rasse": "Elf", "typ": "Warrior", "age": 25 }
Get Characters:
GET /characters
*/
-153
View File
@@ -1,153 +0,0 @@
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL
);
CREATE TABLE characters (
character_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
name VARCHAR(100),
rasse VARCHAR(50),
typ VARCHAR(50),
age INT,
anrede VARCHAR(20),
grad INT,
groesse INT,
gewicht INT,
glaube VARCHAR(100),
hand VARCHAR(20),
image VARCHAR(255),
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
CREATE TABLE eigenschaften (
eigenschaften_id INT AUTO_INCREMENT PRIMARY KEY,
character_id INT NOT NULL,
au INT,
gs INT,
gw INT,
`in` INT,
ko INT,
pa INT,
st INT,
wk INT,
zt INT,
FOREIGN KEY (character_id) REFERENCES characters(character_id)
);
CREATE TABLE ausruestung (
ausruestung_id INT AUTO_INCREMENT PRIMARY KEY,
character_id INT NOT NULL,
name VARCHAR(100),
anzahl INT,
gewicht FLOAT,
wert FLOAT,
beinhaltet_in VARCHAR(255),
beschreibung TEXT,
bonus INT DEFAULT NULL,
ist_magisch BOOLEAN,
abw INT,
ausgebrannt BOOLEAN,
FOREIGN KEY (character_id) REFERENCES characters(character_id)
);
CREATE TABLE behaeltnisse (
behaeltnisse_id INT AUTO_INCREMENT PRIMARY KEY,
character_id INT NOT NULL,
name VARCHAR(100),
gewicht FLOAT,
volumen FLOAT,
tragkraft FLOAT,
wert FLOAT,
beinhaltet_in VARCHAR(255),
beschreibung TEXT,
ist_magisch BOOLEAN,
abw INT,
ausgebrannt BOOLEAN,
FOREIGN KEY (character_id) REFERENCES characters(character_id)
);
CREATE TABLE fertigkeiten (
fertigkeiten_id INT AUTO_INCREMENT PRIMARY KEY,
character_id INT NOT NULL,
name VARCHAR(100),
fertigkeitswert INT,
pp INT DEFAULT NULL,
bonus INT DEFAULT NULL,
beschreibung TEXT,
quelle VARCHAR(100),
FOREIGN KEY (character_id) REFERENCES characters(character_id)
);
CREATE TABLE waffen (
waffen_id INT AUTO_INCREMENT PRIMARY KEY,
character_id INT NOT NULL,
name VARCHAR(100),
gewicht FLOAT,
wert FLOAT,
anzahl INT,
beinhaltet_in VARCHAR(255),
beschreibung TEXT,
abwb INT,
anb INT,
schb INT,
name_fuer_spezialisierung VARCHAR(100),
ist_magisch BOOLEAN,
abw INT,
ausgebrannt BOOLEAN,
FOREIGN KEY (character_id) REFERENCES characters(character_id)
);
CREATE TABLE zauber (
zauber_id INT AUTO_INCREMENT PRIMARY KEY,
character_id INT NOT NULL,
name VARCHAR(100),
bonus INT DEFAULT NULL,
beschreibung TEXT,
quelle VARCHAR(100),
FOREIGN KEY (character_id) REFERENCES characters(character_id)
);
CREATE TABLE bennies (
bennies_id INT AUTO_INCREMENT PRIMARY KEY,
character_id INT NOT NULL,
gg INT,
gp INT,
sg INT,
FOREIGN KEY (character_id) REFERENCES characters(character_id)
);
CREATE TABLE transportmittel (
transportmittel_id INT AUTO_INCREMENT PRIMARY KEY,
character_id INT NOT NULL,
name VARCHAR(100),
gewicht FLOAT,
wert FLOAT,
tragkraft FLOAT,
beinhaltet_in VARCHAR(255),
beschreibung TEXT,
ist_magisch BOOLEAN,
abw INT,
ausgebrannt BOOLEAN,
FOREIGN KEY (character_id) REFERENCES characters(character_id)
);
CREATE TABLE erfahrungsschatz (
erfahrungsschatz_id INT AUTO_INCREMENT PRIMARY KEY,
character_id INT NOT NULL,
value INT,
FOREIGN KEY (character_id) REFERENCES characters(character_id)
);
/*
Summary
This schema reflects the modular structure of the CharType definition. Each substructure is normalized into its own table, ensuring:
Scalability.
Clear relationships using foreign keys.
Multi-user handling through the users table.
*/
-93
View File
@@ -1,93 +0,0 @@
{
"baseLearnCost": {
"Alltag": { "leicht": 1, "normal": 1, "schwer": 2, "sehr_schwer": 10 },
"Freiland": { "leicht": 1, "normal": 2, "schwer": 4 },
"Halbwelt": { "leicht": 1, "normal": 1, "schwer": 2, "sehr_schwer": 10 },
"Kampf": { "leicht": 1, "normal": 1, "schwer": 2, "sehr_schwer": 10 },
"Körperbeherrschung": { "leicht": 1, "normal": 1, "schwer": 2, "sehr_schwer": 10 },
"Sozial": { "leicht": 1, "normal": 1, "schwer": 2, "sehr_schwer": 10 },
"Unterwelt": { "leicht": 1, "normal": 1, "schwer": 2, "sehr_schwer": 10 },
"Waffer": { "leicht": 1, "normal": 1, "schwer": 2, "sehr_schwer": 10 },
"Wissen": { "leicht": 2, "normal": 2, "schwer": 4, "sehr_schwer": 12 }
},
"spellLearnCost":{
"1":1,"2":1,"3":2,"4":3,"5":5,"6":10,"7":15,"8":20,"9":30,"10":40,"11":60,"12":90
},
"improvementCost": {
"Alltag": {
"leicht": {"6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 2, "15":5, "16": 10,"17": 10 ,"18": 20 },
"normal": { "6":0,"7":0,"8":0, "9":1, "10": 1, "11":1, "12": 1,"13": 2, "14": 2, "15":5, "16": 10,"17": 10 ,"18": 20 },
"schwer": {"6":0,"7":0,"8":0, "9":2, "10": 2, "11":5, "12": 5,"13": 10, "14": 10, "15":20, "16": 20,"17": 50 ,"18": 50 },
"sehr_schwer": { "9":5, "10": 5, "11":10, "12": 10,"13": 20, "14": 20, "15":50, "16": 50,"17": 100 ,"18": 100 }
},
"Freiland": {
"leicht": { "6":0,"7":0,"8":0, "9":1, "10": 1, "11":1, "12": 2,"13": 2, "14": 2, "15":5, "16": 5,"17": 10 ,"18": 10 },
"normal": { "6":0,"7":0,"8":0, "9":2, "10": 5, "11":5, "12": 10,"13": 10, "14": 20, "15":20, "16": 20,"17": 50 ,"18": 50 },
"schwer": {"6":0,"7":0,"8":0, "9":5, "10": 5, "11":10, "12": 10,"13": 20, "14": 20, "15":50, "16": 50,"17": 100 ,"18": 100 }
},
"Halbwelt": {
"leicht": {"6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"normal": {"6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"schwer": {"6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"sehr_schwer": { "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 }
},
"Kampf": {
"leicht": {"6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"normal": {"6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"schwer": {"6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"sehr_schwer": { "6":2,"7":5,"8":10,"9":10, "10": 20, "11":20, "12": 30,"13": 50, "14": 50, "15":100, "16": 100,"17": 150 ,"18": 200 }
},
"Körperbeherrschung": {
"leicht": { "6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"normal": {"6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"schwer": {"6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"sehr_schwer": { "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 }
},
"Sozial": {
"leicht": {"6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"normal": {"6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"schwer": {"6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"sehr_schwer": { "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 }
},
"Unterwelt": {
"leicht": {"6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"normal": {"6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"schwer": {"6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"sehr_schwer": { "6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 }
},
"Waffer": {
"leicht": { "6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"normal": { "6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"schwer": { "6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"sehr_schwer": {"6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 }
},
"Wissen": {
"leicht": { "6":0,"7":0,"8":0, "9":1, "10": 1, "11":1, "12": 1,"13": 2, "14": 2, "15":5, "16": 10,"17": 10 ,"18": 20 },
"normal": { "6":0,"7":0,"8":0, "9":2, "10": 2, "11":5, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"schwer": {"6":0,"7":0,"8":0, "9":2, "10": 5, "11":5, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 },
"sehr_schwer": {"6":0,"7":0,"8":0, "9":0, "10": 0, "11":0, "12": 0,"13": 1, "14": 0, "15":0, "16": 0,"17": 1 ,"18": 1 }
}
},
"epPerTE": {
"Krieger": {"Alltag": 20,"Freiland": 30, "Halbwelt":30, "Kampf":10, "Körperbeherrschung":20, "Sozial":20, "Unterwelt":30, "Waffer":10, "Wissen":40 },
"Hexer": {"Alltag": 20,"Freiland": 20, "Halbwelt":30, "Kampf":40, "Körperbeherrschung":30, "Sozial":20, "Unterwelt":30, "Waffer":40, "Wissen":20 },
"Magier": { "Alltag": 30, "Freiland": 30 },
"Schurke": { "Alltag": 10, "Freiland": 30, "Kampf": 30 }
},
"SpellEPPerSchoolByClass":{
"Hexer": {
"Beherrschen":30, "Beweg":90, "Erken":90, "Erschaff":90, "Formen":60, "Verändern":30, "Zerstören":60, "Wunder":0, "Dweomer":90, "Lied":0
},
"Magier": {
"Beherrschen":60, "Beweg":60, "Erken":60, "Erschaff":60, "Formen":60, "Verändern":60, "Zerstören":60, "Wunder":0, "Dweomer":0, "Lied":0
}
},
"allowedSchools": {
"Hexer": {
"Beherrschen":true, "Beweg":true, "Erken":true, "Erschaff":true, "Formen":true, "Verändern":true, "Zerstören":true, "Wunder":false, "Dweomer":true, "Lied":false
} ,
"Magier": {
"Beherrschen":true, "Beweg":true, "Erken":true, "Erschaff":true, "Formen":true, "Verändern":true, "Zerstören":true, "Wunder":false, "Dweomer":false, "Lied":false
}
}
}
-9
View File
@@ -1,9 +0,0 @@
#!/bin/bash
# Wechseln ins Verzeichnis des Tests
cd /data/dev/bamort/backend
# Test ausführen mit detaillierter Ausgabe
go test -v ./gsmaster -run TestCalculateDetailedSkillLearningCostForHexer
go test -v ./gsmaster -run TestLerntabellenForHexer
go test -v ./gsmaster -run TestBeidhändigerKampfFürPS
-123
View File
@@ -1,123 +0,0 @@
#!/bin/bash
# Test-Script für die neuen Experience/Wealth API-Endpunkte
CHARACTER_ID=15
BASE_URL="http://localhost:8180/api/characters"
LOGIN_URL="http://localhost:8180/login"
echo "=== Testing Experience and Wealth Update API ==="
echo
# Zuerst einloggen und Token holen
echo "0. Logging in to get token..."
TOKEN_RESPONSE=$(curl -s -X POST "${LOGIN_URL}" \
-H "Content-Type: application/json" \
-d '{"username": "testuser", "password": "testpass"}')
TOKEN=$(echo $TOKEN_RESPONSE | grep -o '"token":"[^"]*"' | cut -d'"' -f4)
if [ -z "$TOKEN" ]; then
echo "Login failed. Trying to run tests without authentication..."
echo "Response: $TOKEN_RESPONSE"
echo
else
echo "Login successful. Token obtained."
echo "Token: ${TOKEN:0:20}..."
echo
fi
# Auth header für alle folgenden Requests
AUTH_HEADER=""
if [ ! -z "$TOKEN" ]; then
AUTH_HEADER="-H \"Authorization: Bearer $TOKEN\""
fi
echo "=== Testing Experience and Wealth Update API ==="
echo
# Test 1: Update Experience Points with Reason
echo "1. Testing Experience Update with Reason..."
if [ ! -z "$TOKEN" ]; then
curl -X PUT "${BASE_URL}/${CHARACTER_ID}/experience" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"experience_points": 150, "reason": "manual", "notes": "Test manual EP increase"}' \
-w "\nStatus: %{http_code}\n\n"
else
curl -X PUT "${BASE_URL}/${CHARACTER_ID}/experience" \
-H "Content-Type: application/json" \
-d '{"experience_points": 150, "reason": "manual", "notes": "Test manual EP increase"}' \
-w "\nStatus: %{http_code}\n\n"
fi
# Test 2: Update Gold with Reason
echo "2. Testing Gold Update with Reason..."
if [ ! -z "$TOKEN" ]; then
curl -X PUT "${BASE_URL}/${CHARACTER_ID}/wealth" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"goldstücke": 250, "reason": "equipment", "notes": "Sold equipment for gold"}' \
-w "\nStatus: %{http_code}\n\n"
else
curl -X PUT "${BASE_URL}/${CHARACTER_ID}/wealth" \
-H "Content-Type: application/json" \
-d '{"goldstücke": 250, "reason": "equipment", "notes": "Sold equipment for gold"}' \
-w "\nStatus: %{http_code}\n\n"
fi
# Test 3: Simulate skill learning (EP reduction)
echo "3. Testing Skill Learning (EP reduction)..."
if [ ! -z "$TOKEN" ]; then
curl -X PUT "${BASE_URL}/${CHARACTER_ID}/experience" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"experience_points": 100, "reason": "skill_learning", "notes": "Learned new sword fighting skill"}' \
-w "\nStatus: %{http_code}\n\n"
else
curl -X PUT "${BASE_URL}/${CHARACTER_ID}/experience" \
-H "Content-Type: application/json" \
-d '{"experience_points": 100, "reason": "skill_learning", "notes": "Learned new sword fighting skill"}' \
-w "\nStatus: %{http_code}\n\n"
fi
# Test 4: Get Audit Log
echo "4. Testing Get Audit Log..."
if [ ! -z "$TOKEN" ]; then
curl -X GET "${BASE_URL}/${CHARACTER_ID}/audit-log" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-w "\nStatus: %{http_code}\n\n"
else
curl -X GET "${BASE_URL}/${CHARACTER_ID}/audit-log" \
-H "Content-Type: application/json" \
-w "\nStatus: %{http_code}\n\n"
fi
# Test 5: Get Audit Log Stats
echo "5. Testing Get Audit Log Stats..."
if [ ! -z "$TOKEN" ]; then
curl -X GET "${BASE_URL}/${CHARACTER_ID}/audit-log/stats" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-w "\nStatus: %{http_code}\n\n"
else
curl -X GET "${BASE_URL}/${CHARACTER_ID}/audit-log/stats" \
-H "Content-Type: application/json" \
-w "\nStatus: %{http_code}\n\n"
fi
# Test 6: Get Experience-only Audit Log
echo "6. Testing Get Experience-only Audit Log..."
if [ ! -z "$TOKEN" ]; then
curl -X GET "${BASE_URL}/${CHARACTER_ID}/audit-log?field=experience_points" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-w "\nStatus: %{http_code}\n\n"
else
curl -X GET "${BASE_URL}/${CHARACTER_ID}/audit-log?field=experience_points" \
-H "Content-Type: application/json" \
-w "\nStatus: %{http_code}\n\n"
fi
echo "=== Tests completed ==="
-19
View File
@@ -1,19 +0,0 @@
#!/bin/bash
# Example usage of the /:id/improve/skill endpoint
# This endpoint gets improvement costs for all levels of a skill for a specific character
# Example 1: Get improvement costs for Menschenkenntnis for character ID 20
echo "Getting improvement costs for Menschenkenntnis (character ID 20):"
curl -X GET http://localhost:8180/api/characters/20/improve/skill \
-H "Content-Type: application/json" \
-d '{
"name": "Klettern"
}'
echo -e "\n\nNote: This is a GET request with JSON body (unusual API design)"
echo "The endpoint returns an array of models.LearnCost objects with fields:"
echo "- stufe: target level"
echo "- ep: experience points cost"
echo "- money: money cost"
echo "- le: life energy cost"
-6
View File
@@ -1,6 +0,0 @@
{
"name": "Menschenkenntnis",
"current_level": 10,
"notes": "Improving skill from level 10 to 11",
"use_pp": 0
}
-66
View File
@@ -1,66 +0,0 @@
#!/bin/bash
# Test-Script für die neuen Learn/Improve API-Endpunkte mit Audit-Log
BASE_URL="http://localhost:8080/api/characters"
CHAR_ID="18" # Test-Charakter ID
TOKEN="Bearer dc7a780.1:bba7f4daabda117f2a2c14263"
echo "Testing Learn/Improve API with Audit-Log..."
echo "=============================================="
# Test 1: Fertigkeit lernen
echo -e "\n1. Testing LearnSkill endpoint..."
curl -s -X POST "$BASE_URL/$CHAR_ID/learn-skill" \
-H "Content-Type: application/json" \
-H "Authorization: $TOKEN" \
-d '{
"name": "Bootfahren",
"notes": "Test: Fertigkeit lernen über API",
"use_pp": 0
}' | jq .
# Test 2: Fertigkeit verbessern
echo -e "\n2. Testing ImproveSkill endpoint..."
curl -s -X POST "$BASE_URL/$CHAR_ID/improve-skill" \
-H "Content-Type: application/json" \
-H "Authorization: $TOKEN" \
-d '{
"name": "Schwimmen",
"current_level": 8,
"notes": "Test: Fertigkeit verbessern über API",
"use_pp": 1
}' | jq .
# Test 3: Zauber lernen
echo -e "\n3. Testing LearnSpell endpoint..."
curl -s -X POST "$BASE_URL/$CHAR_ID/learn-spell" \
-H "Content-Type: application/json" \
-H "Authorization: $TOKEN" \
-d '{
"name": "Angst",
"notes": "Test: Zauber lernen über API"
}' | jq .
# Test 4: Zauber verbessern
echo -e "\n4. Testing ImproveSpell endpoint..."
curl -s -X POST "$BASE_URL/$CHAR_ID/improve-spell" \
-H "Content-Type: application/json" \
-H "Authorization: $TOKEN" \
-d '{
"name": "Licht",
"current_level": 3,
"notes": "Test: Zauber verbessern über API"
}' | jq .
# Test 5: Audit-Log prüfen
echo -e "\n5. Checking Audit-Log after learn/improve operations..."
curl -s -X GET "$BASE_URL/$CHAR_ID/audit-log" \
-H "Authorization: $TOKEN" | jq '.entries[] | select(.reason | contains("skill") or contains("spell")) | {timestamp, field_name, old_value, new_value, difference, reason, notes}'
# Test 6: Audit-Log Statistiken
echo -e "\n6. Checking Audit-Log Statistics..."
curl -s -X GET "$BASE_URL/$CHAR_ID/audit-log/stats" \
-H "Authorization: $TOKEN" | jq .
echo -e "\nTesting completed!"
-15
View File
@@ -1,15 +0,0 @@
## TODO (Remaining)
### Done
### Later
* generalize PDF Export handling so that only on set of functions can handle ALL kinds of templates. Needs massive refactoring
* currently the template fetched for rendering is set to Default_A4_Quer
* remove inline css as far as possible
* make pdf download popup an own view
* func CleanupExportTemp move maxAge := 7 * 24 * time.Hour definition to Config struct in config.go
* CalculateStaticFieldsLogic calc e.g response.ResistenzKoerper and others without bonus
-152
View File
@@ -1,153 +1 @@
# Transfer Package
The transfer package provides character export and import functionality for the Bamort application.
## Features
- **Complete Character Export**: Exports a character with all related data including:
- Basic character information (race, type, grade, attributes, etc.)
- Skills (Fertigkeiten) and Weapon Skills (Waffenfertigkeiten)
- Spells (Zauber)
- Equipment (Waffen, Ausrüstung, Behältnisse, Transportmittel)
- Learning data (all learning_* tables)
- Audit log entries
- GSM master data (skills, spells, weapons, equipment definitions)
- **Security**: Sensitive user data (password, updated_at, reset tokens) is removed from exports
- **Smart Import**:
- Identifies existing GSM data by name (not ID) to avoid duplicates
- Updates incomplete GSM records with missing information
- Sets default source_id values (1 for skills/equipment, 2 for spells)
- Preserves audit log history
- Creates new character with fresh IDs
- **JSON Format**: All data is exported/imported as JSON for portability
## API Endpoints
All endpoints are under `/api/transfer`:
### GET /api/transfer/export/:id
Exports a character as JSON data (for API consumption)
**Response**: CharacterExport JSON object
### GET /api/transfer/download/:id
Downloads a character as a JSON file
**Response**: JSON file with `Content-Disposition: attachment` header
### POST /api/transfer/import
Imports a character from JSON data
**Request Body**: CharacterExport JSON object
**Response**:
```json
{
"message": "Character imported successfully",
"character_id": 123
}
```
## Usage Examples
### Export a Character
```bash
curl http://localhost:8180/api/transfer/export/18 \
-H "Authorization: Bearer XXXXXXXXXXX" \
> character_export.json
```
### Download a Character
```bash
wget http://localhost:8180/api/transfer/download/18
```
### Import a Character
```bash
curl -X POST http://localhost:8180/api/transfer/import \
-H "Content-Type: application/json" \
-H "Authorization: Bearer XXXXXXXXXXX" \
-d @character_export.json
```
## Testing
The package includes comprehensive tests:
- **Export Tests** (7 tests):
- Basic export functionality
- Skills inclusion
- Spells inclusion
- Equipment inclusion
- Learning data inclusion
- Audit log inclusion
- Error handling for non-existent characters
- **Import Tests** (6 tests):
- Basic import functionality
- Handling existing GSM data
- Updating incomplete GSM data
- Default source_id assignment
- Audit log import
- JSON round-trip testing
- **Handler/API Tests** (5 tests):
- Export endpoint
- Download endpoint
- Import endpoint
- Error handling
**Total: 18 tests, all passing**
Run tests with:
```bash
cd backend
go test -v ./transfer/
```
## Implementation Notes
### TDD Approach
The package was developed using Test-Driven Development (TDD):
1. Tests written first
2. Implementation follows to make tests pass
3. Refactoring as needed
### KISS Principle
The implementation follows the "Keep It Simple, Stupid" principle:
- Simple, clear function names
- Each function does one thing well
- No over-engineering
- Straightforward error handling
### GSM Data Handling
- Skills, weapons, equipment, and spells are identified by **name**, not ID
- Prevents duplicate creation of master data
- Updates existing records only if they have missing information
- Default source_id: 1 for general data, 2 for spells
### Source ID Rules
When importing, if `source_id` is 0:
- **Spells**: Set to 2
- **All other data**: Set to 1
## Files
- `exporter.go` - Character export functionality
- `exporter_test.go` - Export tests
- `importer.go` - Character import functionality
- `importer_test.go` - Import tests
- `handlers.go` - HTTP handlers for API endpoints
- `handlers_test.go` - API handler tests
- `routes.go` - Route registration
- `README.md` - This file
## Future Enhancements
Possible improvements:
- Batch export/import of multiple characters
- Export filtering (e.g., export without audit log)
- Import validation and conflict resolution options
- Export format versioning
- Compression for large exports