diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2023-01-12 20:58:14 +0100 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2025-01-27 16:43:44 +0100 |
| commit | 9df5cc7b55d8ac9ecd775a14a14f80a6c36c4d74 (patch) | |
| tree | b0ed4b509da71d0d6320f979a1eebbd91fdf7321 /go/client | |
| parent | 41d16fb4910fc0402b6b081302c953f7dabc8cf9 (diff) | |
| download | muhqs-game-9df5cc7b55d8ac9ecd775a14a14f80a6c36c4d74.tar.gz muhqs-game-9df5cc7b55d8ac9ecd775a14a14f80a6c36c4d74.zip | |
implement unit movement
Diffstat (limited to 'go/client')
| -rw-r--r-- | go/client/main.go | 126 |
1 files changed, 106 insertions, 20 deletions
diff --git a/go/client/main.go b/go/client/main.go index b91b15f7..b0696fdf 100644 --- a/go/client/main.go +++ b/go/client/main.go @@ -6,37 +6,122 @@ import ( "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/ebitenutil" + "github.com/hajimehoshi/ebiten/v2/inpututil" "muhq.space/muhqs-game/go/assets" "muhq.space/muhqs-game/go/game" "muhq.space/muhqs-game/go/ui" ) -type Game struct{} - const ( - screenWidth = 1920 - screenHeight = 1080 -) - -var ( - m *ui.MapLayer - players []game.Player + screenWidth = 1280 + screenHeight = 1024 ) -func (g *Game) Update() error { - return nil +type HandLayer struct { } -func (g *Game) Draw(screen *ebiten.Image) { +func (l *HandLayer) Draw(screen *ebiten.Image) { cardImg := assets.GetCard("base/archer", "en") // _, cardImgHeight := cardImg.Size() op := &ebiten.DrawImageOptions{} op.GeoM.Translate(0, float64(screenHeight)) op.GeoM.Scale(0.5, 0.5) screen.DrawImage(cardImg, op) - m.Draw(screen) - ebitenutil.DebugPrint(screen, fmt.Sprintf("TPS: %0.2f FPS: %0.2f", ebiten.ActualTPS(), ebiten.ActualFPS())) +} + +type Game struct { + gameState *game.State + handLayer *HandLayer + mapView *ui.MapView + activeObject interface{} +} + +func NewGame() *Game { + g := &Game{} + g.gameState = game.NewState() + return g +} + +func NewGameFromMap(mapName string) *Game { + g := NewGame() + g.loadMap(mapName) + return g +} + +func (g *Game) loadMap(mapName string) { + m, err := game.GetMap(mapName) + if err != nil { + log.Fatal(err) + } + g.gameState.Map = m + g.mapView = ui.NewMapView(g.gameState) +} + +func (g *Game) addPlayer(name string, deck *game.Deck) { + g.gameState.AddNewPlayer(name, deck) +} + +func (g *Game) getPlayer(name string) *game.Player { + for _, p := range g.gameState.Players { + if p.Name == name { + return p + } + } + return nil +} + +func (g *Game) moveUnit(unit *game.Unit, tile *game.Tile) { + g.gameState.MoveUnit(unit, tile) + g.mapView.ClearTileHighlights() + g.mapView.ForceRedraw() +} + +func (g *Game) findObjectAt(x, y int) interface{} { + if obj := g.mapView.FindObjectAt(x, y); obj != nil { + return obj + } + + return nil +} + +func (g *Game) Update() error { + if inpututil.IsMouseButtonJustPressed(ebiten.MouseButtonLeft) { + x, y := ebiten.CursorPosition() + obj := g.findObjectAt(x, y) + if obj != nil { + switch obj.(type) { + case *game.Tile: + tile := obj.(*game.Tile) + if g.activeObject != nil { + switch g.activeObject.(type) { + case *game.Unit: + unit := g.activeObject.(*game.Unit) + g.moveUnit(unit, tile) + g.activeObject = nil + } + } else { + g.mapView.HighlightTile(tile) + } + case *game.Unit: + unit := obj.(*game.Unit) + g.activeObject = unit + g.mapView.HighlightTiles(unit.MoveRangeTiles(g.gameState.Map)) + default: + log.Fatalf("Object of type %T not handled", obj) + } + } else { + fmt.Printf("No object found at cursor position (%d, %d)\n", x, y) + } + } + return nil +} + +func (g *Game) Draw(screen *ebiten.Image) { + g.handLayer.Draw(screen) + g.mapView.Draw(screen) + ebitenutil.DebugPrint(screen, + fmt.Sprintf("TPS: %0.2f FPS: %0.2f", ebiten.ActualTPS(), ebiten.ActualFPS())) } func (g *Game) Layout(outsideWidth, outsideHeight int) (int, int) { @@ -46,13 +131,14 @@ func (g *Game) Layout(outsideWidth, outsideHeight int) (int, int) { func main() { ebiten.SetWindowSize(screenWidth, screenHeight) ebiten.SetWindowTitle("Muhq's Game") - _m, err := game.GetMap("2P-ring-street") - if err != nil { - log.Fatal(err) - } - m = ui.NewMapLayerFromMap(_m) - if err := ebiten.RunGame(&Game{}); err != nil { + g := NewGameFromMap("2P-ring-street") + + g.addPlayer("muhq", game.NewDeckFromDeckList(g.gameState.Map.StartDeckList)) + muhq := g.getPlayer("muhq") + g.gameState.AddNewUnit("base/archer", game.Position{0, 0}, muhq) + + if err := ebiten.RunGame(g); err != nil { log.Fatal(err) } } |
