aboutsummaryrefslogtreecommitdiff
path: root/go/client
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2023-01-12 20:58:14 +0100
committerFlorian Fischer <florian.fischer@muhq.space>2025-01-27 16:43:44 +0100
commit9df5cc7b55d8ac9ecd775a14a14f80a6c36c4d74 (patch)
treeb0ed4b509da71d0d6320f979a1eebbd91fdf7321 /go/client
parent41d16fb4910fc0402b6b081302c953f7dabc8cf9 (diff)
downloadmuhqs-game-9df5cc7b55d8ac9ecd775a14a14f80a6c36c4d74.tar.gz
muhqs-game-9df5cc7b55d8ac9ecd775a14a14f80a6c36c4d74.zip
implement unit movement
Diffstat (limited to 'go/client')
-rw-r--r--go/client/main.go126
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)
}
}