Files

373 lines
10 KiB
Go

package gsmaster
import (
"bamort/database"
"bamort/models"
)
// LearningCostsTable strukturiert die Daten aus Lerntabellen.md
type LearningCostsTable struct {
// EP-Kosten für 1 Trainingseinheit (TE) pro Charakterklasse und Fertigkeitskategorie
EPPerTE map[string]map[string]int
// EP-Kosten für 1 Lerneinheit (LE) für Zauber pro Charakterklasse und Zauberschule
SpellEPPerLE map[string]map[string]int
// LE-Kosten für Fertigkeiten basierend auf Schwierigkeit
BaseLearnCost map[string]map[string]int
// TE-Kosten für Verbesserungen basierend auf Kategorie, Schwierigkeit und aktuellem Wert
ImprovementCost map[string]map[string]map[int]int
}
// Initialisierung der Lerntabellen mit allen 15 Charakterklassen aus Lerntabellen.md
var learningCosts = &LearningCostsTable{
// EP-Kosten für 1 Trainingseinheit (TE) nach Klasse und Kategorie
EPPerTE: map[string]map[string]int{
"As": { // Assassine
"Alltag": 20,
"Freiland": 20,
"Halbwelt": 20,
"Kampf": 30,
"Körper": 10,
"Sozial": 20,
"Unterwelt": 10,
"Waffen": 20,
"Wissen": 20,
},
"Bb": { // Barbar
"Alltag": 20,
"Freiland": 10,
"Halbwelt": 30,
"Kampf": 10,
"Körper": 10,
"Sozial": 30,
"Unterwelt": 30,
"Waffen": 20,
"Wissen": 40,
},
"Gl": { // Glücksritter
"Alltag": 20,
"Freiland": 30,
"Halbwelt": 10,
"Kampf": 20,
"Körper": 30,
"Sozial": 10,
"Unterwelt": 30,
"Waffen": 20,
"Wissen": 20,
},
"Hä": { // Händler
"Alltag": 10,
"Freiland": 20,
"Halbwelt": 20,
"Kampf": 20,
"Körper": 20,
"Sozial": 10,
"Unterwelt": 40,
"Waffen": 20,
"Wissen": 20,
},
"Kr": { // Krieger
"Alltag": 20,
"Freiland": 30,
"Halbwelt": 30,
"Kampf": 10,
"Körper": 20,
"Sozial": 20,
"Unterwelt": 30,
"Waffen": 10,
"Wissen": 40,
},
"Sp": { // Spitzbube
"Alltag": 20,
"Freiland": 30,
"Halbwelt": 10,
"Kampf": 40,
"Körper": 10,
"Sozial": 10,
"Unterwelt": 10,
"Waffen": 20,
"Wissen": 30,
},
"Wa": { // Waldläufer
"Alltag": 20,
"Freiland": 10,
"Halbwelt": 20,
"Kampf": 20,
"Körper": 10,
"Sozial": 30,
"Unterwelt": 30,
"Waffen": 20,
"Wissen": 30,
},
"Ba": { // Barde
"Alltag": 10,
"Freiland": 20,
"Halbwelt": 20,
"Kampf": 40,
"Körper": 20,
"Sozial": 30,
"Unterwelt": 40,
"Waffen": 40,
"Wissen": 10,
},
"Or": { // Ordenskrieger
"Alltag": 20,
"Freiland": 30,
"Halbwelt": 40,
"Kampf": 10,
"Körper": 20,
"Sozial": 20,
"Unterwelt": 40,
"Waffen": 10,
"Wissen": 20,
},
"Dr": { // Druide
"Alltag": 20,
"Freiland": 10,
"Halbwelt": 30,
"Kampf": 40,
"Körper": 20,
"Sozial": 30,
"Unterwelt": 40,
"Waffen": 40,
"Wissen": 10,
},
"Hx": { // Hexer
"Alltag": 20,
"Freiland": 20,
"Halbwelt": 30,
"Kampf": 40,
"Körper": 30,
"Sozial": 20,
"Unterwelt": 30,
"Waffen": 40,
"Wissen": 20,
},
"Ma": { // Magier
"Alltag": 20,
"Freiland": 30,
"Halbwelt": 40,
"Kampf": 40,
"Körper": 30,
"Sozial": 30,
"Unterwelt": 40,
"Waffen": 40,
"Wissen": 10,
},
"PB": { // Priester Beschützer
"Alltag": 20,
"Freiland": 30,
"Halbwelt": 30,
"Kampf": 40,
"Körper": 30,
"Sozial": 10,
"Unterwelt": 40,
"Waffen": 40,
"Wissen": 20,
},
"PS": { // Priester Streiter
"Alltag": 20,
"Freiland": 30,
"Halbwelt": 40,
"Kampf": 30,
"Körper": 30,
"Sozial": 30,
"Unterwelt": 40,
"Waffen": 30,
"Wissen": 20,
},
"Sc": { // Schamane
"Alltag": 20,
"Freiland": 10,
"Halbwelt": 40,
"Kampf": 40,
"Körper": 20,
"Sozial": 20,
"Unterwelt": 40,
"Waffen": 40,
"Wissen": 20,
},
},
// EP-Kosten für 1 Lerneinheit (LE) für Zauber pro Charakterklasse und Zauberschule
SpellEPPerLE: map[string]map[string]int{
"Dr": { // Druide
"Beherrschen": 90,
"Bewegen": 60,
"Erkennen": 120,
"Erschaffen": 90,
"Formen": 60,
"Verändern": 90,
"Zerstören": 120,
"Wunder": 0, // Nicht verfügbar
"Dweomer": 30,
"Lied": 0, // Nicht verfügbar
},
"Hx": { // Hexer
"Beherrschen": 30,
"Bewegen": 90,
"Erkennen": 90,
"Erschaffen": 90,
"Formen": 60,
"Verändern": 30,
"Zerstören": 60,
"Wunder": 0, // Nicht verfügbar
"Dweomer": 90,
"Lied": 0, // Nicht verfügbar
},
"Ma": { // Magier (* = Spezialgebiet für 30 EP)
"Beherrschen": 60, // *30
"Bewegen": 60, // *30
"Erkennen": 60, // *30
"Erschaffen": 60, // *30
"Formen": 60, // *30
"Verändern": 60, // *30
"Zerstören": 60, // *30
"Wunder": 0, // Nicht verfügbar
"Dweomer": 120,
"Lied": 0, // Nicht verfügbar
},
"PB": { // Priester Beschützer
"Beherrschen": 90,
"Bewegen": 90,
"Erkennen": 60,
"Erschaffen": 90,
"Formen": 90,
"Verändern": 90,
"Zerstören": 90,
"Wunder": 30,
"Dweomer": 120,
"Lied": 0, // Nicht verfügbar
},
"PS": { // Priester Streiter
"Beherrschen": 90,
"Bewegen": 90,
"Erkennen": 90,
"Erschaffen": 90,
"Formen": 90,
"Verändern": 90,
"Zerstören": 60,
"Wunder": 30,
"Dweomer": 120,
"Lied": 0, // Nicht verfügbar
},
"Sc": { // Schamane
"Beherrschen": 90,
"Bewegen": 90,
"Erkennen": 60,
"Erschaffen": 60,
"Formen": 90,
"Verändern": 90,
"Zerstören": 90,
"Wunder": 30,
"Dweomer": 120,
"Lied": 0, // Nicht verfügbar
},
"Ba": { // Barde
"Beherrschen": 0, // Nicht verfügbar
"Bewegen": 0, // Nicht verfügbar
"Erkennen": 0, // Nicht verfügbar
"Erschaffen": 0, // Nicht verfügbar
"Formen": 0, // Nicht verfügbar
"Verändern": 0, // Nicht verfügbar
"Zerstören": 0, // Nicht verfügbar
"Wunder": 0, // Nicht verfügbar
"Dweomer": 0, // Nicht verfügbar
"Lied": 30,
},
},
// LE-Kosten für Fertigkeiten basierend auf Schwierigkeit (aus Lerntabellen.md)
BaseLearnCost: map[string]map[string]int{
"leicht": {
"LE": 1, // Alltag: leicht (1 LE), Körper: leicht (1 LE), Kampf: leicht (1 LE)
},
"normal": {
"LE": 2, // Alltag: normal (1 LE), Freiland: normal (2 LE), Halbwelt: normal (2 LE), Kampf: normal (2 LE), Sozial: normal (2 LE), Körper: normal (1 LE), Waffen: normal (4 LE), Wissen: normal (2 LE) - Durchschnitt
},
"schwer": {
"LE": 4, // Alltag: schwer (2 LE), Freiland: schwer (4 LE), Halbwelt: schwer (2 LE), Sozial: schwer (4 LE), Körper: schwer (2 LE), Waffen: schwer (6 LE), Wissen: schwer (2 LE) - Durchschnitt
},
"sehr schwer": {
"LE": 10, // Alltag: sehr schwer (10 LE), Halbwelt: sehr schwer (10 LE), Kampf: sehr schwer (10 LE), Waffen: sehr schwer (8 LE) - Durchschnitt
},
},
// TE-Kosten für Verbesserungen basierend auf Kategorie, Schwierigkeit und aktuellem Wert
ImprovementCost: map[string]map[string]map[int]int{
"Alltag": {
"leicht": {
0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 2, 14: 2, 15: 2, 16: 2, 17: 2, 18: 2, 19: 2, 20: 2,
},
"normal": {
0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 2, 12: 2, 13: 2, 14: 2, 15: 2, 16: 2, 17: 2, 18: 2, 19: 2, 20: 2,
},
"schwer": {
0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 2, 10: 2, 11: 2, 12: 2, 13: 2, 14: 2, 15: 2, 16: 2, 17: 2, 18: 2, 19: 2, 20: 2,
},
"sehr schwer": {
0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 2, 8: 2, 9: 2, 10: 2, 11: 2, 12: 2, 13: 2, 14: 2, 15: 2, 16: 2, 17: 2, 18: 2, 19: 2, 20: 2,
},
},
// Weitere Kategorien können hier hinzugefügt werden
},
}
// GetLearningCosts gibt die konfigurierten Lernkosten zurück
func GetLearningCosts() *LearningCostsTable {
return learningCosts
}
// SkillCostResult definiert das Ergebnis einer Kostenberechnung
type SkillCostResult struct {
CharacterClass string `json:"character_class"`
SkillName string `json:"skill_name"`
Category string `json:"category"`
Difficulty string `json:"difficulty"`
EP int `json:"ep"`
LE int `json:"le"`
GoldCost int `json:"gold_cost"`
Details map[string]interface{} `json:"details"`
}
// SkillCostResultNew definiert das Ergebnis einer Kostenberechnung
type SkillCostResultNew struct {
CharacterID string `json:"character_id"`
CharacterClass string `json:"character_class"`
SkillName string `json:"skill_name"`
Category string `json:"category"`
Difficulty string `json:"difficulty"`
EP int `json:"ep"`
LE int `json:"le"`
GoldCost int `json:"gold_cost"`
PPUsed int `json:"pp_used"`
GoldUsed int `json:"gold_used"`
TargetLevel int `json:"target_level"`
Details map[string]interface{} `json:"details"`
}
// SkillCategoryOption definiert eine Kategorie-Schwierigkeit-Kombination für eine Fertigkeit
type SkillCategoryOption struct {
Category string `json:"category"`
Difficulty string `json:"difficulty"`
LE int `json:"le"`
}
// ToDo: GameSystemId noch einbauen
func GetClassAbbreviationNewSystem(characterClass string) string {
// Try to find by code first (e.g., "Kr" -> "Kr")
var charClass models.CharacterClass
if err := charClass.FirstByName(characterClass); err == nil {
return charClass.Code
}
gs := GetGameSystem(1, "")
// Try to find by name (e.g., "Krieger" -> "Kr")
if err := database.DB.Where("(game_system=? OR game_system_id=?) AND name = ?", characterClass, gs.ID, characterClass).First(&charClass).Error; err == nil {
return charClass.Code
}
return ""
}