summaryrefslogtreecommitdiff
path: root/tools.go
diff options
context:
space:
mode:
authorKevin Chabowski <kevin@kch42.de>2013-08-14 16:46:45 +0200
committerKevin Chabowski <kevin@kch42.de>2013-08-14 16:46:45 +0200
commite8e1f6b51b1ecafff7f6f348d240161d20ab0db6 (patch)
treed87c512233f6404a8f6740847410d060c278e741 /tools.go
parent87e740056c145856fa2c47fd08e85c0bc2670984 (diff)
downloadbiomed-e8e1f6b51b1ecafff7f6f348d240161d20ab0db6.tar.gz
biomed-e8e1f6b51b1ecafff7f6f348d240161d20ab0db6.tar.bz2
biomed-e8e1f6b51b1ecafff7f6f348d240161d20ab0db6.zip
Added Tools
* tool is now Tool and is defined as an interface * toolFill and toolDraw implemented * Updated toolbar
Diffstat (limited to 'tools.go')
-rw-r--r--tools.go81
1 files changed, 81 insertions, 0 deletions
diff --git a/tools.go b/tools.go
new file mode 100644
index 0000000..ffb763a
--- /dev/null
+++ b/tools.go
@@ -0,0 +1,81 @@
+package main
+
+import (
+ "github.com/kch42/gomcmap/mcmap"
+)
+
+type BiomeGetter interface {
+ GetBiome(x, z int) (mcmap.Biome, bool)
+}
+
+type XZPos struct {
+ X, Z int
+}
+
+type Change map[XZPos]mcmap.Biome
+
+type Tool interface {
+ SingleClick() bool // Whether only one click should be performed (true) or the action should be repeated, if the mouse is dragged
+ Do(bio mcmap.Biome, bioget BiomeGetter, x, z int) Change
+}
+
+type drawTool struct {
+ radGetter func() int
+}
+
+func (d *drawTool) SingleClick() bool { return false }
+
+func (d *drawTool) Do(bio mcmap.Biome, bioget BiomeGetter, x, z int) Change {
+ rad := d.radGetter()
+ if rad <= 0 {
+ return nil
+ }
+
+ change := make(Change)
+ for xp := x - (rad - 1); xp < x+rad; xp++ {
+ for zp := z - (rad - 1); zp < z+rad; zp++ {
+ change[XZPos{xp, zp}] = bio
+ }
+ }
+
+ return change
+}
+
+func NewDrawTool(radGetter func() int) *drawTool {
+ return &drawTool{radGetter}
+}
+
+type fillTool struct{}
+
+func (f *fillTool) SingleClick() bool { return true }
+
+func (f *fillTool) Do(bio mcmap.Biome, bioget BiomeGetter, x, z int) Change {
+ oldbio, ok := bioget.GetBiome(x, z)
+ if !ok {
+ return nil
+ }
+
+ change := make(Change)
+ floodfill(oldbio, bio, bioget, x, z, change)
+ return change
+}
+
+func floodfill(oldbio, newbio mcmap.Biome, bioget BiomeGetter, x, z int, change Change) {
+ pos := XZPos{x, z}
+ if _, ok := change[pos]; ok {
+ return
+ }
+
+ if bio, ok := bioget.GetBiome(x, z); ok && (bio == oldbio) {
+ change[pos] = newbio
+
+ floodfill(oldbio, newbio, bioget, x-1, z, change)
+ floodfill(oldbio, newbio, bioget, x+1, z, change)
+ floodfill(oldbio, newbio, bioget, x, z-1, change)
+ floodfill(oldbio, newbio, bioget, x, z+1, change)
+ }
+}
+
+func NewFillTool() *fillTool {
+ return new(fillTool)
+}