Keys Configuration Format: Difference between revisions
| Line 3: | Line 3: | ||
== Introduction == | == Introduction == | ||
The Populous Key configuration file is located in ./saves/Key def.dat ([http://www.brandanlasley.com/releases/Thread/Popre/Best%20Patches/key_def.dat Key def download]) after you use the built in keys editor inside the game. The keys configuration file uses the systems keycode map to determine what keys are available to use. This website has the key codes that seem to work wit most US QWERTY keyboards [http://www.penticoff.com/nb/kbds/ibm104kb.htm keycode list for US QWERTY]. | The Populous Key configuration file is located in ./saves/Key def.dat ([http://www.brandanlasley.com/releases/Thread/Popre/Best%20Patches/key_def.dat Key def download]) after you use the built in keys editor inside the game. The keys configuration file uses the systems keycode map to determine what keys are available to use. This website has the key codes that seem to work wit most US QWERTY keyboards [http://www.penticoff.com/nb/kbds/ibm104kb.htm keycode list for US QWERTY]. | ||
Inside the key blocks contains a modifier and a key. The modifier is optional and can be removed by setting it to 0. | |||
All numbers are stored in big-endian format! | All numbers are stored in big-endian format! | ||
Revision as of 03:51, 8 October 2014
The Populous Keys configuration file remains mostly unknown. It is believed to be clustered in 15 byte blocks, unknown if any of these blocks contain the arrow keys configuration.
Introduction
The Populous Key configuration file is located in ./saves/Key def.dat (Key def download) after you use the built in keys editor inside the game. The keys configuration file uses the systems keycode map to determine what keys are available to use. This website has the key codes that seem to work wit most US QWERTY keyboards keycode list for US QWERTY.
Inside the key blocks contains a modifier and a key. The modifier is optional and can be removed by setting it to 0.
All numbers are stored in big-endian format!
| 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, table
Use a code converter to translate to C#.
' 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
C++
This is code that will decode all the unknown keys seen above to ACSII, table
This code does not automatically get PopTB's filepath.
// 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;
}