<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Virtual World</title> <style> /* Futuristic / fun styling */ /* A gentle gradient background with animation */ body { margin: 0; padding: 0; font-family: 'Trebuchet MS', sans-serif; background: linear-gradient(120deg, #0ff, #f0f); background-size: 400% 400%; animation: gradientShift 10s ease infinite alternate; } @keyframes gradientShift { 0% { background-position: 0% 50%; } 100% { background-position: 100% 50%; } } /* Container for everything */ #app { display: flex; flex-direction: column; align-items: center; padding: 10px; position: relative; z-index: 1; /* so it stays above the gradient */ } /* Info bar top-left */ #infoBar { position: absolute; top: 0; left: 0; margin: 8px; padding: 5px 10px; background: rgba(255, 255, 255, 0.7); border: 1px solid #888; border-radius: 6px; font-size: 14px; z-index: 10; transition: box-shadow 0.3s; width: 200px; } #infoBar:hover { box-shadow: 0 0 10px rgba(255,255,255,0.8); } /* Stats bar top-right */ #statsBar { position: absolute; top: 0; right: 0; margin: 8px; padding: 5px 10px; background: rgba(255, 255, 255, 0.7); border: 1px solid #888; border-radius: 6px; font-size: 14px; z-index: 10; transition: box-shadow 0.3s; width: 250px; } #statsBar:hover { box-shadow: 0 0 10px rgba(255,255,255,0.8); } #menu { display: flex; flex-wrap: wrap; gap: 10px; margin: 8px 0; justify-content: center; } .menu-button { padding: 6px 12px; background: #fff; border: 2px solid #444; cursor: pointer; border-radius: 4px; transition: transform 0.25s ease, background-color 0.25s ease; } .menu-button:hover { transform: scale(1.08); background-color: #c8fffa; } #toggleLogsBtn { margin-left: 10px; } canvas { background: #ffffff; border: 2px solid #444; cursor: grab; transition: box-shadow 0.3s; } canvas:active { cursor: grabbing; box-shadow: 0 0 10px rgba(0,0,0,0.3); } #log { width: 800px; height: 120px; margin-top: 10px; border: 2px solid #444; background: #f9f9f9; padding: 5px; font-size: 0.9rem; overflow-y: auto; border-radius: 6px; transition: box-shadow 0.3s; } #log:hover { box-shadow: 0 0 6px rgba(0,0,0,0.15); } .log-entry { margin: 2px 0; } /* Responsive adjustments */ @media (max-width: 850px) { #log { width: 95%; height: 100px; } canvas { width: 95% !important; height: 400px !important; } } /* Menu categories */ .menu-category { display: flex; flex-direction: column; margin: 0 5px; border: 1px solid #ddd; border-radius: 5px; padding: 5px; background: rgba(255, 255, 255, 0.5); } .category-title { font-weight: bold; text-align: center; margin-bottom: 5px; font-size: 14px; } </style> </head> <body> <!-- Info Bar with money/citizen count --> <div id="infoBar"> <p id="moneyDisplay">Money: $0</p> <p id="citizenCount">Citizens: 0</p> <p id="woodDisplay">Wood: 0</p> <p id="foodDisplay">Food: 0</p> <p id="medicineDisplay">Medicine: 0</p> <p id="knowledgeDisplay">Knowledge: 0</p> </div> <!-- Stats Bar with building/profession counts --> <div id="statsBar"> <p id="buildingCountsDisplay">Buildings: 🏠0 🏪0 🏥0 🏫0</p> <p id="professionCountsDisplay">Citizens: 👷0 🌾0 💰0 💉0 📚0</p> </div> <div id="app"> <!-- Store Menu --> <div id="menu"> <div class="menu-category"> <div class="category-title">Buildings</div> <button class="menu-button" id="buyHouseBtn">Buy House ($300)</button> <button class="menu-button" id="buyRoadBtn">Buy Road ($150)</button> <button class="menu-button" id="buyMarketBtn">Buy Market ($400)</button> <button class="menu-button" id="buyHospitalBtn">Buy Hospital ($500)</button> <button class="menu-button" id="buySchoolBtn">Buy School ($450)</button> <button class="menu-button" id="buySpawnerBtn">Buy Spawner ($500)</button> </div> <div class="menu-category"> <div class="category-title">Citizens</div> <button class="menu-button" id="buyBuilderBtn">Buy Builder ($100)</button> <button class="menu-button" id="buyFarmerBtn">Buy Farmer ($100)</button> <button class="menu-button" id="buyMerchantBtn">Buy Merchant ($150)</button> <button class="menu-button" id="buyDoctorBtn">Buy Doctor ($200)</button> <button class="menu-button" id="buyTeacherBtn">Buy Teacher ($180)</button> <button class="menu-button" id="buySoldierBtn">Buy Soldier ($250)</button> </div> <div class="menu-category"> <div class="category-title">Resources</div> <button class="menu-button" id="buyTreeBtn">Buy Tree ($50)</button> </div> <div class="menu-category"> <div class="category-title">Terrain</div> <button class="menu-button" id="drawWaterBtn">Draw Water ($20)</button> <button class="menu-button" id="drawGrassBtn">Draw Grass ($10)</button> <button class="menu-button" id="drawSandBtn">Draw Sand ($15)</button> <button class="menu-button" id="drawDirtBtn">Draw Dirt ($5)</button> <button class="menu-button" id="drawStoneBtn">Draw Stone ($25)</button> </div> <button class="menu-button" id="toggleLogsBtn">Hide Logs</button> </div> <canvas id="worldCanvas" width="1200" height="800"></canvas> <div id="log"></div> </div> <script src="entities.js"></script> <script src="utils.js"></script> <script src="terrain.js"></script> <script src="ai.js"></script> <script src="render.js"></script> <script src="events.js"></script> <script src="game.js"></script> <script> /********************************************************************** * GLOBALS & REFERENCES **********************************************************************/ const canvas = document.getElementById('worldCanvas'); const ctx = canvas.getContext('2d'); const logContainer = document.getElementById('log'); const moneyDisplay = document.getElementById('moneyDisplay'); const citizenCountDisplay = document.getElementById('citizenCount'); const woodDisplay = document.getElementById('woodDisplay'); const foodDisplay = document.getElementById('foodDisplay'); const medicineDisplay = document.getElementById('medicineDisplay'); const knowledgeDisplay = document.getElementById('knowledgeDisplay'); const buildingCountsDisplay = document.getElementById('buildingCountsDisplay'); const professionCountsDisplay = document.getElementById('professionCountsDisplay'); // Pan & Zoom let offsetX = 0; let offsetY = 0; let scale = 1.0; let isDragging = false; let lastMouseX = 0; let lastMouseY = 0; /********************************************************************** * SETUP & START **********************************************************************/ function setupGame() { setupPanZoom(); setupBuyButtons(); setupCanvasClick(); initWorld(); updateMoneyDisplay(); } // Start the game setupGame(); </script> </body> </html>