—    —  Home

   jamesprimate on January 25, 2015, 10:36:50 AM:

^ oh man we have some cool plans for that. i wont spoil it though





   JLJac on January 26, 2015, 01:31:59 AM:

Update 387

Wow, that was a lot of work! But also probably the most fun I've ever had. Since last time, the beast has gotten a head, feather like appendages on its arms, smoke coming out of the thrusters and some kind of shell on its back.

Many things still need work, such as the head and neck being too lose and floppy when it's flying, and the smoke in general. I would like to have the smoke look cooler, but I settled for this as good enough for now. My main concern was that I really wanted the smoke to be affected by the wing flaps, and I got that in even though it doesn't perhaps look all that natural. Maybe down the line I'll do a 2D grid based fluid simulation o_0

Here's the head in its classical frame animation sequence. I'm getting rusty at old school animation haha! But with some help from the computer (rotating the sprites, mostly) it still looks smooth enough.



And on the creature!



The tusks or mandibles or whatever are probably going to have some stuff going on, I imagine that they'll hang like this, but when the creature gets into Hunt Mode they retract towards the neck, and sit there in a "charged" position. From there they can move forward quickly in a bite, and if that gets you you're stuck. If it doesn't, however, the creature needs to retract them again before biting the next time, giving you half a second of breathing space. I think that might be necessesary in order to give you the feeling that you have some sort of chance - this way you can actually save yourself from a close encounter with a bit of skill and luck. If you're caught automatically when touching the head, the creature can just kind of cheaply sweep around and get you pretty much whatever you do.

Here's the creature taking off:



And an remake of the eagle landing one, now with head and all that stuff (this one took a thousand takes, because it just refused to land on the little platform... Everywhere else was preferable, apparently -_-)



And last, some climbing gameplay where I manage to make the beast lose track of me. It's usually not that easy, but I was lucky this time and the tracker sent a ghost off to the right instead of up the pole. Remember that it doesn't have any AI yet, only the tracker. The AI is literally two lines that say "go through the known creatures in the tracker. If they are a slugcat, tell the pathfinder to set the movement destination to where that critter is believed to be. Break the loop." Behaviour will probably look cooler once that's actually sorted out.



Oh and also, maybe we need a new name for this beast? Sky kraken was fun as a WIP name, but seriously, the finished product is looking distinctly not like an octopus to me. "Skull Bird"? "Jet Beast"? Suggestions?





   jamesprimate on January 26, 2015, 02:25:10 AM:

seriously this is jaw-droppingly impressive, and i dont care if im biased saying that. dat death from above eagle drop is just straight up amazing. the head movements are so smooth! RW gets a lot of talk about the life-like animation, but this bumps it up A FEW notches imho.

Quote
Oh and also, maybe we need a new name for this beast? Sky kraken was fun as a WIP name, but seriously, the finished product is looking distinctly not like an octopus to me.

SKULL VULTURE

KABUKI BUZZARD

DEATH'S HEAD CONDOR

definitely some sort of vulture thing though

reminds me a little of Wan Shi Tong from avatar, totally my favorite spirit:










   JLJac on January 26, 2015, 04:40:01 AM:

Thanks  Grin

Also James persuaded me into implementing this one thing we've been talking about, having the shadow of the creature as a warning of its approach :



I'm really happy with the result! Subtle enough, but still totally possible to notice if you're alert.

In physical reality, how things would work is that the creature would have to be like, in front of the level, behind the camera, to block the light like this. A while I was thinking about having the shadow casting creature be in another room or something, to get that. But we are awkwardly trying to make 2D and 3D work together here anyways, and sometimes the best solution is the simplest one. It struck me that what probably makes most sense from a utility perspective is that if creatures above the screen cast shadows on the level. So, maybe we'll let realism go out the window this time - just because it's such a charming detail to the actual game experience to be able to see shadows of critters above like this. And who knows, maybe when they're up there they move a bit in the z dimension to get in front of the sun, haha! Anyways, now we have this weird situation where if the creature is moving downwards, you first get the shadow, and then one screen later you get the shadow + creature. Not realistic, but it works Smiley

Technically what's going on, is that if the creature is above the screen, all of its sprites are moved down one screen height, making it reappear in the screen rect, and colored in the "shadow only" color. Simple as that! So a cool thing is that every sort of animation and behavior the creature can do, the shadow can do as well.





   JLJac on January 26, 2015, 05:14:24 AM:

That's just so visually awesome

Although the thing goes from terrifiying to clumsy in that GIF when it slams its head full-force into the platform upon swooping in :p

Good thing it has a shock-resistant protective bone casing around its head

Hahahaha dude, this is procedural animation, every creature is always clumsy as hell! I've kind of tried to make a world and creature designs that can roll with it though - like if things are a bit weird and uncanny it feels sort of correct, mood wise, that the creatures are clumsy and jerky and all that.

It looks amazing!
About the name, I'd name it Skull Vulture or simply Vulture.

Also, I'd add a few more feathers so the wings look like they can really make him fly, but that's just a small detail.

Yup, James and I discussed it, and we've decided to just call it "the vulture". The other creatures follow the same pattern of being named after whatever real life creature they resemble - snail, bat, leech, lizard. So it just makes sense for it to join them! Also vulture sounds kind of ominous without necessarily putting in a whole bunch of darkgrim words like Skull etc, haha. Also I think it has a kind of creepy quality when something has the name of something you know what it is, but is clearly something else  Who, Me?

On the number of feathers, I can tease you by telling that it's literally a variable I can set, but I deliberately set it to 16-22, I think it was ~ it'll remain a mystery how it can actually fly, I guess!  Tongue





   jamesprimate on January 26, 2015, 07:55:31 AM:

yo check dis big new kickstarter update:
https://www.kickstarter.com/projects/rain-world/project-rain-world/posts/1117067

basically summarizes the past months devlog so maaaybe not much new for hardcore thread peeps, but adds a new video and some unseen screenshots / background info  Hand Metal Right





   jamesprimate on January 26, 2015, 11:50:35 AM:

well SOME of the clumsiness is that there is no behavior AI attached, etc etc. there is still quite a bit more to do on this beast in that regard, Joar just skinned it nicely so we could present a solid kickstarter update. Same goes for the shadow, which he whipped up in like 30 minutes after i nagged him about it XD. For that amount of time it looks damn amazing haha, but yes im sure there will be some tweaking in the near future.

@cwearly: youre not too far off actually!

@christian: thanks for the backup!

its true that we dont go too much into the narrative stuff here, but thats intentional for a few reasons: first is that there is still a lot of work before that stuff is all nailed down. We still have a few gameplay mechanics that would be essential to the current narrative concept that we havent even started exploring yet. Naturally the game is evolving while we build it, so talking about the narrative aspects when entire sections of the current plan may or may not exist doesnt make much sense.

Also is that from my perspective, I really want people to go into the game fresh. (Yes, even you Chris!) For us, Rain World is a mood piece, and the experience that we are trying to create is that of a lost creature in a strange world. We DONT want you to know some things, thats the whole point Wink Joar and I were actually just having a conversation about this, where at some point we'll be at that weird point where we'll have to start choosing what to devlog about so as not to spoil too much. Probably not for a little while yet though!

Occasionally we get the physic simulator comments, and that makes sense as a HUGE part of the work that Joar is doing (literally the entire past year) is building the game engine, which is... basically a tricked out rain world physics simulator. If you are used to seeing games done from prefabbed dev toolkits perhaps its a bit slow (and believe me, from our perspective it is infinitely worse hahah), but the result is the look and animation that "is Rain World" so thats what were doing, however painful and tedious it might be  Hand Thumbs Up Right





   JLJac on January 26, 2015, 03:27:29 PM:

The alarming shadow is really nice and shows how beautifully they are rendered, but then I would take out his 'second' shadow that is right behind the creature.
Hahahaha I see your logic - if first there is the shadow with no creature, then there should be the creature with no shadow!

Having the shadow come from the bottom is not an impossible option, but it comes with a bunch of problems. Either I flip the shadow upside-down, which would look strange, or the wing flaps would be unaligned with the vertical movement. Honestly I think the current solution works alright despite not being realistic - it looks nice, and gets the relevant information across. Strict physics correctness isn't really the subject of my perfectionism. I'm way more bummed about the shadow not affecting the first few depth layers (which you probably didn't notice until I mentioned it now) and that's the thing I kept thinking about when trying to go to sleep last night... That said, if someone comes up with an amazingly slick solution that is also more realistic, I'm game  Hand Thumbs Up Right

It isn't just going to be a large physics simulator, right?
Isn't everything? Is not ... everything?





   JLJac on January 27, 2015, 04:17:18 PM:

About the double-shadow: I think it is unrealistic but honestly I think it's better to leave it as it is now for gameplay reasons (because it's good to have the "alarm" shadow but would look weird if there wasn't one behind him.

Please make the smoke semi-transparent or at least move it behind the vulture ^^

Nice KS update!

Another thing is that the shadow will be able to move around in every direction, not just down. And in that case, it kind of makes sense for the player that a downwards moving shadow signifies a downwards moving creature. And yeah, it would look weird if it didn't have a shadow behind it >___< The current situation could be explained by the creature going up and back in the z dimension a bit, I guess.

Don't really do semi-transparency, it's an art style thing. But layering it below the creatures is a good idea!

I like the way the "feathers" shrink when the wings are in tentacle mode. But I don't think they look very good when the tentacles are curving tightly. They stick out in random directions and obscure the shape of the actual tentacle.

Actually, the walking wing contour is like this:

Code:
===----------------====BODY
 |||||||
  ||||


In a very deliberate attempt to maximize the sticking out in random angles  Who, Me? Makes it look scruffy!





   jamesprimate on January 27, 2015, 05:11:57 PM:

I'm advocating for a little clumsiness and reckless abandon in its movement and pursuit behaviors.  I love the fact that he slams into the side of that platform in one of the gifs.  Rain world is full of stuff that's gonna get in its way -- it's huge and fast and it shouldn't give a crap.

 Hand Thumbs Up Right Hand Thumbs Up Right Hand Thumbs Up Right





   JLJac on January 28, 2015, 01:04:35 AM:

Update 388

Made the vulture able to snap after prey, and carry it. Also lifted the utility comparison engine from living in the lizard only to being general, and applied it in the vulture.

The current AI layout is as such:

At the very top, there's the ArtificialIntelligence class, which has basically nothing going on in it except an empty list of modules. A specific creature AI inherits from ArtificialIntelligence, such as LizardAI : ArtificialIntelligence.

The first thing such a creature specific AI does is to start firing up a bunch of modules. In the case of the lizard, no less than these:



Vulture will likely have the same set, maybe except from Threat Tracker as it's pretty much an alpha predator and I don't know if it would even need to bother to look over its shoulder.

What's new since last time is that now the Utility Tracker lives as a module alongside the other modules. The Utility Tracker keeps references to the other modules it's been told to keep an eye on, and every frame it asks them for their Utility.

Utility is a value between 0 and 1, which is the AI module reporting back how urgent it is to do the thing that that AI module is responsible of. If the threat tracker returns a 1, get to cover! If the rain tracker returns a 0.7, time to start heading home. Prey tracker returning 0.9, there's some juicy prey close by and you should seriously consider the hunting behavior.

Utility Tracker keeps track of these, and do some smoothing and tweening on the values as well, to keep stuff more organic. It also applies a conservative bias (ie whatever is currently being done should get a little bonus, to keep the creature from flickering between behaviors) and similar neat things.

Every frame, the main AI script can simply ask the Utility Tracker for which module is reporting most urgency this frame, and then act accordingly.

Not all AI modules are hooked up to the Utility Tracker - for example the Path Finder is never really urgently calling for some decision, it's more of a means to an end.

This system is now up and running in both the lizard and the vulture, and seems to be working in both places. The vulture only has Path Finder, Utility Tracker and Prey Tracker at the moment, meaning that it'll spend each frame comparing the utility of doing nothing to the utility of hunting a prey, if it has seen one. So yeah, still some stuff that's gotta happen there. But basically not anything the lizard isn't already doing, so I don't expect it to be too troublesome.

Hunting behavior (except from the flying outside the room / between rooms part) is pretty much down already though, as it's basically all happening in the interaction between path finder, prey tracker and the actual body's locomotion engine stuff. I've already run around with the vulture and several lizards, and seen it pick its prey, hunt for a bit, change its mind to something closer, etc.

The actual snapping looks like this right now:



It's a little lameish, but when I went all out with body motion and neck extension etc the range became too big, and it was just impossible. Maybe it doesn't need a super power attack, but this little peck can do quite well... At least for now.

Also, since actually making it able to catch you I've started tweaking speed etc to make the challenge reasonable. It's difficult to tell, because it's a very big difference in what's "reasonable challenge" when you're just testing in a room and can restart every 11 seconds, and when you've invested 6 minutes since the last save point in single player and really, really, really want to stay alive.

This is also the biggest liability with this enemy I think - because it's so big, and a climbing enemy, its speed becomes a bit unreliable. Whether or not it can find suitable grips when climbing makes the entire difference between it traversing the screen in three mighty strides and snatching you up before you know what hit you, and it fumbling for a good climbing route for 15 seconds while you take your time to leave. There's of course work that can be done to even that out - most notably having it switch to flight when climbing is not a good option, but also by clamping the max speed a little, etc.

Apart from the AI implementation, which I think is gonna pick up big time tomorrow when the modules go in one after the other, there's the big issue of flight. James and I had a talk about some of the design issues that needed addressing today, and now I just have to go do the technical implementations. Haha. Path finding, here I come!





   jamesprimate on January 28, 2015, 04:03:23 AM:

psychic developer debug powers!  Wizard

the peck animation is great, looks very natural and bird-like. its probably good to have that rather than another big dramatic lunge, as the vulture is already pretty dramatic as it is. makes it feel a little more like a hungry bird than FLYING DEATH SKULL BEAST. we want both of course, but nice touch to balance that mood just a little





   jamesprimate on January 28, 2015, 03:10:05 PM:


halfway though http://forums.tigsource.com/index.php?topic=25183.2540





   JLJac on January 29, 2015, 04:14:20 AM:

Update 389
Today I've been doing two things, but neither really to a place where I have much to show, sorry! First one is that I've started on the "sky highway" - a way for flying creatures to teleport between rooms. The first step was to identify the room borders, which is now done - next step is going to be having the abstract world map understand these room exits as Nodes, similarly to exits and dens. This is a journey through the absolutely murkiest parts of the rain world engine - the stuff that has to do with path finding, AI prebaking and interaction between the game and the level text files, so it's gonna be trouble for sure. But maybe it's as well that I go in there and renew my understanding of how that stuff works, or I might forget it completely.

The other thing is tiles! For once I want to have some margin, and do the tiles for the next area before James is already halfway through it, so I've gotten started on that.





   JLJac on January 30, 2015, 07:07:25 PM:

Yeah, originally I had the color gradient the other way around, so that it came out black and then got lighter, which was nice because it created a fade-y sort of effect without actually using alpha. But then I switched it, because I wanted the smoke to be more visible. All of this cosmetic stuff is super subject to change. I just had to make some decisions to get the gifs together for the kickstarter update.

Programming question:
The sky highway stuff meant I had to mess around with the AI prebaking a bit again, and when I'm in there I thought I might as well add a thing I've been wanting for when doing some of the critters' AI.

Basically what I'm after is a map that describes how many tiles are visible from each tile. I want this because if you have for example a predator hanging out in a room, somewhat idly looking for prey, it makes sense for it to chill in some high up place where it can see a lot of its surroundings should something pass by. Contrary, a sneaky or scared creature that wants to lose a predator hunting it should probably gravitate towards narrow corridors and sheltered areas.

The brute force to do this is simple: We're at tile (x, y). From here, we do a ray trace to every other tile in the room - if it's visible, we increment a value, otherwise not. Then we move on to (x+1, y), repeat.

This seems pretty wasteful though, because once we've hit a tile we already know that none of the tiles behind it will be visible either. I know that many roguelikes do this exact sort of thing with their field of view algorithms, so I'm gonna look at what the roguelike people have to say about it. But if any of you have some article or tutorial that's just perfect, please point me to it!  Hand Thumbs Up Right





   JLJac on January 30, 2015, 09:16:34 PM:

Update 390

Figured it out, I think!



Really happy to have those visibility maps. It will add a lot of character to be able to define whether a creature lurks in the shadows, or overlooks its territory from above.

Right now the algorithm gives the top side of high up platforms low visibility, which makes sense if you only consider visibility from other tiles inside the room. The vulture hunts from above and outside the level though, and it does seem a little weird for creatures to hide on top of stuff even if there aren't vultures around - the AI behaviors should perhaps act as if there was actually a world outside of the tiny little enclosed room as well. So I might add some kind of from above bias to get rid of that. I'll just see what the behaviors actually look like first.





   JLJac on February 01, 2015, 10:22:37 PM:

Hey Joar, where should I start if I want to be as smart as you someday?  Who, Me?

Aw you! But in all seriousness though, eat your vitamins and worship Cthulhu.

Visibility map = a sort of ambient occlusion without distance weighting ...

... that's an interesting concept, also reminiscent of distance map

... just that "shape" of the map is something a bit different

Ah so that's how ambient occlusion works! Makes sense! What's a distance map though? (google only gives me nonsense)

Programming question: (which is more about like, what's good practice rather than solving a problem)
Ok, so I'm redoing some architecture of the "abstract space" part of the game to make way for "sky highway", and in the process I'm tidying up a bit to make room for further such adjustments down the line, because there's gonna be something.

Previously an abstract room had "nodes", each node represented either a room exit or a creature den. Now I've added new types of nodes, such as bat hives and sky highway nodes. This means that now there are different amounts of nodes in each room depending on which creature is asking - no other critters than bats should care about bat hives, for example.

So, all the nodes are sitting in a list, labeled 0, 1, 2 etc. When critters access this list though, they use creature specific labels, because to some of the critters some of the nodes don't exist.

Sooooooo basically I have "global" node indexes and "creature specific" node indexes, and a method to convert between them. They're just integers, and I'm suuuuuper prone to mixing them up all the time. I name some variable "nodeIndex" thinking that it's totally obvious which of the two types it is, but then feed it into the wrong method etc etc.

So I had this idea, that I would create two structs, each containing only an integer, GlobalNodeIndex and SpecificNodeIndex or something like that. A conversion method would be the only place to change between them, and all methods could specify and enforce which one they wanted.

Is this a cool idea? Do people do stuff like that? It's obviously not as fast as just going with ints, but it's not really performance critical code anyways.





   JLJac on February 03, 2015, 03:55:17 AM:

@Gimym JIMBERT, ah yeah, I do that too! I call it "terrain proximity map" though, which might be a more cumbersome name, idk. Direction? You can get the direction towards/away from any point by just checking the neighbors, right? Or you're talking about something else?

Well, to me, and I'm sorry for being stupid in advance, this sounds like a simple mapping problem. If your generalNodeList always is a superset of the creatureSpecificNodeList and you are using arrays to store the lists (which I've concluded from: "So, all the nodes are sitting in a list, labeled 0, 1, 2 etc.").

consider this example:
Superset (Exit, Den, Bat Hive, Skyway):
[ E E D E D B B E S E D S ] ( = globalNodes )
And you want to get a reduced set for bats for example like
[ E E D E D B B E E D ] ( = creatureSpecificNodes )

in that case you could just infer the index by just using a mapping of the indices via
[ 0 1 2 3 4 5 6 7 9 10 ] ( = creatureTypeMapping )
so that globalNodes[creatureSpecificIndex] becomes globaNodes[creatureTypeMapping[creatureSpecificIndex]].

So your functions would look like
Node getNode(int creatureSpecificIndex, type creatureType) instead of
Node getNode(int globalIndex)

and based on the creatureType given, you'd use a different creatureTypeMapping array.
Shocked Facepalm Thaaaaaat's how you solve it! Ok, really good to know. Thanks a lot  Grin

Update 391
I've gotten the pathfinder to make paths through the sky highway! So we're getting there. Right now I'm struggling with getting the creature to actually follow the path though. Here's a cautionary tale for children considering game development - this is the stuff you're gonna deal with!

The problem is making the creature follow the path into the room from outside it.



Path finder works goal to start. If the creature is outside of the room, its "path finding position" is moved to the edge of the room (pathfinder needs tiles to work with). Ie the pathfinder works as if the creature is actually in the room. The path moves towards the creature as shown, and when it reaches the edge it goes into the "sky node". Then the creature tries to follow a path, by looking at all the neighbors of "start". The only one that has a fresh path is the sky node! So it decides to go up instead of down.

Hmmm... I'll figure something out. This looks like it has many potential solutions. The struggle continues.





   JLJac on February 04, 2015, 12:51:38 AM:

Hmmmm.... That sounds similar to the Dijkstra maps I've got going! In most situations I think directions can be derived from asking the neighbors about their values, and don't need to be saved in their own right, but in more complex cases I can totally see it. With visibility for example - saving which direction the visibility "comes from" could be used to have an NPC guard in a sensible direction in a shooter (facing out towards the landscape, not in towards a corner). Haven't really come across much stuff like that though, the single dimension data has been working just fine.

Update 392
Ugh, path finding. A solution to yesterday's problem was to check along the edge and picking the tile with the freshest path, then using that one as "start".

By today I have the inter-room paths generate somewhat reliably, and the critter can also follow them. It all works out except that some kind of ghost of yesterday's problem lives on, sometimes the creature can't find its way into the map. This is the part that should be simple  Tired

I think it'll be possible to do some ugly hack though, and by now I really feel like it. Maybe just force the creature to move towards the map if the destination point is inside the map, no matter what.

Once that's figured out, there remains one thing - having the abstract path finder be able to go by the sky highways as well. That shouldn't be too bad, but you really never know. Hope we'll be out of this marsh by tomorrow.





   jamesprimate on February 04, 2015, 05:34:05 PM:

Woo woo! Rain World just won TIGSource "Best Devlog 2014" and 2nd for "Favorite Devlog 2014". Thanks to everyone who voted and congrats to Moonman, CRAWL and Return of the Obra Dinn for winning as well! All the games listed are totally awesome and everybody should check them out! http://forums.tigsource.com/index.php?topic=44807.100



And three cheers to Eigen for putting it all together  Toast Right Toast Right Toast Right