' Yet Another RPG Dungeon is a text based game.
' It's aimed to be a comprehensive example and or a tutorial of MY-BASIC.
' Copyright (C) 2016 Wang Renxin. All rights reserved.
' For more information about MY-BASIC, see https://github.com/paladin-t/my_basic/

import "utils.bas"

class dirs
	var none_dir = 0
	var left_dir = 1
	var right_dir = 2
	var up_dir = 4
	var down_dir = 8
endclass

class map_node
	var pos = new(point)
	var valid_dirs = dirs.none_dir
	var entities = list()

	def tostring()
		s = pos.tostring()
		return "Map Node " + s
	enddef

	def set_valid_dirs(...)
		dir = 0
		while len(...)
			dir = bit_or(dir, ...)
		wend
		valid_dirs = dir
	enddef

	def add_entity(ent)
		if exist(entities, ent) then
			log.w("Already added " + ent.name)

			return false
		endif

		push(entities, ent)

		return true
	enddef

	def get_entities(y)
		ret = list()
		it = iterator(entities)
		while move_next(it)
			ent = get(it)
			if ent is y and ent.alive then
				push(ret, ent);
			endif
		wend

		return ret
	enddef
endclass

class map
	var width = 0
	var height = 0

	var nodes = dict()

	def tostring()
		return "Map"
	enddef

	def hash_pos(x, y)
		return x + y * width
	enddef

	def set_size(w, h)
		width = w
		height = h

		clear(nodes)
	enddef

	def set_node(x, y, n)
		h = hash_pos(x, y)
		n.pos.x = x
		n.pos.y = y
		nodes(h) = n

		return n
	enddef

	def get_node(x, y)
		h = hash_pos(x, y)

		return nodes(h)
	enddef
endclass
