It’s inspired by Totally Accurate Battle Simulator by Landfall, a goofy-looking game where two armies fight until the death. Most of the gameplay is about placing your units within a budget and watch them fight against a pre-deployed army.
So here is the followup game, Escarmouche, in a WIP state. I started worked on it last year under another name (Tiny War Simulator), but I think I only mentioned it here on the forums.
Objectives
This is a C++ game using an experimental video mode, which is strip-based. In summary it’s TAS, but instead of 176 1-pixel-thick line, it’s 11 small buffers.
It’s also using a 3D iso engine I’m going to implement for ARIAT, tho it’s not showing much at this time (only using the 3D iso transformations for sprites right now)
While it’ll be a game on its own, its aim is also to polish said engine so I don’t spend too much time refactoring stuff while working on ARIAT later.
This thread will serve as the devlog for it.
Current features
Available Units
Soldier - Punch with an invisible fist.
Shield Bearer - Wears a Shield, which blocks a good deal of front damage -but none from their back; Use said shield to bash away their enemies.
Preparation
Crappy random party generation.
Side cleanup tool.
Holding A to place or remove multiple units.
Battle
Camera rotation by holding B and pressing left/right.
Time control by holding B and pressing up/down (x0, x1, x2, x4, x8).
Replay a placement.
128 units at most (not getting the highest FPS when this happens ).
Results
A proper Victory or Defeat screen.
Campaign mode?
Not sure about this one, we’ll see how well this is going!
Preparation, Battle & Results
Menu showing by pressing C.
Armies’ Life bar (which is missing from the gif somehow).
Debug stuff
FPS bar. It’s the white/pink lines on the bottom, with each black dot indicating 10 fps.
What’s missing?
A lot of stuff obviously.
Audio.
@jonne complained about the lack of it in TAZS, so I definitely need to do that.
I think I got a strategy about how to do it.
More different units.
I’ll import most of the other Units available from TAZS (Slap, Spear, Bow, Dash (yes, the guy from that Door Game).
I also want to implement a few characters unique to the Pokitto from other games, like Matti or Joe, as a homage, if their respective authors allow me by then!
Also, the actual Pokitto itself is definitely going to be a unit.
That aside, I’ll also add a catapult and other fun toys; and probably some explosive barrels technical units.
UI. UI. UI.
All the menu, main screen, options, etc.
An actual Unit Grid. Currently pressing B would place a Shield Bearer instead of a Punch Soldier, but that’s not exactly scalable.
Challenges.
Puzzle-like challenges where you need to beat a small army with a limited budget.
Possibly custom challenges and an in-place editor, saved on the FS.
Playing as a Unit.
It’s also useful for debugging stuff.
A few gifs
Preparation Phase - where you place units.
Let the battle begins!
Removing a few units.
128 units. When the limit is reached, the cursor switches to Disabled state and you can only remove Units.
On the HW, this drops to under 20 FPS - there is a lot of room for optimization tho.
Here is the Shield Bearer. Almost always winning on 1-1 because of its direction-based damage absorption.
Tho they do perform good against two punch guys.
Time-control. Extremely handy to test things, but also when dealing with very long fights like this shield vs shield battle. The FPS on HW is pretty much catastrophic with 128 units of course.
So what’s next?
Lots of minor bugs to fix (non-mirrored soldiers, buggy save/restore, …).
Implementing the actual punch.
Adding more stuff on the ground so have a better notion of the space.
Template-based, generic blitting facilities. It supports the following features:
N bytes output (only 8bpp are going to be used in my case).
1 bpp (with up to 32 pixels) sources.
N bytes sources (e.g. 8 bpp, 16 bpp, 32bpp) sources.
X, Y and X+Y mirroring and X-Y swapping (both of which can be used to rotate sprites).
Full clipping whatever the mirroring/swapping is.
Custom pixel operation (e.g. 1bpp asks for a bool to uint8 operator).
Which would be “use a given color when the pixel is on”, “do not copy if zero”, “copy with an offset”, …
The coordinates mirroring/swapping/clipping has its own facilities so it’d be easier to implement new sources types (2bpp and 4bpp are especially interesting for me).
It considers reading the source to be the hardest thing to do, so the source is always read from topleft to bottomright, horizontal first.
Because everything is based on templates parameters, including the pixel operation, a if constexpr() or a specialized template could be easily used to implement a potentially faster assembly version of a given blitter (e.g. the ubiquitous 4bpp to 8bpp, no mirror, no swap, non-zero copy blitting).
Actual Text Rendering
Uses the GLCD fonts with the generic 1bpp blitter above with x-y swap.
On the Game side
INTERNAL - Merged most of Shield Bearer and Punch Soldier code to allow easier Unit creation and maintenance.
GFX - Attacks are now animated, TAZS-style.
GFX - Dead Soldiers will now leave a Corpse behind, with a small Death animation.
FIXED - Soldiers’ body sprite is always facing right.
FIXED - Placing Soldiers too far from the center will place them at a location which is wrapped around a rather small area around the center.
FIXED - x2/x4/x8 speed on the Preparation Phase/Victory Phase shouldn’t be a thing.
GIFs
Animated death, facing the right direction, shields falling on the ground
Upcoming
UNITS - Archer.
UNITS - Spear Soldier
UNITS - Dash Soldier
UI - Title Screen
UI - The Unit to be Placed will be Previewed at the cursor position.
Perks - A bit sturdier, longer reach (can hit behind an allied unit!), higher damage / knockback.
Quirks - Somewhat slower to attack and to move.
UI
Title Screen.
Exit to the loader, Sandbox game, Instructions.
Instructions Screen.
A simple page-based text.
Explains roughly what the game is about and a few concepts.
Also contains the credits.
Game - Added a menu action to go back to the Title Screen.
Game / Preparation - A preview of the unit-to-be-placed is shown with the cursor.
Engine
GFX - Minor refactors to simplify the drawing API.
Units - Reworked the units to avoid rewriting the same code since they share a lot of features (search target / seek target / use weapon against target / retarget) and added stats variation between the kinds of units.
Title Screen - Added a build version (actually updated whenever the assets are built again).
GIFs
Title Screen, Instructions Screen, Version.
The Spear Soldier. Their longer reach help keeping at bay a lone Punch Guy, but they will have a hard time dealing with two or more. Also, unit preview on the cursor.
Every time I see this thread I can’t help but think “Scaramouche, Scaramouche, can you do the fandango?”, a line from Queen’s six-minute song Bohemian Rhapsody.
It’s no coincidence though, both ‘Escarmouche’ and ‘Scaramouche’ have the same etymology.
Both are descendants of the Italian word ‘scaramuccia’.
Wow time passes quickly. 21 days is too long, it’s almost enough time for PPoT to make a new polished game!
I struggled quite a lot with the archer, and I was also busy with other things.
Gameplay
Units - Added back the Shield Bearer.
Combines greatly with the Spear Bearer, as this one can pokes a target repelled by the Shield Bearer!
Units - Added the Target.
This is current for debugging.
Units - Added the Archer.
Shoots arrow at the enemies when within range.
The Arrows curve in the air until they reach their target.
Because there is a delay, the arrows might miss their original target, or hit another target (no friendly fire tho), especially when the target is far away and moving.
Has a long range.
Slowest attack rate, average damage, less than average health, average speed.
Best counter is currently a Shield Bearer.
Other than meat shields, fast moving units will probably be their doom as well since they’re pretty stupid.
Internally:
The Arrow isn’t an Entity on itself, but part of the Archer Entity.
When an Arrow is active, the Archer Entity asks the 3D Iso Engine to render the Arrow at the Arrow’s current location.
This means 1 Arrow per Archer, which is already enough for interesting battles.
When the arrow reaches the right altitude, a check is done to see if the target is around.
If it is not, another check is done when it lands - and it’ll hit an enemy if they happen to be here at this moment.
UI
(Nothing).
Engine
A new lifecycle has been implemented with the following stages:
SEEKING - The Unit is seeking a Target.
When it times out, another closer Target is selected.
When the Target is within range, it switches to CHARGING.
CHARGING - The Unit is charging or aiming their Weapon.
As long as the Target is within range, the Weapon will keep charging.
When it’s fully charged, it switches to FIRING.
FIRING - The Weapon’s effect is in effect.
(Usually 1 frame).
COOLING DOWN - The Weapon is cooling down or reloaded.
GIFs
Spear + Shield is pretty good at crowd control.
A single archer can take on most units all by itself.
But they don’t fare well against Shield Bearer because of how Shields reduce damage in a directional fashion.
It works well with others units.
It’s raining arrows. Archers are good when shooting at a pack, so having a few sacrifice units helps wasting their arrows. Flanking is better for taking out Shields
Upcoming
I still got to figure out a roadmap. My list of ideas is growing every time I play, so it’s easy to get scope creep.
I’ll make a review soon enough to decide on what I want to include on the upcoming demo.
Menu/Gameplay - Challenges & Cost System!
“Place your army within the given constraints to beat the opponent’s own army!”
Such constraints include: area of placement, total cost, number of units, available types of units.
Pretty much the same thing than TAZS. That also would be the basis of a campaign mode, too.
Interestingly, such a system will help me test more easily the balance between units - and their price too.
Units - Sword Soldier? A fast-moving one?
Less visible corpses.
A more interesting environment?
With grass here and there, maybe some trees, things like that.
Looks impressive! Rotation really adds up the visual experience.
I suppose archers select the nearest target in the given distance range? Can they also miss the target or do they always hit?
Archers don’t anticipate the movement - they’re pretty stupid, like everything else in this game.
However, to compensate this, they do aim a bit lower than necessary:
A target moving toward them will be most likely hit, unless it’s fast AND far enough.
A target moving laterally or away from the Archer has more chance to be missed, but it depends greatly on the distance as well.
A static target will never be missed, whatever the distance.
Additionally, if the arrow misses the primary target, it might get a chance to hit a secondary target just behind.
Shields are slow enough to avoid that, and will protect the unit behind them without any issue
However, the second or (potentially) the third line of a pack of fast units will probably suffer more damage than the first line!
Also, if the primary target died before the arrow touched it, the arrow might instead end up into a secondary target. Can’t hide forever!
As a side note:
Punchers are the currently fastest units. When on 1 to 1 and far enough, often the first arrow will miss them by a pinch, but the next arrows as the distance reduces always connect.
There is a future unit that will move in a zig-zag pattern. This unit will probably be the doom to any dumb, non-instant Ranged units such as the Archers.
16 days later, oops
This is an update for a game UI overhaul, and, more importantly, the Challenges!
Gameplay
Units - Attached a Cost.
Challenges Mode!
A Challenge is currently about defeating a given army within the following constraints:
A deployment area.
A maximum budget - in relation with Units’ individual cost.
More specifically, you cannot place a unit that’d make you go over the allocated budget.
A “tech” limitation (i.e. not every kind of Units can be used for every challenges).
Challenges - Added 7 challenges
These are mostly for testing Challenges. They’re not really challenging, as the game needs more balancing.
UI
Added the Challenges Screen - which is where the challenges are listed.
Revamped the Game UI (still a WIP).
Added a Side Bar:
Accessible through C.
There is a Command bar “major” game options, such as “Launch Battle”, “Clear this side”, “Randomize this Side”, “Reload this Battle”, “Exit to menu”, etc.
There is a new Command Palette, which is currently dedicated to the Units in preparation.
Each cell has the Unit’s Cameo (much like C&C / RA), which, most of the time, represents the units’ weapons.
When placing units on the field, it also indicates the current Unit Type.
An empty location for the minimap.
Currently the side bar is always expanded, but in the future it’ll
Added a in-game Hint area.
For telling what the highlighted action is going to do (with messages such as “Place Archer for 200$”, “Launch the Battle”, “Exit to Menu”, …).
Engine
The Battleground is a bit more fleshed out, allowing for deployment areas different depending on the Challenges or Sandbox.
GIFs
Still an early WIP, but most of the Game UI is fleshed out.
The data folder should be at the root of your SD Card. I think the game would still launch without it, but the FemtoLib Menu probably won’t display much
The binary itself can be placed wherever you want.
Have fun!
Upcoming
So the Cute Demake Jam just started, so Escarmouche will probably go a bit more slower for a couple of weeks.
Nonetheless, the followings will be worked on:
An option to launch the next Challenge after finishing one.
Make the deployment area visible.
Simplify the “Clear this side” when in Challenge -so it clears everything the Player controls.
Make the Camera free in Results Phase (currently stuck for some reason).
Registering the solved Challenges, with the lowest Budget that was used to do so.
This looks so so good, I can’t stress enough how great this idea is, there’s something about just setting the army up and then watching the simulation go by itself. I’ll need to program something like this one day.