mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2024-10-01 15:46:17 -04:00
minor edits (#486)
* adding comments to d2interface for linter * moved d2render renderer interfaces and types into d2interface
This commit is contained in:
parent
9f7f1ae072
commit
55dc3e42ed
@ -1,5 +1,7 @@
|
|||||||
package d2interface
|
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 {
|
type AudioProvider interface {
|
||||||
PlayBGM(song string)
|
PlayBGM(song string)
|
||||||
LoadSoundEffect(sfx string) (SoundEffect, error)
|
LoadSoundEffect(sfx string) (SoundEffect, error)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package d2render
|
package d2interface
|
||||||
|
|
||||||
type CompositeMode int
|
type CompositeMode int
|
||||||
|
|
2
d2common/d2interface/d2interface.go
Normal file
2
d2common/d2interface/d2interface.go
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
// Package d2interface defines interfaces for the OpenDiablo2 engine
|
||||||
|
package d2interface
|
@ -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.
|
// Filter represents the type of texture filter to be used when an image is magnified or minified.
|
||||||
type Filter int
|
type Filter int
|
@ -1,4 +1,4 @@
|
|||||||
package d2render
|
package d2interface
|
||||||
|
|
||||||
// Defines the type of rendering engine to use
|
// Defines the type of rendering engine to use
|
||||||
type RenderType int
|
type RenderType int
|
@ -1,4 +1,4 @@
|
|||||||
package d2render
|
package d2interface
|
||||||
|
|
||||||
type Renderer interface {
|
type Renderer interface {
|
||||||
GetRendererName() string
|
GetRendererName() string
|
@ -1,5 +1,6 @@
|
|||||||
package d2interface
|
package d2interface
|
||||||
|
|
||||||
|
// SoundEffect is something that that the AudioProvider can Play or Stop
|
||||||
type SoundEffect interface {
|
type SoundEffect interface {
|
||||||
Play()
|
Play()
|
||||||
Stop()
|
Stop()
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package d2render
|
package d2interface
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"image"
|
"image"
|
@ -2,9 +2,9 @@ package d2interface
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// TermCategory applies styles to the lines in the Terminal
|
||||||
type TermCategory int
|
type TermCategory int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -14,17 +14,10 @@ const (
|
|||||||
TermCategoryError
|
TermCategoryError
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
// TermVis is an enumeration of the Terminal's visibility states
|
||||||
termCharWidth = 6
|
|
||||||
termCharHeight = 16
|
|
||||||
termRowCount = 24
|
|
||||||
termRowCountMax = 32
|
|
||||||
termColCountMax = 128
|
|
||||||
termAnimLength = 0.5
|
|
||||||
)
|
|
||||||
|
|
||||||
type termVis int
|
type termVis int
|
||||||
|
|
||||||
|
// Terminal visibility state
|
||||||
const (
|
const (
|
||||||
termVisHidden termVis = iota
|
termVisHidden termVis = iota
|
||||||
termVisShowing
|
termVisShowing
|
||||||
@ -32,13 +25,16 @@ const (
|
|||||||
termVisHiding
|
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 {
|
type Terminal interface {
|
||||||
BindLogger()
|
BindLogger()
|
||||||
|
|
||||||
Advance(elapsed float64) error
|
Advance(elapsed float64) error
|
||||||
OnKeyDown(event d2input.KeyEvent) bool
|
OnKeyDown(event d2input.KeyEvent) bool
|
||||||
OnKeyChars(event d2input.KeyCharsEvent) bool
|
OnKeyChars(event d2input.KeyCharsEvent) bool
|
||||||
Render(surface d2render.Surface) error
|
Render(surface Surface) error
|
||||||
Execute(command string) error
|
Execute(command string) error
|
||||||
OutputRaw(text string, category TermCategory)
|
OutputRaw(text string, category TermCategory)
|
||||||
Output(format string, params ...interface{})
|
Output(format string, params ...interface{})
|
||||||
@ -53,6 +49,8 @@ type Terminal interface {
|
|||||||
UnbindAction(name string) error
|
UnbindAction(name string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TerminalLogger is used tomake the Terminal write out
|
||||||
|
// (eg. to the system shell or to a file)
|
||||||
type TerminalLogger interface {
|
type TerminalLogger interface {
|
||||||
Write(p []byte) (int, error)
|
Write(p []byte) (int, error)
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,8 @@ import (
|
|||||||
"image/color"
|
"image/color"
|
||||||
"math"
|
"math"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dat"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dat"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dc6"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dc6"
|
||||||
@ -27,7 +29,7 @@ type animationFrame struct {
|
|||||||
offsetX int
|
offsetX int
|
||||||
offsetY int
|
offsetY int
|
||||||
|
|
||||||
image d2render.Surface
|
image d2interface.Surface
|
||||||
}
|
}
|
||||||
|
|
||||||
type animationDirection struct {
|
type animationDirection struct {
|
||||||
@ -41,7 +43,7 @@ type Animation struct {
|
|||||||
lastFrameTime float64
|
lastFrameTime float64
|
||||||
playedCount int
|
playedCount int
|
||||||
|
|
||||||
compositeMode d2render.CompositeMode
|
compositeMode d2interface.CompositeMode
|
||||||
colorMod color.Color
|
colorMod color.Color
|
||||||
originAtBottom bool
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -122,7 +124,7 @@ func CreateAnimationFromDC6(dc6 *d2dc6.DC6, palette *d2dat.DATPalette) (*Animati
|
|||||||
}
|
}
|
||||||
|
|
||||||
for frameIndex, dc6Frame := range dc6.Frames {
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -253,7 +255,7 @@ func (a *Animation) Advance(elapsed float64) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *Animation) Render(target d2render.Surface) error {
|
func (a *Animation) Render(target d2interface.Surface) error {
|
||||||
direction := a.directions[a.directionIndex]
|
direction := a.directions[a.directionIndex]
|
||||||
frame := direction.frames[a.frameIndex]
|
frame := direction.frames[a.frameIndex]
|
||||||
|
|
||||||
@ -264,7 +266,7 @@ func (a *Animation) Render(target d2render.Surface) error {
|
|||||||
return target.Render(frame.image)
|
return target.Render(frame.image)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *Animation) RenderFromOrigin(target d2render.Surface) error {
|
func (a *Animation) RenderFromOrigin(target d2interface.Surface) error {
|
||||||
if a.originAtBottom {
|
if a.originAtBottom {
|
||||||
direction := a.directions[a.directionIndex]
|
direction := a.directions[a.directionIndex]
|
||||||
frame := direction.frames[a.frameIndex]
|
frame := direction.frames[a.frameIndex]
|
||||||
@ -397,8 +399,8 @@ func (a *Animation) ResetPlayedCount() {
|
|||||||
|
|
||||||
func (a *Animation) SetBlend(blend bool) {
|
func (a *Animation) SetBlend(blend bool) {
|
||||||
if blend {
|
if blend {
|
||||||
a.compositeMode = d2render.CompositeModeLighter
|
a.compositeMode = d2interface.CompositeModeLighter
|
||||||
} else {
|
} else {
|
||||||
a.compositeMode = d2render.CompositeModeSourceOver
|
a.compositeMode = d2interface.CompositeModeSourceOver
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,10 +6,11 @@ import (
|
|||||||
"math"
|
"math"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Composite struct {
|
type Composite struct {
|
||||||
@ -45,7 +46,7 @@ func (c *Composite) Advance(elapsed float64) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Composite) Render(target d2render.Surface) error {
|
func (c *Composite) Render(target d2interface.Surface) error {
|
||||||
if c.mode == nil {
|
if c.mode == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -6,8 +6,9 @@ import (
|
|||||||
"image/color"
|
"image/color"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type fontGlyph struct {
|
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.SetColorMod(f.color)
|
||||||
f.sheet.SetBlend(false)
|
f.sheet.SetBlend(false)
|
||||||
|
|
||||||
|
@ -4,6 +4,8 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"image/color"
|
"image/color"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
||||||
@ -24,7 +26,7 @@ type Button struct {
|
|||||||
width int
|
width int
|
||||||
height int
|
height int
|
||||||
state buttonState
|
state buttonState
|
||||||
surfaces []d2render.Surface
|
surfaces []d2interface.Surface
|
||||||
}
|
}
|
||||||
|
|
||||||
func createButton(text string, buttonStyle ButtonStyle) (*Button, error) {
|
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
|
textY := buttonHeight/2 - textHeight/2 + config.textOffset
|
||||||
|
|
||||||
surfaceCount := animation.GetFrameCount() / (config.segmentsX * config.segmentsY)
|
surfaceCount := animation.GetFrameCount() / (config.segmentsX * config.segmentsY)
|
||||||
surfaces := make([]d2render.Surface, surfaceCount)
|
surfaces := make([]d2interface.Surface, surfaceCount)
|
||||||
for i := 0; i < surfaceCount; i++ {
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -121,7 +123,7 @@ func (b *Button) onMouseLeave(event d2input.MouseMoveEvent) bool {
|
|||||||
return false
|
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])
|
return target.Render(b.surfaces[b.state])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,9 +3,10 @@ package d2gui
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func loadFont(fontStyle FontStyle) (*d2asset.Font, error) {
|
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)
|
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
|
var currentY int
|
||||||
for y := 0; y < segmentsY; y++ {
|
for y := 0; y < segmentsY; y++ {
|
||||||
var currentX int
|
var currentX int
|
||||||
|
@ -3,7 +3,7 @@ package d2gui
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -24,7 +24,7 @@ func Initialize() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func Render(target d2render.Surface) error {
|
func Render(target d2interface.Surface) error {
|
||||||
verifyWasInit()
|
verifyWasInit()
|
||||||
return singleton.render(target)
|
return singleton.render(target)
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package d2gui
|
package d2gui
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
||||||
)
|
)
|
||||||
@ -10,7 +11,7 @@ type Label struct {
|
|||||||
|
|
||||||
text string
|
text string
|
||||||
font *d2asset.Font
|
font *d2asset.Font
|
||||||
surface d2render.Surface
|
surface d2interface.Surface
|
||||||
}
|
}
|
||||||
|
|
||||||
func createLabel(text string, fontStyle FontStyle) (*Label, error) {
|
func createLabel(text string, fontStyle FontStyle) (*Label, error) {
|
||||||
@ -26,7 +27,7 @@ func createLabel(text string, fontStyle FontStyle) (*Label, error) {
|
|||||||
return label, nil
|
return label, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *Label) render(target d2render.Surface) error {
|
func (l *Label) render(target d2interface.Surface) error {
|
||||||
return target.Render(l.surface)
|
return target.Render(l.surface)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,7 +48,7 @@ func (l *Label) SetText(text string) error {
|
|||||||
|
|
||||||
func (l *Label) setText(text string) error {
|
func (l *Label) setText(text string) error {
|
||||||
width, height := l.font.GetTextMetrics(text)
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -3,9 +3,10 @@ package d2gui
|
|||||||
import (
|
import (
|
||||||
"image/color"
|
"image/color"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type layoutEntry struct {
|
type layoutEntry struct {
|
||||||
@ -137,7 +138,7 @@ func (l *Layout) Clear() {
|
|||||||
l.entries = nil
|
l.entries = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *Layout) render(target d2render.Surface) error {
|
func (l *Layout) render(target d2interface.Surface) error {
|
||||||
l.AdjustEntryPlacement()
|
l.AdjustEntryPlacement()
|
||||||
|
|
||||||
for _, entry := range l.entries {
|
for _, entry := range l.entries {
|
||||||
@ -168,14 +169,14 @@ func (l *Layout) advance(elapsed float64) error {
|
|||||||
return nil
|
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)
|
target.PushTranslation(entry.x, entry.y)
|
||||||
defer target.Pop()
|
defer target.Pop()
|
||||||
|
|
||||||
return entry.widget.render(target)
|
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)
|
target.PushTranslation(entry.x, entry.y)
|
||||||
defer target.Pop()
|
defer target.Pop()
|
||||||
|
|
||||||
|
@ -4,10 +4,11 @@ import (
|
|||||||
"image/color"
|
"image/color"
|
||||||
"math"
|
"math"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type manager struct {
|
type manager struct {
|
||||||
@ -78,7 +79,7 @@ func (m *manager) OnMouseMove(event d2input.MouseMoveEvent) bool {
|
|||||||
return m.layout.onMouseMove(event)
|
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 m.loading {
|
||||||
if err := m.renderLoadScreen(target); err != nil {
|
if err := m.renderLoadScreen(target); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -99,7 +100,7 @@ func (m *manager) render(target d2render.Surface) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *manager) renderLoadScreen(target d2render.Surface) error {
|
func (m *manager) renderLoadScreen(target d2interface.Surface) error {
|
||||||
target.Clear(color.Black)
|
target.Clear(color.Black)
|
||||||
|
|
||||||
screenWidth, screenHeight := target.GetSize()
|
screenWidth, screenHeight := target.GetSize()
|
||||||
@ -111,7 +112,7 @@ func (m *manager) renderLoadScreen(target d2render.Surface) error {
|
|||||||
return m.loadingAnim.Render(target)
|
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()
|
_, height := m.cursorAnim.GetCurrentFrameSize()
|
||||||
target.PushTranslation(m.cursorX, m.cursorY)
|
target.PushTranslation(m.cursorX, m.cursorY)
|
||||||
target.PushTranslation(0, -height)
|
target.PushTranslation(0, -height)
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package d2gui
|
package d2gui
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type AnimationDirection int
|
type AnimationDirection int
|
||||||
@ -59,7 +59,7 @@ func createAnimatedSprite(imagePath, palettePath string, direction AnimationDire
|
|||||||
return sprite, nil
|
return sprite, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *AnimatedSprite) render(target d2render.Surface) error {
|
func (s *AnimatedSprite) render(target d2interface.Surface) error {
|
||||||
_, frameHeight := s.animation.GetCurrentFrameSize()
|
_, frameHeight := s.animation.GetCurrentFrameSize()
|
||||||
|
|
||||||
target.PushTranslation(s.x, s.y-frameHeight)
|
target.PushTranslation(s.x, s.y-frameHeight)
|
||||||
@ -73,7 +73,7 @@ func (s *Sprite) SetSegmented(segmentsX, segmentsY, frameOffset int) {
|
|||||||
s.frameOffset = frameOffset
|
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)
|
return renderSegmented(s.animation, s.segmentsX, s.segmentsY, s.frameOffset, target)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
package d2gui
|
package d2gui
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type MouseHandler func(d2input.MouseEvent)
|
type MouseHandler func(d2input.MouseEvent)
|
||||||
type MouseMoveHandler func(d2input.MouseMoveEvent)
|
type MouseMoveHandler func(d2input.MouseMoveEvent)
|
||||||
|
|
||||||
type widget interface {
|
type widget interface {
|
||||||
render(target d2render.Surface) error
|
render(target d2interface.Surface) error
|
||||||
advance(elapsed float64) error
|
advance(elapsed float64) error
|
||||||
|
|
||||||
onMouseMove(event d2input.MouseMoveEvent) bool
|
onMouseMove(event d2input.MouseMoveEvent) bool
|
||||||
@ -105,7 +105,7 @@ func (w *widgetBase) isExpanding() bool {
|
|||||||
return w.expanding
|
return w.expanding
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *widgetBase) render(target d2render.Surface) error {
|
func (w *widgetBase) render(target d2interface.Surface) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package d2mapentity
|
package d2mapentity
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// AnimatedEntity represents an animation that can be projected onto the map.
|
// 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
|
// Render draws this animated entity onto the target
|
||||||
func (ae *AnimatedEntity) Render(target d2render.Surface) {
|
func (ae *AnimatedEntity) Render(target d2interface.Surface) {
|
||||||
target.PushTranslation(
|
target.PushTranslation(
|
||||||
ae.offsetX+int((ae.subcellX-ae.subcellY)*16),
|
ae.offsetX+int((ae.subcellX-ae.subcellY)*16),
|
||||||
ae.offsetY+int(((ae.subcellX+ae.subcellY)*8)-5),
|
ae.offsetY+int(((ae.subcellX+ae.subcellY)*8)-5),
|
||||||
|
@ -3,16 +3,17 @@ package d2mapentity
|
|||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2astar"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2astar"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type MapEntity interface {
|
type MapEntity interface {
|
||||||
Render(target d2render.Surface)
|
Render(target d2interface.Surface)
|
||||||
Advance(tickTime float64)
|
Advance(tickTime float64)
|
||||||
GetPosition() (float64, float64)
|
GetPosition() (float64, float64)
|
||||||
GetLayer() (int)
|
GetLayer() int
|
||||||
GetPositionF() (float64, float64)
|
GetPositionF() (float64, float64)
|
||||||
Name() string
|
Name() string
|
||||||
Selectable() bool
|
Selectable() bool
|
||||||
|
@ -3,12 +3,13 @@ package d2mapentity
|
|||||||
import (
|
import (
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type NPC struct {
|
type NPC struct {
|
||||||
@ -49,7 +50,7 @@ func CreateNPC(x, y int, object *d2datadict.ObjectLookupRecord, direction int) *
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *NPC) Render(target d2render.Surface) {
|
func (v *NPC) Render(target d2interface.Surface) {
|
||||||
target.PushTranslation(
|
target.PushTranslation(
|
||||||
v.offsetX+int((v.subcellX-v.subcellY)*16),
|
v.offsetX+int((v.subcellX-v.subcellY)*16),
|
||||||
v.offsetY+int(((v.subcellX+v.subcellY)*8)-5),
|
v.offsetY+int(((v.subcellX+v.subcellY)*8)-5),
|
||||||
|
@ -4,9 +4,9 @@ import (
|
|||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ func CreateObject(x, y int, object *d2datadict.ObjectLookupRecord, palettePath s
|
|||||||
mapEntity: createMapEntity(x, y),
|
mapEntity: createMapEntity(x, y),
|
||||||
composite: composite,
|
composite: composite,
|
||||||
objectLookup: object,
|
objectLookup: object,
|
||||||
nameLabel: d2ui.CreateLabel(d2resource.FontFormal11, d2resource.PaletteStatic),
|
nameLabel: d2ui.CreateLabel(d2resource.FontFormal11, d2resource.PaletteStatic),
|
||||||
}
|
}
|
||||||
entity.mapEntity.directioner = entity.rotate
|
entity.mapEntity.directioner = entity.rotate
|
||||||
entity.objectRecord = d2datadict.Objects[object.ObjectsTxtId]
|
entity.objectRecord = d2datadict.Objects[object.ObjectsTxtId]
|
||||||
@ -74,7 +74,7 @@ func (ob *Object) Selectable() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Render draws this animated entity onto the target
|
// Render draws this animated entity onto the target
|
||||||
func (ob *Object) Render(target d2render.Surface) {
|
func (ob *Object) Render(target d2interface.Surface) {
|
||||||
target.PushTranslation(
|
target.PushTranslation(
|
||||||
ob.offsetX+int((ob.subcellX-ob.subcellY)*16),
|
ob.offsetX+int((ob.subcellX-ob.subcellY)*16),
|
||||||
ob.offsetY+int(((ob.subcellX+ob.subcellY)*8)-5),
|
ob.offsetY+int(((ob.subcellX+ob.subcellY)*8)-5),
|
||||||
|
@ -3,13 +3,14 @@ package d2mapentity
|
|||||||
import (
|
import (
|
||||||
"image/color"
|
"image/color"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2hero"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2hero"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"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(
|
target.PushTranslation(
|
||||||
v.offsetX+int((v.subcellX-v.subcellY)*16),
|
v.offsetX+int((v.subcellX-v.subcellY)*16),
|
||||||
v.offsetY+int(((v.subcellX+v.subcellY)*8)-5),
|
v.offsetY+int(((v.subcellX+v.subcellY)*8)-5),
|
||||||
|
@ -2,25 +2,25 @@ package d2maprenderer
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
"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
|
// Invalidates the global region image cache. Call this when you are changing regions
|
||||||
func InvalidateImageCache() {
|
func InvalidateImageCache() {
|
||||||
imageCacheRecords = nil
|
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)
|
lookupIndex := uint32(style)<<24 | uint32(sequence)<<16 | uint32(tileType)<<8 | uint32(randomIndex)
|
||||||
return imageCacheRecords[lookupIndex]
|
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)
|
lookupIndex := uint32(style)<<24 | uint32(sequence)<<16 | uint32(tileType)<<8 | uint32(randomIndex)
|
||||||
if imageCacheRecords == nil {
|
if imageCacheRecords == nil {
|
||||||
imageCacheRecords = make(map[uint32]d2render.Surface)
|
imageCacheRecords = make(map[uint32]d2interface.Surface)
|
||||||
}
|
}
|
||||||
imageCacheRecords[lookupIndex] = image
|
imageCacheRecords[lookupIndex] = image
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,6 @@ import (
|
|||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2ds1"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2ds1"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// The map renderer, used to render the map
|
// The map renderer, used to render the map
|
||||||
@ -58,7 +57,7 @@ func (mr *MapRenderer) SetMapEngine(mapEngine *d2mapengine.MapEngine) {
|
|||||||
mr.generateTileCache()
|
mr.generateTileCache()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mr *MapRenderer) Render(target d2render.Surface) {
|
func (mr *MapRenderer) Render(target d2interface.Surface) {
|
||||||
mapSize := mr.mapEngine.Size()
|
mapSize := mr.mapEngine.Size()
|
||||||
stxf, styf := mr.viewport.ScreenToWorld(400, -200)
|
stxf, styf := mr.viewport.ScreenToWorld(400, -200)
|
||||||
etxf, etyf := mr.viewport.ScreenToWorld(400, 1050)
|
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
|
// 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 tileY := startY; tileY < endY; tileY++ {
|
||||||
for tileX := startX; tileX < endX; tileX++ {
|
for tileX := startX; tileX < endX; tileX++ {
|
||||||
tile := mr.mapEngine.TileAt(tileX, tileY)
|
tile := mr.mapEngine.TileAt(tileX, tileY)
|
||||||
@ -109,7 +108,7 @@ func (mr *MapRenderer) renderPass1(target d2render.Surface, startX, startY, endX
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Objects below walls
|
// 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 tileY := startY; tileY < endY; tileY++ {
|
||||||
for tileX := startX; tileX < endX; tileX++ {
|
for tileX := startX; tileX < endX; tileX++ {
|
||||||
mr.viewport.PushTranslationWorld(float64(tileX), float64(tileY))
|
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
|
// 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 tileY := startY; tileY < endY; tileY++ {
|
||||||
for tileX := startX; tileX < endX; tileX++ {
|
for tileX := startX; tileX < endX; tileX++ {
|
||||||
tile := mr.mapEngine.TileAt(tileX, tileY)
|
tile := mr.mapEngine.TileAt(tileX, tileY)
|
||||||
@ -159,7 +158,7 @@ func (mr *MapRenderer) renderPass3(target d2render.Surface, startX, startY, endX
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Roof tiles
|
// 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 tileY := startY; tileY < endY; tileY++ {
|
||||||
for tileX := startX; tileX < endX; tileX++ {
|
for tileX := startX; tileX < endX; tileX++ {
|
||||||
tile := mr.mapEngine.TileAt(tileX, tileY)
|
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 {
|
for _, wall := range tile.Walls {
|
||||||
if !wall.Hidden && wall.Prop1 != 0 && wall.Type.LowerWall() {
|
if !wall.Hidden && wall.Prop1 != 0 && wall.Type.LowerWall() {
|
||||||
mr.renderWall(wall, mr.viewport, target)
|
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 {
|
for _, wall := range tile.Walls {
|
||||||
if !wall.Hidden && wall.Type.UpperWall() {
|
if !wall.Hidden && wall.Type.UpperWall() {
|
||||||
mr.renderWall(wall, mr.viewport, target)
|
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 {
|
for _, wall := range tile.Walls {
|
||||||
if wall.Type == d2enum.Roof {
|
if wall.Type == d2enum.Roof {
|
||||||
mr.renderWall(wall, mr.viewport, target)
|
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) {
|
func (mr *MapRenderer) renderFloor(tile d2ds1.FloorShadowRecord, target d2interface.Surface) {
|
||||||
var img d2render.Surface
|
var img d2interface.Surface
|
||||||
if !tile.Animated {
|
if !tile.Animated {
|
||||||
img = mr.getImageCacheRecord(tile.Style, tile.Sequence, 0, tile.RandomIndex)
|
img = mr.getImageCacheRecord(tile.Style, tile.Sequence, 0, tile.RandomIndex)
|
||||||
} else {
|
} else {
|
||||||
@ -229,7 +228,7 @@ func (mr *MapRenderer) renderFloor(tile d2ds1.FloorShadowRecord, target d2render
|
|||||||
target.Render(img)
|
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)
|
img := mr.getImageCacheRecord(tile.Style, tile.Sequence, tile.Type, tile.RandomIndex)
|
||||||
if img == nil {
|
if img == nil {
|
||||||
log.Printf("Render called on uncached wall {%v,%v,%v}", tile.Style, tile.Sequence, tile.Type)
|
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)
|
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)
|
img := mr.getImageCacheRecord(tile.Style, tile.Sequence, 13, tile.RandomIndex)
|
||||||
if img == nil {
|
if img == nil {
|
||||||
log.Printf("Render called on uncached shadow {%v,%v}", tile.Style, tile.Sequence)
|
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)
|
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 tileY := startY; tileY < endY; tileY++ {
|
||||||
for tileX := startX; tileX < endX; tileX++ {
|
for tileX := startX; tileX < endX; tileX++ {
|
||||||
mr.viewport.PushTranslationWorld(float64(tileX), float64(tileY))
|
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)
|
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}
|
subTileColor := color.RGBA{R: 80, G: 80, B: 255, A: 50}
|
||||||
tileColor := color.RGBA{R: 255, G: 255, B: 255, A: 100}
|
tileColor := color.RGBA{R: 255, G: 255, B: 255, A: 100}
|
||||||
tileCollisionColor := color.RGBA{R: 128, G: 0, B: 0, A: 100}
|
tileCollisionColor := color.RGBA{R: 128, G: 0, B: 0, A: 100}
|
||||||
|
@ -3,6 +3,8 @@ package d2maprenderer
|
|||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
||||||
@ -74,7 +76,7 @@ func (mr *MapRenderer) generateFloorCache(tile *d2ds1.FloorShadowRecord, tileX,
|
|||||||
}
|
}
|
||||||
tileYOffset := d2common.AbsInt32(tileYMinimum)
|
tileYOffset := d2common.AbsInt32(tileYMinimum)
|
||||||
tileHeight := d2common.AbsInt32(tileData[i].Height)
|
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)
|
pixels := make([]byte, 4*tileData[i].Width*tileHeight)
|
||||||
mr.decodeTileGfxData(tileData[i].Blocks, &pixels, tileYOffset, tileData[i].Width)
|
mr.decodeTileGfxData(tileData[i].Blocks, &pixels, tileYOffset, tileData[i].Width)
|
||||||
image.ReplacePixels(pixels)
|
image.ReplacePixels(pixels)
|
||||||
@ -113,7 +115,7 @@ func (mr *MapRenderer) generateShadowCache(tile *d2ds1.FloorShadowRecord, tileX,
|
|||||||
return
|
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))
|
pixels := make([]byte, 4*tileData.Width*int32(tileHeight))
|
||||||
mr.decodeTileGfxData(tileData.Blocks, &pixels, tileYOffset, tileData.Width)
|
mr.decodeTileGfxData(tileData.Blocks, &pixels, tileYOffset, tileData.Width)
|
||||||
image.ReplacePixels(pixels)
|
image.ReplacePixels(pixels)
|
||||||
@ -174,7 +176,7 @@ func (mr *MapRenderer) generateWallCache(tile *d2ds1.WallRecord, tileX, tileY in
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
image, _ := d2render.NewSurface(160, int(realHeight), d2render.FilterNearest)
|
image, _ := d2render.NewSurface(160, int(realHeight), d2interface.FilterNearest)
|
||||||
pixels := make([]byte, 4*160*realHeight)
|
pixels := make([]byte, 4*160*realHeight)
|
||||||
mr.decodeTileGfxData(tileData.Blocks, &pixels, tileYOffset, 160)
|
mr.decodeTileGfxData(tileData.Blocks, &pixels, tileYOffset, 160)
|
||||||
|
|
||||||
|
@ -3,6 +3,8 @@ package d2render
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -11,9 +13,9 @@ var (
|
|||||||
ErrInvalidRenderer = errors.New("invalid rendering system specified")
|
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()
|
verifyNotInit()
|
||||||
singleton = rend
|
singleton = rend
|
||||||
log.Printf("Initialized the %s renderer...", singleton.GetRendererName())
|
log.Printf("Initialized the %s renderer...", singleton.GetRendererName())
|
||||||
@ -25,7 +27,7 @@ func SetWindowIcon(fileName string) {
|
|||||||
singleton.SetWindowIcon(fileName)
|
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()
|
verifyWasInit()
|
||||||
singleton.Run(f, width, height, title)
|
singleton.Run(f, width, height, title)
|
||||||
return nil
|
return nil
|
||||||
@ -36,12 +38,12 @@ func IsDrawingSkipped() bool {
|
|||||||
return singleton.IsDrawingSkipped()
|
return singleton.IsDrawingSkipped()
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateSurface(surface Surface) (Surface, error) {
|
func CreateSurface(surface d2interface.Surface) (d2interface.Surface, error) {
|
||||||
verifyWasInit()
|
verifyWasInit()
|
||||||
return singleton.CreateSurface(surface)
|
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()
|
verifyWasInit()
|
||||||
return singleton.NewSurface(width, height, filter)
|
return singleton.NewSurface(width, height, filter)
|
||||||
}
|
}
|
||||||
|
@ -1,72 +1,72 @@
|
|||||||
package ebiten
|
package ebiten
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
"github.com/hajimehoshi/ebiten"
|
"github.com/hajimehoshi/ebiten"
|
||||||
)
|
)
|
||||||
|
|
||||||
func d2ToEbitenCompositeMode(comp d2render.CompositeMode) ebiten.CompositeMode {
|
func d2ToEbitenCompositeMode(comp d2interface.CompositeMode) ebiten.CompositeMode {
|
||||||
switch comp {
|
switch comp {
|
||||||
case d2render.CompositeModeSourceOver:
|
case d2interface.CompositeModeSourceOver:
|
||||||
return ebiten.CompositeModeSourceOver
|
return ebiten.CompositeModeSourceOver
|
||||||
case d2render.CompositeModeClear:
|
case d2interface.CompositeModeClear:
|
||||||
return ebiten.CompositeModeClear
|
return ebiten.CompositeModeClear
|
||||||
case d2render.CompositeModeCopy:
|
case d2interface.CompositeModeCopy:
|
||||||
return ebiten.CompositeModeCopy
|
return ebiten.CompositeModeCopy
|
||||||
case d2render.CompositeModeDestination:
|
case d2interface.CompositeModeDestination:
|
||||||
return ebiten.CompositeModeDestination
|
return ebiten.CompositeModeDestination
|
||||||
case d2render.CompositeModeDestinationOver:
|
case d2interface.CompositeModeDestinationOver:
|
||||||
return ebiten.CompositeModeDestinationOver
|
return ebiten.CompositeModeDestinationOver
|
||||||
case d2render.CompositeModeSourceIn:
|
case d2interface.CompositeModeSourceIn:
|
||||||
return ebiten.CompositeModeSourceIn
|
return ebiten.CompositeModeSourceIn
|
||||||
case d2render.CompositeModeDestinationIn:
|
case d2interface.CompositeModeDestinationIn:
|
||||||
return ebiten.CompositeModeDestinationIn
|
return ebiten.CompositeModeDestinationIn
|
||||||
case d2render.CompositeModeSourceOut:
|
case d2interface.CompositeModeSourceOut:
|
||||||
return ebiten.CompositeModeSourceOut
|
return ebiten.CompositeModeSourceOut
|
||||||
case d2render.CompositeModeDestinationOut:
|
case d2interface.CompositeModeDestinationOut:
|
||||||
return ebiten.CompositeModeDestinationOut
|
return ebiten.CompositeModeDestinationOut
|
||||||
case d2render.CompositeModeSourceAtop:
|
case d2interface.CompositeModeSourceAtop:
|
||||||
return ebiten.CompositeModeSourceAtop
|
return ebiten.CompositeModeSourceAtop
|
||||||
case d2render.CompositeModeDestinationAtop:
|
case d2interface.CompositeModeDestinationAtop:
|
||||||
return ebiten.CompositeModeDestinationAtop
|
return ebiten.CompositeModeDestinationAtop
|
||||||
case d2render.CompositeModeXor:
|
case d2interface.CompositeModeXor:
|
||||||
return ebiten.CompositeModeXor
|
return ebiten.CompositeModeXor
|
||||||
case d2render.CompositeModeLighter:
|
case d2interface.CompositeModeLighter:
|
||||||
return ebiten.CompositeModeLighter
|
return ebiten.CompositeModeLighter
|
||||||
}
|
}
|
||||||
|
|
||||||
return ebiten.CompositeModeSourceOver
|
return ebiten.CompositeModeSourceOver
|
||||||
}
|
}
|
||||||
|
|
||||||
func ebitenToD2CompositeMode(comp ebiten.CompositeMode) d2render.CompositeMode {
|
func ebitenToD2CompositeMode(comp ebiten.CompositeMode) d2interface.CompositeMode {
|
||||||
switch comp {
|
switch comp {
|
||||||
case ebiten.CompositeModeSourceOver:
|
case ebiten.CompositeModeSourceOver:
|
||||||
return d2render.CompositeModeSourceOver
|
return d2interface.CompositeModeSourceOver
|
||||||
case ebiten.CompositeModeClear:
|
case ebiten.CompositeModeClear:
|
||||||
return d2render.CompositeModeClear
|
return d2interface.CompositeModeClear
|
||||||
case ebiten.CompositeModeCopy:
|
case ebiten.CompositeModeCopy:
|
||||||
return d2render.CompositeModeCopy
|
return d2interface.CompositeModeCopy
|
||||||
case ebiten.CompositeModeDestination:
|
case ebiten.CompositeModeDestination:
|
||||||
return d2render.CompositeModeDestination
|
return d2interface.CompositeModeDestination
|
||||||
case ebiten.CompositeModeDestinationOver:
|
case ebiten.CompositeModeDestinationOver:
|
||||||
return d2render.CompositeModeDestinationOver
|
return d2interface.CompositeModeDestinationOver
|
||||||
case ebiten.CompositeModeSourceIn:
|
case ebiten.CompositeModeSourceIn:
|
||||||
return d2render.CompositeModeSourceIn
|
return d2interface.CompositeModeSourceIn
|
||||||
case ebiten.CompositeModeDestinationIn:
|
case ebiten.CompositeModeDestinationIn:
|
||||||
return d2render.CompositeModeDestinationIn
|
return d2interface.CompositeModeDestinationIn
|
||||||
case ebiten.CompositeModeSourceOut:
|
case ebiten.CompositeModeSourceOut:
|
||||||
return d2render.CompositeModeSourceOut
|
return d2interface.CompositeModeSourceOut
|
||||||
case ebiten.CompositeModeDestinationOut:
|
case ebiten.CompositeModeDestinationOut:
|
||||||
return d2render.CompositeModeDestinationOut
|
return d2interface.CompositeModeDestinationOut
|
||||||
case ebiten.CompositeModeSourceAtop:
|
case ebiten.CompositeModeSourceAtop:
|
||||||
return d2render.CompositeModeSourceAtop
|
return d2interface.CompositeModeSourceAtop
|
||||||
case ebiten.CompositeModeDestinationAtop:
|
case ebiten.CompositeModeDestinationAtop:
|
||||||
return d2render.CompositeModeDestinationAtop
|
return d2interface.CompositeModeDestinationAtop
|
||||||
case ebiten.CompositeModeXor:
|
case ebiten.CompositeModeXor:
|
||||||
return d2render.CompositeModeXor
|
return d2interface.CompositeModeXor
|
||||||
case ebiten.CompositeModeLighter:
|
case ebiten.CompositeModeLighter:
|
||||||
return d2render.CompositeModeLighter
|
return d2interface.CompositeModeLighter
|
||||||
}
|
}
|
||||||
|
|
||||||
return d2render.CompositeModeSourceOver
|
return d2interface.CompositeModeSourceOver
|
||||||
}
|
}
|
||||||
|
@ -3,15 +3,16 @@ package ebiten
|
|||||||
import (
|
import (
|
||||||
"image"
|
"image"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/hajimehoshi/ebiten"
|
"github.com/hajimehoshi/ebiten"
|
||||||
"github.com/hajimehoshi/ebiten/ebitenutil"
|
"github.com/hajimehoshi/ebiten/ebitenutil"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2config"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2config"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Renderer struct {
|
type Renderer struct {
|
||||||
renderCallback func(surface d2render.Surface) error
|
renderCallback func(surface d2interface.Surface) error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Renderer) Update(screen *ebiten.Image) error {
|
func (r *Renderer) Update(screen *ebiten.Image) error {
|
||||||
@ -55,7 +56,7 @@ func (r *Renderer) IsDrawingSkipped() bool {
|
|||||||
return ebiten.IsDrawingSkipped()
|
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
|
r.renderCallback = f
|
||||||
ebiten.SetWindowTitle(title)
|
ebiten.SetWindowTitle(title)
|
||||||
ebiten.SetWindowResizable(true)
|
ebiten.SetWindowResizable(true)
|
||||||
@ -63,7 +64,7 @@ func (r *Renderer) Run(f func(surface d2render.Surface) error, width, height int
|
|||||||
return ebiten.RunGame(r)
|
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{
|
result := &ebitenSurface{
|
||||||
image: surface.(*ebitenSurface).image,
|
image: surface.(*ebitenSurface).image,
|
||||||
stateCurrent: surfaceState{
|
stateCurrent: surfaceState{
|
||||||
@ -74,7 +75,7 @@ func (r *Renderer) CreateSurface(surface d2render.Surface) (d2render.Surface, er
|
|||||||
return result, nil
|
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)
|
ebitenFilter := d2ToEbitenFilter(filter)
|
||||||
img, err := ebiten.NewImage(width, height, ebitenFilter)
|
img, err := ebiten.NewImage(width, height, ebitenFilter)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -5,7 +5,7 @@ import (
|
|||||||
"image"
|
"image"
|
||||||
"image/color"
|
"image/color"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/hajimehoshi/ebiten"
|
"github.com/hajimehoshi/ebiten"
|
||||||
"github.com/hajimehoshi/ebiten/ebitenutil"
|
"github.com/hajimehoshi/ebiten/ebitenutil"
|
||||||
@ -23,12 +23,12 @@ func (s *ebitenSurface) PushTranslation(x, y int) {
|
|||||||
s.stateCurrent.y += y
|
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.stateStack = append(s.stateStack, s.stateCurrent)
|
||||||
s.stateCurrent.mode = d2ToEbitenCompositeMode(mode)
|
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.stateStack = append(s.stateStack, s.stateCurrent)
|
||||||
s.stateCurrent.filter = d2ToEbitenFilter(filter)
|
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 := &ebiten.DrawImageOptions{CompositeMode: s.stateCurrent.mode}
|
||||||
opts.GeoM.Translate(float64(s.stateCurrent.x), float64(s.stateCurrent.y))
|
opts.GeoM.Translate(float64(s.stateCurrent.x), float64(s.stateCurrent.y))
|
||||||
opts.Filter = s.stateCurrent.filter
|
opts.Filter = s.stateCurrent.filter
|
||||||
|
@ -1,32 +1,32 @@
|
|||||||
package ebiten
|
package ebiten
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
"github.com/hajimehoshi/ebiten"
|
"github.com/hajimehoshi/ebiten"
|
||||||
)
|
)
|
||||||
|
|
||||||
func d2ToEbitenFilter(filter d2render.Filter) ebiten.Filter {
|
func d2ToEbitenFilter(filter d2interface.Filter) ebiten.Filter {
|
||||||
switch filter {
|
switch filter {
|
||||||
case d2render.FilterDefault:
|
case d2interface.FilterDefault:
|
||||||
return ebiten.FilterDefault
|
return ebiten.FilterDefault
|
||||||
case d2render.FilterLinear:
|
case d2interface.FilterLinear:
|
||||||
return ebiten.FilterLinear
|
return ebiten.FilterLinear
|
||||||
case d2render.FilterNearest:
|
case d2interface.FilterNearest:
|
||||||
return ebiten.FilterNearest
|
return ebiten.FilterNearest
|
||||||
}
|
}
|
||||||
|
|
||||||
return ebiten.FilterDefault
|
return ebiten.FilterDefault
|
||||||
}
|
}
|
||||||
|
|
||||||
func ebitenToD2Filter(filter ebiten.Filter) d2render.Filter {
|
func ebitenToD2Filter(filter ebiten.Filter) d2interface.Filter {
|
||||||
switch filter {
|
switch filter {
|
||||||
case ebiten.FilterDefault:
|
case ebiten.FilterDefault:
|
||||||
return d2render.FilterDefault
|
return d2interface.FilterDefault
|
||||||
case ebiten.FilterLinear:
|
case ebiten.FilterLinear:
|
||||||
return d2render.FilterLinear
|
return d2interface.FilterLinear
|
||||||
case ebiten.FilterNearest:
|
case ebiten.FilterNearest:
|
||||||
return d2render.FilterNearest
|
return d2interface.FilterNearest
|
||||||
}
|
}
|
||||||
|
|
||||||
return d2render.FilterDefault
|
return d2interface.FilterDefault
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,9 @@ package d2screen
|
|||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -22,7 +23,7 @@ type ScreenUnloadHandler interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ScreenRenderHandler interface {
|
type ScreenRenderHandler interface {
|
||||||
Render(target d2render.Surface) error
|
Render(target d2interface.Surface) error
|
||||||
}
|
}
|
||||||
|
|
||||||
type ScreenAdvanceHandler interface {
|
type ScreenAdvanceHandler interface {
|
||||||
@ -95,7 +96,7 @@ func Advance(elapsed float64) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func Render(surface d2render.Surface) error {
|
func Render(surface d2interface.Surface) error {
|
||||||
if handler, ok := singleton.currentScreen.(ScreenRenderHandler); ok {
|
if handler, ok := singleton.currentScreen.(ScreenRenderHandler); ok {
|
||||||
if err := handler.Render(surface); err != nil {
|
if err := handler.Render(surface); err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -15,7 +15,6 @@ import (
|
|||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type TermCategory d2interface.TermCategory
|
type TermCategory d2interface.TermCategory
|
||||||
@ -211,7 +210,7 @@ func (t *terminal) OnKeyChars(event d2input.KeyCharsEvent) bool {
|
|||||||
return handled
|
return handled
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *terminal) Render(surface d2render.Surface) error {
|
func (t *terminal) Render(surface d2interface.Surface) error {
|
||||||
if !t.IsVisible() {
|
if !t.IsVisible() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,8 @@ import (
|
|||||||
"image"
|
"image"
|
||||||
"image/color"
|
"image/color"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
@ -93,11 +95,11 @@ type Button struct {
|
|||||||
visible bool
|
visible bool
|
||||||
pressed bool
|
pressed bool
|
||||||
toggled bool
|
toggled bool
|
||||||
normalSurface d2render.Surface
|
normalSurface d2interface.Surface
|
||||||
pressedSurface d2render.Surface
|
pressedSurface d2interface.Surface
|
||||||
toggledSurface d2render.Surface
|
toggledSurface d2interface.Surface
|
||||||
pressedToggledSurface d2render.Surface
|
pressedToggledSurface d2interface.Surface
|
||||||
disabledSurface d2render.Surface
|
disabledSurface d2interface.Surface
|
||||||
buttonLayout ButtonLayout
|
buttonLayout ButtonLayout
|
||||||
onClick func()
|
onClick func()
|
||||||
}
|
}
|
||||||
@ -127,7 +129,7 @@ func CreateButton(buttonType ButtonType, text string) Button {
|
|||||||
result.height += h
|
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)
|
_, fontHeight := font.GetTextMetrics(text)
|
||||||
textY := (result.height / 2) - (fontHeight / 2) + buttonLayout.TextOffset
|
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)
|
font.Render(0, textY, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.normalSurface)
|
||||||
if buttonLayout.AllowFrameChange {
|
if buttonLayout.AllowFrameChange {
|
||||||
if totalButtonTypes > 1 {
|
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)
|
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)
|
font.Render(-2, textY+2, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.pressedSurface)
|
||||||
}
|
}
|
||||||
if totalButtonTypes > 2 {
|
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)
|
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)
|
font.Render(0, textY, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.toggledSurface)
|
||||||
}
|
}
|
||||||
if totalButtonTypes > 3 {
|
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)
|
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)
|
font.Render(0, textY, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.pressedToggledSurface)
|
||||||
}
|
}
|
||||||
if buttonLayout.DisabledFrame != -1 {
|
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)
|
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)
|
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
|
// Render renders the button
|
||||||
func (v *Button) Render(target d2render.Surface) {
|
func (v *Button) Render(target d2interface.Surface) {
|
||||||
target.PushCompositeMode(d2render.CompositeModeSourceAtop)
|
target.PushCompositeMode(d2interface.CompositeModeSourceAtop)
|
||||||
target.PushFilter(d2render.FilterNearest)
|
target.PushFilter(d2interface.FilterNearest)
|
||||||
target.PushTranslation(v.x, v.y)
|
target.PushTranslation(v.x, v.y)
|
||||||
defer target.PopN(3)
|
defer target.PopN(3)
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package d2ui
|
package d2ui
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
||||||
@ -11,8 +12,8 @@ type Checkbox struct {
|
|||||||
checkState bool
|
checkState bool
|
||||||
visible bool
|
visible bool
|
||||||
width, height int
|
width, height int
|
||||||
Image d2render.Surface
|
Image d2interface.Surface
|
||||||
checkedImage d2render.Surface
|
checkedImage d2interface.Surface
|
||||||
onClick func()
|
onClick func()
|
||||||
enabled bool
|
enabled bool
|
||||||
}
|
}
|
||||||
@ -31,18 +32,18 @@ func CreateCheckbox(checkState bool) Checkbox {
|
|||||||
result.width, result.height, _ = checkboxSprite.GetFrameSize(0)
|
result.width, result.height, _ = checkboxSprite.GetFrameSize(0)
|
||||||
checkboxSprite.SetPosition(0, 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)
|
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)
|
checkboxSprite.RenderSegmented(result.checkedImage, 1, 1, 1)
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Checkbox) Render(target d2render.Surface) {
|
func (v *Checkbox) Render(target d2interface.Surface) {
|
||||||
target.PushCompositeMode(d2render.CompositeModeSourceAtop)
|
target.PushCompositeMode(d2interface.CompositeModeSourceAtop)
|
||||||
target.PushTranslation(v.x, v.y)
|
target.PushTranslation(v.x, v.y)
|
||||||
target.PushFilter(d2render.FilterNearest)
|
target.PushFilter(d2interface.FilterNearest)
|
||||||
defer target.PopN(3)
|
defer target.PopN(3)
|
||||||
|
|
||||||
if v.checkState {
|
if v.checkState {
|
||||||
|
@ -7,7 +7,6 @@ import (
|
|||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// CursorButton represents a mouse button
|
// CursorButton represents a mouse button
|
||||||
@ -91,7 +90,7 @@ func (u *UI) OnMouseButtonDown(event d2input.MouseEvent) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Render renders all of the UI elements
|
// Render renders all of the UI elements
|
||||||
func Render(target d2render.Surface) {
|
func Render(target d2interface.Surface) {
|
||||||
for _, widget := range singleton.widgets {
|
for _, widget := range singleton.widgets {
|
||||||
if widget.GetVisible() {
|
if widget.GetVisible() {
|
||||||
widget.Render(target)
|
widget.Render(target)
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
package d2ui
|
package d2ui
|
||||||
|
|
||||||
import "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
import (
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
)
|
||||||
|
|
||||||
// Drawable represents an instance that can be drawn
|
// Drawable represents an instance that can be drawn
|
||||||
type Drawable interface {
|
type Drawable interface {
|
||||||
Render(target d2render.Surface)
|
Render(target d2interface.Surface)
|
||||||
Advance(elapsed float64)
|
Advance(elapsed float64)
|
||||||
GetSize() (width, height int)
|
GetSize() (width, height int)
|
||||||
SetPosition(x, y int)
|
SetPosition(x, y int)
|
||||||
|
@ -6,9 +6,10 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"unicode"
|
"unicode"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var fontCache = map[string]*Font{}
|
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
|
// 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.SetColorMod(color)
|
||||||
v.fontSprite.SetBlend(false)
|
v.fontSprite.SetBlend(false)
|
||||||
|
|
||||||
|
@ -3,6 +3,8 @@ package d2ui
|
|||||||
import (
|
import (
|
||||||
"image/color"
|
"image/color"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -27,7 +29,7 @@ type Label struct {
|
|||||||
Height int
|
Height int
|
||||||
Alignment LabelAlignment
|
Alignment LabelAlignment
|
||||||
font *Font
|
font *Font
|
||||||
imageData map[string]d2render.Surface
|
imageData map[string]d2interface.Surface
|
||||||
Color color.Color
|
Color color.Color
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,14 +39,14 @@ func CreateLabel(fontPath, palettePath string) Label {
|
|||||||
Alignment: LabelAlignLeft,
|
Alignment: LabelAlignLeft,
|
||||||
Color: color.White,
|
Color: color.White,
|
||||||
font: GetFont(fontPath, palettePath),
|
font: GetFont(fontPath, palettePath),
|
||||||
imageData: make(map[string]d2render.Surface),
|
imageData: make(map[string]d2interface.Surface),
|
||||||
}
|
}
|
||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Render draws the label on the screen
|
// 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 {
|
if len(v.text) == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -57,8 +59,8 @@ func (v *Label) Render(target d2render.Surface) {
|
|||||||
x, y = v.X-v.Width, v.Y
|
x, y = v.X-v.Width, v.Y
|
||||||
}
|
}
|
||||||
|
|
||||||
target.PushFilter(d2render.FilterNearest)
|
target.PushFilter(d2interface.FilterNearest)
|
||||||
target.PushCompositeMode(d2render.CompositeModeSourceAtop)
|
target.PushCompositeMode(d2interface.CompositeModeSourceAtop)
|
||||||
target.PushTranslation(x, y)
|
target.PushTranslation(x, y)
|
||||||
defer target.PopN(3)
|
defer target.PopN(3)
|
||||||
|
|
||||||
@ -82,7 +84,7 @@ func (v *Label) cacheImage() {
|
|||||||
width, height := v.font.GetTextMetrics(v.text)
|
width, height := v.font.GetTextMetrics(v.text)
|
||||||
v.Width = width
|
v.Width = width
|
||||||
v.Height = height
|
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])
|
surface, _ := d2render.CreateSurface(v.imageData[v.text])
|
||||||
v.font.Render(0, 0, v.text, v.Color, surface)
|
v.font.Render(0, 0, v.text, v.Color, surface)
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
package d2ui
|
package d2ui
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Scrollbar struct {
|
type Scrollbar struct {
|
||||||
@ -74,7 +74,7 @@ func (v *Scrollbar) GetLastDirChange() int {
|
|||||||
return v.lastDirChange
|
return v.lastDirChange
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Scrollbar) Render(target d2render.Surface) {
|
func (v *Scrollbar) Render(target d2interface.Surface) {
|
||||||
if !v.visible || v.maxOffset == 0 {
|
if !v.visible || v.maxOffset == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -4,9 +4,10 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"image/color"
|
"image/color"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Sprite struct {
|
type Sprite struct {
|
||||||
@ -26,7 +27,7 @@ func LoadSprite(animation *d2asset.Animation) (*Sprite, error) {
|
|||||||
return &Sprite{animation: animation}, nil
|
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()
|
_, frameHeight := s.animation.GetCurrentFrameSize()
|
||||||
|
|
||||||
target.PushTranslation(s.x, s.y-frameHeight)
|
target.PushTranslation(s.x, s.y-frameHeight)
|
||||||
@ -34,7 +35,7 @@ func (s *Sprite) Render(target d2render.Surface) error {
|
|||||||
return s.animation.Render(target)
|
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
|
var currentY int
|
||||||
for y := 0; y < segmentsY; y++ {
|
for y := 0; y < segmentsY; y++ {
|
||||||
var currentX int
|
var currentX int
|
||||||
|
@ -4,10 +4,11 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// TextBox with cursor focus
|
// TextBox with cursor focus
|
||||||
@ -46,7 +47,7 @@ func (v *TextBox) SetFilter(filter string) {
|
|||||||
v.filter = filter
|
v.filter = filter
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *TextBox) Render(target d2render.Surface) {
|
func (v *TextBox) Render(target d2interface.Surface) {
|
||||||
if !v.visible {
|
if !v.visible {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,6 @@ import (
|
|||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2game/d2player"
|
"github.com/OpenDiablo2/OpenDiablo2/d2game/d2player"
|
||||||
@ -187,7 +186,7 @@ func (v *CharacterSelect) onExitButtonClicked() {
|
|||||||
d2screen.SetNextScreen(mainMenu)
|
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.background.RenderSegmented(screen, 4, 3, 0)
|
||||||
v.d2HeroTitle.Render(screen)
|
v.d2HeroTitle.Render(screen)
|
||||||
actualSelectionIndex := v.selectedCharacter - (v.charScrollbar.GetCurrentOffset() * 2)
|
actualSelectionIndex := v.selectedCharacter - (v.charScrollbar.GetCurrentOffset() * 2)
|
||||||
|
@ -14,7 +14,6 @@ import (
|
|||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
)
|
)
|
||||||
@ -99,7 +98,7 @@ func (v *Credits) OnLoad(loading d2screen.LoadingState) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Render renders the credits screen
|
// 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)
|
v.creditsBackground.RenderSegmented(screen, 4, 3, 0)
|
||||||
for _, label := range v.labels {
|
for _, label := range v.labels {
|
||||||
if label.Available {
|
if label.Available {
|
||||||
|
@ -14,7 +14,6 @@ import (
|
|||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2maprenderer"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2maprenderer"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2game/d2player"
|
"github.com/OpenDiablo2/OpenDiablo2/d2game/d2player"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2networking/d2client"
|
"github.com/OpenDiablo2/OpenDiablo2/d2networking/d2client"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2networking/d2netpacket"
|
"github.com/OpenDiablo2/OpenDiablo2/d2networking/d2netpacket"
|
||||||
@ -59,7 +58,7 @@ func (v *Game) OnUnload() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Game) Render(screen d2render.Surface) error {
|
func (v *Game) Render(screen d2interface.Surface) error {
|
||||||
if v.gameClient.RegenMap {
|
if v.gameClient.RegenMap {
|
||||||
v.gameClient.RegenMap = false
|
v.gameClient.RegenMap = false
|
||||||
v.mapRenderer.RegenerateTileCache()
|
v.mapRenderer.RegenerateTileCache()
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package d2gamescreen
|
package d2gamescreen
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -42,7 +42,7 @@ func (g *GuiTestMain) OnLoad(loading d2screen.LoadingState) {
|
|||||||
d2gui.SetLayout(layout)
|
d2gui.SetLayout(layout)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *GuiTestMain) Render(screen d2render.Surface) error {
|
func (g *GuiTestMain) Render(screen d2interface.Surface) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,6 @@ import (
|
|||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
)
|
)
|
||||||
@ -301,7 +300,7 @@ func (v *MainMenu) onCreditsButtonClicked() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Render renders the main menu
|
// Render renders the main menu
|
||||||
func (v *MainMenu) Render(screen d2render.Surface) error {
|
func (v *MainMenu) Render(screen d2interface.Surface) error {
|
||||||
switch v.screenMode {
|
switch v.screenMode {
|
||||||
case ScreenModeTrademark:
|
case ScreenModeTrademark:
|
||||||
v.trademarkBackground.RenderSegmented(screen, 4, 3, 0)
|
v.trademarkBackground.RenderSegmented(screen, 4, 3, 0)
|
||||||
|
@ -13,7 +13,6 @@ import (
|
|||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2game/d2player"
|
"github.com/OpenDiablo2/OpenDiablo2/d2game/d2player"
|
||||||
)
|
)
|
||||||
@ -161,7 +160,7 @@ func (met *MapEngineTest) OnUnload() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (met *MapEngineTest) Render(screen d2render.Surface) error {
|
func (met *MapEngineTest) Render(screen d2interface.Surface) error {
|
||||||
met.mapRenderer.Render(screen)
|
met.mapRenderer.Render(screen)
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -17,7 +17,6 @@ import (
|
|||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
)
|
)
|
||||||
@ -445,7 +444,7 @@ func (v *SelectHeroClass) onOkButtonClicked() {
|
|||||||
d2screen.SetNextScreen(CreateGame(v.audioProvider, gameClient, v.terminal))
|
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.bgImage.RenderSegmented(screen, 4, 3, 0)
|
||||||
v.headingLabel.Render(screen)
|
v.headingLabel.Render(screen)
|
||||||
if v.selectedHero != d2enum.HeroNone {
|
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]
|
renderInfo := v.heroRenderInfo[hero]
|
||||||
switch renderInfo.Stance {
|
switch renderInfo.Stance {
|
||||||
case d2enum.HeroStanceIdle:
|
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 {
|
if sprite != nil {
|
||||||
sprite.Render(target)
|
sprite.Render(target)
|
||||||
}
|
}
|
||||||
|
@ -52,8 +52,8 @@ type GameControls struct {
|
|||||||
// UI
|
// UI
|
||||||
globeSprite *d2ui.Sprite
|
globeSprite *d2ui.Sprite
|
||||||
hpManaStatusSprite *d2ui.Sprite
|
hpManaStatusSprite *d2ui.Sprite
|
||||||
hpStatusBar d2render.Surface
|
hpStatusBar d2interface.Surface
|
||||||
manaStatusBar d2render.Surface
|
manaStatusBar d2interface.Surface
|
||||||
mainPanel *d2ui.Sprite
|
mainPanel *d2ui.Sprite
|
||||||
menuButton *d2ui.Sprite
|
menuButton *d2ui.Sprite
|
||||||
skillIcon *d2ui.Sprite
|
skillIcon *d2ui.Sprite
|
||||||
@ -254,7 +254,7 @@ func (g *GameControls) Load() {
|
|||||||
animation, _ = d2asset.LoadAnimation(d2resource.HealthManaIndicator, d2resource.PaletteSky)
|
animation, _ = d2asset.LoadAnimation(d2resource.HealthManaIndicator, d2resource.PaletteSky)
|
||||||
g.hpManaStatusSprite, _ = d2ui.LoadSprite(animation)
|
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)
|
animation, _ = d2asset.LoadAnimation(d2resource.GamePanels, d2resource.PaletteSky)
|
||||||
g.mainPanel, _ = d2ui.LoadSprite(animation)
|
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.
|
// 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() {
|
for entityIdx := range *g.mapEngine.Entities() {
|
||||||
entity := (*g.mapEngine.Entities())[entityIdx]
|
entity := (*g.mapEngine.Entities())[entityIdx]
|
||||||
if !entity.Selectable() {
|
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)
|
healthPercent := float64(g.hero.Stats.Health) / float64(g.hero.Stats.MaxHealth)
|
||||||
hpBarHeight := int(healthPercent * float64(globeHeight))
|
hpBarHeight := int(healthPercent * float64(globeHeight))
|
||||||
if g.lastHealthPercent != healthPercent {
|
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.hpManaStatusSprite.SetCurrentFrame(0)
|
||||||
g.hpStatusBar.PushTranslation(0, hpBarHeight)
|
g.hpStatusBar.PushTranslation(0, hpBarHeight)
|
||||||
|
|
||||||
@ -414,7 +414,7 @@ func (g *GameControls) Render(target d2render.Surface) {
|
|||||||
|
|
||||||
// Stamina status bar
|
// Stamina status bar
|
||||||
target.PushTranslation(273, 572)
|
target.PushTranslation(273, 572)
|
||||||
target.PushCompositeMode(d2render.CompositeModeLighter)
|
target.PushCompositeMode(d2interface.CompositeModeLighter)
|
||||||
staminaPercent := float64(g.hero.Stats.Stamina) / float64(g.hero.Stats.MaxStamina)
|
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.DrawRect(int(staminaPercent*staminaBarWidth), 19, color.RGBA{R: 175, G: 136, B: 72, A: 200})
|
||||||
target.PopN(2)
|
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)
|
manaPercent := float64(g.hero.Stats.Mana) / float64(g.hero.Stats.MaxMana)
|
||||||
manaBarHeight := int(manaPercent * float64(globeHeight))
|
manaBarHeight := int(manaPercent * float64(globeHeight))
|
||||||
if manaPercent != g.lastManaPercent {
|
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.hpManaStatusSprite.SetCurrentFrame(1)
|
||||||
|
|
||||||
g.manaStatusBar.PushTranslation(0, manaBarHeight)
|
g.manaStatusBar.PushTranslation(0, manaBarHeight)
|
||||||
|
@ -3,6 +3,8 @@ package d2player
|
|||||||
import (
|
import (
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
@ -72,7 +74,7 @@ type HeroStatsPanel struct {
|
|||||||
heroState *d2hero.HeroStatsState
|
heroState *d2hero.HeroStatsState
|
||||||
heroName string
|
heroName string
|
||||||
heroClass d2enum.Hero
|
heroClass d2enum.Hero
|
||||||
staticMenuImageCache *d2render.Surface
|
staticMenuImageCache *d2interface.Surface
|
||||||
labels *StatsPanelLabels
|
labels *StatsPanelLabels
|
||||||
|
|
||||||
originX int
|
originX int
|
||||||
@ -88,7 +90,7 @@ func NewHeroStatsPanel(heroName string, heroClass d2enum.Hero, heroState d2hero.
|
|||||||
originX: originX,
|
originX: originX,
|
||||||
originY: originY,
|
originY: originY,
|
||||||
heroState: &heroState,
|
heroState: &heroState,
|
||||||
heroName: heroName,
|
heroName: heroName,
|
||||||
heroClass: heroClass,
|
heroClass: heroClass,
|
||||||
labels: &StatsPanelLabels{},
|
labels: &StatsPanelLabels{},
|
||||||
}
|
}
|
||||||
@ -118,7 +120,7 @@ func (s *HeroStatsPanel) Close() {
|
|||||||
s.isOpen = false
|
s.isOpen = false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *HeroStatsPanel) Render(target d2render.Surface) {
|
func (s *HeroStatsPanel) Render(target d2interface.Surface) {
|
||||||
if !s.isOpen {
|
if !s.isOpen {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -126,7 +128,7 @@ func (s *HeroStatsPanel) Render(target d2render.Surface) {
|
|||||||
if s.staticMenuImageCache == nil {
|
if s.staticMenuImageCache == nil {
|
||||||
frameWidth, frameHeight := s.frame.GetFrameBounds()
|
frameWidth, frameHeight := s.frame.GetFrameBounds()
|
||||||
framesCount := s.frame.GetFrameCount()
|
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 {
|
if err != nil {
|
||||||
return
|
return
|
||||||
@ -138,7 +140,7 @@ func (s *HeroStatsPanel) Render(target d2render.Surface) {
|
|||||||
s.renderStatValues(target)
|
s.renderStatValues(target)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *HeroStatsPanel) renderStaticMenu(target d2render.Surface) {
|
func (s *HeroStatsPanel) renderStaticMenu(target d2interface.Surface) {
|
||||||
x, y := s.originX, s.originY
|
x, y := s.originX, s.originY
|
||||||
|
|
||||||
// Frame
|
// Frame
|
||||||
@ -226,7 +228,7 @@ func (s *HeroStatsPanel) initStatValueLabels() {
|
|||||||
s.labels.Experience = s.createStatValueLabel(s.heroState.Experience, 200, 110)
|
s.labels.Experience = s.createStatValueLabel(s.heroState.Experience, 200, 110)
|
||||||
s.labels.NextLevelExp = s.createStatValueLabel(s.heroState.NextLevelExp, 330, 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.Dexterity = s.createStatValueLabel(s.heroState.Dexterity, 175, 207)
|
||||||
s.labels.Vitality = s.createStatValueLabel(s.heroState.Vitality, 175, 295)
|
s.labels.Vitality = s.createStatValueLabel(s.heroState.Vitality, 175, 295)
|
||||||
s.labels.Energy = s.createStatValueLabel(s.heroState.Energy, 175, 355)
|
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)
|
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.Level, s.heroState.Level, target)
|
||||||
s.renderStatValueNum(s.labels.Experience, s.heroState.Experience, target)
|
s.renderStatValueNum(s.labels.Experience, s.heroState.Experience, target)
|
||||||
s.renderStatValueNum(s.labels.NextLevelExp, s.heroState.NextLevelExp, 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)
|
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.SetText(strconv.Itoa(value))
|
||||||
label.Render(target)
|
label.Render(target)
|
||||||
}
|
}
|
||||||
|
@ -2,10 +2,10 @@ package d2player
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -72,7 +72,7 @@ func (g *Inventory) Load() {
|
|||||||
g.grid.Add(items...)
|
g.grid.Add(items...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *Inventory) Render(target d2render.Surface) {
|
func (g *Inventory) Render(target d2interface.Surface) {
|
||||||
if !g.isOpen {
|
if !g.isOpen {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -3,11 +3,12 @@ package d2player
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
@ -199,7 +200,7 @@ func (g *ItemGrid) Remove(item InventoryItem) {
|
|||||||
g.items = g.items[:n]
|
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()]
|
itemSprite := g.sprites[item.GetItemCode()]
|
||||||
if itemSprite != nil {
|
if itemSprite != nil {
|
||||||
itemSprite.SetPosition(x, y)
|
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.renderInventoryItems(target)
|
||||||
g.renderEquippedItems(target)
|
g.renderEquippedItems(target)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *ItemGrid) renderInventoryItems(target d2render.Surface) {
|
func (g *ItemGrid) renderInventoryItems(target d2interface.Surface) {
|
||||||
for _, item := range g.items {
|
for _, item := range g.items {
|
||||||
itemSprite := g.sprites[item.GetItemCode()]
|
itemSprite := g.sprites[item.GetItemCode()]
|
||||||
slotX, slotY := g.SlotToScreen(item.InventoryGridSlot())
|
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 {
|
for _, eq := range g.equipmentSlots {
|
||||||
if eq.item != nil {
|
if eq.item != nil {
|
||||||
itemSprite := g.sprites[eq.item.GetItemCode()]
|
itemSprite := g.sprites[eq.item.GetItemCode()]
|
||||||
|
17
main.go
17
main.go
@ -4,7 +4,6 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
ebiten_input "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input/ebiten"
|
|
||||||
"image"
|
"image"
|
||||||
"image/gif"
|
"image/gif"
|
||||||
"image/png"
|
"image/png"
|
||||||
@ -16,6 +15,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
ebiten_input "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input/ebiten"
|
||||||
|
|
||||||
ebiten2 "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio/ebiten"
|
ebiten2 "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio/ebiten"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
@ -83,7 +84,6 @@ func main() {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
d2input.Initialize(ebiten_input.InputService{}) // TODO d2input singleton must be init before d2term
|
d2input.Initialize(ebiten_input.InputService{}) // TODO d2input singleton must be init before d2term
|
||||||
term, err := d2term.Initialize()
|
term, err := d2term.Initialize()
|
||||||
terminal_hack = term // needs to be used in advance, no easy way for that right now
|
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")
|
d2render.SetWindowIcon("d2logo.png")
|
||||||
|
|
||||||
|
|
||||||
term.BindLogger()
|
term.BindLogger()
|
||||||
term.BindAction("dumpheap", "dumps the heap to pprof/heap.pprof", func() {
|
term.BindAction("dumpheap", "dumps the heap to pprof/heap.pprof", func() {
|
||||||
os.Mkdir("./pprof/", 0755)
|
os.Mkdir("./pprof/", 0755)
|
||||||
@ -213,7 +212,7 @@ func initialize(audioProvider d2interface.AudioProvider, term d2interface.Termin
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func run(updateFunc func(d2render.Surface) error) {
|
func run(updateFunc func(d2interface.Surface) error) {
|
||||||
if len(GitBranch) == 0 {
|
if len(GitBranch) == 0 {
|
||||||
GitBranch = "Local Build"
|
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()
|
currentTime := d2common.Now()
|
||||||
elapsedTime := (currentTime - singleton.lastTime) * singleton.timeScale
|
elapsedTime := (currentTime - singleton.lastTime) * singleton.timeScale
|
||||||
singleton.lastTime = currentTime
|
singleton.lastTime = currentTime
|
||||||
@ -244,7 +243,7 @@ func update(target d2render.Surface) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateInitError(target d2render.Surface) error {
|
func updateInitError(target d2interface.Surface) error {
|
||||||
width, height := target.GetSize()
|
width, height := target.GetSize()
|
||||||
target.PushTranslation(width/5, height/2)
|
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)
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func render(target d2render.Surface) error {
|
func render(target d2interface.Surface) error {
|
||||||
if err := d2screen.Render(target); err != nil {
|
if err := d2screen.Render(target); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -306,7 +305,7 @@ func render(target d2render.Surface) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func renderCapture(target d2render.Surface) error {
|
func renderCapture(target d2interface.Surface) error {
|
||||||
cleanupCapture := func() {
|
cleanupCapture := func() {
|
||||||
singleton.captureState = captureStateNone
|
singleton.captureState = captureStateNone
|
||||||
singleton.capturePath = ""
|
singleton.capturePath = ""
|
||||||
@ -386,7 +385,7 @@ func renderCapture(target d2render.Surface) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func renderDebug(target d2render.Surface) error {
|
func renderDebug(target d2interface.Surface) error {
|
||||||
if singleton.showFPS {
|
if singleton.showFPS {
|
||||||
vsyncEnabled := d2render.GetVSyncEnabled()
|
vsyncEnabled := d2render.GetVSyncEnabled()
|
||||||
fps := d2render.CurrentFPS()
|
fps := d2render.CurrentFPS()
|
||||||
|
Loading…
Reference in New Issue
Block a user