aboutsummaryrefslogtreecommitdiff
path: root/main.go
blob: 20015d95ff80f76429e6b6a3517df909e8c987b1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90

package main

import (
	"bytes"
	"fmt"
	"image"
	"image/color"
	_ "image/jpeg"
	"os"
	"runtime/pprof"

	"age_of_empires/engine"
	"age_of_empires/examples"
	"age_of_empires/selection"

	"github.com/hajimehoshi/ebiten/v2"
	"github.com/hajimehoshi/ebiten/v2/text/v2"
	"github.com/martinlehoux/kagamigo/kcore"
	"golang.org/x/exp/slog"
)

func listExamples() {
	fmt.Println("Available examples:")
	for name, entry := range examples.Registry {
		fmt.Printf("  %-12s %s\n", name, entry.Description)
	}
}

func main() {
	for _, arg := range os.Args {
		if arg == "--profile" {
			f, err := os.Create("cpu.prof")
			kcore.Expect(err, "could not create CPU profile")
			defer f.Close()
			kcore.Expect(pprof.StartCPUProfile(f), "could not start CPU profile")
			defer pprof.StopCPUProfile()
		}
	}
	logHandler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug})
	slog.SetDefault(slog.New(logHandler))
	ebiten.SetWindowSize(engine.ScreenWidth, engine.ScreenHeight)
	ebiten.SetWindowTitle("Age of Empire")
	icon, err := os.Open("icon-crop.jpg")
	kcore.Expect(err, "failed to open icon")
	defer icon.Close()
	iconImg, _, err := image.Decode(icon)
	kcore.Expect(err, "failed to decode icon")
	ebiten.SetWindowIcon([]image.Image{iconImg})
	fontData, err := os.ReadFile("fonts/Cinzel-VariableFont_wght.ttf")
	kcore.Expect(err, "failed to read font")
	s, err := text.NewGoTextFaceSource(bytes.NewReader(fontData))
	kcore.Expect(err, "failed to create font source")

	baseUnitBuilder := engine.NewEntityBuilder().
		WithSolid(engine.NewFilledCircleImage(100, color.White)).
		WithSelectable("round", selection.Unit).
		WithMove().WithOrder().WithResourceGatherer(15)

	game := &engine.Game{
		FaceSource:  s,
		UnitBuilder: baseUnitBuilder,
	}

	deps := examples.BuilderDeps{
		FaceSource:  s,
		UnitBuilder: baseUnitBuilder,
	}

	if len(os.Args) >= 2 && os.Args[1] == "example" {
		if len(os.Args) >= 3 {
			name := os.Args[2]
			entry, ok := examples.Registry[name]
			if !ok {
				fmt.Fprintf(os.Stderr, "Unknown example %q\n\n", name)
				listExamples()
				os.Exit(1)
			}
			slog.Info("running example", slog.String("name", name))
			entry.Build(game, deps)
		} else {
			listExamples()
			os.Exit(0)
		}
	} else {
		examples.Registry["default"].Build(game, deps)
	}

	ebiten.SetRunnableOnUnfocused(true)
	kcore.Expect(ebiten.RunGame(game), "failed to run game")
}