Hunter, by RiverCocytus (http://rivercocytus.deviantart.com/art/Hunter-414829804)
Not today Justin
will byers stan first human second

Kiana Khansmith
No title available

if i look back, i am lost

❣ Chile in a Photography ❣

⁂
styofa doing anything

roma★
NASA
DEAR READER

izzy's playlists!
Today's Document
Show & Tell

Andulka
Stranger Things

JVL
2025 on Tumblr: Trends That Defined the Year
Monterey Bay Aquarium
Keni
seen from South Africa
seen from Switzerland
seen from Nigeria

seen from United States

seen from France

seen from United States

seen from Türkiye

seen from United States
seen from Mexico
seen from Japan

seen from Netherlands

seen from Singapore
seen from Saudi Arabia

seen from United States

seen from United Kingdom
seen from United Kingdom

seen from Singapore
seen from Canada
seen from Türkiye
seen from Netherlands
@grown-gato
Hunter, by RiverCocytus (http://rivercocytus.deviantart.com/art/Hunter-414829804)
Double fisted style.
Thoughts about Item-typing
In most games, item typing is very simple: x is x, x is not y. Even in games with crafting like WoW, the probability that item-typing needs to have any kind of subtlety to it is low.
Enter Legend of Grack.
When item typing is done, there are usually a couple of ways to achieve it. If you are doing OO programming, you can simply use the Class of the Object as a shorthand for type. This is fine as long as each item is a distinct class; it may be that resource items (such as the items used for Revelations in Rogue Galaxy) do naught else but be used in some formula and it would be a waste to individually class them.
The second method is to fix a set itemID to the item as originally instanced. In this system, all items with their own unique class may be ID'd statically or (in the case of java) finally. In other languages this would simply be a const or be hard-coded into the constructor. The generics above then would also need to know their itemID, which is fine if you are creating them in a hard-coded fashion. The only issue that arises is that now you have a bunch of hard-coded itemID's in potentially multiple places.
One solution to that debacle is to take one of the central objects in the game, say the World, and attach a list of static constants (or final's) to it which are the ID's of all defined items. Thus whenever you are creating an item, you will always reference this list. If it changes, it will require a re-compile (no problem here) and the constants referenced will also change.
A third way is to take the second method and instead of having a static list of item ID's (or, rather, instead of only having a static list of item ID's) you have a static list of items. To create a new item you clone an item from that list. This allows you to also simply statically reference implicitly static resource objects (such as the card-deck OO model) while allowing you to clone items that will need to individually have properties.
In this case the item ID's are assigned on-list-create, likely a static event itself. This is great! The only problem is now managing this list, which overall is not too huge a deal.
---
There are still two unresolved issues with this method, however. They are twofold. The first I will address, the second I will leave as an exercise to the reader.
---
The first is a common problem, and it is versioning. Any game which plans only to be played as a complete game and not modified can ignore this issue (which is a valid way to do it.) But for those of us whose engine will be used by modders and who will have a fairly large beta crowd with save files they may wish to re-use, how do we get around item ID incompatibility?
The common solution here is to only add item ID's going forward, leaving old items as legacies that may be unused. Old saves are then a subset of the new version's saves. This works fine until modders create item ID's with conflicts.
Well, you might say, create a space of item ID's for modders! This leaves the modders to manage their itemID's, and presumably prevents conflicts. This is a decently libertarian solution, though ultimately it creates spaces like IPv4 which may or may not be sufficient later on. Furthermore, it simply pushes off the itemID versioning issue for both your own team (remember, you may not be working alone) and the teams of modders, whose problem is likely to be much nastier.
This punt is fine as far as it goes, but there is a better way.
In this 'better' way we have to do two things.
1. We must bind the itemID to the session (instance of the game world being played)
2. Item ID's are assigned automatically as the item list for that session is populated.
3. Sessions must store their list (save files get bigger) and validate that list on load.
4. Reflection should be used here to determine if the needed classes exist.
5. Finally, modders are given a method to add items, and a method to discover the itemID's assigned.
We may even use this method ourselves, but it depends on how we plan to use items. Where do we ACTUALLY use items, reader? By this I mean, where in the code do we create items from scratch?
In my view, this will be two places: One in random 'generation' functions that produce treasure-troves and place items within the world. The second is in widgets that transform items from one kind into another.
In these places, we need a quick way to discover an item verbally. The second case the bindings belong to Recipe objects of some kind, whether they be recipes for a Transmogrifier, a Furnace, or a crafting table. Either way, we will be verbally referencing an item to retrieve it... even if the references are static.
This works out fine, actually, version-wise. You may wish to provide a key that is static to each item kind, which if the item's class is not found can be searched for to try to migrate the item from the previous verison. These keys should be hashes and such that only the program itself tries to read, which are fixed to an item kind when you create it the first time (not in the game, but in your editor!)
As long as you create your items and recipes in the same place, if the string you use to retrieve the item changes you can discover the issue and resolve it quickly. Since the save file uses itemID's and those ID's are a reference to the list that it provides, saves will never mangle their items, though they may lose them if the items are removed from the next version. However, you will be able to discover this issue and resolve it, and if you set up your keys correctly, also you may be able to migrate the save successfully.
Keys may be multiple, allowing an individual item to be what two previous versions' items migrate to.
The item name (a simple string) can be used by the programmer when coming up with troves, recipes and other lists of items to be distributed in the world.
Saves and inventories deal in itemID's, allowing sane stacking and permitting recipes to refer to an item directly if necessary. Since these ID's are bound to the session, the save file can easily do verification checking on load.
You may provide variant methods as well, for retrieving items which are 'a form of a material' - a stick of oak, a brick of granite, etc. Because we use the population method, we can generate a list of possible rock chunks, etc, based on our loaded materials list, which the modder may add to.
---
The second problem here is the problem of how to properly create disorganized inventories; stacks that obey only some rules of kind-based-stacking,
If it seems easy, consider that most of your list types will ignore objects of the same instance, meaning that if you try to variously stack static cards, you will fail to get them in the list. If you try to force it, you may find the get() methods don't work right, either!
It's probably not as tricky as I've made it out to be, though.
Brief Update
For those wondering, we're waiting for our signing certificate from Comodo to be processed. Until that point I'll be adding little things here and there.
Update
I've got sounds and such working. While I thought to make another release, instead, I'm going to add some basic inventory and an in-game console for messages (such as for in-game events.)
At that point I'll release the next version. I've decided to hold off on enemies until the release after that.
Cellular Automata: A short talk about lighting
When it comes to lighting a voxel world, you will inevitably run yourself into multiple dead ends. The first thing I discovered is that GL Lighting tutorials - or moreover GL LIGHT itself, is of little use.
This is because in a voxel world that can be manipulated, lights may come and go freely across a complex and supernumerous geometry that makes coordinating switching on and off various GL_LIGHTS a pointlessly arduous task.
There is something to be said for using the non-diffuse light types to make surfaces appear shiny, but this is aside from the general task of diffuse lighting, of which I'm now going to write.
---
First, one has to get past the idea of lighting. You're not lighting, you're coloring. While there may be light involved conceptually, what you are doing is coloring the world - coloring particular primitives and blending color on textures - based on what level of light ought to be there.
While the GPU does most of the hard work for you, since you won't be setting up light points with properties but actually figuring out the color to send to the GPU, thinking in terms of regular lighting is not only difficult but counter-productive.
Instead, based on my understanding of how minecraft (and some other games) have pulled off what is known as 'light mapping' I present a short outline of what I call 'Liquid Radiance'.
Liquid radiance isn't light. It's liquid that flows out of your light fixtures and colors the world brightly. It only flows so far before petering out. It goes around corners and stops where more liquid radiance is.
To get liquid radiance working, you need four basic operations.
One: How to emit liquid radiance from a fixture
Two: How to re-emit liquid radiance from existing sources into a new space
Three: How to remove the liquid radiance from a fixture and re-emit any liquid radiance that was intersecting it
Four: How to remove and re-emit liquid radiance around a space that is newly closed.
The simple radiance method is generally recursive (I think you may be able to make it iterative, but it is more complex.) It tries to light the voxel the fixture is in (or IS) then emits light in all six directions This emission tries to emit light while light is left (it falls off each time until gone) and while the space it enters is not blocked, It also tries to emit light in all the four directions orthogonal to it; which is a copy of the process aforementioned. Additionally, if the light enters a space equal or greater to it in light, it stops.
For the second part, you must find the greatest light nearby, remove it, and re-emit it properly and it will simply refill the space. This does not mean the fixture, but the adjacent liquid radiance itself. The process is doable from any point.
For the third part, you must remove the light in an inverted process (unradiate) and record any time you find a space where light was run into that was greater than the light you just removed. These should be placed in a set.
The aforementioned set is then run through and the points are all re-emitted as in the second part.
The fourth and final part is to unradiate the light from the space about to be blocked, then once it is blocked, re-emit the strongest light around it. The unradiate process is like the third part, but you re-radiate the set after the space is blocked.
---
Note that each process builds upon the prior process, and in general the process has a cell that contains a light strength value. Fall off and other values can be constants that are used by all cells. It may be useful to note the light's direction, perhaps using bit stuffing for this.
It is possible to set up Liquid Radiance as its own layer of your world, wherein it listens to a beforeVoxelChange and an afterVoxelChange, and to an addFixture or removeFixture. These names are convenience, of course. Then when drawing the world, or preparing the world's geometry for the GPU, the light map that results from Liquid Radiance's work can be queried for intensity values or even simply colors.
Liquid Radiance is very fast and if you are clever you can make it pretend like it isn't liquid, but a mysterious substance that is both a particle and a wave. But we all know it's secretly a liquid.
And it is also a cellular automata.
I've released the next version of the demo.
Notes
Fixes a problem with regions getting corrupted by an unremoved entity
Fixes the options menu so that the options actually affect the game (lol)
adds movement types to the characters
adds more actions (sneak, climb, etc)
adds swimming and water physics
improved particles, splash particles
water spreads. beware, probably slow and buggy
torches animate (no particles yet)
damage from falls
AC now adjusts (doesn't do anything yet) according to movement
adds some dodge/agility moves: sidestep (left or right twice) backflip (agile chars only - back twice) broadjump (double tap forward and jump)
Next I will fix light and add scoring and inventory. This will take removing blocks out of 'creative' mode and make it require the pick. Placing blocks will then become possible.
I may also add a foe.
Movement update
Movement types are progressing nicely. Some parts of Clumsy movement type will wait (falling over while running and turning or dashing will require creation of the prone state, which I don't plan on doing for awhile.)
Agile characters now have 'Parkour'. This gives them the ability to climb objects half of their height as though they were stepping over that object. The secondary ramification is that they can scale any two block high wall by jumping at it. This avoids surface checks for climbing and the speed penalty. There are also some cool platformer-like effects as well.
Eventually, characters with Parkour will also be able to jump while hanging on the wall (whether via climbing or catching during a fall.) This can enable some wall-kick like behavior. Ceiling hanging will be a thing.
Marching, Running and Dashing are in. When you press run (shift) and then double-tap forward, you will begin to accelerate quite madly. Your friction drops radically and you will expunge your stamina rapidly (running will not use it nearly as fast.) As long as you hold 'forward' and don't hit an object, you will continue to accelerate. Note that under the physics rules, hitting an object at a high speed inflicts damage from every direction, not just falling.
Sturdy characters cannot dash. (Not that they could make much use of it, anyway.)
I'll work on making sure run speeds differ reasonably according to movement type, and then I will add sneak.
Had a few hilarious accidents of dashing myself inside the wall while testing various constants for acceleration. When you move faster per frame than the size of a block, you (by default) move through that block.
Judging by the number of blocks deep I was into solid rock, I was going faster than a bullet.
Please note that my deploy location will change in the next release.
Demo interface. The portrait will be animated and in the future there will probably be a couple of extra indicators squeezed in there, one for stealth status, for instance (visibility, sound, odor, vibration). It would not be important for the Rookie, but would be quite necessary for the Vagabond.
The five boxes represent hotbar slots, or the 'belt'. While five is a common number, it will be possible to have more. There will also be special slots on either end for the class' special items (in the case of the rookie, sword, shield, throwing weapon) which can be selected using a particular key combination.
The six bars are as follows (they may be re-ordered)
Left side: health, armor, mana
Right side: stamina, food, water
Middle bar is level/xp. At the moment it shows being 'full' - though when full it would most likely empty out again and advance your level.
Warning, that link will begin the process of loading the game! The query you receive for permission is to use GetDown, which is a deployment platform used by Spiral Knights and Puzzle Pirates.
---
This gives you some gravity and jumping. It also fixes some of the F3 debug output to reflect what is really going on.
There are, additionally, some optimizations for the graphics rendering. I'm still struggling to get a good framerate (the test environment has ~30k polys) on my older test computer.
JUMP is SPACE, as you might have suspected.
Next we will spiff up the loader a bit, perhaps making it play in the browser, and also making it not autoload when the page is loaded.
I will also fix the bounding boxes for many objects in the test world, and give you a way to add lighting in the form of torches. You will also be able to remove torches and other entities. The add-torch method will be temporary and just to test adding and removing lights properly.
Lastly, I'll try to address the odd behavior that happens sometimes (or, often, natch) when you remove a block and the lighting doesn't add up properly.
Vagabond concept by RiverC (http://rivercocytus.deviantart.com/art/Vagabond-405202127).
This one is unusual because we tried to emulate the proper sword stance (though I guess ultimately the scabbard is in the wrong position for a strike)
However that leather armor is groovy as all get out and... battle braids!
Simple Culling. The 'tr' amount is 'terrain rendered'. (fl is fluid rendered.) You can see the 16k/30k faces are being rendered. This count is created on the draw loop based on what is stored in each region's geometry. It is counted twice only if the region isn't culled.
Just a basic test of the deploy.
Expect it to run slowly; it's not optimized.
Bad News
We've had to abandon using Java Web Start. It's too unreliable. We're switching over to GetDown, but that requires a lot of configuration work. So, it might be a couple of days.
Java is sort of cross platform.
Nevermind. See the next post.
Legend of Grack DEMO 000-001
This is a very rudimentary demo. As I'm not only building a game but also an engine, work has been much slower than it would have been had the engine already been built.
We're having some key-signing issues, but when that's resolved you'll be able to launch the demo from here
http://riverc.org/grack/log.jnlp
(Special thanks again to RiverC for letting me use his server for these demos.)
Demo 1 Tomorrow
Alpha 1 for Legend of Grack is tomorrow. It's not much; preparing it for play as opposed to simply adding more features was a bit more daunting than I originally thought.
Something this weekend
We've got a few more pieces of concept to share, and then I'll get the demo to the point where I feel comfortable letting people play it.
I mean, it is ready now, but there's not really anything to do. Boring.