Commit 54a9f129 authored by Mathieu Loiseau's avatar Mathieu Loiseau
Browse files

Gestion du niveau pour les temps et nb cartes. Reste "plus" "que" les scores associés

parent 4b90f8c6
......@@ -7,7 +7,6 @@ require('./sys/utils.func.php');
require('./sys/db.class.php');
require('./sys/constants.php');
require('./models/user.class.php');
require('./models/userlvl.class.php');
require('./languages/language.php');
//C'est pas beau mais sans mvc ici
......
<?php
require_once("./models/item.factory.class.php");
require_once("./models/card.class.php");
require_once("./models/userlvl.class.php");
class diviner_game
{
......@@ -58,10 +59,8 @@ class diviner_game
//récupération des informations de base : id user et sa langue
$this->user = user::getInstance();
$this->diviner = $this->user->id;
$this->userlvl = userlvl::getInstance();
$this->time = $this->userlvl->get_time();
//récupération des points de sanction
//récupération des points de sanction (not handled by gameHandler et tant pis)
$this->pointsSanction = loosePointsDevin;
......@@ -148,6 +147,10 @@ class diviner_game
$carte = new Card($this->raisin->carteID);
$this->card = $carte;
//Gestion du temps
$gh = new GameHandler();
$this->time = $gh->get_augur_time($this->user->userlvl, $this->raisin->duration);
// récupération du pseudo de l'oracle pour savoir qui on écoute
$db = db::getInstance();
$sql = 'SELECT username
......
......@@ -73,7 +73,7 @@ class diviner_result
$this->userlvl = userlvl::getInstance();
$this->points= $this->userlvl->get_points();
$this->time = $this->userlvl->get_time();
//$this->time = $this->userlvl->get_time(); /*can't understand why we would need it now…)*/
return true;
......
<?php
require_once("./models/item.factory.class.php");
require_once("./models/userlvl.class.php");
class oracle_alea_exist
{
private $errors = array();
private $nivcarte = '';
private $userlang = '';
private $user= '';
private $oracle= '';
public $card;
private $res='';
private $result= '';
private $mode = '';
......@@ -38,13 +39,6 @@ class oracle_alea_exist
$this->oracle = $this->user->id;
$this->userlang = $this->user->langGame;
$this->userlvl = userlvl::getInstance();
$this->time = $this->userlvl->get_time();
// Ici il faudra récupérer le niveau de l'utilisateur pour n'afficher sur tel ou tel nb de mots tabous.
// récupérer scoreID dans user, puis scoreglobal dans score. si score = tant, $niveau = facile, moyen ou difficile
// En fonction, ne récupérer que le mot, les deux mots tabous ou les 5 mots tabous. Sinon on peut vider $res de ses mots tabous.
return true;
}
......@@ -53,8 +47,13 @@ class oracle_alea_exist
$cardFactory = new ItemFactory($this->oracle,$this->user->langGame);
$card = $cardFactory->get_card(ItemFactory::CARD_NOT_ME);
if(is_object($card) && get_class($card)=="Card"){
//echo "<script>window.alert('C bon ça');</script>";
$this->card=$card;
//Gestion des règles
$gh = new GameHandler();
$this->time = $gh->get_oracle_time($this->user->userlvl);
$this->card->set_forbidden_count($gh->get_forbidden_count($this->user->userlvl));
$res = true;
}
else{
......
<?php
require_once("./models/userlvl.class.php");
require_once('./models/card.class.php');
......@@ -16,7 +16,7 @@ class oracle_card_alea
private $boobool = true;
private $time;
private $card;
private $mot = '';
private $tabou1 = '';
private $tabou2 = '';
......@@ -45,54 +45,52 @@ class oracle_card_alea
public function init()
{
$this->submit = isset($_POST['submit_form']);
$this->userlvl = userlvl::getInstance();
$this->time = $this->userlvl->get_time();
$this->time = 90; //à la porc until we have a card…
//quand on a appuyé sur "valider", récupération du formulaire
if ( $this->submit )
{
{
$this->res['mot'] = isset($_POST['mot']) ? trim($_POST['mot']) : '';
$this->res['nivcarte'] = isset($_POST['nivcarte']) ? trim($_POST['nivcarte']) : '';
$this->res['tabou1'] = isset($_POST['tabou1']) ? trim($_POST['tabou1']) : '';
$this->res['tabou2'] = isset($_POST['tabou2']) ? trim($_POST['tabou2']) : '';
$this->res['tabou3'] = isset($_POST['tabou3']) ? trim($_POST['tabou3']) : '';
$this->res['tabou4'] = isset($_POST['tabou4']) ? trim($_POST['tabou4']) : '';
$this->res['tabou5'] = isset($_POST['tabou5']) ? trim($_POST['tabou5']) : '';
$this->et_c_est_le_temps_qui_court = date("d/m/Y H:i");
}
// initialisation du booléen de codiion finale d'acceptation de la génération
$this->boobool = true;
// récupération des informations relatives à l'utilisateur: userid, et sa langue.
$this->user = user::getInstance();
$this->oracle = $this->user->id;
$this->userlang = $this->user->userlang;
// la génération automatique de carte n'existe qu'en français pour l'instant
if ($this->userlang !== 'fr'){
array_push( $this->errors,'no_card_active');
}
return true;
}
public function crawler()
{
if ( (($this->submit) && ($this->boobool == false)) || (!$this->submit)) // si on a appuyé sur valider mais que la carte est mauvaise (rechargement de la page) ou qu'on n'a pas encore appuyé sur valider
{
include_once('controllers/simple_html_dom.php');
// fonction aléatoire entre 0 et 100 000
$alea = mt_rand(0, 100000);
......@@ -104,13 +102,13 @@ class oracle_card_alea
foreach($html->find('body') as $post){
$post= iconv("ISO-8859-1", "UTF-8", $post);
$posts = $post ? explode('<br>', $post) : array();
foreach ($posts as $wpost){
$findmot = '&lt;mot-formate&gt;'; // pour trouver le mot à trouver
$findme = '&quot; tid=&quot;'; // pour trouver les mots tabous
$mos = strpos($wpost, $findmot);
$pos = strpos($wpost, $findme);
// Notez notre utilisation de ===. == ne fonctionnerait pas comme attendu
// car la position de 'a' est la 0-ième (premier) caractère.
......@@ -129,33 +127,33 @@ class oracle_card_alea
$pos3=strpos($wpost, '&lt;rel type=&quot;');
$pos4=strpos($wpost, '&quot; poids');
$tabbalise=substr($wpost, $pos3+19, ($pos4-($pos3+19)));
//ici appel d'une fonction de tri qui renvoie vrai ou faux selon si le mot est acceptable comme mot tabou
// test de $motatrouver dans $tabword, test de "_" dans $tabword, test de /^[A-Za-z]/ (s'il n'y a que des chiffres)
// si au moins une de ces conditions est vrai alors la fonction renvoie false et le mot n'est pas ajouté.
if ($this->checkmottab($motatrouver,$tabword,$tabbalise,$listemot)==true){
//test extérieur car la fonction renvoie juste vrai. remplace "patate>89621" par "patate" tout court
$tabword = preg_replace ('/\&gt;[0-9]+/', '' , $tabword);
$listemot = $listemot.",".$tabword;
}
}
}
}
//changement d'encodage à faire ici
$this->tableau = $listemot ? explode(',', $listemot) : array();
//Si la carte n'a pas 5 mots tabous, on ne la valide pas.
if (!isset($this->tableau[5]))
{
$this->boobool = false;
}else{
// carte acceptée
//adaptation à la page display qui utilise $res
$this->res['mot'] = $this->tableau[0];
$this->res['tabou1'] = $this->tableau[1];
......@@ -164,63 +162,63 @@ class oracle_card_alea
$this->res['tabou4'] = $this->tableau[4];
$this->res['tabou5'] = $this->tableau[5];
$this->boobool =true;
}
}
}
}
}
private function checkmottab($a,$b,$c,$d) //$a = $motatrouver, $b = $tabword, $c = $tabbalise, $d = $listemot
{
{
$inclusiondash = strpos($b, '_'); //supprime tout ce qui commence par "_"
if($inclusiondash !== false){
return false;
}
$tagset = strpos($c, 'r_pos'); //supprime ce qui n'est que tag (Nom+Masc+Sing)
if($tagset !== false){
return false;
}
$inclusionmot = stripos($b, $a);//supprime tous les tabword contenant le mot à trouver: à affiner car on pourrait garder le reste
if($inclusionmot !== false){
return false;
}
$racinemot= substr($a,0,4); //récupère les 4 premiers caractères du mots (racine) si le mot ne fait que 3 lettres ça prend les trois lettres
$inclusionracine = stripos($b,$racinemot);
$inclusionracine = stripos($b,$racinemot);
if($inclusionracine !== false){ // Si le mot tabou a la même racine que le mot à trouver
// L'idéal serait d'arriver à garder certains mots des locutions au lieu de les supprimer mais cette
//condition ne marche pas:
//~ $locution = preg_match($a.' W+ w+',$b); // Vérfification de locution, si s'en est une ($motatrouver de blabla):
//~ if (($locution !== false)){
//~ $b = preg_replace ($a.' W+ ', '' , $b);// remplace "$motatrouver de " par rien et ne garde que le "blabla".
//~ }else{
return false; //sinon c'est juste un mot de la même famille
//~ }
}
$suitepointschiffres = preg_match('/::/',$b); //enlève les suites du genre ":::112905:56362"
if (($suitepointschiffres == 1)){
return false;
}
$racinetab= substr($b,0,4); //récupère les 4 premiers caractères du mots (racine) si le mot ne fait que 3 lettres ça prend les trois lettres
$doublon = stripos($d,$racinetab); // recherche du mot tabou dans la liste des mots tabous déjà enregistrés
if (($doublon !== false)){
return false;
}
return true;
}
private function display()
......@@ -230,9 +228,9 @@ class oracle_card_alea
//on relance la procédure de génération
$this->process();
}else{
if(isset($_POST['submit_form'])) //carte validée, enregistrement dans la BD
{
{
if ( !$this->submit || $this->errors )
{
return false;
......@@ -247,13 +245,17 @@ class oracle_card_alea
$this->res['nivcarte'], "nom", $this->oracle, $this->res['mot'], $forbidden, Array()/*, './views/card.inline.display.php'*/);
$carte->store();
$this->card = $carte ;
unset($this->res);
//Gestion des règles
$gh = new GameHandler();
$this->time = $gh->get_oracle_time($this->user->userlvl);
$this->card->set_forbidden_count($gh->get_forbidden_count($this->user->userlvl));
unset($this->res);
// affichage de la carte
include('./views/oracle.card.display.html');
}else{
include('./views/oracle.card.display.html');
}else{
//si carte pas encore validée, c'est le premier passage dans la page : affichage de la page génération de carte
include('./views/oracle.alea.html');
include('./views/oracle.alea.html');
}
}
return true;
......
<?php
require_once("./models/card.class.php");
require_once('./models/card.class.php');
class oracle_card_byid
{
private $errors = array();
private $userlang ;
private $user ;
private $oracle ;
public $carteId ;
private $card;
private $mode;
private $userlvl;
private $time;
......@@ -32,20 +32,18 @@ class oracle_card_byid
}
private function init()
{
{
// récupération de l'id de l'utilisateur et de sa langue à étudier
$this->user = user::getInstance();
$this->userlang = $this->user->userlang;
$this->oracle = $this->user->id;
$this->userlvl = userlvl::getInstance();
$this->time = $this->userlvl->get_time();
//récupération du l'id de la carte dans la zone de texte
$this->submit = isset($_POST['submit_form']);
if ( $this->submit )
{
{
$this->carteId = isset($_POST['carteId']) ? trim($_POST['carteId']) : '';
}
else if( isset($_SESSION["idCard"])){
......@@ -54,7 +52,7 @@ class oracle_card_byid
}
return true;
}
public function selectcarte(){
$res = true;
if ( ( !$this->submit || $this->errors ) && !(isset($_SESSION["idCard"])) ){
......@@ -63,25 +61,28 @@ class oracle_card_byid
else{
// Sélection "dans ce cas là on laisse les gens jouer avec n'importe quelle carte (pour le moment) à terme on pourrait utiliser la item factory pour vérifier que le joueur a droit…"
$this->card = new Card((int) $this->carteId);
$gh = new GameHandler();
$this->time = $gh->get_oracle_time($this->user->userlvl);
$this->card->set_forbidden_count($gh->get_forbidden_count($this->user->userlvl));
}
return $res;
}
private function display(){
if(isset($_POST['submit_form']) || isset($_SESSION["idCard"])){
if(isset($_POST['submit_form']) || isset($_SESSION["idCard"])){
if(is_object($this->card)){
if (isset($_POST['carteId']) && (int) $_POST['carteId'] !== (int) $this->card->get_id()){
array_push($this->errors, 'no_card');
include('./views/oracle.card.byid.html');
include('./views/oracle.card.byid.html');
}
else{
else{
include('./views/oracle.card.display.html');
}
}
else{
array_push($this->errors,'unavailable_card');
include('./views/oracle.card.byid.html');
}
include('./views/oracle.card.byid.html');
}
}else{
include('./views/oracle.card.byid.html');
}
......
......@@ -189,64 +189,4 @@
$db->query($sql);
}
}
//A class to handle the main rules
//This is as disgusting as it gets (why isn't this in the controllers folder ? for a start), it will encapsulate in one class utilities that should be split in separate classes, but considering the rest of the program, this might be safer…
require_once('./sys/constants.php');
require_once('./models/user.class.php');
require_once('./sys/db.class.php');//useless (called by Card)
class GameHandler{
const LVL_EASY = 0;
const LVL_MEDIUM = 1;
const LVL_HARD = 2;
const LVL_HARDEST = 3;
const ACT_CREATECARD = 5;
const ACT_VERIFYRECORD = 6;
private static $MULTIPLIERS = array(2 => 2, 1 => 1.5, 0 => 1, -1 => 0.7, -2 => 0.5, -3 => 0.33);
//utilities
//To unify the way levels are defined throughout the game
public function unify_Lvl($level){
switch($level){
case 'easy':
case 'A1':
case 'A2':
case 'Débutant':
$res = self::LVL_EASY;
break;
case 'medium':
case 'B1':
case 'B2':
case 'Intermédiaire':
$res = self::LVL_MEDIUM;
break;
case 'hard':
case 'C1':
case 'Avancé':
$res = self::LVL_HARD;
break;
case 'Natif':
case 'C2':
$res = self::LVL_HARDEST;
break;
default:
$res = false;
}
return $res;
}
function get_mastery_mult($card_lvl, $user_lvl){
if(!is_int($card_lvl)){
$card_lvl = $this->unify_Lvl($card_lvl);
}
if(!is_int($user_lvl)){
$user_lvl = $this->unify_Lvl($user_lvl);
}
echo "<p>".($card_lvl - $user_lvl)." → ".self::$MULTIPLIERS[$card_lvl - $user_lvl]."</p>";
return self::$MULTIPLIERS[$card_lvl - $user_lvl];
}
}
?>
......@@ -8,7 +8,7 @@ class Card
private $langPrecisions=false ; //this should complete the language class
private $level ; // should be an object
private $cat ; //should be an object
private $author ; //should be an object
private $author ; //should be an object
private $themes = array() ;
private $cdate ;
private $db;
......@@ -88,6 +88,14 @@ class Card
$this->view = $aView;
}
}
//removes the last forbidden words until there are at most $nbWords
//returns the actual number of forbidden words…
public function set_forbidden_count($nbWords){
while(count($this->forbiddenWords) > $nbWords){
array_pop($this->forbiddenWords);
}
return count($this->forbiddenWords);
}
/*
* So that the current card's data is replaced by that of card $cardId
......@@ -134,7 +142,7 @@ class Card
* this is used to store the object inside the database.
* $prompt : whether the function should put on hold the insertion
* if a similar card (same guessword) should be inserted
* if the card already has an id, that means it exists (otherwise
* if the card already has an id, that means it exists (otherwise
* the auto_increment should do the numbering), thus we replace the
* existing card with this.
*/
......@@ -241,4 +249,4 @@ class Card
return $res;
}
}
?>
\ No newline at end of file
?>
......@@ -9,6 +9,7 @@ class user
public $useremail = '';
public $useronline = false;
public $userlang = '';
public $userlvl = '';
public $langGame = '';
public $spoken_lang = '';
......
......@@ -64,7 +64,180 @@ class userlvl
return $this->temps;
}
}
//A class to handle the main rules
require_once('./sys/constants.php');
require_once('./models/user.class.php');
require_once('./sys/db.class.php');//useless (called by Card)
class GameHandler{
const LVL_EASY = 0;
const LVL_MEDIUM = 1;
const LVL_HARD = 2;
const LVL_HARDEST = 3;
const ACT_CREATECARD = 5;
const ACT_VERIFYRECORD = 6;
private static $MULTIPLIERS_WIN = array(2 => 2, 1 => 1.5, 0 => 1, -1 => 0.75, -2 => 0.5, -3 => 0.33);
private static $MULTIPLIERS_LOSE = array(2 => 0.5, 1 => 0.75, 0 => 1, -1 => 1.25, -2 => 1.5, -3 => 2);
//below hardest is USELESS, but it made me feel safer.
private static $FORBID_COUNT = array(self::LVL_EASY => 1,
self::LVL_MEDIUM => 3,
self::LVL_HARD => 6,
self::LVL_HARDEST => 6);
private static $ORACLE_TIME = array(self::LVL_EASY => 90,
self::LVL_MEDIUM => 60,
self::LVL_HARD => 30,
self::LVL_HARDEST => 30);
private static $AUGUR_MIN_TIME = array(self::LVL_EASY => 40,
self::LVL_MEDIUM => 20,
self::LVL_HARD => 0,
self::LVL_HARDEST => 0);
private static $AUGUR_MULT_TIME= array(self::LVL_EASY => 2,
self::LVL_MEDIUM => 1.5,
self::LVL_HARD => 1,
self::LVL_HARDEST => 1);
private static $AUGUR_PLUS_TIME= array(self::LVL_EASY => 0,
self::LVL_MEDIUM => 0,
self::LVL_HARD => 8,
self::LVL_HARDEST => 8);
private static $STAKES = array(self::LVL_EASY => 10,
self::LVL_MEDIUM => 20,
self::LVL_HARD => 30,
self::LVL_HARDEST => 30);
const DRUID_VERIF = 25;
const DRUID_CREATE_CARD = 40;