' Screen Saver v1.2 (Decrunch 2022 Edition) ' Created By Tomek Wojcik ' Copyright 2020-present by BTHLabs (https://bthlabs.pl) ' Licensed under terms of MIT License ' *** Globals WIDTH=320 HEIGHT=200 PADDING=10 XMIN=PADDING XMAX=WIDTH-PADDING YMIN=PADDING YMAX=HEIGHT-PADDING PAL_MIN=4 PAL_MAX=15 Global WIDTH,HEIGHT,PADDING,XMIN,YMIN,XMAX,YMAX ' *** Setup Degree Auto View Off Default Palette $0,$FFF,$0,$0,$BA6,$B30,$625,$FC0,$690,$CB6,$373,$F0,$8EE,$AAA,$737,$A26 Screen Open 0,WIDTH,HEIGHT,16,Lowres : Screen Show 0 Screen Open 1,WIDTH,HEIGHT,16,Lowres : Screen Hide 1 Screen Open 2,WIDTH,HEIGHT,16,Lowres : Screen Hide 2 Hide : Flash Off Screen 0 : Curs Off Screen 1 : Curs Off Screen 2 : Curs Off ' *** Main Stuff Procedure MAIN_DRAW_BORDER Cls 0 Ink 1,0 Box 4,4 To 316,196 Pen 1 : Paper 0 Locate 0,0 Centre "Screen Saver" Locate 0,24 Centre "By BTHLabs. Decrunch 2022." Locate 35,0 : Pen 13 : Paper 0 Print "v1.2"; End Proc Screen 0 MAIN_DRAW_BORDER View ' *** The Rect Module RECT_PEN_MIN=4 RECT_PEN_MAX=15 RECT_MIN_SIZE=8 Global RECT_PEN_MIN,RECT_PEN_MAX,RECT_MIN_SIZE Procedure RECT_TICK If Timer mod 3=0 Randomize Timer RECT_PEN=RECT_PEN_MIN+Rnd(RECT_PEN_MAX-RECT_PEN_MIN) RECT_WIDTH=RECT_MIN_SIZE+Rnd(XMAX-PADDING-RECT_MIN_SIZE) RECT_HEIGHT=RECT_MIN_SIZE+Rnd(YMAX-PADDING-RECT_MIN_SIZE) If RECT_WIDTH=XMAX-PADDING RECT_X=0 Else RECT_X=Rnd(XMAX-PADDING-RECT_WIDTH) End If If RECT_HEIGHT=YMAX-PADDING RECT_Y=0 Else RECT_Y=Rnd(YMAX-PADDING-RECT_HEIGHT) End If Ink RECT_PEN,RECT_PEN RECT_FX=XMIN+RECT_X RECT_FY=YMIN+RECT_Y RECT_TX=RECT_FX+RECT_WIDTH RECT_TY=RECT_FY+RECT_HEIGHT Bar RECT_FX,RECT_FY To RECT_TX,RECT_TY End If End Proc ' *** The Radar Module RADAR_CX=WIDTH/2 RADAR_CY=HEIGHT/2 RADAR_RADIUS=64 RADAR_STEP=0 RADAR_MAX_STEP=35 Dim RADAR_POINTS(36,2) Global RADAR_CX,RADAR_CY,RADAR_RADIUS,RADAR_STEP,RADAR_MAX_STEP,RADAR_POINTS() Procedure RADAR_INIT MAIN_DRAW_BORDER RADAR_STEP=0 For I=0 To RADAR_MAX_STEP RADAR_POINTS(I,0)=0 RADAR_POINTS(I,1)=0 Next I Ink 1,0 Circle RADAR_CX,RADAR_CY,RADAR_RADIUS Ink 10,0 Paint RADAR_CX,RADAR_CY Ink 1,0 Circle RADAR_CX,RADAR_CY,1 Ink 11,0 Circle RADAR_CX,RADAR_CY,48 Circle RADAR_CX,RADAR_CY,32 Circle RADAR_CX,RADAR_CY,16 End Proc Procedure RADAR_TICK Screen Copy 2 To 1 Randomize Timer RADAR_ANGLE=10*RADAR_STEP RADAR_POINT_DIST=8+Rnd(RADAR_RADIUS-10) RADAR_POINT_X=RADAR_POINT_DIST*Cos(RADAR_ANGLE) RADAR_POINT_Y=RADAR_POINT_DIST*Sin(RADAR_ANGLE) RADAR_POINTS(RADAR_STEP,0)=RADAR_POINT_X RADAR_POINTS(RADAR_STEP,1)=RADAR_POINT_Y Ink 7,0 For I=0 To RADAR_MAX_STEP If RADAR_POINTS(I,0)<>0 and RADAR_POINTS(I,1)<>0 Plot RADAR_CX-RADAR_POINTS(I,0),RADAR_CY-RADAR_POINTS(I,1) End If Next I If RADAR_STEP=RADAR_MAX_STEP RADAR_STEP=0 Else RADAR_STEP=RADAR_STEP+1 End If RADAR_ANGLE=10*RADAR_STEP RADAR_HAND_X=(RADAR_RADIUS)*Cos(RADAR_ANGLE) RADAR_HAND_Y=(RADAR_RADIUS)*Sin(RADAR_ANGLE) Ink 1,0 Draw RADAR_CX,RADAR_CY To RADAR_CX-RADAR_HAND_X,RADAR_CY-RADAR_HAND_Y End Proc ' *** The Text Module TXT_PEN_BASE=13 TXT_PEN_SPECIAL=1 Dim TXT_SPECIAL_STRINGS$(4) TXT_SPECIAL_STRINGS$(0)="Basia" TXT_SPECIAL_STRINGS$(1)="Ziomek" TXT_SPECIAL_STRINGS$(2)="Tomek" TXT_SPECIAL_STRINGS$(3)="Pecia" Dim TXT_SPECIAL_STRING_COORDS(4,2) Global TXT_PEN_BASE,TXT_PEN_SPECIAL,TXT_SPECIAL_STRINGS$(),TXT_SPECIAL_STRING_COORDS() Procedure TXT_INIT Randomize Timer For Y=1 To 23 For X=1 To 38 Pen TXT_PEN_BASE Locate X,Y : Print Chr$(32+Rnd(64)); Next X Next Y For I=0 To 3 TXT_SPECIAL_STRING$=TXT_SPECIAL_STRINGS$(I) TXT_SPECIAL_STRING_COORDS(I,0)=1+Rnd(37-Len(TXT_SPECIAL_STRING$)) TXT_SPECIAL_STRING_COORDS(I,1)=1+Rnd(22) Next I End Proc Procedure TXT_TICK Randomize Timer TXT_HIGHLIGHT_COUNT=Rnd(50) For I=0 To TXT_HIGHLIGHT_COUNT TXT_HIGHLIGHT_X=1+Rnd(37) TXT_HIGHLIGHT_Y=1+Rnd(22) TXT_HIGHLIGHT_PEN=4+Rnd(11) Locate TXT_HIGHLIGHT_X,TXT_HIGHLIGHT_Y Pen TXT_HIGHLIGHT_PEN : Paper 0 Print Chr$(32+Rnd(64)); Next I For I=0 To 3 Pen TXT_PEN_SPECIAL : Paper 0 Locate TXT_SPECIAL_STRING_COORDS(I,0),TXT_SPECIAL_STRING_COORDS(I,1) Print TXT_SPECIAL_STRINGS$(I); Next I End Proc ' *** The Main Loop CURRENT_MOD=0 CURRENT_MOD_MAX_TIME=250 LOCK_CURRENT_MOD=False Global CURRENT_MOD Procedure CURRENT_MOD_INIT Screen 2 MAIN_DRAW_BORDER If CURRENT_MOD=1 RADAR_INIT Else If CURRENT_MOD=2 TXT_INIT End If Screen Copy 2 To 1 End Proc CURRENT_MOD_INIT CURRENT_MOD_START=Timer CURRENT_MOD_SWITCH_COUNT=0 Do CURRENT_MOD_TIME=Timer-CURRENT_MOD_START If LOCK_CURRENT_MOD=False and CURRENT_MOD_TIME>=CURRENT_MOD_MAX_TIME CURRENT_MOD=CURRENT_MOD+1 If CURRENT_MOD>2 CURRENT_MOD=0 End If CURRENT_MOD_START=Timer CURRENT_MOD_SWITCH_COUNT=CURRENT_MOD_SWITCH_COUNT+1 If CURRENT_MOD_SWITCH_COUNT=9 Exit End If CURRENT_MOD_INIT End If Screen 1 If CURRENT_MOD=0 RECT_TICK Else If CURRENT_MOD=1 RADAR_TICK Else If CURRENT_MOD=2 TXT_TICK End If Screen Copy 1 To 0 View Wait Vbl If Mouse Click<>0 or Key State(69)=True Exit End If Loop