1,138 → 1,135 |
unit LRLEditor; |
|
{$mode objfpc} |
{$asmmode intel} |
|
|
interface |
|
uses DOSFileAccess, LRLRoutines, LRLSprites, LRLLevels; |
|
uses |
LRLRoutines, LRLSprites, LRLLevels; |
|
|
procedure LRLEditLevels; |
|
|
implementation |
|
|
const |
RefreshDelay = 5; { 1 = 1/100 sec } |
|
var |
CurrentLevel: word; |
CurrentTool: word; |
TotalLevels: word; |
MouseX, MouseY: integer; |
TimeToRefresh: boolean; |
RefreshDelay: word; |
RefreshRemain: word; |
OldTimer: POINTER; |
CurrentLevel: Word; |
CurrentTool: Word; |
TotalLevels: Word; |
MouseX, MouseY: Integer; |
|
TimeToRefresh : Boolean; |
LastRefreshTime: DWord; |
|
|
procedure LRLRedrawLevel; |
var |
i, j: integer; |
i, j: Integer; |
begin |
ImageClear(LRLScreen^); |
for i := 1 to 16 do |
for j := 1 to 30 do |
|
for i := 1 to 16 do for j := 1 to 30 do |
with LRLLevel.Field[j, i] do |
ImagePut(LRLScreen^, LRLEnvironment[Image].Image[Count].Data^, j * 10, i * 10, 0, 0, 319, 199); |
|
for i := 1 to 10 do |
with LRLLevel.Player[i] do |
begin |
if Controller <> 0 then |
ImagePutTransparent(LRLScreen^, LRLFigure[Colour, SpriteData].Image[Sprite].Data^, |
Position.x * 10 + Position.xoffs, Position.y * 10 + Position.yoffs, 0, 0, 319, 199); |
end; |
ImagePutTransparent(LRLScreen^, LRLFigure[Colour, SpriteData].Image[Sprite].Data^, Position.x * 10 + Position.xoffs, Position.y * 10 + Position.yoffs, 0, 0, 319, 199); |
|
ImageFill(LRLFontBuffer^, 12, 12, 252); |
ImagePut(LRLScreen^, LRLFontBuffer^, 10, 184, 0, 0, 319, 199); |
|
for i := 1 to 13 do |
begin |
if i > 9 then |
ImagePut(LRLScreen^, LRLFigure[i - 9, 1].Image[1].Data^, i * 15 - 4, 185, 0, 0, 319, 199) |
else |
ImagePut(LRLScreen^, LRLFigure[i - 9, 1].Image[1].Data^, i * 15 - 4, 185, 0, 0, 319, 199) else |
ImagePut(LRLScreen^, LRLEnvironment[i].Image[1].Data^, i * 15 - 4, 185, 0, 0, 319, 199); |
end; |
|
for i := 1 to 6 do |
begin |
if LRLEditorButton[i].Lit then |
ImagePut(LRLScreen^, LRLEditorButton[i].LightIcon^, LRLEditorButton[i].x1, |
LRLEditorButton[i].y1, 0, 0, 319, 199) |
else |
ImagePut(LRLScreen^, LRLEditorButton[i].DarkIcon^, LRLEditorButton[i].x1, |
LRLEditorButton[i].y1, 0, 0, 319, 199); |
end; |
ImagePut(LRLScreen^, LRLEditorButton[i].LightIcon^, LRLEditorButton[i].x1, LRLEditorButton[i].y1, 0, 0, 319, 199) else |
ImagePut(LRLScreen^, LRLEditorButton[i].DarkIcon^, LRLEditorButton[i].x1, LRLEditorButton[i].y1, 0, 0, 319, 199); |
|
LRLDrawOrnamental(0, 0, 31, 17, 1); |
end; |
|
procedure RefreshRunner; |
{INTERRUPT; |
ASSEMBLER;} |
asm |
DEC RefreshRemain |
JNZ @DoTimer |
|
MOV AX,RefreshDelay |
MOV RefreshRemain,AX |
MOV TimeToRefresh,-1 |
|
@DoTimer: |
PUSHF |
CALL OldTimer |
end; |
|
procedure LRLMoveMouse; |
var |
s, s2: string[20]; |
s, s2: String[20]; |
begin |
MSMouseGetXY(Mousex, Mousey); |
MSMouseGetXY(MouseX, MouseY); |
|
if not MSMouseInArea(200, 180, 325, 205) then |
begin |
if CurrentTool < 10 then |
ImagePut(LRLScreen^, LRLEnvironment[CurrentTool].Image[1].Data^, |
Mousex - 5, Mousey - 5, 0, 0, 319, 199) |
else |
ImagePut(LRLScreen^, LRLFigure[CurrentTool - 9, 1].Image[1].Data^, |
Mousex - 5, Mousey - 5, 0, 0, 319, 199); |
end; |
ImagePut(LRLScreen^, LRLEnvironment[CurrentTool].Image[1].Data^, MouseX - 5, MouseY - 5, 0, 0, 319, 199) else |
ImagePut(LRLScreen^, LRLFigure[CurrentTool - 9, 1].Image[1].Data^, MouseX - 5, MouseY - 5, 0, 0, 319, 199); |
|
if not MSMouseInArea(-2, -2, 55, 20) then |
begin |
ImageFill(LRLFontBuffer^, 50, 15, 0); |
ImagePut(LRLScreen^, LRLFontBuffer^, 0, 0, 0, 0, 319, 199); |
STR(CurrentLevel, s); |
STR(TotalLevels, s2); |
Str(CurrentLevel, s); |
Str(TotalLevels, s2); |
ImageStringGet(s + '/' + s2, LRLFont^, LRLFontBuffer^, 251); |
ImagePut(LRLScreen^, LRLFontBuffer^, 25 - ImageSizex(LRLFontBuffer^) div 2, 0, 0, 0, 319, 199); |
end; |
ImagePutTransparent(LRLScreen^, LRLMousePointer^, Mousex, Mousey, 0, 0, 319, 199); |
|
ImagePutTransparent(LRLScreen^, LRLMousePointer^, MouseX, MouseY, 0, 0, 319, 199); |
end; |
|
procedure RePress; |
|
procedure Repress; |
var |
x, y: integer; |
x, y: Integer; |
begin |
MSMouseButtonWasPressed(0, x, y); |
MSMouseButtonWasReleased(0, x, y); |
MSMouseButtonWasPressed(1, x, y); |
MSMouseButtonWasReleased(1, x, y); |
MSMouseButtonWasPressed(4, x, y); |
MSMouseButtonWasReleased(4, x, y); |
end; |
|
|
procedure LRLEditLevels; |
var |
Keypress: word; |
NeedToFade: boolean; |
DrawNow: boolean; |
i, j: integer; |
x, y: integer; |
Cmd: word; |
Keypress: Word; |
DrawNow: Boolean; |
i, j: Integer; |
x, y: Integer; |
Cmd: Word; |
begin |
if not MSMouseDriverExist then Exit; |
Repress; |
Palette256Set(LRLPalette^); |
|
ShowLives := False; |
ShowScore := False; |
Palette256Set(LRLPalette^); |
OldTimer := SetInterrupt($8, @RefreshRunner); |
Keypress := 0; |
RefreshDelay := 1; |
RefreshRemain := 1; |
CurrentLevel := 1; |
CurrentTool := 2; |
TotalLevels := LRLLevelCount; |
|
DrawNow := False; |
TimeToRefresh := True; |
DrawNow := False; |
LastRefreshTime := 0; |
|
MSMouseSetXY(160, 100); |
LRLLoadLevel(CurrentLevel); |
|
WaitForEvent(1); |
|
repeat |
if not TimeToRefresh then |
TimeToRefresh := kos_timecounter() - LastRefreshTime >= RefreshDelay; |
|
if TimeToRefresh then |
begin |
LRLRedrawLevel; |
139,71 → 136,85 |
LRLMoveMouse; |
ScreenApply(LRLScreen^); |
TimeToRefresh := False; |
LastRefreshTime := kos_timecounter(); |
end; |
|
if Keypressed then |
begin |
Keypress := Readkey; |
end; |
|
if MSMouseButtonWasReleased(1, x, y) then |
begin |
LRLScore := 0; |
|
FadeClear; |
ImageClear(LRLScreen^); |
ScreenApply(LRLScreen^); |
Palette256Set(LRLPalette^); |
LRLPlayLevel(CurrentLevel); |
|
FadeClear; |
ImageClear(LRLScreen^); |
ScreenApply(LRLScreen^); |
Palette256Set(LRLPalette^); |
LRLLoadLevel(CurrentLevel); |
|
Repress; |
end; |
|
if MSMouseButtonWasPressed(0, x, y) then |
begin |
DrawNow := True; |
end; |
|
if MSMouseButtonWasReleased(0, x, y) then |
begin |
DrawNow := False; |
|
Cmd := 0; |
|
for i := 1 to 6 do |
LRLEditorButton[i].Lit := False; |
|
for i := 1 to 6 do |
if MSMouseInArea(LRLEditorButton[i].x1, LRLEditorButton[i].y1, LRLEditorButton[i].x2, LRLEditorButton[i].y2) then |
begin |
if MSMouseInArea(LRLEditorButton[i].x1, LRLEditorButton[i].y1, |
LRLEditorButton[i].x2, LRLEditorButton[i].y2) then |
begin |
Cmd := LRLEditorButton[i].Command; |
BREAK; |
Break; |
end; |
end; |
if (Cmd = 1) then |
|
if Cmd = 1 then |
begin |
LRLSaveLevel(CurrentLevel); |
|
Repress; |
if (Cmd = 2) then |
end; |
|
if Cmd = 2 then |
begin |
LRLInsertLevel(CurrentLevel); |
Inc(CurrentLevel); |
TotalLevels := LRLLevelCount; |
LRLLoadLevel(CurrentLevel); |
|
Repress; |
end; |
|
if (Cmd = 3) and (CurrentLevel < TotalLevels) then |
begin |
Inc(CurrentLevel); |
LRLLoadLevel(CurrentLevel); |
|
Repress; |
end; |
if (Cmd = 4) then |
|
if Cmd = 4 then |
begin |
for i := 1 to 16 do |
for j := 1 to 30 do |
for i := 1 to 16 do for j := 1 to 30 do |
LRLLevel.Field[j, i].Image := 1; |
for i := 1 to 10 do |
LRLLevel.Player[i].Controller := 0; |
|
Repress; |
end; |
|
if (Cmd = 5) and (TotalLevels > 1) then |
begin |
LRLDeleteLevel(CurrentLevel); |
211,62 → 222,58 |
if CurrentLevel > TotalLevels then |
CurrentLevel := TotalLevels; |
LRLLoadLevel(CurrentLevel); |
|
Repress; |
end; |
|
if (Cmd = 6) and (CurrentLevel > 1) then |
begin |
Dec(CurrentLevel); |
LRLLoadLevel(CurrentLevel); |
|
Repress; |
end; |
MSMouseGetXY(Mousex, Mousey); |
if (Mousey > 180) then |
begin |
|
MSMouseGetXY(MouseX, MouseY); |
|
if MouseY > 180 then |
for i := 1 to 13 do |
if (MouseY > 184) and (MouseY < 195) and (MouseX > i * 15 - 5) and (MouseX < i * 15 + 6) then |
begin |
if (Mousey > 184) and (Mousey < 195) and (Mousex > i * 15 - 5) and (Mousex < i * 15 + 6) then |
begin |
CurrentTool := i; |
BREAK; |
Break; |
end; |
end; |
end; |
end; |
|
if DrawNow then |
begin |
for i := 1 to 6 do |
LRLEditorButton[i].Lit := False; |
|
for i := 1 to 6 do |
if MSMouseInArea(LRLEditorButton[i].x1, LRLEditorButton[i].y1, LRLEditorButton[i].x2, LRLEditorButton[i].y2) then |
begin |
if MSMouseInArea(LRLEditorButton[i].x1, LRLEditorButton[i].y1, |
LRLEditorButton[i].x2, LRLEditorButton[i].y2) then |
begin |
LRLEditorButton[i].Lit := True; |
BREAK; |
Break; |
end; |
end; |
MSMouseGetXY(Mousex, Mousey); |
x := (Mousex) div 10; |
y := (Mousey) div 10; |
|
MSMouseGetXY(MouseX, MouseY); |
|
x := MouseX div 10; |
y := MouseY div 10; |
|
if (x > 0) and (x < 31) and (y > 0) and (y < 17) then |
begin |
for i := 1 to 10 do |
if (LRLLevel.Player[i].Controller <> 0) and (LRLLevel.Player[i].Position.x = x) and (LRLLevel.Player[i].Position.y = y) and |
(CurrentTool <> 2) and (CurrentTool <> 3) and (CurrentTool <> 4) and (CurrentTool <> 7) then |
begin |
if (LRLLevel.Player[i].Controller <> 0) and (LRLLevel.Player[i].Position.x = x) and |
(LRLLevel.Player[i].Position.y = y) then |
begin |
if (CurrentTool <> 2) and (CurrentTool <> 3) and (CurrentTool <> 4) and |
(CurrentTool <> 7) then |
begin |
LRLLevel.Player[i].Controller := 0; |
BREAK; |
Break; |
end; |
end; |
end; |
|
if CurrentTool < 10 then |
LRLLevel.Field[x, y].Image := CurrentTool |
else |
begin |
LRLLevel.Field[x, y].Image := CurrentTool else |
if (LRLLevel.Field[x, y].Image = 2) or (LRLLevel.Field[x, y].Image = 3) or |
(LRLLevel.Field[x, y].Image = 4) or (LRLLevel.Field[x, y].Image = 1) then |
begin |
276,18 → 283,15 |
LRLLevel.Player[1].Position.x := x; |
LRLLevel.Player[1].Position.y := y; |
LRLLevel.Player[1].Colour := 1; |
end |
else |
end else |
begin |
j := 2; |
for i := 2 to 10 do |
begin |
if LRLLevel.Player[i].Controller = 0 then |
begin |
j := i; |
BREAK; |
Break; |
end; |
end; |
LRLLevel.Player[j].Controller := 2; |
LRLLevel.Player[j].Position.x := x; |
LRLLevel.Player[j].Position.y := y; |
296,9 → 300,11 |
end; |
end; |
end; |
|
WaitForEvent(5); |
|
until (Keypress = KEY_ESC); |
end; |
until (LO(Keypress) = 27); |
SetInterrupt($8, OldTimer); |
end; |
|
|
end. |