diff --git a/game/traps.py b/game/traps.py index badbf06..55fdcba 100644 --- a/game/traps.py +++ b/game/traps.py @@ -67,11 +67,13 @@ class _Directional: range: cap the distance in that direction (tiles); omit = anywhere. aligned: also require overlap on the perpendicular axis, i.e. *directly* left/right (same rows) or *directly* above/below (same columns). + inclusive: specify if the trap tile itself counts in the given direction. """ - def __init__(self, direction, rng, aligned): + def __init__(self, direction, rng, aligned, inclusive): self.dir = direction self.rng = None if rng is None else float(rng) self.aligned = bool(aligned) + self.inclusive = bool(inclusive) def evaluate(self, trap, game, dt): r = trap.sensor_rect() @@ -81,24 +83,28 @@ class _Directional: if self.aligned and not (p.bottom > r.top and p.top < r.bottom): return False if d == "left": - if p.centerx >= r.left: + ref = r.right if self.inclusive else r.right + if p.centerx >= ref: return False - dist = r.left - p.centerx + dist = ref - p.centerx else: - if p.centerx <= r.right: + ref = r.left if self.inclusive else r.right + if p.centerx <= ref: return False - dist = p.centerx - r.right + dist = p.centerx - ref else: # above / below if self.aligned and not (p.right > r.left and p.left < r.right): return False if d == "above": - if p.centery >= r.top: + ref = r.bottom if self.inclusive else r.top + if p.centery >= ref: return False dist = r.top - p.centery else: - if p.centery <= r.bottom: + ref = r.top if self.inclusive else r.bottom + if p.centery <= ref: return False - dist = p.centery - r.bottom + dist = p.centery - ref return self.rng is None or dist <= self.rng * trap.tile def reset(self): @@ -160,7 +166,7 @@ def make_condition(spec): if "within" in spec: return _Within(spec["within"]) if "dir" in spec: - return _Directional(spec["dir"], spec.get("range"), spec.get("aligned", False)) + return _Directional(spec["dir"], spec.get("range"), spec.get("aligned", False), spec.get("inclusive", False)) raise ValueError(f"unrecognized trigger condition: {spec!r}")