mirror of
https://github.com/GoodStartLabs/AI_Diplomacy.git
synced 2026-04-28 17:29:41 +00:00
Typefixes
Updating some typing errors, removing ports in docker-compose that weren't used but were stopping others from using them.
This commit is contained in:
parent
5411f0bae7
commit
2733e4acd1
4 changed files with 68 additions and 88 deletions
|
|
@ -1,9 +1,37 @@
|
||||||
import { gameState } from "./gameState";
|
import { gameState } from "./gameState";
|
||||||
import { logger } from "./logger";
|
import { logger } from "./logger";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function to get a DOM element by ID and throw an error if not found
|
||||||
|
* @param id The element ID to search for
|
||||||
|
* @returns The HTMLElement
|
||||||
|
* @throws Error if element is not found
|
||||||
|
*/
|
||||||
|
function getRequiredElement(id: string): HTMLElement {
|
||||||
|
const element = document.getElementById(id);
|
||||||
|
if (!element) {
|
||||||
|
throw new Error(`Element with ID '${id}' not found`);
|
||||||
|
}
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function to get a typed DOM element by ID and throw an error if not found
|
||||||
|
* @param id The element ID to search for
|
||||||
|
* @returns The typed HTMLElement
|
||||||
|
* @throws Error if element is not found
|
||||||
|
*/
|
||||||
|
function getRequiredTypedElement<T extends HTMLElement>(id: string): T {
|
||||||
|
const element = document.getElementById(id) as T;
|
||||||
|
if (!element) {
|
||||||
|
throw new Error(`Element with ID '${id}' not found`);
|
||||||
|
}
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
|
||||||
export function updatePhaseDisplay() {
|
export function updatePhaseDisplay() {
|
||||||
const currentPhase = gameState.gameData.phases[gameState.phaseIndex];
|
const currentPhase = gameState.gameData.phases[gameState.phaseIndex];
|
||||||
|
|
||||||
// Add fade-out effect
|
// Add fade-out effect
|
||||||
phaseDisplay.style.transition = 'opacity 0.3s ease-out';
|
phaseDisplay.style.transition = 'opacity 0.3s ease-out';
|
||||||
phaseDisplay.style.opacity = '0';
|
phaseDisplay.style.opacity = '0';
|
||||||
|
|
@ -17,8 +45,6 @@ export function updatePhaseDisplay() {
|
||||||
}
|
}
|
||||||
|
|
||||||
export function updateGameIdDisplay() {
|
export function updateGameIdDisplay() {
|
||||||
if (!gameIdDisplay) return;
|
|
||||||
|
|
||||||
// Add fade-out effect
|
// Add fade-out effect
|
||||||
gameIdDisplay.style.transition = 'opacity 0.3s ease-out';
|
gameIdDisplay.style.transition = 'opacity 0.3s ease-out';
|
||||||
gameIdDisplay.style.opacity = '0';
|
gameIdDisplay.style.opacity = '0';
|
||||||
|
|
@ -30,88 +56,46 @@ export function updateGameIdDisplay() {
|
||||||
gameIdDisplay.style.opacity = '1';
|
gameIdDisplay.style.opacity = '1';
|
||||||
}, 300);
|
}, 300);
|
||||||
}
|
}
|
||||||
// --- LOADING & DISPLAYING GAME PHASES ---
|
|
||||||
export function loadGameBtnFunction(file) {
|
export function loadGameBtnFunction(file: File) {
|
||||||
const reader = new FileReader();
|
const reader = new FileReader();
|
||||||
reader.onload = e => {
|
reader.onload = e => {
|
||||||
gameState.loadGameData(e.target?.result)
|
if (e.target === null || e.target.result === null) {
|
||||||
|
throw new Error("Failed to load file")
|
||||||
|
}
|
||||||
|
if (e.target.result instanceof ArrayBuffer) {
|
||||||
|
const decoder = new TextDecoder("utf-8");
|
||||||
|
gameState.loadGameData(decoder.decode(e.target.result))
|
||||||
|
} else {
|
||||||
|
gameState.loadGameData(e.target.result)
|
||||||
|
}
|
||||||
};
|
};
|
||||||
reader.onerror = () => {
|
reader.onerror = () => {
|
||||||
logger.log("Error reading file.")
|
logger.log("Error reading file.")
|
||||||
};
|
};
|
||||||
reader.readAsText(file);
|
reader.readAsText(file);
|
||||||
}
|
}
|
||||||
export const loadBtn = document.getElementById('load-btn');
|
|
||||||
if (null === loadBtn) throw new Error("Element with ID 'load-btn' not found");
|
|
||||||
|
|
||||||
export const fileInput = document.getElementById('file-input');
|
// DOM Elements
|
||||||
if (null === fileInput) throw new Error("Element with ID 'file-input' not found");
|
export const loadBtn = getRequiredElement('load-btn');
|
||||||
|
export const fileInput = getRequiredTypedElement<HTMLButtonElement>('file-input');
|
||||||
|
export const prevBtn = getRequiredTypedElement<HTMLButtonElement>('prev-btn');
|
||||||
|
export const nextBtn = getRequiredTypedElement<HTMLButtonElement>('next-btn');
|
||||||
|
export const playBtn = getRequiredTypedElement<HTMLButtonElement>('play-btn');
|
||||||
|
export const speedSelector = getRequiredTypedElement<HTMLSelectElement>('speed-selector');
|
||||||
|
export const phaseDisplay = getRequiredElement('phase-display');
|
||||||
|
export const gameIdDisplay = getRequiredElement('game-id-display');
|
||||||
|
export const mapView = getRequiredElement('map-view');
|
||||||
|
export const leaderboard = getRequiredElement('leaderboard');
|
||||||
|
export const rotatingDisplay = getRequiredElement('rotating-display');
|
||||||
|
|
||||||
export const prevBtn = document.getElementById('prev-btn');
|
|
||||||
if (null === prevBtn) throw new Error("Element with ID 'prev-btn' not found");
|
|
||||||
|
|
||||||
export const nextBtn = document.getElementById('next-btn');
|
|
||||||
if (null === nextBtn) throw new Error("Element with ID 'next-btn' not found");
|
|
||||||
|
|
||||||
export const playBtn = document.getElementById('play-btn');
|
|
||||||
if (null === playBtn) throw new Error("Element with ID 'play-btn' not found");
|
|
||||||
|
|
||||||
export const speedSelector = document.getElementById('speed-selector');
|
|
||||||
if (null === speedSelector) throw new Error("Element with ID 'speed-selector' not found");
|
|
||||||
|
|
||||||
export const phaseDisplay = document.getElementById('phase-display');
|
|
||||||
if (null === phaseDisplay) throw new Error("Element with ID 'phase-display' not found");
|
|
||||||
|
|
||||||
export const gameIdDisplay = document.getElementById('game-id-display');
|
|
||||||
if (null === gameIdDisplay) throw new Error("Element with ID 'game-id-display' not found");
|
|
||||||
|
|
||||||
export const mapView = document.getElementById('map-view');
|
|
||||||
if (null === mapView) throw new Error("Element with ID 'map-view' not found");
|
|
||||||
|
|
||||||
export const leaderboard = document.getElementById('leaderboard');
|
|
||||||
if (null === leaderboard) throw new Error("Element with ID 'leaderboard' not found");
|
|
||||||
|
|
||||||
export const rotatingDisplay = document.getElementById('rotating-display');
|
|
||||||
if (null === rotatingDisplay) throw new Error("Element with ID 'rotating-display' not found");
|
|
||||||
// Debug menu elements
|
// Debug menu elements
|
||||||
export const debugMenu = document.getElementById('debug-menu');
|
export const debugMenu = getRequiredElement('debug-menu');
|
||||||
if (null === debugMenu) throw new Error("Element with ID 'debug-menu' not found");
|
export const debugToggleBtn = getRequiredTypedElement<HTMLButtonElement>('debug-toggle-btn');
|
||||||
|
export const debugPanel = getRequiredElement('debug-panel');
|
||||||
export const debugToggleBtn = document.getElementById('debug-toggle-btn') as HTMLButtonElement;
|
export const debugCloseBtn = getRequiredTypedElement<HTMLButtonElement>('debug-close-btn');
|
||||||
if (null === debugToggleBtn) throw new Error("Element with ID 'debug-toggle-btn' not found");
|
export const provinceInput = getRequiredTypedElement<HTMLInputElement>('province-input');
|
||||||
|
export const highlightProvinceBtn = getRequiredElement('highlight-province-btn');
|
||||||
export const debugPanel = document.getElementById('debug-panel');
|
|
||||||
if (null === debugPanel) throw new Error("Element with ID 'debug-panel' not found");
|
|
||||||
|
|
||||||
export const debugCloseBtn = document.getElementById('debug-close-btn') as HTMLButtonElement;
|
|
||||||
if (null === debugCloseBtn) throw new Error("Element with ID 'debug-close-btn' not found");
|
|
||||||
|
|
||||||
export const provinceInput = document.getElementById('province-input') as HTMLInputElement;
|
|
||||||
if (null === provinceInput) throw new Error("Element with ID 'province-input' not found");
|
|
||||||
|
|
||||||
export const highlightProvinceBtn = document.getElementById('highlight-province-btn');
|
|
||||||
if (null === highlightProvinceBtn) throw new Error("Element with ID 'highlight-province-btn' not found");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Add roundRect polyfill for browsers that don't support it
|
|
||||||
if (!CanvasRenderingContext2D.prototype.roundRect) {
|
|
||||||
CanvasRenderingContext2D.prototype.roundRect = function (x, y, width, height, radius) {
|
|
||||||
if (typeof radius === 'undefined') {
|
|
||||||
radius = 5;
|
|
||||||
}
|
|
||||||
this.beginPath();
|
|
||||||
this.moveTo(x + radius, y);
|
|
||||||
this.lineTo(x + width - radius, y);
|
|
||||||
this.arcTo(x + width, y, x + width, y + radius, radius);
|
|
||||||
this.lineTo(x + width, y + height - radius);
|
|
||||||
this.arcTo(x + width, y + height, x + width - radius, y + height, radius);
|
|
||||||
this.lineTo(x + radius, y + height);
|
|
||||||
this.arcTo(x, y + height, x, y + height - radius, radius);
|
|
||||||
this.lineTo(x, y + radius);
|
|
||||||
this.arcTo(x, y, x + radius, y, radius);
|
|
||||||
this.closePath();
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -82,13 +82,13 @@ function loadFileFromServer(filePath: string): Promise<string> {
|
||||||
|
|
||||||
|
|
||||||
class GameState {
|
class GameState {
|
||||||
boardState: CoordinateData
|
boardState!: CoordinateData
|
||||||
gameId: number
|
gameId: number
|
||||||
gameData: GameSchemaType
|
gameData!: GameSchemaType
|
||||||
momentsData: NormalizedMomentsData | null
|
momentsData!: NormalizedMomentsData
|
||||||
phaseIndex: number
|
phaseIndex: number
|
||||||
boardName: string
|
boardName: string
|
||||||
currentPower: PowerENUM
|
currentPower!: PowerENUM
|
||||||
|
|
||||||
// state locks
|
// state locks
|
||||||
messagesPlaying: boolean
|
messagesPlaying: boolean
|
||||||
|
|
@ -102,9 +102,9 @@ class GameState {
|
||||||
scene: THREE.Scene
|
scene: THREE.Scene
|
||||||
|
|
||||||
// camera and controls
|
// camera and controls
|
||||||
camControls: OrbitControls
|
camControls!: OrbitControls
|
||||||
camera: THREE.PerspectiveCamera
|
camera!: THREE.PerspectiveCamera
|
||||||
renderer: THREE.WebGLRenderer
|
renderer!: THREE.WebGLRenderer
|
||||||
|
|
||||||
unitMeshes: THREE.Group[]
|
unitMeshes: THREE.Group[]
|
||||||
|
|
||||||
|
|
@ -112,10 +112,10 @@ class GameState {
|
||||||
unitAnimations: Tween[]
|
unitAnimations: Tween[]
|
||||||
|
|
||||||
//
|
//
|
||||||
playbackTimer: number
|
playbackTimer!: number
|
||||||
|
|
||||||
// Camera Animation during playing
|
// Camera Animation during playing
|
||||||
cameraPanAnim: TweenGroup | undefined
|
cameraPanAnim!: TweenGroup
|
||||||
|
|
||||||
// Global timing for animations
|
// Global timing for animations
|
||||||
globalTime: number
|
globalTime: number
|
||||||
|
|
@ -124,10 +124,8 @@ class GameState {
|
||||||
constructor(boardName: AvailableMaps) {
|
constructor(boardName: AvailableMaps) {
|
||||||
this.phaseIndex = 0
|
this.phaseIndex = 0
|
||||||
this.boardName = boardName
|
this.boardName = boardName
|
||||||
this.currentPower = null;
|
|
||||||
this.gameId = 16
|
this.gameId = 16
|
||||||
|
|
||||||
this.momentsData = null; // Initialize as null, will be loaded later
|
|
||||||
// State locks
|
// State locks
|
||||||
this.isSpeaking = false
|
this.isSpeaking = false
|
||||||
this.isPlaying = false
|
this.isPlaying = false
|
||||||
|
|
@ -169,7 +167,6 @@ class GameState {
|
||||||
this.gameData.phases[0].orders.length :
|
this.gameData.phases[0].orders.length :
|
||||||
Object.keys(this.gameData.phases[0].orders).length) : 0,
|
Object.keys(this.gameData.phases[0].orders).length) : 0,
|
||||||
ordersType: this.gameData.phases[0].orders ? typeof this.gameData.phases[0].orders : 'none',
|
ordersType: this.gameData.phases[0].orders ? typeof this.gameData.phases[0].orders : 'none',
|
||||||
unitsCount: this.gameData.phases[0].units ? this.gameData.phases[0].units.length : 0
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ import { initRotatingDisplay, } from "./components/rotatingDisplay";
|
||||||
import { debugMenuInstance } from "./debug/debugMenu";
|
import { debugMenuInstance } from "./debug/debugMenu";
|
||||||
import { initializeBackgroundAudio, startBackgroundAudio } from "./backgroundAudio";
|
import { initializeBackgroundAudio, startBackgroundAudio } from "./backgroundAudio";
|
||||||
import { updateLeaderboard } from "./components/leaderboard";
|
import { updateLeaderboard } from "./components/leaderboard";
|
||||||
import { _setPhase, advanceToNextPhase, nextPhase } from "./phase";
|
import { _setPhase, advanceToNextPhase, nextPhase, previousPhase } from "./phase";
|
||||||
import { togglePlayback } from "./phase";
|
import { togglePlayback } from "./phase";
|
||||||
|
|
||||||
//TODO: Create a function that finds a suitable unit location within a given polygon, for placing units better
|
//TODO: Create a function that finds a suitable unit location within a given polygon, for placing units better
|
||||||
|
|
@ -118,6 +118,7 @@ function createCameraPan(): Group {
|
||||||
*/
|
*/
|
||||||
function animate() {
|
function animate() {
|
||||||
|
|
||||||
|
|
||||||
requestAnimationFrame(animate);
|
requestAnimationFrame(animate);
|
||||||
if (gameState.isPlaying) {
|
if (gameState.isPlaying) {
|
||||||
// Update the camera angle
|
// Update the camera angle
|
||||||
|
|
|
||||||
|
|
@ -23,13 +23,11 @@ services:
|
||||||
env_file: "./ai_animation/.env"
|
env_file: "./ai_animation/.env"
|
||||||
ports:
|
ports:
|
||||||
- "4173:4173"
|
- "4173:4173"
|
||||||
- "5173:5173"
|
|
||||||
volumes:
|
volumes:
|
||||||
- ./ai_animation/public/games/:/app/dist/games
|
- ./ai_animation/public/games/:/app/dist/games
|
||||||
diplomacy-dev:
|
diplomacy-dev:
|
||||||
build: ai_animation
|
build: ai_animation
|
||||||
ports:
|
ports:
|
||||||
- "4173:4173"
|
|
||||||
- "5173:5173"
|
- "5173:5173"
|
||||||
command: ["npm", "run", "dev-all"]
|
command: ["npm", "run", "dev-all"]
|
||||||
volumes:
|
volumes:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue