From 7b60882ba394c01679db19fa3c24156177cadcf1 Mon Sep 17 00:00:00 2001 From: thetogi <50345837+thetogi@users.noreply.github.com> Date: Sat, 11 Jul 2020 18:12:20 -0400 Subject: [PATCH] Replace ebitenUtil with d2DebugUtil and new charmap for debugger. (#577) * lint updates for /d2astar * png issue * debug package * load bmp properly * debug draft * Vector float64 (#565) * Fixed nil pointer in Copy() * Position added Added Floor() and String() methods to Vector. Also added Position which declares an embedded Vector2 and returns various forms of it. * d2vector.Vector2 renamed to d2vector.BigFloat * vector.go renamed to big_float.go * Float64 stub and more renaming * Vector value getters * Separate vector types with initial methods. * Divide and lint warnings. * Distance and Length. * Scale, Abs and Negate. * CompareFloat64Fuzzy delta direction reversed. * Refactor vector_test.go. * Renamed Approx methods. * Distance and Length. * Distance and Length. * Removed BigFloat and Vector, renamed Float64 to Vector, simplified tests. * Angle, SignedAngle and other small functions. * Receiver rename. * SingedAngle and test fixed * Rotate. * SetLength. * Cross. * NinetyAnti and NinetyClock. * Lerp and Clamp. * Reflect and ReflectSurface. * Cardinal convenience functions. * Comments. * Panic on NaN and Inf in Position. * Lint warnings and comments. * D2map lint warnings (#566) * Comments and newlines in engine.go * Comments and newlines in object.go * Comments and newlines in animated_entity.go * Comments and newlines in missile.go * Comments and newlines in npc.go * Comments and newlines in player.go * Removed object.go (incorrectly merged it in during rebase). * Comments and newlines in renderer.go. * Comments and newlines in map_entity.go. * Comments and newlines in walk_mesh.go. * Comments and newlines in viewport.go and tile_cache.go. * Comments and newlines in stamp.go and wilderness_tile_types.go. * Comments and newlines in everything else. * removing inventory grid test for now because it causes builds to fail on github (#570) * Refactored d2enum (#567) * Refactored animation mode enum * More d2enum changes * Refactored tile enum * Refactored weapon class enum * Refactored more enums * Refactored item event enum * Fixed init_functions animation mode * Removed string2enum from MonsterAnimationMode * Refactored ItemStatCost description * Last enum lint errors * Regenerated monster stringer file * compressed image * Replaced restruct with StreamReader (#574) * Fixed bug in palette.go (#575) * Javascript console commands (#572) * Allow the execution of JS from the terminal when hosting a local game or playing a single game Signed-off-by: William Claude * Reorganise imports on edited files Signed-off-by: William Claude * Remove Reset Signed-off-by: William Claude * Add inventory.txt loader, use the records (#573) * adding resource entry for inventory.txt * adding loader for inventory.txt * adding call to inventory.txt loader in d2app * d2game now uses the inventory.txt records for making the inventory panel * removed comments * remove unused files * update go.mod * lint updates for /d2astar * png issue * update go.mod Co-authored-by: danhale-git <36298392+danhale-git@users.noreply.github.com> Co-authored-by: dk Co-authored-by: Intyre Co-authored-by: William <1004323+aziule@users.noreply.github.com> --- d2common/d2DebugUtil/d2DebugPrint.go | 69 ++++++++++++++++++ .../internal/assets/d2DebugAssets.go | 51 +++++++++++++ .../internal/assets/noto_sans_mono_8x16.bmp | Bin 0 -> 98358 bytes .../d2DebugUtil/internal/assets/zipbmp.go | 7 ++ d2common/d2astar/goreland_example.go | 4 +- d2core/d2render/ebiten/ebiten_surface.go | 5 +- go.mod | 1 + go.sum | 25 ++++++- 8 files changed, 153 insertions(+), 9 deletions(-) create mode 100644 d2common/d2DebugUtil/d2DebugPrint.go create mode 100644 d2common/d2DebugUtil/internal/assets/d2DebugAssets.go create mode 100644 d2common/d2DebugUtil/internal/assets/noto_sans_mono_8x16.bmp create mode 100644 d2common/d2DebugUtil/internal/assets/zipbmp.go diff --git a/d2common/d2DebugUtil/d2DebugPrint.go b/d2common/d2DebugUtil/d2DebugPrint.go new file mode 100644 index 00000000..a6f81dde --- /dev/null +++ b/d2common/d2DebugUtil/d2DebugPrint.go @@ -0,0 +1,69 @@ +package d2DebugUtil + +import ( + "image" + + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2DebugUtil/internal/assets" + "github.com/hajimehoshi/ebiten" +) + +var ( + debugPrintTextImage *ebiten.Image + debugPrintTextSubImages = map[rune]*ebiten.Image{} +) + +func init() { + img := assets.CreateTextImage() + debugPrintTextImage, _ = ebiten.NewImageFromImage(img, ebiten.FilterDefault) +} + +// DebugPrint draws the string str on the image on left top corner. +// +// The available runes are in U+0000 to U+00FF, which is C0 Controls and Basic Latin and C1 Controls and Latin-1 Supplement. +// +// DebugPrint always returns nil as of 1.5.0-alpha. +func D2DebugPrint(image *ebiten.Image, str string) error { + D2DebugPrintAt(image, str, 0, 0) + return nil +} + +// DebugPrintAt draws the string str on the image at (x, y) position. +// +// The available runes are in U+0000 to U+00FF, which is C0 Controls and Basic Latin and C1 Controls and Latin-1 Supplement. +func D2DebugPrintAt(image *ebiten.Image, str string, x, y int) { + drawDebugText(image, str, x, y, false) +} + +func drawDebugText(rt *ebiten.Image, str string, ox, oy int, shadow bool) { + op := &ebiten.DrawImageOptions{} + if shadow { + op.ColorM.Scale(0, 0, 0, 0.5) + } + x := 0 + y := 0 + w, _ := debugPrintTextImage.Size() + for _, c := range str { + const ( + cw = assets.CharWidth + ch = assets.CharHeight + ) + if c == '\n' { + x = 0 + y += ch + continue + } + s, ok := debugPrintTextSubImages[c] + if !ok { + n := w / cw + sx := (int(c) % n) * cw + sy := (int(c) / n) * ch + s = debugPrintTextImage.SubImage(image.Rect(sx, sy, sx+cw, sy+ch)).(*ebiten.Image) + debugPrintTextSubImages[c] = s + } + op.GeoM.Reset() + op.GeoM.Translate(float64(x), float64(y)) + op.GeoM.Translate(float64(ox+1), float64(oy)) + _ = rt.DrawImage(s, op) + x += cw + } +} diff --git a/d2common/d2DebugUtil/internal/assets/d2DebugAssets.go b/d2common/d2DebugUtil/internal/assets/d2DebugAssets.go new file mode 100644 index 00000000..7956f9e9 --- /dev/null +++ b/d2common/d2DebugUtil/internal/assets/d2DebugAssets.go @@ -0,0 +1,51 @@ +// Copyright 2014 Hajime Hoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:generate png2compressedrgba -input text.png -output /tmp/compressedTextRGBA +//go:generate file2byteslice -input /tmp/compressedTextRGBA -output textrgba.go -package assets -var compressedTextRGBA +//go:generate gofmt -s -w . + +package assets + +import ( + "bytes" + "compress/gzip" + "fmt" + "image" + + "golang.org/x/image/bmp" +) + +const ( + imgWidth = 256 + imgHeight = 128 + + CharWidth = 8 + CharHeight = 16 +) + +func CreateTextImage() image.Image { + s, err := gzip.NewReader(bytes.NewReader(CompressedDebugText)) + if err != nil { + panic(fmt.Sprintf("assets: gzip.NewReader failed: %v", err)) + } + defer s.Close() + + debugBmp, err := bmp.Decode(s) + if err != nil { + panic(fmt.Sprintf("assets: bmp.Decode failed: %v", err)) + } + + return debugBmp +} diff --git a/d2common/d2DebugUtil/internal/assets/noto_sans_mono_8x16.bmp b/d2common/d2DebugUtil/internal/assets/noto_sans_mono_8x16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bd4759d467509adf84e0f08b52820084e57e1898 GIT binary patch literal 98358 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 literal 0 HcmV?d00001 diff --git a/d2common/d2DebugUtil/internal/assets/zipbmp.go b/d2common/d2DebugUtil/internal/assets/zipbmp.go new file mode 100644 index 00000000..65c219f4 --- /dev/null +++ b/d2common/d2DebugUtil/internal/assets/zipbmp.go @@ -0,0 +1,7 @@ +// Code generated by file2byteslice. DO NOT EDIT. +// (gofmt is fine after generating) + +package assets + +//CompressedDebugText is []byte of noto_sans_mono_8x16.bmp +var CompressedDebugText = []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x02\xff\xec\x9dQr\xdc8\fD'\xb7\xd8#\xec\tr\x80\xfd\xdf;\xe5\xe6ފk\xcb\xe5\xd8\x12\b4\x01\x12\x92^\xffd\"\xcfH\"\xd9$\x01\xb2\x01\xfe\xf3\xef\xcf_?^\xbf\xf1\xf3\xf5z\xfd\xfd\xfbÏ\xd7\xeb\xd7\xfb?\u007f\xbd_\u007f\xfd\xffw\x00\xc0E\xf1\xf6\x0e\xea\x01\x9c1\xe1\x8c\x1e\xb7a\x0e\xfc\a\x06\x13\fz\xc0\u007fp\xfb.`\xd3\xe3\xf0\xfb\x1fS\xc3\xe7\xbf\xee\xbd~8a}\xfe\xc9\xe1\xf5\xb3\xef\xcf\\\u007f\xfb\x13\xe9\xd7\xcf\xca\xf5巡z(\xban\xd8\x15v\xa1*x2\xe4\xb3sv\xf8\xb8\xf2\xbd\xbd\xd6_\xff\xfe\xc1cו^\xaf~\xca\x19ϻ}\xb6\xf9f\xfc\xb6\x88?\x1f\u007f\n\x8d\x1b\xfe\xefo\xf9\f\xff\x9b\xf3\xdf\xf6+\x17\xbfO\n\xff\xab\xed\x87D{c8\xff\x16\xd9'\xf0\u007f\xd8.\x87v\xcb\xe21S\xfb~\x871\xf6\x8c\x15N\xfeo\x99\xf7\x13\xaf\x0f\xfb{\xf3\xf1߶[.ԯ\xfbL\n\xb6\xff\xbb\xd2\x1f\\\xe6T:\v\xbb\xd7\xffm\xd2\u007f\xedg\x9dM\xeeݖ\x10\xd9\xcc\x12\xd6[@\xfa\xf2x\xc8\":[\x8c\xb2\am\xa7\x91\x93^\xe4\xd0\xfb\xfb\x17\xd9*\xee\xef\xacύ\xedխ]\xa2\x96\xea\xd0_\x8e\xbe\xea$\x9fS\x06\xbd\xc4\xf7\xdfr\xff\xe1\x9d\xfb\xb4W\xabv\xe9f\xcc\x00\x00\x00\x00\x00\x00\x00@\xbaW\x85\xbf\x03\x1e\xde\x05\xa8\x04\x00\xff\x01\xc8\xe5\xd2PS\xb4\xecz\x1f}\xfeF\x1dș\xc9w\t\xfd\xff.=\x86\xad\xbc꯳\x8an\xc2\xdeF\xff\x1c\xd5\xc3wӿ\xf5\x89G\x88\xbe\xe7\xf6q\xf5,\xde\xe7Q\xfc7Ɓn1\x1agҲ>\xf18\xfex\xba>6\xcf\x03\xc7\xff/-5\xe4\xff\xae\x18=\xdb\x12\xdb\xd2O\xe5\xf1įC\xdbr\xddc\xa7\xad\xb4\xc3\x19\xff\xed\xc5\xe7\x8d\xfc\x17\xe2\x19C:\xa8\xbd\xfc\xc7\xfe\xd9bW\xc8\xda\xfb\xc5~\x8a\xc1\x9f\xe1z\xc2\xe1\x10z6\xb46\xb9\xfe@\xff\xb7\x15\xff\x875\xb3\xcbOw\xeac7\xc6\xf7\xa5\xc4\x03>v\xfd\xb3y\xfe\x93\x86\xf1_\xd1uڍ\xbb\x0flf\x81n\xbb`\x9e\xf5%\xe2\xbf\x12\xef?ܯi\xd2^\xddڥ\xfa%\x05\u007f\x81\xf8/\xe2\xbf\x16\xd7\x1b&\x04\x00\x00\x80'\xb8$\xa0[\r\xdfx\x1dcW\xb9\xe0\xff\xde\x1a\x16\\\xb9\xfe\xe5\x15\xd6?\xe1?\xfc\xbfA{ɯ\x17\xda\xc7\x14\xba\x98v\xff\x87\xf0\xb3\xb4Ȟ\xbc\xfaݪZ\xde]\xcd\xe5\xbfg\xcbr؎r\xe3\n\xfb\x92\xa1;\x1b?\x89\x86\x84t\x9e\a\x8d\xf8\x9a-\xfc\xf7\xec;̨\v\xb4\xb2Ln\xbe\f\xfb\xa0@~\x81\x84~\x1dKH\x05\x14\xcd\xdfۓ\xff\xf3[u\x15]\xb2I\x17\x88\xe6W\f\xc5\x1d\bqv\x1a\x99\xa3:.\xd9\x0e\xf9\xc2\xfc\x19\xfe,\xb0\u007f\xecv\x11N\xd7\xcaz\xab\x94\xa3\x94\xceZ\xb3nD\x8a\x8e\xff!KC \xf3\x90\xd2Q\xfb'\xf4\\\xa1kG\xedOyr\x94\xf9/\xbb\x18\xc3\xf7\xf4\xeb\x1cB\xea\xe8\xf9Qh\x9e\xff\xf6\xd4\x10\xcd3?\xef\xdfU\xef\xfb\xcbR\x9f\xe8\x902\xe9\xa4T\xf3?\x1ao\xa2\xbd\xedУ\xb1=\x9dɩY\x9e\\\xa2~\x81f\xbc\xa5\xe8{\xb3\x9e\x9b\xb5ؘ2>$\xf6\xdfj\xfeG\xe3G\x16\x98jC/ T\"'ۇ\xfef\x11?\xab\xfbE\xae\xeekr\x9d!\xd1\xef\xd0x\x9bRX\xf6\x8fn\x8c\x86\xe3a\xab\x87\x02\x00\x00\x00\x00\x00\x00\xc0\x16\xa7\f\x80\xfbQ\xdd\xff\xa7\x9eJB\x00*\xba\xc0\xfa8k\xa6'\x90E\x0fO>\xa8\\\xfe\xe7fi\xf3\xdbD\xfe\xe7\x1a\xb1\xf3\x11\x88\xc6\xe8m\xcf\bE\xf5ߖ\xff\xa5\xf9߾\xab\x13m\xe6\xdb\xe3O\xa8\xdeB\xf9\xf6\xfb\xd8?\xda\xf9\x14~\xfegy\x10\xd1\xfa\xcf:o\"\x1a\x94m\x17\xa1:\xber\x18\xb75\xe3\xff\x9e}\x8eƛ\xdc\xcf\xff=xT\x9fs\xa8\x87\xfc\xfc!\xa4g\bU\x82\xbf\xfem\xfb\xd0\xd8ws\xeeO\x1df\x11\x14\xf2\x98%\xee\xf7\x95\xe6\xf5\x9a9\xd7>z\x1fO\xb9\xaa\xf5\x03\xa1|\x8c\x02\xff\xb3\xce:\x9f\xac:\xe7\xfd\xed\xce\x18\xd2\xd5̧\x90\xcd\xe2\xbf<\xe7\xa6\xf0?\xf4\x0e[\xf8/D\n,\xe0\u007f4\x89\xf7\xbc\xbekx\x0euH\xa7W\xca\xff\xf9|\xbf\xd1%\x97D\xfeg\xd9'\x89\xe3\xffU\xf8\x1f\xf2\a\xb5x\x1cg\x12~\x8f\xbd4\xe3\xe4\xca\xed\x98\x12ϒ8\xfeg\xe9\xe7+\xe2 \xe4|Ի\xec\x9f\xc4syB}\xc1\x9fO^\xd0\xe7\xa7\xd8?g\x87_dųx\xfcߐ\x9f\x15\n\xc9\x11\xfcA\xbf\x93\xeeg\xd70\xb2\xcc\xffh\xcd\xff5\xfa\x85\xb3>\xa3\x99\xf3\xa3sGּ\xbf\xcb\xfe\xafX\x8b\xab\x88#\xa8\x8e8\xb8\xfa\n\xe4\xb5^~\x17\xff\xd7\xf0\xad\"\x8e@\xe3\xadp\xae\x19\xfc_\xf3\xaaY\xe7\xe0\xf8\xd7?\xd9\\\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`#\x9e\xb3@'$\xdb\xf1\u007fs\x98\x82\x06\xa6A\xfek\x15\xb6\xf4\x84\xee\xc3\xff\xce\xe8\x1f\x8c.\xe9)\x91\xac\xff?\xbc\x89Qdg\xde*\xfb\xb3_\x9f0,o\xf4=\xfd\xad\xec\xff\xfe^\xfd\xbf\xff\xfe\x02\xf9\xcft&\xf2\xe7a\xbdM\xeet\xcf\xeb߆\x92\xce\xf9\xf7\xa9\xd3\xcdF\x8b&\xe4\x0f\xf7\xeb\xff5ݠ0\x9e\xcfo\x01\x1b\xfc\x0f\x9d\xaf\x91ێ\xad\xf8\x1fUd\x9d\x8d\x1b\xdax҇\xffQ\xfd\u007f\xb5\xcey\r\xff=\tc\x17\xf0\xff̈J\xcc\x03\x9f\xc2\u007fc\xde\xfc^\x99!\xbb\xc5\xf3\xfd\x90KX\xcd\xff,\xddZ\x8a\xfe\xd9\xdf;\f\xfe\xdb\xf5\xe0\xb7c\x05\xfbYfe\\Xi<\xa9\x10\xff\"\x1c\xbe\x96Ŋh>ި\x1f\xb4\xdd\xff\xad\xe3\xbf\xff0/\xa3\\k\xf8\xbf2\x9f\x80g\f\xf4\x1f\x1d\x15\xe5\xbf\xe0\x14h\xd2hg\xbdi\xeb\x9f\xfe\xb8\xa4P虜\xe4\xdfh\xaf\xa2\xb8N9\x9eN\xae\u007f{\xd3G\xe6pi\xfc\x970\x05?|\xd3\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\x01u\xe7;\xb3\x98\x06\x9aS\xa8z\x1d\x98.p\x03\x92\x94\xbeR\xf4\xf0e{\xff4z\x84\xe2|~\xe0ܦ\x89\xeeD\xcf\xef\x0f\n\xfb}r\x8aHg\xfb&\xea\xe2\xb2\xc8\\z^\x86S-|\xf8>\xb6`l\x86\x9cѭ\xf0Ń\x89\xa0\xdfp\xca\x1a\xfd\x94K\xc9K\x9c\x95\xa5m\xb2ur[P\x8e\xaf\x9c\xe4\xbf,aZ\xc9\xffhܨGJ\x14\xfd\xc9\xf0A\x9esOJ\xf9\x9f\x15\xa5(\xe4I\x9e\u007f\r\x81<\xa1\xa3%\xcet)\xa5\xfc\x1f꺫g\xc9I\xfe\x0f\xa5/\xa1x\x99\xf9\xf1?j\xfa\xae1Z\x84\xf8\xca\n\xfek\x9d\"\xf1%C\xba\xdc\xf5~\xba\xa0\xab\x8f\xaewE\xe38\xa2\xa6{(N9\x91\xc9Q\x1d]\x96=\x10\x1a?\x87\x9d\xc2\x1fL\x97\xab\x8fm\xc5\u007fm\xbc\x12\x8e\ua637U&5\xa2\xf2\xd3\x13S\x94ϛ\xac\x9a]Q\xc4\u007f\xf9\x9c\xa3-\vn!ݵ\x10\xdf\xe4\x1c\x0fg\x86\xc7\xdc\u061c\\k$\xd7G\xd6\xce5\xf3\x9c\x9fbĉh\xebf)\xe7\xacmYR\x8e\x8a\xe1\xe5\xf3Og\xd6?=q\x19\x93\xeb\x03\xd5\xd5N\x9e+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xe1\x98џw\xbe\x9eUާ\xd5\xdb\x03\xf9p\xcb\xcfY\xe5}Z\xbd\xc1\a\xca\v\xff\xe1\x03\xe5\x85\xff\xf0\x81\xf2\xc2\u007f\xf8\x00\xff\xe1?|\x80\xff\xf0\xff\x96|`\xfd\x93\xf5\xcf\xc7\xf2\x01\x00\x00\x00\x00\x00\x00p3\xfc\x17\x00\x00\xff\xff\x98>\xce]6\x80\x01\x00") diff --git a/d2common/d2astar/goreland_example.go b/d2common/d2astar/goreland_example.go index a9d48703..5f5ec0fd 100644 --- a/d2common/d2astar/goreland_example.go +++ b/d2common/d2astar/goreland_example.go @@ -15,13 +15,13 @@ package d2astar // The key differences between this example and the Tile world: // 1) There is no grid. Trucks have arbitrary coordinates. // 2) Edges are not implied by the grid positions. Instead edges are explicitly -// modeled as Tubes. +// modelled as Tubes. // // The key similarities between this example and the Tile world: // 1) They both use Manhattan distance as their heuristic // 2) Both implement Pather -// Goreland represents a world of trucks and tubes. +//Goreland represents a world of trucks and tubes. type Goreland struct { // trucks map[int]*Truck // not needed really } diff --git a/d2core/d2render/ebiten/ebiten_surface.go b/d2core/d2render/ebiten/ebiten_surface.go index cfc29596..a3e9b081 100644 --- a/d2core/d2render/ebiten/ebiten_surface.go +++ b/d2core/d2render/ebiten/ebiten_surface.go @@ -6,10 +6,9 @@ import ( "image/color" "math" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2DebugUtil" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" - "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" - "github.com/hajimehoshi/ebiten" "github.com/hajimehoshi/ebiten/ebitenutil" ) @@ -162,7 +161,7 @@ func (s *ebitenSurface) RenderSection(sfc d2interface.Surface, bound image.Recta } func (s *ebitenSurface) DrawText(format string, params ...interface{}) { - ebitenutil.DebugPrintAt(s.image, fmt.Sprintf(format, params...), s.stateCurrent.x, s.stateCurrent.y) + d2DebugUtil.D2DebugPrintAt(s.image, fmt.Sprintf(format, params...), s.stateCurrent.x, s.stateCurrent.y) } func (s *ebitenSurface) DrawLine(x, y int, color color.Color) { diff --git a/go.mod b/go.mod index fe9133a3..fcedc1fb 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/OpenDiablo2/OpenDiablo2 go 1.14 require ( + 4d63.com/gochecknoinits v0.0.0-20200108094044-eb73b47b9fc4 // indirect github.com/JoshVarga/blast v0.0.0-20180421040937-681c804fb9f0 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect diff --git a/go.sum b/go.sum index 274e5f44..a62d33c9 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +4d63.com/gochecknoinits v0.0.0-20200108094044-eb73b47b9fc4 h1:bf5qocEKjrY58JO2GwywfLsb1199lIVs7qHkiplwHy0= +4d63.com/gochecknoinits v0.0.0-20200108094044-eb73b47b9fc4/go.mod h1:4o1i5aXtIF5tJFt3UD1knCVmWOXg7fLYdHVu6jeNcnM= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/JoshVarga/blast v0.0.0-20180421040937-681c804fb9f0 h1:tDnuU0igiBiQFjsvq1Bi7DpoUjqI76VVvW045vpeFeM= github.com/JoshVarga/blast v0.0.0-20180421040937-681c804fb9f0/go.mod h1:h/5OEGj4G+fpYxluLjSMZbFY011ZxAntO98nCl8mrCs= @@ -5,6 +7,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafo github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexflint/go-arg v0.0.0-20160306200701-e71d6514f40a h1:Bc+P30eTWphhueyACA/fjiHJXRDq/kGiqO38nGxvml0= +github.com/alexflint/go-arg v0.0.0-20160306200701-e71d6514f40a/go.mod h1:PHxo6ZWOLVMZZgWSAqBynb/KhIqoGO6WKwOVX7rM9dg= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= @@ -16,6 +20,8 @@ github.com/go-restruct/restruct v0.0.0-20191227155143-5734170a48a1/go.mod h1:Kqr github.com/gofrs/flock v0.7.1 h1:DP+LD/t0njgoPBvT5MJLeliUIVQR03hiKR6vezdwHlc= github.com/gofrs/flock v0.7.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf h1:vc7Dmrk4JwS0ZPS6WZvWlwDflgDTA26jItmbSj83nug= +github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= github.com/hajimehoshi/bitmapfont v1.2.0/go.mod h1:h9QrPk6Ktb2neObTlAbma6Ini1xgMjbJ3w7ysmD7IOU= github.com/hajimehoshi/ebiten v1.11.2 h1:4oixxPh5DuSNlmL/Q4LIOGFXCY8uLC+pcxOnqAGbwEY= github.com/hajimehoshi/ebiten v1.11.2/go.mod h1:aDEhx0K9gSpXw3Cxf2hCXDxPSoF8vgjNqKxrZa/B4Dg= @@ -23,8 +29,8 @@ github.com/hajimehoshi/ebiten v1.12.0-alpha.5.0.20200627174955-aea4630b5f84 h1:B github.com/hajimehoshi/ebiten v1.12.0-alpha.5.0.20200627174955-aea4630b5f84/go.mod h1:8vzUI4e0fBkbONYOY4WJN/qikY2zv/VG6kFTzJ0B//o= github.com/hajimehoshi/ebiten v1.12.0-alpha.6.0.20200629133528-780465b702ce h1:cEKWqbtxFremkIRhJxz0Z80wXqNNe8ZNk6ra8XASC1I= github.com/hajimehoshi/ebiten v1.12.0-alpha.6.0.20200629133528-780465b702ce/go.mod h1:8vzUI4e0fBkbONYOY4WJN/qikY2zv/VG6kFTzJ0B//o= -github.com/hajimehoshi/ebiten v1.12.0-alpha.7.0.20200703165837-6c33ed107f28 h1:su0k5pB/7j3FCoLsXGoPNWMJW7phujO0GC8sViJ07ow= -github.com/hajimehoshi/ebiten v1.12.0-alpha.7.0.20200703165837-6c33ed107f28/go.mod h1:vDl2Rhoz8i09Red8XR3B+/Jw+IubfG+V9SDBgQOEI8I= +github.com/hajimehoshi/file2byteslice v0.0.0-20190607115218-790acb50cc61 h1:PYZd+KUiq0+ByYlNTMByZz2U/VJ+KmLJ9Q2QAoYb8G0= +github.com/hajimehoshi/file2byteslice v0.0.0-20190607115218-790acb50cc61/go.mod h1:CqqAHp7Dk/AqQiwuhV1yT2334qbA/tFWQW0MD2dGqUE= github.com/hajimehoshi/go-mp3 v0.2.1/go.mod h1:Rr+2P46iH6PwTPVgSsEwBkon0CK5DxCAeX/Rp65DCTE= github.com/hajimehoshi/go-mp3 v0.3.0/go.mod h1:qMJj/CSDxx6CGHiZeCgbiq2DSUkbK0UbtXShQcnfyMM= github.com/hajimehoshi/oto v0.3.4/go.mod h1:PgjqsBJff0efqL2nlMJidJgVJywLn6M4y8PI4TfeWfA= @@ -36,11 +42,15 @@ github.com/jakecoffman/cp v0.1.0/go.mod h1:a3xPx9N8RyFAACD644t2dj/nK4SuLg1v+jL61 github.com/jfreymuth/oggvorbis v1.0.0/go.mod h1:abe6F9QRjuU9l+2jek3gj46lu40N4qlYxh2grqkLEDM= github.com/jfreymuth/oggvorbis v1.0.1/go.mod h1:NqS+K+UXKje0FUYUPosyQ+XTVvjmVjps1aEZH1sumIk= github.com/jfreymuth/vorbis v1.0.0/go.mod h1:8zy3lUAm9K/rJJk223RKy6vjCZTWC61NA2QD06bfOE0= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/mdempsky/maligned v0.0.0-20180708014732-6e39bd26a8c8 h1:zvpKif6gkrh82wAd2JIffdLyCL52N8r+ABwHxdIOvWM= +github.com/mdempsky/maligned v0.0.0-20180708014732-6e39bd26a8c8/go.mod h1:oGVD62YTpMEWw0JqJ2Vl48dzHywJBMlapkfsmhtokOU= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= @@ -56,8 +66,8 @@ github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdh github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/veandco/go-sdl2 v0.4.4 h1:coOJGftOdvNvGoUIZmm4XD+ZRQF4mg9ZVHmH3/42zFQ= -github.com/veandco/go-sdl2 v0.4.4/go.mod h1:FB+kTpX9YTE+urhYiClnRzpOXbiWgaU3+5F2AB78DPg= +github.com/walle/lll v1.0.1 h1:lbK8008fOXbQNYt8daBGUrjvElvlwlE7D7N/9dLP5IQ= +github.com/walle/lll v1.0.1/go.mod h1:lYxcXzoPhiAHR9eaq+Yv7RYg1nIipLloBCIfPUzfaWQ= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 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= @@ -72,6 +82,8 @@ golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 h1:hVwzHzIUGRjiF7EcUjqNxk3 golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg= golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519 h1:1e2ufUJNM3lCHEY5jIgac/7UTjd6cgJNdatjPdFWf34= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 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-20200222142934-3c8601c510d0 h1:nZASbxDuz7CO3227BWCCf0MC6ynyvKh6eMDoLcNXAk0= @@ -98,11 +110,16 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200327173247-9dae0f8f5775 h1:TC0v2RSO1u2kn1ZugjrFXkRZAEaqMN/RW+OTZkBzmLE= golang.org/x/sys v0.0.0-20200327173247-9dae0f8f5775/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +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.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200330175517-31583a0dbbc8 h1:cFzD2CKgXeXEgq3J/Qmj40Y0vv41un09b/5M5BRqHWo= golang.org/x/tools v0.0.0-20200330175517-31583a0dbbc8/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= 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=