Subversion Repositories Kolibri OS

Rev

Rev 762 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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