/* HelperMove validates an entity's attempt to move and sets the entity's movement component appropriately. Returns true if the entity could move */ func HelperMove(db *engine.EntityDB, eid engine.Entity, dx, dy, dz int64) bool { if !db.Has(eid, "movement", "position") { return false } pos := db.Get(eid, "position").(*Position) emap := db.Get(pos.R, "map").(*EntityMap) mov := db.Get(eid, "movement").(*Movement) // TODO: fix layer system and make it real. // Check the entities in the layer beneath the move target // to see if the entity is a wall (with art symbol '#') target := emap.Get(pos.X+dx, pos.Y+dy, pos.Z+dz-1) if db.Has(target, "art") && db.Get(target, "art").(*Art).Symbol == '#' { mov.Dx = 0 mov.Dy = 0 mov.Dz = 0 return false } // Move can be done! mov.Dx = dx mov.Dy = dy mov.Dz = dz return true }
/* RenderMapAt draws a portion of the map centered at the given entity */ func RenderMapAt(db *engine.EntityDB, eid engine.Entity) { width, height := termbox.Size() pos := db.Get(eid, "position").(*base.Position) emap := db.Get(pos.R, "map").(*base.EntityMap) for y := 0; y < height; y++ { py := pos.Y + int64(y-height/2) for x := 0; x < width; x++ { px := pos.X + int64(x-width/2) // Search for the highest entity on the map in the same general layer // as the passed entity that can be drawn. This will need to be more // formal in the future (not hardcoded knowing the player is on z level // 1, tiles are on z level 0, and the bat at z level 2) topArt := &base.Art{} for i := int64(1); i >= -1; i-- { entity := emap.Get(px, py, pos.Z+i) if db.Has(entity, "art") { topArt = db.Get(entity, "art").(*base.Art) break } } // And draw the found art, which will be an empty black square // if nothing was found Draw(x, height-1-y, topArt.Symbol, topArt.Fg, topArt.Bg) } } termbox.Flush() }
/* HelperPlace puts an entity on to the map at a particular position */ func HelperPlace(db *engine.EntityDB, eid engine.Entity, r engine.Entity, x, y, z int64) { if !db.Has(r, "map") { return } db.Get(r, "map").(*EntityMap).Set(x, y, z, eid) pos := db.Create(eid, "position").(*Position) pos.R, pos.X, pos.Y, pos.Z = r, x, y, z }