A Year in Retrospect: 2023


2023 - A Year in Retrospect

The Beginning and Current State

With any project there is a place where the idea began. For Elementyle, the true beginning of the game came from AI image generation. Initially working on a different project idea, the idea of using these images to act as the art for pieces in some sort of board game started. I wanted the mechanics of the game to pull from games like Chess (and to some extent an old PS2 title called Yu-Gi-Oh! Capsule Monster Coliseum) but with some gameplay and thematic additions. Focusing more on the claiming of tiles on the board and strategic control of those tiles, Elementyle has grown from the initial one element concept to a total of three playable elements: Fire, Water, and Wind. 

The initial ruleset for the game:

  • Players place pieces on the board in their respective spawn zones to claim tiles on the board.
  • Each piece has a mana cost and a set of effects with different activation triggers.
  • Players have 300 seconds for each turn.
  • A list of Keywords:
    • Advance - Activates after a piece moves.
    • Awaken - Activates when a piece recovers from exhausted or dormant.
    • Capture - Activates when a piece captures an enemy piece by moving to that piece's tile.
    • Claim(able) - Any tile not controlled by the player. Must be a valid tile (on the board).
    • Contact (Fire Only) - Activates when a Fuel/Burner subtype piece is directly next to a Burner/Fuel piece respectively in a cardinal direction.
    • (Effect) Counter - A value used by some piece effects.
    • Destroy - Removes a piece from the board.
    • Dormant - Piece status applied by piece effects. Prevents the piece from acting for some number of turns.
    • Exhausted - Piece status applied after a piece takes an action e.g. moving, fortifying.
    • Fortify - Expend one (1) mana to activate. Applies the exhausted effect.
    • Hold - Activates when the controlling player's turn ends and this piece is not exhausted or dormant.
    • Spawn - Place a new piece on the board. Max unit limit applies.
  • Each player starts with 1 mana and gains one mana each consecutive turn (from 1 to 2 to 3 and so on) up to a maximum of 5. 
  • The first player to claim more than half the board wins. 
  • Pieces are exhausted the turn they are added to the board.
  • Each player may only have one ultimate piece (this was actually broken until mid-water set... oops...)
  • Players may have up to 5 pieces on the board.

The current game state is far from complete, but allows for a repetitive gameplay loop with (hopefully) few major gameplay errors. It's my hope to continue working on improving the game that has slowly taken shape over the roughly 7 months the game has been in development. If you'd like to just read more about where the game is heading or what my outlook for updates in 2024 looks like currently, scroll down to the bottom of this post. If you want to get more familiar with the game and follow the initial development, read on!

The First Set: Fire

Without wanting to dedicate too much time initially to the game, as well as not wanted so much added complexity initially, there was for a time only one (1) playable set in the game: Fire. This set was purposefully designed to be simple with only a few piece combos and a fairly simple set effect activation trigger in Contact. Contact is activated by placing a piece directly next to another along the cardinal directions. The other catch with the fire effect is the Subtype system: something completely unique to the Fire set (for now). Think of it like North and South or Positive and Negative; in order to make a Contact effect you need one piece to be a Burner and one to be Fuel. 

The overall goal with the fire pieces was to thematically inspire the ideas of fire and explosiveness into the pieces' effects and actions. The simple effects of the fire pieces were easy to implement and, initially, the game was only playable on a single local client (local 1v1). Once some UI updates were made and prep work was done (read: copying all the logic for the game over to the server for authoritative matchmaking), multi-player was running (and horrendously buggy).

Weeks of fixing, testing, and optimizing as well as migrating code into the server later and fire was finally stable. There were still issues, although the scope and impact of these issues was diminishing. My immediate next (brilliant) idea: Add a new set.

The Water Set and How Bad It Started Out

Looking back now, the initial effect for the Water set was... awful. It was so incredibly hard to activate reliably and in addition was attached to likely the most complex piece in the set at the time, and possibly still now. During the initial testing phase for Water, the set effect Flow had the activation trigger: Activates when this piece consumes the last of your mana. 

The problem with this effect trigger was two fold:

  1. The condition for activation means no matter how many pieces with a flow effect you have, you could only theoretically activate one (given the pieces at the time).
  2. The ways the trigger could be activated were limited to three theoretically and two practically, which was even more limiting, especially since one of those ways was when the piece was played on the board.

I'll touch more later on how this problem was resolved, but for now just bear in mind how absolutely awful the piece Undertow was.

As more and more major issues with Water (and consequently its interactions with Fire) were resolved, the urge to add some additional complexity became too much to push down, resulting in the first multi-set update of new pieces.

New Pieces!

Wanting to add a little more diversity in the games and sets, two new pieces were designed, one for each set. For Fire, the Splinter of Vinthyl, a 3-mana fuel piece; and for Water, Shimmering Tide, a 2-mana piece. These pieces were intentionally designed to be in different mana cost groups to prevent the initial pieces for all sets from having the same pieces to alternate out. While there may in the future be more flexibility around what pieces and piece costs players will bring into a match, current trend (in this past tense) was to keep piece costs in a range of 1-4. 

The introduction of these pieces introduced some new challenges (read: bugs) and over time resulted in various systems being rewritten for simplicity moving forward. This was a great exercise to add new pieces as I could find pain points in the process and fix them before I added a whole bunch more (because of course). At this time there were a lot of client side changes being made, UI updates and generally cleaning up bad designs or general mistakes before (there were chat boxes with no moderation capability at all. While redesigning the UI it was deemed best to just remove this until it could be properly implemented). The next major update was some rule changes, so let's take a look at those.

Rules Updates # 1

  • Players have 300 120 seconds each turn (this was horrible and is now 180 seconds per turn).
  • Updated Keywords
    • Flow (Water Only) - Activates when a piece consumes the last of your mana. (Nope still not fixed yet)
  • Players may have up to 6 pieces on the board.
  • Max mana increased from 5 to 7.

At this point in development, stability was the number one priority (and would remain so for the next 3 months). Making sure the game state between the client and server was consistent, codified in a shorthand format, and properly updated and managed was a long and difficult task. The focus on all the changes was ensuring that the client is responsible for nothing. It's best to think of the client as a display which takes specialized instructions. The client and server both start with the same board state, and as each player makes valid move requests, the server updates its state and generates an update string (list of numbers, letters, and symbols) telling the client what board actions to take. The server and client must always agree on the board state otherwise the match terminates.

The other focus during this time was on starting to track stats, things in the game such as how many times each piece has been played, how many tiles the player had captured, how much mana the player refunded, pieces captured, etc. and aggregating this across all games. The initial idea for this information was to create an achievements system to tie to unlockable items such as new pieces, cosmetics, and other in-game goodies. So far, the play stats are being tracked but not tied to anything yet. It's also possible at any time that a refresh of stats will occur (the game is in Alpha after all) but hopefully this will become less and less frequent as time moves on. After some annoying problems (read: multiplayer networking code), it was finally time for me to do the most obvious thing: add another set of pieces!

Wind Set and How it Broke Everything

Oh boy, what a headache this was. Implementing the Wind set was such a massive undertaking where design totally had no perspective with technical complexity (realistically it was more just technical debt that had to be paid to accommodate this significantly more complex set). In the process of implementing this set into the game, I'm pretty sure I broke almost every system that I could. Various systems required entire reworks (the movement calculation system, the piece status system, a brand new player status system, an entire developer console and the requisite commands, the piece selection menu) and the list goes on... Needless to say, this set was an extensive rework and it allowed me to do similar to what I did with testing adding new pieces, the  practice of adding a new set. Wind was also the most complex set I created. The unique effects and piece move shapes were demanding to make functional but the result is a very interesting play experience. The set effect Slipstream is unique thus far and I'll leave the explanation below in the latest rules and keywords update. Wind went through significantly more iterations than Fire and Water, probably even combined. I spent weeks testing different effects and move types for the pieces until I ended up with the current setup. As a consequence of these staggering 10+ move shapes being added, I felt it appropriate to revisit some other pieces in the other sets to give some new shapes to, namely the ultimate pieces.

Rules Update # 2

  • Updated / New Keywords
    • Slipstream (Wind Only) - Activates when a piece lands on a tile marked Slipstream. Wind pieces mark tiles they move from as Slipstream. Can also be applied by piece effects.
    • Mark - Sets the tile effect of a given tile. Only one mark can be applied per tile.
    • Flow ( Water Only) - Activates when a given piece consumes the first, last, or no mana (finally fixed, much better).
  • Living Blaze (Fire Ultimate) move shape changed from 3 Dynamic 8-Way to 2 Starburst. (More on this down below).
  • Wrath of the Drowned (Water Ultimate) move shape changed from 3 Dynamic Cross to  1 Checkerboard1. (Again, more on this below).
  • Turn limit increased from 120 to 180 seconds.

Move Shapes v1

My initial move shapes that I was using for pieces were fairly limited (and in hindsight, distant from the fundamental concept utilized in v2). As a result, many pieces shared move shapes with different sizes for balancing purposes. While this is still true today (and will be true in perpetuity of the universe as more pieces get added), while attempting to balance the Wind pieces I found myself needing more complex shapes in order to properly balance the set. But before that, I'll go over the initial shapes.

Cross Move
Cross Move
Moves where tiles are validated in the cardinal directions.
Diagonal Move
Diagonal Move
Move where tiles are validated along diagonals
Dynamic 8-Way Move
Dynamic 8-Way Move
Moves where tiles are validated in all directions at all move size steps.
Fixed 8-Way Move
Fixed 8-Way Move
Moves where tiles are validated in all directions at a fixed move size.

Pieces could move in only one of four ways and all of these were iterations on the same concept: move along some or all of the 8 directions (cardinal + diagonal) for the given move size, blocking moves when encountering enemy pieces and allowing pieces to hop over allies. The way these move shapes were being generated was simple but designed to scale as more pieces were added. The problem was there are only 4. Assuming the move sizes 1, 2 and 3, that is only 3x4 = 12 different move shapes (technically 11). This is what I would call Move Shapes v1, and it became clear when adding the third set of pieces to the game that it wasn't enough. I needed new move shapes and I came up with the perfect solution: compound move shapes.

Move Shapes v2

In order to unlock the full potential of move shape variety, I added one shape primary and remove another. What I had realized is that all varieties of moves for any given piece can be expressed as some combination of three fundamental primary shapes: Crosses, Diagonals, and L's. To put it in a more common perspective: the Rook, the Bishop and the Knight. The 8-Way move structure itself was a compound move structure (and in the code is now treated as such). 

By reworking this system to support building L, cross, and diagonal shapes, I made a slight control change to allow for recursive calls to the function for compound shapes, allowing for a variety of new pieces like below. Note that these aren't all of the move shapes possible, only the ones that have been implemented as of now.

Box Move
Box Move
Moves where tiles are validated in a box around the piece
Checkerboard1 Move
Checkerboard1
Moves where tiles are validated along linking diagonals
Checkerboard2 Move
Checkerboard2
Moves where tiles are validated on inverse linking diagonals. (Diagonals which are orthogonal to the piece)
L Move
L Move
Moves where tiles are validated on a give L shape

Starburst Move
Starburst Move
Moves where tiles are validated along an L and Diagonal move shape

A little more on the L shapes as I think they deserve a little extra explanation. The way these shapes are formatted and evaluated is as follows, we'll use the move shape for the Wind piece Supercell which is 3.2-L.

To determine which tiles to evaluate for possible moves, we move 3 tiles along each cardinal direction. Then, we move 2 tiles in the perpendicular cardinal directions (if we initially moved North/South, we would now move East/West respectively and vice versa). This move structure is modeled after the Knight in Chess.

A question may have crossed your mind at this point: why?  Great question. Let's look more at the Wind set, the design behind it, and what led to this seemingly unnecessarily complex rework.

Design of the Wind Set and Balance

For the first time (aside from Water's very unusable set effect, now fixed), balance became an issue while initially testing the Wind set. I couldn't find the right mix of moves and effects that allowed Wind to function the way I wanted while not being either totally overpowered or totally worthless. The limitation of the initial move shapes was hitting hard as the only way to add more power to the pieces was to make them far too powerful.  What I needed was a way to layer piece move shapes in a way that made Wind more dependent on precise piece placement while also limiting the number of tiles any given piece could move to (for those pieces where it was especially important to do so). The main cause of this was the set effect Slipstream. The fundamental problem was that the more tiles a given piece with a slipstream effect could move to:

  • The more forgiving the piece is in regards to poor placement.
  • The more likely it is the piece can move to a tile occupied by an ally piece or a randomly generated Slipstream effect.

Thus, move shapes v2 was created and a large array of new moves were added. This change was massive and resulted in some exhaustive issues (read: getting the client and server to agree on which tiles a piece could move to). By this time I had implemented the AI and had been using it mostly as a diagnostic tool but also a fallback for matchmaking where being queued for too long resulted in a match with the computer (did I really not mention that?)

Computer Opponents and The Present Day

At some point during debugging of the Water set, I realized my need for more autonomous testing. Playing simple matches over and over through a few moves each time while fixing the core functionalities was one thing. Testing entire games became a time-consuming endeavor. After several weeks to a month of work, the AI opponent that is being used today was finished. There are lots of problems, components missing, and its horribly inefficient, but I'll be covering this in a future dev log (likely March but may touch on this in February). The computer opponent was a very challenging implementation, but doing so allowed me to find issue after issue and fix them incredibly fast, making the game significantly more stable today.

And that brings us to the present. With three sets added, a rudimentary computer-controlled opponent, and some basic systems in place, Elementyle is a playable game, albeit a bit empty at the time. There's good variety in the play but not too much attention was placed on balance outside of making the sets roughly even. Once the upcoming reworks are done and the full testing suite is finished, balance will be something I can not only put a little more attention into, but something I can apply data to in order to make more educated adjustments where necessary. And on the topic of upcoming reworks, I have a list of updates I'm looking to implement this upcoming year and hopefully bring the game even closer to the transition to Beta.

 Looking Forward - Plans and Changes for 2024

A few things I want to touch on here:

  • What kind of communications / discussions are going to be provided / available moving forward?
  • What updates are slated for 2024?
  • What updates are being considered, whose priority can be shifted based on feedback / community development?

To start off, the update cycles for these dev logs and their video counterparts will be done on a monthly basis, potentially with the End of December / January post being the Yearly Lookback (as well as touching on the changes from December) though these may be split into two separate posts, depending on length. Until further notice, updates will be hosted here on Itch.io as well as YouTube for video posts. In these posts I'll be going over various different aspects of development at a high level, such as design decisions being made, a peek at some technical systems that received extra focus and their justification, as well as progress on updates provided below.

Looking forward, there is a pretty comprehensive list that I want to target for updates that boil down to a few high-level points:

  • Server and computer opponent rework.
  • Improve the flexibility of play options.
  • Introducing player profiles, match history, replays, and in-game action review.
  • Finish adding the core sets, their pieces, and the final slated piece type.

These core ideas capture the entirety of the changes to be made, but a full list is available below. If you aren't interested in digging too deep, feel free to skip beyond to the brief beyond the list.

  • Server Rework
    • Performing a migration of the match handling code from Lua to Go. Performance issues have led to a need for a more robust system to work with, as well as significant optimizations for computer driven balancing tests.
    • Splitting server code into three parts: Server Logic, Game Logic, and MoveEngine Logic.
      • Server logic consists of the connective code to allow clients to interact with the match via the networking platform.
      • Game logic consists of all logic required for validation of moves and managing game state for the match.
      • MoveEngine logic consists of all logic required for the measurement and evaluation of moves for computer opponents.
  • MoveEngine Optimization
    • Implementation of piece Guard / Attack logic.
    • Move Delta Pruning
      • Removing poor quality moves from the evaluation structure to reduce cycles needed to evaluate a turn.
    • Parallelization
      • Splitting initial move evaluation starting points into separate threads for faster evaluation.
    • End Turn Evaluation
      • Provide the MoveEngine context around what happens after a turn ends to properly evaluate moves.
    • Time-Based Evaluation Escape
      • Remove the iteration cap and implement / test a time-based evaluation cap.
  • Play Menu Rework
    • Adding options for player-only matches, player matches with a variable delay to default to computer, and computer only practice.
  • AI Rank Integration
    • Tuning the MoveEngine to dynamically increase / decrease computer move quality based on player rating / player performance.
    • Update play settings to allow for competitive (rating impacting) matches between dynamically scaling AI or players, and for practice matches against dynamic AI / AI presets.
  • Player Profiles
    • Adding a new view for player stats and information.
  • Match History
    • Extending player profiles to include more details and information about recently played matches.
  • Match Replay
    • Extend match history to allow for downloading and review of matches played.
    • Begin setting the groundwork for spectator mode.
  • Action Review
    • Add a new in-game UI component to allow for the review of effects and moves made each turn.
      • Each turn has a set of moves.
      • Each move has a set of effects.
      • Each effect describes a change to the board state.
  • Earth Set
    • Design and implementation of the fourth and final element set slated for Alpha / Beta.
  • New Pieces
    • 2-3 new pieces per set.
  • Signature Pieces
    • New piece type (possibly the last for now).
    • 1 piece per set (for now).
    • Placed on the board at the beginning of the match.
    • Limited to 1 Dynamic 8-Way move shape (1 tile in any direction).
    • Cannot be placed again once captured or destroyed.
    • Special passive effects.
    • Signature Gems
      • Collectable augments that change or add to the effects provided.

There's a lot to work on to say the least. This list doesn't even include everything I've begun conceptualizing and working on. Some other features that are in the works but not yet slated for development:

  • Alternative Authentication Methods
    • Google OAuth2
    • Itch.io Integrated Login
  • Friend List / Friends
  • In-Game chat channels with self and global moderation capability.
  • Direct messaging
  • Achievements
  • Cosmetic Items
    • Piece art variants
    • Borders
    • Profile Banners
    • Icons
    • Titles
  • Seasonal Events, Tournaments, and Leaderboards
  • Mobile Support / Touchscreen Controls

Closing Thoughts

Working on this game has been an incredible experience with lots of new challenges. My hope for this project is to make a fun and challenging strategy game that I can grow and add to over time. I'm looking forward to continuing the work on this project and establishing a good cadence for the dev logs.

Something else I'd like to add, if there are any features, functions, or feedback regarding the update or things you'd like to see more priority on, feel free to comment and let me know. There is a lot of flexibility with the project and I appreciate any and all feedback.

Without dragging this on any further, thank you for the time if you did read through any or all of this extremely long post. I will be planning on much shorter, concise updates in the future, and may even consider splitting various different perspectives into multiple posts through the month if applicable / time permitting.

Thank you again.

Tagon

Files

elementyle-windows.zip 27 MB
Version 1.0.98.231206_w-1 Dec 06, 2023

Get Elementyle

Download NowName your own price

Leave a comment

Log in with itch.io to leave a comment.