Seite 1 von 1

Kopiertool für UT2k4 Cache 1. real projekt

Verfasst: 05.01.2011 23:54
von Fabio
Hallo mal wieder von mir,

nach dem :praise: BI2 so ne glanz arbeit mit dem übersetzen vom PurBasic Buch hingelegt hat,
bin ich mal wieder richtig motiviert gewesen und habe mich mal wieder ;)
mit PB beschäftigt.

Nun gut, es ist jetzt kein monster projekt aber doch ein anfang :)

Kleine beschreibung.
Ich spiele ab und zu gerne mal UnrealTournament 2004 und hier werden Gamedateien die heruntergeladen
werden im Cache Ordner gespeichert.
Dokumentiert wird das ganze in der cache.ini,
aber die Dateien haben nicht denn richtigen Namen sondern werden in etwa so gespeichert:
CE6F0FF54AA523ADDBC66D8CF622003E-1.uxx
dabei ist die endung immer .uxx.

In der *.ini steht aber der ganze Name samt richtiger endung mit dabei,
CE6F0FF54AA523ADDBC66D8CF622003E-1=VCTF-[Id]-CTC-Arcade-Beta4.ut2

Ziel war es die Datei mit den Pseudoname in einen anderen Ordner mit dem "richtigen" Namen zu kopieren.

Das klappt nun auch prima :)
Ich muss nun nur noch die Dateien mit den richtigen endungen in die dem entsprechenden Ordner kopieren.

Ich wollte nur mal wissen ob das so in die richtige richtung läuft oder ob ich das zu umständlich
geschrieben habe.
Die Textdateien die hier angelegt werden sind nur für mich zur kontrolle und kommen später raus.
Hier mal den ersten Code dazu.

Code: Alles auswählen


Global a.s ; Stringvariable
Global b.s ; Stringvariable
Global path.s ; Variable für die pfadangabe
Global endung.s  ; für die dateiendung  z.b .u , .utx......
Global pos.w    ; Variable für positionsbestimmung
Global lang.w   ; Variable für stringlänge
Global count.a  ; counter für For Each
count.a = 0
Global NewList file.s() ;Liste zum aufnehmen der Cache.ini
InitKeyboard()    ; Tastatur initialisieren, wird später mal gebraucht

If OpenConsole()      ;Console öffnen
  
   
  If FileSize("path.txt") > 0   ;Überprüfung ob Datei vorhanden ist. Alternative ?????
            OpenFile(1,"path.txt") ; Datei öffnen und auslesen
            a.s = ReadString(1)
            CloseFile(1)    ; 
            
          Else  ; falls path.txt nicht vorhanden ist oder "0" leer ist
                  ; pfadangabe der cache.ini
             a.s = OpenFileRequester("Cache Orden von UT2K4 angeben","","Ini Dateien .ini | *.ini",0) 
                OpenFile(1,"path.txt")  ; datei erstellen
                    WriteString(1,a.s)  ; pfad eintragen
                CloseFile(1)
             
  EndIf            
             
  
  path.s = GetPathPart(a.s)
 
  
  If OpenFile(0,a.s)   ; Pfad aus der path.txt auslesen und cache.ini öffnen
                        ; und solange auslesen bis zum ende der datei
                       
                          While Eof(0) = 0
                            
                            a.s = ReadString(0)
                                        AddElement(file.s()) ; zeilen in die Liste eintragen
                                        file.s() = a.s

                            PrintN(a.s)   ; ausgabe auf dem screen zur überprüfung
                           ; Delay(300)    ; damits nich zu schnell ab läuft ;)
                           Wend
                          
                 CloseFile(0)
             EndIf 
          
            
             ;----------------------------------------------------------
             ; nur nochmals zur kontrolle, wird später rausgeworfen
             
             If OpenFile(2,"data.txt")
                  ForEach file.s()
                      WriteStringN(2,file.s())
                  Next

               
               CloseFile(2)
            EndIf 
          
       ;   Delay(6000)
       ;----------------------------------------------------------      
       
       
       
  
  EndIf
  
  
  
  
  
 ;################## Sortieren und speichern #################### 
  
  
  
  
                  ForEach file.s()
                    a.s = file.s()
                    
                    If count.a > 0  ; erste zeile überspringen, hier steht nur [Cache]
                      lang.w = Len(a.s)
                      endung.s = GetExtensionPart(a.s)

                         pos.w = FindString(a.s,"-1=",1)
                         
                         b.s = Mid(a.s,pos.w+3)   ; Original Name der datei mit endung
                         a.s = Left(a.s,pos.w+1)    ; Name der Cache datei ohne endung
                         
                         
                          If FileSize(path.s+a.s+".uxx") > 0
                            
                            
                            ; Hier kommt noch das Löschen der Cache.ini und dann wieder eine neue leere anlegen, 
                            ;  das löschen der Cachedatei,
                            ; das sortieren der unterschiedlichen endungen und enstrechende
                            ; kopiereaktionen in die richtigen Ordner
                            ; Maps, System, Sound...usw
                                  CopyFile(path.s + a.s +".uxx", path.s+"test\"+b.s)

                            
                          EndIf

                         
                         PrintN(b.s)
                         PrintN(a.s) 
                         PrintN(endung.s)
                         PrintN(path.s)
                          

                         EndIf  
                         
                       If count.a < 1 
                         count.a+1
                       EndIf 
                  Next
  
 
CloseConsole()
End 

Re: Kopiertool für UT2k4 Cache 1. real projekt

Verfasst: 06.01.2011 10:05
von Kiffi
Fabio hat geschrieben:Ich wollte nur mal wissen ob das so in die richtige richtung läuft oder ob ich das zu umständlich
geschrieben habe.
ein paar Anmerkungen zu Deinem Code:

* Wenn Du aus einer Datei lesen willst, verwende ReadFile(). Wenn Du eine Datei erstellen willst, nimm
CreateFile(). OpenFile() wird nur in wenigen Spezialfällen benutzt (z.B. für Log-Ausgaben).

* ReadFile() / CreateFile() und OpenFile() liefern Rückgabewerte, die Du stets auswerten solltest

Code: Alles auswählen

If ReadFile(...
  ; Deine Dateioperation
Else
 ; Dein Fehlerbehandler
EndIf
* Deklarierst Du eine Variable mit Define, Protected, Static, Global, so musst Du im weiteren Verlauf
Deines Codes nicht mehr den Variablentyp mit angeben:

Code: Alles auswählen

Define a.s ; Stringvar
a = "Hallo" ; (und nicht a.s = "Hallo")


* Benenne Deine Variablen nach dem Zweck, für den sie eingesetzt werden. Das macht den Code
(auch nach Monaten) lesbarer und verhindert Flüchtigkeitsfehler:

anstelle von:

Code: Alles auswählen

b = Mid(a.s,pos.w+3)   ; Original Name der datei mit endung
a = Left(a.s,pos.w+1)    ; Name der Cache datei ohne endung
lieber sowas:

Code: Alles auswählen

OriginalNameOhneEndung = Mid(a.s,pos.w+3)   ; Original Name der datei mit endung
CacheNameOhneEndung  = Left(a.s,pos.w+1)    ; Name der Cache datei ohne endung
ist zwar etwas mehr Tipparbeit, aber die Autovervollständigung der IDE hilft Dir dabei ganz gut.

* Apropos IDE: Nutz die Einrückhilfe der IDE. <Ctrl> + A und <Ctrl> + I und Dein Code sieht schon
viel besser aus :-) Und: mehr als zwei Leerzeilen nacheinander müssen nicht unbedingt sein.

* Das Überspringen der ersten Zeile in file() würde ich anders gestalten. Anstelle von:

Code: Alles auswählen

ForEach file.s()
  
  If count.a > 0  ; erste zeile überspringen, hier steht nur [Cache]
    [...]
  EndIf  
  
  If count.a < 1 
    count.a + 1
  EndIf 
  
Next
eher so:

Code: Alles auswählen

ForEach file.s()
  
  If ListIndex(file()) = 0 : Continue : EndIf  ; erste zeile überspringen, hier steht nur [Cache]
    
  [...]
  
Next
Das war's so auf die Schnelle. Mehr Tipps gibt's mit Sicherheit von den Kollegen.

Ach ja: Du solltest Dir bei nächster Gelegenheit noch mal 'EnableExplicit' in der PB-Hilfe
anschauen. Das sollte eigentlich immer am Anfang eines jeden Codes stehen.

Grüße ... Kiffi

Re: Kopiertool für UT2k4 Cache 1. real projekt

Verfasst: 06.01.2011 11:05
von Fabio
Danke Kiffi für die Konstruktive Kritik.

Das mit dem Variablentyp war mir bekannt, ich wollte es nur wegen der lesbarkeit machen.
Hmmm, ja ich weis, man sollte vernünftige Variablennamen nehmen :oops:

Ah, der Tipp mit dem CTRL+I ist super.

Aber das mit der Liste und dem For Each...?
Ich habe das mit dem ListIndex() schon gelesen, aber wieder vergessen :D
das werde ich mir noch merken müssen.

EnableExplicit wird berherzigt.

Hier noch eine kleine frage.
Wenn ich überprüfen möchte ob eine Datei vorhanden ist,
gehe ich so vor:

Code: Alles auswählen

If FileSize("path.txt") > 0   ;Überprüfung ob Datei vorhanden ist
Ist das so richtig oder gibt es hier eine spezielle Funktion dafür?


Danke, einen schönen Feiertag
und grüsse vom Bodensee.

Re: Kopiertool für UT2k4 Cache 1. real projekt

Verfasst: 06.01.2011 11:11
von DarkDragon
Fabio hat geschrieben:Hier noch eine kleine frage.
Wenn ich überprüfen möchte ob eine Datei vorhanden ist,
gehe ich so vor:

Code: Alles auswählen

If FileSize("path.txt") > 0   ;Überprüfung ob Datei vorhanden ist
Ist das so richtig oder gibt es hier eine spezielle Funktion dafür?
>= 0, sonst prüfst du gleichzeitig ob die Datei nicht leer ist.

Re: Kopiertool für UT2k4 Cache 1. real projekt

Verfasst: 06.01.2011 11:14
von Kiffi
Hallo Fabio,
Fabio hat geschrieben:Hier noch eine kleine frage.
Wenn ich überprüfen möchte ob eine Datei vorhanden ist,
gehe ich so vor:

Code: Alles auswählen

If FileSize("path.txt") > 0   ;Überprüfung ob Datei vorhanden ist
Ist das so richtig oder gibt es hier eine spezielle Funktion dafür?
nee. FileSize() ist schon so korrekt. Laut Doku liefert diese
Funktion eine -1, wenn die Datei nicht vorhanden ist.

Korrekterweise müsste dann allerdings die Abfrage so lauten:

Code: Alles auswählen

If FileSize("path.txt") > -1 ; Überprüfung ob Datei vorhanden ist
Fabio hat geschrieben:einen schönen Feiertag
öhm, habe ich was verpasst? :-)

Grüße ... Kiffi

Re: Kopiertool für UT2k4 Cache 1. real projekt

Verfasst: 06.01.2011 11:35
von DarkDragon
Kiffi hat geschrieben:
Fabio hat geschrieben:einen schönen Feiertag
öhm, habe ich was verpasst? :-)

Grüße ... Kiffi
Heilige Drei Könige sind hier am Bodensee noch ein Feiertag ;-) .

Re: Kopiertool für UT2k4 Cache 1. real projekt

Verfasst: 06.01.2011 11:49
von Kiffi
DarkDragon hat geschrieben:Heilige Drei Könige sind hier am Bodensee noch ein Feiertag ;-) .
ah, ok. Na, dann feiert mal schön :-)

Grüße ... Kiffi

Re: Kopiertool für UT2k4 Cache 1. real projekt

Verfasst: 06.01.2011 21:31
von AND51
Hi Fabio,

Das ist ja lustig... Das Tool gibt es schon: "TO-Multi Tool" heißt es und wurde bereits von mir geschrieben.
Ich habe bereits vor Jahren genau das gleiche Tool geschrieben, was dir jetzt vorschwebt ;-)

Allerdings habe ich es für "Tactical Ops" geschrieben, dieses Spiel hat die gleiche Datei-Struktur wie Unreal Tournament. Mein Tool funktioniert aber auch mit Unreal Tournament, UT2003 und UT2004.

Habe mir schon früher gedacht, dass es nett wäre, wenn es ein Tool gäbe, welches die Cache-Dateien automatisch aus dem Cache holt.

Falls du Hilfe brauchst, könnte ich dir eventuell helfen. Ich arbeite schon lange nicht mehr aktiv an meinem Tool, habe aber noch die Source-Dateien.

Mein Tool ist im Laufe der Zeit auf über 3500 Zeilen angewachsen und bietet viele weitere Funktionen. Wusstest du, dass man mit F9 Screenshotsd erstellen kann? Diese speichert das Spiel im Hauptverzeichnis als Shot0001.bmp, Shot0002.bmp, usw. ab. Mein Tool kann diese Bilder anzeigen (Diashow) und auf Wunsch ins speicherplatz-sparende PNG-Format konvertieren. Oder ist dir aufgefallen, dass das Spiel oft cache001.tmp, cache002.tmp, usw. im Hauptverzeichnis ablegt? Dies scheinen temporäre Dateien zu sein, die nicht immer gelöscht werden. Mein Tool beseitigt auf Wunsch auch diese. Dies sind nur 2 von vielen weiteren Funktionen. (Hinweis: Mein Tool wurde für TO entwickelt, keine Ahnung welche Funktionen auch mit UT arbeiten.)

Kurzum: Damit mein Projekt "weiterlebt" würde ich dir auf Wunsch gerne meinen Source-Code zur Verfügung stellen, damit du daraus lernen und ihn ggf. weiterentwickeln kannst. Falls du Interesse hast, melde dich bei mir.

Gruß,
AND51

Re: Kopiertool für UT2k4 Cache 1. real projekt

Verfasst: 06.01.2011 21:40
von AND51
Zur Besseren Abgrenzung erlaube ich mir mal diesen Doppelpost. Ich wollte nämlich eigentlich noch Tipps geben:


Dokumentiert wird das ganze in der cache.ini,
aber die Dateien haben nicht denn richtigen Namen sondern werden in etwa so gespeichert:
CE6F0FF54AA523ADDBC66D8CF622003E-1.uxx
dabei ist die endung immer .uxx.

In der *.ini steht aber der ganze Name samt richtiger endung mit dabei,
CE6F0FF54AA523ADDBC66D8CF622003E-1=VCTF-[Id]-CTC-Arcade-Beta4.ut2

...


Ich wollte nur mal wissen ob das so in die richtige richtung läuft oder ob ich das zu umständlich
geschrieben habe.
In der Tat ist das umständlich. Auch ich habe angefangen und ReadFile() verwendet und die Datei manuell ausgelesen. Die Zeilen habe ich dann immer mit StringField() geteilt. Dann bin ich umgestiegen auf Reguläre Ausdrücke. Erschien mir sicherer und flexibler. Aber weißt du, das einfachste von allem ist doch OpenPreferences(). Hier handelt es sich doch um eine normale INI-Datei* und die kannst du mit den Befehlen der Preferences-Library auslesen. Schau dir bitte mal ExaminePreferencesKey() an. So heißt der Befehl glaube ich. Sry, hab schon ewig nicht mehr programmiert und bin grad zu faul, nachzuschlagen. Mit dem Befehl und mit NextPreferenceKey() kannst du automatisch alle Einträge durchgehen und musst dich nicht mehr selbst darum kümmern, jede Zeile einzeln zu lesen und StringField() zu benutzen.


*) An TS-Soft: Mir egal, ob das eine "echte" INI-Datei oder eine Datei im Preferences-Format ist :P Hauptsache, man weiß, was ich meine...

Re: Kopiertool für UT2k4 Cache 1. real projekt

Verfasst: 07.01.2011 08:57
von Fabio
Schönen guten morgen.


Danke AND51 für Tipps und das angebot mal einen Blick auf Dein Tool zu legen.

Was das kleine Tool von mir angeht.
Sowas habe ich schon länger in gebrauch.
Hatte das ganze schon mal in BlitzBasic und dann in GLBasic geschrieben,
jetzt ist PureBasic dran :)

Es ist ne schöne übung :)

Mal schaun wie weit es mir meine Freizeit zulässt das ganze weiter in PB auszubauen.

So, jetzt ist erstmal Frühstücken mit den Kids angesagt.


Edit://
Huch, habe mir mal das mit ExaminePreferencesKey() angeschaut, ganz steige ich da noch nicht durch :oops:
Ich werde das ganze erstmal so zu laufen bringen,
dann gehts zum nächsten schritt.