' This program exported from BASIC Anywhere Machine (Version [5.2.3].[2026.04.28.23.15]) on 2026.05.02 at 23:43 (Coordinated Universal Time) 
' This program by Charlie Veniot
' Based on the "100 Doors" task at Rosetta Code
' (https://rosettacode.org/wiki/100_doors)

ALERT( "At any time, click/touch the screen. \n\n The program execution will pause until you release the click/touch. " )

' 🟠🟠🟠 Declarations / Settings

  CONST prg$ = "100 Doors"
  _TITLE prg$
  SCREEN _NEWIMAGE( 220, 112, 15 )

  CONST baseY% = 12, _
        oDoorColor% = 56
      
' 🟠🟠🟠 Main Program

🏁🏁🏁RunLoopStart🏁🏁🏁:
  PRINT prg$ + " Rosetta Code Task"
  GOSUB A20_✨InitDoors

  FOR pass% = 1 TO 100
    LOCATE 9,1 : PRINT "PASS " + pass% + "   "
    GOSUB B10_🔖SetHighlights
    GOSUB C10_🔘ToggleDoors
    SLEEP 0.1
  NEXT pass%
  GOSUB B30_🔖ClearHighlights

  LOCATE 11,1 : PRINT "Doors left open: "
  GOSUB R10_📝ReportOpenDoors

  SLEEP 7 : CLS
GOTO 🏁🏁🏁RunLoopStart🏁🏁🏁 

END

' 🟠🟠🟠 GOSUB Routines

A10_🔁DoorsLoop:
  FOR y% = 0 TO 4
    FOR x% = 1 TO 20
      GOSUB (DoorAction$)
      IF _MOUSEBUTTON THEN WHILE _MOUSEBUTTON : WEND
      SLEEP IFF( BETWEEN( pass%, 1, 30 ) AND ( pass% < 5 OR pass% MOD 10 = 0 ), 0.025, 0.001 )
    NEXT x%
  NEXT y%
RETURN

A20_✨InitDoors:
  LET DoorAction$ = "A30_✨InitDoor" : GOSUB A10_🔁DoorsLoop
RETURN

A30_✨InitDoor:
  LINE ( x% * 10, baseY% + y% * 10 ) TO ( x% * 10 + 7, baseY% + y% * 10 + 7 ), 63, B
  LINE ( x% * 10 + 1, baseY% + y% * 10 + 1 ) TO ( x% * 10 + 6, baseY% + y% * 10 + 3 ), 7, BF
  LINE ( x% * 10 + 1, baseY% + y% * 10 + 4 ) TO ( x% * 10 + 6, baseY% + y% * 10 + 6 ), 63, BF
RETURN

B10_🔖SetHighlights:
  GOSUB B30_🔖ClearHighlights
  LET DoorAction$ = "B20_🔖HighlightDoor" : GOSUB A10_🔁DoorsLoop
RETURN

B20_🔖HighlightDoor:
    IF ( x% + 20 * y% ) MOD pass% = 0 THEN
       LINE ( x% * 10, baseY% + y% * 10 + 8 ) _
            TO ( x% * 10 + 7, baseY% + y% * 10 + 8 ), _
            IFF( POINT(x% * 10, baseY% + y% * 10 + 8) = 50, 34, 50 )
    END IF
RETURN

B30_🔖ClearHighlights:
  FOR y% = 0 TO 4
      LINE ( 0, baseY% + y% * 10 + 8 ) _
           TO ( XMAX, baseY% + y% * 10 + 8 ), 0
  NEXT y%
RETURN

C10_🔘ToggleDoors:
  LET DoorAction$ = "C20_🔘ToggleDoor" : GOSUB A10_🔁DoorsLoop
RETURN

C20_🔘ToggleDoor:
  IF ( x% + 20 * y% ) MOD pass% = 0 THEN
     LET c% = POINT( x% * 10 + 1, baseY% + y% * 10 + 1 )
     IF c% = 56 _
        THEN GOSUB A30_✨InitDoor _
        ELSE LINE ( x% * 10, baseY% + y% * 10 ) TO ( x% * 10 + 7, baseY% + y% * 10 + 7 ), 56, BF
     GOSUB B20_🔖HighlightDoor
  END IF
RETURN

R10_📝ReportOpenDoors:
  LET pass% = 1
  LET o% = 0
  LET DoorAction$ = "R20_📝ReportOpenDoor" : GOSUB A10_🔁DoorsLoop
RETURN

R20_📝ReportOpenDoor:
  LET c% = POINT( x% * 10, baseY% + y% * 10 )
  IF c% = oDoorColor% THEN
     PRINT ( x% + y% * 20 ) + "; ";
     LET o% = o% + 1
     IF o% MOD 5 = 0 THEN PRINT
     GOSUB B20_🔖HighlightDoor
  END IF
RETURN