func distBetweenEnts(e1, e2 *game.Entity) int { x1, y1 := e1.Pos() dx1, dy1 := e1.Dims() x2, y2 := e2.Pos() dx2, dy2 := e2.Dims() var xdist int switch { case x1 >= x2+dx2: xdist = x1 - (x2 + dx2) case x2 >= x1+dx1: xdist = x2 - (x1 + dx1) default: xdist = 0 } var ydist int switch { case y1 >= y2+dy2: ydist = y1 - (y2 + dy2) case y2 >= y1+dy1: ydist = y2 - (y1 + dy1) default: ydist = 0 } if xdist > ydist { return xdist } return ydist }
func (a *Interact) findDoors(ent *game.Entity, g *game.Game) []*house.Door { room_num := ent.CurrentRoom() room := g.House.Floors[0].Rooms[room_num] x, y := ent.Pos() dx, dy := ent.Dims() ent_rect := makeIntFrect(x, y, x+dx, y+dy) var valid []*house.Door for _, door := range room.Doors { if door.AlwaysOpen() { continue } if ent_rect.Overlaps(makeRectForDoor(room, door)) { valid = append(valid, door) } } return valid }
func (a *Interact) AiInteractWithObject(ent, object *game.Entity) game.ActionExec { if ent.Stats.ApCur() < a.Ap { return nil } if distBetweenEnts(ent, object) > a.Range { return nil } x, y := object.Pos() dx, dy := object.Dims() if !ent.HasLos(x, y, dx, dy) { return nil } var exec interactExec exec.SetBasicData(ent, a) exec.Target = object.Id return &exec }
func (a *BasicAttack) validTarget(source, target *game.Entity) bool { if source.Stats == nil || target.Stats == nil { return false } if distBetweenEnts(source, target) > a.Range { return false } x2, y2 := target.Pos() dx, dy := target.Dims() if !source.HasLos(x2, y2, dx, dy) { return false } if target.Stats.HpCur() <= 0 { return false } if source.Side() == target.Side() && !a.Target_allies { return false } if source.Side() != target.Side() && !a.Target_enemies { return false } return true }