From d042457365595e841e27b0ff2acc1180d16ba3cd Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Wed, 1 May 2019 18:30:30 -0700 Subject: [PATCH] Use Azulian doodad as player character instead of empty dummy --- pkg/doodads/dummy.go | 32 ++++++++++++++++++++++++++++++++ pkg/play_scene.go | 23 ++++++++++++++++++----- pkg/scripting/scripting.go | 26 +++++++++++++++++--------- pkg/uix/canvas_scrolling.go | 5 ----- 4 files changed, 67 insertions(+), 19 deletions(-) create mode 100644 pkg/doodads/dummy.go diff --git a/pkg/doodads/dummy.go b/pkg/doodads/dummy.go new file mode 100644 index 0000000..5dac759 --- /dev/null +++ b/pkg/doodads/dummy.go @@ -0,0 +1,32 @@ +package doodads + +import ( + "git.kirsle.net/apps/doodle/lib/render" + "git.kirsle.net/apps/doodle/pkg/level" +) + +// NewDummy creates a placeholder dummy doodad with a giant "X" across it. +func NewDummy(size int) *Doodad { + dummy := New(size) + + red := &level.Swatch{ + Color: render.Red, + Name: "missing color", + } + dummy.Palette.Swatches = []*level.Swatch{red} + + for i := 0; i < size; i++ { + left := render.NewPoint(int32(i), int32(i)) + right := render.NewPoint(int32(size-i), int32(i)) + + // Draw the stroke 2 pixels thick + dummy.Layers[0].Chunker.Set(left, red) + dummy.Layers[0].Chunker.Set(right, red) + left.Y++ + right.Y++ + dummy.Layers[0].Chunker.Set(left, red) + dummy.Layers[0].Chunker.Set(right, red) + } + + return dummy +} diff --git a/pkg/play_scene.go b/pkg/play_scene.go index a43db46..9076d8b 100644 --- a/pkg/play_scene.go +++ b/pkg/play_scene.go @@ -6,7 +6,7 @@ import ( "git.kirsle.net/apps/doodle/lib/events" "git.kirsle.net/apps/doodle/lib/render" "git.kirsle.net/apps/doodle/pkg/balance" - "git.kirsle.net/apps/doodle/pkg/doodads/dummy" + "git.kirsle.net/apps/doodle/pkg/doodads" "git.kirsle.net/apps/doodle/pkg/level" "git.kirsle.net/apps/doodle/pkg/log" "git.kirsle.net/apps/doodle/pkg/scripting" @@ -86,16 +86,29 @@ func (s *PlayScene) Setup(d *Doodle) error { if err := s.scripting.InstallScripts(s.Level); err != nil { log.Error("PlayScene.Setup: failed to InstallScripts: %s", err) } - if err := s.drawing.InstallScripts(); err != nil { - log.Error("PlayScene.Setup: failed to drawing.InstallScripts: %s", err) + + // Load in the player character. + player, err := doodads.LoadJSON("./assets/doodads/azu-blu.doodad") + if err != nil { + log.Error("PlayScene.Setup: failed to load player doodad: %s", err) + player = doodads.NewDummy(32) } - player := dummy.NewPlayer() - s.Player = uix.NewActor(player.ID(), &level.Actor{}, player.Doodad) + s.Player = uix.NewActor("PLAYER", &level.Actor{}, player) s.Player.MoveTo(render.NewPoint(128, 128)) s.drawing.AddActor(s.Player) s.drawing.FollowActor = s.Player.ID() + // Set up the player character's script in the VM. + if err := s.scripting.AddLevelScript(s.Player.ID()); err != nil { + log.Error("PlayScene.Setup: scripting.InstallActor(player) failed: %s", err) + } + + // Run all the actor scripts' main() functions. + if err := s.drawing.InstallScripts(); err != nil { + log.Error("PlayScene.Setup: failed to drawing.InstallScripts: %s", err) + } + d.Flash("Entered Play Mode. Press 'E' to edit this map.") return nil diff --git a/pkg/scripting/scripting.go b/pkg/scripting/scripting.go index a2c8b77..6d79e01 100644 --- a/pkg/scripting/scripting.go +++ b/pkg/scripting/scripting.go @@ -36,21 +36,29 @@ func (s *Supervisor) Loop() error { // InstallScripts loads scripts for all actors in the level. func (s *Supervisor) InstallScripts(level *level.Level) error { for _, actor := range level.Actors { - id := actor.ID() - log.Debug("InstallScripts: load script from Actor %s", id) - - if _, ok := s.scripts[id]; ok { - return fmt.Errorf("duplicate actor ID %s in level", id) - } - - s.scripts[id] = NewVM(id) - if err := s.scripts[id].RegisterLevelHooks(); err != nil { + if err := s.AddLevelScript(actor.ID()); err != nil { return err } } return nil } +// AddLevelScript adds a script to the supervisor with level hooks. +func (s *Supervisor) AddLevelScript(id string) error { + log.Debug("InstallScripts: load script from Actor %s", id) + + if _, ok := s.scripts[id]; ok { + return fmt.Errorf("duplicate actor ID %s in level", id) + } + + s.scripts[id] = NewVM(id) + if err := s.scripts[id].RegisterLevelHooks(); err != nil { + return err + } + + return nil +} + // To returns the VM for a named script. func (s *Supervisor) To(name string) *VM { if vm, ok := s.scripts[name]; ok { diff --git a/pkg/uix/canvas_scrolling.go b/pkg/uix/canvas_scrolling.go index 1a2990a..8dffdf4 100644 --- a/pkg/uix/canvas_scrolling.go +++ b/pkg/uix/canvas_scrolling.go @@ -6,7 +6,6 @@ import ( "git.kirsle.net/apps/doodle/lib/events" "git.kirsle.net/apps/doodle/lib/render" - "git.kirsle.net/apps/doodle/lib/ui" "git.kirsle.net/apps/doodle/pkg/balance" "git.kirsle.net/apps/doodle/pkg/level" ) @@ -119,10 +118,6 @@ func (w *Canvas) loopFollowActor(ev *events.State) error { continue } - actor.Canvas.SetBorderSize(2) - actor.Canvas.SetBorderColor(render.Red) - actor.Canvas.SetBorderStyle(ui.BorderSolid) - var ( APosition = actor.Position() // absolute world position ASize = actor.Drawing.Size()