## Tuesday, June 30, 2015

### Randomness in Doom

Doom's source code is all online.  Someone posted a link to the RNG used, which is actually just returning a value from the same list of 256 numbers over and over in the same order:

unsigned char rndtable[256] = {
0,   8, 109, 220, 222, 241, 149, 107,  75, 248, 254, 140,  16,  66 ,
74,  21, 211,  47,  80, 242, 154,  27, 205, 128, 161,  89,  77,  36 ,
95, 110,  85,  48, 212, 140, 211, 249,  22,  79, 200,  50,  28, 188 ,
52, 140, 202, 120,  68, 145,  62,  70, 184, 190,  91, 197, 152, 224 ,
149, 104,  25, 178, 252, 182, 202, 182, 141, 197,   4,  81, 181, 242 ,
145,  42,  39, 227, 156, 198, 225, 193, 219,  93, 122, 175, 249,   0 ,
175, 143,  70, 239,  46, 246, 163,  53, 163, 109, 168, 135,   2, 235 ,
25,  92,  20, 145, 138,  77,  69, 166,  78, 176, 173, 212, 166, 113 ,
94, 161,  41,  50, 239,  49, 111, 164,  70,  60,   2,  37, 171,  75 ,
136, 156,  11,  56,  42, 146, 138, 229,  73, 146,  77,  61,  98, 196 ,
135, 106,  63, 197, 195,  86,  96, 203, 113, 101, 170, 247, 181, 113 ,
80, 250, 108,   7, 255, 237, 129, 226,  79, 107, 112, 166, 103, 241 ,
24, 223, 239, 120, 198,  58,  60,  82, 128,   3, 184,  66, 143, 224 ,
145, 224,  81, 206, 163,  45,  63,  90, 168, 114,  59,  33, 159,  95 ,
28, 139, 123,  98, 125, 196,  15,  70, 194, 253,  54,  14, 109, 226 ,
71,  17, 161,  93, 186,  87, 244, 138,  20,  52, 123, 251,  26,  36 ,
17,  46,  52, 231, 232,  76,  31, 221,  84,  37, 216, 165, 212, 106 ,
197, 242,  98,  43,  39, 175, 254, 145, 190,  84, 118, 222, 187, 136 ,
120, 163, 236, 249
};

int rndindex = 0;
int prndindex = 0;

// Which one is deterministic?
int P_Random (void)
{
prndindex = (prndindex+1)&0xff;
return rndtable[prndindex];
}

int M_Random (void)
{
rndindex = (rndindex+1)&0xff;
return rndtable[rndindex];
}

void M_ClearRandom (void)
{
rndindex = prndindex = 0;
}


There is an explanation of it here.  I find these kinds of hacks, used in 80s and 90s era games to save space and increase speed, interesting.

Here is a story of a guy that replaced all the values with the same number:
What does it play like? I tried two values, 0x00 and 0xFF. With either value, the screen "melt" effect that is used at the end of levels is replaced with a level vertical wipe: the randomness was used to offset each column. Monsters do not make different death noises at different times; only one is played for each category of monster. The bullet-based (hitscan) weapons have no spread at all: the shotgun becomes like a sniper rifle, and the chain-gun is likewise always true. You'd think this would make the super-shotgun a pretty lethal weapon, but it seems to have been nerfed: the spread pattern is integral to its function.

With 0x00, monsters never make their idle noises (breathing etc.) On the other hand, with 0xFF, they always do: so often, that each sample collides with the previous one, and you just get a sort-of monster drone. This is quite overwhelming with even a small pack of monsters.

## Tuesday, June 16, 2015

### Civilization 4 on Linux Via Wine

I have a week off, and figured I'd be productive by playing Civ continuously the entire time.  I've used Wine a bit, but not much with modern games like Civ 4.  It took me several hours, so I figured I'd document the process here for future reference.

To begin, get iso's of the game and two expansions.  Wine doesn't work well with multidisc installations, but if you have isos you can mount them all before you begin.  Also each disc is one independent installation.  I have the actual discs, but found it much easier to download them.

It is also easier to use Wine as 32 bit, instead of trying to get 64 bit to work.  Since I wasn't using Wine for anything important, I just deleted my ~/.wine directory.  I then ran export WINEARCH=win32 before I ran any wine command.  Export will save that variable in your terminal window until you close it, but with multiple terminals open I found it safer to just compulsively enter it.

Next, you'll need a shell script called Winetricks.  You run Winetricks with arguments of various dlls and other things you need to be manually overridden.  For Civ 4 you'll need msxml3 for sure.  I ran winetricks msxml3 msxml4 vcrun2003 quartz devenum corefonts lucida tahoma, because I found it somewhere on the internet.

Run winecfg and go to the Libraries tab.  Find the library called gameux, and add it to the list of overrides, and then edit it to be disabled.  I also found that Wine did not do a good job of guessing my graphics RAM, so I had to run wine regedit.exe and add the key HKCU>Software>Wine>Direct3D>VideoMemorySize and set the value to 512.

Now, mount your 3 isos.  Navigate to the directory containing the installs and run them via Wine (make sure you've exported WINEARCH=win32 first).  The installs were straightforward.  After you've installed Beyond the Sword, download the latest patch (3.19) and install that via Wine.  The expansions will install the patches for the vanilla game, and the latest patch makes it no-cd so no need to download cracks.

You can navigate to ~/.wine/drive_c/.  If you see "Program Files (x86)" it means you messed up with your export WINEARCH=win32's and installed the game as 64 bit.  It may still work, but if not delete ~/.wine and try again.

The game is at: "~/.wine/drive_c/Program Files/Firaxis Games/Sid Meier's Civilization 4/Beyond the Sword/Civ4BeyondSword.exe".  Run it via Wine.  After it starts, you can exit and then find the config file at "~/My Games/Beyond the Sword/CivilizationIV.ini".  If you are having trouble you can set FullScreen = 0 and find ScreenHeight and ScreenWidth and set them low.  I have no trouble with full screen 1920x1080 though.  Set NoIntroMovie = 1, AutoSaveInterval = 1, DisableFileCaching = 1, DisableCaching = 1, ModularLoading = 1.

After that you should be good.  The game runs quite well, I've only noticed some slight graphics errors on some of the 3d animated leaders' faces.  I did have crashing sometimes when attempting to open certain advisor windows (military advisor seemed most common).  The Windows error message recommended I lower graphics settings and so I did from high to medium and haven't had a crash since.