30 lines
1.1 KiB
JavaScript
30 lines
1.1 KiB
JavaScript
import { getClickablePieces } from './overlap-graph.js'
|
|
|
|
function clamp(value, min, max) {
|
|
return Math.min(max, Math.max(min, value))
|
|
}
|
|
|
|
export function evaluateBoard(boardState, levelPreset) {
|
|
const pieces = (boardState.pieces ?? []).filter((piece) => !piece.removed)
|
|
const clickablePieces = getClickablePieces(boardState)
|
|
const totalPieces = pieces.length
|
|
const initialClickableRatio = totalPieces === 0 ? 0 : clickablePieces.length / totalPieces
|
|
const targetPassRate = levelPreset?.targetPassRate ?? 0.75
|
|
const visibilityBonus = (initialClickableRatio - 0.3) * 0.35
|
|
const densityPenalty = levelPreset?.density === 'high' ? 0.05 : levelPreset?.density === 'medium_high' ? 0.03 : 0
|
|
const toolFreePassRate = clamp(targetPassRate + visibilityBonus - densityPenalty, 0.45, 0.99)
|
|
const toolAssistPassRate = clamp(toolFreePassRate + 0.12, toolFreePassRate, 1)
|
|
const avgTurnsToFinish = totalPieces / 1.2
|
|
|
|
return {
|
|
totalPieces,
|
|
initialClickableRatio,
|
|
simulatedPassRate: toolFreePassRate,
|
|
avgTurnsToFinish,
|
|
toolFreePassRate,
|
|
toolAssistPassRate,
|
|
}
|
|
}
|
|
|
|
export default evaluateBoard
|