—    —  Home

   jamesprimate on February 25, 2015, 06:20:39 PM:


This game is begging for a sandbox vivarium mode, where you can just spawn different creatures and watch them interact

sandbox mode was a big part of the lingo, where it overlapped with multiplayer: you would choose a game mode, room, number of players and what lizards you would play against, etc. so we definitely want to make that a big part of the game! the concept were running with now is tying all that it in to the single player game progression, so as you go through the game you can unlock additional rooms / creatures / etc to add to the sandbox/multiplayer mode.





   JLJac on February 25, 2015, 06:27:46 PM:

Another pretty fun thing I've been doing sometimes when developing is "documentary mode", where I just tie the camera to some creature other than the player, and follow it during its cycle. You can see it hunt, catch prey, bring the pray back, etc. Maybe that could be made into a screensaver or something - if you're okay with a screensaver that runs your processor on turbo and has the fan sound like a jet engine is sitting on your desk.





   JLJac on February 25, 2015, 06:41:41 PM (Last Edit: February 25, 2015, 09:06:22 PM):

@prinsessa, actually rather than digging up the paper it's considerably easier for me to just post my source code for the water stuff, so here you go! Might help out some other people too:


    

Code:
public class Water(){
//These are the parameters used by the surface simulation. Expect to spend at least a day tuning them haha
     float   dx = 0.0005f * 20f;
     float   dt = 0.0045f;
     float   C = 1f;
     float   R = C * dt / dx;


     surface = new SurfacePoint[100];
     for(int i = 0; i < surface.Length; i++)
         surface[i] = new SurfacePoint();
}


public class SurfacePoint
{
   height = 0f;
   lastHeight = 0f;
   nextHeight = 0f;
   public SurfacePoint()
   {
   }
}

public Update(){
 float averageHeight = 0f;

        for (int i = 0; i < surface.Length; i++) {

            //This here is the fancy math from the paper, which I don't claim to understand in the slightest :P
            if (i == 0) { //special case first point
                surface[i].nextHeight =
                  (2f * surface[i].height + (R - 1f) * surface[i].lastHeight +
                  2f * Mathf.Pow(R, 2f) *
                  (surface[i + 1].height - surface[i].height)) / (1f + R);
            }
            else if (i == surface.Length - 1) { //special case last point
                surface[i, 0].nextHeight =
                    (2f * surface[i].height + (R - 1f) * surface[i].lastHeight +
                    2f * Mathf.Pow(R, 2f) *
                    (surface[i - 1].height - surface[i].height)) / (1f + R);
            }
            else {
                surface[i].nextHeight = Mathf.Pow(R, 2f)
                   * (surface[i - 1].height + surface[i + 1].height)
                   + 2f * (1f - Mathf.Pow(R, 2f))
                   * surface[i].height - surface[i].lastHeight;
            }

            surface[i].nextHeight *= 0.99f; //points should slowly tend towards 0, or the water level will change over time

            averageHeight += surface[i].height;

        }

        averageHeight /= surface.Length;

        for (int i = 0; i < surface.Length; i++) {
            surface[i].lastHeight = surface[i].height; //This line here is the necessary line. Below is some stuff I came up with to stabilize the system, it tended to flip out in some scenarios
            float h = surface[i].nextHeight - averageHeight;
            if (i > 0 && i < surface.Length - 1) h = Mathf.Lerp(h, Mathf.Lerp(surface[i - 1].nextHeight, surface[i + 1].nextHeight, 0.5f), 0.01f);
            surface[i].height = Mathf.Clamp(h, -40f, 40f);
        }
}





   JLJac on February 25, 2015, 09:07:35 PM:

I think they could make it in one way or another, they'd just look a little different! The old ones had some sort of early 2000's free flash game look to them with the radial gradients and all, I can probably do better now.





   jamesprimate on February 26, 2015, 02:14:33 AM:

I was thinking earlier that you could probably incorporate the old lingo red bubbles in some exclusive sand box levels which wouldn't necessarily have to be bound with the same cohesion as the rest of the world.

I think they could make it in one way or another, they'd just look a little different! The old ones had some sort of early 2000's free flash game look to them with the radial gradients and all, I can probably do better now.

you know, i hadn't really even considered the bubbles, but they do bring an entirely new (and fun!) gameplay mechanic relatively easily. i could see them potentially fitting very well in the design of at least 2 upcoming regions, plus as you say having them in multi / sandbox would be super fun. They've got my vote!





   JLJac on February 27, 2015, 01:42:57 AM:

@AxezDNyde Thanks for the explanation! I have a way better understanding of what's going on now. Love this sort of devlog interactivity  Grin Hand Shake Right

The *= .99 was actually added by me, for exactly the reason you mention Smiley I know the solution could be more slimmed, but actually the code I posted here was cleaned up, in my actual implementation I'm saving some other stuff as well for the surface points, why I'm keeping them as classes.

@Prinsessa, looking good! Really interesting to see how you use a different method to achieve a similar result. When you're done tinkering I'm sure we're all eager to know the result, is Gabe a witch?   Who, Me?

Update 402

Lizard infighting! This has taken the entire day, but I think I'm getting somewhere. The actual animation, i.e. how the lizards move, still needs polish, but the more general behavior seems solid enough.



Basically it goes like this - the lizards have an AgressiveRival relationship towards each other, of varying intensity. They're mostly aggressive towards others of the same breed. As they move around, they can get annoyed with each other, because of various reasons. If they're very aggressive, just because the other is too close, otherwise in situations such as the other being too close to the prey they're hunting, and in particular when they bump into each other and block each others' path.

If the annoyance goes high enough so that it's picked by the utility comparer, a Fight behavior is initiated. As this is mostly a display of dominance it's not really as much fighting as hissing, but if they end up in a narrow space it might get ugly.

When fighting, the lizard has a chance each frame to to send out a signal. I've set up a rudimentary system for inter-lizard communication, right now there are only two types of signals Aggressive and Submissive. The angrier the lizard is, the more Agressive signals it's sending to the other. On receiving an Aggressive signal, the receiving lizard's annoyance is also incremented, making it more likely to return the Aggressive signals, and that way the conflict escalates. However, there's also a small chance upon receiving an Aggressive signal to return a Submissive signal.

When a lizard sends a Submissive signal, the conflict is de-escalated, and the submissive individual gets tasked with leaving the room. For this I had to set up a new AI module called Mission Tracker, which will come in handy for a lot of stuff. The Mission Tracker can basically keep track of a bunch of tasks an AI entity has set out to do, such as travelling somewhere, or maybe in the future to hunt down a specific individual, search a specific room, or similar. The Mission has a utility, and if something happens to the lizard with a higher utility the mission can be dormant for a while, and then continued later. This means that now a lizard can for example be headed somewhere, but be interrupted by a threat, flee for a little while, and then when it's safe continue its Mission.

At the moment there's just one Mission implemented, which is to get out of a room. When the mission is activated a neighboring room is chosen, and the lizard starts to move there. Actually it tries to move two rooms away if possible, which will scatter the lizards all over the world to James' delight haha! James is generally trying to shape the play experience with level design, but my unpredictable critters tend to get in the way of that  Cheesy Maybe if it's too crazy I'll have to take a step back on that.

Anyhow, all of this basically boils down to a pretty simple behavior - the lizards will hang out, but occasionally get annoyed with each other, do a lot of hissing and maybe a little fighting, until one of them decides to scram with its tail between its legs. Hope this interactivity will make the game feel more dynamic and fun.





   JLJac on February 27, 2015, 08:11:08 PM:

@Dohman, we do have a similar system planned, where James will be able to define what rooms are considered attractive hunting grounds! Keep in mind that we're doing two things here, we're making a terrarium-like thing for sure, but also a game, so we are going to use some tools to shape the experience. For example it's more fun to encounter lizards in actual rooms rather than narrow corridors and stuff like that, and it also makes more sense for them to hang out there, which is why we're going to have them gravitate towards certain areas. Once that happens though, the dominance struggle will set in and some of them might have to settle for less attractive territories.

When it comes to the actual nutrition web part of the ecosystem, we're not doing that. There might be some starvation-like mechanism down the road, probably manifested in an increasing desperation for food, but we're not aiming to make a proper simulation of an ecosystem - it would just not be possible to keep it stable, and the effort would be humongous with really no payout in terms of player experience. As a scientific research project or something I'd love to go down that road, but here we're aiming to create an experience rather than an accurate simulation.

@AxezDNyde thanks! The refraction stuff is a little detail in the shader, the idea was that it was supposed to make stuff look wet, but I don't really know if it accomplished that haha! It still makes the environment looks more dynamic and alive though, so it'll stick around Smiley

@Christian, yup, they have different degrees of aggression towards members of the same breed and members of other breeds. Right now it looks like this:

Code:
        EstablishRelationship(CreatureTemplate.Type.PinkLizard, CreatureTemplate.Type.PinkLizard, new CreatureTemplate.Relationship(CreatureTemplate.Relationship.Type.AgressiveRival, 0.4f));
        EstablishRelationship(CreatureTemplate.Type.PinkLizard, CreatureTemplate.Type.GreenLizard, new CreatureTemplate.Relationship(CreatureTemplate.Relationship.Type.AgressiveRival, 0.15f));
        EstablishRelationship(CreatureTemplate.Type.PinkLizard, CreatureTemplate.Type.BlueLizard, new CreatureTemplate.Relationship(CreatureTemplate.Relationship.Type.AgressiveRival, 0.2f));
        EstablishRelationship(CreatureTemplate.Type.PinkLizard, CreatureTemplate.Type.WhiteLizard, new CreatureTemplate.Relationship(CreatureTemplate.Relationship.Type.AgressiveRival, 0.25f));

        EstablishRelationship(CreatureTemplate.Type.GreenLizard, CreatureTemplate.Type.PinkLizard, new CreatureTemplate.Relationship(CreatureTemplate.Relationship.Type.AgressiveRival, 0.2f));
        EstablishRelationship(CreatureTemplate.Type.GreenLizard, CreatureTemplate.Type.GreenLizard, new CreatureTemplate.Relationship(CreatureTemplate.Relationship.Type.AgressiveRival, 0.8f));
        //   EstablishRelationship(CreatureTemplate.Type.GreenLizard, CreatureTemplate.Type.BlueLizard, new CreatureTemplate.Relationship(CreatureTemplate.Relationship.Type.AgressiveRival, 0.2f));
        EstablishRelationship(CreatureTemplate.Type.GreenLizard, CreatureTemplate.Type.WhiteLizard, new CreatureTemplate.Relationship(CreatureTemplate.Relationship.Type.AgressiveRival, 0.05f));

        EstablishRelationship(CreatureTemplate.Type.BlueLizard, CreatureTemplate.Type.PinkLizard, new CreatureTemplate.Relationship(CreatureTemplate.Relationship.Type.AgressiveRival, 0.3f));
        // EstablishRelationship(CreatureTemplate.Type.BlueLizard, CreatureTemplate.Type.GreenLizard, new CreatureTemplate.Relationship(CreatureTemplate.Relationship.Type.AgressiveRival, 0.15f));
        EstablishRelationship(CreatureTemplate.Type.BlueLizard, CreatureTemplate.Type.BlueLizard, new CreatureTemplate.Relationship(CreatureTemplate.Relationship.Type.AgressiveRival, 0.45f));
        EstablishRelationship(CreatureTemplate.Type.BlueLizard, CreatureTemplate.Type.WhiteLizard, new CreatureTemplate.Relationship(CreatureTemplate.Relationship.Type.AgressiveRival, 0.25f));

        EstablishRelationship(CreatureTemplate.Type.WhiteLizard, CreatureTemplate.Type.PinkLizard, new CreatureTemplate.Relationship(CreatureTemplate.Relationship.Type.AgressiveRival, 0.15f));
        EstablishRelationship(CreatureTemplate.Type.WhiteLizard, CreatureTemplate.Type.GreenLizard, new CreatureTemplate.Relationship(CreatureTemplate.Relationship.Type.AgressiveRival, 0.05f));
        EstablishRelationship(CreatureTemplate.Type.WhiteLizard, CreatureTemplate.Type.BlueLizard, new CreatureTemplate.Relationship(CreatureTemplate.Relationship.Type.AgressiveRival, 0.35f));
        EstablishRelationship(CreatureTemplate.Type.WhiteLizard, CreatureTemplate.Type.WhiteLizard, new CreatureTemplate.Relationship(CreatureTemplate.Relationship.Type.AgressiveRival, 0.25f));

        EstablishRelationship(CreatureTemplate.Type.GreenLizard, CreatureTemplate.Type.BlueLizard, new CreatureTemplate.Relationship(CreatureTemplate.Relationship.Type.Eats, 0.25f));
        EstablishRelationship(CreatureTemplate.Type.BlueLizard, CreatureTemplate.Type.GreenLizard, new CreatureTemplate.Relationship(CreatureTemplate.Relationship.Type.Afraid, 0.25f));

But it still needs a lot of balancing, this is just something I quickly threw together. When the individual treats come around that will weight into it as well, some individuals might be more aggressive etc. In general this system could need some refinement, with separate parameters for a bunch of stuff, but it seems good enough for now!

@DarkWanderer, yeah there is occasional actual biting and stuff. Particularly if they end up fighting in a very enclosed area it might get bad. The white lizards actually won't be eating the blues, that was just a mocked up situation for fun. But in general, yeah, they have some knowledge about who's bigger, and they should be taking that into account even more as the system gets a little polish.





   jamesprimate on March 02, 2015, 03:14:04 AM:

*** Big New Kickstarter update: ***

https://www.kickstarter.com/projects/rain-world/project-rain-world/posts/1149924

Mostly old news to you loyal devlog readers, but there is a pretty slick new trailer video and some never before seen screenshots  Hand Metal Right





   JLJac on March 02, 2015, 04:38:10 AM:

Hahaha lizard infighting is apparently what everyone is here for! I never would've known!

The stuff with different fighting styles in different breeds is viable, but it might be complicated when they have inter-breed scuffles. Like if one tries to wrestle and the other tries to do something else. These behaviors can obviously be given endless polish, and maybe we'll go there, but not right now. Whites flashing colors at each other is a totally awesome idea though, and really easy, so I'm definitely adding that  Hand Thumbs Up Right

It would self-regulate then, like in nature x)
Doooooubt it hahahaha! If I have any experience with programmed systems it is that they always do the opposite, ie get stuck in a self-enforcing loop and fly out on a tangent. It could be possible to make it happen if you added a lot of dampers and clampers to basically force everything to be stable, but then you're not really running a simulation either way, so it'd kind of defeat the purpose.

Update 403
Working on giving lizards individual traits. It's difficult, as the most important thing still is that the breeds are easy to tell apart.

First thing I did was to set up a false bell curve distribution generator. I know that an actual bell curve is the effect of semi-random distribution, but here I'm backwards engineering it - I created a system that made the distributions bell cruve-like. The formula can be skewed to have a varying tendency of distributing towards the edges or bring in the results towards the average:



This is used mainly for random differences in color and size.

The next step was to map the "spine", or body mesh, of the lizard. This isn't so obvious as it might seem, as the lizard isn't one single mesh but actually consists of a body and a tail, and a head, and there are troublesome transition areas between all of these. After some fussing I got this result:



As you can see the system not only maps the points along the "spine", but also the perpendicular vectors of each point and the "depth-rotation" effect from when the lizard moves around.

When I got this spine mapping in order, the obvious first thing to do was a ridge of scales/bumps/spikes along the back of the lizard. Later I want to add more stuff, like maybe little tassels on the tips of their tails, or some feathery/scaly appendages sticking out of their shoulders, as well as different stuff that might be attached to the head rather than the body. At this point I have some individual variations looking like this:



I'm happy with where things are headed, and I'm having a lot of fun, but as you can imagine this stuff can soak up an infinite amount of work, so I'm going to have find some point where it's good enough for now.

As you can see I've already started working a little bit with the balance between individual traits and breed traits. For example the greens are more prone to have a comb of scaly things along their back - the pinks sometimes do, but it's generally smaller and less colorful. The greens tend to have the more "feathery" appendages, whereas pinks usually have the "spiky" ones, when they do at all. This here sample isn't the best to show it, but there are some differences in how fat/skinny they are, compare the two leftmost pinks on the second row. There are also differences in head size and tail length/width, but that stuff had to be downplayed quite a lot as it made many individuals look absolutely ridiculous.

Here's a better example of skinny and fat specimens:



The fine balance to strike here is to make it so that individuals are recognizable while still keeping the breeds clearly separated. In this sample it's still visible (I hope) that the green is larger than the pink is larger than the blue, but the line is already becoming hazy - despite the individual differences not being super obvious! Apart from that there's the challenge of making all of them look good. In a sample of tens of individuals like this it's easy to be forgiving if one is not so hot, but if you have a minute-long encounter with a single lizard in a room and it looks goofy it's more problematic. So I'm anticipating it's going to be a bit difficult. But a lot of fun, for sure  Grin





   JLJac on March 02, 2015, 08:03:49 PM:

Thanks everyone Smiley

It would be fun if body size is randomized at each run. You know there is likely to be a lizard in this room BUT its characteristic might change.
James and I are having talk about to what extent the creature placement will be procedural. Our consensus last time we spoke was that there'd be a normal "new game" option in which the content is less procedural, and then a "new game +" in which the creatures (and other stuff!?) will be more procedural and more difficult. We'll have to see to what degree this is doable when we get there though.

@Woodledude oh by all means, don't keep quiet haha! If I didn't want to talk to people, why'd I run a devlog? Yep, the idea of a standard fighting style and a breed-specific crossed my mind. Might be worth it to go there, we'll have to see how much time people actually spend looking at the lizards idle behaviors. Scars are possible, but as you say it's a bit difficult to map textures to the creatures. Also I don't know how it'd work with the color restricted art style.

Update 404




More lizards! New for today is the scaly things with some physics interaction. Also I'm trying to get some breed traits down, right now the pinks tend to have some spikes coming out of their necks, greens has the mohawk, and blues have two lines (horns?) running down their body. All of these traits can of course in rare cases give way to individual variations. Also, please note how the pink up towards the right corner in the second image is fabulous. I'm actually pretty happy with the fact that there's random strange outputs like that, because I think it'll increase the narrative quality of the game if there are certain individuals that can be easily recognized.





   JLJac on March 02, 2015, 08:31:35 PM:

Yup, there'll be reds, and yup, I'm a little worried about how to keep the colors apart! Maybe I'll have to rely more on other features.

Actually the rotation effects are, in my opinion, strangely more clear in an actual game context. The differences between the individuals also seem to pop more when they're not all suspended on a grid:


(this amount of agression between lizards isn't normal by the way, it's because I pulled them all into the central room where they ended up in a big pile with a lot of biting, and the general annoyance hasn't worn of yet as of recording)

Yeah, blue needs some love still! Wasn't really thinking about it as "horns" as much as "lines along the body", sort of like how a chipmunks fur is colored, just that whatever this is connects to the head... Haha these are strange creatures, I shouldn't pretend I know what I'm doing. But yes, the blues need something more going for them. I think maybe tail tufts or something might just do the trick  Hand Thumbs Up Right





   JLJac on March 02, 2015, 09:06:52 PM:

Lizard colors are: pink, green, blue, white, yellow, red. There has been a little talk between me and James about a black one, but we have nothing solid on it.

Yellows existed in the lingo build, though I don't know if I ever made a gif of them - but yeah, they're pack hunters.

The purples seem to be the super-aggressive lizards of the bunch at the moment. How are the Reds different?
Just you wait - pinks will seem docile and friendly Evil





   JLJac on March 03, 2015, 01:28:30 AM:

Update 405

Worked on some tail tufts, and got some more exciting looks for the blues:



I was inspired by sea slugs and am pretty happy with the result, though it might actually benefit from a little toning down. It becomes a bit too much rio carnival in some specimens haha!

The pinks are also rocking the occasional tail appendage, though smaller and usually less symmetrical:



Other than that, I've done further individualization of the whites, which was a little bit tricky because everything had to be able to change color.



Speaking of carnival, look at this one  Cheesy



For the evening, the green lizard has picked a wonderful two-row shoulder scale formation, which goes surprisingly well with the spinal ridge! Quite unorthodox! And to top it off, a tail plume. This look is certainly straddling the line of tasteful, but we appreciate the bravery!





   jamesprimate on March 03, 2015, 06:17:53 AM:

we may or may not be uploading that right this second ;] ;]





   jamesprimate on March 03, 2015, 06:31:05 AM:

we may or may not be uploading that right this second ;] ;]

I guess I will not be working on my game this evening...

humble usually takes its time to get everything up and ready, so we may not have killed your productivity JUST yet  Wink





   jamesprimate on March 03, 2015, 08:43:06 AM:

in other news, the Rain World coming soon page is up on Steam with new trailer and screenshots: http://store.steampowered.com/app/312520




FOLLOW FOLLOW FOLLOW! WISHLIST WISHLIST WISHLIST!





   jamesprimate on March 03, 2015, 01:01:50 PM:

thx friends! the summer thing is a biiiiig maybe, but hey who knows. and yeah, all the info on the page is just temp stuff until we get the final specs, ect etc. we just rushed with adult swim to the page up before PAX.

idk if any of you guys have seen it, but teh back end of steam is *crazy*! like, imagine a system that has been in continuous use for pretty much every game since counter-strike... and yeah. i had to write batch files to upload stuff FFS!





   jamesprimate on March 03, 2015, 01:11:15 PM:

honestly, the only reason we've ever put any dates on anything is because "when its done" isnt an option  Shrug





   jamesprimate on March 03, 2015, 01:58:16 PM:

heck yeah we do!





   JLJac on March 03, 2015, 09:15:58 PM:

I think lizard species should be easily distinguishable by a 100% colorblind person. That's both a noble goal to have in terms of accessibility and an indicator of good visual clarity and vatiety. As for now I think it's still possible to mix them in some cases, but you're moving in the right direction.

Also, I personally don't like nearly white heads on white lizards. They always should be in contrast with the body.
Yup, the ideal would be that they'd be possible to tell apart without color. But it's not entirely easy, if individuals are to be identifiable as well as breeds. I'll work on it!

This is amazing! Seriously, looking at all that plumage is making me giddy.

One issue I'm having is that with the colour variation, some of the pinks look nearly red to me. I don't know if the reds will look radically different from the pinks, but in any case you might want hedge your bets and adjust the colour ranges of the pinks so that they don't hit red. Maybe head in the opposite direction on the colour spectrum and range between magenta/purple rather than magenta/red? That way you don't have quite so much of a problem distinguishing between the two, and red is pretty much exclusive to the really scary one.

EDIT:

Yeah, there is a lot of space between the purplest hues of the blues and the bluest hues of the pink, but the pinks are sometimes getting way too close to red. I've placed them there on the color wheel because I like the warm purples more, they contrast better to the typically cold colors of the background. Another issue is that the human eye's experience of hue differences doesn't perfectly line up with the RGB (or rather HSL) model of the computer - some portions of the color wheel we divide into many separate color concepts, while there's a good fourth or so that we generalize to "blue". I read some anthropology article somewhere that these divisions are actually heavily influenced by culture - western culture tends to see blue as separate from green, while many other cultures see these as variations of the same color, while being better at identifying the warmer greens. At the end of the day, I can't really do much more than going by my own eye. When the reds come around the pinks are definitely going to have to scoot over into the colder hues though, unless I come up with some smart workaround. Maybe the lizards could get a secondary color, similar to the vultures right now (vultures actually generate two hue-related colors, you might notice that the feathers are different than the shoulder pads) and create distinction that way.

looks like you are having a lot of fun! I was just wondering if all this extra cool stuff has any impact on performance? are the vultures going to have this sort of attention given to individual looks as well?
The vultures acutally do have a bit of this, the feathers on the wings, the "danglers" and the colors are all individual. But I'd definitely want to do a bit more. That said, lizards are definitely getting extra attention here, as they're the primary foe. I can't spend 5 days on individualization for every species in the game. But I hope for all of them (maybe with the exception of stuff like bats and leeches) to have some degree of it.

#early access, this is not really my desk as much as James', but I tend to agree that it's a different thing with backer early access and public early access. Backers generally have more insight in our development progress, and might be more well-meaning as they understand that it's a work in progress, and knows what is implemented yet and what is planned to come along, etc. Also I agree that Rain World is probably better experienced as a finished-ish product, I think we'd want to at least have the all of the areas areas and the more important creatures finished before release.

#pups, as for the name, nothing is concerning me less at the moment hahahaha  Cheesy Remember that the names won't actually feature in the game, it's just for the devlog and other conversations about the game. A piece of trivia though, I believe the pups were "pups" before the slugcat was "slugcat." When it comes to the actual gameplay element, yes sure we do still plan to include them! But as some of you have noted, the environments are quite hostile, so we might want to tone down the escort quests a bit. Perhaps the pups could be made more stationary, so that they generally hang out in a shelter and the challenge is more about bringing them food than about taking them from A to B. We'll have to see how it develops though.