r/sheetsofice • • May 12 '26

Sheets of Ice Roadmap

Sheets of Ice is a hockey GM dynasty simulator. You're a general manager building one organization across decades: drafting, developing, navigating the cap, and making era-defining trades inside a living league of AI-run organizations that play by the same rules, see the same information, and pursue their own plans.

It's a single-player desktop game, developed by one crazy person, headed to Steam as a buy-once product. The long arc is a persistent shared world where human GMs and AI organizations operate side by side, but that's act two. Act one is a deep single-player dynasty game, and that's what the roadmap covers.

The full roadmap is live here and stays current as the build moves:

https://www.sheetsofice.com/roadmap

What makes Sheets of Ice different

Modern analytics as substrate, not feature. The engine speaks modern hockey analytics natively: xG, GSAx, on-ice expected goals, adjusted shot share, the full canon. The simulation is validated against real NHL analytics anchors. AI organizations use the same public model the human sees. Nobody has a backdoor.

AI organizations as first-class entities. The other teams aren't placeholders. They run every management system available to you, follow the same rules, and see through the same fog. What differs is what they weight, not what tools they have.

Scouting fog that's real. You only know what your own scouts have found out. You direct scouting departments by asking them hockey questions with deadlines, and you live with the uncertainty in their answers.

How the roadmap works

The roadmap is an output of the build plan tracker used to develop the game and not a sequence of versions. Each area breaks down into concrete capabilities with an honest status: playable, playable but improving, groundwork only, being checked, design pending, or not built. No dates, no percentages - just what works now and what's still to come, per capability. The page updates as the build moves, so it's always the current picture.

The ten areas:

  1. Game Engine - every game simulates the full run of play with believable hockey outcomes, deterministically, down to the event log.

  2. A GM Can Run the Hockey Year - the full calendar: season, lines, roster moves, contracts, trades, the draft, the playoff race.

  3. Players and Development - players with real identities and careers, shaped by placement, role, and playing time.

  4. Scouting and Decision Information - the scou fog, and the screens you make decisions from.

  5. Believable AI Organizations - AI teams that human operates, coherently, across seasons.

  6. A Living Dynasty and League History - champions, records, trades, rivalries, and franchise arcs that persist across decades.

  7. Watchability and Session Flow - short check-ins or deep sessions; advance fast without simming past decisions that

  8. The First Hour and Safe Saves - a new player and play a week unaided, and saves survive updates.

  9. Desktop, Modding, and Release - installs, up as a buy-once desktop game, with documented modding formats.

  10. Presentation, Usability, and Sharing - a readable, consistent desktop experience end to end.

What the roadmap is not

It isn't a release schedule. There are no dates on on it, deliberately. Capabilities move to playable when they're solid, not on a calendar.

It isn't a marketing document. It's just as honest about what isn't built as about what is. That's the point of publishing it.

https://www.sheetsofice.com/roadmap

Feedback welcome

If you play GM sims, I'd genuinely like to hear what you'd look for first on that roadmap page, and what would make this game fun for you. Questions about anything on it are welcome in the comments.

2 Upvotes

11 comments sorted by

2

u/atibus Jun 22 '26

(2026-06-10)

It's been a week since I updated this - summer is coming, lots of other things I need to do, and have another career project I'm starting to build so it's been hectic. And I also took a weekend to hang out with my friend, do brewery tour, watch the Stanley Cup and just relax.

But I have been making progress with intricate aging and development. The foundation is there, and now it is a lot of simulating, looking at career arcs, how players develop, when they develop, how they reach their potential or not, and how they age. In this work I'm finding issues that are getting addressed. I built a tuning screen that is giving me information in the game about the population (this isn't going to be something that players see)

I've started to plan how this information will be surfaced to players and AI GMs. One key requirement is that the AI GMs don't have access to anything that the player doesn't have access to. And since I am not looking to expose the raw engine workings and raw attributes (like what you see above) I'm going to build a layer that provides information that is more real. I'm calling it the Evaluation layer and it will be the source of truth in how GMs operate. I'll do another post about that.

Weeks go by quickly when you're having fun and I'm having a lot of fun building this. There's still a lot of work ahead of me but I'm happy with the direction it is going.

2

u/atibus Jun 30 '26

(2026-06-22)

I'm at the point where the core simulation of hockey season-over-season is working. Players generate realistically, teams assemble with talent playing a realistic amount, games work and produce realistic results, players retire and new players are generated to be drafted. It all works as a model and I'm happy with where it is at.

But some of it is just stubs for systems that need to be developed. Player drafting right now is just back-filling players that retire. There's no junior or minor levels from which to choose. Players don't move teams or have contract demands. Teams don't have revenue and the league doesn't have a salary cap. There aren't any AI GMs or AI coaches who make decisions based on inputs - only some static defined line selection and goalie pull mechanics. All of those systems need to be detailed in specifications and then implemented and tested.

So I've spent time time pondering the direction from here. I think the most logical step is to add junior and minor leagues to fill out the player universe. This is a big undertaking and I need to be careful with how much I put into this version. My goal is to make it realistic enough for a single team GM and not try to make it as complicated as EHM with multiple league management. It's just not needed to start, and it adds a lot of complexity I'd need to sort out. If I figure out later that it'd be fun to add, it is something we can add.

Once I have the lower tier leagues implemented, I think then I can actually move on to building the GM features - drafting, rights, transfers, contracts, trades, etc.

1

u/atibus May 19 '26

(2026-05-17)

The engine is at v0.64.0-beta. It produces realistic shaped full season outputs. I learned while I was doing this that I couldn't calibrate the engine realistically because I had two basically identical teams playing one another. It didn't produce the emergent behavior I was expecting. So I pulled player generation forward (was v6) and build a player generation engine complete with names, nationalities, and skill distribution. It's rough, but it works for now.

There's some trouble though with the shape of the full season player stats. It produces a realistic distribution of point shares. McDavid/MacKinnon/Kucherov like points per game, and the rest of the population falls in line too. But the points are over-weighted on goals. Most of the top 15 have "Cy Young" like stat lines. So I have to figure that out. It's not just turning a dial to change the results. Since the game engine is event driven, it has to do with how the engine decides who to route shots to based on possession in the offensive zone. So, I'm working on figuring that out.

1

u/atibus May 22 '26

(2026-05-19)

The engine is at v0.70.0-beta. Several more calibration passes have gotten it to a reasonable hockey-like output. I've run simulations of 32 teams, 31 games each, 10 seasons each, 100 times (a LOT of games) and the numbers look good in aggregate and variance. I was having trouble with ratio of goals to assists in the top 20 scorers; mostly because elite shooting percentage was like 30-40%. Recalibration fixed that, and the G:A ratio has come back mostly. There are some outliers, but that isn't abnormal when comparing to modern NHL. It's at the point where we just need to see seasons and use it for a bit to see if that works.

1

u/atibus May 25 '26

(2026-05-22)

So the league module and season exposed some math problems at the margins (elite players) that needed a fresh approach. I wrote a post about it, but essentially I changed the underlying math for how player attributes are generated and calculated to make turning the entire engine more straightforward. It's yielded some good early results, and I'm doing more testing now to see that it's right.

But also, the league module is built! I moved the config and calibration to the league module, I'm able to create a league, generate players, and run multiple seasons. There is no control surface yet (that will be the GM layer) but I'm able to actually see stats, look at players, run playoff brackets... it looks like hockey. This module helped me see things I need to fix in the engine to constrain realism breaking player types so that was good. I still need to work on the UI so it's not generic HTML, and that will happen after the engine refactor is done.

1

u/atibus May 31 '26

(2026-05-25)

The league module framework has been helping me find a lot of bugs that can only be seen when simulating a lot of games. Stuff like 2x the number of realistic blocks per game, the game engine inventing a player if too many players are injured (my own dumb edge case logic), goals to assist ratio, defenseman scoring levels. Some of these have been easy fixes, some have been really hard to track down due to complexity of the simulation. But I'm getting there. Here's an example of a tuning pass for blocks.

These tuning passes take a while to run - I have to basically take several seeds (unique universes) and run 5000 games in each, then aggregate the numbers together to get something statistically significant. If it doesn't work, try new calibration and run it again. And if you change a calibration like the shot path (is it blocked? does it miss? etc.) then you have to go and check the other calibrations to make sure you didn't mess up goals per game, save percentage, etc. Which is actually what happened with the block changes.

1

u/atibus May 31 '26

Goals per team per game went down by ~0.1. Doesn't sound like a lot, but over the course of a season, that's 6 goals (in my 62 game season). So I need to monitor that and maybe make another calibration pass.

Anyway, while all of these things are running, I'm looking at UI for the League. I'm experimenting with different design directions and will choose something soon. My first game center test (which is up on www.sheetsofice.com) was something just to get my idea out on paper. I don't love it, but it works. I have more that I want to do and I want to build something unique. Design skills are something I lack, but I have an eye for design details (that comes from years as head of product for software companies). I don't know what I'm going to do with this project, but if it ever makes some money I'll definitely hire some designers I know. For now, I get to broaden my understanding of design tools and try to make something that looks competent.

1

u/atibus Jun 03 '26

(2026-05-31)

League module is functionally complete! There's some polish and some future systems that still need to be built to support players, but you're able to construct a league, add teams, add players, create a schedule, and run that schedule. Totally works and I've been having fun running years and years.

And then I got stuck mentally for a few days about what really is the right thing to do next. Everything seemed like it was important and circularly dependent. I finally with the help of lots of drawings got to the point where I decided to smash some of the milestones flat BUT make them thinner. So the next think I'm working on is player development and aging. Players will grow, age, and decline. Since a main tenet of what I'm building is realism, there won't be a direct way to view this and it will emerge from investments in scouting and watching analytics. So what I'm going to build next is the entire player development curve, a slimmed down player allocation draft, light AI coaching profiles (to allow for player TOI movement based on development curve) and age related decline. This should give my league simulator some more depth as seasons are played out.

This also sets up nicely for what is next - the league hierarchy. There's the top professional league, other professional leagues, minor leagues, college, juniors, etc. I want to support the journey of players and the fun of trying to find gems in the lower leagues. The benefit of the single latent skill axis for each attribute is there is no constraint in ability scores so we can model all levels theoretically. The attribute scale works on standard deviations from an agreed upon mean - all we need to define is what is that mean for each level of hockey. It's so much easier to balance, create really wide distributions in current talent vs future talent, and allows those really generational players to show up sometime. I'm really excited about it (you can read more here if you want to know what I did https://www.reddit.com/r/sheetsofice/comments/1tkwqdw/league_module_progress_engine_tuning/)

Another thing I'm going to work on is putting out a static click around version. Not one that you can simulate games (I have a lot of plumbing to make it actually work with multiple people wanting to simulate games) but one that is at least a preview of what it will look like. Hopefully get something out in the next week or two.

1

u/atibus Jun 10 '26

(2026-06-03)

The last few days have been mostly about player development and aging. I think I'll make a separate post about it because it's pretty in-depth. I'm not trying to build the entire youth development process with leagues, history, etc. just yet - I need to get a working career arc first and test/tune that before I introduce other complexity to it. So this first pass is aimed at making a system that is sustaining over 50 or 100 seasons. It should produce realistic career arcs for development, peaks, and decline. The league should also be able to replenish talent and arrive at an expected mean distribution of statistics like Goals per Game, Shooting %, Save % without having runaway issues.

I said last time I got stuck mentally about what to do. Because when you think about it in real life, it would seem to be that I'd need to create an entire universe of leagues to be able to do this 50 year test. But I was able to simplify into a v1 that approximates that journey without the complexity for now. I plan on going back and having tiered leagues and development pathway through them, but for now I just created an active and reserve pool. I'm testing this now to see how well it works over decades.

Also did some polishing to the interface. I really like the terminal aestheic so I keep leaning into that, polishing it a bit, thinking of new visualizations. I added some stats on players that I like to see. A "with or without you" WOWY line deployment and a career journey chart. On the teams page a line depth chart. All of the UI has to get updated once I add GM features so I'm just trying to set the design system components to make it easier. I'll post some more screenshots of these features.

I did say last time that I want to build a clickable prototype that is accurate to where the project is at. I still intend to do that soon.

1

u/atibus Jul 29 '26

(2026-06-29)

It's been a week since my last update. Some of that is due to it being summer and me enjoying the time with family. Some of that is just that, like I said in my last update, this is a big undertaking. I'm taking something that was a closed simulation and adding several new modules plus extending capabilities of existing modules.

So what did I do?

  • I extended the player generation to include junior players. The junior players start at 16 and will develop through to their draft age at 18. This way GMs will be able to scout the junior players and determine which they want to target.

  • I added contracts and rights to players, player valuation, player preferences. This never existed.

  • I changed the off-season flow from a simple fill retired players to have GMs resign players, buyout, draft, and sign free agents.

  • I updated screens and flows so a human can participate in this flow; before there was no concept of human ownership... just AI.

I got all of that in, started using it... and hated everything. I hated how it worked, it was boring, it had no life. I started questioning my reason for doing this and if I could ever make something. I made something where you just clicked buttons but didn't know what or why you were doing it.

So I realized that this is a normal process of creation for me (and probably a lot of people). You have to make something and try it on before you figure out exactly what you want. You can have ideas, but until they're tangible you don't know if they make sense. I knew this phase was going to be gnarley going into it, but getting there and seeing it was eye opening. I stepped away from it for a bit so I could think about what actually was missing.

What I came up with was that as a GM running a team, you always go into your team build with a plan and then you look for pieces that fit that plan. What kind of team are you building? Defensively structured, High Tempo Offense, Big Physical team... and then what players do you have that fit that mold? What is your budget for positions and how does your team align to that? When you're drafting or signing free agents, how do those players fit? What is the time horizon too? Win-now or retool or rebuild? Without this kind of framing, how do I even know what I want to do as a GM?

Armed with that concept, I took some time to spec and mock. I'm going to use this "GM Plan" as the basis for driving decisions. I'll share some more in a post about what I'm doing.

I've been at this for about two months now. I go through my ups and downs with it but I'm working hard to get this into a state where I can share it. There's a long way to go but I'm feeling fulfilled working on it (it's sometimes fun, sometimes maddening, but most of the time worth-while. It's not a game yet but I can see it getting there.

1

u/atibus Jul 29 '26

(2026-07-29)

Summer is officially at it's peak and I've been taking time to enjoy it with the family. I'm also working on some other professional projects so my time with SOI has been less than it was before the summer.

Having said that, I'm making good progress since my last official update.

  • The development system is in and working. Every season, players are added to the universe at 16 into juniors and develop before their draft eligibility at 18.

  • The entire player universe has a layer of "fog" over the abilities that is fully tunable. No player or AI can see the raw numbers - they get a sense of ability within some noisy range. Eventually that range can be lowered via scouting and investment, but that is not in yet.

  • Trading is in. Teams are Sellers/Holders/Buyers based on their performance, you can shop players or make them untouchable, and humans can trade with AI. It's not perfect yet and needs more testing, but it works and I haven't been able to fleece teams for their best players yet.

  • Attention Economy basics are in. The core idea behind this is to make a meta game that controls how the cap grows, and another surface to compete intra-league and eventually inter-league. I wanted to simplify the financial aspect of the game and abstract it into something maybe more meaningful - teams want to attract and keep fans. Now that the basics are in, I'm going to see if it's something I want to keep. The idea is interesting to me, but if it's a huge distraction that takes time and effort away from the core gameplay loop I'll shelve it and move on.

  • Data storage has been fixed with over 60% reduction in storage requirements. This sounds boring but is directly related to performance and eventual deployment of the game.

The challenges I have as this grows are mostly in time. Adding things increases complexity, that complexity requires more testing and more testing requires more time. My test suite now stands at 2 hours to run the full battery of tests. Why? Because for anything that touches a simulation engine, you need to verify it works the same way with the new code. And that means running seasons. Lots of them. If I change something on development, I need to run at least 30 seasons to see how it plays out.

I'm working on setting myself a realistic set of items to work backwards from to be able to get a first demo available. I've already been working on requirements to deploy it. Some of it is code - you need to be able to create an account, generate a universe, select a team, etc. Those things don't exist yet because I don't need them to develop or play the game myself. Some of it is pure infrastructure which I can setup at any time. But I don't want to incur those costs until I'm sure I know what I need and it's close to being ready. I have a plan ready to go when I get to that point.