colordance
This commit is contained in:
@ -1,10 +1,13 @@
|
||||
package basic
|
||||
|
||||
import (
|
||||
"github.com/jcerise/gogue/gamemap"
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/gamemap"
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/types"
|
||||
"math"
|
||||
)
|
||||
|
||||
//fixme store separate FovMap, add method IsInMap to it
|
||||
|
||||
type FieldOfVision struct {
|
||||
cosTable map[int]float64
|
||||
sinTable map[int]float64
|
||||
@ -31,15 +34,15 @@ func (f *FieldOfVision) SetTorchRadius(radius int) {
|
||||
}
|
||||
}
|
||||
|
||||
func (f *FieldOfVision) SetAllInvisible(gameMap *gamemap.Map) {
|
||||
for x := 0; x < gameMap.Width; x++ {
|
||||
for y := 0; y < gameMap.Height; y++ {
|
||||
gameMap.Tiles[x][y].Visible = false
|
||||
func (f *FieldOfVision) SetAllInvisible(level *gamemap.Level) {
|
||||
for x := 0; x < level.W; x++ {
|
||||
for y := 0; y < level.H; y++ {
|
||||
level.Tiles[x][y].Visible = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (f *FieldOfVision) RayCast(playerX, playerY int, gameMap *gamemap.Map) {
|
||||
func (f *FieldOfVision) RayCast(playerCoords types.Coords, level *gamemap.Level) {
|
||||
// Cast out rays each degree in a 360 circle from the player. If a ray passes over a floor (does not block sight)
|
||||
// tile, keep going, up to the maximum torch radius (view radius) of the player. If the ray intersects a wall
|
||||
// (blocks sight), stop, as the player will not be able to see past that. Every visible tile will get the Visible
|
||||
@ -50,11 +53,11 @@ func (f *FieldOfVision) RayCast(playerX, playerY int, gameMap *gamemap.Map) {
|
||||
ax := f.sinTable[i]
|
||||
ay := f.cosTable[i]
|
||||
|
||||
x := float64(playerX)
|
||||
y := float64(playerY)
|
||||
x := float64(playerCoords.X)
|
||||
y := float64(playerCoords.Y)
|
||||
|
||||
// Mark the players current position as explored
|
||||
tile := gameMap.Tiles[playerX][playerY]
|
||||
tile := level.Tiles[playerCoords.X][playerCoords.Y]
|
||||
tile.Explored = true
|
||||
tile.Visible = true
|
||||
|
||||
@ -65,17 +68,17 @@ func (f *FieldOfVision) RayCast(playerX, playerY int, gameMap *gamemap.Map) {
|
||||
roundedX := int(Round(x))
|
||||
roundedY := int(Round(y))
|
||||
|
||||
if x < 0 || x > float64(gameMap.Width-1) || y < 0 || y > float64(gameMap.Height-1) {
|
||||
if x < 0 || x > float64(level.W -1) || y < 0 || y > float64(level.H -1) {
|
||||
// If the ray is cast outside of the gamemap, stop
|
||||
break
|
||||
}
|
||||
|
||||
tile := gameMap.Tiles[roundedX][roundedY]
|
||||
tile := level.Tiles[roundedX][roundedY]
|
||||
|
||||
tile.Explored = true
|
||||
tile.Visible = true
|
||||
|
||||
if gameMap.Tiles[roundedX][roundedY].BlocksSight == true {
|
||||
if level.Tiles[roundedX][roundedY].BlocksSight == true {
|
||||
// The ray hit a wall, go no further
|
||||
break
|
||||
}
|
||||
@ -85,4 +88,4 @@ func (f *FieldOfVision) RayCast(playerX, playerY int, gameMap *gamemap.Map) {
|
||||
|
||||
func Round(f float64) float64 {
|
||||
return math.Floor(f + .5)
|
||||
}
|
||||
}
|
@ -37,7 +37,7 @@ CurrentShade variable with the contents of the NextShade variable.
|
||||
If the tested cell is opaque – for each angle in the range occludedAngles by the cell, place a 1 at the position
|
||||
determined by angle%360 in the NextShade string.
|
||||
|
||||
For each angle in the range occludedAngles by the cell, add 1 to the shade value for that cell for each 0 encountered
|
||||
For each angle in the range occludedAngles by the cell, add 1 to the lit value for that cell for each 0 encountered
|
||||
at the position determined by angle%360 in the CurrentShade string.
|
||||
|
||||
Notes
|
||||
@ -75,7 +75,8 @@ type Cell struct {
|
||||
types.Coords
|
||||
distance float64
|
||||
occludedAngles []int //indexes of cells in CellList
|
||||
shade int //shade value
|
||||
lit int //lit value
|
||||
wasOccluded bool
|
||||
}
|
||||
|
||||
type CellList []*Cell
|
||||
@ -116,7 +117,7 @@ func (ps *precomputedShade) IsInFov(coords types.Coords) bool {
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return cell.shade > 0
|
||||
return cell.lit > 0
|
||||
}
|
||||
|
||||
func (ps *precomputedShade) SetLightWalls(value bool) {
|
||||
@ -141,7 +142,7 @@ func (ps *precomputedShade) PrecomputeFovMap() {
|
||||
iterCoords := types.Coords{x, y}
|
||||
distance := zeroCoords.DistanceTo(iterCoords)
|
||||
if distance <= float64(max) {
|
||||
ps.CellList = append(ps.CellList, &Cell{iterCoords, distance, nil, 0})
|
||||
ps.CellList = append(ps.CellList, &Cell{iterCoords, distance, nil, 0, false})
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -223,19 +224,22 @@ func (ps *precomputedShade) recalc(level *gamemap.Level, initCoords types.Coords
|
||||
}
|
||||
|
||||
//fmt.Printf("\n level coords: %v", lc)
|
||||
if level.Tiles[lc.X][lc.Y].BlocksSight {
|
||||
level.Tiles[lc.X][lc.Y].Visible = true
|
||||
for _, angle := range cell.occludedAngles {
|
||||
for _, angle := range cell.occludedAngles {
|
||||
|
||||
if level.Tiles[lc.X][lc.Y].BlocksSight {
|
||||
nextShade[angle] = 1
|
||||
}
|
||||
}
|
||||
|
||||
for _, angle := range cell.occludedAngles {
|
||||
if currentShade[angle] == 0 {
|
||||
cell.shade = cell.shade + 1
|
||||
cell.lit = cell.lit + 1
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if level.Tiles[lc.X][lc.Y].BlocksSight {
|
||||
level.Tiles[lc.X][lc.Y].Visible = true
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -244,8 +248,8 @@ func (ps *precomputedShade) ComputeFov(level *gamemap.Level, initCoords types.Co
|
||||
ps.recalc(level, initCoords, radius)
|
||||
|
||||
for _, cell := range ps.CellList {
|
||||
//fmt.Printf("\n coords: %v, distance: %f, shade: %d", cell.Coords, cell.distance, cell.shade)
|
||||
if cell.shade > 0 {
|
||||
//fmt.Printf("\n coords: %v, distance: %f, lit: %d", cell.Coords, cell.distance, cell.lit)
|
||||
if cell.lit > 0 {
|
||||
cs, err := ps.toLevelCoords(level, initCoords, cell.Coords)
|
||||
if err != nil {
|
||||
continue
|
||||
|
@ -59,7 +59,7 @@ func TestPrecompShade(t *testing.T) {
|
||||
level.Tiles[10][11] = gamemap.NewWall()
|
||||
level.Tiles[11][10] = gamemap.NewWall()
|
||||
|
||||
ppFov.ComputeFov(level, playerCoords, 15)
|
||||
ppFov.ComputeFov(level, playerCoords, 12)
|
||||
|
||||
fmt.Printf("\n\n")
|
||||
|
||||
|
Reference in New Issue
Block a user