IFD Studios / devlog

We make things you play and things you use. Playing: a euro style board game and a tower defense game. Using: productivity software, companion apps for online games, and the Discord bots that end up attached to them. This is the log. Newest first, nothing removed.

Mob Sagaeuro, blind playtesting
Project Obelisktower defense, vertical slice
Companion appslive, unannounced
Internal toolingcontinuous
0.5.021 AugDM
Project Obeliskdesign

Two weeks on the same question, so it is worth writing down properly.

Tower defense is a solved genre, and the reason is structural rather than a failure of imagination. The player has perfect information, unlimited planning time between waves, and a map that does not move. Those three together make every level an offline optimisation problem: there is a correct answer, the player's job is to search for it, and once it is found the level is finished permanently. Difficulty after that can only be manufactured by scaling numbers, which is why every tower defense game eventually turns into a spreadsheet with particle effects.

You can remove exactly one of the three and still have recognisably a tower defense game.

Removing perfect information

Fog, unknown wave composition, hidden stats. This is what most attempts pick, and it converts an optimisation problem into a gambling one. Players resent it, correctly, because losing to information you were never given is not the same as losing to a mistake.

Removing planning time

Build under real time pressure. This works, but what you have built is a real time strategy game with fewer verbs, and it competes with RTS games instead of TD ones.

Removing the static map

The terrain responds to what you build. Least explored of the three, because it is the hardest to keep legible. If the map moves unpredictably the player cannot form a plan at all, and a tower defense player with no plan is just watching a screensaver.

So the design problem is not "make the map change". It is: make the map change in a way the player can predict one step ahead but not three. That is a far narrower target and it is the one we have actually been circling.

Where it landed, for now

The path is a river. Towers sit on the banks. Each wave the river erodes toward whichever bank carries more mass, so building heavily on one side gradually pushes the path away from your own guns. Your strongest position is always decaying, and correct play becomes asymmetric investment over time rather than finding one optimal layout and holding it.

Unresolved: the dominant strategy under this model is currently "spread thin everywhere", which is the most boring possible answer. It needs a counterweight that punishes even distribution. Nothing convincing yet.

0.4.919 AugRK
companion apps

Cut two features. Third release running with a net negative diff. This was not a strategy, it is just what the usage data kept saying.

0.4.818 AugDM
Mob Sagarejected

Rejected the staggered starting capital fix for seat advantage (0.4.5). It does close the gap, to about 1.9 points, but it makes the opening four turns identical in every single game. A fair game that plays the same way every time is a worse outcome than an unfair one that does not.

Going with the paid first player token instead. It is the only one of the three candidates that is also interesting.

0.4.715 AugRK
Project Obeliskperformance

Replaced per unit A* with a single flow field. At around 2,000 units A* was costing 14ms a frame and climbing superlinearly, because every unit pays its own search. The flow field is 0.9ms flat regardless of unit count, since the cost is per tile rather than per agent.

units A* (ms) flow field (ms)
  500      3.1         0.9
1,000      6.8         0.9
2,000     14.2         0.9
4,000     38.6         0.9 2019 laptop, integrated graphics, release build, median of 600 frames

The textbook win is larger than ours, because textbook flow fields are computed once for a static map. Ours has to be recomputed whenever the path moves, which under 0.5.0 is every wave rather than never. Still decisive.

Holding 60fps at 4,100 active units. The ceiling is no longer pathfinding, it is renderer batching, which is a much more pleasant problem to have.

0.4.614 AugDM
Mob Sagacomponents

Reprinted the player boards on 2mm greyboard. The 3mm stock warped after a week sitting near a window. Filed under things nobody warns you about.

0.4.511 AugDM
Mob Sagabalance

Stopped guessing at balance and wrote a simulator. Fifty thousand games, four agents selecting uniformly at random from legal moves, no strategy whatsoever. The point is not to find the strongest line of play. It is to find out whether the game has a dominant one before a human does, because a human will find it in week three and then never unfind it.

seat win rate delta
   1      27.4%     +2.4
   2      25.9%     +0.9
   3      24.1%     -0.9
   4      22.6%     -2.4 n = 50,000, random policy, seed 8811, spread 4.8 points

A 4.8 point spread under random play is too much for four players. Our rule of thumb is that anything past about three points means turn order starts deciding games at the top of the skill curve, where everything else has been equalised. Under random play it is a floor, not a ceiling: skilled play usually widens a seat advantage rather than closing it, because a good player extracts more from a better position.

Three candidate fixes, all being tested:

  • staggered starting capital, later seats open with more
  • reversed turn order in the final round only
  • a first player token that has to be paid for each round
Edit, 18 Aug

Staggered capital is out, see 0.4.8. Leaving this entry as written rather than quietly correcting it, because the reasoning was sound and the conclusion was still wrong, and that is worth being able to look back at.

0.4.48 AugRK
internal tooling

Moved the playtest scheduling bot off message parsing and onto proper interactions. Click to response went from roughly 900ms to under 200ms, and almost all of that was us deferring incorrectly rather than anything on Discord's side.

It is not a product and it will never be one. It is scaffolding. But it runs the playtest calendar, and it has stopped being the thing that breaks on a Thursday evening when six people are waiting.

0.4.35 AugDM
Mob Sagaplaytest

Four people, none of whom had played a euro before. The first hour went badly and we learned more in it than in the previous month.

Nobody read the player board. Not one of them, not once. We had spent three weeks on that layout and its iconography, and they did not look at it, because we had also put a deck of cards in front of them and cards are simply more interesting than a board. Obvious in hindsight, invisible beforehand.

The other thing: the money is the clock, and none of them worked it out. They spent freely in round two and when the game ended on them, two of them said "already?" at the same time.

We still cannot tell whether that reaction is the flaw or the best thing in the whole design. It is the question we keep coming back to and we are deliberately not fixing it until it has happened at three more tables.

0.4.21 AugRK
Project Obelisk

Ugliest possible vertical slice. Coloured rectangles, no art, no audio, one enemy type, one tower. Played it for two hours anyway, which is the only playtest result that has ever meant anything.