mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2025-11-17 17:21:26 -05:00
* adding logger implementation to d2common
* Adding file loader implementation
The file loader works in terms of `Sources` and `Assets`. A `Source` is
something like a filesystem that has a cache. An `Asset` is something
that implements `io.ReadSeeker` and has a few methods of its own.
There are currently `Source` implementations for MPQ archives and for the
host filesystem, meaning that one can specify a directory on the host fs to
load files from.
`Sources` are added to a loader with `loader.AddSource(path)`, where `path`
resolves somewhere on disk. In the case that the path points to an MPQ,
then an MPQ `Source` is created and added to the loader. If `path` resolves
to a directory, then a filesystem source is added.
Files are loaded with `loader.Load("data/global/excel/monstats.txt")`, and the
sources are searched in the order that they were added.
* adding tests for d2common/logger_test.go
* adding tests and testdata for d2loader
* logger lint fixes, fixed missing test case
* minor edits, lint fixes, changes some comments, embedded Logger into Loader
* moved d2loader into d2common (I dont think it belonged in d2core)
* removed my simple cache implementation in favor of our existing cache in d2common
53 lines
1.2 KiB
Go
53 lines
1.2 KiB
Go
package mpq
|
|
|
|
import (
|
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2mpq"
|
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
|
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2loader/asset"
|
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2loader/asset/types"
|
|
)
|
|
|
|
// static check that Source implements AssetSource
|
|
var _ asset.Source = &Source{}
|
|
|
|
// NewSource creates a new MPQ Source
|
|
func NewSource(sourcePath string) (asset.Source, error) {
|
|
loaded, err := d2mpq.Load(sourcePath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &Source{loaded}, nil
|
|
}
|
|
|
|
// Source is an implementation of an asset source for MPQ archives
|
|
type Source struct {
|
|
MPQ d2interface.Archive
|
|
}
|
|
|
|
// Type returns the asset type, for MPQ's it always returns the MPQ asset source type
|
|
func (v *Source) Type() types.SourceType {
|
|
return types.AssetSourceMPQ
|
|
}
|
|
|
|
// Open attempts to open a file within the MPQ archive
|
|
func (v *Source) Open(name string) (a asset.Asset, err error) {
|
|
stream, err := v.MPQ.ReadFileStream(name)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
a = &Asset{
|
|
source: v,
|
|
stream: stream,
|
|
}
|
|
|
|
return a, nil
|
|
}
|
|
|
|
// String returns the path of the MPQ on the host filesystem
|
|
func (v *Source) String() string {
|
|
return v.MPQ.Path()
|
|
}
|