Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
670 | bw | 1 | unit LRLEditor; |
2 | |||
3 | interface |
||
4 | |||
5 | uses DOSFileAccess, LRLRoutines, LRLSprites, LRLLevels; |
||
6 | |||
7 | procedure LRLEditLevels; |
||
8 | |||
9 | implementation |
||
10 | |||
11 | var |
||
12 | CurrentLevel: word; |
||
13 | CurrentTool: word; |
||
14 | TotalLevels: word; |
||
15 | MouseX, MouseY: integer; |
||
16 | TimeToRefresh: boolean; |
||
17 | RefreshDelay: word; |
||
18 | RefreshRemain: word; |
||
19 | OldTimer: POINTER; |
||
20 | |||
21 | procedure LRLRedrawLevel; |
||
22 | var |
||
23 | i, j: integer; |
||
24 | begin |
||
25 | ImageClear(LRLScreen^); |
||
26 | for i := 1 to 16 do |
||
27 | for j := 1 to 30 do |
||
28 | with LRLLevel.Field[j, i] do |
||
29 | ImagePut(LRLScreen^, LRLEnvironment[Image].Image[Count].Data^, j * 10, i * 10, 0, 0, 319, 199); |
||
30 | for i := 1 to 10 do |
||
31 | with LRLLevel.Player[i] do |
||
32 | begin |
||
33 | if Controller <> 0 then |
||
34 | ImagePutTransparent(LRLScreen^, LRLFigure[Colour, SpriteData].Image[Sprite].Data^, |
||
35 | Position.x * 10 + Position.xoffs, Position.y * 10 + Position.yoffs, 0, 0, 319, 199); |
||
36 | end; |
||
37 | ImageFill(LRLFontBuffer^, 12, 12, 252); |
||
38 | ImagePut(LRLScreen^, LRLFontBuffer^, 10, 184, 0, 0, 319, 199); |
||
39 | for i := 1 to 13 do |
||
40 | begin |
||
41 | if i > 9 then |
||
42 | ImagePut(LRLScreen^, LRLFigure[i - 9, 1].Image[1].Data^, i * 15 - 4, 185, 0, 0, 319, 199) |
||
43 | else |
||
44 | ImagePut(LRLScreen^, LRLEnvironment[i].Image[1].Data^, i * 15 - 4, 185, 0, 0, 319, 199); |
||
45 | end; |
||
46 | for i := 1 to 6 do |
||
47 | begin |
||
48 | if LRLEditorButton[i].Lit then |
||
49 | ImagePut(LRLScreen^, LRLEditorButton[i].LightIcon^, LRLEditorButton[i].x1, |
||
50 | LRLEditorButton[i].y1, 0, 0, 319, 199) |
||
51 | else |
||
52 | ImagePut(LRLScreen^, LRLEditorButton[i].DarkIcon^, LRLEditorButton[i].x1, |
||
53 | LRLEditorButton[i].y1, 0, 0, 319, 199); |
||
54 | end; |
||
55 | LRLDrawOrnamental(0, 0, 31, 17, 1); |
||
56 | end; |
||
57 | |||
58 | procedure RefreshRunner; |
||
59 | {INTERRUPT; |
||
60 | ASSEMBLER;} |
||
61 | asm |
||
62 | DEC RefreshRemain |
||
63 | JNZ @DoTimer |
||
64 | |||
65 | MOV AX,RefreshDelay |
||
66 | MOV RefreshRemain,AX |
||
67 | MOV TimeToRefresh,-1 |
||
68 | |||
69 | @DoTimer: |
||
70 | PUSHF |
||
71 | CALL OldTimer |
||
72 | end; |
||
73 | |||
74 | procedure LRLMoveMouse; |
||
75 | var |
||
76 | s, s2: string[20]; |
||
77 | begin |
||
78 | MSMouseGetXY(Mousex, Mousey); |
||
79 | if not MSMouseInArea(200, 180, 325, 205) then |
||
80 | begin |
||
81 | if CurrentTool < 10 then |
||
82 | ImagePut(LRLScreen^, LRLEnvironment[CurrentTool].Image[1].Data^, |
||
83 | Mousex - 5, Mousey - 5, 0, 0, 319, 199) |
||
84 | else |
||
85 | ImagePut(LRLScreen^, LRLFigure[CurrentTool - 9, 1].Image[1].Data^, |
||
86 | Mousex - 5, Mousey - 5, 0, 0, 319, 199); |
||
87 | end; |
||
88 | if not MSMouseInArea(-2, -2, 55, 20) then |
||
89 | begin |
||
90 | ImageFill(LRLFontBuffer^, 50, 15, 0); |
||
91 | ImagePut(LRLScreen^, LRLFontBuffer^, 0, 0, 0, 0, 319, 199); |
||
92 | STR(CurrentLevel, s); |
||
93 | STR(TotalLevels, s2); |
||
94 | ImageStringGet(s + '/' + s2, LRLFont^, LRLFontBuffer^, 251); |
||
95 | ImagePut(LRLScreen^, LRLFontBuffer^, 25 - ImageSizex(LRLFontBuffer^) div 2, 0, 0, 0, 319, 199); |
||
96 | end; |
||
97 | ImagePutTransparent(LRLScreen^, LRLMousePointer^, Mousex, Mousey, 0, 0, 319, 199); |
||
98 | end; |
||
99 | |||
100 | procedure RePress; |
||
101 | var |
||
102 | x, y: integer; |
||
103 | begin |
||
104 | MSMouseButtonWasPressed(1, x, y); |
||
105 | MSMouseButtonWasReleased(1, x, y); |
||
106 | MSMouseButtonWasPressed(4, x, y); |
||
107 | MSMouseButtonWasReleased(4, x, y); |
||
108 | end; |
||
109 | |||
110 | procedure LRLEditLevels; |
||
111 | var |
||
112 | Keypress: word; |
||
113 | NeedToFade: boolean; |
||
114 | DrawNow: boolean; |
||
115 | i, j: integer; |
||
116 | x, y: integer; |
||
117 | Cmd: word; |
||
118 | begin |
||
119 | if not MSMouseDriverExist then Exit; |
||
120 | Repress; |
||
121 | ShowLives := False; |
||
122 | ShowScore := False; |
||
123 | Palette256Set(LRLPalette^); |
||
124 | OldTimer := SetInterrupt($8, @RefreshRunner); |
||
125 | Keypress := 0; |
||
126 | RefreshDelay := 1; |
||
127 | RefreshRemain := 1; |
||
128 | CurrentLevel := 1; |
||
129 | CurrentTool := 2; |
||
130 | TotalLevels := LRLLevelCount; |
||
131 | TimeToRefresh := True; |
||
132 | DrawNow := False; |
||
133 | MSMouseSetXY(160, 100); |
||
134 | LRLLoadLevel(CurrentLevel); |
||
135 | repeat |
||
136 | if TimeToRefresh then |
||
137 | begin |
||
138 | LRLRedrawLevel; |
||
139 | LRLMoveMouse; |
||
140 | ScreenApply(LRLScreen^); |
||
141 | TimeToRefresh := False; |
||
142 | end; |
||
143 | if Keypressed then |
||
144 | begin |
||
145 | Keypress := Readkey; |
||
146 | end; |
||
147 | if MSMouseButtonWasReleased(1, x, y) then |
||
148 | begin |
||
149 | LRLScore := 0; |
||
150 | FadeClear; |
||
151 | ImageClear(LRLScreen^); |
||
152 | ScreenApply(LRLScreen^); |
||
153 | Palette256Set(LRLPalette^); |
||
154 | LRLPlayLevel(CurrentLevel); |
||
155 | FadeClear; |
||
156 | ImageClear(LRLScreen^); |
||
157 | ScreenApply(LRLScreen^); |
||
158 | Palette256Set(LRLPalette^); |
||
159 | LRLLoadLevel(CurrentLevel); |
||
160 | Repress; |
||
161 | end; |
||
162 | if MSMouseButtonWasPressed(0, x, y) then |
||
163 | begin |
||
164 | DrawNow := True; |
||
165 | end; |
||
166 | if MSMouseButtonWasReleased(0, x, y) then |
||
167 | begin |
||
168 | DrawNow := False; |
||
169 | Cmd := 0; |
||
170 | for i := 1 to 6 do |
||
171 | LRLEditorButton[i].Lit := False; |
||
172 | for i := 1 to 6 do |
||
173 | begin |
||
174 | if MSMouseInArea(LRLEditorButton[i].x1, LRLEditorButton[i].y1, |
||
175 | LRLEditorButton[i].x2, LRLEditorButton[i].y2) then |
||
176 | begin |
||
177 | Cmd := LRLEditorButton[i].Command; |
||
178 | BREAK; |
||
179 | end; |
||
180 | end; |
||
181 | if (Cmd = 1) then |
||
182 | LRLSaveLevel(CurrentLevel); |
||
183 | Repress; |
||
184 | if (Cmd = 2) then |
||
185 | begin |
||
186 | LRLInsertLevel(CurrentLevel); |
||
187 | Inc(CurrentLevel); |
||
188 | TotalLevels := LRLLevelCount; |
||
189 | LRLLoadLevel(CurrentLevel); |
||
190 | Repress; |
||
191 | end; |
||
192 | if (Cmd = 3) and (CurrentLevel < TotalLevels) then |
||
193 | begin |
||
194 | Inc(CurrentLevel); |
||
195 | LRLLoadLevel(CurrentLevel); |
||
196 | Repress; |
||
197 | end; |
||
198 | if (Cmd = 4) then |
||
199 | begin |
||
200 | for i := 1 to 16 do |
||
201 | for j := 1 to 30 do |
||
202 | LRLLevel.Field[j, i].Image := 1; |
||
203 | for i := 1 to 10 do |
||
204 | LRLLevel.Player[i].Controller := 0; |
||
205 | Repress; |
||
206 | end; |
||
207 | if (Cmd = 5) and (TotalLevels > 1) then |
||
208 | begin |
||
209 | LRLDeleteLevel(CurrentLevel); |
||
210 | TotalLevels := LRLLevelCount; |
||
211 | if CurrentLevel > TotalLevels then |
||
212 | CurrentLevel := TotalLevels; |
||
213 | LRLLoadLevel(CurrentLevel); |
||
214 | Repress; |
||
215 | end; |
||
216 | if (Cmd = 6) and (CurrentLevel > 1) then |
||
217 | begin |
||
218 | Dec(CurrentLevel); |
||
219 | LRLLoadLevel(CurrentLevel); |
||
220 | Repress; |
||
221 | end; |
||
222 | MSMouseGetXY(Mousex, Mousey); |
||
223 | if (Mousey > 180) then |
||
224 | begin |
||
225 | for i := 1 to 13 do |
||
226 | begin |
||
227 | if (Mousey > 184) and (Mousey < 195) and (Mousex > i * 15 - 5) and (Mousex < i * 15 + 6) then |
||
228 | begin |
||
229 | CurrentTool := i; |
||
230 | BREAK; |
||
231 | end; |
||
232 | end; |
||
233 | end; |
||
234 | end; |
||
235 | if DrawNow then |
||
236 | begin |
||
237 | for i := 1 to 6 do |
||
238 | LRLEditorButton[i].Lit := False; |
||
239 | for i := 1 to 6 do |
||
240 | begin |
||
241 | if MSMouseInArea(LRLEditorButton[i].x1, LRLEditorButton[i].y1, |
||
242 | LRLEditorButton[i].x2, LRLEditorButton[i].y2) then |
||
243 | begin |
||
244 | LRLEditorButton[i].Lit := True; |
||
245 | BREAK; |
||
246 | end; |
||
247 | end; |
||
248 | MSMouseGetXY(Mousex, Mousey); |
||
249 | x := (Mousex) div 10; |
||
250 | y := (Mousey) div 10; |
||
251 | if (x > 0) and (x < 31) and (y > 0) and (y < 17) then |
||
252 | begin |
||
253 | for i := 1 to 10 do |
||
254 | begin |
||
255 | if (LRLLevel.Player[i].Controller <> 0) and (LRLLevel.Player[i].Position.x = x) and |
||
256 | (LRLLevel.Player[i].Position.y = y) then |
||
257 | begin |
||
258 | if (CurrentTool <> 2) and (CurrentTool <> 3) and (CurrentTool <> 4) and |
||
259 | (CurrentTool <> 7) then |
||
260 | begin |
||
261 | LRLLevel.Player[i].Controller := 0; |
||
262 | BREAK; |
||
263 | end; |
||
264 | end; |
||
265 | end; |
||
266 | if CurrentTool < 10 then |
||
267 | LRLLevel.Field[x, y].Image := CurrentTool |
||
268 | else |
||
269 | begin |
||
270 | if (LRLLevel.Field[x, y].Image = 2) or (LRLLevel.Field[x, y].Image = 3) or |
||
271 | (LRLLevel.Field[x, y].Image = 4) or (LRLLevel.Field[x, y].Image = 1) then |
||
272 | begin |
||
273 | if CurrentTool = 10 then |
||
274 | begin |
||
275 | LRLLevel.Player[1].Controller := 1; |
||
276 | LRLLevel.Player[1].Position.x := x; |
||
277 | LRLLevel.Player[1].Position.y := y; |
||
278 | LRLLevel.Player[1].Colour := 1; |
||
279 | end |
||
280 | else |
||
281 | begin |
||
282 | j := 2; |
||
283 | for i := 2 to 10 do |
||
284 | begin |
||
285 | if LRLLevel.Player[i].Controller = 0 then |
||
286 | begin |
||
287 | j := i; |
||
288 | BREAK; |
||
289 | end; |
||
290 | end; |
||
291 | LRLLevel.Player[j].Controller := 2; |
||
292 | LRLLevel.Player[j].Position.x := x; |
||
293 | LRLLevel.Player[j].Position.y := y; |
||
294 | LRLLevel.Player[j].Colour := CurrentTool - 9; |
||
295 | end; |
||
296 | end; |
||
297 | end; |
||
298 | end; |
||
299 | end; |
||
300 | until (LO(Keypress) = 27); |
||
301 | SetInterrupt($8, OldTimer); |
||
302 | end; |
||
303 | |||
304 | end.>>>>>>>>>>>>> |