/cs488-project

CS488 final project

Primary LanguageC

CS488 Project

A first-person shooter game engine written for the CS488 final project.

The name "Kefka" comes from the main antagonist of my favorite game, Final Fantasy VI. I've thought of this project as the "final boss" of my degree, so this name felt appropriate.

Building and Running

Ensure the repo is cloned with submodules. A single premake5 script is used to build the source and libraries:

$ premake5 gmake2 && make

Run the binary in the root directory (or else assets will fail to load):

$ ./fps

UI

The main menu has two buttons: one that lets you start the game, and another that lets you tweak game parameters. The following can be changed from the options menu:

  • World size
  • Floor texture
  • Wall texture
  • Enemy texture
  • Skybox

Pressing the s key at any time in the main menu will start the game with the currently selected parameters.

Controls

The game is controlled using the mouse and keyboard. If you've played a first-person shooter on PC in the last 25 years, the controls should feel intuitive. In case you haven't:

  • w: move forward
  • a: move left
  • s: move back
  • d: move right
  • space: jump
  • left shift: hold to sprint
  • r: respawn enemies
  • escape: close game

The mouse is used to look around the world, and the left mouse button shoots.

Libraries and Assets

Credit for all libraries and assets used in this repo go to their respective owners. The list of libraries and assets used are detailed in the following subsections.

Libraries

Assets

Objectives

The project implements the first 8 objectives. The full list of objectives is as follows:

  1. Model the scene for the player to move around in.
  2. Main menu user interface that the player interacts with to start the game.
  3. Texture mapping.
  4. Particle system.
  5. Synchronized sound corresponding to player actions.
  6. Static collision detection of surrounding environment.
  7. Dynamic collision detection of bullets fired by the player with enemies in the environment.
  8. Physics engine with friction and gravity.
  9. Shadows using shadow mapping (partially implemented, see the shadow-mapping branch).
  10. Keyframe animation using linear interpolation (unimplemented).