Save endgame progress, team presets, technique support and camera controls
This commit is contained in:
1 parent
a681affdb3
commit
639cef7d19
52 files changed
+11940
-766
No files matched your search
@@ -0,0 +1,87 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type TeamPresetRules struct {
|
||||
Count uint32 `json:"preset_count"`
|
||||
MaxMembers uint32 `json:"max_members"`
|
||||
MaxNameLength int `json:"max_name_length"`
|
||||
}
|
||||
|
||||
var teamPresetOnce sync.Once
|
||||
var teamPresetRules TeamPresetRules
|
||||
var teamPresetError error
|
||||
|
||||
func LoadTeamPresetRules() (*TeamPresetRules, error) {
|
||||
teamPresetOnce.Do(func() {
|
||||
raw, err := ReadResourceFile("resources/TeamPresetConfig.json")
|
||||
if err != nil {
|
||||
teamPresetError = err
|
||||
return
|
||||
}
|
||||
if err := json.Unmarshal(raw, &teamPresetRules); err != nil {
|
||||
teamPresetError = err
|
||||
return
|
||||
}
|
||||
if teamPresetRules.Count == 0 || teamPresetRules.MaxMembers == 0 || teamPresetRules.MaxNameLength < 1 {
|
||||
teamPresetError = fmt.Errorf("invalid TeamPresetConfig")
|
||||
}
|
||||
})
|
||||
return &teamPresetRules, teamPresetError
|
||||
}
|
||||
func (f *FreesrData) TeamPreset(index uint32) *TeamPreset {
|
||||
original := f.TeamPresets[index]
|
||||
p := &TeamPreset{Name: fmt.Sprintf("Team %d", index+1), Avatars: map[uint32]uint32{}, Favourite: true}
|
||||
if original != nil {
|
||||
p.Name = original.Name
|
||||
p.LeaderSlot = original.LeaderSlot
|
||||
p.Favourite = original.Favourite
|
||||
for slot, id := range original.Avatars {
|
||||
p.Avatars[slot] = id
|
||||
}
|
||||
}
|
||||
// Preserve edits made through the existing /api/persistent lineups field.
|
||||
if index == f.ActiveTeamPreset {
|
||||
p.Avatars = map[uint32]uint32{}
|
||||
for slot, id := range f.Lineups {
|
||||
p.Avatars[slot] = id
|
||||
}
|
||||
}
|
||||
return p
|
||||
}
|
||||
func (f *FreesrData) SaveTeamPreset(index uint32, preset *TeamPreset) error {
|
||||
if f.TeamPresets == nil {
|
||||
f.TeamPresets = map[uint32]*TeamPreset{}
|
||||
}
|
||||
if preset.Avatars[preset.LeaderSlot] == 0 {
|
||||
found := false
|
||||
for slot, id := range preset.Avatars {
|
||||
if id != 0 && (!found || slot < preset.LeaderSlot) {
|
||||
preset.LeaderSlot = slot
|
||||
found = true
|
||||
}
|
||||
}
|
||||
}
|
||||
old, oldLineup := f.TeamPresets[index], f.Lineups
|
||||
f.TeamPresets[index] = preset
|
||||
if index == f.ActiveTeamPreset {
|
||||
f.Lineups = map[uint32]uint32{}
|
||||
for slot, id := range preset.Avatars {
|
||||
f.Lineups[slot] = id
|
||||
}
|
||||
}
|
||||
if err := f.SavePersistentChecked(); err != nil {
|
||||
if old == nil {
|
||||
delete(f.TeamPresets, index)
|
||||
} else {
|
||||
f.TeamPresets[index] = old
|
||||
}
|
||||
f.Lineups = oldLineup
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in new issue
Block a user