interface{} -> any

Because I’m on Go 1.18 now.
This commit is contained in:
Josh Deprez 2022-03-17 03:42:08 +00:00
parent ca23e0e06b
commit b4f7753a00
13 changed files with 70 additions and 70 deletions

View file

@ -63,7 +63,7 @@ func (a *Actor) CollidesAt(p geom.Int3) bool {
log.Printf("collision domain %q not found", a.CollisionDomain) log.Printf("collision domain %q not found", a.CollisionDomain)
return false return false
} }
return errCollision == a.game.Query(cd, ColliderType, nil, func(c interface{}) error { return errCollision == a.game.Query(cd, ColliderType, nil, func(c any) error {
if cl, ok := c.(Collider); ok && cl.CollidesWith(bounds) { if cl, ok := c.(Collider); ok && cl.CollidesWith(bounds) {
return errCollision return errCollision
} }

View file

@ -30,7 +30,7 @@ type assetKey struct {
} }
// LoadGobz gunzips and gob-decodes a component from a file from a FS. // LoadGobz gunzips and gob-decodes a component from a file from a FS.
func LoadGobz(dst interface{}, assets fs.FS, path string) error { func LoadGobz(dst any, assets fs.FS, path string) error {
f, err := assets.Open(path) f, err := assets.Open(path)
if err != nil { if err != nil {
return err return err
@ -45,7 +45,7 @@ func LoadGobz(dst interface{}, assets fs.FS, path string) error {
// SaveGobz takes an object, gob-encodes it, gzips it, and writes to disk. // SaveGobz takes an object, gob-encodes it, gzips it, and writes to disk.
// This requires running on something with a disk to write to (not JS) // This requires running on something with a disk to write to (not JS)
func SaveGobz(src interface{}, name string) error { func SaveGobz(src any, name string) error {
f, err := os.CreateTemp(".", filepath.Base(name)) f, err := os.CreateTemp(".", filepath.Base(name))
if err != nil { if err != nil {
return err return err

View file

@ -39,7 +39,7 @@ func init() {
// Camera models a camera that is viewing something. // Camera models a camera that is viewing something.
type Camera struct { type Camera struct {
ID ID
Child interface{} Child any
Disables Disables
Hides Hides

View file

@ -33,15 +33,15 @@ func init() {
} }
// Container is a component that contains many other components, in order. // Container is a component that contains many other components, in order.
// It can be used as both a component in its own right, or as a ordered set. // It can be used as both a component in its own right, or as an ordered set.
// A nil *Container contains no items and modifications will panic (like a map). // A nil *Container contains no items and modifications will panic (like a map).
type Container struct { type Container struct {
items []interface{} items []any
reverse map[interface{}]int reverse map[any]int
} }
// MakeContainer puts the items into a new Container. // MakeContainer puts the items into a new Container.
func MakeContainer(items ...interface{}) *Container { func MakeContainer(items ...any) *Container {
c := &Container{items: items} c := &Container{items: items}
c.rebuildReverse() c.rebuildReverse()
return c return c
@ -51,7 +51,7 @@ func (c *Container) rebuildReverse() {
if c == nil { if c == nil {
return return
} }
c.reverse = make(map[interface{}]int, len(c.items)) c.reverse = make(map[any]int, len(c.items))
for i, x := range c.items { for i, x := range c.items {
c.reverse[x] = i c.reverse[x] = i
} }
@ -100,7 +100,7 @@ func (c *Container) Scan(visit VisitFunc) error {
// Add adds an item to the end of the container, if not already present. // Add adds an item to the end of the container, if not already present.
// Adding nil, or a component already present in the container, does nothing. // Adding nil, or a component already present in the container, does nothing.
// Add is _not_ safe to call on a nil *Container. // Add is _not_ safe to call on a nil *Container.
func (c *Container) Add(component interface{}) { func (c *Container) Add(component any) {
if component == nil || c.Contains(component) { if component == nil || c.Contains(component) {
return return
} }
@ -112,7 +112,7 @@ func (c *Container) Add(component interface{}) {
// half the slice, the slice is compacted (indexes of items will change). // half the slice, the slice is compacted (indexes of items will change).
// Removing an item not in the Container does nothing. // Removing an item not in the Container does nothing.
// Remove is safe to call on a nil *Container. // Remove is safe to call on a nil *Container.
func (c *Container) Remove(component interface{}) { func (c *Container) Remove(component any) {
if c == nil { if c == nil {
return return
} }
@ -129,7 +129,7 @@ func (c *Container) Remove(component interface{}) {
// Contains reports if an item exists in the container. // Contains reports if an item exists in the container.
// Contains is safe to call on a nil *Container. // Contains is safe to call on a nil *Container.
func (c *Container) Contains(component interface{}) bool { func (c *Container) Contains(component any) bool {
if c == nil { if c == nil {
return false return false
} }
@ -140,7 +140,7 @@ func (c *Container) Contains(component interface{}) bool {
// IndexOf reports if an item exists in the container and returns the index if // IndexOf reports if an item exists in the container and returns the index if
// present. // present.
// IndexOf is safe to call on a nil *Container. // IndexOf is safe to call on a nil *Container.
func (c *Container) IndexOf(component interface{}) (int, bool) { func (c *Container) IndexOf(component any) (int, bool) {
if c == nil { if c == nil {
return 0, false return 0, false
} }
@ -159,7 +159,7 @@ func (c *Container) ItemCount() int {
// Element returns the item at index i, or nil for a free slot. // Element returns the item at index i, or nil for a free slot.
// Element is _not_ safe to call on a nil *Container. // Element is _not_ safe to call on a nil *Container.
func (c *Container) Element(i int) interface{} { return c.items[i] } func (c *Container) Element(i int) any { return c.items[i] }
// Len returns the number of items plus the number of nil slots in the container. // Len returns the number of items plus the number of nil slots in the container.
// Len is safe to call on a nil *Container. // Len is safe to call on a nil *Container.

View file

@ -24,10 +24,10 @@ import (
func TestMakeContainer(t *testing.T) { func TestMakeContainer(t *testing.T) {
c := MakeContainer(69, 420) c := MakeContainer(69, 420)
if want := []interface{}{69, 420}; !cmp.Equal(c.items, want) { if want := []any{69, 420}; !cmp.Equal(c.items, want) {
t.Errorf("c.items = %v, want %v", c.items, want) t.Errorf("c.items = %v, want %v", c.items, want)
} }
if want := map[interface{}]int{69: 0, 420: 1}; !cmp.Equal(c.reverse, want) { if want := map[any]int{69: 0, 420: 1}; !cmp.Equal(c.reverse, want) {
t.Errorf("c.reverse = %v, want %v", c.reverse, want) t.Errorf("c.reverse = %v, want %v", c.reverse, want)
} }
} }

View file

@ -48,7 +48,7 @@ func init() {
// the number of tests between components. // the number of tests between components.
type DrawDAG struct { type DrawDAG struct {
ChunkSize int ChunkSize int
Child interface{} Child any
Disables Disables
Hides Hides
@ -71,7 +71,7 @@ func (d *DrawDAG) Draw(screen *ebiten.Image, opts *ebiten.DrawImageOptions) {
hidden bool hidden bool
opts ebiten.DrawImageOptions opts ebiten.DrawImageOptions
} }
cache := map[interface{}]state{ cache := map[any]state{
d: { d: {
hidden: false, hidden: false,
opts: *opts, opts: *opts,
@ -86,7 +86,7 @@ func (d *DrawDAG) Draw(screen *ebiten.Image, opts *ebiten.DrawImageOptions) {
} }
// Walk up game tree to find the nearest state in cache. // Walk up game tree to find the nearest state in cache.
var st state var st state
stack := []interface{}{x} stack := []any{x}
for p := d.game.Parent(x); p != nil; p = d.game.Parent(p) { for p := d.game.Parent(x); p != nil; p = d.game.Parent(p) {
if s, found := cache[p]; found { if s, found := cache[p]; found {
st = s st = s
@ -168,8 +168,8 @@ func (d *DrawDAG) Update() error {
// Register recursively registers compponent and all descendants that are // Register recursively registers compponent and all descendants that are
// DrawBoxers into internal data structures (the DAG, etc) unless they are // DrawBoxers into internal data structures (the DAG, etc) unless they are
// descendants of a different DrawManager. // descendants of a different DrawManager.
func (d *DrawDAG) Register(component, _ interface{}) error { func (d *DrawDAG) Register(component, _ any) error {
return d.game.Query(component, DrawBoxerType, func(c interface{}) error { return d.game.Query(component, DrawBoxerType, func(c any) error {
if db, ok := c.(DrawBoxer); ok { if db, ok := c.(DrawBoxer); ok {
d.registerOne(db) d.registerOne(db)
} }
@ -235,8 +235,8 @@ func (d *DrawDAG) registerOne(x DrawBoxer) {
} }
// Unregister unregisters the component and all subcomponents. // Unregister unregisters the component and all subcomponents.
func (d *DrawDAG) Unregister(component interface{}) { func (d *DrawDAG) Unregister(component any) {
d.game.Query(component, DrawBoxerType, func(c interface{}) error { d.game.Query(component, DrawBoxerType, func(c any) error {
if db, ok := c.(DrawBoxer); ok { if db, ok := c.(DrawBoxer); ok {
d.unregisterOne(db) d.unregisterOne(db)
} }

View file

@ -37,7 +37,7 @@ func init() {
// through the game tree using Query, without any extra sorting based on Z // through the game tree using Query, without any extra sorting based on Z
// values or consideration for DrawOrderer. // values or consideration for DrawOrderer.
type DrawDFS struct { type DrawDFS struct {
Child interface{} Child any
Hides Hides
game *Game game *Game
@ -49,7 +49,7 @@ func (d *DrawDFS) Draw(screen *ebiten.Image, opts *ebiten.DrawImageOptions) {
stack := []ebiten.DrawImageOptions{*opts} stack := []ebiten.DrawImageOptions{*opts}
d.game.Query(d, DrawerType, d.game.Query(d, DrawerType,
// visitPre // visitPre
func(x interface{}) error { func(x any) error {
if h, ok := x.(Hider); ok && h.Hidden() { if h, ok := x.(Hider); ok && h.Hidden() {
return Skip return Skip
} }
@ -70,7 +70,7 @@ func (d *DrawDFS) Draw(screen *ebiten.Image, opts *ebiten.DrawImageOptions) {
return nil return nil
}, },
// visitPost // visitPost
func(x interface{}) error { func(x any) error {
if _, ok := x.(Transformer); ok { if _, ok := x.(Transformer); ok {
stack = stack[:len(stack)-1] stack = stack[:len(stack)-1]
} }

View file

@ -62,8 +62,8 @@ type Game struct {
dbmu sync.RWMutex dbmu sync.RWMutex
byID map[string]Identifier // Named components by ID byID map[string]Identifier // Named components by ID
byAB map[abKey]*Container // paths matching interface byAB map[abKey]*Container // paths matching interface
parent map[interface{}]interface{} // parent[x] is parent of x parent map[any]any // parent[x] is parent of x
children map[interface{}]*Container // children[x] are chilren of x children map[any]*Container // children[x] are children of x
} }
// Draw draws everything. // Draw draws everything.
@ -84,14 +84,14 @@ func (g *Game) Layout(outsideWidth, outsideHeight int) (w, h int) {
// not updated. // not updated.
func (g *Game) Update() error { func (g *Game) Update() error {
return g.Query(g.Root, UpdaterType, return g.Query(g.Root, UpdaterType,
func(c interface{}) error { func(c any) error {
if d, ok := c.(Disabler); ok && d.Disabled() { if d, ok := c.(Disabler); ok && d.Disabled() {
// Do not update this component or descendants. // Do not update this component or descendants.
return Skip return Skip
} }
return nil return nil
}, },
func(c interface{}) error { func(c any) error {
if u, ok := c.(Updater); ok { if u, ok := c.(Updater); ok {
return u.Update() return u.Update()
} }
@ -114,7 +114,7 @@ func (g *Game) Component(id string) Identifier {
// Parent returns the parent of a given component, or nil if there is none. // Parent returns the parent of a given component, or nil if there is none.
// This only returns sensible values for registered components. // This only returns sensible values for registered components.
func (g *Game) Parent(c interface{}) interface{} { func (g *Game) Parent(c any) any {
g.dbmu.RLock() g.dbmu.RLock()
defer g.dbmu.RUnlock() defer g.dbmu.RUnlock()
return g.parent[c] return g.parent[c]
@ -122,7 +122,7 @@ func (g *Game) Parent(c interface{}) interface{} {
// Children returns the direct subcomponents of the given component, or nil if // Children returns the direct subcomponents of the given component, or nil if
// there are none. This only returns sensible values for registered components. // there are none. This only returns sensible values for registered components.
func (g *Game) Children(c interface{}) *Container { func (g *Game) Children(c any) *Container[any] {
g.dbmu.RLock() g.dbmu.RLock()
defer g.dbmu.RUnlock() defer g.dbmu.RUnlock()
return g.children[c] return g.children[c]
@ -130,7 +130,7 @@ func (g *Game) Children(c interface{}) *Container {
// PathRegister calls Register on every Registrar in the path between g and // PathRegister calls Register on every Registrar in the path between g and
// parent (top-to-bottom, i.e. game first, component last). // parent (top-to-bottom, i.e. game first, component last).
func (g *Game) PathRegister(component, parent interface{}) error { func (g *Game) PathRegister(component, parent any) error {
for _, p := range g.Path(parent) { for _, p := range g.Path(parent) {
if r, ok := p.(Registrar); ok { if r, ok := p.(Registrar); ok {
if err := r.Register(component, parent); err != nil { if err := r.Register(component, parent); err != nil {
@ -143,7 +143,7 @@ func (g *Game) PathRegister(component, parent interface{}) error {
// PathUnregister calls Unregister on every Registrar in the path between g and // PathUnregister calls Unregister on every Registrar in the path between g and
// parent (bottom-to-top, i.e. component first, game last). // parent (bottom-to-top, i.e. component first, game last).
func (g *Game) PathUnregister(component interface{}) { func (g *Game) PathUnregister(component any) {
for _, p := range g.ReversePath(component) { for _, p := range g.ReversePath(component) {
if r, ok := p.(Registrar); ok { if r, ok := p.(Registrar); ok {
r.Unregister(component) r.Unregister(component)
@ -153,7 +153,7 @@ func (g *Game) PathUnregister(component interface{}) {
// Path returns a slice with the path of components to reach component from g // Path returns a slice with the path of components to reach component from g
// (including g and component). // (including g and component).
func (g *Game) Path(component interface{}) []interface{} { func (g *Game) Path(component any) []any {
stack := g.ReversePath(component) stack := g.ReversePath(component)
for i, j := 0, len(stack)-1; i < j; i, j = i+1, j-1 { for i, j := 0, len(stack)-1; i < j; i, j = i+1, j-1 {
stack[i], stack[j] = stack[j], stack[i] stack[i], stack[j] = stack[j], stack[i]
@ -163,8 +163,8 @@ func (g *Game) Path(component interface{}) []interface{} {
// ReversePath returns the same slice as Path, but reversed. (ReversePath is // ReversePath returns the same slice as Path, but reversed. (ReversePath is
// faster than Path). // faster than Path).
func (g *Game) ReversePath(component interface{}) []interface{} { func (g *Game) ReversePath(component any) []any {
var stack []interface{} var stack []any
g.dbmu.RLock() g.dbmu.RLock()
for p := component; p != nil; p = g.parent[p] { for p := component; p != nil; p = g.parent[p] {
stack = append(stack, p) stack = append(stack, p)
@ -194,7 +194,7 @@ func (g *Game) ReversePath(component interface{}) []interface{} {
// Skip when it is returned from a recursive call. Returning Skip from visitPre // Skip when it is returned from a recursive call. Returning Skip from visitPre
// will cause visitPost and the descendants of the component to be skipped (see // will cause visitPost and the descendants of the component to be skipped (see
// the implementation of Update for an example of how to use this). // the implementation of Update for an example of how to use this).
func (g *Game) Query(ancestor interface{}, behaviour reflect.Type, visitPre, visitPost VisitFunc) error { func (g *Game) Query(ancestor any, behaviour reflect.Type, visitPre, visitPost VisitFunc) error {
if visitPre != nil { if visitPre != nil {
if err := visitPre(ancestor); err != nil { if err := visitPre(ancestor); err != nil {
return err return err
@ -208,7 +208,7 @@ func (g *Game) Query(ancestor interface{}, behaviour reflect.Type, visitPre, vis
g.dbmu.RLock() g.dbmu.RLock()
q := g.byAB[abKey{ancestor, behaviour}] q := g.byAB[abKey{ancestor, behaviour}]
g.dbmu.RUnlock() g.dbmu.RUnlock()
if err := q.Scan(func(x interface{}) error { if err := q.Scan(func(x any) error {
if err := g.Query(x, behaviour, visitPre, visitPost); err != nil { if err := g.Query(x, behaviour, visitPre, visitPost); err != nil {
if errors.Is(err, Skip) { if errors.Is(err, Skip) {
return nil return nil
@ -232,7 +232,7 @@ func (g *Game) Scan(visit VisitFunc) error {
// Load loads a component and all subcomponents recursively. // Load loads a component and all subcomponents recursively.
// Note that this method does not implement Loader itself. // Note that this method does not implement Loader itself.
func (g *Game) Load(component interface{}, assets fs.FS) error { func (g *Game) Load(component any, assets fs.FS) error {
// Query cannot be used for this method because Load might cause // Query cannot be used for this method because Load might cause
// subcomponents to spring into existence. // subcomponents to spring into existence.
if l, ok := component.(Loader); ok { if l, ok := component.(Loader); ok {
@ -241,7 +241,7 @@ func (g *Game) Load(component interface{}, assets fs.FS) error {
} }
} }
if sc, ok := component.(Scanner); ok { if sc, ok := component.(Scanner); ok {
return sc.Scan(func(x interface{}) error { return sc.Scan(func(x any) error {
return g.Load(x, assets) return g.Load(x, assets)
}) })
} }
@ -250,10 +250,10 @@ func (g *Game) Load(component interface{}, assets fs.FS) error {
// Prepare prepares a component and all subcomponents recursively. // Prepare prepares a component and all subcomponents recursively.
// Note that this method does not implement Prepper itself. // Note that this method does not implement Prepper itself.
func (g *Game) Prepare(component interface{}) error { func (g *Game) Prepare(component any) error {
// Postorder traversal, in case ancestors depend on descendants being // Postorder traversal, in case ancestors depend on descendants being
// ready to answer queries. // ready to answer queries.
return g.Query(component, PrepperType, nil, func(c interface{}) error { return g.Query(component, PrepperType, nil, func(c any) error {
if p, ok := c.(Prepper); ok { if p, ok := c.(Prepper); ok {
return p.Prepare(g) return p.Prepare(g)
} }
@ -300,8 +300,8 @@ func (g *Game) build() error {
defer g.dbmu.Unlock() defer g.dbmu.Unlock()
g.byID = make(map[string]Identifier) g.byID = make(map[string]Identifier)
g.byAB = make(map[abKey]*Container) g.byAB = make(map[abKey]*Container)
g.parent = make(map[interface{}]interface{}) g.parent = make(map[any]any)
g.children = make(map[interface{}]*Container) g.children = make(map[any]*Container)
return g.registerRecursive(g, nil) return g.registerRecursive(g, nil)
} }
@ -310,7 +310,7 @@ func (g *Game) build() error {
// Registering multiple components with the same ID is also an error. // Registering multiple components with the same ID is also an error.
// Registering a component will recursively register all children found via // Registering a component will recursively register all children found via
// Scan. // Scan.
func (g *Game) Register(component, parent interface{}) error { func (g *Game) Register(component, parent any) error {
if component == nil { if component == nil {
return errNilComponent return errNilComponent
} }
@ -322,19 +322,19 @@ func (g *Game) Register(component, parent interface{}) error {
return g.registerRecursive(component, parent) return g.registerRecursive(component, parent)
} }
func (g *Game) registerRecursive(component, parent interface{}) error { func (g *Game) registerRecursive(component, parent any) error {
if err := g.registerOne(component, parent); err != nil { if err := g.registerOne(component, parent); err != nil {
return err return err
} }
if sc, ok := component.(Scanner); ok { if sc, ok := component.(Scanner); ok {
return sc.Scan(func(x interface{}) error { return sc.Scan(func(x any) error {
return g.registerRecursive(x, component) return g.registerRecursive(x, component)
}) })
} }
return nil return nil
} }
func (g *Game) registerOne(component, parent interface{}) error { func (g *Game) registerOne(component, parent any) error {
// register in g.byID if needed // register in g.byID if needed
if i, ok := component.(Identifier); ok { if i, ok := component.(Identifier); ok {
if id := i.Ident(); id != "" { if id := i.Ident(); id != "" {
@ -377,7 +377,7 @@ func (g *Game) registerOne(component, parent interface{}) error {
// Unregister removes the component from the component database. // Unregister removes the component from the component database.
// Passing a nil component has no effect. Unregistering a component will // Passing a nil component has no effect. Unregistering a component will
// recursively unregister child components found via Scan. // recursively unregister child components found via Scan.
func (g *Game) Unregister(component interface{}) { func (g *Game) Unregister(component any) {
if component == nil { if component == nil {
return return
} }
@ -386,15 +386,15 @@ func (g *Game) Unregister(component interface{}) {
g.dbmu.Unlock() g.dbmu.Unlock()
} }
func (g *Game) unregisterRecursive(component interface{}) { func (g *Game) unregisterRecursive(component any) {
g.children[component].Scan(func(x interface{}) error { g.children[component].Scan(func(x any) error {
g.unregisterRecursive(x) g.unregisterRecursive(x)
return nil return nil
}) })
g.unregisterOne(component) g.unregisterOne(component)
} }
func (g *Game) unregisterOne(component interface{}) { func (g *Game) unregisterOne(component any) {
parent := g.parent[component] parent := g.parent[component]
// unregister from g.byAB // unregister from g.byAB
@ -428,7 +428,7 @@ func (g *Game) String() string { return "Game" }
// abKey is the key type for game.byAB. // abKey is the key type for game.byAB.
type abKey struct { type abKey struct {
parent interface{} parent any
behaviour reflect.Type behaviour reflect.Type
} }
@ -453,10 +453,10 @@ func concatOpts(a, b ebiten.DrawImageOptions) ebiten.DrawImageOptions {
// For example, Query takes two VisitFuncs that are called for each result, and // For example, Query takes two VisitFuncs that are called for each result, and
// Scan is given a VisitFunc that should be called with each component. For // Scan is given a VisitFunc that should be called with each component. For
// recursive operations, return Skip for components that should be skipped. // recursive operations, return Skip for components that should be skipped.
type VisitFunc func(interface{}) error type VisitFunc func(any) error
// Many calls a VisitFunc for multiple args, and returns on first non-nil error. // Many calls a VisitFunc for multiple args, and returns on first non-nil error.
func (v VisitFunc) Many(x ...interface{}) error { func (v VisitFunc) Many(x ...any) error {
for _, c := range x { for _, c := range x {
if err := v(c); err != nil { if err := v(c); err != nil {
return err return err

View file

@ -150,8 +150,8 @@ type Prepper interface {
// into internal data structures). Registrars are expected to automatically // into internal data structures). Registrars are expected to automatically
// register/unregister subcomponents of components (usually recursively). // register/unregister subcomponents of components (usually recursively).
type Registrar interface { type Registrar interface {
Register(component, parent interface{}) error Register(component, parent any) error
Unregister(component interface{}) Unregister(component any)
} }
// Saver components can be saved to disk. // Saver components can be saved to disk.

View file

@ -39,7 +39,7 @@ func init() {
type Parallax struct { type Parallax struct {
CameraID string CameraID string
Factor float64 // how much to translate in response to the camera Factor float64 // how much to translate in response to the camera
Child interface{} Child any
camera *Camera camera *Camera
} }

View file

@ -95,7 +95,7 @@ func (g *Game) cmdTree(dst io.Writer, argv []string) {
fmt.Println(dst, "Usage: tree [ID]") fmt.Println(dst, "Usage: tree [ID]")
return return
} }
c := interface{}(g) c := any(g)
if len(argv) == 2 { // subtree if len(argv) == 2 { // subtree
id := argv[1] id := argv[1]
c = g.Component(id) c = g.Component(id)
@ -107,7 +107,7 @@ func (g *Game) cmdTree(dst io.Writer, argv []string) {
g.printTreeRecursive(dst, 0, c) g.printTreeRecursive(dst, 0, c)
} }
func (g *Game) printTreeRecursive(dst io.Writer, depth int, c interface{}) { func (g *Game) printTreeRecursive(dst io.Writer, depth int, c any) {
indent := "" indent := ""
if depth > 0 { if depth > 0 {
indent = strings.Repeat(" ", depth-1) + "↳ " indent = strings.Repeat(" ", depth-1) + "↳ "
@ -118,7 +118,7 @@ func (g *Game) printTreeRecursive(dst io.Writer, depth int, c interface{}) {
} else { } else {
fmt.Fprintf(dst, "%s%v\n", indent, c) fmt.Fprintf(dst, "%s%v\n", indent, c)
} }
g.Children(c).Scan(func(x interface{}) error { g.Children(c).Scan(func(x any) error {
g.printTreeRecursive(dst, depth+1, x) g.printTreeRecursive(dst, depth+1, x)
return nil return nil
}) })
@ -145,7 +145,7 @@ func (g *Game) cmdQuery(dst io.Writer, argv []string) {
return return
} }
var ancestor interface{} = g var ancestor any = g
if len(argv) == 3 { if len(argv) == 3 {
c := g.Component(argv[2]) c := g.Component(argv[2])
if c == nil { if c == nil {
@ -156,7 +156,7 @@ func (g *Game) cmdQuery(dst io.Writer, argv []string) {
} }
noResults := true noResults := true
g.Query(ancestor, behaviour, func(c interface{}) error { g.Query(ancestor, behaviour, func(c any) error {
if !reflect.TypeOf(c).Implements(behaviour) { if !reflect.TypeOf(c).Implements(behaviour) {
return nil return nil
} }
@ -174,7 +174,7 @@ func (g *Game) cmdQuery(dst io.Writer, argv []string) {
} }
} }
func (g *Game) cmdutilComponentArg1(dst io.Writer, argv []string) interface{} { func (g *Game) cmdutilComponentArg1(dst io.Writer, argv []string) any {
if len(argv) != 2 { if len(argv) != 2 {
fmt.Fprintln(dst, "Usage: hide ID") fmt.Fprintln(dst, "Usage: hide ID")
return nil return nil

View file

@ -49,7 +49,7 @@ func init() {
type Scene struct { type Scene struct {
ID ID
Bounds // world coordinates Bounds // world coordinates
Child interface{} Child any
Disables Disables
Hides Hides
} }
@ -66,7 +66,7 @@ func (s *Scene) String() string { return "Scene" }
// This is mostly useful for scenes that refer to other scenes, e.g. // This is mostly useful for scenes that refer to other scenes, e.g.
// //
// sc := &Scene{ // sc := &Scene{
// Components: []interface{}{ // Components: []any{
// &SceneRef{Path: "assets/foo.gob.gz"} // inflated at Load time // &SceneRef{Path: "assets/foo.gob.gz"} // inflated at Load time
// }, // },
// } // }

View file

@ -64,7 +64,7 @@ func main() {
ebiten.SetWindowTitle("TODO") ebiten.SetWindowTitle("TODO")
// Change to true to rewrite level1.gobz // Change to true to rewrite level1.gobz
lev1 := interface{}(&engine.SceneRef{Path: "assets/level1.gobz"}) lev1 := any(&engine.SceneRef{Path: "assets/level1.gobz"})
if hardcodedLevel1 { if hardcodedLevel1 {
lev1 = example.Level1() lev1 = example.Level1()
if rewriteLevel1 && runtime.GOOS != "js" { if rewriteLevel1 && runtime.GOOS != "js" {