Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.84] |
|
Сообщ.
#1
,
|
|
|
Доброе время суток!
Помогите пожалуйста разобраться. секция: [ATKindjal] Score = 2 DeployInf = TRUE House = Atreides StormDamage=74 // (1*64)+10 StormDamage=10 //only damages is never picked up PrimaryBuilding = ATBarracks UnitGroup = FromBarracks Terrain = Rock, Sand, NBRock, InfRock, Ramp UpgradedPrimaryRequired = TRUE Cost = 150 BuildTime = 144 Size = 1 Speed = 4.0 //game coord per update TurretAttach = ATKindjalGun, ATKindjalBigGun TurnRate = 0.2 //radians per tick Armour = None, 50, InfRock Health = 600 Infantry = true //SoundSelected = Selected //SoundOrdered = Ordered //SoundID = 00 ViewRange = 10 AiFoot = TRUE TechLevel = 4 ReinforcementValue = 3 Crushable = TRUE ChaosEffect = SmallChaosFX HawkEffect = SmallHawkFX TastyToWorms = TRUE WormAttraction = 3 CanMoveAnyDirection = TRUE CanBeDeviated = FALSE CanBeRepaired = FALSE AIThreat = 50 // LEVEL 1 ---------------------------------- VeterancyLevel = 2 // Score required Health = 800 ExtraDamage = 50 // 50% more damage - applied to all weapons // LEVEL 2 ---------------------------------- VeterancyLevel = 10 CanSelfRepair = 1 // LEVEL 3 ---------------------------------- VeterancyLevel = 20 Elite = TRUE //ExtraRange = 50 - removed // 50% more range ExtraDamage = 100 // 100% more damage - applied to all weapons Видно переменные повторяются: //LEVEL 1 , // LEVEL 2, // LEVEL 3 помогите вывести отдельно //LEVEL 1 , // LEVEL 2, // LEVEL 3 например в разные 3 memo =) С уважением, Volkogriz! |
Сообщ.
#2
,
|
|
|
1) Вы можете привести формат к стандартному виду разделив повторяющиеся поля на вложенные секции например так
[ATKindjal] Score = 2 DeployInf = TRUE House = Atreides StormDamage=74 // (1*64)+10 StormDamage=10 //only damages is never picked up PrimaryBuilding = ATBarracks UnitGroup = FromBarracks Terrain = Rock, Sand, NBRock, InfRock, Ramp UpgradedPrimaryRequired = TRUE Cost = 150 BuildTime = 144 Size = 1 Speed = 4.0 //game coord per update TurretAttach = ATKindjalGun, ATKindjalBigGun TurnRate = 0.2 //radians per tick Armour = None, 50, InfRock Health = 600 Infantry = true //SoundSelected = Selected //SoundOrdered = Ordered //SoundID = 00 ViewRange = 10 AiFoot = TRUE TechLevel = 4 ReinforcementValue = 3 Crushable = TRUE ChaosEffect = SmallChaosFX HawkEffect = SmallHawkFX TastyToWorms = TRUE WormAttraction = 3 CanMoveAnyDirection = TRUE CanBeDeviated = FALSE CanBeRepaired = FALSE AIThreat = 50 [ATKindjal/LEVEL 1] // LEVEL 1 ---------------------------------- VeterancyLevel = 2 // Score required Health = 800 ExtraDamage = 50 // 50% more damage - applied to all weapons [ATKindjal/LEVEL 2] // LEVEL 2 ---------------------------------- VeterancyLevel = 10 CanSelfRepair = 1 [ATKindjal/LEVEL 3] // LEVEL 3 ---------------------------------- VeterancyLevel = 20 Elite = TRUE //ExtraRange = 50 - removed // 50% more range ExtraDamage = 100 // 100% more damage - applied to all weapons 2) Вы можете написать собственный код работы с ini файлом, который учитывает особенности расположения данных. type PPIniFileEntry = ^PIniFileEntry; PIniFileData = ^TIniFileData; PIniFileEntry = ^TIniFileEntry; TIniFileData = packed record text: array of PChar; data: PIniFileEntry; end; TIniFileEntry = packed record next: PIniFileEntry; node: Integer; item: Integer; text: PChar; end; // FileName - Строка с именем ini файла procedure LoadIniFile(FileName: String): Pointer; const defGROUP: PChar = 'common'; var ini: TextFile; idx, grp, i: Integer; str, val: String; pak: PIniFileData; itm: PIniFileEntry; lst: PPIniFileEntry; begin pak := new(pak); with pak^ do begin grp := Low(text) - 1; data := nil; lst := @data; SetLength(text, 0); AssignFile(ini, FileName); Reset(ini); while not EOF(ini) do begin ReadLn(ini, str); idx := Pos('//', str); if idx > 0 then str := copy(str, Low(str), idx); str := trim(str); if Length(str) > 0 then begin if (str[Low(str)] = '[') and (str[High(str)] = ']') then begin str := copy(str, Low(str) + 1, Length(str) - 2); grp := High(text) + 1; for i := Low(text) to High(text) do if text[i] = str then begin grp := i; break; end; if grp > High(text) then begin SetLength(text, Length(text) + 1); text[grp] := PChar(copy(str, Low(str))); end; end else begin idx := Pos('=', str); if idx > 0 then begin val := copy(str, idx + 1); str := copy(str, Low(str), idx); if grp < Low(text) then begin grp := High(text) + 1; for i := Low(text) to High(text) do if text[i] = defGROUP then begin grp := i; break; end; if grp > High(text) then begin SetLength(text, Length(text) + 1); text[grp] := defGROUP; end; end; idx := High(text) + 1; for i := Low(text) to High(text) do if text[i] = str then begin idx := i; break; end; if idx > High(text) then begin SetLength(text, Length(text) + 1); text[idx] := PChar(copy(str, Low(str))); end; new(itm); itm^.next := nil; itm^.node := grp; itm^.item := idx; itm^.text := PChar(copy(val, Low(val)); lst^ := itm; lst := @itm^.next; end; end; end; end; CloseFile(ini); end; Result := pak; end; // aIni - Указатель полученный от LoadIniFile // aGroup - Строка с именем группы // aField - Строка с именем поля // aIndex - Порядковый номер вхождения поля в группу (для нескольких одноименных полей в группе) // {Как раз для вашего случая. LEVEL1 = 1, LEVEL2 = 2, LEVEL3 = 3} function GetValueByName(aIni: PIniFileData; aGroup, aField: String; aIndex: Integer): String; var grp, itm, i, h: Integer; str, sec, fld: String; lst: PIniFileEntry; begin Result := ''; sec := lowercase(aGroup); fld := lowercase(aField); if not (aIni = nil) then with aIni^ do begin h := High(text); grp := j + 1; itm := j + 1; for i := Low(text) to h do begin str := lowercase(text[i]); if str = sec then grp := i; if str = fld then itm := i; if (grp <= h) and (itm <= h) then break; end; if (grp <= h) or (itm <= h) then begin lst := data; h := 1; while not (lst = nil) do begin if (lst^.node = grp) and (lst^.item = itm) then if h = aIndex then begin Result := copy(lst^.text, Low(lst^.text)); break; end else inc(h); lst := lst^.next; end; end; end; end; {Надеюст процедуру сохранения ini файла и освобождения памяти из под этой структуры с динамическим списком вы сможете написать сами} |
Сообщ.
#3
,
|
|
|
Именованием
Level1.VeterancyLevel = ... или не изобретать велосипед и взять стандартное решение, например XML, JSON. Если так уж хочется простоты, то YAML |
Сообщ.
#4
,
|
|
|
@Volkogriz
Вы что разрабатываете программу для стихийных бедствий сша ?? |