From 07c133419ed3299706772c5431fa48a7b1d96300 Mon Sep 17 00:00:00 2001 From: kts of kettek Date: Tue, 19 Apr 2022 15:46:03 -0700 Subject: [PATCH] Add errything --- cmd/gwfc/main.go | 18 ++++++++ data/data.go | 40 ++++++++++++++++ data/images/grass.png | Bin 0 -> 92 bytes data/images/sand.png | Bin 0 -> 92 bytes data/images/saplings.png | Bin 0 -> 107 bytes data/images/trees.png | Bin 0 -> 137 bytes data/images/water.png | Bin 0 -> 92 bytes go.mod | 16 +++++++ go.sum | 78 +++++++++++++++++++++++++++++++ gobl.go | 22 +++++++++ internal/gwfc/Game.go | 96 +++++++++++++++++++++++++++++++++++++++ internal/gwfc/Map.go | 90 ++++++++++++++++++++++++++++++++++++ internal/gwfc/Tile.go | 7 +++ 13 files changed, 367 insertions(+) create mode 100644 cmd/gwfc/main.go create mode 100644 data/data.go create mode 100644 data/images/grass.png create mode 100644 data/images/sand.png create mode 100644 data/images/saplings.png create mode 100644 data/images/trees.png create mode 100644 data/images/water.png create mode 100644 go.mod create mode 100644 go.sum create mode 100644 gobl.go create mode 100644 internal/gwfc/Game.go create mode 100644 internal/gwfc/Map.go create mode 100644 internal/gwfc/Tile.go diff --git a/cmd/gwfc/main.go b/cmd/gwfc/main.go new file mode 100644 index 0000000..9b90273 --- /dev/null +++ b/cmd/gwfc/main.go @@ -0,0 +1,18 @@ +package main + +import ( + _ "image/png" + "log" + + "gwfc/internal/gwfc" + + "github.com/hajimehoshi/ebiten/v2" +) + +func main() { + game := &gwfc.Game{} + game.Init() + if err := ebiten.RunGame(game); err != nil { + log.Fatal(err) + } +} diff --git a/data/data.go b/data/data.go new file mode 100644 index 0000000..d7e5e00 --- /dev/null +++ b/data/data.go @@ -0,0 +1,40 @@ +package data + +import ( + "embed" + "image" + "log" + "path/filepath" + "strings" +) + +// FS is our exported FS. +//go:embed images/* +var fs embed.FS + +var Images map[string]image.Image + +func Init() { + Images = make(map[string]image.Image) + dir, err := fs.ReadDir("images") + if err != nil { + log.Fatal(err) + } + for _, e := range dir { + if !e.IsDir() { + ext := filepath.Ext(e.Name()) + name := strings.TrimSuffix(e.Name(), ext) + f, err := fs.Open(filepath.Join("./images", e.Name())) + if err != nil { + log.Println(err) + continue + } + defer f.Close() + img, _, err := image.Decode(f) + if err != nil { + continue + } + Images[name] = img + } + } +} diff --git a/data/images/grass.png b/data/images/grass.png new file mode 100644 index 0000000000000000000000000000000000000000..e242ce84a2812e17f2128bf6e06dd10b9238ad5c GIT binary patch literal 92 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|#5`RbLnNjq oo6Mi|eLf?9!Xb6b8W9EtpGGE+UoGeF0#z`0y85}Sb4q9e0De0cfB*mh literal 0 HcmV?d00001 diff --git a/data/images/sand.png b/data/images/sand.png new file mode 100644 index 0000000000000000000000000000000000000000..e04647f291083cfddca420504c90c091c0cdb81b GIT binary patch literal 92 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|#5`RbLnNjq o*OXUWt7o%m;GF;DLm&e~YCCh(qw`UFfGQX~UHx3vIVCg!0GQ7hfdBvi literal 0 HcmV?d00001 diff --git a/data/images/saplings.png b/data/images/saplings.png new file mode 100644 index 0000000000000000000000000000000000000000..78a1085e62a64a73549c84153b055a2853a11195 GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|R6SiBLnNjq zo6Mi|eLf?9!Xb4}XIB36^PNH)bQ-R+UftDnm{r-UW| D2ap@j literal 0 HcmV?d00001 diff --git a/data/images/trees.png b/data/images/trees.png new file mode 100644 index 0000000000000000000000000000000000000000..0e5ed4bc1ea76ea03d1cb97337b151f9d6b4be3a GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|oIPC}LnNjq zo6Mi|eLf?9LX+V=j+~=wAM_pwYg_-@b)#0&Apu9@-p|U-*;XEjbre1^>bP0l+XkKW4JB7 literal 0 HcmV?d00001 diff --git a/data/images/water.png b/data/images/water.png new file mode 100644 index 0000000000000000000000000000000000000000..c58c92741efee9c568b8328f5a7e698d9f445a8f GIT binary patch literal 92 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|#5`RbLnNjq o`^@|M-=10SK#PCT4-Ezek;BY9GmWdcfhrh0UHx3vIVCg!0E7t^#Q*>R literal 0 HcmV?d00001 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..1d7e099 --- /dev/null +++ b/go.mod @@ -0,0 +1,16 @@ +module gwfc + +go 1.18 + +require ( + github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210727001814-0db043d8d5be // indirect + github.com/hajimehoshi/ebiten/v2 v2.2.7 // indirect + github.com/jezek/xgb v0.0.0-20210312150743-0e0f116e1240 // indirect + github.com/kettek/gobl v0.1.1-0.20220312222957-aba683107d7d // indirect + github.com/radovskyb/watcher v1.0.7 // indirect + golang.org/x/exp v0.0.0-20220414153411-bcd21879b8fd // indirect + golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d // indirect + golang.org/x/mobile v0.0.0-20210902104108-5d9a33257ab5 // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect + golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..46494ee --- /dev/null +++ b/go.sum @@ -0,0 +1,78 @@ +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210727001814-0db043d8d5be h1:vEIVIuBApEBQTEJt19GfhoU+zFSV+sNTa9E9FdnRYfk= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210727001814-0db043d8d5be/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/hajimehoshi/bitmapfont/v2 v2.1.3/go.mod h1:2BnYrkTQGThpr/CY6LorYtt/zEPNzvE/ND69CRTaHMs= +github.com/hajimehoshi/ebiten/v2 v2.2.7 h1:OnZcSzF9wROc+7ldVAkNbdw8eoR8E/qkpOEiyk1h0H4= +github.com/hajimehoshi/ebiten/v2 v2.2.7/go.mod h1:oVHP648rsA6B9pizQGjN/m2bVy0EJxAZizUxiFAESl4= +github.com/hajimehoshi/file2byteslice v0.0.0-20210813153925-5340248a8f41/go.mod h1:CqqAHp7Dk/AqQiwuhV1yT2334qbA/tFWQW0MD2dGqUE= +github.com/hajimehoshi/go-mp3 v0.3.2/go.mod h1:qMJj/CSDxx6CGHiZeCgbiq2DSUkbK0UbtXShQcnfyMM= +github.com/hajimehoshi/oto v0.6.1/go.mod h1:0QXGEkbuJRohbJaxr7ZQSxnju7hEhseiPx2hrh6raOI= +github.com/hajimehoshi/oto/v2 v2.1.0-alpha.2/go.mod h1:rUKQmwMkqmRxe+IAof9+tuYA2ofm8cAWXFmSfzDN8vQ= +github.com/jakecoffman/cp v1.1.0/go.mod h1:JjY/Fp6d8E1CHnu74gWNnU0+b9VzEdUVPoJxg2PsTQg= +github.com/jezek/xgb v0.0.0-20210312150743-0e0f116e1240 h1:dy+DS31tGEGCsZzB45HmJJNHjur8GDgtRNX9U7HnSX4= +github.com/jezek/xgb v0.0.0-20210312150743-0e0f116e1240/go.mod h1:3P4UH/k22rXyHIJD2w4h2XMqPX4Of/eySEZq9L6wqc4= +github.com/jfreymuth/oggvorbis v1.0.3/go.mod h1:1U4pqWmghcoVsCJJ4fRBKv9peUJMBHixthRlBeD6uII= +github.com/jfreymuth/vorbis v1.0.2/go.mod h1:DoftRo4AznKnShRl1GxiTFCseHr4zR9BN3TWXyuzrqQ= +github.com/kettek/gobl v0.1.0 h1:D8RUaV7Xzlmx7UHj0XQL/+mSeSMRrfPG7sSfzBjGCnI= +github.com/kettek/gobl v0.1.0/go.mod h1:x08Yfd9JU5Xqv69pggE1ieWICu+sZeMphOmhx1TSud4= +github.com/kettek/gobl v0.1.1-0.20220312222957-aba683107d7d h1:AmiWmD1Ol4oOa4UpXaZxShpdE4zd8TcriOlOdFog4Bs= +github.com/kettek/gobl v0.1.1-0.20220312222957-aba683107d7d/go.mod h1:x08Yfd9JU5Xqv69pggE1ieWICu+sZeMphOmhx1TSud4= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/radovskyb/watcher v1.0.7 h1:AYePLih6dpmS32vlHfhCeli8127LzkIgwJGcwwe8tUE= +github.com/radovskyb/watcher v1.0.7/go.mod h1:78okwvY5wPdzcb1UYnip1pvrZNIVEIh/Cm+ZuvsUYIg= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56 h1:estk1glOnSVeJ9tdEZZc5mAMDZk5lNJNyJ6DvrBkTEU= +golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= +golang.org/x/exp v0.0.0-20220414153411-bcd21879b8fd h1:zVFyTKZN/Q7mNRWSs1GOYnHM9NiFSJ54YVRsD0rNWT4= +golang.org/x/exp v0.0.0-20220414153411-bcd21879b8fd/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190703141733-d6a02ce849c9/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d h1:RNPAfi2nHY7C2srAV8A49jpsYr0ADedCk1wq6fTMTvs= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190415191353-3e0bab5405d6/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mobile v0.0.0-20210902104108-5d9a33257ab5 h1:peBP2oZO/xVnGMaWMCyFEI0WENsGj71wx5K12mRELHQ= +golang.org/x/mobile v0.0.0-20210902104108-5d9a33257ab5/go.mod h1:c4YKU3ZylDmvbw+H/PSvm42vhdWbuxCzbonauEAP9B8= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190429190828-d89cdac9e872/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/gobl.go b/gobl.go new file mode 100644 index 0000000..7ffbfad --- /dev/null +++ b/gobl.go @@ -0,0 +1,22 @@ +package main + +import ( + . "github.com/kettek/gobl" +) + +func main() { + Task("build"). + Exec("go", "build", "./cmd/gwfc") + + Task("run"). + Exec("./gwfc") + + Task("watch"). + Watch("interal/*/*.go", "data/*.go", "data/images/*"). + //Watch("interal/*/*.go"). + Signaler(SigQuit). + Run("build"). + Run("run") + + Go() +} diff --git a/internal/gwfc/Game.go b/internal/gwfc/Game.go new file mode 100644 index 0000000..b39a294 --- /dev/null +++ b/internal/gwfc/Game.go @@ -0,0 +1,96 @@ +package gwfc + +import ( + "gwfc/data" + "math/rand" + "time" + + "github.com/hajimehoshi/ebiten/v2" + "golang.org/x/exp/slices" +) + +// Game is our game structure. +type Game struct { + Images map[string]*ebiten.Image + Map Map + cTiles [][2]int + tickDelay int +} + +func (g *Game) Init() { + g.Images = make(map[string]*ebiten.Image) + + data.Init() + + for name, img := range data.Images { + g.Images[name] = ebiten.NewImageFromImage(img) + } + + g.ResetMap() + + ebiten.SetWindowSize(640, 480) +} + +func (g *Game) ResetMap() { + g.Map.Size(24, 24) + rand.Seed(time.Now().Unix()) + + g.cTiles = [][2]int{{rand.Intn(g.Map.w), rand.Intn(g.Map.h)}} +} + +func (g *Game) getRandomTile(s []string) string { + return s[rand.Intn(len(s))] +} + +func (g *Game) iterFunc(c [2]int, t *Tile) { + types := g.Map.GetAdjacentTypes(c[0], c[1]) + t.processed = true + if len(types) == 0 { + t.tile = g.getRandomTile([]string{"sand", "water", "grass", "saplings", "trees"}) + } else if slices.Contains(types, "water") { + t.tile = g.getRandomTile([]string{"water", "sand"}) + } else if slices.Contains(types, "sand") { + t.tile = g.getRandomTile([]string{"sand", "water", "grass"}) + } else if slices.Contains(types, "grass") { + t.tile = g.getRandomTile([]string{"saplings", "grass", "sand"}) + } else if slices.Contains(types, "trees") { + t.tile = g.getRandomTile([]string{"trees", "saplings", "grass"}) + } else if slices.Contains(types, "saplings") { + t.tile = g.getRandomTile([]string{"trees", "saplings", "grass"}) + } else { + t.tile = g.getRandomTile([]string{"sand", "water", "grass", "saplings", "trees"}) + } +} + +// Update updates the game state. +func (g *Game) Update() error { + if ebiten.IsKeyPressed(ebiten.KeyR) { + g.ResetMap() + } + if g.tickDelay > 2 && len(g.cTiles) > 0 { + g.cTiles = g.Map.Iterate(g.cTiles, g.iterFunc) + g.tickDelay = 0 + } else { + g.tickDelay++ + } + return nil +} + +// Draw draws the game state. +func (g *Game) Draw(screen *ebiten.Image) { + + for x := range g.Map.tiles { + for y := range g.Map.tiles[x] { + if img, ok := g.Images[g.Map.tiles[x][y].tile]; ok { + op := &ebiten.DrawImageOptions{} + op.GeoM.Translate(float64(x*8), float64(y*8)) + screen.DrawImage(img, op) + } + } + } +} + +// Layout does normal layout stuff. +func (g *Game) Layout(ow, oh int) (int, int) { + return 320, 240 +} diff --git a/internal/gwfc/Map.go b/internal/gwfc/Map.go new file mode 100644 index 0000000..8f9f1fb --- /dev/null +++ b/internal/gwfc/Map.go @@ -0,0 +1,90 @@ +package gwfc + +import ( + "errors" +) + +type Map struct { + tiles [][]*Tile + currentTiles [][2]int + w, h int +} + +// Size sizes the map. +func (m *Map) Size(w, h int) { + m.tiles = make([][]*Tile, w) + for x := range m.tiles { + m.tiles[x] = make([]*Tile, h) + for y := range m.tiles[x] { + m.tiles[x][y] = &Tile{} + } + } + m.w = w + m.h = h +} + +// Set +func (m *Map) Set(x, y int, t string) error { + if x < 0 || x >= m.w || y < 0 || y >= m.h { + return errors.New("OOR") + } + + m.tiles[x][y].tile = t + + return nil +} + +func (m *Map) Get(x, y int) *Tile { + if x < 0 || x >= m.w || y < 0 || y >= m.h { + return nil + } + return m.tiles[x][y] +} + +func (m *Map) GetAdjacentTypes(x, y int) (s []string) { + for x2 := -1; x2 < 2; x2++ { + for y2 := -1; y2 < 2; y2++ { + if (x2 == -1 && y2 == -1) || (x2 == 1 && y2 == 1) || (x2 == -1 && y2 == 1) || (x2 == 1 && y2 == -1) || (x2 == 0 && y2 == 0) { + continue + } + + t := m.Get(x+x2, y+y2) + if t != nil { + s = append(s, t.tile) + } + } + } + return s +} + +func (m *Map) Iterate(tiles [][2]int, f func(c [2]int, t *Tile)) [][2]int { + next := make([][2]int, 0) + for _, c := range tiles { + t := m.Get(c[0], c[1]) + if t != nil && !t.processed { + f(c, t) + for x := -1; x < 2; x++ { + for y := -1; y < 2; y++ { + if (x == -1 && y == -1) || (x == 1 && y == 1) || (x == -1 && y == 1) || (x == 1 && y == -1) || (x == 0 && y == 0) { + continue + } + c2 := [2]int{c[0] + x, c[1] + y} + t2 := m.Get(c2[0], c2[1]) + if t2 != nil && !t2.processed { + has := false + for _, c3 := range next { + if c3[0] == c2[0] && c3[1] == c2[1] { + has = true + break + } + } + if !has { + next = append(next, c2) + } + } + } + } + } + } + return next +} diff --git a/internal/gwfc/Tile.go b/internal/gwfc/Tile.go new file mode 100644 index 0000000..0bffb2d --- /dev/null +++ b/internal/gwfc/Tile.go @@ -0,0 +1,7 @@ +package gwfc + +type Tile struct { + tile string + processed bool + value interface{} +}