La tour du destin : un projet de jeu de rôle en Bash

Un projet de jeu de rôle en Bash, just for fun =)

* Travailler sur github.com (eh oui, pour apprendre de le faire comme il faut) !

### Des idées sur le monde du jeu

#### Les carrés (locations)

On divise le « monde » en carrés (voir l'illustration 1) numérotés. Format d'index de carrés : XXYYZZ. L'index servira d'index du ligne dans le fichier de données du jeu :

```
XXYYZZ <données de location A>
XXYYZZ <données de location B>
etc

```

Chaque carré peut avoir 6 sorties (voir l'illustration 1). À chaque sortie devrait être associé :

* soit l'index du carré ou la sortie mène ;
* soit l'index 000000, qui signifiera que cette sortie n'existe pas.

### Une location

Le jeu procède d'une location à une autre. Dans chaque location le joueur devrait avoir :

* un nom de location
* une description de location
* une liste des objets et monstres présents
* une liste des actions <- mais je penche plutôt pour une liste général, applicable sur des objets
* quoi d'autre ?

**À réfléchir!** Est-ce qu'on présent les sorties (portes, fenêtres, escaliers, etc) dans la description, ou comme des objets ?

Dans la description ?

* Plus facile à réaliser (un plus)
* Inamovible (un gros défaut)

Comme des objets ?

* Plus difficile à réaliser (un défaut)
* On pourrait les manipuler (créer / modifier / détruire) dynamiquement dans le jeu ; exemples :
	+ il y a une porte cachée, on fait l'action « Chercher » et on la trouve (modifie l'attribut « Caché ») ;
	+ il y a une porte fermée, on a une clé et on fait l'action « Utiliser [un objet] » sur [la porte] » (modifie l'attribut « Fermé » )
	+ on a une arme normale et une potion magique, on fait l'action « Utiliser [un objet] » sur l'arme et ça ajoute une attaque / défense magique ;
	+ on à un coffre, on fait l'action « Ouvrir » sur lui et on trouve quelque chose dedans (ajouter un autre objet dans la locations) ;
	+ etc.

## Format de données

Ici on ajoutera pour le moment les brouillons des formats du fichier données pour en discuter ensuite.

### Brouillon 1

Fonctionnement
concret

N1.P1 .OP1.EV1
= Piece vide avec 2 fenêtre et 2 porte (on vient d’une porte), on peux soit
chercher, ouvrir la prochaine porte ou revenir en arrière.

N1.P2.OP2.EV3
= Presence de monstre X, choix d’attaquer, fuir ou d’utiliser un item. Attaquer
mene a

N1.P1.OP3.EV3
= Attaque (choisis arme) tue le monstre, mene a >> N1.P1.OP1.EV2 . Je choisit de
chercher, je trouve un tresor mene a >> N1.P1.OP1.EV1 (si on cherche la
piece est vide car EV1 = piece vide)

N1 + P1 =
1.1 (coordonnes sur le cube) = [(Nord=Fenetre);(Ouest=Fenetre);(Est=Porte);(Sud=porte)]

( pieces
par étage, les pieces 1,3,7,9 represente les extremités, 5 le centre)

Par defaut une piece 1 a Face nord une fenetre
et face ouest une fenetre, les 2 autres des portes.

```
------- F --------------- F ------------------ F------------
F ...... 1 ...........P......... 2.............P...........3 ..........F
F......... 4....... P .........5......... P.............6 .............F

```

Options :

* 1=[1=chercher;2=ouvrir porte;3=revenir en arriere]

* 2=[1=Attaquer;2=Fuir;3=Utiliser item]

* 3=(Sub attack)[1=epee;2=lance;3=baton;4=menu precedent]
* 4=(Item submenu)[1=potion;2=fumigene;3=menu precedent]
* 5=[1=ouvrir coffre;2=Poursuivre son chemin(mène à option 1]

Évènement (parfois linker à option)

* 1=[Piecevide] lier a option 1

* 2=[Piece vide et objet cache] lier a option 1

* 3=[Monstres (banque de monstre separer)] lier a option 2

* 4=[Coffre au tresor]

* 5=[Piege] =si option 1 choix 1 est pas choisis = degat.

## Brouillons de code

### Sortie de texte

```
#!/bin/bash
#
 # print text on screen with a delay after each character (draft version)
#
 print_text () {
  # Color codes for printf
 BLACK=$(tput setaf 0)
 RED=$(tput setaf 1)
 GREEN=$(tput setaf 2)
 YELLOW=$(tput setaf 3)
 LIME_YELLOW=$(tput setaf 190)
 POWDER_BLUE=$(tput setaf 153)
 BLUE=$(tput setaf 4)
 MAGENTA=$(tput setaf 5)
 CYAN=$(tput setaf 6)
 WHITE=$(tput setaf 7)
 BRIGHT=$(tput bold)
 NORMAL=$(tput sgr0)
 BLINK=$(tput blink)
 REVERSE=$(tput smso)
 UNDERLINE=$(tput smul)
 # Delay after each character, in 0.X s
 DELAY=05
  # Text to type
  TEXT="$@"
  TEXT_LENGTH=${#TEXT}

  for ((i=0 ; i <= TEXT_LENGTH ; i++)) ; do
   case "${TEXT:i:1}" in
     '\' ) # Read the next char as control ?
       case "${TEXT:((i+1)):1}" in
         'n' ) printf '\n' ;;
         't' ) printf '\t' ;;
         'b' ) printf "$BRIGHT" ;;
         'u' ) printf "$UNDERLINE" ;;
         'r' ) printf "$REVERSE" ;;
         '0' ) printf "$NORMAL" ;;
         *   ) printf '%s' "${TEXT:((i+1)):1}" ;;
       esac
       ((i+=1))
        ;;
      *)
        printf '%s' "${TEXT:i:1}"
       sleep "0.${DELAY}s"
       ;;
    esac
  done
 }

```