Accueil Connexion Inscription Membres Rechercher Accéder au jeu


   Index / Discussions générales des développeurs / Que faire ?

   


WhiteAnge
Membre

Messages : 42
Remonter

Que faire ?

Posté par WhiteAnge, le 29/05/2007 à 10:42:47

Bonjour à tous,

Bon voilà, j'ai parcouru les différents forums, regardez les différents MODS ou améliorations apportées et je me disais "si l'on continue sur cette voie là, le jeu est mort, car il n'y a pas d'evolution fondamentale du jeu.".

Je m'explique :
Prenons l'exemple des Villes.
Qu'y trouve t'on ?
-de nouvelles fonctionnalités (amélioration par rapport à la base)
-des villes 'interactives' (amélioration)
-des villes en flash (amélioration)

Prenons l'exemple de la carte.
Qu'y trouve t'on ?
-une appparition de la barre de vie sur la carte (amélioration)
-une mini carte (amélioration car c'est juste un copier/coller du code et qui plus est double le nombre de requêtes ... Au niveau des Hits chez les hébergeurs en mutualisés celà ne pardonne pas ...)

Comme vous le voyez, on ne trouve que des améliorations de fonctionnalité (j'insite sur ce mot) et pas d'amélioration majeure du code ou autre.
Regardons en détail l'affichage de la carte et regardons déjà ce que de base on peut améliorer :


Code :



while ($latitude >= $latmin ) {

$longitude $longmin;

while (
$longitude <= $longmax) {

// infos personage 

$perso doquery("SELECT charname, avatar FROM {{table}} WHERE latitude='$latitude' AND longitude='$longitude' LIMIT 1""users");

$persorow mysql_fetch_array($perso);



//infos map

$query2 doquery("SELECT nom FROM {{table}} WHERE lati='$latitude' AND longi='$longitude' LIMIT 1""sol");

$fetcht mysql_fetch_array($query2);

$sol $fetcht['nom'];



// infos Maisons

$query3 doquery("SELECT name FROM {{table}} WHERE latitude='$latitude' AND longitude='$longitude' LIMIT 1""maison");

$fetchh mysql_fetch_array($query3);

$maison    $fetchh['name'];



// infos Villes

$query4 doquery("SELECT name FROM {{table}} WHERE latitude='$latitude' AND longitude='$longitude' LIMIT 1""towns");

$fetchx mysql_fetch_array($query4);

$villes $fetchx['name'];






4 requêtes à chaque fois que l'on modifie l'incrementation de la latitude et de la longitude ! Désolé mais là il y a une vrai amélioration à apporter. Regardons donc ce que l'on peut faire :
Première question :
Quel est le denominateur commun à ces requêtes ?
->Latitude et Longitude !
Que peut te donc faire ?
->Tenter de récuperer toutes les données en une requête. Pour celà, il ne faut plus se baser sur la latitude et la longitude mais par exemple sur le nom du personnage ou son ID, puisque l'on désire afficher une carte centré autour de lui.

La place du joueur c'est

Code :

Select per_latitudeper_longitude from users where per_nom='$userrow[id]' 




Donc si je veux tous les X,Y +/- 5 cases (pour une map de 11*11) du terrain :


Code :

Select sol_latitudesol_longitude

from sol
, (Select per_latitude as xxper_longitude as yy from users where per_nom='$userrow[nom]' ) as P

where sol_x between P
.xx-and  P.xx+5

  
and   sol_y between P.yy-and  P.yy+




En une requête on a les éléments du sol pour toute la map.

On refait pareil pour les maisons et les villes et les autres persos, puis on sélectionne les couples :


Code :



Select 1 
as letypeper_latitude as xper_longitude as y

from users
, (Select per_latitude as xxper_longitude as yy from users WHERE per_nom='$userrow[nom]') as P

where per_latitude between P
.xx-and  P.xx+5

  
and   per_longitude between P.yy-and  P.yy+5

Union

Select 2 
as letypebat_latitude as xbat_longitude as y

from maison
, (Select per_x as xxper_y as yy from users WHERE per_nom='$userrow[nom]') as P

where bat_latitude between P
.xx-and  P.xx+5

  
and   bat_longitude between P.yy-and  P.yy+5

Union

Select 3 
as letypesol_latitude as xsol_longitude as y

from sol
, (Select per_latitude as xxper_longitude as yy from users where per_nom='$userrow[nom]') as P

where sol_latitude between P
.xx-and  P.xx+5

  
and   sol_longitude between P.yy-and  P.yy+5

Union

Select 4 
as letypetown_latitude as xtown_longitude as y

from towns
, (Select per_latitude as xxper_longitude as yy from users where per_nom='$userrow[nom]') as P

where town_latitude between P
.xx-and  P.xx+5

  
and   town_longitudee between P.yy-and  P.yy+5




Et voilà en une requête unique on possède tous les éléments de la carte ! Finis les boucles imbriquées qui entraîne une perte de temps et des "hits" inutiles.

Le problème c'est que les couples peuvent être en double voir en triple. On va donc prendre qu'un des couples "le type" qui nous indique le couple prioritaire


Code :

Select Minletype) as  letypexy

from 
(

Select 1 as letypeper_latitude as xper_longitude as y

from users
, (Select per_latitude as xxper_longitude as yy from users WHERE per_nom='$userrow[nom]') as P

where per_latitude between P
.xx-and  P.xx+5

  
and   per_longitude between P.yy-and  P.yy+5

Union

Select 2 
as letypebat_latitude as xbat_longitude as y

from maison
, (Select per_x as xxper_y as yy from users WHERE per_nom='$userrow[nom]') as P

where bat_latitude between P
.xx-and  P.xx+5

  
and   bat_longitude between P.yy-and  P.yy+5

Union

Select 3 
as letypesol_latitude as xsol_longitude as y

from sol
, (Select per_latitude as xxper_longitude as yy from users where per_nom='$userrow[nom]') as P

where sol_latitude between P
.xx-and  P.xx+5

  
and   sol_longitude between P.yy-and  P.yy+5

Union

Select 4 
as letypetown_latitude as xtown_longitude as y

from towns
, (Select per_latitude as xxper_longitude as yy from users where per_nom='$userrow[nom]') as P

where town_latitude between P
.xx-and  P.xx+5

  
and   town_longitudee between P.yy-and  P.yy+5

) as total

group by x
,




Ensuite, il y a quelques autres manips a faire :
->Récuperer les noms des persos, et tous les couples pour les afficher dans un tableau.
Je vous passe les détails.

En final on obtient ceci pour la map :


Code :

<?php

   mysql_connect
('localhost','','') ;

      
mysql_select_db('letest') ;

   
$users '$userrow[nom]' ;

   
$taille //Taille de la Carte (11*11)

   

   
$unionX 'select 0 as x' ;

   
$unionY 'select 0 as y' ;

   for (
$i=1$i<=$taille*2$i++) {

      
$unionX .= ' union select '.$i ;

      
$unionY .= ' union select '.$i ;

   }

   
$sql 'Select letype, x+'.$taille.'-P.xx as x, y+'.$taille.'-P.yy as  y,

            if (carte.letype=1, (select per_nom from users where per_x=carte.x and per_y=carte.y limit 1),

              if (carte.letype=2, (select mai_nom from maison where mai_x=carte.x and mai_y=carte.y limit 1),

                if (carte.letype=3, (select sol_nom from sol where sol_x=carte.x and sol_y=carte.y limit 1),

                  "pas de sol"

                )

              )

            ) as nom

         from (

            Select Min( letype) as  letype, x, y

            from (

               Select 1 as letype, per_x as x, per_y as y

               from users, (Select per_x as xx, per_y as yy from users where per_nom="'
.$users.'") as P

               where per_x between P.xx-'
.$taille.' and  P.xx+'.$taille.'

              and   per_y between P.yy-'
.$taille.' and  P.yy+'.$taille.'

            Union

            Select 2 as letype, mai_x as x, mai_y as y

            from maison, (Select per_x as xx, per_y as yy from users where per_nom="'
.$users.'") as P

            where mai_x between P.xx-'
.$taille.' and  P.xx+'.$taille.'

              and   mai_y between P.yy-'
.$taille.' and  P.yy+'.$taille.'

            Union

            Select 3 as letype, sol_x as x, sol_y as y

            from sol, (Select per_x as xx, per_y as yy from users where per_nom="'
.$users.'") as P

            where sol_x between P.xx-'
.$taille.' and  P.xx+'.$taille.'

              and   sol_y between P.yy-'
.$taille.' and  P.yy+'.$taille.'

            union

            select 4 as letype, x+P.xx-'
.$taille.' as x, y+P.yy-'.$taille.' as y from

            ('
.$unionX.') as X,

            ('
.$unionY.') as Y,

            (Select per_x as xx, per_y as yy from users where per_nom="'
.$users.'") as P

            ) as total

            group by x,y

            ) as carte,

            (Select per_x as xx, per_y as yy from users where per_nom="'
.$users.'") as P

            order by y,x' 
;

   
$Hdle MySql_Query ($sql) ;

   echo 
'<table border="1" width="100%">' ;

   while (
$tableau MySql_Fetch_Assoc($Hdle)) {

        if (
$tableau['x']==0) echo '<tr>' ;

        echo 
'<td>'.$tableau['nom'].'</td>' ;

        if (
$tableau['x']==($taille*2)) echo '</tr>' ;

   }

   echo 
'</table>' ;

   
MySql_Free_result ($Hdle) ;

?>




Note :
Chez moi, la table ville a disparu, tous les batiments quelconque sont compris dans la table maison, à laquelle j'ai rajouté un champ 'type' définissant si on est en présence :
->Maison
->Ville
->Temple
->Dongeon
->Portail Dimensionnel (Multi-Mondes)

En outre :
J'ai indexé x et y de sol, il ne bouge pas trop
J'ai indexé x et y de maison, il y a peu de probabilité qu'ils bougent beaucoup

Le temps global pour afficher la map est chez moi de 0.02 secondes !


Voilà ce qu'il faudrait faire pour améliorer le jeu. Il y a tellement à faire ! Un autre exemple que je ne détaillerais pas concerne la page index.php :


Code :

if (isset($_GET["do"])) {

    
$do explode(":",$_GET["do"]);

    

etc ....




Là, la triche est super facile ! Je suis sur la carte, ma vie est basse et il faudrait que je me repose ! Merde je n'ai pas d'hôtel à dispo ! Bon et bien on va en appeler un !!!
Je rentre dans le browser l'URL : http://monjeu.net@copyright_rpgillusion/index.php?do=inn.
Hop j'ai mon auberge, je me repose, et repart tout fringuant ....

Dommage non ? Alors qu'il aurait suffit de faire dans les fonctions villes :

Code :

 // Fonction villes.

  
if ($userrow["currentaction"] == "En ville") {

    if (
$do[0] == "inn") { include('towns.php'); inn(); }

    elseif (
$do[0] == "cheatbanque") {include('towns.php'); cheatbanque(); } 

    elseif (
$do[0] == "cheatniveau") {include('towns.php'); cheatniveau(); }

    elseif (
$do[0] == "home") { include('towns.php'); home(); }

    .....

    }

  }




au lieu de :

Code :

 // Fonction villes.

    
if ($do[0] == "inn") { include('towns.php'); inn(); }

    elseif (
$do[0] == "cheatbanque") {include('towns.php'); cheatbanque(); } 

    elseif (
$do[0] == "cheatniveau") {include('towns.php'); cheatniveau(); }

    elseif (
$do[0] == "home") { include('towns.php'); home(); }

    .....

    }





Alors je pense qu'au lieu de reprendre des mods et d'en faire des copier/coller pour en créer d'autres, ce qui ne fait pas évoluer RPG Illusion, mettons nous au travail et remodelons RPG-Illusion !

Celà me fait penser en fait à un concept du cycle d'Elric où il existe la loi, le chaos et la neutralité (les seigneurs gris).
->Le chaos est un changement constant donnant l'impression d'avancée mais qui est en fait du surplace
->La loi ou rien n'avance car tout est trop rigide, figé
->La neutralité, un mélange des deux

Actuellement, mon opinion c'est que RPG Illusion est assimilable au chaos.

Amicalement,
WhiteAnge

édité par WhiteAnge le 29/05/2007 à 10:49:11


WhiteAnge
Membre

Messages : 42
Remonter

RE:Que faire ?

Posté par WhiteAnge, le 30/05/2007 à 10:06:58

Hum bon on dirait que celà interresse personne d'améliorer le code de RPG Illusion.

Bon c'est bien dommage. Ou alors est ce que c'est parce que personne ne comprend rien à ce que j'ai écrit ?






   



Messages Anciens messages Nouveaux messages Nouveaux messages


® RPGillusion.net - Tous droits réservés - 2005-2008. Reproduction interdite par les droits d\'auteurs.