Skip to main content

On Sale: GamesAssetsToolsTabletopComics
Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

lfarroco

16
Posts
2
Followers
3
Following
A member registered Apr 20, 2020 · View creator page →

Creator of

Recent community posts

Happy holidays! And thanks a lot, your reports are very important: )

Here's a key for the Steam version for you GCMIK-KY657-GMIQQ  - hohoho! 🎅

I'm looking at those issues, they should be fixed for good now. As most features are already in place I can now focus on making the existing stuff better.

I didn't think about the scenario of someone having a "finished" board - never expected someone to play the game that much lol. Some things that may compensate for that are:

- consuming shop units (like demons in hearthstone)

- consuming party units (creating demand for replacement)

- having events/skills to boost units available in the shop

Another thing that I'm considering is rewarding unit upgrades more. Like getting a bronze unit into a gold one makes it "awaken" and you can choose 1 out of 3 random powers for it.

Did some fixes to power sharing/absorb, the upgrades given by "improve unit of type x", some tooltip inaccuracies, upgrading Destiny Balancer,  removed the limiting on the enemy team power, core upgrades should appear in the same order, 

Also redesigned the units of type x that were giving bonus power on every_n of that type. They should now do something closer to that type flavor (the intention was having them as the "leaders" of those types, as they are the unlocked based on amounts).

As for the large numbers, I don't think that long term we are going to have extremelly large numbers around, if we can keep each session time around 30 minutes.

About the skips, one thing that I activelly avoided in the game was having a currency to purchase stuff. But now that we have units of different tiers and demand for skips, a currency would help balancing that. I'm going to reflect on that.

(1 edit)

I'm going to look into those lategame issues today. Honestly I never went that far, but I can replicate that. I will check if there's a memory leak when loading/unloading units, which might be happening in longer sessions. I can also hardcode some units with 100t power and see if that influences the game speed.

Only thing that I still didn't address was the multiplicative effects in things that can be spammed. removing that will probably mean not being able to go past wave 40/50, but for now that might be better until things are stable.

Edit: I found a bug in the system that generates the enemy team. Basically on large round numbers a loop would run billions of times to distribute upgrades. Instead, I'm going to batch those operations and run only per unit.

(1 edit)

Now that all features that I wanted are in place I'm going to focus on bug fixes and balance.

The scaling is based on a function that creates a pool of power to distribute based on the formula (roundNumber * 10) * (1.2 ^ round -10), so after the 10th round it starts scaling exponentially.

Once I introduced the "x every y" has this issue on large numbers, I'm going to adjust it to create a single effect with (eg. for 2 power on every 100 damage, if someone deals 1000 damage it generates a single effect of 20 power instead of 10 effects of 2 power). I'm also going to add a delay of 100ms for reactions to trigger, that should stop those loops.

To make units keep their relevance, we can have some effects that allow upgrating the effects/reactions, as if they were being upgraded beyond platinum (maybe even have a label like platinum III, IV etc), something like  the MU online level of infinite scaling. Haste/slow would not benefit as much, unless if I substituted re-haste/re-slow for "every 10s of haste/slow applied" - that would scale on the same factor.

For this week, the priority is improving the gameplay feel, removing remaining wonkyness and buggy behavior.

Edit: Going to address the negative numbers and the inifite loops in a hotfix ASAP

So, I finally finished adding some unlockable units (it unlocks based on total stats, so you should have most of them when booting).

I changed the balancing, in two main points:

- the great simplification: bronze units do up to 2 things, the base effect and another effect or reaction. Currently everyone reacts to something, and I think that it makes stuff overwhelming. Only the crystals and gold units will have 3 things on them.

I'm thinking about adding events for later rounds, allowing you to add a set of predefined reactions based on types (not completely random). That would help making bronze units more useful later on. In the same way, we can have encounters to replace/buff effects. Another idea, for far in the future, is an encounter to let you change keywords in an effect, like replacing "column" with "row". 

- effects vs reactions balance: I was stupid and designed a "points" system for how much each type of action or reaction would cost, having a "budget" for each card. The idea was using cooldown to balance that. The issue is that the reaction doesn't rely on the cooldown, as it's always in stand by. So now the idea is first dividing the ponits between active and reaction first, and use the cooldown to scale only the action. I'm building an excel with some charts.

For scaling effects (power up), the idea is that they yield "profit" over the regular skills after 20s of combat.

Permanent boosts should be made more scarce, we can do that by limiting to which type of effects they trigger to (never "any"). That should also reward control builds that make the combat last as long as possible.

Here's a preview of the new unlockable units:

{
// power distributor
id: "walking_reactor",
pic: "boss_protector",
power: 30,
rank: 2,
locked: true,
cooldown: 5200,
effects: [
shield,
distributePower(row),
],
reactions: [
reaction("all", "column_allies", increasePower(20, self))
]
},
// power absorber
{
id: "spectral_knight",
pic: "boss_gol",
power: 45,
rank: 2,
locked: true,
cooldown: 5200,
effects: [
damage,
absorbPower(column)
],
reactions: [
reaction("all", "row_allies", increasePower(20, column))
]
},
// re-haste
{
id: "gold_protective_crystal",
pic: "yellow-stone",
power: 30,
rank: 2,
locked: true,
cooldown: 4500,
effects: [
shield,
haste(2000, row)
],
reactions: [
reaction("re_hasted", "allies", increasePower(20, self))
]
},
// re-slow
{
id: "corruption_bringer",
pic: "boss_legion",
power: 45,
rank: 2,
locked: true,
cooldown: 5000,
isCore: true,
effects: [
poison,
slow(2000, randomEnemy(2))
],
reactions: [
reaction("re_slow", "allies", decreasePower(2, strongestEnemy))
]
},
//on_crit
{
id: "frontline_dasher",
pic: "boss_kane",
power: 60,
rank: 2,
locked: true,
cooldown: 5500,
effects: [
damage,
increaseCritical(10, column)
],
reactions: [
reaction("on_crit", "allies", increasePower(20, column))
]
},
//over_heal
{
id: "gold_quickstone",
pic: "haste-stone",
life: 1500,
power: 45,
rank: 2,
locked: true,
cooldown: 4500,
effects: [
heal,
],
reactions: [
reaction("on_over_heal", "allies", increasePower(5, allAllies, true))
]
},
//Balancer
{
id: "gold_quickstone",
pic: "haste-stone",
life: 1500,
power: 45,
rank: 2,
locked: true,
cooldown: 4500,
effects: [
shield,
decreasePower(5, strongestAlly),
increasePower(15, weakestAlly)
],
reactions: []
},
//metronome
{
id: "gold_quickstone",
pic: "haste-stone",
life: 1500,
power: 45,
rank: 2,
locked: true,
cooldown: 4500,
effects: [
regen,
],
reactions: [
reaction("all", "left_ally", haste(2000, right)),
reaction("all", "right_ally", haste(2000, left)),
]
},
//damage -> poison
{
id: "essence_harvester",
pic: "boss_malyk",
power: 45,
rank: 2,
locked: true,
cooldown: 4500,
effects: [
poison,
],
reactions: [
reaction("every_100_damage", "allies", increasePower(10, allAlliesOfType("poison"))),
],
},
//poison -> damage
{
id: "plague_incubator",
pic: "boss_manaman",
power: 45,
rank: 2,
locked: true,
cooldown: 4500,
effects: [
poison,
],
reactions: [
reaction("every_10_poison", "allies", increasePower(10, allAlliesOfType("damage"))),
],
},
//regen -> heal
{
id: "gold_quickstone",
pic: "haste-stone",
power: 45,
rank: 2,
locked: true,
cooldown: 4500,
effects: [
regen,
],
reactions: [
reaction("every_10_regen", "allies", increasePower(10, allAlliesOfType("heal"))),
],
},
//shield -> damage
{
id: "tempest_ravager",
pic: "boss_invader",
power: 45,
rank: 2,
locked: true,
cooldown: 4500,
effects: [
regen,
],
reactions: [
reaction("every_100_shield", "allies", increasePower(10, allAlliesOfType("damage"))),
],
},
//shield -> heal
{
id: "paragon",
pic: "boss_paragon",
power: 45,
rank: 2,
locked: true,
cooldown: 4500,
effects: [
regen,
],
reactions: [
reaction("every_100_shield", "allies", increasePower(10, allAlliesOfType("heal"))),
],
},
//heal -> regen
{
id: "gold_quickstone",
pic: "haste-stone",
power: 45,
rank: 2,
locked: true,
cooldown: 4500,
effects: [
heal,
],
reactions: [
reaction("every_100_heal", "allies", increasePower(10, allAlliesOfType("regen"))),
],
},
//regen -> heal
{
id: "Mend Sage",
pic: "boss_orias",
power: 55,
rank: 2,
locked: true,
cooldown: 5200,
effects: [
regen,
],
reactions: [
reaction("every_10_regen", "allies", increasePower(10, allAlliesOfType("heal"))),
],
},
//gambler2
{
id: "gold_quickstone",
pic: "haste-stone",
power: 45,
rank: 2,
locked: true,
cooldown: 4500,
effects: [
damage,
multiplyPower(1.2, self),
multiplyPower(1.4, weakestEnemy)
],
reactions: [],
},

I found a way to avoid the "any" effect trigger multiple times for the same unit action, that should help avoiding multiple triggers to haste and charge, as that can make things go off the charts pretty quickly.

I agree that spammable percentual boosts are not a good idea, that's something better tied to a effect tied to a unit with large cooldown.

The health/power boosts for the cores are also overtuned (I tried to make them increase with a function, but I need to tune them down for the first rounds).

Crit needs some rethinking, because now it is the same as a % percentage boost. So it creates a spammable % boost. One way might be grating 1/5 of the value above 100% as 1 pwr - the player still gets something, but going over 100% is not optimal.

That reaction of the geode was the only leftover all+allies reaction (removed all the others, because not only they were extremelly op, they were also braindead reactions). Also changed directions in the mana source, because hasting the same units that charge you can't end well.

Also adjusted the description template - I'm trying to find a good way of handling non-indo-european languages, now that the descriptions are no longer using the [source]->[effect]->[target] format. This was the main frustation for new players, as the short descriptions are gibberish to them, and source of my only negative steam review : ( . Maybe we can add an option to use the short version, might be useful for more experienced players (warcraft 3 had that).

Also changed how silver/gold stores work: you get a stronger unit, but it's just one (you can't choose), so there's some risk involved because that unit might now fit into your current build.

Also the random events can't repeat in at least 5 turns.

Just published an update. 

Next step should be adding unlockable units with more advanced mechanics (eg. a balancer that  removes 5% power from the strongest unit and adding 10% to the weakest).

Hey!
Just published a update with balance chances (no more basic abilities as a reaction), more detailed descriptions, and more interesting crystal upgrades!
Later this week, I intend to add unlockable units (they might show up in the silver/gold encounters)
This took a longer time, because I added new targeting and effect options to be used by the new units and crystals: target strongest/weakes ally/enemy,  every 100 damage/heal/shield or 10 poison/regen, on over heal, on re-haste/re-slow, and more.

By the end of the week I hope to have a good package to finally apply the "1.0" label over it!

(1 edit)

Thanks again for all the insights : )
The thing about reactions to enemy actions is that I believe that it would be a mistake to have a full basic action as a rection. So "on poison, heal", "on shield, damage", has the potential of completely negating the other unit's action if the two units have the same power. We can tune it down by translating the reaction into power gain, as applying poison with 1000 power is very different from gaining 5 power. Most unit's cooldowns should probably be increased - with the other options being reducing the charged amounts. The initial idea in the game was not having enemy reactions at all. Maybe this behavior could be moved into unlocked silver-gold units, and reduce them to just 1 unit per type. I like how the inquisitor works in that regard.

I also noticed that the game is much easier to follow at 1x speed lol (some transitions' speeds need to be adjusted because they were developed with 2x speed, but the game makes much more sense).

As the game is mostly centered about getting 10 wins, I'm fine with "everything is op" in infinite mode for now.

My intention now is creating about 20 new units, 10 silver and 10 gold, to have the player unlock them.

The gold and silver shops allow the player to get an above-average unit earlier, but without much control on the types involved.

Another priority is addressing over-haste, over-slow and over-heal, and these builds are currently underpowered.

EDIT: going to check those poison ticks. We do have logic in place to only consider the difference if we have both regen and poison. I also noticed the poison counter reduce its value when the match is over.

(1 edit)

I probably got used to this game speed (as I'm the developer lol), going to tune it down!

One way of making the cores feel more unique would be unlocking skills for them.

For the poison core, some skills could be:

- add active ability: halve the power from the stronger enemy unit

- every 5 slows, increase a poison unit's power by 100

- when you steal power (new ability type I'm thinking to add), gain extra power

other ability types I intend to add, and have the cores interact with them:

- lifesteal

- power transfer (eg. move x power from left unit to right unit)

- on every x, do y (x with being damage/shield/etc)

with the board being a 2d grid we have more options, unlike a normal cardgame that is just a horizontal line

And currently the game is more balanced on the 10 wins, with infinite more serving to let the player enjoy an eventual fun build more :)

This week I will take things slower, as there's a lot IRL things showing up, but I will write down some ideas to code on Saturday.

Edit: Just had an idea. More complex units can be the ones unlocked as the player progresses and learns to play. That avoids having units that are too complex when the player is still learning. Another thing is adding a gold/platinum shop, and have overpowered units only show up there. This way we can make those units more scarce.

You are correct, fatigue damage is flat and increases exponentially. After 30s of timeout damage it will deal Infinite damage to both players (that will make you win, as it favors the player on draws). I think that increasing the timeout timer a bit will be good to give more room for units to scale and build up power, poison, regen.

I'm thinking about a revamped crystal upgrade screen, where you have sort of a skill tree to "awaken" perks. That should allow making the crystal feel more unique, as currently they are just regular units that can't be discarded.

The default game speed is actually 2x, as I'm still testing in which speed the game "feels" better.

thanks a lot, I'm going to check those issues. I agree that the any reactions are waaay too OP and trivialize formations. the only ones that should remain are for cores (so that the user can have some liberty on the types involved), but that should be it.
this weekend I spent the whole time creating the multi language tutorial, so unlockables are still on the table.

Another idea that I had is replacing the "add random reaction" orb with a set of predefined powers, like increasing the core health every x heal/regen casts, or other unique powers like that. it should help making the crystals tankier (we still have an exponential curve to beat, but I'm curious to see what players can come up with!)

Hey @Skeppartorsk!

Crit does have a special behavior when over 100%, the extra percentage get converted into extra damage. So 140% crit with 100 power is 200 + 40 damage. I can write some tests to confirm this is indeed happening.

This weekend I intend to add some unlockables and new achievements, so eventually ending a run in infinite mode should feel less frustating. Currently we have about ~60 units, so having a larger roster of ~100 should make the experience more variable too.

Charge units were indeed nerfed, with their cooldowns increased and the amount per level reduced to 0.5. At max rank (platinum), they can apply 2s of charge, so building them up can be rewarding.

I'm still looking for a proper "formula" to generate balanced units, I do have some ideas to that - but for now things the existing units are mostly experimental.

Whoa! I'm really impressed by how far you went! 2m shield?? how that does even work lol I don't want to recreate a Balatro situation where you have a good build going, and then you face The Plant (no face cards), so maybe those enemy reaction units should be adjusted or removed. They are few, because the idea was indeed nudging the player to focus more on their own board than the enemy's. One way that I tried to balance things to direct the player to have 2 or 3 types is having heal/regen as buffer supporters (like in a mmo dungeon with 1 tank, 1 heal and 3 dps).

Yesterday, I addressed a bug that confused the "triggering unit" with the "reacting unit" (it would make the growth crystal go into insane numbers). I need to check if power distribution is taking bonus power into consideration. I also added a status table after each match. (just uploaded)

I can add a new card named after you, it's the least I can do! You can even suggest what it is going to do, here's where the current units are defined https://github.com/lfarroco/mana-game/blob/main/phaser/public/assets/data/collec...

This weekend, I intend to add an initial crystal selection screen, and keep stats of previous runs and best run per crystal.

(1 edit)

Thanks a lot for the feedback!

By the way, I just uploaded a version that adds infinite mode, so in Balatro fashion OP builds can brag about how far they went!

About the balance, yeah, some tuning down is definetively needed - charge being in sets multiples of 1 full second.

Once mechanic that I want to add is "for every x, y happens". So for example, "for every 5 hastes, reduce the colldown by 1%", or  "for every 100 heal, a unit gains 10 power", "for every 100 damage, 2 poison (as like 'bleeding')". That would be similar to the overheal and "haste when alread hasted" mechanics that the bazaar has, but in a more generic way that also applies to any effect.

Would you authorize me to create an online version of the application? It would be quite handy to use it in a browser!