It has been a rough journey but I finally see the light at the end of the tunnel. I just recently redid the website and thought maybe the full story of how this project came to be would interest you all. Thank you for reading.
I know you'll deservedly get a lot of credit for all your work in remastering the game, but you should also get credit for how you've woven this narrative together, it's a lovely read. Thank you for taking the time to write it up, and good luck with the Steam release, and whatever project you take on next! :)
I'm still curious, however:
> That's not a marketing angle—it's a headline that writes itself.
Any ChatGPT assistance there?
You could look at it like Claude was the reporter writing the story, with your collaboration.
The problem was not em-dashes — but binary opposition!
That sort of thing.
It is a much clearer marker of llm use than the em-dash. The sad thing is when searching for info on this the most convincing reply in search was generated by an LLM, which went on at length about why LLMs do this as some sort of consequence of their internal structure. I have absolutely no idea if that’s true — it really sounds a bit trite and exactly the kind of thing LLMs would confidently assert with no basis. I would want to hear from someone working in LLMs, but their blogs are probably all generated by an LLM nowadays. So this conundrum is a good example of a question where LLMs actively work against clear resolution.
This is in my view the most insidious damage word generators are inflicting on our culture — we can no longer assume most writing is honest or well-meaning because amoral LLMs fundamentally are not wired to make that distinction of true and untrue or right and wrong (unlike most humans) and many people will use and trust what they generate without question, polluting the online space and training data until everything is just a morass of half-known facts sprinkled with generated falsehoods that are repeated so often they seem true.
How do we check sources when the sources themselves were generated by LLMs?
That's what came to mind when I saw the abbreviation. Then I looked it up:
Reinforcement Learning from Human Feedback.
Don't forget to give credit to the LLM too which wrote the story for him.
I enjoyed the narrative. It was true. Who cares if it was written by a ghost writer, an AI or anything else.
Also, what are you comparing this post to? Because you should compare it to the author’s own writing and according to the author, his writing is not that good.
If you don’t like something simply move along. Constructive criticism is great but the volume of overly negative and honestly nasty replies like yours are not in the spirit of HN.
Obvious tells are repetitive numeric details: the number of lines of code (mentioned six times!), the number of pages in the manual, the ages of the developers, the age of the game, etc. The narrative itself also repeats, like the Steam rejection included verbatim twice, especially after the Prologue hit most of the beats in the first 400 words.
Where one formerly could use a certain way of writing as a heuristic for effort put into content they are spending time ingesting, now that heuristic is meaningless and a new one must replace it.
At this point some people have decided 'has markers of AI writing' is the heuristic to match 'no/low effort' on, and are trying to use shame in order to start a system of self-policing against it. Unfortunately that isn't going to work, because
1. the heuristic is flawed
2. most people are going to end up using AI tools for writing, since writing well is difficult
There are lots of places like Linkedin where people write slop articles saying basically nothing insightful, and AI allows them to write at Isaac Asimov or Brandon Sanderson type speeds. AI slop has no cost, so it will always outweigh insightful AI-assisted writing without careful curation. You will have read thousands of articles that begin in AI-evident formats that don't end in anything good.
That will always poison the well of somebody at the end of that first paragraph. They will consider the source, think "What are the odds this is more slop", and often click out.
People who I know don't speak English natively get a pass from me because no amount of effort in the short term is going to substitute for fluency, but everybody else... less so.
The problem is you're wasting other people's time, with long and low quality writing.
One of the points of writing your own words is to gather your own thoughts. The value of writing skills is to organize the delivery. But the first point is that they are your thoughts.
I think your replies are seriously missing the criticism.
Writing is not about writing. Admittedly, that is a trick sentence [what does it mean??] and it exists because I'm trying to get you to re-evaluate my next words. And, I am doing this because I think you are missing the point.
Writing is about organizing your thoughts. You cannot have someone else organize your thoughts. Once you approach writing as a thought excercise, and not an output excercise, then there is a world of nuance and writing is more than just organizing your thoughts.
Further, you have allegedly spent 3 years on this. I know you're busy. That said, you can certainly spend 3 days on writing if you spent 3 years working on this.
Please don't double down on acting like everyone is just a hater. There is more depth to the criticism than I think is being acknowledged.
P.s, if you feel "blocked" writing and think of it as just about output, try this: (0) Ask yourself what you want to convey, why; to whom. (1) Write without inhibition (2) Edit, cut, delete. Refer to (0); look at what seems higher word count in proportion to its value.
There are other tips to editing and writing. This is one rough off the cuff formula that I think tracks & may benefit you, especially since you seem to see yourself as a worse writer than you may actually be.
TBH I found it one of the most interesting and engaging articles I've seen on HN in a long time. The writing itself is not great, but the story is great.
Speaking of LLMs, I recently used Claude Code on my own old codebase to do such a writeup, and it ended up a very nice read for myself too - Claude managed to explain some parts of what I built better than I did :D
The labor theory of value doesn't work in economics and it also doesn't work in literary criticism. You should spend time reading something if reading it is valuable. You shouldn't if it isn't.
Actually that's not even the only issue. Another reason people hate this is because it's inconsiderate - it's like people who leave voicemails or say "hi" in chat. They are not respecting my time.
AI changes things so that you can produce text that seem like it was written with care and effort very easily automatically. It requires significantly more effort from the reader to figure out that it is worthless.
It really is different.
Yes, this has been inspired by a senior management figure in my company posting a clearly LLM assited 500 word slack message that could have been 2 lines.
'You used a tool I don't like' is really missing the point.
'You generated text that is long and a bit boring and will probably include falsehoods.' is a more accurate description of why people pick up on this - the style is an indicator of using a tool that generates convincing garbage.
Volatility Skew: An uneven curve indicating directional bias. Commonly, equity markets show negative skew (higher implied volatility for OTM puts), signaling concerns about downside risks.
Options pricing is a real rabbit hole.
https://www.luxalgo.com/blog/volatility-smile-vs-skew-key-di...
MS-DOS 2.0 was a huge improvement, the first release didn't even support subdirectories or hard drives.
Eh, not really. The file system was very different and these early operating systems were mostly a file system. The system calls were almost identical…
There was a time in the world when most PC users could drive the C prompt.
I don't really care in this case though, it's an awesome story and it doesn't detract too much. Congratulations!
I see from other replies that you now understand the code reasonably well and feel you can expand/extend it while keeping it in BASIC. However, I note you've also done project where you automatically ported Fortran to Lua - are you not interested in trying to do something similar for performance/maintainability reasons? Is there an advantage in keeping it in PowerBASIC?
I've wish listed the game, and look forward to playing it, it sounds like great fun - even the manual sounds like a good read.
Is the whole thing going to be open sourced? I feel if enough people had access it could be ported to any language with today's tools and people.
Is it possible to write a black box regression test framework?
Consider releasing on GOG. This game is great nostalgia bait, and if you release the DOS version, the GOG staff are quite experienced at building modern, cross-OS installers for DOS games and tuning DOSBox.
FWIW I never played this particular game but around the turn of the millenium I put probably over 100 hours in Trevor Chan's Capitalism games [1].
I've always wanted to get my hands on the Championship Manager 92/93 source code to see what gave it its "soul". What made that version so special.
The real problem is idiosyncratic and esoteric coding practices from a single self-taught accountant working in a language that didn't encourage good structure.
I can translate well-written code without understanding what it does functionally, so long as I understand what it's doing mechanically.
The original author seems to build in the assumption you're not going to translate my code you'll need to rewrite it from the the tax code!
I might not be a basic practitioner, but as someone who as written serious things in bash and powershell, I can see the allure.
This story is it's own litmus test. Your story is only as notable as bad as Michaels code is!
Don't get me wrong. It seems fantastic game and like others I'm most interested in playing the original DOS version.
But good programs, written by good programmers are not necessarily made with good code!
Thanks for bringing this story to HN!
Out of curiosity, how are the things tested? Or is checking core-engine doing things right only up to the developer and their tribal knowledge?
I am sold on the game and wishlisted it but lack of release date saddens me.
I love spreadsheet games like Terra Invicta/Paradox/Simutrans and this seems like a terrific example of one.
> So Jenkins waited.
This part made me laugh out loud. It made me imagine Jenkins as a time traveller who had made a mistake and got stuck in the past, but knew that personal computers would be invented.
As for languages, PB, C++, and JavaScript (Electron/Preact). I chose a no-build UI framework so that it could be modded by players without installing any build tools, just edit the text files in the game folder, and it has been a very good decision.
I know it almost sounds crass, but you should consider letting an LLM take a crack at transpiling the code. Source to source translations are one of the most widely agreed upon strengths of LLMs.
What you need is differential, property testing. I’m sure it would work for you (you can skip the first half as you already have the source):
https://reorchestrate.com/posts/bringing-a-warhammer-to-a-kn...
Are there any plans to break out portions of the Basic engine to a modern language? It's frustrating that the heart of the game remains inscrutable. Surely Ward is tempted?
It's a lovely achievement you have pulled off, and Jenkins must be tickled.
So the program most likely is flat: a bunch of global variables (and possibly memory addresses), and instructions ordered by line number, rather than functions or methods.
No line numbers except for goto labels, but gosub is the challenge for transpilation.
(However it wouldn't surprise me if older 'line number' programs still mostly worked. iirc VB6 also supported this.)
Maybe I missed it, but are you still using the Powerbasic compiler or have you worked around that somehow?
No real functions, only `gosub` and `goto` so everything is a global variable.
I think even assembler for x86 is easier to unravel.
But the best way I can answer your question. WSR does not claim to simulate real markets. It probably leans too much into fundamentals for our time, at least for the blue chip stocks in the game. What is actually is is a M&A and tax evasion simulator on top of a financial market sandbox to create tax implications to be avoided.
You can imagine my disappointment when in the end, the code is still basically a mystery, and a wrapper around the core game was made.
Not because what you did is not hard or impressive, it's because, up until the line were you said you are going to use a wrapper, you made it seem like you're deciphering the code. That isn't really clickbait, because I had already clicked and spent 20 minutes reading. Being misled felt a bit bad, considering how beautifully the story is written.
Impressive work nonetheless.
> Ward mentioned that the biggest bottleneck was the cryptic variable names—short abbreviations that were common in old-school programming but made the code nearly impossible to follow.
> "He not only commented everything," Ward marveled, "he went through every single line of code and renamed every single variable for me in about three days.
I think it's still fair to use the term "reverse engineering".
You are the engineer we all aspired to be. Though, you really are the chosen one.
Wish you the best!
2) the prose is very LLM-flavored, but for once I don’t mind. It’s obvious to me that this blog post only exists because an interesting, intelligent person used an LLM to lower the cost of extracting complex ideas from their brain.
3) the “Fits of Rationality” process sounds a lot like how coding agents work. They’re alive in the moment, then later all they have to work with is the written record of their previous sessions. The Herculean effort to re-implement the result foreshadows the vibe-coding repair industry.
"claude code plays wall street raider" would be very very cool.
I mean, the article means passing the torch but how exactly is this assured in case the author dies and the estate holders don't release the copyright?
Personally, I often find the smell of AI annoying, but I don't mind the way you used it in this article, and after all, there are some good use cases for AI writing.
I assume it will become easier and commonplace to configure LLMs to produce 'de-ragebatified' writing styles.
Pretty soon I reckon we'll be so inundated with AI content in all media that it simply won't be possible or rational to be offended by it, it will just become our new reality, our new world.
It's a tough tradeoff for me both as a consumer and as a do-er. I am very sensitive to LLM-isms. Like many other millennials, (even if perhaps not quite most) I grew up online from a young age when text was the only viable communication medium, so I learned to notice incredibly small nuances of how someone writes and use those nuances to infer/personify the narrator. LLM's not only stick out like a sore thumb, their language actually "jams up" my 'text-personifier' neurological circuits. It's like my brain is saying "WTF? Why can't I synthesize any reasonable model of the person who wrote this?" the entire time, even if I know it's AI. That's frustrating, exhausting, and alienating.
So yeah, as I said: It's a tough tradeoff for me both as a consumer and as a do-er. I'm glad you used an LLM to do the write-up so that it shows up here and I can enjoy the work you did. I often use LLM's to write documentation at my startup for both my own reference and for my cofounders. I don't like it, but it's better than not doing it, and sometimes it's better to spend that time on other things, especially when the thing I'm documenting is subject to change very shortly.
I think the sweet spot, for me, is this:
If you're going to write it with an LLM, do so unapologetically. Put a disclaimer at the top. Understand that what you are delivering to your audience is not the LLM output, but whatever output was generated from your own input (work, vision, ingenuity, perseverance). Keep the LLM generated content concise, sharing only the necessary narrative and information to give consumers the context they need to understand whatever the actual work product is. The less slop I have to struggle through, the better - LLM's are absolutely awful at narration. And then make it easy to explore your actual work product!
I'm not sure my strategy might cause posts to never reach the front-page. I hope that our audiences can understand that this might be the best compromise and come to accept it in some cases. I will continue to point out when HN posts show strong signs of being LLM generated (as judged by my own tuned sense of nuance, empathy, and theory of mind...not whether they use em-dashes) but the intent isn't to tell people "this isn't worth reading". The intent of disclosing LLM generation is to inform people that the best way to consume the content is to switch to their personal "I'm reading LLM generated content"-mode and experience it through that lens.
Interestingly, my startup seems to have taken a somewhat similar strategy with vibe-coding. We're all aware that vibe-generated codebases are objectively worse, harder to read, and harder to maintain than our best hand-written code. It tends to fail on dumb edge cases and just doesn't have the "vision" that hand-written code would, because it glosses over decisions that we'd have paused and thought about for awhile before adjusting our vision and proceeding. But doing the initial proof-of-concept or prototype with LLM's greatly speeds up the period of exploration where we go "We're pretty sure there's a good a way to do this, and we're pretty sure we know what that way is, but there's a few unknowns that need to be proven". With hand-coding, those "unknowns" can take a long time to work through. With vibe-coding, we can try several different strategies, learn about the reality of implementing those strategies, and then go back and hand-write something more maintainable from scratch once we're pretty sure we've landed on the approach that we judge will be "stable". The timeline/priority for converting vibe-code to hand-code depends on how long we expect that code to last, how central it is to the system, and how important it is for humans to be able to debug, maintain, and interface with it.