#!/bin/bash

# Title......: g
# Description: A menu for games
# Author.....: Mitchell Johnston - uid 0
# Contact....: mitch@crn.hopto.org
# Updated....: Thu Jun 11 09:16:27 AM CDT 2026
#----------------------------------

# Sections: Changes variables functions setup main
# use '#' in vi/vim to jump to word under cursor

: ' Changes
Thu Jun 11 2026 Added built in floating screen saver
Thu May 21 2026 Added Rogue and DRL
Sun May 17 2026 Added -V to view source, -F view functions
Fri Jan 30 2026 Added Nethack
Thu Jan 29 2026 Added slots
Thu Jan 29 2026 Added iyhat
Mon Jun 02 2025 Added nethack
Sat Mar 22 2025 Added TUI Battleship
Tue Mar 04 2025 fixed list output
'

trap "continue" 2     # allows you to break a bad connection

# variables
#----------------------------------
[ "$1" == "-D" ] && DEBUG=1 && shift 1     # -D to turn on debug mode
DATE=$(date +"%a %b %d")                   # sets up the date display
PS4='$SECONDS $LINENO: '                   # debug prompt
OS=$(uname -s)                             # OS type: SunOS Linux
NAME=${0##*/}                              # name of the script
TMOUT=60                                   # time before screen saver kicks in
export PATH=/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:$PATH

# color setup
R=$(tput setaf 1)                          # red
BR=$(tput setaf 1; tput bold)              # bold red
G=$(tput setaf 2)                          # green
BG=$(tput setaf 2; tput bold)              # bold green
Y=$(tput setaf 3)                          # yellow
BY=$(tput setaf 3; tput bold)              # bold yellow
B=$(tput setaf 4)                          # blue
BM=$(tput setaf 5; tput bold)              # bold magenta
BC=$(tput setaf 6; tput bold)              # bold cyan
BL=$(tput setaf 7; tput bold)              # bold light grey
BLD=$(tput bold)                           # bold
N=$(tput sgr0)                             # normal
SIT=$(tput sitm)                           # italics
RIT=$(tput ritm)                           # remove italics
UL=$(tput smul)                            # turn underline on
NL=$(tput rmul)                            # turn underline off
RV=$(tput rev)                             # turn on reverse mode

# functions
#----------------------------------

html(){ ## mark up code
    vim -f +"syn on" +"set nonu" +"set foldenable!" +"set nospell" +"run! syntax/2html.vim" +"wq" +"q" $1
}

pause(){ ## Simple routine to stop execution
    echo " "
    echo -n "Hit any key to continue: "
    read -n 1 x
}

xtitle(){ ## set window title
    [ "$DEBUG" == "1" ] && set -x
    printf "\033]0;${*}🌀${HOSTNAME}\007"
}

log(){ ## creates a basic log entry $LOG must be defined
    # Use: log {entry}  
    [ "$DEBUG" == "1" ] && set -x
    logger -i -t "$NAME" "$*"
}

version(){ ## display version and change history
    grep -E '^# Updated' $0
    echo " "
    sed -n "/' Changes/,/^ *$/p" <$0 |grep  -E -v 'sed -n|exit 0|}'
    exit 0
}

# setup
#----------------------------------

# part of my code management system
# if you want a function or peice of code from another script:
#  !!{script} -F {function}
#  will insert the code.
[[ "$1" = "-V" ]] && bat -p -l bash $0 && exit
if [[ "$1" = "-F" ]]
    then
        [[ "$#" -eq 2 ]] && declare -f "$2" |bat -p -l bash && exit
        [[ "$#" -eq 1 ]] && declare -f |bat -p -l bash && exit
fi

# this provides a quick way to edit all my scripts on the fly
if [ "$1" == "-E" ]
then
    vim $0
    sed -i -e "7s/.*/# Updated....: $(date)/" $0
    log "Updated $0"
    html $0
    cp $0 /var/www/unix
    mv $0.html /var/www/unix
    log "Updated $0"
    exit
fi

# display version and change history
if [ "$1" == "-v" ] || [ "$1" == "--version" ]
then
    version
fi


# install checks
#---------------------------
command -v klondike2 >/dev/null || wget http://crn.hopto.org/unix/klondike2
command -v boxes >/dev/null || sudo apt install boxes -yy
command -v rogue >/dev/null || sudo apt install bsdgames-nonfree -yy
command -v nettoe >/dev/null || sudo apt install nettoe -yy
command -v freesweep >/dev/null || sudo apt install freesweep -yy
command -v vitetris >/dev/null || sudo apt install vitetris -yy
command -v ninvaders >/dev/null || sudo apt install ninvaders
command -v nethack >/dev/null || sudo apt install nethack-console

# main
#--------------------------- 
[ "$DEBUG" == "1" ] && set -x

while :
do
    if [ $# -lt 1 ] # check to see if a command line argument is passed
    then
    clear
    xtitle "Games"
echo "-[ ${UL}Games${NL} ]-${N}

${BY}$(fclock)${BC}

2. 🎴 Blackjack
b. 🟠 Backgammon
B. 🚢 TUI Battleship
d. 🏹 DoomRL
h. 🤓 Hangman
i. 👾 Invaders
k. 🎴 Klondike
m. 💣 Minesweeper
n. 🏹 Nethack
p. 🎴 Poker
r. 🏹 Rogue
s. 🎴 Solitaire
S. 🎰 Slots
t. 🔳 Tetris
T. 🔖 Tic-Tac-Toe
y. 🎲 Yahtzee
w. 🔍 Word Search
$([ -d ~/Windows ] && echo 'W. 🪟 Windows games')
${UL}                    ${NL}
${BR}q. Quit${N}
"
read -p Selection: -n 1 CHOICE
else
CHOICE=$(echo "$1" |cut -d'-' -f2)
[ "$1" == "-E" ] && CHOICE=E
fi

    case $CHOICE in
        b) # backgammon
            xtitle "🟠 Backgammon"
            clear
            echo $BC
            /usr/games/backgammon -n -w
            echo ${N}
            ;;
        B) # TUI Babttleship
            clear
            cd ~/bin/bs-2.13 && ./bs
            cd -
            clear
            ;;
        2) # blackjack
            xtitle "🎴 21"
            clear
            ~/bin/bj
            pause
            ;;
        h) # hangman
            xtitle "🤓 Hangman"
            clear
            ~/bin/hm
            echo ${N}
            ;;
        i) # ninvaders
            xtitle "👾 Ninvaders"
            ninvaders
            ;;
        k) # klondike
            xtitle "🎴 Klondike"
            klondike2
            ;;
        l) # list games
            clear
            if [ -d ~/Windows ]
            then
                grep ') #' $0| egrep -v '[q!=*]'| sed 's/^[ \t]*//'|tr -d ')#' |grep -v grep | /home/mitch/.local/bin/tte -R
            else
                grep ') #' $0| egrep -v '[q!=*]|Windows'| sed 's/^[ \t]*//'|tr -d ')#' |grep -v grep | /home/mitch/.local/bin/tte -R
            fi
            ;;
        m) # minesweeper
            xtitle  "💣 Minesweeper"
            minesweeper
            ;;
        n) # nethack
            nethack
            pause
            ;;
        p) # poker
            xtitle "🎴 Poker"
            #poker
            clear
            videopoker -mh
            pause
            ;;
        d) # DRL
            xtitle "🏹 DRL"
            cd ~/bin/drl-linux-0998;./drl;cd -
            ;;
        r) # rogue
            xtitle "🏹 Rogue"
            cd ~/bin/roguepc;./rogue
            cd -
           ;;
        s) # ttysolitaire
            xtitle "🎴 Solitaire"
            cd ~/bin/csol-master && ./csol 2>/dev/null
            cd - >/dev/null
            ;;
        S) # slots
            ~/bin/slots
            pause
            ;;
        t) # tetris
            xtitle "🔳 Tetris"
            clear
            vitetris
            pause
            ;;
        T) # tic-tac-toe
            xtitle "🔖 tic-tac-toe"
            clear
            nettoe
            clear
            ;;
        y) # yahtzee
            xtitle "🎲 Yahtzee"
            clear;echo ${BC}
            yahtzee
            pause
            ;;
        q) # quit
            clear
            ft Bye
            echo -e "\n"
            exit
            ;;
        w) # wordsearch
            xtitle "🔍 Word Search"
            clear
            cd ~/bin/wordsearch-master
            ./wordsearch -t black 2>/dev/null
            ./wordsearch -s
            pause
            cd -
            ;;
        W) # Windows games
            xtitle "🪟 Windows games"
            cd ~/Windows
            CHOICE=$(\ls -F| grep '*$' |tr -d '*' |fzf --ansi --reverse --color fg:-1,bg:-1,hl:46,fg+:40,bg+:233,hl+:46 --color prompt:166,border:46 --height 70%  --border=sharp --prompt="" --pointer="" --marker="");
            clear
            echo -n "Now playing: $CHOICE "
            spinit ./${CHOICE}
            cd -
            clear
            ;;
        !) # run command
            clear
            echo "${C}Hit return with no command to end.${N}"
            while :
            do
                echo -n "[menu] $PWD $ "
                read EXEC
                [ -z "$EXEC" ] && break
                eval "$EXEC"
            done
            pause
            ;;
        =) # reset term and restart script
            reset
            exec $0
            ;;
        *) # screen saver
            xtitle "🌘 Screen saver"
            # 1. Clear screen and hide cursor
            clear
            tput civis

            # 2. Get terminal dimensions
            lines=$(tput lines)
            cols=$(tput cols)

            # 3. Available emojis (adjust as you like)
            emojis=("🤠" "🦎" "💻" "🐪" "🐧" "🐶" "🔥" "🍀" "🐡" "💥")
            emoji_count=${#emojis[@]}

            # 4. Set initial positions and velocities for 5 emojis
            for i in {0..4}; do
                emoji_char[$i]="${emojis[RANDOM % emoji_count]}"
                # Stay 2 units away from edges to prevent clipping
                x[$i]=$((RANDOM % (cols - 4) + 2))
                y[$i]=$((RANDOM % (lines - 4) + 2))

                # Pick a random starting direction (-1 or 1)
                dx[$i]=$(( RANDOM % 2 == 0 ? 1 : -1 ))
                dy[$i]=$(( RANDOM % 2 == 0 ? 1 : -1 ))
            done

            # 5. Clean up on exit (re-shows cursor)
            trap "tput cnorm; clear; exit" INT TERM

            # 6. Main animation loop
            while true; do
                # Update terminal size dynamically in case you resize the window
                trap "break" 2     # allows you to break a bad connection
                lines=$(tput lines)
                cols=$(tput cols)

                for i in {0..4}; do
                    # Clear the old position (print a space)
                    tput cup ${y[$i]} ${x[$i]}
                    echo -n "  "

                    # Calculate new positions
                    next_x=$(( x[$i] + dx[$i] ))
                    next_y=$(( y[$i] + dy[$i] ))

                    # Bounce off left/right walls
                    if (( next_x <= 0 || next_x >= cols - 2 )); then
                        dx[$i]=$(( dx[$i] * -1 ))
                        next_x=$(( x[$i] + dx[$i] ))
                    fi

                    # Bounce off top/bottom walls
                    if (( next_y <= 0 || next_y >= lines - 1 )); then
                        dy[$i]=$(( dy[$i] * -1 ))
                        next_y=$(( y[$i] + dy[$i] ))
                    fi

                    # Update positions
                    x[$i]=$next_x
                    y[$i]=$next_y

                    # Draw the emoji at the new position
                    tput cup ${y[$i]} ${x[$i]}
                    echo -n "${emoji_char[$i]}"
                done

                # Control the speed of the animation (lower = faster)
                sleep 0.05
            done
                    ;;
            esac
            [ $# -eq 1 ] && exit
done