ygdra/hud/map_viewer.gd

102 lines
3.4 KiB
GDScript

extends Control
# Member variables
export var show_unvisited: bool = false
export var ground_visited: Color = Color(0x359235ff)
export var ground_unvisited: Color = Color(0x359235ce)
export var ground_unseen: Color = Color(0x80ced3ce)
export var wall_visited: Color = Color(0x000000ff)
export var wall_unvisited: Color = Color(0x000000ce)
export var player_color: Color = Color(0x2b40efff)
export var chest_color: Color = Color(0xef2b3dff)
export var entrance_color: Color = Color(0xe9ed57ff)
export var exit_color: Color = Color(0xde57edff)
var level: Maze = null
var player: MazePlayer = null
const cell_size = 15
const cell_dim = Vector2(cell_size, cell_size)
func init(lvl: Maze, pl: MazePlayer):
level = lvl
player = pl
update()
# Drawing function
func _draw():
for j in range(level.height):
for i in range(level.width):
drawGround(level.at(i, j), i, j)
drawFeature(level.at(i, j), i, j)
for j in range(level.height):
for i in range(level.width):
drawWalls(level.at(i, j), i, j)
drawPlayer()
func drawGround(c: Cell, i, j):
var color
if c.visited:
color = ground_visited
elif show_unvisited:
color = ground_unvisited
else:
color = ground_unseen
draw_rect(
Rect2(
cell_size * Vector2(i, j),
cell_dim),
color)
func drawFeature(c: Cell, i, j):
if c.visited or show_unvisited:
var orig = cell_size * Vector2(i, j)
match c.feature:
Cell.Feature.ENTRANCE:
draw_rect(Rect2(orig, cell_dim), entrance_color)
Cell.Feature.EXIT:
draw_rect(Rect2(orig, cell_dim), exit_color)
Cell.Feature.CHEST:
draw_circle(orig + cell_dim * 0.5, cell_size/2, chest_color)
_:
pass
func drawWalls(c: Cell, i, j):
drawWall(c, Direction.NORTH, i, j)
drawWall(c, Direction.WEST, i, j)
drawWall(c, Direction.SOUTH, i, j)
drawWall(c, Direction.EAST, i, j)
func drawWall(c: Cell, dir, i, j):
var color
if c.visited:
color = wall_visited
else:
color = wall_unvisited
if (c.visited or show_unvisited) && (c.get_edge(dir) == Cell.Edge.WALL):
var orig = cell_size * Vector2(i, j)
var from = orig + cell_size * Direction.edge_from(dir)
var to = orig + cell_size * Direction.edge_to(dir)
draw_line(from, to, color, 2)
func drawPlayer():
var orig = cell_size * player.position
var points = [Vector2(0, 0), Vector2(0, 0), Vector2(0, 0)]
match player.forward_dir:
Direction.NORTH:
points[0] = orig + Vector2(cell_size / 2, 2)
points[1] = orig + Vector2(cell_size - 2, cell_size - 2)
points[2] = orig + Vector2(2, cell_size - 2)
Direction.SOUTH:
points[0] = orig + Vector2(cell_size / 2, cell_size - 2)
points[1] = orig + Vector2(cell_size - 2, 2)
points[2] = orig + Vector2(2, 2)
Direction.EAST:
points[0] = orig + Vector2(cell_size - 2, cell_size / 2)
points[1] = orig + Vector2(2, 2)
points[2] = orig + Vector2(2, cell_size - 2)
Direction.WEST:
points[0] = orig + Vector2(2, cell_size / 2)
points[1] = orig + Vector2(cell_size - 2, 2)
points[2] = orig + Vector2(cell_size - 2, cell_size - 2)
draw_colored_polygon(PoolVector2Array(points), player_color)