—    —  Home

   jamesprimate on April 06, 2015, 05:47:27 PM:

Second player support hasn't really been added yet, just spawning the 2nd Slugcat for testing purposes. It's completely "broken" as a game mode for now. If everything goes to plan, the next build will be more multiplayer focused, so that would probably happen then. But yes, obviously we plan for all players to be able to use gamepads. Still a way to go between now and then though.

2 player is pretty fun though right?? Even totally broken  Gomez Gomez





   JLJac on April 07, 2015, 12:04:01 PM:

I'm spending two days in Boston with James, and we've been doing some important work on mapping out the world, discussing how you will progress through the game etc. But, not a lot of the standard solitary work we usually do, i.e. levels and programming. Will get back to that as soon as I arrive in Sweden! So more updates to come soon, but we apologize for the lack of updates the last couple of days  Hand Thumbs Up Right





   JLJac on April 08, 2015, 07:09:01 AM:

Update 412
A plane is not the best working environment for deep focus-stuff, but it works for some easier things, so I decided to move forward a bit with a few things we've discussed. The big thing is the "adrenaline" system, where the player can get a speed/jump/general agility boost. I started on an implementation of that, but it's not done and also we still don't really have a super solid idea for how it should be triggered, so I'm going to wait with that a bit. One thing we want to do is to make the adrenaline rush somehow connected to catching bats, so they feel actually useful and hunting them isn't a complete shore. However I'm not super keen on the idea of getting the rush immediately when catching the bats, because I want the rush fairly short and it's not at all certain that it will be contextually useful in the exact moment you happen to get a bat. One idea is that for each bat you catch (or for each 3 bats, or whatever) you gain a Rush, and then you can somehow activate that Rush at a later point, without losing the bats in terms of food. This idea seems to make sense, but I don't know what would be a good way to trigger it. Currently the game uses only two buttons, and I'm hesitant to add a third for this single purpose, there should be something more elegant. It could fire automatically when a predator gets close, but I can totally see how that could be frustrating. So yeah, some more design thinking needed.

But, I got some new moves in!

Belly slide:



This is basically a more daring alternative to the backflip for when a lizard is between you and where you want to go. The main difference is that where the backflip takes you over the head of a lizard chasing you from behind, this is useful for getting past a lizard you're running towards. The game needs more moves that aren't jumps, as basically all you've been able to do so far is jumping in different ways, and I hope this one can start to fill out that niche.

Then there are also a few new moves for the maze parts of the game. Originally Rain World was supposed to be 50/50 platforming and crawling in mazes, but we gravitated away from that as the platforming was simply more fun. Part of the reason for that was probably that in the mazes you had nothing else to do than move in 4 directions. The game will never go back to 50/50, but James wants to re-introduce a bit of maze crawling for one or two of the regions, and hopefully this new move set will make that more exciting. Testing in a room that's only narrow corridors with a bunch of lizards has yielded hopeful results - it's a fundamentally different game, with a lower tempo and more focused on sneaking and thinking ahead, but it can get pretty tense as well!

First up we have two vertical moves. Hitting up+jump will make the slugcat heave itself upwards quickly a few tiles, after which you face a bit of a slowdown penalty, which is supposed to make the average vertical speed somewhat break even. This is supposed to be useful in situations where you quickly want to get up and around a corner to get out of the field of vision of some creature. It is also useful when getting up to a ledge where you can switch to running or some other "non-crawling" means of locomotion, because when switching you can sort of bypass the penalty and get a little speed boost. The other move was suggested by ~~ I think it was Christian, and is something very natural I can't believe I didn't think of myself - the slugcat just stops pressing against the walls and drops down a chute. You trigger it by pressing down+jump, and the slugcat will continue falling for as long as you hold the down button. When adding NPC hearing (which should happen soon!) you should probably make an audible sound if you hit the bottom of the chute without grabbing on to the walls first, as a risk-reward balance for the speed gain you get.



Then we have a much requested feature - the ability to turn around in a narrow corridor. You do this by hitting the opposite direction button + jump, or up+jump if you're upside down in a vertical chute. I've intentionally made this move super awkward, as it is actually sort of too cramped for the slugcat to move around in there, and you shouldn't go butt-first into corridors to begin with  Evil That being my main philosophy haha, I can still totally see how there are some situations where you're alone in a room with no lizards, and end up facing the wrong way in a corridor that goes on foreeeeeever, and it's just tedious. So here it is, at least it's possible now.



Last one is a horizontal "shuffle", triggered simply by pressing forward+jump. This one takes some skill though - if you just press jump at any place in a horizontal corridor, you get a pathetic little forward trust followed by a slowdown penalty that makes your net speed pretty much not break even. However, if you have solid terrain behind you as you hit the button, you get a good forward momentum with just a small penalty at the end. Basically the slugcat needs a solid block to push against. This one is especially useful when coming around a corner into a horizontal corridor, like so:



Oh, and also, now I'm home, so I'll get to skinning the cicada! See you tomorrow!





   JLJac on April 08, 2015, 07:41:36 AM:

Segmented or plain? (All colors just mockups, tentacles will be procedural but I just drew something in there to get a feel for it, no wings yet)



The segmented looks cool, but the RW art style is a lot about flat colors. Also the finer aspects of the pixel art will likely get pretty mashed when things start to rotate...





   jamesprimate on April 08, 2015, 11:14:51 AM:

wow that was a productive plane ride! everything looks suuuuuper good too Hand Clap Hand Clap Hand Clap






   JLJac on April 08, 2015, 12:16:41 PM:

Hm, 3 votes for plain, 3 for segmented... Maybe some more subtle pattern instead? The segmentation looks cool, but is a tad too visually busy in my opinion. I'll experiment with third options. Some changing pattern would be cool, but this is a pretty small creature that I don't know if it could make it justice, better do that on some larger beastie. Also I have some other plans for shader stuff with this one, and don't want to go totally overboard with the shaders.

Also will there be any co-op only moves?
Interesting idea!

So, just a brief suggestion. Something I noticed in the alpha is that there ARE multiple dens, but when you are well fed, and sleep in them after the rain, you still spawn in the original one. Could you put some kind of rough "save" system in place for the next alpha?

Also, for the cicada, segmented for sure. More "insect-like" over "squid-like". The thing already reminds me of some kind of alien mind probe, making it look more like a squid definitely heightens that impression.

Yeah the current alpha saves no progress at all. Trust us, when we've finished the game the game will be finished lol, it's just taking us a while to get there  Who, Me? Don't want to make too many promises, but I think the next alpha might have some more actual game infra structure set up, contrary to this "run around and see the creatures" sandbox we have now  Hand Thumbs Up Right Noted on the squid/cicada balance.

Given the size, I'd say plain, but if they come in really large flocks that might "blob" together you might need some sort of segment or panel along the sides to help distinguish the outlines of individuals. If you need visual interest, perhaps an occasional vertical pulse of colour along the body?
Hm yeah, the contrary argument would be that a flocking creature should perhaps be less visually busy? If I remember correctly, zebras have their stripes so the hordes turns into visual noise right?





   JLJac on April 08, 2015, 12:29:23 PM:

How about this?






   jamesprimate on April 08, 2015, 01:11:10 PM (Last Edit: April 08, 2015, 01:20:37 PM):

^^^^ into that. Christian knows whats up

oh also there was some talk about having 2 classes of cicadas, one that stay around cicada nests and one that hunts, so perhaps that could come into play with the patterning as well.





   JLJac on April 08, 2015, 11:10:15 PM:

Regarding adrenaline rush: the trigger could be the down button when you are already crouching/crawling. It's a common "charge" button in platformer games, and visually It could be like a cat tightening its muscles and arching its back, readying itself to pounce. It would still need some way to let the player know clearly when and if the adrenaline rush is available. Simply not allowing the slugcat to enter such a "ready" state might be a bit confusing to players.
Yep, was thinking along those lines as well. There could be a sound while holding the button that increases in pitch or something, so you hear that some sort of charging is going on, and then a sound cue when you actually reach the adrenaline stuff. I have a bit of a palette change when in adrenaline mode, the palette is desaturated a bit, so you should be able to understand when it has actually happened.

Problem is that you'd most likely want to activate it in the middle of a hectic situation where you don't have the time to sit down for 2 seconds. That could be an interesting risk/reward factor perhaps, you have to try to estimate if the situation will be dangerous and activate the adrenaline before going in. However I don't want it to be frustrating because you feel that you waste all of your charges and never get to use them when you'd actually want to.

I disagree. I think the fall should continue as long as the jump button pressed. That way the continuous descend with a few short drops is achieved with continuous press of down with a few jump taps. That would be a more natural solution.
Good idea, I'll try this out and see what works best  Hand Thumbs Up Right


This is a good look!

Procedural is cool, but I don't really know if it fits for a swarming creature? Bees etc all look the same, if they had their individual patterns they wouldn't really look like social insects, more like a haphazard band of bandits. That would be really cool for the yellow lizards though, which are also lizards so it'll come really easily. For these I think subtle color and size variations will probably be enough. Also... I've got to get a move on  Who, Me?

I've drawn it in 9 angles now, and think it's looking quite good:



Smaller than you think looking at it in scale 1:1!

I think I'm gonna roll plain, they already have quite a lot going on visually towards the bottom of the shape, and the wings will fold up over the body when sitting to add some interesting stuff there as well. RW's art style is heavily dependent on flat color surfaces, so I don't want to do too much with patterns etc on small critters like this or the pixels will become jumbled. For a larger creature like the vulture that would be really cool though - when doing the individual stuff for the vulture I'll def look into some random patterns.






   jamesprimate on April 09, 2015, 10:59:42 AM:

as much as i love the concept, the diagetic UI question always seems to create significantly more problems than it solves. Just for the sake of testing, Joar did a UI mockup of something simple and abstract, which really fits the aesthetic style and conveys all the game info pretty much flawlessly at a glance (even for multiplayer!)

I think were going to hold out on it for a bit just in case a seamless in-game solution falls in our laps, but its nice to have a solid backup plan all ready to go  Hand Thumbs Up Right





   JLJac on April 10, 2015, 11:41:11 AM:

An inbetween solution might be tying the "ready state" to predator proximity while still having the mode be manually triggered. The adrenaline charges up automatically the closer a predator is. That way you get an audio-visual cue that you have a charge, are also able to trigger adrenaline mode during a more hectic situation, and the mode replicates the kind of tension the player is likely to be feeling. You've mentioned having the music tied to "threat level" - perhaps this could work a similar way?

This seems intuitive, but it'd still require some sort of button press from the player right? In that case, why not have the ability to trigger available at all times?

Though I'm all for having a purely diegetic UI, I'm inclined to agree, now that how many bats you eat means two different things (unless you don't necessarily care if the player knows exactly how many charges they have left). Perhaps a menu button that brings up a HUD with the two rows of dots? That way checking your status is a deliberate action to pause the game and take stock, rather than being part of your ongoing experience.

Yeah, as the game is getting more complex it's more and more difficult to keep UI out while keeping it understandable. Two rows of dots would do a lot, and as you say they wouldn't have to be on-screen at all times. Don't want to add buttons, but you could for example make it so that UI only appears after standing still a second, or when something changes (bat caught, lost etc).

If no. of bats eaten = no. of adrenaline boosts available, then at this point I think you have to have some UI to keep track of things. Even if it's just two rows of dots. It's too much information to communicate indirectly.

Another possibility is that you get more adrenaline time the more bats you eat, but upon triggering the adrenaline you always use them all... We're going to have to try out a few configurations and see what works.

Oh oh oh... or, if you protect a lizard from enough creatures, it would not just become neutral, but would actively befriend you, and protect you from other creatures. Imagine turning an enemy into an ally through persistent acts of kindness! Isn't that sort of how wolves became dogs?

I'd like to see this, yes! Once I get around to the dynamic relationships it should be totally possible!





   JLJac on April 10, 2015, 11:58:29 AM:

Update 413

Cicadas skinned!

An insane amount of work went in to this, and I'm pretty much done, but probably not entirely done. We have folding wings, grabbing tentacles, etc etc etc ...

Interacting with player:



Hanging out:



The cicadas are the only RW creature so far that is explicitly gendered. I won't decide on which is male and which is female, but they come in two varietys, let's call them gender A and gender B. A colony has about 50/50 of them, unless we decide to change that because of game balance stuff. A are white and a bit larger, and stay to protect the colony during a cycle. They'll hunt bats that are stupid enough to actually enter the cicada hive, but won't go out of their way. B are black and a bit smaller, these are the ones that migrate to bat swarming areas to catch food. These are likely the ones you'll encounter first, as they occur out and about contrary to just inside the hive.

Slow motion flying:



Parts of the cosmetics are individual as usual, one of those factors are wing length, where I think I might have gone a bit over board - some have huge wings and some tiny. I'll tighten up the bell curve a bit there. Some of them have a busted wing as well, which will just hang passively.

Cicada jumping:



The player actually holds on to two of the tentacles haha!

And a bonus one, white lizard catching a cicada:






   JLJac on April 11, 2015, 09:18:47 AM:

ty ty ty! Excited for these myself!

@theEasternDragon, having them curl the tentacles would feel sorta like a waste, you'd agree with me if you spent 3 hours doing the dangly physics  Cheesy They do curl them up when carrying bats though. The stuff on their head is a shield or plate of some kind, assumedly the same material as the wings.

@tortoiseandcrow thanks! The interaction is probably just a bump together, but keep projecting, that's how the magic happens haha! White ones are slightly heavier than black ones, and they have a little bit different behavior when annoying you, but the biggest difference is in how they hunt. The black ones do migrate from a cicada room to a bat swarm room during the cycle, you can see them going back and forth if you come across one of their routes.

Both buttons at the same time seems viable, the only problem is that holding the jump button makes you jump higher, and it's quite common to want to throw something as you're jumping... Taming of creatures will actually not be all that difficult, I predict, once the Dynamic Relationships are in.

Update 415

Dynamic relationships! What is this thing I'm doing? Basically in the old set-up, I wrote the AI with a sort of limited idea about the sort of interactions I'd want to implement down the line. I though of creature relationships as static, one always eat the other, the other always flee. In that system it made sense to make it so that upon spotting another creature the first time, the AI takes a look at the relationship to that creature, and hands it off to a dedicated AI module to take care of it. If the relationship is "Eats" the creature gets sorted into the PreyTracker, if the relationship is "AfraidOf" it's dedicated to the ThreatTracker, etc.

This system is very limited, so what I've been doing today is writing a RelationshipTracker, which re-evaluates the relationships to other creatures frame-by-frame, and if the relationship changes it sorts it into the correct module. Sounds easy, but there's a lot going on. Basically each module lives its own life, deleting and shuffling the creatures it keeps track of as it wants. So I have to make sure that if a relationship is moved, it's properly removed where it was, properly added where it should be, and so on. The good part is that this has solved some other problems that were hanging around, such as creatures sometimes forgetting about threats they haven't seen in a while and then being unable to add them back, and the like.



The main tracker in a RW creature's AI is simply called the Tracker. This one basically keeps track of what creatures I know of, and where I think they might currently be (a notion that might be correct if I'm currently looking at them, and various degrees of incorrect if it was a while since I saw them). Each creature I know of has a representation in the Tracker, and this is sort of the UR representation for that creature, other modules refer to this one when thinking about a creature.

Other trackers such as PreyTracker and ThreatTracker has a reference to the creature representation in the Tracker, as well as some other module-specific data regarding that creature, such as how yummy it looks or whatever might be relevant.

The relationship tracker keeps goes through the representations in the Tracker, asks the AI what relationship it currently has to the creature in question, and if necessary moves stuff around to where they're supposed to be. For example, if I am only hunting the slugcat within a specific area, but the slugcat just exited that area, the slugcat representation needs to move from my PreyTracker to some other module.

This stuff is all pretty much just logistics. The cool stuff is an "internal state" for each tracked creature that is kept inside the RelationshipTracker. An internal state is a mini data structure which keeps track of some relevant stuff. Let's make a simple example: I'm a cicada - I want to cause a slugcat trouble. Unless the slugcat is holding a spear, in which case I want to get away.

So the slugcat is on the ground, no spear, and its representation in my cicada head is comfortably within my AgressionTracker. Now the slugcat runs over and picks up the spear. Now the thing is that we're doing this thing where RW creature don't know what they can't know. So say that the spear and the slugcat are out of my sight as the weapon is equipped. Every frame I (the cicada) ask my RelationshipTracker what relationship I have to the slugcat. The RelationshipTracker can't access the data about whether or not the slugcat is holding a spear directly, it has to go ask the internal state representing the slugcat. The internal state has a bool which represents the slugcat holding a spear or not.

As I still think that the slugcat is unarmed, I'll continue to go after it. Until I come around a corner - then I suddenly have a visual on the slugcat, and the internal state is allowed to correct itself. The bool changes, and with this new information the nature of our inter-creature relationship shifts. The RelationshipTracker takes care of it, moves the slugcat to my ThreatTracker, and I can start scramming.

That's the theory, now let's take a look!



So notice how the cicada is harassing the player, until the player is armed, then it decides to get out of there. The player then goes underground and actually throws the spear and is not armed any more, but because the cicada can't see this it's state of fear is unchanged. The next time it saw the player it would reconsider. This is the sort of stuff that makes me all warm inside  Shrug

The system seems to be working, the only thing that's needed now is to migrate it to the vulture and lizard as well. The other creatures use simpler AI's that won't really need this level of complexity.

I have this policy that I'll tell what I've done, not what I hope to do, but you can probably imagine the possibilities yourself. Social stuff such as befriending creatures, angering creatures, creatures reacting dynamically to different situations like trying to save their friends from the jaws of a lizard, etc.





   JLJac on April 11, 2015, 12:05:35 PM:

Don't worry guys I'm not making lizard tamer 2000 - also the spear/cicada thing wasn't really the thing I wanted to show, I just wanted to give an example to show of the Dynamic Relationships. James says I'm always focusing on structure rather than content, but haha here we go again ~ the thing I've been talking about the last couple of days isn't the specific examples I've brought up, it's about the infrastructure: Now a creature can re-evaluate its relationships to other creatures depending on context. There's an infinity of possibilities that can come from this, and when I start adding this actual "content" I'll be more artful about what goes in and what doesn't, promise!

On befriending a lizard specifically, this is more of a fun idea than a serious suggestion for a common game mechanic. I'm interested in procedural narratives, and I'm interested in what can happen rather than what will happen most of the times. Think of dwarf fortress - the "story" of the game springs from its actual mechanics and its procedural elements, and once in a while something weird happens. If a lizard becoming friendly becomes a thing, that's something that would require a veeeeery specific combination of that particular lizard's personality traits and a super unusual situation - think of it as something that could happen once in a thousand play-throughs and which you'll have to post videos of to actually prove to people that it happened, rather than a game mechanic to fall back on!





   jamesprimate on April 11, 2015, 03:19:58 PM:

Idk, lizard friendship simulator 2015 seems pretty good  Hand Thumbs Up Right





   JLJac on April 12, 2015, 12:01:43 PM:

Update 416

Gotten started on audio implementation. I have a pretty solid idea about how to do it now, I think. I have a text file where all the sound triggers are named, and then you can put down the name of the sample to be played at that trigger. This means that I can just set up the triggers and then send it over to James for him to actually work out what samples should go where, and tune them entirely on his end.

Under the hood I have a system where each sound trigger is represented in a enum, and the enum can be cast into an int which refers to a position in a list where the sound to be played is. I use this system because I think we'll be playing a lot of little sounds, and I don't want to have the code repeat through any sort of list to look for samples. This way, the trigger inherently holds the "address" to the correct sample, and the sound engine can just go and fetch it. From my understanding this doesn't do any implicit repeats through lists after compilation, as the enum-int transition is just about changing the data type of a variable.

I have some sounds playing, and a basic sound engine working already. I can play a "disembodied" sound which comes from anywhere and has a set pan/volume, and now I'm working on sounds that are played within the actual world and which are tied to a "Virtual Microphone", which has a position within the game world and changes the volume/pan according to the sound sources' relative position to it.

Things are moving along well enough! The only problem I have so far is that Unity's volume control for samples seems really weird. Between 10% and 100% volume I can barely hear any difference, and pretty much the entire scale is squeezed together between 0% and 10%. I can sort of hack around this problem by just doing a Pow operation on the volume with an exponent of 3 or something, but it puzzles me. Does anyone know anything about this?  Who, Me?






   jamesprimate on April 12, 2015, 12:51:50 PM:

had full sound/music/sfx in the lingo build, so everything is ready to go. just hadn't bothered putting it in the new version yet. the futile framework joar is using doesnt use unity's sound engine, and futile's native sound engine BLOWS, so we had a friend working on a custom sound engine code / extensions. It just came out of the oven a few weeks ago actually. Big shoutout to Garrett from Neon Deity Games for all the help!  Beer!





   JLJac on April 13, 2015, 08:03:32 AM:

The game hasn't had any sound before now? Huh?

 Who, Me? Who, Me? Who, Me? Who, Me? Who, Me?

Things are moving along well enough! The only problem I have so far is that Unity's volume control for samples seems really weird. Between 10% and 100% volume I can barely hear any difference, and pretty much the entire scale is squeezed together between 0% and 10%. I can sort of hack around this problem by just doing a Pow operation on the volume with an exponent of 3 or something, but it puzzles me. Does anyone know anything about this?  Who, Me?
Sounds like what happens when sound is scaled linearly instead of logarithmically. http://en.wikipedia.org/wiki/Weber%E2%80%93Fechner_law#The_case_of_sound

This seems reasonable! Why would it work like that though? My bypass sort of works, so I'm just rolling with that now, but it still weirds me out.

Today I've been working more on the sound engine, which seems to be working in about every way I want it to work now, except from playing ambient sounds and music. It does play samples though, and the samples can be attached to an object in the game, assigned a static position, or just played as a "disembodied" sound which has a pan assigned.

On top of that I've been writing this sort of intricate input syntax for James to use when putting the sound in the game. What it's basically about is that all the sound triggers are named in a text file, and by writing some simple instructions James can tell the game what to do sound-wise on that trigger. The system can do stuff such as randomizing pitch or volume within an interval, pick a random sample from a list, play multiple samples at different volumes at once, etc etc.

Now the task at hand is basically just to place a trillion sound triggers in the code. At first my method was to scroll through the code and try to come up with sound triggers to put in there, but that was not very effective so now I've switched the process around, and write a list of whatever sounds I can think of first, and then try to find where in the code the trigger should go. Lots of work. I don't think I'll actually attempt to place ALL the triggers before sending it over to James, but I want to have a good chunk in.





   JLJac on April 14, 2015, 11:19:37 AM:

@NicoM, yup most of this stuff is totally learnable if you're ready to walk through the shadow of the valley of utter frustration :D That said, I do get things to work, but I don't get them to work smoothly and within slick general frameworks as someone knowing what they're doing would. So hacking on until you get there is totally a good method if you're the only programmer on your project, but I think the code that comes out of it would be an issue if you're many people on the team. I've seen your game and I love love love the art  Kiss Looking sooo awesome!

@Polyflare, wow, okay, that was informative! I had no idea... Thanks so much! I'll try and see if I can implement a similar solution Smiley Toast Right

In work news, placing sound triggers placing sound triggers placing sound triggers. This is my job now, I guess. But you know what, I'm actually going to power through and place them all tonight! There, I promised I'd do it on the internet, so no turning back now!





   JLJac on April 15, 2015, 09:46:08 AM:

Update 417
After placing a million sound triggers, I'm taking another(final?) dive in the level editor. This time to allow for the placement of decals - pieces of custom terrain coloration.

Rain world has been a rather monochrome place, and it will continue to be so. However, we want to be able to spice up the occasional room with some color. This editor allows you to place art that is rendered into the environment as two dimensional color on the surfaces of the objects in the world.



Note - not a scene from the game, just me trying out the coloration tech.

Still a few things to figure out. For example, the slight oily effect at slanted surfaces seems to have disappeared, I'll have to find where it went. Another challenge is to make the system backwards compatible. I want the shader to be able to process a level from the pre-decal era and just not render any decals, rather than being messed up somehow. If it can't do that, we'd have to re-render all the 200 or so rooms we currently have, which would be a bad spot. Seems like I'll be able to avoid that though  Hand Thumbs Up Right