! ***********************************************************************
! *                                                                     *
! *                             H A N G M A N                           *
! *                  Donated by Lee Pallmann of UltraSoft               *
! *                                                                     *
! ***********************************************************************
! This program uses GET.SBR

VER:    PROGRAM HANG,1.0

MAPS:   ! Program variables
       MAP1 ANSWER,S,30        ! Thw word that the player is trying to guess
       MAP1 USED(50),B,1       ! There are 50 words; 1=already used, 0=free
       MAP1 WRD,F,6            ! Which answer (1-50) is currently being useed
       MAP1 ROUNDS,F,6         ! Number of rounds played.
       MAP1 POINTS,F,6         ! Number of wins.
       MAP1 RESPONSE,S,30      ! The players guess (of the answer)
       MAP1 GUESS,S,1          ! The letter (A-Z) the player is guessing
       MAP1 LETTER(26),B,1     ! Has the letter been chosen yet?  1=Yes, 0=No
       MAP1 LIMBS,F,6          ! Player has six limbs
       MAP1 COUNT,F,6          ! Number of correctly guessed letters.
       MAP1 COL,F,6            ! Column counter for bottom row.
       MAP1 I,F,6

INIT:   ! Initialize
       RANDOMIZE

SCREEN: ! Paint background
       PRINT TAB(-1,0);
       CALL PAINT

GETWRD: ! Get next word
       WRD = INT(RND(0)*50)+1
       IF USED(WRD) THEN GOTO GETWRD
       USED(WRD) = 1
       ROUNDS = ROUNDS + 1
       IF ROUNDS=50 THEN PRINT TAB(24,1); : GOTO QUIT
       COUNT=0
       COL = 10
       LIMBS=0
       PRINT TAB(22,12); TAB(-1,9);
       CALL ANSWER

       PRINT TAB(12,3); "Guess? _"; TAB(-1,5);
GUESS:  PRINT TAB(12,10);
       IF COUNT=LEN(ANSWER) THEN GOTO WIN
       XCALL GET, GUESS
       IF GUESS = CHR(27) THEN ROUNDS = ROUNDS - 1 : GOTO QUIT
       GUESS = UCS(GUESS)
       I = ASC(GUESS)
       IF I < 65 OR I  > 90 THEN GOTO BADMOV
       I = I - 64
       IF LETTER(I) = 1  THEN GOTO CHOSEN
       LETTER(I) = 1
       PRINT TAB(19,1); TAB(-1,9);
       CALL DISPLY
       IF LIMBS=6 THEN GOTO LOSE
       GOTO GUESS

DISPLY: ! Display letter(s) on screen.
       PRINT TAB(17,36);
       IF INSTR(1,ANSWER,GUESS)<1 CALL HANG : THEN RETURN
       FOR I = 1 TO LEN(ANSWER)
           IF ANSWER[I;1] = GUESS THEN PRINT GUESS; : COUNT = COUNT + 1 : &
           ELSE CALL CHAR
           NEXT I
       RETURN

CHAR:   ! If character was already on screen, redraw it.
       IF LETTER(ASC(ANSWER[I;1])-64) = 1 THEN PRINT ANSWER[I;1]; &
          ELSE PRINT "_";
       RETURN

ANSWER: ! Find the answer
       RESTORE
       PRINT TAB(17,1); TAB(-1,9);
       FOR I = 1 TO WRD
          READ ANSWER
          NEXT I
       PRINT TAB(17,36);
       FOR I = 1 TO LEN(ANSWER)
           PRINT "_";
           NEXT I
       FOR I = 9 TO 11
           PRINT TAB(I,36); SPACE(3);
           NEXT I
       RETURN

CHOSEN: ! Duplicate choice - not allowed
       PRINT TAB(19,33); "Already Chosen"

BADMOV: ! Invalid keystroke
       PRINT CHR(7);
       GOTO GUESS

HANG:   ! Hang him...slowly & painfully
       LIMBS = LIMBS + 1
       CALL BOTTOM
       ON LIMBS GOTO HANG1,HANG2,HANG3,HANG4,HANG5,HANG6
HANG1:  PRINT TAB(9,37); "O";
       RETURN
HANG2:  PRINT TAB(10,37); "|";
       RETURN
HANG3:  PRINT TAB(10,36); "/";
       RETURN
HANG4:  PRINT TAB(10,38); "\";
       RETURN
HANG5:  PRINT TAB(11,36); "/";
       RETURN
HANG6:  PRINT TAB(11,38); "\";
       RETURN

BOTTOM: ! Keep list of used letters on bottom
       COL=COL + 2
       PRINT TAB(22,COL); GUESS;
       RETURN

LOSE:   ! You lost!
       PRINT TAB(19,13); "YOU ARE DEAD - The word was `"; ANSWER; "' - "; &
             "Another game? ";
       GOTO ASK

WIN:    ! You won!
       PRINT TAB(19,27); "CONGRATULATIONS! - Another game? ";
       POINTS = POINTS + 1
ASK:    ! Continue?
       XCALL GET, GUESS
       IF UCS(GUESS[1,1]) #"Y" THEN GOTO QUIT
       PRINT TAB(19,1); TAB(-1,9);
       FOR I = 1 TO 26
           LETTER(I) = 0
           NEXT I
       GOTO GETWRD

QUIT:   ! Exit program
       PRINT TAB(-1,0)
       PRINT POINTS; "win";
       IF POINTS # 1 THEN PRINT "s";
       PRINT ","; ROUNDS; "game";
       IF ROUNDS # 1 THEN PRINT "s";
       PRINT "."
       PRINT
       END

DATA    ZEPHYR,HANGMAN,ACUPUNCTURE,WHISKEY,BREVITY,COUNTERFEIT,COVENANT,SCORCH
DATA    RESISTANT,HALLUCINATE,HOURGLASS,IMPATIENT,INQUISITION,ITINERARY,JETLAG
DATA    KANGAROO,LATITUDE,LEDGER,COMPUTER,LIGHTWEIGHT,MACHINE,MILEAGE,MOUNTAIN
DATA    NICKEL,OCCURRENCE,OCEAN,PYROMANIAC,PSYCHOLOGICAL,REBELLIOUS,XENOPHOBIA
DATA    SCREECH,SPECIFY,TEMPEST,WRESTLE,TIMID,TORTOISE,TWINKLE,FABRIC,TELEGRAM
DATA    TYPICAL,BEASTLY,VAMPIRE,VISIBLE,AIRCRAFT,AVIATION,WITHSTAND,XENOPHOBIA
DATA    UNABLE,XYLOPHONE,YEAST


PAINT:  ! HANG.BSI created on 12-08-86 by AlphaPAINT
       PRINT TAB(-1,0); TAB(-1,29);
       PRINT TAB(-1,12);
       PRINT TAB(2,32); "H A N G M A N";
       PRINT TAB(8,37); TAB(-1,23); TAB(-1,11); TAB(-1,38); TAB(-1,46); TAB(-1,46);
       PRINT TAB(-1,39);
       PRINT TAB(9,40); TAB(-1,47);
       PRINT TAB(10,40); TAB(-1,47);
       PRINT TAB(11,40); TAB(-1,47);
       PRINT TAB(12,39); TAB(-1,38); TAB(-1,45); TAB(-1,39);
       PRINT TAB(13,37); TAB(-1,38); TAB(-1,46); TAB(-1,41); TAB(13,41); TAB(-1,40);
       PRINT TAB(-1,46); TAB(-1,39);
       PRINT TAB(14,36); TAB(-1,38); TAB(-1,41); TAB(14,43); TAB(-1,40); TAB(-1,39);
       PRINT
       PRINT TAB(15,36); TAB(-1,40); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46);
       PRINT TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,41);
       PRINT TAB(21,1); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46);
       PRINT TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46);
       PRINT TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46);
       PRINT TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46);
       PRINT TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46);
       PRINT TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46);
       PRINT TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46);
       PRINT TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46);
       PRINT TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46);
       PRINT TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46);
       PRINT TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46);
       PRINT TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46);
       PRINT TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46); TAB(-1,46);
       PRINT TAB(-1,46); TAB(-1,46); TAB(-1,46);
       PRINT TAB(-1,24); ""; TAB(-1,12); "Guesses:";
       PRINT TAB(-1,12); TAB(-1,28);
       RETURN