diff --git a/src/game/g_weapons.pas b/src/game/g_weapons.pas
index 4a22a3b4a827a2a93c9079348a6fafaee9321734..182207f233740454ac355b5034c59625b78aea0b 100644 (file)
--- a/src/game/g_weapons.pas
+++ b/src/game/g_weapons.pas
interface
uses
- g_textures, g_basic, e_graphics, g_phys, BinEditor, xprofiler;
+ SysUtils, Classes,
+ g_textures, g_basic, e_graphics, g_phys, xprofiler;
-{
-const
- HIT_SOME = 0;
- HIT_ROCKET = 1;
- HIT_BFG = 2;
- HIT_TRAP = 3;
- HIT_FALL = 4;
- HIT_WATER = 5;
- HIT_ACID = 6;
- HIT_ELECTRO = 7;
- HIT_FLAME = 8;
- HIT_SELF = 9;
- HIT_DISCON = 10;
-}
type
TShot = record
function g_Weapon_Danger(UID: Word; X, Y: Integer; Width, Height: Word; Time: Byte): Boolean;
procedure g_Weapon_DestroyShot(I: Integer; X, Y: Integer; Loud: Boolean = True);
-procedure g_Weapon_SaveState(var Mem: TBinMemoryWriter);
-procedure g_Weapon_LoadState(var Mem: TBinMemoryReader);
+procedure g_Weapon_SaveState (st: TStream);
+procedure g_Weapon_LoadState (st: TStream);
procedure g_Weapon_AddDynLights();
uses
Math, g_map, g_player, g_gfx, g_sound, g_main, g_panel,
- g_console, SysUtils, g_options, g_game,
+ g_console, g_options, g_game,
g_triggers, MAPDEF, e_log, g_monsters, g_saveload,
g_language, g_netmsg, g_grid,
- binheap, hashtable;
+ binheap, hashtable, utils, xstreams;
type
TWaterPanel = record
end;
end;
-procedure g_Weapon_SaveState(var Mem: TBinMemoryWriter);
+procedure g_Weapon_SaveState (st: TStream);
var
count, i, j: Integer;
- dw: DWORD;
begin
-// Ñ÷èòàåì êîëè÷åñòâî ñóùåñòâóþùèõ ñíàðÿäîâ:
+ // Ñ÷èòàåì êîëè÷åñòâî ñóùåñòâóþùèõ ñíàðÿäîâ
count := 0;
- if Shots <> nil then
- for i := 0 to High(Shots) do
- if Shots[i].ShotType <> 0 then
- count := count + 1;
+ for i := 0 to High(Shots) do if (Shots[i].ShotType <> 0) then Inc(count);
- Mem := TBinMemoryWriter.Create((count+1) * 80);
+ // Êîëè÷åñòâî ñíàðÿäîâ
+ utils.WriteInt(st, count);
-// Êîëè÷åñòâî ñíàðÿäîâ:
- Mem.WriteInt(count);
-
- if count = 0 then
- Exit;
+ if (count = 0) then exit;
for i := 0 to High(Shots) do
+ begin
if Shots[i].ShotType <> 0 then
begin
- // Ñèãíàòóðà ñíàðÿäà:
- dw := SHOT_SIGNATURE; // 'SHOT'
- Mem.WriteDWORD(dw);
- // Òèï ñíàðÿäà:
- Mem.WriteByte(Shots[i].ShotType);
- // Öåëü:
- Mem.WriteWord(Shots[i].Target);
- // UID ñòðåëÿâøåãî:
- Mem.WriteWord(Shots[i].SpawnerUID);
- // Ðàçìåð ïîëÿ Triggers:
- dw := Length(Shots[i].Triggers);
- Mem.WriteDWORD(dw);
- // Òðèããåðû, àêòèâèðîâàííûå âûñòðåëîì:
- for j := 0 to Integer(dw)-1 do
- Mem.WriteDWORD(Shots[i].Triggers[j]);
- // Îáúåêò ñíàðÿäà:
- Obj_SaveState(@Shots[i].Obj, Mem);
- // Êîñòûëèíà åáàíàÿ:
- Mem.WriteByte(Shots[i].Stopped);
+ // Ñèãíàòóðà ñíàðÿäà
+ utils.writeSign(st, 'SHOT');
+ utils.writeInt(st, Byte(0)); // version
+ // Òèï ñíàðÿäà
+ utils.writeInt(st, Byte(Shots[i].ShotType));
+ // Öåëü
+ utils.writeInt(st, Word(Shots[i].Target));
+ // UID ñòðåëÿâøåãî
+ utils.writeInt(st, Word(Shots[i].SpawnerUID));
+ // Ðàçìåð ïîëÿ Triggers
+ utils.writeInt(st, Integer(Length(Shots[i].Triggers)));
+ // Òðèããåðû, àêòèâèðîâàííûå âûñòðåëîì
+ for j := 0 to Length(Shots[i].Triggers)-1 do utils.writeInt(st, LongWord(Shots[i].Triggers[j]));
+ // Îáúåêò ñíàðÿäà
+ Obj_SaveState(st, @Shots[i].Obj);
+ // Êîñòûëèíà åáàíàÿ
+ utils.writeInt(st, Byte(Shots[i].Stopped));
end;
+ end;
end;
-procedure g_Weapon_LoadState(var Mem: TBinMemoryReader);
+procedure g_Weapon_LoadState (st: TStream);
var
- count, i, j: Integer;
- dw: DWORD;
+ count, tc, i, j: Integer;
+ dw: LongWord;
begin
- if Mem = nil then
- Exit;
+ if (st = nil) then exit;
-// Êîëè÷åñòâî ñíàðÿäîâ:
- Mem.ReadInt(count);
+ // Êîëè÷åñòâî ñíàðÿäîâ
+ count := utils.readLongInt(st);
+ if (count < 0) or (count > 1024*1024) then raise XStreamError.Create('invalid shots counter');
SetLength(Shots, count);
- if count = 0 then
- Exit;
+ if (count = 0) then exit;
for i := 0 to count-1 do
begin
- // Ñèãíàòóðà ñíàðÿäà:
- Mem.ReadDWORD(dw);
- if dw <> SHOT_SIGNATURE then // 'SHOT'
- begin
- raise EBinSizeError.Create('g_Weapons_LoadState: Wrong Shot Signature');
- end;
- // Òèï ñíàðÿäà:
- Mem.ReadByte(Shots[i].ShotType);
- // Öåëü:
- Mem.ReadWord(Shots[i].Target);
- // UID ñòðåëÿâøåãî:
- Mem.ReadWord(Shots[i].SpawnerUID);
- // Ðàçìåð ïîëÿ Triggers:
- Mem.ReadDWORD(dw);
- SetLength(Shots[i].Triggers, dw);
- // Òðèããåðû, àêòèâèðîâàííûå âûñòðåëîì:
- for j := 0 to Integer(dw)-1 do
- Mem.ReadDWORD(Shots[i].Triggers[j]);
- // Îáúåêò ïðåäìåòà:
- Obj_LoadState(@Shots[i].Obj, Mem);
- // Êîñòûëèíà åáàíàÿ:
- Mem.ReadByte(Shots[i].Stopped);
-
- // Óñòàíîâêà òåêñòóðû èëè àíèìàöèè:
+ // Ñèãíàòóðà ñíàðÿäà
+ if not utils.checkSign(st, 'SHOT') then raise XStreamError.Create('invalid shot signature');
+ if (utils.readByte(st) <> 0) then raise XStreamError.Create('invalid shot version');
+ // Òèï ñíàðÿäà:
+ Shots[i].ShotType := utils.readByte(st);
+ // Öåëü
+ Shots[i].Target := utils.readWord(st);
+ // UID ñòðåëÿâøåãî
+ Shots[i].SpawnerUID := utils.readWord(st);
+ // Ðàçìåð ïîëÿ Triggers
+ tc := utils.readLongInt(st);
+ if (tc < 0) or (tc > 1024*1024) then raise XStreamError.Create('invalid shot triggers counter');
+ SetLength(Shots[i].Triggers, tc);
+ // Òðèããåðû, àêòèâèðîâàííûå âûñòðåëîì
+ for j := 0 to tc-1 do Shots[i].Triggers[j] := utils.readLongWord(st);
+ // Îáúåêò ïðåäìåòà
+ Obj_LoadState(@Shots[i].Obj, st);
+ // Êîñòûëèíà åáàíàÿ
+ Shots[i].Stopped := utils.readByte(st);
+
+ // Óñòàíîâêà òåêñòóðû èëè àíèìàöèè
Shots[i].TextureID := DWORD(-1);
Shots[i].Animation := nil;