2021-09-12 00:25:10 +01:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"os"
|
2021-12-17 15:03:21 +00:00
|
|
|
"tea.melonie54.xyz/sean/go-susapp/src/version"
|
2021-09-12 00:25:10 +01:00
|
|
|
|
2021-12-16 20:57:35 +00:00
|
|
|
"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"
|
2021-09-12 00:25:10 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
type State struct {
|
|
|
|
Screen int
|
2021-12-17 15:03:21 +00:00
|
|
|
Version *version.GameVersion
|
2021-09-12 00:25:10 +01:00
|
|
|
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
|
2021-12-16 20:19:40 +00:00
|
|
|
Collision *collision.CollisionAsset
|
2021-09-12 00:25:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
2021-12-16 20:19:40 +00:00
|
|
|
MyTasks []byte
|
|
|
|
MapType byte
|
2021-09-12 00:25:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
type PlayerNetObjectMaps struct {
|
|
|
|
ByPlayerClientID map[uint32]*PlayerObject
|
|
|
|
ByPlayerNetID map[uint32]*PlayerObject
|
2021-12-16 20:19:40 +00:00
|
|
|
ByPlayerID map[byte]*PlayerObject
|
2021-09-12 00:25:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
type PlayerObject struct {
|
2021-12-16 20:19:40 +00:00
|
|
|
PlayerID byte
|
2021-09-12 00:25:10 +01:00
|
|
|
PlayerClientNetID uint32
|
|
|
|
PlayerControllerNetID uint32
|
|
|
|
PlayerPhysicsNetID uint32
|
|
|
|
PlayerNetworkTransform uint32
|
|
|
|
PlayerName string
|
|
|
|
PlayerColor byte
|
|
|
|
PlayerPet uint32
|
|
|
|
PlayerHat uint32
|
|
|
|
PlayerSkin uint32
|
2021-12-16 20:19:40 +00:00
|
|
|
InVent bool
|
|
|
|
IsImpostor bool
|
2021-09-12 00:25:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
var settingsFilename string = "SusSettings.json"
|
|
|
|
|
2021-12-17 15:03:21 +00:00
|
|
|
func CreateAppState(version *version.GameVersion) *State {
|
2021-09-12 00:25:10 +01:00
|
|
|
forceSave := false
|
2021-12-16 20:19:40 +00:00
|
|
|
settings, err := readSettingsJson(settingsFilename)
|
2021-09-12 00:25:10 +01:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2021-12-16 20:19:40 +00:00
|
|
|
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))
|
|
|
|
}
|
|
|
|
|
2021-09-12 00:25:10 +01:00
|
|
|
func (state *State) SaveSettings() error {
|
2021-12-16 20:19:40 +00:00
|
|
|
return writeSettingsJson(settingsFilename, *state.Settings)
|
2021-09-12 00:25:10 +01:00
|
|
|
}
|
|
|
|
|
2021-12-16 20:19:40 +00:00
|
|
|
func readSettingsJson(filename string) (SettingsJSON, error) {
|
2021-09-12 00:25:10 +01:00
|
|
|
b, err := os.ReadFile(filename)
|
|
|
|
if err != nil {
|
|
|
|
return NewDefaultSettingsJSON(), err
|
|
|
|
}
|
|
|
|
return UnmarshalSettings(b)
|
|
|
|
}
|
|
|
|
|
2021-12-16 20:19:40 +00:00
|
|
|
func writeSettingsJson(filename string, settings SettingsJSON) error {
|
2021-09-12 00:25:10 +01:00
|
|
|
b, err := settings.Marshal()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return os.WriteFile(filename, b, 0644)
|
|
|
|
}
|
2021-12-16 20:19:40 +00:00
|
|
|
|
|
|
|
func (game *CurrentGameData) GetMyPlayer() *PlayerObject {
|
|
|
|
return game.PlayerNetObjects.ByPlayerClientID[game.ClientID]
|
|
|
|
}
|