As a background: who am I? I am a fan of Warcraft III modding who has been modding the game for years as a hobby, and I am not affiliated with Blizzard Entertainment in any way, but I decided that I would try to rewrite the game of Warcraft III by combining freeware tools and programs from here on the Hive, so that I could entertain myself by learning more about how this game is put together and possibly get the experience of making "source code mods" some day of a nearly identical hobby freeware game engine written in a different language than Blizzard's Warcraft III. My rewrite of the game is very incomplete AND NOT YET WORTH YOUR TIME TO USE IT so I'm just mentioning it so that you know what has caused me to learn some of these things.
So if you can imagine this world I exist in where I can change anything about the code, I have hacked in support for using a 1.31 installation as well as using a 1.26 installation (and many others as well) while loading my own custom code piece, which you can think of as "replacement game code" that reads from the same characters models and unit data information. So this forces me to become intimately aware of the extensive differences of 1.31 and 1.26, because I have basically created game code that can load either one and use it to play something akin to the Warcraft III experience. I will be playing 1.31 for a bit, and then I change a config file to tell the game to load assets now from my 1.26 installation instead, and I make one or two code changes, and then I run the game and it still launches. Of course, when I say "the game still launches", I am not referring to the Blizzard Entertainment Warcraft III program. My program when it runs on 1.26 will use that data and information, but I have different code, so for example if you play it on a widescreen monitor I have dictated to the computer to stretch in a different way. The space around the UI stretches and is left with black empty space instead of the whole game stretching.
And I can do this on 1.26 because I am not running the program code of Patch 1.26, nor any program code from Blizzard, but instead I am running completely my own program where all design decisions are dictated by me telling the computer what to do. Each pixel of each murloc is rendered using a complex set of linear algebra equations that I typed into the computer by copying from information available here on the Hive.
Now, unfortunately what I created does not have any multiplayer and frequently crashes, because it is not Blizzard's polished game code, and so I am not advocating for you to use it at this time. But the point is that I have experienced "switching assets" from 1.31 to 1.26 with "the same code" and had my program "still work" and so this gives me background to explain to you the issues that you will run into.
Even when my program is completed, and let's assume its able to switch underlying assets like this, if we assume that in 2022 or 2023 there might be a time when I add multiplayer to my code, at that time still you WILL NOT EVER be able to have one guy with a 1.31 installation, and another guy with a 1.26, and they both run THE SAME CODE of my game engine and join each others' game. Even though it might be "the same code" from me to run either way, this cross compatibility will never exist. Now, I am going to try to explain why.
Imaginary Steps (You Should Never Actually Try) That Might Make 1.31 Run Like 1.26
Step 1: Change MAX_PLAYERS constant
When I am playing a 1.31 map on my replica of the game code, and then I want to change to emulate the 1.26 client with my code, the first thing that I always have to do is go into the game source code and change the MAX_PLAYERS constant. In my replica, this is a magic number that sets the number of players in the game. For the 1.31 emulation it must have the value 28, whereas for the 1.26 emulation it must have the value 16. Typically we refer to this as "12 players" or "24 players" but there are 4 other neutral players in the game. This same constant changed in the 1.31 source code, so to begin hacking your 1.31 to become 1.26, you must do some sort of hack to the 1.31 binary game code (which is probably both illegal, and outside my knowledge of how to do it) where you basically would go to anywhere in the game engine that the number 28 is used for this purpose and change it to 16. When I wrote my own game to play this sort of Warcraft III style of experience, I was using a totally different programming language than Blizzard used to create Warcraft III -- my game is run with an
interpretted language -- and this means even when mine is running, it doesn't actually "run" and its more like my code is "being run by" another, smarter program. As a result, changing this ONE SINGLE constant from 28 to 16 is easy for me. However, we assume that the 1.31 C++ code uses some constant that is statically compiled in C++, then it is safe to assume that although the number is probably in
one place in the sourcecode inside the Blizzard Entertainment offices in California, after the program has compiled the constant is likely to be inlined and all over the place in the binary. So essentially you will spend your first day(s) of this project searching through
Warcraft III.exe
with a memory analyzer or something, and I don't have experience using those, and you have to find every place where you see the number 28 used for a player count and change it to 16.
Step 2: Changing Game Assets
To understand the game assets, it probably helps to understand where everything came from during the design of Warcraft III. The cleanest way that I have ever seen this is if you look at very old versions of the Reign of Chaos. You have mentioned hit points as an example of something
must absolutely match for network syncing, and you are absolutely right. It turns out, there are tons of other things that changed on Patch 1.31 besides hit points -- and I do mean tons -- but let's start with the hit points.
The hit point values of every unit, organized by the unit's type (footman, peon, peasant, etc) are saved in a file that back in the Reign of Chaos was named "Units\UnitBalance.slk". The SLK extension is probably something most users are not familiar with, but you can actually open it in Microsoft Excel and on the Reign of Chaos Patch 1.00, when I install from the disk, this Microsoft Excel-compatible Spreadsheet still has the comments in there. As I can see by opening the file, there are three HP related columns on the spreadsheet, "HP", "realHP", and "regenHP". We can see some comments. Frank Pearce left this comment on regenHP:
Frank Pearce:
HP regeneration rate per second.
There is also a comment from an unlisted author on "realHP":
Hero strength determines HP. This is the calculated, actual HP of the unit.
I would say that I believe "realHP" is not used in the modern game engine, and was probably only in this excel spreadsheet to help the guys in 2002 figure out how to balance the units.
So, the reason I mention any of this is that in order to do what you are asking, you are going to need to
understand the
very specific information in these Warcraft III installations in order to do what you ask.
Now, let's take these HP columns as an example and talk about their evolution over time and where they are stored in Warcraft III: The Frozen Throne patch 1.26, versus where they are stored in Warcraft III: Reforged PrePatch 1.31. Yes, I have met people who are deeply offended that I refer to Patch 1.31 as the Reforged PrePatch, because it does not have the Reforged menu and they do not hate it. However, the patch notes for Patch 1.31 say, "This is the last patch to prepare for Reforged" or something similar, and I am calling it Reforged because of its design architecture as a piece of technology, not because of how people feel about it.
In the Frozen Throne patch 1.26, the game was built as an expansion called "The Frozen Throne" layered on top of an installation called "Reign of Chaos" for the base game. So, using HP as an example, this information was in "Units\UnitBalance.slk" originally. But you don't see that file on your computer. It is stored in a container. We can think of this container similar to how you probably have used ZIP files in the past. However, to improve performance and encrypt the game against hacking, the original 2002 game did not use a ZIP as the container for game information. Instead, the 2002 game developers used their own container called "MPQ" which stands for
Mike O'Brien
Pa
Q. It really is basically just a file container with some extra performance and encryption stuff going on to improve load times. At this point, there are 20 years worth of technologies built to modify them, so they are basically as easy to work with as a ZIP, or almost so.
When we look in the Reign of Chaos installation, determining the hit points for a unit is very simple. We open the "War3.mpq" archive and we find "Units\UnitBalance.slk" in there. This is the only place on this version where unit hit points are stored.
The first time that this became more complex was when the first Reign of Chaos Patch come out sometime in 2002. Users who connected to Battle.net would download new game data into a file called "War3Patch.mpq". This was a second, new container of game data. This file contained its own copy of "Units\UnitBalance.slk" with NEW and UPDATED versions of the unit hit points for the patch. When the game looks for any file to load, such as "Units\UnitBalance.slk", now the logic is
- Look in "War3Patch.mpq" to see if you have the file at this patch
- If that fails, look in "War3.mpq" to see if you have the file at this path
So, this meant that the old War3.mpq wouldn't change each time a new patch was installed, and as a result downloading patches was relatively quick. The patches would just replace or modify "War3Patch.mpq" with new updates, and it was a much smaller file that contained only the files that had actually changed in the patch.
So then The Frozen Throne expansion came along and suddenly there are a lot of different versions of the hit points of each unit. Maybe there is a unit who needs 300 hit points in the Reign of Chaos campaign, 200 hit points in the Reign of Chaos balanced online matchmaking mode, 400 hit points in the Frozen Throne, and 375 hit points in the Frozen Throne balanced online matchmaking mode. This seems rather complex. To account for this, the code for where to find unit information has to get more complex. So we introduce new copies of "Units\UnitBalance.slk" in new locations:
- "Units\UnitBalance.slk" - This file is still here, but it is replaced in Frozen Throne to have the latest melee competitive play ruleset for Frozen Throne. We can think of it as "the official" version of the hit point values. If you go online and join a ranked match, it would use this one. It's the go-to solution.
- "Melee_V0\Units\UnitBalance.slk" - This file is a copy of the version from the Reign of Chaos, but it is formatted differently so that it can load on the Frozen Throne engine. This also has the melee competitive play balance changes to provide the latest and greatest Reign of Chaos gameplay. That way you can crossplay, so that when you play Frozen Throne, you can go back and play a game with a Reign of Chaos ruleset by launching 'Warcraft III.exe' instead of 'Frozen Throne.exe'.
- "Custom_V0\Units\UnitBalance.slk" - This file is a copy of the oldest Reign of Chaos version -- the one used to make the Reign of Chaos campaign missions. It can be updated slightly to match the Frozen Throne format for the data, but the contents are the HP values of the oldest Reign of Chaos build. Because of this, when you play the Reign of Chaos Campaign on your Frozen Throne installation, the campaign missions will always be supported with their original game balance in working order, even after new patches are released for the game that change Reign of Chaos competitive play HP values to rebalance the game.
- This file is also used if you play a custom map with the Reign of Chaos ruleset (i.e., you click on "Warcraft III.exe" then inside the game choose "Single Player" then choose "Custom Game" then play a map THAT IS NOT MARKED AS A MELEE MAP by the World Editor.)
- "Custom_V1\Units\UnitBalance.slk" - This file is a copy of the oldest Frozen Throne version -- the one used to make the Frozen Throne campaign missions. That way, even after new Frozen Throne balance patches are released, the campaign missions will always be supported with their original game balance in working order.
- This file is also used if you play a custom map with the Frozen Throne ruleset (i.e., you click on "Frozen Throne.exe" then inside the game choose "Single Player" then choose "Custom Game" then play a map THAT IS NOT MARKED AS A MELEE MAP by the World Editor.)
So, fundamentally, the program code for 1.26 knows about these 4 locations to look for files. But there are actually more copies of the unit hit point information than this, because of all the different layered MPQ archives and how some of them get used, and some of them do not get used anymore after new patches are released. If you look at your 1.26 installation, you will find the unit hit point information in the following locations:
- War3.mpq
- "Units\UnitBalance.slk" - This is the old version. No longer used, because it is overridden by files in the same location inside of the patch data.
- War3x.mpq
- "Units\UnitBalance.slk" - This is the old version snapshotted for the first release of Frozen Throne. I installed Frozen Throne from my CD and it condenses the patches so that there is no "War3Patch.mpq", instead all the game data is just packaged in War3x.mpq. So in that version, "Frozen Throne Patch 1.14", we use this file as our competitive play information. But assuming that you have a 1.26 installation, then this file is defunct and overridden by the patch data file
- "Melee_V0\Units\UnitBalance.slk" - Not used for same reasons as the above file
- "Custom_V0\Units\UnitBalance.slk" - Not used for same reasons as the above file
- "Custom_V1\Units\UnitBalance.slk" - Not used for same reasons as the above file
- War3Patch.mpq
- "Units\UnitBalance.slk" - Latest Frozen Throne competitive balance HP values here. These are the ones actually used in melee games.
- "Melee_V0\Units\UnitBalance.slk" - Latest Reign of Chaos competitive melee balance HP values here. Used if you play Reign of Chaos ranked online, or melee maps.
- "Custom_V0\Units\UnitBalance.slk" - Latest Reign of Chaos custom map balance HP here. Actually used, for example if you play Reign of Chaos campaign.
- "Custom_V1\Units\UnitBalance.slk" - Latest Frozen Throne custom map balance HP here. Actually used, for example if you go online and play dota or some TD or play Frozen Throne campaign, etc, this will be the file that is used.
So, with the above file information, you can see that the files in War3Patch.mpq are always the ones used to determine hit points, since they have all been changed in a patch. But what about files that were never changed in a patch, but changed in the expansion? We want our game to support two different modes of play -- the Reign of Chaos, and the Frozen Throne expansion. When we talk about using the assets on Patch 1.31, take a look at the
Icon of the Human Priest. When you play in the Reign of Chaos mode, you will notice
this icon is different between 1.26 and 1.31. Now, if it was only that icon, obviously it would not matter. But the point is that it shows that the fundamental way the assets load was changed between 1.26 and 1.31 in a way that was complicated. I believe the reason is this: patch 1.26 does not load War3x.mpq when you use the Reign of Chaos mode. It is not necessary, and without this file we do a better job exactly emulating the assets and data used by someone who does not have Reign of Chaos at all so that we crossplay with them perfectly (no desyncs). Imagine the following scenario: maybe Friend A and Friend B want to play together in Reign of Chaos online, but Friend A never bought the Frozen Throne. To support this, when Friend B clicks on his "Warcraft III.exe" (NOT expansion) application on his computer, it must decide
not to load any Frozen Throne data and so the "War3x.mpq" is not loaded.
The Reforged devs didn't understand this on 1.31 so when we get there I will explain how on that version, the assets are no longer structured in a way that would even make this conceptually possible.
Now that I gave you a good description of how and why the files are located as they are on Patch 1.26, let's talk about the (in my opinion stupid) idea of making your Warcraft III: Reforged PrePatch 1.31 installation load the information from the files listed above and the hurdles that you will have to overcome to do so.
First off, when the Reforged team was tasked with updating these systems, they became frustrated. Apparently, in their opinion, everything that I described to you until now annoyed them because it was complex, and they always had their bosses standing over their shoulders asking for progress obviously. It seems better to reinvent it to be less complex, right!?
So on 1.31, there is no longer the idea that you could have the Reign of Chaos without the Frozen Throne. We scrap that idea as being too complicated. We scrap the idea of War3.mpq and War3x.mpq as being separate. "If you want to emulate Reign of Chaos," the Reforged dev thinks to himself, "you might as well just run the game with the same assets but a different set of rules." Shouldn't you be able to just use "Melee_V0\Units\UnitBalance.slk" as the source of your HP information, even while loading War3x.mpq? It is a sound principle if we assume all users have the expansion, and it would theoretically simplify the game data.
So, now the year is 2017. Mike O'Brien who invented MPQ or whatever jumped ship from this company years ago and is now the boss of Guild Wars. The MPQ archive is considered a frustrating legacy technology and frowned on by everyone at the office in 2017 Blizzard. In order to build Reforged, it's better if we store all the game assets in the same format as the other modern Blizzard games. These games are no longer stored with a simple container like a ZIP. They are something we can stream! Maybe you are playing WoW and you only visited the Outland, and you are in a hurry and just installed the game so you want to stream the game while you play and only download the Outland without downloading 50 GB of other continents.
Enter the CASC technology. This is a new way of storing information centered around streaming it from Blizzard servers. What the player has on their computer is meant to be irrelevant. It's just a mirror of the current Blizzard server contents that's cached on their computer so it loads fast. It was invented circa 2014 for these other games like WoW and eventually Starcraft 2 and all the other Blizzard games and such. In this format, things are more complicated so that it's easier to always stream down any missing file from a Blizzard server that you might need, since any game is going to be always online anyway. Maybe some of the files don't install immediately on the user's computer and just stream down when they need them.
So, to prepare for Reforged to stream down in this way, everything in Patch 1.31 is reformatted to the CASC storage system. If you have a copy of 1.31, that's because you somehow held it off from updating to the latest build which is Reforged, anyway. So you're sitting on this local mirror of the out of date version of Reforged that is 1.31. Now you are deciding you have a new goal: PUT 1.26 IN IT.
So, the first logical thing that you want to do is get a CASC local datastore editor. To be honest, I have never done this. I do not know how to do this. This is where my ability to help you ends. I modded the old MPQ game for 15 years and became quite familiar with it, but when I tried to mod CASC data for WoW model swapping in 2014, what I found was that as soon as I would replace a game file, then launch the game, the game would re-stream down the official version of the file thinking that it was corrupted by accident. This is the point of CASC. I deleted my Reforged installation except for the tiny EXE and played the Reforged game and as I played it, it regenerated its 26 GB of data. This same technology, I believe, is present in 1.31 even though the server to download from might be gone now.
So you have two choices that come to mind for me for modding the CASC contents of 1.31 to contain the 1.26 data:
- You can try to find a program to edit this local mirror of the CASC information as though it were a zip... some special editor someone might have created to let you think of this in the manner in which you want to think of the simple container in the old Patch 1.26 game format. That might exist, but if it does I do not know about it. I do not have a program like that.
- You can try to go to shady private WoW server forums. (Yes WoW, not Warcraft III, this is not a typo). Learn from the shady people there how to replicate a Blizzard server and trick your Patch 1.31 client into thinking that its local CASC cache is out of date and it should update itself to your new version from your hacked server in the same way that WoW illegal private servers probably trick the WoW game client to do that, probably. I am not aware of any local in-place CASC editing solution so if I was dedicated to doing this, maybe this way is the first way I would try.
There are probably some hardcore Patch 1.31 modders out there who are thinking to themselves right now, "I know this Retera guy is being crazy here! You don't have to do any of that!" that they are, kind of, correct. Given that a technology is not known to me to modify the contents of the CASC/Reforged installation (using on and after Patch 1.30+), we can fall back to a different solution. Duplicating data as a last-ditch solution to change what the game will load when it runs. In other words, we agree that modding died after Patch 1.30. We agree that unlike Patch 1.29 and below, there is no longer a reasonable way that fans can change the contents of their game installation. However, you can still trick the game into loading
more data
on top of what it normally would contain. You can do this by modifying your registry to activate a debug setting built into Warcraft III that will cause it to load files from your computer as though they were included in the game. Essentially, there is a registry key named
HKEY_CURRENT_USER\SOFTWARE\Blizzard Entertainment\Warcraft III
where you can add a
REG_DWORD
named
Allow Local Files
, and set it to the value 0x1, and then if you put your own
"Units\UnitBalance.slk"
as just a flat file inside your Warcraft III 1.31 installation, then it would load this file. Then when you play with other users you will desync because your game client will use whatever hit points you place inside this custom UnitBalance.slk file.
So, let's assume you are now stuck doing this and you've given up the ship with regards to actually changing what is inside your Warcraft III: Reforged PrePatch 1.31 installation (as you should) and you now are doing a local files mod instead, this interesting "third option". For the sake of example, I just tried building and configuring something like this on my computer. So, since it now contains 1.31 as well as the flattened Frozen Throne-only view of the Patch 1.26 files unzipped out of the MPQs, it will load the 1.31 client with the 1.26 data and assets.
In order to launch this, of course, I have to choose the x86 or x86_64 folder to launch the game, and at that point we encounter this error message:
This is because 1.31 has a special new UI component built into the menu for switching between Reign of Chaos and Frozen Throne. So, being the Warcraft III modder that I am, I went ahead and added back the Edition Button to the game, and tried to relaunch. At this point, I have diverged the contents of my installation from 1.26 or whatever, but let's ignore that for the time being. Now I am able to launch this (Frozen Throne only) broken hilarious client that is "using Patch 1.26 data" to the fullest extent that I know how. Of course, the first thing that happens is a get a nonsensical error message with no text, since what we are doing is stupid and we are breaking the game.
This is probably Patch 1.31 asking me to upgrade to Reforged, even though we are using the 1.26 assets and stuff so it has no text to display since there was not a stupid popup like that in Patch 1.26. I will choose "No" to humor this bad idea a little further and let's try to play a game.
Here's a video of what happens. By the time I reach the Single Player-> Custom Game menu it stops working:
This is probably because the script API systems and game data formats are just really fundamentally changed in a lot of ways on Patch 1.31, and you could spend a lot of time trying to find which compatibilities stopped us here, but a the end of the day, even if you figured them out, Patch 1.31 used a different networking protocol to play games online so that players would not need to port forward games that they hosted and the games would be hosted on Blizzard servers, and even in LAN probably Patch 1.31 was using the Bonjour service for the Reforged way of doing LAN, although actually I'm not sure and I have not tested that necessarily.
It's just a bad idea that will never work and you should not try to do it. All those files I listed before with regards to just hit points, and that's
just hit points and there are hundreds of other files in this game that got moved all around during all the work and development for Reforged (and thus are moved in 1.31). The other game balance data on 1.31 is supposed to be located in a folder named "war3.w3mod/_balance/custom_v0.w3mod/units/unitbalance.slk" and "war3.w3mod/_balance/custom_v1.w3mod/units/unitbalance.slk" and "war3.w3mod/_balance/melee_v0.w3mod/units/unitbalance.slk" and this is similar to 1.26 but it's all in a different place, and the local files hack doesn't honor it properly if you put it in that place, I don't think. So, based on whether the game you joined was melee or custom, you would need two game clients to join the correct one.
At this point, actually because of the natural of my real life away from this video game, I cannot go on down the rabbit hole of ridiculousness, because crossplay between Reforged engine and Frozen Throne engine is just actually stupid and impossible even though they are derivative works of the same original thing.
So, in summary, this idea can die in a fire, and have a nice idea.