RolePlayingGames Game AI 2007 CASANAS Sylvain PASTOR Antoine PERCHET Frederic VERHEYE Fabien
Plan • Principe • Architecture • Animation • Analyse de RPG • Modèles de comportement • Avenir du RPG
Principe • Issu du JDR papier • Un personnage ou groupe à incarner • Des quêtes à accomplir
Principe • Différents types de JDR • Classique : Baldur’s Gate, Fallout, NeverwinterNigths • Action/aventure : Oblivion, Gothic • Hack ’n slash : Diablo, Titan Quest • MMORPG : WoW, Everquest • Tactical : FF Tactics, Golden Sun • … • Différents univers • Médiéval Fantastique • Post Apocalyptique • Space Opéra • Contemporain • …
Personnages • Définis par une feuille de personnage Fallout 2
Personnages • Possèdent un inventaire NeverWinterNigths2
Personnages Joueurs • Un personnage unique ou un groupe • Acteurs de l’histoire • Contrôlés par le joueur • Evolue au fil du jeu NeverWinterNigths2
Architecture Moteur Graphique Jeu Moteur de son Contexte Carte Element Objet Personnage Sorts PNJ Journal PJ Quête Inventaire Feuille de Perso Compétence Dons IA_PNJ Moteur physique
Animation d’un personnage • Model du personnage structuré en 2 parties : Mesh Maillage du model 3D Squelette Anatomie Vertex Les sommets du maillages Bone Os du squelette
Animation d’un personnage • 2 models de skinning : • Rigid skinning • Smooth skinning • Chacun de ces bones a une influence appelée “un poids” sur un vertex. • Pour chaque vertex on récupère les matrices de rotation des n bones qui l’influencent ainsi que les poids correspondant. • On modifie les vertices et les normales au vertex avec la formule suivante : • V = M0*V*W0 + M1*V*W1 + … + Mn*V*Wn • On récupère la rotation du bone. • On transforme cette rotation dans le repère du mesh. • On récupère les vertices influencés par ce bone dans le mesh. • On applique la rotation sur chaque vertex.
Animation d’un personnage • Animé par le squelette Mesh Maillage du model 3D Squelette Contient les animations Vertex Les sommets du maillages Bone Os du squelette Vertices à influencer Vertices attachés au bone Bonesinfluençants Poids des bones Animation Clés d’animation
Animation d’un personnage • Interpolation de mouvements • Une animation se compose de keyframes (translation et rotation sur un bone à l’instant ti) • Connaître à chaque instant t les positions des bones • On récupère les 2 keyframes bornant t • On utilise une formule d’interpolation de mouvement pour trouver la position des bones à l’instant t
Animation d’un personnage • Interpolation de mouvements avec tangentes • Permet des mouvements plus souple • Direction dans laquelle on arrive ou on part : tangente in et tangente out
Animation d’un personnage • Composition de mouvements (Animation blending) • Enchainement de mouvements : même principe d’interpolation mais entre 2 keyframes d’animations différentes. • Un poids croissant ou décroissant sur les animations. • Cross fade, continuous blending.
Animation d’un personnage • Composition de mouvements (Animation blending) • Mélange de mouvements : Feather blending. • Exemple : un personnage qui marche et fait tourner son épée. • Un modificateur de poids sur chaque os d’une animation : • Anim1 (marcher) : 100% sur les jambes, 20% sur les bras. • Anim2 (tourner épée) : 100% sur les bras, 0% sur les jambes.
Animation d’un personnage • Motion Capture Making of The Witcher
Etude détaillée • Interactions PNJ : • Quêtes : Oblivion • Dialogues : Fallout 2 • Combat : NeverWinterNigths 2
Analyse de RPG • Journal de quêtes • Définie par une priorité • Une quête divisée en « quest stages » avec une valeur indiquant l’avancement de la quête • Mise à jour du journal • Evolution du dialogue des PNJ • Mise à jour du marqueur sur la carte Exemple 10 : quête acceptée 20: 1ère étape validée 30 : 2ème étape validée 40 : quête terminée
Analyse de RPG • Journal de quêtes Oblivion
Analyse de RPG • Journal de quêtes Oblivion Construction Set
Analyse de RPG • IA des PNJ de Fallout 2 • Les fichiers .ssl • procedure pickup_p_proc : Si le joueur tente de voler le PNJ • procedure talk_p_proc : Début du dialogue • procedure destroy_p_proc : Décès du PNJ • procedure look_at_p_proc : Le joueur regarde le PNJ • procedure description_p_proc : Le joueur regarde le PNJ avec attention • procedure use_skill_on_p_proc : Le joueur utilise une compétence sur le PNJ. • procedure damage_p_proc : Le PNJ perd des points d'impact. • procedure map_enter_p_proc: Le joueur entre sur la map du PNJ. C'est ici par exemple qu'est définie la team du PNJou son ia.
Analyse de RPG • Exemple de dialogue proceduretalk_p_procbegin Evil_Critter:=0; Slavery_Tolerant:=SLAVE_VERY_INTOLERANT; Karma_Perception:=KARMA_PERCEPTION1; if (dude_iq < 4) thenbegin start_gdialog(NAME,self_obj,4,-1,-1); gSay_Start; call Node012; gSay_End; end_dialogue; end else if (global_var(GVAR_ARROYO_DOG) == DOG_FINISHED_BAD) thenbegin floater(128); end else if (global_var(GVAR_ARROYO_DOG) == DOG_ACCEPTED) thenbegin set_local_var(LVAR_Herebefore,1); start_gdialog(NAME,self_obj,4,-1,-1); gSay_Start; call Node005; gSay_End; end_dialogue; end {129}{}{J'ai à faire, imbécile. Va jouer ailleurs.} {130}{}{Gaaaah…} {114}{}{As-tu retrouvé Fumace ?} {115}{}{Non, pas encore. Où as-tu dit que se trouvait le terrain de chasse ?} {116}{}{Non, pas encore.} {128}{}{Fumace me manque. Pourquoi ne peux-tu pas le sauver ? Tu es l'Etre Elu.} procedure Node012 begin Reply(129); NLowOption(130,Node999); End procedure Node005 begin Reply(114); NOption(115,Node004,004); NOption(116,Node999,004); end
Analyse de RPG • Autres procédures procedure damage_p_procbegin if (source_obj == dude_obj) then begin set_local_var(LVAR_Personal_Enemy,1); set_global_var(GVAR_ENEMY_ARROYO,1); end end procedure pickup_p_procbegin if (source_obj == dude_obj) then begin set_local_var(LVAR_Hostile,2); end end
Modèles de comportement Charge CPU • Dépend de la distance au joueur • LOD (Level of detail) • Dépend du type de créature 1 PJ 5 2 25% 4 4 5 5 3 10% 3 3 4 5% 2 1 2 4 1 5 2% 5 5 4 3 2 3 4 4
Modèles de comportement • Animaux • Animaux « d ’ambiance » : oiseaux, insectes… • Déplacements basiques… • Autres animaux : ours, loups, cerf… • Algos de « vie » : nourriture, protection, chasse, errance Oblivion
Modèles de comportement • Ours Normal errer(); si (a_faim() et voit_nourriture() ) { aller_a(nourriture-vue); animation(manger); } Est_attaque while(est_vivant(attaquant)) {attaquer();}
Modèles de comportement • Villageois • Errent dans la ville • Occupation naturelles en fonction du moment de la journée • Déplacements dans la foule Assassin’screed
Modèles de comportement • Marchand • Accroche du PJ • Comportements dépendant des actions du PJ • Achats précédents • Aide apportée • Négociation • Popularité dans la ville
Modèles de comportement • Garde • Suit un tour de garde • Renseigne le PJ • Enquête sur les évènements suspects (cadavre, inconnu…) • Donne l ’alerte
Conclusion