DO/CTL
From Dark Omen Wiki
(→Structure: Offset table in DWORD unit size) |
(→Dump of the Script Commands: Analysis) |
||
Line 126: | Line 126: | ||
WH_IF | WH_IF | ||
WH_GOTO | WH_GOTO | ||
+ | |||
+ | ===Analysis=== | ||
+ | Some of these commands come in what appears to be logical pairs. It is assumed | ||
+ | * that these will always match up | ||
+ | * that all initiators and terminators are unique between couplets, i.e that different initiators are never closed by the same terminator and vice versa. | ||
+ | |||
+ | Initiator vs. Terminator | (Nested) | ||
+ | --------------------------+---------------- | ||
+ | WH_IF <--> WH_ENDIF | (WH_ELSE) | ||
+ | WH_GOSUB <--> WH_RETURN | | ||
+ | WH_REPEAT <--> WH_UNTIL | | ||
+ | WH_DO <--> WH_WHILE | (WH_BREAK) | ||
+ | WH_FOR <--> WH_LOOP | (WH_BREAK) | ||
+ | |||
+ | Further assumptions: | ||
+ | * WH_GOTO is followed by wither a jump address or a label (or label reference) | ||
+ | * The CTL script is a stack machine that communicates arguments and return values through a global stack |
Revision as of 00:03, 21 January 2009
Contents |
Structure
Every file starts with 32 00 00 00, which we can assume to be a file version or ID number.
- The first INT is a version number / id.
- The file is read as a series of signed integers.
- At the beginning of a file, there is an offset table.
- The offsets are in DWORD units, so multiply each value by 4 for the byte offset.
You can tell how big it is because it stops at the first offset listed.
- offsets divide the file into chunks.
- The first 49 chunks of each file are the same for every CTL file, thereafter they are different.
This, along with the fact that there appear to be two types of integer token, those with bit 15 set and those without, leads me to believe that this is scripting code (with 49 script functions that are common to each map).
The effect of moving units around is also a reasonable outcome of this hypothesis, since the areas that the units moved to are those specified in the BTB. i.e. the traders and goblins swapped and didn't move to random areas. So the scripts may be moving units between predefined points
Further Actions
Olly:Simple Tests using the CTL file other Maps, has shown that CTL files dictate where the starting points of enemy AI units are. Although in early testing, it appears that it may dictate where off map units are placed. For example, swapping B204.CTL with B101.CTL produced:
As can be seen, the Goblins have now started in the Village and the Peasants are now up on the Cliff. More tests to follow, as all information will contribute to the Map Editor and beyond. Therefore allowing new Single Player Campaigns to be created, where the enenmy, who can already be switched between Races will now be able to appear in different locations, that will catch even the most experienced Player out.
- Mikademus: There is another interpretation of your test. In B1_01 the second wave are actually located outside the legal map area below the ridge in the village region, and they are moved to the top of the ridge when activated. Their original position can be seen by using the BRINGEMON and LOOKLIVELY start menu codes, and holding CTRL in the game. Therefore, they may be repositioned, or simply activated.
- Nonetheless, we know, if this is script codes in some way, that the script must contain at the very least (1) enemy unit IDs, a REPOSITION command, an ACTIVATE command (unless this is implicit in positioning a unit inside or outside the legal map area), and a position definition. Mikademus 11:25, 30 August 2008 (UTC)
Dump of the Script Commands
A dump of some script-like commands (maybe CTL-Related?):
WHMTG_ReplayDotList WHMTG_ResetDotList WHMTG_AddBitmap WHMTG_SetResult WHMTG_ContinuePrompt WHMTG_FinishDots WHMTG_WaitForDots WHMTG_PlayDots WHMTG_LoadDots WHMTG_PlaySampleNoWait WHMTG_PlaySample WHMTG_Wait WHMTG_HideHead WHMTG_ChooseOption WHMTG_AddOption WHMTG_Narrate WHMTG_SpeakNoWait WHMTG_Speak WHMTG_ShowHead WHMTG_LoadHeads WHMTG_PlayAnim WHMTG_StopAnim WHMTG_StartAnimAsync WHMTG_SetBackground WHMTG_SetMusic WHMTG_StopMusic WHMTG_PlayMusic WHMTG_StopAllSFX WHMTG_StopSFX WHMTG_PlaySFX WHMTG_ChooseInit WHMTG_SpotAnim WHMTG_Voice WH_SetObjective WH_CheckObjective WHMTG_RemoveBitmap WHMTG_DisplayBitmap WH_RemoveMagic WH_AddMagic WH_SetDeafultSaveName WH_ShowMouse WH_HideMouse WH_Pause WH_Delay WH_Picture WH_SaveGame WH_Debrief WH_InitDebrief WH_MeetingWait WH_Book WH_UnitIsGoingClear WH_UnitIsGoingSet WH_TemporyUnitClear WH_TemporyUnitSet WH_IncludeUnit WH_ExcludeUnit WH_UnForceUnit WH_ForceUnit WH_ClearVariables WH_DisableAutosave WH_GameOver WH_AddCash WH_ReadVariable WH_SetVariable WH_ReadUnitVar WH_SetUnitVar WH_WriteTextToFile WH_RemoveUnit WH_AddUnit WH_GetUnitHireStatus WH_GetUnitStatus WH_Battle WH_Deploy WH_TravelMap WH_MeetingPoint WH_Narration WH_PlayMovie WH_Test WH_END WH_BREAK WH_UNTIL WH_REPEAT WH_LOOP WH_SETLV WH_POPLV WH_PUSHLV WH_DO WH_RETURN WH_GOSUB WH_ELSE WH_ENDIF WH_IF WH_GOTO
Analysis
Some of these commands come in what appears to be logical pairs. It is assumed
- that these will always match up
- that all initiators and terminators are unique between couplets, i.e that different initiators are never closed by the same terminator and vice versa.
Initiator vs. Terminator | (Nested) --------------------------+---------------- WH_IF <--> WH_ENDIF | (WH_ELSE) WH_GOSUB <--> WH_RETURN | WH_REPEAT <--> WH_UNTIL | WH_DO <--> WH_WHILE | (WH_BREAK) WH_FOR <--> WH_LOOP | (WH_BREAK)
Further assumptions:
- WH_GOTO is followed by wither a jump address or a label (or label reference)
- The CTL script is a stack machine that communicates arguments and return values through a global stack