CharacterCreationSession into DB

This commit is contained in:
2025-08-10 06:53:03 +02:00
parent 644778f6a8
commit 61c89fc964
5 changed files with 198 additions and 2 deletions
+117
View File
@@ -0,0 +1,117 @@
package character
import "fmt"
// SpecialAbility repräsentiert eine besondere Fähigkeit mit Name und Modifier
type SpecialAbility struct {
Name string `json:"name"`
Modifier int `json:"modifier"`
Special string `json:"special,omitempty"` // Für spezielle Fälle wie Berserkergang
}
// GetSpecialAbilityByRoll gibt die besondere Fähigkeit basierend auf einem W100-Wurf zurück
// W% Besondere Fähigkeit
// 01-05: Sehen2
// 06-10: Hören2
// 11-15: Riechen2
// 16-20: Sechster Sinn+2
// 21-30: Sehen+2
// 31-40: Hören+2
// 41-50: Riechen+2
// 51-55: Nachtsicht+2
// 56-60: Gute Reflexe+9
// 61-65: Richtungssinn+12
// 66-70: Robustheit+9
// 71-75: Schmerzunempfindlichkeit+9
// 76-80: Trinken+12
// 81-85: Wachgabe+6
// 86-90: Wahrnehmung+8
// 91-95: Einprägen+4
// 96-99: Berserkergang+(18Wk/5)
// 100: freie Wahl und zweiter Wurf
func GetSpecialAbilityByRoll(roll int) (*SpecialAbility, error) {
if roll < 1 || roll > 100 {
return nil, fmt.Errorf("ungültiger Würfelwurf: %d (muss zwischen 1 und 100 liegen)", roll)
}
switch {
case roll >= 1 && roll <= 5:
return &SpecialAbility{Name: "Sehen", Modifier: -2}, nil
case roll >= 6 && roll <= 10:
return &SpecialAbility{Name: "Hören", Modifier: -2}, nil
case roll >= 11 && roll <= 15:
return &SpecialAbility{Name: "Riechen", Modifier: -2}, nil
case roll >= 16 && roll <= 20:
return &SpecialAbility{Name: "Sechster Sinn", Modifier: 2}, nil
case roll >= 21 && roll <= 30:
return &SpecialAbility{Name: "Sehen", Modifier: 2}, nil
case roll >= 31 && roll <= 40:
return &SpecialAbility{Name: "Hören", Modifier: 2}, nil
case roll >= 41 && roll <= 50:
return &SpecialAbility{Name: "Riechen", Modifier: 2}, nil
case roll >= 51 && roll <= 55:
return &SpecialAbility{Name: "Nachtsicht", Modifier: 2}, nil
case roll >= 56 && roll <= 60:
return &SpecialAbility{Name: "Gute Reflexe", Modifier: 9}, nil
case roll >= 61 && roll <= 65:
return &SpecialAbility{Name: "Richtungssinn", Modifier: 12}, nil
case roll >= 66 && roll <= 70:
return &SpecialAbility{Name: "Robustheit", Modifier: 9}, nil
case roll >= 71 && roll <= 75:
return &SpecialAbility{Name: "Schmerzunempfindlichkeit", Modifier: 9}, nil
case roll >= 76 && roll <= 80:
return &SpecialAbility{Name: "Trinken", Modifier: 12}, nil
case roll >= 81 && roll <= 85:
return &SpecialAbility{Name: "Wachgabe", Modifier: 6}, nil
case roll >= 86 && roll <= 90:
return &SpecialAbility{Name: "Wahrnehmung", Modifier: 8}, nil
case roll >= 91 && roll <= 95:
return &SpecialAbility{Name: "Einprägen", Modifier: 4}, nil
case roll >= 96 && roll <= 99:
return &SpecialAbility{
Name: "Berserkergang",
Modifier: 0,
Special: "+(18Wk/5)",
}, nil
case roll == 100:
return &SpecialAbility{
Name: "Freie Wahl",
Modifier: 0,
Special: "freie Wahl und zweiter Wurf",
}, nil
default:
return nil, fmt.Errorf("unerwarteter Würfelwurf: %d", roll)
}
}
// GetAllSpecialAbilities gibt alle möglichen besonderen Fähigkeiten mit ihren Wahrscheinlichkeiten zurück
func GetAllSpecialAbilities() []struct {
RangeStart int `json:"range_start"`
RangeEnd int `json:"range_end"`
Ability *SpecialAbility `json:"ability"`
} {
return []struct {
RangeStart int `json:"range_start"`
RangeEnd int `json:"range_end"`
Ability *SpecialAbility `json:"ability"`
}{
{1, 5, &SpecialAbility{Name: "Sehen", Modifier: -2}},
{6, 10, &SpecialAbility{Name: "Hören", Modifier: -2}},
{11, 15, &SpecialAbility{Name: "Riechen", Modifier: -2}},
{16, 20, &SpecialAbility{Name: "Sechster Sinn", Modifier: 2}},
{21, 30, &SpecialAbility{Name: "Sehen", Modifier: 2}},
{31, 40, &SpecialAbility{Name: "Hören", Modifier: 2}},
{41, 50, &SpecialAbility{Name: "Riechen", Modifier: 2}},
{51, 55, &SpecialAbility{Name: "Nachtsicht", Modifier: 2}},
{56, 60, &SpecialAbility{Name: "Gute Reflexe", Modifier: 9}},
{61, 65, &SpecialAbility{Name: "Richtungssinn", Modifier: 12}},
{66, 70, &SpecialAbility{Name: "Robustheit", Modifier: 9}},
{71, 75, &SpecialAbility{Name: "Schmerzunempfindlichkeit", Modifier: 9}},
{76, 80, &SpecialAbility{Name: "Trinken", Modifier: 12}},
{81, 85, &SpecialAbility{Name: "Wachgabe", Modifier: 6}},
{86, 90, &SpecialAbility{Name: "Wahrnehmung", Modifier: 8}},
{91, 95, &SpecialAbility{Name: "Einprägen", Modifier: 4}},
{96, 99, &SpecialAbility{Name: "Berserkergang", Modifier: 0, Special: "+(18Wk/5)"}},
{100, 100, &SpecialAbility{Name: "Freie Wahl", Modifier: 0, Special: "freie Wahl und zweiter Wurf"}},
}
}
+74
View File
@@ -0,0 +1,74 @@
package character
import (
"testing"
)
func TestGetSpecialAbilityByRoll(t *testing.T) {
testCases := []struct {
roll int
expected string
modifier int
}{
{1, "Sehen", -2},
{5, "Sehen", -2},
{6, "Hören", -2},
{16, "Sechster Sinn", 2},
{25, "Sehen", 2},
{55, "Nachtsicht", 2},
{60, "Gute Reflexe", 9},
{65, "Richtungssinn", 12},
{70, "Robustheit", 9},
{75, "Schmerzunempfindlichkeit", 9},
{80, "Trinken", 12},
{85, "Wachgabe", 6},
{90, "Wahrnehmung", 8},
{95, "Einprägen", 4},
{96, "Berserkergang", 0},
{99, "Berserkergang", 0},
{100, "Freie Wahl", 0},
}
for _, tc := range testCases {
ability, err := GetSpecialAbilityByRoll(tc.roll)
if err != nil {
t.Errorf("Unerwarteter Fehler für Wurf %d: %v", tc.roll, err)
continue
}
if ability.Name != tc.expected {
t.Errorf("Für Wurf %d: erwartet '%s', erhalten '%s'", tc.roll, tc.expected, ability.Name)
}
if ability.Modifier != tc.modifier {
t.Errorf("Für Wurf %d: erwarteter Modifier %d, erhalten %d", tc.roll, tc.modifier, ability.Modifier)
}
}
}
func TestGetSpecialAbilityByRollInvalidInput(t *testing.T) {
invalidRolls := []int{0, -1, 101, 1000}
for _, roll := range invalidRolls {
_, err := GetSpecialAbilityByRoll(roll)
if err == nil {
t.Errorf("Erwartete Fehler für ungültigen Wurf %d, aber keinen erhalten", roll)
}
}
}
func TestGetAllSpecialAbilities(t *testing.T) {
abilities := GetAllSpecialAbilities()
if len(abilities) != 18 {
t.Errorf("Erwartete 18 besondere Fähigkeiten, erhalten %d", len(abilities))
}
// Teste, dass alle Bereiche lückenlos von 1-100 abgedeckt sind
for i, ability := range abilities {
if i == 0 && ability.RangeStart != 1 {
t.Errorf("Erster Bereich sollte bei 1 starten, startet bei %d", ability.RangeStart)
}
if i == len(abilities)-1 && ability.RangeEnd != 100 {
t.Errorf("Letzter Bereich sollte bei 100 enden, endet bei %d", ability.RangeEnd)
}
}
}
+1 -1
View File
@@ -79,7 +79,6 @@ func characterMigrateStructure(db ...*gorm.DB) error {
err := targetDB.AutoMigrate(
&Char{},
&CharacterCreationSession{},
&Eigenschaft{},
&Lp{},
&Ap{},
@@ -88,6 +87,7 @@ func characterMigrateStructure(db ...*gorm.DB) error {
&Erfahrungsschatz{},
&Bennies{},
&Vermoegen{},
&CharacterCreationSession{},
)
if err != nil {
return err
+1 -1
View File
@@ -75,7 +75,7 @@ type Vermoegen struct {
type Char struct {
BamortBase
UserID uint `gorm:"index;not null" json:"user_id"`
UserID uint `gorm:"index;not null;default:1" json:"user_id"`
User user.User `gorm:"foreignKey:UserID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE" json:"user"`
Rasse string `json:"rasse"`
Typ string `json:"typ"`
@@ -69,6 +69,11 @@ type CharacterCreationSpell struct {
Cost int `json:"cost"`
}
func (object *CharacterCreationSession) TableName() string {
dbPrefix := "char"
return dbPrefix + "_" + "char_creation_session"
}
// Scanning methods for JSON fields in GORM
func (a *AttributesData) Scan(value interface{}) error {
if value == nil {