/Zig-Showdown

A community effort to create a small multiplayer 3D shooter game in pure zig

Primary LanguageZigEuropean Union Public License 1.2EUPL-1.2

Zig-Showdown

A community effort to create a small multiplayer 3D shooter game in pure zig

Development

Communication

The main communication happens via the Zig Showtime discord. Please join if you want to participate!

Asset Building

Assets are spread over 3 different folders:

  • assets-src: Source formats for the files that are from the original editor. Files here are for example blender or gimp project files.
  • assets-in: Intermediate asset files in commonly editable formats like png, obj. These files get compiled in the zig build assets step into a file into assets.
  • zig-cache/bin/assets: Contains the final assets that will be shipped with the game. This folder is completly auto-generated and the folder is not included in the repository.

When invoking zig build assets, the build system will search for files in assets-in and will translate them into the game-custom format which are stored in assets.

Assets that don't need to be converted will just be copied flat into the assets folder.

Translation Table

This table lists all implemented (or planned) asset file associations:

Input File Target File Extension Resource Type
*.png .tex Texture
*.tga .tex Texture
*.bmp .tex Texture
*.obj .mdl Model
*.wav .snd Sound (#9)
*.ogg .mus Music (#11)

Tools

Each tool receives three cli args:

  1. Input path: This is a path to the file that should be converted
  2. Output path: This is the target file where the final asset file should be written
  3. Asset name: This is the identifier (file path) which is used in the game can should be used to refer to other assets

Contribution

Checkout

Clone the repo and all submodules:

git clone https://github.com/zig-community/Zig-Showdown --recursive

Committing

Feel free to create a PR to this repo, but please make sure you've run zig fmt on your files to keep a consistent state.

Build

# Use this to build the project
zig build assets install

# Use this to run the game in a debug session
zig build assets run

Recommended to be built with the latest master, but Zig 0.7.0 should be fine.

The following build targets are available:

  • install: Build the software, but without assets
  • assets: Compile all assets into the required format. This is a pretty lengthy step, so use only when required: This is only necessary once or when assets are changed. Source code changes usually do not require this.
  • tools: This only compiles the tools to preprocess assets, but does not update the assets.
  • run: Starts the game client.
  • run-server: Starts a dedicated server.
  • test: Runs tests on both server and client software

The following build options are available:

Option Allowed Values Default Value Effect
default_port u16 3315 Sets the default game port
initial_state create_server, create_sp_game, credits, gameplay, join_game, main_menu, options, pause_menu, splash splash Sets the initial state of the game, changing where the game starts. This allows improved debugging for stuff like gameplay or options where waiting for the normal game flow to finish is too long.
enable-fps-counter bool true when Debug When enabled, displays a text that shows frame time in ms and frame rate in fps.
embed-resources bool false When enabled, the assets folder is embedded into the final executable, creating a single-file game.
renderer software, opengl software Sets the given value as the rendering backend for the game. This allows to exchange the used graphics APIs.
jack bool false Enables the JACK audio backend
pulseaudio bool Enabled on Linux Enables the PulseAudio audio backend
alsa bool Enabled on Linux Enables the ALSA audio backend
coreaudio bool Enabled on MacOS Enables the CoreAudio audio backend
wasapi bool Enabled on Windows Enables the WASAPI audio backend
debug-tools bool false Tools are usually built in ReleaseSafe mode for performance, but when working on the tools, it's better to compile them in Debug mode. Setting this flag does this.

OpenGL Loader

You need zig-opengl to regenerate the binding:

# assuming we are in the project repository:
SHOWDOWN_ROOT=$(pwd)

# Prepare the opengl generator
cd /path/to/zig-opengl
make generator.exe

# Create our OpenGL 3.3 + GL_ARB_direct_state_access
mono generator.exe OpenGL-Registry/xml/gl.xml $(SHOWDOWN_ROOT)/deps/opengl/gl_3v3_with_exts.zig GL_VERSION_3_3 GL_ARB_direct_state_access GL_KHR_debug