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. |