Armes et sorts¶
Dans les pages précédentes, vous avez construit :
- des entités
- un joueur
- des ennemis
- un système de combat simple mais extensible
On va maintenant enrichir ce jeu avec deux mécaniques fondamentales des RPG :
- les armes
- les sorts
Et comme d’habitude, on va le faire proprement, avec de la programmation orientée objet.
Les armes : bonus passif de dégâts¶
On commence par les armes, et on va volontairement rester très simple.
Pour l’instant, une arme donne juste un bonus passif de dégâts, qui s'ajoute à l'attaque de base du personnage.
Classe de base Weapon¶
Créez une classe Weapon qui contient :
- un nom
- un bonus d’attaque
Armes concrètes¶
Créez ensuite des classes qui héritent de Weapon.
Par exemple une épée ou une hâche.
Chaque arme est un objet. Changer d’arme plus tard reviendra simplement à changer d’objet.
Le joueur et son arme¶
Le joueur possède une arme, définie dès sa création.
Son attaque totale est donc :
attaque = attaque de base + bonus de l’arme
Par exemple dans le Player :
self.base_atk = atk
self.weapon = weapon
self.atk = self.base_atk + weapon.atk_bonus
L’arme agit donc passivement, sans aucune action du joueur.
Les sorts : comportements orientés objet¶
On passe maintenant aux sorts.
Contrairement aux armes, un sort :
- a un coût en mana
- a un comportement
- s’utilise activement pendant le combat
C’est donc un excellent candidat pour :
- une classe de base
- plusieurs classes filles
Classe de base Spell¶
Créez une classe Spell qui contient :
- un nom
- un coût en mana
Et qui définit les méthodes suivantes :
class Spell:
def __init__(self, name, mana_cost):
self.name = name
self.mana_cost = mana_cost
def can_cast(self, caster):
return caster.mana >= self.mana_cost
def option_text(self):
return f"{self.name} ({self.mana_cost} mana)"
def cast(self, caster, target, ui):
pass
Cette classe ne fait rien toute seule : elle sert uniquement de base commune.
Sort de feu¶
Premier sort concret : un sort offensif simple.
- coûte du mana
- inflige des dégâts fixes
Sort de rage¶
Deuxième sort : un sort de buff temporaire.
- coûte du mana
- double les dégâts pendant 2 tours
Cela va demander de modifier la classe
Player(voire mêmeEntitysi vous voulez pouvoir appliquer cet effet aux mobs également).
Le joueur et ses sorts¶
Le joueur possède une liste de sorts, définie dans sa classe.
Les options du joueur sont alors construites automatiquement à partir de cette liste de sorts.
Affichage du mana et des options¶
Dans le menu, chaque sort s’affiche avec son coût :
1 : Attaquer
2 : Sort de feu (5 mana)
3 : Rage (4 mana)
4 : Fuite
Et dans les stats du joueur, on affiche en permanence :
Guerrier
PV : 20
ATK : 8
Mana : 6
Arme : Épée (+3)
Le joueur sait donc toujours :
- combien de mana il a
- combien coûte chaque sort
Pourquoi ce design est important¶
Avec ce système :
- une arme est un objet simple
- un sort est un objet avec un comportement
- ajouter une arme = ajouter une classe
- ajouter un sort = ajouter une classe
- aucune logique n’est dupliquée
- le code reste lisible et extensible
C’est exactement ce qu’on attend d’un bon design orienté objet.
Dans la suite, on va transformer ce jeu en vrai rogue-like :
- ennemis aléatoires
- gain d’XP
- montée de niveau
- choix de bonus entre les combats
Vous avez maintenant une base solide.