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] }