Tower

About the game

The beginning

Tower was created to initiate kids to the not so beloved genre of Dungeon-RPGs. It was initially just a D-RPG engine for RPG Maker 2003, back in 2009. THe engine was however very buggy, and I rewrote it entirely in 2014. It is now bug-free and easier to use, which made me want to create a real gae with it. Tower is about a caterpillar trying to become a butterfly by fighting monsters in the Great Tree.

Inspiration and brainstorming

The game was initially thought as a Dungeon Master fan-game. After seeing my 2yo nephew, I decided to make it easier and destined to kids. The engine doesn't change much to the basic one I used, but has some tweaks:

Coding the D-RPG in RM2k3

Yay RM2k3!

Default moves on RM2k3 do not allow the first person view. The software is mainly conceived for making traditionnal JRPGs, such as Final Fantasy. It is however possible to tweak the engine with a bit of logic and common sense once you have it well understood. The way of doing here is the same as I did for my first D-RPG engine in RM2k3 and that you may be allowed to find on the old version of the site.
The important thing is to know at each time the position and the direction of your hero, as well as the position and terrain ID of the surrounding tiles in your field of view. The figure on the side shows what fiel of view I chose, with relative coordinates from the hero, for each direction.
Everything is then set in the chipset. If you wish to make walls and floors, you only need to define two tiles: one which is walkable for the floors, and one that isn't for the walls. In the editor, define two terrain ID, let's say 2 for the floors, and 3 for the walls.
In a common event in parallel process, we store all the positions of use (hero, surrounding tiles). In the common events deciding what to show on screen, you only need to: The thing now is only to use conditional branches to check IDs and show pictures. Adding a different type of tile - such as a chest - only requires to make a third tile in the chipset with another ID, and corresponding conditions. Nothing difficult really!

Some code to show off

Here is what you get once it's coded. Excuse the bits of French, it's easier for me. This common event in parallel process stores all the needed variables, and calls the common events that show the picture depending on the direction the player faces.
@> Comment: Cet évènements initialise les variables
 :               : et appelle les évènements d'affichage
 :               : 
@> Display Text Options: Transparent, Top, Fixed, Stop Event Movement
@> Comment: Store la position du heros
@> Get Player Location: Variable [0001][0002][0003]
@> Comment: 
 :               : 
 :               : Initialise les positions de depart
@> Control Variables: [0004:X_heros+1] = Variable [0002]
@> Control Variables: [0005:Y_heros+1] = Variable [0003]
@> Control Variables: [0006:X_heros+2] = Variable [0002]
@> Control Variables: [0007:Y_heros+2] = Variable [0003]
@> Control Variables: [0008:X_heros-1] = Variable [0002]
@> Control Variables: [0009:Y_heros-1] = Variable [0003]
@> Control Variables: [0010:X_heros-2] = Variable [0002]
@> Control Variables: [0011:Y_heros-2] = Variable [0003]
@> Control Variables: [0004:X_heros+1] += 1 
@> Control Variables: [0005:Y_heros+1] += 1 
@> Control Variables: [0006:X_heros+2] += 2 
@> Control Variables: [0007:Y_heros+2] += 2 
@> Control Variables: [0008:X_heros-1] -= 1 
@> Control Variables: [0009:Y_heros-1] -= 1 
@> Control Variables: [0010:X_heros-2] -= 2 
@> Control Variables: [0011:Y_heros-2] -= 2 
@> Comment: 
 :               : 
 :               : Affiche l'image du sol/plafond+HUD
@> Show Picture: 1, 'Sol_plafond', (160,120), 100%, 0%
@> Show Picture: 500, 'HUD', (160,120), 100%, 0%
@> Comment: 
 :               : Vérifie la direction du personnage et appelle l'évènement 
 :               : correspondant
@> Conditional Branch: Player is facing Down
  @> Call Event: [Direction Bas]
  @>
 : Branch End
@> Conditional Branch: Player is facing Up
  @> Call Event: [Direction Haut]
  @>
 : Branch End
@> Conditional Branch: Player is facing Right
  @> Call Event: [Direction Droite]
  @>
 : Branch End
@> Conditional Branch: Player is facing Left
  @> Call Event: [Direction Gauche]
  @>
 : Branch End
@> Wait: 0.2 seconds
If the player looks down, the showing of pictures is as follows:
@> Comment: Y+2
 :               : 
@> Comment: X+2;Y+2 => Gauche+2_2
@> Get Terrain ID: [0012:ID_terrain], Variable [0006][0007]
@> Conditional Branch: Variable [0012:ID_terrain] == 3
  @> Show Picture: 3, 'Mur_gauche+2_2', (160,120), 100%, 0%
  @>
 : Else
  @> Conditional Branch: Variable [0012:ID_terrain] == 4
    @> Show Picture: 3, 'Coffre_gauche+2_2', (160,120), 100%, 0%
    @>
   : Else
    @> Erase Picture: 3
    @>
   : Branch End
  @>
 : Branch End
@> Comment: X+1;Y+2 => Gauche+2
@> Get Terrain ID: [0012:ID_terrain], Variable [0004][0007]
@> Conditional Branch: Variable [0012:ID_terrain] == 3
  @> Show Picture: 5, 'Mur_gauche+2', (160,120), 100%, 0%
  @>
 : Else
  @> Conditional Branch: Variable [0012:ID_terrain] == 4
    @> Show Picture: 5, 'Coffre_gauche+2', (160,120), 100%, 0%
    @>
   : Else
    @> Erase Picture: 5
    @>
   : Branch End
  @>
 : Branch End
@> Comment: X;Y+2 => Mur+2
@> Get Terrain ID: [0012:ID_terrain], Variable [0002][0007]
@> Conditional Branch: Variable [0012:ID_terrain] == 3
  @> Show Picture: 6, 'Mur+2', (160,120), 100%, 0%
  @>
 : Else
  @> Conditional Branch: Variable [0012:ID_terrain] == 4
    @> Show Picture: 6, 'Coffre+2', (160,120), 100%, 0%
    @>
   : Else
    @> Erase Picture: 6
    @>
   : Branch End
  @>
 : Branch End
@> Comment: X-1;Y+2 => Droite+2
@> Get Terrain ID: [0012:ID_terrain], Variable [0008][0007]
@> Conditional Branch: Variable [0012:ID_terrain] == 3
  @> Show Picture: 4, 'Mur_droit+2', (160,120), 100%, 0%
  @>
 : Else
  @> Conditional Branch: Variable [0012:ID_terrain] == 4
    @> Show Picture: 4, 'Coffre_droit+2', (160,120), 100%, 0%
    @>
   : Else
    @> Erase Picture: 4
    @>
   : Branch End
  @>
 : Branch End
@> Comment: X-2;Y+2 => Droite+2_2
@> Get Terrain ID: [0012:ID_terrain], Variable [0010][0007]
@> Conditional Branch: Variable [0012:ID_terrain] == 3
  @> Show Picture: 2, 'Mur_droit+2_2', (160,120), 100%, 0%
  @>
 : Else
  @> Conditional Branch: Variable [0012:ID_terrain] == 4
    @> Show Picture: 2, 'Coffre_droit+2_2', (160,120), 100%, 0%
    @>
   : Else
    @> Erase Picture: 2
    @>
   : Branch End
  @>
 : Branch End
@> Comment: Y+1
 :               : 
@> Comment: X+2;Y+1 => Gauche+1_2
@> Get Terrain ID: [0012:ID_terrain], Variable [0006][0005]
@> Conditional Branch: Variable [0012:ID_terrain] == 3
  @> Show Picture: 8, 'Mur_gauche+1_2', (160,120), 100%, 0%
  @>
 : Else
  @> Erase Picture: 8
  @>
 : Branch End
@> Comment: X+1;Y+1 => Gauche+1
@> Get Terrain ID: [0012:ID_terrain], Variable [0004][0005]
@> Conditional Branch: Variable [0012:ID_terrain] == 3
  @> Show Picture: 10, 'Mur_gauche+1', (160,120), 100%, 0%
  @>
 : Else
  @> Conditional Branch: Variable [0012:ID_terrain] == 4
    @> Show Picture: 10, 'Coffre_gauche+1', (160,120), 100%, 0%
    @>
   : Else
    @> Erase Picture: 10
    @>
   : Branch End
  @>
 : Branch End
@> Comment: X;Y+1 => Mur+1
@> Get Terrain ID: [0012:ID_terrain], Variable [0002][0005]
@> Conditional Branch: Variable [0012:ID_terrain] == 3
  @> Show Picture: 11, 'Mur+1', (160,120), 100%, 0%
  @>
 : Else
  @> Conditional Branch: Variable [0012:ID_terrain] == 4
    @> Show Picture: 11, 'Coffre+1', (160,120), 100%, 0%
    @>
   : Else
    @> Erase Picture: 11
    @>
   : Branch End
  @>
 : Branch End
@> Comment: X-1;Y+1 => Droite+1
@> Get Terrain ID: [0012:ID_terrain], Variable [0008][0005]
@> Conditional Branch: Variable [0012:ID_terrain] == 3
  @> Show Picture: 9, 'Mur_droit+1', (160,120), 100%, 0%
  @>
 : Else
  @> Conditional Branch: Variable [0012:ID_terrain] == 4
    @> Show Picture: 9, 'Coffre_droit+1', (160,120), 100%, 0%
    @>
   : Else
    @> Erase Picture: 9
    @>
   : Branch End
  @>
 : Branch End
@> Comment: X-2;Y+1 => Droite+1_2
@> Get Terrain ID: [0012:ID_terrain], Variable [0010][0005]
@> Conditional Branch: Variable [0012:ID_terrain] == 3
  @> Show Picture: 7, 'Mur_droit+1_2', (160,120), 100%, 0%
  @>
 : Else
  @> Erase Picture: 7
  @>
 : Branch End
@> Comment: Y
 :               : 
@> Comment: X+1;Y => Gauche
@> Get Terrain ID: [0012:ID_terrain], Variable [0004][0003]
@> Conditional Branch: Variable [0012:ID_terrain] == 3
  @> Show Picture: 13, 'Mur_gauche', (160,120), 100%, 0%
  @>
 : Else
  @> Conditional Branch: Variable [0012:ID_terrain] == 4
    @> Show Picture: 13, 'Coffre_gauche', (160,120), 100%, 0%
    @>
   : Else
    @> Erase Picture: 13
    @>
   : Branch End
  @>
 : Branch End
@> Comment: X-1;Y => Droite
@> Get Terrain ID: [0012:ID_terrain], Variable [0008][0003]
@> Conditional Branch: Variable [0012:ID_terrain] == 3
  @> Show Picture: 12, 'Mur_droit', (160,120), 100%, 0%
  @>
 : Else
  @> Conditional Branch: Variable [0012:ID_terrain] == 4
    @> Show Picture: 12, 'Coffre_droit', (160,120), 100%, 0%
    @>
   : Else
    @> Erase Picture: 12
    @>
   : Branch End
  @>
 : Branch End
Be careful! You need to remember that if the hero looks down, his right is actually the left for the editor! You need to be very careful with this, but once again, this is just about conditions :)


Left: How you see the dungeon in the editor. In dark green, floors, in red, walls, and in blue, chests. Right: the result shown on a gif file to test the movements. Images are placeholders and from the excellent Heroine Dusk and Dokapon SNES.

Battle system

The battle system chosen is quite simple. There are 3 reasons for doing so. Firstly, CBS are a pain in the ass to deal with in RM2k3. Second, I had with my own experience that I have more fun with basic gameplays. Lastly, the game is intended for kids.

It takes from the classical Shifumi game, that some games such as Suikoden often use. The idea is simple: Such a system forces to use the brain. And for being the most efficient, the player needs to know the ennemies. This is simple, and one of the basics so that kids don't get discouraged by its complexity.

Oune poquito de color

Graphics

Tower is dedicated to kids, so my initial idea is to provide with cute and colourful graphics, even though the game talks about serious themes, a bit like Final Fantasy IX. I wanted the game to be full custom as well, and started to drizzle some stuff:



You find here the premices of the central town. Some screens (3) were made for the city: the inn, the interior of the inn, the shop, and the dungeon entrance. You find as well the tenants of the inn and shop, a bat and a mole (taken from Pokemon, let's be honest here) respectively. I wasn't satisfied and I tried to put everything on a single map.

This time I was inspired by old maps I made for an old project which still get around. I asked my nephew to draw some shapes that could go in the map and that I slightly changed for homogeneity. Don't mind le Caterpie in the middle ;)
Still not satisfied, I went to look for RIPs. I'm not ditching the whole custom idea, but I'll get back to it later :) After a little bit of search I chose Legend Of Mana for its beautiful 2D backgrounds (a true beautiful game like they don't make anymore those days), Mother 3 for item graphics (furnitures, decorations, and such), Pokémon for the caterpillar, and Children Of Mana for NPCs.


The town on the left. The inn is now outside and the shop inside as shown on the right. The shop is accessed on the left, and the dungeon on the right.

News and blabla

Please be aware that current screenshots are WIP and that most of the Graphics are placeholders. Once I've done all the custom, I'll put screenshots of them :)

Stuff/News
27/11/2015
I made a cool menu too, thanks for your feedbacks =)

And the craft system is the newest stuff as we speak, fully working, no bugs seen so far. When you craft something, the shopkeeper gets animated to the fire, does stuff there, and comes back. I need to make a gif of that, but hey, lazy xD

A friend of mine, a qualified artist (Vincent Batignole) agreed to help me so that I can replace the Mugshots (placeholders so far) and the dungeon graphics (placeholders so far). Maybe he'll help me for custom town maps and monsters too!

01/12/2015
So here is a gif showing the different stuff. I think I'll drop the Custom Save Menu, since DynRPG or BetterAEP don't seem to work with the official RM2k3, and I'll probably drop the Custom Title as well since when I contacted RMW support they told me the non-steam release will probably never get the updates (they seem to have trouble with update when not on steam), and I refuse to using Steam. So Inn, Crafting all with animation, Menu, choice of floor... At the end you see a battle starting but that randomly chosen monster has not been coded yet. What I've done today was basically optimizing, as it was slightly lagging before. There's still a bit of lag sometimes after teleportations, I'll see what can be done about it. I must have a wait showing up somewhere. I increased the size of the FP view, made the HUD less heavy by using a dedicated menu for all the stuff you posess. Enjoy



03/12/2015
Sooo, status update o/
I've been coding aaaall the monsters. Took me ages, and I'm sure it can be made better, I shall see when testing the game before release. That does not include the bosses (I said they would be 5, but I have 4, and the final boss has 3 forms, so 6 technically....) because I want to implement special behaviour for them. I was thinking mini-game style, like Dames, Dance Dance Revolution, stuff like that. It would diversify the battles, and make all the bosses uniques. What do you think about that? That would make the list of stuff left to do slightly bigger though...
Below you can meet the monsters that will lurke in the labyrinth, bosses included (they're all in the database already), not in order. Which ones are bosses, which ones are not? (RIPs from Dokapon Millenium Quests GB)



17/12/2015
Hello!
So today... I made a big decision: switch back to the unofficial RM2k3. Reasons? I have the non-Steam version, which is not going to be updated. And I need some of Cherry patches/dynRPG so that I can do stuff such as: Custom Title Screen, Custom Save System, and perhaps even the Progressive Minimap that I have trouble with. So that the game can be made like I want it to be. That's pretty much it. I copied/pasted and on the new side I've done a few adjustments on characteristics, EXP curve, and coded a QTE system for the first boss. That's it =)



06/01/2015
Howdy!
For celebrating New Year, I was planning on releasing a tech demo, allowing you to play the first two levels of the dungeon, use the forge and inn, but with no story/music implemented. I did not release it... Everything is ready but I am basically waiting for my friend to finish the graphics he's promised to do. Meanwhile, I thought it would be more interesting to add doors/switch/puzzles into the dungeon. I have implemented those changes in the first two levels (hence why I wanted to make the demo only up to the 2nd level). What I'm going to do is implement a new mechanism every 2 floors: switch/keys/doors, then teleport, then iced floor etc, etc.
Since I dropped the official RM2k3 release, I was able to make my save system. It's basic but it works, and it's not as invasive as the default one ;)
I also made a Custom Title Screen! Or should I say, the background for it. I can't seem to make a nice logo/font etc... I'm desperate so if you think you can help me, please do. I'm looking for a logo similar to that of Pix The Cat, but with a more woodish design. Here is a little animation to show you how the background works. Credit goes to Adam from pixeljoint for the trees. I can't remember who made the clouds, I forgot to write it down but it's from an animation I found on twitter, not done by me. I only slighlty edited the stuff to make the loop look good.


So a demo will come very soon I hope (depending on my friend), since everything else apart from title screen (but don't worry, we can always make something not so nice just for the demo if it's the only problem left) is READY.



So what's left
Stuff I need to do:

Downloads

Not yet, sorry :/
- By Pez_Amaury - Last modified 12/12/2016 - Tower - Dream Master - The Holy Whale - Prototypes -