Actions

Key def.dat: Difference between revisions

From Populous Wiki

No edit summary
(Redirected page to Keys Configuration Format)
 
Line 1: Line 1:
Change Populous default keys using programming or hex editor. The file was decoded on November 23rd 2013.
#REDIRECT [[Keys_Configuration_Format]]
 
All the addresses are correct, but typos can and will exist. If there is a typo or wrong address let [[Brandan Tyler Lasley|me]] know or correct it!
 
== Introduction ==
Key def.dat is a file that you have to create by using the Populous key editor included in the game ([http://www.brandanlasley.com/releases/Thread/Popre/Best%20Patches/key_def.dat Key def download]). Once you save, the file is created and it is located in ./save/Key def.dat. Each key is stored in a hexadecimal address, the combination key is always 1 in front of it. So if 1 is pause 2 will be the combination key. The combination key is like shift + key but in the file format it reads key + shift.
 
Each key needs to be converted from hexadecimal to a integer. This can be done in programming by simply reading information from the address, else if you're using a hex editor (like HxD) you'll have to that by hand using a converter like [http://home.paulschou.net/tools/xlate/ Paulschou] (use the values from CHAR), once you got the number it should range from 1-105, if it exceeds that, you're reading the wrong location or you got your math wrong. In [[#In Programming]] you will be told how to convert the values from keycode (the integer number you just got) to ASCII using programming methods. If you want to change them by hand without programming, all the key definitions are on this list [http://www.penticoff.com/nb/kbds/ibm104kb.htm keycode list for US QWERTY], remember that you have to convert those numbers back to hex from the [http://home.paulschou.net/tools/xlate/ Paulschou]'s link, or by [[#In Programming|programming]].
 
This is not a complete decode of the file, however its most of the common key commands for Populous, if you find more, feel free to add them!
 
All numbers are stored in big-endian format!
 
{| class="wikitable"
!colspan="6"|Block Format
|-
|Data Type
|Length
|Position (DEC)
|Description
|-
|INT32
|4
|0x0
|-
|
|15
|0x4
|-
|
|15
|0x19
|-
|
|15
|0x34
|-
|
|15
|0x49
|-
|
|15
|0x64
|-
|
|15
|0x79
|-
|
|15
|0x94
|-
|
|15
|0x109
|-
|
|15
|0x124
|-
|
|15
|0x139
|-
|
|15
|0x154
|-
|
|15
|0x169
|-
|
|15
|0x184
|-
|
|15
|0x199
|-
|
|15
|0x214
|-
|
|15
|0x229
|-
|
|15
|0x244
|-
|
|15
|0x259
|-
|
|15
|0x274
|-
|
|15
|0x289
|-
|
|15
|0x304
|-
|
|15
|0x319
|-
|
|15
|0x334
|-
|
|15
|0x349
|-
|
|15
|0x364
|-
|
|15
|0x379
|-
|
|15
|0x394
|-
|
|15
|0x409
|-
|
|15
|0x424
|-
|
|15
|0x439
|-
|
|15
|0x454
|-
|
|15
|0x469
|-
|
|15
|0x484
|-
|
|15
|0x499
|-
|
|15
|0x514
|-
|
|15
|0x529
|-
|
|15
|0x544
|-
|
|15
|0x559
|-
|
|15
|0x574
|-
|
|15
|0x589
|-
|
|15
|0x604
|-
|
|15
|0x619
|-
|
|15
|0x634
|-
|
|15
|0x649
|-
|
|15
|0x664
|-
|
|15
|0x679
|-
|Total
|709 Bytes
|-
|}
 
== Combination keys ==
The combination keys use a different keycode format. I don't know if there is a pattern to this or if the game has custom keycodes for these.
 
Not all of these are tested.
 
    No modifier key = 0
    Shift = 1
    Shift + CTRL (or app button) = 3
    CTRL = 4
    Shift + ALT = 5
    Ctrl + alt = 6
    Shift + ctrl + alt = 7
    Alt = 20
 
== Available keys ==
 
=== Toggle view key ===
    23 = Key
    24 = modifier key
 
=== Encyclopaedia key ===
    38 = Key
    39 = modifier key
 
 
=== Set Map Marker 1 key ===
    35 = Key
    36 = modifier key
 
 
=== Set Map Marker 2 key ===
    68 = Key
    69 = modifier key
 
 
=== Set Map Marker 3 key ===
    83 = Key
    84 = modifier key
 
 
=== Set Map Marker 4 key ===
    88 = Key
    99 = modifier key
 
 
=== Goto Map Marker 1 ===
    113 = Key
    114 = modifier key
 
 
=== Goto Map Marker 2 ===
    128 = Key
    129 = modifier key
 
 
=== Goto Map Marker 3 ===
    143 = Key
    144 = modifier key
 
 
=== Goto Map Marker 4 ===
    158 = Key
    159 = modifier key
 
 
=== Zoom view in key ===
    173 = Key
    174 = modifier key
 
 
=== Zoom view out key ===
    188 = Key
    189 = modifier key
 
 
=== Quick Load key ===
    203 = Key
    204 = modifier key
 
 
=== Quick Save key ===
    218 = Key
    219 = modifier key
 
 
=== Zoom to shaman key ===
    233 = Key
    234 = modifier key
 
 
=== Chat message key ===
    248 = Key
    249 = modifier key
 
 
=== Command Tracking key ===
    263 = Key
    264 = modifier key
    * Had problems w/ this key
 
 
=== Release guarding people key ===
    278 = Key
    279 = modifier key
 
 
=== Toggle Level Stats  key ===
    293 = Key
    294 = modifier key
 
 
=== Rotate building key ===
    308 = Key
    309 = modifier key
 
 
=== Assign people to group 1 key ===
    323 = Key
    324 = modifier key
 
 
=== Assign people to group 2 key ===
    338 = Key
    339 = modifier key
 
 
=== Assign people to group 3 key ===
    353 = Key
    354 = modifier key
 
 
=== Assign people to group 4 key ===
    368 = Key
    369 = modifier key
 
 
=== Assign people to group 5 key ===
    383 = Key
    384 = modifier key
 
 
=== Assign people to group 6 key ===
    398 = Key
    399 = modifier key
 
 
=== Select people in group 1 key ===
    413 = Key
    414 = modifier key
 
 
=== Select people in group 2 key ===
    428 = Key
    429 = modifier key
 
 
=== Select people in group 3 key ===
    443 = Key
    444 = modifier key
 
=== Select people in group 4 key ===
    458 = Key
    459 = modifier key
 
=== Select people in group 5 key ===
    473 = Key
    474 = modifier key
 
 
=== Select people in group 6 key ===
    488 = Key
    489 = modifier key
 
 
=== Zoom to people in group 1 key ===
    503 = Key
    504 = modifier key
 
 
=== Zoom to people in group 2 key ===
    518 = Key
    519 = modifier key
 
 
=== Zoom to people in group 3 key ===
    533 = Key
    534 = modifier key
 
 
=== Zoom to people in group 4 key ===
    548 = Key
    549 = modifier key
 
 
=== Zoom to people in group 5 key ===
    563 = Key
    564 = modifier key
 
 
=== Zoom to people in group 6 key ===
    578 = Key
    579 = modifier key
 
 
=== Zoom to Reincarnation site key ===
    593 = Key
    594 = modifier key
 
 
=== Toggle Local Selection key ===
    608 = Key
    609 = modifier key
 
 
=== Reselect last selection key ===
    623 = Key
    624 = modifier key
 
 
=== Reorient view key ===
    638 = Key
    639 = modifier key
 
 
=== Display last dialog key ===
    653 = Key
    654 = modifier key
 
 
=== Toggle auto deselect key ===
    668 = Key
    669 = modifier key
 
 
=== Call to arms key ===
    683 = Key
    684 = modifier key
 
 
=== Scatter people key ===
    698 = Key
    699 = modifier key
 
== In Programming ==
 
=== VB .NET ===
This is code that will decode all the unknown keys seen above to ACSII, [http://www.theasciicode.com.ar/|ASCII table]
 
Use a code [http://www.developerfusion.com/tools/convert/csharp-to-vb/ converter] to translate to C#.
 
<source lang="vb">
' Brandan Tyler Lasley
' Populous TB Key Mapper
' Read Populous TB key configuration keycodes, then convert it to ASCII
Imports System.Runtime.InteropServices
Imports System.IO
 
Module Module1
    Public Declare Function GetKeyboardLayout Lib "user32" (ByVal idThread As UInteger) As IntPtr
 
    <DllImport("User32.dll")> _
    Public Function GetKeyboardLayout(idThread As Integer) As IntPtr
    End Function
 
    <DllImport("user32.dll")> _
    Public Function MapVirtualKeyEx(uCode As Integer, uMapType As Integer, dwhkl As Integer) As Integer
    End Function
 
    <DllImport("user32.dll")> _
    Private Function GetKeyboardState(ByVal keyState() As Byte) As Boolean
    End Function
 
    <DllImport("user32.dll")> _
    Public Function ToAsciiEx(uVirtKey As Integer, uScanCode As Integer, lpKeyState As Byte, lpChar As Integer, uFlags As Integer, dwhkl As Integer) As Integer
    End Function
 
    Dim strings = New String() {"Pause", _
                                "Toggle View", _
                                "Encyclopaedia", _
                                "Set map marker 1", _
                                "Set map marker 2", _
                                "Set map marker 3", _
                                "Set map marker 4", _
                                "Goto map marker 1", _
                                "Goto map marker 2", _
                                "Goto map marker 3", _
                                "Goto map marker 4", _
                                "Zoom in", _
                                "Zoom out", _
                                "Quick load", _
                                "Quick save", _
                                "Goto shaman", _
                                "Chat/Message", _
                                "Command tracking", _
                                "Release Guarding", _
                                "Toggle level stats", _
                                "Rotate building", _
                                "Assign units to group 1", _
                                "Assign units to group 2", _
                                "Assign units to group 3", _
                                "Assign units to group 4", _
                                "Assign units to group 5", _
                                "Assign units to group 6", _
                                "Select units to group 1", _
                                "Select units to group 2", _
                                "Select units to group 3", _
                                "Select units to group 4", _
                                "Select units to group 5", _
                                "Select units to group 6", _
                                "Goto units to group 1", _
                                "Goto units to group 2", _
                                "Goto units to group 3", _
                                "Goto units to group 4", _
                                "Goto units to group 5", _
                                "Goto units to group 6", _
                                "Goto reincarnation site", _
                                "Toggle local selection", _
                                "Reselect last selection", _
                                "Reorient view", _
                                "Display last dialog", _
                                "Toggle auto deselect", _
                                "Call to arms", _
                                "Scatter people"}
 
    Dim keys = New Integer() {8, 23, 38, 53, 68, 83, 98, 113, 128, 143, _
                          158, 173, 188, 203, 218, 233, 248, 263, 278, _
                          293, 308, 323, 338, 353, 368, 383, 398, 413, _
                          428, 443, 458, 473, 488, 503, 518, 533, 548, _
                          563, 578, 593, 608, 623, 638, 653, 668, 683, _
                          698}
 
    Dim populousin As String = My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Bullfrog Productions Ltd\Populous: The Beginning", "InstallPath", "")
 
    Sub Main()
 
        Dim i = 0
        For Each Strs In strings
 
            Dim modifier = Reader(keys(i) + 1).ToString
            On Error Resume Next
            If modifier = 0 Then
                modifier = "NONE"
            ElseIf modifier = 2 Then
                modifier = "CTRL"
            ElseIf modifier = 3 Then
                modifier = "SHIFT + CTRL"
            ElseIf modifier = 5 Then
                modifier = "SHIFT + ALT"
            ElseIf modifier = 6 Then
                modifier = "CTRL + ALT"
            ElseIf modifier = 7 Then
                modifier = "SHIFT + CTRL + ALT"
            ElseIf modifier = 3 Then
                modifier = "APP"
            ElseIf modifier = 20 Then
                modifier = "ALT"
            ElseIf modifier = 1 Then
                modifier = "SHIFT"
            Else
                modifier = "NONE"
            End If
            Console.WriteLine(Strs & " = " & modifier & " + " & (scan2ascii(Reader(keys(i)))).ToString & vbNewLine)
            i = i + 1
        Next
 
        Console.ReadLine()
    End Sub
 
    Public Function scan2ascii(ByVal scancode)
        Dim hKL As IntPtr = GetKeyboardLayout(0)
 
        Dim State = New Byte(255) {}
 
        If GetKeyboardState(State) = False Then
            Return 0
        End If
 
        Return MapVirtualKeyEx(scancode, 1, hKL)
    End Function
 
    Function Reader(ByVal position As Integer)
        Dim Keysconfig As Boolean = My.Computer.FileSystem.FileExists(populousin & "\SAVE\key_def.dat")
 
        If Keysconfig = False Then
            Console.Write("Error: Populous keys configuration file could not be loaded, download it off the wiki and place it into ./saves/ file of pop.")
            Console.ReadLine()
            End
        End If
 
        Dim breader As New BinaryReader(New FileStream(populousin & "\SAVE\key_def.dat", FileMode.Open))
        breader.BaseStream.Position = position
        Dim output = breader.Read
        breader.Close()
        Return output
    End Function
 
End Module
</source>
 
=== C++ ===
This is code that will decode all the unknown keys seen above to ACSII, [http://www.theasciicode.com.ar/|ASCII table]
 
This code does not automatically get PopTB's filepath.
 
<source lang="C">
// Brandan Tyler Lasley
// Populous TB Key Mapper
// Read Populous TB key configuration keycodes, then convert it to ASCII
 
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
using namespace std;
 
int scantoascii(int scancode);
int bReader(int position);
int bWriter(int value, int position);
 
string strings[50] =  {"Pause",
"Toggle View",
"Encyclopaedia",
"Set map marker 1",
"Set map marker 2",
"Set map marker 3",
"Set map marker 4",
"Goto map marker 1",
"Goto map marker 2",
"Goto map marker 3",
"Goto map marker 4",
"Zoom in",
"Zoom out",
"Quick load",
"Quick save",
"Goto shaman",
"Chat/Message",
"Command tracking",
"Release Guarding",
"Toggle level stats",
"Rotate building",
"Assign units to group 1",
"Assign units to group 2",
"Assign units to group 3",
"Assign units to group 4",
"Assign units to group 5",
"Assign units to group 6",
"Select units to group 1",
"Select units to group 2",
"Select units to group 3",
"Select units to group 4",
"Select units to group 5",
"Select units to group 6",
"Goto units to group 1",
"Goto units to group 2",
"Goto units to group 3",
"Goto units to group 4",
"Goto units to group 5",
"Goto units to group 6",
"Goto reincarnation site",
"Toggle local selection",
"Reselect last selection",
"Reorient view",
"Display last dialog",
"Toggle auto deselect",
"Call to arms",
"Scatter people"};
 
 
    int keys[50] = {8, 23, 38, 53, 68, 83, 98, 113, 128, 143,
                  158, 173, 188, 203, 218, 233, 248, 263, 278,
                  293, 308, 323, 338, 353, 368, 383, 398, 413,
                  428, 443, 458, 473, 488, 503, 518, 533, 548,
                  563, 578, 593, 608, 623, 638, 653, 668, 683,
                  698};
 
int main() {
 
for (int i = 0; i < sizeof strings/sizeof(string) - 3; i++) {
int modifiercode = bReader(keys[i] + 1);
string modifier;
 
switch (modifiercode) {
case 0:
modifier = "None";
break;
case 1:
modifier = "Shift";
break;
case 2:
modifier = "CTRL";
break;
case 3:
modifier = "SHIFT + CTRL";
break;
case 5:
modifier = "SHIFT + ALT";
break;
case 6:
modifier = "CTRL + ALT";
break;
case 7:
modifier = "SHIFT + CTRL + ALT";
break;
case 20:
modifier = "ALT";
break;
default:
modifier = "Unknown";
}
 
cout << strings[i] << " = " << modifier << " + " << scantoascii(bReader(keys[i])) << endl;
}
 
 
getchar();
getchar();
    return 0;
}
 
int scantoascii(int scancode) {
static HKL layout=GetKeyboardLayout(0);
    static byte State[256];
 
if (GetKeyboardState(State)==FALSE) {
      return 0;
}
  UINT vk=MapVirtualKeyEx(scancode,1,layout);
  return vk;
}
 
int bReader(int position) {
unsigned char x;
int i = 0;
std::ifstream input("C:\\Program Files (x86)\\Bullfrog\\Populous\\SAVE\\key_def.dat", std::ios::binary);
input >> std::noskipws;
while (input >> x) {
if (i == position) {
return x;
}
i++;
}
return 0;
}
</source>

Latest revision as of 18:43, 8 October 2014