Subversion Repositories Kolibri OS

Rev

Rev 762 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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