[TF] Gestion du jeu

Cette partie est un brin plus complexe. Pour des questions pratiques, je vais vous faire de la théorie sur la gestion des rounds avant de vous parler des différents types de maps. Ça me permet de ne pas refaire les théorie de gestion pour chaque type de map, car ces théories sont applicables grosso-modo de la même façon pour les différents types de maps.

Les points de capture

Entités

Type

Description

http://developer.valvesoftware.com/wik [...] control_point

Point

Représente un point de contrôle

http://developer.valvesoftware.com/wik [...] _capture_area

Bloc

Zone dans laquelle la capture du team_control_point est possible

http://developer.valvesoftware.com/wik [...] _point_master

Point

Sert à gérer les points de contrôle. Entité obligatoire pour les maps CT et TC

Image utilisateur

L'hologramme

Les points de captures sont représentés visuellement par un prop_dynamic pourvu du model models/props_gameplay/cap_point_base.mdl (3 skins disponibles) et d'une entité team_control_point que l'on place au centre du prop_dynamic.

Image utilisateur Le team_control_point affiche un hologramme qui indique à quelle équipe le point de capture appartient. Cette entité possède quelques propriétés qu'il est utile de définir :

  • Name : nom de l'entité, qui servira pour l'entité qui permet de capturer le team_control_point

  • Print Name : le nom du team_control_point qui sera affiché à l'écran. Mettez ce que vous voulez, mais pensez à le mettre en anglais

  • Default Owner : l'équipe à laquelle le point de contrôle appartient au début du round. Si le point est neutre, comme le point middle de cp_well, sélectionnez l'option Neither

  • Index : le numéro du point de capture (ça définit l'ordre d'affichage des points de capture dans le base de l'écran).

Le trigger

Il faut maintenant créer un trigger qui couvrira la zone dans laquelle le ou les joueurs pourront capturer le team_control_point. Ce trigger se définit avec l'entité trigger_capture_area.

Image utilisateur

Propriétés
  • Control point : nom du team_control_point

  • Can RED Cap? : l'équipe RED peut-elle capturer ce point ?

  • Can Blue Cap? : l'équipe BLUE peut-elle capturer ce point ?

  • Number of RED players to cap : nombre des joueurs RED nécessaires pour capturer

  • Number of BLUE players to cap : nombre des joueurs BLUE nécessaires pour capturer

  • Red Spawn Adjust : permet d'ajuster le temps de réapparition des joueurs RED (voir explication plus bas).

  • Blue Spawn Adjust : permet d'ajuster le temps de réapparition des joueurs BLUE (voir explication plus bas).

  • Time to cap : temps, en secondes, nécessaire à la capture du point

Outputs

Remplacez le symbole * par le numéro de l'équipe (RED = 1 ; BLUE = 2).

  • OnStartTeam* : Quand l'équipe * commence à capturer

  • OnBreakTeam* : Quand la capture de l'équipe * est interrompue

  • OnCapTeam* : Quand l'équipe * vient de capturer

  • OnStartCap : Quand une équipe commence à capturer

  • OnBreakCap : Quand la capture d'un équipe est interrompue

  • OnEndCap : Quand une équipe vient de capturer

Changer le skin du model à la capture

Lorsque le point est capturé, il ne faut pas oublier de changer le skin du prop_dynamic, pour qu'il soit en rapport avec la couleur de l'hologramme. Il vous suffit d'utiliser les outputs OnCapTeam1 (RED) et OnCapTeam2 (BLUE) et de spécifier le nouveau skin :

Output named

Targets entities

Via this input

Parameter

Delay

OnCapTeam1

nomdumodel

Skin

1

0.00

OnCapTeam2

nomdumodel

Skin

2

0.00

Le team_control_point_master

Le role du team_control_point_master est difficile à expliquer. Cette entité gère les points de contrôle entre-eux, sans que vous ayez à y toucher. En clair, mettez l'entité dans votre map et n'y touchez pas, et votre map CP marchera ^^ . Je vais quand même vous en parler un peu, car elle est quand même utile pour certaines choses.

Cette entité intervient quand tous les points de contrôle sont capturés, autrement dit, quand une équipe gagne. Voici 3 propriétés utiles :

  • Cap Layout : permet de définir l'ordre d'affichage des points de contrôle. J'y reviens ci-dessous.

  • Restrict team from winning : permet d'empêcher une team de gagner. Laissez Neither par défaut, comme ça les deux teams peuvent gagner (c'est mieux ^^ )

  • Switch teams on map win? : mettez Yes si vous voulez que les teams s'échangent à la fin du round, comme dans cp_gravelpit.

Le Cap Layout

Le Cap Layout vous permet de définir la façon dont les carrés symbolisant les zones de captures seront affichés à l'écran des joueurs. Si vous laissez cette propriété vide, les zones seront affichées une derrière l'autre, comme dans cp_granary ou cp_well.

Vous pouvez bien entendu spécifier l'ordre que vous voulez, en indiquant les index des vos points de capture (souvenez-vous, la propriété Index des team_control_point) en utilisant cette syntaxe : index2 index1 index3.
Si vous voulez obtenir un affichage sous forme de pyramide, comme dans cp_gravelpit, il vous suffit de mettre une virgule qui fera office de "retour à la ligne" : index2, index1 index3. Dans cet exemple, index2 sera sur la première ligne, et index1 et 3 seront sur la deuxième.

Gestion du timer

Entité

Type

Description

team_round_timer

Point

Permet de gérer le temps de jeu au sein d'un round

Le team_round_timer

Le team_round_timer a pour fonction de mettre sur place le temps de jeu pour chaque round. On peut donc spécifier le temps maximum à jouer, le temps de "setup" et d'autres petites choses. C'est lui aussi qui, nous le verrons plus tard, se chargera de mettre fin au round si aucune équipe n'a gagné avant que le temps n'expire.

Voici ses propriétés détaillées
  • Timer length : le temps de jeu

  • Max timer lenght : le temps de jeu maximum. On verra qu'il est possible de rajouter des secondes, ce qui a pour effet de faire augmenter le Timer length en cours de partie. Cette propriété Max timer length permet donc de fixer un temps qu'il est impossible de dépasser, pour ne pas que les parties durent 5 heures si les temps capturent et recapturent sans cesse les points de contrôle ^^ .

  • Start paused : activer le time au démarrage du round

  • Setup timer length : temps de setup avant le démarrage du round proprement dit. Si vous définissez un temps de setup, je vous conseille de mettre 45 secondes qui est une bonne valeur :) .

  • Reset time on round restart : rétablir les paramètres initiaux du timer si la partie redémarre. Je vous conseille de laisser No

  • Use countdown sound : mettez Yes si vous souhaitez entendre le décompte du temps (5 minutes left in the mission ^^ )

  • Show timer in the HUD : permet d'afficher ou nom le temps restant à l'écran

Inputs

Le possède plusieurs inputs qui peuvent se révéler utiles, et notamment AddTime. L'entité possède des inputs courants comme Enable et Disable.

  • Pause : met le timer en pause.

  • Resume : remettre en marche le timer (le contraire de Pause quoi ^^ )

  • SetTime : redéfinir le temps, en secondes. Le paramètre doit être un nombre.

  • AddTime : permet d'ajouter du temps. Le paramètre doit aussi être un nombre.

  • AddTeamTime : permet d'ajouter du temps pour une team. La syntaxe d'ajout est un peu spéciale. Le team RED porte le numéro 2 et la team BLUE le numéro 3. Si vous voulez ajouter 20 secondes à la team BLUE, vous devez mettre 3 20.

  • Restart : réinitialiser le timer.

  • ShowInHUD : afficher ou non le timer (0 pour No et 1 pour Yes).

  • SetMaxTime : redéfinir le temps maxumum du timer

  • AutoCountdown : activer ou désactiver le compte à rebours (0 pour No et 1 pour Yes)

  • SetSetupTime : redéfinir le temps de setup

Le temps de Setup

Dans les maps comme cp_well et cp_dustbowl, un certain nombre de secondes est octroyé à la création des bâtiments de l'ingénieur et à la mise en place des joueurs. C'est ce qu'on appelle le setup, mais je suppose que vous le saviez déjà ^^ .

Enfin bon, le temps de setup se défini avec la propriété Setup timer length du team_round_timer comme je vous l'ai expliqué plus haut. Le principe du setup est que c'est un moment de répit pendant lequel les deux teams ne peuvent pas s'affronter ; c'est pourquoi on dresse des portes pour empêcher le passage. Pour ouvrir les portes, il suffit d'utiliser l'output OnSetupFinished du team_round_timer. Bref, rien de bien compliqué là dedans :) .

Fin de round et fin de partie

Entités

Type

Description

game_round_win

Point

Permet de mettre fin au round, en déclenchant ou nom la Sudden Death

game_end

Point

Permet mettre fin à la map et de passer à la suivante

Comment savoir quand un round est fini ?

Quand le temps est écoulé, ou quand l'objectif est rempli.

Le temps est écoulé

Pour savoir quand le temps est écoulé c'est simple : le team_round_timer, possède l'output OnFinished qui est déclenché quand le temps est écoulé. Il suffit donc d'appeler une entité game_round_win quand le temps est écoulé. Cette entité game_round_win mettra fin au round en déclenchant la Sudden Death (Mort Subite) ou non. Si la Sudden Death n'est pas déclenchée, le round se fini par un Stalemate (Math Nul), dans le cas d'une map CP de base (sans défense/attaque).

  • Team : : laissez None (Sudden Death) si vous voulez que le round se finisse par une Mort Subite si il y a égalité.

  • Force map reset : : mettez Yes pour que la map soit réinitialisée pour le Sudden Death (les zones capturées ne seront pas conservées, pare exemple).

  • Switch teams on map win? : Echanger les équipes après la victoire

La mission est remplie

Il se peut bien évidemment qu'une des deux teams gagne le round avant la fin. Dans ce cas, la gestion de la victoire est reléguée au team_control_point_master et le game_round_win n'intervient pas. Et devinez quoi, vous n'avez rien à paramétrer... enfin, pour faire gagner. Car il est maintenant temps de compter les points !

Changer de map après N victoires

Pour changer de map après un certain nombre de victoir (par exemple, après 3 victoires), il suffit de compter le nombre de rounds gagnés ! Le comptage des rounds n'a rien de compliqué. On va tout simplement utiliser deux math_counter (un pour chaque équipe). Quand un round est gagné, il suffit d'ajouter un point à un des math_counter. Et quand un des deux math_counter atteint son maximum (voir la chapitre sur les déclencheurs), il déclenche un game_end qui va mettre fin à la partie et passer à la map suivante.

Output named

Targets entities

Via this input

Parameter

Delay

OnWonByTeam1

counter_red_win

Add

1

0.00

OnWonByTeam2

counter_blue_win

Add

1

0.00

Maintenant, on défini les outputs des math_counter, qui appelant le game_end (le l'ai nommé end_game) qui mettra fin à la partie.

Output named

Targets entities

Via this input

Parameter

Delay

OnHitMax

end_game

EndGame

<none>

8.00

Les maps CTF

Entités

Type

Description

item_teamflag

Point

Représente la valise (le flag)

func_capturezone

Bloc

Zone de capture de flag

Les maps de type CTF (Capture The Flag) sont les plus simples à mettre en place : deux flags et deux points de capture et le tour est joué !

Le flag

Le flag, ou plutôt the intelligence se place avec l'entité item_teamflag. Les propriétés sont très simples : il vous suffit de sélectionner l'équipe à qui appartient cette valise, au moyen de la propriété Team. Pensez aussi à laisser la propriété Game Type sur CTF.

L'entité possède 4 outputs intéressants : OnReturn, OnPickup, OnDrop et OnCapture (je pense qu'on comprend tout de suite leur fonction rien qu'en lisant leur nom ^^ ) ; et un input pas vraiment utile mais on ne sait jamais : SetTeam, qui permet de modifier l'équipe à qui appartient la valise.

La zone de capture

Le zone de capture est un bloc avec la texture toolstrigger converti en func_capturezone, et comme pour item_teamflag, spécifiez la propriété Team. La propriété Capture Point n'a pas besoin d'être modifiée, elle est de toutes façons ignorée en CTF. Elle servira pour les autres types de maps.

Les maps CP

Les maps de type CP reposent sur le système points de capture comme je l'ai expliqué dans la partie précédente. Il y a plusieurs sous-types de CP :

  • cp_well, cp_granary : CP de base

  • cp_gravelpit : CP de défense/attaque sur un seul round

  • cp_dustbowl : CP de défense/attaque sur plusieurs rounds

CP de base

Une des deux teams gagne

Dans ce cas, tous les points de contrôle sont capturés, et le round suivant s'enchaîne tout seul. Votre team_control_point_master n'a donc pas besoin de configuration spécifique.

Le temps et écoulé

Aucune des teams n'a sur capturer tous les points (You're all losers). Dans ce cas, il faut appeler le game_round_win à la fin du temps, c'est à dire avec l'output OnFinished de l'entité team_round_timer. Spécifiez bien None (Sudden Death) pour la propriété Team du game_round_win, ce qui aura pour effet de déclencher la mort subite.

Comment associer les points de contrôles aux points de respawn comme dans cp_well et granary ?

En réalité c'est plutôt simple. Il vous suffit d'indiquer le nom du team_control_point dans la propriété Associated Control Point des entités info_player_teamspawn.

CP de défense/attaque sur un seul round

La team qui attaque gagne

Cela veut donc dire que l'équipe qui attaque a capturé tous les points. Nous sommes donc dans le cas d'une map CP de base, il n'y a rien de plus à faire. Ah si, faut penser à mettre la propriété Switch teams on map win du team_control_point_master sur la position Yes pour que les teams s'échangent à la fin du round.

La team qui défend gagne

A la fin du temps, si la team qui attaque n'a pas capturé tous les points, la victoire revient à la team qui défend. IL suffit donc d'appeler l'entité game_round_win à la fin du temps, c'est à dire avec l'output OnFinished de l'entité team_round_timer.

Pensez à bien spécifier la propriété Team du team_round_timer, pour définir la team qui remporte le point à la fin du temps !

Particularités supplémentaires

Vous devez spécifier un ordre de capture. Cela se fait avec les propriétés de type Previous Required Point qui se présentent comme ceci : BLUE Previous Required Point 1.

Vous devez également empêcher la team qui défend de gagner en capturant les points (logique ^^ ). Cela se fait très facilement en spécifiant le nom de la team qui défend dans la propriété Restrict team from winning du team_control_point_master.

CP de défense/attaque sur plusieurs rounds