Rev 22 | Rev 24 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 22 | Rev 23 | ||
---|---|---|---|
Line 48... | Line 48... | ||
48 | procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); |
48 | procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); |
49 | private |
49 | private |
50 | NoCloseQuery: boolean; |
50 | NoCloseQuery: boolean; |
51 | CountedSeconds: Integer; |
51 | CountedSeconds: Integer; |
52 | LevelFile: String; |
52 | LevelFile: String; |
53 | LookupFieldCoordinateArray: array of TPoint; |
- | |
54 | PrevPlaygroundMatrixes: array of TPlayGroundMatrix; |
53 | PrevPlaygroundMatrixes: array of TPlayGroundMatrix; |
55 | PlaygroundMatrix: TPlayGroundMatrix; |
54 | PlaygroundMatrix: TPlayGroundMatrix; |
56 | Points: Integer; |
55 | Points: Integer; |
57 | LevelTotalStones: Integer; |
56 | LevelTotalStones: Integer; |
58 | LevelRemovedStones: Integer; |
57 | LevelRemovedStones: Integer; |
Line 96... | Line 95... | ||
96 | 95 | ||
97 | { TMainForm } |
96 | { TMainForm } |
98 | 97 | ||
99 | procedure TMainForm.RedrawStonesFromMatrix(Matrix: TPlayGroundMatrix); |
98 | procedure TMainForm.RedrawStonesFromMatrix(Matrix: TPlayGroundMatrix); |
100 | var |
99 | var |
101 | i, j: integer; |
100 | x, y: integer; |
102 | begin |
101 | begin |
103 | for i := Low(Matrix.Fields) to High(Matrix.Fields) do |
102 | for x := Low(Matrix.Fields) to High(Matrix.Fields) do |
104 | begin |
103 | begin |
105 | for j := Low(Matrix.Fields[i]) to High(Matrix.Fields[i]) do |
104 | for y := Low(Matrix.Fields[x]) to High(Matrix.Fields[x]) do |
106 | begin |
105 | begin |
107 | if Assigned(Matrix.Fields[i][j].Stone) then |
106 | if Assigned(Matrix.Fields[x][y].Stone) then |
108 | begin |
107 | begin |
109 | LoadPictureForType(Matrix.Fields[i][j].FieldType, Matrix.Fields[i][j].Stone.Picture); |
108 | LoadPictureForType(Matrix.Fields[x][y].FieldType, Matrix.Fields[x][y].Stone.Picture); |
110 | StoneDraggingAllow(Matrix.Fields[i][j].Stone, Matrix.FieldState(Matrix.Fields[i][j].FieldType) <> fsAvailable); |
109 | StoneDraggingAllow(Matrix.Fields[x][y].Stone, Matrix.FieldState(Matrix.Fields[x][y].FieldType) <> fsAvailable); |
111 | end; |
110 | end; |
112 | end; |
111 | end; |
113 | end; |
112 | end; |
114 | end; |
113 | end; |
115 | 114 | ||
Line 141... | Line 140... | ||
141 | for i := 0 to Length(PrevPlaygroundMatrixes)-1 do |
140 | for i := 0 to Length(PrevPlaygroundMatrixes)-1 do |
142 | PrevPlaygroundMatrixes[i].ClearMatrix(false); |
141 | PrevPlaygroundMatrixes[i].ClearMatrix(false); |
143 | SetLength(PrevPlaygroundMatrixes, 0); |
142 | SetLength(PrevPlaygroundMatrixes, 0); |
144 | MUndo.Enabled := false; |
143 | MUndo.Enabled := false; |
145 | 144 | ||
146 | SetLength(LookupFieldCoordinateArray, 0); |
- | |
147 | - | ||
148 | if Assigned(Level) then FreeAndNil(Level); |
145 | if Assigned(Level) then FreeAndNil(Level); |
149 | end; |
146 | end; |
150 | 147 | ||
151 | procedure TMainForm.LoadPictureForType(FieldType: TFieldType; Picture: TPicture); |
148 | procedure TMainForm.LoadPictureForType(FieldType: TFieldType; Picture: TPicture); |
152 | begin |
149 | begin |
Line 241... | Line 238... | ||
241 | RefreshPoints; |
238 | RefreshPoints; |
242 | 239 | ||
243 | Inc(LevelRemovedStones); |
240 | Inc(LevelRemovedStones); |
244 | RefreshStonesRemoved; |
241 | RefreshStonesRemoved; |
245 | end; |
242 | end; |
- | 243 | ||
246 | PlayGroundMatrix.Fields[x, y].FieldType := ftEmpty; |
244 | PlayGroundMatrix.Fields[x, y].FieldType := ftEmpty; |
247 | LoadPictureForType(PlayGroundMatrix.Fields[x, y].FieldType, PlayGroundMatrix.Fields[x, y].Stone.Picture); |
245 | LoadPictureForType(PlayGroundMatrix.Fields[x, y].FieldType, PlayGroundMatrix.Fields[x, y].Stone.Picture); |
248 | StoneDraggingAllow(PlayGroundMatrix.Fields[x, y].Stone, false); |
246 | StoneDraggingAllow(PlayGroundMatrix.Fields[x, y].Stone, false); |
249 | end; |
247 | end; |
250 | 248 | ||
Line 279... | Line 277... | ||
279 | 277 | ||
280 | procedure TMainForm.DoJump(SourceTag, DestTag: integer); |
278 | procedure TMainForm.DoJump(SourceTag, DestTag: integer); |
281 | resourcestring |
279 | resourcestring |
282 | LNG_JUMP_LOG = '%d [%d, %d] -> %d [%d, %d];'; |
280 | LNG_JUMP_LOG = '%d [%d, %d] -> %d [%d, %d];'; |
283 | var |
281 | var |
284 | d, s: TPoint; |
282 | d, s: TCoord; |
285 | old_fieldtype: TFieldType; |
283 | old_fieldtype: TFieldType; |
286 | res: Integer; |
284 | res: Integer; |
287 | begin |
285 | begin |
288 | if not MayJump(SourceTag, DestTag) then exit; |
286 | if not MayJump(SourceTag, DestTag) then exit; |
289 | 287 | ||
290 | d := LookupFieldCoordinateArray[DestTag]; |
288 | s := PlaygroundMatrix.IndexToCoord(SourceTag); |
291 | s := LookupFieldCoordinateArray[SourceTag]; |
289 | d := PlaygroundMatrix.IndexToCoord(DestTag); |
292 | 290 | ||
293 | JumpHistory.Add(Format(LNG_JUMP_LOG, [SourceTag+1, s.x+1, s.y+1, DestTag+1, d.x+1, d.y+1])); |
291 | JumpHistory.Add(Format(LNG_JUMP_LOG, [SourceTag+1, s.x+1, s.y+1, DestTag+1, d.x+1, d.y+1])); |
294 | 292 | ||
295 | {$REGION 'Stein entfernen und Punkte vergeben'} |
293 | {$REGION 'Stein entfernen und Punkte vergeben'} |
296 | if Level.GameMode = gmDiagonal then |
294 | if Level.GameMode = gmDiagonal then |
Line 353... | Line 351... | ||
353 | MUndo.Enabled := true; |
351 | MUndo.Enabled := true; |
354 | end; |
352 | end; |
355 | 353 | ||
356 | function TMainForm.MayJump(SourceTag, DestTag: integer): boolean; |
354 | function TMainForm.MayJump(SourceTag, DestTag: integer): boolean; |
357 | var |
355 | var |
358 | s, d: TPoint; |
356 | s, d: TCoord; |
359 | begin |
357 | begin |
360 | d := LookupFieldCoordinateArray[DestTag]; |
358 | s := PlayGroundMatrix.IndexToCoord(SourceTag); |
361 | s := LookupFieldCoordinateArray[SourceTag]; |
359 | d := PlayGroundMatrix.IndexToCoord(DestTag); |
362 | 360 | ||
363 | result := PlaygroundMatrix.CanJump(s.X, s.Y, d.X, d.Y, Level.GameMode = gmDiagonal); |
361 | result := PlaygroundMatrix.CanJump(s.X, s.Y, d.X, d.Y, Level.GameMode = gmDiagonal); |
364 | end; |
362 | end; |
365 | 363 | ||
366 | procedure TMainForm.StoneDragDrop(Sender, Source: TObject; X, Y: Integer); |
364 | procedure TMainForm.StoneDragDrop(Sender, Source: TObject; X, Y: Integer); |
Line 380... | Line 378... | ||
380 | index: integer; |
378 | index: integer; |
381 | begin |
379 | begin |
382 | ZeroMemory(@result, SizeOf(result)); |
380 | ZeroMemory(@result, SizeOf(result)); |
383 | if t.Typ = ftFullSpace then exit; |
381 | if t.Typ = ftFullSpace then exit; |
384 | 382 | ||
385 | index := Length(LookupFieldCoordinateArray); |
383 | index := PlaygroundMatrix.CoordToIndex(x, y); |
386 | 384 | ||
387 | newField.FieldType := t.Typ; |
385 | newField.FieldType := t.Typ; |
388 | newField.Goal := t.Goal; |
386 | newField.Goal := t.Goal; |
389 | newField.Panel := DrawStoneBox(x, y, index, indent, t.Goal); |
387 | newField.Panel := DrawStoneBox(x, y, index, indent, t.Goal); |
390 | newField.Stone := DrawStone(t.Typ, newField.Panel); |
388 | newField.Stone := DrawStone(t.Typ, newField.Panel); |
391 | if PlayGroundMatrix.FieldState(t.Typ) = fsStone then Inc(LevelTotalStones); |
- | |
392 | - | ||
393 | SetLength(LookupFieldCoordinateArray, index + 1); |
- | |
394 | LookupFieldCoordinateArray[index].X := x; |
- | |
395 | LookupFieldCoordinateArray[index].Y := y; |
- | |
396 | - | ||
397 | if Length(PlayGroundMatrix.Fields) < x+1 then SetLength(PlayGroundMatrix.Fields, x+1); |
- | |
398 | if Length(PlayGroundMatrix.Fields[x]) < y+1 then SetLength(PlayGroundMatrix.Fields[x], y+1); |
- | |
399 | PlaygroundMatrix.Fields[x, y] := newField; |
- | |
400 | 389 | ||
401 | result := newField; |
390 | result := newField; |
402 | end; |
391 | end; |
403 | 392 | ||
404 | procedure TMainForm.BuildPlayground(LevelArray: TLevelArray); |
393 | procedure TMainForm.BuildPlayground(LevelArray: TLevelArray); |
405 | var |
394 | var |
406 | y, x: integer; |
395 | y, x: integer; |
407 | max_x, max_y: integer; |
396 | max_x, max_y: integer; |
408 | p: TPanel; |
397 | p: TPanel; |
- | 398 | newField: TField; |
|
409 | begin |
399 | begin |
410 | PlayGround.Visible := false; |
400 | PlayGround.Visible := false; |
411 | 401 | ||
412 | // Die Dimensionen ermitteln |
402 | // Attention: PlaygroundMatrix is indexed [x,y] while LevelArray is indexed [y,x] |
- | 403 | // TODO: PlaygroundMatrix and LevelArray are redundant. Can't we just replace one with the other? |
|
- | 404 | PlaygroundMatrix.InitFieldArray(Length(LevelArray[0].Fields), Length(LevelArray)); |
|
- | 405 | ||
413 | max_x := 0; |
406 | max_x := 0; |
414 | max_y := 0; |
407 | max_y := 0; |
415 | for y := Low(LevelArray) to High(LevelArray) do |
408 | for y := Low(LevelArray) to High(LevelArray) do |
416 | begin |
409 | begin |
417 | for x := Low(LevelArray[y].Fields) to High(LevelArray[y].Fields) do |
410 | for x := Low(LevelArray[y].Fields) to High(LevelArray[y].Fields) do |
418 | begin |
411 | begin |
- | 412 | if TPlayGroundMatrix.FieldState(LevelArray[y].Fields[x].Typ) = fsStone then |
|
- | 413 | Inc(LevelTotalStones); |
|
419 | p := DrawField(x, y, LevelArray[y].Fields[x], LevelArray[y].Indent).Panel; |
414 | newField := DrawField(x, y, LevelArray[y].Fields[x], LevelArray[y].Indent); |
- | 415 | PlaygroundMatrix.Fields[x, y] := newField; |
|
- | 416 | p := newField.Panel; |
|
420 | if Assigned(p) then |
417 | if Assigned(p) then |
421 | begin |
418 | begin |
422 | max_x := Max(max_x, p.Left + p.Width); |
419 | max_x := Max(max_x, p.Left + p.Width); |
423 | max_y := Max(max_y, p.Top + p.Height); |
420 | max_y := Max(max_y, p.Top + p.Height); |
424 | end; |
421 | end; |