/devilution

Diablo devolved - magic behind the 1996 computer game

Primary LanguageC++OtherNOASSERTION

Build Status Build Status Build status Downloads github stars

Discord Channel Discord Chat Channel

Devilution

Diablo devolved - magic behind the 1996 computer game

Note, Devilution requires an original copy of diabdat.mpq. None of the Diablo 1 game assets are provided by this project. To get a legitimate copy of the game assets, please refer to the GoG release of Diablo 1.

Introduction

While most titles from Blizzard receive years of love and support, Diablo stayed in the shadows. Abandoned in favor of a sequel, it remained full of bugs and unfinished potential. The game was last patched in 2001 before being discontinued altogether, a problem I wanted to fix. I played Diablo extensively as a teenager, but as time passed it became difficult to run the game on newer hardware. The lack of many improvements made in Diablo II also laid it to rest. At first the game appeared to be a lost cause, but thankfully a little oversight in 1997 made it not so.

Diablo's development team moved on to Diablo II while passing the source code down to Synergistic Software for Hellfire. Less known however is that it was also given to Climax Studios to create a PlayStation port. Now Sony has long been known for letting things slide; especially in Japan. Anything from leaking prototypes to entire game source codes and Diablo was no exception. Symbolic information was accidentally left on the Japanese port. Normally used for debugging, a symbol file contains a map of everything generated during compile time. This includes file names, functions, structures, variables, and more! To top it all off a special build is hidden on the PC release in DIABDAT.MPQ -> D1221A.MPQ -> DIABLO.EXE! This build contains debug tools and assert strings further giving away code information.

After months of piecing these mistakes together, Devilution was born. I present to you a reconstructed form of Diablo's original source code! Once more shall the heroes of Sanctuary return to the depths below!

Purpose

Having the source code makes Diablo much easier to update and maintain. For years mod-makers had to rely on tedious code editing and memory injection. A few even went further and reversed most or all of the game. The problem is that they rarely shared their work. Usually being a one-person job, they move on with their lives due to the amount of time required or lack of interest. This brings us back to square one having to do countless hours of work all over again. Devilution aims to fix this by finally making the source code open to the community.

In order to ensure that everything is preserved, Devilution keeps everything as it was originally designed. This goes as far as bugs and badly written code in the original game. With that it serves as a base for developers to work with making it much easier than before to update, fix, and port the game to other platforms.

As a side goal Devilution tries to document the unused and cut content from the final game. Development of Diablo was rushed near the end--many ideas were scrapped and multiplayer was quickly hacked in. By examining the source, we can see various quirks of planned development.

Compiling

Diablo was developed on Windows 95 using Visual C++ 4.20 and later 5.10 and 6 for newer patches. Devilution aims to be compatible with both the original and modern tools, but will adhere to standards used for the original compiler.

Building with Visual C++ 6

  • Open the project workspace Diablo.dsw, choose Debug or Release, and then Build Diablo.exe.

To build a binary with functions compiled as close as possible to the original, use Visual C++ 6 with Service Pack 5 and the Processor Pack (important for proper code generation!) You will also need Visual C++ 5 with Service Pack 3, since the original binary was linked with the older linker from that. Sadly, you cannot use the old linker right out of VC6, so you'll need to link manually or via the MakefileVC in the project root.

Building with Visual Studio 2010-2017

  • Open the project solution Diablo.sln, choose Debug or Release, and then Build Solution.

Make sure to disable Data Execution Prevention. Storm.dll uses dynamic compilation to improve rendering performance but fails to mark the resulting memory page as executable, leading to a protection fault when trying to draw.

  • Configuration options -> Linker -> Advanced -> Data Execution Prevention (DEP).
  • Set this value to: No (/NXCOMPAT: NO).

You will also need the following dependencies installed if you are using Visual Studio 2017. Make sure to enable these when installing (or modify your installation):

  • Requires "Windows 8.1 SDK" (Target Platform)
  • Requires "Visual C++ MFC for x86 and x64" (For afxres.h)
  • Requires "Windows Universal CRT SDK" (For ctype.h)

Building with MinGW

  • Execute make MINGW32=1 for MinGW32 or make for MinGW64. Optionally add debug to build with debug features.

To compile with MinGW64 on different platforms, refer to the respective documentation: Linux | Windows | Mac.

Debug Build Features | Compatibility Matrix | Troubleshooting

Installing

Once compiled, the Devilution binary will serve as a replacement for Diablo.exe. The following files from the original game patched to 1.09(b) need to be present: DIABDAT.MPQ, DiabloUI.dll, SmackW32.dll, Standard.snp, and Storm.dll. If COPYPROT was defined when compiling, the Diablo CD will also be required.

Additionally, Strange Bytes' DirectDraw patch is recommended to help fix compatibility issues and run the game in windowed mode.

Multiplayer

Devilution is functional over both GoG's Battle.net server and IPX using an ipx-wrapper. Additionally if Standard.snp from StarCraft 1.16.1 is used, local UDP play also becomes available. There are programs like ZeroTier to connect UDP globally.

Contributing

Guidelines

Modding

Below are a few examples of some simple improvements made to the game. It is planned in the future to create tools for designing dungeons and graphics.

Example 1: Monster lifebar and item highlighting

Monster lifebar+items

Example 2: New Diablo 2-like trade screen

New trade screen

F.A.Q.

Click to reveal

Wow, does this mean I can download and play Diablo for free now?

No, you'll need access to the data from the original game. If you don't have an original CD then you can buy Diablo from GoG.com. Alternatively you can also use spawn.mpq from the http://ftp.blizzard.com/pub/demos/diablosw.exe version and compile the with the SPAWN flag defined.

Cool, so I fired your mod up, but there's no 1080p or new features?

Devilution aims to keep the original code unaltered, for documentation purposes.

So will you ever add cross-platform support or new features in the future?

Yes! This has been done as a side project, please see DevilutionX.

What about Hellfire?

Hellfire was a bit of a flop on the developer's part. Support may come in the future once the base game is finished.

I think that's about all, but is Devilution even legal?

That's a tricky question. Under the DMCA, reverse-engineering has exceptions for the purpose of documentation and interoperability. Devilution provides the necessary documentation needed to achieve the latter. However, it falls into an entirely gray area. The real question is whether or not Blizzard deems it necessary to take action.

Credits

  • Reverse engineered by GalaXyHaXz in 2018
  • sanctuary - extensively documenting Diablo's game engine
  • BWAPI Team - providing library API to work with Storm
  • Ladislav Zezula - reversing PKWARE library, further documenting Storm
  • fearedbliss - being awe-inspiring
  • Diablodin - providing additional info about the PSX release
  • Climax Studios & Sony - secretly helping with their undercover QA :P
  • Blizzard North - wait, this was a typo!
  • Depression - reason to waste four months of my life doing this ;)

And a special thanks to all the support and people who work on this project to make it possible! <3

Changelog

From the beginning until release

Legal

Devilution is made publicly available and released under the Sustainable Use License (see LICENSE)

The source code in this repository is for non-commerical use only. If you use the source code you may not charge others for access to it or any derivative work thereof.

Battle.net(R) - Copyright (C) 1996 Blizzard Entertainment, Inc. All rights reserved. Battle.net and Blizzard Entertainment are trademarks or registered trademarks of Blizzard Entertainment, Inc. in the U.S. and/or other countries.

Diablo(R) - Copyright (C) 1996 Blizzard Entertainment, Inc. All rights reserved. Diablo and Blizzard Entertainment are trademarks or registered trademarks of Blizzard Entertainment, Inc. in the U.S. and/or other countries.

Devilution and any of its' maintainers are in no way associated with or endorsed by Blizzard Entertainment(R).