218 lines
5.6 KiB
JavaScript
218 lines
5.6 KiB
JavaScript
/**
|
|
* MOTOR ACCESSIBILITY SYSTEM
|
|
* Provides assistance for players with motor disabilities
|
|
* Note: One-handed mode is already implemented in InputRemappingSystem
|
|
*/
|
|
class MotorAccessibilitySystem {
|
|
constructor(scene) {
|
|
this.scene = scene;
|
|
this.enabled = true;
|
|
|
|
// Settings
|
|
this.settings = {
|
|
autoAim: false, // Auto-aim assist
|
|
autoAimStrength: 0.5, // 0-1 (strength)
|
|
stickyKeys: false, // Hold key instead of press
|
|
reducedInputComplexity: false, // Simplified controls
|
|
slowMotion: false, // Slow-motion mode
|
|
slowMotionSpeed: 0.5, // 0.1-1.0 (game speed)
|
|
autoRun: false, // Auto-run when moving
|
|
autoInteract: false, // Auto-interact with nearby objects
|
|
largerClickTargets: false, // Bigger UI buttons
|
|
holdToConfirm: false // Hold instead of click
|
|
};
|
|
|
|
this.loadSettings();
|
|
this.init();
|
|
|
|
console.log('✅ Motor Accessibility System initialized');
|
|
}
|
|
|
|
init() {
|
|
if (this.settings.slowMotion) {
|
|
this.enableSlowMotion();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Enable auto-aim assist
|
|
*/
|
|
enableAutoAim() {
|
|
this.settings.autoAim = true;
|
|
this.saveSettings();
|
|
console.log('🎯 Auto-aim enabled');
|
|
}
|
|
|
|
/**
|
|
* Disable auto-aim
|
|
*/
|
|
disableAutoAim() {
|
|
this.settings.autoAim = false;
|
|
this.saveSettings();
|
|
console.log('🎯 Auto-aim disabled');
|
|
}
|
|
|
|
/**
|
|
* Set auto-aim strength
|
|
*/
|
|
setAutoAimStrength(strength) {
|
|
this.settings.autoAimStrength = Phaser.Math.Clamp(strength, 0, 1);
|
|
this.saveSettings();
|
|
console.log(`🎯 Auto-aim strength: ${this.settings.autoAimStrength}`);
|
|
}
|
|
|
|
/**
|
|
* Get nearest enemy for auto-aim
|
|
*/
|
|
getNearestEnemy() {
|
|
if (!this.scene.player) return null;
|
|
|
|
const playerPos = this.scene.player.getPosition();
|
|
let nearest = null;
|
|
let minDist = 999999;
|
|
|
|
// Find nearest NPC
|
|
for (const npc of this.scene.npcs) {
|
|
if (!npc.sprite || npc.isFriendly) continue;
|
|
|
|
const dist = Phaser.Math.Distance.Between(
|
|
playerPos.x, playerPos.y,
|
|
npc.gridX, npc.gridY
|
|
);
|
|
|
|
if (dist < minDist) {
|
|
minDist = dist;
|
|
nearest = npc;
|
|
}
|
|
}
|
|
|
|
return nearest;
|
|
}
|
|
|
|
/**
|
|
* Apply auto-aim to attack
|
|
*/
|
|
applyAutoAim() {
|
|
if (!this.settings.autoAim) return null;
|
|
|
|
const target = this.getNearestEnemy();
|
|
if (!target) return null;
|
|
|
|
// Return target position with strength factor
|
|
return {
|
|
x: target.gridX,
|
|
y: target.gridY,
|
|
strength: this.settings.autoAimStrength
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Enable sticky keys
|
|
*/
|
|
enableStickyKeys() {
|
|
this.settings.stickyKeys = true;
|
|
this.saveSettings();
|
|
console.log('⌨️ Sticky keys enabled');
|
|
}
|
|
|
|
/**
|
|
* Disable sticky keys
|
|
*/
|
|
disableStickyKeys() {
|
|
this.settings.stickyKeys = false;
|
|
this.saveSettings();
|
|
console.log('⌨️ Sticky keys disabled');
|
|
}
|
|
|
|
/**
|
|
* Enable slow-motion mode
|
|
*/
|
|
enableSlowMotion() {
|
|
this.settings.slowMotion = true;
|
|
this.scene.time.timeScale = this.settings.slowMotionSpeed;
|
|
this.saveSettings();
|
|
console.log(`🐌 Slow-motion enabled (${this.settings.slowMotionSpeed}x)`);
|
|
}
|
|
|
|
/**
|
|
* Disable slow-motion mode
|
|
*/
|
|
disableSlowMotion() {
|
|
this.settings.slowMotion = false;
|
|
this.scene.time.timeScale = 1.0;
|
|
this.saveSettings();
|
|
console.log('🐌 Slow-motion disabled');
|
|
}
|
|
|
|
/**
|
|
* Set slow-motion speed
|
|
*/
|
|
setSlowMotionSpeed(speed) {
|
|
this.settings.slowMotionSpeed = Phaser.Math.Clamp(speed, 0.1, 1.0);
|
|
if (this.settings.slowMotion) {
|
|
this.scene.time.timeScale = this.settings.slowMotionSpeed;
|
|
}
|
|
this.saveSettings();
|
|
console.log(`🐌 Slow-motion speed: ${this.settings.slowMotionSpeed}x`);
|
|
}
|
|
|
|
/**
|
|
* Toggle auto-run
|
|
*/
|
|
toggleAutoRun() {
|
|
this.settings.autoRun = !this.settings.autoRun;
|
|
this.saveSettings();
|
|
console.log(`🏃 Auto-run: ${this.settings.autoRun ? 'ON' : 'OFF'}`);
|
|
}
|
|
|
|
/**
|
|
* Toggle auto-interact
|
|
*/
|
|
toggleAutoInteract() {
|
|
this.settings.autoInteract = !this.settings.autoInteract;
|
|
this.saveSettings();
|
|
console.log(`🤝 Auto-interact: ${this.settings.autoInteract ? 'ON' : 'OFF'}`);
|
|
}
|
|
|
|
/**
|
|
* Update (called every frame)
|
|
*/
|
|
update() {
|
|
// Auto-interact logic
|
|
if (this.settings.autoInteract) {
|
|
this.checkAutoInteract();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check for auto-interact opportunities
|
|
*/
|
|
checkAutoInteract() {
|
|
// Implementation would check for nearby interactive objects
|
|
}
|
|
|
|
/**
|
|
* Save settings
|
|
*/
|
|
saveSettings() {
|
|
localStorage.setItem('novafarma_motor_accessibility', JSON.stringify(this.settings));
|
|
}
|
|
|
|
/**
|
|
* Load settings
|
|
*/
|
|
loadSettings() {
|
|
const saved = localStorage.getItem('novafarma_motor_accessibility');
|
|
if (saved) {
|
|
this.settings = { ...this.settings, ...JSON.parse(saved) };
|
|
}
|
|
}
|
|
|
|
destroy() {
|
|
if (this.settings.slowMotion) {
|
|
this.scene.time.timeScale = 1.0;
|
|
}
|
|
console.log('🦾 Motor Accessibility System destroyed');
|
|
}
|
|
}
|