Spaces:
Running
Running
I am planning to create a game. Aim: digital hand cricket game called digital wicket. By venture text company that is me you shall assume 2. I am going to make this publicly available through web in GitHub and through app in getapps, so let's use JavaScript 3. And the data entered in the web should permanently save, is there any way Tools I am using : unfortunately I am doing this in my mobile phone but I am using a Acode app Okay, let's design Digital Wicket, a completely text-based cricket game with a hacker theme/ green on black, based on your specifications, and excluding sound. Digital Wicket: The Game Manifest Game Title: Digital Wicket Core Concept: A fully text-based cricket simulation, framed within a retro-futuristic hacker aesthetic. Players engage in tactical digital matches, battling against advanced AI "bots" or "algorithms." Every action, outcome, and piece of information is conveyed through crisp, thematic text. Theme: Green text on a black background, evoking classic terminal interfaces. The narrative leans into "system logs," "data streams," "algorithms," and "code." No Sound: All feedback, atmosphere, and action are conveyed purely through descriptive text. I. Game Flow: Navigating the System 1. Boot Sequence (Loading Screen): INITIATING DIGITAL WICKET PROTOCOL... ESTABLISHING SECURE CONNECTION... DECRYPTING GAME MANIFEST v1.0.3... CONNECTION ESTABLISHED. WELCOME, USER: [Player's Account Name] READY FOR DATA INJECTION. 2. Main Menu: SYSTEM ROOT DIRECTORY: DIGITAL WICKET [1] > INITIATE NEW MATCH (SIMULATION) [2] > ENGAGE CHALLENGER PROTOCOL (BOT ARENA) [3] > ACCESS DECRYPTION LOGS (VIEW ACHIEVEMENTS) [4] > CONFIGURE SYSTEM (SETTINGS) [5] > TERMINATE PROGRAM (EXIT) ENTER COMMAND: _ II. Match Setup: Configuring the Simulation If player selects [1] INITIATE NEW MATCH (SIMULATION): // NEW MATCH CONFIGURATION // [1] > PLAYER_MODE: BATTING [2] > PLAYER_MODE: BOWLING [3] > RANDOMIZER_MODE: (Opponent bats/bowls randomly) SELECT YOUR ROLE: _ * Choice of Overs: // SIMULATION PARAMETERS // ENTER OVER_COUNT (MIN 1, MAX 50): _ (Allows up to 50 overs, or higher if the player wishes, to cater to longer formats. Default options could be suggested like 5, 10, 20). * Choice of Wickets: // SIMULATION PARAMETERS // ENTER WICKET_THRESHOLD (MIN 1, MAX 10): _ (Allows players to define the number of wickets before an innings ends). * Choosing Opponent: // SELECT OPPONENT ALGORITHM // [1] > BASIC_SCRIPT (Level 1) [2] > STEADY_STATE (Level 2) [3] > AGGRESSOR_v1.0 (Level 3) [4] > TACTICAL_GRID (Level 4) [5] > ADAPTIVE_LEARNER (Level 5) [6] > GHOST_PROGRAM (Level 6) [7] > QUANTUM_BOWLER (Level 7) [8] > CYBER_SLOGGER (Level 8) [9] > NEXUS_MIND (Level 9) [10] > OMEGA_CRICKETER.EXE (Level 10) ENTER ALGORITHM ID (1-10): _ (For "Normal Match," a randomly selected or dynamically adjusted bot could be used if not specifically chosen). * Toss: // TOSS PROTOCOL INITIATED // OPPONENT ALGORITHM [OMEGA_CRICKETER.EXE] IS READY. [H] HEADS [T] TAILS ENTER CALL: _ SYSTEM_OUTPUT: COIN_FLIP RESULT: HEADS. SYSTEM_OUTPUT: OMEGA_CRICKETER.EXE CALLED: TAILS. SYSTEM_OUTPUT: YOU WIN TOSS. [B] BAT FIRST [F] FIELD FIRST ENTER CHOICE: _ III. In-Match Gameplay: The Digital Arena The game unfolds over by over, ball by ball, with detailed textual descriptions. 1. Scoreboard Display (ASCII Art): A simple, evolving ASCII scoreboard would be shown at the start of each over and after significant events (wicket, boundary, end of over). // CURRENT_STATE // USR: 123/2 (15.3 OVERS) BOT: 122/5 (15.0 OVERS) BATSMAN_ACTIVE: BYTE_BLASTER (45 runs, 32 balls) STRIKER_FACING: QUANTUM_BOWLER (2-23 in 3 overs) RUN_RATE: 7.82 REQUIRED_RATE: 8.00 (BOT INNINGS) 2. Ball-by-Ball Commentary (Dynamic System Logs): This is where the hacker theme shines. * SYSTEM_LOG: Bowler_ID: QUANTUM_BOWLER initiating run-up sequence... * DATA_STREAM: Ball_Delivery_Type: Yorker. Trajectory: Low. Pace: HIGH. * ANOMALY_DETECTED: Bat_Contact: MISS. Wicket_Collision: NEGATIVE. * SYSTEM_NOTIFICATION: No run. 3. Batting Interface: The player makes choices based on the textual description of the ball. OVER 16.1 | USER: 123/2 | TARGET: 124 (from 27 balls) BATSMAN: BYTE_BLASTER (45 runs) BOWLER: QUANTUM_BOWLER (Pace: 142 KPH - Previous ball: Yorker) SYSTEM_PROMPT: Incoming delivery. Analyze options: [1] > DEFENSIVE_BLOCK (Minimize risk, minimal run gain) [2] > DRIVE_THROUGH_COVERS (Medium risk, potential 3-4 runs, or 4) [3] > LOFFTED_SHOT (High risk, potential 6, high wicket probability) [4] > SWEEP_SHOT (Vs. Spin, targets leg side, medium risk) [5] > LEAVE_BALL (Zero risk, zero runs) ENTER COMMAND (1-5): _ * Result Feedback: * SYSTEM_OUTPUT: Shot executed. Ball penetrates boundary. 4 RUNS. * SYSTEM_OUTPUT: DIRECT HIT ON STUMPS. WICKET LOST. ERROR CODE: BATSMAN_OUT. * SYSTEM_OUTPUT: Ball missed. NO RUN. 4. Bowling Interface: The player dictates the ball's attributes. OVER 16.1 | BOT: 123/2 | TARGET: 124 (from 27 balls) BOWLER: BYTE_BLASTER (2-20 in 3 overs) BATSMAN: AGGRO_CORE.exe (45 runs) SYSTEM_PROMPT: Configure next delivery: [1] > BALL_TYPE: FAST [2] > BALL_TYPE: MEDIUM [3] > BALL_TYPE: SPIN ENTER COMMAND (1-3): _ PLAYER_INPUT: 1 (FAST) SYSTEM_PROMPT: Select LINE_AND_LENGTH: [1] > YORKER (High risk, low run) [2] > GOOD_LENGTH (Balanced) [3] > BOUNCER (Intimidate, high risk) [4] > FULL_TOSS (High risk, high runs for opponent) ENTER COMMAND (1-4): _ PLAYER_INPUT: 2 (GOOD_LENGTH) SYSTEM_PROMPT: Apply SWING_MODIFIER (Optional): [I] > INSWING [O] > OUTSWING [N] > NONE ENTER COMMAND (I/O/N): _ * Result Feedback: * SYSTEM_OUTPUT: Delivery initiated. Batsman attempts block. EDGE DETECTED. * SYSTEM_OUTPUT: CATCH FILED. WICKET TAKEN. BOT_ALGORITHM: AGGRO_CORE.exe DEACTIVATED. * SYSTEM_OUTPUT: Ball travels to boundary. 6 RUNS. System breach detected. IV. Bot Opponents (Challenger Protocol) Selecting [2] ENGAGE CHALLENGER PROTOCOL (BOT ARENA) takes the player to a structured challenge mode. * Each bot level (1-10) is a distinct AI with unique characteristics. * Introduction for each bot: // BOT PROFILE: AGGRO_CORE.exe // CLASSIFICATION: Offensive Algorithm PRIMARY_STRATEGY: Boundary_Seeking. Minimal_Defense. VULNERABILITIES: Yorkers, well-pitched off-spin. WARNING: HIGH_RISK_HIGH_REWARD PROTOCOL. EXPECT RAPID SCORING OR RAPID WICKET_LOSS. * Players must defeat bots in sequence to unlock higher levels, or they can choose any unlocked bot to play against. V. Decryption Logs (Achievements) If player selects [3] ACCESS DECRYPTION LOGS (VIEW ACHIEVEMENTS): * This section acts as the game's achievement system, presented as "decrypted data logs." * Unlocking: Achievements are unlocked by reaching specific milestones (e.g., Century, Hat-trick, winning a tournament simulation, defeating a high-level bot). * Content: Each "log" is a detailed, themed textual summary of the achievement. // DECRYPTION COMPLETE // // LOG_FILE_TRIPLE_DIGIT_PERFORMANCE.TXT // CATEGORY: BATTING_MASTERY ACHIEVEMENT: Century Scored (108 Runs) PLAYER_AGENT: [Your Account Name] OPPONENT_BOT: ADAPTIVE_LEARNER (Level 5) MATCH_CONTEXT: 20-Over Simulation (USER_VS_BOT) SIMULATION_DATE: 07-06-2025 // 13:30:00 IST METRICS_SUMMARY: - BALLS_FACED: 55 - STRIKE_RATE: 196.36 - BOUNDARIES_4S: 15 - BOUNDARIES_6S: 7 - WICKET_RISK_ASSESSMENT: MANAGED (No close calls) - ALGORITHM_COUNTERMEASURES: Successfully nullified Adaptive_Learner's mid-innings spin traps. SYSTEM_COMMENT: A highly efficient and dominant performance. Data indicates optimal resource allocation and decisive command inputs. // END_LOG_FILE // * The hacker theme is maintained here with the green-on-black display and "data" terminology. VI. Settings (Configure System) If player selects [4] CONFIGURE SYSTEM (SETTINGS): // SYSTEM CONFIGURATION // [1] > PLAYER_NAME: [Current Name] [2] > TEXT_SPEED: [Current Speed - e.g., NORMAL, FAST, INSTANT] [3] > COMMENTARY_DETAIL: [Current - e.g., DETAILED, CONCISE, MINIMAL] [4] > RESET_DATA (DANGEROUS) [5] > BACK TO ROOT ENTER COMMAND: _ Digital Wicket offers a deep, engaging experience by focusing on strategic choices, a compelling thematic narrative, and satisfying textual feedback, all without relying on a single visual outside of the character display. The progression through bot levels and the unique "decryption logs" provide strong replayability and a sense of accomplishment. The name is digital wicket. It should be like a normal match where you get to choose the numbers between 1 to 6 or 1 to 10 and you get to choose the number of overs up to 20 are more if you wish. And get to choose the number of wickets between 1 to 10. After completing this app I am gonna transfer this file in my laptop then upload this app in get apps And important piece of information at the starting of the app I should see a typing animation of by venture app first after that I should see a typing animation of digital wicket that is the apps name And remember it should show what number the bot choose too - Initial Deployment
890125f verified | <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Digital Wicket</title> | |
| <script src="https://cdn.tailwindcss.com"></script> | |
| <style> | |
| @import url('https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@400;700&display=swap'); | |
| body { | |
| font-family: 'Source Code Pro', monospace; | |
| background-color: #000; | |
| color: #00ff00; | |
| overflow-x: hidden; | |
| } | |
| .typing-animation { | |
| border-right: 2px solid #00ff00; | |
| white-space: nowrap; | |
| overflow: hidden; | |
| animation: typing 2s steps(40, end), blink-caret 0.75s step-end infinite; | |
| } | |
| @keyframes typing { | |
| from { width: 0 } | |
| to { width: 100% } | |
| } | |
| @keyframes blink-caret { | |
| from, to { border-color: transparent } | |
| 50% { border-color: #00ff00; } | |
| } | |
| .btn-hacker { | |
| border: 1px solid #00ff00; | |
| transition: all 0.3s; | |
| } | |
| .btn-hacker:hover { | |
| background-color: #00ff00; | |
| color: #000; | |
| box-shadow: 0 0 10px #00ff00; | |
| } | |
| .scoreboard { | |
| border: 1px solid #00ff00; | |
| box-shadow: 0 0 15px rgba(0, 255, 0, 0.3); | |
| } | |
| .terminal-line { | |
| animation: fadeIn 0.5s ease-in; | |
| } | |
| @keyframes fadeIn { | |
| from { opacity: 0; } | |
| to { opacity: 1; } | |
| } | |
| .pulse { | |
| animation: pulse 2s infinite; | |
| } | |
| @keyframes pulse { | |
| 0% { opacity: 1; } | |
| 50% { opacity: 0.5; } | |
| 100% { opacity: 1; } | |
| } | |
| </style> | |
| </head> | |
| <body class="min-h-screen flex flex-col"> | |
| <!-- Main Container --> | |
| <div class="container mx-auto px-4 py-8 flex-grow"> | |
| <!-- Initial Loading Animation --> | |
| <div id="loading-screen" class="text-center"> | |
| <div id="venture-text" class="text-2xl md:text-3xl font-bold mb-8"></div> | |
| <div id="game-title" class="text-3xl md:text-4xl font-bold mb-12"></div> | |
| <div class="text-lg md:text-xl mb-8"> | |
| <div class="terminal-line">INITIATING DIGITAL WICKET PROTOCOL...</div> | |
| <div class="terminal-line">ESTABLISHING SECURE CONNECTION...</div> | |
| <div class="terminal-line">DECRYPTING GAME MANIFEST v1.0.3...</div> | |
| <div class="terminal-line pulse">CONNECTION ESTABLISHED</div> | |
| </div> | |
| <button id="start-btn" class="btn-hacker px-6 py-3 text-lg font-bold hidden">ENTER SYSTEM</button> | |
| </div> | |
| <!-- Main Menu (Hidden Initially) --> | |
| <div id="main-menu" class="hidden"> | |
| <div class="text-center mb-8"> | |
| <h2 class="text-2xl md:text-3xl font-bold mb-4">SYSTEM ROOT DIRECTORY: DIGITAL WICKET</h2> | |
| <div class="max-w-md mx-auto text-left space-y-2 mb-8"> | |
| <div class="terminal-line">[1] > INITIATE NEW MATCH (SIMULATION)</div> | |
| <div class="terminal-line">[2] > ENGAGE CHALLENGER PROTOCOL (BOT ARENA)</div> | |
| <div class="terminal-line">[3] > ACCESS DECRYPTION LOGS (ACHIEVEMENTS)</div> | |
| <div class="terminal-line">[4] > CONFIGURE SYSTEM (SETTINGS)</div> | |
| <div class="terminal-line">[5] > TERMINATE PROGRAM (EXIT)</div> | |
| </div> | |
| <div class="mb-4"> | |
| <input type="text" id="menu-input" class="bg-black border-b border-green-500 text-green-500 px-2 py-1 w-32 text-center" placeholder="ENTER COMMAND"> | |
| </div> | |
| <button id="menu-submit" class="btn-hacker px-4 py-2">EXECUTE</button> | |
| </div> | |
| </div> | |
| <!-- New Match Configuration --> | |
| <div id="new-match" class="hidden"> | |
| <div class="text-center mb-8"> | |
| <h2 class="text-2xl md:text-3xl font-bold mb-4">// NEW MATCH CONFIGURATION //</h2> | |
| <div class="max-w-md mx-auto space-y-6"> | |
| <div> | |
| <h3 class="text-xl mb-2">SELECT YOUR ROLE:</h3> | |
| <div class="flex justify-center space-x-4 mb-4"> | |
| <button data-role="batting" class="btn-hacker px-4 py-2">BATTING</button> | |
| <button data-role="bowling" class="btn-hacker px-4 py-2">BOWLING</button> | |
| </div> | |
| </div> | |
| <div> | |
| <h3 class="text-xl mb-2">// SIMULATION PARAMETERS //</h3> | |
| <div class="mb-4"> | |
| <label class="block mb-2">ENTER OVER_COUNT (MIN 1, MAX 50):</label> | |
| <input type="number" id="overs-input" min="1" max="50" value="10" class="bg-black border border-green-500 text-green-500 px-2 py-1 w-20 text-center"> | |
| </div> | |
| <div class="mb-4"> | |
| <label class="block mb-2">ENTER WICKET_THRESHOLD (MIN 1, MAX 10):</label> | |
| <input type="number" id="wickets-input" min="1" max="10" value="5" class="bg-black border border-green-500 text-green-500 px-2 py-1 w-20 text-center"> | |
| </div> | |
| </div> | |
| <div> | |
| <h3 class="text-xl mb-2">// SELECT OPPONENT ALGORITHM //</h3> | |
| <select id="bot-select" class="bg-black border border-green-500 text-green-500 px-2 py-1 w-full max-w-xs"> | |
| <option value="1">BASIC_SCRIPT (Level 1)</option> | |
| <option value="2">STEADY_STATE (Level 2)</option> | |
| <option value="3">AGGRESSOR_v1.0 (Level 3)</option> | |
| <option value="4">TACTICAL_GRID (Level 4)</option> | |
| <option value="5">ADAPTIVE_LEARNER (Level 5)</option> | |
| <option value="6">GHOST_PROGRAM (Level 6)</option> | |
| <option value="7">QUANTUM_BOWLER (Level 7)</option> | |
| <option value="8">CYBER_SLOGGER (Level 8)</option> | |
| <option value="9">NEXUS_MIND (Level 9)</option> | |
| <option value="10">OMEGA_CRICKETER.EXE (Level 10)</option> | |
| </select> | |
| </div> | |
| <div class="pt-4"> | |
| <button id="start-match" class="btn-hacker px-6 py-3 text-lg font-bold">INITIATE SIMULATION</button> | |
| <button id="back-to-menu" class="btn-hacker px-4 py-2 ml-4">CANCEL</button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Toss Screen --> | |
| <div id="toss-screen" class="hidden"> | |
| <div class="text-center mb-8"> | |
| <h2 class="text-2xl md:text-3xl font-bold mb-4">// TOSS PROTOCOL INITIATED //</h2> | |
| <div id="bot-name-display" class="text-xl mb-6"></div> | |
| <div id="toss-options" class="max-w-md mx-auto space-y-6"> | |
| <div> | |
| <h3 class="text-xl mb-4">MAKE YOUR CALL:</h3> | |
| <div class="flex justify-center space-x-4"> | |
| <button data-call="heads" class="btn-hacker px-4 py-2">HEADS</button> | |
| <button data-call="tails" class="btn-hacker px-4 py-2">TAILS</button> | |
| </div> | |
| </div> | |
| </div> | |
| <div id="toss-result" class="hidden max-w-md mx-auto space-y-4 mt-6"> | |
| <div id="toss-outcome" class="text-xl"></div> | |
| <div id="toss-choice" class="hidden"> | |
| <h3 class="text-xl mb-4">CHOOSE YOUR ACTION:</h3> | |
| <div class="flex justify-center space-x-4"> | |
| <button data-choice="bat" class="btn-hacker px-4 py-2">BAT FIRST</button> | |
| <button data-choice="field" class="btn-hacker px-4 py-2">FIELD FIRST</button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Game Screen --> | |
| <div id="game-screen" class="hidden"> | |
| <div class="max-w-4xl mx-auto"> | |
| <!-- Scoreboard --> | |
| <div id="scoreboard" class="scoreboard p-4 mb-6 rounded"> | |
| <div class="grid grid-cols-2 gap-4"> | |
| <div> | |
| <div class="text-lg font-bold">PLAYER</div> | |
| <div id="player-score" class="text-xl">0/0 (0.0 OVERS)</div> | |
| <div id="player-batsman" class="text-sm">BATSMAN: -</div> | |
| </div> | |
| <div> | |
| <div class="text-lg font-bold">BOT</div> | |
| <div id="bot-score" class="text-xl">0/0 (0.0 OVERS)</div> | |
| <div id="bot-batsman" class="text-sm">BATSMAN: -</div> | |
| </div> | |
| </div> | |
| <div id="match-info" class="mt-2 text-sm"> | |
| TARGET: - | REQUIRED RATE: - | |
| </div> | |
| </div> | |
| <!-- Game Controls --> | |
| <div id="game-controls" class="mb-6"> | |
| <div id="batting-controls" class="hidden"> | |
| <h3 class="text-xl mb-3">SELECT YOUR SHOT:</h3> | |
| <div class="grid grid-cols-3 gap-2 mb-4"> | |
| <button data-shot="1" class="btn-hacker px-3 py-2">1 (Defensive)</button> | |
| <button data-shot="2" class="btn-hacker px-3 py-2">2 (Drive)</button> | |
| <button data-shot="3" class="btn-hacker px-3 py-2">3 (Aggressive)</button> | |
| <button data-shot="4" class="btn-hacker px-3 py-2">4 (Sweep)</button> | |
| <button data-shot="5" class="btn-hacker px-3 py-2">5 (Lofted)</button> | |
| <button data-shot="6" class="btn-hacker px-3 py-2">6 (Maximum)</button> | |
| </div> | |
| </div> | |
| <div id="bowling-controls" class="hidden"> | |
| <h3 class="text-xl mb-3">SELECT YOUR DELIVERY:</h3> | |
| <div class="grid grid-cols-3 gap-2 mb-4"> | |
| <button data-delivery="1" class="btn-hacker px-3 py-2">1 (Yorker)</button> | |
| <button data-delivery="2" class="btn-hacker px-3 py-2">2 (Good Length)</button> | |
| <button data-delivery="3" class="btn-hacker px-3 py-2">3 (Bouncer)</button> | |
| <button data-delivery="4" class="btn-hacker px-3 py-2">4 (Full Toss)</button> | |
| <button data-delivery="5" class="btn-hacker px-3 py-2">5 (Slower Ball)</button> | |
| <button data-delivery="6" class="btn-hacker px-3 py-2">6 (Spin)</button> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Commentary --> | |
| <div id="commentary" class="border border-green-500 p-4 h-48 overflow-y-auto mb-6"> | |
| <div class="text-sm space-y-1"> | |
| <div>SYSTEM: MATCH INITIALIZED. READY TO COMMENCE.</div> | |
| </div> | |
| </div> | |
| <!-- Match Status --> | |
| <div id="match-status" class="text-center text-xl font-bold mb-4"></div> | |
| <!-- Game Actions --> | |
| <div class="flex justify-center space-x-4"> | |
| <button id="continue-game" class="btn-hacker px-4 py-2 hidden">CONTINUE</button> | |
| <button id="end-game" class="btn-hacker px-4 py-2">EXIT MATCH</button> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Match Result --> | |
| <div id="result-screen" class="hidden"> | |
| <div class="text-center max-w-2xl mx-auto"> | |
| <h2 id="result-title" class="text-3xl font-bold mb-6"></h2> | |
| <div id="result-details" class="mb-8 space-y-4"> | |
| <!-- Result details will be inserted here --> | |
| </div> | |
| <button id="back-to-menu-result" class="btn-hacker px-6 py-3 text-lg font-bold">RETURN TO MAIN MENU</button> | |
| </div> | |
| </div> | |
| <!-- Achievements Screen --> | |
| <div id="achievements-screen" class="hidden"> | |
| <div class="text-center mb-8"> | |
| <h2 class="text-2xl md:text-3xl font-bold mb-4">// DECRYPTION LOGS //</h2> | |
| <div class="max-w-2xl mx-auto text-left space-y-4"> | |
| <div class="border border-green-500 p-4"> | |
| <div class="font-bold">TRIPLE_DIGIT_PERFORMANCE.TXT</div> | |
| <div class="text-sm opacity-75">CATEGORY: BATTING_MASTERY</div> | |
| <div class="text-sm">ACHIEVEMENT: Century Scored (100+ Runs)</div> | |
| <div id="century-achievement" class="text-xs mt-2 hidden">LOCKED</div> | |
| </div> | |
| <div class="border border-green-500 p-4"> | |
| <div class="font-bold">WICKET_HAUL.TXT</div> | |
| <div class="text-sm opacity-75">CATEGORY: BOWLING_MASTERY</div> | |
| <div class="text-sm">ACHIEVEMENT: 5-Wicket Haul</div> | |
| <div id="wicket-achievement" class="text-xs mt-2 hidden">LOCKED</div> | |
| </div> | |
| <div class="border border-green-500 p-4"> | |
| <div class="font-bold">BOT_DESTROYER.TXT</div> | |
| <div class="text-sm opacity-75">CATEGORY: COMBAT</div> | |
| <div class="text-sm">ACHIEVEMENT: Defeat Level 10 Bot</div> | |
| <div id="bot-achievement" class="text-xs mt-2 hidden">LOCKED</div> | |
| </div> | |
| </div> | |
| <button id="back-to-menu-achievements" class="btn-hacker px-4 py-2 mt-8">BACK TO MAIN MENU</button> | |
| </div> | |
| </div> | |
| <!-- Settings Screen --> | |
| <div id="settings-screen" class="hidden"> | |
| <div class="text-center mb-8"> | |
| <h2 class="text-2xl md:text-3xl font-bold mb-4">// SYSTEM CONFIGURATION //</h2> | |
| <div class="max-w-md mx-auto space-y-6 text-left"> | |
| <div> | |
| <label class="block mb-2">PLAYER NAME:</label> | |
| <input type="text" id="player-name" class="bg-black border border-green-500 text-green-500 px-2 py-1 w-full" value="USER"> | |
| </div> | |
| <div> | |
| <label class="block mb-2">TEXT SPEED:</label> | |
| <select id="text-speed" class="bg-black border border-green-500 text-green-500 px-2 py-1 w-full"> | |
| <option value="fast">FAST</option> | |
| <option value="normal" selected>NORMAL</option> | |
| <option value="slow">SLOW</option> | |
| </select> | |
| </div> | |
| <div> | |
| <label class="block mb-2">COMMENTARY DETAIL:</label> | |
| <select id="commentary-detail" class="bg-black border border-green-500 text-green-500 px-2 py-1 w-full"> | |
| <option value="detailed">DETAILED</option> | |
| <option value="normal" selected>NORMAL</option> | |
| <option value="minimal">MINIMAL</option> | |
| </select> | |
| </div> | |
| <div class="pt-4"> | |
| <button id="save-settings" class="btn-hacker px-6 py-3 text-lg font-bold">SAVE CONFIGURATION</button> | |
| <button id="back-to-menu-settings" class="btn-hacker px-4 py-2 ml-4">CANCEL</button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Footer --> | |
| <footer class="text-center py-4 text-sm border-t border-green-900"> | |
| <div>DIGITAL WICKET v1.0.3</div> | |
| <div>BY VENTURE APP</div> | |
| </footer> | |
| <script> | |
| // Game State | |
| const gameState = { | |
| playerName: "USER", | |
| textSpeed: "normal", | |
| commentaryDetail: "normal", | |
| achievements: { | |
| century: false, | |
| fiveWickets: false, | |
| beatLevel10: false | |
| }, | |
| match: { | |
| role: null, // 'batting' or 'bowling' | |
| overs: 10, | |
| wickets: 5, | |
| botLevel: 1, | |
| tossWon: false, | |
| battingFirst: null, | |
| playerScore: { runs: 0, wickets: 0, overs: 0, balls: 0 }, | |
| botScore: { runs: 0, wickets: 0, overs: 0, balls: 0 }, | |
| target: 0, | |
| currentInnings: 1, // 1 or 2 | |
| gameOver: false, | |
| winner: null | |
| }, | |
| currentBatsman: { runs: 0, balls: 0 }, | |
| currentBowler: { wickets: 0, runs: 0, balls: 0 } | |
| }; | |
| // DOM Elements | |
| const loadingScreen = document.getElementById('loading-screen'); | |
| const ventureText = document.getElementById('venture-text'); | |
| const gameTitle = document.getElementById('game-title'); | |
| const startBtn = document.getElementById('start-btn'); | |
| const mainMenu = document.getElementById('main-menu'); | |
| const menuInput = document.getElementById('menu-input'); | |
| const menuSubmit = document.getElementById('menu-submit'); | |
| const newMatch = document.getElementById('new-match'); | |
| const startMatch = document.getElementById('start-match'); | |
| const backToMenu = document.getElementById('back-to-menu'); | |
| const tossScreen = document.getElementById('toss-screen'); | |
| const botNameDisplay = document.getElementById('bot-name-display'); | |
| const tossOptions = document.getElementById('toss-options'); | |
| const tossResult = document.getElementById('toss-result'); | |
| const tossOutcome = document.getElementById('toss-outcome'); | |
| const tossChoice = document.getElementById('toss-choice'); | |
| const gameScreen = document.getElementById('game-screen'); | |
| const scoreboard = document.getElementById('scoreboard'); | |
| const playerScore = document.getElementById('player-score'); | |
| const botScore = document.getElementById('bot-score'); | |
| const playerBatsman = document.getElementById('player-batsman'); | |
| const botBatsman = document.getElementById('bot-batsman'); | |
| const matchInfo = document.getElementById('match-info'); | |
| const battingControls = document.getElementById('batting-controls'); | |
| const bowlingControls = document.getElementById('bowling-controls'); | |
| const commentary = document.getElementById('commentary'); | |
| const matchStatus = document.getElementById('match-status'); | |
| const continueGame = document.getElementById('continue-game'); | |
| const endGame = document.getElementById('end-game'); | |
| const resultScreen = document.getElementById('result-screen'); | |
| const resultTitle = document.getElementById('result-title'); | |
| const resultDetails = document.getElementById('result-details'); | |
| const backToMenuResult = document.getElementById('back-to-menu-result'); | |
| const achievementsScreen = document.getElementById('achievements-screen'); | |
| const centuryAchievement = document.getElementById('century-achievement'); | |
| const wicketAchievement = document.getElementById('wicket-achievement'); | |
| const botAchievement = document.getElementById('bot-achievement'); | |
| const backToMenuAchievements = document.getElementById('back-to-menu-achievements'); | |
| const settingsScreen = document.getElementById('settings-screen'); | |
| const playerNameInput = document.getElementById('player-name'); | |
| const textSpeedInput = document.getElementById('text-speed'); | |
| const commentaryDetailInput = document.getElementById('commentary-detail'); | |
| const saveSettings = document.getElementById('save-settings'); | |
| const backToMenuSettings = document.getElementById('back-to-menu-settings'); | |
| // Initialize the game | |
| document.addEventListener('DOMContentLoaded', () => { | |
| // Load saved data | |
| loadGameData(); | |
| // Start typing animations | |
| setTimeout(() => { | |
| ventureText.classList.add('typing-animation'); | |
| ventureText.textContent = 'BY VENTURE APP'; | |
| setTimeout(() => { | |
| ventureText.classList.remove('typing-animation'); | |
| gameTitle.classList.add('typing-animation'); | |
| gameTitle.textContent = 'DIGITAL WICKET'; | |
| setTimeout(() => { | |
| gameTitle.classList.remove('typing-animation'); | |
| startBtn.classList.remove('hidden'); | |
| }, 2000); | |
| }, 2000); | |
| }, 500); | |
| }); | |
| // Start button click | |
| startBtn.addEventListener('click', () => { | |
| loadingScreen.classList.add('hidden'); | |
| mainMenu.classList.remove('hidden'); | |
| menuInput.focus(); | |
| }); | |
| // Main menu navigation | |
| menuSubmit.addEventListener('click', handleMenuInput); | |
| menuInput.addEventListener('keypress', (e) => { | |
| if (e.key === 'Enter') handleMenuInput(); | |
| }); | |
| function handleMenuInput() { | |
| const input = menuInput.value.trim(); | |
| menuInput.value = ''; | |
| switch(input) { | |
| case '1': | |
| mainMenu.classList.add('hidden'); | |
| newMatch.classList.remove('hidden'); | |
| break; | |
| case '2': | |
| // Same as new match but with random bot level | |
| gameState.match.botLevel = Math.floor(Math.random() * 10) + 1; | |
| startNewMatch(); | |
| break; | |
| case '3': | |
| mainMenu.classList.add('hidden'); | |
| achievementsScreen.classList.remove('hidden'); | |
| updateAchievementsDisplay(); | |
| break; | |
| case '4': | |
| mainMenu.classList.add('hidden'); | |
| settingsScreen.classList.remove('hidden'); | |
| loadSettingsToUI(); | |
| break; | |
| case '5': | |
| // Exit - just reload for this demo | |
| window.location.reload(); | |
| break; | |
| default: | |
| addCommentary(`SYSTEM: INVALID COMMAND. TRY 1-5.`); | |
| } | |
| } | |
| // New match configuration | |
| startMatch.addEventListener('click', () => { | |
| gameState.match.overs = parseInt(document.getElementById('overs-input').value); | |
| gameState.match.wickets = parseInt(document.getElementById('wickets-input').value); | |
| gameState.match.botLevel = parseInt(document.getElementById('bot-select').value); | |
| newMatch.classList.add('hidden'); | |
| tossScreen.classList.remove('hidden'); | |
| const botNames = [ | |
| "BASIC_SCRIPT", | |
| "STEADY_STATE", | |
| "AGGRESSOR_v1.0", | |
| "TACTICAL_GRID", | |
| "ADAPTIVE_LEARNER", | |
| "GHOST_PROGRAM", | |
| "QUANTUM_BOWLER", | |
| "CYBER_SLOGGER", | |
| "NEXUS_MIND", | |
| "OMEGA_CRICKETER.EXE" | |
| ]; | |
| botNameDisplay.textContent = `OPPONENT ALGORITHM: ${botNames[gameState.match.botLevel - 1]} (Level ${gameState.match.botLevel})`; | |
| }); | |
| backToMenu.addEventListener('click', () => { | |
| newMatch.classList.add('hidden'); | |
| mainMenu.classList.remove('hidden'); | |
| }); | |
| // Toss handling | |
| document.querySelectorAll('[data-call]').forEach(btn => { | |
| btn.addEventListener('click', (e) => { | |
| const call = e.target.getAttribute('data-call'); | |
| handleToss(call); | |
| }); | |
| }); | |
| function handleToss(playerCall) { | |
| tossOptions.classList.add('hidden'); | |
| const tossResult = Math.random() < 0.5 ? 'heads' : 'tails'; | |
| const botCall = tossResult === 'heads' ? 'tails' : 'heads'; | |
| gameState.match.tossWon = playerCall === tossResult; | |
| let outcomeText = `SYSTEM_OUTPUT: COIN_FLIP RESULT: ${tossResult.toUpperCase()}.<br>`; | |
| outcomeText += `SYSTEM_OUTPUT: BOT CALLED: ${botCall.toUpperCase()}.<br>`; | |
| outcomeText += `SYSTEM_OUTPUT: YOU ${gameState.match.tossWon ? 'WIN' : 'LOSE'} TOSS.`; | |
| tossOutcome.innerHTML = outcomeText; | |
| tossResult.classList.remove('hidden'); | |
| if (gameState.match.tossWon) { | |
| tossChoice.classList.remove('hidden'); | |
| } else { | |
| // Bot chooses randomly | |
| setTimeout(() => { | |
| const botChoice = Math.random() < 0.5 ? 'bat' : 'field'; | |
| addCommentary(`SYSTEM_OUTPUT: BOT CHOOSES TO ${botChoice === 'bat' ? 'BAT' : 'FIELD'} FIRST.`); | |
| gameState.match.battingFirst = botChoice === 'bat' ? 'bot' : 'player'; | |
| startInnings(); | |
| }, 2000); | |
| } | |
| } | |
| document.querySelectorAll('[data-choice]').forEach(btn => { | |
| btn.addEventListener('click', (e) => { | |
| const choice = e.target.getAttribute('data-choice'); | |
| gameState.match.battingFirst = choice === 'bat' ? 'player' : 'bot'; | |
| addCommentary(`SYSTEM_OUTPUT: YOU CHOOSE TO ${choice === 'bat' ? 'BAT' : 'FIELD'} FIRST.`); | |
| startInnings(); | |
| }); | |
| }); | |
| function startInnings() { | |
| tossScreen.classList.add('hidden'); | |
| gameScreen.classList.remove('hidden'); | |
| // Reset scores | |
| gameState.match.playerScore = { runs: 0, wickets: 0, overs: 0, balls: 0 }; | |
| gameState.match.botScore = { runs: 0, wickets: 0, overs: 0, balls: 0 }; | |
| gameState.match.currentInnings = 1; | |
| gameState.match.gameOver = false; | |
| gameState.match.winner = null; | |
| gameState.currentBatsman = { runs: 0, balls: 0 }; | |
| gameState.currentBowler = { wickets: 0, runs: 0, balls: 0 }; | |
| updateScoreboard(); | |
| if (gameState.match.battingFirst === 'player') { | |
| addCommentary(`SYSTEM: PLAYER TO BAT FIRST. INNINGS 1 COMMENCING.`); | |
| startPlayerBatting(); | |
| } else { | |
| addCommentary(`SYSTEM: BOT TO BAT FIRST. INNINGS 1 COMMENCING.`); | |
| startBotBatting(); | |
| } | |
| } | |
| function startPlayerBatting() { | |
| battingControls.classList.remove('hidden'); | |
| bowlingControls.classList.add('hidden'); | |
| addCommentary(`SYSTEM: SELECT YOUR SHOT (1-6).`); | |
| } | |
| function startBotBatting() { | |
| battingControls.classList.add('hidden'); | |
| bowlingControls.classList.remove('hidden'); | |
| addCommentary(`SYSTEM: SELECT YOUR DELIVERY (1-6).`); | |
| } | |
| // Batting controls | |
| document.querySelectorAll('[data-shot]').forEach(btn => { | |
| btn.addEventListener('click', (e) => { | |
| const shot = parseInt(e.target.getAttribute('data-shot')); | |
| playPlayerShot(shot); | |
| }); | |
| }); | |
| function playPlayerShot(shot) { | |
| const botDelivery = Math.floor(Math.random() * 6) + 1; // Bot chooses 1-6 | |
| // Determine outcome based on shot and delivery | |
| let runs = 0; | |
| let wicket = false; | |
| let outcome = ''; | |
| // Simple logic: if shot matches delivery, wicket chance increases | |
| if (shot === botDelivery) { | |
| // 30% chance of wicket | |
| wicket = Math.random() < 0.3; | |
| if (wicket) { | |
| runs = 0; | |
| outcome = `BOT DELIVERY: ${botDelivery} | YOUR SHOT: ${shot} | EDGE! CAUGHT BEHIND! WICKET!`; | |
| } else { | |
| // 70% chance of 1 run | |
| runs = 1; | |
| outcome = `BOT DELIVERY: ${botDelivery} | YOUR SHOT: ${shot} | DEFENSIVE SHOT, 1 RUN.`; | |
| } | |
| } else { | |
| // Different shot and delivery - runs more likely | |
| const diff = Math.abs(shot - botDelivery); | |
| if (diff >= 3) { | |
| // Big shot - 4 or 6 | |
| runs = shot === 6 ? 6 : 4; | |
| outcome = `BOT DELIVERY: ${botDelivery} | YOUR SHOT: ${shot} | CRACKING SHOT! ${runs} RUNS!`; | |
| } else if (diff >= 1) { | |
| // Moderate shot - 1-3 runs | |
| runs = Math.min(shot, 3); | |
| outcome = `BOT DELIVERY: ${botDelivery} | YOUR SHOT: ${shot} | GOOD RUNNING, ${runs} RUNS.`; | |
| } | |
| } | |
| // Update score | |
| if (wicket) { | |
| gameState.match.playerScore.wickets++; | |
| gameState.currentBowler.wickets++; | |
| outcome += ` WICKET ${gameState.match.playerScore.wickets}/${gameState.match.wickets}`; | |
| if (gameState.match.playerScore.wickets >= gameState.match.wickets) { | |
| // All out | |
| endInnings(); | |
| return; | |
| } | |
| } else { | |
| gameState.match.playerScore.runs += runs; | |
| gameState.currentBatsman.runs += runs; | |
| } | |
| gameState.match.playerScore.balls++; | |
| gameState.currentBatsman.balls++; | |
| gameState.currentBowler.balls++; | |
| // Check if over is completed (6 balls) | |
| if (gameState.match.playerScore.balls % 6 === 0) { | |
| gameState.match.playerScore.overs++; | |
| outcome += ` OVER ${gameState.match.playerScore.overs}.${gameState.match.overs} COMPLETED.`; | |
| } | |
| addCommentary(outcome); | |
| updateScoreboard(); | |
| // Check if all overs are completed | |
| if (gameState.match.playerScore.overs >= gameState.match.overs) { | |
| endInnings(); | |
| } | |
| } | |
| // Bowling controls | |
| document.querySelectorAll('[data-delivery]').forEach(btn => { | |
| btn.addEventListener('click', (e) => { | |
| const delivery = parseInt(e.target.getAttribute('data-delivery')); | |
| playBotShot(delivery); | |
| }); | |
| }); | |
| function playBotShot(delivery) { | |
| // Bot chooses shot based on level (higher levels make better choices) | |
| let botShot; | |
| if (gameState.match.botLevel <= 3) { | |
| // Low level - random | |
| botShot = Math.floor(Math.random() * 6) + 1; | |
| } else if (gameState.match.botLevel <= 7) { | |
| // Medium level - sometimes matches delivery | |
| if (Math.random() < 0.4) { | |
| botShot = delivery; | |
| } else { | |
| botShot = Math.floor(Math.random() * 6) + 1; | |
| } | |
| } else { | |
| // High level - often matches delivery or chooses good shots | |
| if (Math.random() < 0.7) { | |
| botShot = delivery === 1 ? 2 : (delivery === 6 ? 5 : delivery); | |
| } else { | |
| botShot = Math.floor(Math.random() * 6) + 1; | |
| } | |
| } | |
| // Determine outcome based on shot and delivery | |
| let runs = 0; | |
| let wicket = false; | |
| let outcome = ''; | |
| // Similar logic to batting but reversed | |
| if (botShot === delivery) { | |
| // 40% chance of wicket (higher than when batting) | |
| wicket = Math.random() < 0.4; | |
| if (wicket) { | |
| runs = 0; | |
| outcome = `YOUR DELIVERY: ${delivery} | BOT SHOT: ${botShot} | BOWLED! WICKET!`; | |
| } else { | |
| // 60% chance of 1 run | |
| runs = 1; | |
| outcome = `YOUR DELIVERY: ${delivery} | BOT SHOT: ${botShot} | DEFENSIVE SHOT, 1 RUN.`; | |
| } | |
| } else { | |
| const diff = Math.abs(botShot - delivery); | |
| if (diff >= 3) { | |
| // Big shot - 4 or 6 | |
| runs = botShot === 6 ? 6 : 4; | |
| outcome = `YOUR DELIVERY: ${delivery} | BOT SHOT: ${botShot} | POWERFUL SHOT! ${runs} RUNS!`; | |
| } else if (diff >= 1) { | |
| // Moderate shot - 1-3 runs | |
| runs = Math.min(botShot, 3); | |
| outcome = `YOUR DELIVERY: ${delivery} | BOT SHOT: ${botShot} | GOOD RUNNING, ${runs} RUNS.`; | |
| } | |
| } | |
| // Update score | |
| if (wicket) { | |
| gameState.match.botScore.wickets++; | |
| gameState.currentBowler.wickets++; | |
| outcome += ` WICKET ${gameState.match.botScore.wickets}/${gameState.match.wickets}`; | |
| if (gameState.match.botScore.wickets >= gameState.match.wickets) { | |
| // All out | |
| endInnings(); | |
| return; | |
| } | |
| } else { | |
| gameState.match.botScore.runs += runs; | |
| gameState.currentBatsman.runs += runs; | |
| } | |
| gameState.match.botScore.balls++; | |
| gameState.currentBatsman.balls++; | |
| gameState.currentBowler.balls++; | |
| // Check if over is completed (6 balls) | |
| if (gameState.match.botScore.balls % 6 === 0) { | |
| gameState.match.botScore.overs++; | |
| outcome += ` OVER ${gameState.match.botScore.overs}.${gameState.match.overs} COMPLETED.`; | |
| } | |
| addCommentary(outcome); | |
| updateScoreboard(); | |
| // Check if all overs are completed | |
| if (gameState.match.botScore.overs >= gameState.match.overs) { | |
| endInnings(); | |
| } | |
| } | |
| function endInnings() { | |
| gameState.match.currentInnings++; | |
| if (gameState.match.currentInnings === 2) { | |
| // First innings ended, start second innings | |
| if (gameState.match.battingFirst === 'player') { | |
| // Player batted first, now bot chases | |
| gameState.match.target = gameState.match.playerScore.runs + 1; | |
| addCommentary(`SYSTEM: INNINGS 1 COMPLETE. PLAYER SCORE: ${gameState.match.playerScore.runs}/${gameState.match.playerScore.wickets}. BOT REQUIRES ${gameState.match.target} RUNS TO WIN.`); | |
| startBotBatting(); | |
| } else { | |
| // Bot batted first, now player chases | |
| gameState.match.target = gameState.match.botScore.runs + 1; | |
| addCommentary(`SYSTEM: INNINGS 1 COMPLETE. BOT SCORE: ${gameState.match.botScore.runs}/${gameState.match.botScore.wickets}. PLAYER REQUIRES ${gameState.match.target} RUNS TO WIN.`); | |
| startPlayerBatting(); | |
| } | |
| } else { | |
| // Game over | |
| gameState.match.gameOver = true; | |
| if (gameState.match.battingFirst === 'player') { | |
| // Player batted first, bot chased | |
| if (gameState.match.botScore.runs >= gameState.match.target) { | |
| gameState.match.winner = 'bot'; | |
| addCommentary(`SYSTEM: MATCH OVER. BOT WINS BY ${gameState.match.wickets - gameState.match.botScore.wickets} WICKETS.`); | |
| } else { | |
| gameState.match.winner = 'player'; | |
| addCommentary(`SYSTEM: MATCH OVER. PLAYER WINS BY ${gameState.match.target - gameState.match.botScore.runs - 1} RUNS.`); | |
| } | |
| } else { | |
| // Bot batted first, player chased | |
| if (gameState.match.playerScore.runs >= gameState.match.target) { | |
| gameState.match.winner = 'player'; | |
| addCommentary(`SYSTEM: MATCH OVER. PLAYER WINS BY ${gameState.match.wickets - gameState.match.playerScore.wickets} WICKETS.`); | |
| } else { | |
| gameState.match.winner = 'bot'; | |
| addCommentary(`SYSTEM: MATCH OVER. BOT WINS BY ${gameState.match.target - gameState.match.playerScore.runs - 1} RUNS.`); | |
| } | |
| } | |
| // Update achievements | |
| updateAchievements(); | |
| showMatchResult(); | |
| } | |
| } | |
| function updateScoreboard() { | |
| if (gameState.match.currentInnings === 1) { | |
| if (gameState.match.battingFirst === 'player') { | |
| playerScore.textContent = `${gameState.match.playerScore.runs}/${gameState.match.playerScore.wickets} (${Math.floor(gameState.match.playerScore.overs)}.${gameState.match.playerScore.balls % 6})`; | |
| botScore.textContent = `YET TO BAT`; | |
| matchInfo.textContent = `INNINGS 1 | OVERS: ${gameState.match.overs} | WICKETS: ${gameState.match.wickets}`; | |
| playerBatsman.textContent = `BATSMAN: ${gameState.currentBatsman.runs} (${gameState.currentBatsman.balls})`; | |
| botBatsman.textContent = `BOWLER: ${gameState.currentBowler.wickets}/${gameState.currentBowler.runs} (${Math.floor(gameState.currentBowler.balls / 6)}.${gameState.currentBowler.balls % 6})`; | |
| } else { | |
| botScore.textContent = `${gameState.match.botScore.runs}/${gameState.match.botScore.wickets} (${Math.floor(gameState.match.botScore.overs)}.${gameState.match.botScore.balls % 6})`; | |
| playerScore.textContent = `YET TO BAT`; | |
| matchInfo.textContent = `INNINGS 1 | OVERS: ${gameState.match.overs} | WICKETS: ${gameState.match.wickets}`; | |
| botBatsman.textContent = `BATSMAN: ${gameState.currentBatsman.runs} (${gameState.currentBatsman.balls})`; | |
| playerBatsman.textContent = `BOWLER: ${gameState.currentBowler.wickets}/${gameState.currentBowler.runs} (${Math.floor(gameState.currentBowler.balls / 6)}.${gameState.currentBowler.balls % 6})`; | |
| } | |
| } else { | |
| if (gameState.match.battingFirst === 'player') { | |
| playerScore.textContent = `${gameState.match.playerScore.runs}/${gameState.match.playerScore.wickets} (${Math.floor(gameState.match.playerScore.overs)}.${gameState.match.playerScore.balls % 6})`; | |
| botScore.textContent = `${gameState.match.botScore.runs}/${gameState.match.botScore.wickets} (${Math.floor(gameState.match.botScore.overs)}.${gameState.match.botScore.balls % 6})`; | |
| matchInfo.textContent = `TARGET: ${gameState.match.target} | REQUIRED: ${gameState.match.target - gameState.match.botScore.runs} (${gameState.match.overs * 6 - gameState.match.botScore.balls} BALLS LEFT)`; | |
| botBatsman.textContent = `BATSMAN: ${gameState.currentBatsman.runs} (${gameState.currentBatsman.balls})`; | |
| playerBatsman.textContent = `BOWLER: ${gameState.currentBowler.wickets}/${gameState.currentBowler.runs} (${Math.floor(gameState.currentBowler.balls / 6)}.${gameState.currentBowler.balls % 6})`; | |
| } else { | |
| botScore.textContent = `${gameState.match.botScore.runs}/${gameState.match.botScore.wickets} (${Math.floor(gameState.match.botScore.overs)}.${gameState.match.botScore.balls % 6})`; | |
| playerScore.textContent = `${gameState.match.playerScore.runs}/${gameState.match.playerScore.wickets} (${Math.floor(gameState.match.playerScore.overs)}.${gameState.match.playerScore.balls % 6})`; | |
| matchInfo.textContent = `TARGET: ${gameState.match.target} | REQUIRED: ${gameState.match.target - gameState.match.playerScore.runs} (${gameState.match.overs * 6 - gameState.match.playerScore.balls} BALLS LEFT)`; | |
| playerBatsman.textContent = `BATSMAN: ${gameState.currentBatsman.runs} (${gameState.currentBatsman.balls})`; | |
| botBatsman.textContent = `BOWLER: ${gameState.currentBowler.wickets}/${gameState.currentBowler.runs} (${Math.floor(gameState.currentBowler.balls / 6)}.${gameState.currentBowler.balls % 6})`; | |
| } | |
| } | |
| } | |
| function addCommentary(text) { | |
| const commentaryLine = document.createElement('div'); | |
| commentaryLine.className = 'terminal-line'; | |
| commentaryLine.innerHTML = text; | |
| commentary.appendChild(commentaryLine); | |
| commentary.scrollTop = commentary.scrollHeight; | |
| } | |
| function showMatchResult() { | |
| gameScreen.classList.add('hidden'); | |
| resultScreen.classList.remove('hidden'); | |
| if (gameState.match.winner === 'player') { | |
| resultTitle.textContent = 'VICTORY ACHIEVED'; | |
| resultTitle.className = 'text-3xl font-bold mb-6 text-green-500'; | |
| } else { | |
| resultTitle.textContent = 'DEFEAT ANALYZED'; | |
| resultTitle.className = 'text-3xl font-bold mb-6 text-red-500'; | |
| } | |
| resultDetails.innerHTML = ` | |
| <div class="border border-green-500 p-4"> | |
| <div class="font-bold">MATCH SUMMARY</div> | |
| <div>${gameState.match.battingFirst === 'player' ? 'Player batted first' : 'Bot batted first'}</div> | |
| <div>Player: ${gameState.match.playerScore.runs}/${gameState.match.playerScore.wickets} in ${gameState.match.playerScore.overs}.${gameState.match.playerScore.balls % 6} overs</div> | |
| <div>Bot: ${gameState.match.botScore.runs}/${gameState.match.botScore.wickets} in ${gameState.match.botScore.overs}.${gameState.match.botScore.balls % 6} overs</div> | |
| <div class="mt-2">${gameState.match.winner === 'player' ? 'PLAYER WINS!' : 'BOT WINS!'}</div> | |
| </div> | |
| <div class="border border-green-500 p-4"> | |
| <div class="font-bold">KEY PERFORMANCES</div> | |
| <div>Top Batsman: ${gameState.currentBatsman.runs} runs</div> | |
| <div>Top Bowler: ${gameState.currentBowler.wickets} wickets</div> | |
| </div> | |
| `; | |
| } | |
| // Achievements | |
| function updateAchievements() { | |
| // Check for century | |
| if (gameState.match.battingFirst === 'player' && gameState.match.playerScore.runs >= 100) { | |
| gameState.achievements.century = true; | |
| } | |
| // Check for 5-wicket haul | |
| if (gameState.match.battingFirst === 'bot' && gameState.currentBowler.wickets >= 5) { | |
| gameState.achievements.fiveWickets = true; | |
| } | |
| // Check for beating level 10 bot | |
| if (gameState.match.botLevel === 10 && gameState.match.winner === 'player') { | |
| gameState.achievements.beatLevel10 = true; | |
| } | |
| saveGameData(); | |
| } | |
| function updateAchievementsDisplay() { | |
| if (gameState.achievements.century) { | |
| centuryAchievement.textContent = 'UNLOCKED'; | |
| centuryAchievement.className = 'text-xs mt-2 text-green-500'; | |
| centuryAchievement.classList.remove('hidden'); | |
| } else { | |
| centuryAchievement.textContent = 'LOCKED'; | |
| centuryAchievement.className = 'text-xs mt-2 text-red-500'; | |
| centuryAchievement.classList.remove('hidden'); | |
| } | |
| if (gameState.achievements.fiveWickets) { | |
| wicketAchievement.textContent = 'UNLOCKED'; | |
| wicketAchievement.className = 'text-xs mt-2 text-green-500'; | |
| wicketAchievement.classList.remove('hidden'); | |
| } else { | |
| wicketAchievement.textContent = 'LOCKED'; | |
| wicketAchievement.className = 'text-xs mt-2 text-red-500'; | |
| wicketAchievement.classList.remove('hidden'); | |
| } | |
| if (gameState.achievements.beatLevel10) { | |
| botAchievement.textContent = 'UNLOCKED'; | |
| botAchievement.className = 'text-xs mt-2 text-green-500'; | |
| botAchievement.classList.remove('hidden'); | |
| } else { | |
| botAchievement.textContent = 'LOCKED'; | |
| botAchievement.className = 'text-xs mt-2 text-red-500'; | |
| botAchievement.classList.remove('hidden'); | |
| } | |
| } | |
| // Settings | |
| function loadSettingsToUI() { | |
| playerNameInput.value = gameState.playerName; | |
| textSpeedInput.value = gameState.textSpeed; | |
| commentaryDetailInput.value = gameState.commentaryDetail; | |
| } | |
| saveSettings.addEventListener('click', () => { | |
| gameState.playerName = playerNameInput.value; | |
| gameState.textSpeed = textSpeedInput.value; | |
| gameState.commentaryDetail = commentaryDetailInput.value; | |
| saveGameData(); | |
| settingsScreen.classList.add('hidden'); | |
| mainMenu.classList.remove('hidden'); | |
| }); | |
| backToMenuSettings.addEventListener('click', () => { | |
| settingsScreen.classList.add('hidden'); | |
| mainMenu.classList.remove('hidden'); | |
| }); | |
| // Navigation back to menu | |
| backToMenuResult.addEventListener('click', () => { | |
| resultScreen.classList.add('hidden'); | |
| mainMenu.classList.remove('hidden'); | |
| }); | |
| backToMenuAchievements.addEventListener('click', () => { | |
| achievementsScreen.classList.add('hidden'); | |
| mainMenu.classList.remove('hidden'); | |
| }); | |
| endGame.addEventListener('click', () => { | |
| gameScreen.classList.add('hidden'); | |
| mainMenu.classList.remove('hidden'); | |
| }); | |
| // Data persistence | |
| function saveGameData() { | |
| localStorage.setItem('digitalWicketSave', JSON.stringify({ | |
| playerName: gameState.playerName, | |
| textSpeed: gameState.textSpeed, | |
| commentaryDetail: gameState.commentaryDetail, | |
| achievements: gameState.achievements | |
| })); | |
| } | |
| function loadGameData() { | |
| const savedData = localStorage.getItem('digitalWicketSave'); | |
| if (savedData) { | |
| const data = JSON.parse(savedData); | |
| gameState.playerName = data.playerName || "USER"; | |
| gameState.textSpeed = data.textSpeed || "normal"; | |
| gameState.commentaryDetail = data.commentaryDetail || "normal"; | |
| gameState.achievements = data.achievements || { | |
| century: false, | |
| fiveWickets: false, | |
| beatLevel10: false | |
| }; | |
| } | |
| } | |
| // Helper function to start a new match (for challenger protocol) | |
| function startNewMatch() { | |
| gameState.match.role = Math.random() < 0.5 ? 'batting' : 'bowling'; | |
| gameState.match.overs = 10; | |
| gameState.match.wickets = 5; | |
| gameState.match.tossWon = Math.random() < 0.5; | |
| if (gameState.match.tossWon) { | |
| gameState.match.battingFirst = gameState.match.role === 'batting' ? 'player' : 'bot'; | |
| } else { | |
| gameState.match.battingFirst = gameState.match.role === 'batting' ? 'bot' : 'player'; | |
| } | |
| mainMenu.classList.add('hidden'); | |
| gameScreen.classList.remove('hidden'); | |
| // Reset scores | |
| gameState.match.playerScore = { runs: 0, wickets: 0, overs: 0, balls: 0 }; | |
| gameState.match.botScore = { runs: 0, wickets: 0, overs: 0, balls: 0 }; | |
| gameState.match.currentInnings = 1; | |
| gameState.match.gameOver = false; | |
| gameState.match.winner = null; | |
| gameState.currentBatsman = { runs: 0, balls: 0 }; | |
| gameState.currentBowler = { wickets: 0, runs: 0, balls: 0 }; | |
| updateScoreboard(); | |
| if (gameState.match.battingFirst === 'player') { | |
| addCommentary(`SYSTEM: PLAYER TO BAT FIRST. INNINGS 1 COMMENCING.`); | |
| startPlayerBatting(); | |
| } else { | |
| addCommentary(`SYSTEM: BOT TO BAT FIRST. INNINGS 1 COMMENCING.`); | |
| startBotBatting(); | |
| } | |
| } | |
| </script> | |
| <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://deepsite.hf.co/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://deepsite.hf.co" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://deepsite.hf.co?remix=Vision842/venture-text" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> | |
| </html> |