Is there a reason why using the BruteForce (raw output) section on say 0x0213be9c (dwarf_race_index) reveals garbage instead of strings? Shouldn't the name & nick be viewable? There is data there and it appears to be structured, but just not in a human readable format.
Keep in mind that that should be dumping the raw hex values from memory - 0x41424344 is equivalent to the character values 'ABCD' for instance. (forgive me if you know this already)
Additionally, the only data that should be at that pointer (if it's valid for dwarf_race_index) is a four-byte integer that's the index of "DWARF" within the list of races (as far as I understand). (e.g., if the list is { elf, elephant, goblin, dwarf, dog }, dwarf_race_index would be an int * pointing to the value 3)
Even in the creatures vector, if you're looking at the entry for a particular dwarf, there may be no human readable data available, or there may be. Consider the following two examples:
Example A:struct dwarf {
char firstName[16];
char lastName[16];
}
Example B:struct dwarf {
char *firstName;
char *lastName;
}
If we have a dwarf "Urist McUrist", and we want to represent him with these structures, he would have two very different representations in memory, looking at those structures specifically:
A:55 72 69 73 74 00 00 00 00 00 00 00 00 00 00 00
4D 63 55 72 69 73 74 00 00 00 00 00 00 00 00 00
B:AA BB AA BB CC DD CC DD
In the case of A, we have stored: "Urist\0\0\0\0\0\0\0\0\0\0\0" followed by "McUrist\0\0\0\0\0\0\0\0\0", whereas B is two pointers (0xAABBAABB and 0xCCDDCCDD) that are the addresses of "Urist" and "McUrist" in memory elsewhere.
Depending how a dwarf, or any creature, is implemented in DF's code, we could see either of these being the case. Especially since all of the names are from a preset library (and not procedurally generated, as far as I know), I could definitely see first name and last name both being pointers. Some others are index values (profession appears to be, race certainly is).
I believe that the custom nickname and profession names are also dynamically allocated, and thus you'll just see pointer values rather than the actual string values. At least, as far as I can tell, they are.