[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]
Program LinePlayScreensaver;
{ LinePlay.pas - by Mario van den Ancker
E-Mail: mario@astro.uva.nl
WWW: http://www.astro.uva.nl/mario/
Windows 3.x screen saver in TPW. Fully configurable via control panel and
with password support. Requires saver.pas and lineplay.res, included below.
lineplay.res is encoded with xx3402. Compile this program, copy the .exe
file to your windows directory with the extension .scr, and the screen
saver will show up in the desktop section of control panel.
Donated to the public domain 11/95. }
uses Wintypes, WinProcs, WObjects, Strings, Saver;
{$D SCRNSAVE Line Play} { This is the name that will show up in control panel. }
{$R LinePlay.Res}
const
cm_About = 103;
cm_SetPassword = 105;
id_Color = 107;
id_PWProtected = 104;
id_RadioColFixed = 121;
id_RadioColRnd = 122;
id_NumLines = 101;
id_TimerInterval = 120;
White = $00FFFFFF;
Black = $00000000;
LightGray = $00C0C0C0;
DarkGray = $00808080;
Cyan = $00FFFF00;
Magenta = $00FF00FF;
Yellow = $0000FFFF;
Red = $000000FF;
Green = $0000FF00;
Blue = $00FF0000;
LightBlue = $00800000;
LightCyan = $00808000;
LightMagenta = $00800080;
Brown = $00008080;
LightRed = $00000080;
LightGreen = $00008000;
NColors = 16;
StdColors : array[1..NColors] of TColorRef =
(White, Black, LightGray, DarkGray, Cyan, Magenta, Yellow, Red, Green,
Blue, LightBlue, LightCyan, LightMagenta, Brown, LightRed, LightGreen);
MaxLines = 25; { Maximum number of bouncing lines }
id_Timer = 1;
type
TSaveApplication = Object(TApplication)
procedure InitMainWindow; virtual;
destructor Done; virtual;
end;
{ Create TConfigDialog, a TDlgWindow descendant. }
PSetPasswordDialog = ^TSetPasswordDialog;
TSetPasswordDialog = Object(TDlgWindow)
procedure Ok(var Msg: TMessage);
virtual id_First + id_Ok;
end;
{ Create TConfigDialog, a TDialog descendant. }
PConfigDialog = ^TConfigDialog;
TConfigDialog = Object(TDlgWindow)
NumLines, TimerInterval: Integer;
Color: TColorRef;
PWProtected, RndColor: Boolean;
Password: TPasswordString;
procedure SetupWindow; virtual;
procedure cmAbout(var Msg: Tmessage);
virtual id_First + cm_About;
procedure cmSetPassword(var Msg: Tmessage);
virtual id_First + cm_SetPassword;
procedure wmDrawItem(var Msg : TMessage);
virtual wm_First + wm_DrawItem;
procedure wmMeasureItem(var Msg : TMessage);
virtual wm_First + wm_MeasureItem;
procedure Ok(var Msg: TMessage);
virtual id_First + id_Ok;
end;
{ Create TSaveWindow, a TScrSavWindow descendant. }
PSaveWindow = ^TSaveWindow;
TSaveWindow = Object(TScrnSavWindow)
PosX, PosY: array [1..MaxLines, 1..2] of Integer;
VelX, VelY: array [1..2] of Integer;
NumLines, TimerInterval: Integer;
Color: TColorRef;
RndColor: Boolean;
MaxX, MaxY, MidX, MidY: Integer;
constructor Init(aParent: PWindowsObject; aTitle: PChar);
procedure SetupWindow; virtual;
destructor Done; virtual;
procedure wmTimer(var Msg: TMessage);
virtual wm_First + wm_Timer;
end;
function GetPrivateProfileLongInt(AppName, KeyName: PChar; Default: LongInt; FileName:
PChar): LongInt;
var
Str1: Array[0..31] of Char;
ScrLongInt: LongInt;
ErrCode: Integer;
begin
GetPrivateProfileString(AppName, KeyName, '', Str1, SizeOf(Str1), FileName);
Val(Str1, ScrLongInt, ErrCode);
if (ErrCode <> 0) then ScrlongInt := Default;
GetPrivateProfileLongInt := ScrLongInt;
end;
{ --------TSaveApplication methods------------------ }
procedure TSaveApplication.InitMainWindow;
begin
if (ParamStr(1) <> '/c') and (ParamStr(1) <> '-c') then
MainWindow:= New(PSaveWindow, Init(nil, 'ScreenSaver'))
else
MainWindow := New(PConfigDialog, Init(Nil, 'SETUP'));
end;
destructor TSaveApplication.Done;
begin
TApplication.Done;
end;
{ --------TConfigDialog methods------------------ }
procedure TConfigDialog.wmDrawItem(var Msg: TMessage);
var
Brush: HBrush;
begin
with PDrawItemStruct(Msg.lParam)^ do
begin
if (CtlType = odt_ComboBox) then
begin
if ((ItemAction and oda_DrawEntire) <> 0) or
((ItemAction and oda_Select) <> 0) then
begin
Brush := CreateSolidBrush(ItemData);
FillRect(hDC, rcItem, Brush);
DeleteObject(Brush);
end;
if ((ItemState and ods_Focus) <> 0) or
((ItemState and ods_Selected) <> 0) then
begin
InflateRect(rcItem, -2, -2);
DrawFocusRect(hDC, rcItem);
end;
end;
end;
end;
procedure TConfigDialog.wmMeasureItem(var Msg: TMessage);
begin
PMeasureItemStruct(Msg.lParam)^.ItemHeight := 16;
end;
procedure TConfigDialog.SetupWindow;
procedure SetupColors(ID: Integer; Color: TColorRef);
var
i, Sel: Integer;
begin
Sel := -1;
for i := 1 to NColors do
begin
SendDlgItemMsg(ID, cb_AddString, 0, StdColors[i]);
if (StdColors[i] = Color) then Sel := pred(i);
end;
if (Sel = -1) then
begin
SendDlgItemMsg(ID, cb_AddString, 0, Color);
Sel := NColors;
end;
SendDlgItemMsg(ID, cb_SetCurSel, Sel, 0);
end;
begin
TDlgWindow.SetUpWindow;
NumLines := GetPrivateProfileInt('Screen Saver.Line Play', 'Number of Lines', 10,
'CONTROL.INI');
Color := GetPrivateProfileLongInt('Screen Saver.Line Play', 'Drawing Color', Cyan,
'CONTROL.INI');
RndColor := (GetPrivateProfileInt('Screen Saver.Line Play', 'Random Color', 1, 'CONTROL.INI')
= 1);
TimerInterval := GetPrivateProfileInt('Screen Saver.Line Play', 'Timer Interval', 30,
'CONTROL.INI');
PWProtected := (GetPrivateProfileInt('Screen Saver.Line Play', 'PWProtected', 0,
'CONTROL.INI') = 1);
GetPrivateProfileString('ScreenSaver', 'Password', '', Password, SizeOf(Password),
'CONTROL.INI');
SetDlgItemInt(HWindow, id_NumLines, NumLines, True);
SetupColors(id_Color, Color);
if RndColor then
CheckRadioButton(HWindow, id_RadioColFixed, id_RadioColRnd, id_RadioColRnd)
else
CheckRadioButton(HWindow, id_RadioColFixed, id_RadioColRnd, id_RadioColFixed);
SetDlgItemInt(HWindow, id_TimerInterval, TimerInterval, True);
if PWProtected then
CheckDlgButton(HWindow, id_PWProtected, 1)
else
CheckDlgButton(HWindow, id_PWProtected, 0);
end;
{ Respond to pressing About button. }
procedure TConfigDialog.cmAbout(var Msg: TMessage);
begin
Application^.ExecDialog(new(PDialog, Init(@Self, 'ABOUT')));
end;
{ Respond to pressing Set Password button. }
procedure TConfigDialog.cmSetPassword(var Msg: TMessage);
begin
if (StrComp(Password, '') = 0) then
Application^.ExecDialog(new(PSetPasswordDialog, Init(@Self, 'CHPWD2')))
else
Application^.ExecDialog(new(PSetPasswordDialog, Init(@Self, 'CHPWD')));
end;
{ Gets an integer value from a input dialog. If the input text
is not a number or the input number is outside a specified range
it puts up an errorbox and return false for NoErrors. InputNr is
not changed when an error has occured. }
procedure GetDlgInt(HWindow: HWnd; ThisID: Integer; MinVal, MaxVal: Integer;
var InputNr: Integer; var NoErrors: Boolean);
var
Str1, Str2: Array[0..12] of Char;
CS: array[0..80] of Char;
ErrCode, ScrInt: Integer;
begin
GetDlgItemText(HWindow, ThisID, CS, SizeOf(CS));
Val(CS, ScrInt, ErrCode);
if (ErrCode <> 0) then
begin
NoErrors := False;
MessageBox(HWindow, 'Please input numbers only!', 'Error', mb_Ok or
mb_IconExclamation);
SetFocus(GetDlgItem(HWindow, ThisID));
SendDlgItemMessage(HWindow, ThisID, em_SetSel, 0, MakeLong(32767, 0));
end
else
begin
if (ScrInt < MinVal) or (ScrInt > MaxVal) then
begin
NoErrors := False;
Str(MinVal, Str1);
Str(MaxVal, Str2);
StrCopy(CS, 'Number must be in the range ');
StrCat(CS, Str1);
StrCat(CS, '-');
StrCat(CS, Str2);
StrCat(CS, '!');
MessageBox(HWindow, CS, 'Error', mb_Ok or mb_IconExclamation);
SetFocus(GetDlgItem(HWindow, ThisID));
SendDlgItemMessage(HWindow, ThisID, em_SetSel, 0, MakeLong(32767, 0));
end
else
InputNr := ScrInt;
end;
end;
{ Respond to pressing Ok button. }
procedure TConfigDialog.Ok(var Msg: TMessage);
var
NoErrors: Boolean;
procedure GetCol(ID: Integer; var Color: TColorRef);
var
Sel: Integer;
begin
Sel := SendDlgItemMsg(ID, cb_GetCurSel, 0, 0);
if (Sel > -1) then SendDlgItemMsg(ID, cb_GetLBText, Sel, TColorRef(@Color));
end;
procedure WritePrivateProfileInt(Str1: PChar; ThisInt: LongInt);
var
Str2: Array[0..12] of Char;
begin
Str(ThisInt, Str2);
WritePrivateProfileString('Screen Saver.Line Play', Str1, Str2, 'CONTROL.INI');
end;
begin
NoErrors := True;
GetDlgInt(HWindow, id_NumLines, 1, MaxLines, NumLines, NoErrors);
GetCol(id_Color, Color);
RndColor := (IsDlgButtonChecked(HWindow, id_RadioColRnd) <> 0);
if NoErrors then GetDlgInt(HWindow, id_TimerInterval, 1, 500, TimerInterval, NoErrors);
PWProtected := (IsDlgButtonChecked(HWindow, id_PWProtected) = 1);
if NoErrors then
begin
WritePrivateProfileInt('Number of Lines', NumLines);
WritePrivateProfileInt('Drawing Color', Color);
if RndColor then
WritePrivateProfileInt('Random Color', 1)
else
WritePrivateProfileInt('Random Color', 0);
WritePrivateProfileInt('Timer Interval', TimerInterval);
if PWProtected then
WritePrivateProfileInt('PWProtected', 1)
else
WritePrivateProfileInt('PWProtected', 0);
WritePrivateProfileString('ScreenSaver', 'Password', Password, 'CONTROL.INI');
TDlgWindow.Ok(Msg);
end;
end;
{ --------TSetPasswordDialog methods------------------ }
{ Respond to pressing Ok button. }
procedure TSetPasswordDialog.Ok(var Msg: TMessage);
const
id_PWoldPW = 104;
id_PWnewPW = 105;
id_PWnewPW2 = 106;
var
NoErrors: Boolean;
OldPW, PWStr1, PWStr2: TPasswordString;
begin
NoErrors := True;
GetDlgItemText(HWindow, id_PWoldPW, OldPW, SizeOf(OldPW));
PWEncode(OldPW);
GetDlgItemText(HWindow, id_PWnewPW, PWStr1, SizeOf(PWStr1));
GetDlgItemText(HWindow, id_PWnewPW2, PWStr2, SizeOf(PWStr2));
if (StrIComp(PWStr1, PWStr2) <> 0) then
begin
MessageBox(HWindow, 'The values for New Password and Retype New Password do not
match.' +
#13 + 'Please try again.', 'Change Password', mb_Ok or mb_IconStop);
SetFocus(GetDlgItem(HWindow, id_PWOldPW));
NoErrors := False;
end;
if NoErrors and (StrComp(PConfigDialog(Parent)^.PassWord, OldPW) <> 0) then
begin
MessageBox(HWindow, 'The value for Old Password is not correct.' + #13 +
'Please check your screen saver password and try again.',
'Change Password', mb_Ok or mb_IconStop);
SetFocus(GetDlgItem(HWindow, id_PWNewPW));
NoErrors := False;
end;
if NoErrors then
begin
PWEncode(PWStr1);
StrCopy(PConfigDialog(Parent)^.PassWord, PWStr1);
TDlgWindow.Ok(Msg);
end;
end;
{ --------TSaveWindow methods------------------ }
constructor TSaveWindow.Init(aParent: PWindowsObject; aTitle: PChar);
var
DC: HDC;
i, j: Integer;
begin
TScrnSavWindow.Init(aParent, aTitle);
NumLines := GetPrivateProfileInt('Screen Saver.Line Play', 'Number of Lines', 10,
'CONTROL.INI');
Color := GetPrivateProfileLongInt('Screen Saver.Line Play', 'Drawing Color', Cyan,
'CONTROL.INI');
RndColor := (GetPrivateProfileInt('Screen Saver.Line Play', 'Random Color', 1, 'CONTROL.INI')
= 1);
TimerInterval := GetPrivateProfileInt('Screen Saver.Line Play', 'Timer Interval', 30,
'CONTROL.INI');
PWProtected := (GetPrivateProfileInt('Screen Saver.Line Play', 'PWProtected', 0,
'CONTROL.INI') = 1);
GetPrivateProfileString('ScreenSaver', 'Password', '', Password, SizeOf(Password),
'CONTROL.INI');
Randomize;
if RndColor then
Repeat
Color := StdColors[1+Random(NColors)];
Until (Color <> Black);
DC := GetWindowDC(HWindow);
MaxX := GetDeviceCaps(DC, HorzRes);
MaxY := GetDeviceCaps(DC, VertRes);
ReleaseDC(HWindow, DC);
MidX := MaxX shr 1;
MidY := MaxY shr 1;
for i := 1 to NumLines do
for j := 1 to 2 do
begin
PosX[i,j] := 0;
PosY[i,j] := 0;
end;
VelX[1] := -20 + Random(50);
VelY[1] := -20 + Random(50);
VelX[2] := -20 + Random(50);
VelY[2] := -20 + Random(50);
end;
procedure TSaveWindow.SetupWindow;
begin
TScrnSavWindow.SetupWindow;
SetTimer(HWindow, id_Timer, TimerInterval, nil);
end;
{ Perform our little animation }
procedure TSaveWindow.wmTimer(var Msg: TMessage);
var
DC: HDC;
i, j: Integer;
ox1, ox2, oy1, oy2: Integer;
Pen: HPen;
begin
ox1 := PosX[NumLines,1];
oy1 := PosY[NumLines,1];
ox2 := PosX[NumLines,2];
oy2 := PosY[NumLines,2];
for i := NumLines downto 2 do
for j := 1 to 2 do
begin
PosX[i,j] := PosX[i-1,j];
PosY[i,j] := PosY[i-1,j];
end;
for i := 1 to 2 do
begin
PosX[1,i] := PosX[1,i] + VelX[i];
PosY[1,i] := PosY[1,i] + VelY[i];
if (PosX[1,i] <= 0) or (PosX[1,i] >= MaxX) then
begin
VelX[i] := -VelX[i];
PosX[1,i] := PosX[1,i] + VelX[i];
end;
if (PosY[1,i] <= 0) or (PosY[1,i] >= MaxY) then
begin
VelY[i] := -VelY[i];
PosY[1,i] := PosY[1,i] + VelY[i];
end;
end;
DC := GetDC(HWindow);
Pen := SelectObject(DC, CreatePen(ps_Solid, 1, Black_Brush));
MoveTo(DC, ox1, oy1);
LineTo(DC, ox2, oy2); { Erase line. }
DeleteObject(SelectObject(DC, Pen));
Pen := SelectObject(DC, CreatePen(ps_Solid, 1, color));
MoveTo(DC, PosX[1,1], PosY[1,1]);
LineTo(DC, PosX[1,2], PosY[1,2]); { Draw new line. }
DeleteObject(SelectObject(DC, Pen));
ReleaseDC(HWindow, DC);
end;
destructor TSaveWindow.Done;
begin
KillTimer(HWindow, id_Timer);
TScrnSavWindow.Done;
end;
var
TSApp: TSaveApplication;
begin
TSApp.Init('Saver');
TSApp.Run;
TSApp.Done;
end.
-----8<---------8<---------8<---------8<---------8<---------8<---------8<-----
Unit Saver;
interface
uses WinProcs, WinTypes, wObjects, Strings;
const
sc_ScreenSave = $F140;
type
TPasswordString = Array[0..63] of Char;
PConfigDialog = PWindowsObject;
PPasswordDialog = ^TPasswordDialog;
TPasswordDialog = Object(TDlgWindow)
procedure SetupWindow; virtual;
procedure Cancel(var Msg: TMessage);
virtual id_First + id_Cancel;
procedure Ok(var Msg: TMessage);
virtual id_First + id_Ok;
end;
PScrnSavWindow = ^TScrnSavWindow;
TScrnSavWindow = Object(TWindow)
CancelPressed: Boolean;
PWProtected: Boolean;
Password: TPasswordString;
EmptyCursor: HCursor;
First: Boolean;
prevPt: TPoint;
PCfgDialog: PConfigDialog;
constructor Init(aParent: PWindowsObject; aTitle: PChar);
destructor Done; virtual;
procedure HasMoved(var Msg: TMessage);
function GetClassName: PChar; virtual;
procedure GetWindowClass(var aWndClass: TWndClass); virtual;
procedure SetupWindow; virtual;
procedure DefWndProc(var Msg: TMessage); virtual;
procedure wmSyscommand(var Msg: TMessage); virtual wm_SysCommand;
end;
procedure PWEncode(PWStr: PChar);
implementation
{ Encode a windows 3.x screen saver password string. }
procedure PWEncode(PWStr: PChar);
var
iStrLen, iStrPos: Integer;
theByte: Byte;
procedure XORProc(byte1: Byte; var byte2: Byte);
begin
byte1 := byte1 xor byte2;
if not((byte1 <= $20) or ((byte1 >= $7F) and (byte1 <= $90)) or
((byte1 >= $93) and (byte1 <= $9F)) or (byte1 = $3D) or
(byte1 = $5B) or (byte1 = $5D)) then byte2 := byte1;
end;
begin
iStrLen := Strlen(PWStr);
if (iStrLen = 0) then exit;
AnsiUpper(PWStr);
{ Encode forwards }
for iStrPos := 0 to iStrLen-1 do
begin
TheByte := Byte(PWStr[iStrPos]);
XORProc(Byte(iStrLen), theByte); { XOR byte with str len }
if (iStrPos = 0) then
XORProc($2A, theByte) { if pos is first, XOR w/ constant }
else
begin
XORProc(Byte(iStrPos), theByte); { else, XOR w/ position }
XORProc(Byte(PWStr[iStrPos - 1]), theByte); { XOR w/ prev char }
end;
PWStr[iStrPos] := Char(theByte); { store byte back into str }
end;
{ Encode backwards }
if (iStrLen <> 1) then
for iStrPos := iStrLen-1 downto 0 do
begin
theByte := Byte(PWStr[iStrPos]); { XOR byte with str len }
XORProc(Byte(iStrLen), theByte);
if (iStrPos = iStrLen-1) then
XORProc($2A, theByte) { if pos is last, XOR w/ constant }
else
begin
XORProc(Byte(iStrPos), theByte); { else, XOR w/ position }
XORProc(Byte(PWStr[iStrPos+1]), theByte); { XOR w/ next char }
end;
PWStr[iStrPos] := Char(theByte); { store byte back into str }
end;
end;
{ --------TPasswordDialog methods------------------ }
procedure TPasswordDialog.SetupWindow;
var
MyRect: TRect;
x, y: Integer;
begin
TDlgWindow.SetupWindow;
{ Make sure Password Dialog Window is centered on the screen. }
x := GetSystemMetrics(sm_CXScreen) shr 1;
y := GetSystemMetrics(sm_CYScreen) shr 1;
GetWindowRect(HWindow, MyRect);
with MyRect do
SetWindowPos(HWindow, 0, x - ((Right-Left) shr 1), y - ((Bottom-Top) shr 1),
Right, Bottom, swp_NoSize or swp_NoZOrder);
end;
procedure TPasswordDialog.Cancel(var Msg: TMessage);
begin
TDialog.Cancel(Msg);
PScrnSavWindow(Parent)^.CancelPressed := True;
end;
procedure TPasswordDialog.Ok(var Msg: TMessage);
const
id_InputBox = 107;
var
NoErrors: Boolean;
PWStr: TPasswordString;
begin
NoErrors := True;
GetDlgItemText(HWindow, id_InputBox, PWStr, SizeOf(PWStr));
PWEncode(PWStr);
if (StrComp(PScrnSavWindow(Parent)^.PassWord, PWStr) <> 0) then
begin
MessageBox(HWindow, 'The password is not correct.' + #13 +
'Please check your screen saver password and try again.',
'Screen Saver', mb_Ok or mb_IconStop);
SetFocus(GetDlgItem(HWindow, id_InputBox));
NoErrors := False;
end;
if NoErrors then TDlgWindow.Ok(Msg);
end;
{ --------TScrnSavWindow methods------------------ }
constructor TScrnSavWindow.Init(aParent: PWindowsObject; aTitle: PChar);
begin
TWindow.Init(aParent, aTitle);
PWProtected := False; { For programs which use this unit, but don't }
StrCopy(Password, ''); { support passwords. }
First := True;
ShowCursor(False);
{ It is also necessary to set the cursor to an empty rectangle, because
some windows drivers don't support ShowCursor. }
EmptyCursor := LoadCursor(HInstance, 'EMPTY');
Attr.ExStyle := $08; { Screensave 'window' always on top. }
Attr.Style := ws_Popup;
SetCapture(HWindow); { Get all mouse messages. }
end;
destructor TScrnSavWindow.Done;
begin
ReleaseCapture;
TWindow.Done;
end;
function TScrnSavWindow.GetClassName: PChar;
begin
GetClassName := 'ScreenSaverClass';
end;
procedure TScrnSavWindow.GetWindowClass(var aWndClass: TWndClass);
begin
TWindow.GetWindowClass(aWndClass);
aWndClass.hIcon := 0;
aWndClass.Style := cs_SaveBits;
AWndClass.HCursor := EmptyCursor;
aWndClass.hbrBackground := GetStockObject(Black_Brush);
end;
procedure TScrnSavWindow.SetupWindow;
var
rc: TRect;
begin
TWindow.SetupWindow;
GetCursorPos(PrevPt);
GetWindowRect(GetDesktopWindow, rc);
MoveWindow(hWindow, rc.Left, rc.Top, rc.Right, rc.Bottom, True);
end;
procedure TScrnSavWindow.HasMoved(var Msg: TMessage);
begin
CancelPressed := False;
ShowCursor(True);
SetCursor(LoadCursor(0, idc_Arrow));
if PWProtected then
Application^.ExecDialog(new(PPasswordDialog, Init(@Self, 'TYPEPWD')));
if not(CancelPressed) then
PostMessage(HWindow, wm_Close, 0, 0)
else
First := True;
end;
procedure TScrnSavWindow.DefWndProc(var Msg: TMessage);
begin
case msg.Message of
wm_MouseMove:
if (MakePoint(msg.LParam).x <> prevPt.x) or
(MakePoint(msg.LParam).y <> prevPt.y) then
if Not(First) then { Do not exit on first mouse move. }
HasMoved(Msg)
else
First := False;
wm_Activate,
wm_ActivateApp:
if (msg.WParam = 0) then
begin
TWindow.DefWndProc(Msg);
exit;
end;
wm_KeyDown,
wm_SyskeyDown,
wm_LButtonDown,
wm_MButtonDown,
wm_RButtonDown: HasMoved(Msg);
end;
TWindow.DefWndProc(Msg);
end;
procedure TScrnSavWindow.wmSyscommand(var Msg: TMessage);
begin
if ((Msg.WParam and $FFF0) = sc_ScreenSave) then
Msg.Result := 1
else
DefWndProc(Msg);
end;
end.
-----8<---------8<---------8<---------8<---------8<---------8<---------8<-----
*XX3402-002779-071294--72--85-18316----LINEPLAY.RES--1-OF--1
zk2+zk2+A-
+o+E++1k+C+0U++++U++++E+++++2++E++++++++2+++++++++++++++++++++
++++++++zzzz+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++
++++++++++++++++++++++++++++++++++++++++zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz1+-3
HJ-IKE+k2-E+++++++6++E+U+2+++E+-+1+-+++-+Dw1+Dw-+1+Eu+6++0U++++U++++E+++
++2+-
+++++++U+6+++++++++++++++++++++++++++++++0+++0+++++U6++U++++6++U+0+
U+++U60++A1+k++++Dw++Dw+++1zzk1z++++zk1z+Dzz++1zzzw+++++++++++++++++++
++
+++++6W6W6W6W6W6W5+++++++++++5Rk++-rQ+++++++++++++++-
rRr++++++++++++++++
06W6W6Q+++++++++++++++++++++++++++++1rRrRrRrRrRrRrRrRrRrQ+y6W6W6W6W6W
6W6
W6+5W5+DW6WeW6W6W6W6W6W+-
sVk1sW6W6W6W6W6W6W6W6W6Q+y6XzzzzzzzzzzzzzzsW5+D
W5++++++++++++++1sVk1sVk++++++++++++++y6Q+y6Q++7+++++++++++DW5+DW5+
++7++
++++++++1sVk1sVk+7+7++++++++++y6Q+y6Q++7+7+++++++++DW5+DW5+7+7+7+++++
+++
1sVk1sVk+7+7+7++++++++y6Q+y6Q7+7+7+++++++++DW5+DW5+7+7+7++++++++1sVk1
sVt
+7+7++++++++++y6Q+y6Q7+7+7+++++++++DW5+DW5+7+7++++++++++1sVk1sVk+7+7+
+++
++++++y6Q+y6Q++7+++++++++++DW5+DW5+++7++++++++++1sVk1sW5RrRrRrRrRrRrRr
W6
Q+y6W6W6W6W6W6W6W6W6W5+DW6W6W6W6W6W6W6W6W6Vk1zzzzzzzzzzzzzzzzz
zzw+++++++
++++++++++++++1s+++zy+++DzU++1zzk+Tzzw+5zs++++2+++++++++++++++++++++++
++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++
++++++++++++++++++++++++++++++++++++U++++TwC+2Z1Hosl+1+E3++++++++E+-
+0+U
2++-++2+u+6+++2+zkI+EI7DJJE+A-1Q++++U+16U+JY+3++Y+-a++++EK7jRLEUH4ZiNG-E
P43t63BXQaJZPW-HMLNZQU+i+2w+B++D++2++++-I6-0OKQUF4JVP02+++c+0+-s++c++U+-
++-EUYldPaIUI4lVSG-HMr7ZNKtnMLNZQU++Dk+q+-++1k+2++A++300GIBDHX2+++c+3U-s
++c+-E+-++-EUYtj68YUAHYtB0-BML7dPm-qMKsUN4Ji623iMqhZQU++0++Y+5U+0U+4++2+
+300FGphMKZgCW-hML7dPo-
VQrFmPmtpRa2iPak++Dw3+2B6I3R2+1+Ew++++A++m6+60++E
+8s+Hk+++2BcMKtbNG-EMLBnRqxmN++6+2pH63BVPbAUIqJmOKM+-++1+3++1U-
Y+++++Z00
7YxgN0-EMLBnRqxmN1c++3E++k-E++s+O++U+63EUE++-++J+3++1U-Z+++++Z007YtZRm-
E
MLBnRqxmN1c++3E+3E-E++s+OE+U+63EUE++-++b+3++1U-a+++++Z007Z7ZR5ZkNG-
CNLQU
I43nQrRjQaEu++-I+0Q+I++C+4c+6+0-I62++0M+Ck+c++s++E+-++3EU2x9++-U+1g+8++C
++6++++-I6-1MKtXNKk++Dw3+2B6I3R2AU+k2D++++1++AW+0+U+2+0i+2w+++-1O43iNqIU
I43nQrRjQaE+0+-BIm-HMKtn63BZQaZa++E++k-E++s+N+++++7MUWNDP4EUI43nQrRjQaEu
+++2+-I+I++C+4I++++0I66aHaJr63-VQrBrPr7YCU++J++J+3++1U-d+0++UJ0-+++2+0Q+
I++C+4M++++0I66aIaJoSL-Z62tZRm-EMLBnRqxmN1c++3E+7k-E++s+OU+U+63EUE++7U+v
+0U+1U+-++2++J0+Hog++4++Ck+c++s++U++++3EU2BVPaBZP+++J++1+3++1U-
c++U++ZW0
++1z-E-HFJFJI++k2AM-++1++AW+2-E+8+1A+5++++-AOKtZ63-gMLYUIqJoRL++0+-6NKlq
+4s+2++P++k+NE+++63EUE++DU+Y++c+0U-t++Y++30+60+aMk++PU+Y+0U+0U-
u++Y++J0+
7Z7VPaFjPE++GE+V+-s+I+-f+-A+6J03++-i+1A+4k+A+5U+++0-I62+++U+K+-E++s+O++1
++BEU0NEMLBnRqxmN0-
EQaxoNKBoNKE++3c+K++u++s+OE++++BEU0NHNLEUI43nQrRjQaEi
9Ws++7w+0++c++s++E+-++3EU2x9++0T+-c+8++C++6++++-I6-1MKtXNKk++7w+9++c++s+
Nk++++3EU0N-MaxpR+++0++Y+1E+1+-g+++++300F57VRqZiNm+aEqxgPrJm+++2++I+ZU--
+Dzz-k++I6-AOKtZQk++0++H+2U+1+1zzk+++Z007YtpPK7ZQW-jNW-gOKtZQk++-+-A+7M+
5U1zzkQ++30+I43nQrRjQaEUHr-oOKxiQk++0++q+3k+1+-r+++++Z007ZFdPKJm62ZiR4Jm
Ra3g60VhOKlgOLBZMmsd++0c+2c+2U+I+5g++k++I677EoxCAE++zkI+J3ZEFJ-LF++k20I-
++1++AW+-V++A+0g+3s+++-AOKtZ63-
gMLYUIqBmNKJi63BVRaJm++U+G4JgRU+T++A+X++c
+Dzz+++0I67IO4IUQqBmNKJi65BVRaJm65ZjRG-VQaIURLBdPaQUOLAUQ43nQrRjQaEUQ57j
R4JXR4JY9W+UKKxp64ppQrEUR5ZkNG-dPW-oO4IUQqBmNKJi65BVRaJm65-VQrBrPr7Y65Fj
65FpQasUPqNa65FcNG-
nMr7ZNKsUQq3qNL6i+++T+0o+8++C+4Q++++0I67EMLBnRqxmN1c+
+2Q+9E-E++s+Ok+U+63EUE++5k-0+0U+1U+-
++2++J0+Hog++4w+EU+c++s++U++++3EU2BV
PaBZP+++-E+3+-++2+-g++A++300zkBz+DwD+Dw-+1+EM+++++o+1++0U+-3HJ-IKE+B++s+
+M++GIBDHX2+1E+3++O++230HpJI++o+-E+5U+-1G3-LF++C++I+06++EoVEJoEm++o+-E+7
U+-HFJFJI++D++I+0c++J3ZEFJ-LF+++++++
***** END OF BLOCK 1 *****
[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]