adoubement
This commit is contained in:
parent
9c961c2b5e
commit
4b78dcac0f
1 changed files with 23 additions and 9 deletions
32
server.js
32
server.js
|
|
@ -218,7 +218,8 @@ function computeLegalMoves(room, square){
|
||||||
const x = fromCoord.x, y = fromCoord.y;
|
const x = fromCoord.x, y = fromCoord.y;
|
||||||
const type = (piece.type || '').toUpperCase();
|
const type = (piece.type || '').toUpperCase();
|
||||||
// detect if this specific piece has a permanent adoubement effect (grants knight moves)
|
// detect if this specific piece has a permanent adoubement effect (grants knight moves)
|
||||||
const hasAdoubement = (room.activeCardEffects || []).some(e => e.type === 'adoubement' && e.pieceSquare === square);
|
// effects may be bound either to the piece's current square or to the piece id (preferred)
|
||||||
|
const hasAdoubement = (room.activeCardEffects || []).some(e => e.type === 'adoubement' && ((e.pieceId && e.pieceId === piece.id) || e.pieceSquare === square));
|
||||||
|
|
||||||
// helper to add knight (N) deltas when a piece has been adoubé
|
// helper to add knight (N) deltas when a piece has been adoubé
|
||||||
function addAdoubementMoves(){
|
function addAdoubementMoves(){
|
||||||
|
|
@ -278,8 +279,8 @@ function computeLegalMoves(room, square){
|
||||||
if(type === 'B' || type === 'Q') directions.push([1,1],[1,-1],[-1,1],[-1,-1]);
|
if(type === 'B' || type === 'Q') directions.push([1,1],[1,-1],[-1,1],[-1,-1]);
|
||||||
if(type === 'R' || type === 'Q') directions.push([1,0],[-1,0],[0,1],[0,-1]);
|
if(type === 'R' || type === 'Q') directions.push([1,0],[-1,0],[0,1],[0,-1]);
|
||||||
|
|
||||||
// detect if this specific piece has an active rebondir effect
|
// detect if this specific piece has an active rebondir effect (match by id or square)
|
||||||
const hasRebond = (room.activeCardEffects || []).some(e => e.type === 'rebondir' && e.pieceSquare === square);
|
const hasRebond = (room.activeCardEffects || []).some(e => e.type === 'rebondir' && ((e.pieceId && e.pieceId === piece.id) || e.pieceSquare === square));
|
||||||
|
|
||||||
directions.forEach(([dx0,dy0])=>{
|
directions.forEach(([dx0,dy0])=>{
|
||||||
if(!hasRebond){
|
if(!hasRebond){
|
||||||
|
|
@ -490,10 +491,23 @@ io.on('connection', (socket) => {
|
||||||
// move the piece
|
// move the piece
|
||||||
moving.square = to;
|
moving.square = to;
|
||||||
|
|
||||||
// consume any active card effects bound to this piece (they apply to the piece once and are then removed)
|
// consume any active card effects bound to this piece (rebondir is one-time and should be removed)
|
||||||
|
// also update any persistent effects (like adoubement) to track the piece's new square so they remain active
|
||||||
try{
|
try{
|
||||||
room.activeCardEffects = room.activeCardEffects || [];
|
room.activeCardEffects = room.activeCardEffects || [];
|
||||||
room.activeCardEffects = room.activeCardEffects.filter(e => !(e.type === 'rebondir' && e.pieceSquare === from));
|
// iterate backwards so we can splice safely
|
||||||
|
for(let i = room.activeCardEffects.length - 1; i >= 0; i--){
|
||||||
|
const e = room.activeCardEffects[i];
|
||||||
|
// remove one-time rebondir if it refers to this piece (by pieceId or by its old square)
|
||||||
|
if(e.type === 'rebondir' && (e.pieceSquare === from || (e.pieceId && e.pieceId === moving.id))){
|
||||||
|
room.activeCardEffects.splice(i,1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// if the effect is bound to the piece id, update its recorded square so the effect persists after moves
|
||||||
|
if(e.pieceId && e.pieceId === moving.id){
|
||||||
|
e.pieceSquare = to;
|
||||||
|
}
|
||||||
|
}
|
||||||
}catch(e){ console.error('consuming card effects error', e); }
|
}catch(e){ console.error('consuming card effects error', e); }
|
||||||
|
|
||||||
// advance version and flip turn
|
// advance version and flip turn
|
||||||
|
|
@ -778,9 +792,9 @@ io.on('connection', (socket) => {
|
||||||
}catch(e){ console.error('restore removed card error', e); }
|
}catch(e){ console.error('restore removed card error', e); }
|
||||||
return cb && cb({ error: 'no valid target' });
|
return cb && cb({ error: 'no valid target' });
|
||||||
}
|
}
|
||||||
// apply permanent adoubement effect
|
// apply permanent adoubement effect (bind to piece id so it persists when the piece moves)
|
||||||
room.activeCardEffects = room.activeCardEffects || [];
|
room.activeCardEffects = room.activeCardEffects || [];
|
||||||
room.activeCardEffects.push({ id: played.id, type: 'adoubement', pieceSquare: target, playerId: senderId });
|
room.activeCardEffects.push({ id: played.id, type: 'adoubement', pieceId: targetPiece.id, pieceSquare: target, playerId: senderId });
|
||||||
played.payload = Object.assign({}, payload, { applied: 'adoubement', appliedTo: target });
|
played.payload = Object.assign({}, payload, { applied: 'adoubement', appliedTo: target });
|
||||||
}catch(e){ console.error('adoubement effect error', e); }
|
}catch(e){ console.error('adoubement effect error', e); }
|
||||||
}
|
}
|
||||||
|
|
@ -809,9 +823,9 @@ io.on('connection', (socket) => {
|
||||||
}catch(e){ console.error('restore removed card error', e); }
|
}catch(e){ console.error('restore removed card error', e); }
|
||||||
return cb && cb({ error: 'no valid target' });
|
return cb && cb({ error: 'no valid target' });
|
||||||
}
|
}
|
||||||
// apply the rebond effect
|
// apply the rebond effect (also record pieceId so it can be identified after moves)
|
||||||
room.activeCardEffects = room.activeCardEffects || [];
|
room.activeCardEffects = room.activeCardEffects || [];
|
||||||
room.activeCardEffects.push({ id: played.id, type: 'rebondir', pieceSquare: target, playerId: senderId });
|
room.activeCardEffects.push({ id: played.id, type: 'rebondir', pieceId: targetPiece.id, pieceSquare: target, playerId: senderId });
|
||||||
played.payload = Object.assign({}, payload, { applied: 'rebondir', appliedTo: target });
|
played.payload = Object.assign({}, payload, { applied: 'rebondir', appliedTo: target });
|
||||||
}catch(e){ console.error('rebondir effect error', e); }
|
}catch(e){ console.error('rebondir effect error', e); }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue