Rev 19 | Rev 22 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 19 | Rev 21 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | unit LevelFunctions; |
1 | unit LevelFunctions; |
2 | 2 | ||
3 | interface |
3 | interface |
4 | 4 | ||
5 | uses |
5 | uses |
6 | SysUtils, Dialogs, Functions, ExtCtrls, Graphics, Classes, Math; |
6 | SysUtils, Dialogs, Functions, ExtCtrls, Classes, Math; |
7 | 7 | ||
8 | type |
8 | type |
9 | TFieldType = (ftUndefined, ftFullSpace, ftEmpty, ftRed, ftYellow, ftGreen); |
9 | TFieldType = (ftUndefined, ftFullSpace, ftEmpty, ftRed, ftYellow, ftGreen); |
10 | 10 | ||
11 | TFieldProperties = record |
11 | TFieldProperties = record |
Line 35... | Line 35... | ||
35 | function CheckLevelIntegrity: TLevelError; overload; |
35 | function CheckLevelIntegrity: TLevelError; overload; |
36 | function CheckLevelIntegrity(ShowErrors: boolean): TLevelError; overload; |
36 | function CheckLevelIntegrity(ShowErrors: boolean): TLevelError; overload; |
37 | function GetGameMode: TGameMode; |
37 | function GetGameMode: TGameMode; |
38 | end; |
38 | end; |
39 | 39 | ||
- | 40 | TField = record |
|
- | 41 | FieldType: TFieldType; |
|
- | 42 | Goal: Boolean; |
|
- | 43 | Panel: TPanel; |
|
- | 44 | Stone: TImage; |
|
- | 45 | end; |
|
- | 46 | ||
- | 47 | TGoalStatus = (gsUndefined, gsNoGoal, gsMultipleStonesRemaining, gsLastStoneInGoalRed, gsLastStoneInGoalYellow, gsLastStoneInGoalGreen, gsLastStoneOutsideGoal); |
|
- | 48 | ||
- | 49 | TFieldState = (fsUndefined, fsError, fsLocked, fsAvailable, fsStone); |
|
- | 50 | ||
- | 51 | TPlayGroundMatrix = record |
|
- | 52 | Fields: array of array of TField; |
|
- | 53 | public |
|
- | 54 | function MatrixHasGoal: boolean; |
|
- | 55 | function GoalFieldType: TFieldType; |
|
- | 56 | function MatrixWorth: integer; |
|
- | 57 | procedure ClearMatrix(FreeVCL: boolean); |
|
- | 58 | function CloneMatrix: TPlayGroundMatrix; |
|
40 | procedure DrawLevelPreview(Level: TLevel; Image: TImage; BackgroundColor: TColor); |
59 | function FieldState(t: TFieldType): TFieldState; overload; |
- | 60 | function FieldState(f: TField): TFieldState; overload; |
|
- | 61 | function FieldState(x, y: integer): TFieldState; overload; |
|
- | 62 | end; |
|
- | 63 | ||
41 | function FieldTypeWorth(t: TFieldType): integer; |
64 | function FieldTypeWorth(t: TFieldType): integer; |
42 | 65 | ||
43 | implementation |
66 | implementation |
44 | 67 | ||
45 | procedure DrawLevelPreview(Level: TLevel; Image: TImage; BackgroundColor: TColor); |
- | |
46 | var |
- | |
47 | LevelArray: TLevelArray; |
- | |
48 | y, x: integer; |
- | |
49 | t: TFieldType; |
- | |
50 | indent: Integer; |
- | |
51 | const |
- | |
52 | PREVIEW_BLOCK_SIZE = 10; // Enthält Field und Abstand |
68 | function FieldTypeWorth(t: TFieldType): integer; |
53 | PREVIEW_TAB_SIZE = PREVIEW_BLOCK_SIZE div 2; // 5 |
- | |
54 | begin |
69 | begin |
- | 70 | if t = ftGreen then result := 10 |
|
- | 71 | else if t = ftYellow then result := 20 |
|
- | 72 | else if t = ftRed then result := 30 |
|
55 | LevelArray := nil; |
73 | else result := 0; |
- | 74 | end; |
|
56 | 75 | ||
57 | ClearImage(Image, BackgroundColor); |
76 | { TPlayGroundMatrix } |
58 | 77 | ||
- | 78 | function TPlayGroundMatrix.MatrixHasGoal: boolean; |
|
- | 79 | var |
|
- | 80 | i, j: integer; |
|
- | 81 | begin |
|
- | 82 | result := false; |
|
- | 83 | for i := Low(Fields) to High(Fields) do |
|
- | 84 | begin |
|
59 | LevelArray := Level.LevelStringToLevelArray(false); |
85 | for j := Low(Fields[i]) to High(Fields[i]) do |
- | 86 | begin |
|
- | 87 | result := result or Fields[i][j].Goal; |
|
- | 88 | end; |
|
- | 89 | end; |
|
- | 90 | end; |
|
60 | 91 | ||
61 | for y := Low(LevelArray) to High(LevelArray) do |
92 | function TPlayGroundMatrix.GoalFieldType: TFieldType; |
- | 93 | var |
|
- | 94 | i, j: integer; |
|
62 | begin |
95 | begin |
- | 96 | result := ftEmpty; // Damit der Compiler nicht meckert |
|
63 | for x := Low(LevelArray[y].Fields) to High(LevelArray[y].Fields) do |
97 | for i := Low(Fields) to High(Fields) do |
64 | begin |
98 | begin |
65 | t := LevelArray[y].Fields[x].Typ; |
99 | for j := Low(Fields[i]) to High(Fields[i]) do |
- | 100 | begin |
|
66 | indent := LevelArray[y].Indent; |
101 | if Fields[i][j].Goal then result := Fields[i][j].FieldType |
- | 102 | end; |
|
- | 103 | end; |
|
- | 104 | end; |
|
67 | 105 | ||
- | 106 | function TPlayGroundMatrix.MatrixWorth: integer; |
|
- | 107 | var |
|
68 | case t of |
108 | i, j: integer; |
- | 109 | begin |
|
69 | ftFullSpace: Image.Canvas.Brush.Color := BackgroundColor; |
110 | result := 0; |
70 | ftEmpty: Image.Canvas.Brush.Color := clWhite; |
111 | for i := Low(Fields) to High(Fields) do |
- | 112 | begin |
|
71 | ftGreen: Image.Canvas.Brush.Color := clLime; |
113 | for j := Low(Fields[i]) to High(Fields[i]) do |
- | 114 | begin |
|
72 | ftYellow: Image.Canvas.Brush.Color := clYellow; |
115 | Inc(result, FieldTypeWorth(Fields[i][j].FieldType)); |
73 | ftRed: Image.Canvas.Brush.Color := clRed; |
116 | end; |
- | 117 | end; |
|
74 | end; |
118 | end; |
75 | 119 | ||
- | 120 | procedure TPlayGroundMatrix.ClearMatrix(FreeVCL: boolean); |
|
- | 121 | var |
|
- | 122 | i, j: integer; |
|
- | 123 | begin |
|
76 | if LevelArray[y].Fields[x].Goal then |
124 | for i := Low(Fields) to High(Fields) do |
- | 125 | begin |
|
77 | Image.Canvas.Pen.Color := clBlack |
126 | for j := Low(Fields[i]) to High(Fields[i]) do |
- | 127 | begin |
|
- | 128 | if FreeVCL then |
|
78 | else |
129 | begin |
- | 130 | if Assigned(Fields[i][j].Stone) then Fields[i][j].Stone.Free; |
|
79 | Image.Canvas.Pen.Color := BackgroundColor; |
131 | if Assigned(Fields[i][j].Panel) then Fields[i][j].Panel.Free; |
- | 132 | end; |
|
- | 133 | end; |
|
- | 134 | SetLength(Fields[i], 0); |
|
- | 135 | end; |
|
- | 136 | SetLength(Fields, 0); |
|
- | 137 | end; |
|
80 | 138 | ||
- | 139 | function TPlayGroundMatrix.CloneMatrix: TPlayGroundMatrix; |
|
- | 140 | var |
|
- | 141 | i, j: integer; |
|
- | 142 | begin |
|
- | 143 | SetLength(result.Fields, Length(Fields)); |
|
- | 144 | for i := Low(Fields) to High(Fields) do |
|
- | 145 | begin |
|
- | 146 | SetLength(result.Fields[i], Length(Fields[i])); |
|
- | 147 | for j := Low(Fields[i]) to High(Fields[i]) do |
|
- | 148 | begin |
|
81 | Image.Canvas.Rectangle(x*PREVIEW_BLOCK_SIZE + indent*PREVIEW_TAB_SIZE, |
149 | result.Fields[i][j].FieldType := Fields[i][j].FieldType; |
82 | y*PREVIEW_BLOCK_SIZE, |
150 | result.Fields[i][j].Goal := Fields[i][j].Goal; |
83 | x*PREVIEW_BLOCK_SIZE + indent*PREVIEW_TAB_SIZE + PREVIEW_BLOCK_SIZE, |
151 | result.Fields[i][j].Panel := Fields[i][j].Panel; |
84 | y*PREVIEW_BLOCK_SIZE + PREVIEW_BLOCK_SIZE); |
152 | result.Fields[i][j].Stone := Fields[i][j].Stone; |
85 | end; |
153 | end; |
86 | end; |
154 | end; |
87 | end; |
155 | end; |
88 | 156 | ||
89 | function FieldTypeWorth(t: TFieldType): integer; |
157 | function TPlayGroundMatrix.FieldState(t: TFieldType): TFieldState; |
90 | begin |
158 | begin |
- | 159 | result := fsError; |
|
- | 160 | case t of |
|
- | 161 | ftFullSpace: result := fsLocked; |
|
- | 162 | ftEmpty: result := fsAvailable; |
|
91 | if t = ftGreen then result := 10 |
163 | ftGreen: result := fsStone; |
92 | else if t = ftYellow then result := 20 |
164 | ftYellow: result := fsStone; |
93 | else if t = ftRed then result := 30 |
165 | ftRed: result := fsStone; |
- | 166 | end; |
|
- | 167 | end; |
|
- | 168 | ||
- | 169 | function TPlayGroundMatrix.FieldState(f: TField): TFieldState; |
|
- | 170 | begin |
|
- | 171 | result := FieldState(f.FieldType); |
|
- | 172 | end; |
|
- | 173 | ||
- | 174 | function TPlayGroundMatrix.FieldState(x, y: integer): TFieldState; |
|
- | 175 | begin |
|
94 | else result := 0; |
176 | result := fsError; |
- | 177 | if (x < Low(Fields)) or (x > High(Fields)) then exit; |
|
- | 178 | if (y < Low(Fields[x])) or (y > High(Fields[x])) then exit; |
|
- | 179 | ||
- | 180 | result := FieldState(Fields[x][y]); |
|
95 | end; |
181 | end; |
96 | 182 | ||
97 | { TLevel } |
183 | { TLevel } |
98 | 184 | ||
99 | const NUM_HEADERS = 2; |
185 | const NUM_HEADERS = 2; |
Line 135... | Line 221... | ||
135 | FStringList.Strings[i] := StringReplace(FStringList.Strings[i], ' ', '', [rfReplaceAll]); |
221 | FStringList.Strings[i] := StringReplace(FStringList.Strings[i], ' ', '', [rfReplaceAll]); |
136 | if FStringList.Strings[i] = '' then FStringList.Delete(i); |
222 | if FStringList.Strings[i] = '' then FStringList.Delete(i); |
137 | end; |
223 | end; |
138 | end; |
224 | end; |
139 | 225 | ||
140 | function DotsAtBeginning(s: string): integer; |
- | |
141 | var |
- | |
142 | i: integer; |
- | |
143 | begin |
- | |
144 | result := 0; |
- | |
145 | for i := 1 to Length(s) do |
- | |
146 | begin |
- | |
147 | if s[i] = '.' then |
- | |
148 | Inc(result) |
- | |
149 | else |
- | |
150 | Exit; |
- | |
151 | end; |
- | |
152 | end; |
- | |
153 | - | ||
154 | function DotsAtEnd(s: string): integer; |
- | |
155 | var |
- | |
156 | i: integer; |
- | |
157 | begin |
- | |
158 | result := 0; |
- | |
159 | for i := Length(s) downto 1 do |
- | |
160 | begin |
- | |
161 | if s[i] = '.' then |
- | |
162 | Inc(result) |
- | |
163 | else |
- | |
164 | Exit; |
- | |
165 | end; |
- | |
166 | end; |
- | |
167 | - | ||
168 | function TLevel.LevelStringToLevelArray(ShowErrors: boolean): TLevelArray; |
226 | function TLevel.LevelStringToLevelArray(ShowErrors: boolean): TLevelArray; |
169 | var |
227 | var |
170 | i: integer; |
228 | i: integer; |
171 | t: TFieldType; |
229 | t: TFieldType; |
172 | err: TLevelError; |
230 | err: TLevelError; |