adjust vision through/into terrain

This commit is contained in:
2025-01-25 07:12:50 +01:00
parent e799be0b59
commit 11ec464d27
3 changed files with 11 additions and 9 deletions
+5 -7
View File
@@ -500,9 +500,10 @@ export default class Entity {
const bboxCheckedObstacles = terrains.filter((it) => SATX.bboxCheck(bbox, it.bbox))
if (bboxCheckedObstacles.length < 1) { return true }
const posCollider = Entity.collider(this.position.x, this.position.y, 0)
const posBbox = Entity.bbox(this.position.x, this.position.y, 0)
const unpassableTerrain = bboxCheckedObstacles.filter((it) => !(SATX.bboxCheck(posBbox, it.bbox) && it.colliders().some((c) => SATX.collideObject(posCollider, c))))
const inWallVisionBypassRadius = Math.max(0, this.radius - 1)
const posCollider = Entity.collider(this.position.x, this.position.y, inWallVisionBypassRadius)
const posBbox = Entity.bbox(this.position.x, this.position.y, inWallVisionBypassRadius)
const unpassableTerrain = bboxCheckedObstacles.filter((it) => !SATX.bboxCheck(posBbox, it.bbox) || !it.colliders().some((c) => SATX.collideObject(posCollider, c)))
const colliders = unpassableTerrain.map((it) => it.colliders()).flat()
const collider = Entity.tunnelCollider(this.position.x, this.position.y, destination.x, destination.y, 0)
@@ -661,11 +662,8 @@ export default class Entity {
#castingVision() {
const enemyTeam = this.team == Team.blue ? Team.red : (this.team == Team.red ? Team.blue : null)
if (enemyTeam == null) {
return // only blue/red teams have casting vision
}
const enemiesNearby = (this.game?.entities ?? []).some((it) => !it.dead && it.team == enemyTeam && it.distanceTo(this.position) <= (it.visionRange + this.radius))
const enemiesNearby = (this.game?.entities ?? []).some((it) => !it.dead && (enemyTeam == null || it.team == enemyTeam) && it.distanceTo(this.position) <= (it.visionRange + this.radius))
if (enemiesNearby) {
const radius = 300
const duration = this.game?.secToTick(2) ?? 0
+3 -1
View File
@@ -122,8 +122,10 @@ export default class Game {
}
subscription(websocket, id) {
return function builtSubscription() {
return function builtSubscription(query = null) {
const game = this
if (query == 'id') { return id }
if (query != null) { return }
const entity = game.entities.find((it) => it.id == id)
if (entity == null) {
+3 -1
View File
@@ -59,6 +59,8 @@ export default class Template {
return function builtBasiliskLogic() {
const entity = this
if (Array.from(entity.game?.subscriptions.values()).some((it) => it('id') == entity.id)) { return }
const attackDelaySec = 2
const despawnDelaySec = 5
@@ -82,7 +84,7 @@ export default class Template {
const attackDelay = entity.game?.secToTick(attackDelaySec) ?? 1
if (targetInRangeSince + attackDelay < timestamp) {
entity.attackAction(target.position)
entity.castAction('a', target.id)
}
const directionToTarget = target.position.clone().sub(entity.position).normalize()