diff --git a/asset/asset.go b/asset/asset.go index 6557c77..ce47008 100644 --- a/asset/asset.go +++ b/asset/asset.go @@ -27,8 +27,9 @@ var ( const sampleRate = 44100 var ( - audioContext = audio.NewContext(sampleRate) - SoundChime = LoadOGG(audioContext, "sound/chime.ogg", false) + audioContext = audio.NewContext(sampleRate) + SoundChime = LoadOGG(audioContext, "sound/chime.ogg", false) + SoundHelloAndWelcome = LoadOGG(audioContext, "sound/hello-and-welcome.ogg", false) ) func interiorImage() *ebiten.Image { diff --git a/asset/sound/hello-and-welcome.ogg b/asset/sound/hello-and-welcome.ogg new file mode 100644 index 0000000..fe8c463 Binary files /dev/null and b/asset/sound/hello-and-welcome.ogg differ diff --git a/flags.go b/flags.go new file mode 100644 index 0000000..23b9885 --- /dev/null +++ b/flags.go @@ -0,0 +1,23 @@ +//go:build !js || !wasm +// +build !js !wasm + +package main + +import ( + "flag" + + "code.rocketnine.space/tslocum/gas-station-sim/world" +) + +func parseFlags() { + var ( + skipIntro bool + ) + flag.BoolVar(&world.Fullscreen, "fullscreen", true, "run in fullscreen mode") + flag.BoolVar(&skipIntro, "skip-intro", false, "skip intro screen") + flag.Parse() + + if skipIntro { + world.GameStarted = true + } +} diff --git a/flags_web.go b/flags_web.go new file mode 100644 index 0000000..ebda5c1 --- /dev/null +++ b/flags_web.go @@ -0,0 +1,12 @@ +//go:build js && wasm +// +build js,wasm + +package main + +import ( + "code.rocketnine.space/tslocum/gas-station-sim/world" +) + +func parseFlags() { + world.DisableEsc = true +} diff --git a/game/game.go b/game/game.go index 1f61a33..41d7e13 100644 --- a/game/game.go +++ b/game/game.go @@ -2,6 +2,7 @@ package game import ( "log" + "os" "code.rocketnine.space/tslocum/gas-station-sim/asset" "code.rocketnine.space/tslocum/gas-station-sim/entity" @@ -58,7 +59,9 @@ type Game struct { func NewGame() *Game { entity.NewOnceEntity() - gohan.AddSystem(&system.Render{}) + gohan.AddSystem(&system.NewEmployee{}) + gohan.AddSystem(&system.RenderBackground{}) + gohan.AddSystem(&system.RenderUI{}) s, err := ebiten.NewShader([]byte(shaderSrc)) if err != nil { @@ -90,16 +93,30 @@ func (g *Game) handleTransition() error { world.GameStarted = true } } - return nil } func (g *Game) Update() error { + if !world.DisableEsc && ebiten.IsKeyPressed(ebiten.KeyEscape) { + os.Exit(0) + return nil + } + + if (inpututil.IsKeyJustPressed(ebiten.KeyEnter) || inpututil.IsKeyJustPressed(ebiten.KeyKPEnter)) && ebiten.IsKeyPressed(ebiten.KeyAlt) { + world.Fullscreen = !world.Fullscreen + ebiten.SetFullscreen(world.Fullscreen) + return nil + } + err := g.handleTransition() if err != nil { return err } + if world.GameStarted { + world.Ticks++ + } + return gohan.Update() } @@ -111,7 +128,7 @@ func (g *Game) Draw(screen *ebiten.Image) { log.Fatal(err) } - // Render target on screen using dither shader. + // NewEmployee target on screen using dither shader. op := &ebiten.DrawRectShaderOptions{} op.Images[0] = g.target screen.DrawRectShader(world.ScreenWidth, world.ScreenHeight, g.shader, op) diff --git a/go.mod b/go.mod index d3008aa..8b262a0 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/ebitengine/purego v0.1.1 // indirect github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b // indirect github.com/hajimehoshi/file2byteslice v1.0.0 // indirect + github.com/hajimehoshi/go-mp3 v0.3.3 // indirect github.com/hajimehoshi/oto/v2 v2.3.1 // indirect github.com/jezek/xgb v1.1.0 // indirect github.com/jfreymuth/oggvorbis v1.0.4 // indirect diff --git a/go.sum b/go.sum index 1cef9e3..61f895b 100644 --- a/go.sum +++ b/go.sum @@ -13,6 +13,7 @@ github.com/hajimehoshi/ebiten/v2 v2.4.16/go.mod h1:BZcqCU4XHmScUi+lsKexocWcf4off github.com/hajimehoshi/file2byteslice v0.0.0-20210813153925-5340248a8f41/go.mod h1:CqqAHp7Dk/AqQiwuhV1yT2334qbA/tFWQW0MD2dGqUE= github.com/hajimehoshi/file2byteslice v1.0.0 h1:ljd5KTennqyJ4vG9i/5jS8MD1prof97vlH5JOdtw3WU= github.com/hajimehoshi/file2byteslice v1.0.0/go.mod h1:CqqAHp7Dk/AqQiwuhV1yT2334qbA/tFWQW0MD2dGqUE= +github.com/hajimehoshi/go-mp3 v0.3.3 h1:cWnfRdpye2m9ElSoVqneYRcpt/l3ijttgjMeQh+r+FE= github.com/hajimehoshi/go-mp3 v0.3.3/go.mod h1:qMJj/CSDxx6CGHiZeCgbiq2DSUkbK0UbtXShQcnfyMM= github.com/hajimehoshi/oto v0.6.1/go.mod h1:0QXGEkbuJRohbJaxr7ZQSxnju7hEhseiPx2hrh6raOI= github.com/hajimehoshi/oto/v2 v2.3.1 h1:qrLKpNus2UfD674oxckKjNJmesp9hMh7u7QCrStB3Rc= diff --git a/main.go b/main.go index fe1b654..1fedb1f 100644 --- a/main.go +++ b/main.go @@ -14,7 +14,12 @@ func main() { ebiten.SetWindowSize(world.ScreenWidth, world.ScreenHeight) ebiten.SetWindowResizingMode(ebiten.WindowResizingModeEnabled) ebiten.SetCursorMode(ebiten.CursorModeHidden) - ebiten.SetFullscreen(true) + + parseFlags() + + if world.Fullscreen { + ebiten.SetFullscreen(true) + } g := game.NewGame() diff --git a/system/newemployee.go b/system/newemployee.go new file mode 100644 index 0000000..e0e49a3 --- /dev/null +++ b/system/newemployee.go @@ -0,0 +1,46 @@ +package system + +import ( + "code.rocketnine.space/tslocum/gas-station-sim/asset" + "code.rocketnine.space/tslocum/gas-station-sim/world" + "code.rocketnine.space/tslocum/gohan" + "github.com/hajimehoshi/ebiten/v2" + "github.com/hajimehoshi/ebiten/v2/inpututil" +) + +type NewEmployee struct { + confirmTicks int +} + +func (r *NewEmployee) Update(_ gohan.Entity) error { + if !world.GameStarted { + return nil + } + + if r.confirmTicks != 0 { + r.confirmTicks-- + + if r.confirmTicks == world.TPS*2.25 { + asset.SoundHelloAndWelcome.Play() + } else if r.confirmTicks == 0 { + world.Name = world.NameInput + world.NameInput = "" + } + return nil + } + + if world.Name == "" { + if world.NameInput == "" { + world.NameInput = "Test" + } + + if inpututil.IsKeyJustPressed(ebiten.KeyEnter) || inpututil.IsKeyJustPressed(ebiten.KeyKPEnter) { + r.confirmTicks = world.TPS * 2.75 + } + } + return nil +} + +func (r *NewEmployee) Draw(_ gohan.Entity, screen *ebiten.Image) error { + return nil +} diff --git a/system/render.go b/system/renderbackground.go similarity index 85% rename from system/render.go rename to system/renderbackground.go index 2549b41..a52705f 100644 --- a/system/render.go +++ b/system/renderbackground.go @@ -14,21 +14,21 @@ const ( introTextHeight = 50 ) -type Render struct { +type RenderBackground struct { x, y float64 dx, dy float64 img *ebiten.Image tick int } -func (r *Render) drawGame(screen *ebiten.Image) error { +func (r *RenderBackground) drawGame(screen *ebiten.Image) error { // Draw background. screen.DrawImage(asset.ImageInterior, nil) return nil } -func (r *Render) drawIntro(screen *ebiten.Image) error { +func (r *RenderBackground) drawIntro(screen *ebiten.Image) error { if world.GameStarting != 0 { return nil } @@ -48,7 +48,7 @@ func (r *Render) drawIntro(screen *ebiten.Image) error { return nil } -func (r *Render) Update(_ gohan.Entity) error { +func (r *RenderBackground) Update(_ gohan.Entity) error { if r.img == nil { img := ebiten.NewImage(introTextWidth, introTextHeight) for i := 0; i < 4; i++ { // Draw four times to increase shadow effect @@ -82,7 +82,7 @@ func (r *Render) Update(_ gohan.Entity) error { return nil } -func (r *Render) Draw(_ gohan.Entity, screen *ebiten.Image) error { +func (r *RenderBackground) Draw(_ gohan.Entity, screen *ebiten.Image) error { if !world.GameStarted { return r.drawIntro(screen) } diff --git a/system/renderui.go b/system/renderui.go new file mode 100644 index 0000000..63f22ea --- /dev/null +++ b/system/renderui.go @@ -0,0 +1,69 @@ +package system + +import ( + "fmt" + "image" + "image/color" + + "code.rocketnine.space/tslocum/gas-station-sim/world" + "code.rocketnine.space/tslocum/gohan" + "github.com/hajimehoshi/ebiten/v2" + "github.com/hajimehoshi/ebiten/v2/ebitenutil" +) + +type RenderUI struct { + img *ebiten.Image +} + +func (r *RenderUI) Update(_ gohan.Entity) error { + if r.img == nil { + r.img = ebiten.NewImage(world.ScreenWidth, world.ScreenHeight) + } + + if !world.GameStarted { + return nil + } + if world.Name == "" { + + } + + return nil +} + +func (r *RenderUI) Draw(_ gohan.Entity, screen *ebiten.Image) error { + if !world.GameStarted { + return nil + } + + if world.Name == "" { + if world.Ticks > 6 { + r.drawText(screen, 2, 32, 64, true, "What is your name?") + if world.Ticks > 8 { + r.drawText(screen, 2, 64, 128, true, fmt.Sprintf("%s", world.NameInput)) + } + } + } + return nil +} + +func (r *RenderUI) drawText(screen *ebiten.Image, scale int, x int, y int, fill bool, text string) { + const ( + paddingW = 6 + paddingH = 4 + ) + + l := len(text) + textW, textH := 6*l+paddingW, 12+paddingH + + rect := image.Rect(x, y, x+textW*scale, y+textH*scale) + screen.SubImage(rect).(*ebiten.Image).Fill(color.White) + screen.SubImage(rect.Inset(1)).(*ebiten.Image).Fill(color.Black) + + r.img.Clear() + ebitenutil.DebugPrintAt(r.img, text, 2+x/scale, y/scale) + + op := &ebiten.DrawImageOptions{} + op.GeoM.Scale(float64(scale), float64(scale)) + //op.ColorM.ChangeHSV(0, 0, 0.8) + screen.DrawImage(r.img, op) +} diff --git a/world/world.go b/world/world.go index ce97860..2408388 100644 --- a/world/world.go +++ b/world/world.go @@ -9,4 +9,13 @@ const ( var ( GameStarting int GameStarted bool + + Ticks int + + Name string + NameInput string + + Fullscreen = true + + DisableEsc bool )