Nothing is awake and watching when the party arrives
Room 0 is left empty so that arriving is not an ambush, but that only ever covered room 0. An enemy in a neighbouring room within aggro range and in sight of the entrance woke the moment you arrived -- in one run in eight before the tunnels were widened, and in three runs in eight after, because wider tunnels mean more open ground and more lines of sight. Measured over 200 runs: 25 before, 75 after. A screenshot of an arrival with enemies visibly in range is what prompted counting. Room enemies that would be awake on arrival -- within their aggro range of the entrance with nothing in the way, the same two questions aggro asks -- are now skipped. That is about one enemy in sixteen. Clearing everything within aggro range regardless of sight would have removed nearly a third, which is a different dungeon rather than a fixed one. The skipped enemy's dice have already been rolled, so every other enemy stands exactly where that seed always put it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
19d2295bec
commit
99f0d2a783
2 files changed
+44
No files matched your search
@@ -135,6 +135,8 @@ func _populate() -> void:
|
||||
var at := world.map.tile_centre(tx, ty)
|
||||
if world.map.circle_blocked(at, def.radius):
|
||||
continue
|
||||
if _would_see_the_entrance(def, at):
|
||||
continue
|
||||
world.spawn_enemy(def, at, rng.randi_range(0, 120))
|
||||
# After every room, so adding tunnel groups leaves each room's population
|
||||
# exactly what that seed always produced.
|
||||
@@ -189,6 +191,25 @@ func _populate_tunnels(rng: RandomNumberGenerator, flavour: DungeonDef) -> void:
|
||||
world.spawn_enemy(member, spots[i], rng.randi_range(0, 120))
|
||||
|
||||
|
||||
## Whether an enemy placed at [param at] would be awake the moment the party
|
||||
## arrives: within its aggro range of the entrance, with nothing in the way --
|
||||
## the same two questions SimWorld._aggro_target asks.
|
||||
##
|
||||
## Room 0 is left empty for exactly this reason, but that only ever covered room
|
||||
## 0. A neighbouring room in sight of the entrance woke on arrival in one run in
|
||||
## eight, and once tunnels were widened -- more open ground, more lines of sight
|
||||
## -- in three runs in eight. Skipping these removes about one enemy in sixteen;
|
||||
## clearing everything within aggro range instead would have removed nearly a
|
||||
## third, which is a different dungeon rather than a fixed one.
|
||||
##
|
||||
## The rng draws for the skipped enemy have already been made, so every other
|
||||
## enemy in the dungeon is exactly where that seed always put it.
|
||||
func _would_see_the_entrance(def: EnemyDef, at: Vector2) -> bool:
|
||||
if at.distance_to(world.spawn_point) > def.aggro_range:
|
||||
return false
|
||||
return world.map.has_line_of_sight(at, world.spawn_point)
|
||||
|
||||
|
||||
## Floor tiles of [param leg] that are tunnel rather than room: clear of every
|
||||
## room by a tile, so a group is never standing in a doorway, and outside the
|
||||
## boss arena.
|
||||
|
||||
Reference in new issue
Block a user