Glamour, Pride, Grace and Discipline

"I have been preparing for this battle ever since I learned about your existence. That was 2 milliseconds ago. Such fond memories."

The Games Foxes Play

(complete source code | view all previous posts)

Some nasty virus is giving me a hard time this week. But, there are people in this very thread who work hard, again and again, despite having much worse health problems. If they can do it, so can I. Thank you for the (indirect) motivation!

A lot of "Axioms" - varied spell effects to mix and match - have been added. Since attention is a limited resource, I'll go straight to the coolest one: Possession. Basically the equivalent of Domination from Caves of Qud, it allows the caster to take control of any creature for a limited time, use all their abilities as one sees fit, and potentially force them to move into dangerous positions.

This also marks the introduction of status effects. Tracked in the sidebar, there is support for all kinds of possibilities, including the "Cardinal Virtues" - a new experimental gameplay mechanic.

Here's how it works: all creatures start at 1 stack each of Glamour, Discipline, Grace and Pride. Each one of these is incremented and decremented by complementary events:

  • Taking damage increases Discipline, but lowers Pride.
  • Dealing damage increases Pride, but lowers Glamour.
  • Casting Axioms increases Glamour, but lowers Grace.
  • Moving increases Grace, but lowers Discipline.

All Axioms scale off one or multiple of these Virtues to define their power level. For example, the aforementioned Possession lasts longer the more Glamour stacks you have.

Another example is Coil, which scales off Discipline and deals more damage if the target is surrounded by solid entities. Or Pull, which drags targeted creatures closer with distance relative to your Grace. This paves the way to some character archetypes:

  • "Trickster/debuffer" for Glamour.
  • "Tank" for Discipline.
  • "Agile acrobat" for Grace.
  • "Blaster caster" for Pride.

The goal of this mechanic is twofold:

A) Since every instance of "damage" in the game is basically lifesteal, some battles can go on forever as two powerful foes drain each other over and over. Virtues prevent this, as they (especially Discipline) keep on getting stacked until Axioms have become so powerful that ties will be broken.

B) Certain Virtues, especially Glamour, open the way to unconventional strategies. How can one defeat foes without being allowed to deal damage? In the case of Epsilon's challenge, it is possible to bait the snake into attaching to itself the segments scattered around the arena, then Possessing it, and moving Epsilon's body so that it becomes stuck on a wall with no way to exit. But to do this, one has to stack their Glamour first, which involves finding safe spaces to cast Axioms without getting obliterated by Epsilon's attacks. Check out the video for a full demonstration!

I am mildly suspicious that this mechanic will lead to oneshot fiestas and cheesy mechanics - moving back and forth in a corner over and over to stack Grace, for example. Perhaps it will have to be removed, or more hopefully, it will be able to shine with a few tweaks.

My next objective is shipping the reworked Epsilon boss battle in playable form soon-ish. It has been too long since the last release.

Bleeding Cyan

"To them, size and power are equivalent. It is odd to see a prisoner believe a bigger cage will set them free."

The Games Foxes Play

(complete source code | view all previous posts)

Maximum productivity.

Video showcasing the Soul Wheel, Epsilon and some dashing around.

Video showcasing the message log (it only prints random placeholder messages currently) and the Hypnotic Well (with a small graphical glitch).

  1. "Axioms" have went through a lot. Starting off as generic "press button and pre-coded effect happens", they ramped up in complexity to hilarious heights, to the point where it was possible to craft spells such as "when taking a step, across the entire map, teleport every creature in random places, then cast all of their spells in random directions" or other such ridiculous combinations. Not only is this completely OP, it is also very hard to understand, especially for those who have not touched coding a lot.

In this new Rust version, I have returned them under a simplified version, with only:

  • A Form, dictating where the effect happens.
  • A Function, dictating what the effect is.

For example, "Self-Dash" makes you dash around, but "Beam-Dash" forces a creature hit by the beam to dash, basically acting as a knockback effect. I hope that, with varied Forms and Functions, I can strike a good middlepoint between creativity and simplicity. There is still room for crazy stuff down the line.

  1. The Soul Wheel is back, now with extra crispy animations. It always offers 4 Soul casts of Vile, Ordered, Feral, Saintly or Serene type, each one linked to a Form-Function combo. For example, you can set Saintly to be your dash and Vile to be your attack Axiom. It progressively empties a "draw pile" until it "reshuffles" everything back.

    • Serene Souls are infectious, and if a creature has at least one, when it "reshuffles", a random soul will be converted to Serene type. This means that casting a lot of Axioms will eventually turn your Wheel completely cyan.
    • Some Functions can "deal damage" - there is no traditional health in TGFP, but it does steal a number of Souls from the victim, disabling them into a stunned husk once all their Souls have been absorbed.
      • Yes, this means that Serene Souls can spread to creatures which do not have them like a disease. If a room is full of creatures fighting each other and only one has a single Serene Soul, given enough time, all Souls in the room will turn Serene.
    • In order to improve the "decision-to-keypress ratio", as DCSS devs would put it, it refills itself automatically - meaning that the complete list of controls required to play my game is now composed exactly of "WASD1234" (rebindable in the future).
  2. The message log is back, with smooth and graceful scrolling. It supports coloured text with [cyan]tags[/cyan] in old school forum style - a feature that was possibly the most horrendously gory piece of code in my JavaScript version. Glad to see it be much simpler in Rust/Bevy.

  3. Epsilon the robotic snake is back to some extent. Like every creature currently, it has no AI beyond moving in random directions, but its signature multi-tile slithering is pleasing to watch.

  4. I tried to bring the Hypnotic Wells, probably the coolest thing about the JavaScript edition of my game. However, it is much harder to pull off now, because I chose to zoom out the player's view a little bit, resulting in miserably minuscule "previews" of the next level. It probably gets even worse with screen resolutions smaller than 1920x1080. Still, I got it to work, though I might end up dropping them entirely in favour of something else.

  5. I don't understand scaling and resolutions at all. How do people get this stuff right? After frustrating amounts of cyber-butchery, I can only get 1920x1080 and 960x540 to render without ugly artifacts. Meanwhile, it feels as if every single game I ever played clamps nicely to my screen no matter what, while mine is constantly too big or too small if I ask some friends to test it. How do you scale a 16x16 sprite to 24x24?? How does DCSS manage to scale its tiles so nicely no matter what size you give to your browser window???

More to come soon, I hope. I have sane and insane ideas bubbling about in equal parts, and I intend to separate the wheat from the chaff.