[Game]TAZS (Java compo entry)

Just make the units zombies.
Paint their skin green or grey and maybe make them more dishevelled.

Or skeletons if you want to be a bit more original.

I recommend a min-heap.

1 Like

Yeah, that’s the idea for units, a bunch of various monsters. That’ll be fun to draw for sure!

For the min heap, I’ll have a look when I’m on it, thanks for the suggestion!

Advancement 2019-10-21

Today, I implemented a new unit:

  • Added the Shield Bearer.
    • They bear a Shield -hence the name- which protect them against front attack (up to 90% of damage/pushback is absorbed).
    • They can also bash said Shield on Enemy Units, and that’s equivalent to the Brawler attacks.
    • On 1 against 1, they wear out all other Units, including the Sworders.
    • On groups, their principal weakness is the Slapper -because this one is shifting their direction a bit.
    • Otherwise, they’re pretty great as crowd control units, and perfect for protecting more fragile units by delaying their opponents.
    • Stats wise:
      • 50$ - same cost than Sworders
      • 150 HP - same than Sworders
      • 5 ATK - same than Brawler and Slapper
      • Same Attack Speed than Sworder
      • Increased Attack Recovery when the Unit that was bashed was close to the Shield Bearer.
      • 90%, 75%, 50% Damage/Push-back Absorption from the front, 100% from the back.
    • They will give more tactical options for sure, and provide more fuel to the Challenges as well!
    • However their current domination will probably be disturbed a lot when units won’t be able to overlap onto each other.

2019-10-21%20-%20Shields%20against%20Swords%20-%20x2
Shield Bearers fare well against Sworders. Note how the lone one manages to keep two Sworders at bay for a moment.

2019-10-21%20-%20Shield%20Against%202%20Close%20Slappers%20-%20x2
Slappers are somewhat a counter to them. This might become more true in the future.

2019-10-21%20-%20Shield%20Against%204%20Close%20Brawlers%20-%20x2
A single one can slow down defeat 4 Brawlers.

2019-10-21%20-%20Battle%20of%20Shields%20-%20x2
Controlling a Unit will provide you with a way to disturb a line of Shield Bearers. Nothing like a backstab, hey? It might be best to choose a faster unit for that purpose tho,

Next Features:

  • Physical Occupation - Avoiding 10 units at the same location.
    • It’s a tricky one, yet it might bring great results - less confusion, more interesting battle, etc.
    • If I take too much time to make it good enough, it won’t be included until after the comp.
    • If it takes too much CPU, I’ll try spreading it onto multiple frames -e.g. separating half of the units each frames and similar strategies.
  • Time Control - Playing the game at a 0%, 25%, 50%, 100%, 150%, 200% speed.
    • Quite Useful for me - easier to see what’s going on.
    • Also provides a way to make Unit Control easier for the Player.
5 Likes

Sorry to nitpick, but why ‘sworder’?
Such an obsolete word seems out of place among all the other titles.

Was it an attempt to avoid ‘swordsman’ being an arguably gendered term,
or simply because you want all the unit names to end in -er,
or maybe something else?

Also I’m not criticising it because I think it’s hilarious,
but are you aware of the alternate meanings of the word ‘slapper’?

Yeah, it’s an attempt at not having a gendered term! Also, that conveniently matched the pattern Weapon/Items + er :stuck_out_tongue:

Those are temporary terms anyway (that might end up in the comp release because my focus is somewhere else). The Slapper might be renamed into Slap Giver or something. I knew about how obsolete was “Sworder” but I didn’t knew the alternate meaning of Slapper haha

I might just name them for the weapon they hold in the end.

Advancement 2019-10-22

Today, I’ve made all Units more physical than ever:

  • Every unit will now be separated from units too close from them
    • That means they won’t gather at the same exact location, and instead form groups and (somewhat) surround their enemies.
    • The separation process is split into 2 waves to ease the CPU a bit.
    • Overall the battle looks muuuuuch better solely because of that feature.
  • I’ve locked the game into 30 FPS.
    • I still have to adjust every Units’s speed as they’re quite slow currently.
  • I’ve added a performance bar, a debug tool, which allows me to quickly know at a glance where the CPU spend most of its time
    • Such as flushing the buffer, updating Units, rendering them…
  • I fixed the following:
    • The Shield was not being rendered properly when held by an AI facing front.
    • Units’ attacks often land into dead bodies instead of other alive Units.
  • Finally, I added a new test Unit, the Target. It doesn’t have any utility, beside crumbling when hit too hard.
    • Surely it’ll be more useful on some Challenges!

2019-10-22%20-%20Physical%20Occupations%20and%20Targets%20-%20x2
A lengthy GIF showing the Targets, how the units spread out more, and the Performance Bar on the Bottom.

Next Features:

  • A few improvements on the Unit Control and UI.
  • Adjusting the Speed of all Units.
2 Likes

If I might make some suggestions,
you could have ‘Swordbearer’ (to match ‘Shieldbearer’),
or if you want something different then maybe ‘Swordfighter’?

Both are still used in modern English, both are ‘neutral’, and both end in -er.

‘Slap Giver’ just sounds terrible.

‘Slapper’ should be fine as long as you’re happy with Britons (and Aussies, and the Irish, and possibly people from other commonwealth nations) giggling about it when you aren’t looking. :P

Sadly I’m not surprised.

Swordzombie, Shieldzombie, Fistzombie, Palmzombie etc. could work.


This is probably one of the most underused ways of making good use of processing power.

Though in fairness it’s made a lot easier by languages that have coroutines or ‘fibre’ (lightweight threads) support.
For a long time most major languages have let coroutines slip through the net,
but they’re slowly gaining more recognition and more uptake.
The ISO C++ committee is planning to add coroutine support in C++20.

1 Like

On HW/Emulator (as opposed to seeing performace information in FemtoIDE)? If so that is very cool! Are the sources somewhere?

Thanks a lot of the suggestions!

That game is kind of silly anyway, and as french people, we have to show off our terrible English to the whole world :stuck_out_tongue:
I’m going to keep in mind those patterns!

As for the coroutines, I got to have a look at that as well. They seemed like an elegant tool, so I’m glad C++ will eventually have them!

Yeah, the performance information is running inside the game (because of that it’s eating away CPU itself!). It’s actually pretty simple and because of that, quite inaccurate and buggy at times. But it does help me see grossly how the work is done. Plus it looks cool for me :stuck_out_tongue: and sort of reminds me those Power Bars in the Command & Conquer series too.

  • Externally it’s a static class with a few methods onXxxx (like onStateInit, onStateUpdateStart, onUpdatedUnits, onRenderedUnits, onFlushedScreen, onStateUpdateEnd, onStateShutdown, …), which are manually called from various points.
  • Most onXxx methods simply measure the time in ms using System.currentTimeMillis() since the previous measure, and store it into a variable.
  • onStateUpdateEnd however will also limit the FPS, measure how long the whole frame was (including the FPS limitation).
  • Times measured this way are also smoothed a bit using a value = (value * 7 + newValue + 7) / 8 (which is acting like a cheap lowpass filter).
  • Milliseconds are stored, in a way somewhat similar to Fixed points (they’re multiplied by 16 in order to smooth them more).
  • Finally there is a draw(screen) which renders the bars at the bottom of the screen. It’s using a lerpi method I made into my Tools, and do an integer interpolation in order to scale the times to the pixels.
    • On that matter, the draw(screen) method will give a somewhat inaccurate rendering, because it’ll be called before the flush, whereas the total frame is measured after it was flushed.
    • It’s not such a big issue because times are smoothed anyway, and precision isn’t really what is seek here.

As for the sources:

I didn’t publish the source yet, thought I intend to do so.
It’s partially to preserve a few secrets inside the game until the comp is finished. It’s mostly because, for various silly and less silly reasons, I never opened any of my source code, so I’m kind of totally clueless about which license to choose, where to host the code, how to make it properly, etc (for instance, my github account is totally empty). I’ll do that after the comp, when I’ll got the time to do so.

Also, I don’t want to be interfered too much about my coding habits during the comp, as it’s very distracting to me :stuck_out_tongue:
(no, really it is. I’m always seeking out ways to be a better coder and that can be obsessional at times).

2 Likes

Advancement 2019-10-23

Today, I’ve worked on a lot of things related to Player Control, as well as the Camera.

  • The direction of a Controlled Unit is now shown with a simple line.
  • There is a slight animation helping to locate the Controlled Unit as well.
  • The Camera now follows a Controlled Unit if there is one.
  • Herbs were crudely added to the background in order to see better the Camera’s movement.
    • It’ll be improved in the future, with more “organic” positioning.
  • The speed of all the Units were doubled in order to compensate with the new 30 FPS limit.
    • Also, the 30 FPS limit was added to all other screens.
  • Holding B while Controlling a Unit will lock its direction, which is useful to flee and attack at the same time.
  • The Result’s Screen’s Stats Panel now appears automatically, and can be hidden and shown again with each press of the B button.
  • The Pad can be used in the Battle Phase (when not Controlling a Unit) and in the Result Phase to explore the Scene.
  • The Camera will focus by default on the last, losing-team Unit to die, unless the Player is pressing the PAD.
  • When Controlling a Unit, a Life Bar is now visible.
    • The length of this Life Bar is actually proportional to the initial Health of a Unit - e.g it’ll be longer for sturdier units and shorter for more fragile ones.
    • Also, it’s blinking when the Unit’s health is under 50%, and grayed out when they died.

2019-10-23%20-%20Exploring%20in%20Battle%20-%20x2
Exploring the surroundings of a quite heated battle,

2019-10-23%20-%20Last%20Death%20Camera%20-%20x2
Camera focusing on the last destroyed Target. Later it’ll come with a slowdown for a more dramatic effect.

2019-10-23%20-%20LifeBar%20-%20x2
Introducing the new LifeBar :tm:. It’ll stress you out when it starts blinking. Shall I add some annoying repeating music to that?

2019-10-23%20-%20Locking%20Direction%20-%20x2
Locking Directions in order to have a higher chance of beating someone else.

Next Features:

  • More horror-like creatures for the Player - Zombies, Skeletons, …
    • Mostly appearance-wise, no new units yet.
  • Replacing $ with the Bean icon I’ve had since a couple of week.
  • Wall Unit - an immobile, destroyable chunk.
    • It’s more of a technical unit, much like the Target.
    • Won’t be normally available to the Player for Challenges.
4 Likes

As am I. I’m already quite familiar with them because Lua has had them for ages.

There’s a good introduction to Lua coroutines here and a more in depth explanation here.
(Though personally I don’t like the second link characterising coroutines as threads because coroutines don’t run in parallel like threads do.)

Technically that means they actually are fixed points because 16 is a power of two and multiplying by 16 is equivalent to shifting left by 4.
Assuming you’re using 32 bit integers, that means the format is ‘Q24.4’.

(Whether or not they stay in that format is another matter.)

The short version:

  • MIT and BSD 3-clause are probably the least restrictive whilst still requiring a copyright notice. Use one of those if you want to give people the freedom to edit anything whilst still giving you credit.
  • Apache 2.0 is like MIT, but it requires anyone who modifies your code to leave a prominent notice stating that they’ve modified it.
  • CC0 is as close as you can get to ‘public domain’,
    but if you use that then there’s no restriction on the user whatsoever,
    they don’t even have to say who originally wrote the code.

I won’t discuss the GPL here because it’s too complicated to sum up in 1-2 sentences and I’d recommend against it anyway because of the number of restrictions is has and its viral nature.

If you want more info then feel free to ask (here, in another thread, or in a PM) and I (or someone else) can provide you with more info.

GitHub or GitLab is ideal. (Personally I find GitHub easier to use.)

If you choose to use GitHub and need help doing anything then again, feel free to ask.

If you choose to use GitLab you’ll have to ask someone who is au fait with GitLab (e.g. @drummyfish).

I’m not sure how you’re planning to do this, but if you’re thinking of randomly generating the herb positions and storing those positions in a list then I know of a good alternative that could save you memory.

1 Like

I’ll ask in time for sure, thanks!

I know a few ways to have those random grass and that’s part of the fun to make them look as such :stuck_out_tongue: also I’ll make them move like a wave

Advancement 2019-10-25

Yesterday and today was all about zombifying the game a bit:

  • Player’s Units are now made out Zombies (replacing the red one without hat) and Skeletons (replacing the red one guy).
  • Refactored a bit the Handlers so it’s easier to draw bodies from other handlers.
  • Merged all the Game Sprites (Units, Weapons, etc) into a single one.
  • Some RAM and Flash were freed that way, for no visible CPU cost!
  • Finishing a Challenge will give an option to try the next one.
  • Made the RIP sprite for units less contrasted.
    • That’ll look much better with
  • Reworked the death animation a bit.

2019-10-25%20-%20Zombies%20Vs%20Humans%20-%20x2
Humans were better organized here and survived with 4 units left, although they were overpowered both in cost and numbers!

EverythingSprite%20-%20Zombie%20Death
Zombie dying.

EverythingSprite%20-%20Skeleton%20Death
Skeleton dying. Also, they wear a hat because they’d get a cold otherwise!

Next Features:

  • Piker Hole maker Pike Bearer
    • A melee unit dealing light to moderate damage at a higher range than the Sword Bearer
    • Will deal less optimal damage if a unit gets too close from them.
    • (Maybe) will choose a target that cost them the less movement/rotation and have optimal damage.
    • (Maybe) will try to adjust their distance toward their target in order to do optimal damage.
      • That means they might walk back while poking at a pursuer.
    • Should be great in combination of a shield or behind some stationary obstacles.
  • Time slowing down in Results
    • So we can appreciate the death of the last one.
  • Better FPS control
    • Hopefully correcting that issue of stuttering!
3 Likes

This game is looking better and better all the time

3 Likes

Advancement 2019-10-26

Today, I finished the Pike Bearer:

  • The Pike Bearer is a Melee unit with longer reach than the Sworder.
    • Their Pike are long enough so they can work greatly with Shield Bearers.
    • Because of their high reach and attack speed, they can handle every other unit in solo, and often small groups of them.
    • Their cost is high because they’re the most powerful unit right now.
    • They have slightly less HP than Sworders and ShieldBearers.
  • The FPS limiter is now relying on a number of millis per frame in order to avoid stuttering.
  • The game is now playing at 50 FPS.
    • That’ll slow down when having large battles of course.
  • Adjustments were made for the AI to improve their aiming.

2019-10-26%20-%20PikeBearer%20-%20x2
Introducing the Pike Bearer. They’ve got the bad habit of poking around stuff.

2019-10-26%20-%20Pikes%20Against%20Swords%20-%20x2
They’re overpowering all Units right now. That might change when the Archer will be added tho…

2019-10-26%20-%20Formations%20-%20x2
When behind Shield Bearers, they’re quite destructive too, as that essentially give them more HP and defense.

Next Features:

  • The Archer
    • The first ranged, projectile-based unit (that alone will make it very interesting to code!)
  • Rendering Order
3 Likes

Advancement 2019-10-27

Today, I’ve focused on the Archer.

  • The Archer is Unit that attacks using a bow from a distance.
    • Their bow is quite powerful - it can cover half a screen without any difficulties, and takes down quite a lot of life in a single hit.
    • They also produce a significant pushback.
    • However they got low life, low speed, low attack speed, so it’s best to have them shielded - including from enemy Archers!
    • When controlled by the Player, a Target will appear and move, showing where the Arrow will land.
    • Unfortunately, due to the lack of time I can’t make their Arrows visible. Imagining them is left as an exercise to the player.
  • Done a lot of balancing too.
  • Fixed a couple of very minor bugs.

2019-10-27%20-%20Bow%20vs%20Pike%20-%20x2
Because of their range, Archers beat most Melee units…

2019-10-27%20-%20Archer%20vs%20Brawlers%20-%20x2 2019-10-27%20-%20Bow%20vs%20Shield%20-%20x2
… unless they’re numerous and/or sturdy enough to reach them…

2019-10-27%20-%20Controlling%20an%20Archer%20-%20x2
Controlling the archer shows a target. The target will continue moving as long as A is held.

2019-10-27%20-%20Tight%20Battle%20-%20x2
On tight battles, they’re often the only survivors.

Next Features:

  • Rendering Order
  • Challenge / Tutorial creation
  • Balance and debug
  • Polishing the whole too
  • Tiny Campaign creation if I got the time to do so

So much things I had to cut unfortunately…

The next release will be my submission on the itch.io comp page!

4 Likes

Final Advancement 2019-10-28 -> 2019-10-31

Those last days were intense for sure! In an effort to keep focused on finishing, I neglected a bit this log.

  • Units are now rendered in the right order.
  • Challenges and Quick Battle modes can now enforce specific units instead of having the whole list each time.
  • Challenges are not anymore hard-coded - instead, they are generated from a JSON inside a JS file belonging to the project, into a Challenges Pack.
    • It makes it much easier to have new challenges.
    • I documented the binary format for easier implementation, and it might be useful for the upcoming C++ port.
  • Most strings were converted into flash-only format to save RAM.
  • A new Music generator was made.
    • It’s based on an ADSR envelop, with events playing for notes (pitch, duration, loudness) and jumps (for looping purpose).
    • For now, only a Sin-based generator was provided. Due to it being based on Math.sin(), the output is rather “interesting”.
    • Costed much less than having a sound representing a music.
  • Musics are generated from a JSON inside a JS file belonging to the project.
    • So far, 4 rather short musics were included.
  • Time flow can be controlled when in a battle (and not controlling a Unit) by hold A+B and pressing Right/Left (Increase/Decrease from 12.5% up to 800%) or Down/Up (Pause/Unpause).
    • Quite useful to speed up lengthy battles
  • Added the Dasher, a unit that always runs and dashes through enemy units.
    • While dashing they’re almost invincible, taking only 1 HP of damage.
    • If they’re ready to dash and receive some hit, they’ll automatically dash to protect themselves.
    • In the Result Phase they’re running in circle, except when controlled - in this case they’ll just leave away.
  • Units on the Player Side added by a Challenge cannot be removed anymore.
    • This is to allow “protect” challenges and to teach the Player about those units.
  • Challenges that were completed are now marked as such in the list with a blood stain.
  • Added a Cookie to save:
    • Which Challenges were resolved.
    • The current music that is playing.
  • Added a Settings Screen where:
    • The playing music can be changed - or nulled.
    • The progression can be partially or fully erased.
  • Added an introduction screen which also serves as the entry’s final logo.
    • Made me panic because I finished it 20 minutes before the deadline, and testing on the actual device revealed it was freezing there!
    • It involved shadows walking behind, but since that was what made it freeze on the device, I had to ditch it.
  • And of course, the game was posted on itch.io and submitted as a Java of the Dead competition entry. (https://carbonacat.itch.io/totally-accurate-zombie-simulator)

2019-10-31%20-%20Title%20Screen%20-%20x2
The submitted comp’s title screen.

2019-11-01%20-%20Fixed%20Title%20Screen%20-%20x2
The fixed title screen. It features the Zombie Brawler, Lilas (Ditched out unit - A Zombie hero with an HP-absorbing melee attack and a special Zombie Raising power), Zombie Mage (Ditched out unit - Ranged, splash-damage unit), another Brawler and a Skeleton Slapper.

2019-10-31%20-%20Deadline
My true achievement.

EverythingSprite%20-%20DashGuyEverythingSprite%20-%20DashGuy%20Death
MUST. RUN. I WILL REST ONLY WHEN DEAD.

2019-10-31%20-%20Controlled%20Dasher%20-%20x2
Controlling a Dasher will make you feel powerful. Also, a big HP bar!

2019-10-31%20-%20Dasher%20and%20Archer%20vs%20The%20World%20-%20x2
They’re great at distracting a lot of people while Archers rain down their arrows on them too.

2019-10-31%20-%20Time%20Control%20-%20x2
Undocumented feature - Time control by using A+B. Very useful to speed up -or slow down- large battles! This will often be laggy for obvious reasons.

EverythingSprite%20-%20Conveyor%20Belt
Ditched out conveyor as a victory pose (also ditched) for the Dasher. Now you should have a good guess at who the Dasher is inspired by!

Thank to everyone for allowing me to have gotten this far!

Ditched out Content

  • Conquest mode - Use beans to summon your troops, seize those Coffee Plantations and conquer an island against an AI!
  • Campaign mode - With story, optional objectives, dialogues and characters.
  • Tutorial - Helping the newcomers enjoy this game more.
  • 13 challenges - And more interesting, also.
  • Unlockable challenges and units.
  • A funny introduction.
  • Diverse Maps - with a more interesting ground and obstacles.
  • A level being a parody of Brew of the Undead - with both Matti and the Castle.

Ditched out Features

  • GFX applied to Units - like blood splash.
  • Showing the Performance bar only when enabled in the Settings.
  • Adjustment in the Cursor and Camera movement.
  • Time slowing down when the last unit of a side dies.
  • Units emitting random noises when battling or dying.
  • Victory posture for surviving units in the Result Phase.
  • Top bar displaying portrait of both sides’ leaders, with expression depending on their situation (much like Advance Wars 1)
  • Entering a seed to get a specific Randomized Battle - A probably interesting way to have randomized challenges.
  • Unlockable Units and Challenges depending on the Campaign/Challenges achievements.
  • Actual Projectiles - so the Player doesn’t have to imagine the Archer’s Arrows.
  • Velocities for Units - so it feels more chaotic.
  • Zooming in/out while in Battle - Also includes a Mini-map.
  • Choosing a map in the Sandbox Mode.
  • Scoring, with save for both Challenges and Campaign’s levels.
  • Music playing where appropriate - such as a victory or defeat music.

Ditched out Units

  • Tomb - Something precious to protect from those pesky humans.
  • Lilas - A zombie, hero unit who wears a fast absorbing dagger and who can raise dead bodies as zombies.
  • Skyrim’s Draugr/Dovahkiin - Wears a Sword, a Shield, and most importantly Fus-ro-dah their enemies away.
  • Catapult - Slow-moving, Slow-attacking, Fragile, but very powerful ranged unit with large splash damage.
  • Watch Tower - Basically a static, sturdier Archer with more range.
  • Wall - Mostly a decoration.
  • Proper balancing.

Stats

I spent at least 130 hours (most likely 150h) working on that game. That’s partially because of the length of the jam, but mostly because I neglected my sleep. Those were 130 hours of well spend time for sure!

What happens now?

Shortly I’ll have a proper debriefing session on that game, where I’ll check its weaknesses, its strengths as honestly as possible. I’ll also analyze my decision taking - I did a lot of things because it was fun to do so (like music playing) or to satisfy an obsession, not because it bring more to the game. That might take the form of a post-mortem, which will complete this very post.

After that … since I grew to love this game, my plan will be to remake it in C++. It’s mostly because I need a tighter control about how the memory is used, multiple kind of fixed point numbers, more easily defined static data too. I feel like only C++ will help me take this game where I originally intended to lead.
Its name will change in the process, as it won’t be exclusively related to zombie anymore - but it might still features them, maybe as a specialized campaign.

As for the sources, the competition version’s ones (code + arts) will be published in my github account on the next week. The C++ remake will also be published there, as soon as it’s started.
Additionally, I’ll start a wiki for the C++ version, to provide more insight about the development, how things work inside, etc. I don’t intend to do so for the Javitto version, but I already commented a good deal of the code, so that shouldn’t be hard to read for all you great minds. Well, it might actually, because of my broken English hahaha

Thank you for having followed the development of that game!

(Will be updated with more information after the Debrief session)

6 Likes

I meant to review this also, but this is such an unfamiliar genre to me, that it is more fair to leave that to someone else. What I was testing, it worked well. It is technically impressive to have this much “intelligent” objects on the screen at the same time (with the game logic, the bounding rects etc.), in Pokitto :slight_smile:

3 Likes

@carbonacat , I edited the title so that the bot picks up the game into the game list

I did this because I assume [complete] means you are ready with it

I hope you approve

3 Likes

No problem!

I’ve published the sources:

Thanks to @Pharap whose guidance helped me to do so!

3 Likes

The second link is 404-ing.

My bad! I forgot to make it public. Should be good right now!

(Thanks for noticing me)

3 Likes