diff --git a/src/entity.js b/src/entity.js index f8d6baa..b446cba 100644 --- a/src/entity.js +++ b/src/entity.js @@ -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 diff --git a/src/game.js b/src/game.js index 8c2c25a..0de1d6a 100644 --- a/src/game.js +++ b/src/game.js @@ -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) { diff --git a/src/template.js b/src/template.js index ac810fc..5c6e9ca 100644 --- a/src/template.js +++ b/src/template.js @@ -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()