Ideaguyed the basics of the game's classes and mechanics, and implemented basic movement and setting of all the stats it will have. Here are the initial characters, synergies and stats I want to have:
Perhaps I'm overengineering it already with the stats but I wanna see where this goes. From SHOOTRX it seems like figuring out stats earlier is better than later, and these seem like they have enough flexibility.
Went through like 3 small refactors of how I was laying out Unit, Player and Enemy classes and how I wanted enemies to behave. Settled on just copying enemy behavior 100% from SHOOTRX, which is likely the more correct decision since it saves a lot of time.
Right now basic player and enemy movement works, as well as melee collisions between player and enemy. To do for tomorrow:
Managed to get the first 4 items of the previous todo list done. Removed the cycle stat because the way projectiles work (they're autoshot) already feels like a cycle so having that in would feel redundant. I changed it for area damage + area size stats which feel more fundamental. So currently the synergies are:
And the stats are:
HP, damage and defense are flat stats, whereas area damage, area of effect and attack speed are multipliers. This is because each character/attack has its own attack speed/area and trying to generalize that too much wouldn't work well. For tomorrow I'll just try to finish the rest of the todo, which is add more characters, port enemy spawning logic from SHOOTRX and add sounds.
Ported over enemy spawning logic and added all characters. The characters currently are:
The classes are:
I'm not sure what I should focus on next. I know that there's sounds left to add, but after that I should probably start doing the actual game progression, but for that I think need a bunch more characters. I should probably try to think of a cast of maybe 15-20 characters (however that number should be as low as possible) that fills up the current classes to their multiple levels. Levels possible are: 1, 2, 3, 2/4, 2/4/6 and 3/6.
Sounds done for everything. Surprising to me how much sounds added to the game and helped me sell all the different attacks way better than with just graphics. I should probably make it a habit to add sounds earlier rather than later from now on.
Tomorrow I should probably ideaguy the full set of characters and classes that I'll need so that the game is playable and start on implementing those additional characters as well as some class bonuses.
Ideaguyed the entire roster for the demo and implemented a few of them.
Class | Color | Set Effect |
---|---|---|
Ranger | yellow | chance to release a barrage |
Warrior | orange | increased defense |
Healer | green | increased healing effectiveness |
Mage | blue | decreased enemy defense |
Nuker | purple | increased area damage and size |
Conjurer | orange | increased construct damage and duration |
Rogue | red | chance to crit dealing 4x damage |
Enchanter | pink | increased damage to all allies |
Psy | white | returns damage taken based on number of active psy units |
Character | Description | Trigger Range | Effect Range |
---|---|---|---|
Vagrant | shoots a projectile | medium | |
Scout | throws a knife that chains 3 times | small | |
Cleric | heals every unit when any one drops below 50% HP | ||
Swordsman | deals physical damage in an area around the unit | small | medium |
Archer | shoots an arrow that pierces | very long | |
Wizard | shoots a projectile that deals AoE damage | long | very small |
Outlaw | throws a fan of 5 knives | medium | |
Blade | shoots multiple blades that deal AoE damage on contact | small | small |
Elementor | deals massive AoE damage to a random target | long | medium |
Ninja | creates clones that roam and shoot shurikens | very small | |
Linker | links nearby enemies together making them share damage taken | medium | small |
Sage | shoots a slow projectile that draws enemies in | medium | medium |
Squire | improves damage and defense for adjacent units as well as healing them periodically | ||
Cannoneer | shoots a projectile that deals massive AoE damage | long | medium |
Dual Gunner | shoots two parallel projectiles | medium | |
Hunter | shoots an arrow with a chance to summon a pet | long | small |
Chronomancer | dramatically improves attack speed for adjacent units | ||
Spellblade | knives orbit you and hoam towards nearby enemies | small | small |
Psykeeper | all damage taken is stored and distributed as healing | ||
Gambler | drops a sentry that uses random attacks | medium |
Character | Classes |
---|---|
Vagrant | warrior, ranger, psy |
Scout | rogue |
Cleric | healer |
Swordsman | warrior |
Archer | ranger |
Wizard | mage |
Outlaw | rogue, warrior |
Blade | warrior, nuker |
Elementor | mage, nuker |
Ninja | rogue, conjurer |
Linker | enchanter, nuker |
Sage | mage, nuker |
Squire | warrior, healer, enchanter |
Cannoneer | ranger, nuker |
Dual | unner [ranger, rogue |
Hunter | ranger, conjurer |
Chronomancer | mage, enchanter |
Spellblade | mage, rogue |
Psykeeper | healer, psy |
Gambler | conjurer |
Class | Set Levels | Total Units |
---|---|---|
Ranger | 2, 4 | 5 |
Warrior | 2, 4 | 5 |
Healer | 3 | 3 |
Mage | 2, 4 | 5 |
Nuker | 2, 4 | 5 |
Conjurer | 2 | 3 |
Rogue | 2, 4 | 5 |
Enchanter | 3 | 3 |
Psy | n | 2 |
Class | HP | DMG | ASPD | Area DMG | Area Size | DEF | MVSPD |
---|---|---|---|---|---|---|---|
Warrior | 1.4 | 1.1 | 0.9 | 1.0 | 1.0 | 1.25 | 0.9 |
Ranger | 1.0 | 1.2 | 1.5 | 1.0 | 1.0 | 0.9 | 1.2 |
Healer | 1.2 | 1.0 | 0.5 | 1.0 | 1.0 | 1.2 | 1.0 |
Mage | 0.6 | 1.4 | 1.0 | 1.25 | 1.25 | 0.75 | 1.0 |
Rogue | 0.8 | 1.3 | 1.1 | 0.6 | 0.6 | 0.8 | 1.4 |
Nuker | 0.9 | 1.4 | 0.75 | 1.5 | 1.3 | 1.0 | 1.0 |
Conjurer | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
Enchanter | 1.2 | 1.0 | 1.0 | 1.0 | 1.0 | 1.2 | 1.2 |
Psy | 1.5 | 1.0 | 1.0 | 1.0 | 1.0 | 0.5 | 1.0 |
I've implemented up to Elementor today and ATM in the process of doing Ninja, but today seems like a particularly low energy day so I'm just going to play some games instead.
Not a lot done today... My sleep schedule is fucked up and I've been unable to focus properly. I managed to get 2 characters done though and also changed their definitions a bit:
Finished all characters finally. My sleep is so fucked these two days blended together seamlessly. It's so fucking hot and I'm so tired. God damn I fucking hate the summer so fucking much. I hope I can sleep properly today. Definition changes for one character: Spellblade - knives slowly spiral outwards.
Tomorrow I'll probably do some UI work so the player can buy new characters as he goes from arena to arena, or work on the game's progression in terms of enemy HP and DMG. These are fundamentally the only two things missing and I have a essentially 1 week to do them, which should be more than enough.
Note: remember to attribute https://freesound.org/people/Hybrid_V/sounds/321215/ for turret_deploy sound in credits.
Another day with almost no sleep and just general low energy because of it... I managed to get things done though. I got all the class set bonuses working. Here's what they do:
Class | Set Numbers | Set Effect |
---|---|---|
Ranger | 2/4 | 10/20% chance to release a barrage |
Warrior | 2/4 | +25/+50 defense |
Healer | 3 | +25% healing effectiveness |
Mage | 2/4 | -15/-30 enemy defense |
Nuker | 2/4 | +15/25% area damage and size |
Conjurer | 2 | +25% construct damage and duration |
Rogue | 2/4 | 10/20% chance to crit dealing 4x damage |
Enchanter | 3 | +25% damage to all allies |
Tomorrow I should get started on going from arena to arena, buying characters and figuring out enemy scaling.
Took a break today. Although I went through the game's stats because I noticed some of them were diverging from my internal docs as well as the tables posted to the devlog a few days ago. Here are current tables based on what's actually in the code:
Class | Set Color | Set Numbers | Total Units | Set Effect |
---|---|---|---|---|
Ranger | green | 2/4 | 5 | 10/20% chance to release a barrage |
Warrior | yellow | 2/4 | 5 | +25/+50 ally defense |
Healer | green | 3 | 3 | +25% healing effectiveness |
Mage | blue | 2/4 | 5 | -15/-30 enemy defense |
Nuker | blue | 2/4 | 5 | +15/25% area damage and size |
Conjurer | yellow | 2 | 3 | +25% construct damage and duration |
Rogue | red | 2/4 | 5 | 10/20% chance to crit dealing 4x damage |
Enchanter | red | 3 | 3 | +25% damage to all allies |
Character | Description | Trigger Range | Effect Range |
---|---|---|---|
Vagrant | shoots a projectile | medium | |
Swordsman | deals damage in an area around the unit | small | medium |
Wizard | shoots a projectile that deals AoE damage | big | very small |
Archer | shoots an arrow that pierces | very big | |
Scout | throws a knife that chains 3 times | small | |
Cleric | heals every unit when any one drops below 50% HP | ||
Outlaw | throws a fan of 5 knives | medium | |
Blade | shoots multiple blades that deal AoE damage on contact | small | small |
Elementor | deals massive AoE damage to a random target | big | big |
Saboteur | calls 4 other saboteurs to seek targets and deal AoE damage | very small | |
Stormweaver | infuses all allied projectiles with chain lightning | medium | small |
Sage | shoots a slow projectile that draws enemies in | medium | small |
Squire | improves damage and defense for adjacent units as well as healing them periodically | ||
Cannoneer | shoots a projectile that deals massive AoE damage | long | medium |
Dual Gunner | shoots two parallel projectiles | medium | |
Hunter | shoots an arrow with a chance to summon a pet | very long | |
Chronomancer | improves attack speed for adjacent units | ||
Spellblade | knives that pierce spiral outwards | ||
Psykeeper | all damage taken is stored and distributed as healing to all allies | ||
Engineer | drops sentries that attacks with a burst of projectiles | medium |
Character | Classes |
---|---|
Vagrant | warrior, ranger, psy |
Swordsman | warrior |
Wizard | mage |
Archer | ranger |
Cleric | healer |
Scout | rogue |
Outlaw | rogue, warrior |
Blade | warrior, nuker |
Elementor | mage, nuker |
Saboteur | rogue, conjurer, nuker |
Stormweaver | enchanter |
Sage | mage, nuker |
Squire | warrior, healer, enchanter |
Cannoneer | ranger, nuker |
Dual Gunner | ranger, rogue |
Hunter | ranger, conjurer |
Chronomancer | mage, enchanter |
Spellblade | mage, rogue |
Psykeeper | healer, psy |
Engineer | conjurer |
Class | HP | DMG | ASPD | Area DMG | Area Size | DEF | MVSPD |
---|---|---|---|---|---|---|---|
Warrior | 1.4 | 1.1 | 0.9 | 1 | 1 | 1.25 | 0.9 |
Ranger | 1 | 1.2 | 1.5 | 1 | 1 | 0.9 | 1.2 |
Healer | 1.2 | 1 | 0.5 | 1 | 1 | 1.20 | 1 |
Mage | 0.6 | 1.4 | 1 | 1.25 | 1.2 | 0.75 | 1 |
Rogue | 0.8 | 1.3 | 1.1 | 0.6 | 0.6 | 0.8 | 1.4 |
Nuker | 0.9 | 1 | 0.75 | 1.5 | 1.3 | 1 | 1 |
Conjurer | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Enchanter | 1.2 | 1 | 1 | 1 | 1 | 1.2 | 1.2 |
Psy | 1.5 | 1 | 1 | 1 | 1 | 0.5 | 1 |
I didn't work on anything.
UI work on the game's first screen. These days that I ended up not doing nothing happened because of a mix of me not knowing what to do next, fixing my sleep schedule (failed, so I give up on this already), and trying to think up how exactly I want the game's UI to be like. I ended up thinking too much and paralyzed myself into not doing anything.
Right now I'm just doing the most basic thing I can that still looks reasonably OK and conveys all the info needed.
More UI stuff. Fairly slow moving but I'm slowly getting a clearer picture in my head of what the game's UI should be like which should make it easier to get it done.
Also found this cool article today: https://halt.software/dead-simple-layouts/. This reminds me of one of my attempts from a few years ago at creating a clean UI abstraction but with a slightly different focus that seems promising. I wonder if I should try implementing this now or leave it for the next game.
Transition from first screen to first level works. Polish it up tomorrow with more sounds, tutorial markers (left/right arrows) and more consistency and anticipation when a level ends, and then start work on the main buy screen.
First screen, transition from it to arena, arena and transition from arena to next screen are 99% complete and polished. There's one small bug left that I can't replicate where it will end the level right away, but I can't tell with which win condition it's happening... I'll fix it in time. Tomorrow I can get started on the main buy screen for real.
Initial work done on the main buy screen. Fairly slow moving still. There's a sort of conceptual fuzziness that happens when writing UI code where there's a few different ways of doing it and this freedom seems fairly paralyzing. I've been thinking really hard about what to do about that but it's still up in the air. The "dead simple layouts" thing is a good idea but layouting is not necessarily the main problem I have, it's more like relationships between different objects and a UI coordination issue that seems to stop me.
More UI progress on buy screen.
Finished all visual progress on the main buy screen. Now all I have to do is make it all work logically, which is actually a lot easier than making it all work visually. This fact tells me that most of my problems with UI programming have to do with visuals and not much else. I would wager that most of it has to do with not knowing how the overall UI should look, and the rest is just building each UI component visually in a quick and easy way.
The first problem can be fixed by just trying to draw the UI beforehand, which I never do but maybe I should start doing. The second problem is more involved and essentially it involves writing UI components that are generic enough like buttons, labels, image buttons, lists, etc, but also allow for enough specialization that I can make them really juicy, as this generally requires a lot of detail fiddling the inner works of the object. I think the Node refactor I'm planning will probably help with this, especially the idea of everything simply being a Node and classes being able to be defined inline by just defining update/draw/on_enter/etc functions.
Finished buy screen. Now the only two things left is are redoing the first screen to take advantage of all the UI built for the buy screen, balance/progression and then fixing smaller details and finishing everything up. I can probably finish it all before day 30 which would be great.
The game is finally playable from start to finish. It is pretty fun as it is but it's clear that a few things need to be added so it can be even better. I'll add these after I release the demo with the game in the current state since these additions will take some time and I don't want to delay the demo's release any more than necessary.
Enemies right now feel pretty samey, and a few small modifiers would help a lot:
Every 3rd level there should be a difficult increase in the multiplier for enemy stats as well as a mini boss. This mini boss has significantly increased HP and damage and can spawn enemies of his own on top of the ones spawned by the level. He can also grant modifiers to enemies. Upon completing such a level, the player will be granted the chance to choose 1 out of 3 passive items.
Mostly done with balance tuning. Now all that's left are some final details:
The demo is finally 100% complete. Now tomorrow I'll spend some time recording gameplay and hopefully finishing the trailer. After that I can start working on the steam page. If I have it done by tomorrow and Valve takes 5 business days to approve the store page I should have everything ready by the 25th. And then I can release the game 14 days after that, which would be the 8th of April. I definitely want to release it around that time, before the 15th because then I will have completed the game in less than 60 days which is my limit, although I should probably aim for 40 days going forward.
This latest week I did everything necessary to get the game into a playable state as well as all the work needed for a Steam page. Most of it was spent making the trailer, but I feel like the more trailers I make the faster I get at making them. This time it took like 3-4 days out of laziness, but I can easily see it being a 1 day job in the future.
I also tested the demo out with a few people and the results were underwhelming. No one seemed to play it for too much time, which I suspected would happen given that the longer term loop of the game isn't in yet. More interestingly though, all of the feedback I was given about things that needed to be changed were things that I knew needed to be changed/added for the game's release, which means that I have a pretty good idea of where the game is from other people's perspective.
The web build has a few bugs that I can't fix like sound effects not playing randomly, and since my strategy was doing a web demo coupled with the page's release, I've decided to change it. Both because of these bugs and the underwhelming response I feel like releasing a demo at this point will damage the game more than help it. I have ~3 weeks until release date (13th of April) from now, and that should be enough to add enough things into the game to make it significantly better.
Going forward I think the Steam page reveal demo strategy probably isn't a good idea for these 1 month games. They're small enough already as they are and releasing them in an ever more crude state is probably a waste of time. The only thing I need to schedule better for next releases is my trailer making timing. If I want to release a game in 1 month I need to have a trailer by day 15 at the latest, which means I need to work on the game for 2 weeks and then take 1 day to make a trailer.
As for feedback given from the demo:
Spent most of this week relaxing and ideaguying the next things I need to do. The reaction to the demo was already underwhelming but the reaction to the game reveal itself from the Internet at large was also fairly underwhelming. For BYTEPATH it was also like this and the 2 weeks of building wishlists were basically dead and I was only able to gain traction on release day, but for this game it seems even worse. Hopefully by the time release day comes people will respond better, otherwise this is a big GG and this game will just be played by like 100 people at most.
This also further solidifies my previous thoughts that the 2 weeks delay from steam up to release is best thought of as non-existent. For this game I tried a 2 step process, work on a demo and release that with the game's reveal and steam page, and then finish the rest of the game after that. But the amount of work needed to do a proper reveal with trailers and playable demo was pretty large, and it didn't really amount to anything. The demo was too unfinished (and I knew it was) for any feedback to matter, and people just didn't respond at all to the game's reveal.
So a better plan for future games might be to just make a game in 1-2 months, and then spend 1 week or so doing everything needed to put the page up, do it, and then move on to the next game while waiting the 2 weeks before release is possible. This also works better because it's very hard to switch from marketing mode back to development mode on the same project, whereas switching to a new project while waiting for those 2 weeks is probably more feasible.
Whatever way it goes, here's my plan for what to do until release:
Character | Classes | Description |
---|---|---|
Vagrant | psyker, ranger, warrior | shoots a projectile |
Swordsman | warrior | deals AoE damage and deals extra damage for each unit hit |
Wizard | mage | shoots a projectile that deals AoE damage |
Archer | ranger | shoots an arrow that pierces |
Scout | rogue | throws a knife that chains 3 times |
Cleric | healer | heals a unit when its health drops below half HP |
Outlaw | warrior, rogue | throws a fan of 5 knives |
Blade | warrior, nuker | throws multiple blades that deal AoE damage |
Elementor | mage, nuker | deals AoE damage in a large area centered on a random target |
Saboteur | rogue, conjurer, nuker | calls saboteurs to seek targets and deal AoE damage |
Stormweaver | enchanter | infuses all allied projectiles with chain lightning that deals extra damage |
Sage | nuker | shoots a slow moving projectile that pulls enemies in |
Squire | warrior, enchanter | increased damage and defense to all allies |
Cannoneer | ranger, nuker | shoots a projectile that deals AoE damage |
Dual Gunner | ranger, rogue | shoots two parallel projectiles |
Hunter | ranger, conjurer | shoots an arrow that has a chance to summon a pet |
Chronomancer | mage, enchanter | increased attack speed to all allies |
Spellblade | mage, rogue | throws knives that spiral outwards and pierce |
Psykeeper | healer, psyker | stores damage taken by all allies and redistributes it as healing |
Engineer | conjurer | drops sentries that shoot bursts of projectiles |
Plague Doctor | nuker, voider | creates an area that deals DoT |
Fisherman | trapper, warrior | throws a net that entangles enemies and prevents them from moving |
Juggernaut | forcer, warrior | creates a small area that deals AoE damage and pushes enemies away |
Lich | mage | launches a chain frost that chains 7 times, dealing damage and slowing enemies it hits |
Cryomancer | mage, voider | nearby enemies take DoT and have decreased movement speed |
Pyromancer | mage, nuker, voider | nearby enemies take DoT and deal decreased damage |
Corruptor | ranger, swarmer | spawn 3 small critters if the corruptor kills an enemy |
Beastmaster | rogue, swarmer | spawn 2 small critters if the beastmaster crits |
Launcher | trapper, forcer | creates a trap that launches enemies that trigger it |
Spiker | trapper, rogue | creates a trap that crits when triggered |
Assassin | rogue, voider | throws a piercing knife that inflicts poison |
Host | conjurer, swarmer | creates overlords that periodically spawn small critters |
Carver | conjurer, healer | carves a statue that periodically heals in an area |
Bane | swarmer, voider | periodically spawn a small critter that explodes and deals DoT |
Psykino | mage, psyker, forcer | quickly pulls enemies together and then release them with a force |
Arbalester | ranger, forcer | launches a massive arrow that pushes enemies back, ignoring knockback resistances |
Pirate | warrior, forcer | launches a hook that captures nearby enemies and pulls them towards you |
Sapper | trapper, enchanter, healer | creates a trap that steals health from enemies and grants you increased movement speed |
Priest | healer | heals all units periodically |
Burrower | trapper, swarmer | creates a trap that contains 6 small critters |
Flagellant | psyker, enchanter | periodically deals damage to self and grants a damage buff to all allies |
Character | Lv.3 Effect Name | Lv.3 Effect Description |
---|---|---|
Vagrant | Champion | gains increased damage and attack speed based on number of active sets |
Swordsman | Cleave | damage is doubled |
Wizard | Magic Missile | the projectile chains 5 times, each dealing AoE damge on impact |
Archer | Bounce Shot | the arrow ricochets off walls 3 times |
Scout | Replica | each chain grants increased damage and the last chain splits |
Cleric | Mass Heal | heals all units instead |
Outlaw | Fatal Roulette | every 3rd attack throws a nova of 15 knives instead |
Blade | Blade Resonance | deal additional damage based on number of enemies hit |
Elementor | Windfield | slows enemies hit |
Saboteur | Chain Reaction | if an enemy dies from a saboteur explosion it also explodes |
Stormweaver | Lightning Spire | cast a spire of lightning periodically |
Sage | Dimension Compression | when the projectile expires deal damage to all enemies under its influence |
Squire | Repair | you can reroll your item choices once, these opportunities stack if unused |
Cannoneer | Cannon Barrage | showers the area in additional cannon shots that deal AoE damage |
Dual Gunner | Gun Kata | every 5th attack shoots projectiles in a rapid succession for a duration targetting all nearby enemies |
Hunter | Feral Pack | summons 3 pets |
Chronomancer | Quicken | enemies take DoT faster |
Spellblade | Spiralism | faster projectile speed and tighter turns |
Psykeeper | Crucio | also redistributes damage taken as damage to all enemies |
Engineer | Upgrade | every 3rd sentry dropped, upgrade all sentries, giving increased damage and attack speed |
Plague Doctor | Pandemic | inflicts enemies with a contagion that deals additional DoT, if they die from it it passes to a nearby enemy |
Fisherman | Electric Net | enemies caught take DoT |
Juggernaut | Brutal Impact | enemies pushed away are instantly killed if they hit a wall |
Lich | Piercing Frost | chain frost ignores enemy defenses |
Cryomancer | Frostbite | enemies killed by the cryomancer freeze nearby enemies, frozen enemies can't move and take increased damage |
Pyromancer | Ignite | enemies killed by the pyromancer explode, dealing AoE damage |
Corruptor | Infestation | spawn 3 small critters if the corruptor hits an enemy |
Beastmaster | Call of the Wild | spawn 2 small critters if the beastmaster gets hit |
Launcher | Kineticism | enemies launched that hit other enemies transfer their kinetic energy |
Spiker | Caltrops | slows enemies hit and deals DoT |
Assassin | Toxic Delivery | poison inflicted from crits deals more damage |
Host | Invasion | increased critter spawn rate |
Carver | World Tree | carves a tree that heals in a bigger are and removes all buffs from enemies |
Bane | Baneling Swarm | spawn 4 banelings |
Psykino | Magnetic Force | enemies pulled together are forced to collide with each other multiple times |
Arbalester | Ballista Sinistra | enemies hit by the arrow have massively decreased defense |
Pirate | Jolly Roger | place a flag that grants gold based on number of enemies killed under its effect |
Sapper | Chain Reaction | when a sapper trap is triggered other nearby traps are also triggered |
Priest | Divine Intervention | at the start of the round pick 3 units at random and grants them a buff that prevents them from dying once |
Burrower | Zergling Rush | triples the number of critters released |
Flagellant | Zealotry | deals damage to all allies instead for a massively increased damage buff |
Class | Set Color | Set Numbers | Total Units | Set Effect |
---|---|---|---|---|
Ranger | green | 3/6 | 8 | +10/20% chance to release a barrage to allied rangers |
Warrior | yellow | 3/6 | 8 | +25/50 defense to allied warriors |
Mage | blue | 3/6 | 8 | -15/30 enemy defense |
Rogue | red | 3/6 | 8 | +10/20% chance to crit to allied rogues, dealing 4x damage |
Healer | green | 2/4 | 5 | +15/30% healing effectiveness |
Enchanter | blue/red | 2/4 | 5 | +15/25% damage to all allies |
Nuker | blue/purple | 3/6 | 7 | +15/25% area damage and size to allied nukers |
Conjurer | orange | 2/4 | 5 | +25/50% summon damage and duration |
Psyker | white | 2/4 | 4 | +5/10% damage and health per active set to allied psykers |
Trapper | orange | 2/4 | 5 | +1/2 extra traps released |
Forcer | yellow | 2/4 | 5 | +25/50% knockback force to all allies |
Swarmer | green/purple/orange | 2/4 | 5 | +1/3 health to critters |
Voider | purple | 2/4 | 5 | +15/25% DoT to allied voiders |
Class | HP | DMG | ASPD | Area DMG | Area Size | DoT DMG | DEF | MVSPD |
---|---|---|---|---|---|---|---|---|
Ranger | 1 | 1.2 | 1.5 | 1 | 1 | 1.1 | 0.9 | 1.2 |
Warrior | 1.4 | 1.1 | 0.9 | 1 | 1 | 1 | 1.25 | 0.9 |
Mage | 0.6 | 1.4 | 1 | 1.25 | 1.2 | 1.25 | 0.75 | 1 |
Rogue | 0.8 | 1.3 | 1.1 | 0.6 | 0.6 | 1.4 | 0.8 | 1.4 |
Healer | 1.2 | 1 | 0.5 | 1 | 1 | 1 | 1.20 | 1 |
Enchanter | 1.2 | 1 | 1 | 1 | 1 | 1 | 1.2 | 1.2 |
Nuker | 0.9 | 1 | 0.75 | 1.5 | 1.3 | 0.75 | 1 | 1 |
Conjurer | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Psyker | 1.5 | 1 | 1 | 1 | 1 | 1 | 0.5 | 1 |
Trapper | 1 | 1 | 1 | 1 | 1 | 1.1 | 0.75 | 1 |
Forcer | 1.25 | 1.1 | 0.9 | 0.75 | 0.75 | 1 | 1.2 | 1 |
Swarmer | 1.2 | 1 | 1.25 | 1 | 1 | 1 | 0.75 | 0.5 |
Voider | 0.75 | 1.3 | 1 | 0.8 | 0.75 | 2 | 0.6 | 0.8 |
As I work on this project the inevitable conclusion that I came to in regards to the codebase is that everything can be conceptually simplified if every entity becomes a Node. Before I switch to execution mode for the next month to finish this game I should take this moment to expand on the refactor that I'll work on right after this project is done.
A node is an object that has a parent and children. Nodes can be added to other nodes and it will form a tree, or a graph, since nodes can also link back to one another arbitrarily. Every object in the game is going to be turned into a node, which means that everything will start from a root node and be initialize/updated/drawn from there.
root = Node()
root:append(Node():tag'player')
Here a root node is created and a child tagged with the unique identifier player
attached to it. This means that in the node's children
list, the first node will be this player
node.
Each tag should be unique so that we can refer to nodes in the graph by their names, and in this case we would refer to the child node by saying root.player
.
Similarly, root.player.parent
automatically is set to refer back to root
.
This simple setup eliminates the need for different types of container objects, which right now in Anchor are Group
, State
and GameObject
. All of those objects have disparate/repeated ways
of handling updates/draws, when in reality they're all doing the same thing and that similarity should be conceptually reflected at the engine level.
root:append(Node(Timer, State):tag'arena':init(arena_init):update(arena_update):on_enter(arena_on_enter))
The above code shows the main way of adding functionality to a node. Instead of defining new classes for different behaviors I prefer doing everything locally, which means defining the entire class exactly
where the instance is created. In this case, it means passing the expected behaviors as functions. In this case we have init
, update
and on_enter
who expect functions to be defined and passed in, and
for brevity's sake I just passed in the variables arena_init
, arena_update
and arena_on_enter
. In a real use case these would be functions defined here directly instead of variables holding a function.
A Node object expects init
and update
by default, but not on_enter
. This is where the variables being passed in to the Node()
call come in. The primary way of altering what functions a node expects
to be passed to it will happen through mixins, which are what are being passed to the node at first.
In this case, the State
mixin changes the node such that it expects an on_enter
function, which is called whenever the node's active
variable becomes true (this variable is also controlled by the State mixin).
This is useful for both high level state changes, such as changing between levels, but also for low level ones, such as changing between animation states.
In this example we can see a real use case of how this node system ties everything conceptually together, as we get the same mixin code being used seamlessly for two completely different tasks.
Mixins always will derive from Object and be created according to how classic says they should be. I'll only change it so that name collisions are detected and the program exits. This will be the main way to build objects and the last thing I need is random bugs because a function or variable from one mixin overwrote the other.
Added a spawn marker so that it's easier for the player to tell where enemies are spawning and to give a chance to avoid unfair deaths. Slowly getting back into it now...
Nothing.
Updated all tables with text descriptions as well as stats and overall gameplay numbers for all classes and characters. Tomorrow I start implementing the remaining 4 classes and 20 characters as well as revising the existing ones.
Nothing... Finding the energy to work on this has been getting harder. I'm sure I'll get to it eventually but for now I've been spending time with some more fun projects.
Lots of improvements and fixes to lots of different things that needed improving and fixing. I also started on the implementation of characters and Lv.3 effects. Today I got 10 out of 40 characters done completely:
Character | Classes | Description |
---|---|---|
Vagrant | psyker, ranger, warrior | shoots a projectile that deals X damage |
Swordsman | warrior | deals X AoE damage in an area, deals extra X/3 damage per unit hit |
Wizard | mage | shoots a projectile that deals X AoE damage |
Archer | ranger | shoots an arrow that deals X damage and pierces |
Scout | rogue | throws a knife that deals X damage and chains 3 times |
Cleric | healer | heals a unit for 20% of its max HP when it drops below 50% max HP |
Outlaw | warrior, rogue | throws a fan of 5 knives, each dealing X damage |
Blade | warrior, nuker | throws multiple blades that deal X AoE damage |
Elementor | mage, nuker | deals X AoE damage in a large area centered on a random target |
Saboteur | rogue, conjurer, nuker | calls 2 saboteurs to seek targets and deal X AoE damage |
Character | Lv.3 Effect Name | Lv.3 Effect Description |
---|---|---|
Vagrant | Champion | +10% damage and +5% attack speed per active set |
Swordsman | Cleave | the swordsman's damage is doubled |
Wizard | Magic Missile | the projectile chains 5 times |
Archer | Bounce Shot | the arrow ricochets off walls 3 times |
Scout | Dagger Resonance | +25% damage per chain and +3 chains |
Cleric | Mass Heal | heals all units |
Outlaw | Flying Daggers | +50% outlaw attack speed and his knives seek enemies |
Blade | Blade Resonance | deal additional X/2 damage per enemy hit |
Elementor | Windfield | slows enemies by 60% for 6 seconds on hit |
Saboteur | Demoman | the explosion has 50% chance to crit, increasing in size and dealing 2X damage |
Implemented 11 characters today and was going to do more but spent a lot of time trying to make traps work and I couldn't figure it out. Have to idea guy a mechanic other than traps to fill their spot now... Either way, 21 out of 40 characters 100% done is still good.
Character | Classes | Description |
---|---|---|
Stormweaver | enchanter | infuses projectiles with chain lightning that deals 20% damage to 2 enemies |
Sage | nuker | shoots a slow projectile that pulls enemies in |
Squire | warrior, enchanter | +15% damage and defense to all allies |
Cannoneer | ranger, nuker | shoots a projectile that deals 2X AoE damage |
Dual Gunner | ranger, rogue | shoots two parallel projectiles, each dealing X damage |
Hunter | ranger, conjurer | shoots an arrow that deals X damage and has a 20% chance to summon a pet |
Chronomancer | mage, enchanter | +20% attack speed to all allies |
Spellblade | mage, rogue | throws knives that deal X damage, pierce and spiral outwards |
Psykeeper | healer, psyker | all damage taken is stored up to 50% max HP and distributed as healing to all allies |
Engineer | conjurer | drops sentries that shoot bursts of projectiles, each dealing X damage |
Plague Doctor | nuker, voider | creates an area that deals X damage per second |
Character | Lv.3 Effect Name | Lv.3 Effect Description |
---|---|---|
Stormweaver | Wide Lightning | chain lightning's trigger area of effect and number of units hit is doubled |
Sage | Dimension Compression | when the projectile expires deal 3X damage to all enemies under its influence |
Squire | Repair | you can reroll your item choices once, these opportunities stack if unused |
Cannoneer | Cannon Barrage | showers the area in 5 additional cannon shots that deal X/2 AoE damage |
Dual Gunner | Gun Kata | every 5th attack shoots in rapid succession for 2 seconds |
Hunter | Feral Pack | summons 3 pets and the pets ricochet off walls once |
Chronomancer | Quicken | enemies take damage over time 50% faster |
Spellblade | Spiralism | faster projectile speed and tighter turns |
Psykeeper | Crucio | also redistributes damage taken as damage to all enemies at double value |
Engineer | Upgrade | every 3rd sentry dropped upgrade all sentries with +100% damage and attack speed |
Plague Doctor | Black Death Steam | nearby enemies take an additional X damage per second |
Implemented more 7 units fully. Today was slower because these were all new units that also were the first units for the new 4 classes, so I had to do some more work to get it going. The rest should go faster tomorrow.
Character | Classes | Description |
---|---|---|
Barbarian | curser, warrior | deals X AoE damage and stuns enemies hit for 4 seconds |
Juggernaut | forcer, warrior | deals X AoE damage and pushes enemies away with a strong force |
Lich | mage | launches a slow projectilt that jumps 7 times, dealing 2X damage per hit |
Cryomancer | mage, voider | nearby enemies take X damage per second |
Pyromancer | mage, nuker, voider | nearby enemies take X damage per second |
Corruptor | ranger, swarmer | spawn 3 small critters if the corruptor kills an enemy |
Beastmaster | rogue, swarmer | spawn 2 small critters if the beastmaster crits |
Character | Lv.3 Effect Name | Lv.3 Effect Description |
---|---|---|
Barbarian | Seism | stunned enemies also take +100% damage |
Juggernaut | Brutal Impact | enemies pushed by the juggernaut take 4X damage if they hit a wall |
Lich | Chain Frost | chain frost slows enemies hit by 80% for 2 seconds and chains +7 times |
Cryomancer | Frostbite | enemies are also slowed by 60% while in the area |
Pyromancer | Ignite | enemies killed by the pyromancer explode, dealing X AoE damage |
Corruptor | Corruption | spawn 3 small critters if the corruptor hits an enemy |
Beastmaster | Call of the Wild | spawn 2 small critters if the beastmaster gets hit |
Even slower day today, but I managed to get something done. I'm hoping I can finish the other 9 characters tomorrow but it might go slow too...
Character | Classes | Description |
---|---|---|
Launcher | forcer, warrior | nearby enemies are pushed after 4 seconds, taking 2X damage on wall hit |
Bard | curser, rogue | throws a knife that deals X damage and inflicts enemies hit with the bard's curse |
Assassin | voider, rogue | throws a piercing knife that deals X damage and inflicts poison that deals X/2 damage per second for 3 seconds |
Host | swarmer | periodically spawn 1 small critter |
Character | Lv.3 Effect Name | Lv.3 Effect Description |
---|---|---|
Launcher | Kineticism | enemies launched take 300% more damage when they hit walls |
Bard | The Bard's Song | every 8th attack consume the curse to deal 4X damage to affected enemies |
Assassin | Toxic Delivery | poison inflicted from crits deals 8X damage |
Host | Invasion | +100% critter spawn rate and spawn 2 critters instead |
Still slow... But I got something done :)
Character | Classes | Description |
---|---|---|
Carver | conjurer, healer | carves a statue that periodically heals 1 unit for 20% max HP if in range |
Bane | voider, curser | creates a large area that curses enemies to take +50% damage |
Psykino | mage, psyker, forcer | pulls enemies together for 2 seconds |
Barrager | ranger, forcer | shoots a barrage of 5 arrows, each dealing X damage and pushing enemies |
Character | Lv.3 Effect Name | Lv.3 Effect Description |
---|---|---|
Carver | World Tree | carves a tree that heals twice as fast, in a bigger area, and heals 2 units instead |
Bane | Nightmare | the area also deals X damage per second and slows enemies by 50% |
Psykino | Magnetic Force | enemies take 4X damage and are pushed away when the area expires |
Barrager | Barrage | every 3rd attack the barrage shoots 15 projectiles and they push harder |
Finished remaining 5 characters and revised all class bonuses. So 40/40 characters and 13/13 classes done. Now the only thing left are items and then all content will be done.
Character | Classes | Description |
---|---|---|
Highlander | warrior | deals 5X AoE damage |
Fairy | enchanter, healer | periodically heals 1 unit at random and grants it +100% attack speed for 6 seconds |
Priest | healer | heals all allies for 20% their max HP |
Infestor | curser, swarmer | curses nearby enemies for 6 seconds, they will release 2 critters on death |
Flagellant | enchanter, psyker | deals 2X damage to self and grants +4% damage to all allies per cast |
Character | Lv.3 Effect Name | Lv.3 Effect Description |
---|---|---|
Highlander | Moulinet | quickly repeats the attack 3 times |
Fairy | Whimsy | heals 2 units instead and grants them an additional 100% attack speed |
Priest | Divine Intervention | at the start of the round pick 3 units at random and grants them a buff that prevents death once |
Infestor | Infestation | triples the number of critters released |
Flagellant | Zealotry | deals 2X damage to all allies and grants +12% damage to all allies per cast |
Class | Set Color | Set Numbers | Total Units | Set Effect |
---|---|---|---|---|
Ranger | green | 3/6 | 7 | +10/20% chance to release a barrage to allied rangers |
Warrior | yellow | 3/6 | 8 | +25/50 defense to allied warriors |
Mage | blue | 3/6 | 8 | -15/30 enemy defense |
Rogue | red | 3/6 | 8 | +10/20% chance to crit to allied rogues, dealing 4x damage |
Healer | green | 2/4 | 5 | +15/30% healing effectiveness |
Enchanter | blue/red | 2/4 | 5 | +15/25% damage to all allies |
Nuker | blue/purple | 3/6 | 7 | +15/25% area damage and size to allied nukers |
Conjurer | orange | 2/4 | 4 | +25/50% summon damage and duration |
Psyker | white | 2/4 | 4 | +5/10% damage and attack speed per active set to allied psykers |
Curser | purple | 2/4 | 5 | +25/50% curse dueration |
Forcer | yellow | 2/4 | 5 | +25/50% knockback force to all allies |
Swarmer | orange | 2/4 | 4 | +1/3 health to critters |
Voider | purple | 2/4 | 5 | +15/25% DoT to allied voiders |
Had to ideaguy all 40 passives. Managed to do it and also get the passive selection screen working partly. Tomorrow I should finish it and start working through the 40 passives, which should go significantly faster than the characters since I made sure to pick types of passives that were already implemented one way or another in the game.
Finished literally everything needed to make passives work, now I only need to actually make them. The more I work on this the clearer the parts that slow me down because they're annoying to work with become. Generally it's higher level "glue" type of code, rather than the code that actually makes the thing work as a unit. So the node refactor for instance is addressing a lot of this glue code by making it conceptually the same thing, which should make it easier to work with. The rect cutting UI idea does something similar the high level part of UI, which tends to be mostly layouting. And so on.
20 out of 40 passives done today.
Name | Description |
---|---|
Ouroboros Technique R | rotating around yourself to the right makes units release projectiles |
Ouroboros Technique L | rotating around yourself to the left grants +25% defense to all units |
Wall Echo | hitting walls has a 34% chance of releasing 2 projectiles |
Wall Rider | hitting walls grants a 25% movement speed buff for 1 second |
Centipede | +20% movement speed |
Intimidation | enemies spawn with -20% max HP |
Vulnerability | enemies take +20% damage |
Temporal Chains | all enemies move 20% slower |
Amplify | +25% AoE damage |
Amplify X | +50% AoE damage |
Resonance | all AoE attacks deal +5% damage per enemy hit |
Ballista | +25% damage to rangers and rogues |
Ballista X | +50% damage to rangers and rogues |
Point Blank | projectiles deal up to +100% damage up close and down to -50% damage far away |
Longshot | projectiles deal up to +100% damage far away and down to -50% damage up close |
Blunt Arrow | all arrows fired by rangers have a 20% chance to knockback |
Explosive Arrow | all arrows fired by rangers have a 30% chance to explode, dealing 20% AoE damage |
Divine Machine Arrow | all arrows fired by rangers have a 40% chance to seek enemies and pierce 5 times |
Chronomancy | all mages cast their spells 25% faster |
Awakening | every round 1 mage is granted +100% cast speed and damage for that round |
Name | Description |
---|---|
Divine Punishment | periodically deal 10X damage to all enemies, where X is how many mages you have |
Berserking | all warriors have up to +50% attack speed based on missing HP |
Unwavering Stance | all warriors gain +5% defense every 5 seconds |
Ultimatum | projectiles that chain gain +25% damage with each chain |
Flying Daggers | all knives thrown by rogues chain +2 times |
Magnify | +25% area size |
Concentrated Fire | -50% area size and +50% area damage |
Unleash | +2% area size and damage per second |
Reinforce | +10% damage, defense and attack speed to all allies if you have at least one enchanter |
Payback | +5% damage to all allies whenever an enchanter is hit |
Blessing | +20% healing effectiveness |
Hex Master | +25% curse duration |
Whispers of Doom | curses apply doom, when 4 doom instances are reached they deal 200 damage |
Force Push | +25% knockback force |
Heavy Impact | when enemies hit walls they take damage according to the knockback force |
Crucio | taking damage also shares that amount to each enemy |
Immolation | 3 allies will periodically take damage, all allies gain +8% damage per tick |
Call of the Void | +25% damage over time |
Spawning Pool | +1 critter health |
Hive | +2 critter health |
Void Rift | attacks by mages, nukers or voiders have a 20% chance to create a void rift on hit |
Lots of small fixes here and there and also made an attempt at getting the build accepted on Steam. It failed and now I'm waiting again until next week most likely since the guy didn't get to it by the end of Friday. I also made some small graphical improvements to the game that I think will help. Now what I have left to do, in order of importance:
Added an end game screen and started work on making elites spawn throughout the levels.
Elites now spawn at appropriate rates. Testing out the game a little with this and it seems a lot better than before, but I need to balance a few of the elite units more (headbutter and spawner seem weak). Also went through a bunch of smaller bug fixes and changes as I play the game more and missing details start popping up. I should leave proper balancing for later and start work on final UI improvements tomorrow.
Everything is done except these:
Tomorrow I'll start balancing the game out, which should lead to a bunch of bug fixes and small changes, and after that's done I'll get NG+1-10 working. Once that's done I'll do credits screen, NG+10 (game complete) screen, and find new music for the game. I want something more ambient generally and less upbeat.
Spending a lot of time balancing the game. The end game is pretty hectic and I need to make sure that it's reachable at NG+~7+. Basically just playing the game a lot, changing things that are too strong weak, then playing more and seeing if it's better.
These 2 last weeks have been a lot of playtesting and just taking care of details. But now it's finally over. I finally finished this game and I'm fairly happy with how it turned out. I'll write more about it in a separate blog post, I don't really have the energy to write much now.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。