The most recent thing I've done in my world simulation is to break up the 1:1 correspondence of languages and nation-states. Each tile on the map can now contain any number of different population communities, each with its own racial makeup, language, national identity and "culture" (for the moment, just a flag indicating whether or not they use agriculture), and each state is a collection of tiles.
States start out tied to a single language, nationality, and racial composition, but as populations expand and intermingle, these change: small speaking populations switch to more common languages, racial compositions converge, and communities take up agriculture when surrounded by other farmers.
Conflict and trade decisions are still made at the state level, and states can still expand and break up over time, though these mechanics both affect and are affected by the new variables. Polyglot states tend to stay that way, but if a state with a strong dominant language absorbs neighbors, the conquerors will either convert people to the dominant language or find their own language subsumed into the conquered's (if a resource-rich state is able to conquer a more populous one). When nations break up, the lines of fracture are more likely to fall along national and linguistic lines, which has the potential to have states overextend imperialistically and then balkanize.
I think one missing possibility here is when there are a bunch of adjacent fellow national/linguistic minorities in distinct neighboring states (Kurds would be a real life example): they should be able to break off together into a new state (or be absorbed into a similarly composed neighbor), but right now the decision about whether a state can break apart is based only on its own size.
This screenshot highlights the state of Ridhef, in which after 50 years of history, its founding Rid people still constitute the majority, at 61% of the population. They speak three dialects of their original Ridchiz language (languages branch into dialects when their speaking populations are cut off from one another).
The Ungyech are a sizeable minority of 17% (their original state was probably conquered), and while many speak one of the Ridchiz dialects, others speak Ugea (not sure if that is their original language, as languages are currently named by adding a suffix to the nationality name and "Ugea" seems pretty far from "Ungyech").
Also significant are the Thithe and Wid people, at 10% and 9% of the population respectively. Thithes speak two different Ridchiz dialects as well as five dialects of E'pez (again, not sure where that came from, does not seem etymologically related to "Thithe"). Wids mostly speak three dialects of their original Widmi language, and some speak Ridchiz.
There are three more small minority nationalities, whose populations probably migrated rather than being conquered: the Se speaking their original Sebezh, Echash speaking Ngiegem and Ethe speaking Neqe, though only the Se don't have a majority speaking Ridchiz.
Code.
Friday, November 30, 2018
Wednesday, January 31, 2018
Making History
The next phase of the planet simulation involves the history of people on a smaller scale. First, every terrestrial hex tile is subdivided by two levels, from its prehistorical status,
to a view with national boundaries along finer boundaries (two "steps" finer, roughly 120km apart, versus the coarser tiles separated by about 365km):
The next step is populating each tile with flora and fauna, based on the local climate (lighter tiles support more species):
Nations are created by picking random capital tiles probabilistically based on the tile's characteristics (climate, whether its population is agricultural or not), then assigning other tiles to a capital based on proximity modified by local concerns (mainly terrain features, like what Martin O'Leary describes here).
Each nation gets its own language, currently just a word for each species within its bounds; they evolve through sound changes and borrowing words from other languages (through trade or conquest). There's a separate mode to play with languages:
As time advances (also on a smaller scale, 25 years or a single human generation, per tick), nations trade with neighbors when they can benefit mutually, merge together when one has the strength and reason to take over another, and split up when they get too big. Languages borrow words for species as they encounter them (through trade or expansion).
Here's the same world from before, 450 years later:
The yellow highlighted area shows one huge nation that's selected, with part of its language visible in the detail panel on the bottom. Dark green tiles are boundaries between nations with trade relationships and dark red ones represent unresolved conflicts.
Code here.
to a view with national boundaries along finer boundaries (two "steps" finer, roughly 120km apart, versus the coarser tiles separated by about 365km):
The next step is populating each tile with flora and fauna, based on the local climate (lighter tiles support more species):
Nations are created by picking random capital tiles probabilistically based on the tile's characteristics (climate, whether its population is agricultural or not), then assigning other tiles to a capital based on proximity modified by local concerns (mainly terrain features, like what Martin O'Leary describes here).
Each nation gets its own language, currently just a word for each species within its bounds; they evolve through sound changes and borrowing words from other languages (through trade or conquest). There's a separate mode to play with languages:
As time advances (also on a smaller scale, 25 years or a single human generation, per tick), nations trade with neighbors when they can benefit mutually, merge together when one has the strength and reason to take over another, and split up when they get too big. Languages borrow words for species as they encounter them (through trade or expansion).
Here's the same world from before, 450 years later:
The yellow highlighted area shows one huge nation that's selected, with part of its language visible in the detail panel on the bottom. Dark green tiles are boundaries between nations with trade relationships and dark red ones represent unresolved conflicts.
Code here.
Sunday, December 31, 2017
Gridding the Sphere
While trying to dig up an awesome tectonics simulation I had found before (it was Tectonics.js, and it is even awesomer now than it had been when I saw it before, with a plausible ocean crust simulation that drives the tectonics), I came across Andy Gainey's planet generator, and he took a really cool approach to the problem of tiling a sphere in hexagons.
Basically, he found the bunch-of-hexagons-with-twelve-regularly-positioned-pentagons grid aesthetically offensive, and solved it by introducing a bunch more random irregularities, replacing a number of clusters of four hexagons with pairs of pentagons and heptagons. Basically, the twelve extra pentagons are still in there, but they disappear among all the other new irregularities, and it ends up looking really cool:
Anyway, a neat idea.
Basically, he found the bunch-of-hexagons-with-twelve-regularly-positioned-pentagons grid aesthetically offensive, and solved it by introducing a bunch more random irregularities, replacing a number of clusters of four hexagons with pairs of pentagons and heptagons. Basically, the twelve extra pentagons are still in there, but they disappear among all the other new irregularities, and it ends up looking really cool:
Anyway, a neat idea.
Thursday, June 8, 2017
The Humanity
I recently picked up my old planet simulation code, which a couple years ago I had modified to run on a mostly-hex grid. I think I just got busy at that time and stopped working on it, but also was frustrated because, after the hex change, it was running too slow to make the evolving world much fun to watch.
My initial thought recently was to port the simulation to C++ so it would be real fast and hence fun again, but I quickly realized that the main source of slowness was just rendering, so I fixed that enough to make it fun and now I'm still just hacking away in Python.
I added a human population simulation: once a world has life, there is a probability that humans will pop up on some savanna, and then they spread out from there, initially sticking to amenable climates along the coast and then becoming more dense and spreading out when they develop agriculture. All of this takes place on a much shorter timescale, so tectonic plates have stopped moving and glaciers are advancing and retreating.
Here is some early humanity (light yellow-gray in the lower-right) in the midst of a glacial period:
here is how they spread out to other continents as glaciers retreat:
and here is how the population explodes when agriculture pops up (the brighter yellow) as glaciation hits a minimum:
This is the new slow point (~10s per simulation step), which gets frustrating, but maybe that can be improved.
The code is now officially GPL.
My initial thought recently was to port the simulation to C++ so it would be real fast and hence fun again, but I quickly realized that the main source of slowness was just rendering, so I fixed that enough to make it fun and now I'm still just hacking away in Python.
I added a human population simulation: once a world has life, there is a probability that humans will pop up on some savanna, and then they spread out from there, initially sticking to amenable climates along the coast and then becoming more dense and spreading out when they develop agriculture. All of this takes place on a much shorter timescale, so tectonic plates have stopped moving and glaciers are advancing and retreating.
Here is some early humanity (light yellow-gray in the lower-right) in the midst of a glacial period:
here is how they spread out to other continents as glaciers retreat:
The code is now officially GPL.
Sunday, January 26, 2014
Hextonics
Updated the old tectonics simulation to work on the mostly-hex grid. It was relatively painless: most of the codebase had been written with the idea of "tiles" on a planet just being points on the unit sphere, each with some arbitrary number of neighbors.
The climate model, such as it is, was pretty much hacked in from earlier experimental code that had made more assumptions about data structures, so there was some refactoring to take care of there. But otherwise it seems to work like before, just on a bunch of hexes instead of a bunch of rectangles.
Two sides of a planet:
Source here: https://github.com/tps12/Tec-Nine/commit/2f49be89c5d36a5ca1b8236e9aa6044d51ee4a9d
The climate model, such as it is, was pretty much hacked in from earlier experimental code that had made more assumptions about data structures, so there was some refactoring to take care of there. But otherwise it seems to work like before, just on a bunch of hexes instead of a bunch of rectangles.
Two sides of a planet:
Source here: https://github.com/tps12/Tec-Nine/commit/2f49be89c5d36a5ca1b8236e9aa6044d51ee4a9d
Sunday, November 3, 2013
Tiling a Sphere With Mostly Hexagons
I saw this thing where a person generates planets using a grid that looks like a bunch of hexagons: https://github.com/vraid/earthgen-old
Hexagon-based grids are popular for things like strategy games, because adjacent tiles are separated by a constant distance. I used the math from vraid's code as the basis for a demo of this kind of tiling system. This video shows sphere tiled with RGB colors based on each tile's vector location on the unit sphere, and a 2D detail view for navigating around a local region of the grid:
The grid starts as a dodecahedron (made of twelve pentagons), and each vertex is squashed into a hexagon to produce a soccer ball shape. That process is repeated to create each higher resolution grid. This video demonstrates the process, sampling from ETOPO1 data to color each tile:
One really cool thing is that you can define these grids lazily, with hex locations determined for only a small region of the sphere at a given resolution.
You can imagine a game where an entire planet's climate is simulated with 500km tiles, the weather for a single continent is simulated with 10km tiles, battles take place on a grid of 10m tiles, and hand-to-hand combat on a grid of 1m tiles. (The memory cost to store even a single byte of data for each tile of a planet-sized sphere at this resolution would be prohibitive.)
This video shows a grid lazily subdivided to achieve this kind of resolution, using a noise function to color the tiles:
As mentioned above, the grid begins as a grid of pentagons. At each iteration of the vertex-squashing process, the previous grid's faces are carried over to the new one with the same number of sides and centered at the same location on the unit sphere; while each of the previous grid's vertices becomes a hexagonal face of the new grid.
As a consequence, the twelve initial pentagons can be found in the grid for each resolution. Trying to render these in a 2D local view can be challenging as they necessarily break up the hex grid. This video shows one option (other people who have talked about these kinds of grids, again in a game context, have proposed putting mountains or seas or some other inaccessible feature around each of the pentagon locations, to avoid having to deal with this entirely):
Code for my demo program is at https://github.com/tps12/hey-grid. Also vraid appears to be rewriting their code in Racket, which is interesting.
Hexagon-based grids are popular for things like strategy games, because adjacent tiles are separated by a constant distance. I used the math from vraid's code as the basis for a demo of this kind of tiling system. This video shows sphere tiled with RGB colors based on each tile's vector location on the unit sphere, and a 2D detail view for navigating around a local region of the grid:
You can imagine a game where an entire planet's climate is simulated with 500km tiles, the weather for a single continent is simulated with 10km tiles, battles take place on a grid of 10m tiles, and hand-to-hand combat on a grid of 1m tiles. (The memory cost to store even a single byte of data for each tile of a planet-sized sphere at this resolution would be prohibitive.)
This video shows a grid lazily subdivided to achieve this kind of resolution, using a noise function to color the tiles:
As a consequence, the twelve initial pentagons can be found in the grid for each resolution. Trying to render these in a 2D local view can be challenging as they necessarily break up the hex grid. This video shows one option (other people who have talked about these kinds of grids, again in a game context, have proposed putting mountains or seas or some other inaccessible feature around each of the pentagon locations, to avoid having to deal with this entirely):
Friday, May 31, 2013
One Less MetroCard
I always thought "One Less MetroCard" would make a funny bike sticker in New York, where realistically very few bicycle commuters are opting out of driving a private car.
The new bike share is awesome, and the enormous corporate logos provide lots of good re-purposable real estate:
The new bike share is awesome, and the enormous corporate logos provide lots of good re-purposable real estate:
Zazzle wouldn't print it for me due to copyright issues, but trying an alternative.
Subscribe to:
Posts (Atom)