Recent Posts

Pages: [1] 2 3 ... 10
1
Hey all -

So as I started out with the LLM-decompile idea, I thought it would give me a better starting point. But at some point while working with the agents we came to the conclusion that the gain we could get from that path would be marginal - and that is after an optimistic estimate. So I figured we better start the reconstruct now. For after all that is the main goal, right? To reconstruct it - to get back that lost code. At least that was the dream I set out to accomplish.

Small side note - I did not forget the decompile LLM. I still plan to investigate that branch. The idea of a decompilation engine for old games still sounds very exciting to me. But I need to think about it more. We are not only talking about pretty C or C++ out of a decompiler; we are talking about decompiling whole proper game systems. That is different stuff. I even thought maybe diffusion models somehow - but those are just thoughts in the wind, you know.

So we had this decompile stack: the Ghidra pseudo-code, the asm, and of course the community notes and the Olly and all. And I have to say I am very thankful and grateful for the work you guys did. It is short of a miracle to have such a map, and it is a clear sign of love and devotion. As they say - I stand on the shoulders of giants.

So we (and by we I mean me and my agents) took this decomp stack from the original PE and started to refine it function by function, cross-referencing it with the community knowledge. We called it "hanged code" (don't ask why). And once we hanged all the known addresses from the PE and the DLL, we started to rewrite.

The idea is that the hanged code is this huge blob of reworked pseudo-code. It is much closer to source, but it is still a heap of just functions - it is no game by any means. So the idea is to chunk it up with some sort of heuristic of which game system it is, and module by module rewrite it proper.

In order to actually know that the rewrite adheres to the original, we introduced the idea of streams. A stream is like a value over time - like a movie or video stream - where we record the commands given to the original Outpost PE, and we record the memory values over game ticks. We then use that as a baseline and compare it with the stream from the reconstruct. If they match, we can say with some amount of certainty that the reconstructed module is like the original - at least in a behaviour sense.

We also developed a harness for both the original and reconstruct: boot it up, issue commands, create units as needed - integration tests like in any other game.

In the beginning we wrote just simple "unit test" like scenarios: create unit -> order it -> see it arrives, or do whatever it was ordered. But as we recreate more and more modules, the plan is to create longer and more sophisticated test scenarios and run them through (at x40 speed or even more).

For now the repo is a mess, and there is a lot of old code from the dataset creation and LLM training tests and the QEMU Win2k box I used to cross-compile. So I would like to streamline it first - keep only the reconstruct and the harness stuff around it.

Once I do that and finish at least a first pass, I plan to open it to the public. You would still need your own vols / original assets to play; I am not shipping those. Off-day project, so figure a couple more weeks.

Questions welcome.
2
Outpost 2 Programming & Development / Re: Mine Yield Formula
« Last post by TechCor on August 17, 2026, 06:00:59 PM »
I should have shown the updated formula.

If rare is common divided by 2, then the first block could look like this:

Code: [Select]
InitialYield = InitialYield% * 10
PeakYield = PeakYield% * 10
MinYield = MinYield% * 10

This eliminates the ?MaxYield? constants. You just divide by 2 at some point if type is rare.

The notable part is that you have to multiple by 10 or the output numbers are too small. The MINES.TXT is out of 100, not 1000. You didn?t say where that 10x multiplier is coming from. That multiplier could happen later. That would make sense since it would be fewer operations.

From my original post, skip the first block and use the mines.txt values directly in the second block.
Then, replace the third block with:

Code: [Select]
Yield = Yield + Yield * Bonus% / 100
Yield *= 10
if (type == MineType.Rare) Yield /= 2

I haven?t verified truncation is not a problem with it at the end like this.
3
If you make the repo public, and give credit where it's due, we'd probably be willing to share more information with you! :)
4
Hey all - still here. Sorry for the quiet stretch.

@Arklon I spent years making mobile games, in big studios and small ones, including some back-office work. Then I moved into DevOps. These days I build AI platforms for gaming companies. It is basically those two jobs in one.

@BlackBox the thread title is misleading. I know Outpost can run on a Mac, and I am glad that works for people. That was never the point. For years I have wanted to take this game apart and turn the executable back into something like source. It stayed a fantasy. The new AI tools made it feel like I could finally try.

So that is the project. I wanted a machine I could feed Outpost2.exe, plus whatever we already know about it, and see how much readable code comes back out.

To train and test that machine I needed a fair test. There is no original Outpost 2 source, so I could not grade against the real game. I took other old C code from the same era (Quake 2, QuakeWorld, Enemy Nations, and a few Outpost mission SDK sources we already had), compiled it with the same kind of old Microsoft compiler, ran it through Ghidra, and compared the decompiled C to the source I started with. If a model can turn that Ghidra mess back into the original function, maybe it can help on Outpost later.

The compiler had to be the real old one: Visual C++ 4.2. I first tried Windows NT. That guest was too old. Telnet barely answered, I could not get a stable connection, and I could not copy files with robocopy. I looked for the newest Windows that still ran this compiler and was actually usable. That was Windows 2000.

I tried SSH into the guest. That SSH is from when the protocol was still young, and it was too buggy to trust. I did not want to write my own file-copy tool, so I did it the boring way: a shared folder (Samba), robocopy to move the work, and telnet to kick the compile. I wrapped the whole thing so I can talk to a compiler box and a decompiler box as one lab. Docker Compose runs those boxes plus a small workshop screen, and Metaflow lines up the jobs. I used to build toolchains in containers at work, so this part was a lot of fun. Opening those Win2k windows again, icons and sounds included, was unexpectedly emotional. A lot of teenage memories. I even put a VNC window on the virtual machine so I could sit inside it. Far too slow to play the game. Fast enough to compile, which is all I needed.

I ran a few models on a sample of those test functions: Ghidra by itself, Gemini, Qwen, and LLM4Decompile. I was not trying to publish a leaderboard. I just wanted to know if the idea pointed anywhere.

I had really hoped LLM4Decompile would be the one. I even thought about teaching it this compiler with a small extra training pass. That was a bust. The model is from 2024, so less surprising in hindsight. I have not given up on training something later. It is just too much time and effort right now. Gemini is much faster, so that is what I am using.

Right now I am doing a first pass with no extra training. Gemini gets the community notes, the Ghidra output, and I compile whatever it writes, just to see how far that gets on its own. I have started doing that on the real Outpost2.exe as well: take a function, write C++ that matches the names the community already has, and see if a modern compiler will accept it. That is not the game coming back. It is a baseline. Can an agent infer anything sane from what we already have, and does it even compile.

Later I still want a better model (I am looking at Qwen 3.5 9B, or a larger one if I can get a larger GPU), more training data, and a richer pack for each function: the Ghidra C, the assembly, the Olly notes, the call graph, the types, and which compiler built it. That comes after I know what this Gemini pass is actually worth.

Big thanks to Leviathan. He shared his knowledge base with me, and I am building the recompilation work on top of that.

I am not doing this alone. A bunch of agents do most of the work. I steer them.

The repo is still private.

Cheers
Jonathan
5
Awesome, thanks that worked. And it is probably a better solution than what I had been trying.

~Brett
6
I've never included the game executable as a secondary project, but in the project debugging properties, setting the command to the base OP2 executable with a command of /OPU has always worked reliably for me.
7
So, we are trying to debug a mission DLL. I used to be able to attach the VS debugger using the setup described at https://wiki.outpost2.net/doku.php?id=op2_sdk:projectsettings under the section Referencing the Outpost 2 executable.

There is a really long thread that discusses how I got to writing the wiki article here: https://forum.outpost2.net/index.php/topic,5793.0.html

I'm trying to figure out if I am just forgetting a step from years ago, or if using the OPULauncher changes what needs to happen to get VS to register a breakpoint in the mission DLL source code. I'm wondering if someone has recently tried debugging a mission and could help? We are using VS 2022 Community Edition right now, but would be willing to update to VS2026 if helpful.

Thanks,
Brett
8
OutpostHD / Re: OutpostHD v0.8.10 Released!
« Last post by kylepete on July 10, 2026, 07:42:08 AM »
100% AI generated, yes... not sure about the quality of the code, but crashes haven't happened for several hundred turns.
I'm sure there's LOTS of stuff to fix in there, still, but it did scratch that nostalgic itch!

The work you all have done manually is far more impressive, but it stoked my curiosity to see what I could do with an AI assistant.

Feel free to use as much or as little of it as you find helpful.  It's great to see a team of people like yourselves who care enough about fun old games like this one to put in the effort to make them playable again!
9
OutpostHD / Re: OutpostHD v0.8.10 Released!
« Last post by Hooman on July 10, 2026, 07:02:41 AM »
I think Leeor had found your GitHub repo about a week after your last post and was poking around at the UI improvements. Definitely some things we need to improve there.

I assume you used some AI tools to do the work? I had taken a quick look and noticed the timestamps on the commits seemed a bit close together for manually coding changes of those sizes.
10
OutpostHD / Re: OutpostHD v0.8.10 Released!
« Last post by kylepete on July 09, 2026, 10:46:10 PM »
Sorry, I'm very bad/new at/to all this... is it possible to see my github?
https://github.com/peterky/OPHD-Kyle

Full credit to all of you here, you've all obviously done FANTASTIC work!

I don't have any plans at this time to do anything else, aside from loving this classic old game.

/kp
Pages: [1] 2 3 ... 10