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:
@@ -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.
|
||||
@@ -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
|
||||
@@ -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"
|
||||
@@ -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)
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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 158–162
|
||||
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?
|
||||
@@ -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));
|
||||
@@ -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
|
||||
*/
|
||||
@@ -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.
|
||||
*/
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
@@ -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 ==="
|
||||
@@ -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"
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"name": "Menschenkenntnis",
|
||||
"current_level": 10,
|
||||
"notes": "Improving skill from level 10 to 11",
|
||||
"use_pp": 0
|
||||
}
|
||||
@@ -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!"
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user