diff --git a/src/game/g_items.pas b/src/game/g_items.pas
index ef2e925b659be7ab89c696789a67be165e09273d..2ddc8586710e50b14d9ed833eb27dd65569f609a 100644 (file)
--- a/src/game/g_items.pas
+++ b/src/game/g_items.pas
interface
uses
interface
uses
- g_textures, g_phys, g_saveload, BinEditor, MAPDEF;
+ SysUtils, Classes,
+ MAPDEF, g_textures, g_phys, g_saveload;
Type
PItem = ^TItem;
Type
PItem = ^TItem;
procedure g_Items_DrawDrop();
procedure g_Items_Pick(ID: DWORD);
procedure g_Items_Remove(ID: DWORD);
procedure g_Items_DrawDrop();
procedure g_Items_Pick(ID: DWORD);
procedure g_Items_Remove(ID: DWORD);
-procedure g_Items_SaveState(var Mem: TBinMemoryWriter);
-procedure g_Items_LoadState(var Mem: TBinMemoryReader);
+procedure g_Items_SaveState (st: TStream);
+procedure g_Items_LoadState (st: TStream);
procedure g_Items_RestartRound ();
procedure g_Items_RestartRound ();
implementation
uses
implementation
uses
+ Math,
g_basic, e_graphics, g_sound, g_main, g_gfx, g_map,
g_basic, e_graphics, g_sound, g_main, g_gfx, g_map,
- Math, g_game, g_triggers, g_console, SysUtils, g_player, g_net, g_netmsg,
+ g_game, g_triggers, g_console, g_player, g_net, g_netmsg,
e_log,
e_log,
- g_grid, binheap, idpool;
+ g_grid, binheap, idpool, utils, xstreams;
var
var
procedure g_Items_LoadData();
begin
procedure g_Items_LoadData();
begin
- e_WriteLog('Loading items data...', MSG_NOTIFY);
+ e_WriteLog('Loading items data...', TMsgType.Notify);
g_Sound_CreateWADEx('SOUND_ITEM_RESPAWNITEM', GameWAD+':SOUNDS\RESPAWNITEM');
g_Sound_CreateWADEx('SOUND_ITEM_GETRULEZ', GameWAD+':SOUNDS\GETRULEZ');
g_Sound_CreateWADEx('SOUND_ITEM_RESPAWNITEM', GameWAD+':SOUNDS\RESPAWNITEM');
g_Sound_CreateWADEx('SOUND_ITEM_GETRULEZ', GameWAD+':SOUNDS\GETRULEZ');
procedure g_Items_FreeData();
begin
procedure g_Items_FreeData();
begin
- e_WriteLog('Releasing items data...', MSG_NOTIFY);
+ e_WriteLog('Releasing items data...', TMsgType.Notify);
g_Sound_Delete('SOUND_ITEM_RESPAWNITEM');
g_Sound_Delete('SOUND_ITEM_GETRULEZ');
g_Sound_Delete('SOUND_ITEM_RESPAWNITEM');
g_Sound_Delete('SOUND_ITEM_GETRULEZ');
end
else
begin
end
else
begin
- Animation.Draw(Obj.X, Obj.Y, M_NONE);
+ Animation.Draw(Obj.X, Obj.Y, TMirrorType.None);
end;
if g_debug_Frames then
end;
if g_debug_Frames then
end;
end;
-procedure g_Items_SaveState (var Mem: TBinMemoryWriter);
+procedure g_Items_SaveState (st: TStream);
var
count, i: Integer;
var
count, i: Integer;
- sig: DWORD;
tt: Byte;
begin
// Ñ÷èòàåì êîëè÷åñòâî ñóùåñòâóþùèõ ïðåäìåòîâ
count := 0;
tt: Byte;
begin
// Ñ÷èòàåì êîëè÷åñòâî ñóùåñòâóþùèõ ïðåäìåòîâ
count := 0;
- if (ggItems <> nil) then
- begin
- for i := 0 to High(ggItems) do if (ggItems[i].ItemType <> ITEM_NONE) then Inc(count);
- end;
-
- Mem := TBinMemoryWriter.Create((count+1) * 60);
+ for i := 0 to High(ggItems) do if (ggItems[i].ItemType <> ITEM_NONE) then Inc(count);
// Êîëè÷åñòâî ïðåäìåòîâ
// Êîëè÷åñòâî ïðåäìåòîâ
- Mem.WriteInt(count);
-
+ utils.writeInt(st, LongInt(count));
if (count = 0) then exit;
for i := 0 to High(ggItems) do
if (count = 0) then exit;
for i := 0 to High(ggItems) do
if (ggItems[i].ItemType <> ITEM_NONE) then
begin
// Ñèãíàòóðà ïðåäìåòà
if (ggItems[i].ItemType <> ITEM_NONE) then
begin
// Ñèãíàòóðà ïðåäìåòà
- sig := ITEM_SIGNATURE; // 'ITEM'
- Mem.WriteDWORD(sig);
+ utils.writeSign(st, 'ITEM');
+ utils.writeInt(st, Byte(0));
// Òèï ïðåäìåòà
tt := ggItems[i].ItemType;
if ggItems[i].dropped then tt := tt or $80;
// Òèï ïðåäìåòà
tt := ggItems[i].ItemType;
if ggItems[i].dropped then tt := tt or $80;
- Mem.WriteByte(tt);
+ utils.writeInt(st, Byte(tt));
// Åñòü ëè ðåñïàóí
// Åñòü ëè ðåñïàóí
- Mem.WriteBoolean(ggItems[i].Respawnable);
+ utils.writeBool(st, ggItems[i].Respawnable);
// Êîîðäèíàòû ðåñïóíà
// Êîîðäèíàòû ðåñïóíà
- Mem.WriteInt(ggItems[i].InitX);
- Mem.WriteInt(ggItems[i].InitY);
+ utils.writeInt(st, LongInt(ggItems[i].InitX));
+ utils.writeInt(st, LongInt(ggItems[i].InitY));
// Âðåìÿ äî ðåñïàóíà
// Âðåìÿ äî ðåñïàóíà
- Mem.WriteWord(ggItems[i].RespawnTime);
+ utils.writeInt(st, Word(ggItems[i].RespawnTime));
// Ñóùåñòâóåò ëè ýòîò ïðåäìåò
// Ñóùåñòâóåò ëè ýòîò ïðåäìåò
- Mem.WriteBoolean(ggItems[i].alive);
+ utils.writeBool(st, ggItems[i].alive);
// Ìîæåò ëè îí ïàäàòü
// Ìîæåò ëè îí ïàäàòü
- Mem.WriteBoolean(ggItems[i].Fall);
+ utils.writeBool(st, ggItems[i].Fall);
// Èíäåêñ òðèããåðà, ñîçäàâøåãî ïðåäìåò
// Èíäåêñ òðèããåðà, ñîçäàâøåãî ïðåäìåò
- Mem.WriteInt(ggItems[i].SpawnTrigger);
+ utils.writeInt(st, LongInt(ggItems[i].SpawnTrigger));
// Îáúåêò ïðåäìåòà
// Îáúåêò ïðåäìåòà
- Obj_SaveState(@ggItems[i].Obj, Mem);
+ Obj_SaveState(st, @ggItems[i].Obj);
end;
end;
end;
end;
end;
end;
-procedure g_Items_LoadState (var Mem: TBinMemoryReader);
+procedure g_Items_LoadState (st: TStream);
var
count, i, a: Integer;
var
count, i, a: Integer;
- sig: DWORD;
b: Byte;
begin
b: Byte;
begin
- if (Mem = nil) then exit;
+ assert(st <> nil);
g_Items_Free();
// Êîëè÷åñòâî ïðåäìåòîâ
g_Items_Free();
// Êîëè÷åñòâî ïðåäìåòîâ
- Mem.ReadInt(count);
-
- if (count = 0) then Exit;
+ count := utils.readLongInt(st);
+ if (count = 0) then exit;
+ if (count < 0) or (count > 1024*1024) then raise XStreamError.Create('invalid number of items');
for a := 0 to count-1 do
begin
// Ñèãíàòóðà ïðåäìåòà
for a := 0 to count-1 do
begin
// Ñèãíàòóðà ïðåäìåòà
- Mem.ReadDWORD(sig);
- if (sig <> ITEM_SIGNATURE) then raise EBinSizeError.Create('g_Items_LoadState: Wrong Item Signature'); // 'ITEM'
+ if not utils.checkSign(st, 'ITEM') then raise XStreamError.Create('invalid item signature');
+ if (utils.readByte(st) <> 0) then raise XStreamError.Create('invalid item version');
// Òèï ïðåäìåòà
// Òèï ïðåäìåòà
- Mem.ReadByte(b); // bit7=1: monster drop
+ b := utils.readByte(st); // bit7=1: monster drop
// Ñîçäàåì ïðåäìåò
i := g_Items_Create(0, 0, b and $7F, False, False);
if ((b and $80) <> 0) then g_Items_SetDrop(i);
// Åñòü ëè ðåñïàóí
// Ñîçäàåì ïðåäìåò
i := g_Items_Create(0, 0, b and $7F, False, False);
if ((b and $80) <> 0) then g_Items_SetDrop(i);
// Åñòü ëè ðåñïàóí
- Mem.ReadBoolean(ggItems[i].Respawnable);
+ ggItems[i].Respawnable := utils.readBool(st);
// Êîîðäèíàòû ðåñïóíà
// Êîîðäèíàòû ðåñïóíà
- Mem.ReadInt(ggItems[i].InitX);
- Mem.ReadInt(ggItems[i].InitY);
+ ggItems[i].InitX := utils.readLongInt(st);
+ ggItems[i].InitY := utils.readLongInt(st);
// Âðåìÿ äî ðåñïàóíà
// Âðåìÿ äî ðåñïàóíà
- Mem.ReadWord(ggItems[i].RespawnTime);
+ ggItems[i].RespawnTime := utils.readWord(st);
// Ñóùåñòâóåò ëè ýòîò ïðåäìåò
// Ñóùåñòâóåò ëè ýòîò ïðåäìåò
- Mem.ReadBoolean(ggItems[i].alive);
+ ggItems[i].alive := utils.readBool(st);
// Ìîæåò ëè îí ïàäàòü
// Ìîæåò ëè îí ïàäàòü
- Mem.ReadBoolean(ggItems[i].Fall);
+ ggItems[i].Fall := utils.readBool(st);
// Èíäåêñ òðèããåðà, ñîçäàâøåãî ïðåäìåò
// Èíäåêñ òðèããåðà, ñîçäàâøåãî ïðåäìåò
- Mem.ReadInt(ggItems[i].SpawnTrigger);
+ ggItems[i].SpawnTrigger := utils.readLongInt(st);
// Îáúåêò ïðåäìåòà
// Îáúåêò ïðåäìåòà
- Obj_LoadState(@ggItems[i].Obj, Mem);
+ Obj_LoadState(@ggItems[i].Obj, st);
end;
end;
end;
end;