Actions

Keys Configuration Format: Difference between revisions

From Populous Wiki

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 19: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;
}