JeuWeb - Crée ton jeu par navigateur
Spawn - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Spawn (/showthread.php?tid=7769)

Pages : 1 2 3


RE: Spawn d'ennemis/villageois - niahoo - 20-02-2017

Oui et on manque d'infos :

Combien peut-on avoir de patients en même temps ? Un seul je suppose. Mais dans la salle d'attente il peut y en avoir plusieurs. Et chaque patient revient tous les X jours (en vrai, on comptera en minutes ou heures dans un jeu). Si j'ai un foutu cancer du poumon je vais passer mes journées à l'hosto donc je serai là tous les jours. Si j'ai une bronchite chronique je vais passer une fois par mois pour un petit check. Si je me suis cassé une jambe, je viens un nombre fini de fois : une pour mettre un plâtre, une pour l'enlever, et ensuite X dates de rééduc.

Ensuite tu as une table dans laquelle tu as mis des patients manuellement. Est-ce que ce sont des modèles de patients (genre "Homme, 45 ans, jambe pétée) que tu vas copier pour générer un patient, ou bien des patiens précis (genre Mr Michel, 45 ans, jambe pétée).

Une fois que tu sais ça, tu peux implémenter ta salle d'attente. Quand tu ouvres la salle d'attente, il faut regarder quels patients il pourrait bien y avoir.

Par exemple, si tu as vu Marie Bidule il y a 5 minutes avec son allergie aux endives, il y a peu de chances qu'elle soit encore là. Il te faut donc te rappeler qui le joueur à vu dernièrement pour ne pas les représenter. table visite_patient(joueur_id, patient_id, date_visite).

Donc, pour chaque patient il faut noter la périodicité : celui-ci revient tous les jours, celui-ci tous les mois. Il faut noter quand tu les a vus pour la dernière fois, et regarder si, quand tu ouvres la salle d'attente, leur dernière visite date depuis plus longtemps que la périodicité. Dans ce cas, ils sont là.

Ensuite, tu peux ajouter la notion de nombre de visites pour le patient. Et n'afficher dans la salle d'attente que ceux qui n'ont pas encore fait toutes leurs visites. table visite_patient(joueur_id, patient_id, date_visite, num_visite).

Avec des visites finies, il vaut mieux avoir des modèles de patients pour pouvoir en générer de nouveaux à l'infini.

Ensuite tu peux ajouter la notion de périodicité : entre la mise d'un platre et son retrait il y a plusieurs mois. Mais ensuite la rééduc c'est tous les jours. Mais à mon avis cette étape n'est pas forcément intéressante. Mieux vaut s'arrêter avant et améliorer autre chose avant de complexifier. Par exemple, tu peux générer un patient de type mise-platre/retrait-platre, et ensuite le transformer en patient type rééduc-jambe. Le patient à le même nom, donc pour le joueur ça semble logique (et tu peux avoir un champ dossier_medical dans lequel tu stockes les antécédents afin de lire l'historique du type), mais pour le code c'est deux patients à gérer de façon plus simple.

Reste à ne pas avoir les deux en même temps. Donc avant d'ajouter dans la salle d'attente, il faut aussi ajouter les patients dans une réserve de gens disponibles, ou marquer le patient "rééduc" comme non-disponible tant qu'on n'a pas géré le platre. Là il y a plein de solutions, je passe la main Smile


RE: Spawn d'ennemis/villageois - Dioux - 25-02-2017

je rejoins Ter Rowan, pas besoin de cron, à la limite pour faire croire que l’hôpital tourne pendant que le joueur n'est pas présent tu génères un historique de visite a la connexion en te basant sur la date de dernière visite (et donc dernière connexion)


RE: Spawn d'ennemis/villageois - Myster - 25-06-2017

Bonjour, je reviens vers vous, car je trouve que le système que j'ai fait est pas très potable et concernant vos suggestions j'ai galéré à mettre ça en place donc j'ai essayé de trouvé une alternative

Code :
function spawn_patient()
       {
       $hopital_id         = intval($this->ion_auth->get_user_id());
       // Requête SQL sur les infos de l'hopital
       $info_hopital       = $this->Hopital_models->infos_hopital($hopital_id);
       // Nombre de patients dans la table urgences_salle_attente
       $nbr_patient_actuel = $this->Hopital_models->nbr_patient($hopital_id);
       // La variable chiffre dois être égal à la valeur aléatoire dans les conditions. Ca permet de faire si la variable aléatoire est égal à la variable chiffre.
       $chiffre = 6;
       
       // Les conditions suivantes permette de spawner des patients, plus le niveau de l'hopital est grand, plus les patients arrivent rapidement.
       if ($info_hopital->niveau == 1 OR $info_hopital->niveau <= 3)
           {
           $nombre_aleatoire = rand(3, 10);
           }
       elseif ($info_hopital->niveau == 4 OR $info_hopital->niveau <= 7)
           {
           $nombre_aleatoire = rand(4, 10);
           }
       elseif ($info_hopital->niveau == 8 OR $info_hopital->niveau <= 11)
           {
           $nombre_aleatoire = rand(5, 10);
           }
       elseif ($info_hopital->niveau == 12 OR $info_hopital->niveau > 12)
           {
           $nombre_aleatoire = rand(1, 7);
           }
       else
           {
           
           }
       
       // Si le nombre de patient actuel est inférieur à la limite que peut recevoir les urgences, on peut toujours avoir des patients qui arrivent.
       if ($nbr_patient_actuel->nbr <= $info_hopital->limitation_patients)
           {
           // Si $nombre_aleatoire est égal à la variable $chiffre alors on peut ajouter des patients
           if ($nombre_aleatoire === $chiffre)
               {
               echo 'On ajoute un patient';
               }
           else
               {
               
               }
           }
       }

En gros $chiffre = 6 et à chaque fois je génère un chiffre aléatoirement à chaque chargement de page s'il tombe sur 6 bah on ajoute un patient dans la salle d'attente des urgences, sauf que je trouve ce système bof quoi, si vous avez une meilleure idée ou un exemple ça serait nettement mieux Smile Je vous en remercie


RE: Spawn d'ennemis/villageois - rachids - 25-06-2017

As-tu accès au cron ?

Tu pourrais faire rouler un cron toutes les X minutes / heures ou jours qui distribuerait un nombre de patients.
Par exemple, à toutes les 15 minutes, chaque hopital à X% de chances d'avoir un nouveau patient (avec un mt_rand(0,100) et un pourcentage de ton choix).


RE: Spawn d'ennemis/villageois - Nonovitch - 25-06-2017

En fonction du niveau de ton hôpital, tu fais apparaître plus ou moins de patients:
  • Hôpital niveau 1
Il peut y avoir au maximum 1 personne toutes les heures qui arrivent aux urgences
Tu stockes dans la BDD l'heure à laquelle charge la page de l’hôpital
- Si le temps écoulé entre la date actuelle et la dernière date dans la BDD est supérieur à 1 minutes: Tu calcules le nombre de minutes que çà représente (Si 10 minutes écoulés ça fait 10), et tu calcules la proba qu'un patient arrive, par exemple 50%. Donc tu fais spawn X patient.
Et en plus, tu stockes la nouvelle date dans la BDD.
- Si le temps écoulé entre la date actuelle et la dernière date dans la BDD est inférieur à 1 minutes: Tu ne fais apparaître personne
  • Hôpital niveau 2
Au lieu d'avoir 1 personne max / minutes, tu peux avoir 1 personne toutes les 30 secondes (ça revient à pouvoir en avoir 2x plus)


etc


RE: Spawn d'ennemis/villageois - Myster - 25-06-2017

Bonsoir,

Non je n'ai pas accès au cron malheureusement


RE: Spawn d'ennemis/villageois - Xenos - 25-06-2017

Salut,
dans tes conditions, les "==" sont inclus dans les "<=" (ie: si X == 4 est vrai, alors X <= 7 le sera aussi). Simplifie-les.

Prendre le chiffre 6, c'est assez... exotique. Perso, je prendrai un nombre aléatoire (décimal? éventuellement) entre 0 et 100 et s'il est inférieur à Y, le pourcentage de change de spawn, alors je spawn le patient.

Note qu'ici, le % de chances de spawn est relatif au nombre de page vues: si on rafraichit la page 5000 fois, on aura plein de patients rapidement. Perso, je fixerai un intervalle régulier pour le spawn (soit via un Event/Cron si l'intervalle est large, soit en enregistrant la date de dernier spawn en BDD et en l'utilisant pour désactiver le spawn si cette date est trop récente; et même principe si la date est loin dans le temps, pour faire apparaitre plus de patients si on n'est pas revenu jouer de la semaine).

Je simplifierait aussi le tirage du nombre aléatoire, pour une formule continue, type $nombre_aleatoire = rand(1, 10 - 7 / $info_hopital->niveau) (ou je ne sais quelle formule adaptée à ton jeu, tu peux en trouver quelques unes sur mon devblog https://toile.reinom.com/fonctions-analytiques/ )

Enfin, je ferai tout cela directement en SQL Smile

PS: ah zut, j'avais pas vu que la page était restée ouverte pendant une heure... doublé je suis :/


RE: Spawn d'ennemis/villageois - niahoo - 26-06-2017

Je refais mon post en simplifié, ça reprend l'idée de Xenos un peu aussi :

Soit D la date du dernier patient (en secondes (timestamp)) ;
Soit N la date de maintenant en secondes time() ;
Soit MT le temps maximal (en secondes) avant d'avoir un nouveau patient, pat exemple une heure MT = 3600 ;
La chance C d'avoir un nouveau patient au chargement de la page est C = (N - D) / MT * 100 ;
Tu tires un nombre H au hasard : H = mt_rand(0, 100) ;
Si H < C alors tu spawn un nouveau patient, et tu sauves N comme date du dernier patient.

Edit: et pour améliorer, si le joueur a attendu plus longtemps que le temps maximum, tu peux sauver comme date D + MT au lieu de N, ainsi s'il attend deux heures et qu'il charge deux fois la page, il aura direct deux patients. Et pour améliorer encore tu fais les tirages dans une boucle en sauvant la nouvelle date à chaque fois, comme ça il aura les deux patients dès le premier chargement (voire plus avec un peu de chance).


RE: Spawn d'ennemis/villageois - Xenos - 26-06-2017

Tu peux aussi virer l'aléatoire, ce qui simplifie la compréhension du jeu, son code, et son équilibragge:

Code :
Patients(T) = Patients(T0) + K(niveau_hopital)*(T-T0)

où Patients(T0) et T0 sont stockés dans la BDD (nb de patients à la date T0 passée), niveau_hopital est également stocké dans la BDD, K(niveau_hopital) est une fonction à déterminer qui définit le nb de patients rajoutés par seconde en fonction du niveau de l'hôpital (ie: c'est la fonction qui est le coeur de l'équilibrage de ton gameplay) et Patients(T) est le nombre de patients à l'instant T de visite de la page. Cette valeur Patients(T) n'a même pas besoin d'être sauvée en BDD (elle n'a besoin de l'être que si un patient a été traité ou tout autre évènment de ce style entre T0 et T comme un changement de niveau de l'hôpital).

Après, soit tu stockes ce nombre (Patients(T0)) en FLOAT ou DOUBLE, et tu l'arrondis à l'inférieur à l'affichage (ie: dans la BDD, on aura 1.75 patients, à l'affichage on n'en verra que 1, mais le prochain n'est pas loin), soit tu le stockes en INT mais tu ajuste le T0 pour ne pas perdre de patients lors de l'arrondis (je trouve que c'est se faire chier pour rien, la 1ere idée me semble meilleure).

Note qu'en jouant bien sur la fonction K(), tu peux ne pas faire du linéaire. Il te suffit d'une fonction strictement croissante (si tu ne veux pas "perdre" de patients par moments). Par exemple (n = niveau de l'hopital):

Code :
K(n,T0,T) = n+sin²(T/3600)

Je ne sais pas trop ce que cela donnera, mais c'est possible. L'idée là est d'avoir des heures "creuses" (quand sin(T/3600) ~= 0) et des heures "pleines" (quand |sin(T/3600)| ~= 1)


RE: Spawn d'ennemis/villageois - Myster - 26-06-2017

Bonjour,

Merci pour vos réponses, par contre pour la dernière réponse, je suis désolé mais j'ai pas compris du tout, les maths c'est pas du tout mon truc :')