It seems that you're using an outdated browser. Some things may not work as they should (or don't work at all).
We suggest you upgrade newer and better browser like: Chrome, Firefox, Internet Explorer or Opera

×
Everyone who played Alan Wake more than once probably knows the probem that you can't identify which manuscript page you just picked up if you've found it already on a previous playthrough.
At first I wanted to reset the found manuscript pages without resetting anything else like the coffee thermoses or chests. But soon I realized that I prefer resetting everything with the exception of being able to select nightmare difficulty.
So I took a look at the save files of Alan Wake and this is what I came up with.

The relevant file is "config" stored in "My Documents"(e.g. C:\Users\<username>\Documents) under Remedy\AlanWake. I slightly modifed a basically completely empty "config" file to enable nightmare difficulty. If you copy it to the appropriate location you can start new games in nightmare difficulty and all your statistics and main menu "Extras" "Playback"(manuscript pages, signs, chests, radio shows...) are reset.

AlanWakeConfigNightmareDifficulty.zip

And here is the stuff I figured out about the file format of "config". This will be very brief so don't expect to understand much if you aren't already somewhat familiar with analyzing binary files. Sorry, I'm lazy. ;)

The first 0x38 bytes seem to be options, "Vertical" "Invert" and stuff like that. I did't bother to really dig into this because who cares.
From 0x39 to the sequence "0a 0b 00 00 00 43 41 4e 50..." happens the magic. You may have noticed the last four bytes here are ASCII characters. It's the beginning of the string "CANPYRAMIDS".
I suspect the rest of the file is statistics stuff like "Kills with revolver" but again I didn't look into it since it doesn't matter for my purpose.

Right before "0a 0b 00 00 00 43 41 4e 50..." the found and read manuscript pages is stored.
struct ManuscriptPages
{
uint8_t numberOfFoundPages;
uint8_t foundPageIds[numberOfFoundPages];//the pages are simply numbered consecutively
uint8_t numberOfReadPages;
uint8_t readPageIds[numberOfReadPages];
}

For Instance "03 00 01 07 01 07" means you've found three manuscript pages, the first, the second and the seventh, and you've as yet read only one, the seventh.

So if you want to reset only the manuscript pages, replace the sequence described above with "00 00".

The flag for enabling nightmare difficulty is stored at "beginning of manuscript pages struct" - 0x0f.
The section is resonably recognizable thanks to two obvious floats.
struct
{
uint8_t FIXME_00;//always 1?
uint8_t EnableNightmareDifficulty;//0 disable, 1 enabled
uint8_t FIXME_02;//I've seen the value 1 most of the time, sometimes 3
float FIXME_03;//I've seen 0.5 "00 00 00 3f" and 1.0 "00 00 80 3f"
uint32_t FIXME_07;//always 1?
float FIXME_11;//always 0.5 "00 00 00 3f"?
uint8_t FIXME_015;//I've seen 0 and 1
struct ManuscriptPages pages;
}

Although there are some more sequences similar in structure to struct ManuscriptPages there is also a lot of stuff that I have no idea about what it is and I didn't investigate.

By the way, I know there are tools out there to modify save games slightly but I couldn't find anything describing file formats or one that resets manuscript pages. Although in the end I could have settled for a tool that unlocks nightmare difficulty. Well, maybe this will be useful for someone else if he/she is lucky enough to find it. ;)
Post edited April 09, 2017 by Kuchenschlachter
This is exactly what i was looking for, thank you so much!
You can enable Nightmare easily enough by running the game with the option -developermenu. Just unlock the difficulty, exit, then run the game normally. If you use the command line, you don't even need to temporarily alter the shortcut. I always do this on a new install.
First off, thanks from my side as well; was a good primer! :)

This year when I was doing backups, I stumbled upon this file and noticed that it's different to my last backup. I was curious what is different, so I digged into it and did some 'reverse engineering' as well.^^
I wanted to do some further digging, but I decided to still post it this year - it's been multiple months and I don't want to postpone it for a long time.^^

First, I need to mention that I don't own the game on GOG but on Steam, and there are some differences apparently. The "config" file also isn't in the Documents folder there but in C:\Program Files (x86)\Steam\userdata\{UserID}\108710\remote. Still want to post it here because it's the only resource about it that I found (and it applies to both versions).

Your findings were helpful, but your offsets confused me initially and I noticed, upon checking your file, that the Steam version has 44 additional bytes at 0x38 - haven't found out what data that is IIRC.

The following struct, second mentioned in the post, starts at 0x69 for me/Steam:
[code]
struct
{
uint8_t FIXME_00; // always 1?
uint8_t EnableNightmareDifficulty; // 0 disabled, 1 enabled
uint8_t LastLevelPlayed; // 1-indexed
float32_t DrawDistance; // 0.0-1.0
uint32_t GraphicsPreset;
float32_t FieldOfView; // 0.45 here, don't remember changing it
uint8_t EnableDirectAiming; // 0 disabled, 1 enabled
struct ManuscriptPages pages;
}
[/code]
"FIXME_02" (last level) was probably the last one I realized.^^

After that, there's an 8-bit integer for presumably the count of structures that follow: statistics for kinds of collectibles (eg. picked up thermos bottles, watched tv shows). It's similar to the "ManuscriptPages" struct.
At first I thought it's a name-table, but nope.^^

[code]
struct string
{
uint32_t length;
char *chars; // not null-terminated!
}

struct CollectibleStatistic
{
struct string Name;
uint8_t amountCollected;
uint8_t collectedIds[amountCollected];
}
[/code]

Then follows some statistics, decimal offsets relative to the collectibles block, uint32_t each:
+0: Kills with revolver
+4: Kills with flare gun
+28: Batteries used
+32: Indirect kills
+36: Great dodges
(+44: some 'dynamic struct' with count again, TBC..)

Afterwards there's some (graphics?) settings, offsets assuming +44 is 0 (else +X on top):
(+66: seems to be uint8_t, always 1?, TBC..)
+67: MSAA setting
+71: AF setting
+75: FXAA setting (2x uint8_t?)
(+127: likely graphics setting as well, seems to be triggered in combination with other settings, TBC..)

Haven't investigated each graphics setting, I think that's just what I noticed from my benchmark runs.

Finally, also found out what some of the earlier offsets contain:
0x5: Brightness (float)
0x1A: Invert vertical mouse control
0x1B: Invert horizontal mouse control
0x30: Mouse sensitivity horizontal
0x34: Mouse sensitivity vertical

Alright, that's it. Hope it's helpful for someone. :)
Will update when I did some further digging.^^