(22-01-2014, 11:39 PM)Monsieur a écrit : Si lorsque la faim d'un personnage atteint 0 il meurt, "recalcule que ce dont on a besoin lorsqu'on en a besoin" : Sans script cron, le calcul doit être fait à chaque fois que le joueur fait quelquechose, ou bien qu'un autre joueur voit ce personnage ?
Dès que l'information est nécessaire en fait. Si le joueur est susceptible d'être croisé sur la carte, alors dès qu'un autre joueur affiche la carte, tu recalcule la faim du joueur et tu regarde si il est vivant ou non.
Je vais prendre un exemple : sur ogame, le joueur accumule des ressources avec le temps. Il peut être espionné par un joueur ennemi, qui peut ensuite l'attaquer pour le voler. Ici, lors d'un espionnage, les ressources du joueur sont recalculées car il y a interaction ^^
Citation :"Pas d'actions cumulables, juste le choix de tout utiliser d'un coup ou non." : Peux-tu détailler s'il-te-plait ?
Imaginons qu'un joueur puisse gagner 5 points d'action toutes les demies-heures, limitées à 240 points d'action au total (c'est à dire 24 heures). Toutes les demies-heures, il sera crédité de 5 PA qui augmenteront son total de points d'actions disponibles si il n'a pas atteint 240.
Chaque action consomme des PA : se déplacer 3pa, attaquer 5pa, etc. Il peut donc utiliser ses PA dès qu'il les reçoit (et lancer une attaque toute les demies-heures), ou les accumuler et lancer 10 attaques d'un coup qui lui consommeront 50 PA de son total qu'il aura accumulé
C'est ça l'idée : joueurs réguliers et joueurs occasionnels ne sont pas trop séparés, car ils peuvent au final faire un même nombre d'actions sur 24h, mais celles-ci sont justes différemment réparties dans le temps.
Citation :" il faut innover en matière de game design ^^ " Entièrement d'accord ! Tu as des exemples de systèmes d'action non classique à me donner ?
A l'instant j'imagine un chronomètre en état de marche pour chaque joueur. Il aurait pour valeur max 24h. Toute action coûte du temps qui décompte le chronomètre. Si le chronomètre ne contient pas assez de temps, l'action est irréalisable et le joueur doit attendre. J'imagine ne rien inventer ?
L'idée n'est pas mauvaise, en fait tu substitue du temps à des points d'action
Ce qui peut être chouette, c'est de "cacher" les points d'action derrière des mécanismes plus RP : fatigue, mana, etc. C'est à creuser bien sûr, je n'utilise pas ce système pour mon jeu :p
Citation :Entièrement d'accord, mais c'est moins coûteux / pose moins de problème qu'un script cron lancé à intervalle régulier ?
J'imagine que dépasser un certain nombre de joueurs, aucun personnage ne se retrouve sans interaction, le script devenant moins coûteux du coup, non ?
En fait le script par tâche cron pose plusieurs soucis :
- Il peut entraîner d'énormes montées en charge : déjà parce que plus il y aura de joueur, plus il sera coûteux en ressources système lorsqu'il s’exécutera. De plus, il fera un grand nombre de requêtes SQL sur un très court intervalle de temps, ce qui va ralentir toute utilisation de la SQL, y compris pour les joueurs, qui auront des latences voire des timeout au chargement de leurs pages lors de l'appel du script. Enfin, les joueurs pouvant prédire le lancement du script, les joueurs peuvent être tentés de spam f5, ce qui va encore plus accentuer la charge. Au final le jeu est au mieux ralenti, au pire le SQL tombe
- Il peut entraîner de nombreuses erreurs, surtout si le moteur de stockage SQL gère mal les écritures concurrentes. Si par exemple un joueur affiche une page pendant l'exécution du script, il peut recevoir des données fausses car en cours de modification. Si la moitié des joueur a été mise à jour et pas l'autre, alors que le joueur affiche une page, sa page affichera beaucoup d'informations bizarres car pas à jour
Cependant il y a toujours moyen de rendre la chose possible.
Moi pour mon jeu, je fonctionne en tours de 5 mn avec une action par tour. Pour éviter ces soucis, le script de passage de tour met à jour une variable en base de donnée, qui empêche la génération de pages pendant le changement de tour. Concrètement, si le joueur affiche une page pendant l'exécution du script, celle-ci ne sera pas générée (au moyen d'un sleep en php), et ce n'est que lorsque le script aura fini que les pages seront à nouveau générées. Ca implique une brusque charge à la fin du script de tour car les pages de tous les joueurs sont générés sur quelques secondes mais ça reste gérable, car le script de tour ayant fini il n'y a plus d'écritures, et certains serveurs web comme ngix gère bien ces situations