Skip to main content

On Sale: GamesAssetsToolsTabletopComics
Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

Way of the Water

A topic by BrickFrog created Jul 14, 2018 Views: 726 Replies: 11
Viewing posts 1 to 9
(+2)

A man awakens floating in the water at the shore of an underwater cave. He doesn't know how he got there or where he is. He finds an ancient engraving containing the Way of the Water and learns how to become one with the element, turning the gentle force into the deadly weapon he needs to fight his way back to the surface. 


Basic Concept: Dodging based, fast paced top down game with water bending ala Avatar The Last Airbender. Dodge enemies and use the environment to secure victory as you unlock new powers


A little about myself: I'm a massage therapist, a voice actor, and I have about a week's worth of programming experience in Godot. I'm in way over my head and just hoping to learn some stuff. I have messed around with Unity in the past (and never got anywhere) and have a semester in beginners Java. 


Scope of the game:

I'm going to break my game up into chunks:

The first chunk will be the bare minimum, which is a character with movement and dodging, a health bar, a water resource meter, and the ability to use water whip, which will basically be a close range attack covering a 35 degree angle (or so) in front of the player. There will also be at least one enemy type and 2 levels.

The 2nd chunk is the interesting stuff, adding new abilities to the player such as a hydro pump that will push enemies away from a distance while doing a small amount of damage (but rapidly deplete water), the ability to replenish water from puddles placed in the environment, and an ability to fling enemies from medium distance, causing damage on impact to both themselves and other enemies they hit (and potentially doing massive damage or killing them if they hit hazards). It will also include environmental hazards like wall spikes and pits you can fling or push enemies into. At least 1 or 2 more enemies here.

The 3rd chunk is going to be stuff I probably can't do but would like to. Deep water pits that can be manipulated by the player to send a wave in a cardinal direction, pushing all monsters (and the player) until they hit an obstacle or hazard. The ability to turn puddles into steam which will confuse monsters and cause them to hit their allies. More enemies. More levels. Maybe even an ending.


I did some basic sketches for organizational purposes, they're ugly and probably only legible to me, but serve their purpose


top left corner is the basic outline of the character mechanics and a few ideas on how to implement them within Godot. You can see that I'll probably use a KinematicBody2D node with a CollisionShape2D to represent the character and handle the physics. The Hydro pump ("water blast") will probably detect and apply damage/forces to enemies via a Raycast2D node. After learning the Godot doesn't support particle collisions I need to figure out a workaround for my visual effects, and am considering discharging a bunch of small projectiles for that purpose. On the right is the opening level. The player finds themselves with no defenses. They must run past the first enemy, hopefully learning to dodge, and find the water whip ability before returning and defeating the previously unbeatable foe and moving on.



This is an example of what a room might contain. The dungeon will be broken up into rooms of enemies. Your health can be recharged at water when you aren't threatened, but there is no way to heal once you are fighting. There are puddles to recharge your water (which will replenish slowly over time as well), spikes representing a hazard to both yourself and enemies, a pit which is instant death if you can get your enemies to fall into it, and something I'd really like to include, which is deep water. By clicking on the deep water and dragging in a cardinal direction the player send out a wave sweeping up any monster in its path. This can be used to do massive damage by slamming them into spikes or killing them by shoving them down pits, but it can only be used once per room, so you have to make the most of it. Enemies shoved into the deep water will drown as well.

Stay tuned for updates. I'm pretty busy tomorrow and may not get much done, but after that I expect things to pick up considerably.
(1 edit) (+1)

Decided to put together a rough outline of the player scene and start on the script by declaring the variables I'll probably be using. It's not much, but outlining it now should help me organize my code better once I start to implement features. I don't have any sprites yet for the player or monsters (or any sort of map hazards) but I decided on a tileset that I'll be using for my levels, https://opengameart.org/content/cave-tileset-0

edit: Note to self: remember to add a movement speed export and i_frame variable next time you goober

Host(-1)

it's awesome that you've established priority tiers for your planned features! it's always nice to just put out there all your dream features and really understand what the core of your game is.  also i'm loving how organized your code looks so far!

(+1)

Thanks! Because of my inexperience I found it really hard to estimate how much I can accomplish in the time given. Breaking it into tiers seemed like the best way to guarantee something playable by the end. Also I find myself really enjoying the outlining process and crafting the theory behind the gameplay, so there was no way I was going to stop at what I could reasonably do :)

Host

oh totally! you really just have to put all those ideas out on paper when they seize you in the moment because you'll keep thinking of all those things otherwise. eventually in production also you'll end up letting some of them go but it's always nice when you actually hit your goals and have a better idea of what reach goals are feasible!

(+1)

Today was kind of productive. I was able to implement movement and figure out how to use a walking animation. There were some...bumps along the way. 

My first attempt was a spectacular failure. I tried to use a simple walking down animation, using godot AnimationPlayer and the spritesheet's region rect as the keyframes.

I later found the sprite animation tool under the sprite node and it was much easier to work with, but I also figured out a way to do it via rect as well.

This was great, so I tried to plug the animations into movement in game with...mixed results

The problem here is that the program was trying to start the walking animation as long as velocity > 0, so it didn't move onto the next frame until velocity = 0. I was able to fix this by a series of 'if' statements supported by strings which checked if the walking animation for a respective direction was already playing before trying to play it (again)

What I failed to realize was that my character has to follow the mouse all the time, so most of this was a waste of time lol. Regardless, I learned some important things. Another problem was that in order for my character to smoothly follow the mouse I'd need sprites for at least 8 directions. So I opened up graphicsgale and made my first sprites ever! 


Next up I need to figure out how to rotate the character to face the mouse. The hardest part will be figuring out at which angle the sprite needs to rotate. Animation based on that rotation will be very difficult, I probably won't have animation for diagonal movement (maybe as a stretch goal), but I can reverse the animations if the player is walking away from the cursor which should work fine for the cardinal directions.


Until next time!

Host

haha i just wanna say i'm so glad you posted some of the glitches you had! it's always kind of fun seeing how things go wrong before they go right. and this is looking awesome! good luck working on the rotation!

Submitted

I have a somewhat similar idea for a game (fast, combat based, designed around dodging + water based abilities) though I'm trying to make it in 3d using a third person perspective. I'm also going to start by tackling movement and seeing as our projects have some obvious parallels I'm excited to follow your progress. Good luck! 

I just checked out your project, looks good! I'll be keeping an eye on yours as well :)

I skipped the last couple of days because I kept getting stuck on things and didn't have much progress to show. Also, I spent most of yesterday playing Middle Earth: Shadow of War since I only got halfway in last time I played and wanted to try out the new update they released. Anyways, I've finally got some success to show off!

I ultimately decided to hold on fixing the sprite. I might go back to it later or ultimately end up using a generic rotating top-down sprite with animated legs. Before I wasted too much time on that I decided I need to work on the game's foundations and just put in a simple square to represent the player. I spent most of yesterday fiddling with godot's animation player and playing with particle settings. I hope to add some more juice to it before completion, but this is a solid foundation

Next I cut up my tilesheet for the background art, built a little testing arena so that I could make sure the hitboxes were working and tried to implement knockback. I'd like to give a shoutout to TaciturnGamer from the discord channel who spent a couple hours of his time helping me troubleshoot this, I don't know if I could have figured it out without him. The knockback gave me a ton of trouble. My main issue was that I was having trouble getting the player's position so I could use it to knock the enemy away. I found a method in a tutorial but for some reason I just couldn't get it to work, and then when I finally did get a response...well this was the result

No matter what direction I hit it from the enemy drifted to the lower right corner. Taciturn and I eventually figured out that the problem was that I wasn't retrieving the players position for the knockback, but the global (0, 0) coordinate. He gave me the idea to pass the player's global position along with the damage information, which worked perfectly. This is the end result


Tomorrow I figure out how to lock the player's movement and rotation when casting water whip and add dodging with the associated i-frames

(+2)

Today was particularly productive. First I added in dodging and and restricted character movement/rotation while attacking .  This took far less time than I thought it would and I didn't really have to spend much time looking stuff up, which was gratifying. I knew what I needed to do and after a couple of experiments I just did it. Thie biggest timesink was making a spritesheet with a dodge animation (turning the player into a circle) because I was having some trouble figuring out transparent colors in graphicsgale. I also implemented player health so you can take damage and will disappear when it's out, so I could implement invincibility frames. The character's health in this gif is the same as the enemy's  attack, so you can see how the character bounces off without taking damage.

Next I added UI. This of course necessitated adding in a water value, making the water whip drain that value, adding in a water regeneration feature, and making sure the player could only use the attack when they had enough water. Again it was fairly easy and didn't take as much time as I thought. At some point in here I got player knockback from damage working too and doubled the attack speed (it was feeling too sluggish).


I decided to end the day on a lighter project since I had already done more than I thought I would be able to and made the basic layout of my first level. The room with the water will be where the character first wakes up, and the next room will be the first enemy. The path to the north from there will be blocked until the enemies are defeated and the player will learn attacks in the room to the east. 

Tomorrow I'm going to spend some time figuring out pathfinding for the enemies. I expect this part of the project to be time consuming because of the amount of raw coding and math involved, so if I don't post for a couple of days it's because I haven't made any real progress. Getting the AI working is basically the last barrier to finishing the 1st chunk of my roadmap. Once I've done that I can do some work on the art and a start menu, and then if there's still time I can start on chunk 2.

Host

aaahh im glad you were able to figure out the player position problem with help! those issues can be really hard to debug. also scrapping things + trying something else is totally understandable and it's great to make those decisions early so you can spend more time focusing on what you think will be better for the game! if anything you now have even more experience in case you use that in the future.