Subversion Repositories Kolibri OS

Rev

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.