Aller au contenu

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ême Entity si 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
interface armes et sort
Exemple d'interface avec armes et sorts

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.