go-susapp/state.go
2021-12-16 20:57:35 +00:00

141 lines
3.5 KiB
Go

package main
import (
"fmt"
"os"
"tea.melonie54.xyz/sean/go-susapp/src/collision"
"tea.melonie54.xyz/sean/go-susapp/src/enum"
"tea.melonie54.xyz/sean/go-susapp/src/innernetobjects"
"tea.melonie54.xyz/sean/go-susapp/src/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
Collision *collision.CollisionAsset
}
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
MyTasks []byte
MapType byte
}
type PlayerNetObjectMaps struct {
ByPlayerClientID map[uint32]*PlayerObject
ByPlayerNetID map[uint32]*PlayerObject
ByPlayerID map[byte]*PlayerObject
}
type PlayerObject struct {
PlayerID byte
PlayerClientNetID uint32
PlayerControllerNetID uint32
PlayerPhysicsNetID uint32
PlayerNetworkTransform uint32
PlayerName string
PlayerColor byte
PlayerPet uint32
PlayerHat uint32
PlayerSkin uint32
InVent bool
IsImpostor bool
}
var settingsFilename string = "SusSettings.json"
func CreateAppState(version int32) *State {
forceSave := false
settings, err := readSettingsJson(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) LoadCollision(filename string) error {
b, err := collision.CollisionAssetsFolder.ReadFile("assets/" + filename + ".json")
if err != nil {
return err
}
a, err := collision.UnmarshalCollisionAsset(b)
if err != nil {
return err
}
state.Collision = &a
return nil
}
func (state *State) LoadCollisionForMap(m byte) {
state.LoadCollision(enum.MapByteToString(m))
}
func (state *State) SaveSettings() error {
return writeSettingsJson(settingsFilename, *state.Settings)
}
func readSettingsJson(filename string) (SettingsJSON, error) {
b, err := os.ReadFile(filename)
if err != nil {
return NewDefaultSettingsJSON(), err
}
return UnmarshalSettings(b)
}
func writeSettingsJson(filename string, settings SettingsJSON) error {
b, err := settings.Marshal()
if err != nil {
return err
}
return os.WriteFile(filename, b, 0644)
}
func (game *CurrentGameData) GetMyPlayer() *PlayerObject {
return game.PlayerNetObjects.ByPlayerClientID[game.ClientID]
}