feat(npc): Implement NPC-to-NPC collision detection in rooms

This commit is contained in:
Z. Cliffe Schreuders
2025-11-09 23:56:42 +00:00
parent e0034bafe0
commit 90e33de7f2
2 changed files with 43 additions and 1 deletions

View File

@@ -1912,6 +1912,9 @@ function createNPCSpritesForRoom(roomId, roomData) {
// Set up wall and chair collisions (same as player gets)
NPCSpriteManager.setupNPCEnvironmentCollisions(gameRef, sprite, roomId);
// Set up NPC-to-NPC collisions with all other NPCs in this room
NPCSpriteManager.setupNPCToNPCCollisions(gameRef, sprite, roomId, roomData.npcSprites);
// Register behavior if configured
// Only for sprite-based NPCs (not phone-only)
if (window.npcBehaviorManager && npc.behavior) {

View File

@@ -48,7 +48,6 @@ export function createNPCSprite(scene, npc, roomData) {
// Enable physics
scene.physics.add.existing(sprite);
sprite.body.immovable = true; // NPCs don't move on collision
// Set smaller collision box at the feet (matching player collision: 18x10 with similar offset)
sprite.body.setSize(18, 10); // Collision body size (wider for better hit detection)
sprite.body.setOffset(23, 50); // Offset for feet position (64px sprite, adjusted for wider box)
@@ -498,6 +497,45 @@ export function setupNPCEnvironmentCollisions(scene, npcSprite, roomId) {
setupNPCChairCollisions(scene, npcSprite, roomId);
}
/**
* Set up collisions between an NPC sprite and all other NPCs in the room
*
* Called after creating each NPC sprite to enable NPC-to-NPC collision detection.
*
* @param {Phaser.Scene} scene - Phaser scene instance
* @param {Phaser.Sprite} npcSprite - NPC sprite to collide with others
* @param {string} roomId - Room ID where NPC is located
* @param {Array} allNPCSprites - Array of all NPC sprites in the room
*/
export function setupNPCToNPCCollisions(scene, npcSprite, roomId, allNPCSprites) {
if (!npcSprite || !npcSprite.body) {
return;
}
if (!allNPCSprites || !Array.isArray(allNPCSprites)) {
return;
}
const game = scene || window.game;
if (!game) {
console.warn('❌ Cannot set up NPC-to-NPC collisions: no game reference');
return;
}
// Add collision with all other NPCs
let collisionsAdded = 0;
allNPCSprites.forEach(otherNPC => {
if (otherNPC && otherNPC !== npcSprite && otherNPC.body) {
game.physics.add.collider(npcSprite, otherNPC);
collisionsAdded++;
}
});
if (collisionsAdded > 0) {
console.log(`👥 NPC ${npcSprite.npcId}: ${collisionsAdded} NPC-to-NPC collision(s) set up`);
}
}
// Export for module namespace
export default {
createNPCSprite,
@@ -508,6 +546,7 @@ export default {
setupNPCWallCollisions,
setupNPCChairCollisions,
setupNPCEnvironmentCollisions,
setupNPCToNPCCollisions,
playNPCAnimation,
returnNPCToIdle,
destroyNPCSprite,