I have been toying with an idea for a puzzle game for a while. I have
released a bunch of puzzle games so far, with varied success.
Rogue Bit has been the
most polished product so far, but it's a game for a very niche audience of
programmers and computer hardware enthusiasts. Seeders has been a hit and
miss. It has awesome puzzles, but Box2D physics is somewhat inconsistent, so
you often figure out a way to solve it and then spent of lot of time trying
to execute. It removed and changed a lot of those in the Seeders Puzzle Reboot version,
but it still isn't perfect. The Game is ON was
a very fun game to make, but it doesn't seem
so fun to play. The actual fun was coming up with a scene that fits the
idiom, but trying to discover it while playing just doesn't feel that good.'
I took all these lessons from the past experience when making Billy. I
wanted a game that has tight controls, so I picked the turn-based approach.
The puzzles range from very easy, to very hard. Similar to Baba Is You, you
can play with the blocks until something 'clicks' and you figure it out.
The game is powered by the same engine I used for Rogue Bit, so it scales
the graphics nicely to 4K monitors and beyond. The fact that the mechanics
are based on numbers and basic math, makes it translatable to every language.
The only thing that really needs translation are the level names, but they
aren't really that important to the gameplay as they rarely give a hint. Most
of the time, the player has all the tools and is left to discover the solution
on their own. I made a first level set which teaches you the ropes, so you
aren't lost in a tough puzzle immediately.
Making this game was also fun for me. I had a very interesting approach
for this one: I would get some basic idea, try to build a level from that and
then try to solve it. When it was too easy, I would add stuff that make it
harder - to the point where I felt like it was unsolvable. Then I would try
to solve the level for 30-60 minutes, to see if I can come up with some
original way. If I manage to do it, that's a perfect level. Of course, sometimes
it really is impossible and I have to loosen some of the restrictions.
While developing the levels, I would often notice alternate solutions
that require completely different approach. In such cases, I would split the
level into two levels - and then edit each one to make sure either of the two
approaches only work in one of the levels. I love that feelling when a player
comes into the level thinking 'Oh, I know this' and then get stumped when
they see that a single block is missing or something has moved by one tile
and it requires a completely different way of solving.
I'm done with puzzles involving equations, inequations, adding and
subtractions. I plan to add multiplication, and possibly variables and have
about 120-150 levels for the final game. I plan to release on Steam and
Nintendo Switch. Maybe mobile platforms as well? Not sure about that yet.
As all the base game mechanics are implemented, I'm starting to
add different stories for each scenario. In one of those, you
need to research quantum computing and build a superior AI.
In another one, you have to build a solar plant and become
carbon neutral while also helping your local community.
I have started the beta testing with some players recently and
the most common feature request was being able to set mining
for the whole rack. I tried a couple of different iterations
for this feature and settled on right-clicking any piece of hardware
inside the rack, for example, a GPU - and then setting the
mining target for all hardware of that type. For example, you can set all
GPUs to mine Ehtereum, all CPUs to mine Monero, all FPGAs to
mine Litecoin.
This is the hardest part of the game to make. Getting it right
while also making it efficient is tricky and it took me a couple of
tries to get it right.
The noise is pretty much straightforward once you learn how
decibels work. Heat is another issue. It starts with electricity use
and natural dissipation and then you have to simulate spreading
and respect the fan directions. Additionally, I'm taking outside
temperature into account because you can play the game in different
regions. For example, the base temperature is higher in Africa.
In the end, you also have cooling with air conditioners to spice it
up a notch.
My initial plan was to also simulate day and night cycle, but
as I played the game I noticed that I run it a full speed a lot.
That's one day of game time in 3 seconds of real time. It makes the
lights flicker so bad that I have turned it off and scrapped the idea.
Phone will be used for various in game events. You will get
messages from NPCs, pay monthly bills, read the news related to
market and new hardware, get alerts from your employees, get a bank
loan. The make it realistic, you can also play a game on your
phone.
Each scenario will have a story that plays out as you interact
with various NPC characters via phone messages. Their quests
will include mining, trading, research and more.
There will be about 10 different floor tiles with different
prices and dust factor. Dust plays a huge role in the game, as
having high dust makes your equipment wear out faster, mostly due
to fans breaking resulting in silicon overheating. Keeping dust low
will be expensive. You will have to buy and install more expensive
floors and/or use enclosed racks and PC cases with filters.
Each facility you rent or buy will have different starting floors
which affect the price. So, you will be able to buy a room with
concrete and replace all the tiles.
You can trade crypto currency and watch the market trends. This
feature was something I was fearful of, but it turned out pretty
straightforward to make. As I learned more about he actual graphs
used on the stock market, I figured that it could be simplified a
lot as players don't really need all that information and would
probably be confusing to many. So, you only have the current price
and daily movement.
The game uses real market data, which includes prices, hash rates
and mining block rewards. I was fearful of this, but it turns out
that it posses a pretty good challenge as the real market had its
ups and downs over the years.
For trading, I have decided to scrap the spread and simply allow
to always transact for 100k coins. If you buy or sell a lot, the
price will move. To prevent infinite money with instant pump and dump,
I have added a 6% transaction fee. You will be able to lower this
by running your own exchange in one of the scenarios.
You might wonder, what would all those people do. Well, once they
finish setting up the hardware, it's mostly a waiting game. So, I
added research. People can perfect their skills, which broadens the
types of tasks you can give them.
They can also research company
technologies. These go into your company IP, and you can even have
teams of multiple employees researching the same thing together to
get it done faster. This way you can beat the market, for example
by researching advanced mining hardware, or getting better solar
panels before eveyone else.
Also, most game scenarios are tied to some type of research.
The next step for humans was AI. I have designed a nice priority
based system where people would decided what to do based on priorities
you set. For example, you might set someone to just install operating
system, another person to do research and not care about anything
else, etc.
And then I tested with dozens of them in the same room. It worked
surprisingly well.
The last two months were spent adding humans and their animations.
The game allows for full customization of every human, which
posed an interesting problem as each body part is drawn as a
separate layer. This worked fine in Son of a Witch were you
had 20-30 characters on the screen at a time, but in CMTS I want
to allow for 100-200 employees in one room. I tried with 100
and the performance dropped significantly.
So I spent some time to write a new layer based draw code that
requires a fraction of CPU time then the old one. The new code
had some scaling-related bugs as you can see on the screenshot
above, but it's all fixed now.
I made many improvements to the build system. You can now right-click
to automatically slot items in appropriate slots. You can also click an
empty slot to switch to the appropriate shop section.
I also spent some time to design universal input handling system,
where every possible mouse/keyboard action is displayed at the
bottom of the screen all the time. It's very prominent now, but
I fear players might ignore it when the screen gets too busy with
other stuff.
The most basic versio of the shopping cart is in the game.
You can also pre-build the PC from the parts in the shop and then
buy multiple pieces of the same. I will also add an option to
save the current PC build, so you can recall it to buy it or
edit if further.
In the initial versions I planned for PC building to be menu
based, but then I contemplated that the game would be cool if you
could actually build by moving components into their slots. It requires
much more graphics, but I feel like it was worth it.
Drawing pixel art for computer components is actually very
interesting. I even made animation for the RGB fans using Aseprite.
To allow players to have multiple locations, I have
added a separate storege area (a garage) that just shows a list
of items. It's like a staging area where all the items you buy in the
shop arrive, and you can then assign them to different facilities.
I have decided to go with pixel art, as I can draw that much
faster. The perspective is isometric, because it looks really good.
There some games I love like Forager that have regular top-down
graphics, but isometric seems to be more common for tycoon type of
games as it gives a good sense of third dimension.
I spend about a day adding isometric support to my engine, and
about a week fixing the bugs in that code. Especially draw order
with stacked items can be tricky:
The rest of the time was spent drawing stuff like racks, PCs, shelves and
writing the code that allows you to move them around, stack them
on top of each other or inside the racks, etc.
The main selling point of the game will be running big data
centers with a lot of hardware. Because of this, the simulation
has to be very well optimized and I'm going to use a lot of RAM
caching data to make it run really smooth.
When I started this project, I didn't know much about the
mining process, so I had to learn a lot to make the game as
realistic as possible.
I decided to use the browser to prototype, as I wasn't sure what
the user interface would even look like. Getting the backend logic
up and running is the first step.
I love to start my projects with a nice logo and main menu screen.
It gets me motivated:
I decided it's time to start making a new game. I'm looking at
my strengths and weaknesses, and making good quality art is definitely
the most time consuming. On the other side, programming is my
strong side and it feels fun even when I have some hard problems to
crack.
Because of this, I'm picking a project that's heavy on programming,
optimizing code, etc. and doesn't require a lot of graphics.
Still, there will be a decent amount of pixel art to draw.
It will be a management/tycoon type of game focusing on crypto
currency mining business: building rigs, placing racks, managing
cooling, dust, noise in your data centers, hiring people to help
you, etc. The idea is to go back in history and start from year
2010. and see what it felt like to be mining back then.
I researched Steam a bit, and there are a couple of failed projects
with this theme, and they still seem to have sold a decent number of
copies. So, it looks like the demand is there and players really want
to play this type of game.
That's the main reason why many of these development blog posts
will feel backdated - wanted to keep the project secret for a long
time.
I'm going to reuse the same game engine I was using for Son of
a Witch, Rogue Bit and my other games.
It's a very flexible C++ engine, which will allow me to add any
performance critical code easily. I plan to support thousands of
mining units without drop in performance.
This MEGA update is a free DLC-sized upgrade to the base Son of a Witch game.
The update will be free for existing players, but the game price is likely
to go up after this is released.
1. Heroes
new hero: Lich. Undead, uses health energy to cast spells instead of mana. Can heal with mana gaining items or pets.
Rogue Hero starts with pickpocket and speed buff effect
Rogue hero magic key costs 1 mana, and can unlock boss room doors from the outside
2. Levels:
new level Hell with new music, thrist effect and 26 new room layouts
special room: minotaur labyrinth, gives access to the Lich hero
special room: pentagram, needs donation of mana, health rune, gold and king scepter to enter hell
special room: forest in ice level where you play hide and seek with Amanda
special room: prison surgeon where you can donate health for gold
special room: knife avoiding twins challenge in the desert
special room: treasure challenge with multiple bushidos in the desert
special room: fishing with bow and arrows in hell
new object: Crystal Sphere - protects demonic enemies and blocks magic scrolls until destroyed
new object: Lava Pit - petrifies players standing over it when it spits lava
new object: Minotaur Statue - teleport to the start of the level
new object: Bag Statue - players can now transfer gold coins amongst each other
hell shops have new type of protection and require mana to buy items
new treasure room in the catacombs and the desert
required distance for the second jump in the Long Jump quest reduced to 80
in hard mode the evil princess has become the queen and has strong guard in the throne room
3. Bosses:
New boss: Demon Legion - big demons spawning unless you kill them all once
New boss: Matilda - a huge witch that creates traps for players
New boss. Ghost of Rhadamanthus - shoots many orbs and buffs his minions with random effects
New boss: Demon Lord - fight in active volcano arena with lava petrifying players
Ice dragon sometimes shows up on the battlements
Elephant boss knocks down units when walking across the screen
4. Enemies:
New: Imp - standard melee warrior, immune to fire and petrification
New: Familiar - infernal mage can block your mana usage
New: Fiend - quick with poisoned swordes and abilit to teleport behind your back
New: Succubuss - shoots orbs and cheers at players with a beer, reversing their controls
Newy: Efreet - flies around and spits very flammable fireballs
enemies in the old catacombs no longer have huge HP in hard mode
Bandits in the dungeon sometimes carry flaming swords
5. Weapons
new weapon: Spellbinder - shoot orbs and block enemy mana usage
new weapon: Magic Crossbow - shoots arrows and creates gold arrows using mana
new weapon: Blacksmith's Hammer - throw at enemies and smelt weapons into shields
new weapon: Overlord Staff - give random positive effects to self and allies
new weapon: Blade of Light - triple damage vs undead and demons
new weapon: Hypnosis Staff - turn non-boss enemies against each other
new weapon: Brutus Gladius - a sword with high backstab damage
Increased combo timer for the Barbarian Axe to 3 seconds
Increased base damage for Ice Bow to 50
6. Items
new item: Homing orbs - chance for magic orbs to auto-target enemies
mew item: Magic Ice Bottle - use mana to create ice arrows
new item: Four-leaf Clover - increased double damage chance
new item: Holy Grail - Speed UP, Health UP, Magic/melee/archery UP
new item: Faustian Ring - increase melee/magic/archery for 20 health
new item: Minotaur Figurine - teleport to avoid death
new item: Honey Jar - temporary speed up when you get hit
new item: Stone Cross - double damage vs demons and undead
new item: Hourglass - speed down, melee/archery/magic increase
new item: Chili Pepper - enemies burn when they hit you
new item: Wizard's Amulet - get 1 extra mana when entering new rooms
new item: Claw Hammer - get coins when barrels break
new item: Cooper's Ring - get mana when barrels break
new item: Phylira's Necklace - break barrels to get armor points
new item: wine - reduced thirst effect
new item: Lich Ring - full heal after boss fight
new item: Scales of Balance - increased damage when hungry, thristy or poisoned
new item: pair of heart-shaped earrings - double healing effects
reduced mana cost for Rogue's Magic Keyring to 1 so you can sneak around the levels freely
Silver coin teleport out of old catacombs is now allowed
Alchemist's Visor now protects from Santa's exploding presents as well
7. Potions
New potion: Blood is Magic - lose all HP, get 3 mana
New potion: Blood donor - turns current HP into gold
New potion: Ironclad - increased damage scaling with armor
Extravagance spends coins only when you enter new rooms
Pickpocket effect now gives coins on room entry
Bugfix: Dragonfire potion would remove arrow damage multiplying upgrades
8. Magic Scrolls
New scroll: Summon Demon - all enemies attack it at once
New scroll: Mark of the Beast - everyone loses 666 HP
New scroll: Hypnotize Minions - enemies attack each other
Added more units and bosses to Gamble scroll rotation.
Duplicating weapons now clones damage, range, arrow speed upgrades as well.
9. Pets:
New pet: Koala - a free item in every shop
New pet: Panda - fetches gold coins and food
New pet: Skunk - sets enemies on fire
New pet: Sabertooth Tiger - gives +1 shield after every battle
New pet: Squid - gives random positive effect after every battle
Whale pet gives you a Kindling upgrade once a campfire stops burning
Penguin pet no longer tries to attack enemies who have freeze immunity
Snake pet no longer attacks enemies who have poison immunity
10. Other new features:
new main menu graphics and music
27 new achievements
You can now hold the drop button to drop the whole stack of items (arrows, keys, etc.)
tracking win/lose streak for regular game and hard mode.
allow entering any text as level generator seed (it gets converted into valid seed)
now you can drop gold to double it with a scroll, or heal via gold diet
Tar of Akhal picture shown in the final mom dialogue
show the exact speed increase over speed buff status icon
added option to reset all controllers to default settings
allow binding Stomp attack to a separate button
optional setting to shoot orbs using the regular attack button
11. Fixes:
Allowed using ranged weapons for the Goliath achievement
fixed Paladin to do double damage to undead with ranged weapons as well
fixed a bug where ranged enemies would try to hit the Turtle pet endlessly
fixed a bug when some monsters would get stuck attacking Turtle pet forever
fixed a bug where the dialogue would pop up without key/button to continue the talk.
fixed a bug where Undead Archer was unable to animate other undead sometimes
fixed a bug with raised undead Archers always shooting arrows to the left
prevent players getting stuck when hedgehog pet blocks the rolling spiked balls
Vampire Slayer NPC now says Thank you when her quest is done
achievement animations keeps working if you go from game into the main menu
prevent raising petrified undead
remove Confusion and Peace effect when undead unit dies
added sound effect when some action fails (no money to buy stuff, etc.)
imprved camera controls and thus enabled Baseball Quest for players with screens below 1680x900 pixels
imprved camera controls and thus enabled Hornet Quest for players with 720p screens
Message text for some actions would be hidden behind player status effects. Moved them above when status effects icon is visible.
added statue players can use to teleport if they get stuck with dead player in co-op (gold shop, alchemist quest, treasure rooms, etc.)
The final portal now shows that hell level is beyond instead of ice level
allow re-binding strong and special attack to the same button
fixed problem with minimizing game window on macOS in fullscreen mode
Steam version (PC,Mac,Linux) specific changes:
added Steam leaderboard for the Endless arena
you can now see the daily challenge rankings for friends only
when some actions failed for a network guest, the reason would show on network host screen instead
fixed netcode bug where some actions would fail without any notice text
just minimize instead of closing the game when opening game's Steam page
prevent mouse clicks when way outside of menu items in the main menu
press F1 twice to see the progress for achievement counters
Nintendo Switch specific changes:
added Daily Challenge for Nintendo Switch port
enabled CHALLENGER achievement for Switch.
greately reduced number of undead in endless arena in Switch port for performance reasons
One of the reasons to come back to Son of a Witch every day, is the daily
challenge. All players worldwide get the same dungeon layout with the
same enemies. Only the weapon/item drops depend on the hero class.
One of the achievements is to win 100000 points in the daily
challenge, so I decided to write a short guide how the points are
given:
Enter hell
10000
Complete a level and enter the next one
5000
Enter a new room
300
Use a scroll
200
Adopt a pet
100
Collect coins (incl. when you eat them)
5
Earn gold any other way (Magic Chest, etc.)
base amount of gold (not increased by avarice)
Drink a potion
50
Activate a bomb
50
Using keys to unlock chests and doors
50
Fox pet unlocking chests
50
If more players are playing in a co-op game, only points collected
by the first play count. So make sure you let this player collect
all the gold, use the bombs and keys, etc. Others are just there to
make the fight easier, not steal the points.
By the way, I decided to include the daily challenge in Switch version as
well. Since it doesn't have online competition, the rankings will show your best
runs with corresponding dates instead.
There's a generator that powers all the teleports on level 5. Seeder
robots are using the teleports to invade other planets.
To stop them,
you need to shut down the generator. It's done by rotating the symbols
on the dial until they go from 0 to 11 clockwise. Seeders are using a
4-digit number system:
So, the final position on the dial should look like this:
Puzzle mechanics:
The trick to this puzzle is to use the middle section to set up the
pieces on the opposite sides and then slide them into their position.
Here's an example how to set pieces 0 and 6 (i.e.
and
) together.
Once two pieces are in place, set up the next pair (1 and 7) and
slide them into their position (next slot clockwise). Repeat until
the last pair to complete the puzzle.
The time for next BIG update to Son of a Witch is getting close.
This will be the biggest update so far, with new level (Hell),
new enemy faction (Demons), new unlockable heroes, new weapons
and items, new pets and dozens of other changes.
The plan is for Hell to be an alternate path you can take
through the game and reach an alternative ending where you
destroy the Tar of Akhal forever.
The beta test version should be ready for translators by the end of January 2021.
Here's an example of a solved puzzle, so you can see how it works:
By solving the puzzles, you get jigsaw pieces. Collect enough pieces to unlock extra levels.
You can also get jigsaw pieces by solving the puzzles in least possible moves and by finding pieces hidden in levels.
Some are hidden behind other objects or produced after you manipulate buttons or other things on the screen.
I'm making a new game. It's features cool pixel graphics and wacky puzzles where you move stuff around until you discover a common phrase or idiom from English language:
This is the continuation of the main game story. After you deal with the black wizard and restore the order in the kingdom, you may think that everything is done.
But no. There are more black wizards in the cult and they decided to strike back. They captured all your allies and cast a spell on you that made you forget all the magic spells. Your friends are kept in dungeons and fortresses deep inside the underworld.
Explore the Dark World, rescue your allies and re-learn the secrets of magic before you take on hordes of new enemy types.
The black wizards have somewhat different minions. They are slightly stronger than your army and don't require special buildings to upgrade. The battles in this mode will test every ounce of strategy you can muster.
The Steam version of the game will launch in January 2020 with this update included. Nintendo Switch version will be updated in the meantime, I hope mid-December if all goes well.
Here's a project I have been working on for some time. It's a real time strategy game for 1 or 2 players focusing on quick battles.
The Story
Once upon a time, there was a king. After a glitched teleport spell created a clone, there were two kings. The evil black wizard betrayed the real king and the clone took over the throne. Help the real king rally the troops and get his castle back.
Single Player Campaign
The game has two modes. In campaign mode, you play as the real king who starts with a small amount of gold and an army of knights. You roam around the map and fight different enemies to convince them to join your forces: Archers, Healers, Ninjas, Champions, etc. You can also conquer windmills to get more gold to finance your army; and mage schools which provide you with useful spells like Meteor Shower, Freeze Enemies, Earthquake and Summon Giants. The campaign ends with an epic battle where you use all your forces and magic to defeat the clone king and recapture the castle.
2-player versus game
In versus mode, two players play a battle with all the units and magic unlocked. You can pick the size of the battle, starting with a small skirmish with just two towers and ending with a total war with two castles on each side. You can also play this mode single player versus computer.
Gameplay
The battles happen in real time. You pick which troops to create and send them to destroy the enemy fortress while defending your own.
The game offers a variety of tactics: Send knights and champions to attack the enemies in close combat. Archers are weak, but attack from distance, so you put archers and marksmen behind the knights. Afterwards you can recruit healers and clerics who can fight, but also heal other units. And you can add spies and ninjas who sneak past enemy lines and demolish their buildings. And finally there are giants who are hard to stop, but you can use some magic to make it easier. All units have an upgraded variant that requires that you construct a building during battle. You can also demolish enemy buildings to prevent them from recruiting upgraded armies.
The computer AI is completely transparent - you can see how much gold and magic points it has and what exactly is it doing. This makes every battle feel fair.
There are two difficulty settings: Easy mode for casual players and kids, and Normal mode for players who are experienced with real time strategy games.
It's been 4 years since I released my first Steam game: Seeders. I took a hard look at it and
from this point of view, I was able to see all the shortcomings and problems it had. There was
no character animation, and graphics lacked detail. Although the puzzles are good,
the visual looks were poor. But even some puzzles, although they had good ideas behind them,
were executed poorly. Players had to spend too much time actually doing the thing once they
figured it out.
I decided to give a major revamp to the game. Big enough to set it up as a separate product.
This time, it would be the game I really wish I made in the first place, but I just didn't have
enough experience at the time. The new version is called Seeders Puzzle Reboot. Here
are all the changes compared to the original Seeders Classic game:
Improved graphics. Some of the graphics used to look really plain and boring. If you played on a 1080p
screen or larger, you could even see the textures repeat. At the time I made the original game,
I was impressed by simple graphics of games like VVVVVV and Thomas Was Alone. What I learned since
is that although consistency is more important than graphics fidelity, the original Seeders had
consistently poor looking graphics. It actually took less effort than I anticipated to bring the
graphics into good shape. Too bad I didn't see this as a problem in the original game.
Character animation. The old game had almost no character animation. Our main hero would look
stiff and it would make the gameplay look stiff and boring as well. As I gained a lot of experience
animating Son of a Witch, I put that to use. The gameplay now feels fluid and the main protagonist
feels alive. There was a lot of work to be done, because there are 16 wearable hats in the game, and
each one was drawn separately, so I had to make that work with animations.
No ambiguous puzzles anymore. For some of the puzzles seemed hard or impossible to execute, because the puzzle setup would
lead the player into thinking that some of the solutions is possible because you might barely be
there. It seemed like you could solve it in some trivial way only if you were precise down to the
pixel. Based on discussion I had with some players on Steam, there were even some puzzles that
could be cheesed that way. I redesigned all those puzzles
to make sure it's obvious that the easy/wrong way is not possible, and players have to think of
something else.
Hardest puzzles are optional. Some of the puzzles were really hard to solve (for example, the machine that
moves parts of the level in level 3) or execute (falling through the laser-protected hole while a
beryillium pipe is falling at the same time protecting you). And for some, it took a lot of time
to repeat if you made an error (like those 4 alien robots at the start of level 5). All those
puzzles are now optional, you can do them to get more wearable hats. Because of these changes I
had to draw more hats, so there are 17 in the game now (default + Jason's + 15 to collect).
More Co-op puzzles. While the co-op mode in the original game is fully playable, it felt like
some of the puzzles were really lacking co-op support. Now, many of the puzzles are still the same
as in single player, but you have to solve them in different ways to enable two players to go through. This
is especially visible with lasers in level 5, where you have to pass the vehicles to each other, or
carry the other player on top of the spaceship, etc. But I also added more co-op only puzzles (i.e. you
won't get to see those in single player) and some of the existing puzzles were redesigned for co-op by
removing some pieces which made them trivially easy or adding some pieces that made them more
interesting. I also left some of the tricky puzzles from the original mode to be available only
in co-op mode, as I expect two players to be smarter collectively.
Music improvements. The main menu music was just too intense. It's a catchy tune, but I really
started to cringe every time I launched the game - and I had to do that hundreds of times during
testing. I replaced it with a nice, relaxing tune that sets a nice atmosphere, but never gets
boring nor annoying. I also migrated my audio mixer code from Son of a Witch, so now all the songs
have normalized volume. It was all over the place in the original game and you usually had to adjust
the music volume between levels.
Added missing sound effects. One of the reasons the game felt stiff and boring was because there
were next to zero sound effects. You would push a rock or a metal piece and they would feel like paper
cutouts instead. You would jump on top of a spaceship and there was no sound. I have added over a dozen
missing sound effects and coupled with music volume fixes I wrote about above, playing the game now
feels like you are really there and your actions have an impact.
General polish. There are a lot of small things that make the game look and feel nice. Simplest
things like menu transitions, subtle animations when you select menu items, etc. I built these systems
for Son of a Witch and now I migrated them back to the Seeders engine as well.
Seeders Puzzle Reboot is that great puzzle adventure game that the original Seeders was supposed
to be from the very start. I just wasn't experienced enough at the time to make it this good.
Seeders Puzzle Reboot will be exclusive to Nintendo Switch for now.
A free DLC-sized update is coming out on March 21st. At first I wanted this to be a separate DLC, but I decided that splitting the player community is a bad idea
and earning just a little bit more money isn't worth it. I want everyone to enjoy the same game.
New features:
new RPG game mode where you keep all gear and restart the current level when you die
new Endless Arena mode where you fight waves of enemies
new hero: Paladin, who has divine shield and does double damage to undead
new hero: Alchemist, who has a Golem companion, and prepares potions
8 pets with new effects: Crocodile, Mouse, Bee, Monkey, Whale, Cow, Ladybug, Cat
3 new random potion effects: Cold blood, Veteran Elixir, Astral Projection
6 new special effect items: Ghost orb, Critic’s Shield, Paladin Shield, Alchemist’s Visor, Halo, Ancient Voodoo Doll
10 new weapons: General Sword, Crippling Katana, Executioner’s Sword, Dark Slayer, Splitting Axe, Paladin Sword, Alchemist Sword, King Cobra Staff, Snow Tiger’s Paw, Steady Shot Bow
6 new achievements
2 new allied troop summons: Baby Yeti, Stone Golem
added a new blocked challenge room in the forest
added a new challenge room with baby dragons
added a new challenge room in the ice level (it’s a surprise)
added a quest room in the ice level to unlock the Alchemist hero
Gameplay balancing:
allowed summoning mercenaries into boss fights (except the final boss)
removed slowdown effect from Heavy Boots
Retort no longer creates mana potions
only one Retort shows for sale in shops
removed poison immunity for the final boss
significantly increased Poison Cloud spell damage
Poison Cloud effect scales with enemy size
improved AI for Snail, Ram and Snake pets
using teleport staff twice returns you to the starting point
fixed runestone drops in various barbarian challenges
Bugfixes:
Ethereal bow now shoots through barrels and boxes
Dog pet doesn’t take mercenary’s beer in the tavern
Foundry doesn’t melt mercenary’s beer anymore
Thief and Ringleader don’t jump on allies when confused
fixed bug with item drops when Yeti Elder and Earth Golem roll
fixed drawing position when Barbarian is mounted
fixed rare sound effect bug with Yeti babies
fixed position for some of the teleportation animations
fixed text showing last level seed instead of control hint after player dies
Some of the players asked me how to replay quests that unlock heroes. You can do this by clearing the achievements that unlock them. To clear the achievements, you need to enter the DM mode.
DM means Developer Mode or Dungeon Master, whichever you prefer.
Start the game and press T to open the chat box.
Type /dm1 and press Enter.
Type /ca ACHIEVEMENT_NAMEsee below to clear the achievement. For example /ca EYE locks the skeleton hero.
Type /dm0 to exit DM mode.
Close the game completely and start it again.
Here's the ACHIEVEMENT_NAME for every hero:
Sorceress: /ca PROLOGUE
Druid: /ca DUCK
Archer: /ca ARCHER
Pyromancer: /ca FIREMAGE
Skeleton: /ca EYE
Rogue: /ca ROGUE
Barbarian challenges achievements are named BARBARIAN1 through BARBARIAN12.
- new hero class: Rogue. Special ability is to use the sneak attack as the special attack with any melee weapon. You can still use the weapon's regular rage attack if you use it in the off-hand slot. He also has a special item that can unlock any door (except boss room doors), so you can unlock treasure rooms and escape tough battles
- Added a bunch of new achievements
- New potion: Vampire blood (get HP from kills. Multiple potions stack)
- New potion: Pickpocket (earn extra gold until you get hit. Stacks)
- New potion: Confidence (deal extra damage when full HP. Stacks)
- Added a new combat item: Sticky bombs. You can plant these as traps. When an enemy walks into one, it activates.
- Added a new pet: Racoon, who randomly drops sticky bombs across the room
- Added a new special room in the castle: the Gallery Room. This room is filled with enemy portraits and you can pick your favorite enemy to do double damage to them.
New NPCs:
- Join the Vampire Slayer NPC in the catacombs and help her kill a vampiress or the vampire boss for reward
- Dwarfs now sell stuff in the ice level
- Dwarven Blacksmith shows up sometimes and gives you ability to smelt weapons into runestones which are used to upgrade other weapons
- Mercenary NPC in the castle tavern gives you an item which can be used to hire mercenaries for a fixed amount of gold. DON'T TOUCH HIS BEER!
- Vampire Sword now gives HP while hitting enemies (instead of on-kill)
- A Redhead Warrior NPC might challenge you for a duel on the battlements
Tweaks and improvements:
- Redhead Warriors in the desert now buff their swords before doing the petrify attack
- Disabled invulnerability frames for revival in dungeon shops
- Reviving in regular game now gives 41HP instead of 61HP
- Celestial Hammer rage attack now strikes all enemies in the room
- Darkness, Confidence, Money is Power, Mega Boost effects scale the skill percentage instead of adding to it. For example, if you have 50% melee and 100% darkness, it results in 100% melee skill (not 150%).
- fixed bug when the remote player could join the game twice (i.e. two heroes would show up) if (s)he pressed the button twice too quickly
- fixed bug then Steam library is installed in a path with non-ASCII characters
- minor fixes and tweaks to UI
- updated some of the translations
- dialogue in the intro story now supports translations
August 22, 2018 -- Son of a Witch, the adorable action roguelike that won over hearts
with official selections at IndieCade Europe 2016, IndiePrize 2017, and Game Access '17,
is about to launch on Nintendo Switch on September 4, 2018.
After 3 years of development and a successful launch on Steam where it currently holds 92%
positive rating, the game is about to hit the console platform where its couch co-op gameplay will
shine. A new release trailer highlights the magical hack and slash hijinks players will
be able to enjoy in solo, co-op, and four-player sessions.
Son of a Witch recalls the compulsive replay-ability of your favorite roguelikes
but wraps it all in a charming package, making it a lot more welcoming to a wide range
of gamers than your standard fare. But don't let the cutesy graphics fool you: Son of a Witch
offers deep mechanics that reward constant experimentation and learning. Son of a Witch boasts
over 120 unique weapons and items to discover. Players will only find a small section of these
in each run, meaning the game is completely different every single time you play. There are
also 7 playable characters with wildly different skill sets and abilities, over 20 bosses
to beat, and 30 pet animals to find.
Bigosaur is expecting the game to be even more popular on Switch, because players
often like to play in couch co-op setting on the console. Milan Babuškov, creator of the
game, said "After completing Castle Crashers
for the second time, I started thinking: what would make a beat'em up game more replayable and interesting
in the long run? Inspired by some roguelike games like The Binding of Isaac, I added
procedural map generation and over a hundred different magic spells, items, weapons, quests
and game mechanics that you can combine in interesting ways. Always having a new map to explore
and weapon combos to discover is the reason many players already have 100+ hours in game on PC. I'm
excited to see the community feedback on Switch, as it will be a great
motivation to continue improving the game in the future."
Son of a Witch will launch on American eShop on September 4, 2018.
Check out the release trailer here.
The first complete version of Son of a Witch is now released on Steam.
After almost 3 years of development the game is finally complete. We have gone a long way since being featured by IndieCade and greenlit by the Steam community. With almost weekly updates it has been an exhausting but also a very enjoyable experience.
This is the first release that covers everything I planned to make initially, and much more on top of that. But, this is not the end. There are many more things to come. During the development both the players and myself got a lot of new ideas, so you can expect to see some big updates in the future: more weapons and items with new effects, more mounts, more pets, more special rooms and NPC quests, and more magic.
The next step is porting the game to Nintendo Switch. I plan to do that
over the Summer and have the game ready for late August or early September.
After that, I plan to have one big update with new content, most probably
for the holidays by the end of the year.
The initial idea for Son of a Witch was to build a game that could be
easily described as Castle Crashers meets The Binding of Isaac. I
wanted to have endlessly replayable beat'em up experience with
much deeper mechanics and ranged combat. But how do you combine
two pretty different play styles?
Beat'em up vs dual stick shooting
In beat'em up games you have to line up with the enemy vertically to hit
them. In a bullet hell shooter like Enter the Gungeon you can shoot in all
directions. These two simply wouldn't work well
if you just mashed them together, so I introduced some modifications. The
main one was restricting ranged combat to the horizontal direction. You
can shoot to the left or to the right. This goes for arrows, thrown weapons
and orbs (magic projectiles similar to tears in Isaac). With some upgrades
you can get spread shots, or mirror the projectiles on the other side, but
the basic targeting is to the left or right.
Having to line up to attack with both melee and ranged attacks made
the combat easy to read and perform even when there are different
types of heroes and enemies fighting. The standard vertical evading
of melee hits now works for ranged projectiles coming your way as well.
Level layout
Beat'em up games usually have horizontally long, linear levels. There's
almost no exploration, you just head to the right. I wanted to give
the players that great sense of exploration you get from roguelike
games: the map is randomly generated and non-linear. Sometimes
it branches, sometimes it loops back. You are guaranteed to find
a treasure room on every floor. There are 2-3 shops and often special rooms
with NPC quests or mini-game challenges.
Even if you find the boss and exit to the next level early, it's
worth exploring the rest of the level to find better gear and
level up your heroes.
During playtesting I found that most players like exploration. The only
problem could appear in 4-player co-op games when sometimes the players would
spend too much time arguing which way to go. This is especially visible
for situations when many new players join the game and just want to
move ahead without discovering all the subtle mechanics the game offers.
For such players, I added a Party Mode which features a linear
level layout, but still gives you random weapons, shops and NPC quests.
Balancing ranged and melee combat
Initially the ranged characters had a huge starting advantage: they could hit an enemy
without them striking back. If we just took your standard beat'em up
monsters and threw them in a game where all the heroes are ranged, it
would be really hard to provide a good challenge to the players. Either
the enemies would have to be very fast to close the distance or
they would have to have a lot of health to survive until they can
threaten the player. Because of this, the enemies in Son of the Witch
were designed differently: many of the enemies have ranged attacks
and melee-only monsters serve as live protective moving shields. They usually
walk in front of ranged characters and try to engage in hand-to-hand
combat with the players while the ranged units are attacking them
from a distance.
Having more ranged enemies results in having to do more dodging in
Son of a Witch than your regular beat'em up game. There are often
some projectiles coming your way and you have to evade them. Since
the projectiles are only flying horizontally, there's less dodging
that your regular bullet hell requires. So, this mix is somewhere
in the middle and you don't need inhuman dodging skills that some
of the bullet hell shooters require.
With all this said, you might still feel like the melee heroes are at
a disadvantage. To balance things out, I added more mechanics that
give melee fighters an edge in some different areas: While magic ranged attacks only deal damage to the enemies, the melee
attacks also stun them for a second, interrupting their attacks
or magic spells. If you use a weapon with the quick attack (all swords
and some axes) you can stun-lock most of the enemies and just keep
attacking until they die (or some other enemy hits you). Beside this, melee weapons have special rage
attacks that can knock down enemies and stun many of the bosses.
One of my design goals was making sure that melee and range heroes
synergize when playing together in co-op games. Having different
combat mechanics actually works really good. The knights can stun
enemies and keep the ranged attackers busy while the mages shoot
them from a distance while buffing and healing their allies.
Knights can use magic too, just not that effective
Beside magic projectiles, there's a wide range of magic spells. There
are many different magic staves and every staff has a different spell
effect: poison enemies, set them on fire, freeze them, slow them down
or speed up your party, shoot lightning, create magic turrets that
shoot at the enemies on their own, create obstacles on the screen,
teleport yourself into safe spots, etc. Son of a Witch allows you
to have multiple weapons at the same time, so you can combine different spells
during the same fight.
The magic is very powerful, so at first it seemed like the mage heroes
would once again be much more powerful. To balance that out, I allowed
for melee fighters and archers to also use the magic items, but with
less efficiency. For example, the Snake Staff will buff a weapon with
poison, but the damage the poison has a base value that does scales
with the hero's Magic skill. So, a Knight hitting someone with a
poisoned sword would inflict 3 poison damage per tick, while a mage
doing the same would do 5 poison damage per tick. Another example would be
the Earthquake staff that knocks down all the enemies and breaks
the rocks with usable items or weapon upgrades. When a Knight uses the
staff, it would knock down everyone and break 2 rocks on the screen.
When a mage uses it, it would break 5 rocks on the screen.
Some other weapons work completely the same. For example the Teleport
staff just teleports the hero regardless of the level of Magic skill
they have.
Item and weapon drops
When you mix two different play styles, you need to make sure that the player
gets upgrades and powerups they can use. If I'm playing a mage hero, I don't
need a triple-damage upgrade for an axe type of weapon. This can be a big
problem for procedurally generated games. If you leave everything to the random
number generator, your game won't be enjoyable.
In Son of a Witch, I solved this problem by rating every item and weapon in
melee/magic/ranged category and then multiplying the drop rates with
the skill levels of heroes in each of the categories. For example, let's say
we have an item with a drop chance of 10% and it's an item only used by
Melee characters. Let's say it's a single player game, and the player selects
a Mage hero, who has 30% Melee skill.
At the start of the game, we reduce the drop rate to 30% of the original,
making it only 3% chance now.
You might wonder why don't we disable it completely?
It's because it's really rare that a weapon or item is completely useless.
Even if you are a mage, having a sword available could be useful to do some
quests (for example, when the princess is attacked by goblins, the stun-lock
ability of the swords is really useful) or complete some NPC quests easier.
Beside that, the game gives you many upgrades during a run, so you might
sometimes decide to switch hero class or become multi-class at some point
and having at least some of the weapons available helps.
Single-player roguelikes have a somewhat easy task when it comes to player death. The genre
itself dictates that once you die, it's game over. At least, if we adhere to the strict
definition of roguelike. Some of the games allow for some progress to spill
over into the next game, but all of them make you start over. Without this mechanics,
the game isn't considered roguelike.
Now, what happens when two or more players are playing? Is it Game Over
as soon as one of the players dies? Or do you allow reviving the players?
What conditions need to be met for the player to revive? Answering these
questions makes a huge difference in the way the game is played. When deciding
what's the best approach, one should consider what is the way you want your
game to be played. Do you want to limit the game to player pairs of similar skill
level, or you allow newbies to play together with pros? This is an
important decision, because roguelikes are often hard games to play.
Let's look at some examples and see how different decisions
influence the gameplay.
Enter the Gungeon
Enter the Gungeon has limited co-op mode - only two players and the second player
can only play a single character. Once a player dies, he becomes a ghost with
very limited gameplay options. The revive mechanic is rather interesting. There's an
item that allows you to revive the other player once. This works pretty good until
a player dies for the second time. After that, you can soon get into a
position where only one player plays for a very long time as the only other
way to revive dead players is to beat the boss or find and open a chest.
This means that Gungeon is pretty hard core and expects both players to play well.
If one of the players is a newb, he will die often and get bored waiting to
be revived all the time.
The Binding of Isaac
BoI doesn't really have
the full multiplayer game. Only the main player gets all the powerups
and pickups and others can only play as babies with limited power. The main player
shares their health with babies, so it's easy to revive them when they die.
It's an interesting mechanics, which makes it more enjoyable as there's no
waiting time. However, less skilled players can quickly ruin the game
for more experienced ones who have to decide between spending most of the game
playing with low health or telling their partners to go hide in a corner and/or wait to revive.
Rampage Knights
In Rampage Knights the dead player turns into a ghost who can move around
and knock enemies into pits or interfere with their attacks. With some item upgrades,
the ghost can also poison enemies or set them on fire. This is a pretty good
mechanics because newbies can actually kill enemies pretty quickly even when dead.
The player stays in the ghost form until 10 enemies are killed. This is a decent
solution to the death problem, but it does have its drawbacks. The main problem
is that the players are revived to full health, so the players can simply
take turns dying and go through the whole game with 30+ deaths. Another problem
is that completing a level gets the dead player revived as well. So if someone
is low on health after the boss fight, he can simply jump into a pit and
get full health at the start of the next level. All this makes
co-op in Rampage Knights much easier than the single player mode.
Spelunky
Spelunky also has the dead ghost mechanics. Dead players can knock down
some enemies into pits or spikes, activate traps, etc. To revive them,
the players have to find and hit a coffin. This is a good solution, however
sometimes the dead players can get bored while waiting. Although
they can do stuff, it isn't much compared to playing the game while
alive. The only big problem with this approach is that the coffin only
revives one player, and there's only one coffin per level. So, if you
play a 3-player or 4-player game it means that some of the players would
have to wait for two or three levels before they even have a chance
to be revived. This pretty much ruins any fun for players who want to
complete the game and not just goof around.
Castle Crashers and Lost Castle
Castle Crashers isn't really a roguelike, but I included it because of an interesting
revival mechanics that was also reused in the recent Lost Castle roguelike. When a
player dies, others have to come to them and revive them. This means they have to
stand still and not fight the enemies for a while. While this mechanics works
pretty good in Castle Crashers, in Lost Castle the enemies are much more
aggressive, and it's almost impossible to revive dead players until the
room is clear of enemies. Since the game has some enemies with high health
this can take a while and the dead players can quickly get bored. Combining an
experienced player to play with a beginner is not an enjoyable experience
for any of them as the newb will keep dying and the pro will spend a lot
of their time trying to revive the dead ally instead of fighting the monsters.
Son of a Witch
When designing death in Son of a Witch, I took a look at many games
and weighed carefully what would be a good approach. The death mechanics
had to satisfy the following goals:
The game is a roguelike, so death should have some weight
Players shouldn't be able to revive each other infinitely in a loop
Pros and noobs should be able to play together and both enjoy the game
When someone dies, they shouldn't have to wait long before they can play again
with all of their powers
The goals were simple, but achieving them took a bunch of iterations. When I
presented the game during EGX, I made changes to the way death works
every day and then watched how it affected hundreds of players who played the demo.
It only started to work well when I mixed up a couple of different mechanics:
1. The main way to revive players is to kill enemies
When a player dies, he remains dead until all the enemies in the room are gone.
2. Allow reviving during the battle, but at a cost
You can revive all dead players with a Life Staff which can be used
once every 5 rooms. With mana potions you can do it more often,
even multiple times per battle. This means that the players
can stack up on mana potions for tough boss battles.
The Life Staff is a pretty common drop, but it's isn't guaranteed
to show up in every game and you don't know when or where you would
find it. This encourages the players to explore and unlock
every gold treasure chest they find.
Additionally, undead heroes can also be revived with the
Staff of the Dead which animates the undead
3. Players should be encouraged to cooperate
Once a player is dead, a 20 second countdown starts, and others
have to revive him or clear the room of enemies. If the players
have no Life or Death Staff, they have to fight quickly to
save the game. The bosses have more HP, so the timer is set to 60
for the boss battles.
The possibility of the countdown timer makes the players care about each other
more. Experienced players will seek to help newbies during the
fights to prevent them from getting overwhelmed and killed.
The timer also removes the boring parts. If a player dies he knows
that in 20 seconds he will either be revived or a new game will
start. In any case, he won't have to sit and watch while his friends are having
fun.
4. A true roguelike offers alternatives
Beside the Life Staff, there are a couple of items that can be used to instantly end
the battle and revive the dead:
Barrelize scroll quickly turns all the enemies into
barrels and thus ends the battle. It's risky to do with bosses
because they turn into big exploding barrels.
You can use the Peace scroll that makes all the enemies peaceful.
It doesn't work for bosses, so it's useful outside the boss
fights.
You can teleport away from the room with enemies to another
room. This resets the timer to 20 seconds or stops it
completely if you teleport into an empty room. There are two
ways to teleport: The Random Teleport scroll and the
Silver Coin which teleport you into a random shop on that level.
The teleport scroll can be dangerous as you might show
up in a boss room. The best time to use it is during the boss
fight after you have cleared all the other rooms in the level
and you know it will teleport you into an empty room.
5. Have an easy-mode character for newbies
Sometimes it's best to prevent players from dying at all by allowing
them to heal more often. In Son of a Witch, there's a playable healer character who can
create food to heal the whole party. It's a great choice for
new players and having some extra healing options can also help
an experienced player when they are playing together.
A* pathfinding has become de facto standard for pathfinding in 2D games. However, it
does place some constraints on your level design. While it
works great in tile based games, I wanted to be able to place objects randomly at any
pixel coordinate in the world. With a big map and many units it can get expensive to compute.
In this case, developers usually just optimize their game loop, so that the algorithm doesn't get called
for every render frame. Since my game is fast paced, I wanted AI to be really responsive to players moving around, so I
searched for alternatives.
Another problem with A* pathfinding is that it's almost perfect. Enemies always take
the optimal path and become too predictable. I wanted to have some randomness and surprise
factor without having to complicate the AI code too much. I also wanted some enemies to be
dumb and sometimes not "see" the way to get to the player immediately.
But I didn't want them to become too dumb and get stuck on
simple obstacles.
And then I discovered steering and obstacle avoidance. The algorithms are simpler,
easier to implement and less expensive to compute. You can tweak many parameters to
get different behaviors. With simple tweaks you can get the enemies to defend some areas,
wait to attack until the player comes closer, act as a group, surround the player, etc.
With a little bit of experimentation you
can get some behaviors that seem very intelligent.
Since I'm making a game where the players usually have to line up with enemies to hit them,
I decided to make that easier for players by having the enemies do the same whenever
they can. When the enemy is far away, their priority is to line up with the player
while coming close enough to land a hit:
The player can now just move to the right and not worry about having to line up themselves.
Additionally, if the player has a ranged attack (throwing axe, shooting arrows, fireballs, etc.)
he can simply start shooting and the enemy will make sure he gets in the path of the projectile
before it arrives. This makes the combat feel fluid and easy to execute.
For most brawlers the approach above would be enough. Castle Crashers, Rampage Knights and
similar games manage to get away with such simple AI because they made their levels with almost no obstacles
in the middle of the screen. For my game, I wanted to have more interesting screens
with more stuff in the middle: rocks, trees, bushes, pits, etc. on the outside and
furniture inside buildings. So, AI needs to be smart about those.
Enter obstacles
Now, what happens when we have some obstacles in between. My approach was simply to
allow the enemy to hit the obstacle and then figure out how to go around it:
How do you decide which way to go around? Remember, we are not trying to make the
enemies perfect planners, so they can make mistakes. One approach is to simply
check which path to go around the object would be shorter. This works fine, but
I found out that simply choosing a random direction (UP or DOWN when the goblin
hits the bush in the above image) works much better. When you have 4-5 enemies going
after the same player, they would split and go around that tree using the upper or
lower path. It makes behaviour for a group of enemies seem more natural.
What if the unit has two paths of which one is significantly longer than the other?
Or what if one of the paths leads to a dead end? Without going back to
full A* pathfinding, we can simply make the enemy figure out they took a wrong turn
and reset their 'going around the obstacle' state. We can have a simple variable
saying how long should avoiding an obstacle take and tweak that based on the
level design and the behavior we want to get.
Protecting an area
Now, let's say you want the enemy to protect an area and wait for the player to come closer?
We don't need to change any of the AI code at all, just
wall off the relevant part of the level and make sure it's longer than the 'longest path to go around'
variable from the main AI code I mentioned above.
The green line in the image above shows a long fence the enemies won't cross because
the parameter for going around the obstacle is using a lower value than the green line's
length. As the player comes closer to the bottom of the screen, the enemies start
to have higher chance of coming out of their area to attack him.
This works pretty good in more complex screens. Having the enemies divided
naturally by the level layout makes the game more enjoyable
for the player as he can fight enemies in multiple stages.
In the image above you can see three disctinct areas for combat. The player is now
in control and can decide on the tactics. Does he storm the enemy in the middle
and then have two separate groups to fight. Or he would stay on top of the screen
and allow all three of them to come closer so he can use combo to hit all of them
with a single shot.
Having the enemy AI constrained by the level layout makes the combat much more
tactical than your standard beat 'em up. Now you just need to create interesting
level layouts to give enough options to the player.
Using steering to avoid erratic movement
Now, what's steering? Since we run the obstacle avoidance AI all the time, we want to
make sure that the enemy movement feels natural. Going diagonally towards down-left
and suddenly turning up would feel strange. So, when the player drastically changes
his position, we try to rotate the enemy movement in 45 degree steps.
This makes the enemies movement fluid
and easier to track. Of course, if you hit an obstacle, you would do a 90 degree turn
instead.
Sometimes you just want the unit to stop and go the other way. For example,
if the tracked player is dead or escaped the room and the enemy starts tracking another
player on the other side of the room. In these cases I allowed sudden turns because
it feels ok in my game. But if you try it out and it feels wrong, you can smooth it
out by steering in 45 degree steps every X milliseconds until you start going into
the right direction. The exact value for X depends on the type of unit moving, so you
should experiment until it feels good.
Group behavior for enemies
If you make the enemies treat each other as obstacles, you can get very
interesting side effects. Most beat 'em up games allow enemies to walk through each
other, but if you forbid that and use obstacle avoidance for AI, you can get
cool group behaviors. For example, the enemies spontaneously form groups like in
the image above without any changes to the base obstacle avoidance code presented
so far.
Surrounding the player
In the images above, you can see three enemies
approaching the player. As the first one starts to attack,
the second one is avoiding the obstacle, i.e. avoiding the first attacker.
As he gets close enough, he starts attacking too. In my game the weapon
hit boxes are a little bit bigger vertically than the unit boxes, so you can attack
an enemy if you're standing adjacent to them vertically as well. From the
still screenshot it isn't obvious, but when you see it happening in real time it makes perfect sense.
After that, the third one comes and avoids
the initial two attackers. While doing so, he gets past the player as well. Then he turns
to face the player and starts attacking from the other side.
What's most interesting is that all of this happens automatically with the
standard obstacle avoidance code. You don't have to
program some special AI code for it.
Since Son of a Witch is a fun and cartoony game, I only used the simplest algorithms,
but you can make it more sophisticated if you want to. I recommend checking
out the red3d website for more behaviors
like Seek and Flee, Pursue and Evade,
Containment, Wall Following, Queuing (at a doorway), Flocking (combining: separation,
alignment, cohesion), etc.
Ever since I announced the Steam release date for my game Son of a Witch
I have been getting a lot of Steam key requests from press and Youtube/Twitch streamers.
Many of those requests are actually fake - scammers just want to get keys
to play the game for free or resell on sites like G2A. It might look like getting a single key to resell
doesn't make sense, as it would earn them some small amount of money, but when you multiply
that with the number of games coming out and the fact that they fake dozens of different accounts
to get multiple keys for the same game, it does get substantial.
To weed out the scammers, a good approach is to check their YouTube channel profile and look
for the contact e-mail in the About section. However, this isn't always enough. You need to take
a close look at the channel itself, as there are a couple of ways they can make it look legit.
For example, I had a couple of Youtubers whose e-mail address checks out, but when I take a look
at the channel, it seems like the last video they recorded was 2 years ago. If you see @gmail
or @yahoo address, it probably means that it's an abandoned account and scammers found a way
to get access.
Another way to cheat is to buy fake YouTube views. I had key requests from YouTube channels that
seemed solid. 1000+ views on every video. You would give a key to such channel, right? Well,
after looking at it a bit more, I started to see a pattern: every video had between 1000 and 1050 views. And somewhere
in the list, there were gaps - videos with only 1-50 views. And there were no videos outside those two
ranges. So, there wasn't any video with, say, 250 views, or 1200 views. This means that this
guy gets up to 50 views per video and he just bought 1000 fake views for some of his videos.
Some YouTubers don't have an e-mail in their profile, but you can still do some sanity checks.
The thing that I often do before even checking if e-mail is correct, is to go to their channel
and see what games they cover. If it's your typical channel with Minecraft-only content, or
AAA-games only content, then chances of them actually covering an indie game are slim to none.
One of the approaches the scammers are taking currently is going the Twitch route. Unlike
YouTube, it's impossible to get contact e-mail for a Twitch streamer. The scammers know you
can't verify their e-mail, so you have to take the risk. But not really. There's a feature
in Twitch called Whisper. This allows you to contact the streamer directly via chat. You
need to have your own Twitch account to do this. I recommend you get a Twitch account
anyway, so you can use it to get your game listed in the Twitch game directory, so the streamers
can mark that they are streaming your game and you can track that.
My game Son of a Witch has been in
development since 2015 and entered Early Access on Steam in November 2016. The game was initially named My Mom is a
Witch. This name was memorable and unique, but many players and Youtube and Twitch streamers had problem
saying it out loud. Take these curators for example:
Because of this, I began to think that another name would be better. However, changing the name was a tough decision.
The game won hearts of many players, including official selections from IndieCade and IndiePrize, all under
the old name. Changing the name would mean losing some of the search engine traffic, word of mouth marketing
and confusing the players.
Since the main character is a son of a witch, the new name was obvious. It would even fit the story better.
The only problem was that Son of a Witch is also a pun to a well known pejorative slang phrase which
doesn't work well with cutesy graphics of the game. Because of this I decided to ask the existing players on Steam,
and the feedback was overwhelmingly positive: everyone agreed
that the new name is much better and
easy to remember. There wasn't a single comment saying that I should keep the old one.
On July 3rd 2017 I changed the name of the game. It meant going through all the marketing materials
and updating the logo. One of the big problems were dozens of YouTube videos using the old name. The game
basically vanished from YouTube that day, as nobody would search for the old name anymore. I e-mailed
a bunch of YouTubers who had the videos with top number of views, but only one of them went back
and updated the titles.
Since I was updating all the graphic assets for the game store page with the new name, I decided to
go and update the key promotional image. I still kept key actors: the knight and the Ogre Mama boss, but I
changed the character poses and the way the scene is framed to give it some life.
This change might look trivial, but the effect was huge. In the weeks following the name and the graphics change,
the game sales went up 306%, i.e. the game sales started to triple. At first I thought this was just some
temporary effect. But, now that I have 9 months of sales data, I can
confirm that this increase in sales is permanent. A couple of simple changes moved the game to a completely new level.
TL;DR: No matter how good your game is, the game's image is very important. Even if you think it's
good, it's worth trying a couple different things and see how the players would react.
By the way, Son of a Witch is leaving early access on May 16th, so check it out.
- 28 new achievements ranging from easy to very tricky ones
- tremor status effect now affects orbs, arrows, bombs and throw weapons
- increased the starting hero skills in casual mode
- fixed bug when releasing the attack button with a bow in hand would initiate the backup knife attack
- fixed bug when typing in chat would activate the backup knife attack
- updated some of the translations
This version concludes the content I planned for the Early Access. I will dedicate the next
month or so to extensively playtest the game for the final release, so only expect
bugfixes and translation updates in this period. I have a bunch of new features I plan
to add in the future, but I want the exiting Early Access release to be well tested and bug free.
Version 3.1.4 is online with the 4th desert boss: The War Elephant. This
is an important milestone, because all the bosses I planned for the first full game release are now in the game.
The initial plan was actually 20 or 21 boss, but as the game has been
developed many new ideas came and now we have 24. I do have some ideas
for 4-5 more bosses, but those will come after Early Access.
Here's a short roadmap for the rest of Early Access development:
- Barbarian Hero with some special mechanics (shh, it's a secret)
- 12 special challenge modes to unlock the barbarian
- Hard mode
- 45 more achievements already planned "on paper", maybe more
- there might be some additional pets and items/weapons along the way
- a new trailer for the game
I plan to exit Early Access in May this year if all goes as planned.
There are also some ideas that might be implemented before we exit EA, but most probably afterwards:
- more mounts: baby elephant, horse, deer, green baby dragon (spit poison)
- additional quests and special rooms
- more weapons and items
Version 3.0.9 is up with the final, 7th level of the story, the end-game boss and the final cut-scene:
- a new desert level with a new status effect (thirst)
- completed the game story w/ the final boss fight
- some enemies have petrify attacks. Drink the dragonfire potion quickly to remove or use the Life Staff
- 3 new enemy types
- 1 new boss
- 2 new weapons
- 2 new items (both were present in the game, but didn't drop before)
- fixed the drop algorithm for the Magnet item
- bugfixes for ranged AI
- fixed "on sale" name translations for the potion shop
- blood runestones now give you 20 HP on top of +20 health increase
- balanced archery weapons and items drop rate
- allowed special / quest rooms to spawn in casual mode
- fixed a netcode bug where the Book of Ice would freeze enemies who are immune to freezing
- added more detailed decorations to the forest area
The game can now be played from start to end, but this is not the final game and there's still a
lot more content to add before we exit early access. The most important ones are the Barbarian hero
and 12 quests that you will have to beat to unlock him. And after that, 2-3 more bosses for some variety
in the desert level, a bunch of new items and Hard mode. Also, about 30 more achievements are planned now
that the game is completely playable from start to finish.
A new version is up:
- 17 new items with unique mechanics
- 5 new weapons with unique mechanics
- 4 new potion effects
- a new scroll: Confusion
- a new quest area in the forest where you can play baseball
- 6 new achievements
- all bows now come with a low-damage knife as a strong attack. You can use the knife to quickly break barrels and boxes and stay alive if you run out of arrows
- get a special reward from the shopkeeper if you buy all the items
- fireball + dark orb synergy now works
- fixed returning bow animation for the Archer
- fixed swoosh animation for melee swing attacks
- all Mom's Books can now be duplicated for increased effect (double poison/fire damage, double freeze duration, etc.)
- added a note showing which sword attacks are quick in the weapon description
- removed the Catacombs Shortcut from the daily challenge
- reduced the mana cost for the Bottomless Bag of Bombs
- show current run time on the pause screen
- fixed the Slime King boss netcode bug
- fixed bug when a player would get sticky feet if he walked into another player that had the effect
- added an option to show the timer during the game.
PvP fixes:
- sudden death timer is no longer running when the game is paused
- using twilight staff spell only increases power for the caster
- turret staff clones now shoot at other players and cannot harm the caster
- fixed the dead animation glitch for the winning player after he gets smashed with the huge hammer
A new version is up with a new boss, the Yeti Elder who is a huge beast whose jumps cause icicles to fall from the top of the mountain. He can also spawn smaller Young Yeti minions who also show up in various parts of the ice level.
- Yeti Elder boss
- Young Yeti enemy
- Achievement you can win when you defeat the Crazy Santa boss
- Fixed the pause overlay size for non-English languages
- Improved the death animation for the Crazy Santa boss
- Fixed the Reindeer pet name
- Fixed the Snailbite arrow name
- Added new graphics for the synergy of Dark Orb and Freezing Orb
- Fixed the gamble scroll - now it can be used multiple times in the same room and enemies would always change
- Added all the enemies into the Gamble scroll pool
- Fixed Fog and Toxic Cloud drawing for screens bigger than 1920x1080
The Winter is coming. A new version of the game is up with the Ice Mountain level:
- slide and glide across the snow as you fight - unless you have a mount
- 3 new enemy units
- 2 new ice weapons
- 1 new boss (Crazy Santa throwing exploding presents)
- added music and sfx volume adjustment to the pause screen
- fixed Mom Books drops for altars to match the achievement unlock description
- lightning now shoots through metal shields
- adjusted mana cost and base damage for some magic wands
- Fire sword now has 100% burn chance
- spawning minions no longer give you mana via Warbreaker (this is to prevent getting infinite number of points in daily challenge)
- fixed a couple of translation related bugs
Meet Ugh and Ogh, the cyclops. These brothers are a new boss in the forest. Cyclops is the weakest of all bosses, so there are two of them to make the fight fun.
Since the catacombs update I focused on adding new content to existing levels and bugfixing any problems. I also added 10 new achievements to make the game interesting
for players who completed all the levels.
Another new boss is the Ringleader. He sometimes shows up in the dungeon instead of the Simerian Butcher. The Ringleader can jump on you similar to the way the thief
does - except that he is faster and has greater reach. If he finds any bombs on you, he would use them immediately. He also steals and throws your other items around.
I also added a new themed area in the forest - a long jump competition. You get some items as rewards for jumping certain distances. To jump even further, you
can find some speed buffs like The Rabbit Amulet, Blur Potion, etc. There's also a Steam achievement if you manage to jump really far.
I want players to have a stable, well tested version to play so they don't run into
any bugs. On the other hand, I understand that some players want to play the most
recent version with the newest features. Because of this, I decided to make the beta
testing versions public.
Beta versions are the testing ground for new releases. They could have bugs or
crash. Benefits of running them are that you get all the newest content and you can
help me find the bugs sooner and thus make the game better for everyone.
To switch to beta version, right-click the game name in your Steam library
and select Properties option from the menu:
Then click the BETAS tab at the top of the Properties window. Select the "testing - Unstable" option from the dropdown menu:
Enter the password: minimum89012
Steam would then download the files that are different and let you
run the beta. If you plan to play online multiplayer - both players have
to have the beta version (there will be some periods in-between releases where the
beta version could co-op with the stable version, but this is not guaranteed).
If you decide to go back from beta to stable just open the Properties again and select "opt out" from the dropdown menu in the BETAS tab.
I'm working on the Catacombs level. There will be necromancers that raise skeletons. Once you defeat them, you can take their staff and animate your own army of undead:
Beside skeleton warriors I plan to add archers and mages as well. There will also be a new music theme, traps and a bunch of new items, weapons and mechanics.
The 4th level is ready. You descend into the dungeon where all the prisoners have been set free from their cells. Three new enemy types await you: a thief, a bandit and an assassin.
The thief tries to jump on your back. If he succeeds, he starts stealing away all the items from your inventory. If he finds a bomb, he will immediately use it. You can knock him off if you use a rage attack, or find some way to hit him - including meteors, bouncing orbs or via a voodoo doll. Also, if anything knocks you down, he will fall off as well. The thieves use a curved dagger, which is a new weapon with a throwing attack and backstab damage bonus that you can also use yourself.
The bandit is quick and uses a Morning Star that does a lot of damage. You also use this weapon if they drop it. The bandits will try to surround you from two sides, so watch them carefully.
Assassins have a short poisonous sword and a shield. They move and attack similar to the castle Guard Captains, but poison attack makes them really dangerous.
To counter all the shielded enemies, there's a new weapon in the game: The Excalibur. You can sometimes find this legendary sword in a forest, stuck in a rock. Once you retrieve it, you can cut through enemy shields as if they weren't holding any.
The dungeon features a new level style, with a couple of new trap types, a new treasure chest type and new music theme as well.
After a short break which included showing the game at Game Access '17 in Brno, I'm back to development. I'm working on the Dungeon level. For the first version it will
have 3 new enemies and a new boss. Of course, a new background theme and new objects and traps as well.
The Crystal Wizard is a new 3rd level boss. He starts showing up randomly in the castle after you have defeated the Executioner. He's similar to regular small enemies (i.e. you can stun him, freeze him, etc.) but he has a magic staff which he can use to shoot at you, the same way the playable magic characters shoot. He has +2 orbs and a mana canteen with practically unlimited mana, which allows him to use the staff's special ability at will.
His weapon is a Teleport Staff, which can be used to teleport to the opposite side of the screen. You can pick it up and use it yourself. Teleporting to the opposite side costs 2 mana, and you can also press the regular attack button to return to the position from which you teleported. This other action is free, but can only be done once. After that you would need to spend mana to teleport again. Some levels have hard to reach locations like walled off areas or parts across the chasm. These levels have a special preset teleport location, which is revealed if one of the players picks up the teleport staff at any point of the game. You can use the teleport staff to reach those places and return. That also includes the areas behind the shops in the forest, so now you can go there and break the barrel without needing two pets (bear+dog) to get the items. The teleport return point remains active even if you leave the room, but you have to be inside the room to teleport back to it.
The teleport staff can also be found in gold chests, shops and pedestals in the locked treasure rooms or blocked challenge rooms.
Beside the new boss and the new staff, there are other changes. I added a couple different texts for
the signs in the forest shops. I fixed the bug when the guards wouldn't attack you if you petrified the king
and sometimes the level generator would create a shop adjacent to the king's room, allowing you to
skip the boss fight in the castle.
Viole(n)t Knight is a new boss for the 3rd level (Castle). They come in
tandems and start showing up after you defeat the Executioner. The knights
are small in size and have a moderate amount of HP, but are really quick.
They have a regular strike attack and a dashing attack similar to the
playable Knight character. One of the knights always drops his sword, which
players can pick up and use. The sword has the greatest reach of all the swords
in the game and does 10 base damage (+12 for strong attack). The sword's
special ability is giving full rage to the player after every kill.
The Pyromancer character is ready. He starts with the Fireball Staff
and has permanent fire immunity. This means you can walk on campfires
which makes some rooms much easier. The fire spitting traps in the castle
and the Red Dragon's breath only do a small impact damage to him, but
cannot set him on fire. Because of all these advantages he starts the
game only with 3 health bars (60 HP).
He can be problematic for co-op, as you can easily set the other player
on fire. A good strategy is to give the Fireball staff to the other player
to activate, so he gets fire immunity. Or, if the other player is a magic
caster, just swap the staves at the start and play like that.
To unlock the Pyromancer, you have to find Amanda somewhere in the
forest and escort her to one of the shops in the castle. This means that
you have to go all the way through the Battlements level without her dying.
It's a very challenging and interesting quest to complete.
A new boss is added to the Battlements: A giant Hornet Queen. She can
attack you or lay eggs from which the regular hornet enemies hatch. Both
the Queen and the regular hornets have poisonous attack. The poison wears
off after one battle.
This boss starts
showing up after you defeat a Dragon (either a fire or the ice one).
After you beat the Executioner, you proceed to the throne. The king greets
you and explains that your witch mother wasn't really kidnapped. The king
called for her because he has a major problem in the catacombs: Someone or
something is raising the dead, and she's the only one who can stop it.
You can choose to peacefully enter the dungeon and find your way to the
catacombs. Or you can attack the king. If you defeat him and his guards, you
can take the Royal Scepter, which enables you to summon castle guards to
aid you.
Beside the scepter, a bunch of new weapons are added to the game: the Shepherd Staff
turns enemies into sheep, the Turret Staff creates standalone copies of the staff
that autonomously shoots at the enemies and the Earthquake Staff knocks down all the enemies and
destroys some rocks. The stronger your Magic skill, the more rocks will be broken.
For combat, Earthquake Staff is a melee weapon - you can strike or knock down enemies,
similar to Warbreaker Hammer. The Earthquake Staff is currently the only weapon that
scales both with magic and melee skill. This means that you can upgrade it with
both Warlock and Blacksmith runestones.
Beside all this, two new room types have been added. First one is the Scroll
shop, which sometimes shows up as an alternative to the Potion Shop. The shop
offers all four types of scrolls for that run at a low price, and you can buy
an identify scroll for only 10 gold coins. The second one is a special room
in the castle where the Ogre Mama is fighting the castle guards. It can only
show up if the Ogre Mama boss is absent from the forest.
Additionally, the Fireball Staff now adds 1-battle fire immunity to the
casted who activates the fireball buff.
A new boss is added to the forest area. He starts showing up after you defeat
the Ogre Mama, or you play 20+ games. As you would expect from a golem, he is
immune to poison. This one being an Earth Golem makes him also immune to
meteors and petrifying. Now, this might seem tough, but he's still a first
level boss, so once you learn his attacks it shouldn't be much harder to beat him.
There are now three special areas in the game, which randomly show up on the first level.
The first one is the Troll Bridge. There's a tight bridge in the middle of the screen
and you can either pay the toll to pass, or fight the troll. The troll is pretty fast
and strong. You can use the bombs to get rid of him quickly, or attack him to get him
to chase you away from the bridge and then cross the bridge and use a bomb to blast
the door on the other side. If you have a really powerful weapon, rage attack ready or
meteor staff with a voodoo doll, you should try to defeat him as he drops a lot of
gold.
The second area is the Garden. The farmer has a pest problem. The critters are
coming out of the bushes and eating the flowers. If you manage to stomp on them,
you can get weapon upgrades because each one drops a runestone. They are fast and
never attack you. Because of this, they aren't considered the enemies, so you
cannot use magic to freeze them or do something similar.
The third area is the hunting ground. Well, not really hunting, but more like
taming the beasts. Depending on the number of players playing there's one or
more wild boars walking around. You have to chase them down, or hurt them from
the distance to tame them. Once tamed, you can mount and ride them which gives
you +2 speed.
While you
are riding, all the damage taken is split between you and the animal. The boars
eat all the food, which heals them. If you get the Hunger curse, you can remove it
with the Dragonfire Potion, drink a Beer, eat a Mushroom, or find a way to get off the boar. For example,
if a Goblin Shaman drops a meteor on your or someone stomps a Voodoo Doll you're
marked with.
I decided to avoid having Easy/Normal/Hard option. However, to make the game easier
for people just starting out, I decided to give players some powerful boosts until
they manage to beat the bosses. The starting boosts are Books your Witch mother left for you.
At first, you get a Book of Life that gives you 100 extra HP. You keep getting this
book until you defeat the Ogre Mom. This helps with the fact that the player is still
learning the ropes and the goblins do a lot of damage.
After you beat the Ogre, the subsequent runs give you the Book of Ice which
freezes enemies for 3 seconds every time you enter a new room. This helps from
dying too quickly against the guards. You gain a couple of seconds to survey the room and position yourself.
After you beat the Dragon, you start getting the Book of Fire, which sets all enemies on fire as you enter.
After you beat the Executioner, you start getting a random item. Those items aren't as powerful as Mom's books, but still provide some help.
The idea is that once you reach Mom in the Dungeon, you will unlock her (you can play as her) and then you won't be getting items anymore.
A bunch of new weapons and items have been added to the game recently. I'm still
tweaking those, for example The Rouge Sword allows you to conceal yourself, sneak
behind an enemy and attack with massive damage. The current version on Steam only
has the sneaking part, but I'm going to release a new version (1.6.0.) in a couple
of days that has the surprise attack bonus damage.
Beside those weapons, I added six new items and two new potion effects to the game.
Some of the items are upgrades to Archery skill, while the rest are more general and
can be used by any class.
The new version will also have UI improvements. Most notably, the numbers
next to icons will contain some useful info like plus, minus or percentage sign
depending on the nature of the depicted effect.
A new version will be released on January 20th most probably with
player vs player mode for 2-4 players. There will be about 15 different
arenas - just like regular forest, battlements, castle levels, but without enemies.
Items and weapons drop randomly on the ground or pedestals while
the players are fighting each other until only one is left alive.
To make it more interesting, a Bushido will spawn at a pre-set sudden death time,
and chase the players around. Players can just battle it out with the starting
HP they've got, or you can set up multiple lives for everyone if you prefer
the rounds to be longer.
You will be able to select one of the unlocked heroes or a Goblin
Berserker (the one with the axe).
This update will also bring in a bunch of new bow weapons with different effects:
This update brings the castle level, with new graphics and music theme.
The goblins and guards are fighting each other while you are trying to reach the dungeon.
Features:
- a new boss
- Big Orc enemy
- the Royal Sorcerer enemy
- 4 new pets with new effects
- 3 new weapons
- 15 new items
- lightning based damage
- fire and lightning damage can be upgraded with the new items
- duration of freezing for ice based weapons can be upgraded
- pendants for ice, poison, fire, petrify immunity
- overdose random potion replaced with beer
- orbs can now be upgraded to bounce off the walls
- various reusable items: Magic Map, Magic Chest, Bottomless Bag of Bombs, etc.
- balancing of different weapons, spells, potions, prices
- fixes to enemy AI
- cut scene between chapter 2 and 3 can be interrupted
- other minor tweaks and improvements
It's called Thunderstriker currently. If you have an idea for a better
name, please tell me.
It has regular swing and overhead strike attacks and the special rage
attack is to shoot a lighting bolt. The bolt doesn't knock down enemies,
and does 25 damage/hit, so it can deal anywhere between 50 damage to
lesser enemies to 125 damage to a boss. The shorter range of the special
attack is compensated by the longer range of the sword (currently it's
the weapon with the farthest reach in the game), decent damage and
ability to shoot lightning through obstacles.
There's a reusable map, bottomless bag of bombs, and a magic chest
that turns mana into gold.
Beside those, there will be a bunch of
pendants granting you immunity to fire, ice, poison and petrifying.
The Run Like the Wind potion is removed from the pool because
it was OP - a new amulet is introduced instead which gives you a permanent
speed upgrade.
The Overdose potion is going to be replaced with a Beer item, so
that drinking unknown potions isn't so punishing.
The goblins are storming into the castle. While the guards are fighting back, you are trying to
get to the dungeon. You need to go through the keep while the goblins and guards are both attacking each other
and you as well. This gives you some interesting tactical options. Do you just evade them and let them battle it out
before attacking the winner, or you try to help the weaker side to even out the balance of power.
The next update will feature a new area with different graphics, background music and
environment (traps, destructible items). And a couple of new enemies and a new boss.
The Archer character is in the game. He shows up randomly in the forest
as an NPC and gives you a quest. Once you complete the quest, he will be
unlocked and you can select him.
I spent the last two weeks preparing for the Steam Early Access release.
There were some bugs in the netcode, mostly edge cases that happen once in 100
games. I did A LOT of play testing, and got some really fun runs, like this one
with a bunch of pet animals and melee skill buffed to 250%. Unbeatable.
I balanced some weapons and enemies, and added some play statistics. Some
of the tough rooms no longer show on the first few runs. Beside that, there
are some potions and scrolls that also unlock after a couple of games. The
game is roguelike, but I don't want the players to be hammered by too challenging
world on their first play. After you play 20+ games, you'll get the full sets
of enemies, scrolls, potions, room layouts, etc.
The game's coming out on November 10th as planned. Get ready for Thursday...
Based on some player
feedback, blood effects are optional now:
The possible settings are:
No blood at all
Only stains on the ground
Only flying particles when some enemy or player is hit
Full blood effects (both stains and particles)
Having stains makes the levels look nicer, especially the boss rooms. However
it's permanent, so I think some players might want to turn it off. The splash
when you hit an enemy is temporary, but I understand it could be over the top
for some players, so I made that optional as well.
It took some testing to get netcode working right, because blood effects
use RNG to set up and it would mean that the same seed now generates different
levels based on the blood setting. I fixed blood to use a separate RNG and not
mess with level generator.
I have been quiet with adding new features to the game as I was preparing
for the Steam release. Many bugs were fixed, netcode works properly again,
and I made some changes to enable full controller support. That's right, now
you can lean back and play it all with a controller, even stuff like entering
player names and password codes for online multiplayer.
The Glacier has been nerfed a little bit - the special Freeze All Enemies
power is now magic based instead of rage based. It needs 2 mana bars to
activate. It's still very powerful, but not game breaking anymore.
I also added health bars to enemies:
I was a little bit conflicted about this change. Neither Castle
Crashers nor The Binding of Isaac have those. But Rampage Knights has, and
the combat feels better. You would rarely look at the health bar for the enemy,
but sometimes it gets important, esp. when you're dealing with bigger crowds
- it makes it easier to pick those you can one-shot and remove from the battle.
I understand some players might not like it, so it's optional. You can turn
it off in the Graphics settings.
Here's a run showing the first two levels. The game is procedurally generated
on every new play, so you get to use different weapons. The video shows
what you can do with the Celestial Smasher hammer.
My Mom is a Witch has passed the Steam Greenlight process. Expect to
find the game in Early Access soon.
Why Early Access? Well, the game is far from my full vision. We have all
the character graphics, but we still need a lot of backgrounds, props
and animations. I want to get the game into player hands, so we can
get some cool ideas on mechanics for future monsters and items. There
are about 50 different items and weapons in the game currently, but I want
the final release to have over 100. I already have a lot of ideas in my
notepad, and I want to refine that with player feedback.
The plan is to go into Early Access by the end of the year. I will
release updates with new features every two months until we reach version
1.0 which will contain: 7 playable heroes, 44 enemies, 20 bosses, 100 items/weapons and
7 different areas.
I just got back from Birmingham UK where I demoed My Mom is a Witch on EGX.
I had a double stand setup with two computers running the game. Four players
could play on the left one, and two on the right one. The laptop in the middle
just looped through the trailers all the time.
EGX is awesome for playtesting. The game logged the play stats in the background:
1682 player-sessions were played. We gave away
about 800 flyers to people who played the game, so everyone played about two
games on average. Having two
computers and multiplayer allowed a lot of people to try it. The event ran
for four days, Saturday being the most crowded:
EGX was open an hour longer during the weekend days, but that additional
hour didn't bring in many players. Here's the breakdown by the hour:
There were different categories of passes. From 10am to 11am only members
of the press and players with super pass would come in, but they were mostly
interested in AAA games, so it was rather quiet on all indie stands during
that time. At 2pm there would be a huge influx of new visitors who had the
afternoon pass, and when they browsed around and determined which games they
want to play the interest for My Mom is a Witch would peak around 3pm.
Playing sessions
My Mom is a Witch can be hard for beginners, so the average playing session
took only 3 minutes and 21 seconds. Most of the players started a new game if they
died quickly. Here's the breakdown of the sessions:
Action rougelikes are great for events like this because of the short length of a single
game. Since play sessions are short many people can try the game. Contrast this
to an RPG that might take 30-40 minutes to try out and get to the core. In total, we
had about 49 hours of playing time spread across two computers and four days, making it
an average of six hours of play time per computer per day.
I also tracked how far into the game would the players progress:
90% of the play sessions were long enough to experience the game properly.
Almost half of the games went deep enough to discover some of the cool content
like the item/potion/pet shop, treasure room or the boss fight. Since most of
the players played twice it means that everyone has seen at least something.
Of course, the game is roguelike and you only get to try a subset of weapons, items and
mechanics on each playthrough.
For the first three days, we only got nine Greenlight votes.
Saturday evening I did some major changes to the game. I added a revival timer
for multiplayer games, which made the game more fun. Also, I changed some
of the controls to make it more intuitive to the players. This resulted in
many happy faces and we got 30 votes that day. Still, going all the way to
Birmingham to get 40 greenlight votes (or even 120 if we had a better build
ready from the start) isn't really a good deal.
TL;DR: Greenlight marketing has
to be done some other way.
The Red Dragon is one of the toughest bosses in the game. He can spit fire and
smash the heroes from above.
For this fight I had a really cool combination of buffs: Appetite +2 and
Gold Diet +2 which restored 11 HP for each gold coin I ate. My co-op partner
died while beating up more than a half of dragon's HP. Funny enough, the final
two blows were dealt by a Bat, one of our pets.
I'm adding some screens without enemies, but with traps instead.
It creates an interesting variety. Instead of just plowing through the
piles of enemies, sometimes you have to stop and carefully thread across
the screen. Of course, some screens will combine enemies with hazards,
which you can use to your benefit.
These spitters shoot fireballs. Fire is one of the most dangerous types of
damage. Here's a breakdown of the types of damage the game has so far:
Petrify Turns into stone within 10 seconds. Counter with
Life Staff or Dragon Fire Potion.
Fire Burning drains health really fast. Regular fireballs, walking
onto a campfire or getting hit by a spitter drains 50-60 health in a couple
of seconds.
Ice Doesn't do any damage, but prevents movement/attacking
for a couple of seconds.
Poison Slowly drains health. Can only be stopped with Dragon
Fire Potion or Antidote.
Hunger Very slowly drains health. Can be stopped by eating any
type of food, including gold coins if you have the Gold Diet buff.
It's time for the second level. As our heroes launch themselves with a
catapult into the castle, they land on the top of the battlements:
As the goblin invasion is in progress, the battlements are filled with
dangerous war machinery. The castle guards are defending a siege and
have prepared various weapons and traps for the invaders. You are intruding
here, so prepare to deal with the guards and the hazards at the same time.
The second level is meant to be more dangerous, but possibly shorter than
the forest area playwise. You're walking around the battlements looking for a
way to enter the castle insides.
The Knight is fully animated, programmed and ready to go:
Compared to the mage, he has a couple of extra melee animations. The
weak attack has three animations instead of just two and there's a special
smash animation which activates when the last enemy in the area is lying
on the ground:
Sometimes a special kind of room will be created in the maze: a potion
shop, pet shop or a quest room. More on quest rooms later, but here's
the potion room:
If you snatch a voodoo doll from the Goblin Shaman, you can use it yourself
once per area. You first bind it to a target and then drop it. Any damage
dealt to the doll is channeled to the target. For example, if you stomp
the doll, the target takes damage and falls on the ground. If you hit it
with a sword, the target gets stunned and takes damage. If you hit it
with a poisoned sword, the target gets poisoned. If you toss the doll into
a fire, the target starts to burn:
It took me some time to make this work properly for all the effects,
but it's a really cool mechanics now. If you get bound to the doll, wait
for Shaman to throw it down and then quickly pick it up and activate it
to remove the binding from yourself and bind it to some enemy.
The first game screen features 5 different NPC characters that teach
you the basic game mechanics:
Some dialogs show up only if you have an appropriate type of weapon.
You can hit anyone. Some of the NPCs will bear it until they die, while
others might run away. At first I wanted to make everyone change their
dialog when you hit them, but this is a tutorial screen and you might
hit someone accidentally and miss an important part of the dialog
that way.
The archery is not covered. The idea is that bows are locked down
and don't drop until you unlock the Archer. Once you rescue the Archer, he explains
how bows and arrows are used.
There are three main skills in the game: Melee, Magic and Archery.
Finally, all animations for the mage character are now complete:
There will be a great assortment of bows and arrows available with
different damage and special effects like fire, poison, freezing,
petrifying, slowing, etc.
The character selection screen has some basic stats like Archery, Melee
and Magic proficiency:
Those numbers are percentages. For example, if a Sword does 12 damage,
a hero with 100 Melee will deal 12 damage when he hits, while a Hero
with 50 Melee will only deal 6 damage. Those skill numbers can increase
and decrease during game with various potions and artifacts.
The character on this screenshot has both Magic and Melee at 100 for
testing purposes, but there won't be any such character in the game...
Actually, one class (Paladin) will be close, but it will have something
like 100/70/30 for Melee/Magic/Archery.
On every level there will be some areas that are behind locked doors or
simply blocked paths. If you manage to find keys or blast your way through
(or teleport across, or ...) you can get inside and loot all the chests.
Well, maybe not all. Some chests are locked and you need a key to open those.
This beautiful gold chest is a drawing by George Alexopoulos who will be
contributing some more art to the game in the future.
During the adventure, you will be able to upgrade your weapons as well.
The upgrade material are the runestones, magic stones of unknown origin
that can be used to improve damage and range of your weapons. There are
different runestones for melee, magic and ranged weapons.
The upgrade animation is still work in progress, but I'm getting there:
So many ways to escape when things go south: blast a door with a bomb,
use a scroll to open doors, use a key if some of the doors are locked...
but now there's one more. A magic scroll that teleports you to a random
location somewhere else in the forest:
It never teleports you into a boss fight, but anything else is possible.
Bombs have three different purposes in the game: 1. blast the rocks to
find some items hidden underneath and to open some blocked passages.
2. blast doors to escape tough battles or locked doors when you don't have
a key. 3. blast your enemies. This 3rd use is hard to do because the enemies
are constantly on the move, but it's great for bosses because most of them
will be stunned for a couple of seconds if the bomb hits them.
Yeah, those exploding barrels are really in the game, but they have
a special role. It's a secret you will have to discover while playing.
Campfires are the first hazard in the game. If you step on it, you are
set on fire for a couple of seconds, which is enough to deplete 80% of a
fully healed hero. At least, until you buff your hit points. The fire does
not kill you ever, but it can lower your HP to just one point and then a
single enemy hit will bring you down.
Enemies try to stay away from it, but with some skill you might be able
to push them into fire by a well placed sweeping attack.
P.S. unlike this .gif, the animation doesn't skip frames in the real game ;)
Here's a cool combo. If you get both the Snake Staff (poison) and
the Fireball Staff (fire), you can buff the Fireball Staff with poison
to shoot poisonous fireballs:
Enemies that get hit will be set on fire and poisoned at the same
time. Somehow the burning animation is missing here, I need to fix that.
It's time to play with fire. One of the playable characters will be
a fire mage, so I decided to play with various fire effects. Wands can
shoot fireballs which explode and enemies can players can be set on
fire and lose a lot of health while burning:
Here's some animated action. The mage is still using the Snake Staff
to fire fireballs, but there will be a special Fire Staff in the final
game:
I got so many new elements, I guess it's time to build some variety
of levels. Currently there are 15 different level layouts for the
forest, but I plan to have at least 60 for the first alpha version:
If you try to pass behind her back, you might get smacked in the back:
I'm also planning an arena for the boss fight. There will be a small
building for goblin warriors to come out and help the Ogre and there's
a catapult that you can use when the battle is over
The boss room will have a distinct door which cannot be blasted with bombs:
As promised, you can pick up enemy weapons and use them. Goblin axe
has a simple overhead strike attack mapped to the fast attack button. Pressing
Strong attack button throws it:
When your rage meter is full, you can use the sweeping mega throw attack:
I'm testing my game engine to see how it behaves in big battles:
Two players, 15 enemies and it works as smooth as with an empty
screen. The game will run on a 10-year-old Core2Duo CPU with integrated
Intel graphics card at 60fps with smaller resolutions like 1366x768.
For HD screens it pushes about 53 fps on that config, but if you have
just a little bit stronger CPU or dedicated GPU like nVidia or AMD
it will work just fine. It only requires OpenGL 1.1, so even some
really old hardware will be able to run the game.
I got the multiple shots working. Reminder, it's an effect of one of the
potions:
You get more shots, but each orb is weaker. When you start a game with
mage you make 6 damage per orb. When split, each orb does 5 damage, but you
fire two orbs at once, so that's 10 damage, a nice increase. Of course
there are other ways to increase damage back up:
A good combo is when you add poison to it. You can easily poison multiple
enemies at once:
This goblin combines ranged and melee into a single unit. His rage
increases even without hitting an enemy and when the rage is full, he
throws the axe towards the player. When up-close, he uses the axe to
fight in classic melee strikes.
Goblin Axe is a very desired weapon for warriors. It can be thrown
from a distance. If your rage meter is full, the thrown axe is unstoppable
and flies across the screen knocking everyone down.
Every game has some elements that are boring and unexcited to make
but still important for player experience. Here are the boxes and barrels.
You can break barrels and boxes and find some items inside. Usually
it's food and coins, but sometimes you may find keys, bombs, arrows, potions and
other consumable items.
Here are some other mysterious potion effects. Some are positive,
some negative, and some balanced. For example, this one reduces your
hit points but increases magic. Magic skill determines the damage
and size of magic projectiles, and effectiveness of magic caused
effects like using magic to buff weapons with poison. The game will
also feature magic scrolls and the player would need to have a certain
magic skill threshold to be able to understand what the scroll does
before using it. Of course, if you are a warrior, you could still read
the scroll and activate its magic, but some of the scrolls have really
bad effects.
Potions can also increase your base skills, even to the point where
it would make sense to switch class. For example, if you buffed up
archery skill and range a lot, it would be a good strategy to start
using bows and arrows.
On your adventure, you will find different magic potions. These potions
are colored differently on each playthrough. For example, blue potion can
mean stronger magic in one game, and faster speed in the next game.
You can discover their effect with an Identify scroll, or you can take a
chance, drink and see what happens.
This one allows you to see the enemies in adjacent areas. (1B) means
that the effect will wear off after one battle.
Every melee weapon in the game has a special rage attack. Swords mostly
have some kind of dashing, axes can be thrown, hammers will be able to
call on help from the gods and clubs become 3 times bigger than usual and
smash down the enemies
When enemies are knocked down, you can stomp them or smash your weapon
to the ground to hit them real hard. Of course, when an enemy is on the
ground, the hitbox is different, so I'm fine tuning that now.
You will be able to run and jump from a short distance. Unlike the knight, the mage jumps
because he's too light to do the ground smashing attack.
This looks so
cool, I might add a long-jump competition to the game.
You can find various potions in the world. Some are dropped from fallen enemies,
some are found in chests, some are stored in barrels and boxes, some even hidden
under the rocks which you will be able to destroy with bombs. And you will be
able to buy some in shops as well.
Here's a small health potion. At the top, you can see what it looks like in the
player's inventory, and underneath is how you pick it up.
It heals 20 hit points, which is equal to one red bar. You can stack multiple
potions of the same kind, so they only take one inventory slot.
I made a separate magic particle effect animation for smaller items like
this one.
One of the characters available at the start of the game is
a mage who has a Snake Staff as the primary weapon. The Snake Staff
fires basic blue magic orbs and has a special ability to imbue poison
to weapons. It can imbue poison to itself as well, so you get to fire poisoned
orbs.
The amount of poison damage depends on the player's magic proficiency.
At 100% it's going to be 3 poison damage every 1.5 seconds (it only shows
2 in the screenshot, because I messed around with player stats and it wasn't
at 100%). If a player
is not very good with magic (say, a knight has only 30%), it will only do
one poison damage in the same interval.
The poison does not kill, but it can completely drain the health points, and
then it only takes one hit to finish off the enemy. The same goes for
player characters.
It can be also used to make swords poisonous, or even some more
deadly combinations: for example, if you find a fireball staff, you can
make it poisonous as well, and it will shoot fireballs that set enemy
on fire and poison him at the same time.
Magic orbs break apart when they hit an enemy, some obstacle or
lose velocity and fall to the ground
In the actual game, the goblin gets knocked back a little bit further
after each hit, but this .gif loops, so it looks like he's just shaking
a little.
You will also be able to pick up weapons that drop from chests, barrels,
boxes, etc. I spent a couple of hours experimenting until I got this cool magic
hovering effect:
The .gif doesn't loop perfectly, but you can still see it.
Add a bunch of goblins and the action becomes intense. I have improved
the AI, so now they don't walk over each other anymore. They are trying
to surround the player from all sides.
Using melee weapons really feels like playing a true brawler game
like Castle Crashers.
The basic magic staffs fire magic orb projectiles. Some other staffs
will be able to launch fireballs, ice bolts, etc. Here's the ice projectile:
When wielding a magic
staff, the player can walk in one direction and independently shoot in
a different direction. It's very useful when you are retreating:
If you are using a controller, one stick controls the movement and other
the shooting direction. Because of the way the game is played, only left
and right directions are available for shooting. Although, with some
upgrades, you can get diagonal and homing projectiles as well. If you
play on keyboard, there are two keys assigned to shoot left or right.
I tried playing the game with the previous UI idea which had a horizontal
bar for Health, Mana and Rage. However, it's quite unclear that Mana and
Rage are tied to the weapons and items. So, now I'm changing the layout:
there's only one Health bar at the top - the Mana and Rage bars will be shown
alongside weapons and items that require them.
Don't be confused with the portrait image - I'm currently controlling
a goblin instead of the hero, because his animation set is complete.
I think this layout will work, but I'm not really happy with the
graphics. Need to experiment with some other designs....
Not much to show on the screenshot, but the Goblin Clubber and Goblin Shielder
are fully animated and the basic AI works: collision detection, avoiding
obstacles, moving towards the player and attacking.
The hitboxes mostly work ok, although there are some subtle bugs (see
the club tip for example) that I need to fix.
Here's the user interface. I'm still not 100% sure whether to show the
player stats on top or bottom. The game can be played by 4 players, so
maybe I can show two players up and two down, or something like that.
The red bar is health, the blue is mana, and the green one is Rage. The
rage fills up when you hit enemies with melee weapons and when you get hit.
When the rage bar is full, you can use a special melee attack which will
depend on the weapon type (sword, axe, spear, hammer, club).
You can see the two weapon slots, but I plan to allow players to carry
some items as well. Not sure where I will show those.
If you wonder what's that blue ball: the magic staff shoots magic orbs
that resemble tears in The Binding of Isaac. This is the most basic projectile.
Other wands will fire different ones. For example the Staff of Fire will
shoot fireballs that set enemies on fire; the Staff of Ice will shoot ice
bolts that freeze the enemies, etc.
The map
In the meantime I gave up on the smaller screen idea. 1366x768 sized rooms
are too small for big 1920x1080 monitors. Although you can see multiple
rooms at the same time, it would still mean that 40% of screen is unused. I
tested and there's just too much empty black space on the screen.
So, I decided to make the rooms wider. The room size is now 1920x720. Players
with smaller screens will scroll left to right, just like Castle Crashers. There
is no vertical scrolling. If you have more than 720p high screen you will be
able to see more of the beautiful backgrounds that extend at the top of the screen.
Because the rooms are rather wide (or should I say: long?) now having a
single entrance vertically doesn't work well. Because of this, I'm changing
the maze layout to hexagonal rooms. Each room can have 6 different exits.
The new maze generator already works, and here's the minimap:
This one shows small rooms and it's optimized for 720p screens (768px, 800px, etc.)
If you have 900+ it starts showing a bigger minimap. Once I add all the different
room types I will add markers for different rooms and perhaps if you left
some important items somewhere. And there will be magic spells to discover the
whole map.
The white rectangle is the current room, light ones were visited and dark ones
you know about (have seen the door to it) but haven't been inside.
This character is a mage, but I decided to animate him first. Mages
can pick up melee weapons and attack too - they just deal less damage than
knights. You can pick up any weapon that the enemies drop when they die.
In this shot, the mage is using a goblin club :)
The font for damage numbers is bad, I'm experimenting with some
others. Sorry about the small yellow crosses - I'm using those to
determine the hitbox using some basic trigonometry.
The cross should represent the location of the weapon's tip.
Here's the second goblin. Once you attack him, he raises his shield
and then he's only vulnerable to very strong attacks. However, you can
sneak behind his back and hit him.
I built a custom animation engine. I make animations in Anime Studio Pro
and then export them into JSON. Then I massage this JSON format into C++
code that I include directly into my project. Since I don't have a player
character yet, I'm using the keyboard controls to move the goblin around:
P.S. This .gif animation has a slower framerate than the game. The
goblin actually moves a little bit faster. The game runs at constant 60 fps
all the time.
Here are the doors between forest areas in open, closed and blocked
state. You can blast the blocked doors with bombs to discover secret
stash of treasure chests. The regular doors close when there are monsters
on the screen, so you have to beat them to go further. Or, you can blast
the door open with a bomb and escape the battle. Beside this, there
will be a magic spell that opens doors.
I also plan to add a special Boss door for the boss room, and locked
doors for which you'll need a key to unlock. I'm not sure if the shop
needs a special door as well?
The main menu is fully functional now. I'm reusing the
custom engine from my previous game, so all I needed was a
good font and some nice graphics to make it work:
I plan to
add some goblins who would walk across the screen down in the forest.
Just need to animate them first.
This will also be the base background for the forest levels.
You mom is a witch. Together with your brother, the three of you live
in a forest. One day, the king's soldiers
show up at your home and take her away without any
explanation. As a player, you can choose one (or both in co-op) of
her sons to go on a rescue mission. One of the sons is a
young sorcerer and the other one is a warrior.
In the meantime, someone has stolen a powerful ancient
artifact from the goblins who live in the nearby forest.
Angry goblin patrols are searching the forest for the thief.
You need to avoid or fight the goblins to reach the castle, and
then find a way to get inside. On your adventure, you can rescue or
recruit other heroes to help you on your quest. (up to 4 players
will be able to play in co-op mode, with 12 different playable characters).
Once inside the castle, you try to reach the dungeon hoping that the mom is
locked up and alive. Meanwhile, the goblins track the thief to the king's
castle gate, and they demand their artifact back. The king soldiers cannot find the thief
and aren't able to produce the artifact. The goblins demand to come inside and
find it themselves, but the king refuses. The goblin siege begins and soon
they manage to break down the defenses and come inside... now you need to fight
both the goblins and the guards. They fight against each other too.
But the real reason why your mother was taken away remains a mystery until
you find her...
Here's the first enemy for the My Mom is a Witch game. I'm still
playing with different poses in Anime Studio Pro:
The forest will feature 4 enemy factions: goblins, bandits, skeletons,
and various animals: bees, bears, etc. This is the most basic goblin melee
unit with short range, but powerful strike that
deals a lot of damage. He's slow and heavy, so make sure you don't get
hit.
I need to put some work in that swoosh effect to make it look better...
My Mom is a Witch will feature dungeon crawling with rooms, similar to what Binding
of Isaac game does. Unlike Isaac, I want graphics in MMiaW to be pixel-perfect,
without stretching artifacts.
The target platform for MMiaW is PC. I looked at the Steam hardware surveys,
and it seems that two resolutions dominate: 1366x768 for laptops and 1920x1080
for desktops. I plan to design the game rooms to fit perfectly into the smaller,
1366x768 resolution. Players who
have even smaller screens won't be able to see the whole room at once, it will scroll.
Players who have biggers screens will be able to see multiple rooms at once.
This way the graphics will always be sharp.
I also contemplated making the room size different based on the player's
screen resolution, but I want the game to have online multiplayer as well
and for that reason the rooms have to be the same size on all computers.
In the past 7 months I have been planning a new game to make. It will be a multiplayer
action brawler like Castle Crashers with cartoony graphics. The main problem I have with
CC is that once you complete it, there's no incentive to play more. So, I decided to
combine the brawler mechanics with roguelike elements: permadeath, procedural generation
of levels, items, enemies, etc. and non-modal gameplay (esp. important if you have 4 players playing).
I have most of the concepts on paper and spreadsheets and some 60% of the graphics is
ready (still need to work on animations and special effects a lot). Current plan includes:
12 heroes, 44 monsters, 16 bosses and 6 different environments (forest, battlements, castle,
dungeon, catacombs and a special ice level). Additionally, 50+ different weapons and items
will be available to loot and use for the first version, and more planned later.
There will be 3 distinct play styles available, focusing on melee, ranged or magic
combat. The player's starting class would determine the proficiency (i.e. base damage
and effect modifiers) but the player can upgrade during the game and become multi-class
if desired (and RNG does not get in the way). Melee combat is going to work similar to
Castle Crashers with additional "rage" mechanics, which is a meter that fills up
and you can use a special attack then.
The levels will be laid out like rooms in the Binding of Isaac with boss fights at
the end of each level. The mana system and magic items will work like batteries in Isaac
(i.e. you need to complete a couple of rooms before reusing the special magic) and
the regular magic users can constantly shoot various weak projectiles similar to tears in Isaac.
I plan to post my progress every day, so stay tuned
I finally got the whole game story in place. A group of skaters learns that
their playground is going to be demolished and turned into a mall. They
consider all their options and the only possible way would be to steal the
permits and other documents from the construction company (not, really,
but in their teenage minds that should do it). One of them decides to steal
them, but goes missing. You are his friend, determined to find him.
But, that's not all. The real story actually starts 10000 years ago when
an alien Von Neumann colonization ship lands on Earth. It's task is to
seed the Earth with plants that would convert the atmosphere and also to
eliminate any intelligent life that could oppose colonization. However,
something goes wrong and hibernated aliens aboard the ship never wake up.
Until a construction company starts digging around, accidentally turns on
the ship's systems and aliens take it over. The aliens learn about humans
and decide they need to build a robot army to exterminate us. The Mall location
is the perfect facade to build an underground factory without raising any alarms.
I'm currently preparing a demo of the game, which will include most of the first chapter.
It won't feature any aliens, only the puzzles that lead to the construction
company headquarters. So, don't worry about spoilers, the real story starts
unveiling after the demo.
I'm currently preparing a demo of the game, featuring the first chapter
which won't feature any aliens, only the puzzles that lead to the construction
company headquarters. So, don't worry about spoilers, the real story starts
unveiling after the demo.
I'm ditching the dark-art idea. The game should be fun and bright.
I wanted to draw a game with pixel art for some time, and I guess
the time is now. Here's my idea for the lead protagonist:
His passions are driving a spaceship and listening to heavy metal
music. I need to work on his legs and...
I'm experimenting with different art for the game. Here's the
dark version.
The light version does not look that good, but plays much better
because brick types are distinct enough and it's clear what you
can do. Maybe I should look for a third art style, something like
Braid?
I'm not sure what to do next. I got a lot of puzzles prepared
but don't want to waste time making the, just to have to redo everything
if I decide to change the art style.
Starting this year I wanted to develop some applications for iPhone
and iPad, so I got a Mac Mini. My other computers are 7+ years old,
so I couldn't run any recent games. Over the years I accumulated games
via Humble Indie Bundles and I finally got to play them. I'm very
impressed with Braid, VVVVVV and Limbo.
A few days ago I realized that I wanted to play more puzzle platformers
like those, but there aren't many around. So I decided to build one.
The idea is to take from each game the element I like:
Braid: brilliant puzzles
VVVVVV: old school graphics
Limbo: continuous camera, puzzles with box2D physics and scripted enemies
The main gripe I have with all of those games is that they were
too short (ok, Braid maybe not so, because puzzles were hard).
I plan to make A LOT of levels in my game AND I will make a level
editor with “cloud save”, so you'll be able to upload
and share levels on the game's website. Other players will be able
download and rate the levels. If players really start contributing
a lot of levels, I'll pick the best ones, pack them together to
continue the main games story in a nice way and release as a DLC package.
Because of this, editing levels should be fun. My plan is to
mix editing and play mode, so you can play the level as you edit it.
Just drag the player, walls, boxes around. You will be able to
freeze the enemies and such, but editing should be as fun as playing.
Also, my kids are begging me for multiplayer mode, so it might have
separate local co-op puzzles for 2-3 players. Joystick/Controller
support is also a must as I plan this to run on desktop computers
(Windows, Linux, Mac).
It's all done. Here's a video showing gameplay. It has a mouse
pointer because I recorded it on a desktop computer, but it looks
exactly the same on Android tablets:
The second beta version is ready for testing. Everything should work, except
that it lacks music in the main menu screen (should be coming soon).
Please test and tell me how you like it and if you think something
needs to be improved.
If you installed the first beta, please remove it from your Android.
The application package name has changed, so Google is treating this new
one as a separate application and won't update the game. You have to
install this one as if it was a completely different game. Sorry
for the inconvenience.
Well, it turns out creating AI wasn't simple at all, but I finally
finished it. In the meantime, Voyna created a great music piece to
play in the background during the battle. I also had to switch
to latest libGDX because I couldn't get the AdMob to work on the
old one. Of course, that would be too simple. The new libGDX wouldn't
work on my old Slackware, so I installed Ubuntu 14.04 and set up
everything there. There was a problem with my old Intel i915 graphic
card which supports OpenGL 2.0, but Eclipse/libGDX failed to recognize
that. I fixed that by setting an env. variable:
MESA_GL_VERSION_OVERRIDE=2.0 ./eclipse
I also got some weird problems like Eclipse crashing whenever
I used autocomplete. I fixed that by adding this to eclipse.ini:
-Dorg.eclipse.swt.browser.DefaultType=mozilla
The tooltips were also completely invisible (black text on black
background). Apparently Eclipse only honors the system background
color. I fixed that with gnome-color-chooser. At first I changed
the color to a bright one, but then tooltips became unreadable in
Firefox (while text on white background). Go figure. One would expect
that there are some Ubuntu developers who use both Eclipse and Firefox.
In the end I used a shade of gray to get some contrast against both white
and black text.
I need to do a lot of testing now. First beta should be out tomorrow.
I finished conversion to landscape mode and implemented the attack icons and
animations. For most attacks the cards just move and shake a little bit.
Ranged units have special animations, Zeus fires thunderbolts and Catapult
throws rocks at enemies. I added the damage numbers to attack icons and
it's now visible which type of attack deals the most damage.
I also created some nice icons for unit Energy (heart) and also
Attack (sword) and Defense (shield). Those show up when the default
unit values are modified (by artifact or an ally that stands next to
them). This makes the game fluid to play, as you don't have to
keep doing the calculations manually all the time.
What's left to do: Turn indicator graphics, Sound effects, Music (I'm going to get help
from a musician), AdMob integration. Initially the game was supposed
to be only a two-player game, but now I'm thinking about single
player mode as well. Writing good AI for this strategy might get
complicated, but it's worth a shot.
There's still enough time before the end of
October.
As I switched to landscape mode, I started to create mirror-flipped images
of unit cards using the -flop option in ImageMagic in one of the card-generating
steps. As the script rolled on for some time, it hit me that this would
increase the amount of graphics a lot. I got worried
about the size of the final .apk file. First time since I started the project I
decided to check.
I created a package containing only the lowest (800x480) and
highest (2560x1600) resolution images. It's 106MB!
I need to add 4 intermediate resolutions, so I'm looking at 300+ MB for the
final .apk. I searched the docs and found that the limit is 50MB and rest
has to be provided as a separate package. Or, you can distribute two different
.apk files. I didn't like any of those. I hate when you download an Android
game, and then you have to wait for it to download hundreds of megabytes more.
I needed a new approach.
I searched the Internet. Most advice is about packing your code using
compressor/obfuscator programs. But the gains are really negligible. Then one
thing caught my eye: using JPEG for textures. I'm using TextureAtlas to pack
everything automatically, but I could separate the images with, and those
without, transparent areas and pack them separately as PNG or JPG.
The problem is that 90% or the graphics need transparency. In this particular
case the main problem are the card images, which have rounded corners. And
then I got this great idea: separate the card image into frame
and contents. There are only four card types in the game (one for each faction
and gold one for the items), and all cards of the same type share the same frame.
The inside of the card is different for each one, but it does not require transparency.
Instead of packing 126 cards into PNG texture, I would pack 126 cards into JPG texture
plus 4 frames into PNG.
As I tried this, I got some weird clipping artifacts in the JPG texture, probably
because I turned off the 2-pixel padding. So, instead of pixel precise cropping,
I increased part of the graphics that gets copied to JPG so that there is some overlap.
When staging the images, make sure the jpg one is drawn first and PNG frame over it.
The part that overlays will cover the bad edge pixels.
BTW, by “staging” I mean placing the Images into libGDX Stage. To
make the code simpler, I created a nice CardImage class (descended from Group)
to handle drawing transparently. This Group contains the center of the card
from JPG texture and then positions the frame from PNG texture over that.
This saved A LOT, but I got so concerned about the size that I wanted to
do something about flipping as well. I researched if I could only flip a
part of the image. It's possible using the AtlasRegion.flip() function. But I
also had the problem that I didn't want to flip the whole image. The textual
part should remain the same and only the unit graphics should be mirrored.
To do this, after calling flip(true,false) I used setRegionY and setRegionHeight to
reduce the flipped region size. Using the flipped region I created another Image and added it to the CardImage group.
At runtime, I simply show or hide this image when I need the unit to face left or right.
Result
New .apk file with the same content is now only 12MB. A 88% save. Once I add
all the other resolutions, I estimate
the final .apk to be about 40MB if all goes as planned. Compare this with 300MB+
I expected at the beginning.
TL;DR Summary
Beside all the other advice you might find on the web (compressing the code, etc.), add these three:
use JPG wherever possible
if you use PNG only for semi-transparent border, cut the image into frame + content. Store the frame in PNG and content in JPG
Of course, if your frame is not reusable on multiple images and has complex colors this might have the opposite effect.
However, there's a solution to that as well: cut the frame into four pieces (left,right,up,down) and assemble it at runtime. No more empty space in the middle of the frame in PNG.
If you have images that are flipped or rotated, store only the original and flip/rotate at runtime.
UPDATE Oct 28: The final .apk with all the graphics, music
and sound effects is 42MB:
Just like the last time, I decided that I have to change the screen
orientation mid-project. This time from portrait into landscape.
Here are the reasons:
attack graphics looks odd upside down
I want to provide hints how damage is calculated, awkward since all the enemy cards are upside down.
Thumbnails used to pick units from your deck are too small on phones.
YouTube videos are landscape.
Desktop version of the game (if I ever release any) can use larger resolution.
I can test larger resolutions on my monitor instead of having to run it on the Android devices.
Players will sit next to each other, so they won't have to put the device down on a table to play.
You can play it with a friend on a bus or on a train.
Much more available screen space for unit stack and enough space for additional user interface.
See how everything is crammed currently and a lot of space is wasted sideways:
Cons:
I have to redraw some of the graphics
I now need horizontally flipped unit graphics which will almost double the memory consumption of the game (I cannot simply flip the whole card, as it contains pregenerated text as well)
The drafting screen cannot use the rotations to indicate current player
To conclude: unless the game is meant to be played like Flappy Bird (using the
same hand that holds the phone and having only one command: “tap anywhere”)
use the LANDSCAPE orientation.
I got a lot done in the past two days. The main battle mechanics work.
You can place and move units, and attack. There is still no attack animation.
As you can see on the screenshot, some units are turned upside-down. This
is because it's a two player game. The idea is that you put the phone/tablet
down and sit across each other and play.
Flying units like dragons can reach any field, while others have to
move one step at the time. Each turn, a player can move and attack, or attack
only. Once you attack, it's the other player's turn.
I'm currently drawing some attack icons. When you select your unit in the
field, those circles would rotate over the adjacent enemies and you can pick
which one to attack.
Depending on the attacker, a different circle would be used. Olympus
units would get a blue round one. Humans get the yellow square (at least I
tried to make it resemble a cross). Underworld units have the hexagram.
I drew all these in Inkscape.
I know players hate reading complex rules, so I tried to make a screen
that would explain how the cards work without getting too complicated.
Here are the basic rules:
At the start of each game, the players are presented with a deck of 20
cards and they take turns picking one by one until each has 10 in their hand.
After that the battle starts.
When the first player picks the card, all the other cards rotate 180 degrees
to face the player sitting across. It's a two-player local duel game.
For card animations in Gods of Sparta I'm using the largest card graphics
all around. The cards get scaled and rotated as they move. To rotate the image
around its center, you need to setOrigin to (width/2, height/2). However,
the origin is also used for scaling, so if you scale the image it will no
longer stay at the same (x,y) position you set with setPosition.
To get the scaled image in some particular position, you need to offset
the coordinates. See the image below for the exact math:
We want to position the scaled image to (60,70), but since it has setOrigin,
it shows up in a different spot. To place it properly, we need to move it
half of the difference between full and scaled image.
Now that we know how it works, it all makes sense. I hope this saves
other developers some time.
One of the artifacts in my game is the mythical Ring of Gyges. I decided to improve my
graphics skills and learn Inkscape better. Rings and other metal surfaces
are rather simple to draw, you just need to combine proper gradients.
I started with basic eclipse, duplicated the shape multiple times and
then created unions and intersections needed to assemble the ring. I used
a brown-gold-white-gold-brown gradient (it's easy to make a custom gradient
like this in Inkscape). To get the proper gradient (straightforward or
reverse) I put a real ring on my desk and watched the colors.
This is the basic ring. But let's make it look really good. First I rotated it
about 180 degrees and then added a gem to it:
As you can see the gem has multiple layers. On the bottom we have a black
circle with white border. Border is not the same everywhere, it has a
gray-white gradient stretching from left to right. Outside it, there's another
border, with black-to-transparent gradient. This is used to create a 3D
effect on the ring's metal surface. Over that, we have
a half-circle with another gradient. This time the gradient is radial,
extending from the bottom-left corner which has a white point. That point
looks like a point where the light enters the gem.
This is the base. Now we will add color. You can pick any color. I choose blue.
First, we create the dark blue overlay (one the the right in the image above).
Note that it also has a slight gradient going from left to right.
The light blue layer on the top
is used to complement the bottom-left white point in the black and white
base. As the light enters in
the bottom-left corner it goes through the gem and exits in it's top-right part.
There is no sharp point there, although you could put one if you want to
achieve a different effect.
Finally, here's the artifact's card in my Gods of Sparta game:
The game is based on 4 card types. There are 3 unit factions: Olymups (Zeus, Athena and some
creatures), Underworld (Hades, Cerberus, Minotaur...) and Humans (Achilles, Hercules, etc.)
and some items that the units can equip.
Olympus will have a bonus when fighting against Humans. In mythology the
gods of Olympus always had control over human fate.
Humans will have a bonus against the Underworld units. In myths, greek
heroes often defeated the monsters and some even went into the world of dead to do some quests.
Underworld unit will have a bonus against Olympus. This will make the game
fairly balanced. A single unit can be extremely deadly against one opponent
and completely useless against the other.
The units will have a single number for attack, defense and energy. But
there will be different special abilities that can increase or decrease that
during battle. There will also be items (artifacts) that modify attack
and defense. For example, here's a sword I drew in InkScape:
I'm still learning how to draw well, and I'll make all the artifacts images.
But for units, I need some good artists to make nice pictures. I searched
the fiverr.com and found some really good ones. Here are some pictures I
commissioned for Gods of Sparta game.
Most artists on Fiverr are only good with a particular style, so make
sure you look at their portfolio before ordering. For example, an artist
from South Africa with the username seatongrey has a great style that
would fit Underworld units in Gods of Sparta. But I wouldn't use him for
the Human faction. He made the Dragon above, and here's the Hades:
For Human units, I hired glass84
and johannan.
Here's Achilles from glass84:
The turnaround is usually a couple of days. You can see the average in
the artist's profile. Now, be prepared that some artists might be busy and
won't get back to you quickly (or ever). If that happens, just cancel the
gig and hire another one.
Be prepared that some designs might fail. For Olympus units I had to
combine different artists. flannery
is good with horses, so I got Pegasus and Unicorn:
Medusa was a tough nut. I hired four different artists and in the end
had to use one
who is really expensive. But he's a pro:
I had to edit each of the images a little bit. The dragon was completely
ok, but it had a big belly, so I had to crop the image to focus on the head
and fire. I had to change or add the background to Achilles, Unicorn and
Medusa. I also increased the contrast, added a drop shadow or glow where
needed, etc. The only picture I did not touch at all is Hades. So, don't
expect to get a perfect image served on a silver platter. Remember that
Fiverr is meant to be the cheapest service while still having a decent
quality.
I'm pretty satisfied the way all this turned out. Still, I think that
for my next project I will learn how to draw myself.
Battlefield is the screen players will see all the time. At first I thought
about building it from tiles, but I changed my mind. It's going to be fullscreen
graphics, in all it's HD glory. I found some free wood, sand and stone textures
and played with them in Gimp for almost two days now. Here's the end result:
Looks kind of lame on this thumbnail size, but I assure you it's much better
on an Android device. The shaded part is the background used to fill the space on wider
devices. It isn't really shaded in the actual file.
I created this screen at 2134x2733 pixels, so that it covers all possible
Android devices. Now, I need to scale it to sizes appropriate for 800, 1024, 1280,
1536 and 1920 screens. To avoid doing this manually, I created a simple
script that calls the imagemagick tool to do the scaling. Here's the script:
You need to create directories named 800, 1024, 1280, 1536 and 1920.
You should create all images in directory named 2560 and then just run the script
to create the others:
./generate.sh background.png
If you don't like the default blurry edges, you can use -adaptive-resize instead
of just -resize. The difference is similar to using Cubic vs Lanczos algorithm
when scaling in Gimp.
I guess I should explain the gravity/crop/repage options. To ensure that
the large images load on devices with less RAM or older graphics cards, I'm
making sure that the whole background image can fit into one texture. On
older devices, textures are limited to 1024x1024 pixels. Then there's a middle
ground of 2048x2048 pixels and the newest devices that support 4096x4096 pixel
textures. If the device screen is less than 1024x1024 it's a safe bet to
allow 1024x1024 pixel textures on it.
The resize script sometimes overflows the texture size but a pixel or two.
For example, 2733x2134 picture would be resized to 1025x800 or similar.
To work around that, we simply crop the image to 1024x800, or whatever is
the maximum allowed texture size. We crop using the center of the image,
thus the -gravity option. By default, imagemagick script would create multiple
files in this case, and we only want one. That's why +0+0 and +repage
are needed. Those options simply discard the second file.
To create the texture atlases, I use the following code in libGDX:
Note how the different texture size is used depending on the device
screen resolution. I placed this code in main() function of Main() class
of the desktop version of the game. I keep it commented out until I change
the graphics.
Important note: the default TexturePacker settings use the 2px padding to
avoid any artifacts when your graphics have semi-transparent pixels on the
edges (alpha between 0 and 1). I noticed those artifacts in my Drone Invaders game where I did not use
the texture packer. When a moon gets rotated, sometimes a few orange dots
would show up.
The code above sets the padding to zero
to allow 1024 and 2048 pixel backgrounds to fit into a single texture. I
recommend using this code for backgrounds and other rectangular graphics.
For the rest, there are two options:
create a separate set of directories and settings
add 2-pixel transparent border to all the graphics
The first one complicates the loading code a little bit. The second one
is easier, but you have to account for those 2 pixels whenever you want
to position something on the screen at the exact coordinates. Both approaches
work if you start to do it from the beginning, so just pick one and stick
with it all the time.
I noticed that on newer devices, the resolutions from my previous post
are not always fully available. After some investigation, it turned out that
a part of screen is used for Android interface buttons (back, home, menu)
which are hardware buttons on some devices and virtual buttons on other.
To get the full screen and still have the resolution math from my previous
post
functional, we need to enter the immersive mode. This a feature available
since KitKat (Android 4.4). I experimented with various devices and finally
arrived to this code:
public class MainActivity extends AndroidApplication {
private Handler mHandler = new Handler();
private Runnable decor_view_settings;
private int viewFlags = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
if (Build.VERSION.SDK_INT >= 19) // KitKat
{
requestWindowFeature(Window.FEATURE_NO_TITLE);
setupBars19();
}
AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration();
cfg.useGL20 = false;
initialize(new GosGame(), cfg);
}
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
if (Build.VERSION.SDK_INT < 19) // KitKat
return;
if (hasFocus)
mHandler.postDelayed(decor_view_settings, 5000);
else
mHandler.removeCallbacks(decor_view_settings);
}
@TargetApi(19)
public void setupBars19()
{
viewFlags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_FULLSCREEN;
decor_view_settings = new Runnable()
{
public void run()
{
getWindow().getDecorView().setSystemUiVisibility(viewFlags);
}
};
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(viewFlags);
decorView.setOnSystemUiVisibilityChangeListener
(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
if ((visibility & View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == 0) {
mHandler.postDelayed(decor_view_settings, 5000);
}
}
});
}
}
The code compiles on all versions, but only does stuff when the system
is KitKat. As I wrote, I tested various devices (Nexus 7 and 10, Galaxy S3 and S4,
etc.). It seems to work perfectly.
Supporting various Android devices for your game can be confusing. For
3D games it's easy, because conversion to 2D space is done constantly at run-time.
Players of 3D games don't mind if the result is blocky, blurred or sharp at edges. However,
for 2D games, every pixel matters. You could use built-in scaling, but the
image is not crisp and your game doesn't look as good as it deserves. All
the hard effort you put into making great graphics would go to waste.
To make your game look good, you want to use the device native resolution.
Because of this, you need to produce all graphics in different sizes.
But there are a myriad of screen sizes and resolutions on Android,
with different width/height ratio. Here are some hard and fast rules you
can use to support all the devices that currently (2014) make 99% of the
market.
First thing to remember is that all resolutions on most modern (made since 2009
forward) devices should have an aspect ratio between 4:3 and 16:9. The solution
would be to draw the graphics that would span both ratios (and thus everything
in between). The central part would be visible on all devices, while the
background would show different areas (top and bottom on wide devices and
left and right side on the more square ones).
But this isn't just pure math. We need to take note of market share of different
devices, so that we don't sacrifice the way the game looks on the more common ones
just to please some outliers.
One picture is worth a thousand words, so here are some diagrams to
make it all simple and easy to understand. The lowest
resolutions used today are 800x480 and 854x480. There are also some tablets
using 800x600. So, we'll set the base at 800:
This would mean that you should draw all the background graphics to cover
854x600 pixels. The central part where all the action takes place is 800x450.
There is no device with 450 pixel on the market, but we still use that
as the baseline, so that we can simply scale everything to devices with
1024, 1280 and 1920 base width. Those devices currently make most of the market
and have 16:9 aspect ratio. We want the game to look best on them.
The next step is based on 1024 pixels. The most common resolutions are
1024x600, 1024x768 and 1024x800. The problem is
1024x800 which is even more square than 4:3. Those are some cheap tablets
from asian manufacturers. Still if we decide to support them, we get
this:
Now, there are some devices using 960x540 and 960x640 pixels.
Those make less than 1% of the market, so we could use scaling in that case.
Or we could sacrifice a little bit of 1024 screen space and allow it to fit.
Luckily the higher resolution screens are more expensive, so we don't have
that many variants. It's actually pretty straightforward. The next step is
1280x720, 1280x768, 1280x800 and 1280x960. Again, there are some
outliers, more square than 4:3, most notably 1280x1024.
Next, we have 1536x1152. I haven't found any other variants with 1536
base. Still, we want everything to scale, so the play area has to be smaller:
1920x1080 is used in some very popular devices, but also 1920x1152
and 1920x1200 are common. 4:3 ratio would be 1920x1440, but I haven't
found any devices using that resolution:
However, there are some 2048x1536 devices out there. The next
resolution that follows is 2560x1600 which is much larger, so we don't
want to clamp them together. Creating a special set of assets for 2048
would only give us 6-7% larger images. Therefore, it would be best to
merge 2048 into 1920 base:
The current top devices (say Nexus 10) use 2560 as the base. I have only
seen 2560x1600 devices, which is 16:10 and found 2560x1536
mentioned on the web without a device name. If we wanted to accommodate
future 4:3 devices, we would have to produce 2560x1920 assets.
I used the wider 16:9 ratio as the base, because more
mainstream devices use it (Samsung, Google, Sony, etc.). Square ones approaching
4:3 (and beyond) are produced by cheaper brands and don't have the
market share. We still support all those devices, but 5-30% of screen real
estate is just showing background filler picture.
Here's the whole table:
Typical resolution
Play area
Background
Scale
800x480
800x450
854x600
100%
1024x600
960x540
1024x800
120%
1280x800
1280x720
1280x1024
160%
1536x1152
1536x864
1536x1152
192%
1920x1200
1920x1080
2048x1536
240%
2560x1600
2560x1440
2560x1600
320%
It turns out you'd need 6 different sets of assets for a game. To do all
this in libGDX, I use separate bundles for different resolutions, so devices
with low specs (low resolution, not much memory) do not try to load the
large images.
When designing backgrounds, you might want to create a common huge
background picture and scale it down. However, 2560x1920 would not suffice
in this case because when you scale that to 1280 pixels, the other dimension
would be only 960 pixels. Some tablets are 1280x1024, so you would have
to create a separate background for them. This might be desirable if you
want to have different assets adapted for each resolution, but if you have
pictures or other graphics that don't lose quality when scaled in some
drawing program (Gimp, Photoshop), you might want to simplify the process.
In that case, we would need to use the source image of 2560x2048 pixels
to be sure. But, the problem can also happen with the other dimension.
Calculating the relations in the table above, we end up with 2733x2134 pixels.
Conclusion: if you want to draw a huge picture and just scale it down
for each resolution without having to consider different aspect ratios later,
make sure your source picture is at least 2733x2134 pixels.
With that out of the way, I'm starting to create the title screen.
I commissioned some images on fiverr. For $5-$30 you can get some real
quality if you take some time to investigate who are good designers.
As you can see, the game will use the portrait mode. I created the
title using Diogenes font and Gimp.
Being a busy father of two never leaves enough time to do regular LudumDares.
It's almost impossible for me to dedicate 48 hours straight to anything.
That's why I love the October Challenge. Last year in October I participated
in my first LudumDare OC. I made an
Android Game called Drone
Invaders, released it on Google Play,
got about 3000 players and earned some trivial money (about $140). But I learned
a lot, especially all about Android development.
This year I plan to build another Android game. Some (say, 60%) of the graphics
will be outsourced to artists on Fiverr. Rest of the gfx, programming and
sound effect I plan to do myself. I'm still not sure about music. I depends
how much time is left when everything else is done.
Last time I used libGDX as bare-bones graphics library, only utilizing
Sprite and BitmapFontCache classes. This time I plan to use Scene2D with
Stages and Actors. Another big change is that
I will make sure that devices with higher screen resolutions are
properly supported and all the graphics are crisp clear.
As for the $1 goal, I will stay away from IAP this time. Google Wallet
accounts are still not available in my country, and doing it through some
friend abroad just complicates things and slows me down. I decided to try
AdMod instead. It's linked with my AdSense account, so there should be no
problems with the payments.
As for the game itself, I plan to revamp my Gods of Sparta strategy game.
The main focus will now be local, hot-seat game for two players on Android devices.
It will be completely free to play, supported by ads. I will reuse some old graphics,
but more need to be drawn, especially higher resolution stuff for
Nexus10 (2560x1600 pixel screen) I got recently. Also, UI needs to be
drastically improved and game rules have to be simplified. To cut the long
story short, I need to improve the player experience and make it feel more
like computer strategy game and less like paper card game.
Here's some teaser graphics that will be included in the game...
I have this sci-fi story in my head for about three years now and I decided
it is time to write it down. I love sci-fi genre and like to see
good movies. But there haven't been many epic sci-fi movies lately. You know,
the Star Wars type of thing. But I'm not that into fantasy, my story is more
to the ground, and is pure science fiction.
The story is really two-part. First part is a end-of-the-world thriller
involving hackers, rogue military and top scientists. It all starts with a
mysterious message coming from the outer space.
The second part is... well... “Spoilers” as River Song would
say. No, I'm not going to reveal it. All I can promise is that there will
be aliens.
Anyway, I'm not a native English speaker and the number of sci-fi readers
in my country is miniscule. So I undertook this hard task of improving my
English to sci-fi writer level, so that I could reach a wider audience. Apparently
some popular writers have done it before. At the same time, I started to
learn how it is to write a novel. I still haven't decided whether making the draft or
editing it afterwards is harder, but I do enjoy the end result.
I'm currently done with editing the Chapter I. Please take a look and
tell me if the story is interesting and if you want to read it to the end.
Or it's pure crap and I should just forget about that and go back to making
games.
Some time ago I decided to spend $100 on advertizing my Drone Invaders game on Facebook.
Facebook ads have some really nice features, like picking only people
from certain countries who like certain things. So I selected people
from English speaking countries, who have an Android phone and like
Space Invaders or Galaga.
The campaign ran for 18 days and got 839 clicks, which is around
46 clicks per day. On the other hand, I was monitoring players that
played the game. Unlike Google Play which monitors installs, I'm monitoring
how many people play the game and get to the Game Over screen. During
the campaign I had about 40-45 new players coming in each day. Since the
campaign has ended, I have about 10 new players coming in each day.
So, the campaign effect was about 30 new players per day or 540 total.
That's 540 players for $100, or $0.185 per player. It's nice to know this
figure before doing some ads, but spending $100 to learn this is also
not a big deal. During this campaign the game earned about $25, so it's
a net loss, but the game is not about making much money anyway. It's free
to play with completely optional in-game purchases.
To conclude: I find Facebook ads useful and would use it in the future if
I create some game that I feel can bring in some real money. Especially
if I make a non-free game, this seems like a good way to attract more
players. It's great that you can target people who like similar games
and have a device it runs on.
Three weeks ago I released Drone Invaders. After the initial hype, the
number of daily downloads has slowely but surely went down, and now sits
stable at around 40 per day. But I want to talk about this initial hype in
hope other beginner game developers might find it useful.
As I wrote before,
I posted about my game to multiple sites. I posted daily updates to LudumDare,
and important milestones to Java-gaming. I posted twice to HackerNews, and Reddit.
I posted once or twice to other sites listed in the linked blog post above.
In this case numbers speak more than words, so here are the top sources of
traffic to my blog posts about Drone Invaders:
Conclusion: do not wait to market your game. The main site I missed is
TIGSource. It's a high-traffic site with a lot of posts every day. If you just post when
your game is completed, not many people would see your post. I wish I posted
my progress daily, or at least as often as on Java-gaming. It would build more
interest as the game was built, and surely would result in more installs
after the release. If you know some more sites like those listed, where developers
can post about the game development progress, please send me a tweet about it.
In the last two days, I got a couple of new orders for in-game coins, coming
from Denmark, Australia and USA. Thank you.
That's $21.81 of income, of which about $5 was me testing if the payments
work, and there's Google's cut as well. In the end, I earned about $11.
Since October Challenge
was to earn $1, I succeeded. However, I still have a net-loss of about $14,
since I invested $25 in Google Play developer license.
Now that I see there is some interest in in-app currency, I'll try to
do some paying forms of marketing, to see if that brings in some new players.
When you publish an Android game, a lot of marketing companies e-mail you
with their offers. I'm going to try some of those. I'll write about the
results in a week or so, after I have some data.
I released my game Drone
Invaders about a week ago. It's a free to play shooter game for
Android with optional in-app purchases. I did successful promotion on LudumDare,
Java-gaming and HN websites, which got me to about 1000 installs so far. I'll soon post more stats about
user retention, games played, etc.
I also posted in Shoot 'em up forums,
TIG forums,
IndieGameMag and added info to IndieDB. All those did not bring in much
interest. Judging from player feedback, the main source of interest was HN
post, where some people were more excited that I created the game in just 23
days, than in the game itself.
All this got me $0.69 profit so far (if you ignore the $25 fee to open a
developer account on Google Play) as one person bought one in-game pack of coins.
LudumDare challenge is to earn $1, so I need only one more purchase. But, it
seems that will be a huge challenge to get it.
I also tried promoting the game on Twitter, but from my 200 followers I
had prior to launching, only 3 tried the game. I guess you really have to engage
daily with a lot of people to even get them to read your tweets.
After the launch I got about
180 new followers. BTW, using bit.ly to track how many clicks came from which
source (Twitter, forums, etc.) is a great idea, I'm sorry I did not apply it
everywhere.
I posted several posts on Reddit and I noticed someone from HN crowd also
posted. While mine posts to /r/gaming, /r/gamedev were barely voted up, that
other one in /r/Android got some +187 votes and got some attention.
I wrote an e-mail to eleven journalists who do cover mobile games and I
thought would be interested about
the game. No reviews came out of that. In fact, nobody replied except for one
guy who was decent enough to tell me that he thinks that the game is not worth
covering on his main website, but I could try the forums. I guess it's hard
to get through with retro graphics.
To be honest, I'm a little bit tired of banging my head against the wall
with the marketing. The user reviews on Google Play are
great, but the game is not very attractive when you look at screenshots or
video, it only shines when you play it yourself. I have no idea how to get
some journalist that covers Android to try the game?
Please try it out, let me know if you find any bugs. The game is free, but if
you like it, please tell your friends to try it and rate it in the Google Play.
Hopefully, someone would like it enough to buy some in-game coins
and I'll complete the $1 challenge :)
Even if you're not going to buy anything, please tweet about the game to your
followers on Twitter. Thanks.
Although I have a wast library of wav sfx files I accumulated over the years,
I've seen other game devs use Bfxr to
create their own effects, so I decided to give it a try.
This is nice, because you own the effect 100% and you don't need to prove where
did you get the audio file. Some of the sites I used to download my sfx in the
past are no longer online, and tracking people who made those is impossible. For
example, my favorite mod music is Aspirating Milk which I found on modarchive.
I tried to contact the author via e-mail in the tracker file, but got no reply.
It was probably his address at university or something.
Bfxr requires Windows or Mac, while I prefer doing my development on Linux. I
thought about running it on Wine, but didn't even bother to try because I found
this:
It's a super easy to use and simple Flash app you can run in your browser. I
highly recommend it.
These sfx programs produce various simple sound effects. Some complex
sound effect can be created by mixing a couple
of simple effects in a program like Audacity. I used it to create sfx for Atomic
Bomb powerup:
BTW, I basically completed the game, I'm now testing on various Android devices.
I'll probably do the release on Google Play store tomorrow.
I'm making this game as an experiment, so I don't expect to earn much
money. This game is going to be free to play, with option to buy coins in the
game if you want. I like the way it's done in games like Pudding Monsters where
players can play everything without paying at all. Drone Invaders will
be completely playable without paying a dime, so it is not a kind of "pay to
win" types. However, I still want to enable players
who can't wait to have fully powered up weapons right away.
I opened the Google Play account without problems. It was $25, which is fine.
I just read some blog post where a
solution to saturation of Google Play was suggested - it proposed to have $5000
registration fee, so only developers who are serious would apply. I'm not sure
if I would apply for $5000, it seems so me that only big studios who are already
making money on other platforms would participate.
However, opening a Google Merchant Account is mission impossible from my country.
So, what are the options. Well, you can still add payments with services like
Fortumo or Centili, but this has two problems: 1. it goes against Google Play
terms of use, so you either risk getting your account suspended or you only
publish to other Android app stores (there are some 30+ as far as I can tell,
and some stats say they make up about 30% of the market, although this seems
too high to me). 2. to enable payment via SMS, your game needs to ask for two
system permissions which users probably won't like: send and receive SMS. Although
this is the only way to enable monetization in some countries, if you aim for
US market, it's a bad idea.
Third option is to start a company in USA and register account that way. This
is of course the right thing to do if you expect to earn some substantial amount of money from your
game, but having an US company brings in some costs. There are specialized
agencies that can register you a company in Delaware. Delaware is a USA state and
a tax-haven. Of course, you can always transfer the earned money from there to
yourself, and then pay the taxes locally on that transfer. I'm not ready
for this step yet, as this is my first game and I have
no clue if I will make any money of it.
Luckily, I have a friend who lives in US, so we opened an account under his name,
and the game will be released under that account. At least merchant account is
available for US individuals. I still don't understand why Google won't allow
merchant accounts from my country, when I'm receiving money from their AdSense
directly, without any problems. I guess not all departments of Google have the
same policy.
Weekly challenge will be to collect some amount of stars during a week and get
some nice reward, like 8 atomic bombs, 5 shields or similar. I made a nice gold
star in Gimp. I tried different particle effects
on it and also some diffused star-light, but it did not look really good. So
I went back to the particle effect used for powerups and tweaked that until I got
something distinct for the star. Stars show up on their own pacing, so you can
have both a star and a powerup on the screen at the same time.
I also worked on loading and saving player data. It was much easier than I
expected. I expected to have to learn some Android data storage API, but for
simple key-value storage, libGDX provides the Preferences class. Just init with:
and then use get("key", defaultValute) and set(key, value) to read and write the
values.
The only thing I had problems with are the dates. To keep track of daily and
weekly challenges, the game stores the date of last play. When player launches
the game, it compares that and resets some counters. Theoretically, I could
prevent players from changing the system's calendar to past date, but I don't
want to. What I am doing, is setting new set of daily and weekly challenges
when day rolls over and resetting the counters for number of stars and letters
picked up.
To make that work, I had to get the day difference between the previous play and
current date. It matters whether it's the same day, exactly one day apart or more
than one day. Googling got me to various websites and StackOverflow questions.
Answers are funny. Many programmers simply calculate difference in seconds
and then divide by 60 * 60 * 24 to get the days, completely ignorant about issues
with daylight savings and leap seconds. One could argue that it does not matter
that much for a game, but still getting many bug reports twice a
year doesn't sound like fun to me. Some other guys simply count the days by
adding one-by-one from start until they reach the end. While those loops might
look correct, they still miss sometimes as they do not take the time out of the
calculation. If one object stored 01.Jan at 5am, and you calculate it vs 02.Jan at 23pm,
adding one day to first object is still less than the second, so they add two
and get 2 day difference.
One of the tricks I use in this situation is to always set the time of the earlier Date
to be something like 10am, and set the time for the later Date object to 5pm.
Since daylight changes always happen at night, this is safe. And we also have
7 hours in between, just in case someone in future decides to do daylight
saving changes in the middle of the day.
Daily challenge is to collect 5 letter which fly like powerups do. Once you
collect them all, you get some coins to buy powerups. This is a way to get easy
free coins just by playing the game. I was inspired by Subway Surfers when
creating this.
Missions are various tasks for player to complete to earn coins. Coins
are used to buy upgrades and expendable items like shields, bombs, etc.
Missions come in sets of three, and you need to complete all three tasks
to earn the reward.
For the missions I figured that it would be easiest to use the builtin multiline
text wrapping. However, the line height is too big, and I couldn't find a way to
reduce it. At least, not from code. Then I edited the .fnt file generated by
BMFont and just changed
lineHeight=33
to
lineHeight=23
I added 5 pixels of drop shadow around all letters after the bitmap was generated
initially, so I'm now reducing height by ten (5 pixels above, and 5 below the glyph).
While searching the docs for this, I found something else I missed before:
Depending on the font you choose for the game, numbers might not look very nice
as glyph for digit "one" can we very slim, and numbers like 11 look odd. To solve this, you
can fix some of the glyphs in the font to use fixed width:
font.setFixedWidthGlyphs("0123456789");
This looks really good, but I already did some design decisions that used the
slim-glyphs "feature", so I'm not going to use this.
Today I got fed up with the "moon hit" bug. Sometimes aliens
would not get hit even if they are visible on the screen. I set up a bunch
of tests with screen filled with aliens and semi-transparent moon to see
what's going on. My coordinates for hit-test area were a bit off, but even
when I fixed that it was not good.
Box simply cannot cover the circled area well. You either miss aliens when you
should hit them, or you shoot some that are completely hidden.
So I decided to switch to circle based checks. Since the moon in much larger than
aliens, it would be enough to check whether all the 4 points of alien's bounding
box are inside the moon's circle or not. To test this visually, I used libGDX
builtin ShapeRenderer, like this:
This code comes after SpriteBatch is complete. The white circle is drawn over the
scene. I also draw all the bounding boxes of aliens using ShapeType.Box.
An efficient way to test whether point is inside the circle is not to use square
root (slow) and just compare squared distances instead. libGDX builting function
Circle.contains(x, y) does that properly, so I'm using that for checks. This works
really nice. I extended the radius by a few pixels, because all the sprites have
some padding and I'm really satisfied with the result:
Pixel-perfect bullet trajectory
In this game, bullets are fired some 50px below the bottom of the screen. I'm
using atan2 function to rotate the bullet and hit the mark, but there were a
couple of errors in my code, especially when you miss the target.
To understand the rest of this post, please note that the game uses
HitScan for
all the shots in the game.
When player misses the target, the code extrapolates the trajectory to the end
of the screen. Previous code that did this set the end point too far. Since the
bullet is using tween engine to fly, this results in large jumps and bullet is
only seen in 2-3 positions on the screen before it flies out. I fixed this code
to set the end point at the edge of the screen, so now you can actually see the
bullet flying.
This revealed another problem: the bullet sprite was sometimes 10-20 pixels off
from the point where player touched the screen. There are three causes of this
problem. First, I was using X and Y coordinates of the bullet sprite, which is
the lower-bottom corner. I fixed this to use the bullet sprite center by adding
half of width and height. But it was still off on some shots.
Second problem was that I forgot to set the origin, so bullet was rotated
around the bottom-left corner. I fixed that as well, but still some shots going
to the left side of the screen were bad.
Then I realized that, when bullet rotates, width and height of the sprite
changes, so the bullet center needs to be calculated after the rotation. With
that fix, the bullet flies right through the point where player touched. The
code looks like this:
I like that Android allows (even recommends) that icons are not rounded rectangle.
It can give your game some style. At first I thought about creating a special icon
for the game, but I really, really like this shield with pixelated alien drone
on it. And I have made this in Inkscape, so I can create any size I want (unlike
some other graphics I created in Gimp). I'm presenting you the official
Drone Invaders icon:
Powerups galore
Here's a video showing all the collectible powerups:
There's Atomic Bomb. I'm not sure about the name, maybe Nuke or Plutonium Bomb
or Smart Bomb or something completely different. It damages everything on the screen.
Bosses survive one or two, but 3 bombs destroy them too. Internally, each boss
has 20 energy and bomb has 8 damage. Regular shot is 1 damage, until you upgrade
lasers.
Second, there's 3-Way Shooting. You still lose one round of bullets for each 3-shot.
This is a very powerful powerup as you can clean up waves and bosses just like that.
Third, there's Auto-Reload. As the name says, your lasers reload automatically, so
you're free to shoot, shoot, shoot and shoot.
Fourth, there's Slowdown. It only slows down aliens, everything else moves normally.
It's quite useless on first 20 waves, but gets really, really useful later.
Fifth, there's Double-Score. While this powerup lasts, all the points you earn
are doubled. I'm still not sure if something will be awarded for some point
threshold, but it's still cool to beat the hiscore.
I thought about posting a YouTube video of the gameplay. I used recordmydesktop
program to record videos in the past, but the problem is that libGDX and rmd do not
sync so I get a lot of artifacts on the screen, sprites are cut in half, etc.
I searched and found some useful articles about it. Basically, one would record
each frame to a PNG file and then create a video out of it. Of course, this
requires a lot of disk space, but that's not an issue. I found this page really
helpful:
However, their code has some weak points. For some reason, when I overlay
background with sprites with semi-transparent pixels, the resulting PNG file
has semi-transparent pixels in that area. Producing a video from it yields some
really ugly artifacts. I tried different settings, even changed my render code,
but the problem remained. Now, a simple post-processing step using ImageMagick (adding
black background) fixes the problem, so I figured if I'm going to post-process
it anyway, I might do the vertical flip in ImageMagick as well. So I
turned off the y-flip in the code. This makes it more efficient: there is
no need to allocate w*h*4 bytes of memory on each frame. On 800x480 screen, that's
about 1.5MB allocate on each frame!
Also, the code that deals with framerate (skipping frames) is really sub-optimal.
It skips the file numbers, which is not a big deal, but it also creates a new
ScreenShot object each frame, which is completely not needed. For example, if
you are recording at 30fps and game runs at 60fps, you're creating new object
50% of the time.
Finally, the code seems to forget to dispose of pixmap, so if you run it for a
really long time, if would eat all your RAM.
So, I yanked out the whole FPS code out of ScreenShot class, and leave that to
the class that sets up countinous screenshots instead. I also noted that some
of the variables are initialized but never used. My ScreenShot class is much
simpler and straightforward:
public class ScreenShot implements Runnable
{
private static int fileCounter = 0;
private Pixmap pixmap;
@Override
public void run()
{
saveScreenshot();
}
public void prepare()
{
getScreenshot(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);
}
public void saveScreenshot()
{
FileHandle file = new FileHandle("/tmp/shot_"+ String.format("%06d", fileCounter++) + ".png");
PixmapIO.writePNG(file, pixmap);
pixmap.dispose();
}
public void getScreenshot(int x, int y, int w, int h, boolean flipY)
{
Gdx.gl.glPixelStorei(GL10.GL_PACK_ALIGNMENT, 1);
pixmap = new Pixmap(w, h, Pixmap.Format.RGBA8888);
Gdx.gl.glReadPixels(x, y, w, h, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, pixmap.getPixels());
}
}
Yep, that's all. In render loop I use this at and of each render:
ScreenShot worker = new ScreenShot();
worker.prepare(); // grab screenshot
executor.execute(worker); // delayed save in other thread
For completeness, executor added to my Screen subclass:
Now, on my Core2Duo it has a hard time keeping up frame rate. On one hand, it's
good, because gameplay slows down and I'm able to play a nice, partly scripted
video. On the other hand, it would be nicer to just record and later cut out
what you need. So I added a hotkey for screenshots. It only records shots
while S is pressed on the keyboard. When you record a few interesting
seconds, just release
S and let the PNG writer catch up. When it does, and CPU load goes back to normal, you can
record again.
Videos created like this are super easy to edit. Just remove the unneeded PNG
files and compress video without them. It's also easy to sync with music, because
you can add/remove frames at will.
Turning screenshots into YouTube video
Since Android screen I'm using by default is
480x800 pixels, the closest fit is YouTube's 1280x720 format. We need to scale
the image to 432x720 to maintain aspect ratio. This leaves us with a lot of unused
area. You can put your logo there, or even show 2 videos running
side-by-side ;) I decided to put the video inside another rectangle, that
resembles a handheld device, so it's even smaller, it's 372x620.
Anyway, I created a 1280x720 static image with my logo and now I'm blending
the gameplay into it, and also flipping it vertically. On Linux, I'm using a
command like this:
for i in shot*png; do echo $i; convert $i -flip -filter Lanczos -resize 372x620 temp1.png; composite temp1.png back.png -geometry +126+56 $i; done
Once all the images are ready, we can run mencoder to produce the video. YouTube
recommends using H.264 format and bitrate up to 5000 for 720p videos. They also
recommend two B-frames. Here's my command:
This yields a solid quality YT video of your gameplay. You can see the result
at the start of this post. As for the audio, I just slapped over the game's soundtrack.
I'm not capturing the audio of the actual game.
UPDATE Jun 2016: Guys from Lifemakers Studio tried my method and
made some improvements to solve the transparency problem and make it run faster.
Please read their analysis
Remember that problem from Day 11 about screen coordinates and mouse clicks
missing the aliens? Well, it was all my fault. Good thing I discovered it now
and not when the game got downloaded by a bunch of Android users not using
800x480 screens. I was naive and translated the touch coordinates to world
coordinates like this:
float x = Gdx.input.getX() - 240f;
float y = 400 - Gdx.input.getY();
That's not the way to do it. The proper and easiest way is to ask Gdx to
translate it for you:
Most examples on the net about handling Back button talk about overriding
keyDown method. Unfortunately, this requires that you use the Stage, which I do
not. I understand now that I'm replicating a lot of Actor and Stage stuff in my
own code, but nevermind. I'll use the Stage for the next project.
Luckily, I found the solution. Just add this to your Game subclass in create()
function:
Gdx.input.setCatchBackKey(true);
And then in render(), check if it's pressed:
if (Gdx.input.isKeyPressed(Keys.BACK))
{
Gdx.app.exit();
}
Now, watch out, you probably want a boolean flag variable to detect when it is
released, as render() calls go many times per second.
Now you can enter the game, the shop menu and go back to main menu. Of course,
menus just display items, but none of it works yet.
Use 9-patch for dynamic sized buttons and boxes
I also learned how to use NinePatch to create nice buttons. One moment I realized
I'd have to draw like 10 sizes of various option buttons, that basically look
the same, only with different content inside. I even looked at Gdx buttons, but
decided I still use the DIY approach. Buttons in my game have special needs, some
of them combine 2 images and 4 text labels with 2 different fonts, all inside a
single button.
Anyway, I have drawn a small 46x46 9-patch that covers all button sizes and I'm
drawing other stuff over that with some custom code. I used the constructor with
TextureRegion to extract the 9-patch graphics from my large texture that contains
everything else. One less texture switch.
Creating this allowed me to populate main menu screen with various options, and
I also added a scrolling marquee giving some tips about the gameplay. I really
like that concept, but games rarely use it. Some games display just one tip at
start. Maybe they do not want to distract players with scroll in main menu.
And here's the shop menu to buy some powerups:
Powerups
Here are some new ideas for powerups. One can be temporary slowdown of aliens.
Another one would be 5x score for a limited time. I'm thinking to eliminate the
"double score" improvement which was to be available in the shop. Some players
might be really competitive about the hiscore, so this is probably a bad idea.
On the other hand, a powerup to increase number of shots before reloading would
probably be welcome by everyone, so I'm adding that.
I was hoping to keep the shop at 7 items tops, so that it all fits a single
screen. But now I'm not sure with all the possible upgrades... we'll see.
All 7 basic alien types are complete, I just finished Catcher, while Humaniod and
Scorpio was done yesterday evening. I also created some basic graphics for the
shop, where you can buy upgrades.
I got some new ideas for boss aliens. One of them is a snake-like alien, and
you body is composed of multiple parts, which you need to destroy separately.
The second one is alien boss creating alien bosses. Basically, if you don't
destroy it on time, it will create another boss. This second boss spits regular
aliens and moves downwards (to free the space for the next one).
Third boss is a special creature, able to multiply by division. When you shoot
it, you get two identical aliens, each having half energy of the parent one.
This division happens until you split them into 1-energy ones and shoot those.
Fourth boss is... well, let's leave some surprizes for when you play the game.
I'm sure fourth boss will be very annoying to some players, until they figure
out how it's behaving.
Allocate time for music
I spent rest of the day browsing for some free music. There are many sites, but
listening to hundreds of tracks is really not fun. Most of the free stuff out
there is junk. I found links to various sites recommended on /r/gamedev on Reddit
and also
in gamedev.stackexhange.com site and some indie sites. Except for Jamendo which
is expensive, most of the free stuff is really bad.
I usually compose my own music, using MilkyTracker or some other tracker
program. I got this habit
from Amiga 500 and I feel at home when making .it or .s3m modules. But this
time I decided I do not have time for that. It usually takes me about 3-4 weeks
to create a decent track. I though about re-using some of my old tracks, but I
already have used all of them in previous games - and none would really fit to
be honest. I did find some good tunes by Kevin MacLeod, so I'm going to use
those.
It looks like it really comes down to your own estimation. Whether you
spend hours listening to different free tunes or you focus and make your own.
I added a new boss and now I have two of them. Here are the alien names so
far: Worker, Eater, Hairy, Glider. Bosses are called Worker Boss (it looks like
big Worker and spits small Workers) and Borg (it's cube-shaped and destructs
into big cubes).
I also added the shield. I have drawn this nice shield icon before. I drew it
using Inkscape and got inspiration from a some YT tutorial. I tried to follow
the tutorial (it was for Adobe Illustrator, not Inkscape), but failed. So I
started to observe some shields that I like and noted how it's just a bunch or
curves and gradients. I slapped Hairy on it, it looks really nice. This might
even become the application icon for Android.
Anyway, the shield can be invoked at any time. It lasts 20 seconds. There will
be some powerups to upgrade the shield to last longer. If aliens hit the shield
it loses energy much faster, so you should still try to shoot them down even if
shields are up.
Shield graphics looks like force-field. It required some manual messing with
Gimp to draw it nice as I wanted a nice circle-segment instead of straight line
and casting a gradient shadow that way doesn't seem to be supported. Maybe there's
some trick I don't know. So I combined multiple linear gradients at a different
angle. It turned out really nice.
I tried adding some glow to the shield icon, but then it stands out too much.
I'll leave the glowing for situation when powerup flies across the screen and
you need to pick it up.
With these new graphics, it starting to look like a complete game. I'm still
thinking where to place the score multiplier and whether the current wave should
be shown.
I'm also thinking that player should be able to buy some powerups before playing,
but this would require some coins or something like that, and with current, fast
gameplay it simply would not fit. Maybe a some aliens could leave some crystals
behind them or something like that or random powerups would show up. Or you would
simply get as much coins as the number of waves you survived.
I finally decided on the name. There were many game names out there, but I only
found 6-7 available. This one seems to fit the game theme the best. New title
screen is ready, using the same Ruslan font.
Today I learned difference between Comparable and Comparator in Java.
I changed the bullet code, so that you can fire multiple bullets (laser fragments)
at the same time. Also, you don't need to touch the alien to shoot it, but
rather just fire in its direction and bullet hits it. Instead of going with
full collision detection, I simply extrapolate bullet trajectory at the moment
of firing and see which alien it hits first. This worked fine for all levels
until the Boss level. Since Boss spits other aliens, he gets to be the first in
array and bullet would fly through all the aliens and hit the boss. I left this
behavior if you touch the boss directly. But, when you just shoot in some direction
I'm sorting the aliens by y-coordinate to shoot the nearest one.
This new feature changes gameplay a bit. It's now easier to play, and more
enjoyable as aliens you shoot are no longer obscured by your finger. The game
has turned from "precise touches" to "shooting fest" and
only that 10-bullet clip prevents you from destroying everything in two seconds.
I guess I'll now have to make alien movement even more challenging, so that the
game doesn't get too easy.
Day 12: Part 2
I started to like the game too much, and decided to work on it more before
going to sleep. On levels 16, 26,... I added a big moon, and aliens are hiding behind it. The
moon slowly moves across the screen, just in time to finish before the Boss
level. This makes the gameplay really challenging. It was also challenging to
do detection whether aliens are hidden behind the moon or not. Since moon is
round, rectangles are not very easy to use. I looked into pixel-precise detection,
but I'm afraid it would slow the game to look individual pixels each time a shot
is fired - especially since moon is rotating all the time. So I just reduced the
original sprite rectangle by some 12% and I'm doing the rectangular checks instead.
It is not pixel-precise, but it works really well. The way it works, bullets
fly over the moon and aliens fly under the moon, so you can shoot those who
haven't reached the cover yet.
I'm really satisfied with the gameplay now. It's fun, challenging and engaging.
Now I need more bosses, a couple of more alien types and powerups. Without
powerups it's a real challenge to reach wave 60, so I'll try to create enough
content to have new stuff show up at least until level 100 without repeating
bosses. I guess it will be easier with powerups. We'll see once I add those.
This is the first time I'm feeling it's going to be a great game, rising above
the average space shooter.
The first boss is on level 10. It's big and cube-shaped. I'm calling it
Borg, although it does not assimilate you ;) It emits regular aliens. You have to hit the
boss multiple times to destroy it. I set energy to 20 for the first one, it's
challenging but not really hard. I added a big shake when boss is destroyed.
Boss is made out of 10x10 pixel blocks, so explosion looks nice.
I also added a new snake like formation, aliens move down, then left/right and
then down again, repeating it until they reach bottom. I made them a little bit
faster in this formation, so it's challenging.
I have also drawn some nice aliens, and named all of them, as each type is
represented by a Java class and I needed nice class names. Here they are: Hairy,
Glider, Worker and Eater.
Here's a .jar file I made today, you can run in on Windows or Linux or Mac, as
long as you have Java installed. On Linux I use: java -jar stardust.jar
Please note that you need to allow game's window to be at least 800px high,
for it to work properly. I'm running it on my 1680x1050 desktop and it works
fine, but on 1280x800 laptop the taskbar uses some space, so window size is
reduced vertically and I need to click underneath the alien to shoot it. I guess
I'll need to fix this if I even decide to release the PC version.
I'm having doubts whether the current concept is fun enough to play longer. Maybe
it would be better if aliens would move left and right as well. I implemented
that now for two new attack formations and it looks and feels much better. I
also added the camera shake code when you hit an alien and it explodes. The
game feels more alive now. The reload button works, so now you can empty your
10-bullet clip and have to reload. Makes the gameplay more interesting as you
have to break from shooting spree to reload the gun. I replaced the ugly magenta
color of some aliens with cold, whiteish blue. It looks much better.
I'm thinking maybe it would be better if player could only touch the lower part
of the screen - area within his shield. This way the upper part would always be
visible - not hidden underneath player's finger as it happens often now. Maybe if
shield is half screen size at start and as enemies hit it, it reduces until the
gun is naked and vulnerable. Although, this would mean having to draw a gun as
well. Probably not a bad idea though, I might try this.
Star Dust name is taken, I tried some 20+ others, but it seems that it's really
hard to find a free name, as there are many space-theme games.
Looks like I'll have a hard time classifying this game when I talk to people. I
could say it's a "retro arcade". Although, it differs from retro arcades where
you move your ship around and it fires bullets straight. Here your position
is static, and gun fires wherever you tell it to. Come to think of it, I've
never seen a game that plays exacly like this, so don't try to classify it in
some existing genre. The closest I got was "it's like Space Invaders, but
without a ship". This got people completely confused.
Today I reworked the alien spawning code. I also redraw all the aliens in white
color, so that I can change color at runtime using the same sprite. In case you
didn't notice, aliens are single-color. I'm thinking to leave it this way,
except for bosses. Maybe just add some glow animation or something like that.
Who knows, maybe some artist will see a potential this game has and create some
cool graphics. Feel free to contact me about this.
I'm thinking there could be an event in the game when enemies would "upgrade"
to better graphics. Accompanied with a message "Aliens have evolved", which
would bring in some metallic look and feel, for example.
Explosion code is also unified, so now I just supply a 2D array of "pixels"
and enemies get blown to pieces. This has been working for some time, but now
I got that code clean and universally usable for any kind of alien. Except maybe
bosses, which might fall apart in stages. I still need to ponder on that one.
Anyway, if you're interested in playing, here's an .apk file of what I've done
so far. Features are obviously missing, but you can see what I'm up to.
I'm looking for a new title for the game. Got one, but need to research more to
see if it's available: STAR DUST. I tried some fonts and I think I'll use the
one called Ruslan Display.
I polished the algorithm for alien explosions today. I'm also thinking how will
the enemy waves look like. There would be 10 waves of enemies, and then a boss
and after that the game would speed up a little bit and some new enemies would
be introduced. At each tenth level (10,20,30...) there would be a new, unique
boss. This algorithm would repeat until player dies. The speed would be capped
at 2x starting speed as it seems to me that takes a lot of effort to play if you
want to destroy all aliens.
And then, there will be powerups. Here are current ideas:
Time limited, collectible during the game:
shield (sits at bottom of the screen, protects against one alien going through)
score multiplier boost (x2)
rapid fire (just hold your finger down and move around)
mega bomb (destroy all aliens on screen)
hyperdrive (skip 10 waves of enemies, but gain points as if you destroyed them)
gallactic ninja (cut enemies with a jedi sword - fruit ninja style)
You can shoot aliens now. Since the graphics is retro style, I decided to
explode the alien's large pixels (I draw aliens using large zoom tool in Gimp,
and then I enlarge the image 5x without any interpolation). I wrote a custom
particle manager code and use built in tweening in libGDX to send each piece in
a random direction away from center.
You may notice that there is no you on the screen. This is on purpose. In case
you did not realize yet, this is a first person shooter. ROFL. Well, at least
technically, it is. You don't get to see yourself, you only shoot at enemies. In
some test version I also tried to scale the aliens to give a feeling of depth
and them coming from far away, but it's hard to shoot small sprites on Android
using your finger, so I gave up on the idea.
To make the game more interesting, the laser gun you're using would need
reloading. You got 10 shots and then you need to hit the Reload button at lower
left corner of the screen. I'm still not sure about this feature - needs testing.
As I was testing this, one thing bothered me a lot: While I shoot the
aliens, my index finger is all over the screen and it's hard to see what's
going on. Then I looked at different Android games on my phone and realized
that it would be much better if screen was oriented in portrait mode. When
in portrait mode, your index finger does not come from below, but from right side (if you're
right-handed, of course). Most of the screen is still visible in this case.
I'm also changing the flying direction. Instead of going from left to right,
aliens are coming from the top of the screen.
Because of this, I'm also changing the main game concept. Instead of playing a
fixed amount of time, you would play until you allow one of the aliens to get
past you. My initial idea was that you would play for one minute and score as
many points possible during that time (something like fruit ninja arcade mode).
But now I'm thinking you could have 3 lives or something like that, and if you
let some aliens pass, it's game over.
I also changed the nebulas in the background. I wrote before about that tutorial
how to draw a night sky with stars and nebulas in Gimp, but I had to experiment
a bit to get the look I wanted. It works by using Subtract layer effect on two layers
with rendered Solid Noise, and then colored using Overlay with a single color and
a gradient. The problem is that Subtracting those two layers always created a
"small" nebula, while I wanted the whole screen to be full with color. I draw
the stars by placing a bunch of random dots using pencil and a couple of different
colors. I separated the stars in 3 layers. On one of the layers I added a 2px
drop shadow (with no offset), on second one I used blur and I left the third one
as it is. The trick to nice stars is that those drawn close to each other should
always be different color or have different sharpness. This is the way it is on
the real sky. The stars that look close together are lightyears away and only
appear close from Earth.
OK, I got some really retro aliens, and they are flying around. Sorry
for no demo, it's an Android game, all I got is .apk and you probably wouldn't
want to install .apk from a complete stranger. Basically, the background loads,
and stars load, and stars slowly move. To scroll
the stars I'm using setV() and setV2() on the stars texture, slowly increasing
the timer. Like this:
And then some aliens show up and they
move to the right. That's about all that works now. I'm still learning
libGDX, so a lot of time goes into googling and reading
tutorials or watching videos.
Helpful tip: I noticed that some games built with libGDX have fixed screen
orientation. If you flip the device, the game shows upside-down. I found a very
simple solution to this in some obscure comment in some SO thread. Just replace
landscape with sensorLandscape in AndroidManifest.xml and device flips the
screen automatically.
I selected the library I'm going to use. It's Java, and it seems pretty complete.
I managed to build and tweak a test application very quickly. I'm still confused
whether to use Scenes, Actors, and all the other features or build the stuff
myself as I'm used to. The docs are lacking examples and explanation how to tie
in some stuff, I guess I'll have to google a lot. For example, there is no
explanation how should you wire up the Actor and Sprite. And what if you have
like 20 sprites with same graphics and stuff like that.
For this first project, I guess I'll learn just enough to manipulate Sprites and then build the
rest myself using my previous experience. For some
future project I'll probably be smarter and figure out which stuff did I
build that was already there. I just hate learning so much up front and then
figuring that framework/library is not flexible enough for some out-of-the-box
ideas I might have in the future.
Here are some of my ideas for retro-graphic aliens. Most of the time I
first draw stuff on paper. Maybe it's just a habit, but it helps me concentrate
when I'm away from keyboard and monitor:
I have been trying to draw some docking bay graphics and it looks like
s***. So, I'm ditching the "docking bay" idea. The combat will
happen in space. Yep, that's it. Aliens would come from one side of the
screen, and you would shoot them before they leave it on the other end.
At the bottom there will be some destrucable stuff. Aliens could hide
behind that, and maybe you can shoot it down or make holes in it by shooting.
Here's an example with a tower, satellite dish and some other things:
The idea is that you have limited time (say, one minute) to shoot down as
many aliens as you can.
Since the game will have a space theme, I'm browsing my font collection,
to find some cool gallactic font. So far, ArdourGM looks like the one I'll
use for in-game text like points, option screens, etc.
The graphics above are created using Gimp, and insipred by this
nebula tutorial.
After reading that and doing some my own tweaks I was able to draw the above
picture in a couple of hours. I hate when I lose that much time on a single thing,
but this background would be used for most of the game.
Looking around the net for ideas, and browsing Android forums, I found an ad
for Revenge of the Titans. Cool game with retro graphics and nice animation.
I can do retro graphics. So, instead of monsters, aliens
would descent from space into your backyard... well...
No! Backyard does not seem like a good idea. I guess I'll need a new
game name as well. I have two ideas here:
Aliens attack a remote defensive station on the border. They disable the
automated system, so you have to manually override the controls and shoot
them. The game would be called MANUAL OVERRIDE or EMERGENCY OVERRIDE. I
looked up on Google Play and Internet, it seems these names are free to be
used.
Aliens land on a docking bay of a large spaceship and you have to keep them
away. They could hide behind some barrels, landed spacecraft, etc. I'd like
to have some stuff in the game beside enemies that is destructible. The game
would be called DOCKING BAY or DECK 42, or something like that.
I downloaded Android bundle and set up my Linux machine with Eclipse. I
was able to run Hello World on my Galaxy S2. Hello Java. I really have to
remember all the Java stuff as I haven't used it since 2002 or something like
that.
Looking at all the 2D/3D OpenGL stuff, it looks like it would be a good idea to
use some toolkit/library to build the game. I got some free licenses for Unity3D
at NordicGame 2013, but those do not include rights to release on Google Play,
so I guess I'll skip Unity for now. I'm now looking into CoronaSDK and some
other libraries.
Looking at some websites with animation stuff, I found some nice, freeware,
zombie animations.
They have even animations for zombie being shot, crawling,
etc. So, maybe this game could be a zombie shooter.
Your character would sit on his/her porch and shoot the zombies coming out of
the cornfield. The game would be called Backyard Panic. You could switch different
characters from the old granny, redneck with a shotgun, to a member of the Marines
with some long-range rifle. Here's a really, really rough sketch:
Update: I just played Zombie in USA. Interesting game, but gets a little
bit boring to tap the device like crazy. I want a single touch equals kill
type of interaction, at least for non-boss enemies.
As I think about it more, the whole zombie topic seems too gloomy for me, and
having yet another zombie game is hardly called fresh. So, I'm not sure about
this. Also, it seems it would involve 3D graphics, and I'd like to stick with
2D, at least for my first Android game.
I wanted to build an Android game for some time, but never got some good idea.
Lately I have been playing Subway Surfers and got really passionate about it. I
usually don't like the "endless" games, that you basically cannot finish, so I
always set an arbitrary goal to reach. This time it was reaching 30x score
multiplier. While I did that, I got some skill and really got addicted to the
game. It also made me realize that Android games don't have to be a AAA title
with huge story and complex gameplay. Something simple and casual is OK.
Anyway, I thought it would be nice to have a game where you could simply point
your finger at something and shoot it. With a system of Missions, Daily
and Weekly Challenges and weapon upgrades it could be fun. My first idea was to
create a game where some cute monsters would run around a beautiful scenery,
hide behind the trees, old houses, or even in the clouds and you would need to
shoot as many as you can. By cute monsters, I mean something like Gremlins. They
would also bring in some huge machines and do other stupid things that would make you
laugh. Of course, being an indie game developer with zero budget, I decided this
would require too much art and too much of my time because of complex animation
I envisioned. So I decided to use a different setup, something I can produce
myself in a reasonable timeframe.
My goal now is to make an interesting, playable game for Android in one month.
This is the place where you can read about games that
I released so far as well the progress on the new games. I
recently released a battle card strategy Gods
of Sparta
and now I plan to try to make my first Android game.
Update: I never managed to start this, but Ludum Dare
October Challenge is here, and this is enough to finally get me going. Initially,
this was supposed to be a Create Android game in 21 days challenge for
me, but I got some more time because Ludum Dare ends by November 1st.