'       HANGMAN
'
'   Johnno56 15-Dec-16
'   (sdlbasic version)
'
'   07-Oct-20 QB64   w/mouse bplus  cut some lines of code
'
xmax = 1024
ymax = 768
SCREEN _NEWIMAGE(xmax, ymax, 32)
_DELAY .25
_SCREENMOVE _MIDDLE
_PRINTMODE _KEEPBACKGROUND
_MOUSEHIDE

RANDOMIZE TIMER

'DIM SHARED wordlist$(words)
DIM SHARED letter(26)
DIM SHARED chosen(26)
DIM SHARED font50
DIM SHARED bground AS _UNSIGNED LONG
'DIM SHARED choose AS INTEGER
DIM SHARED a$
DIM SHARED blue AS _UNSIGNED LONG
DIM SHARED red AS _UNSIGNED LONG
DIM SHARED click
DIM SHARED yesno AS LONG
DIM SHARED mx
DIM SHARED my
DIM SHARED mb
DIM SHARED gun AS LONG

filename$ = "assets/west-words.txt"
IF NOT _FILEEXISTS(filename$) THEN
    PRINT filename$; " does not exist..."
    END
ELSE
    OPEN filename$ FOR INPUT AS #1
    count = 1
    WHILE NOT EOF(1)
        INPUT #1, tmp$
        count = count + 1
    WEND
    CLOSE #1
    words = count - 1
    DIM wordlist$(words)
    OPEN filename$ FOR INPUT AS #1
    count = 1
    WHILE NOT EOF(1)
        INPUT #1, wordlist$(count)
        count = count + 1
    WEND
    CLOSE #1
END IF

words = count - 1

a$ = ""

'
'   Load graphics
'
intro = _LOADIMAGE("assets/title.png")
gallowsbase = _LOADIMAGE("assets/base-closed.png")
upright = _LOADIMAGE("assets/upright.png")
support1 = _LOADIMAGE("assets/support1.png")
support2 = _LOADIMAGE("assets/support2.png")
support3 = _LOADIMAGE("assets/support3.png")
beam = _LOADIMAGE("assets/beam.png")
bolts = _LOADIMAGE("assets/bolts.png")
rope = _LOADIMAGE("assets/ropesupport.png")
victim1 = _LOADIMAGE("assets/victim1.png")
victim2 = _LOADIMAGE("assets/victim2.png")
hole = _LOADIMAGE("assets/hole.png")
bground = _LOADIMAGE("assets/bground.png")
grid = _LOADIMAGE("assets/grid.png")
gameover = _LOADIMAGE("assets/gameover.png")
welldone = _LOADIMAGE("assets/welldone.png")
guessed = _LOADIMAGE("assets/x.png")
gun = _LOADIMAGE("assets/gun.png")
yesno = _LOADIMAGE("assets/yesno.png")

'
'   Load audio
'
ropestretch = _SNDOPEN("assets/rope.wav")
choke = _SNDOPEN("assets/choke.wav")
shot = _SNDOPEN("assets/shot.wav")
click = _SNDOPEN("assets/click.wav")
clunk = _SNDOPEN("assets/clunk.wav")

music = _SNDOPEN("assets/goodbadugly.wav")

'
'   Load Fonts
'
font35 = _LOADFONT("assets/rubicmono.ttf", 35)
font50 = _LOADFONT("assets/rubicmono.ttf", 50)

' select word from array (or external file?)

filename$ = "assets/west-words.txt"
'filename$ = "assets/words.txt"

blue = _RGB32(0, 0, 255)
red = _RGB32(255, 0, 0)
black = _RGB32(0, 0, 0)

again = 1
i = 0.1

'
'   Title screen - here
'
CLS
_PUTIMAGE (0, 0), intro
_DISPLAY
_DELAY 2
_SNDPLAY (shot)
_PUTIMAGE (627, 9), hole
_DISPLAY
_DELAY 5

'
'   Start game loop here
'
DIM snap AS LONG
snap = _NEWIMAGE(_WIDTH, _HEIGHT, 32) ' take pictures of game as it progresses

WHILE 0 = 0
    CLS
    _PUTIMAGE (0, 0), bground

    wordtoguess$ = wordlist$(INT(RND * (count - 1)))
    'print wordtoguess$
    numberoftries = 0
    FOR x = 1 TO 26
        letter(x) = 0
    NEXT

    '
    '   Display empty word and letter grid
    '
    FOR dash = 1 TO LEN(wordtoguess$)
        LINE (460 + (dash * 50), 380)-STEP(40, 4), black, BF
    NEXT

    _PUTIMAGE (44, 700), grid
    _DISPLAY

    counter = 0

    '
    '   Letter guess routine - try for mouse input?
    '

    '   Clear "chosen" array
    '
    FOR x = 1 TO 26
        chosen(x) = 0
    NEXT
    _SNDVOL music, i
    _SNDLOOP (music)
    _MOUSEHIDE
    _PUTIMAGE , 0, snap
    DO
        foundletter = 0

        '
        '   Keyboard (or mouse) selection of letters to guess
        '

        DO
            _PUTIMAGE , snap, 0
            '_MOUSESHOW
            choose = 0
            '
            '   Mouse "cursor"?
            WHILE _MOUSEINPUT: WEND
            mx = _MOUSEX: my = _MOUSEY: mb = _MOUSEBUTTON(1)
            _PUTIMAGE (mx, my), gun, 0
            IF mb THEN
                IF my >= 700 AND my <= 736 THEN
                    'BEEP
                    test = INT((mx - 44) / 36) + 1
                    'LOCATE 11, 5: PRINT test
                    '_DISPLAY
                    IF test > 0 AND test < 27 THEN 'good click
                        choose = 96 + test
                    END IF
                END IF
            END IF

            ' Check Keypress if not mouse
            IF choose = 0 THEN choose = _KEYHIT

            ' Handle choose
            IF choose > 96 AND choose < 123 THEN
                IF chosen(choose - 96) = 0 THEN
                    a$ = UCASE$(CHR$(choose))
                    chosen(choose - 96) = 1
                    _PUTIMAGE , snap, 0 'hide gun
                    _PUTIMAGE ((choose - 96) * 36 + 8, 700), guessed
                    EXIT DO
                END IF
            END IF

            ' Escape to quit?
            IF INKEY$ = CHR$(27) THEN
                _DELAY 2
                CLS
                _DELAY 1
                _SNDSTOP music
                _SNDCLOSE music
                _DELAY 2
                SYSTEM
            END IF

            _DISPLAY
            _LIMIT 100
        LOOP
        _SNDPLAY (click)

        '
        '   Correct letter routine
        '
        IF letter(ASC(a$) - 64) = 0 THEN
            COLOR blue
            _FONT (font35)
            FOR x = 1 TO LEN(wordtoguess$)
                IF UCASE$(MID$(wordtoguess$, x, 1)) = a$ THEN
                    _PRINTSTRING (465 + (x * 50), 330), a$
                    counter = counter + 1
                    foundletter = 1
                END IF
            NEXT
            '
            '   Not so correct letter routine
            '
            IF foundletter = 0 THEN
                numberoftries = numberoftries + 1
                '
                '   Build gallows routine?
                '

                SELECT CASE numberoftries
                    CASE 1: _PUTIMAGE (70, 505), gallowsbase
                    CASE 2: _PUTIMAGE (146, 154), upright
                    CASE 3: _PUTIMAGE (125, 461), support1
                    CASE 4: _PUTIMAGE (184, 523), support2
                    CASE 5: _PUTIMAGE (229, 501), support3
                    CASE 6: _PUTIMAGE (116, 134), beam
                    CASE 7: _PUTIMAGE (155, 170), bolts
                    CASE 8: _PUTIMAGE (209, 140), rope
                    CASE 9: _PUTIMAGE (331, 269), victim1
                    CASE 10: _SNDPLAY (ropestretch)
                        _SNDPLAY (choke)
                        _PUTIMAGE (331, 269), victim2
                END SELECT
            END IF
            letter(ASC(a$) - 64) = -1
        END IF
        _DISPLAY

        '
        '   Check for finished game?
        '
        IF counter = LEN(wordtoguess$) OR numberoftries = 10 THEN
            EXIT DO
        END IF
        _DISPLAY

        _PUTIMAGE , 0, snap
        _LIMIT 100
    LOOP

    _DELAY 3

    '
    '   Winner routine
    '
    IF counter = LEN(wordtoguess$) THEN
        _PUTIMAGE (170, 200), welldone
        _DISPLAY
        _DELAY 3
        CLS
        _DISPLAY
        playagain
        IF a$ = "N" THEN
            a$ = ""
            _DELAY 1
            CLS
            _PUTIMAGE (0, 0), gameover
            _DISPLAY
            _DELAY 4
            SYSTEM
        END IF
        IF a$ = "Y" THEN
            a$ = ""
            _DELAY 0.2
            CLS
            _PUTIMAGE (0, 0), bground
            _DISPLAY
        END IF
    ELSE
        '
        '   Loser routine
        '
        FOR x = 1 TO LEN(wordtoguess$)
            a$ = UCASE$(MID$(wordtoguess$, x, 1))
            COLOR red
            _FONT (font35)
            _PRINTSTRING (465 + (x * 50), 330), a$
            _DISPLAY
        NEXT
        _DELAY 4
        CLS
        playagain
        IF a$ = "Y" THEN
            a$ = ""
            CLS
            _PUTIMAGE (0, 0), bground
            _DISPLAY
        END IF
        IF a$ = "N" THEN
            _SNDPLAY (click)
            a$ = ""
            CLS
            _PUTIMAGE (0, 0), gameover
            _DISPLAY
            _DELAY 3
            CLS
            _DISPLAY
            _DELAY 1
            SYSTEM
        END IF
    END IF
    IF INKEY$ = CHR$(27) THEN END
    _DISPLAY
    _LIMIT 100
WEND

SUB playagain
    a$ = ""
    yn = 0
    WHILE (yn <> 121 AND yn <> 110) AND (a$ <> "Y" AND a$ <> "N")
        CLS
        _PUTIMAGE (0, 0), bground
        yn = _KEYHIT
        WHILE _MOUSEINPUT: WEND ' <<<<<<<<<<<<<<<<<<  not while _mouseinput = 0
        mx = _MOUSEX
        my = _MOUSEY
        mb = _MOUSEBUTTON(1)
        '        LOCATE 1, 1: PRINT mx
        '        LOCATE 2, 1: PRINT my
        '        LOCATE 3, 1: PRINT mb
        _PUTIMAGE (250, 650), yesno
        _PUTIMAGE (mx, my), gun
        '_PRINTSTRING (250, 650), "Again Y or N"
        IF yn = 121 OR (mx > 548 AND mx < 583 AND my > 650 AND my < 685 AND mb = -1) THEN
            _SNDPLAY (click)
            a$ = "Y"
            FOR x = 1 TO 26
                chosen(x) = 0
            NEXT
            choose = 0
            _DELAY 1
        ELSEIF yn = 110 OR (mx > 725 AND mx < 760 AND my > 650 AND my < 685 AND mb = -1) THEN
            _SNDPLAY (click)
            a$ = "N"
        END IF
        _DISPLAY
        _LIMIT 100 '<  save the fan!
    WEND
END SUB

