3,7 → 3,7 |
interface |
|
uses |
SysUtils, Dialogs, Functions, Classes; |
SysUtils, Dialogs, Functions, ExtCtrls, Classes, Math; |
|
type |
TFieldType = (ftUndefined, ftFullSpace, ftEmpty, ftRed, ftYellow, ftGreen); |
20,16 → 20,16 |
gsLastStoneInGoalGreen, gsLastStoneOutsideGoal); |
|
TCoord = record |
X: integer; // fields. not pixels |
Y: integer; // fields. not pixels |
X: integer; |
Y: integer; |
end; |
|
TField = record |
Indent: integer; // half steps |
Indent: integer; |
FieldType: TFieldType; |
Goal: Boolean; |
Data: TObject; // can be used to hold VCL references. Is not cloned when calling CloneMatrix! |
function FieldState: TFieldState; |
Panel: TPanel; |
Stone: TImage; |
end; |
|
TPlayGroundMatrix = record |
42,6 → 42,8 |
function MatrixWorth: integer; |
procedure ClearMatrix(FreeVCL: boolean); |
function CloneMatrix: TPlayGroundMatrix; |
class function FieldState(t: TFieldType): TFieldState; overload; static; |
function FieldState(f: TField): TFieldState; overload; |
function FieldState(x, y: integer): TFieldState; overload; |
function FieldState(c: TCoord): TFieldState; overload; |
function CanJump(SourceX, SourceY, DestX, DestY: integer; DiagonalOK: boolean): boolean; overload; |
206,7 → 208,8 |
begin |
for y := Low(Fields[x]) to High(Fields[x]) do |
begin |
if Assigned(Fields[x,y].Data) then Fields[x,y].Data.Free; |
if Assigned(Fields[x,y].Stone) then Fields[x,y].Stone.Free; |
if Assigned(Fields[x,y].Panel) then Fields[x,y].Panel.Free; |
end; |
end; |
end; |
225,7 → 228,8 |
begin |
result.Fields[x,y].FieldType := Fields[x,y].FieldType; |
result.Fields[x,y].Goal := Fields[x,y].Goal; |
result.Fields[x,y].Data := Fields[x,y].Data; |
result.Fields[x,y].Panel := Fields[x,y].Panel; |
result.Fields[x,y].Stone := Fields[x,y].Stone; |
end; |
end; |
end; |
245,6 → 249,23 |
result := CoordToIndex(coord.X, coord.Y); |
end; |
|
class function TPlayGroundMatrix.FieldState(t: TFieldType): TFieldState; |
begin |
result := fsUndefined; |
case t of |
ftFullSpace: result := fsLocked; |
ftEmpty: result := fsAvailable; |
ftGreen: result := fsOccupied; |
ftYellow: result := fsOccupied; |
ftRed: result := fsOccupied; |
end; |
end; |
|
function TPlayGroundMatrix.FieldState(f: TField): TFieldState; |
begin |
result := FieldState(f.FieldType); |
end; |
|
function TPlayGroundMatrix.FieldState(x, y: integer): TFieldState; |
begin |
result := fsUndefined; |
251,7 → 272,7 |
if (x < Low(Fields)) or (x > High(Fields)) then exit; |
if (y < Low(Fields[x])) or (y > High(Fields[x])) then exit; |
|
result := Fields[x,y].FieldState; |
result := FieldState(Fields[x,y]); |
end; |
|
function TPlayGroundMatrix.CanJump(SourceX, SourceY, DestX, DestY: integer; DiagonalOK: boolean): boolean; |
523,18 → 544,4 |
Es ist außerdem eher ein logischer Fehler, kein Fehler in der Levelstruktur! } |
end; |
|
{ TField } |
|
function TField.FieldState: TFieldState; |
begin |
result := fsUndefined; |
case FieldType of |
ftFullSpace: result := fsLocked; |
ftEmpty: result := fsAvailable; |
ftGreen: result := fsOccupied; |
ftYellow: result := fsOccupied; |
ftRed: result := fsOccupied; |
end; |
end; |
|
end. |