112 lines
2.7 KiB
Go
112 lines
2.7 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"os"
|
||
|
|
||
|
"codehub.onpointcoding.net/sean/go-susapp/enum"
|
||
|
"codehub.onpointcoding.net/sean/go-susapp/innernetobjects"
|
||
|
"codehub.onpointcoding.net/sean/go-susapp/protocol"
|
||
|
)
|
||
|
|
||
|
type State struct {
|
||
|
Screen int
|
||
|
Version int32
|
||
|
PosX float32
|
||
|
PosY float32
|
||
|
Settings *SettingsJSON
|
||
|
CurrentGame *CurrentGameData
|
||
|
TypedGameID string
|
||
|
IsTypingReady bool
|
||
|
IsLobbyMenuOpen bool
|
||
|
DisconnectReason byte
|
||
|
DisconnectStringReason string
|
||
|
HoldingUp bool
|
||
|
HoldingLeft bool
|
||
|
HoldingDown bool
|
||
|
HoldingRight bool
|
||
|
MovementX float32
|
||
|
MovementY float32
|
||
|
}
|
||
|
|
||
|
type CurrentGameData struct {
|
||
|
GameID int32
|
||
|
ClientID uint32
|
||
|
ClientPlayerNetID uint32
|
||
|
HostClientID uint32
|
||
|
OtherClientIDs []uint32
|
||
|
GamePrivacy byte
|
||
|
GameOptions *protocol.GameOptionsData
|
||
|
NetObjects map[uint32]*innernetobjects.InnerNetObject
|
||
|
PlayerNetObjects *PlayerNetObjectMaps
|
||
|
MapNetObjectNetID uint32
|
||
|
GameDataNetID uint32
|
||
|
StartGameTimer byte
|
||
|
CheckNameNonce uint16
|
||
|
CheckColorNonce uint16
|
||
|
CheckPetHatAndSkinNonce uint16
|
||
|
CheckedNameAndColor byte
|
||
|
HasSetStartCounter bool
|
||
|
}
|
||
|
|
||
|
type PlayerNetObjectMaps struct {
|
||
|
ByPlayerClientID map[uint32]*PlayerObject
|
||
|
ByPlayerNetID map[uint32]*PlayerObject
|
||
|
}
|
||
|
|
||
|
type PlayerObject struct {
|
||
|
PlayerClientNetID uint32
|
||
|
PlayerControllerNetID uint32
|
||
|
PlayerPhysicsNetID uint32
|
||
|
PlayerNetworkTransform uint32
|
||
|
PlayerName string
|
||
|
PlayerColor byte
|
||
|
PlayerPet uint32
|
||
|
PlayerHat uint32
|
||
|
PlayerSkin uint32
|
||
|
}
|
||
|
|
||
|
var settingsFilename string = "SusSettings.json"
|
||
|
|
||
|
func CreateAppState(version int32) *State {
|
||
|
forceSave := false
|
||
|
settings, err := readJson(settingsFilename)
|
||
|
if err != nil {
|
||
|
if os.IsNotExist(err) {
|
||
|
forceSave = true
|
||
|
} else {
|
||
|
fmt.Printf("Error loading settings: %v\n", err)
|
||
|
return nil
|
||
|
}
|
||
|
}
|
||
|
s := &State{
|
||
|
Screen: enum.SCREEN_TITLE,
|
||
|
Version: version,
|
||
|
Settings: &settings,
|
||
|
}
|
||
|
if forceSave {
|
||
|
s.SaveSettings()
|
||
|
}
|
||
|
return s
|
||
|
}
|
||
|
|
||
|
func (state *State) SaveSettings() error {
|
||
|
return writeJson(settingsFilename, *state.Settings)
|
||
|
}
|
||
|
|
||
|
func readJson(filename string) (SettingsJSON, error) {
|
||
|
b, err := os.ReadFile(filename)
|
||
|
if err != nil {
|
||
|
return NewDefaultSettingsJSON(), err
|
||
|
}
|
||
|
return UnmarshalSettings(b)
|
||
|
}
|
||
|
|
||
|
func writeJson(filename string, settings SettingsJSON) error {
|
||
|
b, err := settings.Marshal()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return os.WriteFile(filename, b, 0644)
|
||
|
}
|