It seems Dan's Dog really is in the game. When I first saw the graphics for it, I thought they were just something silly that ended up in the files, but never got into the game. I'd never seen it before after all. But when I read Mcshay's post about very rare sightings, I decided to go looking. It seems the game does actually create the howling dog under fairly rare circumstances. I'm attaching a test DLL below that will recreate those circumstances.
The dog will appear when a meteor impacts if all the following conditions hold:
1) the impact leaves a scorch mark
2) the impact occurs exactly at a multiple of 32768 game ticks (about 327 marks)
3) the tile at the point of impact belongs to the third terrain type (for the built in maps, this is the sand tiles, however it need not be, and can be adjusted in the map file. See the map specification for details on the "TerrainType")
4) the tile is not currently occupied by a unit
As an additional note, the routine that generates the dog belongs to the Unit class for the Meteor, and this processing function will only be called when (unitIndex XOR tick) MOD 8 != 0. Hence the time condition can only hold for meteors that have a unit index that is a multiple of 8.
I did a few mem hacks in the DLL to bump up the tick to just short of 32768, and then spawned a bunch of meteors, and played with some of their internal flags and timers so they appear immediately, rather than after the standard 10 mark delay. I'm impatient.
Here's the code I used:
char MapName[] = "cm02.map"; // The .map file used for this level
char LevelDesc[] = "Dan's Dog"; // Description appearing in the game list box
char TechtreeName[] = "Multitek.txt"; // File to use for the tech tree
SDescBlock DescBlock = { Colony, 2, 12, false }; // Important level details
int InitProc()
{
// Center view over about where Dan's Dog appears
Player[0].CenterViewOn(35, 10);
// Bump up the game time
*(int*)(0x56EB1C) = 32768 - 76;
return 1; // return 1 if OK; 0 on failure
}
void AIProc()
{
static int i = 0;
if (i < 100)
{
Unit meteor;
TethysGame::CreateUnit(meteor, mapMeteor, LOCATION(35 + (i % 25), 4 + (i / 25) * 5), 6, (map_id)3, 0);
int* meteorUnit = (int*)((*(int*)0x54F848) + meteor.unitID * 120);
int* meteorUnitFlags = (int*)((char*)meteorUnit + 0x44);
int* meteorUnitTimer = (int*)((char*)meteorUnit + 0x3C);
*meteorUnitFlags |= 0xC000;
*meteorUnitTimer = 5;
i += 5;
}
}