Files
Cody Boone Ferguson afb9e54a4c Add fun link to 2020/ferguson1/play.sh
Did you know some people believe in snake human hybrids? I added a link to the
script that discusses this and gives supposed examples.
2024-03-01 05:51:11 -08:00

301 lines
8.5 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# SCRIPT TO PLAY PRESET GAMEPLAY MODES
#
# The easiest way to see what this script does is to simply run it; however you
# can pass in variables but depending on what mode you select it might be
# overridden so that the variable you pass in doesn't take effect. You can of
# course modify this script otherwise.
#
# This script first runs make and then termcaps (the terminal capability test
# utility); if any problems are detected it prompts if you wish to proceed.
# Assuming no problems or you proceed anyway it then asks you if you want to
# configure the colours of the walls, snake head and body as well as the bug.
# Then it gives you a menu of gameplay modes.
#
# Let's say you want to enable cannibalism but don't want to be able to go
# through walls in hypnotic mode. Just type:
#
# CANNIBAL=1 WALLS=0 ./play.sh
#
# And you would then choose mode 5.
#
# This script could be further improved to prompt the different variables but
# that would complicate it much further and I'm not sure what should be done
# about variables that would cancel the mode requested.
#
# As for drawing mode what if you don't want to ever end up 'winning'? In this
# case you'll probably want to set the initial size to be rather high and growth
# to 0. You could also play with the idea of setting a growth value but setting
# negative shedding (or the other way round). For example:
#
# SIZE=400 SHED=100 SHEDS=-5 ./play.sh
#
# This is actually option 1 since this seemed like a good addition to the script
# (added 16 August 2020). This will start you at 400 and every 100 movements you
# would lose 5 in length; when you eat a bug you would grow by 5 (default).
#
# BTW: did you know that some people believe in snake human hybrids? It's true! See
# http://www.macroevolution.net/snake-human-hybrids.html and have a laugh, shock
# or an exercise in sibilance!
#
# Last updated: 01 March 2024
#
COLOUR[0]="BLACK"
COLOUR[1]="RED"
COLOUR[2]="GREEN"
COLOUR[3]="YELLOW"
COLOUR[4]="BLUE"
COLOUR[5]="MAGENTA"
COLOUR[6]="CYAN"
COLOUR[7]="WHITE"
DFLT[0]="-DWALL=COLOR_CYAN" # Wall foreground: cyan (WALL)
DFLT[1]="-DWB=COLOR_BLACK" # Wall background: black (WB)
DFLT[2]="-DHEAD=COLOR_RED" # Head foreground: red (HEAD)
DFLT[3]="-DHB=COLOR_BLACK" # Head background: black (HB)
DFLT[4]="-DBODY=COLOR_GREEN" # Body foreground: green (BODY)
DFLT[5]="-DBS=COLOR_BLACK" # Body background: black (BS)
DFLT[6]="-DBG=COLOR_WHITE" # Bug foreground: white (BG)
DFLT[7]="-DBB=COLOR_BLACK" # Bug background: black (BB)
COLOURS[0]="-DWALL=COLOR_"
COLOURS[1]="-DWB=COLOR_"
COLOURS[2]="-DHEAD=COLOR_"
COLOURS[3]="-DHB=COLOR_"
COLOURS[4]="-DBODY=COLOR_"
COLOURS[5]="-DBS=COLOR_"
COLOURS[6]="-DBG=COLOR_"
COLOURS[7]="-DBB=COLOR_"
function show_colours()
{
echo "Colour selection for ${*} (enter for default)"
for i in 0 1 2 3 4 5 6 7; do
printf "(%d) %s\n" "${i}" "${COLOUR[${i}]}"
done
read -rp "Make selection (1 - 7): " colour
case "${colour}" in
0|1|2|3|4|5|6|7)
return "${colour}"
;;
*)
return 255
;;
esac
}
function configure_colours()
{
j=0
for i in "WALL" "WALL (BACKGROUND)" "HEAD" "HEAD (BACKGROUND)" "BODY" "BODY (BACKGROUND)" "BUG" "BUG (BACKGROUND)"; do
show_colours "${i}"
x="${?}"
if [[ "${x}" != 255 ]]; then
COLOURS[j]="${COLOURS[$j]}${COLOUR[$x]}"
else
COLOURS[j]=${DFLT[$j]}
fi
j=$j+1
done
echo cc -o prog.alt prog.alt.c -D'f(a,b)'='((a)<(b)?(a):(b))' "${COLOURS[0]}" "${COLOURS[1]}" \
"${COLOURS[2]}" "${COLOURS[3]}" "${COLOURS[4]}" "${COLOURS[5]}" "${COLOURS[6]}" "${COLOURS[7]}" -lncurses
cc -o prog.alt prog.alt.c -D'f(a,b)'='((a)<(b)?(a):(b))' "${COLOURS[0]}" "${COLOURS[1]}" \
"${COLOURS[2]}" "${COLOURS[3]}" "${COLOURS[4]}" "${COLOURS[5]}" "${COLOURS[6]}" "${COLOURS[7]}" -lncurses || exit 1
}
function just_compile()
{
echo cc -o prog.alt prog.alt.c -D'f(a,b)'='((a)<(b)?(a):(b))' "${DFLT[0]}" "${DFLT[1]}" \
"${DFLT[2]}" "${DFLT[3]}" "${DFLT[4]}" "${DFLT[5]}" "${DFLT[6]}" "${DFLT[7]}" -lncurses
cc -o prog.alt prog.alt.c -D'f(a,b)'='((a)<(b)?(a):(b))' "${DFLT[0]}" "${DFLT[1]}" \
"${DFLT[2]}" "${DFLT[3]}" "${DFLT[4]}" "${DFLT[5]}" "${DFLT[6]}" "${DFLT[7]}" -lncurses || exit 1
}
function testcaps()
{
make || exit 1
./termcaps
T="${?}"
if [[ "${T}" -ne 0 ]]; then
read -rp "Terminal issues detected; do you wish to continue anyway (Y/N) ? " ans
[[ "${ans}" != "y" ]] && [[ "${ans}" != "Y" ]] && exit 1
fi
}
function menu()
{
echo
printf "** GAME MODE SELECTION MENU **\n\n"
echo "(0) Drawing mode"
echo "(1) Drawing mode #2 (start at 400 and shrink by 5 every 100 moves)"
echo "(2) Computer plays by itself (EPILEPSY / STIMULATION OVERLOAD TRIGGER)"
echo "(3) Computer plays by itself #2 (EPILEPSY / STIMULATION OVERLOAD TRIGGER)"
echo "(4) Grow / Shrink mode"
echo "(5) Grow / Shrink mode #2"
echo "(6) Hypnotic mode (EPILEPSY / STIMULATION OVERLOAD TRIGGER)"
echo "(7) Stimulation / Calming mode"
echo "(8) Normal mode (aka Judges' Normal)"
echo "(9) 100ms w/o cheat modes (Judges' Zeroth)"
echo "(10) 75ms w/both cheat modes (Judges' First)"
echo "(11) Immediately win (Judges' Second)"
echo "(12) 50ms w/both cheat modes, evade at 200 moves (Judges' Third)"
echo "(13) 75ms w/both cheat modes, shrink mode (win with six bugs) (Judges' Fourth)"
echo "(14) Let computer win by itself very quickly (Judges' Fifth)"
echo "(15) Start at 400, shrink by 5 every 100 moves, cannibalism, max size possible"
echo "(16) Start at 400, shrink by 5 every 100 moves, max size possible"
echo ""
}
PROG="./prog.alt"
function judges0()
{
clear && WAIT=100 WALLS=0 CANNIBAL=0 ${PROG}
}
function judges1()
{
clear && WAIT=75 WALLS=1 CANNIBAL=1 ${PROG}
}
function judges2()
{
clear && SIZE=-1 ${PROG}
}
function judges3()
{
clear && CANNIBAL=1 WALLS=1 WAIT=50 EVADE=200 ${PROG}
}
function judges4()
{
clear && WAIT=75 GROW=-1 SIZE=5 CANNIBAL=1 ${PROG}
}
function judges5()
{
clear && CANNIBAL=1 WALLS=1 WAIT=0 EVADE=1 MAXSIZE=10 ${PROG}
}
function draw0()
{
clear && MAXSIZE=-1 WAIT=-1 CANNIBAL=1 ${PROG}
}
function draw1()
{
clear && MAXSIZE=-1 WAIT=-1 CANNIBAL=1 SIZE=400 SHED=100 SHEDS=-5 ${PROG}
}
function growshrink3()
{
clear && MAXSIZE=-1 CANNIBAL=1 SIZE=400 SHED=100 SHEDS=-5 ${PROG}
}
function growshrink4()
{
clear && MAXSIZE=-1 SIZE=400 SHED=100 SHEDS=-5 ${PROG}
}
function auto0()
{
clear && WAIT=0 EVADE=1 CANNIBAL=1 MAXSIZE=20 ${PROG}
}
function auto1()
{
clear && WAIT=0 EVADE=1 GROW=-1 SIZE=9 MAXSIZE=10 CANNIBAL=1 ${PROG}
}
function growshrink0()
{
clear && SIZE=150 SHEDS=-5 GROW=10 SHED=50 MAXSIZE=250 ${PROG}
}
function growshrink1()
{
clear && SIZE=100 SHEDS=5 GROW=-10 SHED=50 MAXSIZE=250 ${PROG}
}
function hypno()
{
clear && EVADE=1 CANNIBAL=1 ${PROG}
}
function stim()
{
clear && GROW=0 CANNIBAL=1 ${PROG}
}
function norm()
{
clear && ${PROG}
}
function play()
{
testcaps
read -rp "Do you want to configure colours (Y/N) ? " colours
case "${colours}" in
y|Y)
configure_colours
;;
*)
just_compile
;;
esac
while true; do
menu
read -rp "Make your selection (0 - 16 or any other key to exit): " mode
case "${mode}" in
0) # Drawing mode 0
draw0
;;
1) # Drawing mode 1
draw1
;;
2) # Automatic mode (computer plays by itself) (photosensitive epilepsy/stimulation overload trigger)
auto0
;;
3) # Automatic mode variation 0 (photosensitive epilepsy/stimulation overload trigger)
auto1
;;
4) # grow shrink mode
growshrink0
;;
5) # grow shrink mode variation 0
growshrink1
;;
6) # hypnotic mode (photosensitive epilepsy/stimulation overload trigger)
hypno
;;
7) # stimulation / calming mode
stim
;;
8) # normal mode (aka Judges' Normal)
norm
;;
9) # 100ms w/o cheat modes (Judges' Zeroth)
judges0
;;
10) # 75ms w/both cheat modes (Judges' First)
judges1
;;
11) # Immediately win (Judges' Second)
judges2
;;
12) # 50ms w/both cheat modes, evade at 200 moves (Judges' Third)
judges3
;;
13) # 75ms w/both cheat modes, shrink mode (win with six bugs) (Judges' Fourth)
judges4
;;
14) # Let computer win by itself very quickly (Judges' Fifth)
judges5
;;
15) # Start at 400, shrink by 5 every 100 moves, cannibalism and max size possible
growshrink3
;;
16) # Start at 400, shrink by 5 every 100 moves and max size possible
growshrink4
;;
*)
exit 0
esac
read -rp "Do you want to continue? " ans
if [[ "$ans" != "y" && "$ans" != "Y" ]]; then
break;
fi
done
}
play