108 lines
2.4 KiB
Go
108 lines
2.4 KiB
Go
package game
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"gitea.boner.be/bdnugget/goonscape/types"
|
|
rl "github.com/gen2brain/raylib-go/raylib"
|
|
)
|
|
|
|
// PlayerManager handles all player-related operations
|
|
type PlayerManager struct {
|
|
LocalPlayer *types.Player
|
|
OtherPlayers map[int32]*types.Player
|
|
mutex sync.RWMutex
|
|
}
|
|
|
|
// NewPlayerManager creates a new player manager
|
|
func NewPlayerManager() *PlayerManager {
|
|
return &PlayerManager{
|
|
OtherPlayers: make(map[int32]*types.Player),
|
|
}
|
|
}
|
|
|
|
// GetPlayer returns the player with the given ID, or the local player if ID matches
|
|
func (pm *PlayerManager) GetPlayer(id int32) *types.Player {
|
|
pm.mutex.RLock()
|
|
defer pm.mutex.RUnlock()
|
|
|
|
if pm.LocalPlayer != nil && pm.LocalPlayer.ID == id {
|
|
return pm.LocalPlayer
|
|
}
|
|
|
|
return pm.OtherPlayers[id]
|
|
}
|
|
|
|
// AddPlayer adds a player to the manager
|
|
func (pm *PlayerManager) AddPlayer(player *types.Player) {
|
|
pm.mutex.Lock()
|
|
defer pm.mutex.Unlock()
|
|
|
|
pm.OtherPlayers[player.ID] = player
|
|
}
|
|
|
|
// RemovePlayer removes a player from the manager
|
|
func (pm *PlayerManager) RemovePlayer(id int32) {
|
|
pm.mutex.Lock()
|
|
defer pm.mutex.Unlock()
|
|
|
|
delete(pm.OtherPlayers, id)
|
|
}
|
|
|
|
// AssetManager handles all game assets
|
|
type AssetManager struct {
|
|
Models []types.ModelAsset
|
|
Music rl.Music
|
|
}
|
|
|
|
// NewAssetManager creates a new asset manager
|
|
func NewAssetManager() *AssetManager {
|
|
return &AssetManager{}
|
|
}
|
|
|
|
// GetModelForPlayer returns the appropriate model for a player
|
|
func (am *AssetManager) GetModelForPlayer(playerID int32) (types.ModelAsset, bool) {
|
|
if len(am.Models) == 0 {
|
|
return types.ModelAsset{}, false
|
|
}
|
|
|
|
// Simple model assignment based on player ID
|
|
modelIndex := int(playerID) % len(am.Models)
|
|
return am.Models[modelIndex], true
|
|
}
|
|
|
|
// UIManager manages all user interface components
|
|
type UIManager struct {
|
|
Chat *Chat
|
|
LoginScreen *LoginScreen
|
|
IsLoggedIn bool
|
|
MenuOpen bool
|
|
}
|
|
|
|
// NewUIManager creates a new UI manager
|
|
func NewUIManager() *UIManager {
|
|
return &UIManager{
|
|
Chat: NewChat(),
|
|
LoginScreen: NewLoginScreen(),
|
|
}
|
|
}
|
|
|
|
// HandleChatInput processes chat input and returns messages to send
|
|
func (ui *UIManager) HandleChatInput() (string, bool) {
|
|
return ui.Chat.Update()
|
|
}
|
|
|
|
// DrawUI renders all UI components
|
|
func (ui *UIManager) DrawUI(screenWidth, screenHeight int32) {
|
|
if !ui.IsLoggedIn {
|
|
ui.LoginScreen.Draw()
|
|
} else {
|
|
if ui.MenuOpen {
|
|
// Draw menu
|
|
}
|
|
|
|
// Draw chat always when logged in
|
|
ui.Chat.Draw(screenWidth, screenHeight)
|
|
}
|
|
}
|