Releases: crhy/rhYciv
Release list
rhYciv 0.2.1
A map worth looking at, and the bugs that 0.2.0 shipped.
0.2.0 went out and was played hard for an evening, which is the best thing that
can happen to a release. This is what that found: a crash that killed any loaded
game the moment a city changed hands, goody huts that came back from the dead,
rivers that never joined up, and a sea painted almost black.
Install
| Platform | Download |
|---|---|
| Windows (x64) | rhYciv-0.2.1-win-x64.zip — extract the folder first, then run RaylibUI.exe |
| macOS (Apple silicon) | rhYciv-0.2.1-osx-arm64.zip — unzip, drag rhYciv.app to Applications |
| macOS (Intel) | rhYciv-0.2.1-osx-x64.zip — same |
| Linux (x64) | rhYciv-0.2.1-linux-x64.tar.gz — extract, run ./RaylibUI |
| Linux (Flatpak) | rhYciv-0.2.1-x86_64.flatpak |
Extract before running. Windows produces Could not load file or assembly 'System.Runtime' when the .exe is double-clicked while still inside the zip.
Nothing is wrong with the download.
The builds are unsigned. macOS: xattr -dr com.apple.quarantine /Applications/rhYciv.app. Windows: SmartScreen → More info → Run anyway.
The crash that ended loaded games
Capturing a city — by anyone, in any game loaded from a rhYciv save — threw a
NullReferenceException and took the game down. It was reported from a game at
turn 165 where barbarians took a city on their turn.
JsonSaveObjects.Scenario was declared null! and nothing ever assigned it, so
every game loaded from one of this game's own saves carried a null scenario.
Nothing reads it until a city changes hands, and then the game dies at that
moment. It hid because Civilization II's own reader does build one, so every
position imported from a .SAV was safe.
The map
The sea was a flat near-black fill. Open water was not being drawn with the
ocean painting at all — it came from the coastline tileset's own all-water tile,
which measures (6, 24, 50) and varies by two or three levels across the whole
diamond. The generator had been tuned against a photograph of a fjord, where the
sea is nearly black right up to the rock: a fair reading of a coast, applied to
every water tile on the map. Deep water now takes its colour and its swell from
the painting, and measures (24, 76, 132) varying by nearly forty.
The coast met the grass along a hard line. The shoreline ramp ended on exactly
the grassland painting's average colour and none of its grain — the right green,
perfectly smooth, against a tile full of texture. It takes the painting now, on
the far side of the sand so the beach is untouched.
Rivers never joined up, and it was not the art. A river is drawn as one
picture per tile chosen by which of its four edge-sharing neighbours also carry
a river — but the generator walked rivers through the eight-neighbour set,
including the four tiles that touch only at a corner. Two tiles sharing a corner
cannot be joined by any picture. Across three test worlds, 15 of 45, 18 of 50 and
19 of 44 river tiles were orphaned stubs: generated in one adjacency, drawn in
another.
And rivers now widen as they go. Four gauges — a trickle, a stream, a river,
an estuary — chosen by how far each tile sits from the sea along its own
watercourse, which is recovered by walking the river inland from its mouth. Every
painting in the art folder contributes: the cross-section is shared so tiles still
meet, and the variation along the stroke comes from a different painting for each
spoke.
Everything else that was reported
- Goody huts came back when a game was loaded. Where they are is computed from
the map seed rather than stored, so loading a game put one back on every square
that ever had one — including all the ones already entered. - A long press never armed the go-to.
MouseDownis raised on every frame the
button is held, so the timer was reset sixty times a second and the press was
never more than one frame old. - Zooming stopped the active unit blinking, because a zoom about the pointer
replaced the mode's own view with a plain static one that has no active unit. - A Diplomat destroyed an empty size-1 city instead of offering to buy it.
Whether a move was an attack or a move was decided on the units standing there,
and an undefended city has none — so the Diplomat walked in and took it the way
a warrior would. - Barbarians announced declarations of war, which Civ II never does: there they
are permanently at war with everyone and it is never stated. They are no longer
a party to the diplomatic model at all. - Civilisations you had never met offered you cease-fires, because declaring
war set the contact flag directly instead of making contact properly, so two
sides became acquainted without either being told. - Selling a building read like a refusal, and quitting the game only offered
the main menu. - One crash was being reported twice, the second time blaming the graphics
driver, because the managed handler wrote its report and left the session record
open for the next launch to find.
Multisampling is off by default
Every hard crash this game has been reported with happened with 4x multisampling
on, because until this release that was the only way it ran; the one long session
played without it ended cleanly, and the next session with it back on crashed
inside seven minutes. Two sessions prove nothing, and it is acted on because the
trade is so one-sided: this is a game of 2D sprites blitted axis-aligned, where
multisampling has almost nothing to antialias. RHYCIV_MSAA=1 turns it back on.
The remaining hard crash is not explained. It leaves no managed exception,
which means a fault below .NET. See issue #132.
Measuring a world against Civilization II's
RHYCIV_REPORT_MAP prints what a world is made of and RHYCIV_AUTOSTART_SIZE
generates at a named size, so a generated map and a Civ II save of the same
dimensions can be set beside each other. Twenty Civ II saves at 75×120 read
between 23.9% and 42.8% land, most of them between 24 and 31, with rivers on 2.3%
to 3.4% of it.
The rules comparison against Civ II continues in docs/CIV2-COMPARISON.md, which
records what has been measured, what agreed, what did not, and every source.
rhYciv 0.2.0
Twenty-one leaders across the table, and the rules checked against Civilization
II square by square.
Diplomacy is no longer a menu with nobody behind it: every civilisation has a
face, and talking to one keeps them in view from the first word to the last. And
the comparison against the original went deep enough this time that one city now
agrees with Civ II on every figure its city screen shows — which meant finding
out that imported games had been losing every wonder in the world.
Install
| Platform | Download |
|---|---|
| Windows (x64) | rhYciv-0.2.0-win-x64.zip — extract the folder first, then run RaylibUI.exe |
| macOS (Apple silicon) | rhYciv-0.2.0-osx-arm64.zip — unzip, drag rhYciv.app to Applications |
| macOS (Intel) | rhYciv-0.2.0-osx-x64.zip — same |
| Linux (x64) | rhYciv-0.2.0-linux-x64.tar.gz — extract, run ./RaylibUI |
| Linux (Flatpak) | rhYciv-0.2.0-x86_64.flatpak |
Extract before running. Windows produces Could not load file or assembly 'System.Runtime' when the .exe is double-clicked while still inside the zip: it
unpacks that one file to a temporary folder and runs it with none of the nine
hundred beside it. Nothing is wrong with the download.
The builds are unsigned. macOS: xattr -dr com.apple.quarantine /Applications/rhYciv.app. Windows: SmartScreen → More info → Run anyway.
An audience, not a menu
Talking to another civilisation used to be one dialog that asked everything at
once. It is an audience now, and you stay in it: What Will You Discuss? leads to
a proposal or a gift, each of those to the actual terms, and backing out of a
matter returns you to the audience rather than ending it. You leave when you say
farewell, which is how Civ II's own negotiations behave.
The other leader is there the whole time. Forty-two portraits, one for each of
the twenty-one civilisations in each gender — Montezuma and the Aztec Empress,
Cunobelinus and Boudica, Tomyris, Gunnhild, Washington, Gandhi — each with their
own banner, emblem and words.
Their court's attitude and your own reputation are stated in Civ II's own
vocabulary rather than words of this game's invention, so somebody who knows the
original can read a relationship at a glance: nine ranks from Worshipful down to
Enraged.
Every wonder in an imported game was missing
A Civ II save does not record wonders on its cities. It keeps a table near the
front of the file saying which city holds each of the twenty-eight, and this game
had always read that table and then dropped it on the floor. No city in any
imported game held any wonder at all. Cardiff lost the Great Library, Kells lost
Michelangelo's Chapel, and nothing anywhere said so.
It had a consequence nobody would have traced back to a save reader. Kells came
out of the save in civil disorder. It is not in disorder in Civ II, whose own
Happiness Analysis shows six content citizens with nothing red left; the
difference was Michelangelo's Chapel, which counts as a Cathedral in every city
its owner holds. What presented as a happiness bug was a missing wonder.
Trade routes were being paid Civilization I's formula
Civ II's standing trade route brings (T1 + T2 + 4) / 8 arrows a turn, halved
between two of your own cities, and distance does not enter it at all.
What this game had was (distance + 10) × (Ta + Tb) / 24 — which is
Civilization I's one-off payment for the caravan's delivery, charged again
every turn. Measured against Civ II on the same saved position, it paid four
arrows a turn where the original paid one.
The two games are constantly confused in forum threads, including in threads
whose titles say Civ2. That is exactly where this came from.
Rules corrected against the original
- A city square always produces at least one shield. Civ II's Civilopedia:
"if the city is built on Terrain that normally produces no Shields, one Shield
is automatically added". A city founded on plain grassland produced nothing at
all here until a citizen was put somewhere that did. - Whales are worth two shields and three trade, not one and two. It was the
only wrong figure in the whole terrain specials table, which has now been
checked entry by entry against the Civilopedia's own pages. - The city square is irrigated, not mined, on ground that permits either.
The Civilopedia says "irrigated or mined, depending on the type of terrain"
without saying which wins; a size-one city on hills in Civ II answers it.
One city that agrees completely
Cardiff, A.D. 1700, seven citizens under a Republic: food produced, eaten and
surplus, shields, support, production, base trade, its trade route, corruption,
its list of improvements and wonders, its citizens and its lack of disorder — every
figure identical to Civ II's.
That is the first city to match on everything, and it matters because it means the
terrain reading, the city square rules, the government, the trade route formula,
the improvements and the happiness model are all correct together, on a real
position in a real game.
What still disagrees, honestly: corruption. Two cities the same distance from
the capital bracket Civ II's rate between a tenth and a sixteenth of trade, where
this game takes about a fifth. The distance term is the suspect and it will not be
changed without a source. The caravan delivery payment and waste have never been
compared at all.
All of it — what was measured, what agreed, what did not, every source and what
each was used to decide — is in docs/CIV2-COMPARISON.md.
Also in this release
- Settlers can no longer be announced as though they were a completed warrior, and
the quiet units stay quiet. - The city screen's resource panel reads as four separate accounts rather than
four rows of small pictures on grey, with the food store and shield box drawn as
ramps. - Fonts carry Latin-1 and Latin Extended-A, so accented leader and city names
render instead of dropping to boxes. - A headless screenshot harness can now walk a nested dialog and photograph each
page, which is how the audience above was checked without a mouse.
rhYciv 0.1.9
The map, under the hands.
A short release on top of 0.1.8, all of it about how the map behaves while you
are working it: the zoom, the shading at the edge of what you have explored, and
one marker that was drawn several times the size it meant.
Install
| Platform | Download |
|---|---|
| Windows (x64) | rhYciv-0.1.9-win-x64.zip — unzip, run RaylibUI.exe |
| macOS (Apple silicon) | rhYciv-0.1.9-osx-arm64.zip — unzip, drag rhYciv.app to Applications |
| macOS (Intel) | rhYciv-0.1.9-osx-x64.zip — same |
| Linux (x64) | rhYciv-0.1.9-linux-x64.tar.gz — extract, run ./RaylibUI |
| Linux (Flatpak) | rhYciv-0.1.9-x86_64.flatpak |
Nothing else is needed. No commercial Civilization II installation, no runtime to install — each download carries its own .NET runtime and the complete art set.
The builds are unsigned — please read this before reporting a launch failure
They are not code-signed, because signing certificates cost money this project does not have yet. Both desktop platforms will try to stop you:
macOS will say the app "is damaged and can't be opened" or is from an unidentified developer. It is not damaged; that is the quarantine flag on anything downloaded unsigned. Clear it:
xattr -dr com.apple.quarantine /Applications/rhYciv.app
Windows will show a SmartScreen warning. Choose More info → Run anyway.
Linux Flatpak:
flatpak install --user ./rhYciv-0.1.9-x86_64.flatpak
flatpak run io.github.crhy.rhYciv
Zoom moves in even steps
The scale was linear in (8 + zoom) / 8. That sounds harmless and is not: it
made one step of the wheel do wildly different things depending on where you
already were.
| zoom | scale | one step of the wheel |
|---|---|---|
| −7 → −6 | 0.125 → 0.25 | ×2.0 |
| 0 → 1 | 1.0 → 1.125 | ×1.13 |
| 31 → 32 | 4.875 → 5.0 | ×1.026 |
A factor of nearly forty between the largest step and the smallest. Zoomed out
the map leapt about; zoomed in the wheel appeared to do nothing at all.
The scale is geometric now: every step is nine per cent, and eight of them
double it. The ends of the range moved to −24…19 so the reachable scale stays
about what it was — an eighth of normal up to five times it.
Zoom goes towards the pointer
Ctrl and the wheel changed the zoom and left the view centred on the active
unit, so the square you were aiming at slid away from the cursor — worse the
further it was from the unit.
The point of the map under the cursor is now put back under the cursor after the
step. Not "centre the square under the cursor", which is a different thing and
looks worse: that throws the square to the middle of the screen on the first
click and swings the rest of the map around it.
From zoom 4 upwards the square under the pointer is identical at every step of a
sweep to the maximum. Below that it can still drift by up to a square a step,
where the tiles are small enough that a pixel of rounding is a sizeable fraction
of one.
The weird diamond shadows
Every square on the frontier of the explored map is given a softening where it
meets unexplored ground. The mask for it is a 32×16 checkerboard, drawn when
Civ II's squares were 64×32 and a chequer of alternating pixels read as a shade.
Terrain composes at several times that size now, so the same mask was stretched
until each of its pixels was a block several across — and what was a shade became
a coarse dark patch covering a quarter of the square. On every square bordering
the unknown, which is why the shadows traced the edge of the black. The city
window showed them for the same reason: the squares at the edge of a city's
radius are frontier squares too.
Above classic resolution the softening is left out. It was not doing anything the
eye reads as softening there, and the edge of the known world is a clean
isometric boundary without it.
The grassland shield is a marker again
It marks a square as yielding an extra shield. At 0.44 of the tile it covered
most of the square; taken to 0.22 it still read as an object lying in the field —
a stone medallion the size of a manhole cover, dropped in the grass and competing
with whatever was standing there. It is an eighth of the tile now, which reads as
a token on the ground, which is what it is.
rhYciv 0.1.8
Saved games that can be loaded again, and cities that grow.
Two faults in this release had been quietly ruining whole games. Neither of them
looked like a fault in any one place: a saved game reported success and was
written unreadable, and cities stopped growing because of a rule about what a
civilisation can see.
Install
| Platform | Download |
|---|---|
| Windows (x64) | rhYciv-0.1.8-win-x64.zip — unzip, run RaylibUI.exe |
| macOS (Apple silicon) | rhYciv-0.1.8-osx-arm64.zip — unzip, drag rhYciv.app to Applications |
| macOS (Intel) | rhYciv-0.1.8-osx-x64.zip — same |
| Linux (x64) | rhYciv-0.1.8-linux-x64.tar.gz — extract, run ./RaylibUI |
| Linux (Flatpak) | rhYciv-0.1.8-x86_64.flatpak |
Nothing else is needed. No commercial Civilization II installation, no runtime to install — each download carries its own .NET runtime and the complete art set.
The builds are unsigned — please read this before reporting a launch failure
They are not code-signed, because signing certificates cost money this project does not have yet. Both desktop platforms will try to stop you:
macOS will say the app "is damaged and can't be opened" or is from an unidentified developer. It is not damaged; that is the quarantine flag on anything downloaded unsigned. Clear it:
xattr -dr com.apple.quarantine /Applications/rhYciv.app
Windows will show a SmartScreen warning. Choose More info → Run anyway.
Linux Flatpak:
flatpak install --user ./rhYciv-0.1.8-x86_64.flatpak
flatpak run io.github.crhy.rhYciv
Your saved games open again
Saving worked. Loading did not, and the reason was three steps removed from
anything about saving.
The save writer asks .NET what type each field is and writes it accordingly. A
field that holds a value, or nothing at all — a research goal that may not have
been chosen yet — is a kind of type that answers "object" to that question, so
the writer took the branch that writes an object and produced {} where a number
belonged. Nothing complained. The failure came on the way back in, where the
reader wants a number, finds an object, and gives up on the entire file.
A research goal is set the first time you answer the research prompt. So in
practice every real saved game was written unreadable: the game said the save
had succeeded, and would not open it again. The turns of anarchy after a
revolution and a city's stolen technology went the same way.
The writer produces a number now, and the reader accepts the damaged form as
"not set" — so the saves already on your disk open rather than being lost.
Telling you the save could not be read used to crash on its own account, which is
the worst possible moment for a second fault. That is fixed too.
Cities grow
A citizen is only put to work on a square its civilisation can see, and founding
a city revealed nothing at all: the engine marked no squares, and the interface
marked only the one the settler was standing on. A new city therefore worked its
own centre square and nothing else — two food produced, two food eaten, no
surplus, and no growth ever — and sat at size one until a unit happened to wander
across its fields.
Nothing about that looks wrong in any one place. The food box is right, the
growth rule is right, and the worker assignment is right. They simply could not
agree.
What it looked like from the outside was a game where nothing ever got bigger: a
saved game from AD 1220, turn 162, held thirty-four cities across the whole
world and the largest was size four. A city now goes from size one to size
three inside thirty turns.
Clicks that register
Clicking away to another window and clicking back stopped units being selectable.
Whether a click could begin on a control was decided once, when the pointer
entered it — and entering with a button already down, which is exactly what the
click that raises the window looks like, left it refusing clicks with nothing to
re-arm it. The map is one control filling most of the window, so there was
nowhere to leave and re-enter: the only way out was to sweep the pointer over the
menu bar and back.
Winning and losing end the game
Both used to be a message and nothing more. A player whose last city fell was
told their civilisation had passed into memory, and was then left sitting in a
game they no longer had a civilisation in: no turn ever came round to them again,
and the only way out was to quit the program. Winning was the same — the world
was yours, and then you went on playing it. Either screen now returns you to the
main menu.
Zoom follows the pointer
Ctrl and the wheel changed the zoom and left the view centred on the active unit,
so the square you were aiming at slid away from the cursor — worse the further it
was from the unit. Zooming in now anchors on the square under the pointer, so
what you are pointing at stays where it is. Zooming back out past normal lets go,
and the view returns to following the unit whose turn it is.
The horizontal shift that decides which column of a round world the drawing
starts from was also being changed while the whole map was on screen, where it is
not used — so selecting a unit while zoomed out quietly rotated the world
sideways, and the rotation only appeared on the next step of zoom.
A city says everything it has to say at once
A city that came out of disorder and finished a unit in the same turn asked
twice, and answering "zoom to city" on the first opened the city window with the
second message still queued behind it — so the news arrived after you had already
looked at the city it was about. Everything one city has to report now arrives as
one message with one Zoom to City to answer.
Digging in is worth something again
The defence sum is worked out in fractions — fortifying is half again, a river
half a step, forest and jungle half again — and every one of those fractions was
thrown away at the end by rounding the result down to a whole number. The
attacker's side of the same sum was never rounded, so the loss was all the
defender's.
On tens and hundreds that costs nothing, which is why it survived a test suite
that covers this closely. On the numbers the game actually uses it cost the
defender the bonus outright: Warriors defend at 1, so fortifying took them to
1.5 and the rounding took them straight back to 1. Digging in did nothing
whatever for the unit most often left holding a new city — which is the shape of
"barbarian horsemen kill the fortified city warrior every time".
Two more defence rules were checked against Civ II rather than against this
project's own notes, because the notes were wrong:
- City Walls supersede the fortification bonus rather than multiplying with
it. A fortified garrison behind walls was defending at ×4.5 where Civ II gives
×3. The same goes for a fortress. - City Walls answer land attacks only, which was not being checked at all.
- A river adds half a step to the terrain adjustment rather than multiplying
it by a further quarter. As a ×1.25 the two agreed on hills, by coincidence,
and nowhere else.
And for the record, since it is the natural next assumption: there is no
defence bonus in Civ II for merely standing in a city, and city size does not
affect defence. What a city gives a defender is City Walls.
Barbarians who were not in a village
Every barbarian in the game came out of a goody hut: a unit walked into a village
and something unpleasant came out of it. Nothing ever rose out of empty country
or came ashore from the sea, so a civilisation that had cleared the huts near it
was never troubled again — and the Barbarity question in the new-game dialog
chose between four levels of a thing that only happened when you went looking for
it.
Raiders now appear in somebody's country every so often: more often the higher
the setting, and never on Villages Only, which is what it says. Who they come
for is weighted by how much each civilisation has worth taking. They land three
to five squares out rather than on top of a city, and they arrive with their
moves already spent, so the city gets a turn to prepare.
The first two dozen turns are left alone deliberately. A size-one city with one
warrior in it has no answer to a horde, and losing to one before the game has
started is a wasted session rather than a difficulty setting.
Smaller things
- City names on the map are sized to be read rather than growing with the
zoom until the name is wider than the city. "Carthago" was being drawn three
times the width of Carthage. - The fortification marker in the city window is fitted to the unit standing
in it, rather than to a map tile there is none of in a list row. - The website states the version it is actually offering. The front page
carried "Download 0.1.2" as typed-in text and stayed there while five releases
went out. Everything the page says about the build is now read from the build. - A crash that kills the process before any handler can run leaves something
behind. The packaged launcher keeps what the game and the runtime printed, and
the next launch folds it into the crash report — which is the difference between
"it crashed on turn 49" and knowing why. - A repeating scheduled job runs more than once. The scheduler replaced an
entry of the same name in place, and the loop removed the entry after running
it, so an action that asked to be run again wrote its next run into the very
slot about to be removed.
rhYciv 0.1.7
Whole features that shipped and had never once run.
Every one of these was already in the game: written, saved, drawn, and unable to
happen. Diplomacy, trade routes, pollution and the Wonders report were all
carried in the save format and read by nothing, forty-five menu entries were
drawn with no command behind them, and the computer civilisations were not
researching anything at all.
Install
| Platform | Download |
|---|---|
| Windows (x64) | rhYciv-0.1.7-win-x64.zip — unzip, run RaylibUI.exe |
| macOS (Apple silicon) | rhYciv-0.1.7-osx-arm64.zip — unzip, drag rhYciv.app to Applications |
| macOS (Intel) | rhYciv-0.1.7-osx-x64.zip — same |
| Linux (x64) | rhYciv-0.1.7-linux-x64.tar.gz — extract, run ./RaylibUI |
| Linux (Flatpak) | rhYciv-0.1.7-x86_64.flatpak |
Nothing else is needed. No commercial Civilization II installation, no runtime to install — each download carries its own .NET runtime and the complete art set.
The builds are unsigned — please read this before reporting a launch failure
They are not code-signed, because signing certificates cost money this project does not have yet. Both desktop platforms will try to stop you:
macOS will say the app "is damaged and can't be opened" or is from an unidentified developer. It is not damaged; that is the quarantine flag on anything downloaded unsigned. Clear it:
xattr -dr com.apple.quarantine /Applications/rhYciv.app
Windows will show a SmartScreen warning. Choose More info → Run anyway.
Linux Flatpak:
flatpak install --user ./rhYciv-0.1.7-x86_64.flatpak
flatpak run io.github.crhy.rhYciv
You can talk to the other civilisations
Contact, cease-fires, peace treaties, alliances, embassies, reputation and
attitude have been carried in every saved game since the beginning and read by
nothing. Civilisations met by walking into each other, and from that moment
there was no way to end a war, start one deliberately, or make a gift. They
fought until one of them was gone.
Civilisations now meet when their units or cities come in sight of each other,
and a Foreign Ministry (Kingdom menu, or Ctrl+D) opens a parley with anyone
you have met: cease-fire, peace, alliance, a declaration of war, a gift of gold
or of an advance. Computer civilisations answer on their own terms — weighing
what they think of you against how the war is going — and come asking for a
cease-fire themselves when they are losing, so a war is no longer something
only you can end. A Diplomat can establish an embassy, which is the first
thing Civ II's Diplomat is for and the one thing this one could not do.
Treaties bind them the way Civ II's treaties bind, which is to say not
reliably. What holds a computer civilisation back is thinking well of you
rather than the piece of paper: nobody moves while their attitude is above
neutral, and below it they turn on the weak, on anyone whose economy has
eclipsed theirs, and on anyone whose own word is worthless. Breaking a treaty
costs two black marks, one fades every twenty-four turns times the
difficulty, and every civilisation that has met you thinks less of you for it.
The parley screen shows their opinion of you and your own reputation, because in
the original both are what you learn to read.
Nuclear Gandhi is reproduced deliberately. India beelines for fission and
rocketry, builds warheads ahead of anything else, and having built them stops
finding treaties interesting. A nuclear strike works as Civ II's does:
everything on the square dies, a city loses half its people, and the ground
around it is left poisoned.
Caravans trade
Cities were given commodities to supply and demand, the city window had a line
for trade routes that read a literal "+xx", the map drew the routes as golden
threads between cities, the save format carried them — and nothing in the game
could create one. A caravan reaching a foreign city was refused as a failed
attack; a caravan reaching one of its own cities simply stood there.
A caravan arriving now offers what Civ II offers: open a trade route, put
its cargo into a wonder the city is building, or go on to a better market. What
the route is worth is shown before the caravan is spent on it, since that is the
whole basis for deciding whether to trade here or push on. Routes follow Civ II's
arithmetic — the distance plus ten, times the trade the two cities make, over
twenty-four, halved on the same continent and halved again within one
civilisation — so the profitable routes are the long ones to strangers, and a
city that wants what the caravan carries pays twice over. Routes then bring
their cities trade every turn, which is what makes them worth opening.
Wonders are unique, and the world hears about them
Nothing stopped two civilisations — or two cities of one civilisation — from
each raising the Pyramids and each taking the benefit. A finished wonder is now
withdrawn from every build list in the world, and a city that was building it is
told the race is lost and picks something else, keeping the shields it has spent.
Civ II's three notices all arrive: scaffolds going up are news everywhere, a
wonder passing three quarters of its cost is told to the civilisations racing for
the same one, and a completed wonder is announced to everybody. Capturing a city
that holds wonders reports them.
The Wonders of the World report (F7) built one blank row per city of your own
civilisation and filled in nothing at all, so the one place in the game that
answers "who has built what" answered nothing. It lists every wonder with the
city that holds it, or who is working on it, or that nobody has started.
Pollution, and the climate
A city works out how much pollution it produces, the improvement exists with art
to draw it, settlers can be ordered to clear it, and the messages were written —
and nothing ever put a single square of it on the map, so Mass Transit, the
Recycling Center, the Solar Plant, Hoover Dam and the Eiffel Tower were all
defending against something that could not occur.
A city now rolls its pollution figure each turn against one square of its own
working radius. The square loses half its yield until it is cleaned, and you are
told and shown which one. Left uncleaned, enough of it shifts the climate: forest
becomes jungle, grassland swamp, plains and tundra desert. Global warming is
off by default and turned on in the new Advanced Settings dialog, along
with the cheat and editor menus, which no longer appear on the menu bar unless
you ask for them.
Computer civilisations' settlers could not improve terrain at all — they
founded cities and then wandered, so their land was never irrigated, mined or
roaded, and none of their pollution would ever have been cleaned. They work their
land now.
Menus that lead somewhere
Forty-five entries across the Game, View, Orders, World, Cheat and Editor menus
were drawn with no command behind them: you clicked and nothing happened.
Most of them had working commands the menu simply never reached.
Build Mines, Build Fortress, Build Airbase and Clear Pollution were all
implemented and unreachable — the Orders menu's template for generating one entry
per terrain improvement was keyed to irrigation, so it generated nothing, and
Build Mines pointed at a command id the command does not have. Move Pieces, View
Pieces, Center View and Activate Unit had no commands at all and now do; V swaps
between moving and viewing as it does in Civ II. What is genuinely not
implemented is left out of the menus rather than advertised, and a test now fails
on any new entry that neither names a command nor says it should be hidden.
All eleven City Report Options were read from their dialog, written back,
defaulted to off, and then consulted by nothing: turning a message off left it
arriving anyway. They default on, as in Civ II, and each one now governs its
message.
The difficulty levels differ
The difficulty was asked for at the start of every game, written into the save,
and read in three places. Prince and Deity played very nearly the same game.
Computer civilisations pay 160% of the listed price for everything they build
on Chieftain, sliding to 80% on Deity, and at Emperor and Deity their cities
bank extra shields on top — Civ II's production box squeeze. Barbarians attack at
a quarter strength on Chieftain and half as hard again on Deity, which is
most of what makes a landing frightening on the high levels. You always pay the
listed price and get no help at any level.
Computer civilisations research now. Without a Lua script to choose for them
they researched nothing whatever for the entire game, which is why they were
still in the bronze age when you reached the moon.
A tutorial
The Tutorial help option has been written into every save and consulted by
nothing, because there was no tutorial to govern. It is on for Chieftain, Warlord
and Prince — the levels people learn on — and there is advice to go with it now:
how the number pad moves a unit, what a Settlers unit is for, what the city
window does, and how research is chosen. Each piece is shown once and remembered
between games; Advanced Settings has a checkbox to put it all back.
Known limitations
Multiplayer, several advisor screens, the space race, and the map and rules
editors are not implemented. Some interface art is still placeholder. Scripted
Lua dialogs do not work at all — see #110. What still needs finishing is tracked
in detail in the 0.1.7 to-do issue.
Each download is about 190 MB because it is fully self-contained. It cannot be
trimmed: the game discovers its interface implementations by reflection at
startup, and trimming removes exactly those assemblies.
Reporting problems
Please open an issue at https://github.com/crhy/rhYciv/issues. Say which platform and which download, and attach the log from:
- Linux...
rhYciv 0.1.6
The interface, and a government you can change.
Everything here came out of the 0.1.5 report in issue #115, or was found while
working through it. Two of them turned out to be features that had shipped and
never once run.
Install
| Platform | Download |
|---|---|
| Windows (x64) | rhYciv-0.1.6-win-x64.zip — unzip, run RaylibUI.exe |
| macOS (Apple silicon) | rhYciv-0.1.6-osx-arm64.zip — unzip, drag rhYciv.app to Applications |
| macOS (Intel) | rhYciv-0.1.6-osx-x64.zip — same |
| Linux (x64) | rhYciv-0.1.6-linux-x64.tar.gz — extract, run ./RaylibUI |
| Linux (Flatpak) | rhYciv-0.1.6-x86_64.flatpak |
Nothing else is needed. No commercial Civilization II installation, no runtime to install — each download carries its own .NET runtime and the complete art set.
The builds are unsigned — please read this before reporting a launch failure
They are not code-signed, because signing certificates cost money this project does not have yet. Both desktop platforms will try to stop you:
macOS will say the app "is damaged and can't be opened" or is from an unidentified developer. It is not damaged; that is the quarantine flag on anything downloaded unsigned. Clear it:
xattr -dr com.apple.quarantine /Applications/rhYciv.app
Windows will show a SmartScreen warning. Choose More info → Run anyway.
Linux Flatpak:
flatpak install --user ./rhYciv-0.1.6-x86_64.flatpak
flatpak run io.github.crhy.rhYciv
You can change how you are governed
REVOLUTION has been in the Kingdom menu since the menus were written with nothing behind it — drawn, and doing nothing when clicked. A civilisation was handed Despotism when the game began and stayed under it for the rest of the game however far it researched: Monarchy, The Republic, Communism and Democracy could all be discovered and none of them could be adopted, which takes the whole middle of Civ II off the board.
A revolution now costs two turns of Anarchy, and when those run out your people ask what they are to become. Researching an advance that opens a government offers the revolution there and then rather than leaving you to notice. Adopting one brings every city's rates, unit support, corruption and waste into line with it, and trims a rate the new government does not allow rather than letting an illegal one quietly stay in force. Computer civilisations revolt too — one left under Despotism all game is not playing the same game as you.
Diplomats and Spies do something at last
The Diplomat work that shipped in 0.1.4 had never once run. Every dialog it asks for by name was missing from the game's text, so the popup was looked up, not found, and nothing was shown: walking a Diplomat onto a lone enemy unit or an enemy city put up no offer whatever, and the unit stood there having achieved exactly what it achieved before the feature was written.
With that fixed, bribing a unit and inciting a city work. Two more are new:
Investigate City brings back a full account of somebody else's city — what it is building, what it has built, and, the reason anybody does this before an attack, what is standing in it. The city opens in a view-only window: Buy, Change and Rename are not there at all rather than present and inert, its citizens cannot be moved about, and its garrison cannot be given orders.
Steal Technology carries out one of its owner's secrets — an advance they know and you do not. A city can only be robbed once, however many agents follow; otherwise a rival capital is an endless supply of technology to anybody willing to keep building Diplomats.
Throughout, the Civ II cost: a Diplomat does not come home from any of it, and a Spy does, having spent a move. That difference is the whole argument for researching the Spy.
Dialogs
Every message is narrower and taller. They were set to 62% of the window, about a hundred and forty characters to a line at 1080p, which is hard to read and left each message as one long band across the middle of the screen. They are set to roughly the measure a book is set to now and grow downwards into a paragraph. A dialog is also never narrower than a line it is not allowed to break, so a long web address no longer runs out through the side of the frame.
Messages wait their turn. They were released the moment the one before closed, without looking at what that message had opened — so answering "zoom to city" on a disorder report put the city window up and the next report straight on top of it, covering the city you had just asked to look at. A queued message is now released only when nothing is in the way: no window open, nothing still being played out on the map. A dialog you asked for yourself is not held back.
Links to the site, Discord and Telegram are in the About dialog.
Lists
The Go To dialog can be left. It offers Ok and Cancel, and anything that was not Ok was taken as a request to swap between your own cities and everybody's — so Cancel reopened the dialog with the other list instead of closing it, and the only way out was to send the unit somewhere. The toggle has a button of its own now.
Find City finds the city. Its Ok was an empty branch with the one line that would have done the work commented out, so the command did nothing at all.
Typing a letter jumps to the next entry under it, at any list in the game — press R again for the next city under R. Row text is larger, and the research chooser's buttons read Goal, Info, Ok.
The city
Every square on the resource map can be clicked. The click worked out which square you meant from scratch — its own division of the position, its own corrections for the diagonal edges of a diamond, and an adjustment its author left a comment saying he did not understand — while drawing the same map used none of that. Squares the two disagreed about could not be selected at all.
Taking a city names it and opens it, and losing one says so; both were empty methods. The size beside a city's name keeps up with what it builds — building a settler takes a citizen and nothing told the map. An expensive item's shields fill the production box in rows, closing up and overlapping when there are too many to fit, rather than collapsing to a single row.
Rules
A starving city disbands a settler it supports before it loses a citizen, as Civ II does. The rest of the food box was checked against the original and matches.
A sleeping unit wakes when something hostile steps alongside it. It used to sleep through anything, so a stack left to hold a pass could be walked round, or attacked, without ever being offered to you. Fortified units are deliberately left alone.
Combat draws from the game's seeded generator, so a battle can be replayed from a saved game. It used its own random source, which made it the one part of a game that could not be reproduced from a report.
Also
City names and population numbers on the map are readable — 28px and 23px rather than 22 and 18. Left and right step between cities alphabetically. A list row scrolled out of view no longer paints its selection band out over the map.
Known limitations
Diplomacy, multiplayer and several advisor screens are not implemented yet. Some interface art is still placeholder. Scripted Lua dialogs do not work at all — see #110.
Each download is about 190 MB because it is fully self-contained. It cannot be trimmed: the game discovers its interface implementations by reflection at startup, and trimming removes exactly those assemblies.
Reporting problems
Please open an issue at https://github.com/crhy/rhYciv/issues. Say which platform and which download, and attach the log from:
- Linux
~/.local/share/rhYciv/Logs(Flatpak:~/.var/app/io.github.crhy.rhYciv/data/rhYciv/Logs) - Windows
%LOCALAPPDATA%\rhYciv\Logs - macOS
~/Library/Application Support/rhYciv/Logs
rhYciv 0.1.5
The game answers the keyboard and the mouse again.
The main thing reported against 0.1.4 in issue #114 was that the interface felt
unresponsive: Enter had to be pressed several times before a turn would end, and
selecting a unit or clicking a city often did nothing. There were two separate
causes, and both are fixed. Everything else here was found while measuring them.
Install
| Platform | Download |
|---|---|
| Windows (x64) | rhYciv-0.1.5-win-x64.zip — unzip, run RaylibUI.exe |
| macOS (Apple silicon) | rhYciv-0.1.5-osx-arm64.zip — unzip, drag rhYciv.app to Applications |
| macOS (Intel) | rhYciv-0.1.5-osx-x64.zip — same |
| Linux (x64) | rhYciv-0.1.5-linux-x64.tar.gz — extract, run ./RaylibUI |
| Linux (Flatpak) | rhYciv-0.1.5-x86_64.flatpak |
Nothing else is needed. No commercial Civilization II installation, no runtime to install — each download carries its own .NET runtime and the complete art set.
The builds are unsigned — please read this before reporting a launch failure
They are not code-signed, because signing certificates cost money this project does not have yet. Both desktop platforms will try to stop you:
macOS will say the app "is damaged and can't be opened" or is from an unidentified developer. It is not damaged; that is the quarantine flag on anything downloaded unsigned. Clear it:
xattr -dr com.apple.quarantine /Applications/rhYciv.app
Windows will show a SmartScreen warning. Choose More info → Run anyway.
Linux Flatpak:
flatpak install --user ./rhYciv-0.1.5-x86_64.flatpak
flatpak run io.github.crhy.rhYciv
Pressing Enter over and over
One press of End Turn plays one turn, not one civilisation.
Starting a civilisation's turn handed control back and waited. That is right for you and wrong for everybody else: a computer civilisation is not interactive, so nothing ever came back to ask it for its next unit. Each rival moved a single unit and then stopped, holding the turn. One press of End Turn advanced the world by one civilisation rather than one turn — so with eight rivals on the board you had to press Enter eight times, into a game that appeared to be ignoring you, before you could move again.
Two things followed from the same fault, and are fixed with it. Rival civilisations only ever moved their first unit, all game; they now move their whole armies. And none of their end-of-turn orders ever ran, so a computer unit told to fortify never became fortified and their settlers never finished a road or an irrigation ditch they had started.
A keypress is no longer lost because a frame ran long.
Keys were read by asking about every key on the keyboard once a frame. A key pressed and let go between two frames is already back up by the time it is asked about, so on any frame that ran long the press simply never happened. That is the other half of having to press Enter several times, and it is why a quick click sometimes did nothing. Keys now come from the window's own queue of what was actually pressed, which cannot lose one however briefly it was held.
Speed
Redrawing the map is about ten times faster. A screenful of map is a thousand tiles or more, and the whole picture is composed again whenever the view moves or anything on it changes. Every tile was handed to raylib's general-purpose image drawing, which resamples the tile to the size it is drawn at and then throws the answer away — once per tile, every redraw. Measured on a revealed map: seventeen to forty milliseconds before, two to three now.
That mattered for more than smoothness. A hundred-millisecond frame is long enough to swallow the click that follows it, which is why clicking a city sometimes had to be done twice.
A redraw happens when it is asked for. The static view of the map ticks once every two seconds, and a requested redraw waited for that tick — so ground coming into view, a city founded, a unit lost, or the grid being switched on could sit unseen for two seconds. A move being played out is still allowed to finish.
The side panel keeps answering the mouse. Almost everything in it is built again whenever the active unit changes, and the screen went on delivering the mouse to the controls that had just been replaced, so clicks in the panel did nothing until the pointer was moved away and back.
A rival's turn cannot queue up minutes of watching. Every move you can see is composed into a short animation the moment it happens. Now that rivals play a whole turn at once, a turn spent in sight of a dozen units would have built and then played a dozen of them; past a limit the move is drawn rather than animated.
Research
Choose Your Research has a Goal button. Name an advance to work towards — anything you do not already have, however far off — and the chooser will list only the research that leads there: the goal's outstanding prerequisites, and the goal itself once everything it needs is known. When nothing you can begin now brings the goal any nearer, it says so plainly rather than showing you an empty list. The goal is kept in saved games and retires itself when you reach it.
The chooser no longer asks the same question twice. The guard against a second chooser stacking behind the first was being cancelled every turn by the backstop meant to protect it: the engine asks for research from the start of the turn's bookkeeping, which runs before you are told the turn has begun, so the flag was cleared on the same turn it was set. It now lasts until the question has actually been answered.
For bug reports
RHYCIV_FRAME_LOG=<seconds> makes the game report how many frames it is drawing and how long the worst one took. A game that stops answering the keyboard is nearly always a game whose frames have grown long enough to swallow a keypress, and that is very hard to judge by eye.
Known limitations
Diplomacy, multiplayer and several advisor screens are not implemented yet. Some interface art is still placeholder. Scripted Lua dialogs do not work at all — see #110.
Each download is about 190 MB because it is fully self-contained. It cannot be trimmed: the game discovers its interface implementations by reflection at startup, and trimming removes exactly those assemblies.
Reporting problems
Please open an issue at https://github.com/crhy/rhYciv/issues. Say which platform and which download, and attach the log from:
- Linux
~/.local/share/rhYciv/Logs(Flatpak:~/.var/app/io.github.crhy.rhYciv/data/rhYciv/Logs) - Windows
%LOCALAPPDATA%\rhYciv\Logs - macOS
~/Library/Application Support/rhYciv/Logs
rhYciv 0.1.4
Saving, and a turn that ends when you press Enter.
Everything here was reported against 0.1.3 in issue #113, or found while fixing it.
Install
| Platform | Download |
|---|---|
| Windows (x64) | rhYciv-0.1.4-win-x64.zip — unzip, run RaylibUI.exe |
| macOS (Apple silicon) | rhYciv-0.1.4-osx-arm64.zip — unzip, drag rhYciv.app to Applications |
| macOS (Intel) | rhYciv-0.1.4-osx-x64.zip — same |
| Linux (x64) | rhYciv-0.1.4-linux-x64.tar.gz — extract, run ./RaylibUI |
| Linux (Flatpak) | rhYciv-0.1.4-x86_64.flatpak |
Nothing else is needed. No commercial Civilization II installation, no runtime to install — each download carries its own .NET runtime and the complete art set.
The builds are unsigned — please read this before reporting a launch failure
They are not code-signed, because signing certificates cost money this project does not have yet. Both desktop platforms will try to stop you:
macOS will say the app "is damaged and can't be opened" or is from an unidentified developer. It is not damaged; that is the quarantine flag on anything downloaded unsigned. Clear it:
xattr -dr com.apple.quarantine /Applications/rhYciv.app
Windows will show a SmartScreen warning. Choose More info → Run anyway.
Linux Flatpak:
flatpak install --user ./rhYciv-0.1.4-x86_64.flatpak
flatpak run io.github.crhy.rhYciv
Saving
Save Game and Load Game work from the menu. Both entries carried no command id, so they were drawn and did nothing when clicked. The commands behind them existed and were bound to Ctrl+S and Ctrl+L, so saving worked — but only if you already knew the shortcut, which is not where anyone looks for it.
Autosave each turn actually saves. It has been a checkbox in Game Options for as long as the dialog has existed, and nothing ever read it. It writes at the start of your turn, before anything has moved, so the newest autosave is always a position that can be picked up cleanly. Three slots rotate, and a failure part way through cannot destroy the one it is writing over.
Opening the Save dialog could take the game down. The name it offers is built from the leader's initials, taken with Substring(0, 2) — which throws on a one-letter leader, or a custom civilisation saved with the name left blank. It crashed before the dialog drew, so nothing on screen said why.
The turn
Enter ends the turn on the first press. Ending a turn walks every unit giving it its end-of-turn processing, and it returned the moment it met one that needed a decision from you — a GoTo whose route no longer exists, a settler freed by finishing what it was building — abandoning the rest of the list. So each press got only as far as the next such unit.
It was not only slow. The units behind the one that stopped the walk were never processed at all, so a unit told to fortify did not become fortified, and did not get its defensive bonus, until whatever preceded it in the list had been dealt with.
Diplomats
A Diplomat has no attack strength, so walking one into an enemy unit or city was refused outright: the unit could be researched, built and marched across the map, and then did nothing whatever.
Moving one onto somebody else's unit or city now offers to buy it. A lone unit in the open can be bribed; a stack cannot, which is the point of standing a second unit beside a valuable one, and nor can a garrison inside a city — that is bought by inciting the city, which brings its defenders over with it. A capital cannot be bought at any price. Both prices rise with the treasury the owner is sitting on and fall away with distance from the seat of their government.
Rules
Huts use the original game's measured odds. There are five outcomes, equally likely — tribes, gold, mercenaries, scrolls, barbarians — and an empty village is not one of them. It exists only as a consolation when one of the five cannot be delivered. It was a sixth outcome here, drawn as often as the rest. Tribes and barbarians are also withheld in favour of mercenaries near a city, or before you have founded one.
Switching production says what it will cost. Changing between a unit, a building and a wonder forfeits a share of the work already done. The engine has always charged it; nothing said so, and the shields simply disappeared.
The map
The coastline. It ran through saturated turquoise from 48 pixels out with a wide cream beach behind it, which drew a lit outline round every island. Measured against a photograph of a real fjord coast instead: the sea is nearly black up to the rock, the lightening at the shore is slight, and the beach is a thread. The shoreline also wanders further, so a coast is lobed rather than a chain of straight facets, and the water inside an enclosed square is lopsided instead of the perfect circle it was.
The generation matte is gone. The art is drawn on magenta and cut out, and cutting sets the alpha without touching the colour underneath — so citizens in the city window were outlined and veiled in pink, and several city sprites had magenta specks on the roofs.
The marker for a unit killed in combat appears. It worked out who had died from the per-round hitpoint series, which records each unit's health at the start of a round, before that round's damage. The loser's last entry is therefore its health just before the fatal blow — always above zero — so it never once decided anybody had died, and the pause and the marker never happened at all.
Production shields are an even block, every row the same length and as near square as the cost allows, rather than filling to the panel's width and stranding a single shield on the last row. The flag over a city is three times the size, and special resources sit high in their square, so a whale breaches out of water rather than sand.
Elsewhere
- Left and right step between cities from inside the city window.
- The caret in a text box is clamped rather than trusted, so a key arriving with it out of range cannot end a session.
Known limitations
Diplomacy, multiplayer and several advisor screens are not implemented yet. Some interface art is still placeholder. Scripted Lua dialogs do not work at all — see #110.
Each download is about 190 MB because it is fully self-contained. It cannot be trimmed: the game discovers its interface implementations by reflection at startup, and trimming removes exactly those assemblies.
Reporting problems
Please open an issue at https://github.com/crhy/rhYciv/issues. Say which platform and which download, and attach the log from:
- Linux
~/.local/share/rhYciv/Logs(Flatpak:~/.var/app/io.github.crhy.rhYciv/data/rhYciv/Logs) - Windows
%LOCALAPPDATA%\rhYciv\Logs - macOS
~/Library/Application Support/rhYciv/Logs
rhYciv 0.1.3
The map, from a full beta test.
Everything here was reported against 0.1.2 in issue #111.
Install
| Platform | Download |
|---|---|
| Windows (x64) | rhYciv-0.1.3-win-x64.zip — unzip, run RaylibUI.exe |
| macOS (Apple silicon) | rhYciv-0.1.3-osx-arm64.zip — unzip, drag rhYciv.app to Applications |
| macOS (Intel) | rhYciv-0.1.3-osx-x64.zip — same |
| Linux (x64) | rhYciv-0.1.3-linux-x64.tar.gz — extract, run ./RaylibUI |
| Linux (Flatpak) | rhYciv-0.1.3-x86_64.flatpak |
Nothing else is needed. No commercial Civilization II installation, no runtime to install — each download carries its own .NET runtime and the complete art set.
The builds are unsigned — please read this before reporting a launch failure
They are not code-signed, because signing certificates cost money this project does not have yet. Both desktop platforms will try to stop you:
macOS will say the app "is damaged and can't be opened" or is from an unidentified developer. It is not damaged; that is the quarantine flag on anything downloaded unsigned. Clear it:
xattr -dr com.apple.quarantine /Applications/rhYciv.app
Windows will show a SmartScreen warning. Choose More info → Run anyway.
Linux Flatpak:
flatpak install --user ./rhYciv-0.1.3-x86_64.flatpak
flatpak run io.github.crhy.rhYciv
The map
Roads and railways connect. A road is not one picture per square: the renderer composites one half-spoke per connected neighbour, and each has to run from the centre of the square to the exact point on the boundary where that neighbour is reached, so the two halves meet. They were being cut from the painted sources by measuring where the ink happened to lie — free-hand art, so it began and ended wherever the brush did. The geometry is constructed now and the painted surface swept along it.
Rivers run as rivers, and reach the sea. A river is one picture per square, chosen by which of the four neighbouring squares also carry water — sixteen distinct pictures. The art set held eight free-hand meanders, handed out by index modulo eight, so what was drawn had nothing to do with where the river ran and no two squares lined up. All sixteen are now composed from halves that meet on the boundary. River mouths had never been replaced at all: that coarse blue arc where a river met the coast was the compatibility sheet showing through.
An ocean square is drawn as water. The coastline art is chosen by how many of a square's four corners are land, and with three or four of them the shoreline never crossed the square at all, so it came out as solid grass. A one-square bay was a meadow, and the whales in it appeared to be breaching out of a field.
Irrigation and farmland are ploughed fields. They were still the compatibility sheet's 64×32 cell scaled up, which over photographic terrain reads as a blue lattice thrown across the square. Irrigation is hand-cut ditches; farmland is the same field cross-ploughed, with the channels meeting at the junctions.
The flag over a city is sharp, and the goody hut is the painted art. Both were drawing the classic sprite — a dozen pixels across — enlarged to match a map composed several times larger.
The map no longer scrolls off into the fog. Movement was being announced to every player who had ever explored the square it happened on rather than to those who could see it now, so every enemy step through territory you had once walked was animated on your map, and the view went after it.
Playing a turn
A road is worth a third of a movement point to every unit. There was a rule that a unit whose whole allowance was a single movement point spent all of it on any move costing less than a full point — which is every move along a road. Settlers, Warriors, Phalanx and Musketeers were all walking their own roads at one square a turn.
Enter ends the turn, and the side panel says so, flashing End of Turn (Press ENTER) once every unit has moved.
A kill can be seen. Combat ended on the last frame of the explosion and handed straight back, so a unit killed during someone else's turn was gone before you could see it die. The map holds on the square for about a second now and marks it with a fallen-soldier icon; another civilisation's move is held at its destination for the same reason.
Huts usually hold something. The six outcomes were drawn evenly, and several of the others degrade into a consolation of their own, so a good third of huts came up empty. Mercenaries also arrive as soldiers now, rather than as a copy of whatever unit walked into the village — which had been handing a free Settlers to any settler that found a hut.
A new city builds something it can build. The opening item was the cheapest thing in the entire ruleset, drawn from tables that carry every slot the file format defines, including disabled ones costing nothing.
Reading the screen
- Small text is legible. The font atlases are rasterised at 96–112 pixels and most text is drawn between 14 and 20. With only bilinear filtering, shrinking a glyph five times samples a twentieth of the pixels it covers and drops most of the stroke. They are mipmapped now.
- City names in the Go To dialog are set at a readable size; the listbox text size was fixed at 12 when the interface was laid out against a much smaller window.
- The Civilopedia's technology description is inset from its panel border instead of starting hard against the rule.
- Production shields are justified across the width of the box, so the row reads as a gauge.
Known limitations
Diplomacy, multiplayer and several advisor screens are not implemented yet. Some interface art is still placeholder. Scripted Lua dialogs do not work at all — see #110.
Each download is about 190 MB because it is fully self-contained. It cannot be trimmed: the game discovers its interface implementations by reflection at startup, and trimming removes exactly those assemblies.
Reporting problems
Please open an issue at https://github.com/crhy/rhYciv/issues. Say which platform and which download, and attach the log from:
- Linux
~/.local/share/rhYciv/Logs(Flatpak:~/.var/app/io.github.crhy.rhYciv/data/rhYciv/Logs) - Windows
%LOCALAPPDATA%\rhYciv\Logs - macOS
~/Library/Application Support/rhYciv/Logs
rhYciv 0.1.2
Fixes a crash introduced in 0.1.1.
If you are running 0.1.1, update. Founding a city could leave the game with no
unit to move, and asking for the next one then recursed until the process died.
It produced no crash report, because a stack overflow cannot be caught.
0.1.1 also fixed two crashes and a round of interface problems reported against
0.1.0; all of that is included here.
Install
| Platform | Download |
|---|---|
| Windows (x64) | rhYciv-0.1.2-win-x64.zip — unzip, run RaylibUI.exe |
| macOS (Apple silicon) | rhYciv-0.1.2-osx-arm64.zip — unzip, drag rhYciv.app to Applications |
| macOS (Intel) | rhYciv-0.1.2-osx-x64.zip — same |
| Linux (x64) | rhYciv-0.1.2-linux-x64.tar.gz — extract, run ./RaylibUI |
| Linux (Flatpak) | rhYciv-0.1.2-x86_64.flatpak |
Nothing else is needed. No commercial Civilization II installation, no runtime to install — each download carries its own .NET runtime and the complete art set.
The builds are unsigned — please read this before reporting a launch failure
They are not code-signed, because signing certificates cost money this project does not have yet. Both desktop platforms will try to stop you:
macOS will say the app "is damaged and can't be opened" or is from an unidentified developer. It is not damaged; that is the quarantine flag on anything downloaded unsigned. Clear it:
xattr -dr com.apple.quarantine /Applications/rhYciv.app
Windows will show a SmartScreen warning. Choose More info → Run anyway.
Linux Flatpak:
flatpak install --user ./rhYciv-0.1.2-x86_64.flatpak
flatpak run io.github.crhy.rhYciv
Crashes fixed
Saving stopped working once the barbarians took a city. The saved per-tribe city counter is indexed by tribe, and the barbarians have no slot in it. From the moment they founded or captured their first city, every save attempt failed and the game could not be written to disk. If you lost a game to this in 0.1.0, that is what happened.
Researching certain advances took the game down. Anything that enabled a terrain improvement — fortresses among them — tried to announce itself through an interface that was never implemented, and crashed instead.
The city screen
Units and improvements in the Change Production list are drawn at a readable size. They were being scaled against the size the art used to be, so units rendered at about fourteen pixels and improvement icons at roughly one (#81).
That list also keeps a stable order now — units first, then improvements, each in ruleset order. It used to have newly unlocked items appended to the end, so something you had just researched appeared at the bottom of sixty entries instead of where you would look for it. That is why a buildable Temple could seem to be missing after Ceremonial Burial (#91).
The window itself is finished in the same painted stone as the rest of the interface instead of flat grey, citizens are justified left so they stop moving as the city grows (#64), and the Supplies and Demands lines no longer render hard against the panel border (#83).
Units
- A unit that has finished its turn stops blinking. Nothing cleared the selection when no unit was left to move, so whichever unit spent the last move point stayed lit for the rest of the turn (#74).
- A unit put to sleep to recover wakes when it is back to full health. One that was already healthy when told to sleep stays asleep until you wake it (#96).
- Disbanding a unit clears it from the city window at once, instead of leaving it listed until something else resized the window (#94).
Elsewhere
- The Alt key no longer opens the menus. It had no way to close them again, so it was a one-way trip that had to be undone with the mouse (#103).
- The Civilopedia's city-improvement pages drop the Description button, which navigated to text already on the page (#104).
Known limitations
Diplomacy, multiplayer and several advisor screens are not implemented yet. Some interface art is still placeholder. Scripted Lua dialogs do not work at all — see #110.
Each download is about 190 MB because it is fully self-contained. It cannot be trimmed: the game discovers its interface implementations by reflection at startup, and trimming removes exactly those assemblies.
Reporting problems
Please open an issue at https://github.com/crhy/rhYciv/issues. Say which platform and which download, and attach the log from:
- Linux
~/.local/share/rhYciv/Logs(Flatpak:~/.var/app/io.github.crhy.rhYciv/data/rhYciv/Logs) - Windows
%LOCALAPPDATA%\rhYciv\Logs - macOS
~/Library/Application Support/rhYciv/Logs
The crash log is what made both of the fixes above possible — it names the exact line. Please attach it.