You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.2 KiB
77 lines
2.2 KiB
/** |
|
* @fileoverview Main application orchestrator. |
|
* Initializes game state, wires up UI events, and coordinates modules. |
|
*/ |
|
|
|
import { init_game, set_price_per_cup } from './game.js'; |
|
import { sprites, cups, render, whenSpritesReady } from './canvasController.js'; |
|
import { createReactiveState, updateBindings } from './binding.js'; |
|
|
|
// Initialize game state |
|
let gameState = createReactiveState(init_game()); |
|
updateBindings(gameState); |
|
|
|
// Wait for all sprites to load, then render once |
|
whenSpritesReady(() => { |
|
render(); |
|
|
|
// Example: fill the first cup after 1 second |
|
setTimeout(() => { |
|
cups[0].fill(); |
|
sprites.maker.frameIndex = 1; |
|
render(); |
|
}, 1000); |
|
}); |
|
|
|
// UI Elements |
|
const goShoppingBtn = document.querySelector('.go_shopping_btn'); |
|
const shoppingModal = document.querySelector('.shopping_modal'); |
|
const shoppingModalClose = document.querySelector('.shopping_modal_close'); |
|
|
|
const changePriceBtn = document.querySelector('.change_price_button'); |
|
const priceModal = document.querySelector('.price_change_modal'); |
|
const priceModalClose = document.querySelector('.price_change_modal_close'); |
|
const priceInput = document.querySelector('.price_input'); |
|
|
|
const priceSaveBtn = document.querySelector('.price_change_save_btn'); |
|
|
|
// Event handlers |
|
if (goShoppingBtn) { |
|
goShoppingBtn.addEventListener('click', () => { |
|
console.log('hey'); |
|
shoppingModal.classList.add('open'); |
|
}); |
|
|
|
shoppingModalClose.addEventListener('click', () => { |
|
shoppingModal.classList.remove('open'); |
|
}) |
|
} |
|
|
|
if (changePriceBtn) { |
|
changePriceBtn.addEventListener('click', () => { |
|
|
|
priceModal.classList.add('open'); |
|
priceInput.focus(); |
|
const priceInputLength = priceInput.value.length; |
|
|
|
priceInput.setSelectionRange(priceInputLength, priceInputLength); |
|
}); |
|
|
|
priceModalClose.addEventListener('click', () => { |
|
priceModal.classList.remove('open'); |
|
}); |
|
|
|
priceSaveBtn.addEventListener('click', () => { |
|
const newState = set_price_per_cup(gameState, Number(priceInput.value)); |
|
setState(newState); |
|
priceModal.classList.remove('open'); |
|
}) |
|
} |
|
// Export for debugging in console |
|
window.gameState = gameState; |
|
window.sprites = sprites; |
|
window.cups = cups; |
|
|
|
function setState(newState) { |
|
Object.assign(gameState, newState); |
|
}
|
|
|