1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-06-19 13:45:23 +00:00

Object Highlights (#476)

* Add PushBrightness to surface

* Highlight selectable objects

Check if mapentity is selectable. (seems reasonable)
Request objects to highlight themselves is required (idk)
This commit is contained in:
Ziemas 2020-06-28 00:58:41 +02:00 committed by GitHub
parent 2937838839
commit b00fa58fc4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 54 additions and 4 deletions

View File

@ -15,6 +15,8 @@ type MapEntity interface {
GetLayer() (int) GetLayer() (int)
GetPositionF() (float64, float64) GetPositionF() (float64, float64)
Name() string Name() string
Selectable() bool
Highlight()
} }
// mapEntity represents an entity on the map that can be animated // mapEntity represents an entity on the map that can be animated
@ -190,3 +192,10 @@ func (m *mapEntity) GetPositionF() (float64, float64) {
func (m *mapEntity) Name() string { func (m *mapEntity) Name() string {
return "" return ""
} }
func (m *mapEntity) Highlight() {
}
func (m *mapEntity) Selectable() bool {
return false
}

View File

@ -165,6 +165,14 @@ func (v *NPC) SetMode(animationMode, weaponClass string, direction int) error {
return err return err
} }
func (m *NPC) Selectable() bool {
// is there something handy that determines selectable npc's?
if m.name != "" {
return true
}
return false
}
func (m *NPC) Name() string { func (m *NPC) Name() string {
return m.name return m.name
} }

View File

@ -12,6 +12,7 @@ type Object struct {
mapEntity mapEntity
composite *d2asset.Composite composite *d2asset.Composite
direction int direction int
highlight bool
objectRecord *d2datadict.ObjectRecord objectRecord *d2datadict.ObjectRecord
objectLookup *d2datadict.ObjectLookupRecord objectLookup *d2datadict.ObjectLookupRecord
} }
@ -45,24 +46,41 @@ func (ob *Object) SetMode(animationMode, weaponClass string, direction int) erro
err = ob.composite.SetMode(animationMode, "HTH", direction) err = ob.composite.SetMode(animationMode, "HTH", direction)
ob.weaponClass = "HTH" ob.weaponClass = "HTH"
} }
ob.mapEntity.drawLayer = ob.objectRecord.OrderFlag[d2enum.ObjectAnimationModeFromString(animationMode)]
mode := d2enum.ObjectAnimationModeFromString(animationMode)
ob.mapEntity.drawLayer = ob.objectRecord.OrderFlag[mode]
// For objects their txt record entry overrides animationdata // For objects their txt record entry overrides animationdata
speed := ob.objectRecord.FrameDelta[d2enum.ObjectAnimationModeFromString(animationMode)] speed := ob.objectRecord.FrameDelta[mode]
if speed != 0 { if speed != 0 {
ob.composite.SetSpeed(speed) ob.composite.SetSpeed(speed)
} }
return err return err
} }
func (ob *Object) Highlight() {
ob.highlight = true
}
func (ob *Object) Selectable() bool {
mode := d2enum.ObjectAnimationModeFromString(ob.composite.GetAnimationMode())
return ob.objectRecord.Selectable[mode]
}
// 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 d2render.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),
) )
if ob.highlight {
target.PushBrightness(2)
defer target.Pop()
}
defer target.Pop() defer target.Pop()
ob.composite.Render(target) ob.composite.Render(target)
ob.highlight = false
} }
// rotate sets direction and changes animation // rotate sets direction and changes animation

View File

@ -207,3 +207,8 @@ func (v *Player) SetCasting() {
v.isCasting = true v.isCasting = true
v.SetAnimationMode(d2enum.AnimationModePlayerCast.String()) v.SetAnimationMode(d2enum.AnimationModePlayerCast.String())
} }
func (v *Player) Selectable() bool {
// Players are selectable when in town
return v.IsInTown()
}

View File

@ -38,6 +38,11 @@ func (s *ebitenSurface) PushColor(color color.Color) {
s.stateCurrent.color = color s.stateCurrent.color = color
} }
func (s *ebitenSurface) PushBrightness(brightness float64) {
s.stateStack = append(s.stateStack, s.stateCurrent)
s.stateCurrent.brightness = brightness
}
func (s *ebitenSurface) Pop() { func (s *ebitenSurface) Pop() {
count := len(s.stateStack) count := len(s.stateStack)
if count == 0 { if count == 0 {
@ -61,6 +66,9 @@ func (s *ebitenSurface) Render(sfc d2render.Surface) error {
if s.stateCurrent.color != nil { if s.stateCurrent.color != nil {
opts.ColorM = ColorToColorM(s.stateCurrent.color) opts.ColorM = ColorToColorM(s.stateCurrent.color)
} }
if s.stateCurrent.brightness != 0 {
opts.ColorM.ChangeHSV(0, 1, s.stateCurrent.brightness)
}
var img = sfc.(*ebitenSurface).image var img = sfc.(*ebitenSurface).image
return s.image.DrawImage(img, opts) return s.image.DrawImage(img, opts)

View File

@ -12,4 +12,5 @@ type surfaceState struct {
mode ebiten.CompositeMode mode ebiten.CompositeMode
filter ebiten.Filter filter ebiten.Filter
color color.Color color color.Color
brightness float64
} }

View File

@ -18,6 +18,7 @@ type Surface interface {
PushCompositeMode(mode CompositeMode) PushCompositeMode(mode CompositeMode)
PushFilter(filter Filter) PushFilter(filter Filter)
PushTranslation(x, y int) PushTranslation(x, y int)
PushBrightness(brightness float64)
Render(surface Surface) error Render(surface Surface) error
ReplacePixels(pixels []byte) error ReplacePixels(pixels []byte) error
Screenshot() *image.RGBA Screenshot() *image.RGBA

View File

@ -88,7 +88,6 @@ func (v *Game) Advance(tickTime float64) error {
tile := v.gameClient.MapEngine.TileAt(v.localPlayer.TileX, v.localPlayer.TileY) tile := v.gameClient.MapEngine.TileAt(v.localPlayer.TileX, v.localPlayer.TileY)
if tile != nil { if tile != nil {
musicInfo := d2common.GetMusicDef(tile.RegionType) musicInfo := d2common.GetMusicDef(tile.RegionType)
v.localPlayer.SetIsInTown(musicInfo.InTown)
d2audio.PlayBGM(musicInfo.MusicFile) d2audio.PlayBGM(musicInfo.MusicFile)
// skip showing zone change text the first time we enter the world // skip showing zone change text the first time we enter the world

View File

@ -337,7 +337,7 @@ func (g *GameControls) isInActiveMenusRect(px int, py int) bool {
func (g *GameControls) Render(target d2render.Surface) { func (g *GameControls) Render(target d2render.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.Name() == "" { if !entity.Selectable() {
continue continue
} }
@ -350,6 +350,7 @@ func (g *GameControls) Render(target d2render.Surface) {
g.nameLabel.SetText(entity.Name()) g.nameLabel.SetText(entity.Name())
g.nameLabel.SetPosition(entScreenX, entScreenY-100) g.nameLabel.SetPosition(entScreenX, entScreenY-100)
g.nameLabel.Render(target) g.nameLabel.Render(target)
entity.Highlight()
break break
} }
} }