AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi wie am besten Strukturierte Datei lesen (Warhammer Replay)
Thema durchsuchen
Ansicht
Themen-Optionen

wie am besten Strukturierte Datei lesen (Warhammer Replay)

Ein Thema von TKC · begonnen am 5. Dez 2005 · letzter Beitrag vom 6. Dez 2005
Antwort Antwort
Benutzerbild von TKC
TKC

Registriert seit: 21. Apr 2004
Ort: Tuningen
367 Beiträge
 
Delphi XE2 Enterprise
 
#1

wie am besten Strukturierte Datei lesen (Warhammer Replay)

  Alt 5. Dez 2005, 18:34
Hallo,

ich möchte einen kleinen Replay Manager für Warhammer programmieren.

Die Replay Dateien sind im Relic Chunky Format gespeichert.
Ich brauche nur ein paar bestimmte Werte aus diesen Dateien, z.B. Name des Replays ... usw.

Leider habe ich noch keinen Ansatz wie ich da vorgehen soll, TFileStream scheint da wohl ganz geeignet zu sein.
Villeicht kann mir da jemand nen Tipp geben wie ich da ansetzen muss.

Ein paar infos über den Aufbau der Datei habe ich bereits im Internet gefunden:
Code:
@Pos: 0
[WORD] // Replay Version 1 < Patch 1.3 with Patch 1.3 it got 2
@Pos: 166
[KEYWORD](DATASDSC) // START OF NEW CHUNK
[WORD] // Chunk version (?) always 1 so far
[WORD] // Chunk data size
[WORD] // A variable string length
[WORD] // (?)
[WORD] // Number of teams (?)
[WORD] // Number of active players (without spectators)
[WORD] // Map Size
[WORD] // String length
[WORD] // Game/engine name
[WORD]->%length% // length of additional header infos
[UNICODETEXT] // Double-byte engine version string (%length%*2)
[WORD]->%length% // lenth of map Name
[TEXT] // Map name (%length%)
[WORD] // (?)
[WORD] // (?)
[WORD] // (?)
[WORD] // (?)

{REP VERSION 1}
[WORD] // (?)
[BYTE] // (?)
[KEYWORD](FOLDMODI) // START OF NEW CHUNK
[WORD] // Chunk version (?) always 1 so far
[WORD] // (?)
[WORD] // (?)
[KEYWORD](DATADMOD) // START OF NEW CHUNK
[WORD] // Chunk version (?) always 4 so far
[WORD]->%length% // Chunk data size
[TEXT] // (?) (%length%)
[KEYWORD](DATABASE) // START OF NEW CHUNK
[WORD] // Chunk version (?) always 4 so far
[WORD] // Chunk data size
{END VERSION 1}

{REP VERSION 2}
[KEYWORD](DATABASE) // START OF NEW CHUNK
[WORD] // Chunk version (?) always 4 so far
[WORD] // Chunk data size
{END VERSION 2}

[WORD] // Always 0 so far
[WORD] // Always 3 so far
[WORD] // Avavible Slots (after Patch 1.3 always 8 cause spec slots)
[WORD] // (?)
[WORD] // Always 8 so far
[WORD] // (?)

{8 Keytext with 1byte value - not sorted!}
[WORD] FDIA //= AIDF (AI Difficulty) - It took me a while to figure these out...backwards-endian
[WORD] // 1. Byte is the value
[WORD] TSSR //= RSST (Starting Resources)
[WORD] // 1. Byte is the value
[WORD] MTKL //= LKTM (Lock Teams)
[WORD] // 1. Byte is the value
[WORD] AEHC //= CHEA (Cheats Enabled)
[WORD] // 1. Byte is the value
[WORD] COLS //= SLOC (Starting Location)
[WORD] // 1. Byte is the value
[WORD] DPSG //= GSPD (Game Speed)
[WORD] // 1. Byte is the value
[WORD] HSSR //= RSSH (Resource Sharing)
[WORD] // 1. Byte is the value
[WORD] TRSR //= RSRT (Resource Rate)
[BYTE] // The Byte is the value

[WORD]->%length% // length of ingame Name
[UNICODETEXT] // Double-byte game name (%length% * 2)
[WORD] // End of Gamename Always 0 so far
[WORD]->%length% // This is the number of Win conditions that are set. Each one is a constant DWORD that follows.

{%length% win conditions}
[WORD] // Win conditon
-157708158 Annihilate
-1826760460 SuddenDeath
-1158102879 Assassinate
-779857721 EconomicVictory
735076042 ControlArea
863969525 DestroyHQ
1959084950 TakeandHolde
{END Win Conditions}

{Now for any Slot There come Player data
[KEYWORD](FOLDGPLY) // START OF NEW CHUNK - GPLY = Game Player? There is one of these chunks for each player.
[WORD] 2 // Chunk version (?) Always 2 so far
[WORD] 41330 // Chunk data size
[WORD] 0 // A variable string length Always 0 so far
[KEYWORD](DATAINFO) // START OF NEW CHUNK
[WORD] 1 // Chunk version (?) Always 1 so far
[WORD] 54 // Chunk data size
[WORD] 0 // A variable string length Always 0 so far
[WORD]->%length% // length of Plyer Name
[UNICODETEXT] // Double-byte player name (%length% * 2)
[WORD] // Type of Slot (0 Host/2 player/4 specc/7 empty/11 computer)
[WORD] // Team of the Player (counter starts with 0)
[WORD]->%length% // lengt of race string
[TEXT] // Race Name (%length%)
[WORD] // (?) Always 0 so far

[KEYWORD](FOLDTCUC) // START OF NEW CHUNK - TCUC = Team Colors, something, something?
{Also Possible: FOLDGPLY -> New Player beginns (happens with spec slots)}

[WORD] 1 // Chunk version (?) Always 1 so far
[WORD] 84 // Chunk data size
[WORD] 0 // A variable string length Always 0 so far
[KEYWORD](DATALCIN) // START OF NEW CHUNK - LCIN = Local?? NOTE: This section differs for the replay's "local" player
[WORD] 1 // Chunk version (?) Always 1 so far
[WORD]->%length% 12 // Chunk data size
[TEXT] // (?) (%length%)
[WORD] // (?) Always 0 so far
[KEYWORD](DATAUNCU) // START OF NEW CHUNK - UNCU = ????
[WORD] 1 // Chunk version (?) Always 1 so far
[WORD] 32 // Chunk data size
[WORD] 0 // A variable string length Always 0 so far
[WORD]->%length% // length of ColorScheme
[UNICODETEXT] // Double-byte scheme name (%length% * 2)
[WORD] // Primary NOTE: Colors are BGRA (blue, green, red, alpha)
[WORD] // Secondary
[WORD] // Trim
[WORD] // Weapons
[WORD] // Eyes

[KEYWORD](FOLDTCBD) // START OF NEW CHUNK - TCBD = Team color Badge?
{Also Possible: FOLDGPLY -> New Player beginns (happens sometimes...)}
{Another keyword FOLDTCBD -> Badge/Banner sometimes change their position in the Replay}
{If none of this Keywords is matchetd it seams like an broken header.. So ignore the 8byte keyword and go on with action data}

[WORD] 1 // Chunk version (?) Always 1 so far
[WORD] 16460 // Chunk data size - A bigish chunk...hence the transferring badges lag
[WORD] 0 // A variable string length
[KEYWORD](FOLDIMAG) // START OF NEW CHUNK - IMAG = Image (badge in this case)
[WORD] 1 // Chunk version (?) Always 1 so far
[WORD] 16460 // Chunk data size
[WORD]->%length% // A variable string length
{IF %length% GT 0 then the Badge has a special Name}
[TEXT] // Name of the Badge (%length%)
{END}
[KEYWORD](DATAATTR) // START OF NEW CHUNK - ATTR = Image attribute(s)?
[WORD] 2 // Chunk version (?) Always 2 so far
[WORD] 16 // Chunk data size
[WORD] 0 // (?)
[WORD] 0 // (?)
[WORD] 64 // Image WIDTH
[WORD] 64 ´ // Image HEIGHT
[WORD] 1 // (?) Always 1 so far
[KEYWORD](DATADATA) // START OF NEW CHUNK - DATA = Image data?
[WORD] 2 // Chunk version (?) Always 2 so far
[WORD] 16 // Chunk data size
[WORD] 0 // (?)

{Now comes the image data. Pixel by pixel form heigth to width in RGBA colors - you also have to mirror the picture}


[KEYWORD](FOLDTCBN) // START OF NEW CHUNK - TCBN = Team color Banner?
[WORD] 1 // Chunk version (?) Always 1 so far
[WORD] 24652 // Chunk data size
[WORD] 0 // (?)
[KEYWORD](FOLDIMAG ) // START OF NEW CHUNK - IMAG = Image (banner in this case)
[WORD] 1 // Chunk version (?) Always 1 so far
[WORD] 1152 // Chunk data size
[WORD] 0 // (?)
[KEYWORD](DATAATTR) // START OF NEW CHUNK - ATTR = Image attribute(s)?
[WORD] 2 // Chunk version (?) Always 2 so far
[Word] 16 // Chunk data size
[WORD] 0 // (?)
[WORD] 0 // (?)
[WORD] 64 // Image WIDTH
[WORD] 96 ´ // Image HEIGHT
[WORD] 1 // (?) Always 1 so far
[KEYWORD](DATADATA) // START OF NEW CHUNK - DATA = Image data?
[WORD] 2 // Chunk version (?) Always 2 so far
[WORD] 1536 // Chunk data size
[WORD] 0 // (?)

{Now comes the image data. Pixel by pixel form heigth to width in RGBA colors - you also have to turn the picture}

{End of Player Data}

{Now The acion Data starts.. DoW is working with 8Ticks per second}
[WORD] // Action Key - Action Key 1 identefies an Chat msg so far
[WORD] // Action Length
{IF second action key is 1}
[WORD] // Action Key
{IF this action key is also 1 its an chat msg}
[WORD] // Length of Chat chunk
[BYTE] // Also length of Chat chunk so far
{IF REP Version 1}
[BYTE] // Player ID (As same orders as they are listed bevore)
[BYTE] // Reciver 0 All/1 Team/2 System
[BYTE] // (?)
{IF Rep Version 2}
[WORD]->%len% // Length of Player Name
[UNICODETEXT] // Double-byte player name (%len% * 2)
[WORD] // Player ID > 1000 are normal players blow the IDs of the Spectators
[WORD] // Msg Type 0 Player/1 Spec/2 System
[WORD] // Reciver 0 All/1 Team/2 System
{End of Version spec Data}
[WORD]->%len% // Length of Chat MSG
[UNICODETEXT] // Double-byte chat msg (%len% * 2)
{If second Action Key is not 1}
[WORD]->%length% // length of action
[BYTE] // (?)
[TEXT] // (?) (%length%)
{If action key is 0}
[BYTE]
{IF REP version 2}
[BYTE] // Indicatios if the action block has action (1) or not (0)
{END Version depanding handling}
[WORD] // Number of this tick (8 per second!)
Als Anlage habe ich noch ein Replay angehängt.

Ich freue mich schon auf eure Anregungen.
Angehängte Dateien
Dateityp: rar 6p_kasyr_lutien.2005-12-01.22-17-57_141.rar (67,2 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: wie am besten Strukturierte Datei lesen (Warhammer Repla

  Alt 5. Dez 2005, 19:08
Hi,
wenn du den Aufbau des Formates kennst, kannst du mit TFileStream einzelne Pakete laden und auswerten. Du musst halt nur wissen, wie groß die Blöcke sind. Sprich wie viele Bits du lesen musst. Ein Word ist bspw. 16 Bit lang. Also musst du die 16 Bit auslesen und dann verwenden. Mit TFileStream ist das definitiv möglich.

Chris
  Mit Zitat antworten Zitat
Vjay

Registriert seit: 2. Dez 2003
Ort: Berlin/Eschede
481 Beiträge
 
Delphi 7 Professional
 
#3

Re: wie am besten Strukturierte Datei lesen (Warhammer Repla

  Alt 6. Dez 2005, 09:10
Und so machst du es:


Beispiele:
Delphi-Quellcode:

procedure readBooleanFromStream(var b1: Boolean; const Stream: TStream);
begin
 Stream.Read(b1, sizeOf( Boolean));
end;

// Eigenes Format, erst Länge, dann die eigentlichen Daten
procedure readStringFromStream(var s1: string; const Stream: TStream);
var
 i1: integer;
begin
 readIntegerFromStream(i1, Stream);
 setLength(s1, i1);
 Stream.Read(s1[1], i1);
end;

procedure readIntegerFromStream(var i1: integer; const Stream: TStream);
begin
 Stream.Read(i1, sizeof( integer));
end;
Du müßtest jetzt nur die entsprechenden Variablentypen lesen. z.B. ein Word von der Position 0 um die ReplayVersion herauszubekommen. Mit Stream.position kannst du beliebig hin und her springen.
Unter Win32 ist ein Integer ein DWord, verwende daher unbedingt Datentypen wie DWord, Word, Byte etc., da sich die definition von "Integer" jederzeit ändern kann.
Wer später bremst ist eher tot.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#4

Re: wie am besten Strukturierte Datei lesen (Warhammer Repla

  Alt 6. Dez 2005, 09:31
Zitat von ACE-ppc:
Die Replay Dateien sind im Relic Chunky Format gespeichert.
Wird zwar etwas aufwändiger, aber ich würde mir erstmal eine allgemeine Chunk-Klasse schreiben und die speziellen Chunks davon ableiten.
(dazu kann man sich von diversen anderen Chunk-basierten Formaten (wie zum Beispiel 3DS) inspirieren lassen).

Zitat von ACE-ppc:
Ich brauche nur ein paar bestimmte Werte aus diesen Dateien, z.B. Name des Replays ... usw.
Wenn du es eilig hast, dann könntest du viel hart-kodieren (allerdings wäre das nicht sonderlich praktisch, wenn sich die Reigenfolge der Chunks ändern könnte...).
  Mit Zitat antworten Zitat
Benutzerbild von TKC
TKC

Registriert seit: 21. Apr 2004
Ort: Tuningen
367 Beiträge
 
Delphi XE2 Enterprise
 
#5

Re: wie am besten Strukturierte Datei lesen (Warhammer Repla

  Alt 6. Dez 2005, 18:23
Zitat von NicoDE:
Zitat von ACE-ppc:
Die Replay Dateien sind im Relic Chunky Format gespeichert.
Wird zwar etwas aufwändiger, aber ich würde mir erstmal eine allgemeine Chunk-Klasse schreiben und die speziellen Chunks davon ableiten.
(dazu kann man sich von diversen anderen Chunk-basierten Formaten (wie zum Beispiel 3DS) inspirieren lassen).
Genau so etwas hatte ich mir auch vorgestellt , schön elegant .

Leider habe ich keinen Plan wie soetwas aussehen könnte, hättest du nen kleines Beispiel zur Hand ?

Danke für Eure bisherigen Antworten.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz