Key def.dat: Difference between revisions
From Populous Wiki
Line 256: | Line 256: | ||
=== VB .NET === | === VB .NET === | ||
This is code that will decode all the unknown keys seen above to ACSII, [http://www.theasciicode.com.ar/|ASCII table] | This is code that will decode all the unknown keys seen above to ACSII, [http://www.theasciicode.com.ar/|ASCII table] | ||
[code] | |||
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 combokey = Reader(keys(i) + 1).ToString | |||
On Error Resume Next | |||
If combokey = 0 Then | |||
combokey = "NONE" | |||
ElseIf combokey = 2 Then | |||
combokey = "CTRL" | |||
ElseIf combokey = 3 Then | |||
combokey = "SHIFT + CTRL" | |||
ElseIf combokey = 5 Then | |||
combokey = "SHIFT + ALT" | |||
ElseIf combokey = 6 Then | |||
combokey = "CTRL + ALT" | |||
ElseIf combokey = 7 Then | |||
combokey = "SHIFT + CTRL + ALT" | |||
ElseIf combokey = 3 Then | |||
combokey = "APP" | |||
ElseIf combokey = 20 Then | |||
combokey = "ALT" | |||
ElseIf combokey = 1 Then | |||
combokey = "SHIFT" | |||
Else | |||
combokey = "NONE" | |||
End If | |||
Console.WriteLine(Strs & " = " & combokey & " +" & (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 | |||
Private Sub Writer(ByVal value As Byte, 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 writer As New BinaryWriter(New FileStream(populousin & "\SAVE\key_def.dat", FileMode.Open)) | |||
writer.BaseStream.Position = position | |||
writer.Write(value) | |||
writer.Close() | |||
End Sub | |||
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 | |||
[/code] |
Revision as of 03:56, 26 November 2013
Change Populous default keys using programming or hex editor. The file was decoded on November 23rd 2013.
All the addresses are correct, but my typing is not. If there is a typo or wrong address let 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 (Key def download). Once you save, the file is created and located in ./save/Key def.dat. The file is structured similar to the Header Format. Each key is stored in a single hexadecimal address, the combination key is always 1 in front of it. So if 0x1 is pause 0x2 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 to 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 do it by hand using a converter like 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 keycode list for US QWERTY, remember that you have to convert those numbers back to hex from the Paulschou's link, or by 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!
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 Combo 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
0x23 = Key 0x24 = Combo key
Encyclopaedia key
0x38 = Key 0x39 = Combo key
Set Map Marker 1 key
0x35 = Key 0x36 = Combo key
Set Map Marker 2 key
0x68 = Key 0x69 = Combo key
Set Map Marker 3 key
0x83 = Key 0x84 = Combo key
Set Map Marker 4 key
0x88 = Key 0x99 = Combo key
Goto Map Marker 1
0x113 = Key 0x114 = Combo key
Goto Map Marker 2
0x128 = Key 0x129 = Combo key
Goto Map Marker 3
0x143 = Key 0x144 = Combo key
Goto Map Marker 4
0x158 = Key 0x159 = Combo key
Zoom view in key
0x173 = Key 0x174 = Combo key
Zoom view out key
0x188 = Key 0x189 = Combo key
Quick Load key
0x203 = Key 0x204 = Combo key
Quick Save key
0x218 = Key 0x219 = Combo key
Zoom to shaman key
0x233 = Key 0x234 = Combo key
Chat message key
0x248 = Key 0x249 = Combo key
Command Tracking key
0x263 = Key 0x264 = Combo key * Had problems w/ this key
Release guarding people key
0x278 = Key 0x279 = Combo key
Toggle Level Stats key
0x293 = Key 0x294 = Combo key
Rotate building key
0x308 = Key 0x309 = Combo key
Assign people to group 1 key
0x323 = Key 0x324 = Combo key
Assign people to group 2 key
0x338 = Key 0x339 = Combo key
Assign people to group 3 key
0x353 = Key 0x354 = Combo key
Assign people to group 4 key
0x368 = Key 0x369 = Combo key
Assign people to group 5 key
0x383 = Key 0x384 = Combo key
Assign people to group 6 key
0x398 = Key 0x399 = Combo key
Select people in group 1 key
0x413 = Key 0x414 = Combo key
Select people in group 2 key
0x428 = Key 0x429 = Combo key
Select people in group 3 key
0x443 = Key 0x444 = Combo key
Select people in group 4 key
0x458 = Key 0x459 = Combo key
Select people in group 5 key
0x473 = Key 0x474 = Combo key
Select people in group 6 key
0x488 = Key 0x489 = Combo key
Zoom to people in group 1 key
0x503 = Key 0x504 = Combo key
Zoom to people in group 2 key
0x518 = Key 0x519 = Combo key
Zoom to people in group 3 key
0x533 = Key 0x534 = Combo key
Zoom to people in group 4 key
0x548 = Key 0x549 = Combo key
Zoom to people in group 5 key
0x563 = Key 0x564 = Combo key
Zoom to people in group 6 key
0x578 = Key 0x579 = Combo key
Zoom to Reincarnation site key
0x593 = Key 0x594 = Combo key
Toggle Local Selection key
0x608 = Key 0x609 = Combo key
Reselect last selection key
0x623 = Key 0x624 = Combo key
Reorient view key
0x638 = Key 0x639 = Combo key
Display last dialog key
0x653 = Key 0x654 = Combo key
Toggle auto deselect key
0x668 = Key 0x669 = Combo key
Call to arms key
0x683 = Key 0x684 = Combo key
Scatter people key
0x698 = Key 0x699 = Combo key
In Programming
VB .NET
This is code that will decode all the unknown keys seen above to ACSII, table
[code] 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 combokey = Reader(keys(i) + 1).ToString On Error Resume Next If combokey = 0 Then combokey = "NONE" ElseIf combokey = 2 Then combokey = "CTRL" ElseIf combokey = 3 Then combokey = "SHIFT + CTRL" ElseIf combokey = 5 Then combokey = "SHIFT + ALT" ElseIf combokey = 6 Then combokey = "CTRL + ALT" ElseIf combokey = 7 Then combokey = "SHIFT + CTRL + ALT" ElseIf combokey = 3 Then combokey = "APP" ElseIf combokey = 20 Then combokey = "ALT" ElseIf combokey = 1 Then combokey = "SHIFT" Else combokey = "NONE" End If Console.WriteLine(Strs & " = " & combokey & " +" & (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
Private Sub Writer(ByVal value As Byte, 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 writer As New BinaryWriter(New FileStream(populousin & "\SAVE\key_def.dat", FileMode.Open)) writer.BaseStream.Position = position writer.Write(value) writer.Close() End Sub
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 [/code]