Subversion Repositories plumbers

Rev

Rev 2 | Rev 11 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2 Rev 10
Line 52... Line 52...
52
    numScenes: Word;
52
    numScenes: Word;
53
    numPics: Word;
53
    numPics: Word;
54
    unknown2: array[0..1] of Word;
54
    unknown2: array[0..1] of Word;
55
    scenes: array[0..99] of TSceneDef;        // Scenes start at 0x0016
55
    scenes: array[0..99] of TSceneDef;        // Scenes start at 0x0016
56
    pictures: array[0..1999] of TPictureDef;  // Pictures start at 0x2596
56
    pictures: array[0..1999] of TPictureDef;  // Pictures start at 0x2596
-
 
57
 
57
    function AddSceneAtEnd(SceneID: integer): PSceneDef;
58
    function AddSceneAtEnd(SceneID: integer): PSceneDef;
58
    procedure DeleteScene(SceneIndex: integer);
59
    procedure DeleteScene(SceneIndex: integer);
59
    procedure SwapScene(IndexA, IndexB: integer);
60
    procedure SwapScene(IndexA, IndexB: integer);
60
    procedure DeletePicture(PictureIndex: integer);
61
    procedure DeletePicture(PictureIndex: integer);
61
    procedure SwapPicture(IndexA, IndexB: integer);
62
    procedure SwapPicture(IndexA, IndexB: integer);
62
    function AddPictureBetween(Index: integer): PPictureDef;
63
    function AddPictureBetween(Index: integer; assignToUpperScene: boolean=true): PPictureDef;
-
 
64
    function RealPictureCount: integer;
-
 
65
    function RealActionCount: integer;
63
  end;
66
  end;
64
 
67
 
65
procedure _WriteStringToFilename(x: PAnsiFileName; s: AnsiString);
68
procedure _WriteStringToFilename(x: PAnsiFileName; s: AnsiString);
66
 
69
 
67
implementation
70
implementation
Line 91... Line 94...
91
  If SceneIndex < Length(Self.scenes)-1 then
94
  If SceneIndex < Length(Self.scenes)-1 then
92
  begin
95
  begin
93
    CopyMemory(@Self.scenes[SceneIndex], @Self.scenes[SceneIndex+1], (Length(Self.scenes)-SceneIndex-1)*SizeOf(TSceneDef));
96
    CopyMemory(@Self.scenes[SceneIndex], @Self.scenes[SceneIndex+1], (Length(Self.scenes)-SceneIndex-1)*SizeOf(TSceneDef));
94
  end;
97
  end;
95
  ZeroMemory(@Self.scenes[Length(Self.scenes)-1], SizeOf(TSceneDef));
98
  ZeroMemory(@Self.scenes[Length(Self.scenes)-1], SizeOf(TSceneDef));
-
 
99
  Dec(Self.numScenes);
-
 
100
end;
-
 
101
 
-
 
102
function TGameBinFile.RealActionCount: integer;
-
 
103
var
-
 
104
  iScene: integer;
-
 
105
begin
-
 
106
  result := 0;
-
 
107
  for iScene := 0 to Self.numScenes - 1 do
-
 
108
  begin
-
 
109
    result := result + Self.scenes[iScene].numActions;
-
 
110
  end;
-
 
111
end;
-
 
112
 
-
 
113
function TGameBinFile.RealPictureCount: integer;
-
 
114
var
-
 
115
  iScene: integer;
-
 
116
begin
-
 
117
  result := 0;
-
 
118
  for iScene := 0 to Self.numScenes - 1 do
-
 
119
  begin
-
 
120
    result := result + Self.scenes[iScene].numPics;
-
 
121
  end;
96
end;
122
end;
97
 
123
 
98
procedure TGameBinFile.SwapScene(IndexA, IndexB: integer);
124
procedure TGameBinFile.SwapScene(IndexA, IndexB: integer);
99
var
125
var
100
  bakScene: TSceneDef;
126
  bakScene: TSceneDef;
Line 106... Line 132...
106
  CopyMemory(@Self.scenes[IndexB], @bakScene, SizeOf(TSceneDef));
132
  CopyMemory(@Self.scenes[IndexB], @bakScene, SizeOf(TSceneDef));
107
end;
133
end;
108
 
134
 
109
procedure TGameBinFile.DeletePicture(PictureIndex: integer);
135
procedure TGameBinFile.DeletePicture(PictureIndex: integer);
110
var
136
var
111
  iScene: integer;
137
  iScene, iScene2: integer;
-
 
138
  protection: integer; // prevents that two scenes get the same picture index when all pictures in a scene are deleted
112
begin
139
begin
113
  if (PictureIndex < 0) or (PictureIndex >= Length(Self.pictures)) then raise Exception.Create('Invalid picture index');
140
  if (PictureIndex < 0) or (PictureIndex >= Length(Self.pictures)) then raise Exception.Create('Invalid picture index');
114
 
141
 
-
 
142
  protection := 0;
115
  for iScene := 0 to Self.numScenes-1 do
143
  for iScene := 0 to Self.numScenes-1 do
116
  begin
144
  begin
117
    if (PictureIndex >= Self.scenes[iScene].pictureIndex) and
145
    if (PictureIndex >= Self.scenes[iScene].pictureIndex) and
118
       (PictureIndex <= Self.scenes[iScene].pictureIndex + Self.scenes[iScene].numPics - 1) then
146
       (PictureIndex <= Self.scenes[iScene].pictureIndex + Self.scenes[iScene].numPics - 1) then
119
    begin
147
    begin
120
      Dec(Self.scenes[iScene].numPics);
148
      Dec(Self.scenes[iScene].numPics);
-
 
149
      if Self.scenes[iScene].numPics = 0 then
-
 
150
      begin
-
 
151
         for iScene2 := 0 to Self.numScenes-1 do
-
 
152
         begin
-
 
153
           if Self.scenes[iScene2].pictureIndex = PictureIndex+1 then
-
 
154
           begin
-
 
155
             protection := 1;
-
 
156
             break;
-
 
157
           end;
-
 
158
         end;
-
 
159
      end;
121
    end
160
    end
122
    else if (PictureIndex < Self.scenes[iScene].pictureIndex) then
161
    else if (PictureIndex+protection < Self.scenes[iScene].pictureIndex) then
123
    begin
162
    begin
124
      Dec(Self.scenes[iScene].pictureIndex);
163
      Dec(Self.scenes[iScene].pictureIndex);
125
    end;
164
    end;
126
  end;
165
  end;
127
 
166
 
128
  If PictureIndex < Length(Self.pictures)-1 then
167
  If (PictureIndex+protection < Length(Self.pictures)-1) and (protection = 0) then
129
  begin
168
  begin
130
    CopyMemory(@Self.pictures[PictureIndex], @Self.pictures[PictureIndex+1], (Length(Self.pictures)-PictureIndex-1)*SizeOf(TPictureDef));
169
    CopyMemory(@Self.pictures[PictureIndex+protection], @Self.pictures[PictureIndex+protection+1], (Length(Self.pictures)-PictureIndex+protection-1)*SizeOf(TPictureDef));
131
  end;
170
  end;
132
  ZeroMemory(@Self.pictures[Length(Self.pictures)-1], SizeOf(TPictureDef));
171
  ZeroMemory(@Self.pictures[Length(Self.pictures)-1], SizeOf(TPictureDef));
-
 
172
 
-
 
173
  Dec(Self.numPics);
133
end;
174
end;
134
 
175
 
135
procedure TGameBinFile.SwapPicture(IndexA, IndexB: integer);
176
procedure TGameBinFile.SwapPicture(IndexA, IndexB: integer);
136
var
177
var
137
  bakPicture: TPictureDef;
178
  bakPicture: TPictureDef;
Line 144... Line 185...
144
  CopyMemory(@bakPicture, @Self.pictures[IndexA], SizeOf(TPictureDef));
185
  CopyMemory(@bakPicture, @Self.pictures[IndexA], SizeOf(TPictureDef));
145
  CopyMemory(@Self.pictures[IndexA], @Self.pictures[IndexB], SizeOf(TPictureDef));
186
  CopyMemory(@Self.pictures[IndexA], @Self.pictures[IndexB], SizeOf(TPictureDef));
146
  CopyMemory(@Self.pictures[IndexB], @bakPicture, SizeOf(TPictureDef));
187
  CopyMemory(@Self.pictures[IndexB], @bakPicture, SizeOf(TPictureDef));
147
end;
188
end;
148
 
189
 
149
function TGameBinFile.AddPictureBetween(Index: integer): PPictureDef;
190
function TGameBinFile.AddPictureBetween(Index: integer; assignToUpperScene: boolean=true): PPictureDef;
-
 
191
 
-
 
192
  function _HasBuffer(Index: integer): boolean;
-
 
193
  var
-
 
194
    iScene: integer;
-
 
195
  begin
-
 
196
    for iScene := 0 to Self.numScenes-1 do
-
 
197
    begin
-
 
198
      if Self.scenes[iScene].pictureIndex = Index+1 then
-
 
199
      begin
-
 
200
        result := true;
-
 
201
        exit;
-
 
202
      end;
-
 
203
    end;
-
 
204
    result := false;
-
 
205
  end;
-
 
206
 
150
var
207
var
151
  iScene: integer;
208
  iScene: integer;
152
begin
209
begin
153
  if Self.numPics >= Length(Self.pictures) then raise Exception.Create('No more space for another picture');
210
  if Self.numPics >= Length(Self.pictures) then raise Exception.Create('No more space for another picture');
154
  if ((Index < 0) or (Index >= Length(Self.pictures))) then raise Exception.Create('Invalid picture index');
211
  if ((Index < 0) or (Index >= Length(Self.pictures))) then raise Exception.Create('Invalid picture index');
155
 
212
 
-
 
213
  if assignToUpperScene then
-
 
214
  begin
-
 
215
    // Sc1   Sc2       Sc1   Sc2
-
 
216
    // A B | C    ==>  A B | X C
-
 
217
    //       ^
156
  for iScene := 0 to Self.numScenes-1 do
218
    for iScene := 0 to Self.numScenes-1 do
157
  begin
219
    begin
158
    if (Index >= Self.scenes[iScene].pictureIndex) and
220
      if (Index >= Self.scenes[iScene].pictureIndex) and
159
       (index <= Self.scenes[iScene].pictureIndex + Max(0,Self.scenes[iScene].numPics - 1)) then
221
         (index <= Self.scenes[iScene].pictureIndex + Max(0,Self.scenes[iScene].numPics - 1)) then
160
    begin
222
      begin
161
      Inc(Self.scenes[iScene].numPics);
223
        Inc(Self.scenes[iScene].numPics);
162
    end
224
      end
-
 
225
      else if (index < Self.scenes[iScene].pictureIndex) and not _HasBuffer(index) then
-
 
226
      begin
-
 
227
        Inc(Self.scenes[iScene].pictureIndex);
-
 
228
      end;
-
 
229
    end;
-
 
230
  end
-
 
231
  else
-
 
232
  begin
-
 
233
    // Sc1   Sc2       Sc1     Sc2
-
 
234
    // A B | C    ==>  A B X | C
-
 
235
    //       ^
-
 
236
    for iScene := 0 to Self.numScenes-1 do
-
 
237
    begin
163
    else if (index < Self.scenes[iScene].pictureIndex) then
238
      if (Index >= 1 + Self.scenes[iScene].pictureIndex) and
-
 
239
         (index <= 1 + Self.scenes[iScene].pictureIndex + Max(0,Self.scenes[iScene].numPics-1)) then
-
 
240
      begin
-
 
241
        Inc(Self.scenes[iScene].numPics);
-
 
242
      end
-
 
243
      else if (index <= Self.scenes[iScene].pictureIndex) and not _HasBuffer(index) then
164
    begin
244
      begin
165
      Inc(Self.scenes[iScene].pictureIndex);
245
        Inc(Self.scenes[iScene].pictureIndex);
166
    end;
246
      end;
167
  end;
247
    end;
-
 
248
  end;
168
 
249
 
169
  result := @Self.pictures[Index];
250
  result := @Self.pictures[Index];
-
 
251
  if not _HasBuffer(index) then
-
 
252
  begin
170
  CopyMemory(@Self.pictures[Index+1], result, (Length(Self.pictures)-Index-1)*SizeOf(TPictureDef));
253
    CopyMemory(@Self.pictures[Index+1], result, (Length(Self.pictures)-Index-1)*SizeOf(TPictureDef));
-
 
254
  end;
-
 
255
   
171
  ZeroMemory(result, SizeOf(TPictureDef));
256
  ZeroMemory(result, SizeOf(TPictureDef));
-
 
257
 
-
 
258
  Inc(Self.numPics);
172
end;
259
end;
173
 
260
 
174
end.
261
end.