diff --git a/d2common/d2interface/audio_provider.go b/d2common/d2interface/audio_provider.go index 98f16e19..5400aa8e 100644 --- a/d2common/d2interface/audio_provider.go +++ b/d2common/d2interface/audio_provider.go @@ -1,5 +1,7 @@ package d2interface +// AudioProvider is something that can play music, load audio files managed +// by the asset manager, and set the game engine's volume levels type AudioProvider interface { PlayBGM(song string) LoadSoundEffect(sfx string) (SoundEffect, error) diff --git a/d2core/d2render/composite_mode.go b/d2common/d2interface/composite_mode.go similarity index 98% rename from d2core/d2render/composite_mode.go rename to d2common/d2interface/composite_mode.go index 9c9fdb94..919fdb5b 100644 --- a/d2core/d2render/composite_mode.go +++ b/d2common/d2interface/composite_mode.go @@ -1,4 +1,4 @@ -package d2render +package d2interface type CompositeMode int diff --git a/d2common/d2interface/d2interface.go b/d2common/d2interface/d2interface.go new file mode 100644 index 00000000..41cec230 --- /dev/null +++ b/d2common/d2interface/d2interface.go @@ -0,0 +1,2 @@ +// Package d2interface defines interfaces for the OpenDiablo2 engine +package d2interface diff --git a/d2core/d2render/filter.go b/d2common/d2interface/filter.go similarity index 94% rename from d2core/d2render/filter.go rename to d2common/d2interface/filter.go index 60a7cbea..c8b40871 100644 --- a/d2core/d2render/filter.go +++ b/d2common/d2interface/filter.go @@ -1,4 +1,4 @@ -package d2render +package d2interface // Filter represents the type of texture filter to be used when an image is magnified or minified. type Filter int diff --git a/d2core/d2render/render_type.go b/d2common/d2interface/render_type.go similarity index 83% rename from d2core/d2render/render_type.go rename to d2common/d2interface/render_type.go index 7cc372dd..fad64f1a 100644 --- a/d2core/d2render/render_type.go +++ b/d2common/d2interface/render_type.go @@ -1,4 +1,4 @@ -package d2render +package d2interface // Defines the type of rendering engine to use type RenderType int diff --git a/d2core/d2render/renderer.go b/d2common/d2interface/renderer.go similarity index 95% rename from d2core/d2render/renderer.go rename to d2common/d2interface/renderer.go index bd052010..0eae3ccd 100644 --- a/d2core/d2render/renderer.go +++ b/d2common/d2interface/renderer.go @@ -1,4 +1,4 @@ -package d2render +package d2interface type Renderer interface { GetRendererName() string diff --git a/d2common/d2interface/sound_effect.go b/d2common/d2interface/sound_effect.go index 343a67aa..feecf8fe 100644 --- a/d2common/d2interface/sound_effect.go +++ b/d2common/d2interface/sound_effect.go @@ -1,5 +1,6 @@ package d2interface +// SoundEffect is something that that the AudioProvider can Play or Stop type SoundEffect interface { Play() Stop() diff --git a/d2core/d2render/surface.go b/d2common/d2interface/surface.go similarity index 96% rename from d2core/d2render/surface.go rename to d2common/d2interface/surface.go index 3d167988..f75f7e98 100644 --- a/d2core/d2render/surface.go +++ b/d2common/d2interface/surface.go @@ -1,4 +1,4 @@ -package d2render +package d2interface import ( "image" diff --git a/d2common/d2interface/terminal.go b/d2common/d2interface/terminal.go index b4c1551f..8ba61e07 100644 --- a/d2common/d2interface/terminal.go +++ b/d2common/d2interface/terminal.go @@ -2,9 +2,9 @@ package d2interface import ( "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) +// TermCategory applies styles to the lines in the Terminal type TermCategory int const ( @@ -14,17 +14,10 @@ const ( TermCategoryError ) -const ( - termCharWidth = 6 - termCharHeight = 16 - termRowCount = 24 - termRowCountMax = 32 - termColCountMax = 128 - termAnimLength = 0.5 -) - +// TermVis is an enumeration of the Terminal's visibility states type termVis int +// Terminal visibility state const ( termVisHidden termVis = iota termVisShowing @@ -32,13 +25,16 @@ const ( termVisHiding ) +// Terminal is a drop-down terminal and shell +// It is used throughout the codebase, most parts of the engine will +// `bind` commands, which are available for use in the shell type Terminal interface { BindLogger() Advance(elapsed float64) error OnKeyDown(event d2input.KeyEvent) bool OnKeyChars(event d2input.KeyCharsEvent) bool - Render(surface d2render.Surface) error + Render(surface Surface) error Execute(command string) error OutputRaw(text string, category TermCategory) Output(format string, params ...interface{}) @@ -53,6 +49,8 @@ type Terminal interface { UnbindAction(name string) error } +// TerminalLogger is used tomake the Terminal write out +// (eg. to the system shell or to a file) type TerminalLogger interface { Write(p []byte) (int, error) } diff --git a/d2core/d2asset/animation.go b/d2core/d2asset/animation.go index 0dcc44fa..c0103134 100644 --- a/d2core/d2asset/animation.go +++ b/d2core/d2asset/animation.go @@ -5,6 +5,8 @@ import ( "image/color" "math" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dat" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dc6" @@ -27,7 +29,7 @@ type animationFrame struct { offsetX int offsetY int - image d2render.Surface + image d2interface.Surface } type animationDirection struct { @@ -41,7 +43,7 @@ type Animation struct { lastFrameTime float64 playedCount int - compositeMode d2render.CompositeMode + compositeMode d2interface.CompositeMode colorMod color.Color originAtBottom bool @@ -87,7 +89,7 @@ func CreateAnimationFromDCC(dcc *d2dcc.DCC, palette *d2dat.DATPalette, transpare } } - image, err := d2render.NewSurface(frameWidth, frameHeight, d2render.FilterNearest) + image, err := d2render.NewSurface(frameWidth, frameHeight, d2interface.FilterNearest) if err != nil { return nil, err } @@ -122,7 +124,7 @@ func CreateAnimationFromDC6(dc6 *d2dc6.DC6, palette *d2dat.DATPalette) (*Animati } for frameIndex, dc6Frame := range dc6.Frames { - image, err := d2render.NewSurface(int(dc6Frame.Width), int(dc6Frame.Height), d2render.FilterNearest) + image, err := d2render.NewSurface(int(dc6Frame.Width), int(dc6Frame.Height), d2interface.FilterNearest) if err != nil { return nil, err } @@ -253,7 +255,7 @@ func (a *Animation) Advance(elapsed float64) error { return nil } -func (a *Animation) Render(target d2render.Surface) error { +func (a *Animation) Render(target d2interface.Surface) error { direction := a.directions[a.directionIndex] frame := direction.frames[a.frameIndex] @@ -264,7 +266,7 @@ func (a *Animation) Render(target d2render.Surface) error { return target.Render(frame.image) } -func (a *Animation) RenderFromOrigin(target d2render.Surface) error { +func (a *Animation) RenderFromOrigin(target d2interface.Surface) error { if a.originAtBottom { direction := a.directions[a.directionIndex] frame := direction.frames[a.frameIndex] @@ -397,8 +399,8 @@ func (a *Animation) ResetPlayedCount() { func (a *Animation) SetBlend(blend bool) { if blend { - a.compositeMode = d2render.CompositeModeLighter + a.compositeMode = d2interface.CompositeModeLighter } else { - a.compositeMode = d2render.CompositeModeSourceOver + a.compositeMode = d2interface.CompositeModeSourceOver } } diff --git a/d2core/d2asset/composite.go b/d2core/d2asset/composite.go index d8cdde01..c9b87958 100644 --- a/d2core/d2asset/composite.go +++ b/d2core/d2asset/composite.go @@ -6,10 +6,11 @@ import ( "math" "strings" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) type Composite struct { @@ -45,7 +46,7 @@ func (c *Composite) Advance(elapsed float64) error { return nil } -func (c *Composite) Render(target d2render.Surface) error { +func (c *Composite) Render(target d2interface.Surface) error { if c.mode == nil { return nil } diff --git a/d2core/d2asset/font.go b/d2core/d2asset/font.go index c1fe7f3d..9ce9db1e 100644 --- a/d2core/d2asset/font.go +++ b/d2core/d2asset/font.go @@ -6,8 +6,9 @@ import ( "image/color" "strings" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) type fontGlyph struct { @@ -98,7 +99,7 @@ func (f *Font) Clone() *Font { } } -func (f *Font) RenderText(text string, target d2render.Surface) error { +func (f *Font) RenderText(text string, target d2interface.Surface) error { f.sheet.SetColorMod(f.color) f.sheet.SetBlend(false) diff --git a/d2core/d2gui/button.go b/d2core/d2gui/button.go index f617cf1a..45d6fe49 100644 --- a/d2core/d2gui/button.go +++ b/d2core/d2gui/button.go @@ -4,6 +4,8 @@ import ( "errors" "image/color" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" @@ -24,7 +26,7 @@ type Button struct { width int height int state buttonState - surfaces []d2render.Surface + surfaces []d2interface.Surface } func createButton(text string, buttonStyle ButtonStyle) (*Button, error) { @@ -69,9 +71,9 @@ func createButton(text string, buttonStyle ButtonStyle) (*Button, error) { textY := buttonHeight/2 - textHeight/2 + config.textOffset surfaceCount := animation.GetFrameCount() / (config.segmentsX * config.segmentsY) - surfaces := make([]d2render.Surface, surfaceCount) + surfaces := make([]d2interface.Surface, surfaceCount) for i := 0; i < surfaceCount; i++ { - surface, err := d2render.NewSurface(buttonWidth, buttonHeight, d2render.FilterNearest) + surface, err := d2render.NewSurface(buttonWidth, buttonHeight, d2interface.FilterNearest) if err != nil { return nil, err } @@ -121,7 +123,7 @@ func (b *Button) onMouseLeave(event d2input.MouseMoveEvent) bool { return false } -func (b *Button) render(target d2render.Surface) error { +func (b *Button) render(target d2interface.Surface) error { return target.Render(b.surfaces[b.state]) } diff --git a/d2core/d2gui/common.go b/d2core/d2gui/common.go index 8d561200..656ca35b 100644 --- a/d2core/d2gui/common.go +++ b/d2core/d2gui/common.go @@ -3,9 +3,10 @@ package d2gui import ( "errors" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) func loadFont(fontStyle FontStyle) (*d2asset.Font, error) { @@ -17,7 +18,7 @@ func loadFont(fontStyle FontStyle) (*d2asset.Font, error) { return d2asset.LoadFont(config.fontBasePath+".tbl", config.fontBasePath+".dc6", config.palettePath) } -func renderSegmented(animation *d2asset.Animation, segmentsX, segmentsY, frameOffset int, target d2render.Surface) error { +func renderSegmented(animation *d2asset.Animation, segmentsX, segmentsY, frameOffset int, target d2interface.Surface) error { var currentY int for y := 0; y < segmentsY; y++ { var currentX int diff --git a/d2core/d2gui/d2gui.go b/d2core/d2gui/d2gui.go index ef4328dc..bb034380 100644 --- a/d2core/d2gui/d2gui.go +++ b/d2core/d2gui/d2gui.go @@ -3,7 +3,7 @@ package d2gui import ( "errors" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" ) var ( @@ -24,7 +24,7 @@ func Initialize() error { return nil } -func Render(target d2render.Surface) error { +func Render(target d2interface.Surface) error { verifyWasInit() return singleton.render(target) } diff --git a/d2core/d2gui/label.go b/d2core/d2gui/label.go index ce803696..ba530e9e 100644 --- a/d2core/d2gui/label.go +++ b/d2core/d2gui/label.go @@ -1,6 +1,7 @@ package d2gui import ( + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) @@ -10,7 +11,7 @@ type Label struct { text string font *d2asset.Font - surface d2render.Surface + surface d2interface.Surface } func createLabel(text string, fontStyle FontStyle) (*Label, error) { @@ -26,7 +27,7 @@ func createLabel(text string, fontStyle FontStyle) (*Label, error) { return label, nil } -func (l *Label) render(target d2render.Surface) error { +func (l *Label) render(target d2interface.Surface) error { return target.Render(l.surface) } @@ -47,7 +48,7 @@ func (l *Label) SetText(text string) error { func (l *Label) setText(text string) error { width, height := l.font.GetTextMetrics(text) - surface, err := d2render.NewSurface(width, height, d2render.FilterNearest) + surface, err := d2render.NewSurface(width, height, d2interface.FilterNearest) if err != nil { return err } diff --git a/d2core/d2gui/layout.go b/d2core/d2gui/layout.go index 8500b625..bc862a79 100644 --- a/d2core/d2gui/layout.go +++ b/d2core/d2gui/layout.go @@ -3,9 +3,10 @@ package d2gui import ( "image/color" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) type layoutEntry struct { @@ -137,7 +138,7 @@ func (l *Layout) Clear() { l.entries = nil } -func (l *Layout) render(target d2render.Surface) error { +func (l *Layout) render(target d2interface.Surface) error { l.AdjustEntryPlacement() for _, entry := range l.entries { @@ -168,14 +169,14 @@ func (l *Layout) advance(elapsed float64) error { return nil } -func (l *Layout) renderEntry(entry *layoutEntry, target d2render.Surface) error { +func (l *Layout) renderEntry(entry *layoutEntry, target d2interface.Surface) error { target.PushTranslation(entry.x, entry.y) defer target.Pop() return entry.widget.render(target) } -func (l *Layout) renderEntryDebug(entry *layoutEntry, target d2render.Surface) error { +func (l *Layout) renderEntryDebug(entry *layoutEntry, target d2interface.Surface) error { target.PushTranslation(entry.x, entry.y) defer target.Pop() diff --git a/d2core/d2gui/manager.go b/d2core/d2gui/manager.go index 4a27586e..f6641a6a 100644 --- a/d2core/d2gui/manager.go +++ b/d2core/d2gui/manager.go @@ -4,10 +4,11 @@ import ( "image/color" "math" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) type manager struct { @@ -78,7 +79,7 @@ func (m *manager) OnMouseMove(event d2input.MouseMoveEvent) bool { return m.layout.onMouseMove(event) } -func (m *manager) render(target d2render.Surface) error { +func (m *manager) render(target d2interface.Surface) error { if m.loading { if err := m.renderLoadScreen(target); err != nil { return err @@ -99,7 +100,7 @@ func (m *manager) render(target d2render.Surface) error { return nil } -func (m *manager) renderLoadScreen(target d2render.Surface) error { +func (m *manager) renderLoadScreen(target d2interface.Surface) error { target.Clear(color.Black) screenWidth, screenHeight := target.GetSize() @@ -111,7 +112,7 @@ func (m *manager) renderLoadScreen(target d2render.Surface) error { return m.loadingAnim.Render(target) } -func (m *manager) renderCursor(target d2render.Surface) error { +func (m *manager) renderCursor(target d2interface.Surface) error { _, height := m.cursorAnim.GetCurrentFrameSize() target.PushTranslation(m.cursorX, m.cursorY) target.PushTranslation(0, -height) diff --git a/d2core/d2gui/sprite.go b/d2core/d2gui/sprite.go index b0555e99..44dbb549 100644 --- a/d2core/d2gui/sprite.go +++ b/d2core/d2gui/sprite.go @@ -1,8 +1,8 @@ package d2gui import ( + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) type AnimationDirection int @@ -59,7 +59,7 @@ func createAnimatedSprite(imagePath, palettePath string, direction AnimationDire return sprite, nil } -func (s *AnimatedSprite) render(target d2render.Surface) error { +func (s *AnimatedSprite) render(target d2interface.Surface) error { _, frameHeight := s.animation.GetCurrentFrameSize() target.PushTranslation(s.x, s.y-frameHeight) @@ -73,7 +73,7 @@ func (s *Sprite) SetSegmented(segmentsX, segmentsY, frameOffset int) { s.frameOffset = frameOffset } -func (s *Sprite) render(target d2render.Surface) error { +func (s *Sprite) render(target d2interface.Surface) error { return renderSegmented(s.animation, s.segmentsX, s.segmentsY, s.frameOffset, target) } diff --git a/d2core/d2gui/widget.go b/d2core/d2gui/widget.go index 62fd1336..d720b98f 100644 --- a/d2core/d2gui/widget.go +++ b/d2core/d2gui/widget.go @@ -1,15 +1,15 @@ package d2gui import ( + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) type MouseHandler func(d2input.MouseEvent) type MouseMoveHandler func(d2input.MouseMoveEvent) type widget interface { - render(target d2render.Surface) error + render(target d2interface.Surface) error advance(elapsed float64) error onMouseMove(event d2input.MouseMoveEvent) bool @@ -105,7 +105,7 @@ func (w *widgetBase) isExpanding() bool { return w.expanding } -func (w *widgetBase) render(target d2render.Surface) error { +func (w *widgetBase) render(target d2interface.Surface) error { return nil } diff --git a/d2core/d2map/d2mapentity/animated_entity.go b/d2core/d2map/d2mapentity/animated_entity.go index 2444004b..121c4ebd 100644 --- a/d2core/d2map/d2mapentity/animated_entity.go +++ b/d2core/d2map/d2mapentity/animated_entity.go @@ -1,8 +1,8 @@ package d2mapentity import ( + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) // AnimatedEntity represents an animation that can be projected onto the map. @@ -26,7 +26,7 @@ func CreateAnimatedEntity(x, y int, animation *d2asset.Animation) *AnimatedEntit } // Render draws this animated entity onto the target -func (ae *AnimatedEntity) Render(target d2render.Surface) { +func (ae *AnimatedEntity) Render(target d2interface.Surface) { target.PushTranslation( ae.offsetX+int((ae.subcellX-ae.subcellY)*16), ae.offsetY+int(((ae.subcellX+ae.subcellY)*8)-5), diff --git a/d2core/d2map/d2mapentity/map_entity.go b/d2core/d2map/d2mapentity/map_entity.go index c050bd39..d27417cd 100644 --- a/d2core/d2map/d2mapentity/map_entity.go +++ b/d2core/d2map/d2mapentity/map_entity.go @@ -3,16 +3,17 @@ package d2mapentity import ( "math" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2astar" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) type MapEntity interface { - Render(target d2render.Surface) + Render(target d2interface.Surface) Advance(tickTime float64) GetPosition() (float64, float64) - GetLayer() (int) + GetLayer() int GetPositionF() (float64, float64) Name() string Selectable() bool diff --git a/d2core/d2map/d2mapentity/npc.go b/d2core/d2map/d2mapentity/npc.go index df60aa70..8fab901a 100644 --- a/d2core/d2map/d2mapentity/npc.go +++ b/d2core/d2map/d2mapentity/npc.go @@ -3,12 +3,13 @@ package d2mapentity import ( "math/rand" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) type NPC struct { @@ -49,7 +50,7 @@ func CreateNPC(x, y int, object *d2datadict.ObjectLookupRecord, direction int) * return result } -func (v *NPC) Render(target d2render.Surface) { +func (v *NPC) Render(target d2interface.Surface) { target.PushTranslation( v.offsetX+int((v.subcellX-v.subcellY)*16), v.offsetY+int(((v.subcellX+v.subcellY)*8)-5), diff --git a/d2core/d2map/d2mapentity/object.go b/d2core/d2map/d2mapentity/object.go index c8d5faad..96f1f98f 100644 --- a/d2core/d2map/d2mapentity/object.go +++ b/d2core/d2map/d2mapentity/object.go @@ -4,9 +4,9 @@ import ( "github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" ) @@ -32,7 +32,7 @@ func CreateObject(x, y int, object *d2datadict.ObjectLookupRecord, palettePath s mapEntity: createMapEntity(x, y), composite: composite, objectLookup: object, - nameLabel: d2ui.CreateLabel(d2resource.FontFormal11, d2resource.PaletteStatic), + nameLabel: d2ui.CreateLabel(d2resource.FontFormal11, d2resource.PaletteStatic), } entity.mapEntity.directioner = entity.rotate entity.objectRecord = d2datadict.Objects[object.ObjectsTxtId] @@ -74,7 +74,7 @@ func (ob *Object) Selectable() bool { } // Render draws this animated entity onto the target -func (ob *Object) Render(target d2render.Surface) { +func (ob *Object) Render(target d2interface.Surface) { target.PushTranslation( ob.offsetX+int((ob.subcellX-ob.subcellY)*16), ob.offsetY+int(((ob.subcellX+ob.subcellY)*8)-5), diff --git a/d2core/d2map/d2mapentity/player.go b/d2core/d2map/d2mapentity/player.go index 4381a4d9..230b6151 100644 --- a/d2core/d2map/d2mapentity/player.go +++ b/d2core/d2map/d2mapentity/player.go @@ -3,13 +3,14 @@ package d2mapentity import ( "image/color" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2hero" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" ) @@ -132,7 +133,7 @@ func (v *Player) Advance(tickTime float64) { } } -func (v *Player) Render(target d2render.Surface) { +func (v *Player) Render(target d2interface.Surface) { target.PushTranslation( v.offsetX+int((v.subcellX-v.subcellY)*16), v.offsetY+int(((v.subcellX+v.subcellY)*8)-5), diff --git a/d2core/d2map/d2maprenderer/image_cache.go b/d2core/d2map/d2maprenderer/image_cache.go index fa1a7c1c..687b0b41 100644 --- a/d2core/d2map/d2maprenderer/image_cache.go +++ b/d2core/d2map/d2maprenderer/image_cache.go @@ -2,25 +2,25 @@ package d2maprenderer import ( "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" ) -var imageCacheRecords map[uint32]d2render.Surface +var imageCacheRecords map[uint32]d2interface.Surface // Invalidates the global region image cache. Call this when you are changing regions func InvalidateImageCache() { imageCacheRecords = nil } -func (mr *MapRenderer) getImageCacheRecord(style, sequence byte, tileType d2enum.TileType, randomIndex byte) d2render.Surface { +func (mr *MapRenderer) getImageCacheRecord(style, sequence byte, tileType d2enum.TileType, randomIndex byte) d2interface.Surface { lookupIndex := uint32(style)<<24 | uint32(sequence)<<16 | uint32(tileType)<<8 | uint32(randomIndex) return imageCacheRecords[lookupIndex] } -func (mr *MapRenderer) setImageCacheRecord(style, sequence byte, tileType d2enum.TileType, randomIndex byte, image d2render.Surface) { +func (mr *MapRenderer) setImageCacheRecord(style, sequence byte, tileType d2enum.TileType, randomIndex byte, image d2interface.Surface) { lookupIndex := uint32(style)<<24 | uint32(sequence)<<16 | uint32(tileType)<<8 | uint32(randomIndex) if imageCacheRecords == nil { - imageCacheRecords = make(map[uint32]d2render.Surface) + imageCacheRecords = make(map[uint32]d2interface.Surface) } imageCacheRecords[lookupIndex] = image } diff --git a/d2core/d2map/d2maprenderer/renderer.go b/d2core/d2map/d2maprenderer/renderer.go index 837f0cee..cd66790a 100644 --- a/d2core/d2map/d2maprenderer/renderer.go +++ b/d2core/d2map/d2maprenderer/renderer.go @@ -15,7 +15,6 @@ import ( "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2ds1" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) // The map renderer, used to render the map @@ -58,7 +57,7 @@ func (mr *MapRenderer) SetMapEngine(mapEngine *d2mapengine.MapEngine) { mr.generateTileCache() } -func (mr *MapRenderer) Render(target d2render.Surface) { +func (mr *MapRenderer) Render(target d2interface.Surface) { mapSize := mr.mapEngine.Size() stxf, styf := mr.viewport.ScreenToWorld(400, -200) etxf, etyf := mr.viewport.ScreenToWorld(400, 1050) @@ -97,7 +96,7 @@ func (mr *MapRenderer) WorldToOrtho(x, y float64) (float64, float64) { } // Lower wall tiles, tile shadews, floor tiles -func (mr *MapRenderer) renderPass1(target d2render.Surface, startX, startY, endX, endY int) { +func (mr *MapRenderer) renderPass1(target d2interface.Surface, startX, startY, endX, endY int) { for tileY := startY; tileY < endY; tileY++ { for tileX := startX; tileX < endX; tileX++ { tile := mr.mapEngine.TileAt(tileX, tileY) @@ -109,7 +108,7 @@ func (mr *MapRenderer) renderPass1(target d2render.Surface, startX, startY, endX } // Objects below walls -func (mr *MapRenderer) renderPass2(target d2render.Surface, startX, startY, endX, endY int) { +func (mr *MapRenderer) renderPass2(target d2interface.Surface, startX, startY, endX, endY int) { for tileY := startY; tileY < endY; tileY++ { for tileX := startX; tileX < endX; tileX++ { mr.viewport.PushTranslationWorld(float64(tileX), float64(tileY)) @@ -133,7 +132,7 @@ func (mr *MapRenderer) renderPass2(target d2render.Surface, startX, startY, endX } // Upper wall tiles, objects that are on top of walls -func (mr *MapRenderer) renderPass3(target d2render.Surface, startX, startY, endX, endY int) { +func (mr *MapRenderer) renderPass3(target d2interface.Surface, startX, startY, endX, endY int) { for tileY := startY; tileY < endY; tileY++ { for tileX := startX; tileX < endX; tileX++ { tile := mr.mapEngine.TileAt(tileX, tileY) @@ -159,7 +158,7 @@ func (mr *MapRenderer) renderPass3(target d2render.Surface, startX, startY, endX } // Roof tiles -func (mr *MapRenderer) renderPass4(target d2render.Surface, startX, startY, endX, endY int) { +func (mr *MapRenderer) renderPass4(target d2interface.Surface, startX, startY, endX, endY int) { for tileY := startY; tileY < endY; tileY++ { for tileX := startX; tileX < endX; tileX++ { tile := mr.mapEngine.TileAt(tileX, tileY) @@ -172,7 +171,7 @@ func (mr *MapRenderer) renderPass4(target d2render.Surface, startX, startY, endX } -func (mr *MapRenderer) renderTilePass1(tile *d2ds1.TileRecord, target d2render.Surface) { +func (mr *MapRenderer) renderTilePass1(tile *d2ds1.TileRecord, target d2interface.Surface) { for _, wall := range tile.Walls { if !wall.Hidden && wall.Prop1 != 0 && wall.Type.LowerWall() { mr.renderWall(wall, mr.viewport, target) @@ -192,7 +191,7 @@ func (mr *MapRenderer) renderTilePass1(tile *d2ds1.TileRecord, target d2render.S } } -func (mr *MapRenderer) renderTilePass2(tile *d2ds1.TileRecord, target d2render.Surface) { +func (mr *MapRenderer) renderTilePass2(tile *d2ds1.TileRecord, target d2interface.Surface) { for _, wall := range tile.Walls { if !wall.Hidden && wall.Type.UpperWall() { mr.renderWall(wall, mr.viewport, target) @@ -200,7 +199,7 @@ func (mr *MapRenderer) renderTilePass2(tile *d2ds1.TileRecord, target d2render.S } } -func (mr *MapRenderer) renderTilePass3(tile *d2ds1.TileRecord, target d2render.Surface) { +func (mr *MapRenderer) renderTilePass3(tile *d2ds1.TileRecord, target d2interface.Surface) { for _, wall := range tile.Walls { if wall.Type == d2enum.Roof { mr.renderWall(wall, mr.viewport, target) @@ -208,8 +207,8 @@ func (mr *MapRenderer) renderTilePass3(tile *d2ds1.TileRecord, target d2render.S } } -func (mr *MapRenderer) renderFloor(tile d2ds1.FloorShadowRecord, target d2render.Surface) { - var img d2render.Surface +func (mr *MapRenderer) renderFloor(tile d2ds1.FloorShadowRecord, target d2interface.Surface) { + var img d2interface.Surface if !tile.Animated { img = mr.getImageCacheRecord(tile.Style, tile.Sequence, 0, tile.RandomIndex) } else { @@ -229,7 +228,7 @@ func (mr *MapRenderer) renderFloor(tile d2ds1.FloorShadowRecord, target d2render target.Render(img) } -func (mr *MapRenderer) renderWall(tile d2ds1.WallRecord, viewport *Viewport, target d2render.Surface) { +func (mr *MapRenderer) renderWall(tile d2ds1.WallRecord, viewport *Viewport, target d2interface.Surface) { img := mr.getImageCacheRecord(tile.Style, tile.Sequence, tile.Type, tile.RandomIndex) if img == nil { log.Printf("Render called on uncached wall {%v,%v,%v}", tile.Style, tile.Sequence, tile.Type) @@ -245,7 +244,7 @@ func (mr *MapRenderer) renderWall(tile d2ds1.WallRecord, viewport *Viewport, tar target.Render(img) } -func (mr *MapRenderer) renderShadow(tile d2ds1.FloorShadowRecord, target d2render.Surface) { +func (mr *MapRenderer) renderShadow(tile d2ds1.FloorShadowRecord, target d2interface.Surface) { img := mr.getImageCacheRecord(tile.Style, tile.Sequence, 13, tile.RandomIndex) if img == nil { log.Printf("Render called on uncached shadow {%v,%v}", tile.Style, tile.Sequence) @@ -261,7 +260,7 @@ func (mr *MapRenderer) renderShadow(tile d2ds1.FloorShadowRecord, target d2rende target.Render(img) } -func (mr *MapRenderer) renderDebug(debugVisLevel int, target d2render.Surface, startX, startY, endX, endY int) { +func (mr *MapRenderer) renderDebug(debugVisLevel int, target d2interface.Surface, startX, startY, endX, endY int) { for tileY := startY; tileY < endY; tileY++ { for tileX := startX; tileX < endX; tileX++ { mr.viewport.PushTranslationWorld(float64(tileX), float64(tileY)) @@ -279,7 +278,7 @@ func (mr *MapRenderer) WorldToScreenF(x, y float64) (float64, float64) { return mr.viewport.WorldToScreenF(x, y) } -func (mr *MapRenderer) renderTileDebug(ax, ay int, debugVisLevel int, target d2render.Surface) { +func (mr *MapRenderer) renderTileDebug(ax, ay int, debugVisLevel int, target d2interface.Surface) { subTileColor := color.RGBA{R: 80, G: 80, B: 255, A: 50} tileColor := color.RGBA{R: 255, G: 255, B: 255, A: 100} tileCollisionColor := color.RGBA{R: 128, G: 0, B: 0, A: 100} diff --git a/d2core/d2map/d2maprenderer/tile_cache.go b/d2core/d2map/d2maprenderer/tile_cache.go index aabf4cc2..396d4fd3 100644 --- a/d2core/d2map/d2maprenderer/tile_cache.go +++ b/d2core/d2map/d2maprenderer/tile_cache.go @@ -3,6 +3,8 @@ package d2maprenderer import ( "log" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common" @@ -74,7 +76,7 @@ func (mr *MapRenderer) generateFloorCache(tile *d2ds1.FloorShadowRecord, tileX, } tileYOffset := d2common.AbsInt32(tileYMinimum) tileHeight := d2common.AbsInt32(tileData[i].Height) - image, _ := d2render.NewSurface(int(tileData[i].Width), int(tileHeight), d2render.FilterNearest) + image, _ := d2render.NewSurface(int(tileData[i].Width), int(tileHeight), d2interface.FilterNearest) pixels := make([]byte, 4*tileData[i].Width*tileHeight) mr.decodeTileGfxData(tileData[i].Blocks, &pixels, tileYOffset, tileData[i].Width) image.ReplacePixels(pixels) @@ -113,7 +115,7 @@ func (mr *MapRenderer) generateShadowCache(tile *d2ds1.FloorShadowRecord, tileX, return } - image, _ := d2render.NewSurface(int(tileData.Width), tileHeight, d2render.FilterNearest) + image, _ := d2render.NewSurface(int(tileData.Width), tileHeight, d2interface.FilterNearest) pixels := make([]byte, 4*tileData.Width*int32(tileHeight)) mr.decodeTileGfxData(tileData.Blocks, &pixels, tileYOffset, tileData.Width) image.ReplacePixels(pixels) @@ -174,7 +176,7 @@ func (mr *MapRenderer) generateWallCache(tile *d2ds1.WallRecord, tileX, tileY in return } - image, _ := d2render.NewSurface(160, int(realHeight), d2render.FilterNearest) + image, _ := d2render.NewSurface(160, int(realHeight), d2interface.FilterNearest) pixels := make([]byte, 4*160*realHeight) mr.decodeTileGfxData(tileData.Blocks, &pixels, tileYOffset, 160) diff --git a/d2core/d2render/d2render.go b/d2core/d2render/d2render.go index 95da3ceb..d0178a29 100644 --- a/d2core/d2render/d2render.go +++ b/d2core/d2render/d2render.go @@ -3,6 +3,8 @@ package d2render import ( "errors" "log" + + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" ) var ( @@ -11,9 +13,9 @@ var ( ErrInvalidRenderer = errors.New("invalid rendering system specified") ) -var singleton Renderer +var singleton d2interface.Renderer -func Initialize(rend Renderer) error { +func Initialize(rend d2interface.Renderer) error { verifyNotInit() singleton = rend log.Printf("Initialized the %s renderer...", singleton.GetRendererName()) @@ -25,7 +27,7 @@ func SetWindowIcon(fileName string) { singleton.SetWindowIcon(fileName) } -func Run(f func(Surface) error, width, height int, title string) error { +func Run(f func(d2interface.Surface) error, width, height int, title string) error { verifyWasInit() singleton.Run(f, width, height, title) return nil @@ -36,12 +38,12 @@ func IsDrawingSkipped() bool { return singleton.IsDrawingSkipped() } -func CreateSurface(surface Surface) (Surface, error) { +func CreateSurface(surface d2interface.Surface) (d2interface.Surface, error) { verifyWasInit() return singleton.CreateSurface(surface) } -func NewSurface(width, height int, filter Filter) (Surface, error) { +func NewSurface(width, height int, filter d2interface.Filter) (d2interface.Surface, error) { verifyWasInit() return singleton.NewSurface(width, height, filter) } diff --git a/d2core/d2render/ebiten/composite_mode_helper.go b/d2core/d2render/ebiten/composite_mode_helper.go index 8ff9eb87..1f5deb27 100644 --- a/d2core/d2render/ebiten/composite_mode_helper.go +++ b/d2core/d2render/ebiten/composite_mode_helper.go @@ -1,72 +1,72 @@ package ebiten import ( - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/hajimehoshi/ebiten" ) -func d2ToEbitenCompositeMode(comp d2render.CompositeMode) ebiten.CompositeMode { +func d2ToEbitenCompositeMode(comp d2interface.CompositeMode) ebiten.CompositeMode { switch comp { - case d2render.CompositeModeSourceOver: + case d2interface.CompositeModeSourceOver: return ebiten.CompositeModeSourceOver - case d2render.CompositeModeClear: + case d2interface.CompositeModeClear: return ebiten.CompositeModeClear - case d2render.CompositeModeCopy: + case d2interface.CompositeModeCopy: return ebiten.CompositeModeCopy - case d2render.CompositeModeDestination: + case d2interface.CompositeModeDestination: return ebiten.CompositeModeDestination - case d2render.CompositeModeDestinationOver: + case d2interface.CompositeModeDestinationOver: return ebiten.CompositeModeDestinationOver - case d2render.CompositeModeSourceIn: + case d2interface.CompositeModeSourceIn: return ebiten.CompositeModeSourceIn - case d2render.CompositeModeDestinationIn: + case d2interface.CompositeModeDestinationIn: return ebiten.CompositeModeDestinationIn - case d2render.CompositeModeSourceOut: + case d2interface.CompositeModeSourceOut: return ebiten.CompositeModeSourceOut - case d2render.CompositeModeDestinationOut: + case d2interface.CompositeModeDestinationOut: return ebiten.CompositeModeDestinationOut - case d2render.CompositeModeSourceAtop: + case d2interface.CompositeModeSourceAtop: return ebiten.CompositeModeSourceAtop - case d2render.CompositeModeDestinationAtop: + case d2interface.CompositeModeDestinationAtop: return ebiten.CompositeModeDestinationAtop - case d2render.CompositeModeXor: + case d2interface.CompositeModeXor: return ebiten.CompositeModeXor - case d2render.CompositeModeLighter: + case d2interface.CompositeModeLighter: return ebiten.CompositeModeLighter } return ebiten.CompositeModeSourceOver } -func ebitenToD2CompositeMode(comp ebiten.CompositeMode) d2render.CompositeMode { +func ebitenToD2CompositeMode(comp ebiten.CompositeMode) d2interface.CompositeMode { switch comp { case ebiten.CompositeModeSourceOver: - return d2render.CompositeModeSourceOver + return d2interface.CompositeModeSourceOver case ebiten.CompositeModeClear: - return d2render.CompositeModeClear + return d2interface.CompositeModeClear case ebiten.CompositeModeCopy: - return d2render.CompositeModeCopy + return d2interface.CompositeModeCopy case ebiten.CompositeModeDestination: - return d2render.CompositeModeDestination + return d2interface.CompositeModeDestination case ebiten.CompositeModeDestinationOver: - return d2render.CompositeModeDestinationOver + return d2interface.CompositeModeDestinationOver case ebiten.CompositeModeSourceIn: - return d2render.CompositeModeSourceIn + return d2interface.CompositeModeSourceIn case ebiten.CompositeModeDestinationIn: - return d2render.CompositeModeDestinationIn + return d2interface.CompositeModeDestinationIn case ebiten.CompositeModeSourceOut: - return d2render.CompositeModeSourceOut + return d2interface.CompositeModeSourceOut case ebiten.CompositeModeDestinationOut: - return d2render.CompositeModeDestinationOut + return d2interface.CompositeModeDestinationOut case ebiten.CompositeModeSourceAtop: - return d2render.CompositeModeSourceAtop + return d2interface.CompositeModeSourceAtop case ebiten.CompositeModeDestinationAtop: - return d2render.CompositeModeDestinationAtop + return d2interface.CompositeModeDestinationAtop case ebiten.CompositeModeXor: - return d2render.CompositeModeXor + return d2interface.CompositeModeXor case ebiten.CompositeModeLighter: - return d2render.CompositeModeLighter + return d2interface.CompositeModeLighter } - return d2render.CompositeModeSourceOver + return d2interface.CompositeModeSourceOver } diff --git a/d2core/d2render/ebiten/ebiten_renderer.go b/d2core/d2render/ebiten/ebiten_renderer.go index 1d6d76c2..f0d3f36d 100644 --- a/d2core/d2render/ebiten/ebiten_renderer.go +++ b/d2core/d2render/ebiten/ebiten_renderer.go @@ -3,15 +3,16 @@ package ebiten import ( "image" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/hajimehoshi/ebiten" "github.com/hajimehoshi/ebiten/ebitenutil" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2config" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) type Renderer struct { - renderCallback func(surface d2render.Surface) error + renderCallback func(surface d2interface.Surface) error } func (r *Renderer) Update(screen *ebiten.Image) error { @@ -55,7 +56,7 @@ func (r *Renderer) IsDrawingSkipped() bool { return ebiten.IsDrawingSkipped() } -func (r *Renderer) Run(f func(surface d2render.Surface) error, width, height int, title string) error { +func (r *Renderer) Run(f func(surface d2interface.Surface) error, width, height int, title string) error { r.renderCallback = f ebiten.SetWindowTitle(title) ebiten.SetWindowResizable(true) @@ -63,7 +64,7 @@ func (r *Renderer) Run(f func(surface d2render.Surface) error, width, height int return ebiten.RunGame(r) } -func (r *Renderer) CreateSurface(surface d2render.Surface) (d2render.Surface, error) { +func (r *Renderer) CreateSurface(surface d2interface.Surface) (d2interface.Surface, error) { result := &ebitenSurface{ image: surface.(*ebitenSurface).image, stateCurrent: surfaceState{ @@ -74,7 +75,7 @@ func (r *Renderer) CreateSurface(surface d2render.Surface) (d2render.Surface, er return result, nil } -func (r *Renderer) NewSurface(width, height int, filter d2render.Filter) (d2render.Surface, error) { +func (r *Renderer) NewSurface(width, height int, filter d2interface.Filter) (d2interface.Surface, error) { ebitenFilter := d2ToEbitenFilter(filter) img, err := ebiten.NewImage(width, height, ebitenFilter) if err != nil { diff --git a/d2core/d2render/ebiten/ebiten_surface.go b/d2core/d2render/ebiten/ebiten_surface.go index 88137234..ee452bc9 100644 --- a/d2core/d2render/ebiten/ebiten_surface.go +++ b/d2core/d2render/ebiten/ebiten_surface.go @@ -5,7 +5,7 @@ import ( "image" "image/color" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/hajimehoshi/ebiten" "github.com/hajimehoshi/ebiten/ebitenutil" @@ -23,12 +23,12 @@ func (s *ebitenSurface) PushTranslation(x, y int) { s.stateCurrent.y += y } -func (s *ebitenSurface) PushCompositeMode(mode d2render.CompositeMode) { +func (s *ebitenSurface) PushCompositeMode(mode d2interface.CompositeMode) { s.stateStack = append(s.stateStack, s.stateCurrent) s.stateCurrent.mode = d2ToEbitenCompositeMode(mode) } -func (s *ebitenSurface) PushFilter(filter d2render.Filter) { +func (s *ebitenSurface) PushFilter(filter d2interface.Filter) { s.stateStack = append(s.stateStack, s.stateCurrent) s.stateCurrent.filter = d2ToEbitenFilter(filter) } @@ -59,7 +59,7 @@ func (s *ebitenSurface) PopN(n int) { } } -func (s *ebitenSurface) Render(sfc d2render.Surface) error { +func (s *ebitenSurface) Render(sfc d2interface.Surface) error { opts := &ebiten.DrawImageOptions{CompositeMode: s.stateCurrent.mode} opts.GeoM.Translate(float64(s.stateCurrent.x), float64(s.stateCurrent.y)) opts.Filter = s.stateCurrent.filter diff --git a/d2core/d2render/ebiten/filter_helper.go b/d2core/d2render/ebiten/filter_helper.go index b0d90b1c..74fe4090 100644 --- a/d2core/d2render/ebiten/filter_helper.go +++ b/d2core/d2render/ebiten/filter_helper.go @@ -1,32 +1,32 @@ package ebiten import ( - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/hajimehoshi/ebiten" ) -func d2ToEbitenFilter(filter d2render.Filter) ebiten.Filter { +func d2ToEbitenFilter(filter d2interface.Filter) ebiten.Filter { switch filter { - case d2render.FilterDefault: + case d2interface.FilterDefault: return ebiten.FilterDefault - case d2render.FilterLinear: + case d2interface.FilterLinear: return ebiten.FilterLinear - case d2render.FilterNearest: + case d2interface.FilterNearest: return ebiten.FilterNearest } return ebiten.FilterDefault } -func ebitenToD2Filter(filter ebiten.Filter) d2render.Filter { +func ebitenToD2Filter(filter ebiten.Filter) d2interface.Filter { switch filter { case ebiten.FilterDefault: - return d2render.FilterDefault + return d2interface.FilterDefault case ebiten.FilterLinear: - return d2render.FilterLinear + return d2interface.FilterLinear case ebiten.FilterNearest: - return d2render.FilterNearest + return d2interface.FilterNearest } - return d2render.FilterDefault + return d2interface.FilterDefault } diff --git a/d2core/d2screen/d2screen.go b/d2core/d2screen/d2screen.go index 1a976950..7bc76f67 100644 --- a/d2core/d2screen/d2screen.go +++ b/d2core/d2screen/d2screen.go @@ -3,8 +3,9 @@ package d2screen import ( "log" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" ) @@ -22,7 +23,7 @@ type ScreenUnloadHandler interface { } type ScreenRenderHandler interface { - Render(target d2render.Surface) error + Render(target d2interface.Surface) error } type ScreenAdvanceHandler interface { @@ -95,7 +96,7 @@ func Advance(elapsed float64) error { return nil } -func Render(surface d2render.Surface) error { +func Render(surface d2interface.Surface) error { if handler, ok := singleton.currentScreen.(ScreenRenderHandler); ok { if err := handler.Render(surface); err != nil { return err diff --git a/d2core/d2term/terminal.go b/d2core/d2term/terminal.go index 7bfb2bdc..58ef38a0 100644 --- a/d2core/d2term/terminal.go +++ b/d2core/d2term/terminal.go @@ -15,7 +15,6 @@ import ( "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) type TermCategory d2interface.TermCategory @@ -211,7 +210,7 @@ func (t *terminal) OnKeyChars(event d2input.KeyCharsEvent) bool { return handled } -func (t *terminal) Render(surface d2render.Surface) error { +func (t *terminal) Render(surface d2interface.Surface) error { if !t.IsVisible() { return nil } diff --git a/d2core/d2ui/button.go b/d2core/d2ui/button.go index d40793d1..42b665f3 100644 --- a/d2core/d2ui/button.go +++ b/d2core/d2ui/button.go @@ -4,6 +4,8 @@ import ( "image" "image/color" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" @@ -93,11 +95,11 @@ type Button struct { visible bool pressed bool toggled bool - normalSurface d2render.Surface - pressedSurface d2render.Surface - toggledSurface d2render.Surface - pressedToggledSurface d2render.Surface - disabledSurface d2render.Surface + normalSurface d2interface.Surface + pressedSurface d2interface.Surface + toggledSurface d2interface.Surface + pressedToggledSurface d2interface.Surface + disabledSurface d2interface.Surface buttonLayout ButtonLayout onClick func() } @@ -127,7 +129,7 @@ func CreateButton(buttonType ButtonType, text string) Button { result.height += h } - result.normalSurface, _ = d2render.NewSurface(result.width, result.height, d2render.FilterNearest) + result.normalSurface, _ = d2render.NewSurface(result.width, result.height, d2interface.FilterNearest) _, fontHeight := font.GetTextMetrics(text) textY := (result.height / 2) - (fontHeight / 2) + buttonLayout.TextOffset @@ -137,22 +139,22 @@ func CreateButton(buttonType ButtonType, text string) Button { font.Render(0, textY, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.normalSurface) if buttonLayout.AllowFrameChange { if totalButtonTypes > 1 { - result.pressedSurface, _ = d2render.NewSurface(result.width, result.height, d2render.FilterNearest) + result.pressedSurface, _ = d2render.NewSurface(result.width, result.height, d2interface.FilterNearest) buttonSprite.RenderSegmented(result.pressedSurface, buttonLayout.XSegments, buttonLayout.YSegments, buttonLayout.BaseFrame+1) font.Render(-2, textY+2, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.pressedSurface) } if totalButtonTypes > 2 { - result.toggledSurface, _ = d2render.NewSurface(result.width, result.height, d2render.FilterNearest) + result.toggledSurface, _ = d2render.NewSurface(result.width, result.height, d2interface.FilterNearest) buttonSprite.RenderSegmented(result.toggledSurface, buttonLayout.XSegments, buttonLayout.YSegments, buttonLayout.BaseFrame+2) font.Render(0, textY, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.toggledSurface) } if totalButtonTypes > 3 { - result.pressedToggledSurface, _ = d2render.NewSurface(result.width, result.height, d2render.FilterNearest) + result.pressedToggledSurface, _ = d2render.NewSurface(result.width, result.height, d2interface.FilterNearest) buttonSprite.RenderSegmented(result.pressedToggledSurface, buttonLayout.XSegments, buttonLayout.YSegments, buttonLayout.BaseFrame+3) font.Render(0, textY, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.pressedToggledSurface) } if buttonLayout.DisabledFrame != -1 { - result.disabledSurface, _ = d2render.NewSurface(result.width, result.height, d2render.FilterNearest) + result.disabledSurface, _ = d2render.NewSurface(result.width, result.height, d2interface.FilterNearest) buttonSprite.RenderSegmented(result.disabledSurface, buttonLayout.XSegments, buttonLayout.YSegments, buttonLayout.DisabledFrame) font.Render(0, textY, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.disabledSurface) } @@ -174,9 +176,9 @@ func (v *Button) Activate() { } // Render renders the button -func (v *Button) Render(target d2render.Surface) { - target.PushCompositeMode(d2render.CompositeModeSourceAtop) - target.PushFilter(d2render.FilterNearest) +func (v *Button) Render(target d2interface.Surface) { + target.PushCompositeMode(d2interface.CompositeModeSourceAtop) + target.PushFilter(d2interface.FilterNearest) target.PushTranslation(v.x, v.y) defer target.PopN(3) diff --git a/d2core/d2ui/checkbox.go b/d2core/d2ui/checkbox.go index d81513f7..6683287d 100644 --- a/d2core/d2ui/checkbox.go +++ b/d2core/d2ui/checkbox.go @@ -1,6 +1,7 @@ package d2ui import ( + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" @@ -11,8 +12,8 @@ type Checkbox struct { checkState bool visible bool width, height int - Image d2render.Surface - checkedImage d2render.Surface + Image d2interface.Surface + checkedImage d2interface.Surface onClick func() enabled bool } @@ -31,18 +32,18 @@ func CreateCheckbox(checkState bool) Checkbox { result.width, result.height, _ = checkboxSprite.GetFrameSize(0) checkboxSprite.SetPosition(0, 0) - result.Image, _ = d2render.NewSurface(result.width, result.height, d2render.FilterNearest) + result.Image, _ = d2render.NewSurface(result.width, result.height, d2interface.FilterNearest) checkboxSprite.RenderSegmented(result.Image, 1, 1, 0) - result.checkedImage, _ = d2render.NewSurface(result.width, result.height, d2render.FilterNearest) + result.checkedImage, _ = d2render.NewSurface(result.width, result.height, d2interface.FilterNearest) checkboxSprite.RenderSegmented(result.checkedImage, 1, 1, 1) return result } -func (v *Checkbox) Render(target d2render.Surface) { - target.PushCompositeMode(d2render.CompositeModeSourceAtop) +func (v *Checkbox) Render(target d2interface.Surface) { + target.PushCompositeMode(d2interface.CompositeModeSourceAtop) target.PushTranslation(v.x, v.y) - target.PushFilter(d2render.FilterNearest) + target.PushFilter(d2interface.FilterNearest) defer target.PopN(3) if v.checkState { diff --git a/d2core/d2ui/d2ui.go b/d2core/d2ui/d2ui.go index a415808a..9a25b699 100644 --- a/d2core/d2ui/d2ui.go +++ b/d2core/d2ui/d2ui.go @@ -7,7 +7,6 @@ import ( "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) // CursorButton represents a mouse button @@ -91,7 +90,7 @@ func (u *UI) OnMouseButtonDown(event d2input.MouseEvent) bool { } // Render renders all of the UI elements -func Render(target d2render.Surface) { +func Render(target d2interface.Surface) { for _, widget := range singleton.widgets { if widget.GetVisible() { widget.Render(target) diff --git a/d2core/d2ui/drawable.go b/d2core/d2ui/drawable.go index 93c700ab..5e2572e4 100644 --- a/d2core/d2ui/drawable.go +++ b/d2core/d2ui/drawable.go @@ -1,10 +1,12 @@ package d2ui -import "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" +import ( + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" +) // Drawable represents an instance that can be drawn type Drawable interface { - Render(target d2render.Surface) + Render(target d2interface.Surface) Advance(elapsed float64) GetSize() (width, height int) SetPosition(x, y int) diff --git a/d2core/d2ui/font.go b/d2core/d2ui/font.go index d8904f08..4b279937 100644 --- a/d2core/d2ui/font.go +++ b/d2core/d2ui/font.go @@ -6,9 +6,10 @@ import ( "strings" "unicode" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) var fontCache = map[string]*Font{} @@ -102,7 +103,7 @@ func (v *Font) GetTextMetrics(text string) (width, height int) { } // Render draws the font on the target surface -func (v *Font) Render(x, y int, text string, color color.Color, target d2render.Surface) { +func (v *Font) Render(x, y int, text string, color color.Color, target d2interface.Surface) { v.fontSprite.SetColorMod(color) v.fontSprite.SetBlend(false) diff --git a/d2core/d2ui/label.go b/d2core/d2ui/label.go index 31e2c514..2308cfda 100644 --- a/d2core/d2ui/label.go +++ b/d2core/d2ui/label.go @@ -3,6 +3,8 @@ package d2ui import ( "image/color" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) @@ -27,7 +29,7 @@ type Label struct { Height int Alignment LabelAlignment font *Font - imageData map[string]d2render.Surface + imageData map[string]d2interface.Surface Color color.Color } @@ -37,14 +39,14 @@ func CreateLabel(fontPath, palettePath string) Label { Alignment: LabelAlignLeft, Color: color.White, font: GetFont(fontPath, palettePath), - imageData: make(map[string]d2render.Surface), + imageData: make(map[string]d2interface.Surface), } return result } // Render draws the label on the screen -func (v *Label) Render(target d2render.Surface) { +func (v *Label) Render(target d2interface.Surface) { if len(v.text) == 0 { return } @@ -57,8 +59,8 @@ func (v *Label) Render(target d2render.Surface) { x, y = v.X-v.Width, v.Y } - target.PushFilter(d2render.FilterNearest) - target.PushCompositeMode(d2render.CompositeModeSourceAtop) + target.PushFilter(d2interface.FilterNearest) + target.PushCompositeMode(d2interface.CompositeModeSourceAtop) target.PushTranslation(x, y) defer target.PopN(3) @@ -82,7 +84,7 @@ func (v *Label) cacheImage() { width, height := v.font.GetTextMetrics(v.text) v.Width = width v.Height = height - v.imageData[v.text], _ = d2render.NewSurface(width, height, d2render.FilterNearest) + v.imageData[v.text], _ = d2render.NewSurface(width, height, d2interface.FilterNearest) surface, _ := d2render.CreateSurface(v.imageData[v.text]) v.font.Render(0, 0, v.text, v.Color, surface) } diff --git a/d2core/d2ui/scrollbar.go b/d2core/d2ui/scrollbar.go index eb405089..c7268c61 100644 --- a/d2core/d2ui/scrollbar.go +++ b/d2core/d2ui/scrollbar.go @@ -1,9 +1,9 @@ package d2ui import ( + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) type Scrollbar struct { @@ -74,7 +74,7 @@ func (v *Scrollbar) GetLastDirChange() int { return v.lastDirChange } -func (v *Scrollbar) Render(target d2render.Surface) { +func (v *Scrollbar) Render(target d2interface.Surface) { if !v.visible || v.maxOffset == 0 { return } diff --git a/d2core/d2ui/sprite.go b/d2core/d2ui/sprite.go index d529bd2f..8c2fc4f7 100644 --- a/d2core/d2ui/sprite.go +++ b/d2core/d2ui/sprite.go @@ -4,9 +4,10 @@ import ( "errors" "image/color" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) type Sprite struct { @@ -26,7 +27,7 @@ func LoadSprite(animation *d2asset.Animation) (*Sprite, error) { return &Sprite{animation: animation}, nil } -func (s *Sprite) Render(target d2render.Surface) error { +func (s *Sprite) Render(target d2interface.Surface) error { _, frameHeight := s.animation.GetCurrentFrameSize() target.PushTranslation(s.x, s.y-frameHeight) @@ -34,7 +35,7 @@ func (s *Sprite) Render(target d2render.Surface) error { return s.animation.Render(target) } -func (s *Sprite) RenderSegmented(target d2render.Surface, segmentsX, segmentsY, frameOffset int) error { +func (s *Sprite) RenderSegmented(target d2interface.Surface, segmentsX, segmentsY, frameOffset int) error { var currentY int for y := 0; y < segmentsY; y++ { var currentX int diff --git a/d2core/d2ui/textbox.go b/d2core/d2ui/textbox.go index 0d4df609..6716f2ae 100644 --- a/d2core/d2ui/textbox.go +++ b/d2core/d2ui/textbox.go @@ -4,10 +4,11 @@ import ( "strings" "time" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) // TextBox with cursor focus @@ -46,7 +47,7 @@ func (v *TextBox) SetFilter(filter string) { v.filter = filter } -func (v *TextBox) Render(target d2render.Surface) { +func (v *TextBox) Render(target d2interface.Surface) { if !v.visible { return } diff --git a/d2game/d2gamescreen/character_select.go b/d2game/d2gamescreen/character_select.go index cecc0b33..bcfe8bc8 100644 --- a/d2game/d2gamescreen/character_select.go +++ b/d2game/d2gamescreen/character_select.go @@ -15,7 +15,6 @@ import ( "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" "github.com/OpenDiablo2/OpenDiablo2/d2game/d2player" @@ -187,7 +186,7 @@ func (v *CharacterSelect) onExitButtonClicked() { d2screen.SetNextScreen(mainMenu) } -func (v *CharacterSelect) Render(screen d2render.Surface) error { +func (v *CharacterSelect) Render(screen d2interface.Surface) error { v.background.RenderSegmented(screen, 4, 3, 0) v.d2HeroTitle.Render(screen) actualSelectionIndex := v.selectedCharacter - (v.charScrollbar.GetCurrentOffset() * 2) diff --git a/d2game/d2gamescreen/credits.go b/d2game/d2gamescreen/credits.go index 93bc04f9..2de2682b 100644 --- a/d2game/d2gamescreen/credits.go +++ b/d2game/d2gamescreen/credits.go @@ -14,7 +14,6 @@ import ( "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" ) @@ -99,7 +98,7 @@ func (v *Credits) OnLoad(loading d2screen.LoadingState) { } // Render renders the credits screen -func (v *Credits) Render(screen d2render.Surface) error { +func (v *Credits) Render(screen d2interface.Surface) error { v.creditsBackground.RenderSegmented(screen, 4, 3, 0) for _, label := range v.labels { if label.Available { diff --git a/d2game/d2gamescreen/game.go b/d2game/d2gamescreen/game.go index 55f56926..fb8f1da5 100644 --- a/d2game/d2gamescreen/game.go +++ b/d2game/d2gamescreen/game.go @@ -14,7 +14,6 @@ import ( "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2maprenderer" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2game/d2player" "github.com/OpenDiablo2/OpenDiablo2/d2networking/d2client" "github.com/OpenDiablo2/OpenDiablo2/d2networking/d2netpacket" @@ -59,7 +58,7 @@ func (v *Game) OnUnload() error { return nil } -func (v *Game) Render(screen d2render.Surface) error { +func (v *Game) Render(screen d2interface.Surface) error { if v.gameClient.RegenMap { v.gameClient.RegenMap = false v.mapRenderer.RegenerateTileCache() diff --git a/d2game/d2gamescreen/gui_testing.go b/d2game/d2gamescreen/gui_testing.go index 8e08b448..9b97c260 100644 --- a/d2game/d2gamescreen/gui_testing.go +++ b/d2game/d2gamescreen/gui_testing.go @@ -1,8 +1,8 @@ package d2gamescreen import ( + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" ) @@ -42,7 +42,7 @@ func (g *GuiTestMain) OnLoad(loading d2screen.LoadingState) { d2gui.SetLayout(layout) } -func (g *GuiTestMain) Render(screen d2render.Surface) error { +func (g *GuiTestMain) Render(screen d2interface.Surface) error { return nil } diff --git a/d2game/d2gamescreen/main_menu.go b/d2game/d2gamescreen/main_menu.go index ffeb42a2..fbdc308b 100644 --- a/d2game/d2gamescreen/main_menu.go +++ b/d2game/d2gamescreen/main_menu.go @@ -20,7 +20,6 @@ import ( "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" ) @@ -301,7 +300,7 @@ func (v *MainMenu) onCreditsButtonClicked() { } // Render renders the main menu -func (v *MainMenu) Render(screen d2render.Surface) error { +func (v *MainMenu) Render(screen d2interface.Surface) error { switch v.screenMode { case ScreenModeTrademark: v.trademarkBackground.RenderSegmented(screen, 4, 3, 0) diff --git a/d2game/d2gamescreen/map_engine_testing.go b/d2game/d2gamescreen/map_engine_testing.go index 8f84b2ad..ca5a4f01 100644 --- a/d2game/d2gamescreen/map_engine_testing.go +++ b/d2game/d2gamescreen/map_engine_testing.go @@ -13,7 +13,6 @@ import ( "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2game/d2player" ) @@ -161,7 +160,7 @@ func (met *MapEngineTest) OnUnload() error { return nil } -func (met *MapEngineTest) Render(screen d2render.Surface) error { +func (met *MapEngineTest) Render(screen d2interface.Surface) error { met.mapRenderer.Render(screen) // diff --git a/d2game/d2gamescreen/select_hero_class.go b/d2game/d2gamescreen/select_hero_class.go index 849ae310..71047ff1 100644 --- a/d2game/d2gamescreen/select_hero_class.go +++ b/d2game/d2gamescreen/select_hero_class.go @@ -17,7 +17,6 @@ import ( "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" ) @@ -445,7 +444,7 @@ func (v *SelectHeroClass) onOkButtonClicked() { d2screen.SetNextScreen(CreateGame(v.audioProvider, gameClient, v.terminal)) } -func (v *SelectHeroClass) Render(screen d2render.Surface) error { +func (v *SelectHeroClass) Render(screen d2interface.Surface) error { v.bgImage.RenderSegmented(screen, 4, 3, 0) v.headingLabel.Render(screen) if v.selectedHero != d2enum.HeroNone { @@ -557,7 +556,7 @@ func (v *SelectHeroClass) updateHeroSelectionHover(hero d2enum.Hero, canSelect b } -func (v *SelectHeroClass) renderHero(screen d2render.Surface, hero d2enum.Hero) { +func (v *SelectHeroClass) renderHero(screen d2interface.Surface, hero d2enum.Hero) { renderInfo := v.heroRenderInfo[hero] switch renderInfo.Stance { case d2enum.HeroStanceIdle: @@ -645,7 +644,7 @@ func setSpriteToFirstFrame(sprite *d2ui.Sprite) { } } -func drawSprite(sprite *d2ui.Sprite, target d2render.Surface) { +func drawSprite(sprite *d2ui.Sprite, target d2interface.Surface) { if sprite != nil { sprite.Render(target) } diff --git a/d2game/d2player/game_controls.go b/d2game/d2player/game_controls.go index 12dca5e8..eff7df4c 100644 --- a/d2game/d2player/game_controls.go +++ b/d2game/d2player/game_controls.go @@ -52,8 +52,8 @@ type GameControls struct { // UI globeSprite *d2ui.Sprite hpManaStatusSprite *d2ui.Sprite - hpStatusBar d2render.Surface - manaStatusBar d2render.Surface + hpStatusBar d2interface.Surface + manaStatusBar d2interface.Surface mainPanel *d2ui.Sprite menuButton *d2ui.Sprite skillIcon *d2ui.Sprite @@ -254,7 +254,7 @@ func (g *GameControls) Load() { animation, _ = d2asset.LoadAnimation(d2resource.HealthManaIndicator, d2resource.PaletteSky) g.hpManaStatusSprite, _ = d2ui.LoadSprite(animation) - g.hpStatusBar, _ = d2render.NewSurface(globeWidth, globeHeight, d2render.FilterNearest) + g.hpStatusBar, _ = d2render.NewSurface(globeWidth, globeHeight, d2interface.FilterNearest) animation, _ = d2asset.LoadAnimation(d2resource.GamePanels, d2resource.PaletteSky) g.mainPanel, _ = d2ui.LoadSprite(animation) @@ -334,7 +334,7 @@ func (g *GameControls) isInActiveMenusRect(px int, py int) bool { } // TODO: consider caching the panels to single image that is reused. -func (g *GameControls) Render(target d2render.Surface) { +func (g *GameControls) Render(target d2interface.Surface) { for entityIdx := range *g.mapEngine.Entities() { entity := (*g.mapEngine.Entities())[entityIdx] if !entity.Selectable() { @@ -376,7 +376,7 @@ func (g *GameControls) Render(target d2render.Surface) { healthPercent := float64(g.hero.Stats.Health) / float64(g.hero.Stats.MaxHealth) hpBarHeight := int(healthPercent * float64(globeHeight)) if g.lastHealthPercent != healthPercent { - g.hpStatusBar, _ = d2render.NewSurface(globeWidth, hpBarHeight, d2render.FilterNearest) + g.hpStatusBar, _ = d2render.NewSurface(globeWidth, hpBarHeight, d2interface.FilterNearest) g.hpManaStatusSprite.SetCurrentFrame(0) g.hpStatusBar.PushTranslation(0, hpBarHeight) @@ -414,7 +414,7 @@ func (g *GameControls) Render(target d2render.Surface) { // Stamina status bar target.PushTranslation(273, 572) - target.PushCompositeMode(d2render.CompositeModeLighter) + target.PushCompositeMode(d2interface.CompositeModeLighter) staminaPercent := float64(g.hero.Stats.Stamina) / float64(g.hero.Stats.MaxStamina) target.DrawRect(int(staminaPercent*staminaBarWidth), 19, color.RGBA{R: 175, G: 136, B: 72, A: 200}) target.PopN(2) @@ -468,7 +468,7 @@ func (g *GameControls) Render(target d2render.Surface) { manaPercent := float64(g.hero.Stats.Mana) / float64(g.hero.Stats.MaxMana) manaBarHeight := int(manaPercent * float64(globeHeight)) if manaPercent != g.lastManaPercent { - g.manaStatusBar, _ = d2render.NewSurface(globeWidth, manaBarHeight, d2render.FilterNearest) + g.manaStatusBar, _ = d2render.NewSurface(globeWidth, manaBarHeight, d2interface.FilterNearest) g.hpManaStatusSprite.SetCurrentFrame(1) g.manaStatusBar.PushTranslation(0, manaBarHeight) diff --git a/d2game/d2player/hero_stats_panel.go b/d2game/d2player/hero_stats_panel.go index ac5a6201..794124dc 100644 --- a/d2game/d2player/hero_stats_panel.go +++ b/d2game/d2player/hero_stats_panel.go @@ -3,6 +3,8 @@ package d2player import ( "strconv" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" @@ -72,7 +74,7 @@ type HeroStatsPanel struct { heroState *d2hero.HeroStatsState heroName string heroClass d2enum.Hero - staticMenuImageCache *d2render.Surface + staticMenuImageCache *d2interface.Surface labels *StatsPanelLabels originX int @@ -88,7 +90,7 @@ func NewHeroStatsPanel(heroName string, heroClass d2enum.Hero, heroState d2hero. originX: originX, originY: originY, heroState: &heroState, - heroName: heroName, + heroName: heroName, heroClass: heroClass, labels: &StatsPanelLabels{}, } @@ -118,7 +120,7 @@ func (s *HeroStatsPanel) Close() { s.isOpen = false } -func (s *HeroStatsPanel) Render(target d2render.Surface) { +func (s *HeroStatsPanel) Render(target d2interface.Surface) { if !s.isOpen { return } @@ -126,7 +128,7 @@ func (s *HeroStatsPanel) Render(target d2render.Surface) { if s.staticMenuImageCache == nil { frameWidth, frameHeight := s.frame.GetFrameBounds() framesCount := s.frame.GetFrameCount() - surface, err := d2render.NewSurface(frameWidth*framesCount, frameHeight*framesCount, d2render.FilterNearest) + surface, err := d2render.NewSurface(frameWidth*framesCount, frameHeight*framesCount, d2interface.FilterNearest) if err != nil { return @@ -138,7 +140,7 @@ func (s *HeroStatsPanel) Render(target d2render.Surface) { s.renderStatValues(target) } -func (s *HeroStatsPanel) renderStaticMenu(target d2render.Surface) { +func (s *HeroStatsPanel) renderStaticMenu(target d2interface.Surface) { x, y := s.originX, s.originY // Frame @@ -226,7 +228,7 @@ func (s *HeroStatsPanel) initStatValueLabels() { s.labels.Experience = s.createStatValueLabel(s.heroState.Experience, 200, 110) s.labels.NextLevelExp = s.createStatValueLabel(s.heroState.NextLevelExp, 330, 110) - s.labels.Strength = s.createStatValueLabel(s.heroState.Strength, 175, 147) + s.labels.Strength = s.createStatValueLabel(s.heroState.Strength, 175, 147) s.labels.Dexterity = s.createStatValueLabel(s.heroState.Dexterity, 175, 207) s.labels.Vitality = s.createStatValueLabel(s.heroState.Vitality, 175, 295) s.labels.Energy = s.createStatValueLabel(s.heroState.Energy, 175, 355) @@ -241,7 +243,7 @@ func (s *HeroStatsPanel) initStatValueLabels() { s.labels.Mana = s.createStatValueLabel(s.heroState.Mana, 370, 355) } -func (s *HeroStatsPanel) renderStatValues(target d2render.Surface) { +func (s *HeroStatsPanel) renderStatValues(target d2interface.Surface) { s.renderStatValueNum(s.labels.Level, s.heroState.Level, target) s.renderStatValueNum(s.labels.Experience, s.heroState.Experience, target) s.renderStatValueNum(s.labels.NextLevelExp, s.heroState.NextLevelExp, target) @@ -261,7 +263,7 @@ func (s *HeroStatsPanel) renderStatValues(target d2render.Surface) { s.renderStatValueNum(s.labels.Mana, s.heroState.Mana, target) } -func (s *HeroStatsPanel) renderStatValueNum(label d2ui.Label, value int, target d2render.Surface) { +func (s *HeroStatsPanel) renderStatValueNum(label d2ui.Label, value int, target d2interface.Surface) { label.SetText(strconv.Itoa(value)) label.Render(target) } diff --git a/d2game/d2player/inventory.go b/d2game/d2player/inventory.go index 6f86c630..680ee95a 100644 --- a/d2game/d2player/inventory.go +++ b/d2game/d2player/inventory.go @@ -2,10 +2,10 @@ package d2player import ( "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" ) @@ -72,7 +72,7 @@ func (g *Inventory) Load() { g.grid.Add(items...) } -func (g *Inventory) Render(target d2render.Surface) { +func (g *Inventory) Render(target d2interface.Surface) { if !g.isOpen { return } diff --git a/d2game/d2player/inventory_grid.go b/d2game/d2player/inventory_grid.go index 561da31a..809fcbfb 100644 --- a/d2game/d2player/inventory_grid.go +++ b/d2game/d2player/inventory_grid.go @@ -3,11 +3,12 @@ package d2player import ( "errors" "fmt" - "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "log" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" @@ -199,7 +200,7 @@ func (g *ItemGrid) Remove(item InventoryItem) { g.items = g.items[:n] } -func (g *ItemGrid) renderItem(item InventoryItem, target d2render.Surface, x int, y int) { +func (g *ItemGrid) renderItem(item InventoryItem, target d2interface.Surface, x int, y int) { itemSprite := g.sprites[item.GetItemCode()] if itemSprite != nil { itemSprite.SetPosition(x, y) @@ -208,12 +209,12 @@ func (g *ItemGrid) renderItem(item InventoryItem, target d2render.Surface, x int } } -func (g *ItemGrid) Render(target d2render.Surface) { +func (g *ItemGrid) Render(target d2interface.Surface) { g.renderInventoryItems(target) g.renderEquippedItems(target) } -func (g *ItemGrid) renderInventoryItems(target d2render.Surface) { +func (g *ItemGrid) renderInventoryItems(target d2interface.Surface) { for _, item := range g.items { itemSprite := g.sprites[item.GetItemCode()] slotX, slotY := g.SlotToScreen(item.InventoryGridSlot()) @@ -223,7 +224,7 @@ func (g *ItemGrid) renderInventoryItems(target d2render.Surface) { } } -func (g *ItemGrid) renderEquippedItems(target d2render.Surface) { +func (g *ItemGrid) renderEquippedItems(target d2interface.Surface) { for _, eq := range g.equipmentSlots { if eq.item != nil { itemSprite := g.sprites[eq.item.GetItemCode()] diff --git a/main.go b/main.go index 0e5961db..1d6b38cf 100644 --- a/main.go +++ b/main.go @@ -4,7 +4,6 @@ import ( "bytes" "errors" "fmt" - ebiten_input "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input/ebiten" "image" "image/gif" "image/png" @@ -16,6 +15,8 @@ import ( "strings" "sync" + ebiten_input "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input/ebiten" + ebiten2 "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio/ebiten" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" @@ -83,7 +84,6 @@ func main() { panic(err) } - d2input.Initialize(ebiten_input.InputService{}) // TODO d2input singleton must be init before d2term term, err := d2term.Initialize() terminal_hack = term // needs to be used in advance, no easy way for that right now @@ -136,7 +136,6 @@ func initialize(audioProvider d2interface.AudioProvider, term d2interface.Termin } d2render.SetWindowIcon("d2logo.png") - term.BindLogger() term.BindAction("dumpheap", "dumps the heap to pprof/heap.pprof", func() { os.Mkdir("./pprof/", 0755) @@ -213,7 +212,7 @@ func initialize(audioProvider d2interface.AudioProvider, term d2interface.Termin return nil } -func run(updateFunc func(d2render.Surface) error) { +func run(updateFunc func(d2interface.Surface) error) { if len(GitBranch) == 0 { GitBranch = "Local Build" } @@ -224,7 +223,7 @@ func run(updateFunc func(d2render.Surface) error) { } } -func update(target d2render.Surface) error { +func update(target d2interface.Surface) error { currentTime := d2common.Now() elapsedTime := (currentTime - singleton.lastTime) * singleton.timeScale singleton.lastTime = currentTime @@ -244,7 +243,7 @@ func update(target d2render.Surface) error { return nil } -func updateInitError(target d2render.Surface) error { +func updateInitError(target d2interface.Surface) error { width, height := target.GetSize() target.PushTranslation(width/5, height/2) target.DrawText("Could not find the MPQ files in the directory: %s\nPlease put the files and re-run the game.", d2config.Get().MpqPath) @@ -280,7 +279,7 @@ func advance(elapsed, current float64) error { return nil } -func render(target d2render.Surface) error { +func render(target d2interface.Surface) error { if err := d2screen.Render(target); err != nil { return err } @@ -306,7 +305,7 @@ func render(target d2render.Surface) error { return nil } -func renderCapture(target d2render.Surface) error { +func renderCapture(target d2interface.Surface) error { cleanupCapture := func() { singleton.captureState = captureStateNone singleton.capturePath = "" @@ -386,7 +385,7 @@ func renderCapture(target d2render.Surface) error { return nil } -func renderDebug(target d2render.Surface) error { +func renderDebug(target d2interface.Surface) error { if singleton.showFPS { vsyncEnabled := d2render.GetVSyncEnabled() fps := d2render.CurrentFPS()