300 lines
8.3 KiB
JavaScript
300 lines
8.3 KiB
JavaScript
// Accessibility Settings Manager
|
|
class AccessibilitySettings {
|
|
constructor(scene) {
|
|
this.scene = scene;
|
|
|
|
// Settings
|
|
this.settings = {
|
|
// Visual
|
|
highContrastMode: 'off', // 'off', 'blackwhite', 'yellowblack'
|
|
colorBlindMode: 'off', // 'off', 'protanopia', 'deuteranopia', 'tritanopia', 'achromatopsia'
|
|
uiScale: 100, // 100%, 150%, 200%
|
|
boldOutlines: false,
|
|
|
|
// Photosensitivity
|
|
reduceFlashing: false,
|
|
disableLightning: false,
|
|
reduceParticles: false,
|
|
brightnessLimit: 100, // 0-100%
|
|
|
|
// Audio/Visual
|
|
visualHealthIndicator: true,
|
|
damageDirectionIndicator: true,
|
|
screenFlashNotifications: true,
|
|
|
|
// Motion
|
|
reduceMotion: false,
|
|
disableScreenShake: false,
|
|
|
|
// Loaded from localStorage
|
|
loaded: false
|
|
};
|
|
|
|
this.init();
|
|
}
|
|
|
|
init() {
|
|
// Load from localStorage
|
|
this.loadSettings();
|
|
|
|
// Apply initial settings
|
|
this.applyAllSettings();
|
|
|
|
console.log('♿ Accessibility Settings initialized');
|
|
}
|
|
|
|
loadSettings() {
|
|
const saved = localStorage.getItem('novafarma_accessibility');
|
|
if (saved) {
|
|
try {
|
|
const parsed = JSON.parse(saved);
|
|
Object.assign(this.settings, parsed);
|
|
this.loaded = true;
|
|
console.log('♿ Loaded accessibility settings');
|
|
} catch (e) {
|
|
console.warn('Failed to load accessibility settings:', e);
|
|
}
|
|
}
|
|
}
|
|
|
|
saveSettings() {
|
|
try {
|
|
localStorage.setItem('novafarma_accessibility', JSON.stringify(this.settings));
|
|
console.log('♿ Saved accessibility settings');
|
|
} catch (e) {
|
|
console.warn('Failed to save accessibility settings:', e);
|
|
}
|
|
}
|
|
|
|
applyAllSettings() {
|
|
this.applyHighContrast();
|
|
this.applyColorBlindMode();
|
|
this.applyUIScale();
|
|
this.applyBoldOutlines();
|
|
this.applyPhotosensitivity();
|
|
}
|
|
|
|
// === HIGH CONTRAST MODES ===
|
|
|
|
setHighContrastMode(mode) {
|
|
this.settings.highContrastMode = mode;
|
|
this.applyHighContrast();
|
|
this.saveSettings();
|
|
}
|
|
|
|
applyHighContrast() {
|
|
const mode = this.settings.highContrastMode;
|
|
|
|
// Remove existing filters
|
|
this.removeFilter('high-contrast');
|
|
|
|
if (mode === 'blackwhite') {
|
|
// Black & White mode
|
|
this.scene.cameras.main.setPostPipeline('grayscale');
|
|
document.body.style.filter = 'grayscale(100%) contrast(150%)';
|
|
console.log('♿ Black & White mode enabled');
|
|
} else if (mode === 'yellowblack') {
|
|
// Yellow on Black mode
|
|
document.body.style.filter = 'invert(100%) hue-rotate(180deg)';
|
|
document.body.style.backgroundColor = '#000000';
|
|
console.log('♿ Yellow on Black mode enabled');
|
|
} else {
|
|
// Off
|
|
document.body.style.filter = 'none';
|
|
document.body.style.backgroundColor = '';
|
|
}
|
|
}
|
|
|
|
// === COLOR BLIND MODES ===
|
|
|
|
setColorBlindMode(mode) {
|
|
this.settings.colorBlindMode = mode;
|
|
this.applyColorBlindMode();
|
|
this.saveSettings();
|
|
}
|
|
|
|
applyColorBlindMode() {
|
|
const mode = this.settings.colorBlindMode;
|
|
|
|
// Remove existing filters
|
|
this.removeFilter('color-blind');
|
|
|
|
if (mode === 'protanopia') {
|
|
// Red-blind (remove red channel)
|
|
document.body.style.filter = 'url(#protanopia)';
|
|
console.log('♿ Protanopia filter enabled');
|
|
} else if (mode === 'deuteranopia') {
|
|
// Green-blind (remove green channel)
|
|
document.body.style.filter = 'url(#deuteranopia)';
|
|
console.log('♿ Deuteranopia filter enabled');
|
|
} else if (mode === 'tritanopia') {
|
|
// Blue-blind (remove blue channel)
|
|
document.body.style.filter = 'url(#tritanopia)';
|
|
console.log('♿ Tritanopia filter enabled');
|
|
} else if (mode === 'achromatopsia') {
|
|
// Total color blindness (grayscale)
|
|
document.body.style.filter = 'grayscale(100%)';
|
|
console.log('♿ Achromatopsia filter enabled');
|
|
} else {
|
|
document.body.style.filter = 'none';
|
|
}
|
|
}
|
|
|
|
// === UI SCALE ===
|
|
|
|
setUIScale(scale) {
|
|
this.settings.uiScale = scale;
|
|
this.applyUIScale();
|
|
this.saveSettings();
|
|
}
|
|
|
|
applyUIScale() {
|
|
const scale = this.settings.uiScale / 100;
|
|
|
|
// Scale all UI elements
|
|
const uiScene = this.scene.scene.get('UIScene');
|
|
if (uiScene) {
|
|
// Scale containers
|
|
if (uiScene.uiContainer) {
|
|
uiScene.uiContainer.setScale(scale);
|
|
}
|
|
|
|
console.log(`♿ UI scaled to ${this.settings.uiScale}%`);
|
|
}
|
|
}
|
|
|
|
// === BOLD OUTLINES ===
|
|
|
|
setBoldOutlines(enabled) {
|
|
this.settings.boldOutlines = enabled;
|
|
this.applyBoldOutlines();
|
|
this.saveSettings();
|
|
}
|
|
|
|
applyBoldOutlines() {
|
|
if (this.settings.boldOutlines) {
|
|
// Add bold outlines to all text
|
|
document.body.style.textShadow = '0 0 2px #000, 0 0 2px #000, 0 0 2px #000';
|
|
console.log('♿ Bold outlines enabled');
|
|
} else {
|
|
document.body.style.textShadow = 'none';
|
|
}
|
|
}
|
|
|
|
// === PHOTOSENSITIVITY ===
|
|
|
|
setReduceFlashing(enabled) {
|
|
this.settings.reduceFlashing = enabled;
|
|
this.saveSettings();
|
|
}
|
|
|
|
setDisableLightning(enabled) {
|
|
this.settings.disableLightning = enabled;
|
|
this.saveSettings();
|
|
}
|
|
|
|
setReduceParticles(enabled) {
|
|
this.settings.reduceParticles = enabled;
|
|
this.applyPhotosensitivity();
|
|
this.saveSettings();
|
|
}
|
|
|
|
setBrightnessLimit(value) {
|
|
this.settings.brightnessLimit = value;
|
|
this.applyPhotosensitivity();
|
|
this.saveSettings();
|
|
}
|
|
|
|
applyPhotosensitivity() {
|
|
// Brightness limit
|
|
const brightness = this.settings.brightnessLimit / 100;
|
|
this.scene.cameras.main.setAlpha(brightness);
|
|
|
|
// Particle reduction will be checked by particle systems
|
|
console.log(`♿ Brightness limited to ${this.settings.brightnessLimit}%`);
|
|
}
|
|
|
|
// === VISUAL INDICATORS ===
|
|
|
|
setVisualHealthIndicator(enabled) {
|
|
this.settings.visualHealthIndicator = enabled;
|
|
this.saveSettings();
|
|
}
|
|
|
|
setDamageDirectionIndicator(enabled) {
|
|
this.settings.damageDirectionIndicator = enabled;
|
|
this.saveSettings();
|
|
}
|
|
|
|
showDamageDirection(x, y) {
|
|
if (!this.settings.damageDirectionIndicator) return;
|
|
|
|
// Show directional arrow
|
|
const player = this.scene.player;
|
|
if (!player) return;
|
|
|
|
const angle = Phaser.Math.Angle.Between(player.sprite.x, player.sprite.y, x, y);
|
|
const arrowX = player.sprite.x + Math.cos(angle) * 50;
|
|
const arrowY = player.sprite.y + Math.sin(angle) * 50;
|
|
|
|
const arrow = this.scene.add.text(arrowX, arrowY, '⬆️', {
|
|
fontSize: '32px'
|
|
});
|
|
arrow.setRotation(angle + Math.PI / 2);
|
|
arrow.setAlpha(0.8);
|
|
|
|
this.scene.tweens.add({
|
|
targets: arrow,
|
|
alpha: 0,
|
|
duration: 1000,
|
|
onComplete: () => arrow.destroy()
|
|
});
|
|
}
|
|
|
|
// === MOTION ===
|
|
|
|
setReduceMotion(enabled) {
|
|
this.settings.reduceMotion = enabled;
|
|
this.saveSettings();
|
|
}
|
|
|
|
setDisableScreenShake(enabled) {
|
|
this.settings.disableScreenShake = enabled;
|
|
this.saveSettings();
|
|
}
|
|
|
|
// === UTILS ===
|
|
|
|
removeFilter(type) {
|
|
// Remove specific filter type
|
|
// (placeholder for now)
|
|
}
|
|
|
|
// === GETTERS ===
|
|
|
|
shouldReduceParticles() {
|
|
return this.settings.reduceParticles;
|
|
}
|
|
|
|
shouldDisableLightning() {
|
|
return this.settings.disableLightning;
|
|
}
|
|
|
|
shouldReduceFlashing() {
|
|
return this.settings.reduceFlashing;
|
|
}
|
|
|
|
shouldDisableScreenShake() {
|
|
return this.settings.disableScreenShake;
|
|
}
|
|
|
|
shouldShowVisualHealth() {
|
|
return this.settings.visualHealthIndicator;
|
|
}
|
|
}
|
|
|
|
// Export
|
|
if (typeof module !== 'undefined') {
|
|
module.exports = AccessibilitySettings;
|
|
}
|