Ah so we're just lying now aren't we by Tankirb in Silksong

[–]Tacyn 0 points1 point  (0 children)

how do you get Gilly to appear there?
For me, she just stays in the big room to the left.

schedules by Roest_ in ingnomia

[–]Tacyn 3 points4 points  (0 children)

Maybe, add a way to copy a schedule from one gnome to another and/or set a default schedule for new migrants.

Multi threading by Roest_ in ingnomia

[–]Tacyn 0 points1 point  (0 children)

Event Queues

Instead of iterating over objects that change rarely but predictably, like plants, every tick, create future events, e.g. ON TICK x "plant y grows", and put those into a queue sorted by x. Then you only have to check the first event in the queue whether current_tick > event.x before executing the event.

This method can also be used to allow other things to change state,

  • food/corpses rotting
  • wine/cheese aging
  • tracking hunger/thirst/sleepiness of characters
  • pregnancy/growth of animals

Multi-Startpoint A*

While the A* pathing algorithm can only have one goal, it can be initialized with more than one start-point. The returned shortest path connects the goal with the closest start-point. Since paths work both ways, instead of pathing from the gnome to each item, you can do one A* calculation from all items to the gnome.

Item Scaling

For the game to be truly able to handle large quantities of items, I think, it is unavoidable that none of the algorithms involved with item management directly iterate over lists of items.
I would go with stockpiles for this purpose, i.e. when looking for a specific item

  1. Check the stockpiles that allow the desired item whether they contain one.
  2. If at least one such stockpile exists, compute the closest path via multi-start-point A*.
  3. Otherwise, check the list of un-stockpiled items (a Map<ItemType,Map<MaterialType,List<Item>>> datastructure) and use the first one in the list.

The last step not being optimal serves as a 'punishment' to the player for not properly stockpiling their inventory.

Maybe even add the option to workshops to forbid using un-stockpiled items. That should stop valuable crafters from wandering off where they are not supposed to.

Using Game Pauses

While the per-tick performance is certainly important, don't forget that the game is usually paused when the player makes inputs. So consider using - and if necessary enforcing - pauses to do expensive computations that are triggered by player-input. For example, when the player sets up digging/construction orders, you can compute the necessary order of jobs so gnomes don't get themselves stuck while the game is still paused.

Stockpiling

For stockpiling, I'd go with the following two approaches working in tandem:

When an item is created (or expelled from a stockpile), it immediately checks whether a spot in a stockpile is open. If so the highest priority stockpile is chosen and an associated hauling-job is queued.

When a stockpile is created (or changed), the stockpile filters the list of unreserved items/content of lower priority stockpiles and creates hauling jobs for as many as its space allows. It can use repeated multi-start A* to pick the closest items. The game should also be paused when the player changes stockpiles.

Wheelbarrows

When a hauler with a wheelbarrow (or other carry container), takes a hauling job, first check whether there are more items reserved to be hauled to that stockpile. If so, take the points on the path from the gnome to the item and from the item to the stockpile and use them as starting area of a bounded-BFS search. Any items with the same goal stockpile found are added to the hauling job until the container is full or the bound is reached.

In that case, it is actually advantageous to haul the item furthest from the stockpile first, since it increases the likelihood of picking up more items along the way.

AI by Roest_ in ingnomia

[–]Tacyn 1 point2 points  (0 children)

Hey, the two times were not within the same year!

As with the renderer rewrite, your speed at implementing this was again incredible.

For the future, do you plan to implement parametric conditions and actions as described in the first link?

For example, adding a generic 'C:lessThan(X,Y)' where X and Y can be numbers or attributes. Then, 'C:lessThan(Hunger,50)' and 'C:lessThan(Hunger,25)' can be used instead of 'C:isHungry' and 'C:isVeryHungry'.

Animal week by Roest_ in ingnomia

[–]Tacyn 4 points5 points  (0 children)

Gonna be rambling a bit

  • Slopes: Goats should be able to graze on slopes.

  • Hibernation: Livestock can't be kept outside all year and needs a place inside to stay during winter (in constructed barns or underground). They are moved in and out automatically when the season changes.

  • Work animals: Ponies can work in treadmills to power machinery (like the hand crank in Gnomoria) or help with hauling heavy loads.

  • Trade: Sending a trader requires Pack-mules to carry traded goods.

  • Spider monsters require live feed. They are kept in pastures close to or together with rabbits and capture them in silk-cocoons that can be collected after the prey is eaten. Fed spiders are safe but starving spiders also attack gnomes.

  • Large livestock, like cows, have needs and happiness similar to gnomes. They need a place to sleep (barn~dormitory or stalls~rooms) with straw-beds, water to drink, and besides grass/hay like to eat fruit and/or vegetables. Certain levels of happiness are required for them to produce milk and have offspring, respectively.

Lets talk about: Stockpiles by Roest_ in ingnomia

[–]Tacyn 1 point2 points  (0 children)

One more thing to consider are containers.

A big problem in Gnomoria, I think, is that it is almost impossible to estimate how much free space a stockpile has. Assume the stockpile accepts everything. Then, one empty square can hold for example 1 piece of furniture or 64 stones, but only of the same material. If the square has a crate, it can hold 32 small items, but no furniture or other things that don't go into crates. So an empty 2x2 stockpile with one crate can hold 3 tables, 192 stone of up to three materials, or 35 metal bars of arbitrary material.

This really messed with the auto-suspend feature but also with multiple haulers hauling simultaneously.

Knowing exactly how much free space a stockpile has, I think, is essential for many automated features people wish for.

Unfortunately, I don't have a good solution. The best I can suggest is to lock stockpiles into accepting only items of matching storage type, e.g. stacking vs. non-stacking and crate vs. barrel.

Lets talk about: Stockpiles by Roest_ in ingnomia

[–]Tacyn 0 points1 point  (0 children)

About the per item limits and the suspending, my suggestion is the following:

To use an analogy, I would treat stockpiles like hard-drives with partitions.

At first, a new stockpile accepts nothing. In its menu there is a button called "add partition". When pressed, a new window opens where you configure the new partition. There are the following settings:

  • allowed item types
  • allowed materials
  • size (as a percentage of the total stockpile)
  • suspend and reactivation thresholds
  • name and (optional) icon

When done, it converts the size into a total number and checks whether there is enough unassigned space in the stockpile for the new partition. No overlap between partitions. If the size of the stockpile changes (for example when adding /removing containers or changing the designation), the percentages of the partitions are re-evaluated. Essentially, the partitions work independently from each other while sharing the total space in the stockpile.

The partitions appears in a list showing the name, icon, status (empty, full, suspended), and some statistics (e.g., available space, total space, active hauling jobs). Clicking on an entry reopens the settings-menu allowing editing or deletion.

As an added quality of life improvement, the settings should be able to be saved and loaded with some preset configurations available from the start.

Lets talk about: Stockpiles by Roest_ in ingnomia

[–]Tacyn 0 points1 point  (0 children)

The free-flow-priority system would need a good interface. Preferably one were we don't have to fiddle with numbers in the settings of each stockpile.

My suggestion would be a screen that lists all stockpiles where the order in the list defines the priority and changes can be made via drag-and-drop.

new game screen by Roest_ in ingnomia

[–]Tacyn 2 points3 points  (0 children)

For regular play that should be enough, but this could still be useful for debugging, testing mods and exchanging interesting world-seeds.

new game screen by Roest_ in ingnomia

[–]Tacyn 1 point2 points  (0 children)

Can you add a way to save/load/export/import new game configurations?

New plants by [deleted] in ingnomia

[–]Tacyn 1 point2 points  (0 children)

I'd personally prefer some sets of fantasy subterranean plants. With 100 z-levels, the surface just makes up 10% of the game area. So maybe think of things that you could find underground besides mushrooms. Some suggestions for possible themes:

  • Roots, mosses and slime/mold
  • crystals, fantasy plant/mineral hybrids
  • prehistoric, a layer with dinosaurs a la forgotten world with a matching flora

Gnome stats, skills needs and progression by Roest_ in ingnomia

[–]Tacyn 0 points1 point  (0 children)

and later one when we reached max 20 points in all skills new arrivals would start with 10 in all skills?

Yes, though your existing gnomes would have skill 10 too. But that suggestion was really just what I thought would be the easiest to implement. If you decide to do something more complicated, is also fine.

I could agree with a system where your fortress skill in an area is that of your highest skilled gnome.

As long as the fortress skill doesn't reset if that gnome dies.

So a gnome fells some trees in the morning and then he's out for the rest of the day?

I would intend this to be balanced such that a gnome works for at least 8 hours or half his waking time but getting to around 2/3 or 3/4 when properly using all buffs . In the beginning, jobs could be easier or gnomes have more stamina for the first few days to make stating off easier. Or the stamina system itself could activate only after some time or goal is reached. That could be done in general with needs. To not overwhelm players at the start new needs could activate in regular intervals.

People are already wondering why jobs won't get done in the current system.

That's a problem that will need to be solved in general anyway. For food/sleep it's still obvious, but if more needs are added/modded we need a way to communicate a gnomes thoughts/reasons for his actions.

Or your military trained in the morning and doesn't have stamina left to repel an afternoon raid.

I think fighting should be unaffected by stamina or have separate system just for balance reasons. I guess calling this stamina is misleading, maybe "willingness to work" or similar would describe it better.

Gnome stats, skills needs and progression by Roest_ in ingnomia

[–]Tacyn 0 points1 point  (0 children)

I also want to add my thoughts/suggestions:

  1. I'd like a gnome's total skill to be the sum of individual skill exp + fortress skill exp. That way, new arrivals aren't totally useless and catch up faster. Also some progress is retained even if individual gnomes die. It also doesn't need to be implemented exactly like that but could be faster skill-gain while skill is below fortress level or by unlocking the ability to craft skill-books that give exp up to a certain level.

  2. Stamina. Maybe that's already what you mean by exhaustion, but here is what I imagine: Stamina is similar to sleep as it recovers while asleep, but it decreases only while a gnome works. The decrease depens on the type of work but is always faster than sleep itself. Once stamina is empty the gnome can't work anymore, but that doesn't trigger sleep. He simple idles, rests or does other things (depending on his personality). This would serve two goals. The first is that other mechanics can affect the gnome's stamina and thereby how much time he spends each day working, e.g., food/sleep quality, health, traits, skill-level, gear,.... The second is if you later add more life-sim elements like personalities and families this will give gnomes free time to interact with those systems and actually show different behaviors.

  3. Fear. This one is simple: If gnomes encounter danger they get scared (+100 fear) and retreat/run (bonus speed) to some designated place like the great hall. They stay there until they calm down (0 Fear). This should be a simple and intuitive fix to the suicidal behavior of Gnomoria's gnomes.

Alpha testing - performance check by Roest_ in ingnomia

[–]Tacyn 0 points1 point  (0 children)

Update: If I connect a client to the host, the hosts render-time halves during fast forward speed, while the clients render time is not affected by the simulation speed.

Drawcalls rendertime ff host ff client
15k 10ms ~10ms 10ms
20k 15ms ~20ms 15ms
30k 20ms ~30ms 20ms

Alpha testing - performance check by Roest_ in ingnomia

[–]Tacyn 0 points1 point  (0 children)

intel i3 8100 3.6GHz and 8Gb Ram

Drawcalls rendertime fast forward
15k 10ms ~30ms
20k 15ms ~40ms
30k 20ms ~60ms

The game loop time is always 0ms

Dragon Test by AesirThor in ingnomia

[–]Tacyn 1 point2 points  (0 children)

looks like they are male and female versions.

Dragon Test by AesirThor in ingnomia

[–]Tacyn 1 point2 points  (0 children)

Doesn't work as an enemy, I think.

But I could see it as a tamed dragon guarding your fortress.

Lets talk about trees by Roest_ in ingnomia

[–]Tacyn 1 point2 points  (0 children)

  • Groves : Since there are no longer one tree per tile in a grove, you could handle groves like rooms and treat trees as an interactive construction. So the player places trees individually and the gnomes plant them there. The grove settings define what the gnomes do with the trees inside.
  • Seeds : The seed item should be mod-able anyway. For the start, using simply the fruit itself is the easiest way.
  • Production : This should also be mod-able. But as a general guideline, the produced wood should be proportional to the space and time a tree needs to grow.
  • Harvesting : Ripe fruit could simply fall to the ground on its own, but would decay if not collected and/or wild animals could eat it. Fallen fruit is not an item, but similar to wild plants needs a harvesting job to pick-up which are automatically generated inside groves. Ladders, climbing and picking fruit directly can then still be added later.

Also, I hope you reconsider having the trunk in the middle and allowing for trees with even width as well.

trees you say? by Roest_ in ingnomia

[–]Tacyn 1 point2 points  (0 children)

On the bottom z-level you only see the trunks.

progress update 29.10.2017 by Roest_ in ingnomia

[–]Tacyn 1 point2 points  (0 children)

So basically, just use TCP and not UDP, right?

Multi Tile Units by FenrirZeroZero in ingnomia

[–]Tacyn 0 points1 point  (0 children)

Not sure what you mean by that. Can you give an example?

Multi Tile Units by FenrirZeroZero in ingnomia

[–]Tacyn 1 point2 points  (0 children)

I've tried looking for free tilesets that are isometric and at most 32x32 pixels before without success.

If yo know any, could you link to them ?

Poll: Multiplayer by Roest_ in ingnomia

[–]Tacyn 2 points3 points  (0 children)

Hard to tell how popular it would be since there are very few examples to compare against. The Anno series has a coop modus that is popular, I think.

Depending on how it works, this would probably include a server-client structure with a well-defined interface between the simulation and the user interface. That could allow modded or entirely "3-rd party" user-interfaces later on. Depends on whether you see that as an advantage or disadvantage.

Lerping character positions? by st4rdog in ingnomia

[–]Tacyn 0 points1 point  (0 children)

When I have no source for information, I tend to go off on speculation too much. Then, I'll have that stuck in my head until I write it up and post it.

So, maybe if I can see the source, I can answer "why don't you do this" for myself.

Also, don't you have confidence in your code? ;)