Below are the five most recent posts in my weblog. You can also see a chronological list of all posts, dating back to 2003.
My previous blog posts about deterministic Doom proved very popular.
The reason I was messing around with Doom's RNG was I was studying how early versions of Doom performed random pitch-shifting of sound effects, a feature that was removed early on in Doom's history. By fixing the random number table and replacing the game's sound effects with a sine wave, one second long and tuned to middle-c, I was able to determine the upper and lower bounds of the pitch shift.
Once I knew that, I was able to write some patches to re-implement pitch shifting in Chocolate Doom, which I'm pleased to say have been accepted. The patches have also made their way into the related projects Crispy Doom and Doom Retro.
I'm pleased with the final result. It's the most significant bit of C code I've ever released publically, as well as my biggest Doom hack and the first time I've ever done any audio manipulation in code. There was a load of other notes and bits of code that I produced in the process. I've put them together on a page here: More than you ever wanted to know about pitch-shifting.
Earlier in the year I treated myself to a new camera. It's been many years since I bought one, which was a perfectly serviceable Panasonic FS-15 compact, to replace my lost-or-stolen Panasonic TZ3, which I loved. The FS-15 didn't have a "wow" factor and with the advent of smartphones and fantastic smartphone cameras, it rarely left a drawer at home.
Last year I upgraded my mobile from an iPhone to a Motorola Moto G, which is a great phone in many respects, but has a really poor camera. I was given a very generous gift voucher when I left my last job and so had the perfect excuse to buy a dedicated camera.
I'd been very tempted by a Panasonic CSC camera ever since I read this review of the GF1 years ago, and the GM1 was high on my list, but there were a lot of compromises: no EVF... In the end I picked up a Sony RX 100 Mark 3 which had the right balance of compromises for me.
I haven't posted a lot of photos to this site in the past but I hope to do so in future. I've got to make some alterations to the software first.
Post-script: Craig Mod, who wrote that GF1 review, wrote another interesting essay a few years later: Cameras, Goodbye, where he discusses whether smartphone cameras are displacing even the top end of the Camera market.
My first computer was an Amiga A500, and my brother and I spent a fair chunk of our childhoods creating things with it. These things are locked away on 3.5" floppy disks, but they were also lost a long time ago.
A few weeks ago my dad found them in a box in his loft, so a disk-reading project is now on the horizon! Step one is to catalogue what we've got, which I've done here. Step two is to check which, if any, of these are not already in circulation amongst archivists. Thanks to Matthew Garrett for pointing me at the Software Preservation Society, which is a good first place to check.
When we get to the reading step, there are quite a few approaches I could take. Which one to use depends to some extent on which disks we need to read, and whether they employ any custom sector layout or other copy protection schemes. I think the easiest method using equipment I already have is probably Amiga Explorer and a null-modem cable, as this approach will work on an A500 with Workbench 1.3.
There are a variety of hardware tools and projects for reading Amiga floppies on a PC, but the most interesting one to me is DiscFerret, which is open hardware and software.
My last blog post proved popular, and I've had some requests for a video demonstrating it, so I've put one together:
What happens if you remove randomness from Doom?
For some reason, recently I have been thinking about Doom. This evening I was wanting to explore some behaviour in an old version of Doom and to do so, I hex-edited the binary and replaced the random number lookup table with static values.
Rather than consume system randomness, Doom has a fixed 256-value random number table from which numbers are pulled by aspects of the game logic. By replacing the whole table with a constant value, you essentially make the game entirely deterministic.
What does it play like? I tried two values,
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.
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
0xFF, any strobing sectors (flickering lights etc.), are
static. However, with
0x00, they strobe like crazy.
0x00, monsters seem to choose to attack much more frequently than
usual. Damage seems to be worst-case. The most damaging floor type
("super hellslime"/20%) can hurt you even if you are wearing a radiation
suit: There was a very low chance of it hurting whilst wearing the
each time the game checked; this is rounded up to 100%.
Various other aspects of the game become weird. A monster may always choose to use a ranged attack, regardless of how close you are. They might give up pursuing you. I've seen them walk aimlessly in circles if they are obstructed by another thing. The chance of monster in-fighting is never, or a certainty. The player is either mute, or cries in pain whenever he's hurt.
If you want to try this yourself, the easiest way is to hack the
file in the source, but you can hex-edit a binary. Look for a 256-byte sequence
['0x0', '0x8', '0x6d', '0xdc', '0xde', '0xf1'] and ending
['0x78', '0xa3', '0xec', '0xf9'].
Older posts are available on the all posts page.