Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | import type { Position } from "../../types/common";
import { VitalPoint, VitalPointEffect, VitalPointHitResult } from "./types";
// Fix: Import both EffectIntensity type and enum from the correct location
import { VitalPointEffectType, VitalPointSeverity } from "../../types/common";
import { EffectIntensity, EffectType } from "../effects";
import { StatusEffect } from "../types";
export class HitDetection {
/**
* Convert VitalPointEffect to StatusEffect with required properties
*/
private static convertVitalPointEffectToStatusEffect(
vitalPointEffect: VitalPointEffect,
vitalPointId: string
): StatusEffect {
const currentTime = Date.now();
// Fix: Use EffectType from effects.ts (string literals)
const typeMapping: Record<VitalPointEffectType, EffectType> = {
[VitalPointEffectType.UNCONSCIOUSNESS]: "stun",
[VitalPointEffectType.BREATHLESSNESS]: "stamina_drain",
[VitalPointEffectType.PAIN]: "weakened",
[VitalPointEffectType.PARALYSIS]: "paralysis",
[VitalPointEffectType.STUN]: "stun",
[VitalPointEffectType.WEAKNESS]: "weakened",
[VitalPointEffectType.DISORIENTATION]: "confusion",
[VitalPointEffectType.BLOOD_FLOW_RESTRICTION]: "bleed",
[VitalPointEffectType.NERVE_DISRUPTION]: "paralysis",
[VitalPointEffectType.ORGAN_DISRUPTION]: "vulnerability",
};
// Fix: Use the correct EffectIntensity enum values from enums.ts
const intensityMapping: Record<EffectIntensity, EffectIntensity> = {
[EffectIntensity.WEAK]: EffectIntensity.WEAK,
[EffectIntensity.MINOR]: EffectIntensity.MINOR,
[EffectIntensity.LOW]: EffectIntensity.LOW,
[EffectIntensity.MEDIUM]: EffectIntensity.MEDIUM,
[EffectIntensity.MODERATE]: EffectIntensity.MODERATE,
[EffectIntensity.HIGH]: EffectIntensity.HIGH,
[EffectIntensity.SEVERE]: EffectIntensity.SEVERE,
[EffectIntensity.CRITICAL]: EffectIntensity.CRITICAL,
[EffectIntensity.EXTREME]: EffectIntensity.EXTREME,
};
return {
id: `${vitalPointEffect.id}_${currentTime}`,
type: typeMapping[vitalPointEffect.type] || "weakened",
intensity:
intensityMapping[vitalPointEffect.intensity] || EffectIntensity.MEDIUM,
duration: vitalPointEffect.duration,
description: vitalPointEffect.description,
stackable: vitalPointEffect.stackable,
source: vitalPointId,
startTime: currentTime,
endTime: currentTime + vitalPointEffect.duration,
};
}
processVitalPointHit(
vitalPoint: VitalPoint,
hitPosition: Position,
force: number
): VitalPointHitResult {
// Calculate hit accuracy
const distance = Math.sqrt(
Math.pow(hitPosition.x - vitalPoint.position.x, 2) +
Math.pow(hitPosition.y - vitalPoint.position.y, 2)
);
// Fix: Provide default values for potentially undefined properties
const radius = vitalPoint.radius ?? 10; // Default radius
const requiredForce = vitalPoint.requiredForce ?? 50; // Default force requirement
const isHit = distance <= radius;
if (!isHit) {
return {
hit: false,
damage: 0,
effects: [],
severity: VitalPointSeverity.MINOR,
};
}
// Calculate damage
const baseDamage = vitalPoint.baseDamage || 15;
const forceMultiplier = Math.min(force / requiredForce, 2.0);
const damage = Math.floor(baseDamage * forceMultiplier);
// Convert VitalPointEffect array to StatusEffect array
const effects = vitalPoint.effects.map((effect) =>
HitDetection.convertVitalPointEffectToStatusEffect(effect, vitalPoint.id)
);
return {
hit: true,
vitalPoint,
damage,
effects,
severity: vitalPoint.severity,
};
}
}
export default HitDetection;
|