114 lines
3.7 KiB
Go
114 lines
3.7 KiB
Go
package gsmaster
|
|
|
|
import (
|
|
"bamort/models"
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
type SkillGroup string
|
|
type Difficulty string
|
|
type CharClass string
|
|
|
|
const (
|
|
DiffLeicht Difficulty = "leicht"
|
|
DiffNormal Difficulty = "normal"
|
|
DiffSchwer Difficulty = "schwer"
|
|
DiffSehrSchwer Difficulty = "sehr_schwer"
|
|
)
|
|
|
|
type LevelConfig struct {
|
|
BaseLearnCost map[SkillGroup]map[Difficulty]int `json:"baseLearnCost"`
|
|
ImprovementCost map[SkillGroup]map[Difficulty]map[string]int `json:"improvementCost"`
|
|
EPPerTE map[CharClass]map[SkillGroup]int `json:"epPerTE"`
|
|
//AllowedGroups map[CharClass]map[SkillGroup]bool `json:"allowedGroups"`
|
|
SpellLearnCost map[int]int `json:"spellLearnCost"`
|
|
SpellEPPerSchoolByClass map[CharClass]map[string]int `json:"spellEPPerSchoolByClass"`
|
|
AllowedSchools map[CharClass]map[string]bool `json:"allowedSchools"`
|
|
}
|
|
|
|
// SkillDefinition beschreibt eine Fertigkeit
|
|
type SkillDefinition struct {
|
|
Name string
|
|
Group SkillGroup
|
|
Difficulty Difficulty
|
|
}
|
|
|
|
// SpellDefinition differs from SkillDefinition,
|
|
// here we have a “Stufe” (1..12) plus a “School” (e.g. "Beherrschen", "Bewegen", etc.)
|
|
type SpellDefinition struct {
|
|
Name string `json:"name"`
|
|
Stufe int `json:"level"`
|
|
School string `json:"school"` // e.g. "Beherrschen", "Bewegen", "Erkennen", etc.
|
|
CostEP int `json:"cost_ep"`
|
|
CostLE int `json:"cost_le"`
|
|
}
|
|
|
|
// SpellLearnCost: Stufe->Lerneinheiten (1..12)
|
|
var SpellLearnCost = map[int]int{}
|
|
|
|
// Erstmals Lernen: (SkillGroup->Difficulty->LE)
|
|
var BaseLearnCost = map[SkillGroup]map[Difficulty]int{}
|
|
|
|
// Verbesserungs-Kosten in einem Feld differenziert nach Gruppe & Schwierigkeit
|
|
// (SkillGroup->Difficulty->(aktuellerLevel+1)->LE)
|
|
var ImprovementCost = map[SkillGroup]map[Difficulty]map[int]int{}
|
|
|
|
// SpellEPPerSchoolByClass: EP-Kosten pro TE, depends on both
|
|
// character class and spell school
|
|
var SpellEPPerSchoolByClass = map[CharClass]map[string]int{}
|
|
|
|
var EPPerTE = map[CharClass]map[SkillGroup]int{}
|
|
|
|
/*
|
|
// Eventuell Erlaubnis pro Klasse/Gruppe
|
|
var AllowedGroups = map[CharClass]map[SkillGroup]bool}
|
|
*/
|
|
|
|
var Config LevelConfig // holds all loaded data
|
|
|
|
// CalculateImprovementCost: Kosten zum Steigern von +X auf +X+1
|
|
func CalculateSkillImprovementCost(skill string, class string, currentSkillLevel int) (*models.LearnCost, error) {
|
|
return CalculateImprovementCost(skill, class, currentSkillLevel)
|
|
}
|
|
|
|
// Deprecated old static function, now using DB data
|
|
func CalculateImprovementCost(skill string, class string, currentSkillLevel int) (*models.LearnCost, error) {
|
|
/*
|
|
if !Config.AllowedGroups[class][skill.Group] {
|
|
return 0, fmt.Errorf("die Klasse %s darf %s nicht lernen", class, skill.Group)
|
|
}
|
|
*/
|
|
lCost := models.LearnCost{}
|
|
var skl models.Skill
|
|
if err := skl.First(skill); err != nil {
|
|
return nil, errors.New("unbekannte Fertigkeit")
|
|
}
|
|
|
|
grpMap, ok := Config.ImprovementCost[SkillGroup(skl.Category)]
|
|
if !ok {
|
|
return nil, errors.New("keine Improvement-Daten für diese Gruppe")
|
|
}
|
|
diffMap, ok := grpMap[Difficulty(skl.Difficulty)]
|
|
if !ok {
|
|
return nil, errors.New("keine Improvement-Daten für diese Schwierigkeit")
|
|
}
|
|
|
|
neededLE, found := diffMap[fmt.Sprintf("%d", currentSkillLevel+1)]
|
|
if !found {
|
|
return nil, fmt.Errorf("kein Eintrag für Bonus %d→%d", currentSkillLevel, currentSkillLevel+1)
|
|
}
|
|
epPerTE, ok := Config.EPPerTE[CharClass(class)][SkillGroup(skl.Category)]
|
|
if !ok {
|
|
return nil, fmt.Errorf("keine EP-Kosten für %s bei %s", class, skl.Category)
|
|
}
|
|
lCost.LE = neededLE
|
|
lCost.Stufe = currentSkillLevel + 1
|
|
lCost.Ep = neededLE * epPerTE
|
|
lCost.Money = lCost.Ep
|
|
gs := models.GetGameSystem(lCost.GameSystemId, lCost.GameSystem)
|
|
lCost.GameSystemId = gs.ID
|
|
lCost.GameSystem = gs.Name
|
|
return &lCost, nil
|
|
}
|