it's just based on the type of monster your possess. It is not very effective since you can wait it out. But I have been thinking of tying it to exploration or kills.
Recent community posts
If you have never played a roguelike, the objective is to find stairs to the next level until level 10 where you have to beat the boss.
Each level has a different set of challenges / enemies but the general strategy as in most roguelikes is to be cautious and not engage with enemies. Be sure to use the possession power when you health is low, or to avoid floor hazards. You can wait possession cool down while in safe areas and make sure to try the special power of monsters.
To beat the boss, the easiest strategy is to possess a wizard and summon mobs as meat shield. Then leave the boss's field of vision to not be caught in fire. There is a different ending depending on which monster you possess while beating the boss.
Big spoiler: your original body is sitting in the middle of the room, invisible unless next to it. So lure out the boss and possess it for a fun ride.
I had two problems while running from source on linux. First, requirements.txt refer to pkg-resources==0.0.0 which does not install. Second, the game window is extremely small when running on HiDPI displays.
Other than that, great game!
My entry is available at https://benob.itch.io/expelledrl. You play as a hero who just arrived in front of the amulet of Yendor after battling and levelling for the length of the dungeon. This is when everything derails...
I couldn't figure out how to make working standalone executables out of python+tcod, so you have to deal with the source code download. This post is full of spoilers, so start by playing the game.
I had to battle a lot of bugs at the end, and some I was not able to squish. The game includes a story, a tutorial, a whopping 13 different endings. The main innovation is the possession spell, at the heart of the game-play.
You cast the possess spell by pressing 'p' while there is exactly one enemy in your field of vision. You take control of it and let go the control of your previous host. The host either dies, suffers or starts following and helping you. There is a cooldown period which depends on the value of the host so that you can't jump from body to body. The possess spell is implemented by being able to the AI controller of a creature by a controller based on player input.
In addition to the restriction on enemies on screen and cooldown, the other mechanic that pushes you towards swapping hosts is that there is no healing.
Once you possess a creature, you gain access to all its buffs and spells (press the 'a' key). Some can launch fireballs while others can summon rodents. Terrain buffs help you cross rivers.
Since I did not have time to implement an inventory system, there are no items. With possession, this makes monsters the items as they provide the bonuses that you may get from items. You find yourself exploring levels to find a certain type of monster.
Combat is quite brutal and quick escape is vital because of those features. There is no time system, so all monsters move at the same speed. The only way to outpace a foe is to leave its field of vision, thanks to a loosy AI;)
The game is composed of 9 levels. The first is the outside of the dungeon, just a cosmetic level with no challenge. Then, each level presents a new enemy or new feature of the game. The generator is the original generator from the tcod python tutorial. The last level is static and contains the boss. The boss itself is an overpowered caster who can summon any creature from the game. So, the basic strategy is to isolate one of its summons and possess it. Hit, get hit, rinse and repeat. The ending depends on who you possess when you kill the boss.
Implementing a RL based on the possession mechanic has several challenges.
- The first one is that anything that the player can do, everyone must be able to do. That includes vision, items, spells,... This suddenly adds a lot to the TODO list.
- The second one is that players will try to bring with them a whole family of useful hosts to be able to use them at anytime, or they may try to stick to a universally useful body. The game has to impose restrictions to limit that behaviour.
- The second is that the certain challenges depend on the availability of a monster in the area. Making it fun for the player to find that critter can be difficult, it it is easy to create frustrating dead-ends by letting the key monster die.
- The last one is that you need to implement monsters with quite a variety of capabilities to make the dungeon interesting. It requires a lot of development time, and balancing is much more complex as if you want to overpower the player, you also overpower an enemy.
In term of restrictions on possession, I opted for a cooldown timer, no healing, and a single foe in view. I could also have explored a decay which removes hp with time which would act as a hot potato which kills you after a timer. I also though of underpowering high-power monsters when they walk stairs (by alternating element themes such as water and fire).
I didn't have time to implement items and inventories, but I had, I still wonder how to prevent the player from systematically dropping all its equipment before possessing another monster. Maybe single use items which "fuse" with the critters could be a reasonable option.
The game is developed with python and libtcod. I have quite some experience with rapid prototyping in python, and that makes it a good language for those kind of projects. I had never tried libtcod before and therefore I started with the tutorial. The first problem was python2, which nobody uses anymore (really). I found some ports of the tutorial but it was a bit late. A more serious problem was that the data structure and design choices in the tutorial turned out to be counter-productive and I had to refactor a lot of the code. Lack of time quickly made it look like a plate of spaghetti. I really wanted tiles (and bought an Oryx set), so I was disappointed to learn that tcod cannot stack transparent tiles on top of eachother. I wrote a pysdl2 renderer in one evening to replace the functionality which also allowed me to use non-monospaced fonts. But handling the mouse turned out to be too complicated so I dropped mouse support. I also developed a tool for rearranging my tileset although given the number of tiles I have used it was not necessary.
All in all, I had a lot of fun to participate in a 7DRL, my first. I had explored RL dev before, but never made a complete game. I am glad I succeeded.
Day 5: Spent a lot of time implementing a system for monsters to perform actions (incl. casting spells), with associated AI. Added an ending. I ended up dropping item/inventory/levelling support as it unnecessarily complicates the game.
One unintended consequence of the possession mechanism in the absence of levelling is that all critters should have about the same stats, otherwise the player gets killed very quickly. If a monster is overpowered, you have to make sure a counter-monster is present in the level to bring back balance. This makes it very easy to create frustrating experiences. So it may be a mechanism more suitable for short games.
What do you guys think about it?
Day 4: I implemented a few spells, and monsters to use them. I added a tutorial and fixed quite a few bugs. Most elements are in place. In addition to the ending, what remains is balancing and making the whole thing fun ;)
Day 3 (evening): Added lava rivers which hurt! unless you are a fire elemental. Played with tcod noise generation without success, so the rivers follow a simple snake which randomly turns a bit left or right. It's nice but easy for the player to get stuck. Making sure the exit is on the same side of the river as the player could be an option.
I will try to implement 5 or 6 challenges like the lava river and pick one per level.
Day 3 (quick morning update): woke up early and changed AI so that monsters can target any other monster. Added factions so that monsters from the same faction do not attack you unless you start a fight.
Day 2: implemented a controller system to be able to impersonate any monster, and the possess spell which makes use of it. Also added a few story screens when starting a new game.
As for mechanics, I settled for:
- the possess spell only works if you are alone with the monster close to you, for a few turns (monsters will try to stay grouped to avoid that, spells like confuse may help you)
- when you unpossess a monster, it might come for you with a lot of anger
- no healing is possible, so that you have switch bodies often
- one problem I foresee is trying to bring with you multiple utility bodies. To avoid that monsters will have a non-trivial chance of dying when unpossessed
- the inventory stays with an unpossessed body (maybe I will start with no inventory at all)
The trick is to create situations where possession is an interesting mechanic. For example, you have to cross a lava river. A bat is on the other side so I can drop a fruit on the floor to attract and possess it. Or I could use a fire elemental which is immune to lava. However there is none around, so I possess a sorcerer who has the spell for summoning one. Unfortunately he doesn't know the spell, so I bring him to a library and "convince" the librarian to give me the scroll.
This looks like it will be difficult to setup generativelly but I have ideas...
I am working on an 7DRL entry titled PossessorRL (not definitive). I am exploring game mechanisms around possessing enemies to acquire their special abilities and overcome challenges produced by the game. I would like the player to not get attached to a particular body and have to change bodies quite often. That should have an impact on the way the game is balanced (no overpowered hero) and generate interesting choice situations.
For now, I have started the python tcod tutorial to get my hands on the library. I'll be working on evenings only so don't expect anything great ;)
-- edit: changed title to reflect new name