# Homework 5: Cats vs. Mice Name : Adelia Putri Student ID : 20210782 URL : http://git.prototyping.id/20210782/homework5 ## Table of Content - [Homework 5: Cats vs. Mice](#homework-5-cats-vs-mice) - [Table of Content](#table-of-content) - [Game Description](#game-description) - [Game Interface](#game-interface) - [Game Mechanics](#game-mechanics) - [Currency](#currency) - [Character](#character) - [Interactions List](#interactions-list) - [Cat Roles](#cat-roles) - [Mouse Roles](#mouse-roles) - [Implementation Plan](#implementation-plan) - [Challenges](#challenges) ## Game Description **Cats vs. Mice** is a tower defense-style strategy game inspired by *Plants vs. Zombies*, redesigned with a cute kitchen theme. Players place cats on a tiled kitchen floor to stop waves of invading mice who are after the **Cheese Feast**, a table full of cheesy dishes at the leftmost side of the screen. The player’s goal is to protect the **Cheese Feast** by defending against waves of incoming mice. To do this, the player can place different types of cats with special abilities to attack the mice. > πŸ† **Win Condition**: Successfully stops all the mice from reaching the **Cheese Feast** > ❌ **Lose Condition**: A mouse reaches the **Cheese Feast** Source: [Plants vs. Zombies GOTY Edition](https://store.steampowered.com/app/3590/Plants_vs_Zombies_GOTY_Edition/) ## Game Interface - **Background**: A 5x9 tiled kitchen floor with a light brown and white checker pattern - Will be implemented using a 2D array - **Cat Panel**: A row of clickable cat icons showing the price of each cat - **Cheese Feast**: A table full of cheese dishes on the left side of the screen - **Mice Entrance**: Mice appear from a hole in the wall on the right side of the screen - **Defense Line**: Each row has a *robot vacuum* at the far left that activates once a mouse approached it, sweeping away all mice in that row - **Cheese** (currency): Drops from `πŸ§‘β€πŸ³ Chef Cat` or randomly from the top - **Progress Bar**: Showing the progress of the game, if the progress bar is full, the game is finished Below is the rough design of the game set:

## Game Mechanics ### Currency - The currency of the game is **cheese** (replacing the sun in *Plants vs. Zombies*) - Players can collect cheese produced by `πŸ§‘β€πŸ³ Chef Cat` or dropped randomly from above - **Cheese** is used to buy different types of **[cats](#cat-roles)**, which can be placed on the 5x9 kitchen grid ### Character 1. Cats - Objective: Protect the **Cheese Feast** by attacking, slowing, or generating cheese. Each cat has a different ability and price - Cats can only be placed in empty tiles and can be replaced by new cats at a cost - See the [Cat Roles](#cat-roles) below for further description 2. Mice - Objective: Mice enter from the right side and move left toward the **Cheese Feast** - Mice will move forward in a straight line unless blocked by a cat - If a mouse reaches a cat, it will spray the cat with a water gun. When the cat is wet enough, the cat will run away, which means the mouse defeated the cat - See the [Mouse Roles](#mouse-roles) below for further description ### Interactions List | **Interaction**| **Trigger** | **Result**| |----------------|-------------|-----------| | Place cat | Mouse click on UI + tile | Deduct cheese, place cat | | Cat shoots yarn | Timer per cat | Add a yarn to the grid | | Yarn hits mouse | Collision | Mouse takes damage | | Mouse reaches cat | Collision | Mouse sprays cat, cat runs away | | Mouse reaches robot vacuum | Collision | Robot vacuum move to the right and remove all mice in the rows | | Cheese pick up | Mouse click on cheese icon | Increase cheese count | | Remove cat | Mouse click on UI + cat | Remove cat from the tile | | Mouse reaches left edge | Position check | Trigger loss state | | All mice defeated | Mouse count check | Trigger win state | ## Cat Roles | Icon | Cat Type | Ability | Cheese Cost | |------|----------|---------|-------------| | 🧢 | Single Yarn Cat | Shoots 1 yarn ball every 2 seconds | 100 | | 🧢🧢 | Double Yarn Cat | Shoots 2 yarn balls (double damage) | 200 | | πŸ’€ | Sleepy Cat | Sleeps until touched, then instantly defeats mouse that touched it | 150 | | πŸ§‘β€πŸ³ | Chef Cat | Produces cheese every few seconds | 50 | | ❄️ | Ice Cat | Slows down mice by throwing snowballs | 150 | Each cat will be an object with few common properties and methods as follows: ```js class Cat { constructor(x, y, type) { this.x = x; this.y = y; this.type = type; // 'yarn', 'double', 'sleepy', 'chef', 'ice' this.cost = 0; this.health = 100; } draw() { ... } update() { if (this.type === 'chef') this.generateCheese(); else if (this.type === 'yarn') this.shoot(); else if (this.type === 'double') { this.shoot(); this.shoot(); } // Implementation for Chef Cat and Ice Cat } shoot() { ... } generateCheese() { ... } } ``` ## Mouse Roles | Icon | Mouse Type | Description | Appearance | |------|--------------|-------------|------------| | 🐭 | Basic Mouse | Walks slowly, standard HP (100) | Early Game | | ⛑️ | Helmet Mouse | Wears cheese pot as helmet, high HP (150) | Mid Game | | πŸƒβ€β™‚οΈ | Sporty Mouse | Moves quickly (1.25x Basic Mouse), low HP (75) | Mid Game | | 🐁 | Boss Mouse | Very slow, very high HP (500)| Late Game | Each mouse will be an object with few common properties and methods as follows: ```js class Mouse { constructor(row, type) { this.row = row; this.x = CANVAS_WIDTH; this.type = type; // basic, helmet, sporty, boss this.speed = 1; this.health = 100; } move() {...} attack(cat) {...} takeDamage(amount) {...} die() {...} } ``` ## Implementation Plan The game will be implemented in JavaScript using p5.js. The project will follow an object-oriented approach, using classes and modular files to organize different parts of the game. States to be updated every frame: - Cat's state: shooting, generating cheese - Mice's movement and health points - Cheese production - Checking win/lose condition To track the game, a class `CatsVsMice` will be roughly implemented as follows ```js class CatsVsMice { constructor() { this.grid = createGrid(); this.cats = []; this.mice = []; this.cheese = 50; this.play = "play"; // option: "play", "win", "lose" } update() { this.updateCats(); this.updateMice(); this.updateCheese(); this.checkWinLose(); } } ``` Additional Libraries and Sources: - Animation: p5.play - Sound Effects: p5.sound - Character visual: open sources like https://opengameart.org/ or will be manually drawn ## Challenges 1. Collision detection between objects (mouse and yarn, mouse and cat) 2. Applying the animation 3. Handling overlapping objects