Multilevel lernkosten

This commit is contained in:
2025-07-24 20:03:16 +02:00
parent d220f2fd34
commit 8b954f62cf
3 changed files with 64 additions and 43 deletions
+13 -43
View File
@@ -65,25 +65,10 @@ type MultiLevelCostResponse struct {
CanAffordTotal bool `json:"can_afford_total"`
}
type LernCostRequest struct {
CharId uint `json:"char_id" binding:"required"` // Charakter-ID
Name string `json:"name" binding:"required"` // Name der Fertigkeit / des Zaubers
CurrentLevel int `json:"current_level,omitempty"` // Aktueller Wert (nur für Verbesserung)
Type string `json:"type" binding:"required,oneof=skill spell weapon"` // 'skill', 'spell' oder 'weapon' Waffenfertigkeiten sind normale Fertigkeiten (evtl. kann hier später der Name der Waffe angegeben werden )
Action string `json:"action" binding:"required,oneof=learn improve"` // 'learn' oder 'improve'
TargetLevel int `json:"target_level,omitempty"` // Zielwert (optional, für Kostenberechnung bis zu einem bestimmten Level)
UsePP int `json:"use_pp,omitempty"` // Anzahl der zu verwendenden Praxispunkte
// Belohnungsoptionen
Reward *string `json:"reward" binding:"required,oneof=default noGold halveep halveepnoGold"` // Belohnungsoptionen Lernen als Belohnung
// default
// learn: ohne Gold
// improve/spell: halbe EP kein Gold
}
// GetLernCost
func GetLernCost(c *gin.Context) {
// Request-Parameter abrufen
var request LernCostRequest
var request gsmaster.LernCostRequest
if err := c.ShouldBindJSON(&request); err != nil {
respondWithError(c, http.StatusBadRequest, "Ungültige Anfrageparameter: "+err.Error())
return
@@ -102,37 +87,22 @@ func GetLernCost(c *gin.Context) {
costResult.SkillName = strings.TrimSpace(request.Name)
costResult.Category = gsmaster.GetSkillCategory(request.Name)
costResult.Difficulty = gsmaster.GetSkillDifficulty(costResult.Category, costResult.SkillName)
switch {
case request.Action == "learn" && request.Type == "skill":
err := gsmaster.CalcSkillLernCost(&costResult, request.Reward)
var response []gsmaster.SkillCostResultNew
for i := request.CurrentLevel + 1; i <= 18; i++ {
response = append(response, gsmaster.SkillCostResultNew{
CharacterID: costResult.CharacterID,
CharacterClass: costResult.CharacterClass,
SkillName: costResult.SkillName,
Category: costResult.Category,
Difficulty: costResult.Difficulty,
TargetLevel: i})
err := gsmaster.GetLernCostNextLevel(&request, &response[i], request.Reward, i, character.Typ)
if err != nil {
respondWithError(c, http.StatusBadRequest, "Fehler bei der Kostenberechnung: "+err.Error())
return
}
// extrakosten für elfen
if character.Typ == "Elf" {
costResult.EP += 6
}
case request.Action == "learn" && request.Type == "spell":
err := gsmaster.CalcSpellLernCost(&costResult, request.Reward)
if err != nil {
respondWithError(c, http.StatusBadRequest, "Fehler bei der Kostenberechnung: "+err.Error())
return
}
// extrakosten für elfen
if character.Typ == "Elf" {
costResult.EP += 6
}
case request.Action == "improve" && request.Type == "skill":
err := gsmaster.CalcSkillImproveCost(&costResult, request.CurrentLevel, request.Reward)
if err != nil {
respondWithError(c, http.StatusBadRequest, "Fehler bei der Kostenberechnung: "+err.Error())
return
}
default:
}
c.JSON(http.StatusOK, costResult)
}
@@ -645,7 +615,7 @@ func applyPPReduction(request *SkillCostRequest, cost *gsmaster.LearnCost, avail
return finalEP, finalLE, reduction
}
func CalcSkillLearnCost(req *LernCostRequest, skillCostInfo *gsmaster.SkillCostResultNew) error {
func CalcSkillLearnCost(req *gsmaster.LernCostRequest, skillCostInfo *gsmaster.SkillCostResultNew) error {
// Fallback-Werte für Skills ohne definierte Kategorie/Schwierigkeit
result, err := gsmaster.CalculateSkillLearningCosts(skillCostInfo.CharacterClass, skillCostInfo.Category, skillCostInfo.Difficulty)
+1
View File
@@ -431,6 +431,7 @@ type SkillCostResultNew struct {
LE int `json:"le"`
GoldCost int `json:"gold_cost"`
PPUsed int `json:"pp_used"`
TargetLevel int `json:"target_level"`
Details map[string]interface{} `json:"details"`
}
+50
View File
@@ -4,6 +4,21 @@ import (
"fmt"
)
type LernCostRequest struct {
CharId uint `json:"char_id" binding:"required"` // Charakter-ID
Name string `json:"name" binding:"required"` // Name der Fertigkeit / des Zaubers
CurrentLevel int `json:"current_level,omitempty"` // Aktueller Wert (nur für Verbesserung)
Type string `json:"type" binding:"required,oneof=skill spell weapon"` // 'skill', 'spell' oder 'weapon' Waffenfertigkeiten sind normale Fertigkeiten (evtl. kann hier später der Name der Waffe angegeben werden )
Action string `json:"action" binding:"required,oneof=learn improve"` // 'learn' oder 'improve'
TargetLevel int `json:"target_level,omitempty"` // Zielwert (optional, für Kostenberechnung bis zu einem bestimmten Level)
UsePP int `json:"use_pp,omitempty"` // Anzahl der zu verwendenden Praxispunkte
// Belohnungsoptionen
Reward *string `json:"reward" binding:"required,oneof=default noGold halveep halveepnoGold"` // Belohnungsoptionen Lernen als Belohnung
// default
// learn: ohne Gold
// improve/spell: halbe EP kein Gold
}
// DifficultyData enthält Skills und Trainingskosten für eine Schwierigkeitsstufe
type DifficultyData struct {
LearnCost int `json:"learncosts"`
@@ -781,3 +796,38 @@ func CalcSpellLernCost(costResult *SkillCostResultNew, reward *string) error {
return nil
}
func GetLernCostNextLevel(request *LernCostRequest, costResult *SkillCostResultNew, reward *string, level int, characterTyp string) error {
// Diese Funktion berechnet die Kosten für das Erlernen oder Verbessern einer Fertigkeit oder eines Zaubers
// abhängig von der Aktion (learn/improve) und der Belohnung.
// die Berechnung erfolgt immer für genau 1 Level
// Diese Funktion wird in GetLernCost aufgerufen.
switch {
case request.Action == "learn" && request.Type == "skill":
err := CalcSkillLernCost(costResult, request.Reward)
if err != nil {
return fmt.Errorf("fehler bei der Kostenberechnung: %w", err)
}
// extrakosten für elfen
if characterTyp == "Elf" {
costResult.EP += 6
}
case request.Action == "learn" && request.Type == "spell":
err := CalcSpellLernCost(costResult, request.Reward)
if err != nil {
return fmt.Errorf("fehler bei der Kostenberechnung: %w", err)
}
// extrakosten für elfen
if characterTyp == "Elf" {
costResult.EP += 6
}
case request.Action == "improve" && request.Type == "skill":
err := CalcSkillImproveCost(costResult, request.CurrentLevel, request.Reward)
if err != nil {
return fmt.Errorf("fehler bei der Kostenberechnung: %w", err)
}
default:
}
return nil
}