diff -r a04e04aaf599 -r 24e68c7d2e79 hedgewars/uFLAmmo.pas --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hedgewars/uFLAmmo.pas Sat Apr 11 17:23:56 2015 +0300 @@ -0,0 +1,129 @@ +unit uFLAmmo; +interface +uses uFLTypes; + +function getAmmosList: PPChar; cdecl; +procedure freeAmmosList; + +function ammoByName(s: shortstring): PAmmo; +procedure sendAmmoConfig(var ammo: TAmmo); + +implementation +uses uFLUtils, uFLIPC, uPhysFSLayer, uFLData; + +const MAX_AMMO_NAMES = 64; +type + TAmmoArray = array [0..0] of TAmmo; + PAmmoArray = ^TAmmoArray; +var + ammoList: PAmmo; + ammoNumber: LongInt; + listOfAmmoNames: array[0..MAX_AMMO_NAMES] of PChar; + +procedure loadAmmo; +var f: PFSFile; + ammo: PAmmo; + ammos: PAmmoArray; + s: ansistring; + i: Longword; +begin + f:= pfsOpenRead('/Config/weapons.ini'); + ammoNumber:= 0; + + if f <> nil then + begin + while (not pfsEOF(f)) do + begin + pfsReadLnA(f, s); + + if (length(s) > 0) and (s[1] <> '[') then + inc(ammoNumber); + end; + + //inc(ammoNumber); // add some default ammo + + ammoList:= GetMem(sizeof(ammoList^) * (ammoNumber + 1)); + ammo:= PAmmo(ammoList); + pfsSeek(f, 0); + + while (not pfsEOF(f)) do + begin + pfsReadLnA(f, s); + + i:= 1; + while(i <= length(s)) and (s[i] <> '=') do inc(i); + + if i < length(s) then + begin + ammo^.ammoName:= copy(s, 1, i - 1); + delete(s, 1, i); + // TODO: split into 4 shortstrings + ammo^.ammoStr:= s; + inc(ammo) + end; + end; + + pfsClose(f) + end; +end; + + +function getAmmosList: PPChar; cdecl; +var i, t, l: Longword; + ammo: PAmmo; +begin + if ammoList = nil then + loadAmmo; + + t:= ammoNumber; + if t >= MAX_AMMO_NAMES then + t:= MAX_AMMO_NAMES; + + ammo:= ammoList; + for i:= 0 to Pred(t) do + begin + l:= length(ammo^.ammoName); + if l >= 255 then l:= 254; + ammo^.ammoName[l + 1]:= #0; + listOfAmmoNames[i]:= @ammo^.ammoName[1]; + inc(ammo) + end; + + listOfAmmoNames[t]:= nil; + + getAmmosList:= listOfAmmoNames +end; + +function ammoByName(s: shortstring): PAmmo; +var i: Longword; + ammo: PAmmo; +begin + ammo:= ammoList; + i:= 0; + while (i < ammoNumber) and (ammo^.ammoName <> s) do + begin + inc(ammo); + inc(i) + end; + + if i < ammoNumber then ammoByName:= ammo else ammoByName:= nil +end; + +procedure freeAmmosList; +begin + if ammoList <> nil then + FreeMem(ammoList, sizeof(ammoList^) * (ammoNumber + 1)) +end; + + +procedure sendAmmoConfig(var ammo: TAmmo); +var i: Longword; +begin + with ammo do + begin + //ipcToEngine('e$turntime ' + inttostr(ammo.turntime * 1000)); + //ipcToEngine('e$minesnum ' + inttostr(ammo.minesnum)); + end +end; + +end.