#/bin/bash

# moerderspiel.sh
#
# Das Mörderspielskript
#
# Erwartet eine Liste von Namen, mischt diese, erstellt ggf. mehrere
# Kreise und erstellt daraus alle benötigten PDF-Dateien, die der
# Spielleiter ausdrucken, ausschneiden und verteilen kann.
# Regeln siehe z.B. http://moerder.andaka.org/
#
# Copyright (c)2005 Dave Kliczbor <dave@kliczbor.de>
# Version 0.3
#
# Redistribution and use of this script, with or without modification,
# are permitted provided redistributions of this script retain the above 
# copyright notice, this condition and the following disclaimer. 
# 
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND HIS CONTRIBUTORS `AS IS'' AND
# ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR NOR
# HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
# OF THE POSSIBILITY OF SUCH DAMAGE.
#

# Aktuelles Verzeichnis sichern
pushd . 2>&1>/dev/null

# Ohne Parameter oder mit --help als ersten wird eine Hilfe ausgegeben
if( [ -z "$1" ] || [ "$1" == "--help" ] )
then
	echo Das Mörderspielskript
	echo
	echo Erwartet eine Liste von Namen, mischt diese, erstellt ggf. mehrere
	echo Kreise und erstellt daraus alle benötigten PDF-Dateien, die der
	echo Spielleiter ausdrucken, ausschneiden und verteilen kann.
	echo Regeln siehe z.B. http://moerder.andaka.org/
	echo
	echo Syntax: moerderspiel.sh \<datei.txt\> \[Rundenname \[Kreisanzahl \[URL\]\]\]
	echo
	echo In datei.txt müssen die Namen der Mitspieler stehen, einer pro Zeile.
	echo Zeilenumbrüche sind per \\\\ zu erreichen. 

	exit 1
fi

# Dateiname holen
DATEI="$1"

if( [ "$2" ] )
then
	RUNDE="$2"
fi

# Anzahl der Kreise initialisieren
if( [ -z "$3" ] )
then
	KREISE=1
else
	KREISE=$3
fi

# URL einlesen
if( [ -z "$4" ] )
then
	URL="http://moerder.andaka.org"
else
	URL="$4"
fi

# temporäres verzeichnis anlegen
TMP=$(mktemp -d)
echo $TMP

BIFS="$IFS"
IFS="
"
# Namen in Array einlesen
a=0
for n in $(cat $DATEI)
do
	# Nur wenns keine Leerzeile ist, nehmen wir den Namen auf
	if( [ "$n" ] )
	then
		NAME[$a]="$n"
		a=$(($a+1))
	fi
done
COUNT=$a
IFS="$BIFS"

# mischen der Namen in die Kreise
for (( k=0; k<$KREISE; k=$k+1 ))
do
	echo -n Berechne Kreis $k...
	allesok=0
	while (( $allesok==0 ))
	do
		# "würfeln"...
		for (( a=0; a<$COUNT; a=$a+1 ))
		do
			TARGET=$(( ($RANDOM * $COUNT)/32767 ))
			t="${NAME[$a]}"
			NAME[$a]="${NAME[$TARGET]}"
			NAME[$TARGET]="$t"
		done
		# prüfe, ob predecessor und successor für alle knoten in allen kreisen ungleich ist
		allesok=1
		# prüfe für jeden einzelnen knoten im zuletzt angelegten kreis
		for (( x=0; x<$COUNT; x=$x+1 ))
		do
			# ich brauch ein testdatum sowie predecessor und successor, 
			# dann muss ich es in den bisherigen kreisen wiederfinden
			TESTDATUM="${NAME[$x]}"
			PRETEST="${NAME[(( ($x+$COUNT-1)%$COUNT ))]}"
			POSTTEST="${NAME[(( ($x+1)%$COUNT ))]}"			
			# gehe durch alle bisher existenten kreise bis auf den "aktuellen" kreis
			for (( sk=0; sk<$k; sk=$sk+1 ))
			do
				# jetzt durch alle knoten in den kleineren kreisen
				for (( a=0; a<$COUNT; a=$a+1 ))
				do
					T="${NAMES[(( $sk*$COUNT+$a ))]}"
					# und wenn der Testknoten "wiedergefunden" wurde, werden die pre- und successoren verglichen
					if [ "$T" = "$TESTDATUM" ]
					then
						PRET="${NAMES[(( $sk*$COUNT+(($a+$COUNT-1)%$COUNT) ))]}"
						POSTT="${NAMES[(( $sk*$COUNT+(($a+1)%$COUNT) ))]}"
						if [ "$PRETEST" = "$PRET" ]
						then
#							echo $PRETEST-$PRET
							allesok=0
						fi
#						echo "$(( $sk*$COUNT+( ($a+1)%$COUNT ) ))"
						if [ "$POSTTEST" = "$POSTT" ]
						then
						#	echo --- $POSTTEST-$POSTT
							allesok=0
						fi
					fi
				done
			done
		done
	done
	for (( a=0; a<$COUNT; a=$a+1 ))
	do
		NAMES[(($k*$COUNT+$a))]="${NAME[$a]}" # zweidimensionales Array simulieren
		if [ -z "${NAME[$a]}" ]
		then
			echo Zu viele Kreise ... konnte keine passende Permutation finden.
			exit 1
		fi
	done
	echo fertig
done	
 
# Kopf der tex-Datei für die Mordauftragszettel anlegen
cat >$TMP/moerder.tex <<ENDE
\documentclass[a4paper]{scrartcl}
\usepackage{ngerman}
\usepackage{a4wide}
\usepackage[latin1]{inputenc}
\usepackage{tabularx}
\usepackage{multicol}
\usepackage{url}
\usepackage[left=1cm,right=1cm,top=1cm,bottom=1cm,includeheadfoot]{geometry}
\columnsep2cm
\pagestyle{empty}
\begin{document}\begin{multicols}{2}
ENDE

# Alle Namen pro Kreis einmal auf eine kleine umrandete minipage bringen zum Ausschneiden
for (( k=0; k<$KREISE; k=$k+1 ))
do
	for (( n=0; n<$COUNT; n=$n+1 ))
	do
		# Kopf der minipage für jeden Namen
		name=${NAMES[(($k*$COUNT+$n))]}
		cat >>$TMP/moerder.tex <<-ENDE
		\fbox{\begin{minipage}{7cm}\begin{center}
		ENDE

		# Wenns einen Rundennamen gibt...
		if( [ "$RUNDE" ] )
		then
			echo Runde: ${RUNDE} >>$TMP/moerder.tex
		fi
		
		# Wenns Rundennamen _und_ mehrere Kreise gibt
		if( [ "$KREISE" -gt 1 -a "$RUNDE" ] )
		then
			echo  " -- " >>$TMP/moerder.tex
		fi
		
		# Wenns nur einen Kreis gibt, wird keine Kreisnummer mitgedruckt
		if( [ "$KREISE" -gt 1 ] )
		then
			echo Kreis $k >>$TMP/moerder.tex
		fi
		
		# Namen eintragen
		cat >>$TMP/moerder.tex <<-ENDE
		~\\\\
		\vskip0.2cm
		Mordauftrag: \\\\
		{\Large \textbf{\sffamily{$name}}} \\\\
		\end{center}
		ENDE

		# Wenns nur einen Kreis gibt, soll ein anderer Text hin als bei mehreren
		if( [ "$KREISE" -gt 1 ] )
		then
			#Wer diesen Mordauftrag wegen eines Mordes abgeben muss, ist raus aus Kreis $k, kann aber in \textit{allen} Kreisen als Zeuge gelten, bis er in allen Kreisen als tot gilt und die Markierung ablegen muss.\\\\
			cat >>$TMP/moerder.tex <<-ENDE
			\scriptsize{Dieser Mordauftrag ist an den eigenen Mörder aus Kreis $k abzugeben, sobald dieser erfolgreich war.\\\\
			ENDE
		else
			cat >>$TMP/moerder.tex <<-ENDE
			\scriptsize{ Nachdem man selbst regelkonform ermordet wurde, muss dieser Mordauftrag an den eigenen Mörder übergeben werden.\\\\
			ENDE
		fi
		cat >>$TMP/moerder.tex <<-ENDE
		Trage diesen Mordauftrag immer bei dir, zeige ihn nach dem Mord deinem Opfer zum Beweis, unterschreibe und hänge ihn aus.\\\\}
		\vskip0.3cm
		Erledigt von: \underline{\hskip4.5cm}
		ENDE

		# ende der minipage
		cat >>$TMP/moerder.tex <<-ENDE
		\begin{center}\url{${URL}}\end{center}
		\end{minipage}}
		\vskip1.5cm
		ENDE
		
	done
done

# Fuß der .tex-Datei für die Mordauftragszettel ausgeben
cat >>$TMP/moerder.tex <<ENDE
\end{multicols}
\end{document}
ENDE

# PDF der Mordaufträge kompilieren
cd $TMP
pdflatex moerder

# Kopf der .tex-Datei für die Mordliste ausgeben
cat >$TMP/moerderliste.tex <<ENDE
\documentclass[a4paper,10pt]{scrartcl}
\usepackage{ngerman}
\usepackage{a4wide}
\usepackage[latin1]{inputenc}
\pagestyle{empty}
\begin{document}
ENDE

# durch die Listen gehen und ausgeben, so dass der Spielleiter etwas damit anfangen kann
for (( k=0; k<$KREISE; k=$k+1 ))
do
	# Tabellenkopf ausgeben
	cat >>$TMP/moerderliste.tex <<-ENDE
	\section*{Runde $RUNDE -- Kreis $k}
	\begin{tabular}{ll}
	Auf den Umschlag schreiben & In den Umschlag stecken\\\\
	\hline
	ENDE

	# Liste der Namen ausgeben in zwei Spalten
	for (( n=0; n<$COUNT; n=$n+1 ))
	do

		name1=$( echo ${NAMES[(( ($k*$COUNT)+($n%$COUNT) ))]} | sed 's/\\\\/ -- /g' )
		name2=$( echo ${NAMES[(( ($k*$COUNT)+(($n+1)%COUNT) ))]} | sed 's/\\\\/ -- /g' )

		cat >>$TMP/moerderliste.tex <<-ENDE
		${name1} & ${name2} \\\\
		ENDE

	done

	# Tabellenfuß ausgeben
	cat >>$TMP/moerderliste.tex <<-ENDE
	\end{tabular}
	ENDE
done

# Fuß der Mordliste
cat >>$TMP/moerderliste.tex <<ENDE
\end{document}
ENDE

# Mordliste kompilieren
cd $TMP
pdflatex moerderliste

# Listen ins aktuelle Verzeichnis kopieren und temporäres Verzeichnis löschen
popd 2>&1>/dev/null
mv "$TMP/moerder.pdf" "./moerder-${RUNDE}.pdf"
mv "$TMP/moerderliste.pdf" "./moerderliste-${RUNDE}.pdf" 
rm -rf "$TMP"

echo
echo =========================================
echo
echo Fertig!
echo Schau mal in diese beiden Dateien:
echo   moerder-${RUNDE}.pdf 
echo   moerderliste-${RUNDE}.pdf
echo 
