Phase 1 prep work for gameplay (#196)

* Updates
* More merge adjustments.
* Don't commit local changes...
This commit is contained in:
Tim Sarbin 2019-11-17 01:14:58 -05:00 committed by GitHub
parent c3ba3f71e4
commit 297184376f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 114 additions and 100 deletions

View File

@ -2,14 +2,19 @@ package d2scene
import (
"image/color"
"log"
"github.com/OpenDiablo2/D2Shared/d2helper"
"github.com/OpenDiablo2/OpenDiablo2/d2render/d2mapengine"
"github.com/OpenDiablo2/OpenDiablo2/d2audio"
"github.com/OpenDiablo2/D2Shared/d2common/d2enum"
"github.com/OpenDiablo2/D2Shared/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2corecommon/d2coreinterface"
"github.com/OpenDiablo2/D2Shared/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core"
"github.com/OpenDiablo2/D2Shared/d2data/d2datadict"
"github.com/OpenDiablo2/OpenDiablo2/d2audio"
"github.com/OpenDiablo2/OpenDiablo2/d2core"
"github.com/OpenDiablo2/OpenDiablo2/d2corecommon/d2coreinterface"
"github.com/OpenDiablo2/OpenDiablo2/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2render/d2ui"
"github.com/hajimehoshi/ebiten"
@ -24,6 +29,7 @@ type Game struct {
pentSpinLeft d2render.Sprite
pentSpinRight d2render.Sprite
testLabel d2ui.Label
mapEngine *d2mapengine.Engine
}
func CreateGame(
@ -64,6 +70,21 @@ func (v *Game) Load() []func() {
v.testLabel.SetText("Soon :tm:")
v.testLabel.MoveTo(400, 250)
},
func() {
v.mapEngine = d2mapengine.CreateMapEngine(v.gameState, v.soundManager, v.fileProvider)
// TODO: This needs to be different depending on the act of the player
v.mapEngine.GenerateMap(d2enum.RegionAct1Town, 1, 0)
region := v.mapEngine.GetRegion(0)
rx, ry := d2helper.IsoToScreen(int(region.Region.StartX), int(region.Region.StartY), 0, 0)
v.mapEngine.CenterCameraOn(float64(rx), float64(ry))
v.mapEngine.Hero = d2core.CreateHero(
int32((region.Region.StartX*5)+3),
int32((region.Region.StartY*5)+3),
0,
v.gameState.HeroType,
v.gameState.Equipment,
v.fileProvider)
},
}
}
@ -73,11 +94,29 @@ func (v *Game) Unload() {
func (v Game) Render(screen *ebiten.Image) {
screen.Fill(color.Black)
v.pentSpinLeft.Draw(screen)
v.pentSpinRight.Draw(screen)
v.testLabel.Draw(screen)
v.mapEngine.Render(screen)
}
func (v *Game) Update(tickTime float64) {
// TODO: Pathfinding
if ebiten.IsMouseButtonPressed(ebiten.MouseButtonLeft) {
mx, my := ebiten.CursorPosition()
px, py := d2helper.ScreenToIso(float64(mx)-v.mapEngine.OffsetX, float64(my)-v.mapEngine.OffsetY)
angle := 359 - d2helper.GetAngleBetween(
v.mapEngine.Hero.AnimatedEntity.LocationX,
v.mapEngine.Hero.AnimatedEntity.LocationY,
px,
py,
)
directionIndex := int((float64(angle) / 360.0) * 16.0)
newDirection := d2render.DirectionLookup[directionIndex]
if newDirection != v.mapEngine.Hero.AnimatedEntity.GetDirection() {
v.mapEngine.Hero.AnimatedEntity.SetMode(d2enum.AnimationModePlayerTownNeutral.String(), v.mapEngine.Hero.Equipment.RightHand.GetWeaponClass(), newDirection)
log.Printf("Angle: %d -> %d", directionIndex, newDirection)
}
}
rx, ry := d2helper.IsoToScreen(int(v.mapEngine.Hero.AnimatedEntity.LocationX), int(v.mapEngine.Hero.AnimatedEntity.LocationY), 0, 0)
v.mapEngine.CenterCameraOn(float64(rx), float64(ry))
}

View File

@ -12,9 +12,9 @@ import (
"github.com/OpenDiablo2/D2Shared/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2corecommon/d2coreinterface"
"github.com/OpenDiablo2/OpenDiablo2/d2audio"
"github.com/OpenDiablo2/D2Shared/d2common/d2enum"
_map "github.com/OpenDiablo2/OpenDiablo2/d2render/d2mapengine"
"github.com/OpenDiablo2/OpenDiablo2/d2audio"
"github.com/OpenDiablo2/OpenDiablo2/d2render/d2mapengine"
"github.com/OpenDiablo2/OpenDiablo2/d2render/d2ui"
"github.com/hajimehoshi/ebiten"
"github.com/hajimehoshi/ebiten/ebitenutil"
@ -88,7 +88,7 @@ type MapEngineTest struct {
fileProvider d2interface.FileProvider
sceneProvider d2coreinterface.SceneProvider
gameState *d2core.GameState
mapEngine *_map.Engine
mapEngine *d2mapengine.Engine
//TODO: this is region specific properties, should be refactored for multi-region rendering
currentRegion int
@ -150,8 +150,7 @@ func (v *MapEngineTest) LoadRegionByIndex(n int, levelPreset, fileIndex int) {
v.mapEngine.GenerateAct1Overworld()
return
}
v.mapEngine = _map.CreateMapEngine(v.gameState, v.soundManager, v.fileProvider) // necessary for map name update
v.mapEngine = d2mapengine.CreateMapEngine(v.gameState, v.soundManager, v.fileProvider) // necessary for map name update
v.mapEngine.OffsetY = 0
v.mapEngine.OffsetX = 0
v.mapEngine.GenerateMap(d2enum.RegionIdType(n), levelPreset, fileIndex)
@ -163,7 +162,7 @@ func (v *MapEngineTest) Load() []func() {
v.soundManager.PlayBGM("")
return []func(){
func() {
v.mapEngine = _map.CreateMapEngine(v.gameState, v.soundManager, v.fileProvider)
v.mapEngine = d2mapengine.CreateMapEngine(v.gameState, v.soundManager, v.fileProvider)
v.LoadRegionByIndex(v.currentRegion, v.levelPreset, v.fileIndex)
},

View File

@ -73,7 +73,11 @@ func CreateAnimatedEntity(x, y int32, object *d2datadict.ObjectLookupRecord, fil
}
// DirectionLookup is used to decode the direction offset indexes
var DirectionLookup = []int{3, 15, 4, 8, 0, 9, 5, 10, 1, 11, 6, 12, 2, 13, 7, 14}
var DirectionLookup = []int{9, 15, 5, 6, 4, 10, 2, 8, 0, 0, 0, 0, 0, 0, 0, 0}
func (v AnimatedEntity) GetDirection() int {
return v.direction
}
// SetMode changes the graphical mode of this animated entity
func (v *AnimatedEntity) SetMode(animationMode, weaponClass string, direction int) {

View File

@ -40,6 +40,7 @@ type Engine struct {
OffsetX float64
OffsetY float64
ShowTiles int
Hero *d2core.Hero
}
func CreateMapEngine(gameState *d2core.GameState, soundManager *d2audio.Manager, fileProvider d2interface.FileProvider) *Engine {
@ -52,6 +53,15 @@ func CreateMapEngine(gameState *d2core.GameState, soundManager *d2audio.Manager,
return result
}
func (v *Engine) GetRegion(regionIndex int) *EngineRegion {
return &v.regions[regionIndex]
}
func (v *Engine) CenterCameraOn(x, y float64) {
v.OffsetX = -(x - 400)
v.OffsetY = -(y - 300)
}
func (v *Engine) GenerateMap(regionType d2enum.RegionIdType, levelPreset int, fileIndex int) {
randomSource := rand.NewSource(v.gameState.Seed)
region := LoadRegion(randomSource, regionType, levelPreset, v.fileProvider, fileIndex)
@ -209,6 +219,9 @@ func (v *Engine) RenderPass2(region *Region, offX, offY, x, y int, target *ebite
npc.Render(target, offX+int(v.OffsetX), offY+int(v.OffsetY))
}
}
if v.Hero != nil && int(v.Hero.AnimatedEntity.LocationX) == x && int(v.Hero.AnimatedEntity.LocationY) == y {
v.Hero.Render(target, offX+int(v.OffsetX), offY+int(v.OffsetY))
}
}
func (v *Engine) RenderPass3(region *Region, offX, offY, x, y int, target *ebiten.Image) {

View File

@ -101,9 +101,27 @@ func LoadRegion(seed rand.Source, levelType d2enum.RegionIdType, levelPreset int
result.TileWidth = result.DS1.Width
result.TileHeight = result.DS1.Height
result.loadObjects(fileProvider)
result.loadSpecials()
return result
}
func (v *Region) loadSpecials() {
for y := range v.DS1.Tiles {
for x := range v.DS1.Tiles[y] {
for _, wall := range v.DS1.Tiles[y][x].Walls {
if wall.Orientation != 10 {
continue
}
if wall.MainIndex == 30 && wall.SubIndex == 0 {
v.StartX = float64(x) + 0.5
v.StartY = float64(y) + 0.5
log.Printf("Starting location: %d, %d", x, y)
}
}
}
}
}
func (v *Region) loadObjects(fileProvider d2interface.FileProvider) {
var wg sync.WaitGroup
wg.Add(len(v.DS1.Objects))

7
go.mod
View File

@ -4,13 +4,12 @@ go 1.12
require (
github.com/JoshVarga/blast v0.0.0-20180421040937-681c804fb9f0
github.com/OpenDiablo2/D2Shared v0.0.0-20191117053631-b0c159330365
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect
github.com/hajimehoshi/ebiten v1.11.0-alpha.0.20191115171053-e42cff071c36
github.com/OpenDiablo2/D2Shared v0.0.0-20191117044836-c56c888bec7d
github.com/hajimehoshi/ebiten v1.11.0-alpha.0.20191116200143-acc933b7c399
github.com/hajimehoshi/oto v0.5.3 // indirect
github.com/hajimehoshi/ebiten v1.11.0-alpha.0.20191117051038-800b98a0c66d
github.com/mitchellh/go-homedir v1.1.0
github.com/pkg/profile v1.3.0
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136 // indirect
golang.org/x/mobile v0.0.0-20191115022231-f0c40035f2ba // indirect
golang.org/x/sys v0.0.0-20191115151921-52ab43148777 // indirect

21
go.sum
View File

@ -6,18 +6,30 @@ github.com/OpenDiablo2/D2Shared v0.0.0-20191117023413-d9429afbbed6 h1:KAejCXdaPB
github.com/OpenDiablo2/D2Shared v0.0.0-20191117023413-d9429afbbed6/go.mod h1:ZB6LLdzmBJrQ0ADH671WFvsAhNQfYaOp0EI3KJ9Ckck=
github.com/OpenDiablo2/D2Shared v0.0.0-20191117044836-c56c888bec7d h1:2yQG+kQSdd/9NvbUDYYkvfjMPGRb5vLSClYRWF835SI=
github.com/OpenDiablo2/D2Shared v0.0.0-20191117044836-c56c888bec7d/go.mod h1:tWln5/64VDcLuOr/GHyQU1ea5zdm5WfleFPEr8rFgcw=
github.com/OpenDiablo2/D2Shared v0.0.0-20191117053631-b0c159330365 h1:CinnWYg8Pa+FUuMvhNpJyxf9FeDmc4J3PllQdeGuXGU=
github.com/OpenDiablo2/D2Shared v0.0.0-20191117053631-b0c159330365/go.mod h1:tWln5/64VDcLuOr/GHyQU1ea5zdm5WfleFPEr8rFgcw=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E=
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
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/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/ebiten v1.10.0 h1:ADLOUI/7aaTOP7GRlQBHVI1Qtvfdt9M6XQqeULSK7Uo=
github.com/hajimehoshi/ebiten v1.10.0/go.mod h1:8BJhIws+Jkol+z7hSGP/WFsaDAPTtRQ+ELBPPQetq2w=
github.com/hajimehoshi/ebiten v1.11.0-alpha.0.20191115171053-e42cff071c36 h1:fHp/oiWM4uC88FHWCaTn6Lck4sTEKZ0KhWsajb7zfL0=
github.com/hajimehoshi/ebiten v1.11.0-alpha.0.20191115171053-e42cff071c36/go.mod h1:52cGPFR+BqkkBap9Ue4BEKkfvICkvXoONeWCYPEFTPo=
github.com/hajimehoshi/ebiten v1.11.0-alpha.0.20191116200143-acc933b7c399 h1:UeyExTBk9PT8voPAc8UvIqOytjRrPBQX7D1jiQnhhls=
github.com/hajimehoshi/ebiten v1.11.0-alpha.0.20191116200143-acc933b7c399/go.mod h1:52cGPFR+BqkkBap9Ue4BEKkfvICkvXoONeWCYPEFTPo=
github.com/hajimehoshi/ebiten v1.11.0-alpha.0.20191117051038-800b98a0c66d h1:dJL9ygMUE9U5WOEwgQ+D33t0dDRm3VkwNi2lzaoGQ6A=
github.com/hajimehoshi/ebiten v1.11.0-alpha.0.20191117051038-800b98a0c66d/go.mod h1:6ax6p5ui8fuQ/+00sQ79oTy4OfrythHfDEYV4yni5So=
github.com/hajimehoshi/go-mp3 v0.2.1/go.mod h1:Rr+2P46iH6PwTPVgSsEwBkon0CK5DxCAeX/Rp65DCTE=
github.com/hajimehoshi/oto v0.3.4/go.mod h1:PgjqsBJff0efqL2nlMJidJgVJywLn6M4y8PI4TfeWfA=
github.com/hajimehoshi/oto v0.5.2 h1:5FEPlejAsR2PVRqiW7h2PIwp9UWR+8zxj2And102YU4=
github.com/hajimehoshi/oto v0.5.2/go.mod h1:0QXGEkbuJRohbJaxr7ZQSxnju7hEhseiPx2hrh6raOI=
github.com/hajimehoshi/oto v0.5.3-0.20191110112117-6298480de6b1 h1:D/mCcGB1KpQDbI8itypR0vhNA1LClAD336h0VKmwNCo=
github.com/hajimehoshi/oto v0.5.3-0.20191110112117-6298480de6b1/go.mod h1:0QXGEkbuJRohbJaxr7ZQSxnju7hEhseiPx2hrh6raOI=
@ -34,6 +46,11 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA=
github.com/pkg/profile v1.3.0 h1:OQIvuDgm00gWVWGTf4m4mCt6W1/0YqU7Ntg0mySWgaI=
github.com/pkg/profile v1.3.0/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
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=
@ -70,5 +87,9 @@ golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.0.0-20191026034945-b2104f82a97d h1:QFO0Wgcqcp8nI9hbisKDTBsmfwrvLswk2T73QDZZgVo=
golang.org/x/tools v0.0.0-20191026034945-b2104f82a97d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
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/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/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

View File

@ -10,8 +10,8 @@ import (
"github.com/OpenDiablo2/D2Shared/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2core"
"github.com/OpenDiablo2/D2Shared/d2data/d2mpq"
"github.com/OpenDiablo2/OpenDiablo2/d2core"
"github.com/hajimehoshi/ebiten"
"gopkg.in/alecthomas/kingpin.v2"
)
@ -27,9 +27,11 @@ var region = kingpin.Arg("region", "Region type id").Int()
var preset = kingpin.Arg("preset", "Level preset").Int()
func main() {
//defer profile.Start(profile.CPUProfile).Stop()
//procs := runtime.GOMAXPROCS(16)
//log.Printf("Setting gomaxprocs to 16, it was previously set to %d", procs)
//runtime.LockOSThread()
//defer runtime.UnlockOSThread()
//defer profile.Start(profile.ProfilePath(".")).Stop()
if len(GitBranch) == 0 {
GitBranch = "Local Build"
GitCommit = ""

View File

@ -1,29 +0,0 @@
package tests
import (
"testing"
"github.com/hajimehoshi/ebiten"
_map "github.com/OpenDiablo2/OpenDiablo2/d2render/d2mapengine"
"github.com/OpenDiablo2/D2Shared/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2core"
"github.com/OpenDiablo2/D2Shared/d2data/d2mpq"
)
func TestMapGenerationPerformance(t *testing.T) {
d2mpq.InitializeCryptoBuffer()
d2common.ConfigBasePath = "../"
engine := d2core.CreateEngine()
gameState := d2core.CreateTestGameState()
mapEngine := _map.CreateMapEngine(gameState, engine.SoundManager, engine)
mapEngine.GenerateAct1Overworld()
surface, _ := ebiten.NewImage(800, 600, ebiten.FilterNearest)
for y := 0; y < 1000; y++ {
mapEngine.Render(surface)
mapEngine.OffsetY = float64(-y)
}
}

View File

@ -1,52 +0,0 @@
package tests
import (
"log"
"path"
"strings"
"testing"
"github.com/OpenDiablo2/D2Shared/d2data/d2cof"
"github.com/OpenDiablo2/D2Shared/d2data/d2dcc"
"github.com/OpenDiablo2/OpenDiablo2/d2core"
"github.com/OpenDiablo2/D2Shared/d2data/d2mpq"
"github.com/OpenDiablo2/D2Shared/d2common"
)
func TestMPQScanPerformance(t *testing.T) {
log.SetFlags(log.Ldate | log.LUTC | log.Lmicroseconds | log.Llongfile)
d2mpq.InitializeCryptoBuffer()
d2common.ConfigBasePath = "../"
config := d2common.LoadConfiguration()
engine := d2core.CreateEngine()
for _, fileName := range config.MpqLoadOrder {
mpqFile := path.Join(config.MpqPath, fileName)
archive, _ := d2mpq.Load(mpqFile)
files, err := archive.GetFileList()
if err != nil {
continue
}
for _, archiveFile := range files {
// Temporary until all audio formats are supported
if strings.Contains(archiveFile, ".wav") || strings.Contains(archiveFile, ".pif") {
continue
}
parts := strings.Split(archiveFile, ".")
switch strings.ToLower(parts[len(parts)-1]) {
case "coff":
_ = d2cof.LoadCOF(archiveFile, engine)
case "dcc":
if strings.ContainsAny(archiveFile, "common") {
continue
}
_ = d2dcc.LoadDCC(archiveFile, engine)
}
_, _ = archive.ReadFile(archiveFile)
}
}
}