RMEx
RMEx

Community


Vous n'êtes pas connecté. Connectez-vous ou enregistrez-vous

Système de quête simple

Voir le sujet précédent Voir le sujet suivant Aller en bas  Message [Page 1 sur 1]

J'ai tenté de profiter du système de base de données interne pour construire un tout petit système de quêtes très simple. Voici un exemple simple :



Voici rapido son fonctionnement.
Premièrement, on décrit deux tables :

Code:
# Define Quest System
# Static quest
class Quest < Static::Table
  pk integer :key
  string :name
  string :desc
  integer :gold
  integer :exp
  list :integer, :items
end

# Dynamic Quest
class Game_Quest < Dynamic::Table
  pk integer :key
  bool :state
end

On sépare les quêtes en deux catégories. Leur description, qui elle sera statique et leurs états, qui eux seront dynamique.
Une fois votre jeu lancé, vous pouvez éditer la vue dans la base de données pour ajouter rapidement des quêtes dans le fichier excel généré (Database/Tables/Quest.csv):



Sur base de ces tables. On peut très faciler créer, sous forme d'événement commun, la liste des actions nécéssaires pour construire un système de quêtes efficace :

Le nom des événements devrait assez explicite par rapport à ce que fait ce dernier:

CommonEvent - Start Quest with L[:quest_id]
| > Condition : Script : not Game_Quest[L[_id]] and Quest[L[_id]]
| >| > Appeler Script : Game_Quest.insert(L[:quest_id], false)
| >| >
| > Fin - Condition
| >
CommonEvent - Retreive Quest Data of L[:quest_id]
| > Condition : Script : Quest[L[_id]]
| >| > Appeler Script : L[:quest_name] = Quest[L[_id]].name
| >| > Appeler Script : L[:quest_desc] = Quest[L[_id]].desc
| >| > Appeler Script : L[:quest_gold] = Quest[L[_id]].gold  
| >| > Appeler Script : L[:quest_exp]  = Quest[L[_id]].exp  
| >| > Appeler Script : L[:quest_items]= Quest[L[_id]].items
| >| >
| > Fin - Condition
| >
CommonEvent - Finish Quest with L[:quest_id]
| > Condition : Script : Game_Quest[L[_id]] and not Game_Quest[L[_id]].state
| >| > Appeler Script : Game_Quest[L[_id]].state = true
| >| > Appeler Événement Commun : [Retreive Quest Data of L[_id]]
| >| > Appeler Script : gain_gold(L[:quest_gold])
| >| > Opération : Variable [0001] = 1
| >| > Boucle
| >| >| > Attendre : 1 Frames
| >| >| > Condition : Script : V[1] == team_size
| >| >| >| > Sortir de la Boucle
| >| >| >| >
| >| >| > Fin - Condition
| >| >| > Appeler Script : actor_give_exp(V[1], L[:quest_exp])
| >| >| > Opération : Variable [0001] += 1
| >| >| >
| >| > Fin - Boucle
| >| > Message : Ø, Ø, Normal, Haut
| >| > Message : La quête "\L[:quest_name]"
| >| > Message : est terminée !  
| >| > Message : \L[:quest_exp] exp gagnée !  
| >| > Message : \L[:quest_gold]G gagnée !
| >| > Opération : Variable [0001] = 0
| >| > Boucle
| >| >| > Attendre : 1 Frames
| >| >| > Condition : Script : V[1] == length(L[:quest_items])
| >| >| >| > Sortir de la Boucle
| >| >| >| >
| >| >| > Fin - Condition
| >| >| > Appeler Script : item = get(L[:quest_items], V[1])
| >| >| > Appeler Script : SV[1] = item_name(item)
| >| >| > Appeler Script : give_item(item, 1)
| >| >| > Message : Ø, Ø, Normal, Haut
| >| >| > Message : \SV[1] gagné !
| >| >| > Opération : Variable [0001] += 1
| >| >| >
| >| > Fin - Boucle
| >| >
| > Fin - Condition
| >
CommonEvent - Quest L[:quest_id] on the road?
| > Appeler Script : q = Game_Quest[L[_id]]
| > Appeler Script : L[:quest_on_the_road?] = (q.to_bool and !q.state)
| >
CommonEvent - Quest L[:quest_id] finished?
| > Appeler Script : q = Game_Quest[L[_id]]
| > Appeler Script : L[:quest_finished?] = q.to_bool and q.state
| >
Lorsqu'une action provoque un effet, je vérifie bien que l'on peut le faire. (Par exemple qu'une quête est bien démarrée avant d'être finie). Et je me sers fortement des labels.
Donc il suffit de faire

Code:
L[:quest_id] = id_désiré
appel de l'événement commun désiré

pour exécuter une action.
Ce qui donne, par exemple, pour l'exemple suivant :

Event - EV001
| > Appeler Script : L[:quest_id] = 1
| > Appeler Événement Commun : [Quest L[_id] finished?]
| > Condition : Script : L[:quest_finished?]
| >| > Message : Ø, Ø, Normal, Haut
| >| > Message : Tu as déjà fini cette quête !  
| >| >
| > Sinon
| >| > Message : Ø, Ø, Normal, Haut
| >| > Message : Veux-tu démarrer la quête 1 ?  
| >| > Afficher Choix : Oui, Non
| >| > Si [Oui] - Faire
| >| >| > Message : Ø, Ø, Normal, Haut
| >| >| > Message : Va parler au vieux monsieur !
| >| >| > Appeler Événement Commun : [Start Quest with L[_id]]
| >| >| >
| >| > Si [Non] - Faire
| >| >| >
| >| > Fin - Choix
| >| >
| > Fin - Condition
| >
Pour démarrer une quête (ici la n°1)

et :

Event - EV002
| > Appeler Script : L[:quest_id] = 1
| > Appeler Événement Commun : [Quest L[_id] on the road?]
| > Condition : Script : L[:quest_on_the_road?]
| >| > Message : Ø, Ø, Normal, Haut
| >| > Message : On termine la quête
| >| > Appeler Événement Commun : [Finish Quest with L[_id]]
| >| >
| > Sinon
| >| > Appeler Événement Commun : [Quest L[_id] finished?]
| >| > Condition : Script : L[:quest_finished?]
| >| >| > Message : Ø, Ø, Normal, Haut
| >| >| > Message : la quête est déjà finie !
| >| >| >
| >| > Sinon
| >| >| > Message : Ø, Ø, Normal, Haut
| >| >| > Message : La quête n'est pas encore démarrée !
| >| >| >
| >| > Fin - Condition
| >| >
| > Fin - Condition
| >
pour terminer la quête.

Bref, les bases de données permettent de construire des systèmes plutôt complexes, sans se prendre la tête. Pour ajouter des quêtes disponibles, il suffit de modifier le fichier Excel Quest.csv.

A venir: le journal de quête en événement !

Voir le profil de l'utilisateur

Voir le sujet précédent Voir le sujet suivant Revenir en haut  Message [Page 1 sur 1]

Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum