Moving files around to make more sense (#279)

* Prevent input fighting between terminal and other input listeners.

* Moving files around, removing exports

* Add missing line
This commit is contained in:
Alex Yatskov 2020-02-01 15:55:56 -08:00 committed by GitHub
parent e878ebcbcd
commit 8a547ebf0e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
49 changed files with 604 additions and 709 deletions

View File

@ -27,7 +27,8 @@ type Cache struct {
func CreateCache(budget int) *Cache { func CreateCache(budget int) *Cache {
return &Cache{lookup: make(map[string]*cacheNode), budget: budget} return &Cache{lookup: make(map[string]*cacheNode), budget: budget}
} }
func (c *Cache) SetCacheVerbose(verbose bool) {
func (c *Cache) SetVerbose(verbose bool) {
c.verbose = verbose c.verbose = verbose
} }

View File

@ -6,31 +6,6 @@ import (
"runtime" "runtime"
) )
// Configuration defines the configuration for the engine, loaded from config.json
type Configuration struct {
Language string
FullScreen bool
Scale float64
RunInBackground bool
TicksPerSecond int
FpsCap int
VsyncEnabled bool
MpqPath string
MpqLoadOrder []string
SfxVolume float64
BgmVolume float64
}
/*
func getConfigurationPath() string {
configDir, err := os.UserConfigDir()
if err != nil {
return "config.json"
}
return path.Join(configDir, "OpenDiablo2/config.json")
}
*/
func getDefaultConfiguration() *Configuration { func getDefaultConfiguration() *Configuration {
config := &Configuration{ config := &Configuration{
Language: "ENG", Language: "ENG",

View File

@ -13,6 +13,21 @@ var (
ErrHasInit = errors.New("configuration has already been initialized") ErrHasInit = errors.New("configuration has already been initialized")
) )
// Configuration defines the configuration for the engine, loaded from config.json
type Configuration struct {
Language string
FullScreen bool
Scale float64
RunInBackground bool
TicksPerSecond int
FpsCap int
VsyncEnabled bool
MpqPath string
MpqLoadOrder []string
SfxVolume float64
BgmVolume float64
}
var singleton *Configuration var singleton *Configuration
func Initialize() error { func Initialize() error {

View File

@ -1,4 +1,4 @@
package d2render package d2asset
import ( import (
"errors" "errors"
@ -6,11 +6,12 @@ import (
"math" "math"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dc6" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dc6"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dcc" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dcc"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2helper" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2helper"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
type playMode int type playMode int
@ -49,7 +50,7 @@ type Animation struct {
playLoop bool playLoop bool
} }
func CreateAnimationFromDCC(dcc *d2dcc.DCC, palette *d2datadict.PaletteRec, transparency int) (*Animation, error) { func createAnimationFromDCC(dcc *d2dcc.DCC, palette *d2datadict.PaletteRec, transparency int) (*Animation, error) {
animation := &Animation{ animation := &Animation{
playLength: 1.0, playLength: 1.0,
playLoop: true, playLoop: true,
@ -83,7 +84,7 @@ func CreateAnimationFromDCC(dcc *d2dcc.DCC, palette *d2datadict.PaletteRec, tran
} }
} }
err, image := NewSurface(frameWidth, frameHeight, d2common.FilterNearest) err, image := d2render.NewSurface(frameWidth, frameHeight, d2common.FilterNearest)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -111,14 +112,14 @@ func CreateAnimationFromDCC(dcc *d2dcc.DCC, palette *d2datadict.PaletteRec, tran
return animation, nil return animation, nil
} }
func CreateAnimationFromDC6(dc6 *d2dc6.DC6File) (*Animation, error) { func createAnimationFromDC6(dc6 *d2dc6.DC6File) (*Animation, error) {
animation := &Animation{ animation := &Animation{
playLength: 1.0, playLength: 1.0,
playLoop: true, playLoop: true,
} }
for frameIndex, dc6Frame := range dc6.Frames { for frameIndex, dc6Frame := range dc6.Frames {
err, image := NewSurface(int(dc6Frame.Width), int(dc6Frame.Height), d2common.FilterNearest) err, image := d2render.NewSurface(int(dc6Frame.Width), int(dc6Frame.Height), d2common.FilterNearest)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -0,0 +1,67 @@
package d2asset
import (
"errors"
"fmt"
"path/filepath"
"strings"
"github.com/OpenDiablo2/OpenDiablo2/d2common"
)
const (
animationBudget = 64
)
type animationManager struct {
cache *d2common.Cache
}
func createAnimationManager() *animationManager {
return &animationManager{d2common.CreateCache(animationBudget)}
}
func (am *animationManager) loadAnimation(animationPath, palettePath string, transparency int) (*Animation, error) {
cachePath := fmt.Sprintf("%s;%s;%d", animationPath, palettePath, transparency)
if animation, found := am.cache.Retrieve(cachePath); found {
return animation.(*Animation).Clone(), nil
}
var animation *Animation
switch strings.ToLower(filepath.Ext(animationPath)) {
case ".dc6":
dc6, err := loadDC6(animationPath, palettePath)
if err != nil {
return nil, err
}
animation, err = createAnimationFromDC6(dc6)
if err != nil {
return nil, err
}
case ".dcc":
dcc, err := loadDCC(animationPath)
if err != nil {
return nil, err
}
palette, err := loadPalette(palettePath)
if err != nil {
return nil, err
}
animation, err = createAnimationFromDCC(dcc, palette, transparency)
if err != nil {
return nil, err
}
default:
return nil, errors.New("unknown animation format")
}
if err := am.cache.Insert(cachePath, animation.Clone(), 1); err != nil {
return nil, err
}
return animation, nil
}

View File

@ -1,4 +1,4 @@
package d2archivemanager package d2asset
import ( import (
"errors" "errors"
@ -6,9 +6,7 @@ import (
"sync" "sync"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2config" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2config"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2mpq" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2mpq"
) )
@ -17,7 +15,7 @@ type archiveEntry struct {
hashEntryMap d2mpq.HashEntryMap hashEntryMap d2mpq.HashEntryMap
} }
type ArchiveManager struct { type archiveManager struct {
cache *d2common.Cache cache *d2common.Cache
config *d2config.Configuration config *d2config.Configuration
entries []archiveEntry entries []archiveEntry
@ -25,51 +23,35 @@ type ArchiveManager struct {
} }
const ( const (
ArchiveBudget = 1024 * 1024 * 512 archiveBudget = 1024 * 1024 * 512
) )
func CreateArchiveManager(config *d2config.Configuration) *ArchiveManager { func createArchiveManager(config *d2config.Configuration) *archiveManager {
return &ArchiveManager{cache: d2common.CreateCache(ArchiveBudget), config: config} return &archiveManager{cache: d2common.CreateCache(archiveBudget), config: config}
} }
func (am *ArchiveManager) SetCacheVerbose(verbose bool) { func (am *archiveManager) loadArchiveForFile(filePath string) (*d2mpq.MPQ, error) {
am.cache.SetCacheVerbose(verbose)
}
func (am *ArchiveManager) GetCacheWeight() int {
return am.cache.GetWeight()
}
func (am *ArchiveManager) GetCacheBudget() int {
return am.cache.GetBudget()
}
func (am *ArchiveManager) ClearCache() {
am.cache.Clear()
}
func (am *ArchiveManager) LoadArchiveForFile(filePath string) (*d2mpq.MPQ, error) {
am.mutex.Lock() am.mutex.Lock()
defer am.mutex.Unlock() defer am.mutex.Unlock()
if err := am.CacheArchiveEntries(); err != nil { if err := am.cacheArchiveEntries(); err != nil {
return nil, err return nil, err
} }
for _, archiveEntry := range am.entries { for _, archiveEntry := range am.entries {
if archiveEntry.hashEntryMap.Contains(filePath) { if archiveEntry.hashEntryMap.Contains(filePath) {
return am.LoadArchive(archiveEntry.archivePath) return am.loadArchive(archiveEntry.archivePath)
} }
} }
return nil, errors.New("file not found") return nil, errors.New("file not found")
} }
func (am *ArchiveManager) FileExistsInArchive(filePath string) (bool, error) { func (am *archiveManager) fileExistsInArchive(filePath string) (bool, error) {
am.mutex.Lock() am.mutex.Lock()
defer am.mutex.Unlock() defer am.mutex.Unlock()
if err := am.CacheArchiveEntries(); err != nil { if err := am.cacheArchiveEntries(); err != nil {
return false, err return false, err
} }
@ -82,7 +64,7 @@ func (am *ArchiveManager) FileExistsInArchive(filePath string) (bool, error) {
return false, nil return false, nil
} }
func (am *ArchiveManager) LoadArchive(archivePath string) (*d2mpq.MPQ, error) { func (am *archiveManager) loadArchive(archivePath string) (*d2mpq.MPQ, error) {
if archive, found := am.cache.Retrieve(archivePath); found { if archive, found := am.cache.Retrieve(archivePath); found {
return archive.(*d2mpq.MPQ), nil return archive.(*d2mpq.MPQ), nil
} }
@ -99,7 +81,7 @@ func (am *ArchiveManager) LoadArchive(archivePath string) (*d2mpq.MPQ, error) {
return archive, nil return archive, nil
} }
func (am *ArchiveManager) CacheArchiveEntries() error { func (am *archiveManager) cacheArchiveEntries() error {
if len(am.entries) == len(am.config.MpqLoadOrder) { if len(am.entries) == len(am.config.MpqLoadOrder) {
return nil return nil
} }
@ -108,7 +90,7 @@ func (am *ArchiveManager) CacheArchiveEntries() error {
for _, archiveName := range am.config.MpqLoadOrder { for _, archiveName := range am.config.MpqLoadOrder {
archivePath := path.Join(am.config.MpqPath, archiveName) archivePath := path.Join(am.config.MpqPath, archiveName)
archive, err := am.LoadArchive(archivePath) archive, err := am.loadArchive(archivePath)
if err != nil { if err != nil {
return err return err
} }

View File

@ -0,0 +1,67 @@
package d2asset
import (
"errors"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2cof"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dc6"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dcc"
)
var (
ErrHasInit error = errors.New("asset system is already initialized")
ErrNoInit error = errors.New("asset system is not initialized")
)
type assetManager struct {
archiveManager *archiveManager
fileManager *fileManager
paletteManager *paletteManager
animationManager *animationManager
}
func loadPalette(palettePath string) (*d2datadict.PaletteRec, error) {
if singleton == nil {
return nil, ErrNoInit
}
return singleton.paletteManager.loadPalette(palettePath)
}
func loadDC6(dc6Path, palettePath string) (*d2dc6.DC6File, error) {
dc6Data, err := LoadFile(dc6Path)
if err != nil {
return nil, err
}
paletteData, err := loadPalette(palettePath)
if err != nil {
return nil, err
}
dc6, err := d2dc6.LoadDC6(dc6Data, *paletteData)
if err != nil {
return nil, err
}
return &dc6, nil
}
func loadDCC(dccPath string) (*d2dcc.DCC, error) {
dccData, err := LoadFile(dccPath)
if err != nil {
return nil, err
}
return d2dcc.LoadDCC(dccData)
}
func loadCOF(cofPath string) (*d2cof.COF, error) {
cofData, err := LoadFile(cofPath)
if err != nil {
return nil, err
}
return d2cof.LoadCOF(cofData)
}

View File

@ -1,14 +1,11 @@
package d2assetmanager package d2asset
import ( import (
"errors" "errors"
"fmt" "fmt"
"strings" "strings"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
@ -108,7 +105,7 @@ type compositeMode struct {
directionCount int directionCount int
playedCount int playedCount int
layers []*d2render.Animation layers []*Animation
drawOrder [][]d2enum.CompositeType drawOrder [][]d2enum.CompositeType
frameCount int frameCount int
@ -143,7 +140,7 @@ func (c *Composite) createMode(animationMode, weaponClass string, direction int)
weaponClass: weaponClass, weaponClass: weaponClass,
direction: direction, direction: direction,
directionCount: cof.NumberOfDirections, directionCount: cof.NumberOfDirections,
layers: make([]*d2render.Animation, d2enum.CompositeTypeMax), layers: make([]*Animation, d2enum.CompositeTypeMax),
frameCount: animationData[0].FramesPerDirection, frameCount: animationData[0].FramesPerDirection,
animationSpeed: 1.0 / ((float64(animationData[0].AnimationSpeed) * 25.0) / 256.0), animationSpeed: 1.0 / ((float64(animationData[0].AnimationSpeed) * 25.0) / 256.0),
} }
@ -248,7 +245,7 @@ func (c *Composite) createMode(animationMode, weaponClass string, direction int)
return mode, nil return mode, nil
} }
func loadCompositeLayer(object *d2datadict.ObjectLookupRecord, layerKey, layerValue, animationMode, weaponClass, palettePath string, transparency int) (*d2render.Animation, error) { func loadCompositeLayer(object *d2datadict.ObjectLookupRecord, layerKey, layerValue, animationMode, weaponClass, palettePath string, transparency int) (*Animation, error) {
animationPaths := []string{ animationPaths := []string{
fmt.Sprintf("%s/%s/%s/%s%s%s%s%s.dcc", object.Base, object.Token, layerKey, object.Token, layerKey, layerValue, animationMode, weaponClass), fmt.Sprintf("%s/%s/%s/%s%s%s%s%s.dcc", object.Base, object.Token, layerKey, object.Token, layerKey, layerValue, animationMode, weaponClass),
fmt.Sprintf("%s/%s/%s/%s%s%s%s%s.dcc", object.Base, object.Token, layerKey, object.Token, layerKey, layerValue, animationMode, "HTH"), fmt.Sprintf("%s/%s/%s/%s%s%s%s%s.dcc", object.Base, object.Token, layerKey, object.Token, layerKey, layerValue, animationMode, "HTH"),

116
d2core/d2asset/d2asset.go Normal file
View File

@ -0,0 +1,116 @@
package d2asset
import (
"log"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2config"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2mpq"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2term"
)
var singleton *assetManager
func Initialize() error {
if singleton != nil {
return ErrHasInit
}
config, err := d2config.Get()
if err != nil {
return err
}
var (
archiveManager = createArchiveManager(config)
fileManager = createFileManager(config, archiveManager)
paletteManager = createPaletteManager()
animationManager = createAnimationManager()
)
singleton = &assetManager{
archiveManager,
fileManager,
paletteManager,
animationManager,
}
d2term.BindAction("assetspam", "display verbose asset manager logs", func(verbose bool) {
if verbose {
d2term.OutputInfo("asset manager verbose logging enabled")
} else {
d2term.OutputInfo("asset manager verbose logging disabled")
}
archiveManager.cache.SetVerbose(verbose)
fileManager.cache.SetVerbose(verbose)
paletteManager.cache.SetVerbose(verbose)
animationManager.cache.SetVerbose(verbose)
})
d2term.BindAction("assetstat", "display asset manager cache statistics", func() {
d2term.OutputInfo("archive cache: %f%%", float64(archiveManager.cache.GetWeight())/float64(archiveManager.cache.GetBudget())*100.0)
d2term.OutputInfo("file cache: %f%%", float64(fileManager.cache.GetWeight())/float64(fileManager.cache.GetBudget())*100.0)
d2term.OutputInfo("palette cache: %f%%", float64(paletteManager.cache.GetWeight())/float64(paletteManager.cache.GetBudget())*100.0)
d2term.OutputInfo("animation cache: %f%%", float64(animationManager.cache.GetWeight())/float64(animationManager.cache.GetBudget())*100.0)
})
d2term.BindAction("assetclear", "clear asset manager cache", func() {
archiveManager.cache.Clear()
fileManager.cache.Clear()
paletteManager.cache.Clear()
animationManager.cache.Clear()
})
return nil
}
func Shutdown() {
singleton = nil
}
func LoadArchive(archivePath string) (*d2mpq.MPQ, error) {
if singleton == nil {
return nil, ErrNoInit
}
return singleton.archiveManager.loadArchive(archivePath)
}
func LoadFile(filePath string) ([]byte, error) {
if singleton == nil {
return nil, ErrNoInit
}
data, err := singleton.fileManager.loadFile(filePath)
if err != nil {
log.Printf("error loading file %s (%v)", filePath, err.Error())
}
return data, err
}
func FileExists(filePath string) (bool, error) {
if singleton == nil {
return false, ErrNoInit
}
return singleton.fileManager.fileExists(filePath)
}
func LoadAnimation(animationPath, palettePath string) (*Animation, error) {
return LoadAnimationWithTransparency(animationPath, palettePath, 255)
}
func LoadAnimationWithTransparency(animationPath, palettePath string, transparency int) (*Animation, error) {
if singleton == nil {
return nil, ErrNoInit
}
return singleton.animationManager.loadAnimation(animationPath, palettePath, transparency)
}
func LoadComposite(object *d2datadict.ObjectLookupRecord, palettePath string) (*Composite, error) {
return CreateComposite(object, palettePath), nil
}

View File

@ -1,52 +1,34 @@
package d2filemanager package d2asset
import ( import (
"strings" "strings"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2archivemanager"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2config" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2config"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
) )
const ( const (
FileBudget = 1024 * 1024 * 32 fileBudget = 1024 * 1024 * 32
) )
type FileManager struct { type fileManager struct {
cache *d2common.Cache cache *d2common.Cache
archiveManager *d2archivemanager.ArchiveManager archiveManager *archiveManager
config *d2config.Configuration config *d2config.Configuration
} }
func CreateFileManager(config *d2config.Configuration, archiveManager *d2archivemanager.ArchiveManager) *FileManager { func createFileManager(config *d2config.Configuration, archiveManager *archiveManager) *fileManager {
return &FileManager{d2common.CreateCache(FileBudget), archiveManager, config} return &fileManager{d2common.CreateCache(fileBudget), archiveManager, config}
} }
func (fm *FileManager) SetCacheVerbose(verbose bool) { func (fm *fileManager) loadFile(filePath string) ([]byte, error) {
fm.cache.SetCacheVerbose(verbose)
}
func (fm *FileManager) ClearCache() {
fm.cache.Clear()
}
func (fm *FileManager) GetCacheWeight() int {
return fm.cache.GetWeight()
}
func (fm *FileManager) GetCacheBudget() int {
return fm.cache.GetBudget()
}
func (fm *FileManager) LoadFile(filePath string) ([]byte, error) {
filePath = fm.fixupFilePath(filePath) filePath = fm.fixupFilePath(filePath)
if value, found := fm.cache.Retrieve(filePath); found { if value, found := fm.cache.Retrieve(filePath); found {
return value.([]byte), nil return value.([]byte), nil
} }
archive, err := fm.archiveManager.LoadArchiveForFile(filePath) archive, err := fm.archiveManager.loadArchiveForFile(filePath)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -63,12 +45,12 @@ func (fm *FileManager) LoadFile(filePath string) ([]byte, error) {
return data, nil return data, nil
} }
func (fm *FileManager) FileExists(filePath string) (bool, error) { func (fm *fileManager) fileExists(filePath string) (bool, error) {
filePath = fm.fixupFilePath(filePath) filePath = fm.fixupFilePath(filePath)
return fm.archiveManager.FileExistsInArchive(filePath) return fm.archiveManager.fileExistsInArchive(filePath)
} }
func (fm *FileManager) fixupFilePath(filePath string) string { func (fm *fileManager) fixupFilePath(filePath string) string {
filePath = strings.ReplaceAll(filePath, "{LANG}", fm.config.Language) filePath = strings.ReplaceAll(filePath, "{LANG}", fm.config.Language)
if strings.ToUpper(d2resource.LanguageCode) == "CHI" { if strings.ToUpper(d2resource.LanguageCode) == "CHI" {
filePath = strings.ReplaceAll(filePath, "{LANG_FONT}", fm.config.Language) filePath = strings.ReplaceAll(filePath, "{LANG_FONT}", fm.config.Language)

View File

@ -0,0 +1,33 @@
package d2asset
import (
"github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
)
type paletteManager struct {
cache *d2common.Cache
}
const (
paletteBudget = 64
)
func createPaletteManager() *paletteManager {
return &paletteManager{d2common.CreateCache(paletteBudget)}
}
func (pm *paletteManager) loadPalette(palettePath string) (*d2datadict.PaletteRec, error) {
if palette, found := pm.cache.Retrieve(palettePath); found {
return palette.(*d2datadict.PaletteRec), nil
}
paletteData, err := LoadFile(palettePath)
if err != nil {
return nil, err
}
palette := d2datadict.CreatePalette("", paletteData)
pm.cache.Insert(palettePath, &palette, 1)
return &palette, nil
}

View File

@ -1,246 +0,0 @@
package d2assetmanager
import (
"errors"
"fmt"
"log"
"path/filepath"
"strings"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2config"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2archivemanager"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2filemanager"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2cof"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dc6"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dcc"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2mpq"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2term"
)
const (
AnimationBudget = 64
)
var (
ErrHasInit error = errors.New("asset system is already initialized")
ErrNoInit error = errors.New("asset system is not initialized")
)
type AssetManager struct {
archiveManager *d2archivemanager.ArchiveManager
fileManager *d2filemanager.FileManager
paletteManager *PaletteManager
cache *d2common.Cache
}
var singleton *AssetManager
func Initialize() error {
if singleton != nil {
return ErrHasInit
}
config, _ := d2config.Get()
var (
archiveManager = d2archivemanager.CreateArchiveManager(config)
fileManager = d2filemanager.CreateFileManager(config, archiveManager)
paletteManager = CreatePaletteManager()
//animationManager = d2animationmanager.CreateAnimationManager()
)
singleton = &AssetManager{
archiveManager,
fileManager,
paletteManager,
nil,
}
singleton.cache = d2common.CreateCache(AnimationBudget)
d2term.BindAction("assetspam", "display verbose asset manager logs", func(verbose bool) {
if verbose {
d2term.OutputInfo("asset manager verbose logging enabled")
} else {
d2term.OutputInfo("asset manager verbose logging disabled")
}
archiveManager.SetCacheVerbose(verbose)
fileManager.SetCacheVerbose(verbose)
paletteManager.SetCacheVerbose(verbose)
})
d2term.BindAction("assetstat", "display asset manager cache statistics", func() {
d2term.OutputInfo("archive cache: %f%%", float64(archiveManager.GetCacheWeight())/float64(archiveManager.GetCacheBudget())*100.0)
d2term.OutputInfo("file cache: %f%%", float64(fileManager.GetCacheWeight())/float64(fileManager.GetCacheBudget())*100.0)
d2term.OutputInfo("palette cache: %f%%", float64(paletteManager.GetCacheWeight())/float64(paletteManager.GetCacheBudget())*100.0)
//d2term.OutputInfo("animation cache: %f%%", float64(GetCacheWeight())/float64(GetCacheBudget())*100.0)
})
d2term.BindAction("assetclear", "clear asset manager cache", func() {
archiveManager.ClearCache()
fileManager.ClearCache()
paletteManager.ClearCache()
//am.ClearCache()
})
return nil
}
func Shutdown() {
singleton = nil
}
func LoadArchive(archivePath string) (*d2mpq.MPQ, error) {
if singleton == nil {
return nil, ErrNoInit
}
return singleton.archiveManager.LoadArchive(archivePath)
}
func LoadFile(filePath string) ([]byte, error) {
if singleton == nil {
return nil, ErrNoInit
}
data, err := singleton.fileManager.LoadFile(filePath)
if err != nil {
log.Printf("error loading file %s (%v)", filePath, err.Error())
}
return data, err
}
func FileExists(filePath string) (bool, error) {
if singleton == nil {
return false, ErrNoInit
}
return singleton.fileManager.FileExists(filePath)
}
func LoadAnimation(animationPath, palettePath string) (*d2render.Animation, error) {
return LoadAnimationWithTransparency(animationPath, palettePath, 255)
}
func LoadAnimationWithTransparency(animationPath, palettePath string, transparency int) (*d2render.Animation, error) {
if singleton == nil {
return nil, ErrNoInit
}
return singleton.LoadAnimation(animationPath, palettePath, transparency)
}
func LoadComposite(object *d2datadict.ObjectLookupRecord, palettePath string) (*Composite, error) {
return CreateComposite(object, palettePath), nil
}
func loadPalette(palettePath string) (*d2datadict.PaletteRec, error) {
if singleton == nil {
return nil, ErrNoInit
}
return singleton.paletteManager.LoadPalette(palettePath)
}
func loadDC6(dc6Path, palettePath string) (*d2dc6.DC6File, error) {
dc6Data, err := LoadFile(dc6Path)
if err != nil {
return nil, err
}
paletteData, err := loadPalette(palettePath)
if err != nil {
return nil, err
}
dc6, err := d2dc6.LoadDC6(dc6Data, *paletteData)
if err != nil {
return nil, err
}
return &dc6, nil
}
func loadDCC(dccPath string) (*d2dcc.DCC, error) {
dccData, err := LoadFile(dccPath)
if err != nil {
return nil, err
}
return d2dcc.LoadDCC(dccData)
}
func loadCOF(cofPath string) (*d2cof.COF, error) {
cofData, err := LoadFile(cofPath)
if err != nil {
return nil, err
}
return d2cof.LoadCOF(cofData)
}
func (am *AssetManager) SetCacheVerbose(verbose bool) {
am.cache.SetCacheVerbose(verbose)
}
func (am *AssetManager) ClearCache() {
am.cache.Clear()
}
func (am *AssetManager) GetCacheWeight() int {
return am.cache.GetWeight()
}
func (am *AssetManager) GetCacheBudget() int {
return am.cache.GetBudget()
}
func (am *AssetManager) LoadAnimation(animationPath, palettePath string, transparency int) (*d2render.Animation, error) {
cachePath := fmt.Sprintf("%s;%s;%d", animationPath, palettePath, transparency)
if animation, found := am.cache.Retrieve(cachePath); found {
return animation.(*d2render.Animation).Clone(), nil
}
var animation *d2render.Animation
switch strings.ToLower(filepath.Ext(animationPath)) {
case ".dc6":
dc6, err := loadDC6(animationPath, palettePath)
if err != nil {
return nil, err
}
animation, err = d2render.CreateAnimationFromDC6(dc6)
if err != nil {
return nil, err
}
case ".dcc":
dcc, err := loadDCC(animationPath)
if err != nil {
return nil, err
}
palette, err := loadPalette(palettePath)
if err != nil {
return nil, err
}
animation, err = d2render.CreateAnimationFromDCC(dcc, palette, transparency)
if err != nil {
return nil, err
}
default:
return nil, errors.New("unknown animation format")
}
if err := am.cache.Insert(cachePath, animation.Clone(), 1); err != nil {
return nil, err
}
return animation, nil
}

View File

@ -1,49 +0,0 @@
package d2assetmanager
import (
"github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
)
type PaletteManager struct {
cache *d2common.Cache
}
const (
PaletteBudget = 64
)
func CreatePaletteManager() *PaletteManager {
return &PaletteManager{d2common.CreateCache(PaletteBudget)}
}
func (pm *PaletteManager) SetCacheVerbose(verbose bool) {
pm.cache.SetCacheVerbose(verbose)
}
func (pm *PaletteManager) ClearCache() {
pm.cache.Clear()
}
func (pm *PaletteManager) GetCacheWeight() int {
return pm.cache.GetWeight()
}
func (pm *PaletteManager) GetCacheBudget() int {
return pm.cache.GetBudget()
}
func (pm *PaletteManager) LoadPalette(palettePath string) (*d2datadict.PaletteRec, error) {
if palette, found := pm.cache.Retrieve(palettePath); found {
return palette.(*d2datadict.PaletteRec), nil
}
paletteData, err := LoadFile(palettePath)
if err != nil {
return nil, err
}
palette := d2datadict.CreatePalette("", paletteData)
pm.cache.Insert(palettePath, &palette, 1)
return &palette, nil
}

View File

@ -5,7 +5,7 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/hajimehoshi/ebiten/audio/wav" "github.com/hajimehoshi/ebiten/audio/wav"
"github.com/hajimehoshi/ebiten/audio" "github.com/hajimehoshi/ebiten/audio"
@ -46,7 +46,7 @@ func (eap *EbitenAudioProvider) PlayBGM(song string) {
log.Panic(err) log.Panic(err)
} }
} }
audioData, err := d2assetmanager.LoadFile(song) audioData, err := d2asset.LoadFile(song)
if err != nil { if err != nil {
panic(err) panic(err)
} }

View File

@ -4,7 +4,7 @@ import (
"log" "log"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/hajimehoshi/ebiten/audio" "github.com/hajimehoshi/ebiten/audio"
"github.com/hajimehoshi/ebiten/audio/wav" "github.com/hajimehoshi/ebiten/audio/wav"
) )
@ -23,7 +23,7 @@ func CreateSoundEffect(sfx string, context *audio.Context, volume float64) *Ebit
soundFile = sfx soundFile = sfx
} }
audioData, err := d2assetmanager.LoadFile(soundFile) audioData, err := d2asset.LoadFile(soundFile)
if err != nil { if err != nil {
panic(err) panic(err)
} }

View File

@ -9,9 +9,8 @@ import (
"strings" "strings"
"time" "time"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2hero"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
) )
@ -36,7 +35,7 @@ type GameState struct {
HeroLevel int HeroLevel int
Act int Act int
FilePath string FilePath string
Equipment d2hero.CharacterEquipment Equipment d2inventory.CharacterEquipment
} }
const GameStateVersion = uint32(2) // Update this when you make breaking changes const GameStateVersion = uint32(2) // Update this when you make breaking changes

View File

@ -1,4 +1,4 @@
package d2hero package d2inventory
type CharacterEquipment struct { type CharacterEquipment struct {
Head *InventoryItemArmor // Head Head *InventoryItemArmor // Head

View File

@ -1,4 +1,4 @@
package d2hero package d2inventory
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"

View File

@ -1,4 +1,4 @@
package d2hero package d2inventory
import ( import (
"log" "log"

View File

@ -1,4 +1,4 @@
package d2hero package d2inventory
import ( import (
"log" "log"

View File

@ -1,15 +1,14 @@
package d2assetmanager package d2map
import ( import (
"math" "math"
"math/rand" "math/rand"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2helper"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2helper"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
) )
// AnimatedEntity represents an entity on the map that can be animated // AnimatedEntity represents an entity on the map that can be animated
@ -27,12 +26,12 @@ type AnimatedEntity struct {
action int32 action int32
repetitions int repetitions int
composite *Composite composite *d2asset.Composite
} }
// CreateAnimatedEntity creates an instance of AnimatedEntity // CreateAnimatedEntity creates an instance of AnimatedEntity
func CreateAnimatedEntity(x, y int32, object *d2datadict.ObjectLookupRecord, palettePath string) (*AnimatedEntity, error) { func CreateAnimatedEntity(x, y int32, object *d2datadict.ObjectLookupRecord, palettePath string) (*AnimatedEntity, error) {
composite, err := LoadComposite(object, palettePath) composite, err := d2asset.LoadComposite(object, palettePath)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -1,4 +1,4 @@
package d2mapengine package d2map
type Camera struct { type Camera struct {
x float64 x float64

View File

@ -1,4 +1,4 @@
package d2mapengine package d2map
import ( import (
"strings" "strings"

View File

@ -1,21 +1,21 @@
package d2hero package d2map
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory"
) )
type Hero struct { type Hero struct {
AnimatedEntity *d2assetmanager.AnimatedEntity AnimatedEntity *AnimatedEntity
Equipment CharacterEquipment Equipment d2inventory.CharacterEquipment
mode d2enum.AnimationMode mode d2enum.AnimationMode
direction int direction int
} }
func CreateHero(x, y int32, direction int, heroType d2enum.Hero, equipment CharacterEquipment) *Hero { func CreateHero(x, y int32, direction int, heroType d2enum.Hero, equipment d2inventory.CharacterEquipment) *Hero {
object := &d2datadict.ObjectLookupRecord{ object := &d2datadict.ObjectLookupRecord{
Mode: d2enum.AnimationModePlayerNeutral.String(), Mode: d2enum.AnimationModePlayerNeutral.String(),
Base: "/data/global/chars", Base: "/data/global/chars",
@ -32,7 +32,7 @@ func CreateHero(x, y int32, direction int, heroType d2enum.Hero, equipment Chara
LH: equipment.LeftHand.ItemCode(), LH: equipment.LeftHand.ItemCode(),
} }
entity, err := d2assetmanager.CreateAnimatedEntity(x, y, object, d2resource.PaletteUnits) entity, err := CreateAnimatedEntity(x, y, object, d2resource.PaletteUnits)
if err != nil { if err != nil {
panic(err) panic(err)
} }

View File

@ -1,21 +1,20 @@
package d2npc package d2map
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager"
) )
type NPC struct { type NPC struct {
AnimatedEntity *d2assetmanager.AnimatedEntity AnimatedEntity *AnimatedEntity
HasPaths bool HasPaths bool
Paths []d2common.Path Paths []d2common.Path
path int path int
} }
func CreateNPC(x, y int32, object *d2datadict.ObjectLookupRecord, direction int) *NPC { func CreateNPC(x, y int32, object *d2datadict.ObjectLookupRecord, direction int) *NPC {
entity, err := d2assetmanager.CreateAnimatedEntity(x, y, object, d2resource.PaletteUnits) entity, err := CreateAnimatedEntity(x, y, object, d2resource.PaletteUnits)
if err != nil { if err != nil {
panic(err) panic(err)
} }

View File

@ -1,4 +1,4 @@
package d2mapengine package d2map
import ( import (
"image/color" "image/color"
@ -7,9 +7,7 @@ import (
"math/rand" "math/rand"
"strconv" "strconv"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2npc" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
@ -54,7 +52,7 @@ func loadRegion(seed int64, tileOffsetX, tileOffsetY int, levelType d2enum.Regio
for _, levelTypeDt1 := range region.levelType.Files { for _, levelTypeDt1 := range region.levelType.Files {
if len(levelTypeDt1) != 0 && levelTypeDt1 != "" && levelTypeDt1 != "0" { if len(levelTypeDt1) != 0 && levelTypeDt1 != "" && levelTypeDt1 != "0" {
fileData, err := d2assetmanager.LoadFile("/data/global/tiles/" + levelTypeDt1) fileData, err := d2asset.LoadFile("/data/global/tiles/" + levelTypeDt1)
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -77,7 +75,7 @@ func loadRegion(seed int64, tileOffsetX, tileOffsetY int, levelType d2enum.Regio
} }
region.regionPath = levelFilesToPick[levelIndex] region.regionPath = levelFilesToPick[levelIndex]
fileData, err := d2assetmanager.LoadFile("/data/global/tiles/" + region.regionPath) fileData, err := d2asset.LoadFile("/data/global/tiles/" + region.regionPath)
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -136,13 +134,13 @@ func (mr *MapRegion) loadEntities() []MapEntity {
switch object.Lookup.Type { switch object.Lookup.Type {
case d2datadict.ObjectTypeCharacter: case d2datadict.ObjectTypeCharacter:
if object.Lookup.Base != "" && object.Lookup.Token != "" && object.Lookup.TR != "" { if object.Lookup.Base != "" && object.Lookup.Token != "" && object.Lookup.TR != "" {
npc := d2npc.CreateNPC(int32(worldX), int32(worldY), object.Lookup, 0) npc := CreateNPC(int32(worldX), int32(worldY), object.Lookup, 0)
npc.SetPaths(object.Paths) npc.SetPaths(object.Paths)
entities = append(entities, npc) entities = append(entities, npc)
} }
case d2datadict.ObjectTypeItem: case d2datadict.ObjectTypeItem:
if object.ObjectInfo != nil && object.ObjectInfo.Draw && object.Lookup.Base != "" && object.Lookup.Token != "" { if object.ObjectInfo != nil && object.ObjectInfo.Draw && object.Lookup.Base != "" && object.Lookup.Token != "" {
entity, err := d2assetmanager.CreateAnimatedEntity(int32(worldX), int32(worldY), object.Lookup, d2resource.PaletteUnits) entity, err := CreateAnimatedEntity(int32(worldX), int32(worldY), object.Lookup, d2resource.PaletteUnits)
if err != nil { if err != nil {
panic(err) panic(err)
} }

View File

@ -1,4 +1,4 @@
package d2mapengine package d2map
import ( import (
"math" "math"

View File

@ -1,4 +1,4 @@
package d2scenemanager package d2scene
import ( import (
"math" "math"
@ -9,6 +9,14 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
) )
// Scene defines the function necessary for scene management
type Scene interface {
Load() []func()
Unload()
Render(target d2common.Surface)
Advance(tickTime float64)
}
var nextScene Scene // The next scene to be loaded at the end of the game loop var nextScene Scene // The next scene to be loaded at the end of the game loop
var currentScene Scene // The current scene being rendered var currentScene Scene // The current scene being rendered
var loadingIndex int // Determines which load function is currently being called var loadingIndex int // Determines which load function is currently being called

View File

@ -1,13 +0,0 @@
package d2scenemanager
import (
"github.com/OpenDiablo2/OpenDiablo2/d2common"
)
// Scene defines the function necessary for scene management
type Scene interface {
Load() []func()
Unload()
Render(target d2common.Surface)
Advance(tickTime float64)
}

View File

@ -4,7 +4,7 @@ import (
"image" "image"
"image/color" "image/color"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
@ -116,8 +116,8 @@ func CreateButton(buttonType ButtonType, text string) Button {
result.buttonLayout = buttonLayout result.buttonLayout = buttonLayout
font := GetFont(buttonLayout.FontPath, d2resource.PaletteUnits) font := GetFont(buttonLayout.FontPath, d2resource.PaletteUnits)
animation, _ := d2assetmanager.LoadAnimation(buttonLayout.ResourceName, buttonLayout.PaletteName) animation, _ := d2asset.LoadAnimation(buttonLayout.ResourceName, buttonLayout.PaletteName)
buttonSprite, _ := d2render.LoadSprite(animation) buttonSprite, _ := LoadSprite(animation)
totalButtonTypes := buttonSprite.GetFrameCount() / (buttonLayout.XSegments * buttonLayout.YSegments) totalButtonTypes := buttonSprite.GetFrameCount() / (buttonLayout.XSegments * buttonLayout.YSegments)
for i := 0; i < buttonLayout.XSegments; i++ { for i := 0; i < buttonLayout.XSegments; i++ {
w, _, _ := buttonSprite.GetFrameSize(i) w, _, _ := buttonSprite.GetFrameSize(i)

View File

@ -3,7 +3,7 @@ package d2ui
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
@ -27,8 +27,8 @@ func CreateCheckbox(checkState bool) Checkbox {
enabled: true, enabled: true,
} }
animation, _ := d2assetmanager.LoadAnimation(d2resource.Checkbox, d2resource.PaletteFechar) animation, _ := d2asset.LoadAnimation(d2resource.Checkbox, d2resource.PaletteFechar)
checkboxSprite, _ := d2render.LoadSprite(animation) checkboxSprite, _ := LoadSprite(animation)
result.width, result.height, _ = checkboxSprite.GetFrameSize(0) result.width, result.height, _ = checkboxSprite.GetFrameSize(0)
checkboxSprite.SetPosition(0, 0) checkboxSprite.SetPosition(0, 0)

View File

@ -5,7 +5,6 @@ import (
"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/d2core/d2audio" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/hajimehoshi/ebiten" "github.com/hajimehoshi/ebiten"
) )
@ -20,7 +19,7 @@ const (
) )
var widgets []Widget var widgets []Widget
var cursorSprite *d2render.Sprite var cursorSprite *Sprite
var cursorButtons CursorButton var cursorButtons CursorButton
var pressedIndex int var pressedIndex int
var CursorX int var CursorX int
@ -28,7 +27,7 @@ var CursorY int
var clickSfx d2interface.SoundEffect var clickSfx d2interface.SoundEffect
var waitForLeftMouseUp bool var waitForLeftMouseUp bool
func Initialize(curSprite *d2render.Sprite) { func Initialize(curSprite *Sprite) {
cursorSprite = curSprite cursorSprite = curSprite
pressedIndex = -1 pressedIndex = -1
clickSfx, _ = d2audio.LoadSoundEffect(d2resource.SFXButtonClick) clickSfx, _ = d2audio.LoadSoundEffect(d2resource.SFXButtonClick)
@ -145,6 +144,6 @@ func KeyPressed(key ebiten.Key) bool {
return ebiten.IsKeyPressed(key) return ebiten.IsKeyPressed(key)
} }
func GetCursorSprite() *d2render.Sprite { func GetCursorSprite() *Sprite {
return cursorSprite return cursorSprite
} }

View File

@ -4,14 +4,12 @@ import (
"image/color" "image/color"
"strings" "strings"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2helper" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2helper"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"encoding/binary" "encoding/binary"
"unicode" "unicode"
@ -27,7 +25,7 @@ type FontSize struct {
// Font represents a font // Font represents a font
type Font struct { type Font struct {
fontSprite *d2render.Sprite fontSprite *Sprite
fontTable map[uint16]uint16 fontTable map[uint16]uint16
metrics map[uint16]FontSize metrics map[uint16]FontSize
} }
@ -50,10 +48,10 @@ func CreateFont(font string, palettePath string) *Font {
metrics: make(map[uint16]FontSize), metrics: make(map[uint16]FontSize),
} }
// bug: performance issue when using CJK fonts, because ten thousand frames will be rendered PER font // bug: performance issue when using CJK fonts, because ten thousand frames will be rendered PER font
animation, _ := d2assetmanager.LoadAnimation(font+".dc6", palettePath) animation, _ := d2asset.LoadAnimation(font+".dc6", palettePath)
result.fontSprite, _ = d2render.LoadSprite(animation) result.fontSprite, _ = LoadSprite(animation)
woo := "Woo!\x01" woo := "Woo!\x01"
fontData, err := d2assetmanager.LoadFile(font + ".tbl") fontData, err := d2asset.LoadFile(font + ".tbl")
if err != nil { if err != nil {
panic(err) panic(err)
} }

View File

@ -3,8 +3,7 @@ package d2ui
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/hajimehoshi/ebiten" "github.com/hajimehoshi/ebiten"
) )
@ -16,12 +15,12 @@ type Scrollbar struct {
maxOffset int maxOffset int
lastDirChange int lastDirChange int
onActivate func() onActivate func()
scrollbarSprite *d2render.Sprite scrollbarSprite *Sprite
} }
func CreateScrollbar(x, y, height int) Scrollbar { func CreateScrollbar(x, y, height int) Scrollbar {
animation, _ := d2assetmanager.LoadAnimation(d2resource.Scrollbar, d2resource.PaletteSky) animation, _ := d2asset.LoadAnimation(d2resource.Scrollbar, d2resource.PaletteSky)
scrollbarSprite, _ := d2render.LoadSprite(animation) scrollbarSprite, _ := LoadSprite(animation)
result := Scrollbar{ result := Scrollbar{
visible: true, visible: true,
enabled: true, enabled: true,

View File

@ -1,10 +1,11 @@
package d2render package d2ui
import ( import (
"errors" "errors"
"image/color" "image/color"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2helper" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2helper"
) )
@ -12,14 +13,14 @@ import (
type Sprite struct { type Sprite struct {
x int x int
y int y int
animation *Animation animation *d2asset.Animation
} }
var ( var (
ErrNoAnimation error = errors.New("No animation was specified") ErrNoAnimation error = errors.New("No animation was specified")
) )
func LoadSprite(animation *Animation) (*Sprite, error) { func LoadSprite(animation *d2asset.Animation) (*Sprite, error) {
if animation == nil { if animation == nil {
return nil, ErrNoAnimation return nil, ErrNoAnimation
} }

View File

@ -4,14 +4,13 @@ import (
"strings" "strings"
"time" "time"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/hajimehoshi/ebiten/inpututil" "github.com/hajimehoshi/ebiten/inpututil"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/hajimehoshi/ebiten" "github.com/hajimehoshi/ebiten"
) )
@ -22,14 +21,14 @@ type TextBox struct {
y int y int
visible bool visible bool
enabled bool enabled bool
bgSprite *d2render.Sprite bgSprite *Sprite
textLabel Label textLabel Label
lineBar Label lineBar Label
} }
func CreateTextbox() TextBox { func CreateTextbox() TextBox {
animation, _ := d2assetmanager.LoadAnimation(d2resource.TextBox2, d2resource.PaletteUnits) animation, _ := d2asset.LoadAnimation(d2resource.TextBox2, d2resource.PaletteUnits)
bgSprite, _ := d2render.LoadSprite(animation) bgSprite, _ := LoadSprite(animation)
result := TextBox{ result := TextBox{
bgSprite: bgSprite, bgSprite: bgSprite,
textLabel: CreateLabel(d2resource.FontFormal11, d2resource.PaletteUnits), textLabel: CreateLabel(d2resource.FontFormal11, d2resource.PaletteUnits),

View File

@ -9,7 +9,7 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2scenemanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2scene"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2helper" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2helper"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
@ -18,8 +18,8 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
var loadingSprite *d2render.Sprite // The sprite shown when loading stuff var loadingSprite *d2ui.Sprite // The sprite shown when loading stuff
var lastTime float64 // Last time we updated the scene var lastTime float64 // Last time we updated the scene
var showFPS bool var showFPS bool
var timeScale float64 var timeScale float64
@ -28,7 +28,7 @@ type bsForInputHanding struct {
var bsHandler *bsForInputHanding var bsHandler *bsForInputHanding
func Initialize(loadingSpr *d2render.Sprite) error { func Initialize(loadingSpr *d2ui.Sprite) error {
bsHandler = &bsForInputHanding{} bsHandler = &bsForInputHanding{}
loadingSprite = loadingSpr loadingSprite = loadingSpr
timeScale = 1.0 timeScale = 1.0
@ -76,12 +76,12 @@ func (bs *bsForInputHanding) OnKeyDown(event d2input.KeyEvent) bool {
// Advance updates the internal state of the engine // Advance updates the internal state of the engine
func Advance() { func Advance() {
d2scenemanager.UpdateScene() d2scene.UpdateScene()
if d2scenemanager.GetCurrentScene() == nil { if d2scene.GetCurrentScene() == nil {
log.Fatal("no scene loaded") log.Fatal("no scene loaded")
} }
if d2scenemanager.IsLoading() { if d2scene.IsLoading() {
return return
} }
@ -89,7 +89,7 @@ func Advance() {
deltaTime := (currentTime - lastTime) * timeScale deltaTime := (currentTime - lastTime) * timeScale
lastTime = currentTime lastTime = currentTime
d2scenemanager.Advance(deltaTime) d2scene.Advance(deltaTime)
d2ui.Advance(deltaTime) d2ui.Advance(deltaTime)
d2term.Advance(deltaTime) d2term.Advance(deltaTime)
d2input.Advance(deltaTime) d2input.Advance(deltaTime)
@ -97,16 +97,16 @@ func Advance() {
// Draw draws the game // Draw draws the game
func render(target d2common.Surface) { func render(target d2common.Surface) {
if d2scenemanager.GetLoadingProgress() < 1.0 { if d2scene.GetLoadingProgress() < 1.0 {
loadingSprite.SetCurrentFrame(int(d2helper.Max(0, loadingSprite.SetCurrentFrame(int(d2helper.Max(0,
d2helper.Min(uint32(loadingSprite.GetFrameCount()-1), d2helper.Min(uint32(loadingSprite.GetFrameCount()-1),
uint32(float64(loadingSprite.GetFrameCount()-1)*d2scenemanager.GetLoadingProgress()))))) uint32(float64(loadingSprite.GetFrameCount()-1)*d2scene.GetLoadingProgress())))))
loadingSprite.Render(target) loadingSprite.Render(target)
} else { } else {
if d2scenemanager.GetCurrentScene() == nil { if d2scene.GetCurrentScene() == nil {
log.Fatal("no scene loaded") log.Fatal("no scene loaded")
} }
d2scenemanager.Render(target) d2scene.Render(target)
d2ui.Render(target) d2ui.Render(target)
} }
if showFPS { if showFPS {

View File

@ -1,8 +1,8 @@
package d2scene package d2gamescene
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2video" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2video"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/hajimehoshi/ebiten" "github.com/hajimehoshi/ebiten"
) )
@ -19,7 +19,7 @@ func CreateBlizzardIntro() *BlizzardIntro {
func (v *BlizzardIntro) Load() []func() { func (v *BlizzardIntro) Load() []func() {
return []func(){ return []func(){
func() { func() {
videoBytes, err := d2assetmanager.LoadFile("/data/local/video/BlizNorth640x480.bik") videoBytes, err := d2asset.LoadFile("/data/local/video/BlizNorth640x480.bik")
if err != nil { if err != nil {
panic(err) panic(err)
} }

View File

@ -1,4 +1,4 @@
package d2scene package d2gamescene
import ( import (
"image/color" "image/color"
@ -6,13 +6,11 @@ import (
"os" "os"
"strings" "strings"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gamestate" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2gamestate"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2hero" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2map"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2scene"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2scenemanager"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio"
@ -20,13 +18,12 @@ import (
dh "github.com/OpenDiablo2/OpenDiablo2/d2common/d2helper" dh "github.com/OpenDiablo2/OpenDiablo2/d2common/d2helper"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
"github.com/hajimehoshi/ebiten" "github.com/hajimehoshi/ebiten"
) )
type CharacterSelect struct { type CharacterSelect struct {
background *d2render.Sprite background *d2ui.Sprite
newCharButton d2ui.Button newCharButton d2ui.Button
convertCharButton d2ui.Button convertCharButton d2ui.Button
deleteCharButton d2ui.Button deleteCharButton d2ui.Button
@ -34,15 +31,15 @@ type CharacterSelect struct {
okButton d2ui.Button okButton d2ui.Button
deleteCharCancelButton d2ui.Button deleteCharCancelButton d2ui.Button
deleteCharOkButton d2ui.Button deleteCharOkButton d2ui.Button
selectionBox *d2render.Sprite selectionBox *d2ui.Sprite
okCancelBox *d2render.Sprite okCancelBox *d2ui.Sprite
d2HeroTitle d2ui.Label d2HeroTitle d2ui.Label
deleteCharConfirmLabel d2ui.Label deleteCharConfirmLabel d2ui.Label
charScrollbar d2ui.Scrollbar charScrollbar d2ui.Scrollbar
characterNameLabel [8]d2ui.Label characterNameLabel [8]d2ui.Label
characterStatsLabel [8]d2ui.Label characterStatsLabel [8]d2ui.Label
characterExpLabel [8]d2ui.Label characterExpLabel [8]d2ui.Label
characterImage [8]*d2hero.Hero characterImage [8]*d2map.Hero
gameStates []*d2gamestate.GameState gameStates []*d2gamestate.GameState
selectedCharacter int selectedCharacter int
mouseButtonPressed bool mouseButtonPressed bool
@ -60,8 +57,8 @@ func (v *CharacterSelect) Load() []func() {
d2audio.PlayBGM(d2resource.BGMTitle) d2audio.PlayBGM(d2resource.BGMTitle)
return []func(){ return []func(){
func() { func() {
animation, _ := d2assetmanager.LoadAnimation(d2resource.CharacterSelectionBackground, d2resource.PaletteSky) animation, _ := d2asset.LoadAnimation(d2resource.CharacterSelectionBackground, d2resource.PaletteSky)
v.background, _ = d2render.LoadSprite(animation) v.background, _ = d2ui.LoadSprite(animation)
v.background.SetPosition(0, 0) v.background.SetPosition(0, 0)
}, },
func() { func() {
@ -121,13 +118,13 @@ func (v *CharacterSelect) Load() []func() {
v.deleteCharConfirmLabel.SetPosition(400, 185) v.deleteCharConfirmLabel.SetPosition(400, 185)
}, },
func() { func() {
animation, _ := d2assetmanager.LoadAnimation(d2resource.CharacterSelectionSelectBox, d2resource.PaletteSky) animation, _ := d2asset.LoadAnimation(d2resource.CharacterSelectionSelectBox, d2resource.PaletteSky)
v.selectionBox, _ = d2render.LoadSprite(animation) v.selectionBox, _ = d2ui.LoadSprite(animation)
v.selectionBox.SetPosition(37, 86) v.selectionBox.SetPosition(37, 86)
}, },
func() { func() {
animation, _ := d2assetmanager.LoadAnimation(d2resource.PopUpOkCancel, d2resource.PaletteFechar) animation, _ := d2asset.LoadAnimation(d2resource.PopUpOkCancel, d2resource.PaletteFechar)
v.okCancelBox, _ = d2render.LoadSprite(animation) v.okCancelBox, _ = d2ui.LoadSprite(animation)
v.okCancelBox.SetPosition(270, 175) v.okCancelBox.SetPosition(270, 175)
}, },
func() { func() {
@ -175,24 +172,24 @@ func (v *CharacterSelect) updateCharacterBoxes() {
v.characterStatsLabel[i].SetText("Level 1 " + v.gameStates[idx].HeroType.String()) v.characterStatsLabel[i].SetText("Level 1 " + v.gameStates[idx].HeroType.String())
v.characterExpLabel[i].SetText(expText) v.characterExpLabel[i].SetText(expText)
// TODO: Generate or load the object from the actual player data... // TODO: Generate or load the object from the actual player data...
v.characterImage[i] = d2hero.CreateHero( v.characterImage[i] = d2map.CreateHero(
0, 0,
0, 0,
0, 0,
v.gameStates[idx].HeroType, v.gameStates[idx].HeroType,
d2hero.HeroObjects[v.gameStates[idx].HeroType], d2inventory.HeroObjects[v.gameStates[idx].HeroType],
) )
} }
} }
func (v *CharacterSelect) onNewCharButtonClicked() { func (v *CharacterSelect) onNewCharButtonClicked() {
d2scenemanager.SetNextScene(CreateSelectHeroClass()) d2scene.SetNextScene(CreateSelectHeroClass())
} }
func (v *CharacterSelect) onExitButtonClicked() { func (v *CharacterSelect) onExitButtonClicked() {
mainMenu := CreateMainMenu() mainMenu := CreateMainMenu()
mainMenu.ShowTrademarkScreen = false mainMenu.ShowTrademarkScreen = false
d2scenemanager.SetNextScene(mainMenu) d2scene.SetNextScene(mainMenu)
} }
func (v *CharacterSelect) Unload() { func (v *CharacterSelect) Unload() {
@ -312,5 +309,5 @@ func (v *CharacterSelect) refreshGameStates() {
} }
func (v *CharacterSelect) onOkButtonClicked() { func (v *CharacterSelect) onOkButtonClicked() {
d2scenemanager.SetNextScene(CreateGame(v.gameStates[v.selectedCharacter])) d2scene.SetNextScene(CreateGame(v.gameStates[v.selectedCharacter]))
} }

View File

@ -1,4 +1,4 @@
package d2scene package d2gamescene
import ( import (
"bufio" "bufio"
@ -8,14 +8,12 @@ import (
"path" "path"
"strings" "strings"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2scenemanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2scene"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
dh "github.com/OpenDiablo2/OpenDiablo2/d2common/d2helper" dh "github.com/OpenDiablo2/OpenDiablo2/d2common/d2helper"
@ -30,7 +28,7 @@ type labelItem struct {
// Credits represents the credits scene // Credits represents the credits scene
type Credits struct { type Credits struct {
creditsBackground *d2render.Sprite creditsBackground *d2ui.Sprite
exitButton d2ui.Button exitButton d2ui.Button
creditsText []string creditsText []string
labels []*labelItem labels []*labelItem
@ -71,8 +69,8 @@ func (v *Credits) LoadContributors() []string {
func (v *Credits) Load() []func() { func (v *Credits) Load() []func() {
return []func(){ return []func(){
func() { func() {
animation, _ := d2assetmanager.LoadAnimation(d2resource.CreditsBackground, d2resource.PaletteSky) animation, _ := d2asset.LoadAnimation(d2resource.CreditsBackground, d2resource.PaletteSky)
v.creditsBackground, _ = d2render.LoadSprite(animation) v.creditsBackground, _ = d2ui.LoadSprite(animation)
v.creditsBackground.SetPosition(0, 0) v.creditsBackground.SetPosition(0, 0)
}, },
func() { func() {
@ -82,7 +80,7 @@ func (v *Credits) Load() []func() {
d2ui.AddWidget(&v.exitButton) d2ui.AddWidget(&v.exitButton)
}, },
func() { func() {
fileData, err := d2assetmanager.LoadFile(d2resource.CreditsText) fileData, err := d2asset.LoadFile(d2resource.CreditsText)
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -140,7 +138,7 @@ func (v *Credits) Advance(tickTime float64) {
func (v *Credits) onExitButtonClicked() { func (v *Credits) onExitButtonClicked() {
mainMenu := CreateMainMenu() mainMenu := CreateMainMenu()
mainMenu.ShowTrademarkScreen = false mainMenu.ShowTrademarkScreen = false
d2scenemanager.SetNextScene(mainMenu) d2scene.SetNextScene(mainMenu)
} }
func (v *Credits) addNextItem() { func (v *Credits) addNextItem() {

View File

@ -1,32 +1,28 @@
package d2scene package d2gamescene
import ( import (
"image/color" "image/color"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gamestate"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2hero"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gamestate"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2map"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render/d2mapengine"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
"github.com/OpenDiablo2/OpenDiablo2/d2game/d2player" "github.com/OpenDiablo2/OpenDiablo2/d2game/d2player"
) )
type Game struct { type Game struct {
gameState *d2gamestate.GameState gameState *d2gamestate.GameState
pentSpinLeft *d2render.Sprite pentSpinLeft *d2ui.Sprite
pentSpinRight *d2render.Sprite pentSpinRight *d2ui.Sprite
testLabel d2ui.Label testLabel d2ui.Label
mapEngine *d2mapengine.MapEngine mapEngine *d2map.MapEngine
hero *d2hero.Hero hero *d2map.Hero
gameControls *d2player.GameControls gameControls *d2player.GameControls
} }
@ -42,15 +38,15 @@ func CreateGame(
func (v *Game) Load() []func() { func (v *Game) Load() []func() {
return []func(){ return []func(){
func() { func() {
animation, _ := d2assetmanager.LoadAnimation(d2resource.PentSpin, d2resource.PaletteSky) animation, _ := d2asset.LoadAnimation(d2resource.PentSpin, d2resource.PaletteSky)
v.pentSpinLeft, _ = d2render.LoadSprite(animation) v.pentSpinLeft, _ = d2ui.LoadSprite(animation)
v.pentSpinLeft.PlayBackward() v.pentSpinLeft.PlayBackward()
v.pentSpinLeft.SetPlayLengthMs(475) v.pentSpinLeft.SetPlayLengthMs(475)
v.pentSpinLeft.SetPosition(100, 300) v.pentSpinLeft.SetPosition(100, 300)
}, },
func() { func() {
animation, _ := d2assetmanager.LoadAnimation(d2resource.PentSpin, d2resource.PaletteSky) animation, _ := d2asset.LoadAnimation(d2resource.PentSpin, d2resource.PaletteSky)
v.pentSpinRight, _ = d2render.LoadSprite(animation) v.pentSpinRight, _ = d2ui.LoadSprite(animation)
v.pentSpinRight.PlayForward() v.pentSpinRight.PlayForward()
v.pentSpinRight.SetPlayLengthMs(475) v.pentSpinRight.SetPlayLengthMs(475)
v.pentSpinRight.SetPosition(650, 300) v.pentSpinRight.SetPosition(650, 300)
@ -62,11 +58,11 @@ func (v *Game) Load() []func() {
v.testLabel.SetPosition(400, 250) v.testLabel.SetPosition(400, 250)
}, },
func() { func() {
v.mapEngine = d2mapengine.CreateMapEngine(v.gameState) v.mapEngine = d2map.CreateMapEngine(v.gameState)
v.mapEngine.GenerateMap(d2enum.RegionAct1Town, 1, 0) v.mapEngine.GenerateMap(d2enum.RegionAct1Town, 1, 0)
startX, startY := v.mapEngine.GetStartPosition() startX, startY := v.mapEngine.GetStartPosition()
v.hero = d2hero.CreateHero( v.hero = d2map.CreateHero(
int32(startX*5)+3, int32(startX*5)+3,
int32(startY*5)+3, int32(startY*5)+3,
0, 0,

View File

@ -1,4 +1,4 @@
package d2scene package d2gamescene
import ( import (
"fmt" "fmt"
@ -8,30 +8,28 @@ import (
"os/exec" "os/exec"
"runtime" "runtime"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gamestate" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2gamestate"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2scenemanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2scene"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
) )
// MainMenu represents the main menu // MainMenu represents the main menu
type MainMenu struct { type MainMenu struct {
trademarkBackground *d2render.Sprite trademarkBackground *d2ui.Sprite
background *d2render.Sprite background *d2ui.Sprite
diabloLogoLeft *d2render.Sprite diabloLogoLeft *d2ui.Sprite
diabloLogoRight *d2render.Sprite diabloLogoRight *d2ui.Sprite
diabloLogoLeftBack *d2render.Sprite diabloLogoLeftBack *d2ui.Sprite
diabloLogoRightBack *d2render.Sprite diabloLogoRightBack *d2ui.Sprite
singlePlayerButton d2ui.Button singlePlayerButton d2ui.Button
githubButton d2ui.Button githubButton d2ui.Button
exitDiabloButton d2ui.Button exitDiabloButton d2ui.Button
@ -97,37 +95,37 @@ func (v *MainMenu) Load() []func() {
v.openDiabloLabel.SetPosition(400, 580) v.openDiabloLabel.SetPosition(400, 580)
}, },
func() { func() {
animation, _ := d2assetmanager.LoadAnimation(d2resource.GameSelectScreen, d2resource.PaletteSky) animation, _ := d2asset.LoadAnimation(d2resource.GameSelectScreen, d2resource.PaletteSky)
v.background, _ = d2render.LoadSprite(animation) v.background, _ = d2ui.LoadSprite(animation)
v.background.SetPosition(0, 0) v.background.SetPosition(0, 0)
}, },
func() { func() {
animation, _ := d2assetmanager.LoadAnimation(d2resource.TrademarkScreen, d2resource.PaletteSky) animation, _ := d2asset.LoadAnimation(d2resource.TrademarkScreen, d2resource.PaletteSky)
v.trademarkBackground, _ = d2render.LoadSprite(animation) v.trademarkBackground, _ = d2ui.LoadSprite(animation)
v.trademarkBackground.SetPosition(0, 0) v.trademarkBackground.SetPosition(0, 0)
}, },
func() { func() {
animation, _ := d2assetmanager.LoadAnimation(d2resource.Diablo2LogoFireLeft, d2resource.PaletteUnits) animation, _ := d2asset.LoadAnimation(d2resource.Diablo2LogoFireLeft, d2resource.PaletteUnits)
v.diabloLogoLeft, _ = d2render.LoadSprite(animation) v.diabloLogoLeft, _ = d2ui.LoadSprite(animation)
v.diabloLogoLeft.SetBlend(true) v.diabloLogoLeft.SetBlend(true)
v.diabloLogoLeft.PlayForward() v.diabloLogoLeft.PlayForward()
v.diabloLogoLeft.SetPosition(400, 120) v.diabloLogoLeft.SetPosition(400, 120)
}, },
func() { func() {
animation, _ := d2assetmanager.LoadAnimation(d2resource.Diablo2LogoFireRight, d2resource.PaletteUnits) animation, _ := d2asset.LoadAnimation(d2resource.Diablo2LogoFireRight, d2resource.PaletteUnits)
v.diabloLogoRight, _ = d2render.LoadSprite(animation) v.diabloLogoRight, _ = d2ui.LoadSprite(animation)
v.diabloLogoRight.SetBlend(true) v.diabloLogoRight.SetBlend(true)
v.diabloLogoRight.PlayForward() v.diabloLogoRight.PlayForward()
v.diabloLogoRight.SetPosition(400, 120) v.diabloLogoRight.SetPosition(400, 120)
}, },
func() { func() {
animation, _ := d2assetmanager.LoadAnimation(d2resource.Diablo2LogoBlackLeft, d2resource.PaletteUnits) animation, _ := d2asset.LoadAnimation(d2resource.Diablo2LogoBlackLeft, d2resource.PaletteUnits)
v.diabloLogoLeftBack, _ = d2render.LoadSprite(animation) v.diabloLogoLeftBack, _ = d2ui.LoadSprite(animation)
v.diabloLogoLeftBack.SetPosition(400, 120) v.diabloLogoLeftBack.SetPosition(400, 120)
}, },
func() { func() {
animation, _ := d2assetmanager.LoadAnimation(d2resource.Diablo2LogoBlackRight, d2resource.PaletteUnits) animation, _ := d2asset.LoadAnimation(d2resource.Diablo2LogoBlackRight, d2resource.PaletteUnits)
v.diabloLogoRightBack, _ = d2render.LoadSprite(animation) v.diabloLogoRightBack, _ = d2ui.LoadSprite(animation)
v.diabloLogoRightBack.SetPosition(400, 120) v.diabloLogoRightBack.SetPosition(400, 120)
}, },
func() { func() {
@ -175,7 +173,7 @@ func (v *MainMenu) Load() []func() {
} }
func (v *MainMenu) onMapTestClicked() { func (v *MainMenu) onMapTestClicked() {
d2scenemanager.SetNextScene(CreateMapEngineTest(0, 1)) d2scene.SetNextScene(CreateMapEngineTest(0, 1))
} }
func openbrowser(url string) { func openbrowser(url string) {
@ -200,10 +198,10 @@ func openbrowser(url string) {
func (v *MainMenu) onSinglePlayerClicked() { func (v *MainMenu) onSinglePlayerClicked() {
// Go here only if existing characters are available to select // Go here only if existing characters are available to select
if d2gamestate.HasGameStates() { if d2gamestate.HasGameStates() {
d2scenemanager.SetNextScene(CreateCharacterSelect()) d2scene.SetNextScene(CreateCharacterSelect())
return return
} }
d2scenemanager.SetNextScene(CreateSelectHeroClass()) d2scene.SetNextScene(CreateSelectHeroClass())
} }
func (v *MainMenu) onGithubButtonClicked() { func (v *MainMenu) onGithubButtonClicked() {
@ -215,7 +213,7 @@ func (v *MainMenu) onExitButtonClicked() {
} }
func (v *MainMenu) onCreditsButtonClicked() { func (v *MainMenu) onCreditsButtonClicked() {
d2scenemanager.SetNextScene(CreateCredits()) d2scene.SetNextScene(CreateCredits())
} }
// Unload unloads the data for the main menu // Unload unloads the data for the main menu

View File

@ -1,4 +1,4 @@
package d2scene package d2gamescene
import ( import (
"math" "math"
@ -8,7 +8,7 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2scenemanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2scene"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio"
@ -17,7 +17,7 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render/d2mapengine" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2map"
) )
type RegionSpec struct { type RegionSpec struct {
@ -83,7 +83,7 @@ var regions []RegionSpec = []RegionSpec{
type MapEngineTest struct { type MapEngineTest struct {
gameState *d2gamestate.GameState gameState *d2gamestate.GameState
mapEngine *d2mapengine.MapEngine mapEngine *d2map.MapEngine
//TODO: this is region specific properties, should be refactored for multi-region rendering //TODO: this is region specific properties, should be refactored for multi-region rendering
currentRegion int currentRegion int
@ -133,7 +133,7 @@ func (v *MapEngineTest) LoadRegionByIndex(n int, levelPreset, fileIndex int) {
if n == 0 { if n == 0 {
v.mapEngine.GenerateAct1Overworld() v.mapEngine.GenerateAct1Overworld()
} else { } else {
v.mapEngine = d2mapengine.CreateMapEngine(v.gameState) // necessary for map name update v.mapEngine = d2map.CreateMapEngine(v.gameState) // necessary for map name update
v.mapEngine.GenerateMap(d2enum.RegionIdType(n), levelPreset, fileIndex) v.mapEngine.GenerateMap(d2enum.RegionIdType(n), levelPreset, fileIndex)
} }
@ -146,7 +146,7 @@ func (v *MapEngineTest) Load() []func() {
d2audio.PlayBGM("") d2audio.PlayBGM("")
return []func(){ return []func(){
func() { func() {
v.mapEngine = d2mapengine.CreateMapEngine(v.gameState) v.mapEngine = d2map.CreateMapEngine(v.gameState)
v.LoadRegionByIndex(v.currentRegion, v.levelPreset, v.fileIndex) v.LoadRegionByIndex(v.currentRegion, v.levelPreset, v.fileIndex)
}, },
} }
@ -245,13 +245,13 @@ func (met *MapEngineTest) OnKeyDown(event d2input.KeyEvent) bool {
if event.Key == d2input.KeyN { if event.Key == d2input.KeyN {
if event.KeyMod == d2input.KeyModControl { if event.KeyMod == d2input.KeyModControl {
met.fileIndex = increment(met.fileIndex, 0, met.filesCount-1) met.fileIndex = increment(met.fileIndex, 0, met.filesCount-1)
d2scenemanager.SetNextScene(met) d2scene.SetNextScene(met)
} else if event.KeyMod == d2input.KeyModShift { } else if event.KeyMod == d2input.KeyModShift {
met.levelPreset = increment(met.levelPreset, met.regionSpec.startPresetIndex, met.regionSpec.endPresetIndex) met.levelPreset = increment(met.levelPreset, met.regionSpec.startPresetIndex, met.regionSpec.endPresetIndex)
d2scenemanager.SetNextScene(met) d2scene.SetNextScene(met)
} else { } else {
met.currentRegion = increment(met.currentRegion, 0, len(regions)) met.currentRegion = increment(met.currentRegion, 0, len(regions))
d2scenemanager.SetNextScene(met) d2scene.SetNextScene(met)
} }
return true return true
@ -260,13 +260,13 @@ func (met *MapEngineTest) OnKeyDown(event d2input.KeyEvent) bool {
if event.Key == d2input.KeyP { if event.Key == d2input.KeyP {
if event.KeyMod == d2input.KeyModControl { if event.KeyMod == d2input.KeyModControl {
met.fileIndex = decrement(met.fileIndex, 0, met.filesCount-1) met.fileIndex = decrement(met.fileIndex, 0, met.filesCount-1)
d2scenemanager.SetNextScene(met) d2scene.SetNextScene(met)
} else if event.KeyMod == d2input.KeyModShift { } else if event.KeyMod == d2input.KeyModShift {
met.levelPreset = decrement(met.levelPreset, met.regionSpec.startPresetIndex, met.regionSpec.endPresetIndex) met.levelPreset = decrement(met.levelPreset, met.regionSpec.startPresetIndex, met.regionSpec.endPresetIndex)
d2scenemanager.SetNextScene(met) d2scene.SetNextScene(met)
} else { } else {
met.currentRegion = decrement(met.currentRegion, 0, len(regions)) met.currentRegion = decrement(met.currentRegion, 0, len(regions))
d2scenemanager.SetNextScene(met) d2scene.SetNextScene(met)
} }
return true return true

View File

@ -1,4 +1,4 @@
package d2scene package d2gamescene
import ( import (
"image" "image"
@ -6,16 +6,14 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gamestate" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2gamestate"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2scenemanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2scene"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
@ -27,14 +25,14 @@ import (
type HeroRenderInfo struct { type HeroRenderInfo struct {
Stance d2enum.HeroStance Stance d2enum.HeroStance
IdleSprite *d2render.Sprite IdleSprite *d2ui.Sprite
IdleSelectedSprite *d2render.Sprite IdleSelectedSprite *d2ui.Sprite
ForwardWalkSprite *d2render.Sprite ForwardWalkSprite *d2ui.Sprite
ForwardWalkSpriteOverlay *d2render.Sprite ForwardWalkSpriteOverlay *d2ui.Sprite
SelectedSprite *d2render.Sprite SelectedSprite *d2ui.Sprite
SelectedSpriteOverlay *d2render.Sprite SelectedSpriteOverlay *d2ui.Sprite
BackWalkSprite *d2render.Sprite BackWalkSprite *d2ui.Sprite
BackWalkSpriteOverlay *d2render.Sprite BackWalkSpriteOverlay *d2ui.Sprite
SelectionBounds image.Rectangle SelectionBounds image.Rectangle
SelectSfx d2interface.SoundEffect SelectSfx d2interface.SoundEffect
DeselectSfx d2interface.SoundEffect DeselectSfx d2interface.SoundEffect
@ -52,8 +50,8 @@ func (hri *HeroRenderInfo) Advance(elapsed float64) {
} }
type SelectHeroClass struct { type SelectHeroClass struct {
bgImage *d2render.Sprite bgImage *d2ui.Sprite
campfire *d2render.Sprite campfire *d2ui.Sprite
headingLabel d2ui.Label headingLabel d2ui.Label
heroClassLabel d2ui.Label heroClassLabel d2ui.Label
heroDesc1Label d2ui.Label heroDesc1Label d2ui.Label
@ -446,12 +444,12 @@ func (v *SelectHeroClass) Unload() {
} }
func (v SelectHeroClass) onExitButtonClicked() { func (v SelectHeroClass) onExitButtonClicked() {
d2scenemanager.SetNextScene(CreateCharacterSelect()) d2scene.SetNextScene(CreateCharacterSelect())
} }
func (v SelectHeroClass) onOkButtonClicked() { func (v SelectHeroClass) onOkButtonClicked() {
gameState := d2gamestate.CreateGameState(v.heroNameTextbox.GetText(), v.selectedHero, v.hardcoreCheckbox.GetCheckState()) gameState := d2gamestate.CreateGameState(v.heroNameTextbox.GetText(), v.selectedHero, v.hardcoreCheckbox.GetCheckState())
d2scenemanager.SetNextScene(CreateGame(gameState)) d2scene.SetNextScene(CreateGame(gameState))
} }
func (v *SelectHeroClass) Render(screen d2common.Surface) { func (v *SelectHeroClass) Render(screen d2common.Surface) {
@ -652,27 +650,27 @@ func (v *SelectHeroClass) setDescLabels(descKey string) {
} }
} }
func setSpriteToFirstFrame(sprite *d2render.Sprite) { func setSpriteToFirstFrame(sprite *d2ui.Sprite) {
if sprite != nil { if sprite != nil {
sprite.Rewind() sprite.Rewind()
} }
} }
func drawSprite(sprite *d2render.Sprite, target d2common.Surface) { func drawSprite(sprite *d2ui.Sprite, target d2common.Surface) {
if sprite != nil { if sprite != nil {
sprite.Render(target) sprite.Render(target)
} }
} }
func advanceSprite(sprite *d2render.Sprite, elapsed float64) { func advanceSprite(sprite *d2ui.Sprite, elapsed float64) {
if sprite != nil { if sprite != nil {
sprite.Advance(elapsed) sprite.Advance(elapsed)
} }
} }
func loadSprite(animationPath, palettePath string) *d2render.Sprite { func loadSprite(animationPath, palettePath string) *d2ui.Sprite {
animation, _ := d2assetmanager.LoadAnimation(animationPath, palettePath) animation, _ := d2asset.LoadAnimation(animationPath, palettePath)
sprite, _ := d2render.LoadSprite(animation) sprite, _ := d2ui.LoadSprite(animation)
return sprite return sprite
} }

View File

@ -3,11 +3,10 @@ package d2player
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2hero"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2map"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render/d2mapengine" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
) )
type Panel interface { type Panel interface {
@ -18,18 +17,18 @@ type Panel interface {
} }
type GameControls struct { type GameControls struct {
hero *d2hero.Hero hero *d2map.Hero
mapEngine *d2mapengine.MapEngine mapEngine *d2map.MapEngine
inventory *Inventory inventory *Inventory
// UI // UI
globeSprite *d2render.Sprite globeSprite *d2ui.Sprite
mainPanel *d2render.Sprite mainPanel *d2ui.Sprite
menuButton *d2render.Sprite menuButton *d2ui.Sprite
skillIcon *d2render.Sprite skillIcon *d2ui.Sprite
} }
func NewGameControls(hero *d2hero.Hero, mapEngine *d2mapengine.MapEngine) *GameControls { func NewGameControls(hero *d2map.Hero, mapEngine *d2map.MapEngine) *GameControls {
return &GameControls{ return &GameControls{
hero: hero, hero: hero,
mapEngine: mapEngine, mapEngine: mapEngine,
@ -57,17 +56,17 @@ func (g *GameControls) OnMouseButtonDown(event d2input.MouseEvent) bool {
} }
func (g *GameControls) Load() { func (g *GameControls) Load() {
animation, _ := d2assetmanager.LoadAnimation(d2resource.GameGlobeOverlap, d2resource.PaletteSky) animation, _ := d2asset.LoadAnimation(d2resource.GameGlobeOverlap, d2resource.PaletteSky)
g.globeSprite, _ = d2render.LoadSprite(animation) g.globeSprite, _ = d2ui.LoadSprite(animation)
animation, _ = d2assetmanager.LoadAnimation(d2resource.GamePanels, d2resource.PaletteSky) animation, _ = d2asset.LoadAnimation(d2resource.GamePanels, d2resource.PaletteSky)
g.mainPanel, _ = d2render.LoadSprite(animation) g.mainPanel, _ = d2ui.LoadSprite(animation)
animation, _ = d2assetmanager.LoadAnimation(d2resource.MenuButton, d2resource.PaletteSky) animation, _ = d2asset.LoadAnimation(d2resource.MenuButton, d2resource.PaletteSky)
g.menuButton, _ = d2render.LoadSprite(animation) g.menuButton, _ = d2ui.LoadSprite(animation)
animation, _ = d2assetmanager.LoadAnimation(d2resource.GenericSkills, d2resource.PaletteSky) animation, _ = d2asset.LoadAnimation(d2resource.GenericSkills, d2resource.PaletteSky)
g.skillIcon, _ = d2render.LoadSprite(animation) g.skillIcon, _ = d2ui.LoadSprite(animation)
g.inventory.Load() g.inventory.Load()
} }

View File

@ -3,14 +3,14 @@ package d2player
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2hero" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
) )
type Inventory struct { type Inventory struct {
frame *d2render.Sprite frame *d2ui.Sprite
panel *d2render.Sprite panel *d2ui.Sprite
grid *ItemGrid grid *ItemGrid
originX int originX int
originY int originY int
@ -44,18 +44,18 @@ func (g *Inventory) Close() {
} }
func (g *Inventory) Load() { func (g *Inventory) Load() {
animation, _ := d2assetmanager.LoadAnimation(d2resource.Frame, d2resource.PaletteSky) animation, _ := d2asset.LoadAnimation(d2resource.Frame, d2resource.PaletteSky)
g.frame, _ = d2render.LoadSprite(animation) g.frame, _ = d2ui.LoadSprite(animation)
animation, _ = d2assetmanager.LoadAnimation(d2resource.InventoryCharacterPanel, d2resource.PaletteSky) animation, _ = d2asset.LoadAnimation(d2resource.InventoryCharacterPanel, d2resource.PaletteSky)
g.panel, _ = d2render.LoadSprite(animation) g.panel, _ = d2ui.LoadSprite(animation)
items := []InventoryItem{ items := []InventoryItem{
d2hero.GetWeaponItemByCode("wnd"), d2inventory.GetWeaponItemByCode("wnd"),
d2hero.GetWeaponItemByCode("sst"), d2inventory.GetWeaponItemByCode("sst"),
d2hero.GetWeaponItemByCode("jav"), d2inventory.GetWeaponItemByCode("jav"),
d2hero.GetArmorItemByCode("buc"), d2inventory.GetArmorItemByCode("buc"),
d2hero.GetWeaponItemByCode("clb"), d2inventory.GetWeaponItemByCode("clb"),
} }
g.grid.Add(items...) g.grid.Add(items...)
} }

View File

@ -5,12 +5,12 @@ import (
"fmt" "fmt"
"log" "log"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
type InventoryItem interface { type InventoryItem interface {
@ -30,7 +30,7 @@ type ItemGrid struct {
height int height int
originX int originX int
originY int originY int
sprites map[string]*d2render.Sprite sprites map[string]*d2ui.Sprite
slotSize int slotSize int
} }
@ -41,7 +41,7 @@ func NewItemGrid(width int, height int, originX int, originY int) *ItemGrid {
originX: originX, originX: originX,
originY: originY, originY: originY,
slotSize: 29, slotSize: 29,
sprites: make(map[string]*d2render.Sprite), sprites: make(map[string]*d2ui.Sprite),
} }
} }
@ -92,7 +92,7 @@ func (g *ItemGrid) Add(items ...InventoryItem) (int, error) {
// Load reads the inventory sprites for items into local cache for rendering. // Load reads the inventory sprites for items into local cache for rendering.
func (g *ItemGrid) Load(items ...InventoryItem) { func (g *ItemGrid) Load(items ...InventoryItem) {
var itemSprite *d2render.Sprite var itemSprite *d2ui.Sprite
for _, item := range items { for _, item := range items {
if _, exists := g.sprites[item.ItemCode()]; exists { if _, exists := g.sprites[item.ItemCode()]; exists {
@ -101,7 +101,7 @@ func (g *ItemGrid) Load(items ...InventoryItem) {
} }
// TODO: Put the pattern into D2Shared // TODO: Put the pattern into D2Shared
animation, err := d2assetmanager.LoadAnimation( animation, err := d2asset.LoadAnimation(
fmt.Sprintf("/data/global/items/inv%s.dc6", item.ItemCode()), fmt.Sprintf("/data/global/items/inv%s.dc6", item.ItemCode()),
d2resource.PaletteSky, d2resource.PaletteSky,
) )
@ -109,7 +109,7 @@ func (g *ItemGrid) Load(items ...InventoryItem) {
log.Printf("failed to load sprite for item (%s): %v", item.ItemCode(), err) log.Printf("failed to load sprite for item (%s): %v", item.ItemCode(), err)
continue continue
} }
itemSprite, err = d2render.LoadSprite(animation) itemSprite, err = d2ui.LoadSprite(animation)
g.sprites[item.ItemCode()] = itemSprite g.sprites[item.ItemCode()] = itemSprite
} }

12
go.sum
View File

@ -12,28 +12,25 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72 h1:b+9H1GAsx5RsjvDFLoS5zkNBzIQMuVKUYQDmxU3N5XE= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72 h1:b+9H1GAsx5RsjvDFLoS5zkNBzIQMuVKUYQDmxU3N5XE=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-restruct/restruct v0.0.0-20191018101351-5fb876c952c9 h1:f25lTFrAliLucJ3G6a9PcgyaGXA6omEF+682jgfC+7U=
github.com/go-restruct/restruct v0.0.0-20191018101351-5fb876c952c9/go.mod h1:KqrpKpn4M8OLznErihXTGLlsXFGeLxHUrLRRI/1YjGk=
github.com/go-restruct/restruct v0.0.0-20191227155143-5734170a48a1 h1:LoN2wx/aN8JPGebG+2DaUyk4M+xRcqJXfuIbs8AWHdE= github.com/go-restruct/restruct v0.0.0-20191227155143-5734170a48a1 h1:LoN2wx/aN8JPGebG+2DaUyk4M+xRcqJXfuIbs8AWHdE=
github.com/go-restruct/restruct v0.0.0-20191227155143-5734170a48a1/go.mod h1:KqrpKpn4M8OLznErihXTGLlsXFGeLxHUrLRRI/1YjGk= github.com/go-restruct/restruct v0.0.0-20191227155143-5734170a48a1/go.mod h1:KqrpKpn4M8OLznErihXTGLlsXFGeLxHUrLRRI/1YjGk=
github.com/gofrs/flock v0.7.1 h1:DP+LD/t0njgoPBvT5MJLeliUIVQR03hiKR6vezdwHlc= github.com/gofrs/flock v0.7.1 h1:DP+LD/t0njgoPBvT5MJLeliUIVQR03hiKR6vezdwHlc=
github.com/gofrs/flock v0.7.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/flock v0.7.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/hajimehoshi/bitmapfont v1.2.0/go.mod h1:h9QrPk6Ktb2neObTlAbma6Ini1xgMjbJ3w7ysmD7IOU= github.com/hajimehoshi/bitmapfont v1.2.0/go.mod h1:h9QrPk6Ktb2neObTlAbma6Ini1xgMjbJ3w7ysmD7IOU=
github.com/hajimehoshi/ebiten v1.10.3 h1:ywrEsXclsjrdKIhYYrmy/yxLFCd1y4efGVsnFRl8OLU=
github.com/hajimehoshi/ebiten v1.10.3/go.mod h1:i9dIEUf5/MuPtbK1/wHR0PB7ZtqhjOxxg+U1xfxapcY=
github.com/hajimehoshi/ebiten v1.11.0-alpha.2.0.20200102072751-e66f1fb71e2e h1:NRGAeXOSMrAo0f4GPaUoiF61eo0wWrfgONPSTZA6Zhg= github.com/hajimehoshi/ebiten v1.11.0-alpha.2.0.20200102072751-e66f1fb71e2e h1:NRGAeXOSMrAo0f4GPaUoiF61eo0wWrfgONPSTZA6Zhg=
github.com/hajimehoshi/ebiten v1.11.0-alpha.2.0.20200102072751-e66f1fb71e2e/go.mod h1:0SLvfr8iI2NxzpNB/olBM+dLN9Ur5a9szG13wOgQ0nQ= github.com/hajimehoshi/ebiten v1.11.0-alpha.2.0.20200102072751-e66f1fb71e2e/go.mod h1:0SLvfr8iI2NxzpNB/olBM+dLN9Ur5a9szG13wOgQ0nQ=
github.com/hajimehoshi/go-mp3 v0.2.1/go.mod h1:Rr+2P46iH6PwTPVgSsEwBkon0CK5DxCAeX/Rp65DCTE= github.com/hajimehoshi/go-mp3 v0.2.1/go.mod h1:Rr+2P46iH6PwTPVgSsEwBkon0CK5DxCAeX/Rp65DCTE=
github.com/hajimehoshi/oto v0.3.4 h1:FSlftYfESnZgI1ghi6WLMqVMjTrl9i8nRri3bL4Bdhs=
github.com/hajimehoshi/oto v0.3.4/go.mod h1:PgjqsBJff0efqL2nlMJidJgVJywLn6M4y8PI4TfeWfA= github.com/hajimehoshi/oto v0.3.4/go.mod h1:PgjqsBJff0efqL2nlMJidJgVJywLn6M4y8PI4TfeWfA=
github.com/hajimehoshi/oto v0.5.4 h1:Dn+WcYeF310xqStKm0tnvoruYUV5Sce8+sfUaIvWGkE= github.com/hajimehoshi/oto v0.5.4 h1:Dn+WcYeF310xqStKm0tnvoruYUV5Sce8+sfUaIvWGkE=
github.com/hajimehoshi/oto v0.5.4/go.mod h1:0QXGEkbuJRohbJaxr7ZQSxnju7hEhseiPx2hrh6raOI= github.com/hajimehoshi/oto v0.5.4/go.mod h1:0QXGEkbuJRohbJaxr7ZQSxnju7hEhseiPx2hrh6raOI=
github.com/jakecoffman/cp v0.1.0/go.mod h1:a3xPx9N8RyFAACD644t2dj/nK4SuLg1v+jL61m2yVo4= github.com/jakecoffman/cp v0.1.0/go.mod h1:a3xPx9N8RyFAACD644t2dj/nK4SuLg1v+jL61m2yVo4=
github.com/jfreymuth/oggvorbis v1.0.0/go.mod h1:abe6F9QRjuU9l+2jek3gj46lu40N4qlYxh2grqkLEDM= github.com/jfreymuth/oggvorbis v1.0.0/go.mod h1:abe6F9QRjuU9l+2jek3gj46lu40N4qlYxh2grqkLEDM=
github.com/jfreymuth/vorbis v1.0.0/go.mod h1:8zy3lUAm9K/rJJk223RKy6vjCZTWC61NA2QD06bfOE0= github.com/jfreymuth/vorbis v1.0.0/go.mod h1:8zy3lUAm9K/rJJk223RKy6vjCZTWC61NA2QD06bfOE0=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
@ -47,18 +44,15 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4=
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136 h1:A1gGSx58LAGVHUUsOf7IiR0u8Xb6W51gRwfDBhkdcaw=
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190703141733-d6a02ce849c9/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20190703141733-d6a02ce849c9/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 h1:hVwzHzIUGRjiF7EcUjqNxk3NCfkPxbDKRdnNE1Rpg0U=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190415191353-3e0bab5405d6/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mobile v0.0.0-20190415191353-3e0bab5405d6/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mobile v0.0.0-20191025110607-73ccc5ba0426/go.mod h1:p895TfNkDgPEmEQrNiOtIl3j98d/tGU95djDj7NfyjQ= golang.org/x/mobile v0.0.0-20191025110607-73ccc5ba0426/go.mod h1:p895TfNkDgPEmEQrNiOtIl3j98d/tGU95djDj7NfyjQ=
golang.org/x/mobile v0.0.0-20191115022231-f0c40035f2ba h1:NVszahdZPQTROdO0F5gnXdZhGl2lXFb9w7Ek1F2Pbmk=
golang.org/x/mobile v0.0.0-20191115022231-f0c40035f2ba/go.mod h1:p895TfNkDgPEmEQrNiOtIl3j98d/tGU95djDj7NfyjQ= golang.org/x/mobile v0.0.0-20191115022231-f0c40035f2ba/go.mod h1:p895TfNkDgPEmEQrNiOtIl3j98d/tGU95djDj7NfyjQ=
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@ -70,7 +64,6 @@ golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190429190828-d89cdac9e872/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190429190828-d89cdac9e872/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191115151921-52ab43148777 h1:wejkGHRTr38uaKRqECZlsCsJ1/TGxIyFbH32x5zUdu4=
golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
@ -81,7 +74,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

96
main.go
View File

@ -3,38 +3,28 @@ package main
import ( import (
"log" "log"
ebiten2 "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio/ebiten" "gopkg.in/alecthomas/kingpin.v2"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2assetmanager"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2scenemanager"
"github.com/OpenDiablo2/OpenDiablo2/d2game/d2scene"
"github.com/OpenDiablo2/OpenDiablo2/d2game"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render/ebiten"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2config"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2term"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2config"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2mpq" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2mpq"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2game/d2gamescene"
"gopkg.in/alecthomas/kingpin.v2" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio"
ebiten2 "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio/ebiten"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render/ebiten"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2scene"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2term"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
"github.com/OpenDiablo2/OpenDiablo2/d2game"
) )
// GitBranch is set by the CI build process to the name of the branch // GitBranch is set by the CI build process to the name of the branch
@ -48,9 +38,9 @@ var preset = kingpin.Arg("preset", "Level preset").Int()
func main() { func main() {
if len(GitBranch) == 0 { if len(GitBranch) == 0 {
GitBranch = "Local Build" GitBranch = "Local Build"
GitCommit = "" GitCommit = ""
} }
d2common.SetBuildInfo(GitBranch, GitCommit) d2common.SetBuildInfo(GitBranch, GitCommit)
log.SetFlags(log.Lshortfile) log.SetFlags(log.Lshortfile)
log.Println("OpenDiablo2 - Open source Diablo 2 engine") log.Println("OpenDiablo2 - Open source Diablo 2 engine")
@ -67,9 +57,9 @@ func main() {
kingpin.Parse() kingpin.Parse()
if *region == 0 { if *region == 0 {
d2scenemanager.SetNextScene(d2scene.CreateMainMenu()) d2scene.SetNextScene(d2gamescene.CreateMainMenu())
} else { } else {
d2scenemanager.SetNextScene(d2scene.CreateMapEngineTest(*region, *preset)) d2scene.SetNextScene(d2gamescene.CreateMapEngineTest(*region, *preset))
} }
err = d2game.Run(GitBranch) err = d2game.Run(GitBranch)
if err != nil { if err != nil {
@ -89,7 +79,7 @@ func loadTextDictionary() bool {
} }
for _, item := range toLoad { for _, item := range toLoad {
fileData, err = d2assetmanager.LoadFile(item) fileData, err = d2asset.LoadFile(item)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
return false return false
@ -107,7 +97,7 @@ func loadPalettes() bool {
} { } {
filePath := `data\global\palette\` + pal + `\pal.dat` filePath := `data\global\palette\` + pal + `\pal.dat`
paletteType := d2enum.PaletteType(pal) paletteType := d2enum.PaletteType(pal)
file, _ := d2assetmanager.LoadFile(filePath) file, _ := d2asset.LoadFile(filePath)
d2datadict.LoadPalette(paletteType, file) d2datadict.LoadPalette(paletteType, file)
} }
log.Printf("Loaded %d palettes", len(d2datadict.Palettes)) log.Printf("Loaded %d palettes", len(d2datadict.Palettes))
@ -143,7 +133,7 @@ func initializeEverything() error {
} }
d2term.BindLogger() d2term.BindLogger()
d2assetmanager.Initialize() d2asset.Initialize()
err = d2render.SetWindowIcon("d2logo.png") err = d2render.SetWindowIcon("d2logo.png")
if err != nil { if err != nil {
@ -172,86 +162,86 @@ func initializeEverything() error {
loadTextDictionary() loadTextDictionary()
file, err = d2assetmanager.LoadFile(d2resource.LevelType) file, err = d2asset.LoadFile(d2resource.LevelType)
if err != nil { if err != nil {
return err return err
} }
d2datadict.LoadLevelTypes(file) d2datadict.LoadLevelTypes(file)
file, err = d2assetmanager.LoadFile(d2resource.LevelPreset) file, err = d2asset.LoadFile(d2resource.LevelPreset)
if err != nil { if err != nil {
return err return err
} }
d2datadict.LoadLevelPresets(file) d2datadict.LoadLevelPresets(file)
file, err = d2assetmanager.LoadFile(d2resource.LevelWarp) file, err = d2asset.LoadFile(d2resource.LevelWarp)
if err != nil { if err != nil {
return err return err
} }
d2datadict.LoadLevelWarps(file) d2datadict.LoadLevelWarps(file)
file, err = d2assetmanager.LoadFile(d2resource.ObjectType) file, err = d2asset.LoadFile(d2resource.ObjectType)
if err != nil { if err != nil {
return err return err
} }
d2datadict.LoadObjectTypes(file) d2datadict.LoadObjectTypes(file)
file, err = d2assetmanager.LoadFile(d2resource.ObjectDetails) file, err = d2asset.LoadFile(d2resource.ObjectDetails)
if err != nil { if err != nil {
return err return err
} }
d2datadict.LoadObjects(file) d2datadict.LoadObjects(file)
file, err = d2assetmanager.LoadFile(d2resource.Weapons) file, err = d2asset.LoadFile(d2resource.Weapons)
if err != nil { if err != nil {
return err return err
} }
d2datadict.LoadWeapons(file) d2datadict.LoadWeapons(file)
file, err = d2assetmanager.LoadFile(d2resource.Armor) file, err = d2asset.LoadFile(d2resource.Armor)
if err != nil { if err != nil {
return err return err
} }
d2datadict.LoadArmors(file) d2datadict.LoadArmors(file)
file, err = d2assetmanager.LoadFile(d2resource.Misc) file, err = d2asset.LoadFile(d2resource.Misc)
if err != nil { if err != nil {
return err return err
} }
d2datadict.LoadMiscItems(file) d2datadict.LoadMiscItems(file)
file, err = d2assetmanager.LoadFile(d2resource.UniqueItems) file, err = d2asset.LoadFile(d2resource.UniqueItems)
if err != nil { if err != nil {
return err return err
} }
d2datadict.LoadUniqueItems(file) d2datadict.LoadUniqueItems(file)
file, err = d2assetmanager.LoadFile(d2resource.Missiles) file, err = d2asset.LoadFile(d2resource.Missiles)
if err != nil { if err != nil {
return err return err
} }
d2datadict.LoadMissiles(file) d2datadict.LoadMissiles(file)
file, err = d2assetmanager.LoadFile(d2resource.SoundSettings) file, err = d2asset.LoadFile(d2resource.SoundSettings)
if err != nil { if err != nil {
return err return err
} }
d2datadict.LoadSounds(file) d2datadict.LoadSounds(file)
file, err = d2assetmanager.LoadFile(d2resource.AnimationData) file, err = d2asset.LoadFile(d2resource.AnimationData)
if err != nil { if err != nil {
return err return err
} }
d2data.LoadAnimationData(file) d2data.LoadAnimationData(file)
file, err = d2assetmanager.LoadFile(d2resource.MonStats) file, err = d2asset.LoadFile(d2resource.MonStats)
if err != nil { if err != nil {
return err return err
} }
d2datadict.LoadMonStats(file) d2datadict.LoadMonStats(file)
animation, _ := d2assetmanager.LoadAnimation(d2resource.LoadingScreen, d2resource.PaletteLoading) animation, _ := d2asset.LoadAnimation(d2resource.LoadingScreen, d2resource.PaletteLoading)
loadingSprite, _ := d2render.LoadSprite(animation) loadingSprite, _ := d2ui.LoadSprite(animation)
loadingSpriteSizeX, loadingSpriteSizeY := loadingSprite.GetCurrentFrameSize() loadingSpriteSizeX, loadingSpriteSizeY := loadingSprite.GetCurrentFrameSize()
loadingSprite.SetPosition(int(400-(loadingSpriteSizeX/2)), int(300+(loadingSpriteSizeY/2))) loadingSprite.SetPosition(int(400-(loadingSpriteSizeX/2)), int(300+(loadingSpriteSizeY/2)))
err = d2game.Initialize(loadingSprite) err = d2game.Initialize(loadingSprite)
@ -259,8 +249,8 @@ func initializeEverything() error {
return err return err
} }
animation, _ = d2assetmanager.LoadAnimation(d2resource.CursorDefault, d2resource.PaletteUnits) animation, _ = d2asset.LoadAnimation(d2resource.CursorDefault, d2resource.PaletteUnits)
cursorSprite, _ := d2render.LoadSprite(animation) cursorSprite, _ := d2ui.LoadSprite(animation)
d2ui.Initialize(cursorSprite) d2ui.Initialize(cursorSprite)
d2term.BindAction("timescale", "set scalar for elapsed time", func(scale float64) { d2term.BindAction("timescale", "set scalar for elapsed time", func(scale float64) {