Partagez
Aller en bas
Zouzaka
Zouzaka
Membre

Nombre de messages : 302
Age : 20
Distinction : aucune
Date d'inscription : 25/12/2011

RPG Maker VX Ace Capture de Monstres style Dofus

le Mar 16 Oct 2018 - 21:44
Ce script permet de capturer des groupes de monstres afin de les ré-affronter plus tard avec une logique semblable a celle de dofus, ou, afin que la capture soit un succès il faut être dans un état donnée et posséder un pierre de capture avec une puissance supérieur a celle du groupe.
j'ai essayer de faire en sorte que le script soit assez personnalisable.
Le script :
Spoiler:

Code:
=begin
Auteur: Zouzaka
Ce script permet de capturer les ames d'un groupe de monstre dans des objets
afin de pouvoir les réaffonter plus tards.

-- Elements a preciser dans les notes des monstres:
<cap_mob: X>
<cap_price: Y>
X: la puissance du monstre
Y: Le prix du monstre

-- Elements a preciser dans les notes des objets de capture:
<cap_power: X>
<cap_chance: Y>
X: La puissance de la pierre de capture
Y: Les Chance de reussite de la capture avec cette pierre (pourcentage)

-- Faire Appel a un magasin de Capture:
Faire un appel de script avec "monster_shop(liste)" ou liste est une array des
groupes de monstres a vendre
Exemple: monster_shop([1,2,3])
le magasin vendra les groupes de monstres 1 et 2 et 3.

-- Bugs Connu:
* lorsque vous continuez une partie apres avoir changer la base de donnée des
objets, les objets avec des ames serons inutilisables.
=end
#ID de l'etat nessecaire afin de capturer le monstre
State_ID = 26
#ID des objets de capture
Objets_Capture = [17,18,19,20]
#Les Vocabs
Vocab_NoStone = "Aucune pierre de capture valide trouvé"
Vocab_CaptureFail = "Echec de la capture"
Vocab_CaptureSucces = "Capture réussi !"
Vocab_CapBattle = "Impossible de capturer ces monstres"
#Parametres de l'objet contenant l'ame
FULL_CAP_NAME = "Pierre Pleine"
FULL_CAP_ICONE = 352
#Parametres Avancé
EFFECT_CONTAIN_SOUL = 61
CAN_ESCAPE = false
CAN_LOSE = true
=begin
========================================================================
Fin du parametrage
========================================================================
=end
module BattleManager
  class << self
    alias cap_setup setup
    alias cap_process_victory process_victory
    alias cap_setup setup
    def setup(troop_id, can_escape = true, can_lose = false, capture_battle = false)
      cap_setup(troop_id, can_escape, can_lose)
      @cap_power = cap_calc_btlepower(troop_id)
      @troop_id = troop_id
      @capture_battle = capture_battle
    end
    def cap_power ; return @cap_power ; end
    def cap_calc_btlepower(troop_id)
      total_power = 0
      $data_troops[troop_id].members.each do |member|
        member_power = $data_enemies[member.enemy_id].note.match(/<cap_mob: (\d+)/)
        total_power += member_power[1].to_i if member_power
      end
      return total_power
    end
    def capture_state?
      $game_party.battle_members.each do |actor|
        returned = false
        actor.states.each{|state| returned=true if state.id == State_ID}
        return returned
      end
    end
    def capture_item?
      returned = false
      $game_party.items.each do |item|
        power = item.note.match(/<cap_power: (\d+)/)
        chance = item.note.match(/<cap_chance: (\d+)/)
        if power && chance
          returned = true if (power[1].to_i >= @cap_power)
        end
      end
      return returned
    end
    def start_capture(item_id)
      i = rand(101)
      if i <= $data_items[item_id].note.match(/<cap_chance: (\d+)/)[1].to_i
        #Enlever la pierre vide
        $game_party.lose_item($data_items[item_id], 1)
        #Ajouter la pierre pleine
        $game_party.gain_item($data_items[find_item(@troop_id)], 1)
        $game_message.add(Vocab_CaptureSucces)
      else
        $game_message.add(Vocab_CaptureFail)
      end
    end
    def find_item(troop_id)
      $data_items.each do |item|
        if item
          @match = item.note.match(/<contain_soul: (\d+)/)
          if @match
            return item.id if @match[1].to_i == troop_id
          end
        end
      end
    end
    def process_victory
      if capture_state?
        if capture_item?
          if !@capture_battle
            @window_stone = Window_Stone.new(0,0)
            @window_stone.set_handler(:selected, method(:command_selected))
            while !(@window_stone.disposed?) do
              Graphics.update
              @window_stone.update
              Input.update
            end
          else
            $game_message.add(Vocab_CapBattle)
          end
        else
          $game_message.add(Vocab_NoStone)
        end
      end
      cap_process_victory
    end
    def command_selected
      $game_party.items.each do |item|
        if item.name == @window_stone.command_name(@window_stone.index)
          start_capture(item.id)
          break
        end
      end
      @window_stone.dispose
    end
  end
  def self.replay_bgm_and_bgs
    @map_bgm.replay unless ($BTEST or @map_bgm == nil)
    @map_bgs.replay unless ($BTEST or @map_bgs == nil)
  end
end

class Window_Stone < Window_Command
  def make_command_list
    $game_party.items.each do |item|
      power = item.note.match(/<cap_power: (\d+)/)
      chance = item.note.match(/<cap_chance: (\d+)/)
      add_command(item.name,  :selected, (power[1].to_i >= BattleManager.cap_power)) if power && chance
    end
  end
end

module DataManager
  class << self
    alias cap_load_normal_database load_normal_database
    def load_normal_database
      cap_load_normal_database
      create_captures_database
    end
    def create_captures_database
      $data_captures = []
      for i in (1..$data_troops.length-1)
        item = RPG::Item.new
        item.id = $data_items.length + i - 1
        item.name = FULL_CAP_NAME
        item.scope = 0
        item.occasion = 2
        item.icon_index = FULL_CAP_ICONE
        item.effects << RPG::UsableItem::Effect.new(61, i)
        item.note = "<contain_soul: "+i.to_s+">"
        item.description = "Affrontez: "+$data_troops[i].name+" !"
        item.price = calc_item_price(i)
        $data_captures << item
      end
      $data_items.concat($data_captures)
    end
    def calc_item_price(troop_id)
      price = 0
      $data_troops[troop_id].members.each do |enemy|
        price += $data_enemies[enemy.enemy_id].note.match(/<cap_price: (\d+)/).to_a[1].to_i
      end
      return price
    end
  end
end

class Game_Battler
  alias cap_use_item use_item
  def use_item(item)
    cap_use_item(item)
    item.effects.each {|effect| item_capture_effect_apply(effect) }
  end
  def item_capture_effect_apply(effect)
    if effect.code == EFFECT_CONTAIN_SOUL
      BattleManager.setup(effect.data_id, CAN_ESCAPE, CAN_LOSE, true)
      SceneManager.call(Scene_Battle)
    end
  end
end

class Game_Interpreter
  def monster_shop(liste)
    goods = []
    items = {}
    $data_items.each do |item|
      items.merge!(item.note.match(/<contain_soul: (\d+)/).to_a[1] => item.id) unless item == nil
    end
    liste.each do |troop_id|
      goods << [0,items[troop_id.to_s],0,0]
    end
    SceneManager.call(Scene_Shop)
    SceneManager.scene.prepare(goods, true)
  end
end
Une petite demo:
https://www.mediafire.com/file/6ujc6zcwlhbvzcn/CAPTURE.exe/file
DocRpg84
DocRpg84
Membre

Nombre de messages : 44
Age : 22
Distinction : aucune
Date d'inscription : 12/06/2017

RPG Maker VX Ace Re: Capture de Monstres style Dofus

le Dim 21 Oct 2018 - 18:55
très bonne idée ! je testerais ça dans la semaine et je te ferais un retour Very Happy ! ( j'aimerais apprendre a scripter aussi, mais même avec des connaissance en JS, c'est chaud car code propre au logiciel :/ )
Zouzaka
Zouzaka
Membre

Nombre de messages : 302
Age : 20
Distinction : aucune
Date d'inscription : 25/12/2011

RPG Maker VX Ace Re: Capture de Monstres style Dofus

le Lun 22 Oct 2018 - 19:35
d'accord avec plaisir, mais les scripts de VX et ACE sont en Ruby en non pas en JS comme les modules de MV ^^'
DocRpg84
DocRpg84
Membre

Nombre de messages : 44
Age : 22
Distinction : aucune
Date d'inscription : 12/06/2017

RPG Maker VX Ace Re: Capture de Monstres style Dofus

le Lun 22 Oct 2018 - 22:43
oui bien-sur j'ai oublier de préciser que je parlais de MV, vu que j'utilise MV :p
Contenu sponsorisé

RPG Maker VX Ace Re: Capture de Monstres style Dofus

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