\documentclass[a4paper,12pt]{article}

\usepackage[french]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tabularx}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{eurosym}
\usepackage{epsfig}

\title{AJAX - Enoncé 2}
\author{D.Moreaux}

\begin{document}
\maketitle
\abstract
Ce second projet sert d'introduction à l'objet XMHttpRequest et aux
accès à la base de données Postgresql. Il consistera à écrire des
informations dans certaines tables.

\section{Enoncé}
Pour ce projet, on agira exclusivement au niveau de l'interface
d'édition. On ajoutera les fonctionnalités suivantes :
\begin{itemize}
\item ajout d'une pièce
\item ajout d'un message
\item ajout d'un objet
\end{itemize}

Dans un projet ultérieur, l'interface correspondante devra être un
peu revue (ajout du listing des éléments présents et possibilité de
modification).

\subsection{HTML}
Au niveau de l'éditeur, on ajoutera trois divisions (si elles ne
sont pas déjà présentes): Description des
pièces, messages et objets.

Le menu permettra de passer à ces affichages en utilisant une fonction
séparée pour chaque situation (plus tard, il faudra ajouter dans ces fonctions
le code qui chargera la liste des entrées présentes). On peut utiliser une
fonction supplémentaire commune pour effectuer le changement de division (page)
active (mais ce n'est pas une obligation)

Ces divisions proposeront un bouton : ``nouveau''. ce bouton affichera une division
au dessus de la page (positionnement absolu et z-index) contenant une zone d'entrée
(textarea) qui permettra d'entrer le texte, un bouton pour l'envoyer
et un bouton pour annuler. Ces divisions {\em boîte de dialogue} seront distinctes
(elles seront amenées à évoluer à l'avenir).

\subsection{JS}
Il faudra d'abord prévoir les fonctions qui permettent de passer d'une
page à l'autre et d'afficher ou masquer les divisions boîte de dialogue
(ne pas oublier de les masquer quand on arrive sur la page).
  
Au niveau des formulaires d'entrée, on effectuera une requête POST
pour envoyer le texte au serveur. Ces fonctions seront modifiées
ultérieurement pour déclencher une mise à jour de l'affichage.

\subsection{PHP}
Il faudra prévoir trois routines en PHP qui pousseront chacune un type
de données dans la DB. Attention, pour les objets, pousser la position
de départ -1 (non créé) et ignorer le champ wid (pour le moment). Les
mécanismes permettant de gérer ces champs seront implémentés plus tard.

\section{La DB}
Les DB ont été alimentées automatiquement avec les tables vides (les
messages systèmes et les paramètres sont déjà alimentés en données).

Pour vérifier le contenu des tables, il faudra utiliser l'interface de
base de données de PHPStorm.

Pour se connecter à la DB, on utilisera la chaîne de connexion
suivante :
\begin{verbatim}
pgsql:host=localhost;port=5433;dbname=js24xx;user=js24xx;
   password=motde12passe
\end{verbatim}
où les valeurs de dbname, user et password seront adaptées à votre
profil.

Pour insérer des données, on prendra soin de ne pas préciser la
valeur du champ d'index auto-incrémenté (le type \verb|SERIAL|) afin
de permettre la génération d'une nouvelle valeur et de soit omettre
soit préciser à NULL le champ \verb|wid| de la table des objets
\verb|obj|.

Le fichier quill.sql permet de créer les tables et le fichier drop.sql
permet de les effacer. Pour resetter les DB, il suffira donc
d'exécuter ces deux fichiers au niveau de la liste des schémas,
d'abord le drop.sql puis le quill.sql.

\section{Structure de la DB}
\subsection{usr}
Cette table contiendra les utilisateurs (joueurs)

\begin{tabular}{l|l}
  uid & numéro d'utilisateur \\
  login & nom d'utilisateur \\
  passwd & mot de passe hashé en sha256 \\
  autosave & partie en cours sérialisée
\end{tabular}

\subsection{savegame}
Les parties sauvées seront stockées ici. Le numéro de slot permettra
d'identifier  les différentes parties d'un joueur

\begin{tabular}{l|l}
  sid & numéro de sauvegarde \\
  slot & emplacement de sauvegarde \\
  uid & numéro de l'utilisateur \\
  savedata & partie sérialisée
\end{tabular}

\subsection{params}
La table params contiendra les paramètres globaux de la partie :
taille des mots et nombre d'objets pouvant être transportés. D'autres
variables pourront apparaître plus tard

\begin{tabular}{l|l}
  param & nom du paramètre \\
  value & valeur (numérique) du paramètre
\end{tabular}

\subsection{location}
Cette table contiendra les description des différentes pièces. Cette
table peut potentiellement contenir de l'HTML.

La pièce 0 (pièce de départ) est précréée.

\begin{tabular}{l|l}
  rid &  Numéro de la pièce \\
  roomdesc & description de la pièce
\end{tabular}

\subsection{obj}
Cette table contiendra les informations sur les objets : description,
position de départ et mot associé.

La position sera soit le numéro de la pièce associée, soit -1 (non
créé), -2 (porté) ou -3 (transporté, dans l'inventaire)\footnote{Dans
  le programme d'origine, les valeurs 252, 253 et 254 étaient
  utilisées}

Le mot associé vaudra soit NULL si aucun mot n'est associé soit le
numéro du mot. Si l'objet a un mot dont le numéro est supérieur ou
égal à 1000, il s'agira d'un objet pouvant être {\em porté} (vêtement,
arme, \dots)\footnote{dans le programme d'origine, c'était les mots
  dont le numéro était supérieur à 200}.

L'objet 0 (source de lumière) est précréé.

\begin{tabular}{l|l}
  objid & numéro de l'objet \\
  objdesc & description de l'objet, peut contenir de l'HTML \\
  startloc & position de départ \\
  wid & mot du dictionnaire associé à l'objet
\end{tabular}

\subsection{msg}
Cette table reprendra les messages. Ces messages pourront être en
HTML.

\begin{tabular}{l|l}
  mid & Numéro du message \\
  message & texte du message, peut contenir de l'HTML
\end{tabular}

\subsection{smsg}
Cette table contiendra les messages système. Aucun message ne doit y
être ajouté (leurs numéros sont réservés) et il sera possible de les
éditer pour changer la langue de l'aventure.

Les messages sont précréés dans cette table et ils peuvent contenir de
l'HTML.

\begin{tabular}{l|l}
  smid & Numéro du message \\
  message & texte du message,  peut contenir de l'HTML
\end{tabular}

\subsection{vocab}{l|l}
Cette table contient le vocabulaire. Les mots sont uniques par contre
les numéros ne le sont pas.

Les mots dont le numéro est inférieur ou égal à 12 correspondent aux
directions. Les mots dont les numéros sont supérieurs ou égaux à 1000
correspondent à des objets qui peuvent être portés (vêtements,\dots)

La taille des mots sera limitée à {\em wordsize} lettres. Les mots
devront donc être tronqués à cette taille avant d'être sauvés.

Les mots possédant le même numéro seront considérés comme synonymes. On
pourrait par exemple définir GET, TAKE et GRAB comme étant synonymes.

\begin{tabular}{l|l}
  wid & numéro du mot \\
  word & mot
\end{tabular}

\subsection{move}
Cette table décrira les mouvements {\em automatiques}. Si la
combinaison pièce/mot est trouvée, elle indiquera la nouvelle pièce
dans laquelle se rendre.

\begin{tabular}{l|l}
  rid & numéro de la pièce concernée \\
  wid & numéro du mot concerné \\
  newroom & numéro de la pièce destination
\end{tabular}

\subsection{action}
Cette table regroupera les informations de deux tables du jeu : la
table de status et la table d'event (ou d'action).

Le champ tbl vaudra 0 pour un status (exécution avant l'entrée d'une
commande) et 1 pour un evénement (effectue la commande entrée).

Les champs wid1 et wid2 seront testés avec les mots décodés de la
ligne de commande dans le cas d'un événement. Une valeur NULL
indiquera que n'importe quel mot est acceptable.

Le champ pgm contiendra les données sérialisées concernant les tests
et les actions à effectuer.

\begin{tabular}{l|l}
  aid & id de l'entrée \\
  tbl & 0 ou 1 selon que l'entrée concerne la table de status ou
  d'event \\
  wid1 & premier mot associé (verbe) \\
  wid2 & deuxième mot associé (objet) \\
  pgm & conditions et actions sérialisées
\end{tabular}

\end{document}
