# OGG A janky boomer shooter built in Unity. Cruelty Squad aesthetics, boomer shooter mechanics. Deliberately ugly. --- ## Project Structure ``` Assets/ Scripts/ — all game code Items/ — ItemDefinition ScriptableObjects Models/ — 3D assets Prefabs/ — weapon and enemy prefabs Scenes/ — game scenes ``` --- ## Systems ### Player **`FirstPersonController.cs`** Standard FPS controller. WASD + mouse look, sprint with Left Shift, jump with Space. Mouse look and movement are automatically frozen when the inventory or dialogue is open. **`Player.cs`** Tracks health and stamina. Stamina drains while sprinting and regenerates at rest. Exposes `HealthFraction` and `StaminaFraction` for the HUD. --- ### Combat **`SimpleGun.cs`** / **`WeaponManager.cs`** / **`WeaponViewmodel.cs`** Weapon firing, switching, and first-person viewmodel rendering. Weapons are defined as prefabs with an `ItemDefinition` ScriptableObject. A custom editor tool automates prefab generation and includes a live positioning workflow for viewmodel placement. **`WeaponBob.cs`** Applies positional bob to the viewmodel while moving. **`EnemyHealth.cs`** / **`EnemyHeadHitbox.cs`** Enemies take damage from gunfire. Headshots via a dedicated hitbox component are one-shot kills; body shots require multiple hits. **`CameraShake.cs`** Triggered on fire and on taking damage. --- ### Enemies **`HumanoidEnemy.cs`** Procedurally generated humanoid enemies with three types: | Type | Role | |---|---| | Grunt | Balanced melee + ranged | | Runner | Fast melee rusher | | Brute | Slow, heavy, high damage | Enemies chase, attack in melee range, and shoot at range. AI uses Unity's `CharacterController` with custom state logic (idle → chase → attack). **`EnemySpawner.cs`** Spawns enemies into the scene. --- ### Inventory **`Inventory.cs`** Grid-based inventory opened with Tab. Supports weapons and equippable non-weapon items. Right-click context menu for equipping/dropping. Pauses mouse look when open. **`ItemDefinition.cs`** ScriptableObject defining an item: name, icon, type, weapon prefab reference, and equippable stats. **`PickupItem.cs`** Attach to any world object to make it a pickup. Spins and bobs in the world. Supports full `ItemDefinition` or a simple name fallback. **`StaminaBoostPickup.cs`** / **`BootsEffect.cs`** "Bunny Hop Boots" equippable item. Grants a passive stamina boost rather than Quake-style bunny hopping — more accessible, still rewarding. --- ### HUD **`PlayerHUD.cs`** Draws health and stamina bars in the bottom-left corner using Unity's immediate-mode GUI (`OnGUI`). Bars smooth-interpolate, pulse red at critical values, and have 25% segment tick marks. Includes a colour-coded speedometer (green → yellow → red). **`RadarHUD.cs`** Circular mini-map in the top-left corner. Rotates with the player so "up" always equals forward. | Blip | Colour | Shape | |---|---|---| | Player | White | Round | | Enemy (`HumanoidEnemy`) | Red (pulsing) | Round | | NPC (`DialogueNPC`) | Green | Round | | Pickup (`PickupItem`) | Yellow | Square | Enemies beyond radar range are clamped to the disc edge. Scene is re-scanned every 0.25 seconds. **`SimpleCrosshair.cs`** Minimal crosshair overlay. --- ### Dialogue **`DialogueNPC.cs`** Attach to any world object (NPC, terminal, sign, etc.) to make it interactable. When the player looks at it within range, a floating `[E] Talk` prompt appears in world space. Press E to open the dialogue box. Configurable per object: - `interactRange` — how close the player needs to be - `interactAngle` — how directly they need to be looking - `lines[]` — array of speaker/page blocks (fill in the Inspector) **`DialogueManager.cs`** *(singleton)* Renders the dialogue box at the bottom of the screen. Typewriter text effect, page dot indicators, speaker name bar. Unlocks the cursor while open and re-locks it on close. Controls while dialogue is open: | Key | Action | |---|---| | E / Space / Enter | Advance page (or skip typewriter) | | Escape | Close immediately | Rich text tags (``, ``, ``) work in dialogue body text. **`DialogueLine.cs`** Serializable data class. One `DialogueLine` = one speaker with an array of text pages. Multiple `DialogueLine` entries per NPC chain speakers together. --- ## Setup Cheatsheet | What | Component | Where to attach | |---|---|---| | Player movement | `FirstPersonController` | Player GameObject | | Health / stamina | `Player` | Player GameObject | | HUD bars + speedo | `PlayerHUD` | Player GameObject | | Mini-map radar | `RadarHUD` | Player GameObject | | Dialogue system | `DialogueManager` | Any persistent GameObject (e.g. a "Managers" empty) | | Make something talkable | `DialogueNPC` | The NPC / object | | Make something a pickup | `PickupItem` | The pickup object | | Make something an enemy | `HumanoidEnemy` + `EnemyHealth` | Enemy GameObject |