Giter Club home page Giter Club logo

zemeroth's Introduction

title image

Github Actions dependency status mit license line count

Zemeroth is a turn-based hexagonal tactical game written in Rust.

Support: patreon.com/ozkriff

News: @ozkriff on twitter | ozkriff.games | facebook | devlog on imgur

Online Version

You can play an online WebAssembly version of Zemeroth at ozkriff.itch.io/zemeroth

Precompiled Binaries

Precompiled binaries for Linux, Windows and macOS: github.com/ozkriff/zemeroth/releases

Screenshots

"big" screenshot

"campaign" screenshot

web version of a phone

Gifs

main gameplay animation

Videos

youtube.com/c/andreylesnikov/videos

Vision

The initial vision of the project is:

  • Random-based skirmish-level digital tabletop game;
  • Single player only;
  • 3-6 fighters under player’s control;
  • Small unscrollable maps;
  • Relatively short game session (under an hour);
  • Simple vector 2d graphics with just 3-5 sprites per unit;
  • Reaction attacks and action’s interruption;
  • Highly dynamic (lots of small unit moves as a side effect of other events);
  • Intentionally stupid and predictable AI;

Roadmap

  • Phase One: Linear Campaign Mode

    An extended prototype focused just on tactical battles.

    • v0.4
      • Basic gameplay with reaction attacks
      • Minimal text-based GUI
      • Basic agent abilities: jumps, bombs, dashes, etc
    • v0.5
      • Basic campaign mode
      • Armor and Break stats (#70)
      • Dynamic blood splatters (#86)
      • Web version
      • Tests
      • Hit chances
    • v0.6
      • Agent upgrades (#399)
      • Flip agent sprites horizontally when needed (#115)
      • Multiple sprites per agent type (#114)
    • GUI icons (#276)
    • Sound & Music (#221)
    • Reduce text overlapping (#214)
    • Move back after a successful dodge (#117)
    • Easing (#26)
    • Path selection (#280, #219)
    • Intermediate bosses
    • Main boss
    • Neutral agents (#393)
    • Weight component (#291)
    • Basic inventory system: slots for artifacts
    • Ranged units
    • More agent types
    • More passive abilities that allow agents to make actions during enemy's turn (#354)
    • More complex multieffect abilities/actions
    • Guide (#451)
    • Save/load (#28)
    • Android version
  • Phase Two: Strategy Mode

    A not-so-linear strategic layer will be added on top of tactical battles. Simple non-linear story and meta-gameplay.

    • Global map
    • Dialog system
    • Quest system
    • NPC/Agent/Masters system

Inspiration

Tactical battle mechanics are mostly inspired by these games:

Building from Source

Install all miniquad's system dependencies.

cargo install resvg
./utils/assets_export.sh
cargo run

WebAssembly

cargo install resvg
./utils/assets_export.sh
rustup target add wasm32-unknown-unknown
./utils/wasm/build.sh
cargo install basic-http-server
basic-http-server static

Then open http://localhost:4000 in your browser.

Dependencies

The key external dependency of Zemeroth is macroquad/miniquad.

This repo contains a bunch of helper crates:

  • zcomponents is a simple component storage
  • zgui is a simple and opinionated GUI library
  • zscene is a simple scene and declarative animation manager

Also, resvg is used for exporting sprites from svg.

Contribute

If you want to help take a look at issues with help-wanted label attached:

github.com/ozkriff/zemeroth/labels/help-wanted

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

License

Zemeroth is distributed under the terms of both the MIT license and the Apache License (Version 2.0). See LICENSE-APACHE and LICENSE-MIT for details.

Zemeroth's text logo is based on the "Old London" font by Dieter Steffmann.

zemeroth's People

Contributors

ajmeese7 avatar anthonymikh avatar debris avatar dylanhart avatar efyang avatar eoan-ermine avatar horki avatar ltfschoen avatar nickelc avatar not-fl3 avatar ozkriff avatar stanislav-tkach avatar timcryt avatar vrixyz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

zemeroth's Issues

Throwable bombs

You throw it and it explodes on the next turn.

Like in Hoplite:

image

häte: `pub(super)` -> `pub(crate)`

$ git grep "pub(super"
hate/src/context.rs:    pub(super) fn new(tx: Sender<screen::Command>, settings: Settings) -> Context {
hate/src/context.rs:    pub(super) fn load_texture<P: AsRef<Path>>(&mut self, path: P) -> Texture {
hate/src/context.rs:    pub(super) fn clear(&mut self) {
hate/src/context.rs:    pub(super) fn should_close(&self) -> bool {
hate/src/context.rs:    pub(super) fn flush(&mut self) {
hate/src/context.rs:    pub(super) fn font(&self) -> &rusttype::Font {
hate/src/context.rs:    pub(super) fn factory_mut(&mut self) -> &mut gfx_device_gl::Factory {
hate/src/context.rs:    pub(super) fn draw_mesh(&mut self, mvp: Matrix4<f32>, mesh: &Mesh) {

Willpower and Exertion

I'm not sure if the game really needs them (xcom-like abilities with cooldowns should emulate this to some extent), but it would be cool to build a prototype.

How they work in BS (from https://bannersaga.gamepedia.com/Stats):

Willpower (WP or WIL) measures a unit's capacity to perform actions that exceed its regular 'potential'. These actions can be any of the following:

  • Move longer (more tiles) than normal.
  • Inflict more damage to an enemy unit's Strength or Armor.
  • Use an active ability.

Points of Willpower are spent (depleted) when a unit executes these feats; when Willpower runs out, then the unit can only perform normal movement and attacks.

The amount of Willpower that can be spent for extra movement & damage cannot exceed the unit's Exertion stat (see below). The amount of Willpower spent on an active ability is only limited by the Rank of the ability that the unit desires to use; abilities of Rank-{1,2,3} cost {1,2,3}WP, respectively.

Willpower can be replenished by the following means:

  • Resting: If a unit terminates his turn without neither moving, nor attacking, nor using an active ability, then 1WP is restored.
  • Using 'The Horn', a magic item fueled by knocking-out enemies.
  • Specific abilities, granted by allies or equipped items (only for the single-player game).

The maximum Willpower of a unit cannot be exceed by these mechanisms.

Exertion (EX or EXE) dictates how much Willpower a unit can use to boost its movement or attack damage. You are not restricted to using Willpower for only one action per turn, since you can only boost each action for as much Willpower you have left and what your Exertion allows.

Example: A unit with 2 Exertion and 4 Willpower can (a) move 2 extra tiles, and/or (b) do 2 more damage.

Exertion is a fixed stat that can only be temporarily decreased (zeroed) by a specific active ability in the single-player game. Note that units are normally allowed to have zero Exertion, meaning that they can only use their Willpower for active abilities. Currently available Exertion range is between 0-3.

Armor and Break stats

"Armor" is defensive stat, "Break" is offensive.

From Banner Saga:

Armor (ARM) serves as a defense rating denoting how vulnerable is a unit to attacks. Specifically, Armor protects a unit's Strength by decreasing incoming damage.

Break (AB or BRK) is the amount of direct damage a unit can naturally do to a target's Armor and reduces the enemy's Armor according to said amount.

More unit types

  • imp
  • fast imp
  • imp summoner
  • toxic imp
  • giant crab
  • grenade imp
  • swordsman
  • spearman - #65
  • bomb thrower - #69
  • warhammer guy
  • two-axes guy
  • axe-and-shield guy
  • big-axe guy
  • archer
  • crossbowman

mockup:

Re-enable master branch protection

I've disabled it temporary as there're some issues with appveyour:

https://ci.appveyor.com/project/ozkriff/zemeroth/build/1.0.38/job/kw4dcp03nm0s4k9l

Build started
git clone -q --branch=i31_pop_up_messages https://github.com/ozkriff/zemeroth.git C:\projects\zemeroth
git checkout -qf 217100d56a99da820817f50097f5a9ba23eef5ab
Restoring build cache
Cache 'C:\Users\appveyor\.cargo\registry' - Restored
Running Install scripts
set PATH=C:\msys64\usr\bin;%PATH%
set PATH=C:\msys64\mingw32\bin;%PATH%
if "%TARGET%" == "x86_64-pc-windows-gnu" set PATH=C:\msys64\mingw64\bin;%PATH%
curl -sSf -o rustup-init.exe https://win.rustup.rs
rustup-init.exe --default-host %TARGET% --default-toolchain %CHANNEL% -y
info: syncing channel updates for 'stable-i686-pc-windows-gnu'
error: could not download file from 'https://static.rust-lang.org/dist/channel-rust-stable.toml.sha256' to 'C:\Users\appveyor\.rustup\tmp\hxecc8aukt3fbk29_file'
info: caused by: error during download
info: caused by: [35] SSL connect error (schannel: next InitializeSecurityContext failed: Unknown error (0x80092013) - The revocation function was unable to check revocation because the revocation server was offline.)
Command exited with code 1

and travis (on OSX beta and nightly):

https://travis-ci.org/ozkriff/zemeroth/jobs/255141489

Re-animate ozkriff.github.io blog

I need a place to post monthly reports and things like that. Using rust forum (as I've done for ZoC) isn't the best option in the long-term perspective.

It would be cool to switch the blog to some Rust generator like cobalt.rs but it seems like none of them support restructuredtext format and I really want to use it.

  • Translate blog's interface to English
  • Translate "about" page to English
  • Add link to twitter
  • Copy ZoC's monthly reports from forum
  • Write a post with the postmortem for ZoC and first Zemeroth's announcement / monthly report
  • Add a short version of postmortem to ZoC's readme (and a link to the full post)
  • Remove "Contribute" section from ZoC's readme
  • [ ] Post "unpublished" drafts (russian)
  • [ ] Add link to the blog to Zemeroth's readme
  • [ ] Fix appearance on mobile by fixing the css - pixels everywhere! X-| - or by changing the theme
  • [ ] embedded youtube videos

Block user input during command execution

I think that there're should be a timer in Game screen for this. The blocking time should be based on modified visualize_events output:

pub fn visualize_event(
   state: &State,
   view: &mut GameView,
   context: &mut Context,
   event: &ActiveEvent,
) -> (Time, Box<Action>) {
   ...

as it's visualize_event who knows about separation between important and cosmetic scene actions.

Strength

Right now units die from a single hit. That won't work well with reactions attacks (#25). Units should have some kind of basic hit points.

I'm going to call this unit's property "Strength" - like in Banner Saga, as I'm going to use this later as an attack modifier too.

image

Grass

Draw some decorative grass sprites on the battlefield.

image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.