#!/bin/bash
# Skrypt hangman - prosta wersja gry "Wisielec", w której nie są rysowane
# kolejne fragmenty wisielca, tylko zliczane nieudane próby odgadnięcia
# liter. W jedynym argumencie skryptu można określić liczbę fragmentów
# wisielca.

wordlib="/usr/lib/games/lista-słów.txt"
empty="\."      # Ta zmienna, używana w poleceniu sed, musi mieć jakąś wartość,
                # gdy $guessed="".
games=0

# Na początek sprawdzamy, czy jest dostępny plik ze słowami.

if [ ! -r "$wordlib" ] ; then
  echo "$0: brak pliku '$wordlib' ze słowami." >&2
  echo "(Pobierz archiwum ze strony ftp://ftp.helion.pl," >&2
  echo "po rozpakowaniu zapisz plik jako '$wordlib' i gotowe!)" >&2
  exit 1
fi

# Zewnętrzna duża pętla, w której wykonywany jest cały kod gry.

while [ "$guess" != "koniec" ] ; do
  match="$(randomquote $wordlib)"      # Wybranie nowego słowa z pliku.

  if [ $games -gt 0 ] ; then
    echo ""
    echo "*** Nowa gra! ***"
  fi

  games="$(( $games + 1 ))"
  guessed="" ; guess="" ; bad=${1:-6}
  partial="$(echo $match | sed "s/[^$empty${guessed}]/-/g")"

  # Ten blok realizuje operacje: odgadnięcie > analiza > wyświetlenie wyniku > powrót.

  while [ "$guess" != "$match" -a "$guess" != "koniec" ] ; do

    echo ""
    if [ ! -z "$guessed" ] ; then   # Pamiętaj: ! –z oznacza "niepusty".
      echo -n "Zgadywane litery: $guessed. "
    fi
    echo "Liczba fragmentów wisielca: $bad, odgadywane słowo: $partial."
 
    echo -n "Wpisz literę: "
    read guess
    echo ""

    if [ "$guess" = "$match" ] ; then   # Odgadłeś!
      echo "** Jesteś uratowany! Dobra robota! Odgadywane słowo: \"$match\"."
    elif [ "$guess" = "koniec" ] ; then   # Kończysz? OK.
      sleep 0     # Polecenie zapobiegające wyświetleniu komunikatu
                  # o błędzie po wpisaniu słowa 'koniec'.
    # Teraz za pomocą różnych filtrów sprawdzamy odgadywane słowo.
    elif [ $(echo $guess | wc -c | sed 's/[^[:digit:]]//g') -ne 2 ] ; then 
      echo "O, nie. Litery musisz odgadywać pojedynczo."
    elif [ ! -z "$(echo $guess | sed 's/[[:lower:]]//g')" ] ; then
      echo "O, nie. Wpisuj tylko małe litery."
    elif [ -z "$(echo $guess | sed "s/[$empty$guessed]//g")" ] ; then
      echo "O, nie. Odgadywałeś już \"$guess\"."
    # Teraz sprawdzamy, czy słowo zawiera podaną literę.
    elif [ "$(echo $match | sed "s/$guess/-/g")" != "$match" ] ; then
      guessed="$guessed$guess"
      partial="$(echo $match | sed "s/[^$empty${guessed}]/-/g")"
      if [ "$partial" = "$match" ] ; then
        echo "** Jesteś uratowany! Dobra robota! Odgadywane słowo: \"$match\"."
        guess="$match" 
      else
        echo "* Super! Odgadywane słowo zawiera literę  \"$guess\"!"
      fi
    elif [ $bad -eq 1 ] ; then
      echo "** Niedobrze! Przekroczyłeś maksymalną liczbę prób. Już po tobie!"
      echo "** Odgadywane słowo to: \"$match\"."
      guess="$match"
    else
      echo "* Niedobrze, w odgadywanym słowie nie ma litery \"$guess\"."
      guessed="$guessed$guess"
      bad=$(( $bad - 1 ))
    fi
  done
done
exit 0
