mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2024-09-27 13:46:00 -04:00
implemented logger in d2gamescreen (#925)
* implemented logger in d2gamescreen * logger in d2game/d2player * logger for app.go
This commit is contained in:
parent
f6410f8961
commit
2153f5ce64
67
d2app/app.go
67
d2app/app.go
@ -10,7 +10,6 @@ import (
|
|||||||
"image"
|
"image"
|
||||||
"image/gif"
|
"image/gif"
|
||||||
"image/png"
|
"image/png"
|
||||||
"log"
|
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@ -154,7 +153,7 @@ func (a *App) startDedicatedServer() error {
|
|||||||
|
|
||||||
for {
|
for {
|
||||||
for data := range srvChanLog {
|
for data := range srvChanLog {
|
||||||
log.Println(data)
|
a.logger.Info(data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -327,7 +326,7 @@ func (a *App) Run() error {
|
|||||||
|
|
||||||
// start profiler if argument was supplied
|
// start profiler if argument was supplied
|
||||||
if len(*a.Options.profiler) > 0 {
|
if len(*a.Options.profiler) > 0 {
|
||||||
profiler := enableProfiler(*a.Options.profiler)
|
profiler := enableProfiler(*a.Options.profiler, a)
|
||||||
if profiler != nil {
|
if profiler != nil {
|
||||||
defer profiler.Stop()
|
defer profiler.Stop()
|
||||||
}
|
}
|
||||||
@ -406,7 +405,7 @@ func (a *App) initialize() error {
|
|||||||
action := &terminalActions[idx]
|
action := &terminalActions[idx]
|
||||||
|
|
||||||
if err := a.terminal.BindAction(action.name, action.description, action.action); err != nil {
|
if err := a.terminal.BindAction(action.name, action.description, action.action); err != nil {
|
||||||
log.Fatal(err)
|
a.logger.Fatal(err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -684,21 +683,21 @@ func (a *App) allocRate(totalAlloc uint64, fps float64) float64 {
|
|||||||
func (a *App) dumpHeap() {
|
func (a *App) dumpHeap() {
|
||||||
if _, err := os.Stat("./pprof/"); os.IsNotExist(err) {
|
if _, err := os.Stat("./pprof/"); os.IsNotExist(err) {
|
||||||
if err := os.Mkdir("./pprof/", 0750); err != nil {
|
if err := os.Mkdir("./pprof/", 0750); err != nil {
|
||||||
log.Fatal(err)
|
a.logger.Fatal(err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fileOut, err := os.Create("./pprof/heap.pprof")
|
fileOut, err := os.Create("./pprof/heap.pprof")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
a.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := pprof.WriteHeapProfile(fileOut); err != nil {
|
if err := pprof.WriteHeapProfile(fileOut); err != nil {
|
||||||
log.Fatal(err)
|
a.logger.Fatal(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := fileOut.Close(); err != nil {
|
if err := fileOut.Close(); err != nil {
|
||||||
log.Fatal(err)
|
a.logger.Fatal(err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -709,7 +708,7 @@ func (a *App) evalJS(code string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("%s", val)
|
a.logger.Info("%s" + val)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) toggleFullScreen() {
|
func (a *App) toggleFullScreen() {
|
||||||
@ -732,7 +731,7 @@ func (a *App) doCaptureFrame(target d2interface.Surface) error {
|
|||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if err := fp.Close(); err != nil {
|
if err := fp.Close(); err != nil {
|
||||||
log.Fatal(err)
|
a.logger.Fatal(err.Error())
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@ -741,7 +740,7 @@ func (a *App) doCaptureFrame(target d2interface.Surface) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("saved frame to %s", a.capturePath)
|
a.logger.Info(fmt.Sprintf("saved frame to %s", a.capturePath))
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -759,7 +758,7 @@ func (a *App) convertFramesToGif() error {
|
|||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if err := fp.Close(); err != nil {
|
if err := fp.Close(); err != nil {
|
||||||
log.Fatal(err)
|
a.logger.Fatal(err.Error())
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@ -801,7 +800,7 @@ func (a *App) convertFramesToGif() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("saved animation to %s", a.capturePath)
|
a.logger.Info(fmt.Sprintf("saved animation to %s", a.capturePath))
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -841,7 +840,7 @@ func (a *App) quitGame() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) enterGuiPlayground() {
|
func (a *App) enterGuiPlayground() {
|
||||||
a.screen.SetNextScreen(d2gamescreen.CreateGuiTestMain(a.renderer, a.guiManager, a.asset))
|
a.screen.SetNextScreen(d2gamescreen.CreateGuiTestMain(a.renderer, a.guiManager, a.config.LogLevel, a.asset))
|
||||||
}
|
}
|
||||||
|
|
||||||
func createZeroedRing(n int) *ring.Ring {
|
func createZeroedRing(n int) *ring.Ring {
|
||||||
@ -854,36 +853,36 @@ func createZeroedRing(n int) *ring.Ring {
|
|||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
func enableProfiler(profileOption string) interface{ Stop() } {
|
func enableProfiler(profileOption string, a *App) interface{ Stop() } {
|
||||||
var options []func(*profile.Profile)
|
var options []func(*profile.Profile)
|
||||||
|
|
||||||
switch strings.ToLower(strings.Trim(profileOption, " ")) {
|
switch strings.ToLower(strings.Trim(profileOption, " ")) {
|
||||||
case "cpu":
|
case "cpu":
|
||||||
log.Printf("CPU profiling is enabled.")
|
a.logger.Debug("CPU profiling is enabled.")
|
||||||
|
|
||||||
options = append(options, profile.CPUProfile)
|
options = append(options, profile.CPUProfile)
|
||||||
case "mem":
|
case "mem":
|
||||||
log.Printf("Memory profiling is enabled.")
|
a.logger.Debug("Memory profiling is enabled.")
|
||||||
|
|
||||||
options = append(options, profile.MemProfile)
|
options = append(options, profile.MemProfile)
|
||||||
case "block":
|
case "block":
|
||||||
log.Printf("Block profiling is enabled.")
|
a.logger.Debug("Block profiling is enabled.")
|
||||||
|
|
||||||
options = append(options, profile.BlockProfile)
|
options = append(options, profile.BlockProfile)
|
||||||
case "goroutine":
|
case "goroutine":
|
||||||
log.Printf("Goroutine profiling is enabled.")
|
a.logger.Debug("Goroutine profiling is enabled.")
|
||||||
|
|
||||||
options = append(options, profile.GoroutineProfile)
|
options = append(options, profile.GoroutineProfile)
|
||||||
case "trace":
|
case "trace":
|
||||||
log.Printf("Trace profiling is enabled.")
|
a.logger.Debug("Trace profiling is enabled.")
|
||||||
|
|
||||||
options = append(options, profile.TraceProfile)
|
options = append(options, profile.TraceProfile)
|
||||||
case "thread":
|
case "thread":
|
||||||
log.Printf("Thread creation profiling is enabled.")
|
a.logger.Debug("Thread creation profiling is enabled.")
|
||||||
|
|
||||||
options = append(options, profile.ThreadcreationProfile)
|
options = append(options, profile.ThreadcreationProfile)
|
||||||
case "mutex":
|
case "mutex":
|
||||||
log.Printf("Mutex profiling is enabled.")
|
a.logger.Debug("Mutex profiling is enabled.")
|
||||||
|
|
||||||
options = append(options, profile.MutexProfile)
|
options = append(options, profile.MutexProfile)
|
||||||
}
|
}
|
||||||
@ -909,9 +908,10 @@ func (a *App) updateInitError(target d2interface.Surface) error {
|
|||||||
func (a *App) ToMainMenu(errorMessageOptional ...string) {
|
func (a *App) ToMainMenu(errorMessageOptional ...string) {
|
||||||
buildInfo := d2gamescreen.BuildInfo{Branch: a.gitBranch, Commit: a.gitCommit}
|
buildInfo := d2gamescreen.BuildInfo{Branch: a.gitBranch, Commit: a.gitCommit}
|
||||||
|
|
||||||
mainMenu, err := d2gamescreen.CreateMainMenu(a, a.asset, a.renderer, a.inputManager, a.audio, a.ui, buildInfo, errorMessageOptional...)
|
mainMenu, err := d2gamescreen.CreateMainMenu(a, a.asset, a.renderer, a.inputManager, a.audio, a.ui, buildInfo,
|
||||||
|
a.config.LogLevel, errorMessageOptional...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
a.logger.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -920,9 +920,9 @@ func (a *App) ToMainMenu(errorMessageOptional ...string) {
|
|||||||
|
|
||||||
// ToSelectHero forces the game to transition to the Select Hero (create character) screen
|
// ToSelectHero forces the game to transition to the Select Hero (create character) screen
|
||||||
func (a *App) ToSelectHero(connType d2clientconnectiontype.ClientConnectionType, host string) {
|
func (a *App) ToSelectHero(connType d2clientconnectiontype.ClientConnectionType, host string) {
|
||||||
selectHero, err := d2gamescreen.CreateSelectHeroClass(a, a.asset, a.renderer, a.audio, a.ui, connType, host)
|
selectHero, err := d2gamescreen.CreateSelectHeroClass(a, a.asset, a.renderer, a.audio, a.ui, connType, a.config.LogLevel, host)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
a.logger.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -933,7 +933,7 @@ func (a *App) ToSelectHero(connType d2clientconnectiontype.ClientConnectionType,
|
|||||||
func (a *App) ToCreateGame(filePath string, connType d2clientconnectiontype.ClientConnectionType, host string) {
|
func (a *App) ToCreateGame(filePath string, connType d2clientconnectiontype.ClientConnectionType, host string) {
|
||||||
gameClient, err := d2client.Create(connType, a.asset, a.scriptEngine)
|
gameClient, err := d2client.Create(connType, a.asset, a.scriptEngine)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
a.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = gameClient.Open(host, filePath); err != nil {
|
if err = gameClient.Open(host, filePath); err != nil {
|
||||||
@ -942,7 +942,7 @@ func (a *App) ToCreateGame(filePath string, connType d2clientconnectiontype.Clie
|
|||||||
a.ToMainMenu(errorMessage)
|
a.ToMainMenu(errorMessage)
|
||||||
} else {
|
} else {
|
||||||
a.screen.SetNextScreen(d2gamescreen.CreateGame(
|
a.screen.SetNextScreen(d2gamescreen.CreateGame(
|
||||||
a, a.asset, a.ui, a.renderer, a.inputManager, a.audio, gameClient, a.terminal, a.guiManager,
|
a, a.asset, a.ui, a.renderer, a.inputManager, a.audio, gameClient, a.terminal, a.config.LogLevel, a.guiManager,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -950,7 +950,7 @@ func (a *App) ToCreateGame(filePath string, connType d2clientconnectiontype.Clie
|
|||||||
// ToCharacterSelect forces the game to transition to the Character Select (load character) screen
|
// ToCharacterSelect forces the game to transition to the Character Select (load character) screen
|
||||||
func (a *App) ToCharacterSelect(connType d2clientconnectiontype.ClientConnectionType, connHost string) {
|
func (a *App) ToCharacterSelect(connType d2clientconnectiontype.ClientConnectionType, connHost string) {
|
||||||
characterSelect, err := d2gamescreen.CreateCharacterSelect(a, a.asset, a.renderer, a.inputManager,
|
characterSelect, err := d2gamescreen.CreateCharacterSelect(a, a.asset, a.renderer, a.inputManager,
|
||||||
a.audio, a.ui, connType, connHost)
|
a.audio, a.ui, connType, a.config.LogLevel, connHost)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("unable to create character select screen: %s", err)
|
fmt.Printf("unable to create character select screen: %s", err)
|
||||||
}
|
}
|
||||||
@ -960,9 +960,10 @@ func (a *App) ToCharacterSelect(connType d2clientconnectiontype.ClientConnection
|
|||||||
|
|
||||||
// ToMapEngineTest forces the game to transition to the map engine test screen
|
// ToMapEngineTest forces the game to transition to the map engine test screen
|
||||||
func (a *App) ToMapEngineTest(region, level int) {
|
func (a *App) ToMapEngineTest(region, level int) {
|
||||||
met, err := d2gamescreen.CreateMapEngineTest(region, level, a.asset, a.terminal, a.renderer, a.inputManager, a.audio, a.screen)
|
met, err := d2gamescreen.CreateMapEngineTest(region, level, a.asset, a.terminal, a.renderer, a.inputManager, a.audio,
|
||||||
|
a.config.LogLevel, a.screen)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
a.logger.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -971,10 +972,10 @@ func (a *App) ToMapEngineTest(region, level int) {
|
|||||||
|
|
||||||
// ToCredits forces the game to transition to the credits screen
|
// ToCredits forces the game to transition to the credits screen
|
||||||
func (a *App) ToCredits() {
|
func (a *App) ToCredits() {
|
||||||
a.screen.SetNextScreen(d2gamescreen.CreateCredits(a, a.asset, a.renderer, a.ui))
|
a.screen.SetNextScreen(d2gamescreen.CreateCredits(a, a.asset, a.renderer, a.config.LogLevel, a.ui))
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToCinematics forces the game to transition to the cinematics menu
|
// ToCinematics forces the game to transition to the cinematics menu
|
||||||
func (a *App) ToCinematics() {
|
func (a *App) ToCinematics() {
|
||||||
a.screen.SetNextScreen(d2gamescreen.CreateCinematics(a, a.asset, a.renderer, a.audio, a.ui))
|
a.screen.SetNextScreen(d2gamescreen.CreateCinematics(a, a.asset, a.renderer, a.audio, a.config.LogLevel, a.ui))
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -13,6 +14,7 @@ type LogLevel = int
|
|||||||
// Log levels
|
// Log levels
|
||||||
const (
|
const (
|
||||||
LogLevelNone LogLevel = iota
|
LogLevelNone LogLevel = iota
|
||||||
|
LogLevelFatal
|
||||||
LogLevelError
|
LogLevelError
|
||||||
LogLevelWarning
|
LogLevelWarning
|
||||||
LogLevelInfo
|
LogLevelInfo
|
||||||
@ -41,6 +43,7 @@ const (
|
|||||||
LogFmtInfo = "[INFO]" + colorEscapeReset + " %s\r\n"
|
LogFmtInfo = "[INFO]" + colorEscapeReset + " %s\r\n"
|
||||||
LogFmtWarning = "[WARNING]" + colorEscapeReset + " %s\r\n"
|
LogFmtWarning = "[WARNING]" + colorEscapeReset + " %s\r\n"
|
||||||
LogFmtError = "[ERROR]" + colorEscapeReset + " %s\r\n"
|
LogFmtError = "[ERROR]" + colorEscapeReset + " %s\r\n"
|
||||||
|
LogFmtFatal = "[FATAL]" + colorEscapeReset + " %s\r\n"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewLogger creates a new logger with a default
|
// NewLogger creates a new logger with a default
|
||||||
@ -131,6 +134,21 @@ func (l *Logger) Errorf(fmtMsg string, args ...interface{}) {
|
|||||||
l.Error(fmt.Sprintf(fmtMsg, args...))
|
l.Error(fmt.Sprintf(fmtMsg, args...))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fatal logs an fatal error message and exits programm
|
||||||
|
func (l *Logger) Fatal(msg string) {
|
||||||
|
if l == nil || l.level < LogLevelFatal {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
l.print(LogLevelFatal, msg)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fatalf formats and then logs a error message
|
||||||
|
func (l *Logger) Fatalf(fmtMsg string, args ...interface{}) {
|
||||||
|
l.Fatal(fmt.Sprintf(fmtMsg, args...))
|
||||||
|
}
|
||||||
|
|
||||||
// Debug logs a debug message
|
// Debug logs a debug message
|
||||||
func (l *Logger) Debug(msg string) {
|
func (l *Logger) Debug(msg string) {
|
||||||
if l == nil || l.level < LogLevelDebug {
|
if l == nil || l.level < LogLevelDebug {
|
||||||
@ -155,6 +173,7 @@ func (l *Logger) print(level LogLevel, msg string) {
|
|||||||
LogLevelInfo: green,
|
LogLevelInfo: green,
|
||||||
LogLevelWarning: yellow,
|
LogLevelWarning: yellow,
|
||||||
LogLevelError: red,
|
LogLevelError: red,
|
||||||
|
LogLevelFatal: red,
|
||||||
}
|
}
|
||||||
|
|
||||||
fmtString := ""
|
fmtString := ""
|
||||||
@ -180,6 +199,8 @@ func (l *Logger) print(level LogLevel, msg string) {
|
|||||||
fmtString += LogFmtWarning
|
fmtString += LogFmtWarning
|
||||||
case LogLevelError:
|
case LogLevelError:
|
||||||
fmtString += LogFmtError
|
fmtString += LogFmtError
|
||||||
|
case LogLevelFatal:
|
||||||
|
fmtString += LogFmtFatal
|
||||||
case LogLevelNone:
|
case LogLevelNone:
|
||||||
default:
|
default:
|
||||||
return
|
return
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
package d2gamescreen
|
package d2gamescreen
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"image/color"
|
"image/color"
|
||||||
"log"
|
|
||||||
"math"
|
"math"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
@ -12,6 +10,7 @@ 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/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
||||||
@ -19,6 +18,49 @@ import (
|
|||||||
"github.com/OpenDiablo2/OpenDiablo2/d2networking/d2client/d2clientconnectiontype"
|
"github.com/OpenDiablo2/OpenDiablo2/d2networking/d2client/d2clientconnectiontype"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// CreateCharacterSelect creates the character select screen and returns a pointer to it
|
||||||
|
func CreateCharacterSelect(
|
||||||
|
navigator d2interface.Navigator,
|
||||||
|
asset *d2asset.AssetManager,
|
||||||
|
renderer d2interface.Renderer,
|
||||||
|
inputManager d2interface.InputManager,
|
||||||
|
audioProvider d2interface.AudioProvider,
|
||||||
|
ui *d2ui.UIManager,
|
||||||
|
connectionType d2clientconnectiontype.ClientConnectionType,
|
||||||
|
l d2util.LogLevel,
|
||||||
|
connectionHost string,
|
||||||
|
) (*CharacterSelect, error) {
|
||||||
|
playerStateFactory, err := d2hero.NewHeroStateFactory(asset)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
entityFactory, err := d2mapentity.NewMapEntityFactory(asset)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
characterSelect := &CharacterSelect{
|
||||||
|
selectedCharacter: -1,
|
||||||
|
asset: asset,
|
||||||
|
MapEntityFactory: entityFactory,
|
||||||
|
renderer: renderer,
|
||||||
|
connectionType: connectionType,
|
||||||
|
connectionHost: connectionHost,
|
||||||
|
inputManager: inputManager,
|
||||||
|
audioProvider: audioProvider,
|
||||||
|
navigator: navigator,
|
||||||
|
uiManager: ui,
|
||||||
|
HeroStateFactory: playerStateFactory,
|
||||||
|
}
|
||||||
|
|
||||||
|
characterSelect.logger = d2util.NewLogger()
|
||||||
|
characterSelect.logger.SetLevel(l)
|
||||||
|
characterSelect.logger.SetPrefix(logPrefix)
|
||||||
|
|
||||||
|
return characterSelect, nil
|
||||||
|
}
|
||||||
|
|
||||||
// CharacterSelect represents the character select screen
|
// CharacterSelect represents the character select screen
|
||||||
type CharacterSelect struct {
|
type CharacterSelect struct {
|
||||||
asset *d2asset.AssetManager
|
asset *d2asset.AssetManager
|
||||||
@ -55,42 +97,7 @@ type CharacterSelect struct {
|
|||||||
audioProvider d2interface.AudioProvider
|
audioProvider d2interface.AudioProvider
|
||||||
renderer d2interface.Renderer
|
renderer d2interface.Renderer
|
||||||
navigator d2interface.Navigator
|
navigator d2interface.Navigator
|
||||||
}
|
logger *d2util.Logger
|
||||||
|
|
||||||
// CreateCharacterSelect creates the character select screen and returns a pointer to it
|
|
||||||
func CreateCharacterSelect(
|
|
||||||
navigator d2interface.Navigator,
|
|
||||||
asset *d2asset.AssetManager,
|
|
||||||
renderer d2interface.Renderer,
|
|
||||||
inputManager d2interface.InputManager,
|
|
||||||
audioProvider d2interface.AudioProvider,
|
|
||||||
ui *d2ui.UIManager,
|
|
||||||
connectionType d2clientconnectiontype.ClientConnectionType,
|
|
||||||
connectionHost string,
|
|
||||||
) (*CharacterSelect, error) {
|
|
||||||
playerStateFactory, err := d2hero.NewHeroStateFactory(asset)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
entityFactory, err := d2mapentity.NewMapEntityFactory(asset)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &CharacterSelect{
|
|
||||||
selectedCharacter: -1,
|
|
||||||
asset: asset,
|
|
||||||
MapEntityFactory: entityFactory,
|
|
||||||
renderer: renderer,
|
|
||||||
connectionType: connectionType,
|
|
||||||
connectionHost: connectionHost,
|
|
||||||
inputManager: inputManager,
|
|
||||||
audioProvider: audioProvider,
|
|
||||||
navigator: navigator,
|
|
||||||
uiManager: ui,
|
|
||||||
HeroStateFactory: playerStateFactory,
|
|
||||||
}, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -153,7 +160,7 @@ func (v *CharacterSelect) OnLoad(loading d2screen.LoadingState) {
|
|||||||
|
|
||||||
err := v.inputManager.BindHandler(v)
|
err := v.inputManager.BindHandler(v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("failed to add Character Select screen as event handler")
|
v.logger.Error("failed to add Character Select screen as event handler")
|
||||||
}
|
}
|
||||||
|
|
||||||
loading.Progress(tenPercent)
|
loading.Progress(tenPercent)
|
||||||
@ -205,7 +212,7 @@ func (v *CharacterSelect) loadBackground() {
|
|||||||
|
|
||||||
v.background, err = v.uiManager.NewSprite(d2resource.CharacterSelectionBackground, d2resource.PaletteSky)
|
v.background, err = v.uiManager.NewSprite(d2resource.CharacterSelectionBackground, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
v.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
v.background.SetPosition(bgX, bgY)
|
v.background.SetPosition(bgX, bgY)
|
||||||
@ -232,7 +239,7 @@ func (v *CharacterSelect) loadSelectionBox() {
|
|||||||
|
|
||||||
v.selectionBox, err = v.uiManager.NewSprite(d2resource.CharacterSelectionSelectBox, d2resource.PaletteSky)
|
v.selectionBox, err = v.uiManager.NewSprite(d2resource.CharacterSelectionSelectBox, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
v.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
selBoxX, selBoxY := 37, 86
|
selBoxX, selBoxY := 37, 86
|
||||||
@ -244,7 +251,7 @@ func (v *CharacterSelect) loadOkCancelBox() {
|
|||||||
|
|
||||||
v.okCancelBox, err = v.uiManager.NewSprite(d2resource.PopUpOkCancel, d2resource.PaletteFechar)
|
v.okCancelBox, err = v.uiManager.NewSprite(d2resource.PopUpOkCancel, d2resource.PaletteFechar)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
v.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
okCancelX, okCancelY := 270, 175
|
okCancelX, okCancelY := 270, 175
|
||||||
@ -494,7 +501,7 @@ func (v *CharacterSelect) onDeleteCharButtonClicked() {
|
|||||||
func (v *CharacterSelect) onDeleteCharacterConfirmClicked() {
|
func (v *CharacterSelect) onDeleteCharacterConfirmClicked() {
|
||||||
err := os.Remove(v.gameStates[v.selectedCharacter].FilePath)
|
err := os.Remove(v.gameStates[v.selectedCharacter].FilePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
v.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
v.charScrollbar.SetCurrentOffset(0)
|
v.charScrollbar.SetCurrentOffset(0)
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
package d2gamescreen
|
package d2gamescreen
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2video"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2video"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
@ -24,6 +23,29 @@ const (
|
|||||||
cinematicsExitBtnX, cinematicsExitBtnY = 340, 470
|
cinematicsExitBtnX, cinematicsExitBtnY = 340, 470
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// CreateCinematics creates an instance of the credits screen
|
||||||
|
func CreateCinematics(
|
||||||
|
navigator d2interface.Navigator,
|
||||||
|
asset *d2asset.AssetManager,
|
||||||
|
renderer d2interface.Renderer,
|
||||||
|
aup d2interface.AudioProvider,
|
||||||
|
l d2util.LogLevel,
|
||||||
|
ui *d2ui.UIManager) *Cinematics {
|
||||||
|
cinematics := &Cinematics{
|
||||||
|
asset: asset,
|
||||||
|
renderer: renderer,
|
||||||
|
navigator: navigator,
|
||||||
|
uiManager: ui,
|
||||||
|
audioProvider: aup,
|
||||||
|
}
|
||||||
|
|
||||||
|
cinematics.logger = d2util.NewLogger()
|
||||||
|
cinematics.logger.SetPrefix(logPrefix)
|
||||||
|
cinematics.logger.SetLevel(l)
|
||||||
|
|
||||||
|
return cinematics
|
||||||
|
}
|
||||||
|
|
||||||
// Cinematics represents the cinematics screen
|
// Cinematics represents the cinematics screen
|
||||||
type Cinematics struct {
|
type Cinematics struct {
|
||||||
cinematicsBackground *d2ui.Sprite
|
cinematicsBackground *d2ui.Sprite
|
||||||
@ -44,24 +66,7 @@ type Cinematics struct {
|
|||||||
uiManager *d2ui.UIManager
|
uiManager *d2ui.UIManager
|
||||||
videoDecoder *d2video.BinkDecoder
|
videoDecoder *d2video.BinkDecoder
|
||||||
audioProvider d2interface.AudioProvider
|
audioProvider d2interface.AudioProvider
|
||||||
}
|
logger *d2util.Logger
|
||||||
|
|
||||||
// CreateCinematics creates an instance of the credits screen
|
|
||||||
func CreateCinematics(
|
|
||||||
navigator d2interface.Navigator,
|
|
||||||
asset *d2asset.AssetManager,
|
|
||||||
renderer d2interface.Renderer,
|
|
||||||
aup d2interface.AudioProvider,
|
|
||||||
ui *d2ui.UIManager) *Cinematics {
|
|
||||||
result := &Cinematics{
|
|
||||||
asset: asset,
|
|
||||||
renderer: renderer,
|
|
||||||
navigator: navigator,
|
|
||||||
uiManager: ui,
|
|
||||||
audioProvider: aup,
|
|
||||||
}
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// OnLoad is called to load the resources for the credits screen
|
// OnLoad is called to load the resources for the credits screen
|
||||||
@ -73,7 +78,7 @@ func (v *Cinematics) OnLoad(_ d2screen.LoadingState) {
|
|||||||
v.background, err = v.uiManager.NewSprite(d2resource.GameSelectScreen, d2resource.PaletteSky)
|
v.background, err = v.uiManager.NewSprite(d2resource.GameSelectScreen, d2resource.PaletteSky)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
v.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
v.background.SetPosition(backgroundX, backgroundY)
|
v.background.SetPosition(backgroundX, backgroundY)
|
||||||
@ -81,7 +86,7 @@ func (v *Cinematics) OnLoad(_ d2screen.LoadingState) {
|
|||||||
v.cinematicsBackground, err = v.uiManager.NewSprite(d2resource.CinematicsBackground, d2resource.PaletteSky)
|
v.cinematicsBackground, err = v.uiManager.NewSprite(d2resource.CinematicsBackground, d2resource.PaletteSky)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
v.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
v.cinematicsBackground.SetPosition(cinematicsX, cinematicsY)
|
v.cinematicsBackground.SetPosition(cinematicsX, cinematicsY)
|
||||||
@ -173,7 +178,7 @@ func (v *Cinematics) onEndCreditExpBtnClicked() {
|
|||||||
func (v *Cinematics) playVideo(path string) {
|
func (v *Cinematics) playVideo(path string) {
|
||||||
videoBytes, err := v.asset.LoadFile(path)
|
videoBytes, err := v.asset.LoadFile(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
v.logger.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,8 +2,6 @@ package d2gamescreen
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
@ -29,6 +27,30 @@ type labelItem struct {
|
|||||||
Available bool
|
Available bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreateCredits creates an instance of the credits screen
|
||||||
|
func CreateCredits(navigator d2interface.Navigator,
|
||||||
|
asset *d2asset.AssetManager,
|
||||||
|
renderer d2interface.Renderer,
|
||||||
|
l d2util.LogLevel,
|
||||||
|
ui *d2ui.UIManager) *Credits {
|
||||||
|
credits := &Credits{
|
||||||
|
asset: asset,
|
||||||
|
labels: make([]*labelItem, 0),
|
||||||
|
cycleTime: 0,
|
||||||
|
doneWithCredits: false,
|
||||||
|
cyclesTillNextLine: 0,
|
||||||
|
renderer: renderer,
|
||||||
|
navigator: navigator,
|
||||||
|
uiManager: ui,
|
||||||
|
}
|
||||||
|
|
||||||
|
credits.logger = d2util.NewLogger()
|
||||||
|
credits.logger.SetLevel(l)
|
||||||
|
credits.logger.SetPrefix(logPrefix)
|
||||||
|
|
||||||
|
return credits
|
||||||
|
}
|
||||||
|
|
||||||
// Credits represents the credits screen
|
// Credits represents the credits screen
|
||||||
type Credits struct {
|
type Credits struct {
|
||||||
creditsBackground *d2ui.Sprite
|
creditsBackground *d2ui.Sprite
|
||||||
@ -43,36 +65,20 @@ type Credits struct {
|
|||||||
renderer d2interface.Renderer
|
renderer d2interface.Renderer
|
||||||
navigator d2interface.Navigator
|
navigator d2interface.Navigator
|
||||||
uiManager *d2ui.UIManager
|
uiManager *d2ui.UIManager
|
||||||
}
|
logger *d2util.Logger
|
||||||
|
|
||||||
// CreateCredits creates an instance of the credits screen
|
|
||||||
func CreateCredits(navigator d2interface.Navigator, asset *d2asset.AssetManager, renderer d2interface.Renderer,
|
|
||||||
ui *d2ui.UIManager) *Credits {
|
|
||||||
result := &Credits{
|
|
||||||
asset: asset,
|
|
||||||
labels: make([]*labelItem, 0),
|
|
||||||
cycleTime: 0,
|
|
||||||
doneWithCredits: false,
|
|
||||||
cyclesTillNextLine: 0,
|
|
||||||
renderer: renderer,
|
|
||||||
navigator: navigator,
|
|
||||||
uiManager: ui,
|
|
||||||
}
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoadContributors loads the contributors data from file
|
// LoadContributors loads the contributors data from file
|
||||||
func (v *Credits) LoadContributors() []string {
|
func (v *Credits) LoadContributors() []string {
|
||||||
file, err := os.Open(path.Join("./", "CONTRIBUTORS"))
|
file, err := os.Open(path.Join("./", "CONTRIBUTORS"))
|
||||||
if err != nil || file == nil {
|
if err != nil || file == nil {
|
||||||
log.Print("CONTRIBUTORS file is missing")
|
v.logger.Warning("CONTRIBUTORS file is missing")
|
||||||
return []string{"MISSING CONTRIBUTOR FILES!"}
|
return []string{"MISSING CONTRIBUTOR FILES!"}
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if err = file.Close(); err != nil {
|
if err = file.Close(); err != nil {
|
||||||
fmt.Printf("an error occurred while closing file: %s, err: %q\n", file.Name(), err)
|
v.logger.Error("an error occurred while closing file: %s, err: %q\n" + file.Name() + err.Error())
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@ -92,7 +98,7 @@ func (v *Credits) OnLoad(loading d2screen.LoadingState) {
|
|||||||
|
|
||||||
v.creditsBackground, err = v.uiManager.NewSprite(d2resource.CreditsBackground, d2resource.PaletteSky)
|
v.creditsBackground, err = v.uiManager.NewSprite(d2resource.CreditsBackground, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
v.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
v.creditsBackground.SetPosition(creditsX, creditsY)
|
v.creditsBackground.SetPosition(creditsX, creditsY)
|
||||||
@ -113,7 +119,7 @@ func (v *Credits) OnLoad(loading d2screen.LoadingState) {
|
|||||||
|
|
||||||
creditData, err := d2util.Utf16BytesToString(fileData[2:])
|
creditData, err := d2util.Utf16BytesToString(fileData[2:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
v.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
v.creditsText = strings.Split(creditData, "\r\n")
|
v.creditsText = strings.Split(creditData, "\r\n")
|
||||||
|
@ -35,6 +35,70 @@ const (
|
|||||||
black50alpha = 0x0000007f // rgba
|
black50alpha = 0x0000007f // rgba
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// CreateGame creates the Gameplay screen and returns a pointer to it
|
||||||
|
func CreateGame(
|
||||||
|
navigator d2interface.Navigator,
|
||||||
|
asset *d2asset.AssetManager,
|
||||||
|
ui *d2ui.UIManager,
|
||||||
|
renderer d2interface.Renderer,
|
||||||
|
inputManager d2interface.InputManager,
|
||||||
|
audioProvider d2interface.AudioProvider,
|
||||||
|
gameClient *d2client.GameClient,
|
||||||
|
term d2interface.Terminal,
|
||||||
|
l d2util.LogLevel,
|
||||||
|
guiManager *d2gui.GuiManager,
|
||||||
|
) *Game {
|
||||||
|
// find the local player and its initial location
|
||||||
|
var startX, startY float64
|
||||||
|
|
||||||
|
for _, player := range gameClient.Players {
|
||||||
|
if player.ID() != gameClient.PlayerID {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
worldPosition := player.Position.World()
|
||||||
|
startX, startY = worldPosition.X(), worldPosition.Y()
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
keyMap := d2player.GetDefaultKeyMap(asset)
|
||||||
|
|
||||||
|
game := &Game{
|
||||||
|
asset: asset,
|
||||||
|
gameClient: gameClient,
|
||||||
|
gameControls: nil,
|
||||||
|
localPlayer: nil,
|
||||||
|
lastRegionType: d2enum.RegionNone,
|
||||||
|
ticksSinceLevelCheck: 0,
|
||||||
|
mapRenderer: d2maprenderer.CreateMapRenderer(asset, renderer,
|
||||||
|
gameClient.MapEngine, term, startX, startY),
|
||||||
|
escapeMenu: d2player.NewEscapeMenu(navigator, renderer, audioProvider, ui, guiManager, asset, l, keyMap),
|
||||||
|
inputManager: inputManager,
|
||||||
|
audioProvider: audioProvider,
|
||||||
|
renderer: renderer,
|
||||||
|
terminal: term,
|
||||||
|
soundEngine: d2audio.NewSoundEngine(audioProvider, asset, term),
|
||||||
|
uiManager: ui,
|
||||||
|
guiManager: guiManager,
|
||||||
|
keyMap: keyMap,
|
||||||
|
logLevel: l,
|
||||||
|
}
|
||||||
|
game.logger = d2util.NewLogger()
|
||||||
|
game.logger.SetLevel(l)
|
||||||
|
game.logger.SetPrefix(logPrefix)
|
||||||
|
|
||||||
|
game.soundEnv = d2audio.NewSoundEnvironment(game.soundEngine)
|
||||||
|
|
||||||
|
game.escapeMenu.OnLoad()
|
||||||
|
|
||||||
|
if err := inputManager.BindHandler(game.escapeMenu); err != nil {
|
||||||
|
game.logger.Error("failed to add gameplay screen as event handler")
|
||||||
|
}
|
||||||
|
|
||||||
|
return game
|
||||||
|
}
|
||||||
|
|
||||||
// Game represents the Gameplay screen
|
// Game represents the Gameplay screen
|
||||||
type Game struct {
|
type Game struct {
|
||||||
*d2mapentity.MapEntityFactory
|
*d2mapentity.MapEntityFactory
|
||||||
@ -56,64 +120,8 @@ type Game struct {
|
|||||||
inputManager d2interface.InputManager
|
inputManager d2interface.InputManager
|
||||||
audioProvider d2interface.AudioProvider
|
audioProvider d2interface.AudioProvider
|
||||||
terminal d2interface.Terminal
|
terminal d2interface.Terminal
|
||||||
}
|
logger *d2util.Logger
|
||||||
|
logLevel d2util.LogLevel
|
||||||
// CreateGame creates the Gameplay screen and returns a pointer to it
|
|
||||||
func CreateGame(
|
|
||||||
navigator d2interface.Navigator,
|
|
||||||
asset *d2asset.AssetManager,
|
|
||||||
ui *d2ui.UIManager,
|
|
||||||
renderer d2interface.Renderer,
|
|
||||||
inputManager d2interface.InputManager,
|
|
||||||
audioProvider d2interface.AudioProvider,
|
|
||||||
gameClient *d2client.GameClient,
|
|
||||||
term d2interface.Terminal,
|
|
||||||
guiManager *d2gui.GuiManager,
|
|
||||||
) *Game {
|
|
||||||
// find the local player and its initial location
|
|
||||||
var startX, startY float64
|
|
||||||
|
|
||||||
for _, player := range gameClient.Players {
|
|
||||||
if player.ID() != gameClient.PlayerID {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
worldPosition := player.Position.World()
|
|
||||||
startX, startY = worldPosition.X(), worldPosition.Y()
|
|
||||||
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
keyMap := d2player.GetDefaultKeyMap(asset)
|
|
||||||
|
|
||||||
result := &Game{
|
|
||||||
asset: asset,
|
|
||||||
gameClient: gameClient,
|
|
||||||
gameControls: nil,
|
|
||||||
localPlayer: nil,
|
|
||||||
lastRegionType: d2enum.RegionNone,
|
|
||||||
ticksSinceLevelCheck: 0,
|
|
||||||
mapRenderer: d2maprenderer.CreateMapRenderer(asset, renderer,
|
|
||||||
gameClient.MapEngine, term, startX, startY),
|
|
||||||
escapeMenu: d2player.NewEscapeMenu(navigator, renderer, audioProvider, ui, guiManager, asset, keyMap),
|
|
||||||
inputManager: inputManager,
|
|
||||||
audioProvider: audioProvider,
|
|
||||||
renderer: renderer,
|
|
||||||
terminal: term,
|
|
||||||
soundEngine: d2audio.NewSoundEngine(audioProvider, asset, term),
|
|
||||||
uiManager: ui,
|
|
||||||
guiManager: guiManager,
|
|
||||||
keyMap: keyMap,
|
|
||||||
}
|
|
||||||
result.soundEnv = d2audio.NewSoundEnvironment(result.soundEngine)
|
|
||||||
|
|
||||||
result.escapeMenu.OnLoad()
|
|
||||||
|
|
||||||
if err := inputManager.BindHandler(result.escapeMenu); err != nil {
|
|
||||||
fmt.Println("failed to add gameplay screen as event handler")
|
|
||||||
}
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// OnLoad loads the resources for the Gameplay screen
|
// OnLoad loads the resources for the Gameplay screen
|
||||||
@ -129,7 +137,7 @@ func (v *Game) OnLoad(_ d2screen.LoadingState) {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("failed to bind the '%s' action, err: %v\n", "spawnitem", err)
|
v.logger.Error("failed to bind the '%s' action, err: %v\nspawnitem" + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
err = v.terminal.BindAction(
|
err = v.terminal.BindAction(
|
||||||
@ -141,7 +149,7 @@ func (v *Game) OnLoad(_ d2screen.LoadingState) {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("failed to bind the '%s' action, err: %v\n", "spawnitemat", err)
|
v.logger.Error("failed to bind the '%s' action, err: %v\nspawnitemat" + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
err = v.terminal.BindAction(
|
err = v.terminal.BindAction(
|
||||||
@ -166,7 +174,7 @@ func (v *Game) OnLoad(_ d2screen.LoadingState) {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("failed to bind the '%s' action, err: %v\n", "spawnmon", err)
|
v.logger.Error("failed to bind the '%s' action, err: %v\nspawnmon" + err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -294,7 +302,7 @@ func (v *Game) bindGameControls() error {
|
|||||||
|
|
||||||
var err error
|
var err error
|
||||||
v.gameControls, err = d2player.NewGameControls(v.asset, v.renderer, player, v.gameClient.MapEngine,
|
v.gameControls, err = d2player.NewGameControls(v.asset, v.renderer, player, v.gameClient.MapEngine,
|
||||||
v.escapeMenu, v.mapRenderer, v, v.terminal, v.uiManager, v.guiManager, v.keyMap, v.gameClient.IsSinglePlayer())
|
v.escapeMenu, v.mapRenderer, v, v.terminal, v.uiManager, v.guiManager, v.keyMap, v.logLevel, v.gameClient.IsSinglePlayer())
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -303,7 +311,7 @@ func (v *Game) bindGameControls() error {
|
|||||||
v.gameControls.Load()
|
v.gameControls.Load()
|
||||||
|
|
||||||
if err := v.inputManager.BindHandler(v.gameControls); err != nil {
|
if err := v.inputManager.BindHandler(v.gameControls); err != nil {
|
||||||
fmt.Printf(bindControlsErrStr, player.ID())
|
v.logger.Error(bindControlsErrStr + player.ID())
|
||||||
}
|
}
|
||||||
|
|
||||||
break
|
break
|
||||||
@ -321,7 +329,7 @@ func (v *Game) OnPlayerMove(targetX, targetY float64) {
|
|||||||
err := v.gameClient.SendPacketToServer(createMovePlayerPacket)
|
err := v.gameClient.SendPacketToServer(createMovePlayerPacket)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf(moveErrStr, v.gameClient.PlayerID, targetX, targetY)
|
v.logger.Error(fmt.Sprintf(moveErrStr, v.gameClient.PlayerID, targetX, targetY))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -341,7 +349,7 @@ func (v *Game) OnPlayerSave() error {
|
|||||||
func (v *Game) OnPlayerCast(skillID int, targetX, targetY float64) {
|
func (v *Game) OnPlayerCast(skillID int, targetX, targetY float64) {
|
||||||
err := v.gameClient.SendPacketToServer(d2netpacket.CreateCastPacket(v.gameClient.PlayerID, skillID, targetX, targetY))
|
err := v.gameClient.SendPacketToServer(d2netpacket.CreateCastPacket(v.gameClient.PlayerID, skillID, targetX, targetY))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf(castErrStr, v.gameClient.PlayerID, skillID, targetX, targetY)
|
v.logger.Error(fmt.Sprintf(castErrStr, v.gameClient.PlayerID, skillID, targetX, targetY))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -362,6 +370,6 @@ func (v *Game) debugSpawnItemAtLocation(x, y int, codes ...string) {
|
|||||||
|
|
||||||
err := v.gameClient.SendPacketToServer(packet)
|
err := v.gameClient.SendPacketToServer(packet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf(spawnItemErrStr, x, y, codes)
|
v.logger.Error(fmt.Sprintf(spawnItemErrStr, x, y, codes))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,25 +4,36 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// CreateGuiTestMain creates a GuiTestMain screen
|
||||||
|
func CreateGuiTestMain(renderer d2interface.Renderer,
|
||||||
|
guiManager *d2gui.GuiManager,
|
||||||
|
l d2util.LogLevel,
|
||||||
|
assetManager *d2asset.AssetManager) *GuiTestMain {
|
||||||
|
guiTestMain := &GuiTestMain{
|
||||||
|
renderer: renderer,
|
||||||
|
guiManager: guiManager,
|
||||||
|
assetManager: assetManager,
|
||||||
|
}
|
||||||
|
|
||||||
|
guiTestMain.logger = d2util.NewLogger()
|
||||||
|
guiTestMain.logger.SetLevel(l)
|
||||||
|
guiTestMain.logger.SetPrefix(logPrefix)
|
||||||
|
|
||||||
|
return guiTestMain
|
||||||
|
}
|
||||||
|
|
||||||
// GuiTestMain is a playground screen for the gui components
|
// GuiTestMain is a playground screen for the gui components
|
||||||
type GuiTestMain struct {
|
type GuiTestMain struct {
|
||||||
renderer d2interface.Renderer
|
renderer d2interface.Renderer
|
||||||
guiManager *d2gui.GuiManager
|
guiManager *d2gui.GuiManager
|
||||||
assetManager *d2asset.AssetManager
|
assetManager *d2asset.AssetManager
|
||||||
}
|
logger *d2util.Logger
|
||||||
|
|
||||||
// CreateGuiTestMain creates a GuiTestMain screen
|
|
||||||
func CreateGuiTestMain(renderer d2interface.Renderer, guiManager *d2gui.GuiManager, assetManager *d2asset.AssetManager) *GuiTestMain {
|
|
||||||
return &GuiTestMain{
|
|
||||||
renderer: renderer,
|
|
||||||
guiManager: guiManager,
|
|
||||||
assetManager: assetManager,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// OnLoad loads the resources and creates the gui components
|
// OnLoad loads the resources and creates the gui components
|
||||||
|
@ -3,7 +3,6 @@ package d2gamescreen
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
@ -14,6 +13,7 @@ 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/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
@ -74,11 +74,57 @@ const (
|
|||||||
joinGameCharacterFilter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890._:"
|
joinGameCharacterFilter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890._:"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
logPrefix = "Game Screen"
|
||||||
|
)
|
||||||
|
|
||||||
// BuildInfo contains information about the current build
|
// BuildInfo contains information about the current build
|
||||||
type BuildInfo struct {
|
type BuildInfo struct {
|
||||||
Branch, Commit string
|
Branch, Commit string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreateMainMenu creates an instance of MainMenu
|
||||||
|
func CreateMainMenu(
|
||||||
|
navigator d2interface.Navigator,
|
||||||
|
asset *d2asset.AssetManager,
|
||||||
|
renderer d2interface.Renderer,
|
||||||
|
inputManager d2interface.InputManager,
|
||||||
|
audioProvider d2interface.AudioProvider,
|
||||||
|
ui *d2ui.UIManager,
|
||||||
|
buildInfo BuildInfo,
|
||||||
|
l d2util.LogLevel,
|
||||||
|
errorMessageOptional ...string,
|
||||||
|
) (*MainMenu, error) {
|
||||||
|
heroStateFactory, err := d2hero.NewHeroStateFactory(asset)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
mainMenu := &MainMenu{
|
||||||
|
asset: asset,
|
||||||
|
screenMode: ScreenModeUnknown,
|
||||||
|
leftButtonHeld: true,
|
||||||
|
renderer: renderer,
|
||||||
|
inputManager: inputManager,
|
||||||
|
audioProvider: audioProvider,
|
||||||
|
navigator: navigator,
|
||||||
|
buildInfo: buildInfo,
|
||||||
|
uiManager: ui,
|
||||||
|
heroState: heroStateFactory,
|
||||||
|
}
|
||||||
|
|
||||||
|
mainMenu.logger = d2util.NewLogger()
|
||||||
|
mainMenu.logger.SetPrefix(logPrefix)
|
||||||
|
mainMenu.logger.SetLevel(l)
|
||||||
|
|
||||||
|
if len(errorMessageOptional) != 0 {
|
||||||
|
mainMenu.errorLabel = ui.NewLabel(d2resource.FontFormal12, d2resource.PaletteUnits)
|
||||||
|
mainMenu.errorLabel.SetText(errorMessageOptional[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
return mainMenu, nil
|
||||||
|
}
|
||||||
|
|
||||||
// MainMenu represents the main menu
|
// MainMenu represents the main menu
|
||||||
type MainMenu struct {
|
type MainMenu struct {
|
||||||
tcpIPBackground *d2ui.Sprite
|
tcpIPBackground *d2ui.Sprite
|
||||||
@ -126,43 +172,8 @@ type MainMenu struct {
|
|||||||
heroState *d2hero.HeroStateFactory
|
heroState *d2hero.HeroStateFactory
|
||||||
|
|
||||||
buildInfo BuildInfo
|
buildInfo BuildInfo
|
||||||
}
|
|
||||||
|
|
||||||
// CreateMainMenu creates an instance of MainMenu
|
logger *d2util.Logger
|
||||||
func CreateMainMenu(
|
|
||||||
navigator d2interface.Navigator,
|
|
||||||
asset *d2asset.AssetManager,
|
|
||||||
renderer d2interface.Renderer,
|
|
||||||
inputManager d2interface.InputManager,
|
|
||||||
audioProvider d2interface.AudioProvider,
|
|
||||||
ui *d2ui.UIManager,
|
|
||||||
buildInfo BuildInfo,
|
|
||||||
errorMessageOptional ...string,
|
|
||||||
) (*MainMenu, error) {
|
|
||||||
heroStateFactory, err := d2hero.NewHeroStateFactory(asset)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
mainMenu := &MainMenu{
|
|
||||||
asset: asset,
|
|
||||||
screenMode: ScreenModeUnknown,
|
|
||||||
leftButtonHeld: true,
|
|
||||||
renderer: renderer,
|
|
||||||
inputManager: inputManager,
|
|
||||||
audioProvider: audioProvider,
|
|
||||||
navigator: navigator,
|
|
||||||
buildInfo: buildInfo,
|
|
||||||
uiManager: ui,
|
|
||||||
heroState: heroStateFactory,
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(errorMessageOptional) != 0 {
|
|
||||||
mainMenu.errorLabel = ui.NewLabel(d2resource.FontFormal12, d2resource.PaletteUnits)
|
|
||||||
mainMenu.errorLabel.SetText(errorMessageOptional[0])
|
|
||||||
}
|
|
||||||
|
|
||||||
return mainMenu, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// OnLoad is called to load the resources for the main menu
|
// OnLoad is called to load the resources for the main menu
|
||||||
@ -187,7 +198,7 @@ func (v *MainMenu) OnLoad(loading d2screen.LoadingState) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := v.inputManager.BindHandler(v); err != nil {
|
if err := v.inputManager.BindHandler(v); err != nil {
|
||||||
fmt.Println("failed to add main menu as event handler")
|
v.logger.Error("failed to add main menu as event handler")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,28 +207,28 @@ func (v *MainMenu) loadBackgroundSprites() {
|
|||||||
|
|
||||||
v.background, err = v.uiManager.NewSprite(d2resource.GameSelectScreen, d2resource.PaletteSky)
|
v.background, err = v.uiManager.NewSprite(d2resource.GameSelectScreen, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
v.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
v.background.SetPosition(backgroundX, backgroundY)
|
v.background.SetPosition(backgroundX, backgroundY)
|
||||||
|
|
||||||
v.trademarkBackground, err = v.uiManager.NewSprite(d2resource.TrademarkScreen, d2resource.PaletteSky)
|
v.trademarkBackground, err = v.uiManager.NewSprite(d2resource.TrademarkScreen, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
v.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
v.trademarkBackground.SetPosition(backgroundX, backgroundY)
|
v.trademarkBackground.SetPosition(backgroundX, backgroundY)
|
||||||
|
|
||||||
v.tcpIPBackground, err = v.uiManager.NewSprite(d2resource.TCPIPBackground, d2resource.PaletteSky)
|
v.tcpIPBackground, err = v.uiManager.NewSprite(d2resource.TCPIPBackground, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
v.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
v.tcpIPBackground.SetPosition(backgroundX, backgroundY)
|
v.tcpIPBackground.SetPosition(backgroundX, backgroundY)
|
||||||
|
|
||||||
v.serverIPBackground, err = v.uiManager.NewSprite(d2resource.PopUpOkCancel, d2resource.PaletteFechar)
|
v.serverIPBackground, err = v.uiManager.NewSprite(d2resource.PopUpOkCancel, d2resource.PaletteFechar)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
v.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
v.serverIPBackground.SetPosition(serverIPbackgroundX, serverIPbackgroundY)
|
v.serverIPBackground.SetPosition(serverIPbackgroundX, serverIPbackgroundY)
|
||||||
@ -285,7 +296,7 @@ func (v *MainMenu) createLogos(loading d2screen.LoadingState) {
|
|||||||
|
|
||||||
v.diabloLogoLeft, err = v.uiManager.NewSprite(d2resource.Diablo2LogoFireLeft, d2resource.PaletteUnits)
|
v.diabloLogoLeft, err = v.uiManager.NewSprite(d2resource.Diablo2LogoFireLeft, d2resource.PaletteUnits)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
v.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
v.diabloLogoLeft.SetEffect(d2enum.DrawEffectModulate)
|
v.diabloLogoLeft.SetEffect(d2enum.DrawEffectModulate)
|
||||||
@ -295,7 +306,7 @@ func (v *MainMenu) createLogos(loading d2screen.LoadingState) {
|
|||||||
|
|
||||||
v.diabloLogoRight, err = v.uiManager.NewSprite(d2resource.Diablo2LogoFireRight, d2resource.PaletteUnits)
|
v.diabloLogoRight, err = v.uiManager.NewSprite(d2resource.Diablo2LogoFireRight, d2resource.PaletteUnits)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
v.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
v.diabloLogoRight.SetEffect(d2enum.DrawEffectModulate)
|
v.diabloLogoRight.SetEffect(d2enum.DrawEffectModulate)
|
||||||
@ -304,14 +315,14 @@ func (v *MainMenu) createLogos(loading d2screen.LoadingState) {
|
|||||||
|
|
||||||
v.diabloLogoLeftBack, err = v.uiManager.NewSprite(d2resource.Diablo2LogoBlackLeft, d2resource.PaletteUnits)
|
v.diabloLogoLeftBack, err = v.uiManager.NewSprite(d2resource.Diablo2LogoBlackLeft, d2resource.PaletteUnits)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
v.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
v.diabloLogoLeftBack.SetPosition(diabloLogoX, diabloLogoY)
|
v.diabloLogoLeftBack.SetPosition(diabloLogoX, diabloLogoY)
|
||||||
|
|
||||||
v.diabloLogoRightBack, err = v.uiManager.NewSprite(d2resource.Diablo2LogoBlackRight, d2resource.PaletteUnits)
|
v.diabloLogoRightBack, err = v.uiManager.NewSprite(d2resource.Diablo2LogoBlackRight, d2resource.PaletteUnits)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
v.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
v.diabloLogoRightBack.SetPosition(diabloLogoX, diabloLogoY)
|
v.diabloLogoRightBack.SetPosition(diabloLogoX, diabloLogoY)
|
||||||
@ -415,7 +426,7 @@ func (v *MainMenu) onGithubButtonClicked() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
v.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -625,15 +636,13 @@ func (v *MainMenu) getLocalIP() string {
|
|||||||
conn, err := net.Dial("udp", "8.8.8.8:80")
|
conn, err := net.Dial("udp", "8.8.8.8:80")
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
v.logger.Error(err.Error())
|
||||||
|
|
||||||
return "cannot reach network"
|
return "cannot reach network"
|
||||||
}
|
}
|
||||||
|
|
||||||
err = conn.Close()
|
err = conn.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
v.logger.Error(err.Error())
|
||||||
|
|
||||||
return "unexpected error occurred while closing test connection"
|
return "unexpected error occurred while closing test connection"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,6 @@ package d2gamescreen
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@ -13,6 +12,7 @@ import (
|
|||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2math/d2vector"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2math/d2vector"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapengine"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapengine"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapgen"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapgen"
|
||||||
@ -87,6 +87,46 @@ func getRegions() []regionSpec {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreateMapEngineTest creates the Map Engine Test screen and returns a pointer to it
|
||||||
|
func CreateMapEngineTest(currentRegion,
|
||||||
|
levelPreset int,
|
||||||
|
asset *d2asset.AssetManager,
|
||||||
|
term d2interface.Terminal,
|
||||||
|
renderer d2interface.Renderer,
|
||||||
|
inputManager d2interface.InputManager,
|
||||||
|
audioProvider d2interface.AudioProvider,
|
||||||
|
l d2util.LogLevel,
|
||||||
|
screen *d2screen.ScreenManager,
|
||||||
|
) (*MapEngineTest, error) {
|
||||||
|
heroStateFactory, err := d2hero.NewHeroStateFactory(asset)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
mapEngineTest := &MapEngineTest{
|
||||||
|
currentRegion: currentRegion,
|
||||||
|
levelPreset: levelPreset,
|
||||||
|
fileIndex: 0,
|
||||||
|
regionSpec: regionSpec{},
|
||||||
|
filesCount: 0,
|
||||||
|
asset: asset,
|
||||||
|
terminal: term,
|
||||||
|
renderer: renderer,
|
||||||
|
inputManager: inputManager,
|
||||||
|
audioProvider: audioProvider,
|
||||||
|
screen: screen,
|
||||||
|
playerStateFactory: heroStateFactory,
|
||||||
|
}
|
||||||
|
|
||||||
|
mapEngineTest.playerState = heroStateFactory.CreateTestGameState()
|
||||||
|
|
||||||
|
mapEngineTest.logger = d2util.NewLogger()
|
||||||
|
mapEngineTest.logger.SetLevel(l)
|
||||||
|
mapEngineTest.logger.SetPrefix(logPrefix)
|
||||||
|
|
||||||
|
return mapEngineTest, nil
|
||||||
|
}
|
||||||
|
|
||||||
// MapEngineTest represents the MapEngineTest screen
|
// MapEngineTest represents the MapEngineTest screen
|
||||||
type MapEngineTest struct {
|
type MapEngineTest struct {
|
||||||
asset *d2asset.AssetManager
|
asset *d2asset.AssetManager
|
||||||
@ -111,45 +151,12 @@ type MapEngineTest struct {
|
|||||||
fileIndex int
|
fileIndex int
|
||||||
regionSpec regionSpec
|
regionSpec regionSpec
|
||||||
filesCount int
|
filesCount int
|
||||||
}
|
|
||||||
|
|
||||||
// CreateMapEngineTest creates the Map Engine Test screen and returns a pointer to it
|
logger *d2util.Logger
|
||||||
func CreateMapEngineTest(currentRegion,
|
|
||||||
levelPreset int,
|
|
||||||
asset *d2asset.AssetManager,
|
|
||||||
term d2interface.Terminal,
|
|
||||||
renderer d2interface.Renderer,
|
|
||||||
inputManager d2interface.InputManager,
|
|
||||||
audioProvider d2interface.AudioProvider,
|
|
||||||
screen *d2screen.ScreenManager,
|
|
||||||
) (*MapEngineTest, error) {
|
|
||||||
heroStateFactory, err := d2hero.NewHeroStateFactory(asset)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
result := &MapEngineTest{
|
|
||||||
currentRegion: currentRegion,
|
|
||||||
levelPreset: levelPreset,
|
|
||||||
fileIndex: 0,
|
|
||||||
regionSpec: regionSpec{},
|
|
||||||
filesCount: 0,
|
|
||||||
asset: asset,
|
|
||||||
terminal: term,
|
|
||||||
renderer: renderer,
|
|
||||||
inputManager: inputManager,
|
|
||||||
audioProvider: audioProvider,
|
|
||||||
screen: screen,
|
|
||||||
playerStateFactory: heroStateFactory,
|
|
||||||
}
|
|
||||||
|
|
||||||
result.playerState = heroStateFactory.CreateTestGameState()
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (met *MapEngineTest) loadRegionByIndex(n, levelPreset, fileIndex int) {
|
func (met *MapEngineTest) loadRegionByIndex(n, levelPreset, fileIndex int) {
|
||||||
log.Printf("Loaded region: Type(%d) LevelPreset(%d) FileIndex(%d)", n, levelPreset, fileIndex)
|
met.logger.Info(fmt.Sprintf("Loaded region: Type(%d) LevelPreset(%d) FileIndex(%d)", n, levelPreset, fileIndex))
|
||||||
met.mapRenderer.InvalidateImageCache()
|
met.mapRenderer.InvalidateImageCache()
|
||||||
|
|
||||||
for _, spec := range getRegions() {
|
for _, spec := range getRegions() {
|
||||||
@ -204,7 +211,7 @@ func (met *MapEngineTest) loadRegionByIndex(n, levelPreset, fileIndex int) {
|
|||||||
// OnLoad loads the resources for the Map Engine Test screen
|
// OnLoad loads the resources for the Map Engine Test screen
|
||||||
func (met *MapEngineTest) OnLoad(loading d2screen.LoadingState) {
|
func (met *MapEngineTest) OnLoad(loading d2screen.LoadingState) {
|
||||||
if err := met.inputManager.BindHandler(met); err != nil {
|
if err := met.inputManager.BindHandler(met); err != nil {
|
||||||
fmt.Printf("could not add MapEngineTest as event handler")
|
met.logger.Error("could not add MapEngineTest as event handler")
|
||||||
}
|
}
|
||||||
|
|
||||||
loading.Progress(twentyPercent)
|
loading.Progress(twentyPercent)
|
||||||
|
@ -3,7 +3,6 @@ package d2gamescreen
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"image"
|
"image"
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2hero"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2hero"
|
||||||
|
|
||||||
@ -258,17 +257,60 @@ type HeroRenderInfo struct {
|
|||||||
SelectionBounds image.Rectangle
|
SelectionBounds image.Rectangle
|
||||||
SelectSfx d2interface.SoundEffect
|
SelectSfx d2interface.SoundEffect
|
||||||
DeselectSfx d2interface.SoundEffect
|
DeselectSfx d2interface.SoundEffect
|
||||||
|
shc *SelectHeroClass
|
||||||
}
|
}
|
||||||
|
|
||||||
func (hri *HeroRenderInfo) advance(elapsed float64) {
|
func (hri *HeroRenderInfo) advance(elapsed float64) {
|
||||||
advanceSprite(hri.IdleSprite, elapsed)
|
advanceSprite(hri.shc, hri.IdleSprite, elapsed)
|
||||||
advanceSprite(hri.IdleSelectedSprite, elapsed)
|
advanceSprite(hri.shc, hri.IdleSelectedSprite, elapsed)
|
||||||
advanceSprite(hri.ForwardWalkSprite, elapsed)
|
advanceSprite(hri.shc, hri.ForwardWalkSprite, elapsed)
|
||||||
advanceSprite(hri.ForwardWalkSpriteOverlay, elapsed)
|
advanceSprite(hri.shc, hri.ForwardWalkSpriteOverlay, elapsed)
|
||||||
advanceSprite(hri.SelectedSprite, elapsed)
|
advanceSprite(hri.shc, hri.SelectedSprite, elapsed)
|
||||||
advanceSprite(hri.SelectedSpriteOverlay, elapsed)
|
advanceSprite(hri.shc, hri.SelectedSpriteOverlay, elapsed)
|
||||||
advanceSprite(hri.BackWalkSprite, elapsed)
|
advanceSprite(hri.shc, hri.BackWalkSprite, elapsed)
|
||||||
advanceSprite(hri.BackWalkSpriteOverlay, elapsed)
|
advanceSprite(hri.shc, hri.BackWalkSpriteOverlay, elapsed)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateSelectHeroClass creates an instance of a SelectHeroClass
|
||||||
|
func CreateSelectHeroClass(
|
||||||
|
navigator d2interface.Navigator,
|
||||||
|
asset *d2asset.AssetManager,
|
||||||
|
renderer d2interface.Renderer,
|
||||||
|
audioProvider d2interface.AudioProvider,
|
||||||
|
ui *d2ui.UIManager,
|
||||||
|
connectionType d2clientconnectiontype.ClientConnectionType,
|
||||||
|
l d2util.LogLevel,
|
||||||
|
connectionHost string,
|
||||||
|
) (*SelectHeroClass, error) {
|
||||||
|
playerStateFactory, err := d2hero.NewHeroStateFactory(asset)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
inventoryItemFactory, err := d2inventory.NewInventoryItemFactory(asset)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
selectHeroClass := &SelectHeroClass{
|
||||||
|
asset: asset,
|
||||||
|
heroRenderInfo: make(map[d2enum.Hero]*HeroRenderInfo),
|
||||||
|
selectedHero: d2enum.HeroNone,
|
||||||
|
connectionType: connectionType,
|
||||||
|
connectionHost: connectionHost,
|
||||||
|
audioProvider: audioProvider,
|
||||||
|
renderer: renderer,
|
||||||
|
navigator: navigator,
|
||||||
|
uiManager: ui,
|
||||||
|
HeroStateFactory: playerStateFactory,
|
||||||
|
InventoryItemFactory: inventoryItemFactory,
|
||||||
|
}
|
||||||
|
|
||||||
|
selectHeroClass.logger = d2util.NewLogger()
|
||||||
|
selectHeroClass.logger.SetLevel(l)
|
||||||
|
selectHeroClass.logger.SetPrefix(logPrefix)
|
||||||
|
|
||||||
|
return selectHeroClass, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SelectHeroClass represents the Select Hero Class screen
|
// SelectHeroClass represents the Select Hero Class screen
|
||||||
@ -300,43 +342,7 @@ type SelectHeroClass struct {
|
|||||||
audioProvider d2interface.AudioProvider
|
audioProvider d2interface.AudioProvider
|
||||||
renderer d2interface.Renderer
|
renderer d2interface.Renderer
|
||||||
navigator d2interface.Navigator
|
navigator d2interface.Navigator
|
||||||
}
|
logger *d2util.Logger
|
||||||
|
|
||||||
// CreateSelectHeroClass creates an instance of a SelectHeroClass
|
|
||||||
func CreateSelectHeroClass(
|
|
||||||
navigator d2interface.Navigator,
|
|
||||||
asset *d2asset.AssetManager,
|
|
||||||
renderer d2interface.Renderer,
|
|
||||||
audioProvider d2interface.AudioProvider,
|
|
||||||
ui *d2ui.UIManager,
|
|
||||||
connectionType d2clientconnectiontype.ClientConnectionType,
|
|
||||||
connectionHost string,
|
|
||||||
) (*SelectHeroClass, error) {
|
|
||||||
playerStateFactory, err := d2hero.NewHeroStateFactory(asset)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
inventoryItemFactory, err := d2inventory.NewInventoryItemFactory(asset)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
result := &SelectHeroClass{
|
|
||||||
asset: asset,
|
|
||||||
heroRenderInfo: make(map[d2enum.Hero]*HeroRenderInfo),
|
|
||||||
selectedHero: d2enum.HeroNone,
|
|
||||||
connectionType: connectionType,
|
|
||||||
connectionHost: connectionHost,
|
|
||||||
audioProvider: audioProvider,
|
|
||||||
renderer: renderer,
|
|
||||||
navigator: navigator,
|
|
||||||
uiManager: ui,
|
|
||||||
HeroStateFactory: playerStateFactory,
|
|
||||||
InventoryItemFactory: inventoryItemFactory,
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// OnLoad loads the resources for the Select Hero Class screen
|
// OnLoad loads the resources for the Select Hero Class screen
|
||||||
@ -494,13 +500,13 @@ func (v *SelectHeroClass) onOkButtonClicked() {
|
|||||||
|
|
||||||
playerState, err := v.CreateHeroState(heroName, v.selectedHero, statsState)
|
playerState, err := v.CreateHeroState(heroName, v.selectedHero, statsState)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("failed to create hero state!, err: %v\n", err)
|
v.logger.Error("failed to create hero state!, err: %v\n" + err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = v.Save(playerState)
|
err = v.Save(playerState)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("failed to save game state!, err: %v\n", err)
|
v.logger.Error("failed to save game state!, err: %v\n" + err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -640,13 +646,13 @@ func (v *SelectHeroClass) handleCursorButtonPress(hero d2enum.Hero, renderInfo *
|
|||||||
func (v *SelectHeroClass) setCurrentFrame(mouseHover bool, renderInfo *HeroRenderInfo) {
|
func (v *SelectHeroClass) setCurrentFrame(mouseHover bool, renderInfo *HeroRenderInfo) {
|
||||||
if mouseHover && renderInfo.Stance != d2enum.HeroStanceIdleSelected {
|
if mouseHover && renderInfo.Stance != d2enum.HeroStanceIdleSelected {
|
||||||
if err := renderInfo.IdleSelectedSprite.SetCurrentFrame(renderInfo.IdleSprite.GetCurrentFrame()); err != nil {
|
if err := renderInfo.IdleSelectedSprite.SetCurrentFrame(renderInfo.IdleSprite.GetCurrentFrame()); err != nil {
|
||||||
fmt.Printf("could not set current frame to: %d\n", renderInfo.IdleSprite.GetCurrentFrame())
|
v.logger.Error(fmt.Sprintf("could not set current frame to: %d\n", renderInfo.IdleSprite.GetCurrentFrame()))
|
||||||
}
|
}
|
||||||
|
|
||||||
renderInfo.Stance = d2enum.HeroStanceIdleSelected
|
renderInfo.Stance = d2enum.HeroStanceIdleSelected
|
||||||
} else if !mouseHover && renderInfo.Stance != d2enum.HeroStanceIdle {
|
} else if !mouseHover && renderInfo.Stance != d2enum.HeroStanceIdle {
|
||||||
if err := renderInfo.IdleSprite.SetCurrentFrame(renderInfo.IdleSelectedSprite.GetCurrentFrame()); err != nil {
|
if err := renderInfo.IdleSprite.SetCurrentFrame(renderInfo.IdleSelectedSprite.GetCurrentFrame()); err != nil {
|
||||||
fmt.Printf("could not set current frame to: %d\n", renderInfo.IdleSelectedSprite.GetCurrentFrame())
|
v.logger.Error(fmt.Sprintf("could not set current frame to: %d\n", renderInfo.IdleSelectedSprite.GetCurrentFrame()))
|
||||||
}
|
}
|
||||||
|
|
||||||
renderInfo.Stance = d2enum.HeroStanceIdle
|
renderInfo.Stance = d2enum.HeroStanceIdle
|
||||||
@ -739,10 +745,10 @@ func drawSprite(sprite *d2ui.Sprite, target d2interface.Surface) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func advanceSprite(sprite *d2ui.Sprite, elapsed float64) {
|
func advanceSprite(v *SelectHeroClass, sprite *d2ui.Sprite, elapsed float64) {
|
||||||
if sprite != nil {
|
if sprite != nil {
|
||||||
if err := sprite.Advance(elapsed); err != nil {
|
if err := sprite.Advance(elapsed); err != nil {
|
||||||
fmt.Printf("could not advance the sprite\n")
|
v.logger.Error("could not advance the sprite:" + err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -757,7 +763,7 @@ func (v *SelectHeroClass) loadSprite(animationPath string, position image.Point,
|
|||||||
|
|
||||||
sprite, err := v.uiManager.NewSprite(animationPath, d2resource.PaletteFechar)
|
sprite, err := v.uiManager.NewSprite(animationPath, d2resource.PaletteFechar)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("could not load sprite for the animation: %s\n", animationPath)
|
v.logger.Error("could not load sprite for the animation: %s\n" + animationPath + "with error: " + err.Error())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -780,7 +786,7 @@ func (v *SelectHeroClass) loadSprite(animationPath string, position image.Point,
|
|||||||
func (v *SelectHeroClass) loadSoundEffect(sfx string) d2interface.SoundEffect {
|
func (v *SelectHeroClass) loadSoundEffect(sfx string) d2interface.SoundEffect {
|
||||||
result, err := v.audioProvider.LoadSound(sfx, false, false)
|
result, err := v.audioProvider.LoadSound(sfx, false, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
v.logger.Error(err.Error())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,12 +2,12 @@ package d2player
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"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/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
@ -62,6 +62,42 @@ const (
|
|||||||
singleFrame = time.Millisecond * 16
|
singleFrame = time.Millisecond * 16
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewEscapeMenu creates a new escape menu
|
||||||
|
func NewEscapeMenu(navigator d2interface.Navigator,
|
||||||
|
renderer d2interface.Renderer,
|
||||||
|
audioProvider d2interface.AudioProvider,
|
||||||
|
uiManager *d2ui.UIManager,
|
||||||
|
guiManager *d2gui.GuiManager,
|
||||||
|
assetManager *d2asset.AssetManager,
|
||||||
|
l d2util.LogLevel,
|
||||||
|
keyMap *KeyMap,
|
||||||
|
) *EscapeMenu {
|
||||||
|
m := &EscapeMenu{
|
||||||
|
audioProvider: audioProvider,
|
||||||
|
renderer: renderer,
|
||||||
|
navigator: navigator,
|
||||||
|
guiManager: guiManager,
|
||||||
|
assetManager: assetManager,
|
||||||
|
keyMap: keyMap,
|
||||||
|
}
|
||||||
|
|
||||||
|
keyBindingMenu := NewKeyBindingMenu(assetManager, renderer, uiManager, guiManager, keyMap, l, m)
|
||||||
|
m.keyBindingMenu = keyBindingMenu
|
||||||
|
|
||||||
|
m.layouts = make(map[layoutID]*layout)
|
||||||
|
m.layouts[mainLayoutID] = m.newMainLayout()
|
||||||
|
m.layouts[optionsLayoutID] = m.newOptionsLayout()
|
||||||
|
m.layouts[soundOptionsLayoutID] = m.newSoundOptionsLayout()
|
||||||
|
m.layouts[videoOptionsLayoutID] = m.newVideoOptionsLayout()
|
||||||
|
m.layouts[automapOptionsLayoutID] = m.newAutomapOptionsLayout()
|
||||||
|
|
||||||
|
m.logger = d2util.NewLogger()
|
||||||
|
m.logger.SetLevel(l)
|
||||||
|
m.logger.SetPrefix(logPrefix)
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
// EscapeMenu represents the in-game menu that shows up when the esc key is pressed
|
// EscapeMenu represents the in-game menu that shows up when the esc key is pressed
|
||||||
type EscapeMenu struct {
|
type EscapeMenu struct {
|
||||||
isOpen bool
|
isOpen bool
|
||||||
@ -82,6 +118,8 @@ type EscapeMenu struct {
|
|||||||
keyBindingMenu *KeyBindingMenu
|
keyBindingMenu *KeyBindingMenu
|
||||||
|
|
||||||
onCloseCb func()
|
onCloseCb func()
|
||||||
|
|
||||||
|
logger *d2util.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
type layout struct {
|
type layout struct {
|
||||||
@ -116,6 +154,7 @@ type enumLabel struct {
|
|||||||
current int
|
current int
|
||||||
playSound func()
|
playSound func()
|
||||||
updateValue func(optID optionID, value string)
|
updateValue func(optID optionID, value string)
|
||||||
|
*EscapeMenu
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *enumLabel) Trigger() {
|
func (l *enumLabel) Trigger() {
|
||||||
@ -125,7 +164,7 @@ func (l *enumLabel) Trigger() {
|
|||||||
|
|
||||||
currentValue := l.values[l.current]
|
currentValue := l.values[l.current]
|
||||||
if err := l.textChangingLabel.SetText(currentValue); err != nil {
|
if err := l.textChangingLabel.SetText(currentValue); err != nil {
|
||||||
fmt.Printf("could not change the label text to: %s\n", currentValue)
|
l.EscapeMenu.logger.Error(fmt.Sprintf("could not change the label text to: %s\n", currentValue))
|
||||||
}
|
}
|
||||||
|
|
||||||
l.updateValue(l.optionID, currentValue)
|
l.updateValue(l.optionID, currentValue)
|
||||||
@ -136,37 +175,6 @@ type actionableElement interface {
|
|||||||
Trigger()
|
Trigger()
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewEscapeMenu creates a new escape menu
|
|
||||||
func NewEscapeMenu(navigator d2interface.Navigator,
|
|
||||||
renderer d2interface.Renderer,
|
|
||||||
audioProvider d2interface.AudioProvider,
|
|
||||||
uiManager *d2ui.UIManager,
|
|
||||||
guiManager *d2gui.GuiManager,
|
|
||||||
assetManager *d2asset.AssetManager,
|
|
||||||
keyMap *KeyMap,
|
|
||||||
) *EscapeMenu {
|
|
||||||
m := &EscapeMenu{
|
|
||||||
audioProvider: audioProvider,
|
|
||||||
renderer: renderer,
|
|
||||||
navigator: navigator,
|
|
||||||
guiManager: guiManager,
|
|
||||||
assetManager: assetManager,
|
|
||||||
keyMap: keyMap,
|
|
||||||
}
|
|
||||||
|
|
||||||
keyBindingMenu := NewKeyBindingMenu(assetManager, renderer, uiManager, guiManager, keyMap, m)
|
|
||||||
m.keyBindingMenu = keyBindingMenu
|
|
||||||
|
|
||||||
m.layouts = make(map[layoutID]*layout)
|
|
||||||
m.layouts[mainLayoutID] = m.newMainLayout()
|
|
||||||
m.layouts[optionsLayoutID] = m.newOptionsLayout()
|
|
||||||
m.layouts[soundOptionsLayoutID] = m.newSoundOptionsLayout()
|
|
||||||
m.layouts[videoOptionsLayoutID] = m.newVideoOptionsLayout()
|
|
||||||
m.layouts[automapOptionsLayoutID] = m.newAutomapOptionsLayout()
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *EscapeMenu) newMainLayout() *layout {
|
func (m *EscapeMenu) newMainLayout() *layout {
|
||||||
return m.wrapLayout(func(l *layout) {
|
return m.wrapLayout(func(l *layout) {
|
||||||
m.addBigSelectionLabel(l, "OPTIONS", optionsLayoutID)
|
m.addBigSelectionLabel(l, "OPTIONS", optionsLayoutID)
|
||||||
@ -243,7 +251,7 @@ func (m *EscapeMenu) wrapLayout(fn func(*layout)) *layout {
|
|||||||
leftPent, err := left.AddAnimatedSprite(d2resource.PentSpin, d2resource.PaletteUnits, d2gui.DirectionBackward)
|
leftPent, err := left.AddAnimatedSprite(d2resource.PentSpin, d2resource.PaletteUnits, d2gui.DirectionBackward)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
m.logger.Error(err.Error())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -263,7 +271,7 @@ func (m *EscapeMenu) wrapLayout(fn func(*layout)) *layout {
|
|||||||
rightPent, err := right.AddAnimatedSprite(d2resource.PentSpin, d2resource.PaletteUnits, d2gui.DirectionForward)
|
rightPent, err := right.AddAnimatedSprite(d2resource.PentSpin, d2resource.PaletteUnits, d2gui.DirectionForward)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
m.logger.Error(err.Error())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -282,7 +290,7 @@ func (m *EscapeMenu) wrapLayout(fn func(*layout)) *layout {
|
|||||||
func (m *EscapeMenu) addTitle(l *layout, text string) {
|
func (m *EscapeMenu) addTitle(l *layout, text string) {
|
||||||
_, err := l.AddLabel(text, d2gui.FontStyle42Units)
|
_, err := l.AddLabel(text, d2gui.FontStyle42Units)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("could not add label: %s to the escape menu\n", text)
|
m.logger.Error("could not add label: %s to the escape menu\n" + text)
|
||||||
}
|
}
|
||||||
|
|
||||||
l.AddSpacerStatic(spacerWidth, labelGutter)
|
l.AddSpacerStatic(spacerWidth, labelGutter)
|
||||||
@ -291,7 +299,7 @@ func (m *EscapeMenu) addTitle(l *layout, text string) {
|
|||||||
func (m *EscapeMenu) addBigSelectionLabel(l *layout, text string, targetLayout layoutID) {
|
func (m *EscapeMenu) addBigSelectionLabel(l *layout, text string, targetLayout layoutID) {
|
||||||
guiLabel, err := l.AddLabel(text, d2gui.FontStyle42Units)
|
guiLabel, err := l.AddLabel(text, d2gui.FontStyle42Units)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
m.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
label := &showLayoutLabel{Label: guiLabel, target: targetLayout, showLayout: m.showLayout}
|
label := &showLayoutLabel{Label: guiLabel, target: targetLayout, showLayout: m.showLayout}
|
||||||
@ -314,7 +322,7 @@ func (m *EscapeMenu) addPreviousMenuLabel(l *layout) {
|
|||||||
|
|
||||||
guiLabel, err := l.AddLabel("PREVIOUS MENU", d2gui.FontStyle30Units)
|
guiLabel, err := l.AddLabel("PREVIOUS MENU", d2gui.FontStyle30Units)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
m.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
label := &showLayoutLabel{Label: guiLabel, target: optionsLayoutID, showLayout: m.showLayout}
|
label := &showLayoutLabel{Label: guiLabel, target: optionsLayoutID, showLayout: m.showLayout}
|
||||||
@ -338,7 +346,7 @@ func (m *EscapeMenu) addEnumLabel(l *layout, optID optionID, text string, values
|
|||||||
|
|
||||||
_, err := layout.AddLabel(text, d2gui.FontStyle30Units)
|
_, err := layout.AddLabel(text, d2gui.FontStyle30Units)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("could not add label: %s to the escape menu\n", text)
|
m.logger.Error("could not add label: %s to the escape menu\n" + text)
|
||||||
}
|
}
|
||||||
|
|
||||||
elID := len(l.actionableElements)
|
elID := len(l.actionableElements)
|
||||||
@ -351,7 +359,7 @@ func (m *EscapeMenu) addEnumLabel(l *layout, optID optionID, text string, values
|
|||||||
|
|
||||||
guiLabel, err := layout.AddLabel(values[0], d2gui.FontStyle30Units)
|
guiLabel, err := layout.AddLabel(values[0], d2gui.FontStyle30Units)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
m.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
label := &enumLabel{
|
label := &enumLabel{
|
||||||
@ -378,14 +386,14 @@ func (m *EscapeMenu) OnLoad() {
|
|||||||
|
|
||||||
err = m.keyBindingMenu.Load()
|
err = m.keyBindingMenu.Load()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("unable to load the configure controls window: %v", err)
|
m.logger.Error("unable to load the configure controls window: %v" + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
m.layouts[configureControlsLayoutID] = m.newConfigureControlsLayout(m.keyBindingMenu)
|
m.layouts[configureControlsLayoutID] = m.newConfigureControlsLayout(m.keyBindingMenu)
|
||||||
|
|
||||||
m.selectSound, err = m.audioProvider.LoadSound(d2resource.SFXCursorSelect, false, false)
|
m.selectSound, err = m.audioProvider.LoadSound(d2resource.SFXCursorSelect, false, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
m.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -403,7 +411,7 @@ func (m *EscapeMenu) OnEscKey() {
|
|||||||
m.setLayout(optionsLayoutID)
|
m.setLayout(optionsLayoutID)
|
||||||
|
|
||||||
if err := m.keyBindingMenu.Close(); err != nil {
|
if err := m.keyBindingMenu.Close(); err != nil {
|
||||||
log.Printf("unable to close the configure controls menu: %v", err)
|
m.logger.Error("unable to close the configure controls menu: %v" + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
@ -451,7 +459,7 @@ func (m *EscapeMenu) showLayout(id layoutID) {
|
|||||||
if id == configureControlsLayoutID {
|
if id == configureControlsLayoutID {
|
||||||
m.keyBindingMenu.Open()
|
m.keyBindingMenu.Open()
|
||||||
} else if err := m.keyBindingMenu.Close(); err != nil {
|
} else if err := m.keyBindingMenu.Close(); err != nil {
|
||||||
fmt.Printf("unable to close the configure controls menu: %v", err)
|
m.logger.Error("unable to close the configure controls menu: %v" + err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -467,7 +475,7 @@ func (m *EscapeMenu) onHoverElement(id int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *EscapeMenu) onUpdateValue(optID optionID, value string) {
|
func (m *EscapeMenu) onUpdateValue(optID optionID, value string) {
|
||||||
fmt.Printf("updating value %d with %s\n", optID, value)
|
m.logger.Info(fmt.Sprintf("updating value %d with %s\n", optID, value))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *EscapeMenu) setLayout(id layoutID) {
|
func (m *EscapeMenu) setLayout(id layoutID) {
|
||||||
@ -574,7 +582,7 @@ func (m *EscapeMenu) OnMouseButtonDown(event d2interface.MouseEvent) bool {
|
|||||||
|
|
||||||
if m.currentLayout == configureControlsLayoutID {
|
if m.currentLayout == configureControlsLayoutID {
|
||||||
if err := m.keyBindingMenu.onMouseButtonDown(event); err != nil {
|
if err := m.keyBindingMenu.onMouseButtonDown(event); err != nil {
|
||||||
log.Printf("unable to handle mouse down on configure controls menu: %v", err)
|
m.logger.Error("unable to handle mouse down on configure controls menu: %v" + err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -611,7 +619,7 @@ func (m *EscapeMenu) OnMouseMove(event d2interface.MouseMoveEvent) bool {
|
|||||||
func (m *EscapeMenu) OnKeyDown(event d2interface.KeyEvent) bool {
|
func (m *EscapeMenu) OnKeyDown(event d2interface.KeyEvent) bool {
|
||||||
if m.keyBindingMenu.IsOpen() {
|
if m.keyBindingMenu.IsOpen() {
|
||||||
if err := m.keyBindingMenu.OnKeyDown(event); err != nil {
|
if err := m.keyBindingMenu.OnKeyDown(event); err != nil {
|
||||||
log.Printf("unable to handle key down on configure controls menu: %v", err)
|
m.logger.Error("unable to handle key down on configure controls menu: %v" + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
|
@ -2,7 +2,6 @@ package d2player
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -22,6 +21,10 @@ import (
|
|||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
logPrefix = "Player"
|
||||||
|
)
|
||||||
|
|
||||||
// Panel represents the panel at the bottom of the game screen
|
// Panel represents the panel at the bottom of the game screen
|
||||||
type Panel interface {
|
type Panel interface {
|
||||||
IsOpen() bool
|
IsOpen() bool
|
||||||
@ -109,50 +112,6 @@ const (
|
|||||||
menuRightRectH = 400, 0, 400, 600
|
menuRightRectH = 400, 0, 400, 600
|
||||||
)
|
)
|
||||||
|
|
||||||
// GameControls represents the game's controls on the screen
|
|
||||||
type GameControls struct {
|
|
||||||
keyMap *KeyMap
|
|
||||||
actionableRegions []actionableRegion
|
|
||||||
asset *d2asset.AssetManager
|
|
||||||
renderer d2interface.Renderer // https://github.com/OpenDiablo2/OpenDiablo2/issues/798
|
|
||||||
inputListener inputCallbackListener
|
|
||||||
hero *d2mapentity.Player
|
|
||||||
heroState *d2hero.HeroStateFactory
|
|
||||||
mapRenderer *d2maprenderer.MapRenderer
|
|
||||||
escapeMenu *EscapeMenu
|
|
||||||
ui *d2ui.UIManager
|
|
||||||
inventory *Inventory
|
|
||||||
hud *HUD
|
|
||||||
skilltree *skillTree
|
|
||||||
heroStatsPanel *HeroStatsPanel
|
|
||||||
HelpOverlay *HelpOverlay
|
|
||||||
bottomMenuRect *d2geom.Rectangle
|
|
||||||
leftMenuRect *d2geom.Rectangle
|
|
||||||
rightMenuRect *d2geom.Rectangle
|
|
||||||
lastMouseX int
|
|
||||||
lastMouseY int
|
|
||||||
lastLeftBtnActionTime float64
|
|
||||||
lastRightBtnActionTime float64
|
|
||||||
FreeCam bool
|
|
||||||
isSinglePlayer bool
|
|
||||||
}
|
|
||||||
|
|
||||||
type actionableType int
|
|
||||||
|
|
||||||
type actionableRegion struct {
|
|
||||||
actionableTypeID actionableType
|
|
||||||
rect d2geom.Rectangle
|
|
||||||
}
|
|
||||||
|
|
||||||
// SkillResource represents a Skill with its corresponding icon sprite, path to DC6 file and icon number.
|
|
||||||
// SkillResourcePath points to a DC6 resource which contains the icons of multiple skills as frames.
|
|
||||||
// The IconNumber is the frame at which we can find our skill sprite in the DC6 file.
|
|
||||||
type SkillResource struct {
|
|
||||||
SkillResourcePath string // path to a skills DC6 file(see getSkillResourceByClass)
|
|
||||||
IconNumber int // the index of the frame in the DC6 file
|
|
||||||
SkillIcon *d2ui.Sprite
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewGameControls creates a GameControls instance and returns a pointer to it
|
// NewGameControls creates a GameControls instance and returns a pointer to it
|
||||||
// nolint:funlen // doesn't make sense to split this up
|
// nolint:funlen // doesn't make sense to split this up
|
||||||
func NewGameControls(
|
func NewGameControls(
|
||||||
@ -167,6 +126,7 @@ func NewGameControls(
|
|||||||
ui *d2ui.UIManager,
|
ui *d2ui.UIManager,
|
||||||
guiManager *d2gui.GuiManager,
|
guiManager *d2gui.GuiManager,
|
||||||
keyMap *KeyMap,
|
keyMap *KeyMap,
|
||||||
|
l d2util.LogLevel,
|
||||||
isSinglePlayer bool,
|
isSinglePlayer bool,
|
||||||
) (*GameControls, error) {
|
) (*GameControls, error) {
|
||||||
var inventoryRecordKey string
|
var inventoryRecordKey string
|
||||||
@ -248,19 +208,19 @@ func NewGameControls(
|
|||||||
}
|
}
|
||||||
inventoryRecord := asset.Records.Layout.Inventory[inventoryRecordKey]
|
inventoryRecord := asset.Records.Layout.Inventory[inventoryRecordKey]
|
||||||
|
|
||||||
heroStatsPanel := NewHeroStatsPanel(asset, ui, hero.Name(), hero.Class, hero.Stats)
|
heroStatsPanel := NewHeroStatsPanel(asset, ui, hero.Name(), hero.Class, l, hero.Stats)
|
||||||
inventory := NewInventory(asset, ui, inventoryRecord)
|
inventory := NewInventory(asset, ui, l, inventoryRecord)
|
||||||
skilltree := newSkillTree(hero.Skills, hero.Class, asset, ui)
|
skilltree := newSkillTree(hero.Skills, hero.Class, asset, l, ui)
|
||||||
|
|
||||||
miniPanel := newMiniPanel(asset, ui, isSinglePlayer)
|
miniPanel := newMiniPanel(asset, ui, l, isSinglePlayer)
|
||||||
|
|
||||||
heroState, err := d2hero.NewHeroStateFactory(asset)
|
heroState, err := d2hero.NewHeroStateFactory(asset)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
helpOverlay := NewHelpOverlay(asset, renderer, ui, guiManager, keyMap)
|
helpOverlay := NewHelpOverlay(asset, renderer, ui, guiManager, l, keyMap)
|
||||||
hud := NewHUD(asset, ui, hero, helpOverlay, miniPanel, actionableRegions, mapEngine, mapRenderer)
|
hud := NewHUD(asset, ui, hero, helpOverlay, miniPanel, actionableRegions, mapEngine, l, mapRenderer)
|
||||||
|
|
||||||
const blackAlpha50percent = 0x0000007f
|
const blackAlpha50percent = 0x0000007f
|
||||||
|
|
||||||
@ -317,9 +277,59 @@ func NewGameControls(
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gc.logger = d2util.NewLogger()
|
||||||
|
gc.logger.SetLevel(l)
|
||||||
|
gc.logger.SetPrefix(logPrefix)
|
||||||
|
|
||||||
return gc, nil
|
return gc, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GameControls represents the game's controls on the screen
|
||||||
|
type GameControls struct {
|
||||||
|
keyMap *KeyMap
|
||||||
|
actionableRegions []actionableRegion
|
||||||
|
asset *d2asset.AssetManager
|
||||||
|
renderer d2interface.Renderer // https://github.com/OpenDiablo2/OpenDiablo2/issues/798
|
||||||
|
inputListener inputCallbackListener
|
||||||
|
hero *d2mapentity.Player
|
||||||
|
heroState *d2hero.HeroStateFactory
|
||||||
|
mapRenderer *d2maprenderer.MapRenderer
|
||||||
|
escapeMenu *EscapeMenu
|
||||||
|
ui *d2ui.UIManager
|
||||||
|
inventory *Inventory
|
||||||
|
hud *HUD
|
||||||
|
skilltree *skillTree
|
||||||
|
heroStatsPanel *HeroStatsPanel
|
||||||
|
HelpOverlay *HelpOverlay
|
||||||
|
bottomMenuRect *d2geom.Rectangle
|
||||||
|
leftMenuRect *d2geom.Rectangle
|
||||||
|
rightMenuRect *d2geom.Rectangle
|
||||||
|
lastMouseX int
|
||||||
|
lastMouseY int
|
||||||
|
lastLeftBtnActionTime float64
|
||||||
|
lastRightBtnActionTime float64
|
||||||
|
FreeCam bool
|
||||||
|
isSinglePlayer bool
|
||||||
|
|
||||||
|
logger *d2util.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
type actionableType int
|
||||||
|
|
||||||
|
type actionableRegion struct {
|
||||||
|
actionableTypeID actionableType
|
||||||
|
rect d2geom.Rectangle
|
||||||
|
}
|
||||||
|
|
||||||
|
// SkillResource represents a Skill with its corresponding icon sprite, path to DC6 file and icon number.
|
||||||
|
// SkillResourcePath points to a DC6 resource which contains the icons of multiple skills as frames.
|
||||||
|
// The IconNumber is the frame at which we can find our skill sprite in the DC6 file.
|
||||||
|
type SkillResource struct {
|
||||||
|
SkillResourcePath string // path to a skills DC6 file(see getSkillResourceByClass)
|
||||||
|
IconNumber int // the index of the frame in the DC6 file
|
||||||
|
SkillIcon *d2ui.Sprite
|
||||||
|
}
|
||||||
|
|
||||||
// OnKeyRepeat is called to handle repeated key presses
|
// OnKeyRepeat is called to handle repeated key presses
|
||||||
func (g *GameControls) OnKeyRepeat(event d2interface.KeyEvent) bool {
|
func (g *GameControls) OnKeyRepeat(event d2interface.KeyEvent) bool {
|
||||||
if g.FreeCam {
|
if g.FreeCam {
|
||||||
@ -800,7 +810,7 @@ func (g *GameControls) onHoverActionable(item actionableType) {
|
|||||||
|
|
||||||
onHover, found := hoverMap[item]
|
onHover, found := hoverMap[item]
|
||||||
if !found {
|
if !found {
|
||||||
log.Printf("Unrecognized actionableType(%d) being hovered\n", item)
|
g.logger.Error(fmt.Sprintf("Unrecognized actionableType(%d) being hovered\n", item))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -815,23 +825,23 @@ func (g *GameControls) onClickActionable(item actionableType) {
|
|||||||
},
|
},
|
||||||
|
|
||||||
newStats: func() {
|
newStats: func() {
|
||||||
log.Println("New Stats Selector Action Pressed")
|
g.logger.Info("New Stats Selector Action Pressed")
|
||||||
},
|
},
|
||||||
|
|
||||||
xp: func() {
|
xp: func() {
|
||||||
log.Println("XP Action Pressed")
|
g.logger.Info("XP Action Pressed")
|
||||||
},
|
},
|
||||||
|
|
||||||
walkRun: func() {
|
walkRun: func() {
|
||||||
log.Println("Walk/Run Action Pressed")
|
g.logger.Info("Walk/Run Action Pressed")
|
||||||
},
|
},
|
||||||
|
|
||||||
stamina: func() {
|
stamina: func() {
|
||||||
log.Println("Stamina Action Pressed")
|
g.logger.Info("Stamina Action Pressed")
|
||||||
},
|
},
|
||||||
|
|
||||||
newSkills: func() {
|
newSkills: func() {
|
||||||
log.Println("New Skills Selector Action Pressed")
|
g.logger.Info("New Skills Selector Action Pressed")
|
||||||
},
|
},
|
||||||
|
|
||||||
rightSkill: func() {
|
rightSkill: func() {
|
||||||
@ -840,18 +850,19 @@ func (g *GameControls) onClickActionable(item actionableType) {
|
|||||||
|
|
||||||
hpGlobe: func() {
|
hpGlobe: func() {
|
||||||
g.ToggleHpStats()
|
g.ToggleHpStats()
|
||||||
log.Println("HP Globe Pressed")
|
g.logger.Info("HP Globe Pressed")
|
||||||
},
|
},
|
||||||
|
|
||||||
manaGlobe: func() {
|
manaGlobe: func() {
|
||||||
g.ToggleManaStats()
|
g.ToggleManaStats()
|
||||||
log.Println("Mana Globe Pressed")
|
g.logger.Info("Mana Globe Pressed")
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
action, found := actionMap[item]
|
action, found := actionMap[item]
|
||||||
if !found {
|
if !found {
|
||||||
log.Printf("Unrecognized actionableType(%d) being clicked\n", item)
|
// Warning, because some action types are still todo, and could return this error
|
||||||
|
g.logger.Warning(fmt.Sprintf("Unrecognized actionableType(%d) being clicked\n", item))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -961,7 +972,7 @@ func (g *GameControls) bindLearnSkillsCommand(term d2interface.Terminal) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
g.hud.skillSelectMenu.RegenerateImageCache()
|
g.hud.skillSelectMenu.RegenerateImageCache()
|
||||||
log.Printf("Learned %d skills", learnedSkillsCount)
|
g.logger.Info(fmt.Sprintf("Learned %d skills", learnedSkillsCount))
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
term.OutputErrorf("cannot learn skill for class, error: %s", err)
|
term.OutputErrorf("cannot learn skill for class, error: %s", err)
|
||||||
@ -998,7 +1009,7 @@ func (g *GameControls) bindLearnSkillByIDCommand(term d2interface.Terminal) erro
|
|||||||
}
|
}
|
||||||
|
|
||||||
g.hud.skillSelectMenu.RegenerateImageCache()
|
g.hud.skillSelectMenu.RegenerateImageCache()
|
||||||
log.Println("Learned skill: ", skill.Skill)
|
g.logger.Info("Learned skill: " + skill.Skill)
|
||||||
}
|
}
|
||||||
|
|
||||||
return term.BindAction(
|
return term.BindAction(
|
||||||
|
@ -2,10 +2,10 @@ package d2player
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"image"
|
"image"
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -40,11 +40,12 @@ type globeFrame struct {
|
|||||||
offsetX int
|
offsetX int
|
||||||
offsetY int
|
offsetY int
|
||||||
idx int
|
idx int
|
||||||
|
gw *globeWidget
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gf *globeFrame) setFrameIndex() {
|
func (gf *globeFrame) setFrameIndex() {
|
||||||
if err := gf.sprite.SetCurrentFrame(gf.idx); err != nil {
|
if err := gf.sprite.SetCurrentFrame(gf.idx); err != nil {
|
||||||
log.Print(err)
|
gf.gw.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,15 +58,7 @@ func (gf *globeFrame) getSize() (x, y int) {
|
|||||||
return w + gf.offsetX, h + gf.offsetY
|
return w + gf.offsetX, h + gf.offsetY
|
||||||
}
|
}
|
||||||
|
|
||||||
type globeWidget struct {
|
func newGlobeWidget(ui *d2ui.UIManager, x, y int, gtype globeType, value *int, l d2util.LogLevel, valueMax *int) *globeWidget {
|
||||||
*d2ui.BaseWidget
|
|
||||||
value *int
|
|
||||||
valueMax *int
|
|
||||||
globe *globeFrame
|
|
||||||
overlap *globeFrame
|
|
||||||
}
|
|
||||||
|
|
||||||
func newGlobeWidget(ui *d2ui.UIManager, x, y int, gtype globeType, value, valueMax *int) *globeWidget {
|
|
||||||
var globe, overlap *globeFrame
|
var globe, overlap *globeFrame
|
||||||
|
|
||||||
base := d2ui.NewBaseWidget(ui)
|
base := d2ui.NewBaseWidget(ui)
|
||||||
@ -95,13 +88,28 @@ func newGlobeWidget(ui *d2ui.UIManager, x, y int, gtype globeType, value, valueM
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return &globeWidget{
|
gw := &globeWidget{
|
||||||
BaseWidget: base,
|
BaseWidget: base,
|
||||||
value: value,
|
value: value,
|
||||||
valueMax: valueMax,
|
valueMax: valueMax,
|
||||||
globe: globe,
|
globe: globe,
|
||||||
overlap: overlap,
|
overlap: overlap,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gw.logger = d2util.NewLogger()
|
||||||
|
gw.logger.SetLevel(l)
|
||||||
|
gw.logger.SetPrefix(logPrefix)
|
||||||
|
|
||||||
|
return gw
|
||||||
|
}
|
||||||
|
|
||||||
|
type globeWidget struct {
|
||||||
|
*d2ui.BaseWidget
|
||||||
|
value *int
|
||||||
|
valueMax *int
|
||||||
|
globe *globeFrame
|
||||||
|
overlap *globeFrame
|
||||||
|
logger *d2util.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *globeWidget) load() {
|
func (g *globeWidget) load() {
|
||||||
@ -109,14 +117,14 @@ func (g *globeWidget) load() {
|
|||||||
|
|
||||||
g.globe.sprite, err = g.GetManager().NewSprite(d2resource.HealthManaIndicator, d2resource.PaletteSky)
|
g.globe.sprite, err = g.GetManager().NewSprite(d2resource.HealthManaIndicator, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
g.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
g.globe.setFrameIndex()
|
g.globe.setFrameIndex()
|
||||||
|
|
||||||
g.overlap.sprite, err = g.GetManager().NewSprite(d2resource.GameGlobeOverlap, d2resource.PaletteSky)
|
g.overlap.sprite, err = g.GetManager().NewSprite(d2resource.GameGlobeOverlap, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
g.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
g.overlap.setFrameIndex()
|
g.overlap.setFrameIndex()
|
||||||
|
@ -3,12 +3,12 @@ package d2player
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"image/color"
|
"image/color"
|
||||||
"log"
|
|
||||||
|
|
||||||
"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/d2common/d2interface"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
@ -156,6 +156,30 @@ const (
|
|||||||
beltDotY = 568
|
beltDotY = 568
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewHelpOverlay creates a new HelpOverlay instance
|
||||||
|
func NewHelpOverlay(
|
||||||
|
asset *d2asset.AssetManager,
|
||||||
|
renderer d2interface.Renderer,
|
||||||
|
ui *d2ui.UIManager,
|
||||||
|
guiManager *d2gui.GuiManager,
|
||||||
|
l d2util.LogLevel,
|
||||||
|
keyMap *KeyMap,
|
||||||
|
) *HelpOverlay {
|
||||||
|
h := &HelpOverlay{
|
||||||
|
asset: asset,
|
||||||
|
renderer: renderer,
|
||||||
|
uiManager: ui,
|
||||||
|
guiManager: guiManager,
|
||||||
|
keyMap: keyMap,
|
||||||
|
}
|
||||||
|
|
||||||
|
h.logger = d2util.NewLogger()
|
||||||
|
h.logger.SetLevel(l)
|
||||||
|
h.logger.SetPrefix(logPrefix)
|
||||||
|
|
||||||
|
return h
|
||||||
|
}
|
||||||
|
|
||||||
// HelpOverlay represents the in-game overlay that toggles visibility when the h key is pressed
|
// HelpOverlay represents the in-game overlay that toggles visibility when the h key is pressed
|
||||||
type HelpOverlay struct {
|
type HelpOverlay struct {
|
||||||
asset *d2asset.AssetManager
|
asset *d2asset.AssetManager
|
||||||
@ -169,30 +193,13 @@ type HelpOverlay struct {
|
|||||||
closeButton *d2ui.Button
|
closeButton *d2ui.Button
|
||||||
guiManager *d2gui.GuiManager
|
guiManager *d2gui.GuiManager
|
||||||
keyMap *KeyMap
|
keyMap *KeyMap
|
||||||
}
|
|
||||||
|
|
||||||
// NewHelpOverlay creates a new HelpOverlay instance
|
logger *d2util.Logger
|
||||||
func NewHelpOverlay(
|
|
||||||
asset *d2asset.AssetManager,
|
|
||||||
renderer d2interface.Renderer,
|
|
||||||
ui *d2ui.UIManager,
|
|
||||||
guiManager *d2gui.GuiManager,
|
|
||||||
keyMap *KeyMap,
|
|
||||||
) *HelpOverlay {
|
|
||||||
h := &HelpOverlay{
|
|
||||||
asset: asset,
|
|
||||||
renderer: renderer,
|
|
||||||
uiManager: ui,
|
|
||||||
guiManager: guiManager,
|
|
||||||
keyMap: keyMap,
|
|
||||||
}
|
|
||||||
|
|
||||||
return h
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Toggle the visibility state of the overlay
|
// Toggle the visibility state of the overlay
|
||||||
func (h *HelpOverlay) Toggle() {
|
func (h *HelpOverlay) Toggle() {
|
||||||
fmt.Print("Help overlay toggled\n")
|
h.logger.Info("Help overlay toggled")
|
||||||
|
|
||||||
if h.isOpen {
|
if h.isOpen {
|
||||||
h.Close()
|
h.Close()
|
||||||
@ -265,12 +272,12 @@ func (h *HelpOverlay) setupOverlayFrame() {
|
|||||||
for _, frameIndex := range frames {
|
for _, frameIndex := range frames {
|
||||||
f, err := h.uiManager.NewSprite(d2resource.HelpBorder, d2resource.PaletteSky)
|
f, err := h.uiManager.NewSprite(d2resource.HelpBorder, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
err = f.SetCurrentFrame(frameIndex)
|
err = f.SetCurrentFrame(frameIndex)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
frameWidth, frameHeight := f.GetCurrentFrameSize()
|
frameWidth, frameHeight := f.GetCurrentFrameSize()
|
||||||
@ -559,12 +566,12 @@ func (h *HelpOverlay) createBullet(c callout) {
|
|||||||
|
|
||||||
newDot, err := h.uiManager.NewSprite(d2resource.HelpYellowBullet, d2resource.PaletteSky)
|
newDot, err := h.uiManager.NewSprite(d2resource.HelpYellowBullet, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
err = newDot.SetCurrentFrame(0)
|
err = newDot.SetCurrentFrame(0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
newDot.SetPosition(c.DotX, c.DotY+bulletOffsetY)
|
newDot.SetPosition(c.DotX, c.DotY+bulletOffsetY)
|
||||||
@ -601,12 +608,12 @@ func (h *HelpOverlay) createCallout(c callout) {
|
|||||||
|
|
||||||
newDot, err := h.uiManager.NewSprite(d2resource.HelpWhiteBullet, d2resource.PaletteSky)
|
newDot, err := h.uiManager.NewSprite(d2resource.HelpWhiteBullet, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
err = newDot.SetCurrentFrame(0)
|
err = newDot.SetCurrentFrame(0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
newDot.SetPosition(c.DotX, c.DotY)
|
newDot.SetPosition(c.DotX, c.DotY)
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
package d2player
|
package d2player
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"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/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
|
||||||
"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/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
@ -82,6 +82,34 @@ type StatsPanelLabels struct {
|
|||||||
Stamina *d2ui.Label
|
Stamina *d2ui.Label
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewHeroStatsPanel creates a new hero status panel
|
||||||
|
func NewHeroStatsPanel(asset *d2asset.AssetManager,
|
||||||
|
ui *d2ui.UIManager,
|
||||||
|
heroName string,
|
||||||
|
heroClass d2enum.Hero,
|
||||||
|
l d2util.LogLevel,
|
||||||
|
heroState *d2hero.HeroStatsState) *HeroStatsPanel {
|
||||||
|
originX := 0
|
||||||
|
originY := 0
|
||||||
|
|
||||||
|
hsp := &HeroStatsPanel{
|
||||||
|
asset: asset,
|
||||||
|
uiManager: ui,
|
||||||
|
originX: originX,
|
||||||
|
originY: originY,
|
||||||
|
heroState: heroState,
|
||||||
|
heroName: heroName,
|
||||||
|
heroClass: heroClass,
|
||||||
|
labels: &StatsPanelLabels{},
|
||||||
|
}
|
||||||
|
|
||||||
|
hsp.logger = d2util.NewLogger()
|
||||||
|
hsp.logger.SetLevel(l)
|
||||||
|
hsp.logger.SetPrefix(logPrefix)
|
||||||
|
|
||||||
|
return hsp
|
||||||
|
}
|
||||||
|
|
||||||
// HeroStatsPanel represents the hero status panel
|
// HeroStatsPanel represents the hero status panel
|
||||||
type HeroStatsPanel struct {
|
type HeroStatsPanel struct {
|
||||||
asset *d2asset.AssetManager
|
asset *d2asset.AssetManager
|
||||||
@ -97,24 +125,8 @@ type HeroStatsPanel struct {
|
|||||||
originX int
|
originX int
|
||||||
originY int
|
originY int
|
||||||
isOpen bool
|
isOpen bool
|
||||||
}
|
|
||||||
|
|
||||||
// NewHeroStatsPanel creates a new hero status panel
|
logger *d2util.Logger
|
||||||
func NewHeroStatsPanel(asset *d2asset.AssetManager, ui *d2ui.UIManager, heroName string, heroClass d2enum.Hero,
|
|
||||||
heroState *d2hero.HeroStatsState) *HeroStatsPanel {
|
|
||||||
originX := 0
|
|
||||||
originY := 0
|
|
||||||
|
|
||||||
return &HeroStatsPanel{
|
|
||||||
asset: asset,
|
|
||||||
uiManager: ui,
|
|
||||||
originX: originX,
|
|
||||||
originY: originY,
|
|
||||||
heroState: heroState,
|
|
||||||
heroName: heroName,
|
|
||||||
heroClass: heroClass,
|
|
||||||
labels: &StatsPanelLabels{},
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load the data for the hero status panel
|
// Load the data for the hero status panel
|
||||||
@ -128,7 +140,7 @@ func (s *HeroStatsPanel) Load() {
|
|||||||
|
|
||||||
s.panel, err = s.uiManager.NewSprite(d2resource.InventoryCharacterPanel, d2resource.PaletteSky)
|
s.panel, err = s.uiManager.NewSprite(d2resource.InventoryCharacterPanel, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
s.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
w, h := frame.GetSize()
|
w, h := frame.GetSize()
|
||||||
@ -204,7 +216,7 @@ func (s *HeroStatsPanel) renderStaticPanelFrames(target d2interface.Surface) {
|
|||||||
|
|
||||||
for _, frameIndex := range frames {
|
for _, frameIndex := range frames {
|
||||||
if err := s.panel.SetCurrentFrame(frameIndex); err != nil {
|
if err := s.panel.SetCurrentFrame(frameIndex); err != nil {
|
||||||
log.Printf("%e", err)
|
s.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
w, h := s.panel.GetCurrentFrameSize()
|
w, h := s.panel.GetCurrentFrameSize()
|
||||||
|
@ -2,7 +2,6 @@ package d2player
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
|
||||||
"math"
|
"math"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@ -116,6 +115,7 @@ type HUD struct {
|
|||||||
widgetLeftSkill *d2ui.CustomWidget
|
widgetLeftSkill *d2ui.CustomWidget
|
||||||
widgetRightSkill *d2ui.CustomWidget
|
widgetRightSkill *d2ui.CustomWidget
|
||||||
panelBackground *d2ui.CustomWidget
|
panelBackground *d2ui.CustomWidget
|
||||||
|
logger *d2util.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewHUD creates a HUD object
|
// NewHUD creates a HUD object
|
||||||
@ -127,6 +127,7 @@ func NewHUD(
|
|||||||
miniPanel *miniPanel,
|
miniPanel *miniPanel,
|
||||||
actionableRegions []actionableRegion,
|
actionableRegions []actionableRegion,
|
||||||
mapEngine *d2mapengine.MapEngine,
|
mapEngine *d2mapengine.MapEngine,
|
||||||
|
l d2util.LogLevel,
|
||||||
mapRenderer *d2maprenderer.MapRenderer,
|
mapRenderer *d2maprenderer.MapRenderer,
|
||||||
) *HUD {
|
) *HUD {
|
||||||
nameLabel := ui.NewLabel(d2resource.Font16, d2resource.PaletteStatic)
|
nameLabel := ui.NewLabel(d2resource.Font16, d2resource.PaletteStatic)
|
||||||
@ -136,10 +137,10 @@ func NewHUD(
|
|||||||
zoneLabel := ui.NewLabel(d2resource.Font30, d2resource.PaletteUnits)
|
zoneLabel := ui.NewLabel(d2resource.Font30, d2resource.PaletteUnits)
|
||||||
zoneLabel.Alignment = d2ui.HorizontalAlignCenter
|
zoneLabel.Alignment = d2ui.HorizontalAlignCenter
|
||||||
|
|
||||||
healthGlobe := newGlobeWidget(ui, 0, screenHeight, typeHealthGlobe, &hero.Stats.Health, &hero.Stats.MaxHealth)
|
healthGlobe := newGlobeWidget(ui, 0, screenHeight, typeHealthGlobe, &hero.Stats.Health, l, &hero.Stats.MaxHealth)
|
||||||
manaGlobe := newGlobeWidget(ui, screenWidth-manaGlobeScreenOffsetX, screenHeight, typeManaGlobe, &hero.Stats.Mana, &hero.Stats.MaxMana)
|
manaGlobe := newGlobeWidget(ui, screenWidth-manaGlobeScreenOffsetX, screenHeight, typeManaGlobe, &hero.Stats.Mana, l, &hero.Stats.MaxMana)
|
||||||
|
|
||||||
return &HUD{
|
hud := &HUD{
|
||||||
asset: asset,
|
asset: asset,
|
||||||
uiManager: ui,
|
uiManager: ui,
|
||||||
hero: hero,
|
hero: hero,
|
||||||
@ -149,11 +150,17 @@ func NewHUD(
|
|||||||
miniPanel: miniPanel,
|
miniPanel: miniPanel,
|
||||||
actionableRegions: actionableRegions,
|
actionableRegions: actionableRegions,
|
||||||
nameLabel: nameLabel,
|
nameLabel: nameLabel,
|
||||||
skillSelectMenu: NewSkillSelectMenu(asset, ui, hero),
|
skillSelectMenu: NewSkillSelectMenu(asset, ui, l, hero),
|
||||||
zoneChangeText: zoneLabel,
|
zoneChangeText: zoneLabel,
|
||||||
healthGlobe: healthGlobe,
|
healthGlobe: healthGlobe,
|
||||||
manaGlobe: manaGlobe,
|
manaGlobe: manaGlobe,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hud.logger = d2util.NewLogger()
|
||||||
|
hud.logger.SetPrefix(logPrefix)
|
||||||
|
hud.logger.SetLevel(l)
|
||||||
|
|
||||||
|
return hud
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load creates the ui elemets
|
// Load creates the ui elemets
|
||||||
@ -173,7 +180,7 @@ func (h *HUD) loadCustomWidgets() {
|
|||||||
// static background
|
// static background
|
||||||
_, height, err := h.mainPanel.GetFrameSize(0) // health globe is the frame with max height
|
_, height, err := h.mainPanel.GetFrameSize(0) // health globe is the frame with max height
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,7 +217,7 @@ func (h *HUD) loadSkillResources() {
|
|||||||
// https://github.com/OpenDiablo2/OpenDiablo2/issues/799
|
// https://github.com/OpenDiablo2/OpenDiablo2/issues/799
|
||||||
genericSkillsSprite, err := h.uiManager.NewSprite(d2resource.GenericSkills, d2resource.PaletteSky)
|
genericSkillsSprite, err := h.uiManager.NewSprite(d2resource.GenericSkills, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
attackIconID := 2
|
attackIconID := 2
|
||||||
@ -233,17 +240,17 @@ func (h *HUD) loadSprites() {
|
|||||||
|
|
||||||
h.globeSprite, err = h.uiManager.NewSprite(d2resource.GameGlobeOverlap, d2resource.PaletteSky)
|
h.globeSprite, err = h.uiManager.NewSprite(d2resource.GameGlobeOverlap, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
h.hpManaStatusSprite, err = h.uiManager.NewSprite(d2resource.HealthManaIndicator, d2resource.PaletteSky)
|
h.hpManaStatusSprite, err = h.uiManager.NewSprite(d2resource.HealthManaIndicator, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
h.mainPanel, err = h.uiManager.NewSprite(d2resource.GamePanels, d2resource.PaletteSky)
|
h.mainPanel, err = h.uiManager.NewSprite(d2resource.GamePanels, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -348,7 +355,7 @@ func (h *HUD) renderPanelStatic(target d2interface.Surface) {
|
|||||||
|
|
||||||
// Main panel background
|
// Main panel background
|
||||||
if err := h.renderPanel(offsetX, offsetY, target); err != nil {
|
if err := h.renderPanel(offsetX, offsetY, target); err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -357,7 +364,7 @@ func (h *HUD) renderPanelStatic(target d2interface.Surface) {
|
|||||||
offsetX += w + skillIconWidth
|
offsetX += w + skillIconWidth
|
||||||
|
|
||||||
if err := h.renderNewStatsButton(offsetX, offsetY, target); err != nil {
|
if err := h.renderNewStatsButton(offsetX, offsetY, target); err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -366,7 +373,7 @@ func (h *HUD) renderPanelStatic(target d2interface.Surface) {
|
|||||||
offsetX += w
|
offsetX += w
|
||||||
|
|
||||||
if err := h.renderStamina(offsetX, offsetY, target); err != nil {
|
if err := h.renderStamina(offsetX, offsetY, target); err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -375,7 +382,7 @@ func (h *HUD) renderPanelStatic(target d2interface.Surface) {
|
|||||||
offsetX += w
|
offsetX += w
|
||||||
|
|
||||||
if err := h.renderPotions(offsetX, offsetY, target); err != nil {
|
if err := h.renderPotions(offsetX, offsetY, target); err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -384,7 +391,7 @@ func (h *HUD) renderPanelStatic(target d2interface.Surface) {
|
|||||||
offsetX += w
|
offsetX += w
|
||||||
|
|
||||||
if err := h.renderNewSkillsButton(offsetX, offsetY, target); err != nil {
|
if err := h.renderNewSkillsButton(offsetX, offsetY, target); err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -393,7 +400,7 @@ func (h *HUD) renderPanelStatic(target d2interface.Surface) {
|
|||||||
offsetX += w + skillIconWidth
|
offsetX += w + skillIconWidth
|
||||||
|
|
||||||
if err := h.mainPanel.SetCurrentFrame(frameRightGlobeHolder); err != nil {
|
if err := h.mainPanel.SetCurrentFrame(frameRightGlobeHolder); err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -420,7 +427,7 @@ func (h *HUD) renderLeftSkill(x, y int, target d2interface.Surface) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := h.leftSkillResource.SkillIcon.SetCurrentFrame(h.hero.LeftSkill.IconCel); err != nil {
|
if err := h.leftSkillResource.SkillIcon.SetCurrentFrame(h.hero.LeftSkill.IconCel); err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -438,7 +445,7 @@ func (h *HUD) renderRightSkill(x, _ int, target d2interface.Surface) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := h.rightSkillResource.SkillIcon.SetCurrentFrame(h.hero.RightSkill.IconCel); err != nil {
|
if err := h.rightSkillResource.SkillIcon.SetCurrentFrame(h.hero.RightSkill.IconCel); err != nil {
|
||||||
log.Print(err)
|
h.logger.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -704,7 +711,7 @@ func (h *HUD) getSkillResourceByClass(class string) string {
|
|||||||
|
|
||||||
entry, found := resourceMap[class]
|
entry, found := resourceMap[class]
|
||||||
if !found {
|
if !found {
|
||||||
log.Fatalf("Unknown class token: '%s'", class)
|
h.logger.Error("Unknown class token: '%s'" + class)
|
||||||
}
|
}
|
||||||
|
|
||||||
return entry
|
return entry
|
||||||
|
@ -1,14 +1,12 @@
|
|||||||
package d2player
|
package d2player
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2records"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2records"
|
||||||
|
|
||||||
"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/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2item/diablo2item"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2item/diablo2item"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
@ -25,6 +23,34 @@ const (
|
|||||||
invCloseButtonX, invCloseButtonY = 419, 449
|
invCloseButtonX, invCloseButtonY = 419, 449
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewInventory creates an inventory instance and returns a pointer to it
|
||||||
|
func NewInventory(asset *d2asset.AssetManager,
|
||||||
|
ui *d2ui.UIManager,
|
||||||
|
l d2util.LogLevel,
|
||||||
|
record *d2records.InventoryRecord) *Inventory {
|
||||||
|
itemTooltip := ui.NewTooltip(d2resource.FontFormal11, d2resource.PaletteStatic, d2ui.TooltipXCenter, d2ui.TooltipYBottom)
|
||||||
|
|
||||||
|
// https://github.com/OpenDiablo2/OpenDiablo2/issues/797
|
||||||
|
itemFactory, _ := diablo2item.NewItemFactory(asset)
|
||||||
|
|
||||||
|
inventory := &Inventory{
|
||||||
|
asset: asset,
|
||||||
|
uiManager: ui,
|
||||||
|
item: itemFactory,
|
||||||
|
grid: NewItemGrid(asset, ui, l, record),
|
||||||
|
originX: record.Panel.Left,
|
||||||
|
itemTooltip: itemTooltip,
|
||||||
|
// originY: record.Panel.Top,
|
||||||
|
originY: 0, // expansion data has these all offset by +60 ...
|
||||||
|
}
|
||||||
|
|
||||||
|
inventory.logger = d2util.NewLogger()
|
||||||
|
inventory.logger.SetLevel(l)
|
||||||
|
inventory.logger.SetPrefix(logPrefix)
|
||||||
|
|
||||||
|
return inventory
|
||||||
|
}
|
||||||
|
|
||||||
// Inventory represents the inventory
|
// Inventory represents the inventory
|
||||||
type Inventory struct {
|
type Inventory struct {
|
||||||
asset *d2asset.AssetManager
|
asset *d2asset.AssetManager
|
||||||
@ -44,26 +70,8 @@ type Inventory struct {
|
|||||||
hovering bool
|
hovering bool
|
||||||
isOpen bool
|
isOpen bool
|
||||||
onCloseCb func()
|
onCloseCb func()
|
||||||
}
|
|
||||||
|
|
||||||
// NewInventory creates an inventory instance and returns a pointer to it
|
logger *d2util.Logger
|
||||||
func NewInventory(asset *d2asset.AssetManager, ui *d2ui.UIManager,
|
|
||||||
record *d2records.InventoryRecord) *Inventory {
|
|
||||||
itemTooltip := ui.NewTooltip(d2resource.FontFormal11, d2resource.PaletteStatic, d2ui.TooltipXCenter, d2ui.TooltipYBottom)
|
|
||||||
|
|
||||||
// https://github.com/OpenDiablo2/OpenDiablo2/issues/797
|
|
||||||
itemFactory, _ := diablo2item.NewItemFactory(asset)
|
|
||||||
|
|
||||||
return &Inventory{
|
|
||||||
asset: asset,
|
|
||||||
uiManager: ui,
|
|
||||||
item: itemFactory,
|
|
||||||
grid: NewItemGrid(asset, ui, record),
|
|
||||||
originX: record.Panel.Left,
|
|
||||||
itemTooltip: itemTooltip,
|
|
||||||
// originY: record.Panel.Top,
|
|
||||||
originY: 0, // expansion data has these all offset by +60 ...
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsOpen returns true if the inventory is open
|
// IsOpen returns true if the inventory is open
|
||||||
@ -154,7 +162,7 @@ func (g *Inventory) Load() {
|
|||||||
|
|
||||||
_, err := g.grid.Add(inventoryItems...)
|
_, err := g.grid.Add(inventoryItems...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("could not add items to the inventory, err: %v\n", err)
|
g.logger.Error("could not add items to the inventory, err: %v\n" + err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,7 +174,7 @@ func (g *Inventory) Render(target d2interface.Surface) {
|
|||||||
|
|
||||||
err := g.renderFrame(target)
|
err := g.renderFrame(target)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
g.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
g.grid.Render(target)
|
g.grid.Render(target)
|
||||||
|
@ -3,7 +3,6 @@ package d2player
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2records"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2records"
|
||||||
|
|
||||||
@ -14,6 +13,7 @@ import (
|
|||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// images for 1x1 grid tile items (rings and stuff) are 28x28 pixel
|
// images for 1x1 grid tile items (rings and stuff) are 28x28 pixel
|
||||||
@ -36,6 +36,32 @@ type InventoryItem interface {
|
|||||||
|
|
||||||
var errorInventoryFull = errors.New("inventory full")
|
var errorInventoryFull = errors.New("inventory full")
|
||||||
|
|
||||||
|
// NewItemGrid creates a new ItemGrid instance
|
||||||
|
func NewItemGrid(asset *d2asset.AssetManager,
|
||||||
|
ui *d2ui.UIManager,
|
||||||
|
l d2util.LogLevel,
|
||||||
|
record *d2records.InventoryRecord) *ItemGrid {
|
||||||
|
grid := record.Grid
|
||||||
|
|
||||||
|
itemGrid := &ItemGrid{
|
||||||
|
asset: asset,
|
||||||
|
uiManager: ui,
|
||||||
|
width: grid.Box.Width,
|
||||||
|
height: grid.Box.Height,
|
||||||
|
originX: grid.Box.Left,
|
||||||
|
originY: grid.Box.Top + (grid.Rows * cellPadding),
|
||||||
|
slotSize: grid.CellWidth,
|
||||||
|
sprites: make(map[string]*d2ui.Sprite),
|
||||||
|
equipmentSlots: genEquipmentSlotsMap(record),
|
||||||
|
}
|
||||||
|
|
||||||
|
itemGrid.logger = d2util.NewLogger()
|
||||||
|
itemGrid.logger.SetLevel(l)
|
||||||
|
itemGrid.logger.SetPrefix(logPrefix)
|
||||||
|
|
||||||
|
return itemGrid
|
||||||
|
}
|
||||||
|
|
||||||
// ItemGrid is a reusable grid for use with player and merchant inventory.
|
// ItemGrid is a reusable grid for use with player and merchant inventory.
|
||||||
// Handles layout and rendering item icons based on code.
|
// Handles layout and rendering item icons based on code.
|
||||||
type ItemGrid struct {
|
type ItemGrid struct {
|
||||||
@ -49,24 +75,8 @@ type ItemGrid struct {
|
|||||||
originY int
|
originY int
|
||||||
sprites map[string]*d2ui.Sprite
|
sprites map[string]*d2ui.Sprite
|
||||||
slotSize int
|
slotSize int
|
||||||
}
|
|
||||||
|
|
||||||
// NewItemGrid creates a new ItemGrid instance
|
logger *d2util.Logger
|
||||||
func NewItemGrid(asset *d2asset.AssetManager, ui *d2ui.UIManager,
|
|
||||||
record *d2records.InventoryRecord) *ItemGrid {
|
|
||||||
grid := record.Grid
|
|
||||||
|
|
||||||
return &ItemGrid{
|
|
||||||
asset: asset,
|
|
||||||
uiManager: ui,
|
|
||||||
width: grid.Box.Width,
|
|
||||||
height: grid.Box.Height,
|
|
||||||
originX: grid.Box.Left,
|
|
||||||
originY: grid.Box.Top + (grid.Rows * cellPadding),
|
|
||||||
slotSize: grid.CellWidth,
|
|
||||||
sprites: make(map[string]*d2ui.Sprite),
|
|
||||||
equipmentSlots: genEquipmentSlotsMap(record),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SlotToScreen translates slot coordinates to screen coordinates
|
// SlotToScreen translates slot coordinates to screen coordinates
|
||||||
@ -135,7 +145,7 @@ func (g *ItemGrid) loadItem(item InventoryItem) {
|
|||||||
|
|
||||||
itemSprite, err := g.uiManager.NewSprite(imgPath, d2resource.PaletteSky)
|
itemSprite, err := g.uiManager.NewSprite(imgPath, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Failed to load sprite, error: " + err.Error())
|
g.logger.Error("Failed to load sprite, error: " + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
g.sprites[item.GetItemCode()] = itemSprite
|
g.sprites[item.GetItemCode()] = itemSprite
|
||||||
|
@ -2,7 +2,6 @@ package d2player
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"image/color"
|
"image/color"
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
@ -44,6 +43,66 @@ type bindingChange struct {
|
|||||||
secondary d2enum.Key
|
secondary d2enum.Key
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewKeyBindingMenu generates a new instance of the "Configure Keys"
|
||||||
|
// menu found in the options
|
||||||
|
func NewKeyBindingMenu(
|
||||||
|
asset *d2asset.AssetManager,
|
||||||
|
renderer d2interface.Renderer,
|
||||||
|
ui *d2ui.UIManager,
|
||||||
|
guiManager *d2gui.GuiManager,
|
||||||
|
keyMap *KeyMap,
|
||||||
|
l d2util.LogLevel,
|
||||||
|
escapeMenu *EscapeMenu,
|
||||||
|
) *KeyBindingMenu {
|
||||||
|
mainLayout := d2gui.CreateLayout(renderer, d2gui.PositionTypeAbsolute, asset)
|
||||||
|
contentLayout := mainLayout.AddLayout(d2gui.PositionTypeAbsolute)
|
||||||
|
|
||||||
|
ret := &KeyBindingMenu{
|
||||||
|
keyMap: keyMap,
|
||||||
|
asset: asset,
|
||||||
|
ui: ui,
|
||||||
|
guiManager: guiManager,
|
||||||
|
renderer: renderer,
|
||||||
|
mainLayout: mainLayout,
|
||||||
|
contentLayout: contentLayout,
|
||||||
|
bindingLayouts: []*bindingLayout{},
|
||||||
|
changesToBeSaved: make(map[d2enum.GameEvent]*bindingChange),
|
||||||
|
escapeMenu: escapeMenu,
|
||||||
|
}
|
||||||
|
|
||||||
|
ret.logger = d2util.NewLogger()
|
||||||
|
ret.logger.SetLevel(l)
|
||||||
|
ret.logger.SetPrefix(logPrefix)
|
||||||
|
|
||||||
|
ret.Box = d2gui.NewBox(
|
||||||
|
asset, renderer, ui, ret.mainLayout,
|
||||||
|
keyBindingMenuWidth, keyBindingMenuHeight,
|
||||||
|
keyBindingMenuX, keyBindingMenuY, "",
|
||||||
|
)
|
||||||
|
|
||||||
|
ret.Box.SetPadding(keyBindingMenuPaddingX, keyBindingSettingPaddingY)
|
||||||
|
|
||||||
|
ret.Box.SetOptions([]*d2gui.LabelButton{
|
||||||
|
d2gui.NewLabelButton(0, 0, "Cancel", d2util.Color(d2gui.ColorRed), func() {
|
||||||
|
if err := ret.onCancelClicked(); err != nil {
|
||||||
|
ret.logger.Error("error while clicking option Cancel: %v" + err.Error())
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
d2gui.NewLabelButton(0, 0, "Default", d2util.Color(d2gui.ColorBlue), func() {
|
||||||
|
if err := ret.onDefaultClicked(); err != nil {
|
||||||
|
ret.logger.Error("error while clicking option Default: %v" + err.Error())
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
d2gui.NewLabelButton(0, 0, "Accept", d2util.Color(d2gui.ColorGreen), func() {
|
||||||
|
if err := ret.onAcceptClicked(); err != nil {
|
||||||
|
ret.logger.Error("error while clicking option Accept: %v" + err.Error())
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
// KeyBindingMenu represents the menu to view/edit the
|
// KeyBindingMenu represents the menu to view/edit the
|
||||||
// key bindings
|
// key bindings
|
||||||
type KeyBindingMenu struct {
|
type KeyBindingMenu struct {
|
||||||
@ -67,61 +126,8 @@ type KeyBindingMenu struct {
|
|||||||
currentBindingModifier d2enum.GameEvent
|
currentBindingModifier d2enum.GameEvent
|
||||||
currentBindingLayout *bindingLayout
|
currentBindingLayout *bindingLayout
|
||||||
lastBindingLayout *bindingLayout
|
lastBindingLayout *bindingLayout
|
||||||
}
|
|
||||||
|
|
||||||
// NewKeyBindingMenu generates a new instance of the "Configure Keys"
|
logger *d2util.Logger
|
||||||
// menu found in the options
|
|
||||||
func NewKeyBindingMenu(
|
|
||||||
asset *d2asset.AssetManager,
|
|
||||||
renderer d2interface.Renderer,
|
|
||||||
ui *d2ui.UIManager,
|
|
||||||
guiManager *d2gui.GuiManager,
|
|
||||||
keyMap *KeyMap,
|
|
||||||
escapeMenu *EscapeMenu,
|
|
||||||
) *KeyBindingMenu {
|
|
||||||
mainLayout := d2gui.CreateLayout(renderer, d2gui.PositionTypeAbsolute, asset)
|
|
||||||
contentLayout := mainLayout.AddLayout(d2gui.PositionTypeAbsolute)
|
|
||||||
|
|
||||||
ret := &KeyBindingMenu{
|
|
||||||
keyMap: keyMap,
|
|
||||||
asset: asset,
|
|
||||||
ui: ui,
|
|
||||||
guiManager: guiManager,
|
|
||||||
renderer: renderer,
|
|
||||||
mainLayout: mainLayout,
|
|
||||||
contentLayout: contentLayout,
|
|
||||||
bindingLayouts: []*bindingLayout{},
|
|
||||||
changesToBeSaved: make(map[d2enum.GameEvent]*bindingChange),
|
|
||||||
escapeMenu: escapeMenu,
|
|
||||||
}
|
|
||||||
|
|
||||||
ret.Box = d2gui.NewBox(
|
|
||||||
asset, renderer, ui, ret.mainLayout,
|
|
||||||
keyBindingMenuWidth, keyBindingMenuHeight,
|
|
||||||
keyBindingMenuX, keyBindingMenuY, "",
|
|
||||||
)
|
|
||||||
|
|
||||||
ret.Box.SetPadding(keyBindingMenuPaddingX, keyBindingSettingPaddingY)
|
|
||||||
|
|
||||||
ret.Box.SetOptions([]*d2gui.LabelButton{
|
|
||||||
d2gui.NewLabelButton(0, 0, "Cancel", d2util.Color(d2gui.ColorRed), func() {
|
|
||||||
if err := ret.onCancelClicked(); err != nil {
|
|
||||||
log.Printf("error while clicking option Cancel: %v", err)
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
d2gui.NewLabelButton(0, 0, "Default", d2util.Color(d2gui.ColorBlue), func() {
|
|
||||||
if err := ret.onDefaultClicked(); err != nil {
|
|
||||||
log.Printf("error while clicking option Default: %v", err)
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
d2gui.NewLabelButton(0, 0, "Accept", d2util.Color(d2gui.ColorGreen), func() {
|
|
||||||
if err := ret.onAcceptClicked(); err != nil {
|
|
||||||
log.Printf("error while clicking option Accept: %v", err)
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
})
|
|
||||||
|
|
||||||
return ret
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close will disable the render of the menu and clear
|
// Close will disable the render of the menu and clear
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
package d2player
|
package d2player
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
)
|
)
|
||||||
@ -41,6 +40,24 @@ type miniPanelActions struct {
|
|||||||
menuToggle func()
|
menuToggle func()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newMiniPanel(asset *d2asset.AssetManager,
|
||||||
|
uiManager *d2ui.UIManager,
|
||||||
|
l d2util.LogLevel,
|
||||||
|
isSinglePlayer bool) *miniPanel {
|
||||||
|
mp := &miniPanel{
|
||||||
|
ui: uiManager,
|
||||||
|
asset: asset,
|
||||||
|
isOpen: false,
|
||||||
|
isSinglePlayer: isSinglePlayer,
|
||||||
|
}
|
||||||
|
|
||||||
|
mp.logger = d2util.NewLogger()
|
||||||
|
mp.logger.SetLevel(l)
|
||||||
|
mp.logger.SetPrefix(logPrefix)
|
||||||
|
|
||||||
|
return mp
|
||||||
|
}
|
||||||
|
|
||||||
type miniPanel struct {
|
type miniPanel struct {
|
||||||
ui *d2ui.UIManager
|
ui *d2ui.UIManager
|
||||||
asset *d2asset.AssetManager
|
asset *d2asset.AssetManager
|
||||||
@ -52,15 +69,8 @@ type miniPanel struct {
|
|||||||
movedRight bool
|
movedRight bool
|
||||||
panelGroup *d2ui.WidgetGroup
|
panelGroup *d2ui.WidgetGroup
|
||||||
tooltipGroup *d2ui.WidgetGroup
|
tooltipGroup *d2ui.WidgetGroup
|
||||||
}
|
|
||||||
|
|
||||||
func newMiniPanel(asset *d2asset.AssetManager, uiManager *d2ui.UIManager, isSinglePlayer bool) *miniPanel {
|
logger *d2util.Logger
|
||||||
return &miniPanel{
|
|
||||||
ui: uiManager,
|
|
||||||
asset: asset,
|
|
||||||
isOpen: false,
|
|
||||||
isSinglePlayer: isSinglePlayer,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *miniPanel) load(actions *miniPanelActions) {
|
func (m *miniPanel) load(actions *miniPanelActions) {
|
||||||
@ -68,7 +78,7 @@ func (m *miniPanel) load(actions *miniPanelActions) {
|
|||||||
|
|
||||||
m.sprite, err = m.ui.NewSprite(d2resource.MinipanelButton, d2resource.PaletteSky)
|
m.sprite, err = m.ui.NewSprite(d2resource.MinipanelButton, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
m.logger.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,12 +100,12 @@ func (m *miniPanel) createWidgets(actions *miniPanelActions) {
|
|||||||
|
|
||||||
m.container, err = m.ui.NewSprite(miniPanelContainerPath, d2resource.PaletteSky)
|
m.container, err = m.ui.NewSprite(miniPanelContainerPath, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
m.logger.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = m.container.SetCurrentFrame(0); err != nil {
|
if err = m.container.SetCurrentFrame(0); err != nil {
|
||||||
log.Print(err)
|
m.logger.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,7 +116,7 @@ func (m *miniPanel) createWidgets(actions *miniPanelActions) {
|
|||||||
|
|
||||||
buttonWidth, buttonHeight, err := m.sprite.GetFrameSize(0)
|
buttonWidth, buttonHeight, err := m.sprite.GetFrameSize(0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
m.logger.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package d2player
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
@ -14,10 +15,10 @@ type SkillSelectMenu struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewSkillSelectMenu creates a skill select menu.
|
// NewSkillSelectMenu creates a skill select menu.
|
||||||
func NewSkillSelectMenu(asset *d2asset.AssetManager, ui *d2ui.UIManager, hero *d2mapentity.Player) *SkillSelectMenu {
|
func NewSkillSelectMenu(asset *d2asset.AssetManager, ui *d2ui.UIManager, l d2util.LogLevel, hero *d2mapentity.Player) *SkillSelectMenu {
|
||||||
skillSelectMenu := &SkillSelectMenu{
|
skillSelectMenu := &SkillSelectMenu{
|
||||||
LeftPanel: NewHeroSkillsPanel(asset, ui, hero, true),
|
LeftPanel: NewHeroSkillsPanel(asset, ui, hero, l, true),
|
||||||
RightPanel: NewHeroSkillsPanel(asset, ui, hero, false),
|
RightPanel: NewHeroSkillsPanel(asset, ui, hero, l, false),
|
||||||
}
|
}
|
||||||
|
|
||||||
return skillSelectMenu
|
return skillSelectMenu
|
||||||
|
@ -2,12 +2,12 @@ package d2player
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2geom"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2geom"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
|
||||||
"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/d2map/d2mapentity"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity"
|
||||||
@ -25,6 +25,40 @@ const (
|
|||||||
skillListsLength = 5 // 0 to 4. 0 - General Skills, 1 to 3 - Class-specific skills(based on the 3 different skill trees), 4 - Other skills
|
skillListsLength = 5 // 0 to 4. 0 - General Skills, 1 to 3 - Class-specific skills(based on the 3 different skill trees), 4 - Other skills
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewHeroSkillsPanel creates a new hero status panel
|
||||||
|
func NewHeroSkillsPanel(asset *d2asset.AssetManager,
|
||||||
|
ui *d2ui.UIManager,
|
||||||
|
hero *d2mapentity.Player,
|
||||||
|
l d2util.LogLevel,
|
||||||
|
isLeftPanel bool) *SkillPanel {
|
||||||
|
var activeSkill *d2hero.HeroSkill
|
||||||
|
if isLeftPanel {
|
||||||
|
activeSkill = hero.LeftSkill
|
||||||
|
} else {
|
||||||
|
activeSkill = hero.RightSkill
|
||||||
|
}
|
||||||
|
|
||||||
|
hoverTooltip := ui.NewTooltip(d2resource.Font16, d2resource.PaletteStatic, d2ui.TooltipXLeft, d2ui.TooltipYTop)
|
||||||
|
|
||||||
|
skillPanel := &SkillPanel{
|
||||||
|
asset: asset,
|
||||||
|
activeSkill: activeSkill,
|
||||||
|
ui: ui,
|
||||||
|
isOpen: false,
|
||||||
|
ListRows: make([]*SkillListRow, skillListsLength),
|
||||||
|
renderer: ui.Renderer(),
|
||||||
|
isLeftPanel: isLeftPanel,
|
||||||
|
hero: hero,
|
||||||
|
hoverTooltip: hoverTooltip,
|
||||||
|
}
|
||||||
|
|
||||||
|
skillPanel.logger = d2util.NewLogger()
|
||||||
|
skillPanel.logger.SetLevel(l)
|
||||||
|
skillPanel.logger.SetPrefix(logPrefix)
|
||||||
|
|
||||||
|
return skillPanel
|
||||||
|
}
|
||||||
|
|
||||||
// SkillPanel represents a skill select menu popup that is displayed when the player left clicks on his active left/right skill.
|
// SkillPanel represents a skill select menu popup that is displayed when the player left clicks on his active left/right skill.
|
||||||
type SkillPanel struct {
|
type SkillPanel struct {
|
||||||
asset *d2asset.AssetManager
|
asset *d2asset.AssetManager
|
||||||
@ -38,30 +72,8 @@ type SkillPanel struct {
|
|||||||
isOpen bool
|
isOpen bool
|
||||||
regenerateImageCache bool
|
regenerateImageCache bool
|
||||||
isLeftPanel bool
|
isLeftPanel bool
|
||||||
}
|
|
||||||
|
|
||||||
// NewHeroSkillsPanel creates a new hero status panel
|
logger *d2util.Logger
|
||||||
func NewHeroSkillsPanel(asset *d2asset.AssetManager, ui *d2ui.UIManager, hero *d2mapentity.Player, isLeftPanel bool) *SkillPanel {
|
|
||||||
var activeSkill *d2hero.HeroSkill
|
|
||||||
if isLeftPanel {
|
|
||||||
activeSkill = hero.LeftSkill
|
|
||||||
} else {
|
|
||||||
activeSkill = hero.RightSkill
|
|
||||||
}
|
|
||||||
|
|
||||||
hoverTooltip := ui.NewTooltip(d2resource.Font16, d2resource.PaletteStatic, d2ui.TooltipXLeft, d2ui.TooltipYTop)
|
|
||||||
|
|
||||||
return &SkillPanel{
|
|
||||||
asset: asset,
|
|
||||||
activeSkill: activeSkill,
|
|
||||||
ui: ui,
|
|
||||||
isOpen: false,
|
|
||||||
ListRows: make([]*SkillListRow, skillListsLength),
|
|
||||||
renderer: ui.Renderer(),
|
|
||||||
isLeftPanel: isLeftPanel,
|
|
||||||
hero: hero,
|
|
||||||
hoverTooltip: hoverTooltip,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open opens the hero skills panel
|
// Open opens the hero skills panel
|
||||||
@ -204,7 +216,7 @@ func (s *SkillPanel) generateSkillRowImageCache() error {
|
|||||||
cachedImage, err := s.createSkillListImage(skillListRow)
|
cachedImage, err := s.createSkillListImage(skillListRow)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
s.logger.Error(err.Error())
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,7 +243,7 @@ func (s *SkillPanel) createSkillListImage(skillsListRow *SkillListRow) (d2interf
|
|||||||
|
|
||||||
if skillSprite.GetFrameCount() <= skill.IconCel {
|
if skillSprite.GetFrameCount() <= skill.IconCel {
|
||||||
// happens for non-player skills, since they do not have an icon
|
// happens for non-player skills, since they do not have an icon
|
||||||
log.Printf("Invalid IconCel(sprite frame index) [%d] - Skill name: %s, skipping.", skill.IconCel, skill.Name)
|
s.logger.Error(fmt.Sprintf("Invalid IconCel(sprite frame index) [%d] - Skill name: %s, skipping.", skill.IconCel, skill.Name))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -353,7 +365,7 @@ func (s *SkillPanel) getSkillResourceByClass(class string) string {
|
|||||||
case "dru":
|
case "dru":
|
||||||
resource = d2resource.DruidSkills
|
resource = d2resource.DruidSkills
|
||||||
default:
|
default:
|
||||||
log.Fatalf("Unknown class token: '%s'", class)
|
s.logger.Error(fmt.Sprintf("Unknown class token: '%s'", class))
|
||||||
}
|
}
|
||||||
|
|
||||||
return resource
|
return resource
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
package d2player
|
package d2player
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2hero"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2hero"
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
)
|
)
|
||||||
@ -20,14 +20,10 @@ const (
|
|||||||
skillIconDistY = 68
|
skillIconDistY = 68
|
||||||
)
|
)
|
||||||
|
|
||||||
type skillIcon struct {
|
func newSkillIcon(ui *d2ui.UIManager,
|
||||||
*d2ui.BaseWidget
|
baseSprite *d2ui.Sprite,
|
||||||
lvlLabel *d2ui.Label
|
l d2util.LogLevel,
|
||||||
sprite *d2ui.Sprite
|
skill *d2hero.HeroSkill) *skillIcon {
|
||||||
skill *d2hero.HeroSkill
|
|
||||||
}
|
|
||||||
|
|
||||||
func newSkillIcon(ui *d2ui.UIManager, baseSprite *d2ui.Sprite, skill *d2hero.HeroSkill) *skillIcon {
|
|
||||||
base := d2ui.NewBaseWidget(ui)
|
base := d2ui.NewBaseWidget(ui)
|
||||||
label := ui.NewLabel(d2resource.Font16, d2resource.PaletteSky)
|
label := ui.NewLabel(d2resource.Font16, d2resource.PaletteSky)
|
||||||
|
|
||||||
@ -41,11 +37,24 @@ func newSkillIcon(ui *d2ui.UIManager, baseSprite *d2ui.Sprite, skill *d2hero.Her
|
|||||||
lvlLabel: label,
|
lvlLabel: label,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
res.logger = d2util.NewLogger()
|
||||||
|
res.logger.SetLevel(l)
|
||||||
|
res.logger.SetPrefix(logPrefix)
|
||||||
|
|
||||||
res.SetPosition(x, y)
|
res.SetPosition(x, y)
|
||||||
|
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type skillIcon struct {
|
||||||
|
*d2ui.BaseWidget
|
||||||
|
lvlLabel *d2ui.Label
|
||||||
|
sprite *d2ui.Sprite
|
||||||
|
skill *d2hero.HeroSkill
|
||||||
|
|
||||||
|
logger *d2util.Logger
|
||||||
|
}
|
||||||
|
|
||||||
func (si *skillIcon) SetVisible(visible bool) {
|
func (si *skillIcon) SetVisible(visible bool) {
|
||||||
si.BaseWidget.SetVisible(visible)
|
si.BaseWidget.SetVisible(visible)
|
||||||
si.lvlLabel.SetVisible(visible)
|
si.lvlLabel.SetVisible(visible)
|
||||||
@ -55,7 +64,7 @@ func (si *skillIcon) renderSprite(target d2interface.Surface) {
|
|||||||
x, y := si.GetPosition()
|
x, y := si.GetPosition()
|
||||||
|
|
||||||
if err := si.sprite.SetCurrentFrame(si.skill.IconCel); err != nil {
|
if err := si.sprite.SetCurrentFrame(si.skill.IconCel); err != nil {
|
||||||
log.Printf("Cannot set Frame %e", err)
|
si.logger.Error("Cannot set Frame %e" + err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
package d2player
|
package d2player
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
|
||||||
|
|
||||||
"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/d2common/d2resource"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
|
||||||
"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/d2ui"
|
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||||
@ -83,6 +84,35 @@ type skillTreeHeroTypeResources struct {
|
|||||||
skillPanelPath string
|
skillPanelPath string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newSkillTree(
|
||||||
|
skills map[int]*d2hero.HeroSkill,
|
||||||
|
heroClass d2enum.Hero,
|
||||||
|
asset *d2asset.AssetManager,
|
||||||
|
l d2util.LogLevel,
|
||||||
|
ui *d2ui.UIManager,
|
||||||
|
) *skillTree {
|
||||||
|
st := &skillTree{
|
||||||
|
skills: skills,
|
||||||
|
heroClass: heroClass,
|
||||||
|
asset: asset,
|
||||||
|
uiManager: ui,
|
||||||
|
originX: skillTreePanelX,
|
||||||
|
originY: skillTreePanelY,
|
||||||
|
tab: [numTabs]*skillTreeTab{
|
||||||
|
{},
|
||||||
|
{},
|
||||||
|
{},
|
||||||
|
},
|
||||||
|
l: l,
|
||||||
|
}
|
||||||
|
|
||||||
|
st.logger = d2util.NewLogger()
|
||||||
|
st.logger.SetLevel(l)
|
||||||
|
st.logger.SetPrefix(logPrefix)
|
||||||
|
|
||||||
|
return st
|
||||||
|
}
|
||||||
|
|
||||||
type skillTree struct {
|
type skillTree struct {
|
||||||
resources *skillTreeHeroTypeResources
|
resources *skillTreeHeroTypeResources
|
||||||
asset *d2asset.AssetManager
|
asset *d2asset.AssetManager
|
||||||
@ -102,29 +132,9 @@ type skillTree struct {
|
|||||||
panelGroup *d2ui.WidgetGroup
|
panelGroup *d2ui.WidgetGroup
|
||||||
iconGroup *d2ui.WidgetGroup
|
iconGroup *d2ui.WidgetGroup
|
||||||
panel *d2ui.CustomWidget
|
panel *d2ui.CustomWidget
|
||||||
}
|
|
||||||
|
|
||||||
func newSkillTree(
|
logger *d2util.Logger
|
||||||
skills map[int]*d2hero.HeroSkill,
|
l d2util.LogLevel
|
||||||
heroClass d2enum.Hero,
|
|
||||||
asset *d2asset.AssetManager,
|
|
||||||
ui *d2ui.UIManager,
|
|
||||||
) *skillTree {
|
|
||||||
st := &skillTree{
|
|
||||||
skills: skills,
|
|
||||||
heroClass: heroClass,
|
|
||||||
asset: asset,
|
|
||||||
uiManager: ui,
|
|
||||||
originX: skillTreePanelX,
|
|
||||||
originY: skillTreePanelY,
|
|
||||||
tab: [numTabs]*skillTreeTab{
|
|
||||||
{},
|
|
||||||
{},
|
|
||||||
{},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
return st
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *skillTree) load() {
|
func (s *skillTree) load() {
|
||||||
@ -142,11 +152,14 @@ func (s *skillTree) load() {
|
|||||||
s.closeButton.OnActivated(func() { s.Close() })
|
s.closeButton.OnActivated(func() { s.Close() })
|
||||||
s.panelGroup.AddWidget(s.closeButton)
|
s.panelGroup.AddWidget(s.closeButton)
|
||||||
|
|
||||||
s.setHeroTypeResourcePath()
|
if err := s.setHeroTypeResourcePath(); err != nil {
|
||||||
|
s.logger.Error(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
s.loadForHeroType()
|
s.loadForHeroType()
|
||||||
|
|
||||||
for _, skill := range s.skills {
|
for _, skill := range s.skills {
|
||||||
si := newSkillIcon(s.uiManager, s.resources.skillSprite, skill)
|
si := newSkillIcon(s.uiManager, s.resources.skillSprite, s.l, skill)
|
||||||
s.skillIcons = append(s.skillIcons, si)
|
s.skillIcons = append(s.skillIcons, si)
|
||||||
s.iconGroup.AddWidget(si)
|
s.iconGroup.AddWidget(si)
|
||||||
}
|
}
|
||||||
@ -159,14 +172,14 @@ func (s *skillTree) load() {
|
|||||||
func (s *skillTree) loadForHeroType() {
|
func (s *skillTree) loadForHeroType() {
|
||||||
sp, err := s.uiManager.NewSprite(s.resources.skillPanelPath, d2resource.PaletteSky)
|
sp, err := s.uiManager.NewSprite(s.resources.skillPanelPath, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
s.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
s.resources.skillPanel = sp
|
s.resources.skillPanel = sp
|
||||||
|
|
||||||
si, err := s.uiManager.NewSprite(s.resources.skillIconPath, d2resource.PaletteSky)
|
si, err := s.uiManager.NewSprite(s.resources.skillIconPath, d2resource.PaletteSky)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
s.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
s.resources.skillSprite = si
|
s.resources.skillSprite = si
|
||||||
@ -315,10 +328,11 @@ func (s *skillTree) getTab(class d2enum.Hero) *heroTabData {
|
|||||||
return tabMap[class]
|
return tabMap[class]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *skillTree) setHeroTypeResourcePath() {
|
func (s *skillTree) setHeroTypeResourcePath() error {
|
||||||
entry := s.getTab(s.heroClass)
|
entry := s.getTab(s.heroClass)
|
||||||
|
|
||||||
if entry == nil {
|
if entry == nil {
|
||||||
log.Fatal("Unknown Hero Type")
|
return errors.New("unknown hero type")
|
||||||
}
|
}
|
||||||
|
|
||||||
s.resources = entry.resources
|
s.resources = entry.resources
|
||||||
@ -329,11 +343,13 @@ func (s *skillTree) setHeroTypeResourcePath() {
|
|||||||
for i := 0; i < numTabs; i++ {
|
for i := 0; i < numTabs; i++ {
|
||||||
s.tab[i].closeButtonPosX = entry.closeButtonPos[i]
|
s.tab[i].closeButtonPosX = entry.closeButtonPos[i]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Toggle the skill tree visibility
|
// Toggle the skill tree visibility
|
||||||
func (s *skillTree) Toggle() {
|
func (s *skillTree) Toggle() {
|
||||||
fmt.Println("SkillTree toggled")
|
s.logger.Info("SkillTree toggled")
|
||||||
|
|
||||||
if s.isOpen {
|
if s.isOpen {
|
||||||
s.Close()
|
s.Close()
|
||||||
@ -385,7 +401,7 @@ func (s *skillTree) renderPanelSegment(
|
|||||||
target d2interface.Surface,
|
target d2interface.Surface,
|
||||||
frame int) {
|
frame int) {
|
||||||
if err := s.resources.skillPanel.SetCurrentFrame(frame); err != nil {
|
if err := s.resources.skillPanel.SetCurrentFrame(frame); err != nil {
|
||||||
log.Printf("%e", err)
|
s.logger.Error("%e" + err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -399,7 +415,7 @@ func (s *skillTree) renderTabCommon(target d2interface.Surface) {
|
|||||||
// top
|
// top
|
||||||
w, h, err := skillPanel.GetFrameSize(frameCommonTabTopLeft)
|
w, h, err := skillPanel.GetFrameSize(frameCommonTabTopLeft)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("%e", err)
|
s.logger.Error("%e" + err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -414,7 +430,7 @@ func (s *skillTree) renderTabCommon(target d2interface.Surface) {
|
|||||||
// bottom
|
// bottom
|
||||||
_, h, err = skillPanel.GetFrameSize(frameCommonTabBottomLeft)
|
_, h, err = skillPanel.GetFrameSize(frameCommonTabBottomLeft)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("%e", err)
|
s.logger.Error("%e" + err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -437,7 +453,7 @@ func (s *skillTree) renderTab(target d2interface.Surface, tab int) {
|
|||||||
// top
|
// top
|
||||||
_, h0, err := skillPanel.GetFrameSize(topFrame)
|
_, h0, err := skillPanel.GetFrameSize(topFrame)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("%e", err)
|
s.logger.Error("%e" + err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -449,7 +465,7 @@ func (s *skillTree) renderTab(target d2interface.Surface, tab int) {
|
|||||||
// bottom
|
// bottom
|
||||||
w, h1, err := skillPanel.GetFrameSize(bottomFrame)
|
w, h1, err := skillPanel.GetFrameSize(bottomFrame)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("%e", err)
|
s.logger.Error("%e" + err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user