1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-06-16 04:25:23 +00:00

Remaining lint fixes for the d2gamescreen package (#550)

* lint fixes for the game.go

* lint fixes for the gui_testing.go

* lint fixes for the blizzard_intro.go, map_engine_testing.go and select_hero_class.go

* added package comment for the d2gamescreen package

* fixes after merge
This commit is contained in:
Gürkan Kaymak 2020-07-07 03:13:55 +03:00 committed by GitHub
parent 5212270c44
commit 473a0b3b19
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 558 additions and 527 deletions

View File

@ -35,37 +35,37 @@ const (
CharacterSelectBarbarianForwardWalkOverlay = "/data/global/ui/FrontEnd/barbarian/BAFWs.DC6" CharacterSelectBarbarianForwardWalkOverlay = "/data/global/ui/FrontEnd/barbarian/BAFWs.DC6"
CharacterSelectBarbarianBackWalk = "/data/global/ui/FrontEnd/barbarian/babw.DC6" CharacterSelectBarbarianBackWalk = "/data/global/ui/FrontEnd/barbarian/babw.DC6"
CharacterSelecSorceressUnselected = "/data/global/ui/FrontEnd/sorceress/SONU1.DC6" CharacterSelectSorceressUnselected = "/data/global/ui/FrontEnd/sorceress/SONU1.DC6"
CharacterSelecSorceressUnselectedH = "/data/global/ui/FrontEnd/sorceress/SONU2.DC6" CharacterSelectSorceressUnselectedH = "/data/global/ui/FrontEnd/sorceress/SONU2.DC6"
CharacterSelecSorceressSelected = "/data/global/ui/FrontEnd/sorceress/SONU3.DC6" CharacterSelectSorceressSelected = "/data/global/ui/FrontEnd/sorceress/SONU3.DC6"
CharacterSelecSorceressSelectedOverlay = "/data/global/ui/FrontEnd/sorceress/SONU3s.DC6" CharacterSelectSorceressSelectedOverlay = "/data/global/ui/FrontEnd/sorceress/SONU3s.DC6"
CharacterSelecSorceressForwardWalk = "/data/global/ui/FrontEnd/sorceress/SOFW.DC6" CharacterSelectSorceressForwardWalk = "/data/global/ui/FrontEnd/sorceress/SOFW.DC6"
CharacterSelecSorceressForwardWalkOverlay = "/data/global/ui/FrontEnd/sorceress/SOFWs.DC6" CharacterSelectSorceressForwardWalkOverlay = "/data/global/ui/FrontEnd/sorceress/SOFWs.DC6"
CharacterSelecSorceressBackWalk = "/data/global/ui/FrontEnd/sorceress/SOBW.DC6" CharacterSelectSorceressBackWalk = "/data/global/ui/FrontEnd/sorceress/SOBW.DC6"
CharacterSelecSorceressBackWalkOverlay = "/data/global/ui/FrontEnd/sorceress/SOBWs.DC6" CharacterSelectSorceressBackWalkOverlay = "/data/global/ui/FrontEnd/sorceress/SOBWs.DC6"
CharacterSelectNecromancerUnselected = "/data/global/ui/FrontEnd/necromancer/NENU1.DC6" CharacterSelectNecromancerUnselected = "/data/global/ui/FrontEnd/necromancer/NENU1.DC6"
CharacterSelectNecromancerUnselectedH = "/data/global/ui/FrontEnd/necromancer/NENU2.DC6" CharacterSelectNecromancerUnselectedH = "/data/global/ui/FrontEnd/necromancer/NENU2.DC6"
CharacterSelecNecromancerSelected = "/data/global/ui/FrontEnd/necromancer/NENU3.DC6" CharacterSelectNecromancerSelected = "/data/global/ui/FrontEnd/necromancer/NENU3.DC6"
CharacterSelecNecromancerSelectedOverlay = "/data/global/ui/FrontEnd/necromancer/NENU3s.DC6" CharacterSelectNecromancerSelectedOverlay = "/data/global/ui/FrontEnd/necromancer/NENU3s.DC6"
CharacterSelecNecromancerForwardWalk = "/data/global/ui/FrontEnd/necromancer/NEFW.DC6" CharacterSelectNecromancerForwardWalk = "/data/global/ui/FrontEnd/necromancer/NEFW.DC6"
CharacterSelecNecromancerForwardWalkOverlay = "/data/global/ui/FrontEnd/necromancer/NEFWs.DC6" CharacterSelectNecromancerForwardWalkOverlay = "/data/global/ui/FrontEnd/necromancer/NEFWs.DC6"
CharacterSelecNecromancerBackWalk = "/data/global/ui/FrontEnd/necromancer/NEBW.DC6" CharacterSelectNecromancerBackWalk = "/data/global/ui/FrontEnd/necromancer/NEBW.DC6"
CharacterSelecNecromancerBackWalkOverlay = "/data/global/ui/FrontEnd/necromancer/NEBWs.DC6" CharacterSelectNecromancerBackWalkOverlay = "/data/global/ui/FrontEnd/necromancer/NEBWs.DC6"
CharacterSelectPaladinUnselected = "/data/global/ui/FrontEnd/paladin/PANU1.DC6" CharacterSelectPaladinUnselected = "/data/global/ui/FrontEnd/paladin/PANU1.DC6"
CharacterSelectPaladinUnselectedH = "/data/global/ui/FrontEnd/paladin/PANU2.DC6" CharacterSelectPaladinUnselectedH = "/data/global/ui/FrontEnd/paladin/PANU2.DC6"
CharacterSelecPaladinSelected = "/data/global/ui/FrontEnd/paladin/PANU3.DC6" CharacterSelectPaladinSelected = "/data/global/ui/FrontEnd/paladin/PANU3.DC6"
CharacterSelecPaladinForwardWalk = "/data/global/ui/FrontEnd/paladin/PAFW.DC6" CharacterSelectPaladinForwardWalk = "/data/global/ui/FrontEnd/paladin/PAFW.DC6"
CharacterSelecPaladinForwardWalkOverlay = "/data/global/ui/FrontEnd/paladin/PAFWs.DC6" CharacterSelectPaladinForwardWalkOverlay = "/data/global/ui/FrontEnd/paladin/PAFWs.DC6"
CharacterSelecPaladinBackWalk = "/data/global/ui/FrontEnd/paladin/PABW.DC6" CharacterSelectPaladinBackWalk = "/data/global/ui/FrontEnd/paladin/PABW.DC6"
CharacterSelectAmazonUnselected = "/data/global/ui/FrontEnd/amazon/AMNU1.DC6" CharacterSelectAmazonUnselected = "/data/global/ui/FrontEnd/amazon/AMNU1.DC6"
CharacterSelectAmazonUnselectedH = "/data/global/ui/FrontEnd/amazon/AMNU2.DC6" CharacterSelectAmazonUnselectedH = "/data/global/ui/FrontEnd/amazon/AMNU2.DC6"
CharacterSelecAmazonSelected = "/data/global/ui/FrontEnd/amazon/AMNU3.DC6" CharacterSelectAmazonSelected = "/data/global/ui/FrontEnd/amazon/AMNU3.DC6"
CharacterSelecAmazonForwardWalk = "/data/global/ui/FrontEnd/amazon/AMFW.DC6" CharacterSelectAmazonForwardWalk = "/data/global/ui/FrontEnd/amazon/AMFW.DC6"
CharacterSelecAmazonForwardWalkOverlay = "/data/global/ui/FrontEnd/amazon/AMFWs.DC6" CharacterSelectAmazonForwardWalkOverlay = "/data/global/ui/FrontEnd/amazon/AMFWs.DC6"
CharacterSelecAmazonBackWalk = "/data/global/ui/FrontEnd/amazon/AMBW.DC6" CharacterSelectAmazonBackWalk = "/data/global/ui/FrontEnd/amazon/AMBW.DC6"
CharacterSelectAssassinUnselected = "/data/global/ui/FrontEnd/assassin/ASNU1.DC6" CharacterSelectAssassinUnselected = "/data/global/ui/FrontEnd/assassin/ASNU1.DC6"
CharacterSelectAssassinUnselectedH = "/data/global/ui/FrontEnd/assassin/ASNU2.DC6" CharacterSelectAssassinUnselectedH = "/data/global/ui/FrontEnd/assassin/ASNU2.DC6"

View File

@ -6,20 +6,24 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
) )
// BlizzardIntro represents the Blizzard Intro screen
type BlizzardIntro struct { type BlizzardIntro struct {
videoDecoder *d2video.BinkDecoder videoDecoder *d2video.BinkDecoder
} }
// CreateBlizzardIntro creates a Blizzard Intro screen
func CreateBlizzardIntro() *BlizzardIntro { func CreateBlizzardIntro() *BlizzardIntro {
return &BlizzardIntro{} return &BlizzardIntro{}
} }
// OnLoad loads the resources for the Blizzard Intro screen
func (v *BlizzardIntro) OnLoad(loading d2screen.LoadingState) { func (v *BlizzardIntro) OnLoad(loading d2screen.LoadingState) {
videoBytes, err := d2asset.LoadFile("/data/local/video/BlizNorth640x480.bik") videoBytes, err := d2asset.LoadFile("/data/local/video/BlizNorth640x480.bik")
if err != nil { if err != nil {
loading.Error(err) loading.Error(err)
return return
} }
loading.Progress(0.5) loading.Progress(0.5)
v.videoDecoder = d2video.CreateBinkDecoder(videoBytes) v.videoDecoder = d2video.CreateBinkDecoder(videoBytes)

View File

@ -1,7 +1,6 @@
package d2gamescreen package d2gamescreen
import ( import (
"fmt"
"image/color" "image/color"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
@ -9,6 +8,8 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
"fmt"
"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/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
@ -19,6 +20,9 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2networking/d2netpacket" "github.com/OpenDiablo2/OpenDiablo2/d2networking/d2netpacket"
) )
const hideZoneTextAfterSeconds = 2.0
// Game represents the Gameplay screen
type Game struct { type Game struct {
gameClient *d2client.GameClient gameClient *d2client.GameClient
mapRenderer *d2maprenderer.MapRenderer mapRenderer *d2maprenderer.MapRenderer
@ -33,6 +37,7 @@ type Game struct {
terminal d2interface.Terminal terminal d2interface.Terminal
} }
// CreateGame creates the Gameplay screen and returns a pointer to it
func CreateGame(renderer d2interface.Renderer, audioProvider d2interface.AudioProvider, gameClient *d2client.GameClient, func CreateGame(renderer d2interface.Renderer, audioProvider d2interface.AudioProvider, gameClient *d2client.GameClient,
term d2interface.Terminal) *Game { term d2interface.Terminal) *Game {
result := &Game{ result := &Game{
@ -48,30 +53,47 @@ func CreateGame(renderer d2interface.Renderer, audioProvider d2interface.AudioPr
terminal: term, terminal: term,
} }
result.escapeMenu.onLoad() result.escapeMenu.onLoad()
_ = d2input.BindHandler(result.escapeMenu)
if err := d2input.BindHandler(result.escapeMenu); err != nil {
fmt.Println("failed to add gameplay screen as event handler")
}
return result return result
} }
// OnLoad loads the resources for the Gameplay screen
func (v *Game) OnLoad(_ d2screen.LoadingState) { func (v *Game) OnLoad(_ d2screen.LoadingState) {
v.audioProvider.PlayBGM("") v.audioProvider.PlayBGM("")
} }
// OnUnload releases the resources of Gameplay screen
func (v *Game) OnUnload() error { func (v *Game) OnUnload() error {
_ = d2input.UnbindHandler(v.gameControls) // TODO: hack if err := d2input.UnbindHandler(v.gameControls); err != nil { // TODO: hack
_ = d2input.UnbindHandler(v.escapeMenu) // TODO: hack return err
_ = v.gameClient.Close() }
if err := d2input.UnbindHandler(v.escapeMenu); err != nil { // TODO: hack
return err
}
if err := v.gameClient.Close(); err != nil {
return err
}
return nil return nil
} }
// Render renders the Gameplay screen
func (v *Game) Render(screen d2interface.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()
} }
_ = screen.Clear(color.Black) if err := screen.Clear(color.Black); err != nil {
return err
}
v.mapRenderer.Render(screen) v.mapRenderer.Render(screen)
if v.gameControls != nil { if v.gameControls != nil {
@ -81,15 +103,16 @@ func (v *Game) Render(screen d2interface.Surface) error {
return nil return nil
} }
var hideZoneTextAfterSeconds = 2.0 // Advance runs the update logic on the Gameplay screen
func (v *Game) Advance(tickTime float64) error { func (v *Game) Advance(tickTime float64) error {
if (v.escapeMenu != nil && !v.escapeMenu.isOpen) || len(v.gameClient.Players) != 1 { if (v.escapeMenu != nil && !v.escapeMenu.isOpen) || len(v.gameClient.Players) != 1 {
v.gameClient.MapEngine.Advance(tickTime) // TODO: Hack v.gameClient.MapEngine.Advance(tickTime) // TODO: Hack
} }
if v.gameControls != nil { if v.gameControls != nil {
_ = v.gameControls.Advance(tickTime) if err := v.gameControls.Advance(tickTime); err != nil {
return err
}
} }
v.ticksSinceLevelCheck += tickTime v.ticksSinceLevelCheck += tickTime
@ -116,18 +139,7 @@ func (v *Game) Advance(tickTime float64) error {
// Bind the game controls to the player once it exists // Bind the game controls to the player once it exists
if v.gameControls == nil { if v.gameControls == nil {
for _, player := range v.gameClient.Players { v.bindGameControls()
if player.Id != v.gameClient.PlayerId {
continue
}
v.localPlayer = player
v.gameControls = d2player.NewGameControls(v.renderer, player, v.gameClient.MapEngine, v.mapRenderer, v, v.terminal)
v.gameControls.Load()
_ = d2input.BindHandler(v.gameControls)
break
}
} }
// Update the camera to focus on the player // Update the camera to focus on the player
@ -139,12 +151,42 @@ func (v *Game) Advance(tickTime float64) error {
return nil return nil
} }
func (v *Game) bindGameControls() {
for _, player := range v.gameClient.Players {
if player.Id != v.gameClient.PlayerId {
continue
}
v.localPlayer = player
v.gameControls = d2player.NewGameControls(v.renderer, player, v.gameClient.MapEngine, v.mapRenderer, v, v.terminal)
v.gameControls.Load()
if err := d2input.BindHandler(v.gameControls); err != nil {
fmt.Printf("failed to add gameControls as input handler for player: %s\n", player.Id)
}
break
}
}
// OnPlayerMove sends the player move action to the server
func (v *Game) OnPlayerMove(x, y float64) { func (v *Game) OnPlayerMove(x, y float64) {
heroPosX := v.localPlayer.LocationX / 5.0 heroPosX := v.localPlayer.LocationX / 5.0
heroPosY := v.localPlayer.LocationY / 5.0 heroPosY := v.localPlayer.LocationY / 5.0
_ = v.gameClient.SendPacketToServer(d2netpacket.CreateMovePlayerPacket(v.gameClient.PlayerId, heroPosX, heroPosY, x, y))
err := v.gameClient.SendPacketToServer(d2netpacket.CreateMovePlayerPacket(v.gameClient.PlayerId, heroPosX, heroPosY, x, y))
if err != nil {
fmt.Printf("failed to send MovePlayer packet to the server, playerId: %s, x: %g, x: %g\n", v.gameClient.PlayerId, x, y)
}
} }
func (v *Game) OnPlayerCast(missleID int, targetX, targetY float64) { // OnPlayerCast sends the casting skill action to the server
_ = v.gameClient.SendPacketToServer(d2netpacket.CreateCastPacket(v.gameClient.PlayerId, missleID, targetX, targetY)) func (v *Game) OnPlayerCast(missileID int, targetX, targetY float64) {
err := v.gameClient.SendPacketToServer(d2netpacket.CreateCastPacket(v.gameClient.PlayerId, missileID, targetX, targetY))
if err != nil {
fmt.Printf(
"failed to send CastSkill packet to the server, playerId: %s, missileId: %d, x: %g, x: %g\n",
v.gameClient.PlayerId, missileID, targetX, targetY,
)
}
} }

View File

@ -1,21 +1,26 @@
package d2gamescreen package d2gamescreen
import ( import (
"fmt"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
) )
// GuiTestMain is a playground screen for the gui components
type GuiTestMain struct { type GuiTestMain struct {
renderer d2interface.Renderer renderer d2interface.Renderer
} }
// CreateGuiTestMain creates a GuiTestMain screen
func CreateGuiTestMain(renderer d2interface.Renderer) *GuiTestMain { func CreateGuiTestMain(renderer d2interface.Renderer) *GuiTestMain {
return &GuiTestMain{ return &GuiTestMain{
renderer: renderer, renderer: renderer,
} }
} }
// OnLoad loads the resources and creates the gui components
func (g *GuiTestMain) OnLoad(loading d2screen.LoadingState) { func (g *GuiTestMain) OnLoad(loading d2screen.LoadingState) {
layout := d2gui.CreateLayout(g.renderer, d2gui.PositionTypeHorizontal) layout := d2gui.CreateLayout(g.renderer, d2gui.PositionTypeHorizontal)
@ -23,34 +28,72 @@ func (g *GuiTestMain) OnLoad(loading d2screen.LoadingState) {
// //
layoutLeft := layout.AddLayout(d2gui.PositionTypeVertical) layoutLeft := layout.AddLayout(d2gui.PositionTypeVertical)
layoutLeft.SetHorizontalAlign(d2gui.HorizontalAlignCenter) layoutLeft.SetHorizontalAlign(d2gui.HorizontalAlignCenter)
_, _ = layoutLeft.AddLabel("FontStyle16Units", d2gui.FontStyle16Units)
if _, err := layoutLeft.AddLabel("FontStyle16Units", d2gui.FontStyle16Units); err != nil {
fmt.Printf("could not add label: %s to the GuiTestMain screen\n", "FontStyle16Units")
}
layoutLeft.AddSpacerStatic(0, 100) layoutLeft.AddSpacerStatic(0, 100)
_, _ = layoutLeft.AddLabel("FontStyle30Units", d2gui.FontStyle30Units)
_, _ = layoutLeft.AddLabel("FontStyle42Units", d2gui.FontStyle42Units) if _, err := layoutLeft.AddLabel("FontStyle30Units", d2gui.FontStyle30Units); err != nil {
_, _ = layoutLeft.AddLabel("FontStyleFormal10Static", d2gui.FontStyleFormal10Static) fmt.Printf("could not add label: %s to the GuiTestMain screen\n", "FontStyle30Units")
_, _ = layoutLeft.AddLabel("FontStyleFormal11Units", d2gui.FontStyleFormal11Units) }
_, _ = layoutLeft.AddLabel("FontStyleFormal12Static", d2gui.FontStyleFormal12Static)
if _, err := layoutLeft.AddLabel("FontStyle42Units", d2gui.FontStyle42Units); err != nil {
fmt.Printf("could not add label: %s to the GuiTestMain screen\n", "FontStyle42Units")
}
if _, err := layoutLeft.AddLabel("FontStyleFormal10Static", d2gui.FontStyleFormal10Static); err != nil {
fmt.Printf("could not add label: %s to the GuiTestMain screen\n", "FontStyleFormal10Static")
}
if _, err := layoutLeft.AddLabel("FontStyleFormal11Units", d2gui.FontStyleFormal11Units); err != nil {
fmt.Printf("could not add label: %s to the GuiTestMain screen\n", "FontStyleFormal11Units")
}
if _, err := layoutLeft.AddLabel("FontStyleFormal12Static", d2gui.FontStyleFormal12Static); err != nil {
fmt.Printf("could not add label: %s to the GuiTestMain screen\n", "FontStyleFormal12Static")
}
loading.Progress(0.6) loading.Progress(0.6)
layout.AddSpacerDynamic() layout.AddSpacerDynamic()
layoutRight := layout.AddLayout(d2gui.PositionTypeVertical) layoutRight := layout.AddLayout(d2gui.PositionTypeVertical)
layoutRight.SetHorizontalAlign(d2gui.HorizontalAlignRight) layoutRight.SetHorizontalAlign(d2gui.HorizontalAlignRight)
_, _ = layoutRight.AddButton("Medium", d2gui.ButtonStyleMedium)
_, _ = layoutRight.AddButton("Narrow", d2gui.ButtonStyleNarrow) if _, err := layoutRight.AddButton("Medium", d2gui.ButtonStyleMedium); err != nil {
_, _ = layoutRight.AddButton("OkCancel", d2gui.ButtonStyleOkCancel) fmt.Printf("could not add button: %s to the GuiTestMain screen\n", "Medium")
_, _ = layoutRight.AddButton("Short", d2gui.ButtonStyleShort) }
_, _ = layoutRight.AddButton("Wide", d2gui.ButtonStyleWide)
if _, err := layoutRight.AddButton("Narrow", d2gui.ButtonStyleNarrow); err != nil {
fmt.Printf("could not add button: %s to the GuiTestMain screen\n", "Narrow")
}
if _, err := layoutRight.AddButton("OkCancel", d2gui.ButtonStyleOkCancel); err != nil {
fmt.Printf("could not add button: %s to the GuiTestMain screen\n", "OkCancel")
}
if _, err := layoutRight.AddButton("Short", d2gui.ButtonStyleShort); err != nil {
fmt.Printf("could not add button: %s to the GuiTestMain screen\n", "Short")
}
if _, err := layoutRight.AddButton("Wide", d2gui.ButtonStyleWide); err != nil {
fmt.Printf("could not add button: %s to the GuiTestMain screen\n", "Wide")
}
loading.Progress(0.9) loading.Progress(0.9)
layout.SetVerticalAlign(d2gui.VerticalAlignMiddle) layout.SetVerticalAlign(d2gui.VerticalAlignMiddle)
d2gui.SetLayout(layout) d2gui.SetLayout(layout)
} }
// Render does nothing for the GuiTestMain screen
func (g *GuiTestMain) Render(_ d2interface.Surface) error { func (g *GuiTestMain) Render(_ d2interface.Surface) error {
return nil return nil
} }
// Advance does nothing for the GuiTestMain screen
func (g *GuiTestMain) Advance(_ float64) error { func (g *GuiTestMain) Advance(_ float64) error {
return nil return nil
} }

View File

@ -1,3 +1,4 @@
// Package d2gamescreen contains the screens
package d2gamescreen package d2gamescreen
import ( import (

View File

@ -79,6 +79,7 @@ var regions = []regionSpec{
{d2enum.RegionAct5Lava, 1053, 1058, []int{}}, {d2enum.RegionAct5Lava, 1053, 1058, []int{}},
} }
// MapEngineTest represents the MapEngineTest screen
type MapEngineTest struct { type MapEngineTest struct {
gameState *d2player.PlayerState gameState *d2player.PlayerState
mapEngine *d2mapengine.MapEngine mapEngine *d2mapengine.MapEngine
@ -111,34 +112,36 @@ func CreateMapEngineTest(currentRegion, levelPreset int, term d2interface.Termin
return result return result
} }
func (met *MapEngineTest) loadRegionByIndex(n int, levelPreset, fileIndex int) { func (met *MapEngineTest) loadRegionByIndex(n, levelPreset, fileIndex int) {
log.Printf("Loaded region: Type(%d) LevelPreset(%d) FileIndex(%d)", n, levelPreset, fileIndex) log.Printf("Loaded region: Type(%d) LevelPreset(%d) FileIndex(%d)", n, levelPreset, fileIndex)
d2maprenderer.InvalidateImageCache() d2maprenderer.InvalidateImageCache()
for _, spec := range regions { for _, spec := range regions {
if spec.regionType == d2enum.RegionIdType(n) { if spec.regionType != d2enum.RegionIdType(n) {
met.regionSpec = spec continue
inExtra := false
for _, e := range spec.extra {
if e == levelPreset {
inExtra = true
break
}
}
if !inExtra {
if levelPreset < spec.startPresetIndex {
levelPreset = spec.startPresetIndex
}
if levelPreset > spec.endPresetIndex {
levelPreset = spec.endPresetIndex
}
}
met.levelPreset = levelPreset
} }
met.regionSpec = spec
inExtra := false
for _, e := range spec.extra {
if e == levelPreset {
inExtra = true
break
}
}
if !inExtra {
if levelPreset < spec.startPresetIndex {
levelPreset = spec.startPresetIndex
}
if levelPreset > spec.endPresetIndex {
levelPreset = spec.endPresetIndex
}
}
met.levelPreset = levelPreset
} }
if n == 0 { if n == 0 {
@ -186,99 +189,98 @@ func (met *MapEngineTest) OnUnload() error {
func (met *MapEngineTest) Render(screen d2interface.Surface) error { func (met *MapEngineTest) Render(screen d2interface.Surface) error {
met.mapRenderer.Render(screen) met.mapRenderer.Render(screen)
// // levelFilesToPick := make([]string, 0)
//levelFilesToPick := make([]string, 0) // fileIndex := met.fileIndex
//fileIndex := met.fileIndex // levelPreset := curRegion.LevelPreset()
//levelPreset := curRegion.LevelPreset() // regionPath := curRegion.RegionPath()
//regionPath := curRegion.RegionPath() // for n, fileRecord := range levelPreset.Files {
//for n, fileRecord := range levelPreset.Files { // if len(fileRecord) == 0 || fileRecord == "" || fileRecord == "0" {
// if len(fileRecord) == 0 || fileRecord == "" || fileRecord == "0" { // continue
// continue // }
// } // levelFilesToPick = append(levelFilesToPick, fileRecord)
// levelFilesToPick = append(levelFilesToPick, fileRecord) // if fileRecord == regionPath {
// if fileRecord == regionPath { // fileIndex = n
// fileIndex = n // }
// } // }
//} // if met.fileIndex == -1 {
//if met.fileIndex == -1 { // met.fileIndex = fileIndex
// met.fileIndex = fileIndex // }
//} // met.filesCount = len(levelFilesToPick)
//met.filesCount = len(levelFilesToPick)
// //
// //
//regionWidth, regionHeight := curRegion.GetTileSize() // regionWidth, regionHeight := curRegion.GetTileSize()
//if tileX >= 0 && tileY >= 0 && tileX < regionWidth && tileY < regionHeight { // if tileX >= 0 && tileY >= 0 && tileX < regionWidth && tileY < regionHeight {
// tile := curRegion.Tile(tileX, tileY) // tile := curRegion.Tile(tileX, tileY)
// screen.PushTranslation(5, 5) // screen.PushTranslation(5, 5)
// screen.DrawText("%d, %d (Tile %d.%d, %d.%d)", screenX, screenY, tileX, subtileX, tileY, subtileY) // screen.DrawText("%d, %d (Tile %d.%d, %d.%d)", screenX, screenY, tileX, subtileX, tileY, subtileY)
// screen.PushTranslation(0, 16) // screen.PushTranslation(0, 16)
// screen.DrawText("Map: " + curRegion.LevelType().Name) // screen.DrawText("Map: " + curRegion.LevelType().Name)
// screen.PushTranslation(0, 16) // screen.PushTranslation(0, 16)
// screen.DrawText("%v: %v/%v [%v, %v]", regionPath, fileIndex+1, met.filesCount, met.currentRegion, met.levelPreset) // screen.DrawText("%v: %v/%v [%v, %v]", regionPath, fileIndex+1, met.filesCount, met.currentRegion, met.levelPreset)
// screen.PushTranslation(0, 16) // screen.PushTranslation(0, 16)
// screen.DrawText("N - next region, P - previous region") // screen.DrawText("N - next region, P - previous region")
// screen.PushTranslation(0, 16) // screen.PushTranslation(0, 16)
// screen.DrawText("Shift+N - next preset, Shift+P - previous preset") // screen.DrawText("Shift+N - next preset, Shift+P - previous preset")
// screen.PushTranslation(0, 16) // screen.PushTranslation(0, 16)
// screen.DrawText("Ctrl+N - next file, Ctrl+P - previous file") // screen.DrawText("Ctrl+N - next file, Ctrl+P - previous file")
// screen.PushTranslation(0, 16) // screen.PushTranslation(0, 16)
// popN := 7 // popN := 7
// if len(tile.Floors) > 0 { // if len(tile.Floors) > 0 {
// screen.PushTranslation(0, 16) // screen.PushTranslation(0, 16)
// screen.DrawText("Floors:") // screen.DrawText("Floors:")
// screen.PushTranslation(16, 0) // screen.PushTranslation(16, 0)
// for idx, floor := range tile.Floors { // for idx, floor := range tile.Floors {
// popN++ // popN++
// screen.PushTranslation(0, 16) // screen.PushTranslation(0, 16)
// tileData := curRegion.TileData(int32(floor.Style), int32(floor.Sequence), d2enum.Floor) // tileData := curRegion.TileData(int32(floor.Style), int32(floor.Sequence), d2enum.Floor)
// tileSubAttrs := d2dt1.SubTileFlags{} // tileSubAttrs := d2dt1.SubTileFlags{}
// if tileData != nil { // if tileData != nil {
// tileSubAttrs = *tileData.GetSubTileFlags(subtileX, subtileY) // tileSubAttrs = *tileData.GetSubTileFlags(subtileX, subtileY)
// } // }
// screen.DrawText("Floor %v: [ANI:%t] %s", idx, floor.Animated, tileSubAttrs.DebugString()) // screen.DrawText("Floor %v: [ANI:%t] %s", idx, floor.Animated, tileSubAttrs.DebugString())
// //
// } // }
// screen.PushTranslation(-16, 0) // screen.PushTranslation(-16, 0)
// popN += 3 // popN += 3
// } // }
// if len(tile.Walls) > 0 { // if len(tile.Walls) > 0 {
// screen.PushTranslation(0, 16) // screen.PushTranslation(0, 16)
// screen.DrawText("Walls:") // screen.DrawText("Walls:")
// screen.PushTranslation(16, 0) // screen.PushTranslation(16, 0)
// for idx, wall := range tile.Walls { // for idx, wall := range tile.Walls {
// popN++ // popN++
// screen.PushTranslation(0, 16) // screen.PushTranslation(0, 16)
// tileData := curRegion.TileData(int32(wall.Style), int32(wall.Sequence), d2enum.Floor) // tileData := curRegion.TileData(int32(wall.Style), int32(wall.Sequence), d2enum.Floor)
// tileSubAttrs := d2dt1.SubTileFlags{} // tileSubAttrs := d2dt1.SubTileFlags{}
// if tileData != nil { // if tileData != nil {
// tileSubAttrs = *tileData.GetSubTileFlags(subtileX, subtileY) // tileSubAttrs = *tileData.GetSubTileFlags(subtileX, subtileY)
// } // }
// screen.DrawText("Wall %v: [HID:%t] %s", idx, wall.Hidden, tileSubAttrs.DebugString()) // screen.DrawText("Wall %v: [HID:%t] %s", idx, wall.Hidden, tileSubAttrs.DebugString())
// //
// } // }
// screen.PushTranslation(-16, 0) // screen.PushTranslation(-16, 0)
// popN += 3 // popN += 3
// } // }
// if len(tile.Walls) > 0 { // if len(tile.Walls) > 0 {
// screen.PushTranslation(0, 16) // screen.PushTranslation(0, 16)
// screen.DrawText("Shadows:") // screen.DrawText("Shadows:")
// screen.PushTranslation(16, 0) // screen.PushTranslation(16, 0)
// for idx, shadow := range tile.Shadows { // for idx, shadow := range tile.Shadows {
// popN++ // popN++
// screen.PushTranslation(0, 16) // screen.PushTranslation(0, 16)
// tileData := curRegion.TileData(int32(shadow.Style), int32(shadow.Sequence), d2enum.Floor) // tileData := curRegion.TileData(int32(shadow.Style), int32(shadow.Sequence), d2enum.Floor)
// tileSubAttrs := d2dt1.SubTileFlags{} // tileSubAttrs := d2dt1.SubTileFlags{}
// if tileData != nil { // if tileData != nil {
// tileSubAttrs = *tileData.GetSubTileFlags(subtileX, subtileY) // tileSubAttrs = *tileData.GetSubTileFlags(subtileX, subtileY)
// } // }
// screen.DrawText("Wall %v: [HID:%t] %s", idx, shadow.Hidden, tileSubAttrs.DebugString()) // screen.DrawText("Wall %v: [HID:%t] %s", idx, shadow.Hidden, tileSubAttrs.DebugString())
// //
// } // }
// screen.PushTranslation(-16, 0) // screen.PushTranslation(-16, 0)
// popN += 3 // popN += 3
// } // }
// screen.PopN(popN) // screen.PopN(popN)
//} // }
return nil return nil
} }

View File

@ -1,6 +1,7 @@
package d2gamescreen package d2gamescreen
import ( import (
"fmt"
"image" "image"
"image/color" "image/color"
@ -21,6 +22,120 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
) )
type heroRenderConfig struct {
idleAnimationPath string
idleSelectedAnimationPath string
forwardWalkAnimationPath string
forwardWalkOverlayAnimationPath string
forwardWalkOverlayBlend bool
selectedAnimationPath string
selectedOverlayAnimationPath string
backWalkAnimationPath string
backWalkOverlayAnimationPath string
selectionBounds image.Rectangle
selectSfx string
deselectSfx string
position image.Point
idlePlayLengthMs int
forwardWalkPlayLengthMs int
backWalkPlayLengthMs int
}
func getHeroRenderConfiguration() map[d2enum.Hero]*heroRenderConfig {
return map[d2enum.Hero]*heroRenderConfig{
d2enum.HeroBarbarian: createHeroRenderConfig(
d2resource.CharacterSelectBarbarianUnselected, d2resource.CharacterSelectBarbarianUnselectedH,
d2resource.CharacterSelectBarbarianForwardWalk, d2resource.CharacterSelectBarbarianForwardWalkOverlay,
false, d2resource.CharacterSelectBarbarianSelected, "",
d2resource.CharacterSelectBarbarianBackWalk, "",
image.Rectangle{Min: image.Point{X: 364, Y: 201}, Max: image.Point{X: 90, Y: 170}},
d2resource.SFXBarbarianSelect, d2resource.SFXBarbarianDeselect, image.Point{X: 400, Y: 330},
0, 2500, 1000,
),
d2enum.HeroSorceress: createHeroRenderConfig(
d2resource.CharacterSelectSorceressUnselected, d2resource.CharacterSelectSorceressUnselectedH,
d2resource.CharacterSelectSorceressForwardWalk, d2resource.CharacterSelectSorceressForwardWalkOverlay,
true, d2resource.CharacterSelectSorceressSelected, d2resource.CharacterSelectSorceressSelectedOverlay,
d2resource.CharacterSelectSorceressBackWalk, d2resource.CharacterSelectSorceressBackWalkOverlay,
image.Rectangle{Min: image.Point{X: 580, Y: 240}, Max: image.Point{X: 65, Y: 160}},
d2resource.SFXSorceressSelect, d2resource.SFXSorceressDeselect, image.Point{X: 626, Y: 352},
2500, 2300, 1200,
),
d2enum.HeroNecromancer: createHeroRenderConfig(
d2resource.CharacterSelectNecromancerUnselected, d2resource.CharacterSelectNecromancerUnselectedH,
d2resource.CharacterSelectNecromancerForwardWalk, d2resource.CharacterSelectNecromancerForwardWalkOverlay,
true, d2resource.CharacterSelectNecromancerSelected, d2resource.CharacterSelectNecromancerSelectedOverlay,
d2resource.CharacterSelectNecromancerBackWalk, d2resource.CharacterSelectNecromancerBackWalkOverlay,
image.Rectangle{Min: image.Point{X: 265, Y: 220}, Max: image.Point{X: 55, Y: 175}},
d2resource.SFXNecromancerSelect, d2resource.SFXNecromancerDeselect, image.Point{X: 300, Y: 335},
1200, 2000, 1500,
),
d2enum.HeroPaladin: createHeroRenderConfig(
d2resource.CharacterSelectPaladinUnselected, d2resource.CharacterSelectPaladinUnselectedH,
d2resource.CharacterSelectPaladinForwardWalk, d2resource.CharacterSelectPaladinForwardWalkOverlay,
false, d2resource.CharacterSelectPaladinSelected, "",
d2resource.CharacterSelectPaladinBackWalk, "",
image.Rectangle{Min: image.Point{X: 490, Y: 210}, Max: image.Point{X: 65, Y: 180}},
d2resource.SFXPaladinSelect, d2resource.SFXPaladinDeselect, image.Point{X: 521, Y: 338},
2500, 3400, 1300,
),
d2enum.HeroAmazon: createHeroRenderConfig(
d2resource.CharacterSelectAmazonUnselected, d2resource.CharacterSelectAmazonUnselectedH,
d2resource.CharacterSelectAmazonForwardWalk, "",
false, d2resource.CharacterSelectAmazonSelected, "",
d2resource.CharacterSelectAmazonBackWalk, "",
image.Rectangle{Min: image.Point{X: 70, Y: 220}, Max: image.Point{X: 55, Y: 200}},
d2resource.SFXAmazonSelect, d2resource.SFXAmazonDeselect, image.Point{X: 100, Y: 339},
2500, 2200, 1500,
),
d2enum.HeroAssassin: createHeroRenderConfig(
d2resource.CharacterSelectAssassinUnselected, d2resource.CharacterSelectAssassinUnselectedH,
d2resource.CharacterSelectAssassinForwardWalk, "",
false, d2resource.CharacterSelectAssassinSelected, "",
d2resource.CharacterSelectAssassinBackWalk, "",
image.Rectangle{Min: image.Point{X: 175, Y: 235}, Max: image.Point{X: 50, Y: 180}},
d2resource.SFXAssassinSelect, d2resource.SFXAssassinDeselect, image.Point{X: 231, Y: 365},
2500, 3800, 1500,
),
d2enum.HeroDruid: createHeroRenderConfig(
d2resource.CharacterSelectDruidUnselected, d2resource.CharacterSelectDruidUnselectedH,
d2resource.CharacterSelectDruidForwardWalk, "",
false, d2resource.CharacterSelectDruidSelected, "",
d2resource.CharacterSelectDruidBackWalk, "",
image.Rectangle{Min: image.Point{X: 680, Y: 220}, Max: image.Point{X: 70, Y: 195}},
d2resource.SFXDruidSelect, d2resource.SFXDruidDeselect, image.Point{X: 720, Y: 370},
1500, 4800, 1500,
),
}
}
func createHeroRenderConfig(idleAnimationPath, idleSelectedAnimationPath, forwardWalkAnimationPath,
forwardWalkOverlayAnimationPath string, forwardWalkOverlayBlend bool, selectedAnimationPath,
selectedOverlayAnimationPath, backWalkAnimationPath, backWalkOverlayAnimationPath string,
selectionBounds image.Rectangle, selectSfx, deselectSfx string, position image.Point,
idlePlayLengthMs, forwardWalkPlayLengthMs, backWalkPlayLengthMs int,
) *heroRenderConfig {
return &heroRenderConfig{
idleAnimationPath: idleAnimationPath,
idleSelectedAnimationPath: idleSelectedAnimationPath,
forwardWalkAnimationPath: forwardWalkAnimationPath,
forwardWalkOverlayAnimationPath: forwardWalkOverlayAnimationPath,
forwardWalkOverlayBlend: forwardWalkOverlayBlend,
selectedAnimationPath: selectedAnimationPath,
selectedOverlayAnimationPath: selectedOverlayAnimationPath,
backWalkAnimationPath: backWalkAnimationPath,
backWalkOverlayAnimationPath: backWalkOverlayAnimationPath,
selectionBounds: selectionBounds,
selectSfx: selectSfx,
deselectSfx: deselectSfx,
position: position,
idlePlayLengthMs: idlePlayLengthMs,
forwardWalkPlayLengthMs: forwardWalkPlayLengthMs,
backWalkPlayLengthMs: backWalkPlayLengthMs,
}
}
// HeroRenderInfo stores the rendering information of a hero for the Select Hero Class screen
type HeroRenderInfo struct { type HeroRenderInfo struct {
Stance d2enum.HeroStance Stance d2enum.HeroStance
IdleSprite *d2ui.Sprite IdleSprite *d2ui.Sprite
@ -36,7 +151,7 @@ type HeroRenderInfo struct {
DeselectSfx d2interface.SoundEffect DeselectSfx d2interface.SoundEffect
} }
func (hri *HeroRenderInfo) Advance(elapsed float64) { func (hri *HeroRenderInfo) advance(elapsed float64) {
advanceSprite(hri.IdleSprite, elapsed) advanceSprite(hri.IdleSprite, elapsed)
advanceSprite(hri.IdleSelectedSprite, elapsed) advanceSprite(hri.IdleSelectedSprite, elapsed)
advanceSprite(hri.ForwardWalkSprite, elapsed) advanceSprite(hri.ForwardWalkSprite, elapsed)
@ -47,6 +162,7 @@ func (hri *HeroRenderInfo) Advance(elapsed float64) {
advanceSprite(hri.BackWalkSpriteOverlay, elapsed) advanceSprite(hri.BackWalkSpriteOverlay, elapsed)
} }
// SelectHeroClass represents the Select Hero Class screen
type SelectHeroClass struct { type SelectHeroClass struct {
bgImage *d2ui.Sprite bgImage *d2ui.Sprite
campfire *d2ui.Sprite campfire *d2ui.Sprite
@ -72,6 +188,7 @@ type SelectHeroClass struct {
renderer d2interface.Renderer renderer d2interface.Renderer
} }
// CreateSelectHeroClass creates an instance of a SelectHeroClass
func CreateSelectHeroClass( func CreateSelectHeroClass(
renderer d2interface.Renderer, renderer d2interface.Renderer,
audioProvider d2interface.AudioProvider, audioProvider d2interface.AudioProvider,
@ -92,13 +209,51 @@ func CreateSelectHeroClass(
return result return result
} }
// OnLoad loads the resources for the Select Hero Class screen
func (v *SelectHeroClass) OnLoad(loading d2screen.LoadingState) { func (v *SelectHeroClass) OnLoad(loading d2screen.LoadingState) {
v.audioProvider.PlayBGM(d2resource.BGMTitle) v.audioProvider.PlayBGM(d2resource.BGMTitle)
loading.Progress(0.1) loading.Progress(0.1)
v.bgImage = loadSprite(d2resource.CharacterSelectBackground, d2resource.PaletteFechar) v.bgImage = loadSprite(d2resource.CharacterSelectBackground, image.Point{X: 0, Y: 0}, 0, true, false)
v.bgImage.SetPosition(0, 0)
loading.Progress(0.3)
v.createLabels()
loading.Progress(0.4)
v.createButtons()
v.campfire = loadSprite(d2resource.CharacterSelectCampfire, image.Point{X: 380, Y: 335}, 0, true, true)
v.createCheckboxes(v.renderer)
loading.Progress(0.5)
for hero, config := range getHeroRenderConfiguration() {
position := config.position
forwardWalkOverlaySprite := loadSprite(
config.forwardWalkOverlayAnimationPath,
position,
config.forwardWalkPlayLengthMs,
false,
config.forwardWalkOverlayBlend,
)
v.heroRenderInfo[hero] = &HeroRenderInfo{
Stance: d2enum.HeroStanceIdle,
IdleSprite: loadSprite(config.idleAnimationPath, position, config.idlePlayLengthMs, true, false),
IdleSelectedSprite: loadSprite(config.idleSelectedAnimationPath, position, config.idlePlayLengthMs, true, false),
ForwardWalkSprite: loadSprite(config.forwardWalkAnimationPath, position, config.forwardWalkPlayLengthMs, false, false),
ForwardWalkSpriteOverlay: forwardWalkOverlaySprite,
SelectedSprite: loadSprite(config.selectedAnimationPath, position, config.idlePlayLengthMs, true, false),
SelectedSpriteOverlay: loadSprite(config.selectedOverlayAnimationPath, position, config.idlePlayLengthMs, true, true),
BackWalkSprite: loadSprite(config.backWalkAnimationPath, position, config.backWalkPlayLengthMs, false, false),
BackWalkSpriteOverlay: loadSprite(config.backWalkOverlayAnimationPath, position, config.backWalkPlayLengthMs, false, true),
SelectionBounds: config.selectionBounds,
SelectSfx: v.loadSoundEffect(config.selectSfx),
DeselectSfx: v.loadSoundEffect(config.deselectSfx),
}
}
}
func (v *SelectHeroClass) createLabels() {
v.headingLabel = d2ui.CreateLabel(v.renderer, d2resource.Font30, d2resource.PaletteUnits) v.headingLabel = d2ui.CreateLabel(v.renderer, d2resource.Font30, d2resource.PaletteUnits)
fontWidth, _ := v.headingLabel.GetSize() fontWidth, _ := v.headingLabel.GetSize()
v.headingLabel.SetPosition(400-fontWidth/2, 17) v.headingLabel.SetPosition(400-fontWidth/2, 17)
@ -112,7 +267,6 @@ func (v *SelectHeroClass) OnLoad(loading d2screen.LoadingState) {
v.heroDesc1Label = d2ui.CreateLabel(v.renderer, d2resource.Font16, d2resource.PaletteUnits) v.heroDesc1Label = d2ui.CreateLabel(v.renderer, d2resource.Font16, d2resource.PaletteUnits)
v.heroDesc1Label.Alignment = d2ui.LabelAlignCenter v.heroDesc1Label.Alignment = d2ui.LabelAlignCenter
v.heroDesc1Label.SetPosition(400, 100) v.heroDesc1Label.SetPosition(400, 100)
loading.Progress(0.3)
v.heroDesc2Label = d2ui.CreateLabel(v.renderer, d2resource.Font16, d2resource.PaletteUnits) v.heroDesc2Label = d2ui.CreateLabel(v.renderer, d2resource.Font16, d2resource.PaletteUnits)
v.heroDesc2Label.Alignment = d2ui.LabelAlignCenter v.heroDesc2Label.Alignment = d2ui.LabelAlignCenter
@ -122,11 +276,26 @@ func (v *SelectHeroClass) OnLoad(loading d2screen.LoadingState) {
v.heroDesc3Label.Alignment = d2ui.LabelAlignCenter v.heroDesc3Label.Alignment = d2ui.LabelAlignCenter
v.heroDesc3Label.SetPosition(400, 130) v.heroDesc3Label.SetPosition(400, 130)
v.campfire = loadSprite(d2resource.CharacterSelectCampfire, d2resource.PaletteFechar) v.heroNameLabel = d2ui.CreateLabel(v.renderer, d2resource.Font16, d2resource.PaletteUnits)
v.campfire.SetPosition(380, 335) v.heroNameLabel.Alignment = d2ui.LabelAlignLeft
v.campfire.PlayForward() v.heroNameLabel.Color = color.RGBA{R: 216, G: 196, B: 128, A: 255}
v.campfire.SetBlend(true) v.heroNameLabel.SetText("Character Name")
v.heroNameLabel.SetPosition(321, 475)
v.expansionCharLabel = d2ui.CreateLabel(v.renderer, d2resource.Font16, d2resource.PaletteUnits)
v.expansionCharLabel.Alignment = d2ui.LabelAlignLeft
v.expansionCharLabel.Color = color.RGBA{R: 216, G: 196, B: 128, A: 255}
v.expansionCharLabel.SetText("EXPANSION CHARACTER")
v.expansionCharLabel.SetPosition(339, 526)
v.hardcoreCharLabel = d2ui.CreateLabel(v.renderer, d2resource.Font16, d2resource.PaletteUnits)
v.hardcoreCharLabel.Alignment = d2ui.LabelAlignLeft
v.hardcoreCharLabel.Color = color.RGBA{R: 216, G: 196, B: 128, A: 255}
v.hardcoreCharLabel.SetText("Hardcore")
v.hardcoreCharLabel.SetPosition(339, 548)
}
func (v *SelectHeroClass) createButtons() {
v.exitButton = d2ui.CreateButton(v.renderer, d2ui.ButtonTypeMedium, "EXIT") v.exitButton = d2ui.CreateButton(v.renderer, d2ui.ButtonTypeMedium, "EXIT")
v.exitButton.SetPosition(33, 537) v.exitButton.SetPosition(33, 537)
v.exitButton.OnActivated(func() { v.onExitButtonClicked() }) v.exitButton.OnActivated(func() { v.onExitButtonClicked() })
@ -138,15 +307,10 @@ func (v *SelectHeroClass) OnLoad(loading d2screen.LoadingState) {
v.okButton.SetVisible(false) v.okButton.SetVisible(false)
v.okButton.SetEnabled(false) v.okButton.SetEnabled(false)
d2ui.AddWidget(&v.okButton) d2ui.AddWidget(&v.okButton)
}
v.heroNameLabel = d2ui.CreateLabel(v.renderer, d2resource.Font16, d2resource.PaletteUnits) func (v *SelectHeroClass) createCheckboxes(renderer d2interface.Renderer) {
v.heroNameLabel.Alignment = d2ui.LabelAlignLeft v.heroNameTextbox = d2ui.CreateTextbox(renderer)
v.heroNameLabel.Color = color.RGBA{R: 216, G: 196, B: 128, A: 255}
v.heroNameLabel.SetText("Character Name")
v.heroNameLabel.SetPosition(321, 475)
loading.Progress(0.4)
v.heroNameTextbox = d2ui.CreateTextbox(v.renderer)
v.heroNameTextbox.SetPosition(318, 493) v.heroNameTextbox.SetPosition(318, 493)
v.heroNameTextbox.SetVisible(false) v.heroNameTextbox.SetVisible(false)
d2ui.AddWidget(&v.heroNameTextbox) d2ui.AddWidget(&v.heroNameTextbox)
@ -156,289 +320,21 @@ func (v *SelectHeroClass) OnLoad(loading d2screen.LoadingState) {
v.expansionCheckbox.SetVisible(false) v.expansionCheckbox.SetVisible(false)
d2ui.AddWidget(&v.expansionCheckbox) d2ui.AddWidget(&v.expansionCheckbox)
v.expansionCharLabel = d2ui.CreateLabel(v.renderer, d2resource.Font16, d2resource.PaletteUnits) v.hardcoreCheckbox = d2ui.CreateCheckbox(renderer, false)
v.expansionCharLabel.Alignment = d2ui.LabelAlignLeft
v.expansionCharLabel.Color = color.RGBA{R: 216, G: 196, B: 128, A: 255}
v.expansionCharLabel.SetText("EXPANSION CHARACTER")
v.expansionCharLabel.SetPosition(339, 526)
v.hardcoreCheckbox = d2ui.CreateCheckbox(v.renderer, false)
v.hardcoreCheckbox.SetPosition(318, 548) v.hardcoreCheckbox.SetPosition(318, 548)
v.hardcoreCheckbox.SetVisible(false) v.hardcoreCheckbox.SetVisible(false)
d2ui.AddWidget(&v.hardcoreCheckbox) d2ui.AddWidget(&v.hardcoreCheckbox)
v.hardcoreCharLabel = d2ui.CreateLabel(v.renderer, d2resource.Font16, d2resource.PaletteUnits)
v.hardcoreCharLabel.Alignment = d2ui.LabelAlignLeft
v.hardcoreCharLabel.Color = color.RGBA{R: 216, G: 196, B: 128, A: 255}
v.hardcoreCharLabel.SetText("Hardcore")
v.hardcoreCharLabel.SetPosition(339, 548)
loading.Progress(0.5)
v.heroRenderInfo[d2enum.HeroBarbarian] = &HeroRenderInfo{
d2enum.HeroStanceIdle,
loadSprite(d2resource.CharacterSelectBarbarianUnselected, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelectBarbarianUnselectedH, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelectBarbarianForwardWalk, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelectBarbarianForwardWalkOverlay, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelectBarbarianSelected, d2resource.PaletteFechar),
nil,
loadSprite(d2resource.CharacterSelectBarbarianBackWalk, d2resource.PaletteFechar),
nil,
image.Rectangle{Min: image.Point{X: 364, Y: 201}, Max: image.Point{X: 90, Y: 170}},
v.loadSoundEffect(d2resource.SFXBarbarianSelect),
v.loadSoundEffect(d2resource.SFXBarbarianDeselect),
}
v.heroRenderInfo[d2enum.HeroBarbarian].IdleSprite.SetPosition(400, 330)
v.heroRenderInfo[d2enum.HeroBarbarian].IdleSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroBarbarian].IdleSelectedSprite.SetPosition(400, 330)
v.heroRenderInfo[d2enum.HeroBarbarian].IdleSelectedSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroBarbarian].ForwardWalkSprite.SetPosition(400, 330)
v.heroRenderInfo[d2enum.HeroBarbarian].ForwardWalkSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroBarbarian].ForwardWalkSprite.SetPlayLengthMs(2500)
v.heroRenderInfo[d2enum.HeroBarbarian].ForwardWalkSprite.SetPlayLoop(false)
v.heroRenderInfo[d2enum.HeroBarbarian].ForwardWalkSpriteOverlay.SetPosition(400, 330)
v.heroRenderInfo[d2enum.HeroBarbarian].ForwardWalkSpriteOverlay.PlayForward()
v.heroRenderInfo[d2enum.HeroBarbarian].ForwardWalkSpriteOverlay.SetPlayLengthMs(2500)
v.heroRenderInfo[d2enum.HeroBarbarian].ForwardWalkSpriteOverlay.SetPlayLoop(false)
v.heroRenderInfo[d2enum.HeroBarbarian].SelectedSprite.SetPosition(400, 330)
v.heroRenderInfo[d2enum.HeroBarbarian].SelectedSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroBarbarian].BackWalkSprite.SetPosition(400, 330)
v.heroRenderInfo[d2enum.HeroBarbarian].BackWalkSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroBarbarian].BackWalkSprite.SetPlayLengthMs(1000)
v.heroRenderInfo[d2enum.HeroBarbarian].BackWalkSprite.SetPlayLoop(false)
v.heroRenderInfo[d2enum.HeroSorceress] = &HeroRenderInfo{
d2enum.HeroStanceIdle,
loadSprite(d2resource.CharacterSelecSorceressUnselected, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelecSorceressUnselectedH, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelecSorceressForwardWalk, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelecSorceressForwardWalkOverlay, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelecSorceressSelected, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelecSorceressSelectedOverlay, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelecSorceressBackWalk, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelecSorceressBackWalkOverlay, d2resource.PaletteFechar),
image.Rectangle{Min: image.Point{X: 580, Y: 240}, Max: image.Point{X: 65, Y: 160}},
v.loadSoundEffect(d2resource.SFXSorceressSelect),
v.loadSoundEffect(d2resource.SFXSorceressDeselect),
}
v.heroRenderInfo[d2enum.HeroSorceress].IdleSprite.SetPosition(626, 352)
v.heroRenderInfo[d2enum.HeroSorceress].IdleSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroSorceress].IdleSprite.SetPlayLengthMs(2500)
v.heroRenderInfo[d2enum.HeroSorceress].IdleSelectedSprite.SetPosition(626, 352)
v.heroRenderInfo[d2enum.HeroSorceress].IdleSelectedSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroSorceress].IdleSelectedSprite.SetPlayLengthMs(2500)
v.heroRenderInfo[d2enum.HeroSorceress].ForwardWalkSprite.SetPosition(626, 352)
v.heroRenderInfo[d2enum.HeroSorceress].ForwardWalkSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroSorceress].ForwardWalkSprite.SetPlayLengthMs(2300)
v.heroRenderInfo[d2enum.HeroSorceress].ForwardWalkSprite.SetPlayLoop(false)
v.heroRenderInfo[d2enum.HeroSorceress].ForwardWalkSpriteOverlay.SetBlend(true)
v.heroRenderInfo[d2enum.HeroSorceress].ForwardWalkSpriteOverlay.SetPosition(626, 352)
v.heroRenderInfo[d2enum.HeroSorceress].ForwardWalkSpriteOverlay.PlayForward()
v.heroRenderInfo[d2enum.HeroSorceress].ForwardWalkSpriteOverlay.SetPlayLengthMs(2300)
v.heroRenderInfo[d2enum.HeroSorceress].ForwardWalkSpriteOverlay.SetPlayLoop(false)
v.heroRenderInfo[d2enum.HeroSorceress].SelectedSprite.SetPosition(626, 352)
v.heroRenderInfo[d2enum.HeroSorceress].SelectedSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroSorceress].SelectedSprite.SetPlayLengthMs(450)
v.heroRenderInfo[d2enum.HeroSorceress].SelectedSpriteOverlay.SetBlend(true)
v.heroRenderInfo[d2enum.HeroSorceress].SelectedSpriteOverlay.SetPosition(626, 352)
v.heroRenderInfo[d2enum.HeroSorceress].SelectedSpriteOverlay.PlayForward()
v.heroRenderInfo[d2enum.HeroSorceress].SelectedSpriteOverlay.SetPlayLengthMs(450)
v.heroRenderInfo[d2enum.HeroSorceress].BackWalkSprite.SetPosition(626, 352)
v.heroRenderInfo[d2enum.HeroSorceress].BackWalkSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroSorceress].BackWalkSprite.SetPlayLengthMs(1200)
v.heroRenderInfo[d2enum.HeroSorceress].BackWalkSprite.SetPlayLoop(false)
v.heroRenderInfo[d2enum.HeroSorceress].BackWalkSpriteOverlay.SetBlend(true)
v.heroRenderInfo[d2enum.HeroSorceress].BackWalkSpriteOverlay.SetPosition(626, 352)
v.heroRenderInfo[d2enum.HeroSorceress].BackWalkSpriteOverlay.PlayForward()
v.heroRenderInfo[d2enum.HeroSorceress].BackWalkSpriteOverlay.SetPlayLengthMs(1200)
v.heroRenderInfo[d2enum.HeroSorceress].BackWalkSpriteOverlay.SetPlayLoop(false)
loading.Progress(0.6)
v.heroRenderInfo[d2enum.HeroNecromancer] = &HeroRenderInfo{
d2enum.HeroStanceIdle,
loadSprite(d2resource.CharacterSelectNecromancerUnselected, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelectNecromancerUnselectedH, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelecNecromancerForwardWalk, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelecNecromancerForwardWalkOverlay, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelecNecromancerSelected, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelecNecromancerSelectedOverlay, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelecNecromancerBackWalk, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelecNecromancerBackWalkOverlay, d2resource.PaletteFechar),
image.Rectangle{Min: image.Point{X: 265, Y: 220}, Max: image.Point{X: 55, Y: 175}},
v.loadSoundEffect(d2resource.SFXNecromancerSelect),
v.loadSoundEffect(d2resource.SFXNecromancerDeselect),
}
v.heroRenderInfo[d2enum.HeroNecromancer].IdleSprite.SetPosition(300, 335)
v.heroRenderInfo[d2enum.HeroNecromancer].IdleSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroNecromancer].IdleSprite.SetPlayLengthMs(1200)
v.heroRenderInfo[d2enum.HeroNecromancer].IdleSelectedSprite.SetPosition(300, 335)
v.heroRenderInfo[d2enum.HeroNecromancer].IdleSelectedSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroNecromancer].IdleSelectedSprite.SetPlayLengthMs(1200)
v.heroRenderInfo[d2enum.HeroNecromancer].ForwardWalkSprite.SetPosition(300, 335)
v.heroRenderInfo[d2enum.HeroNecromancer].ForwardWalkSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroNecromancer].ForwardWalkSprite.SetPlayLengthMs(2000)
v.heroRenderInfo[d2enum.HeroNecromancer].ForwardWalkSprite.SetPlayLoop(false)
v.heroRenderInfo[d2enum.HeroNecromancer].ForwardWalkSpriteOverlay.SetBlend(true)
v.heroRenderInfo[d2enum.HeroNecromancer].ForwardWalkSpriteOverlay.SetPosition(300, 335)
v.heroRenderInfo[d2enum.HeroNecromancer].ForwardWalkSpriteOverlay.PlayForward()
v.heroRenderInfo[d2enum.HeroNecromancer].ForwardWalkSpriteOverlay.SetPlayLengthMs(2000)
v.heroRenderInfo[d2enum.HeroNecromancer].ForwardWalkSpriteOverlay.SetPlayLoop(false)
v.heroRenderInfo[d2enum.HeroNecromancer].SelectedSprite.SetPosition(300, 335)
v.heroRenderInfo[d2enum.HeroNecromancer].SelectedSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroNecromancer].SelectedSpriteOverlay.SetBlend(true)
v.heroRenderInfo[d2enum.HeroNecromancer].SelectedSpriteOverlay.SetPosition(300, 335)
v.heroRenderInfo[d2enum.HeroNecromancer].SelectedSpriteOverlay.PlayForward()
v.heroRenderInfo[d2enum.HeroNecromancer].BackWalkSprite.SetPosition(300, 335)
v.heroRenderInfo[d2enum.HeroNecromancer].BackWalkSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroNecromancer].BackWalkSprite.SetPlayLengthMs(1500)
v.heroRenderInfo[d2enum.HeroNecromancer].BackWalkSprite.SetPlayLoop(false)
v.heroRenderInfo[d2enum.HeroNecromancer].BackWalkSpriteOverlay.SetBlend(true)
v.heroRenderInfo[d2enum.HeroNecromancer].BackWalkSpriteOverlay.SetPosition(300, 335)
v.heroRenderInfo[d2enum.HeroNecromancer].BackWalkSpriteOverlay.PlayForward()
v.heroRenderInfo[d2enum.HeroNecromancer].BackWalkSpriteOverlay.SetPlayLengthMs(1500)
v.heroRenderInfo[d2enum.HeroNecromancer].BackWalkSpriteOverlay.SetPlayLoop(false)
v.heroRenderInfo[d2enum.HeroPaladin] = &HeroRenderInfo{
d2enum.HeroStanceIdle,
loadSprite(d2resource.CharacterSelectPaladinUnselected, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelectPaladinUnselectedH, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelecPaladinForwardWalk, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelecPaladinForwardWalkOverlay, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelecPaladinSelected, d2resource.PaletteFechar),
nil,
loadSprite(d2resource.CharacterSelecPaladinBackWalk, d2resource.PaletteFechar),
nil,
image.Rectangle{Min: image.Point{X: 490, Y: 210}, Max: image.Point{X: 65, Y: 180}},
v.loadSoundEffect(d2resource.SFXPaladinSelect),
v.loadSoundEffect(d2resource.SFXPaladinDeselect),
}
v.heroRenderInfo[d2enum.HeroPaladin].IdleSprite.SetPosition(521, 338)
v.heroRenderInfo[d2enum.HeroPaladin].IdleSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroPaladin].IdleSprite.SetPlayLengthMs(2500)
v.heroRenderInfo[d2enum.HeroPaladin].IdleSelectedSprite.SetPosition(521, 338)
v.heroRenderInfo[d2enum.HeroPaladin].IdleSelectedSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroPaladin].IdleSelectedSprite.SetPlayLengthMs(2500)
v.heroRenderInfo[d2enum.HeroPaladin].ForwardWalkSprite.SetPosition(521, 338)
v.heroRenderInfo[d2enum.HeroPaladin].ForwardWalkSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroPaladin].ForwardWalkSprite.SetPlayLengthMs(3400)
v.heroRenderInfo[d2enum.HeroPaladin].ForwardWalkSprite.SetPlayLoop(false)
v.heroRenderInfo[d2enum.HeroPaladin].ForwardWalkSpriteOverlay.SetPosition(521, 338)
v.heroRenderInfo[d2enum.HeroPaladin].ForwardWalkSpriteOverlay.PlayForward()
v.heroRenderInfo[d2enum.HeroPaladin].ForwardWalkSpriteOverlay.SetPlayLengthMs(3400)
v.heroRenderInfo[d2enum.HeroPaladin].ForwardWalkSpriteOverlay.SetPlayLoop(false)
v.heroRenderInfo[d2enum.HeroPaladin].SelectedSprite.SetPosition(521, 338)
v.heroRenderInfo[d2enum.HeroPaladin].SelectedSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroPaladin].SelectedSprite.SetPlayLengthMs(650)
v.heroRenderInfo[d2enum.HeroPaladin].BackWalkSprite.SetPosition(521, 338)
v.heroRenderInfo[d2enum.HeroPaladin].BackWalkSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroPaladin].BackWalkSprite.SetPlayLengthMs(1300)
v.heroRenderInfo[d2enum.HeroPaladin].BackWalkSprite.SetPlayLoop(false)
loading.Progress(0.7)
v.heroRenderInfo[d2enum.HeroAmazon] = &HeroRenderInfo{
d2enum.HeroStanceIdle,
loadSprite(d2resource.CharacterSelectAmazonUnselected, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelectAmazonUnselectedH, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelecAmazonForwardWalk, d2resource.PaletteFechar),
nil,
loadSprite(d2resource.CharacterSelecAmazonSelected, d2resource.PaletteFechar),
nil,
loadSprite(d2resource.CharacterSelecAmazonBackWalk, d2resource.PaletteFechar),
nil,
image.Rectangle{Min: image.Point{X: 70, Y: 220}, Max: image.Point{X: 55, Y: 200}},
v.loadSoundEffect(d2resource.SFXAmazonSelect),
v.loadSoundEffect(d2resource.SFXAmazonDeselect),
}
v.heroRenderInfo[d2enum.HeroAmazon].IdleSprite.SetPosition(100, 339)
v.heroRenderInfo[d2enum.HeroAmazon].IdleSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroAmazon].IdleSprite.SetPlayLengthMs(2500)
v.heroRenderInfo[d2enum.HeroAmazon].IdleSelectedSprite.SetPosition(100, 339)
v.heroRenderInfo[d2enum.HeroAmazon].IdleSelectedSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroAmazon].IdleSelectedSprite.SetPlayLengthMs(2500)
v.heroRenderInfo[d2enum.HeroAmazon].ForwardWalkSprite.SetPosition(100, 339)
v.heroRenderInfo[d2enum.HeroAmazon].ForwardWalkSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroAmazon].ForwardWalkSprite.SetPlayLengthMs(2200)
v.heroRenderInfo[d2enum.HeroAmazon].ForwardWalkSprite.SetPlayLoop(false)
v.heroRenderInfo[d2enum.HeroAmazon].SelectedSprite.SetPosition(100, 339)
v.heroRenderInfo[d2enum.HeroAmazon].SelectedSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroAmazon].SelectedSprite.SetPlayLengthMs(1350)
v.heroRenderInfo[d2enum.HeroAmazon].BackWalkSprite.SetPosition(100, 339)
v.heroRenderInfo[d2enum.HeroAmazon].BackWalkSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroAmazon].BackWalkSprite.SetPlayLengthMs(1500)
v.heroRenderInfo[d2enum.HeroAmazon].BackWalkSprite.SetPlayLoop(false)
v.heroRenderInfo[d2enum.HeroAssassin] = &HeroRenderInfo{
d2enum.HeroStanceIdle,
loadSprite(d2resource.CharacterSelectAssassinUnselected, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelectAssassinUnselectedH, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelectAssassinForwardWalk, d2resource.PaletteFechar),
nil,
loadSprite(d2resource.CharacterSelectAssassinSelected, d2resource.PaletteFechar),
nil,
loadSprite(d2resource.CharacterSelectAssassinBackWalk, d2resource.PaletteFechar),
nil,
image.Rectangle{Min: image.Point{X: 175, Y: 235}, Max: image.Point{X: 50, Y: 180}},
v.loadSoundEffect(d2resource.SFXAssassinSelect),
v.loadSoundEffect(d2resource.SFXAssassinDeselect),
}
v.heroRenderInfo[d2enum.HeroAssassin].IdleSprite.SetPosition(231, 365)
v.heroRenderInfo[d2enum.HeroAssassin].IdleSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroAssassin].IdleSprite.SetPlayLengthMs(2500)
v.heroRenderInfo[d2enum.HeroAssassin].IdleSelectedSprite.SetPosition(231, 365)
v.heroRenderInfo[d2enum.HeroAssassin].IdleSelectedSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroAssassin].IdleSelectedSprite.SetPlayLengthMs(2500)
v.heroRenderInfo[d2enum.HeroAssassin].ForwardWalkSprite.SetPosition(231, 365)
v.heroRenderInfo[d2enum.HeroAssassin].ForwardWalkSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroAssassin].ForwardWalkSprite.SetPlayLengthMs(3800)
v.heroRenderInfo[d2enum.HeroAssassin].ForwardWalkSprite.SetPlayLoop(false)
v.heroRenderInfo[d2enum.HeroAssassin].SelectedSprite.SetPosition(231, 365)
v.heroRenderInfo[d2enum.HeroAssassin].SelectedSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroAssassin].SelectedSprite.SetPlayLengthMs(2500)
v.heroRenderInfo[d2enum.HeroAssassin].BackWalkSprite.SetPosition(231, 365)
v.heroRenderInfo[d2enum.HeroAssassin].BackWalkSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroAssassin].BackWalkSprite.SetPlayLengthMs(1500)
v.heroRenderInfo[d2enum.HeroAssassin].BackWalkSprite.SetPlayLoop(false)
loading.Progress(0.8)
v.heroRenderInfo[d2enum.HeroDruid] = &HeroRenderInfo{
d2enum.HeroStanceIdle,
loadSprite(d2resource.CharacterSelectDruidUnselected, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelectDruidUnselectedH, d2resource.PaletteFechar),
loadSprite(d2resource.CharacterSelectDruidForwardWalk, d2resource.PaletteFechar),
nil,
loadSprite(d2resource.CharacterSelectDruidSelected, d2resource.PaletteFechar),
nil,
loadSprite(d2resource.CharacterSelectDruidBackWalk, d2resource.PaletteFechar),
nil,
image.Rectangle{Min: image.Point{X: 680, Y: 220}, Max: image.Point{X: 70, Y: 195}},
v.loadSoundEffect(d2resource.SFXDruidSelect),
v.loadSoundEffect(d2resource.SFXDruidDeselect),
}
v.heroRenderInfo[d2enum.HeroDruid].IdleSprite.SetPosition(720, 370)
v.heroRenderInfo[d2enum.HeroDruid].IdleSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroDruid].IdleSprite.SetPlayLengthMs(1500)
v.heroRenderInfo[d2enum.HeroDruid].IdleSelectedSprite.SetPosition(720, 370)
v.heroRenderInfo[d2enum.HeroDruid].IdleSelectedSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroDruid].IdleSelectedSprite.SetPlayLengthMs(1500)
v.heroRenderInfo[d2enum.HeroDruid].ForwardWalkSprite.SetPosition(720, 370)
v.heroRenderInfo[d2enum.HeroDruid].ForwardWalkSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroDruid].ForwardWalkSprite.SetPlayLengthMs(4800)
v.heroRenderInfo[d2enum.HeroDruid].ForwardWalkSprite.SetPlayLoop(false)
v.heroRenderInfo[d2enum.HeroDruid].SelectedSprite.SetPosition(720, 370)
v.heroRenderInfo[d2enum.HeroDruid].SelectedSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroDruid].SelectedSprite.SetPlayLengthMs(1500)
v.heroRenderInfo[d2enum.HeroDruid].BackWalkSprite.SetPosition(720, 370)
v.heroRenderInfo[d2enum.HeroDruid].BackWalkSprite.PlayForward()
v.heroRenderInfo[d2enum.HeroDruid].BackWalkSprite.SetPlayLengthMs(1500)
v.heroRenderInfo[d2enum.HeroDruid].BackWalkSprite.SetPlayLoop(false)
} }
// OnUnload releases the resources of the Select Hero Class screen
func (v *SelectHeroClass) OnUnload() error { func (v *SelectHeroClass) OnUnload() error {
for i := range v.heroRenderInfo { for i := range v.heroRenderInfo {
v.heroRenderInfo[i].SelectSfx.Stop() v.heroRenderInfo[i].SelectSfx.Stop()
v.heroRenderInfo[i].DeselectSfx.Stop() v.heroRenderInfo[i].DeselectSfx.Stop()
} }
v.heroRenderInfo = nil v.heroRenderInfo = nil
return nil return nil
} }
@ -448,16 +344,27 @@ func (v *SelectHeroClass) onExitButtonClicked() {
} }
func (v *SelectHeroClass) onOkButtonClicked() { func (v *SelectHeroClass) onOkButtonClicked() {
gameState := d2player.CreatePlayerState(v.heroNameTextbox.GetText(), v.selectedHero, gameState := d2player.CreatePlayerState(
d2datadict.CharStats[v.selectedHero], v.hardcoreCheckbox.GetCheckState()) v.heroNameTextbox.GetText(),
v.selectedHero,
d2datadict.CharStats[v.selectedHero],
v.hardcoreCheckbox.GetCheckState(),
)
gameClient, _ := d2client.Create(d2clientconnectiontype.Local) gameClient, _ := d2client.Create(d2clientconnectiontype.Local)
_ = gameClient.Open(v.connectionHost, gameState.FilePath) if err := gameClient.Open(v.connectionHost, gameState.FilePath); err != nil {
fmt.Printf("can not connect to the host: %s\n", v.connectionHost)
}
d2screen.SetNextScreen(CreateGame(v.renderer, v.audioProvider, gameClient, v.terminal)) d2screen.SetNextScreen(CreateGame(v.renderer, v.audioProvider, gameClient, v.terminal))
} }
// Render renders the Select Hero Class screen
func (v *SelectHeroClass) Render(screen d2interface.Surface) error { func (v *SelectHeroClass) Render(screen d2interface.Surface) error {
_ = v.bgImage.RenderSegmented(screen, 4, 3, 0) if err := v.bgImage.RenderSegmented(screen, 4, 3, 0); err != nil {
return err
}
v.headingLabel.Render(screen) v.headingLabel.Render(screen)
if v.selectedHero != d2enum.HeroNone { if v.selectedHero != d2enum.HeroNone {
@ -492,6 +399,7 @@ func (v *SelectHeroClass) Render(screen d2interface.Surface) error {
return nil return nil
} }
// Advance runs the update logic on the Select Hero Class screen
func (v *SelectHeroClass) Advance(tickTime float64) error { func (v *SelectHeroClass) Advance(tickTime float64) error {
canSelect := true canSelect := true
@ -500,7 +408,8 @@ func (v *SelectHeroClass) Advance(tickTime float64) error {
} }
for infoIdx := range v.heroRenderInfo { for infoIdx := range v.heroRenderInfo {
v.heroRenderInfo[infoIdx].Advance(tickTime) v.heroRenderInfo[infoIdx].advance(tickTime)
if v.heroRenderInfo[infoIdx].Stance != d2enum.HeroStanceIdle && if v.heroRenderInfo[infoIdx].Stance != d2enum.HeroStanceIdle &&
v.heroRenderInfo[infoIdx].Stance != d2enum.HeroStanceIdleSelected && v.heroRenderInfo[infoIdx].Stance != d2enum.HeroStanceIdleSelected &&
v.heroRenderInfo[infoIdx].Stance != d2enum.HeroStanceSelected { v.heroRenderInfo[infoIdx].Stance != d2enum.HeroStanceSelected {
@ -508,8 +417,8 @@ func (v *SelectHeroClass) Advance(tickTime float64) error {
} }
} }
for heroTypeIdx := range v.heroRenderInfo { for heroType := range v.heroRenderInfo {
v.updateHeroSelectionHover(heroTypeIdx, canSelect) v.updateHeroSelectionHover(heroType, canSelect)
} }
v.okButton.SetEnabled(len(v.heroNameTextbox.GetText()) >= 2 && v.selectedHero != d2enum.HeroNone) v.okButton.SetEnabled(len(v.heroNameTextbox.GetText()) >= 2 && v.selectedHero != d2enum.HeroNone)
@ -526,64 +435,80 @@ func (v *SelectHeroClass) updateHeroSelectionHover(hero d2enum.Hero, canSelect b
setSpriteToFirstFrame(renderInfo.SelectedSprite) setSpriteToFirstFrame(renderInfo.SelectedSprite)
setSpriteToFirstFrame(renderInfo.SelectedSpriteOverlay) setSpriteToFirstFrame(renderInfo.SelectedSpriteOverlay)
} }
return return
case d2enum.HeroStanceRetreating: case d2enum.HeroStanceRetreating:
if renderInfo.BackWalkSprite.IsOnLastFrame() { if renderInfo.BackWalkSprite.IsOnLastFrame() {
renderInfo.Stance = d2enum.HeroStanceIdle renderInfo.Stance = d2enum.HeroStanceIdle
setSpriteToFirstFrame(renderInfo.IdleSprite) setSpriteToFirstFrame(renderInfo.IdleSprite)
} }
return return
} }
if !canSelect {
return if !canSelect || renderInfo.Stance == d2enum.HeroStanceSelected {
}
if renderInfo.Stance == d2enum.HeroStanceSelected {
return return
} }
mouseX, mouseY := d2ui.CursorPosition() mouseX, mouseY := d2ui.CursorPosition()
b := renderInfo.SelectionBounds b := renderInfo.SelectionBounds
mouseHover := (mouseX >= b.Min.X) && (mouseX <= b.Min.X+b.Max.X) && (mouseY >= b.Min.Y) && (mouseY <= b.Min.Y+b.Max.Y) mouseHover := (mouseX >= b.Min.X) && (mouseX <= b.Min.X+b.Max.X) && (mouseY >= b.Min.Y) && (mouseY <= b.Min.Y+b.Max.Y)
if mouseHover && d2ui.CursorButtonPressed(d2ui.CursorButtonLeft) {
v.heroNameTextbox.SetVisible(true)
v.heroNameTextbox.Activate()
v.okButton.SetVisible(true)
v.expansionCheckbox.SetVisible(true)
v.hardcoreCheckbox.SetVisible(true)
renderInfo.Stance = d2enum.HeroStanceApproaching
setSpriteToFirstFrame(renderInfo.ForwardWalkSprite)
setSpriteToFirstFrame(renderInfo.ForwardWalkSpriteOverlay)
for _, heroInfo := range v.heroRenderInfo {
if heroInfo.Stance != d2enum.HeroStanceSelected {
continue
}
heroInfo.SelectSfx.Stop()
heroInfo.DeselectSfx.Play()
heroInfo.Stance = d2enum.HeroStanceRetreating
setSpriteToFirstFrame(heroInfo.BackWalkSprite)
setSpriteToFirstFrame(heroInfo.BackWalkSpriteOverlay)
}
v.selectedHero = hero
v.updateHeroText()
renderInfo.SelectSfx.Play()
if mouseHover && d2ui.CursorButtonPressed(d2ui.CursorButtonLeft) {
v.handleCursorButtonPress(hero, renderInfo)
return return
} }
if mouseHover && renderInfo.Stance != d2enum.HeroStanceIdleSelected { v.setCurrentFrame(mouseHover, renderInfo)
_ = renderInfo.IdleSelectedSprite.SetCurrentFrame(renderInfo.IdleSprite.GetCurrentFrame())
renderInfo.Stance = d2enum.HeroStanceIdleSelected
} else if !mouseHover && renderInfo.Stance != d2enum.HeroStanceIdle {
_ = renderInfo.IdleSprite.SetCurrentFrame(renderInfo.IdleSelectedSprite.GetCurrentFrame())
renderInfo.Stance = d2enum.HeroStanceIdle
}
if v.selectedHero == d2enum.HeroNone && mouseHover { if v.selectedHero == d2enum.HeroNone && mouseHover {
v.selectedHero = hero v.selectedHero = hero
v.updateHeroText() v.updateHeroText()
} }
}
func (v *SelectHeroClass) handleCursorButtonPress(hero d2enum.Hero, renderInfo *HeroRenderInfo) {
v.heroNameTextbox.SetVisible(true)
v.heroNameTextbox.Activate()
v.okButton.SetVisible(true)
v.expansionCheckbox.SetVisible(true)
v.hardcoreCheckbox.SetVisible(true)
renderInfo.Stance = d2enum.HeroStanceApproaching
setSpriteToFirstFrame(renderInfo.ForwardWalkSprite)
setSpriteToFirstFrame(renderInfo.ForwardWalkSpriteOverlay)
for _, heroInfo := range v.heroRenderInfo {
if heroInfo.Stance != d2enum.HeroStanceSelected {
continue
}
heroInfo.SelectSfx.Stop()
heroInfo.DeselectSfx.Play()
heroInfo.Stance = d2enum.HeroStanceRetreating
setSpriteToFirstFrame(heroInfo.BackWalkSprite)
setSpriteToFirstFrame(heroInfo.BackWalkSpriteOverlay)
}
v.selectedHero = hero
v.updateHeroText()
renderInfo.SelectSfx.Play()
}
func (v *SelectHeroClass) setCurrentFrame(mouseHover bool, renderInfo *HeroRenderInfo) {
if mouseHover && renderInfo.Stance != d2enum.HeroStanceIdleSelected {
if err := renderInfo.IdleSelectedSprite.SetCurrentFrame(renderInfo.IdleSprite.GetCurrentFrame()); err != nil {
fmt.Printf("could not set current frame to: %d\n", renderInfo.IdleSprite.GetCurrentFrame())
}
renderInfo.Stance = d2enum.HeroStanceIdleSelected
} else if !mouseHover && renderInfo.Stance != d2enum.HeroStanceIdle {
if err := renderInfo.IdleSprite.SetCurrentFrame(renderInfo.IdleSelectedSprite.GetCurrentFrame()); err != nil {
fmt.Printf("could not set current frame to: %d\n", renderInfo.IdleSelectedSprite.GetCurrentFrame())
}
renderInfo.Stance = d2enum.HeroStanceIdle
}
} }
func (v *SelectHeroClass) renderHero(screen d2interface.Surface, hero d2enum.Hero) { func (v *SelectHeroClass) renderHero(screen d2interface.Surface, hero d2enum.Hero) {
@ -632,35 +557,20 @@ func (v *SelectHeroClass) updateHeroText() {
v.heroClassLabel.SetText(d2common.TranslateString("partychardru")) v.heroClassLabel.SetText(d2common.TranslateString("partychardru"))
v.setDescLabels("Commanding the forces of nature, he summons wild beasts and raging storms to his side.") v.setDescLabels("Commanding the forces of nature, he summons wild beasts and raging storms to his side.")
} }
/*
if (selectedHero == null)
return;
switch (selectedHero.Value)
{
}
heroClassLabel.Location = new Point(400 - (heroClassLabel.TextArea.Width / 2), 65);
heroDesc1Label.Location = new Point(400 - (heroDesc1Label.TextArea.Width / 2), 100);
heroDesc2Label.Location = new Point(400 - (heroDesc2Label.TextArea.Width / 2), 115);
heroDesc3Label.Location = new Point(400 - (heroDesc3Label.TextArea.Width / 2), 130);
*/
} }
func (v *SelectHeroClass) setDescLabels(descKey string) { func (v *SelectHeroClass) setDescLabels(descKey string) {
heroDesc := d2common.TranslateString(descKey) heroDesc := d2common.TranslateString(descKey)
parts := d2common.SplitIntoLinesWithMaxWidth(heroDesc, 37) parts := d2common.SplitIntoLinesWithMaxWidth(heroDesc, 37)
if len(parts) > 1 { if len(parts) > 1 {
v.heroDesc1Label.SetText(parts[0]) v.heroDesc1Label.SetText(parts[0])
} else {
v.heroDesc1Label.SetText("")
}
if len(parts) > 1 {
v.heroDesc2Label.SetText(parts[1]) v.heroDesc2Label.SetText(parts[1])
} else { } else {
v.heroDesc1Label.SetText("")
v.heroDesc2Label.SetText("") v.heroDesc2Label.SetText("")
} }
if len(parts) > 2 { if len(parts) > 2 {
v.heroDesc3Label.SetText(parts[2]) v.heroDesc3Label.SetText(parts[2])
} else { } else {
@ -676,19 +586,48 @@ func setSpriteToFirstFrame(sprite *d2ui.Sprite) {
func drawSprite(sprite *d2ui.Sprite, target d2interface.Surface) { func drawSprite(sprite *d2ui.Sprite, target d2interface.Surface) {
if sprite != nil { if sprite != nil {
_ = sprite.Render(target) if err := sprite.Render(target); err != nil {
x, y := sprite.GetPosition()
fmt.Printf("could not render the sprite to the position(x: %d, y: %d)\n", x, y)
}
} }
} }
func advanceSprite(sprite *d2ui.Sprite, elapsed float64) { func advanceSprite(sprite *d2ui.Sprite, elapsed float64) {
if sprite != nil { if sprite != nil {
_ = sprite.Advance(elapsed) if err := sprite.Advance(elapsed); err != nil {
fmt.Printf("could not advance the sprite\n")
}
} }
} }
func loadSprite(animationPath, palettePath string) *d2ui.Sprite { func loadSprite(animationPath string, position image.Point, playLength int, playLoop, blend bool) *d2ui.Sprite {
animation, _ := d2asset.LoadAnimation(animationPath, palettePath) if animationPath == "" {
sprite, _ := d2ui.LoadSprite(animation) return nil
}
animation, err := d2asset.LoadAnimation(animationPath, d2resource.PaletteFechar)
if err != nil {
fmt.Printf("could not load animation: %s\n", animationPath)
return nil
}
animation.PlayForward()
animation.SetPlayLoop(playLoop)
animation.SetBlend(blend)
if playLength != 0 {
animation.SetPlayLengthMs(playLength)
}
sprite, err := d2ui.LoadSprite(animation)
if err != nil {
fmt.Printf("could not load sprite for the animation: %s\n", animationPath)
return nil
}
sprite.SetPosition(position.X, position.Y)
return sprite return sprite
} }