Stop-to-attack Roguelite for mobile

Hello Defold community!

My name is Maëlig, I am a 24 years old asipring game designer living in France. I’ve been using Defold for a while now and decided to commit to a bigger and more serious project. The game will use the popular stop-to-attack control scheme and hopefully make it a lot more exciting with strategic item choices through the roguelite-type runs. I hope those diaries will help me keep motivated and provide useful feedback, I count on you Defold community!

The animation will be made using Rive thanks to the native extention as well as png rendering for performances. (disclaimer, I’m not a professional artist so it will be quiet minimalistic!)

Here are some examples, a bit butchered by the .gif format but at least you get the idea…
New Artboard - normal_runNew Artboard - attackNew Artboard - run

On the left you’ve got your charismatic played character, running in the wind with incredible style. On the right, two example of enemies.

Current advancement of the project

Everything that is done (but could still be improved!)

  • Character controls
  • Inventory and equipping items
  • Attack when stop (with melee blows at closer range!)
  • Basic framework for abilities
  • Really stupid enemies

Here is some gameplay footage (trying my hand on editing software too!)

Gameplay goals

  • Multiple classes with a strong personality and different paths avaliable
  • A diversity of distinct items to arrange creatively
  • Different biomes containing distinct enemies and loot to provide agency to the player
  • Exciting optional mini-bosses to provide challenge without frustrating beginners
11 Likes

Hello!
Good luck! :four_leaf_clover: Keep us updated on your journey! :wink:

2 Likes

Creating New Biomes

Everything I will post about my projects will certainly be very beginner-friendly since I am a self-taught dev working alone. I know it will be pretty unimpressive in the eyes of a professional, but I hope this will inspire newbies!

Anyway, today I started working on the passage from one room to another. Pretty trivial stuff here, but what’s more interesting is that I started to implement new biomes in a very straightforward and time-effective way! Here is how I did.


Firstly I use very simple tilesets in order to keep things simple and quick. Secondly, as you can see, they are organized in the same way : first my shadow tile, second the border tile, third the basic ground tile, and then all the decorated ground tiles.
That way I only have to replace the tileset texture when changing biomes on runtime and boom, everything is in place using all the same algorithms to randomly place the tiles. All I have to do is to add tilesources to my script with

go.property("biome_name", resource.tile_source(""))

A little trick to organize your biomes : you can build a table containing all the self.biome_name with a string entry :

self.currentBiome = "seashores"
self.biomes = {
	["meadows"] = self.meadows,
	["seashores"] = self.seashores
}
go.set("/bg#tilemap", "tile_source", self.biomes[self.currentBiome])

The procedural generation aspect is also very straightforward, 80% chance to have the basic ground tile, 20% to have a random decorated one. Thanks to the fact that the border tile is always in the second position, I don’t have to generate borders by code, they just stay in place. Here are the results!

This is a very quick way to add a little visual diversity. Although it is not as good as it could be, it does the job for early versions of the game.

I wonder if that kind of feature could be a little too trivial even for beginners, what do you think? Since it is my first time writing a Dev Diary I really need feedback! Thank you for reading everyone!

5 Likes

Thank you for sharing your progress! It’s always nice to see the progress of a project!

2 Likes

How I handle a big diversity gameplay elements

Having a lot of different gameplay elements is one of the characteristics of RPG-oriented games, and handling them as a developer can be a real challenge. Here is how I implement different enemies to facilitate future debugging and gain time.

The key is to ask yourself how much can you re-use your assets and try to build an environment where different pieces of code can be interchangeable. It turns out Defold is simply amazing for that! All of this thanks to two features :

  1. Messaging
  2. Script Properties

For example, here are two enemies. Those are .go files that will be used as prototypes for factories (don’t forget to use dynamic loading to save ressources!). In my project, all enemies will all have to :

  • Take damages
  • Move
  • Be impaired by player actions (stuns, slows, push etc…)

However there are a ton of things that my enemies will do differently from one another :

  • Shooting different projectiles
  • Dealing different damages
  • Resisting different elements
  • Moving in different patterns
  • Attacking more or less often

Therefore two options come to you in this situation :

  • The first option would be to use go.property() to make your unique script very customizable. The drawbacks are mostly organizational. The more your enemies have to be customized the more complicated and long your script becomes.
  • Your second option is to create a script for each different elements. The problem with creating a lot of different scripts is that adding new features to your game can become extremely slow and painful if you have to update every single script of every single custom entity.

You guessed it, it is all about balance : you need to find out what can be re-used with a few customizable parameters, and what has to be separated across multiple scripts.


So here is how I made my enemies. Their core aspects will be handled by a script that will be the same for every enemy. This is what I named “EBU - enemy base unit”. It has script properties such as their maximum hitpoints, their speed, their resistances.

Now, the coolest part is that thanks to the way Defold handles messaging and addressing, it is very easy “plug scripts into one another” (if that makes sense). First you need to use a custom ID for your components. As you can see of those two screenshots, the AI and ATK scripts of the sheep and crab are two different scripts but thanks to custom ID they will be addressed the same way. I could swap those two scripts and they would still function in harmony with the other scripts!

So, in order to have my enemies be stunned by the player, I coded the basic move cycle in the enemy_base_unit, and had the #AI sends directions via messaging. Now if I have any bug to fix or new interactions to add to the enemies I simply don’t have to modify every AI script I made, only edit the enemy_base_unit script.

Like this, I can combine custom movement patterns and custom attack patterns and have it all function quiet easily.

Thanks for reading, hope it inspired you to make more complex projects with Defold!

9 Likes

Thank you for sharing your approach! :wink: :+1:

2 Likes

I made a small but essential update to the game’s graphical aspect. There is now a 2.5D depth effect that makes the whole game more coherent and palpable. Look how the player now passes behind and in front of that stone arch.

I did that by following the advice on that topic :

I had to take some additional steps for Rive :

4 Likes