1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-06-11 18:20:42 +00:00
OpenDiablo2/d2core/d2map/d2mapengine/pathfind.go
Ziemas d0c6cd61dd
Simple LOS pathfinding without walkmesh (#610)
* Reorganize MapEngine

This is already turning into a mess...

* Map engine selects tile index to use

Still very ugly

* Fix subtile flag combination

* Prepare randomly generated base tiles

* Restore collision viewer

* Movement works again, searches for straight paths

Paths are now d2vector slices

* Fix LOS calculation

* Fix test (I think)
2020-07-21 08:50:45 -04:00

48 lines
983 B
Go

package d2mapengine
import (
"math"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2math/d2vector"
)
func (m *MapEngine) PathFind(start, dest d2vector.Position) []d2vector.Position {
points := make([]d2vector.Position, 0)
_, point := m.checkLos(start, dest)
points = append(points, point)
return points
}
// checkLos finds out if there is a clear line of sight between two points
func (m *MapEngine) checkLos(start, end d2vector.Position) (bool, d2vector.Position) {
dv := d2vector.Position{Vector: end.Clone()}
dv.Subtract(&start.Vector)
dx := dv.X()
dy := dv.Y()
N := math.Max(math.Abs(dx), math.Abs(dy))
var divN float64
if N == 0 {
divN = 0.0
} else {
divN = 1.0 / N
}
xstep := dx * divN
ystep := dy * divN
x := start.X()
y := start.Y()
for i := 0; i <= int(N); i++ {
x += xstep
y += ystep
if m.SubTileAt(int(math.Floor(x)), int(math.Floor(y))).BlockWalk {
return false, d2vector.NewPosition(x-xstep, y-ystep)
}
}
return true, end
}