Autor |
Beitrag |
SevenValues
      
Beiträge: 25
XP, ME, 98
Delphi 6 PE
|
Verfasst: Sa 04.09.04 11:52
Hi!
Ich möchte Ini-Dateien eines Spieles (Freelancer) auslesen und Werte ändern, bzw hinzufügen. Allerdings sind dort einige Sections, die doppelt (immer mit anderen Parametern) aufgeführt sind. Wie kann ich denn nun jede einzelne Section auslesen?
Hier ein Auszug aus einer Ini-Datei:
Zitat: | ...
[EncounterParameters]
nickname = capitalships_Escorts
filename = missions\encounters\capitalships_Escorts.ini
[EncounterParameters]
nickname = capitalships_Rheinland
filename = missions\encounters\capitalships_Rheinland.ini
[EncounterParameters]
nickname = capitalship_rh_cruiser
filename = missions\encounters\capitalship_rh_cruiser.ini
[EncounterParameters]
nickname = capitalships_Liberty_cruiser
filename = missions\encounters\capitalships_Liberty_cruiser.ini
[EncounterParameters]
nickname = capitalship_DREADNOUGH
filename = missions\encounters\capitalship_DREADNOUGH.ini
[TexturePanels]
file = universe\heavens\shapes.ini
[Dust]
spacedust = Dust
[Music]
space = music_system_sachsen_anhalt
danger = music_li_danger
battle = music_li_battle
[Asteroids]
file = solar\asteroids\br05_gsm_mineable_gold_field.ini
zone = Zone_Li06_Quedlinburg_debris_001
[Asteroids]
file = solar\asteroids\br05_gsm_mineable_gold_field.ini
zone = Zone_Li06_Halle_debris_002
[Asteroids]
file = solar\asteroids\br05_gsm_mineable_gold_field.ini
zone = Zone_Li06_Halle_debris_003
... |
Ich hab nun schon rausgefunden, daß TMemIniFile die Ini von hinten nach vorne durchsucht, allerdings hilft mir das auch nicht sonderlich weiter.
Kann mir da jemand helfen??
Grüße
7
_________________ Nacht ist, wenn einer das Licht ausschaltet.
|
|
MartinPb
      
Beiträge: 698
|
Verfasst: Sa 04.09.04 13:24
Das ist anscheinend keine klassische Ini. Deshalb wirst du auch nicht durch die Vordetür reinkommen. Bevor wir jetzt aber eine komplizierte Methode suchen, würde ich vorschlagen, daß du dir eine eigene Ini Verwaltung schreibst.
Hier ein Beispiel wie es gehen könnte:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure MyIniReader(Source, Values: TStrings; Section, Key: String); var i: Integer; MySec, MyKey, CurrSec: String; Tmp: String; begin Values.Clear;
MySec := AnsiUpperCase('[' + Section + ']'); MyKey := AnsiUpperCase(Key); CurrSec := '';
for i := 0 to Source.Count - 1 do begin Tmp := AnsiUpperCase(Trim(Source.Strings[i]));
if Tmp <> '' then begin if (Tmp[1] = '[') and (Tmp[Length(Tmp)] = ']') then begin if MySec = Tmp then CurrSec := Tmp else CurrSec := ''; end;
Tmp := AnsiUpperCase(Trim(Source.Names[i])); if (CurrSec = MySec) and (Tmp = myKey) then Values.Add(Source.Strings[i]); end; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin MyIniReader(Memo1.Lines, Memo2.Lines, 'EncounterParameters', 'nickname'); end; |
In Memo1 ist deine Ini, in Memo2 werden alle Ergebnisse geschrieben. Anstelle von Memo kann man jedes TStrins kompatible Objekt nehmen, wie z.B. TStringList.
Das mit dem Schreiben wird schon ein wenig problematischer. Wie du siehst ist das keine normale Ini. Wie willst du exact die eine Sektion ändern, wenn du kein Unterscheidungskriterium hast? Anscheinend haben sie auf diese Weise ein Array-Record abgespeichert. Um es richtig bearbeiten zu können mußt du ein Array-Record erstellen, alle betrefenden Sektionen einlesen und dann löschen, und, nachdem du Änderungen vorgenommen hast, wieder alle Sektionen neu erstellen.
_________________ Gruß
Martin
|
|
SevenValues 
      
Beiträge: 25
XP, ME, 98
Delphi 6 PE
|
Verfasst: Sa 04.09.04 15:15
Nun - ein Unterscheidungskriterium gibt es zwar, aber nur bei den Objekten, die auch wirklich im Spiel namentlich auftauchen, wie zum Beispiel Planeten oder Sprungtore. Aus diesem Grund werden auch in dem obigen Auszug nicknames verteilt. Wird in einer Objektroutine ein nickname angesprochen sucht sich also das Programm die entsprechende Ini raus, die diesem nickname zugewiesen wurde. Meist stehen dann in diesen Inis weitere queries zu anderen Inis drin. Alles in Allem ziemlich komplex und verwirrend, aber durchaus auch durchschaubar. So habe ich mir per Hand mein eigenes System erstellt, aber automatisieren lässt sich so etwas nur schwer.
Hier nochmal ein Auszug aus der von mir per Hand erstellten Ini:
Zitat: |
[Object]
nickname = Sun_Li06 <--- Unterscheidungskriterium
ids_name = 458755
pos = 0, 0, 0
ambient_color = 255, 255, 255
Archetype = sun_2000
ids_info = 66162
star = med_white_sun
atmosphere_range = 11000
burn_color = 160, 0, 245
[zone]
nickname = Sun_Li06_zone <--- Unterscheidungskriterium
ids_name = 458775
pos = 0, 0, 0
rotate = 0, 0, 0
shape = ELLIPSOID
size = 75000, 75000, 75000
property_flags = 128
Music = music_system_sachsen_anhalt
comment = Encounter_zone
relief_time = 10
faction_weight = li_p_grp, 12
faction_weight = li_p_grp_prisoners, 4
faction_weight = co_be_grp, 10
faction_weight = co_hsp_grp, 10
faction_weight = co_kt_grp, 10
faction_weight = co_me_grp, 10
faction_weight = co_nws_grp, 10
faction_weight = co_ni_grp, 10
faction_weight = co_os_grp, 4
faction_weight = co_rs_grp, 10
faction_weight = co_shi_grp, 10
faction_weight = co_ss_grp, 10
faction_weight = co_vr_grp, 8
faction_weight = gd_bh_grp, 3
density_restriction = 4, unlawfuls
encounter = area_defend, 1, 4.070000
faction = li_p_grp, 1.000000
encounter = area_bh_defend, 1, 4.030000
faction = gd_bh_grp, 1.000000
encounter = area_armored_prisoner, 1, 4.020000
faction = li_p_grp, 1.000000
encounter = area_trade_freighter, 1, 3.090000
faction = co_hsp_grp, 0.260000
faction = co_me_grp, 0.260000
faction = co_ss_grp, 0.260000
faction = co_vr_grp, 0.210000
encounter = area_trade_transport, 10, 3.120000
faction = co_be_grp, 0.100000
faction = co_hsp_grp, 0.100000
faction = co_kt_grp, 0.100000
faction = co_me_grp, 0.100000
faction = co_nws_grp, 0.100000
faction = co_ni_grp, 0.100000
faction = co_rs_grp, 0.100000
faction = co_shi_grp, 0.100000
faction = co_ss_grp, 0.100000
faction = co_vr_grp, 0.080000
encounter = area_trade_armored, 10, 4.020000
faction = co_os_grp, 1.000000
encounter = area_lifter, 10, 2.030000
faction = co_me_grp, 0.500000
faction = co_ss_grp, 0.500000
encounter = area_repair, 10, 2.030000
faction = co_me_grp, 0.500000
faction = co_ss_grp, 0.500000
encounter = capitalships_Liberty, 19, 0.20000
faction = li_n_grp, 1.000000
encounter = capitalships_Escorts, 19, 0.250000
faction = li_n_grp, 1.000000
encounter = capitalships_Rheinland, 19, 0.010000
faction = rh_n_grp, 1.000000
encounter = capitalships_Escorts, 19, 0.100000
faction = rh_n_grp, 1.000000
encounter = capitalship_rh_cruiser, 19, 0.100000
faction = rh_n_grp, 1.000000
encounter = capitalships_Liberty_cruiser, 19, 0.200000
faction = li_n_grp, 1.000000
|
Jedenfalls danke ich Dir für Deine Antwort. Sie bestätigt meine Vermutung, daß es in normalen Inis in der Regel keine doppelten Sections gibt und daß ich mit TMemIniFile nicht sonderlich weit kommen werde.
Nun gilt es also einige Routinen zu entwickeln, die aber auch wirklich alles abdecken, was so vorkommen kann in den über 100 Ini-Dateien des Spiels. Da wünsche ich mir mal viel Spaß *schwitz*
Ich zieh mir mal Dein Beispiel rein und schaue mal, ob sich das anwenden läßt.
Herzlichen Dank Martin!!!
Ich melde mich in Kürze wieder, denn ich gebe nicht mehr auf. Dies ist jetzt mein vierter Anlauf.
Biba
7
_________________ Nacht ist, wenn einer das Licht ausschaltet.
|
|
SevenValues 
      
Beiträge: 25
XP, ME, 98
Delphi 6 PE
|
Verfasst: Sa 04.09.04 19:16
Ich finde, daß Deine Routine Gold Wert ist! Ich könnte damit sämtliche Sections durchrödeln und dabei durchnummerieren ([EncounterParameters_001]) und in einem Stream zwischenspeichern. Später könnte ich dann die Nummerierungen wieder entfernen und als fertige Ini speicheln.
Mit den Nummerierungen hätte ich dann differenzierte Namen und könnte - zumindest theoretisch - wieder mit TMemIniFile arbeiten.
Gruß
7
_________________ Nacht ist, wenn einer das Licht ausschaltet.
|
|
|