Browse Source

Charset => utf8

CRLF Dos => Unix
Indentation unifiée (tab)
Les paramètres de config peuvent prendre des accents et des majuscules
Jeux en base : Eviter d'utiliser les balises <jeux/>
master v3.5.5
patrice4 2 years ago
parent
commit
6a1870d629
  1. 126
      base/jeux_ajouter_resultat.php
  2. 26
      base/jeux_tables.php
  3. 10
      formulaires/editer_jeu.php
  4. 2
      formulaires/jeu.php
  5. 170
      formulaires/jeux_gerer_resultats.php
  6. 28
      jeux/chesstuff.php
  7. 206
      jeux/devinettes.php
  8. 182
      jeux/diag_echecs.php
  9. 176
      jeux/diag_echecs_inc.php
  10. 519
      jeux/mots_croises.php
  11. 204
      jeux/multi_jeux.php
  12. 307
      jeux/pendu.php
  13. 858
      jeux/qcm.php
  14. 508
      jeux/relier.php
  15. 436
      jeux/saisies.php
  16. 415
      jeux/sudoku.php
  17. 208
      jeux/textes.php
  18. 392
      jeux/trous.php
  19. 56
      jeux_administrations.php
  20. 9
      jeux_autorisations.php
  21. 122
      jeux_config.php
  22. 43
      jeux_fonctions.php
  23. 366
      jeux_pipelines.php
  24. 1020
      jeux_utils.php
  25. 1
      lang/paquet-jeux_fr.php
  26. 42
      tests/types_tables_id_jeux.php

126
base/jeux_ajouter_resultat.php

@ -1,65 +1,63 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function jeux_ajouter_resultat($id_jeu, $resultat, $total, $resultat_long=''){
include_spip('inc/session');
$id_auteur = session_get('id_auteur');
if (!$id_auteur) return;
$requete = sql_fetsel('type_resultat', 'spip_jeux', "id_jeu=$id_jeu");
$type_resultat = $requete['type_resultat'];
// valeurs possibles : 'defaut', 'aucun', 'premier', 'dernier', 'meilleur', 'meilleurs', 'tous'
if($type_resultat=='defaut')
$type_resultat = function_exists('lire_config')?lire_config('jeux/type_resultat'):'dernier';
// valeurs possibles : 'aucun', 'premier', 'dernier', 'meilleur', 'meilleurs', 'tous'
if($type_resultat=='aucun') return;
$resultat = intval($resultat);
$total = intval($total);
// un $id_resultat nul entraine une insertion
// un $id_resultat non nul entraine un remplacement
$id_resultat = 0;
// on insere ou on remplace ?
// si on remplace, verifier quel type de resultat : le meilleur, le premier ou le dernier
$requete = sql_fetsel('resultat_court,total,id_resultat', 'spip_jeux_resultats', "id_jeu=$id_jeu AND id_auteur=$id_auteur");
if (($type_resultat!='tous') && $requete) {
// ici on va probablement remplacer le score en base...
// valeurs possibles : 'premier', 'dernier', 'meilleur', 'meilleurs'
$id_resultat = $requete['id_resultat'];
switch($type_resultat) {
case 'premier':
// score present, donc on part
return;
case 'dernier':
// remplacement systematique ici
break;
case 'meilleurs':
// on poursuit avec 'meilleur' et on insere si ok,
$id_resultat = 0;
case 'meilleur':
$resultat_en_base = intval($requete['resultat_court']);
$total_en_base = intval($requete['total']);
$score_en_base = !$total_en_base?$resultat_en_base:$resultat_en_base/$total_en_base;
$score = !$total?$resultat:$resultat/$total;
// si pas mieux, on part
if($score_en_base >= $score) return;
break;
}
}
// ca y est, on peut enregistrer le resultat
jeux_ajouter_resultat_base($id_resultat, $id_jeu, $id_auteur, $resultat, $resultat_long, $total, $type_resultat);
}
function jeux_ajouter_resultat_base($id_resultat, $id_jeu, $id_auteur, $resultat, $resultat_long, $total, $type_resultat) {
if($id_resultat) {
sql_updateq('spip_jeux_resultats', array('resultat_court'=>$resultat, 'resultat_long'=>$resultat_long, 'total'=>$total), "id_resultat=$id_resultat");
spip_log("Le resultat #$id_resultat de l'auteur #$id_auteur au jeu #$id_jeu a ete modifie (type '$type_resultat')",'jeux');
} else {
sql_insertq('spip_jeux_resultats', array('id_jeu'=>$id_jeu, 'id_auteur'=>$id_auteur, 'resultat_court'=>$resultat, 'resultat_long'=>$resultat_long, 'total'=>$total));
spip_log("Le resultat de l'auteur #$id_auteur au jeu #$id_jeu a ete enregistre (type '$type_resultat')",'jeux');
}
}
?>
if (!defined("_ECRIRE_INC_VERSION")) return;
function jeux_ajouter_resultat($id_jeu, $resultat, $total, $resultat_long=''){
include_spip('inc/session');
$id_auteur = session_get('id_auteur');
if (!$id_auteur) return;
$requete = sql_fetsel('type_resultat', 'spip_jeux', "id_jeu=$id_jeu");
$type_resultat = $requete['type_resultat'];
// valeurs possibles : 'defaut', 'aucun', 'premier', 'dernier', 'meilleur', 'meilleurs', 'tous'
if($type_resultat=='defaut')
$type_resultat = function_exists('lire_config')?lire_config('jeux/type_resultat'):'dernier';
// valeurs possibles : 'aucun', 'premier', 'dernier', 'meilleur', 'meilleurs', 'tous'
if($type_resultat=='aucun') return;
$resultat = intval($resultat);
$total = intval($total);
// un $id_resultat nul entraine une insertion
// un $id_resultat non nul entraine un remplacement
$id_resultat = 0;
// on insere ou on remplace ?
// si on remplace, verifier quel type de resultat : le meilleur, le premier ou le dernier
$requete = sql_fetsel('resultat_court,total,id_resultat', 'spip_jeux_resultats', "id_jeu=$id_jeu AND id_auteur=$id_auteur");
if (($type_resultat!='tous') && $requete) {
// ici on va probablement remplacer le score en base...
// valeurs possibles : 'premier', 'dernier', 'meilleur', 'meilleurs'
$id_resultat = $requete['id_resultat'];
switch($type_resultat) {
case 'premier':
// score present, donc on part
return;
case 'dernier':
// remplacement systematique ici
break;
case 'meilleurs':
// on poursuit avec 'meilleur' et on insere si ok,
$id_resultat = 0;
case 'meilleur':
$resultat_en_base = intval($requete['resultat_court']);
$total_en_base = intval($requete['total']);
$score_en_base = !$total_en_base?$resultat_en_base:$resultat_en_base/$total_en_base;
$score = !$total?$resultat:$resultat/$total;
// si pas mieux, on part
if($score_en_base >= $score) return;
break;
}
}
// ca y est, on peut enregistrer le resultat
jeux_ajouter_resultat_base($id_resultat, $id_jeu, $id_auteur, $resultat, $resultat_long, $total, $type_resultat);
}
function jeux_ajouter_resultat_base($id_resultat, $id_jeu, $id_auteur, $resultat, $resultat_long, $total, $type_resultat) {
if($id_resultat) {
sql_updateq('spip_jeux_resultats', array('resultat_court'=>$resultat, 'resultat_long'=>$resultat_long, 'total'=>$total), "id_resultat=$id_resultat");
spip_log("Le resultat #$id_resultat de l'auteur #$id_auteur au jeu #$id_jeu a ete modifie (type '$type_resultat')",'jeux');
} else {
sql_insertq('spip_jeux_resultats', array('id_jeu'=>$id_jeu, 'id_auteur'=>$id_auteur, 'resultat_court'=>$resultat, 'resultat_long'=>$resultat_long, 'total'=>$total));
spip_log("Le resultat de l'auteur #$id_auteur au jeu #$id_jeu a ete enregistre (type '$type_resultat')",'jeux');
}
}
?>

26
base/jeux_tables.php

@ -39,7 +39,7 @@ function jeux_declarer_tables_objets_sql($table){
'champ' => 'statut',
'publie' => 'publie',
'previsu' => 'publie,prop,prepa',
'post_date' => 'date',
'post_date' => 'date',
'exception' => array('statut', 'tout')
)
),
@ -55,13 +55,13 @@ function jeux_declarer_tables_objets_sql($table){
function jeux_declarer_tables_principales($tables_principales){
$jeux_resultats = array(
'id_resultat' => 'bigint(21) NOT NULL',
'id_jeu' => 'bigint(21) NOT NULL',
'id_auteur' => 'bigint(21) NOT NULL',
'date' => 'timestamp',
'resultat_court' => 'int(12)',
'resultat_long' => 'text NOT NULL',
'total' => 'int(12) NOT NULL'
'id_resultat' => 'bigint(21) NOT NULL',
'id_jeu' => 'bigint(21) NOT NULL',
'id_auteur' => 'bigint(21) NOT NULL',
'date' => 'timestamp',
'resultat_court' => 'int(12)',
'resultat_long' => 'text NOT NULL',
'total' => 'int(12) NOT NULL'
);
$jeux_resultats_key = array(
'PRIMARY KEY' => 'id_resultat',
@ -72,13 +72,13 @@ function jeux_declarer_tables_principales($tables_principales){
'id_jeu' => 'id_jeu',
'id_auteur' => 'id_auteur',
);
$tables_principales['spip_jeux_resultats'] = array(
'field' => $jeux_resultats,
'key' => $jeux_resultats_key,
'join' => $jeux_resultats_join,
);
return $tables_principales;
}
@ -88,7 +88,7 @@ function jeux_declarer_tables_interfaces($tables){
$table_des_traitements = &$tables['table_des_traitements'];
// $tables['table_des_traitements']['TEXTE']['jeux']= 'propre(%s)';
if (!isset($table_des_traitements['TITRE_PUBLIC'])) {
$table_des_traitements['TITRE_PUBLIC'] = $table_des_traitements['TITRE'];
}
@ -98,6 +98,6 @@ function jeux_declarer_tables_interfaces($tables){
if (!isset($table_des_traitements['TEXTE_JEU'])) {
$table_des_traitements['TEXTE_JEU'] = $table_des_traitements['TEXTE'];
}
return $tables;
}
}

10
formulaires/editer_jeu.php

@ -41,9 +41,9 @@ function formulaires_editer_jeu_verifier_dist($id_jeu='new', $id_rubrique=0, $re
* Traiter les champs postes
*/
function formulaires_editer_jeu_traiter_dist($id_jeu='new', $id_rubrique=0, $retour='', $associer_objet='', $lier_trad=0, $config_fonc='', $row=array(), $hidden=''){
$res = formulaires_editer_objet_traiter('jeu',$id_jeu,$id_rubrique,$lier_trad,$retour,$config_fonc,$row,$hidden);
// Un lien a prendre en compte ?
if ($associer_objet AND $id_jeu = $res['id_jeu']) {
list($objet, $id_objet) = explode('|', $associer_objet);
@ -59,9 +59,9 @@ function formulaires_editer_jeu_traiter_dist($id_jeu='new', $id_rubrique=0, $ret
// Inserer le type de jeu
include_spip('jeux_utils');
$type_jeu = jeux_trouver_nom(_request('texte'));
$type_jeu = strlen($type_jeu)?$type_jeu:_T('jeux:jeu_vide');
sql_updateq('spip_jeux',array('type_jeu'=>$type_jeu),'id_jeu='.intval($res['id_jeu']));
$type_jeu = strlen($type_jeu)?$type_jeu:_T('jeux:jeu_vide');
sql_updateq('spip_jeux',array('type_jeu'=>$type_jeu),'id_jeu='.intval($res['id_jeu']));
return $res;
}

2
formulaires/jeu.php

@ -54,7 +54,7 @@ function formulaires_jeu_verifier_dist($id_jeu = 0){
* @param int $id_jeu
* @return array
*/
function formulaires_jeu_traiter_dist($id_jeu = 0){
function formulaires_jeu_traiter_dist($id_jeu = 0){
// les resultats sont deja enregistres par la correction du jeu
return array(
// 'message_ok' => _L('config_info_enregistree'),

170
formulaires/jeux_gerer_resultats.php

@ -3,101 +3,103 @@
if (!defined("_ECRIRE_INC_VERSION")) return;
function formulaires_jeux_gerer_resultats_saisies($param=array()){
if (isset($param['id_auteur']) and $param['id_auteur']){
$label_faire = _T('jeux_gerer_resultats:pour_auteur');
}
elseif (isset($param['id_jeu']) and $param['id_jeu']){
$label_faire = _T('jeux_gerer_resultats:pour_jeu');
}
else{
$label_faire = _T('jeux_gerer_resultats:pour_tous');
}
$saisies = array(
array('saisie'=>'radio',
'options'=>array(
'nom'=>'faire',
'obligatoire'=>'oui',
'data'=>array(
'compacter'=>_T('jeux_gerer_resultats:compacter'),
'supprimer'=>_T('jeux_gerer_resultats:supprimer')
),
'label'=>$label_faire
)
));
return $saisies;
if (isset($param['id_auteur']) and $param['id_auteur']){
$label_faire = _T('jeux_gerer_resultats:pour_auteur');
}
elseif (isset($param['id_jeu']) and $param['id_jeu']){
$label_faire = _T('jeux_gerer_resultats:pour_jeu');
}
else{
$label_faire = _T('jeux_gerer_resultats:pour_tous');
}
$saisies = array(
array('saisie'=>'radio',
'options'=>array(
'nom'=>'faire',
'obligatoire'=>'oui',
'data'=>array(
'compacter'=>_T('jeux_gerer_resultats:compacter'),
'supprimer'=>_T('jeux_gerer_resultats:supprimer')
),
'label'=>$label_faire
)
));
return $saisies;
}
function formulaires_jeux_gerer_resultats_charger_dist($param=array(),$return=''){
if (!autoriser('gerer','resultats')){
return false;
}
$param['saisies'] = formulaires_jeux_gerer_resultats_saisies($param);
return $param;
if (!autoriser('gerer','resultats')){
return false;
}
$param['saisies'] = formulaires_jeux_gerer_resultats_saisies($param);
return $param;
}
function formulaires_jeux_gerer_resultats_verifier_dist($param=array(),$return=''){
$erreurs = array();
if (!_request('confirmer') and _request('faire')){
$erreurs['non_confirme']=true;
}
return $erreurs;
$erreurs = array();
if (!_request('confirmer') and _request('faire')){
$erreurs['non_confirme']=true;
}
return $erreurs;
}
function formulaires_jeux_gerer_resultats_traiter_dist($param=array(),$return=''){
$faire = _request('faire');
$id_auteur = $param['id_auteur'];
$id_jeu = $param['id_jeu'];
if ($return){
$param['redirect']=$return;
}
// Supprimer
if ($faire == 'supprimer'){
if($id_auteur){
sql_delete('spip_jeux_resultats', "id_auteur=$id_auteur");
}
elseif($id_jeu){
sql_delete('spip_jeux_resultats', "id_jeu=$id_jeu");
}
else{
sql_delete('spip_jeux_resultats');
}
$param['message_ok']=_T('jeux_gerer_resultats:resultats_supprimes');
}
// Compacter
if ($faire == 'compacter'){
if($id_auteur){
formulaire_gerer_resultats_compacter_auteur($id_auteur);
}
elseif($id_jeu){
formulaire_gerer_resultats_compacter_jeu($id_jeu);
}
else{
$auteurs = sql_select('id_auteur','spip_jeux_resultats','',array('id_auteur')); // tout les auteurs
while ($auteur = sql_fetch($auteurs)){
formulaire_gerer_resultats_compacter_auteur($auteur['id_auteur']);
}
}
$param['message_ok']=_T('jeux_gerer_resultats:resultats_compactes');
}
return $param;
$faire = _request('faire');
$id_auteur = $param['id_auteur'];
$id_jeu = $param['id_jeu'];
if ($return){
$param['redirect']=$return;
}
// Supprimer
if ($faire == 'supprimer'){
if($id_auteur){
sql_delete('spip_jeux_resultats', "id_auteur=$id_auteur");
}
elseif($id_jeu){
sql_delete('spip_jeux_resultats', "id_jeu=$id_jeu");
}
else{
sql_delete('spip_jeux_resultats');
}
$param['message_ok']=_T('jeux_gerer_resultats:resultats_supprimes');
}
// Compacter
if ($faire == 'compacter'){
if($id_auteur){
formulaire_gerer_resultats_compacter_auteur($id_auteur);
}
elseif($id_jeu){
formulaire_gerer_resultats_compacter_jeu($id_jeu);
}
else{
$auteurs = sql_select('id_auteur','spip_jeux_resultats','',array('id_auteur')); // tout les auteurs
while ($auteur = sql_fetch($auteurs)){
formulaire_gerer_resultats_compacter_auteur($auteur['id_auteur']);
}
}
$param['message_ok']=_T('jeux_gerer_resultats:resultats_compactes');
}
return $param;
}
function formulaire_gerer_resultats_compacter_auteur($id_auteur){
$liste = array();
$jeux = sql_select('id_jeu','spip_jeux_resultats',"id_auteur=$id_auteur",array('id_jeu')); // jeu où l'auteur à un résultats
while ($jeu=sql_fetch($jeux)){
$id_jeu=$jeu['id_jeu'];
$liste[] = sql_getfetsel('id_resultat','spip_jeux_resultats',"id_auteur=$id_auteur AND id_jeu=$id_jeu",'',"date DESC");
}
sql_delete('spip_jeux_resultats', "id_auteur=$id_auteur AND ".sql_in('id_resultat', $liste, 'NOT'));
$liste = array();
$jeux = sql_select('id_jeu','spip_jeux_resultats',"id_auteur=$id_auteur",array('id_jeu')); // jeu où l'auteur à un résultats
while ($jeu=sql_fetch($jeux)){
$id_jeu=$jeu['id_jeu'];
$liste[] = sql_getfetsel('id_resultat','spip_jeux_resultats',"id_auteur=$id_auteur AND id_jeu=$id_jeu",'',"date DESC");
}
sql_delete('spip_jeux_resultats', "id_auteur=$id_auteur AND ".sql_in('id_resultat', $liste, 'NOT'));
}
function formulaire_gerer_resultats_compacter_jeu($id_jeu){
$liste = array();
$auteurs = sql_select('id_auteur','spip_jeux_resultats',"id_jeu=$id_jeu",array('id_auteur')); // auteur où l'auteur à un résultats
while ($auteur=sql_fetch($auteurs)){
$id_auteur=$auteur['id_auteur'];
$liste[] = sql_getfetsel('id_resultat','spip_jeux_resultats',"id_auteur=$id_auteur AND id_jeu=$id_jeu",'',"date DESC");
}
sql_delete('spip_jeux_resultats', "id_jeu=$id_jeu AND ".sql_in('id_resultat', $liste, 'NOT'));
$liste = array();
$auteurs = sql_select('id_auteur','spip_jeux_resultats',"id_jeu=$id_jeu",array('id_auteur')); // auteur où l'auteur à un résultats
while ($auteur=sql_fetch($auteurs)){
$id_auteur=$auteur['id_auteur'];
$liste[] = sql_getfetsel('id_resultat','spip_jeux_resultats',"id_auteur=$id_auteur AND id_jeu=$id_jeu",'',"date DESC");
}
sql_delete('spip_jeux_resultats', "id_jeu=$id_jeu AND ".sql_in('id_resultat', $liste, 'NOT'));
}
?>

28
jeux/chesstuff.php

@ -14,7 +14,7 @@ Insere des parties d'echecs dans vos articles !
-----------------------------------------------
http://chesstuff.blogspot.com/
Attention : utilisation d'une librairie externe :
Attention : utilisation d'une librairie externe :
-------------------------------------------------
http://chesstuff.googlecode.com/svn/deployChessViewer.js
@ -65,20 +65,20 @@ function jeux_chesstuff_init() {
// fonction principale, pas de formulaire
function jeux_chesstuff($texte, $indexJeux, $form=true) {
$pgn = '';
// parcourir tous les [separateurs]
$tableau = jeux_split_texte('chesstuff', $texte);
foreach($tableau as $i => $valeur) if ($i & 1)
if ($valeur==_JEUX_CHESSSTUFF) $pgn .= $tableau[$i+1];
$pgn = '';
// renvoyer le modele du jeu
return code_echappement(recuperer_fond('modeles/chesstuff', array(
'PGN' => $pgn,
'LightSquares' => jeux_config('LightSquares'),
'DarkSquares' => jeux_config('DarkSquares'),
'Background' => jeux_config('Background'),
'PuzzleMode' => jeux_config('PuzzleMode'),
// parcourir tous les [separateurs]
$tableau = jeux_split_texte('chesstuff', $texte);
foreach($tableau as $i => $valeur) if ($i & 1)
if ($valeur==_JEUX_CHESSSTUFF) $pgn .= $tableau[$i+1];
// renvoyer le modele du jeu
return code_echappement(recuperer_fond('modeles/chesstuff', array(
'PGN' => $pgn,
'LightSquares' => jeux_config('LightSquares'),
'DarkSquares' => jeux_config('DarkSquares'),
'Background' => jeux_config('Background'),
'PuzzleMode' => jeux_config('PuzzleMode'),
)));
}

206
jeux/devinettes.php

@ -1,104 +1,104 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
#---------------------------------------------------#
# Plugin : jeux #
# Auteur : Patrice Vanneufville, 2006 #
# Contact : patrice¡.!vanneufville¡@!laposte¡.!net #
# Licence : GPL #
#--------------------------------------------------------------------------#
# Documentation : https://contrib.spip.net/Des-jeux-dans-vos-articles #
#--------------------------------------------------------------------------#
/*
Insere des devinettes ou charades dans vos articles !
-----------------------------------------------------
separateurs obligatoires : [devinette] ou [charade]
separateurs optionnels : [reponse], [titre], [texte], [config]
parametres de configurations par defaut :
reponse=oui // afficher la reponse ?
envers=oui // retourner la reponse ?
taille=10 // taille de la police utilisee
attention : module GD obligatoire pour obtenir ses reponses
affichees a l'envers.
Exemple de syntaxe dans l'article :
-----------------------------------
<jeux>
[devinette]
Comment appelle t-on un patron de la nouvelle economie ?
[reponse]
Un e-responsable
[devinette]
Quel est le point commun entre un controleur des impots et un spermatozoïde ?
[reponse]
Tous les 2 ont 1 chance sur 3 millions de devenir un jour un etre humain.
</jeux>
<jeux>
[titre]
Pour les enfants...
[charade]
Mon premier se dirige quelque part.
Mon deuxieme est la moitie d'un cheveux.
Mon tout vit a la ferme.
[reponse]
La vache
[config]
reponse = non
</jeux>
*/
// fonctions d'affichage
function devinettes_titre($texte) {
return $texte?"<div class=\"jeux_titre devinettes_titre\">$texte</div>":'';
}
function devinettes_devinette($texte) {
return $texte?"<div class=\"jeux_question devinettes_devinette\">$texte</div>":'';
}
function devinettes_charade($texte) {
$texte = "<poesie>$texte</poesie>";
return $texte?"<div class=\"jeux_question devinettes_charade\">$texte</div>":'';
}
function devinettes_reponse($texte, $id) {
if (!jeux_config('reponse')) return '';
include_spip('inc/filtrer');
include_spip('images_fonctions'); // image_typo pour SPIP 2.1
$image = image_typo($texte, 'taille='.jeux_config('taille'));
if (jeux_config('envers'))
$image = filtrer('image_flip_vertical', filtrer('image_flip_horizontal', $image));
if (function_exists('image_graver')) $image = filtrer('image_graver', $image);
$image = inserer_attribut($image, 'align', 'right', false, true);
$image = aligner_droite(inserer_attribut($image, 'class', 'no_image_filtrer', false, true));
$texte = jeux_block_depliable(_T('jeux:reponse'), $image);
return $texte?"<div class=\"devinettes_reponse\">$texte</div>":'';
}
// configuration par defaut : jeux_{mon_jeu}_init()
function jeux_devinettes_init() {
return "
reponse=oui // afficher la reponse ?
envers=oui // retourner la reponse ?
taille=10 // taille de la police utilisee
";
}
// fonction principale, pas de formulaire
function jeux_devinettes($texte, $indexJeux, $form=true) {
$html = false;
// parcourir tous les #SEPARATEURS
$tableau = jeux_split_texte('devinettes', $texte);
foreach($tableau as $i => $valeur) if ($i & 1) {
if ($valeur==_JEUX_TITRE) $html .= devinettes_titre($tableau[$i+1]);
elseif ($valeur==_JEUX_DEVINETTE) $html .= devinettes_devinette($tableau[$i+1]);
elseif ($valeur==_JEUX_CHARADE) $html .= devinettes_charade($tableau[$i+1]);
elseif ($valeur==_JEUX_REPONSE) $html .= devinettes_reponse($tableau[$i+1], "devinettes_{$indexJeux}_$i");
elseif ($valeur==_JEUX_TEXTE) $html .= $tableau[$i+1];
elseif ($valeur==_JEUX_COPYRIGHT) $html .= '<div class="jeux_copyright">' . $tableau[$i+1] . '</div>';
}
return $html;
}
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
#---------------------------------------------------#
# Plugin : jeux #
# Auteur : Patrice Vanneufville, 2006 #
# Contact : patrice¡.!vanneufville¡@!laposte¡.!net #
# Licence : GPL #
#--------------------------------------------------------------------------#
# Documentation : https://contrib.spip.net/Des-jeux-dans-vos-articles #
#--------------------------------------------------------------------------#
/*
Insere des devinettes ou charades dans vos articles !
-----------------------------------------------------
separateurs obligatoires : [devinette] ou [charade]
separateurs optionnels : [reponse], [titre], [texte], [config]
parametres de configurations par defaut :
Réponse=oui // afficher la reponse ?
Envers=oui // retourner la reponse ?
Taille=10 // taille de la police utilisee
attention : module GD obligatoire pour obtenir ses reponses
affichees a l'envers.
Exemple de syntaxe dans l'article :
-----------------------------------
<jeux>
[devinette]
Comment appelle t-on un patron de la nouvelle economie ?
[reponse]
Un e-responsable
[devinette]
Quel est le point commun entre un controleur des impots et un spermatozoïde ?
[reponse]
Tous les 2 ont 1 chance sur 3 millions de devenir un jour un etre humain.
</jeux>
<jeux>
[titre]
Pour les enfants...
[charade]
Mon premier se dirige quelque part.
Mon deuxieme est la moitie d'un cheveux.
Mon tout vit a la ferme.
[reponse]
La vache
[config]
reponse = non
</jeux>
*/
// fonctions d'affichage
function devinettes_titre($texte) {
return $texte?"<div class=\"jeux_titre devinettes_titre\">$texte</div>":'';
}
function devinettes_devinette($texte) {
return $texte?"<div class=\"jeux_question devinettes_devinette\">$texte</div>":'';
}
function devinettes_charade($texte) {
$texte = "<poesie>$texte</poesie>";
return $texte?"<div class=\"jeux_question devinettes_charade\">$texte</div>":'';
}
function devinettes_reponse($texte, $id) {
if (!jeux_config('reponse')) return '';
include_spip('inc/filtrer');
include_spip('images_fonctions'); // image_typo pour SPIP 2.1
$image = image_typo($texte, 'taille='.jeux_config('taille'));
if (jeux_config('envers'))
$image = filtrer('image_flip_vertical', filtrer('image_flip_horizontal', $image));
if (function_exists('image_graver')) $image = filtrer('image_graver', $image);
$image = inserer_attribut($image, 'align', 'right', false, true);
$image = aligner_droite(inserer_attribut($image, 'class', 'no_image_filtrer', false, true));
$texte = jeux_block_depliable(_T('jeux:reponse'), $image);
return $texte ? "<div class=\"devinettes_reponse\">$texte</div>" : '';
}
// configuration par defaut : jeux_{mon_jeu}_init()
function jeux_devinettes_init() {
return "
Réponse=oui // afficher la reponse ?
Envers=oui // retourner la reponse ?
Taille=10 // taille de la police utilisee
";
}
// fonction principale, pas de formulaire
function jeux_devinettes($texte, $indexJeux, $form=true) {
$html = false;
// parcourir tous les #SEPARATEURS
$tableau = jeux_split_texte('devinettes', $texte);
foreach($tableau as $i => $valeur) if ($i & 1) {
if ($valeur==_JEUX_TITRE) $html .= devinettes_titre($tableau[$i+1]);
elseif ($valeur==_JEUX_DEVINETTE) $html .= devinettes_devinette($tableau[$i+1]);
elseif ($valeur==_JEUX_CHARADE) $html .= devinettes_charade($tableau[$i+1]);
elseif ($valeur==_JEUX_REPONSE) $html .= devinettes_reponse($tableau[$i+1], "devinettes_{$indexJeux}_$i");
elseif ($valeur==_JEUX_TEXTE) $html .= $tableau[$i+1];
elseif ($valeur==_JEUX_COPYRIGHT) $html .= '<div class="jeux_copyright">' . $tableau[$i+1] . '</div>';
}
return $html;
}
?>

182
jeux/diag_echecs.php

@ -98,18 +98,18 @@ function calcul_diagramme_echecs($position, $coloration, $indexJeux) {
$position = preg_replace("/\s*[\r\n]+\s*/", '/', trim($position));
$position = preg_replace(",\/+,", '/', trim($position));
// quelle est la notation !?
// quelle est la notation !?
$masque=',(([a-zA-Z1-8]+)\/([a-zA-Z1-8]+)\/([a-zA-Z1-8]+)\/([a-zA-Z1-8]+)\/([a-zA-Z1-8]+)\/([a-zA-Z1-8]+)\/([a-zA-Z1-8]+)\/([a-zA-Z1-8]+)) *(.*),';
if ( preg_match($masque, $position, $table) ) {
$position = FEN2classic($position); // FEN
$table = explode("/", $position);
$position = FEN2classic($position); // FEN
$table = explode("/", $position);
} else {
$position = preg_replace(",\s,","",$position); // CLASSIC
$position = strtolower($position);
$table = explode("/",$position);
if (count($table)<2) return "Erreur dans la syntaxe [explode table classic]";
$position = preg_replace(",\s,","",$position); // CLASSIC
$position = strtolower($position);
$table = explode("/",$position);
if (count($table)<2) return "Erreur dans la syntaxe [explode table classic]";
}
// image en cache
global $jeux_config;
$md5 = md5($position.$coloration.serialize($jeux_config));
@ -118,22 +118,22 @@ function calcul_diagramme_echecs($position, $coloration, $indexJeux) {
$image = "<img class=\"no_image_filtrer \" src=\"$fichier_dest\" alt=\"$position\" title=\"$position\" border=\"0\" $size/><br>\n";
// pas de recalcul de l'image pendant 30 jours si le fichier existe deja
if (file_exists($fichier_dest)
AND (_request('var_mode') != 'recalcul') AND (_request('var_mode') != 'calcul')
if (file_exists($fichier_dest)
AND (_request('var_mode') != 'recalcul') AND (_request('var_mode') != 'calcul')
AND (time()-@filemtime($fichier_dest) < 24*3600*$nbjour))
return $image;
// *********************
// *********************
//for ($i=0 ; $i<count($table) ; $i++) if ( $table[$i] == "r" ) $flip = true;
if (in_array('r', $table)) $flip = true;
$chessboard = image_echiquier($flip);
// *************** CASE A COLORIER & LIGNE A TRACER *************************
foreach($surbrillance as $surb)
foreach($surbrillance as $surb)
if(in_array($surb[0], array('jaune', 'bleu', 'rouge', 'vert')))
foreach($surb[1] as $square)
switch(strlen($square)) {
@ -143,47 +143,47 @@ function calcul_diagramme_echecs($position, $coloration, $indexJeux) {
case 5: diag_echecs_hilite_line($chessboard, $square, 'h'.$surb[0], $flip); break;
}
for ($i=0 ; $i<count($table) ; $i++) {
$sub_table = preg_split("/[:,]/",$table[$i]);
switch($sub_table[0]) {
case "b" : $side = "w";break;
case "n" : $side = "b";break;
case "sr" : $side = "-"; $hilite = "hrouge"; break;
case "sv" : $side = "-"; $hilite = "hvert"; break;
case "sb" : $side = "-"; $hilite = "hbleu"; break;
case "sj" : $side = "-"; $hilite = "hjaune"; break;
case "r" : $side = "-"; $flip = true; break; /* Ne sert qu'a eviter des erreurs ;) */
default : return "Erreur dans la syntaxe [couleur]";
}
/* Ici j'ai change car sinon il est impossible de commencer la */
/* description de la position par un pion sans 'p' */
/* et cela pose probleme pour la partie hilite qui elle ne */
/* comporte pas de piece */
if (strlen($sub_table[1])==2) $name = "p";
elseif (strlen($sub_table[1])==3) $name = substr($sub_table[1],0,1);
else {
$sub_table = preg_split("/[:,]/",$table[$i]);
switch($sub_table[0]) {
case "b" : $side = "w";break;
case "n" : $side = "b";break;
case "sr" : $side = "-"; $hilite = "hrouge"; break;
case "sv" : $side = "-"; $hilite = "hvert"; break;
case "sb" : $side = "-"; $hilite = "hbleu"; break;
case "sj" : $side = "-"; $hilite = "hjaune"; break;
case "r" : $side = "-"; $flip = true; break; /* Ne sert qu'a eviter des erreurs ;) */
default : return "Erreur dans la syntaxe [couleur]";
}
/* Ici j'ai change car sinon il est impossible de commencer la */
/* description de la position par un pion sans 'p' */
/* et cela pose probleme pour la partie hilite qui elle ne */
/* comporte pas de piece */
if (strlen($sub_table[1])==2) $name = "p";
elseif (strlen($sub_table[1])==3) $name = substr($sub_table[1],0,1);
else {
if ( (strlen($sub_table[1])==0) && $sub_table[0]!="r" ) {
echo "<p>$sub_table[1]</p>";
return "Erreur dans la syntaxe [piece]";
echo "<p>$sub_table[1]</p>";
return "Erreur dans la syntaxe [piece]";
}
}
for ($j=1 ; $j<count($sub_table) ; $j++) {
}
for ($j=1 ; $j<count($sub_table) ; $j++) {
switch(strlen($sub_table[$j])) {
case 2 :
case 2 :
$square = substr($sub_table[$j],0,2);
break;
case 3 :
case 3 :
$name = substr($sub_table[$j],0,1);
$square = substr($sub_table[$j],1,2);
break;
default :
default :
die("Erreur dans la syntaxe (pos) !");
}
if ($side!="-") diag_echecs_put_piece($chessboard,$side,$name,$square,$flip);
else diag_echecs_hilite_square($chessboard,$square,$hilite,$flip);
}
}
}
/* Faut-il envoyer un en-tete (cas d'une image "nue"), ou l'image
@ -191,46 +191,46 @@ est-elle destinee a etre incluse dans une page Web ? Laisser la
variable a "true" dans le premier cas, la mettre a "false" dans le
second */
/* if ($hdr) header(jeux_config('img_header'); */
if (jeux_config('coords')) {
$fond = $jeux_couleurs[jeux_config('fond')];
$big_chessboard = imagecreatetruecolor($board_size+2*$bordure+$taille,$board_size+2*$bordure+$taille);
$bg_color = imagecolorallocate($big_chessboard,$fond[0],$fond[1],$fond[2]);
//imagecolortransparent($big_chessboard,$bg_color);
imagefill($big_chessboard,0,0,$bg_color);
imagecopy($big_chessboard,$chessboard,$taille,0,0,0,$board_size+2*$bordure,$board_size+2*$bordure);
$width = imagefontwidth($font);
$height = imagefontheight($font);
$center = intval($taille/2);
for ($i=1 ; $i<=8 ; $i++) {
$fond = $jeux_couleurs[jeux_config('fond')];
$big_chessboard = imagecreatetruecolor($board_size+2*$bordure+$taille,$board_size+2*$bordure+$taille);
$bg_color = imagecolorallocate($big_chessboard,$fond[0],$fond[1],$fond[2]);
//imagecolortransparent($big_chessboard,$bg_color);
imagefill($big_chessboard,0,0,$bg_color);
imagecopy($big_chessboard,$chessboard,$taille,0,0,0,$board_size+2*$bordure,$board_size+2*$bordure);
$width = imagefontwidth($font);
$height = imagefontheight($font);
$center = intval($taille/2);
for ($i=1 ; $i<=8 ; $i++) {
$empty_coord = imagecreatetruecolor($taille,$taille);
$bg_color = imagecolorallocate($empty_coord,$fond[0],$fond[1],$fond[2]);
//imagecolortransparent($empty_coord,$bg_color);
imagefill($empty_coord,0,0,$bg_color);
imagefill($empty_coord,0,0,$bg_color);
$font_color = imagecolorallocate($empty_coord,0,0,0);
if (!$flip) {
imagechar($empty_coord,$font,($taille-$width)/2,($taille-$height)/2+$bordure,9-$i,$font_color);
imagechar($empty_coord,$font,($taille-$width)/2,($taille-$height)/2+$bordure,9-$i,$font_color);
} else {
imagechar($empty_coord,$font,($taille-$width)/2,($taille-$height)/2+$bordure,$i,$font_color);
imagechar($empty_coord,$font,($taille-$width)/2,($taille-$height)/2+$bordure,$i,$font_color);
}
imagecopy($big_chessboard,$empty_coord,0,($i-1)*$taille,0,0,$taille,$taille);
}
for ($i=1 ; $i<=8 ; $i++) {
}
for ($i=1 ; $i<=8 ; $i++) {
$empty_coord = imagecreatetruecolor($taille,$taille);
$bg_color = imagecolorallocate($empty_coord,$fond[0],$fond[1],$fond[2]);
//imagecolortransparent($empty_coord,$bg_color);
imagefill($empty_coord,0,0,$bg_color);
$font_color = imagecolorallocate($empty_coord,0,0,0);
if (!$flip) {
imagechar($empty_coord,$font,($taille-$width)/2+$bordure,($taille-$height)/2,$diag_echecs_globales['number2letter'][$i],$font_color);
imagechar($empty_coord,$font,($taille-$width)/2+$bordure,($taille-$height)/2,$diag_echecs_globales['number2letter'][$i],$font_color);
} else {
imagechar($empty_coord,$font,($taille-$width)/2+$bordure,($taille-$height)/2,$diag_echecs_globales['number2letter'][9-$i],$font_color);
imagechar($empty_coord,$font,($taille-$width)/2+$bordure,($taille-$height)/2,$diag_echecs_globales['number2letter'][9-$i],$font_color);
}
imagecopy($big_chessboard,$empty_coord,$i*$taille,8*$taille+2*$bordure,0,0,$taille,$taille);
}
}
$chessboard = $big_chessboard;
} // if (jeux_config('coords'))
// ************* redimensionement final *************
if ($redim) {
if (jeux_config('coords')) { $nbcases=9; } else { $nbcases=8; }
@ -239,53 +239,53 @@ second */
$img_finale = imagecreatetruecolor(round($newsize*imagesx($chessboard)),round($newsize*imagesy($chessboard)));
imagecopyresampled($img_finale,$chessboard,0,0,0,0,round($newsize*imagesx($chessboard)),round($newsize*imagesy($chessboard)),imagesx($chessboard),imagesy($chessboard));
// convertir l'image en 256 couleurs si truecolor=non
if (!jeux_config('truecolor')) imagetruecolortopalette($img_finale,false,256);
if (!jeux_config('truecolor')) imagetruecolortopalette($img_finale,false,256);
$img($img_finale, $fichier_dest);
}
else {
// convertir l'image en 256 couleurs si truecolor=non
if (!jeux_config('truecolor')) imagetruecolortopalette($chessboard,false,256);
if (!jeux_config('truecolor')) imagetruecolortopalette($chessboard,false,256);
$img($chessboard, $fichier_dest);
}
return $image;
}
// decode un diagramme d'echecs, pas de formulaire
function jeux_diag_echecs($texte, $indexJeux, $form=true) {
function jeux_diag_echecs($texte, $indexJeux, $form=true) {
// qq initialisations
$html = false;
$coloration = $diagramme = '';
// decodage du texte
$tableau = jeux_split_texte('diag_echecs', $texte);
diag_echecs_config_supplementaire();
foreach($tableau as $i => $valeur) if ($i & 1) {
if ($valeur==_JEUX_TITRE) $html .= "<div class=\"jeux_titre diag_echecs_titre\">{$tableau[$i+1]}</div>";
elseif ($valeur==_JEUX_DIAG_ECHECS) {
if($diagramme) {
$html .= calcul_diagramme_echecs($diagramme, $coloration, $indexJeux);
$coloration = $diagramme = '';
}
$diagramme = $tableau[$i+1];
if($coloration) {
$html .= calcul_diagramme_echecs($diagramme, $coloration, $indexJeux);
$coloration = $diagramme = '';
}
} elseif ($valeur==_JEUX_COLORATION) {
if($coloration && $diagramme) {
$html .= calcul_diagramme_echecs($diagramme, $coloration, $indexJeux);
$coloration = $diagramme = '';
}
$coloration .= "\n".$tableau[$i+1];
if($diagramme) {
$html .= calcul_diagramme_echecs($diagramme, $coloration, $indexJeux);
$coloration = $diagramme = '';
}
} elseif ($valeur==_JEUX_TEXTE) $html .= $tableau[$i+1];
elseif ($valeur==_JEUX_DIAG_ECHECS) {
if($diagramme) {
$html .= calcul_diagramme_echecs($diagramme, $coloration, $indexJeux);
$coloration = $diagramme = '';
}
$diagramme = $tableau[$i+1];
if($coloration) {
$html .= calcul_diagramme_echecs($diagramme, $coloration, $indexJeux);
$coloration = $diagramme = '';
}
} elseif ($valeur==_JEUX_COLORATION) {
if($coloration && $diagramme) {
$html .= calcul_diagramme_echecs($diagramme, $coloration, $indexJeux);
$coloration = $diagramme = '';
}
$coloration .= "\n".$tableau[$i+1];
if($diagramme) {
$html .= calcul_diagramme_echecs($diagramme, $coloration, $indexJeux);
$coloration = $diagramme = '';
}
} elseif ($valeur==_JEUX_TEXTE) $html .= $tableau[$i+1];
}
if($diagramme)
$html .= calcul_diagramme_echecs($diagramme, $coloration, $indexJeux);
if($diagramme)
$html .= calcul_diagramme_echecs($diagramme, $coloration, $indexJeux);
return $html;
}

176
jeux/diag_echecs_inc.php

@ -2,46 +2,46 @@
if (!defined("_ECRIRE_INC_VERSION")) return;
// transforme la notation FEN en notation classique
function FEN2classic($fen) {
global $diag_echecs_globales;
$w = "b:";
$b = "n:";
global $diag_echecs_globales;
$w = "b:";
$b = "n:";
$fen = explode(" ", $fen);
/* FEN complete = 6, abregee = 1 */
if (count($fen) != 6 && count($fen) != 1)
die("Erreur dans la syntaxe dans la position FEN (nb de champs = count($fen)) !");
$fen = explode(" ", $fen);
/* FEN complete = 6, abregee = 1 */
if (count($fen) != 6 && count($fen) != 1)
die("Erreur dans la syntaxe dans la position FEN (nb de champs = count($fen)) !");
$side = $fen[1];
$fen = explode("/", $fen[0]);
if (count($fen) != 8)
die("Erreur dans la syntaxe dans la position FEN (nb de ligne) !");
$side = $fen[1];
$fen = explode("/", $fen[0]);
if (count($fen) != 8)
die("Erreur dans la syntaxe dans la position FEN (nb de ligne) !");
for ($i = 0; $i < 8; $i++) {
$fen[$i]=trim($fen[$i]);
for ($j = 0, $col = 0; $j < strlen($fen[$i]), $col < 8; $j++ ) {
if (preg_match(',[KQBNRP],', $fen[$i][$j])) {
if (strlen($w)>2) $w .= ",";
$w .= ($diag_echecs_globales['english2french'][strtolower($fen[$i][$j])] . ($diag_echecs_globales['colonnes'][$col++]) . (8 - $i));
}
elseif (preg_match(',[kqbnrp],', $fen[$i][$j])) {
if (strlen($b)>2) $b .= ",";
$b .= ($diag_echecs_globales['english2french'][$fen[$i][$j]] . ($diag_echecs_globales['colonnes'][$col++]) . (8 - $i));
}
elseif (preg_match(',[1-8],', $fen[$i][$j]))
$col += $fen[$i][$j] ;
else
die("Erreur dans la syntaxe dans la position FEN - caractere : $w/$b - ".$fen[$i][$j]);
}
}
if ($side == "w")
return $w . '/' . $b;
// ici c'est aux noirs de jouer, on retourne l'echiquier !
return $w . '/' . $b . '/r' ;
for ($i = 0; $i < 8; $i++) {
$fen[$i]=trim($fen[$i]);
for ($j = 0, $col = 0; $j < strlen($fen[$i]), $col < 8; $j++ ) {
if (preg_match(',[KQBNRP],', $fen[$i][$j])) {
if (strlen($w)>2) $w .= ",";
$w .= ($diag_echecs_globales['english2french'][strtolower($fen[$i][$j])] . ($diag_echecs_globales['colonnes'][$col++]) . (8 - $i));
}
elseif (preg_match(',[kqbnrp],', $fen[$i][$j])) {
if (strlen($b)>2) $b .= ",";
$b .= ($diag_echecs_globales['english2french'][$fen[$i][$j]] . ($diag_echecs_globales['colonnes'][$col++]) . (8 - $i));
}
elseif (preg_match(',[1-8],', $fen[$i][$j]))
$col += $fen[$i][$j] ;
else
die("Erreur dans la syntaxe dans la position FEN - caractere : $w/$b - ".$fen[$i][$j]);
}
}
if ($side == "w")
return $w . '/' . $b;
// ici c'est aux noirs de jouer, on retourne l'echiquier !
return $w . '/' . $b . '/r' ;
}
// cree un echiquier vierge
function image_echiquier($flip) {
// qq initialisations
// qq initialisations
global $jeux_couleurs;
$light = $jeux_couleurs[jeux_config('blancs')];
$dark = $jeux_couleurs[jeux_config('noirs')];
@ -49,13 +49,13 @@ function image_echiquier($flip) {
$bordure = intval(jeux_config('bordure'));
$board_size = jeux_config('board_size');
$nomfichier = jeux_config('plateau');
if ($nomfichier && ($url = find_in_path('img/echiquiers/' . $nomfichier))){
// ici une image d'echiquier est demandee
if (!$flip) {
$board = imagecreatefrompng($url);
}
else {
else {
$url=str_replace('.png','2.png',$url);
$board = imagecreatefrompng($url);
}
@ -63,31 +63,31 @@ function image_echiquier($flip) {
die("Erreur lors de la creation de l'image : img/echiquiers/$nomfichier");
// recupere la largeur (on suppose l'image carree)
list($board_size, $height) = getimagesize($url);
jeux_config_set('board_size', $board_size);
jeux_config_set('board_size', $board_size);
// le nom du fichier peut contenir les coordonnees de l'origine entre parentheses
// format a utiliser : monplato(12-12).png
if(preg_match(',\((\d+)\-(\d+)\),', $nomfichier, $regs)) {
jeux_config_set('xori', $regs[1]);
jeux_config_set('yori', $regs[2]);
jeux_config_set('coords', 'non'); //évite a l'utilisateur de la faire (plante si à oui)
jeux_config_set('yori', $regs[2]);
jeux_config_set('coords', 'non'); //évite a l'utilisateur de la faire (plante si à oui)
} else {
jeux_config_set('xori', 0);
jeux_config_set('yori', 0);
}
jeux_config_set('yori', 0);
}
} else {
// pas d'image pour l'echiquier
$board = imagecreatetruecolor($board_size,$board_size);
$light_color = imagecolorallocate($board,$light[0],$light[1],$light[2]);
imagefill($board,0,0,$light_color);
$square = imagecreatetruecolor($taille,$taille);
$dark_color = imagecolorallocate($square,$dark[0],$dark[1],$dark[2]);
imagefill($square,0,0,$dark_color);
for ($i=0 ; $i<8 ; $i++)
for ($j=0 ; $j<8 ; $j++)
if (($i+$j) & 1) imagecopy($board,$square,$i*$taille,$j*$taille,0,0,$taille,$taille);
// pas d'image pour l'echiquier
$board = imagecreatetruecolor($board_size,$board_size);
$light_color = imagecolorallocate($board,$light[0],$light[1],$light[2]);
imagefill($board,0,0,$light_color);
$square = imagecreatetruecolor($taille,$taille);
$dark_color = imagecolorallocate($square,$dark[0],$dark[1],$dark[2]);
imagefill($square,0,0,$dark_color);
for ($i=0 ; $i<8 ; $i++)
for ($j=0 ; $j<8 ; $j++)
if (($i+$j) & 1) imagecopy($board,$square,$i*$taille,$j*$taille,0,0,$taille,$taille);
}
// if ($bordure) {
// if ($bordure) {
// inutile autrement
//permet de transformer l'image en truecolor si le plateau est en 256
$chessboard = imagecreatetruecolor($board_size+2*$bordure,$board_size+2*$bordure);
@ -101,7 +101,7 @@ function image_echiquier($flip) {
// mets une piece sur l'echiquier
function diag_echecs_put_piece($chessboard,$side,$name,$square,$flip) {
// qq initialisations
// qq initialisations
global $diag_echecs_globales;
$suffix = jeux_config('img_suffix');
$taille = intval(jeux_config('taille'));
@ -111,7 +111,7 @@ function diag_echecs_put_piece($chessboard,$side,$name,$square,$flip) {
$letter = $square[0]; // substr($square,0,1);
$number = $square[1]; // substr($square,1,1);
if (!preg_match(',[a-h],',$letter,$match1) || !preg_match(',[1-8],',$number,$match2))
die("Erreur dans la syntaxe (diag_echecs_put_piece)!");
@ -128,7 +128,7 @@ function diag_echecs_put_piece($chessboard,$side,$name,$square,$flip) {
// colore une case de l'echiquier
function diag_echecs_hilite_square($chessboard,$square,$hilite,$flip) {
// qq initialisations
// qq initialisations
global $diag_echecs_globales;
$img_create = jeux_config('img_create');
$suffix = jeux_config('img_suffix');
@ -155,27 +155,27 @@ function diag_echecs_hilite_square($chessboard,$square,$hilite,$flip) {
($number-1)*$taille+$bordure+$yori,0,0,$taille,$taille);
}
// trace une flèche colorée sur l'echiquier
// trace une flèche colorée sur l'echiquier
function diag_echecs_hilite_line($image, $squares, $hilite ,$flip) {
global $diag_echecs_globales;
$taille = intval(jeux_config('taille'));
$bordure = intval(jeux_config('bordure'));
$xori = intval(jeux_config('xori'));
$yori = intval(jeux_config('yori'));
// epaisseur de la flèche
// epaisseur de la flèche
switch($taille) {
case 35 : $thick = 5; break;
case 55 : $thick = 7; break;
default : $thick = round($taille / 7);
}
// $squares est de la forme a1-g8
list(,$xfrom,$yfrom,,$xto,$yto ) = preg_split('//', $squares); // str_split() mieux, mais on reste compatible PHP 4
$color = $diag_echecs_globales[$hilite];
$hilite_color = imagecolorallocatealpha($image,$color[0],$color[1],$color[2],50);
if (!$flip) {
$x1 = (($diag_echecs_globales['letter2number'][$xfrom]-1)*$taille+$bordure+$taille/2)-1+$xori;
$y1 = ((8-$yfrom)*$taille+$bordure+$taille/2)-1+$yori;
@ -185,20 +185,20 @@ function diag_echecs_hilite_line($image, $squares, $hilite ,$flip) {
$x1 = ((8-$diag_echecs_globales['letter2number'][$xfrom])*$taille+$bordure+$taille/2)-1+$xori;
$y1 = (($yfrom-1)*$taille+$bordure+$taille/2)-1+$yori;
$x2 = ((8-$diag_echecs_globales['letter2number'][$xto])*$taille+$bordure+$taille/2)-1+$xori;
$y2 = (($yto-1)*$taille+$bordure+$taille/2)-1+$yori;
$y2 = (($yto-1)*$taille+$bordure+$taille/2)-1+$yori;
}
// cercle au début
imagefilledellipse($image, $x1,$y1,$thick*2,$thick*2,$hilite_color);
// cercle au début
imagefilledellipse($image, $x1,$y1,$thick*2,$thick*2,$hilite_color);
if ($thick == 1)
return imageline($image, $x1, $y1, $x2, $y2, $hilite_color);
return imageline($image, $x1, $y1, $x2, $y2, $hilite_color);
$ep=round(2.5*$thick/2); //épaisseur totale de la pointe
$ep=round(2.5*$thick/2); //épaisseur totale de la pointe
$lg=round(5*$thick/2); //longeur de la pointe
$t=round($thick / 2)-1; //demi épaisseur de la flèche
if ($y1 == $y2) {// flèches horizontales
$t=round($thick / 2)-1; //demi épaisseur de la flèche
if ($y1 == $y2) {// flèches horizontales
if ($x1 < $x2) {//vers la droite
$points = array(
round($x1),round($y1+$t),
@ -206,10 +206,10 @@ function diag_echecs_hilite_line($image, $squares, $hilite ,$flip) {
round($x2-$lg),round($y2+$ep),
round($x2),round($y2),
round($x2-$lg),round($y2-$ep),
round($x2-$lg),round($y2-$t),
round($x2-$lg),round($y2-$t),
round($x1),round($y1-$t)
);
return imagefilledpolygon($image, $points, 7, $hilite_color);
);
return imagefilledpolygon($image, $points, 7, $hilite_color);
} else {//vers la gauche
$points = array(
round($x1),round($y1+$t),
@ -217,14 +217,14 @@ function diag_echecs_hilite_line($image, $squares, $hilite ,$flip) {
round($x2+$lg),round($y2+$ep),
round($x2),round($y2),
round($x2+$lg),round($y2-$ep),
round($x2+$lg),round($y2-$t),
round($x2+$lg),round($y2-$t),
round($x1),round($y1-$t)
);
return imagefilledpolygon($image, $points, 7, $hilite_color);
);
return imagefilledpolygon($image, $points, 7, $hilite_color);
}
}
if ($x1 == $x2) {// flèches verticales
if ($x1 == $x2) {// flèches verticales
if ($y1 < $y2) {//vers le bas
$points = array(
round($x1-$t),round($y1),
@ -234,8 +234,8 @@ function diag_echecs_hilite_line($image, $squares, $hilite ,$flip) {
round($x2+$ep),round($y2-$lg),
round($x2+$t),round($y2-$lg),
round($x1+$t),round($y1)
);
return imagefilledpolygon($image, $points, 7, $hilite_color);
);
return imagefilledpolygon($image, $points, 7, $hilite_color);
} else {//vers le haut
$points = array(
round($x1-$t),round($y1),
@ -245,15 +245,15 @@ function diag_echecs_hilite_line($image, $squares, $hilite ,$flip) {
round($x2+$ep),round($y2+$lg),
round($x2+$t),round($y2+$lg),
round($x1+$t),round($y1)
);
return imagefilledpolygon($image, $points, 7, $hilite_color);
);
return imagefilledpolygon($image, $points, 7, $hilite_color);
}
}
//autres flèches
// utilisation des coordonnées polaires
//autres flèches
// utilisation des coordonnées polaires
$pi=pi();
$teta=atan(($y2-$y1)/($x2-$x1));
// (x3,y3) est le point intermédiare pour contruire la pointe
// (x3,y3) est le point intermédiare pour contruire la pointe
if ($x2>$x1) {
$x3=$x2+$lg*cos($teta+$pi);
$y3=$y2+$lg*sin($teta+$pi);
@ -261,7 +261,7 @@ function diag_echecs_hilite_line($image, $squares, $hilite ,$flip) {
$x3=$x2-$lg*cos($teta+$pi);
$y3=$y2-$lg*sin($teta+$pi);
}
$points = array(
round($x1+$t*cos($teta+$pi/2)),round($y1+$t*sin($teta+$pi/2)),
round($x3+$t*cos($teta+$pi/2)),round($y3+$t*sin($teta+$pi/2)),
@ -270,8 +270,8 @@ function diag_echecs_hilite_line($image, $squares, $hilite ,$flip) {
round($x3+$ep*cos($teta-$pi/2)),round($y3+$ep*sin($teta-$pi/2)),
round($x3+$t*cos($teta-$pi/2)),round($y3+$t*sin($teta-$pi/2)),
round($x1+$t*cos($teta-$pi/2)),round($y1+$t*sin($teta-$pi/2))
);
return imagefilledpolygon($image, $points, 7, $hilite_color);
);
return imagefilledpolygon($image, $points, 7, $hilite_color);
}
?>

519
jeux/mots_croises.php

@ -1,258 +1,261 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
#---------------------------------------------------#
# Plugin : jeux #
# Auteur : Patrice Vanneufville, 2006 #
# Contact : patrice¡.!vanneufville¡@!laposte¡.!net #
# Licence : GPL #
#--------------------------------------------------------------------------#
# Documentation : https://contrib.spip.net/Des-jeux-dans-vos-articles #
#--------------------------------------------------------------------------#
/*
Insere une grille de mots croises dans vos articles !
------------------------------------------------------
Idee originale de Ma•eul ROUQUETTE
------------------------------------------------------
separateurs obligatoires : [horizontal], [vertical], [solution]
separateurs optionnels : [titre], [texte], [config]
parametres de configurations par defaut :
solution=oui // Afficher la solution ?
fondnoir=noir // couleur des cases noires
compact=non // Definitions en format compact ?
type=0 // types de grilles : 0 ou 1
vertical=chiffres // on met des chiffres en vertical
horizontal=lettres // on met des lettres en horizontal
alphabet=latin1 // Utiliser un alphabet latin simple
Exemple de syntaxe dans l'article :
-----------------------------------
<jeux>
[horizontal]
Definition 1
Definition 2. Definition 3
Definition 4. Definition 5
[vertical]
Definition 1
Definition 2
Definition 3
[solution]
aaa
b*g
a*d
</jeux>
*/
// retourne la lettre correspondant au chiffre
function lettre_grille($chiffre) {
$alphabet = jeux_alphabet(jeux_config('alphabet'));
return $chiffre<=count($alphabet)?$alphabet[$chiffre - 1]:'?';
}
// affiche la grille de mot croises, avec la solution au cas ou
function affichage_grille_mc($tableau_grille, $indexJeux, $form, $solution=false){
global $jeux_couleurs;
// les variables de la grille
$hauteur = sizeof($tableau_grille);
$largeur = sizeof($tableau_grille[0]);
$grille = '';
$type_vertical = jeux_config('vertical');
$type_horizontal = jeux_config('horizontal');
// entetes : formulaire + grille
$grille .= (!$solution)
? ($form?jeux_form_debut('motscroises', $indexJeux, 'jeux_grille jeux_left', 'post', self()):'')
: '<div class="jeux_solution">'._T('jeux:solution').' : </div>' ;
$grille .= '<table class="jeux_grille" cellspacing="0" border="0" summary="'
. _T('motscroises:table_summary', array('hauteur'=>$hauteur,'largeur'=>$largeur))
. "\">\n\t<tr>\n\t\t<td class=\"jeux_coin\"></td>\n";
// les cellules d'entetes verticales
for($i = 1; $i<=$largeur; $i++){
$entete_colonne = $type_vertical == 'lettres' ? lettre_grille($i) : $i ;
$grille .= "\t\t<th scope=\"col\">$entete_colonne</th>\n";
}
$grille .= "\t</tr>\n";
// debut affichage des lignes
foreach($tableau_grille as $ligne =>$contenu_ligne){
$ligne++;
$entete_ligne = $type_horizontal=='chiffres'?$ligne:lettre_grille($ligne);
$grille .= "\t<tr>\n\t<th scope=\"row\">".$entete_ligne."</th>\n"; // numeros de ligne
foreach ($contenu_ligne as $colonne =>$cellule){
$colonne++;
$entete_colonne = $type_vertical == 'lettres' ? lettre_grille($colonne) : $colonne;
$class = $ligne==$hauteur?($colonne==$largeur?' class="jeux_bas jeux_droite"':' class="jeux_bas"'):($colonne==$largeur?' class="jeux_droite"':'');
$classnoir = ' class="jeux_noir' . ($ligne==$hauteur?($colonne==$largeur?' jeux_bas jeux_droite':' jeux_bas'):($colonne==$largeur?' jeux_droite':'')) . '"';
// s'il s'agit d'un noir
if ($cellule == "*") {
$noires = jeux_rgb(jeux_config('fondnoir'));
$grille .= "\t\t<td$classnoir style=\"background-color:$noires; color:$noires;\">*</td>\n";
}
else if ($solution)
$grille .= "\t\t<td$class>$cellule</td>\n" ;
else {
list($id, $name) = jeux_idname($indexJeux, $colonne, 'C', $ligne, 'L');
$value = jeux_form_reponse($indexJeux, $colonne, 'C', $ligne, 'L');
$value = strlen($value)?' value="'.$value.'"':'';
$grille .= "\t\t<td$class><label for=\"$name\">"
. _T('jeux:ligne_n', array('n'=>$entete_ligne)).';'
. _T('jeux:colonne_n', array('n'=>$entete_colonne)).'</label>'
. "<input type='text' maxlength='1'$value name='$name' id='$id' /></td>\n" ;
}
} // foreach
$grille = $grille."\t</tr>\n";}
// fin affichage des lignes
$grille.="</table>\n";
if (!$solution) {
list($id, $name) = jeux_idname($indexJeux, 'SOL');
$grille .=
(jeux_config('solution')?"<p><input id='$id' name='$name' type='checkbox' class='jeux_cocher' value='1' /><label for='$id' >"._T('jeux:afficher_solution')."</label></p>\n":'')
.'<p><input type="submit" value="'._T('jeux:verifier')."\" name='submit' /></p>"
.($form?jeux_form_fin():'');
}
return $grille;
}
// dechiffre le code source de la grille
function calcul_tableau_grille($texte){
$texte = preg_replace(",\s?[\r\n]+\s?,", "\n", trim($texte));
$tableau = preg_split("/\n/", $texte);
$reg = $GLOBALS['meta']['charset'] == 'utf-8' ? '//u' : '//';
foreach ($tableau as $i=>$valeur) $tableau[$i] = preg_split($reg, trim($valeur), -1, PREG_SPLIT_NO_EMPTY);
return $tableau;
}
// compare les variables Post avec les valeurs de la solution...
function comparaison_grille($tableau_grille, $indexJeux) {
$erreurs=0; $vides=0; $total=0;
foreach($tableau_grille as $ligne =>$contenu_ligne) {
foreach ($contenu_ligne as $colonne =>$cellule) {
//compare les valeurs du tableau PHP avec les variables POST
if ($cellule!='*') {
$input = jeux_form_reponse($indexJeux, $colonne+1, 'C', $ligne+1, 'L');
$total++; // nombre de case total
if ($input=='') $vides++;
elseif (strtoupper($input)!=strtoupper($cellule)) $erreurs++;
}
}
}
return array($erreurs, $vides,$total);
}
// renvoie le nombre d'erreurs et de cases vides
function calcul_erreurs_grille($solution, $indexJeux) {
if (!jeux_form_correction($indexJeux)) return '';
list($nbr_erreurs, $nbr_vides,$total) = comparaison_grille($solution, $indexJeux);
$id_jeu = _request('id_jeu');
// on insere le resultat dans la base de donnee
if ($id_jeu){
include_spip('base/jeux_ajouter_resultat');
jeux_ajouter_resultat($id_jeu, $total-$nbr_erreurs-$nbr_vides, $total, "erreurs=$nbr_erreurs, vides=$nbr_vides");
}
// on retourne ce qu'on affiche
return '<div class="jeux_erreur">'
. (($nbr_erreurs==0)?_T('jeux:aucune_erreur'):(
($nbr_erreurs==1)?_T('jeux:une_erreur'):_T("jeux:n_erreurs", array('n'=>$nbr_erreurs))
))
. (($nbr_vides==0)?(($nbr_erreurs==0)?'. '._T('jeux:bravo'):''):(
($nbr_vides==1)?' - '._T('jeux:une_vide'):' - '._T("jeux:n_vides", array('n'=>$nbr_vides))
))
. '</div><br />';
}
// retourne une liste compactee alphabetique ou numerique
function jeux_listes_compacte($texte, $alpha) {
$tableau = preg_split("/[\r\n]+/", trim($texte));
$tableau2 = array(); $i = 0;
$a = jeux_alphabet(jeux_config('alphabet'));
$n = count($a);
foreach ($tableau as $i=>$valeur) if (($valeur=trim($valeur))!='') {
$c = $alpha?($i>=$n?'?':$a[$i]):$i+1;
if ($valeur[strlen($valeur)-1]!='.') $valeur.='.';
if ($valeur!='-.') $tableau2[] = "<strong>$c.</strong>&nbsp;$valeur";
}
return implode(' ', $tableau2);
}
// definitions des mots croises
function affichage_definitions($horizontal, $vertical) {
if (jeux_config('compact')) return
'<p><strong>'._T('motscroises:horizontalement').'&nbsp;</strong>'
.jeux_listes_compacte($horizontal, jeux_config('horizontal')=='lettres')
.'<br /><strong>'._T('motscroises:verticalement').'&nbsp;</strong>'
.jeux_listes_compacte($vertical, jeux_config('vertical')=='lettres').'</p>';
// probleme a regler : les listes non compactes ne reprennent pas l'alphabet choisi...
$liste_horizontal = jeux_config('horizontal')=='chiffres'?'<div class="spip jeux_horizontal jeux_liste_chiffres">':'<div class="spip jeux_horizontal jeux_liste_lettres">';
$liste_horizontal .= '<h4 class="spip jeux_grille">'
._T('motscroises:horizontalement')."</h4>\n".jeux_listes($horizontal).'</div>';
$liste_vertical = jeux_config('vertical')=='lettres'?'<div class="spip jeux_vertical jeux_liste_lettres">':'<div class="spip jeux_vertical jeux_liste_chiffres">';
$liste_vertical .= '<h4 class="spip jeux_grille">'
._T('motscroises:verticalement')."</h4>\n".jeux_listes($vertical).'</div>';
return $liste_horizontal.$liste_vertical;
}
// configuration par defaut : jeux_{mon_jeu}_init()
function jeux_mots_croises_init() {
return "
solution=oui // Afficher la solution ?
fondnoir=noir // couleur des cases noires
compact=non // Definitions en format compact ?
type=0 // types de grilles : 0 ou 1
vertical=chiffres // on met des chiffres en vertical
horizontal=lettres // on met des lettres en horizontal
alphabet=latin1 // Utiliser un alphabet latin simple
";