diff --git a/cmd/view-map/main.go b/cmd/view-map/main.go index 5f40c00..27595c5 100644 --- a/cmd/view-map/main.go +++ b/cmd/view-map/main.go @@ -10,7 +10,9 @@ import ( "code.ur.gs/lupine/ordoor/internal/assetstore" "code.ur.gs/lupine/ordoor/internal/config" + "code.ur.gs/lupine/ordoor/internal/flow" "code.ur.gs/lupine/ordoor/internal/scenario" + "code.ur.gs/lupine/ordoor/internal/ship" "code.ur.gs/lupine/ordoor/internal/ui" ) @@ -25,6 +27,7 @@ var ( ) type env struct { + flow *flow.Flow scenario *scenario.Scenario } @@ -51,27 +54,39 @@ func main() { log.Fatalf("Failed to load scenario %v: %v", *gameMap, err) } - env := &env{ - scenario: scenario, + var realEnv *env + if cfg.DefaultEngineName == "ordoor" { + ship := &ship.Ship{} + + flow, err := flow.New(assets, cfg, ship) + if err != nil { + log.Fatalf("Failed to setup flow: %v", err) + } + flow.SetScenario(scenario) + realEnv = &env{flow: flow, scenario: scenario} + } else { + realEnv = &env{scenario: scenario} } - win, err := ui.NewWindow(env, "View Map "+*gameMap, *winX, *winY) + win, err := ui.NewWindow(realEnv, "View Map "+*gameMap, *winX, *winY) if err != nil { log.Fatal("Couldn't create window: %v", err) } - step := 32 - win.WhileKeyDown(ebiten.KeyLeft, env.changeOrigin(-step, +0)) - win.WhileKeyDown(ebiten.KeyRight, env.changeOrigin(+step, +0)) - win.WhileKeyDown(ebiten.KeyUp, env.changeOrigin(+0, -step)) - win.WhileKeyDown(ebiten.KeyDown, env.changeOrigin(+0, +step)) - for i := 0; i <= 6; i++ { - win.OnKeyUp(ebiten.Key1+ebiten.Key(i), env.setZIdx(i)) + win.OnKeyUp(ebiten.Key1+ebiten.Key(i), realEnv.setZIdx(i)) } - win.OnMouseClick(env.showCellData) - win.OnMouseWheel(env.changeZoom) + win.OnMouseClick(realEnv.showCellData) + win.OnMouseWheel(realEnv.changeZoom) + + if realEnv.flow == nil { + step := 32 + win.WhileKeyDown(ebiten.KeyLeft, realEnv.changeOrigin(-step, +0)) + win.WhileKeyDown(ebiten.KeyRight, realEnv.changeOrigin(+step, +0)) + win.WhileKeyDown(ebiten.KeyUp, realEnv.changeOrigin(+0, -step)) + win.WhileKeyDown(ebiten.KeyDown, realEnv.changeOrigin(+0, +step)) + } if err := win.Run(); err != nil { log.Fatal(err) @@ -79,11 +94,19 @@ func main() { } func (e *env) Update(screenX, screenY int) error { - return e.scenario.Update(screenX, screenY) + if e.flow != nil { + return e.flow.Update(screenX, screenY) + } else { + return e.scenario.Update(screenX, screenY) + } } func (e *env) Draw(screen *ebiten.Image) error { - return e.scenario.Draw(screen) + if e.flow != nil { + return e.flow.Draw(screen) + } else { + return e.scenario.Draw(screen) + } } func (e *env) changeOrigin(byX, byY int) func() { diff --git a/internal/assetstore/map.go b/internal/assetstore/map.go index 785440a..6c97863 100644 --- a/internal/assetstore/map.go +++ b/internal/assetstore/map.go @@ -102,18 +102,27 @@ func (m *Map) SpritesForCell(x, y, z int) ([]*Sprite, error) { sprites = append(sprites, sprite) } - - for _, chr := range m.raw.Characters { - if chr.XPos == x && chr.YPos == y && z == 1 { // FIXME: sort out ZPos - // Look up the correct animation, get the frame, boom - anim, err := m.assets.CharacterAnimation(chr.Type, data.AnimActionNone) - if err != nil { - return nil, err - } - - sprites = append(sprites, anim.Frames[0]) + if chr := m.CharacterAt(x, y, z); chr != nil { + // Look up the correct animation, get the frame, boom + anim, err := m.assets.CharacterAnimation(chr.Type, data.AnimActionNone) + if err != nil { + return nil, err } + + sprites = append(sprites, anim.Frames[0]) } return sprites, nil } + +func (m *Map) CharacterAt(x, y, z int) *maps.Character { + // FIXME: don't iterate + for i, _ := range m.raw.Characters { + chr := &m.raw.Characters[i] + if chr.XPos == x && chr.YPos == y && z == 1 { // FIXME: sort out ZPos + return chr + } + } + + return nil +} diff --git a/internal/flow/flow.go b/internal/flow/flow.go index 3ae1544..bd90b44 100644 --- a/internal/flow/flow.go +++ b/internal/flow/flow.go @@ -92,6 +92,11 @@ func New(assets *assetstore.AssetStore, config *config.Config, ship *ship.Ship) return out, out.exit } +func (f *Flow) SetScenario(scenario *scenario.Scenario) { + f.current = f.drivers[mainGame] + f.scenario = scenario +} + func (f *Flow) Update(screenX, screenY int) error { if f.exit != nil { return f.exit diff --git a/internal/flow/main_game.go b/internal/flow/main_game.go index eea2b3f..13ecb5f 100644 --- a/internal/flow/main_game.go +++ b/internal/flow/main_game.go @@ -16,7 +16,7 @@ func (f *Flow) linkMainGame() { }) // 8: Character stats - f.onClick(mainGame, "8.21", func() { // Stat more buttont + f.onClick(mainGame, "8.21", func() { // Stat more buttons f.setActiveNow(mainGame, "7", true) f.setActiveNow(mainGame, "8", false) }) diff --git a/internal/scenario/scenario.go b/internal/scenario/scenario.go index db0e06a..14d3bc9 100644 --- a/internal/scenario/scenario.go +++ b/internal/scenario/scenario.go @@ -2,7 +2,6 @@ package scenario import ( - "fmt" "image" "code.ur.gs/lupine/ordoor/internal/assetstore" @@ -36,9 +35,9 @@ func NewScenario(assets *assetstore.AssetStore, name string) (*Scenario, error) } // Eager load sprites. TODO: do we really want to do this? - if err := area.LoadSprites(); err != nil { - return nil, fmt.Errorf("Eager-loading sprites failed: %v", err) - } + //if err := area.LoadSprites(); err != nil { + // return nil, fmt.Errorf("Eager-loading sprites failed: %v", err) + //} out := &Scenario{ area: area,