Partagez
Aller en bas
Nérylis
Nérylis
Membre

Nombre de messages : 612
Age : 31
Localisation : Seine Maritime
Distinction : aucune
Date d'inscription : 23/11/2014

Jauge ATB pour LNX Battle Empty Jauge ATB pour LNX Battle

le Sam 6 Aoû 2016 - 21:43
Bonsoir,

J'aurais besoin d'une âme généreuse pour m'aider à la dernière étape de mon système de combat, à savoir l'intégration de la jauge ATB. Pour ceux qui ne connaissent pas, il s'agit d'une évolution du tour par tour classique, qui consiste à intégrer une barre d'action qui se remplit progressivement. Lorsque celle-ci est remplie, le personnage peut agir. Au fur et à mesure que le joueur progresse, la barre ATB se remplit de plus en plus vite.

Je précise que j'utilise le LNX Battle qui est une refonte globale esthétique du système par défaut. J'ai déjà essayé d'utiliser les scripts ATB existants mais j'ai constaté de nombreux dysfonctionnements ou incompatibilités. Je ne sais pas s'il serait plus simple de s'inspirer d'un système existant ou de partir d'une feuille blanche (je ne m'y connais pas assez en script pour dire ça).

Tout d'abord, voici une démo avec simplement les scripts du LNX Battle : http://www.mediafire.com/download/a01l8y0jhfbk28a/Test+ATB.exe

Voici mes spécifications :

- Pour l'emplacement de la barre ATB, je pense à une barre verticale sur la gauche de l'avatar (voir ma Capture ici : https://servimg.com/view/11188066/132#). La barre se remplirait du bas vers le haut. Fait !
- Pour la représentation de la barre ATB, je dirais une barre noire aux extrémités et jaune à l'intérieur, avec la mention ATB à son sommet. Fait ! A personnaliser !

- Pour les ennemis, la barre ATB doit être invisible (je suis un habitué des FF). Donc, aucune possibilité de la rendre visible. Je considère que ça fait partie des "stats" de l'adversaire. Donc comme à la base, le joueur n'a pas d'infos sur les stats de ses adversaires, on reste cohérent. Fait !

- Pour la vitesse minimale de remplissage de la barre ATB, quand l'agilité est à 1, la barre se remplit en 10s.
- Pour la vitesse maximale, quand l'agilité atteint 200, la barre se remplit en 1s. Il faut prendre cette valeur comme une valeur fixe et non comme une valeur max. En d'autres termes, on considèrera qu'aller au-delà de 200 devient inutile pour remplir plus rapidement la jauge ATB. Comme je ne suis pas sûr de cette valeur, j'aimerais bien la possibilité de configurer ces éléments dans le script (valeur mini AGI et valeur maxi AGI).
Fait !
- Lorsque l'ennemi a l'avantage, il doit agir aussitôt tandis que la barre ATB des personnages doit démarrer de 0. Lorsque le joueur a l'avantage, la même chose mais inversement. Fait !

- Facteur agissant sur la barre ATB : comme ça de tête, je ne pense qu'à des skills comme Booster ou Lenteur. J'ai dans l'idée de configurer des skills dans la BDD aboutissant sur des statuts d'état dans lesquels on mettrait un notetag du style "ATB : x2" ou "ATB : x0.5". Si par exemple, un personnage sous l'effet Booster devait subir Lenteur ou l'inverse, le nouveau statut prendrait le pas sur l'ancien.
- Pour les statuts d'état comme Paralysie, plusieurs possibilités : Barre ATB figée et elle reste remplie comme elle est au moment où le skill touche sa cible, c'est-à-dire que quand elle repartira, ça sera là où elle s'est arrêtée. Barre ATB figée et elle se met à 0, c'est-à-dire que quand elle repartira, ça sera du début. Pourquoi pas avoir les deux.
Fait ! Paramétrage dans la configuration !

- Le LNX Battle propose une fonction pour accélérer le combat mais je ne souhaite pas conserver cette option avance rapide. Quand je joue au tour par tour classique, le côté aléatoire m'irrite souvent au point qu'une option pour accélérer le combat ne me gêne pas. En revanche, avec l'ATB, je n'ai pas besoin d'une telle option. Par contre, il existe une option "Combat auto" qui s'active en appuyant sur une touche et qui a pour conséquence de faire lancer l'attaque de base de chaque personnage sans que le joueur n'agisse par lui-même, tout en accélérant la vitesse du combat. Le combat devient automatique jusqu'à ce que le joueur désactive le mode "Combat auto", chose qu'il sera obligé de faire s'il veut lancer une autre compétence. Cette option est mémorisée sur le combat suivant si elle n'a pas été désactivée lors du combat précédent. Mais elle ne sera pas persistante au point d'être conservé à travers une sauvegarde de jeu. La touche pour activer/désactiver ce mode en combat sera Z dans la config RPG Maker. Dans le cas du Combat Auto, le ciblage se fera sur le premier adversaire. Fait ! Le Combat Auto peut être choisi dès le début du combat dans le même cadre que Combattre et S'enfuir. De ce fait, il ne nécessite pas l'appui d'une touche particulière. La vitesse d'accélération est paramétrable depuis le script. Aucun souci pour revenir au choix des options Combattre, S'enfuir ou Combat Auto.

- Ajout d'un menu pour laisser le choix au joueur de sélectionner "Actif" (le temps continue de défiler normalement quand le joueur décide des actions), "Semi-Actif" (le temps défile quatre fois moins vite, valeur par défaut, quand le joueur décide des actions) ou "Passif" (le temps se fige quand le joueur décide des actions). A voir plus tard pour mettre d'autres options de réglage. Actuellement paramétrable depuis le script. Fonctionne très bien. Etant donné l'utilisation de menus particuliers dans le projet qui ne sont pas intégrés à la démo fournie, une mise à jour en tant que demande spécifique aura lieu pour créer un menu d'options de réglages parmi lesquelles le mode ATB.

- Un point essentiel pour finir : la possibilité de switcher entre les personnages dont la barre ATB est remplie (non applicable en mode Passif). C'est ce qui, à mes yeux, fait la grande différence entre le tour par tour classique et le système ATB. Cette fonction serait réalisable à tout moment en combat avec la touche Y (dans la config RPG Maker). On passerait directement au personnage suivant dont la jauge ATB est remplie. S'il n'y a qu'un seule personnage avec la jauge ATB remplie (c'est-à-dire que le joueur est sur les commandes de ce personnage forcément), cette fonction ne s'applique pas.
Pour résumer, un appui sur la touche permet de skip vers :
- soit le personnage suivant dont la barre ATB est pleine.
- soit on revient sur le personnage actuel si aucun autre personnage a la barre ATB pleine.
- il ne se passe rien si aucun personnage a sa barre ATB pleine.
Dans tous les cas :
- un appui sur cette touche laisse la barre ATB du personnage actuel à 100%
- on peut appuyer sur cette touche à n'importe quel moment, peu importe la fenêtre de commande sur laquelle on navigue
- quand on passe au personnage suivant ou qu'on revient sur le personnage actuel, c'est sur la fenêtre de commande de base par défaut et non celle qu'on a quitté précédemment.
Fait !

Voilà, si vous avez des questions, n'hésitez pas.


Dernière édition par Nérylis le Dim 14 Aoû 2016 - 21:45, édité 3 fois
DrakeRoxas
DrakeRoxas
Membre

Nombre de messages : 44
Age : 27
Distinction : aucune
Date d'inscription : 23/07/2016

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Ven 12 Aoû 2016 - 17:48
J'ai pas fini la totalité du script mais j'ai trouvé quelque chose qui marche bien de base (sauf les jauges qui sont pas affichées). Du coup, voilà de quoi avoir un ATB avec les jauges, mais rien de plus de ce que tu demandes pour le moment (j'ajouterais au fur et à mesure des ajouts).
Du coup, si un modo passe par là, c'est génant le multi-post pour suivre les nouvelles versions ou pas ?
Bref, voilà déjà les script (je me base sur la démo)
Entre "Materials" et "SP1", le système d'ATB avec la partie personnalisable :
Code:
=begin
Customisable ATB/Stamina Based Battle System Script
by Fomar0153
Version 1.3
----------------------
Notes
----------------------
No requirements
Customises the battle system to be similar to
ATB or Stamina based battle systems.
----------------------
Instructions
----------------------
Edit variables in CBS to suit your needs.
The guard status should be set to 2~2 turns.
----------------------
Change Log
----------------------
1.0 -> 1.1 Restored turn functionality and a glitch
           related to message windows
1.1 -> 1.2 Added CTB related options
           Added the ability to pass a turn
           Fixed a bug which caused an error on maps
           with no random battles
           Added options for turn functionality to be based on time
           or number of actions
           Added the ability to change the bar colours based on states
1.2 -> 1.3 Fixed a bug when escaping using CTB mode
          
----------------------
Known bugs
----------------------
None
=end
module CBS

  MAX_STAMINA = 1000
  RESET_STAMINA = true
  
  # If ATB is set to false then the bars won't appear and
  # the pauses where the bars would be filling up are removed
  # effectively turning this into a CTB system
  ATB = true
  STAMINA_GAUGE_NAME = "ATB"
  ENABLE_PASSING = true
  PASSING_COST = 200
  
  # If seconds per turn is set to 0 then a turn length will be
  # decided on number of actions
  TURN_LENGTH = 4
  
  ESCAPE_COST = 500
  # If reset stamina is set to true then all characters
  # will start with a random amount of stamina capped at
  # the percentage you set.
  # If reset stamina is set to false then this just
  # affects enemies.
  STAMINA_START_PERCENT = 0

  # Default skill cost
  # If you want to customise skill costs do it like this
  # SKILL_COST[skill_id] = cost
  SKILL_COST = []
  SKILL_COST[0] = 1000
  # Attack
  SKILL_COST[1] = 1000
  # Guard
  SKILL_COST[2] = 500
  ITEM_COST = 1000

  # If you prefer to have states handle agility buffs then set STATES_HANDLE_AGI to true
  STATES_HANDLE_AGI = true
  # In the following section mult means the amount you multiply stamina gains by
  # if STATES_HANDLE_AGI is set to true then it is only used to determine bar color
  # with debuffs taking precedence over buffs
  STAMINA_STATES = []
  # Default colour
  STAMINA_STATES[0] = [1,31,32]
  # in the form
  # STAMINA_STATES[STATE_ID] = [MULT,FILL_COLOUR,EMPTY_COLOR]
  # e.g. Haste
  STAMINA_STATES[10] = [2,4,32]
  # e.g. Stop  
  STAMINA_STATES[11] = [0,8,32]
  # e.g. Slow  
  STAMINA_STATES[12] = [0.5,8,32]

  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.stamina_gain(battler)
    return ((2 + [0, battler.agi / 10].max) * self.stamina_mult(battler)).to_i
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.stamina_mult(battler)
    return 1 if STATES_HANDLE_AGI
    mult = STAMINA_STATES[0][0]
    for state in battler.states
      unless STAMINA_STATES[state.id].nil?
        mult *= STAMINA_STATES[state.id][0]
      end
    end
    return mult
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.stamina_colors(battler)
    colors = STAMINA_STATES[0]
    for state in battler.states
      unless STAMINA_STATES[state.id].nil?
        if STAMINA_STATES[state.id][0] < colors[0] or colors[0] == 1
          colors = STAMINA_STATES[state.id]
        end
      end
    end
    return colors
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_start
  #--------------------------------------------------------------------------
  def self.stamina_start(battler)
    battler.stamina = rand(MAX_STAMINA * STAMINA_START_PERCENT / 100)
  end
end

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● New attr_accessor
  #--------------------------------------------------------------------------
  attr_accessor :stamina
  #--------------------------------------------------------------------------
  # ● Aliases initialize
  #--------------------------------------------------------------------------
  alias cbs_initialize initialize
  def initialize
    cbs_initialize
    @stamina = 0
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_rate
  #--------------------------------------------------------------------------
  def stamina_rate
    @stamina.to_f / CBS::MAX_STAMINA
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_rate
  #--------------------------------------------------------------------------
  def stamina_gain
    return if not movable?
    @stamina = [CBS::MAX_STAMINA, @stamina + CBS.stamina_gain(self)].min
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_color
  #--------------------------------------------------------------------------
  def stamina_color
    for state in @states
      unless CBS::STAMINA_STATES[state].nil?
        return STAMINA_STATES[state]
      end
    end
    return STAMINA_STATES[0]
  end
end

#--------------------------------------------------------------------------
# ● New Class Window_PartyHorzCommand
#--------------------------------------------------------------------------
class Window_PartyHorzCommand < Window_HorzCommand
  #--------------------------------------------------------------------------
  # ● New Method initialize
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0)
    self.openness = 0
    deactivate
  end
  #--------------------------------------------------------------------------
  # ● New Method window_width
  #--------------------------------------------------------------------------
  def window_width
    return Graphics.width
  end
  #--------------------------------------------------------------------------
  # ● New Method visible_line_number
  #--------------------------------------------------------------------------
  def visible_line_number
    return 1
  end
  #--------------------------------------------------------------------------
  # ● New Method make_command_list
  #--------------------------------------------------------------------------
  def make_command_list
    add_command(Vocab::fight,  :fight)
    add_command(Vocab::escape, :escape, BattleManager.can_escape?)
  end
  #--------------------------------------------------------------------------
  # ● New Method setup
  #--------------------------------------------------------------------------
  def setup
    clear_command_list
    make_command_list
    refresh
    select(0)
    activate
    open
  end
end

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● Rewrote update
  #--------------------------------------------------------------------------
  def update
    super
    if (CBS::ENABLE_PASSING and @actor_command_window.active) and Input.press?(:A)
      command_pass
    end
    if BattleManager.in_turn? and !inputting?
      while @subject.nil? and !CBS::ATB
        process_stamina
      end
      if CBS::ATB
        process_stamina
      end
      process_event
      process_action
    end
    BattleManager.judge_win_loss
  end
  #--------------------------------------------------------------------------
  # ● New Method inputting?
  #--------------------------------------------------------------------------
  def inputting?
    return @actor_command_window.active || @skill_window.active ||
      @item_window.active || @actor_window.active || @enemy_window.active
  end
  #--------------------------------------------------------------------------
  # ● New Method process_stamina
  #--------------------------------------------------------------------------
  def process_stamina
    @actor_command_window.close
    return if @subject
    BattleManager.advance_turn
    all_battle_members.each do |battler|
      battler.stamina_gain
    end
    @status_window.refresh
    if @status_window.close?
      @status_window.open
    end
    if BattleManager.escaping?
      $game_party.battle_members.each do |battler|
        if battler.stamina < CBS::MAX_STAMINA
          $game_troop.members.each do |enemy|
            if enemy.stamina == CBS::MAX_STAMINA
              enemy.make_actions
              @subject = enemy
            end
          end
          return
        end
      end
      unless BattleManager.process_escape
        $game_party.battle_members.each do |actor|
          actor.stamina -= CBS::ESCAPE_COST
        end
        BattleManager.set_escaping(false) unless CBS::ATB
      end
    end
    all_battle_members.each do |battler|
      if battler.stamina == CBS::MAX_STAMINA
        battler.make_actions
        @subject = battler
        if @subject.inputable? and battler.is_a?(Game_Actor)
          @actor_command_window.setup(@subject)
          BattleManager.set_actor(battler)
        end
        return
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_info_viewport
  #--------------------------------------------------------------------------
  def create_info_viewport
    @info_viewport = Viewport.new
    @info_viewport.rect.y = Graphics.height - @status_window.height - 48
    @info_viewport.rect.height = @status_window.height + 48
    @info_viewport.z = 100
    @info_viewport.ox = 0
    @status_window.viewport = @info_viewport
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_party_command_window
  #--------------------------------------------------------------------------
  def create_party_command_window
    @party_command_window = Window_PartyHorzCommand.new
    @party_command_window.viewport = @info_viewport
    @party_command_window.set_handler(:fight,  method(:command_fight))
    @party_command_window.set_handler(:escape, method(:command_escape))
    @party_command_window.unselect
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_status_window
  #--------------------------------------------------------------------------
  def create_status_window
    @status_window = Window_BattleStatus.new
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_actor_command_window
  #--------------------------------------------------------------------------
  def create_actor_command_window
    @actor_command_window = Window_ActorCommand.new
    @actor_command_window.viewport = @info_viewport
    @actor_command_window.set_handler(:attack, method(:command_attack))
    @actor_command_window.set_handler(:skill,  method(:command_skill))
    @actor_command_window.set_handler(:guard,  method(:command_guard))
    @actor_command_window.set_handler(:item,   method(:command_item))
    @actor_command_window.set_handler(:cancel, method(:prior_command))
    @actor_command_window.x = Graphics.width - 128
    @actor_command_window.y = 48
  end
  #--------------------------------------------------------------------------
  # ● Destroyed update_info_viewport
  #--------------------------------------------------------------------------
  def update_info_viewport
    # no thank you
  end
#--------------------------------------------------------------------------
  # ● Rewrote start_party_command_selection
  #--------------------------------------------------------------------------
  def start_party_command_selection
    unless scene_changing?
      refresh_status
      @status_window.unselect
      @status_window.open
      if BattleManager.input_start
        @actor_command_window.close
        @party_command_window.setup
      else
        @party_command_window.deactivate
        turn_start
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Rewrote start_actor_command_selection
  #--------------------------------------------------------------------------
  def start_actor_command_selection
    @party_command_window.close
    BattleManager.set_escaping(false)
    turn_start
  end
  #--------------------------------------------------------------------------
  # ● Rewrote prior_command
  #--------------------------------------------------------------------------
  def prior_command
    start_party_command_selection
  end
  #--------------------------------------------------------------------------
  # ● Rewrote process_action
  #--------------------------------------------------------------------------
  def process_action
    return if scene_changing?
    if !@subject || !@subject.current_action
      @subject = BattleManager.next_subject
    end
    if Input.trigger?(:B) and (@subject == nil)
      start_party_command_selection
    end
    return unless @subject
    if @subject.current_action
      @subject.current_action.prepare
      if @subject.current_action.valid?
        @status_window.open
        execute_action
      end
      @subject.remove_current_action
      refresh_status
      @log_window.display_auto_affected_status(@subject)
      @log_window.wait_and_clear
    end
    process_action_end unless @subject.current_action
  end
  #--------------------------------------------------------------------------
  # ● Aliases use_item
  #--------------------------------------------------------------------------
  alias cbs_use_item use_item
  def use_item
    cbs_use_item
    @subject.stamina_loss
  end
  #--------------------------------------------------------------------------
  # ● Rewrote turn_end
  #--------------------------------------------------------------------------
  def turn_end
    all_battle_members.each do |battler|
      battler.on_turn_end
      refresh_status
      @log_window.display_auto_affected_status(battler)
      @log_window.wait_and_clear
    end
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_fight
  #--------------------------------------------------------------------------
  def command_fight
    BattleManager.next_command
    start_actor_command_selection
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_escape
  #--------------------------------------------------------------------------
  def command_escape
    @party_command_window.close
    BattleManager.set_escaping(true)
    turn_start
  end
  #--------------------------------------------------------------------------
  # ● New method command_pass
  #--------------------------------------------------------------------------
  def command_pass
    BattleManager.actor.stamina -= CBS::PASSING_COST
    BattleManager.clear_actor
    @subject = nil
    turn_start
    @actor_command_window.active = false
    @actor_command_window.close
  end
  #--------------------------------------------------------------------------
  # ● Destroyed next_command
  #--------------------------------------------------------------------------
  def next_command
    # no thank you
  end
end

class Window_BattleSkill < Window_SkillList
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(help_window, info_viewport)
    y = help_window.height
    super(0, y, Graphics.width, info_viewport.rect.y - y + 48)
    self.visible = false
    @help_window = help_window
    @info_viewport = info_viewport
  end
end

class Window_BattleActor < Window_BattleStatus
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(info_viewport)
    super()
    self.y = info_viewport.rect.y + 48
    self.visible = false
    self.openness = 255
    @info_viewport = info_viewport
  end
end

class Window_BattleEnemy < Window_Selectable
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(info_viewport)
    super(0, info_viewport.rect.y + 48, window_width, fitting_height(4))
    refresh
    self.visible = false
    @info_viewport = info_viewport
  end
end

class Window_BattleItem < Window_ItemList
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(help_window, info_viewport)
    y = help_window.height
    super(0, y, Graphics.width, info_viewport.rect.y - y + 48)
    self.visible = false
    @help_window = help_window
    @info_viewport = info_viewport
  end
end

module BattleManager
  #--------------------------------------------------------------------------
  # ● Rewrote setup
  #--------------------------------------------------------------------------
  def self.setup(troop_id, can_escape = true, can_lose = false)
    init_members
    $game_troop.setup(troop_id)
    @can_escape = can_escape
    @can_lose = can_lose
    make_escape_ratio
    @escaping = false
    @turn_counter = 0
    @actions_per_turn = $game_party.members.size + $game_troop.members.size
    ($game_party.members + $game_troop.members).each do |battler|
      if battler.is_a?(Game_Enemy) or CBS::RESET_STAMINA
        CBS.stamina_start(battler)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● New Method set_escaping
  #--------------------------------------------------------------------------
  def self.set_escaping(escaping)
    @escaping = escaping
  end
  #--------------------------------------------------------------------------
  # ● New Method escaping?
  #--------------------------------------------------------------------------
  def self.escaping?
    return @escaping
  end
  #--------------------------------------------------------------------------
  # ● Rewrote turn_start
  #--------------------------------------------------------------------------
  def self.turn_start
    @phase = :turn
    clear_actor
    $game_troop.increase_turn if $game_troop.turn_count == 0
  end
  #--------------------------------------------------------------------------
  # ● New Method set_actor
  #--------------------------------------------------------------------------
  def self.set_actor(actor)
    @actor_index = actor.index
  end
  #--------------------------------------------------------------------------
  # ● New Increase action counter
  #--------------------------------------------------------------------------
  def self.add_action
    return if @actions_per_turn.nil?
    @turn_counter += 1
    if @turn_counter == @actions_per_turn and CBS::TURN_LENGTH == 0
      $game_troop.increase_turn
      SceneManager.scene.turn_end
      @turn_counter = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● New Method advance_turn
  #--------------------------------------------------------------------------
  def self.advance_turn
    return if CBS::TURN_LENGTH == 0
    @turn_counter += 1
    if @turn_counter == 60 * CBS::TURN_LENGTH
      $game_troop.increase_turn
      SceneManager.scene.turn_end
      @turn_counter = 0
    end
  end
end

class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● Rewrote on_turn_end
  #--------------------------------------------------------------------------
  def on_turn_end
    @result.clear
    regenerate_all
    update_state_turns
    update_buff_turns
    remove_states_auto(2)
  end
  #--------------------------------------------------------------------------
  # ● New Method on_turn_end
  #--------------------------------------------------------------------------
  def stamina_loss
    if self.actor?
      @stamina -= input.stamina_cost
    else
      @stamina -= @actions[0].stamina_cost
    end
    BattleManager.add_action
  end
end

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● Rewrote input
  #--------------------------------------------------------------------------
  def input
    if @actions[@action_input_index] == nil
      @actions[@action_input_index] = Game_Action.new(self)
    end
    return @actions[@action_input_index]
  end
end

class Game_Action
  #--------------------------------------------------------------------------
  # ● New Method stamina_cost
  #--------------------------------------------------------------------------
  def stamina_cost
    if @item.is_skill?
      return CBS::SKILL_COST[item.id] if CBS::SKILL_COST[item.id]
      return CBS::SKILL_COST[0]
    end
    return CBS::ITEM_COST if @item.is_item?
    return CBS::MAX_STAMINA
  end
end

Entre "LNX11b" et "LNX11bskin", pour ajouter l'affichage des jauges et utiliser LNXSkin pour faire des barres verticales :
Code:
class Spriteset_BattleStatus
  include LNX11
  include LNX11b
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------  
  def initialize(battler, status_window, viewport = nil)
    @battler = battler
    @viewport = viewport
    @status_window = status_window
    # 基準座標
    @x = $game_party.members_screen_x[battler.index] + STATUS_OFFSET[:x]
    @x -= STATUS_WIDTH / 2
    @y = @status_window.y + STATUS_OFFSET[:y]
    # メインスキン
    @main_skin_sprite = create_skin(MAIN_SKIN)
    # ステート
    @state_skin_sprite = create_skin(STATE_SKIN)
    @state_icon = create_state_icon(STATE_ICON)
    # 名前
    @name_sprite = create_name(NAME)
    # 数字
    num = @battler.hp ; max = @battler.mhp
    @hp_number_sprite = create_number(num, max, HP_NUMBER_FORMAT)
    num = @battler.mp ; max = @battler.mmp
    @mp_number_sprite = create_number(num, max, MP_NUMBER_FORMAT)
    if $data_system.opt_display_tp
      num = @battler.tp ; max = @battler.max_tp
      @tp_number_sprite = create_number(num, max, TP_NUMBER_FORMAT)
    end
    # 数字(最大値)
    num = @battler.mhp
    @mhp_number_sprite = create_number(num, num, MAXHP_NUMBER_FORMAT)
    num = @battler.mmp
    @mmp_number_sprite = create_number(num, num, MAXMP_NUMBER_FORMAT)
    if $data_system.opt_display_tp
      num = @battler.max_tp
      @mtp_number_sprite = create_number(num, num, MAXTP_NUMBER_FORMAT)
    end
    # ゲージ
    @hp_gauge_sprite = create_gauge(@battler.hp_rate, HP_GAUGE_FORMAT)
    @mp_gauge_sprite = create_gauge(@battler.mp_rate, MP_GAUGE_FORMAT)
    if CBS::ATB
      @atb_gauge_sprite = create_gauge(@battler.stamina_rate, ATB_GAUGE_FORMAT)
    end
    if $data_system.opt_display_tp
      @tp_gauge_sprite = create_gauge(@battler.tp_rate, TP_GAUGE_FORMAT)
    end
    # ゲージと数字スプライトの同期
    if HP_GAUGE_FORMAT[:number_link] && @hp_number_sprite
      @hp_gauge_sprite.number = @hp_number_sprite if @hp_gauge_sprite
    end
    if MP_GAUGE_FORMAT[:number_link] && @mp_number_sprite
      @mp_gauge_sprite.number = @mp_number_sprite if @mp_gauge_sprite
    end
    if TP_GAUGE_FORMAT[:number_link] && @tp_number_sprite
      @tp_gauge_sprite.number = @tp_number_sprite if @tp_gauge_sprite
    end
    # 更新するスプライトの配列
    @sprites = [@main_skin_sprite, @state_skin_sprite, @state_icon,
      @name_sprite, @hp_number_sprite, @mp_number_sprite, @tp_number_sprite,
      @mhp_number_sprite, @mmp_number_sprite, @mtp_number_sprite,
      @hp_gauge_sprite, @mp_gauge_sprite, @atb_gauge_sprite, @tp_gauge_sprite]
    @sprites.delete(nil)
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    @atb_gauge_sprite.set(@battler.stamina_rate, true) if @atb_gauge_sprite
    @sprites.each {|sprite| sprite.update }
  end
  #--------------------------------------------------------------------------
  # ● ゲージの作成
  #--------------------------------------------------------------------------  
  def create_gauge(rate, format)
    return nil unless format[:enabled]
    case format[:type]
    when 0 # 横ゲージ
      sprite = Sprite_HorzGauge.new(rate, format, @viewport)
    when 1 # セルゲージ
      sprite = Sprite_CellGauge.new(rate, format, @viewport)
    when 2 # セルゲージ
      sprite = Sprite_VertGauge.new(rate, format, @viewport)
    end
    move(sprite, format)
    return sprite
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    # ゲージ
    @hp_gauge_sprite.set(@battler.hp_rate) if @hp_gauge_sprite
    @mp_gauge_sprite.set(@battler.mp_rate) if @mp_gauge_sprite
    @tp_gauge_sprite.set(@battler.tp_rate) if @tp_gauge_sprite
    # 数字
    @hp_number_sprite.set(@battler.hp, @battler.mhp) if @hp_number_sprite
    @mp_number_sprite.set(@battler.mp, @battler.mmp) if @mp_number_sprite
    @tp_number_sprite.set(@battler.tp, @battler.max_tp) if @tp_number_sprite
    # 数字(最大値)
    @mhp_number_sprite.set(@battler.mhp, @battler.mhp) if @mhp_number_sprite
    @mmp_number_sprite.set(@battler.mmp, @battler.mmp) if @mmp_number_sprite
    mtp = @battler.max_tp
    @mtp_number_sprite.set(mtp, mtp) if @mtp_number_sprite
    # ステート
    @state_icon.refresh if @state_icon
    @state_skin_sprite.visible = @state_icon.visible if @state_skin_sprite
    # 名前
    if @name_sprite
      @name_sprite.refresh
      if @state_icon && NAME[:auto_hide]
        @name_sprite.visible = !@state_icon.visible
      end
    end
  end
end

#==============================================================================
# ■ [追加]:Sprite_VertGauge
#------------------------------------------------------------------------------
#  バトルステータス:横方向のゲージ。
#==============================================================================

class Sprite_VertGauge < Sprite_BattleStatus
  NUMBERS    = [0,1,2,3,4,5,6,7,8,9]
  COLOR_SIZE = 4
  # 0:通常 1:ピンチ 2:最大 3:サブゲージ
  #--------------------------------------------------------------------------
  # ● [追加]:公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :number   # 同期する数字スプライト
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------  
  def initialize(rate, format, viewport)
    super(viewport)
    self.bitmap = Cache.system(format[:bitmap])
    @speed = format[:speed]
    @s_speed = format[:s_speed]
    @crisis = format[:crisis]    
    @direction = format[:direction]
    @sub_gauge = Sprite.new(viewport)
    @sub_gauge.bitmap = self.bitmap
    @number = nil
    @last_real_gauge_height = 0
    color_set_rect(3, @sub_gauge)
    set(rate, true)
  end
  #--------------------------------------------------------------------------
  # ● 解放
  #--------------------------------------------------------------------------  
  def dispose
    @sub_gauge.dispose
    super
  end
  #--------------------------------------------------------------------------
  # ● 移動
  #--------------------------------------------------------------------------
  def move(x, y, z)
    if @direction == 0
      y += max_gauge_height - @real_gauge_height
    end
    super(x, y, z)
    @sub_gauge.x = x
    @sub_gauge.y = y
    @sub_gauge.z = z - 1
  end
  #--------------------------------------------------------------------------
  # ● ゲージ最大か?
  #--------------------------------------------------------------------------
  def max?
    @gauge_height / max_gauge_height >= 1.0
  end
  #--------------------------------------------------------------------------
  # ● ゲージが少ない?
  #--------------------------------------------------------------------------  
  def crisis?
    @gauge_height / max_gauge_height < @crisis
  end
  #--------------------------------------------------------------------------
  # ● 最大ゲージ幅の取得
  #--------------------------------------------------------------------------
  def max_gauge_height
    self.bitmap.height.to_f
  end
  #--------------------------------------------------------------------------
  # ● ゲージ色変更(Rect)
  #--------------------------------------------------------------------------
  def color_set_rect(color, sprite)
    sprite.src_rect.width = self.bitmap.width / COLOR_SIZE
    sprite.src_rect.x = color * self.bitmap.width / COLOR_SIZE
  end
  #--------------------------------------------------------------------------
  # ● ゲージ色変更
  #--------------------------------------------------------------------------
  def gauge_color_set
    color_set_rect(max? ? 2 : crisis? ? 1 : 0, self)
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    # メインゲージ幅の更新
    if @real_gauge_height != @gauge_height
      if @number
        # 数字スプライトと同期
        rate = @number.real_rate
        height = ([max_gauge_height * rate, rate != 0 ? 1 : 0].max).to_i
        @real_gauge_height = height
      else
        @real_gauge_height = sma(@gauge_height, @real_gauge_height, @speed)
      end
      # ゲージ色変更
      gauge_color_set
    end
    # サブゲージ幅の更新
    if @sub_gauge_height > @gauge_height
      @sub_gauge_height = [@sub_gauge_height - @s_speed, @gauge_height].max
    elsif @sub_gauge_height != @gauge_height
      @sub_gauge_height = @real_gauge_height
    end
    # スプライトの更新
    update_sprite
  end
  #--------------------------------------------------------------------------
  # ● スプライトの更新
  #--------------------------------------------------------------------------
  def update_sprite
    p "Max:"+max_gauge_height.to_s+" y:"+self.y.to_s+" Real:"+@real_gauge_height.to_s+" Do:"+(self.y + max_gauge_height - @real_gauge_height).to_s
    if @direction == 0
      self.y += @last_real_gauge_height - @real_gauge_height
      self.src_rect.y = max_gauge_height - @real_gauge_height
      self.src_rect.height = @real_gauge_height
      @sub_gauge.y = self.y + @real_gauge_height
      @sub_gauge.src_rect.y = @real_gauge_height
      @sub_gauge.src_rect.height = @sub_gauge_height - @real_gauge_height
      @last_real_gauge_height = @real_gauge_height
    else
      self.src_rect.height = @real_gauge_height
      @sub_gauge.y = self.y + @real_gauge_height
      @sub_gauge.src_rect.y = @real_gauge_height
      @sub_gauge.src_rect.height = @sub_gauge_height - @real_gauge_height
    end
  end
  #--------------------------------------------------------------------------
  # ● ゲージレートの設定
  #--------------------------------------------------------------------------  
  def set(rate, apply = false)
    @gauge_rate = rate
    @gauge_height = ([max_gauge_height * rate, rate != 0 ? 1 : 0].max).to_i
    # すぐに適用
    if apply
      @real_gauge_height = @gauge_height
      @sub_gauge_height = @gauge_height
      # ゲージ色変更
      gauge_color_set
      # スプライトの更新
      update_sprite
    end
  end
  #--------------------------------------------------------------------------
  # ● 移動平均
  #--------------------------------------------------------------------------
  def sma(a, b, p)
    # a = 目標位置 b = 現在地
    return a if a == b || (a - b).abs < 0.3 || p == 1
    result = ((a + b * (p.to_f - 1)) / p.to_f)
    return (a - result).abs <= 1.0 ? (b < a ? b + 0.3 : b - 0.3) : result
  end
end
DrakeRoxas
DrakeRoxas
Membre

Nombre de messages : 44
Age : 27
Distinction : aucune
Date d'inscription : 23/07/2016

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Ven 12 Aoû 2016 - 17:51
(La suite, message trop long :c )
Et enfin "LNX11bskin" auquel il faut ajouter la jauge et déplacer le skin de base pour les jauges (j'y viens après) :
Code:
#==============================================================================
# ★ RGSS3-Extension
# LNX11bskin_リフォーム・バトルステータス#スキン設定
#  ☆「スタンダード」プリセット
#
#  このスクリプトは LNX11b_リフォーム・バトルステータス の設定スクリプトです。
#  LNX11b の動作に必須ですので、必ず導入してください。
#  スキンファイルは Graphics/System にインポートしてください。
#  
#  version   : 1.00 (12/02/28)
#  author    : ももまる
#  reference : http://peachround.blog.fc2.com/blog-entry-12.html
#
#==============================================================================

module LNX11
  #--------------------------------------------------------------------------
  # ● 基本設定
  #--------------------------------------------------------------------------
  # ステータス全体の座標調整  :x = X座標 / :y = Y座標
  STATUS_OFFSET = {:x => 60, :y => 0}
  
  # アクター1人あたりのステータス幅
  STATUS_WIDTH  = 64
end
module LNX11b
  #--------------------------------------------------------------------------
  # ● メインスキン
  #--------------------------------------------------------------------------
  MAIN_SKIN = {
  :enabled => true,                # 表示するか? true = 表示 / false = 非表示
  :bitmap  => "Lnx11b_mainskin",   # スキンのファイル名
  :x_fixed => false,   # X 座標を自動調整しない   true = 有効 / false = 無効
  :x =>  -65, :y => -8, :z =>  0,    # XYZ 座標
  }
  #--------------------------------------------------------------------------
  # ● ステートスキン
  #--------------------------------------------------------------------------
  STATE_SKIN = {
  :enabled => true,                # 表示するか? true = 表示 / false = 非表示
  :bitmap  => "Lnx11b_stateskin",  # スキンのファイル名
  :x_fixed => true,      # X 座標を自動調整しない true = 有効 / false = 無効
  :x => -80, :y => -18, :z => 2,   # XYZ 座標
  }
  #--------------------------------------------------------------------------
  # ● ステートアイコン
  #--------------------------------------------------------------------------
  STATE_ICON = {
  # ○ 基本
  :enabled => true,    # 表示するか?           true = 表示 / false = 非表示
  :x_fixed => true,    # X 座標を自動調整しない true = 有効 / false = 無効
  :x => -76, :y => -8, :z => 1,    # XYZ 座標
  # ○ 機能
  :size             => 2,          # 一度に表示するアイコン数
  :scroll_interval  => 30,         # スクロール速度(フレーム)
  :background_color => Color.new(0, 0, 0, 0),  # ステートアイコンの背景色
  }
  #--------------------------------------------------------------------------
  # ● 名前
  #--------------------------------------------------------------------------
  NAME = {
  # ○ 基本
  :enabled => false,  # 表示するか?           true = 表示 / false = 非表示
  :x_fixed => true,   # X 座標を自動調整しない true = 有効 / false = 無効
  :x => -76, :y => -8, :z => 2,     # XYZ 座標
  # ○ 機能
  :bitmap_name => false, # 名前表示に画像を使用する true = 有効 / false = 無効
  
    # bitmap_name => false :  名前表示に画像を使用しない場合
    :width  => 96, :height => 20, # 名前のサイズ :width = 幅 / :height = 高さ
    :name   => ["VL Gothic"], # フォント名
    :size   => 16,            # フォントサイズ
    :bold   => false,         # 太字    true = 有効 / false = 無効
    :italic => false,         # 斜体    true = 有効 / false = 無効
    :align  => 0,             # 文字揃え 0 = 左揃え / 1 = 中央揃え / 2 = 右揃え
    # 描画色([文字色, 縁取り色])
    :color  => [Color.new(255, 255, 255), Color.new(0, 0, 0, 192)],
    
  # ステートが表示されている時、自動的に隠す true = 有効 / false = 無効
  :auto_hide   => true
  }
  #--------------------------------------------------------------------------
  # ● HP ゲージ
  #--------------------------------------------------------------------------
  HP_GAUGE_FORMAT = {
  # ○ 基本
  :enabled => true,              # 表示するか?   true = 表示 / false = 非表示
  :bitmap  => "Lnx11b_hpgauge",  # ゲージのファイル名
  :x_fixed => false,     # X 座標を自動調整しない true = 有効 / false = 無効
  :x => 6, :y => 55, :z => 2,    # XYZ 座標
  # ○ 機能
  :number_link => true,  # ゲージ量を表示されている表示と一致させる
  :speed      => 4.0,   # ゲージ変化スピード 1.0以上(一致させない場合)
  :type        => 0,     # ゲージタイプ 0 = 横ゲージ / 1 = セルゲージ
  
    # type => 0 : 横ゲージの設定
    :crisis    => 0.25,  # ピンチ状態とみなすパーセンテージ
    :s_speed   => 0.2,   # サブゲージ変化スピード(pixel per frame)
    
    # type => 1 : セルゲージの設定
    :width => 36, :height => 36, # セルのサイズ :width = 幅 / :height = 高さ
    :pattern   => :auto, # パターン数 :auto を指定するとパターン数を自動判定
    :direction => 1,     # パターンの方向 0 = 横 / 1 = 縦
  }
  #--------------------------------------------------------------------------
  # ● MP ゲージ
  #--------------------------------------------------------------------------
  MP_GAUGE_FORMAT = {
  # ○ 基本
  :enabled => true,             # 表示するか?     true = 表示 / false = 非表示
  :bitmap  => "Lnx11b_mpgauge", # ゲージのファイル名
  :x_fixed => false,      # X 座標を自動調整しない true = 有効 / false = 無効
  :x => 6, :y => 77, :z => 2,   # XYZ 座標
  # ○ 機能
  :number_link => true,   # ゲージ量を表示されている表示と一致させる
  :speed      => 4.0,    # ゲージ変化スピード 1.0以上(一致させない場合)  
  :type        => 0,      # ゲージタイプ 0 = 横ゲージ / 1 = セルゲージ
  
    # type => 0 : 横ゲージの設定
    :crisis    => 0.25,   # ピンチ状態とみなすパーセンテージ
    :s_speed   => 0.2,    # サブゲージ変化スピード(pixel per frame)  
    
    # type => 1 : セルゲージの設定
    :width     => 36, :height => 36, # セルのサイズ :width = 幅 / :height = 高さ
    :pattern   => :auto,  # パターン数 :auto を指定するとパターン数を自動判定
    :direction => 1,      # パターンの方向 0 = 横 / 1 = 縦
  }
  #--------------------------------------------------------------------------
  # ● TP ゲージ
  #--------------------------------------------------------------------------
  TP_GAUGE_FORMAT = {
  # ○ 基本
  :enabled => true,              # 表示するか?   true = 表示 / false = 非表示
  :bitmap  => "Lnx11b_tpcircle", # ゲージのファイル名
  :x_fixed => false,     # X 座標を自動調整しない true = 有効 / false = 無効
  :x => 16, :y => 0, :z => 3,    # XYZ 座標
  # ○ 機能
  :number_link => true,  # ゲージ量を表示されている表示と一致させる
  :speed      => 4.0,   # ゲージ変化スピード 1.0以上(一致させない場合)  
  :type        => 1,     # ゲージタイプ 0 = 横ゲージ / 1 = セルゲージ
  
    # type => 0 : 横ゲージの設定
    :crisis    => 0.25,  # ピンチ状態とみなすパーセンテージ
    :s_speed   => 0.2,   # サブゲージ変化スピード(pixel per frame)
    
    # type => 1 : セルゲージの設定
    :width     => 36, :height => 36, # セルのサイズ :width = 幅 / :height = 高さ
    :pattern   => :auto, # パターン数 :auto を指定するとパターン数を自動判定
    :direction => 1,     # パターンの方向 0 = 横 / 1 = 縦
  }
  #--------------------------------------------------------------------------
  # ● TP ゲージ
  #--------------------------------------------------------------------------
  ATB_GAUGE_FORMAT = {
  # ○ 基本
  :enabled => true,              # 表示するか?   true = 表示 / false = 非表示
  :bitmap  => "Lnx11b_atbgauge", # ゲージのファイル名
  :x_fixed => false,     # X 座標を自動調整しない true = 有効 / false = 無効
  :x => -59, :y => -1, :z => 3,    # XYZ 座標
  # ○ 機能
  :number_link => false,  # ゲージ量を表示されている表示と一致させる
  :speed      => 4.0,   # ゲージ変化スピード 1.0以上(一致させない場合)  
  :type        => 2,     # Type de rendu : 0 = Barre horizontale / 1 = Suite d'images / 2 = Barre Verticale
  
    # type => 0 : 横ゲージの設定
    :crisis    => 0.25,  # ピンチ状態とみなすパーセンテージ
    :s_speed   => 0.2,   # サブゲージ変化スピード(pixel per frame)
    
    # type => 1 : セルゲージの設定
    :width     => 25, :height => 85, # セルのサイズ :width = 幅 / :height = 高さ
    :pattern   => :auto, # パターン数 :auto を指定するとパターン数を自動判定
    :direction => 0,     # パターンの方向 0 = 横 / 1 = 縦
  }
  #--------------------------------------------------------------------------
  # ● HP 数字
  #--------------------------------------------------------------------------
  HP_NUMBER_FORMAT = {
  # ○ 基本
  :enabled => true,                 # 表示するか? true = 表示 / false = 非表示
  :bitmap  => "Lnx11b_largenumber", # 数字のファイル名
  :x_fixed => false,   # X 座標を自動調整しない    true = 有効 / false = 無効
  :x => 64, :y => 39, :z => 4,      # XYZ 座標
  # ○ 機能
  :digit   => 5,       # 桁数
  :spacing => -4,      # 字間
  :align   => 2,       # 文字揃え 0 = 左揃え / 1 = 中央揃え / 2 = 右揃え
  :speed   => 12,      # 数字の変化スピード 1 以上
  :crisis  => 0.25,    # ピンチ状態とみなすパーセンテージ
  :dead    => 0.0,     # 死亡状態とみなすパーセンテージ
  }
  #--------------------------------------------------------------------------
  # ● MP 数字
  #--------------------------------------------------------------------------
  MP_NUMBER_FORMAT = {
  # ○ 基本
  :enabled => true,                 # 表示するか? true = 表示 / false = 非表示
  :bitmap  => "Lnx11b_largenumber", # 数字のファイル名
  :x_fixed => false,   # X 座標を自動調整しない    true = 有効 / false = 無効
  :x => 64, :y => 61, :z => 4,      # XYZ 座標
  # ○ 機能
  :digit   => 5,       # 桁数
  :spacing => -4,      # 字間
  :align   => 2,       # 文字揃え 0 = 左揃え / 1 = 中央揃え / 2 = 右揃え
  :speed   => 12,      # 数字の変化スピード 1 以上
  :crisis  => 0.25,    # ピンチ状態とみなすパーセンテージ
  :dead    => -1.0,    # 死亡状態とみなすパーセンテージ
  }
  #--------------------------------------------------------------------------
  # ● TP 数字
  #--------------------------------------------------------------------------
  TP_NUMBER_FORMAT = {
  # ○ 基本
  :enabled => true,                 # 表示するか? true = 表示 / false = 非表示
  :bitmap  => "Lnx11b_smallnumber", # 数字のファイル名
  :x_fixed => false,   # X 座標を自動調整しない    true = 有効 / false = 無効
  :x => 34, :y => 14, :z => 5,      # XYZ 座標
  # ○ 機能
  :digit   => 4,       # 桁数
  :spacing => -2,      # 字間
  :align   => 1,       # 文字揃え 0 = 左揃え / 1 = 中央揃え / 2 = 右揃え
  :speed   => 12,      # 数字の変化スピード 1 以上
  :crisis  => -1.0,    # ピンチ状態とみなすパーセンテージ
  :dead    => -1.0,    # 死亡状態とみなすパーセンテージ
  }
  #--------------------------------------------------------------------------
  # ● 最大 HP 数字
  #--------------------------------------------------------------------------
  MAXHP_NUMBER_FORMAT = {
  # ○ 基本
  :enabled => false,                # 表示するか? true = 表示 / false = 非表示
  :bitmap  => "Lnx11b_smallnumber", # 数字のファイル名
  :x_fixed => false,   # X 座標を自動調整しない    true = 有効 / false = 無効
  :x => 64, :y => 39, :z => 6,      # XYZ 座標
  # ○ 機能
  :digit   => 5,       # 桁数
  :spacing => -4,      # 字間
  :align   => 0,       # 文字揃え 0 = 左揃え / 1 = 中央揃え / 2 = 右揃え
  :speed   => 12,      # 数字の変化スピード 1 以上
  :crisis  => 0.25,    # ピンチ状態とみなすパーセンテージ
  :dead    => 0.0,     # 死亡状態とみなすパーセンテージ
  }  
  #--------------------------------------------------------------------------
  # ● 最大 MP 数字
  #--------------------------------------------------------------------------
  MAXMP_NUMBER_FORMAT = {
  # ○ 基本
  :enabled => false,                # 表示するか? true = 表示 / false = 非表示
  :bitmap  => "Lnx11b_smallnumber", # 数字のファイル名
  :x_fixed => false,   # X 座標を自動調整しない    true = 有効 / false = 無効
  :x => 64, :y => 61, :z => 6,      # XYZ 座標
  # ○ 機能
  :digit   => 5,       # 桁数
  :spacing => -4,      # 字間
  :align   => 0,       # 文字揃え 0 = 左揃え / 1 = 中央揃え / 2 = 右揃え
  :speed   => 12,      # 数字の変化スピード 1 以上
  :crisis  => 0.25,    # ピンチ状態とみなすパーセンテージ
  :dead    => -1.0,    # 死亡状態とみなすパーセンテージ
  }  
  #--------------------------------------------------------------------------
  # ● 最大 TP 数字
  #--------------------------------------------------------------------------
  MAXTP_NUMBER_FORMAT = {
  # ○ 基本
  :enabled => false,                # 表示するか? true = 表示 / false = 非表示
  :bitmap  => "Lnx11b_smallnumber", # 数字のファイル名
  :x_fixed => false,   # X 座標を自動調整しない    true = 有効 / false = 無効
  :x => 34, :y => 26, :z => 6,      # XYZ 座標
  # ○ 機能
  :digit   => 4,       # 桁数
  :spacing => -2,      # 字間
  :align   => 1,       # 文字揃え 0 = 左揃え / 1 = 中央揃え / 2 = 右揃え
  :speed   => 12,      # 数字の変化スピード 1 以上
  :crisis  => -1.0,    # ピンチ状態とみなすパーセンテージ
  :dead    => -1.0,    # 死亡状態とみなすパーセンテージ
  }
  #
  # 設定ここまで お疲れ様でした。
  #
end
#==============================================================================
# ■ LNXスクリプト導入情報
#==============================================================================
$lnx_include = {} if $lnx_include == nil
$lnx_include[:lnx11bskin] = 100 # version
p "OK:LNX11bskin_リフォーム・バトルステータス#スキン設定"

On a presque fini ... LNX demande d'ajouter des images pour les jauges, et certains messages (comme le "LEVEL UP!" en fin de combat). Du coup, il a fallut modifier l'image des fonds de jauges pour avoir la jauge ATB, que tu pourras modifier pour y ajouter le mot "ATB" (je suis pas super doué en graphisme :p). Il faut aussi ajouter une image pour le "remplissage" de la jauge. Donc les images en question :
Jauge ATB pour LNX Battle 381464Lnx11bmainskin Lnx11b_mainskin.png

Jauge ATB pour LNX Battle Lnx11b10 Lnx11b_atbgauge.png


Dernière édition par DrakeRoxas le Ven 12 Aoû 2016 - 18:00, édité 1 fois
Gelarto
Gelarto
Gelato Della Mamma

Nombre de messages : 2919
Age : 24
Distinction : Grand bêta-testeur de la communauté Curse
Personne avec du goût
Je ne suis pas une glace italienne, bordel de merde! [Gel']
Mon plus grand fan [Yama']
Mon ptit bichon [encore Yama']
Jeau-Paul II[Mist']
Saint-Gelato Le Frais [Mist']
Écrivain du dimanche [Amal']
FF IV Fanatic [LaCommu']
Collectionneur de distinctions de merde [Yama]
ModoGel [Un staffieux mais lequel?]
RNGel 2.0 [Zeal']
Date d'inscription : 31/07/2012

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Ven 12 Aoû 2016 - 17:58
Je vois pas d’inconvénient à ce que tu doubles post là-dessus après ça dépend toujours des différences entre les versions et l'écart entre de temps entre les messages.
Exemple : Si tu post ton script et que tu fais un double post 5~10 minutes après en disant que t'as modifié 2 lignes, ça passera pas xD

Là c'est trop long en un, donc en 2.. on va pas te dire non  Jauge ATB pour LNX Battle 522164

EDIT : y a bien un fond noir pour la première image.
DrakeRoxas
DrakeRoxas
Membre

Nombre de messages : 44
Age : 27
Distinction : aucune
Date d'inscription : 23/07/2016

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Ven 12 Aoû 2016 - 18:04
Oui, je pensais pas à poster d'aussi petites modifications, c'est vrai que ce serait clairement abusif xD
Mais merci, c'est bon de savoir que je me fait pas auto-kick pour multi-post quand il y a une raison Jauge ATB pour LNX Battle 522164

Et l'image est repostée avec un fond transparent :3 Mais c'est quand même bizarre qu'il mette un fond noir comme ça ...
Nérylis
Nérylis
Membre

Nombre de messages : 612
Age : 31
Localisation : Seine Maritime
Distinction : aucune
Date d'inscription : 23/11/2014

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Ven 12 Aoû 2016 - 20:37
Je viens de tester ce que tu as fait, ça marche bien. Les jauges sont géniales, absolument ce que je voulais et ça rend bien. Je m'occuperai de rajouter la mention ATB, je ne devrai pas avoir de problème. Et c'est pas mal aussi la fuite qui nécessite d'avoir toutes les jauges à fond. Merci en tout cas pour ce que tu as déjà fait, c'est tout de même pas simple.

Je te laisse progresser comme tu veux par rapport à ma demande mais tu as une bonne base.

Juste une question pour le moment. Tu parlais dans ton message au-dessus du script ATB avec la partie personnalisable. Je ne comprends pas trop les éléments de cette partie justement. Il n'y a rien par rapport à l'agilité, non ? Est-ce que c'est une partie à modifier par rapport à ma demande ? J'ai juste besoin d'une valeur mini et maxi pour l'agilité afin de déterminer les valeurs mini et maxi de remplissage des jauges.

Une autre chose aussi que j'ai remarquée. Au début du combat, lorsqu'on a le choix entre Combattre et S'enfuir, il y a eu un décalage du texte par rapport à la version de base sans ATB. Normalement, les deux intitulés se trouvent à gauche et à droite du cadre, mais maintenant les deux sont à gauche et rien à droite.
DrakeRoxas
DrakeRoxas
Membre

Nombre de messages : 44
Age : 27
Distinction : aucune
Date d'inscription : 23/07/2016

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Ven 12 Aoû 2016 - 22:24
Pour la partie modifiable, je le reposte avec une version plus compréhensible (j'ai compris qu'en modifiant par la suite ce qu'était le "STATES_HANDLE_AGI"). Donc, le changelog :
- Recentrage des choix du menu "Combattre/Fuir" (c'est vrai que c'est bien + classe)
- Ajout du combat auto
- Gestion des status qui change la vitesse de remplissage
- Effacement des status qui change la vitesse
- Explications de la configuration

Pour le 1er (au dessus de LNX) :
Code:
=begin
Customisable ATB/Stamina Based Battle System Script
by Fomar0153
Version 1.3
----------------------
Notes
----------------------
No requirements
Customises the battle system to be similar to
ATB or Stamina based battle systems.
----------------------
Instructions
----------------------
Edit variables in CBS to suit your needs.
The guard status should be set to 2~2 turns.
----------------------
Change Log
----------------------
1.0 -> 1.1 Restored turn functionality and a glitch
          related to message windows
1.1 -> 1.2 Added CTB related options
          Added the ability to pass a turn
          Fixed a bug which caused an error on maps
          with no random battles
          Added options for turn functionality to be based on time
          or number of actions
          Added the ability to change the bar colours based on states
1.2 -> 1.3 Fixed a bug when escaping using CTB mode
         
----------------------
Known bugs
----------------------
None
=end
module CBS

  MAX_STAMINA = 1000              # Valeur max de la jauge
 
  ATB = true                      # Active/Désactive le système ATB
  ENABLE_PASSING = true          # Active/Désactive la possibiliter de passer
                                  # son tour
  PASSING_COST = 200              # Stamania consommée en passant son tour
                                  # (ne pas mettre trop ici, sinon la guarde
                                  #  est bien mieux et rend cette action inutile)
 
  TURN_LENGTH = 4                # Temps en seconde de chaque tour.
                                  # Si cette valeur est mise à 0 :
                                  # un tour = nb d'action égale à nb battlers
 
  RESET_STAMINA = true            # true : Reprend une valeur aléatoire en début
                                  # de combat ;
                                  # false : Garde les jauges de stamina du
                                  # dernier combat
  ESCAPE_COST = 500              # Si RESET_STAMINA = false, fuir consomera
                                  # ESCAPE_COST points de stamina
  STAMINA_START_PERCENT = 0      # Si RESET_STAMINA = true, les combatants
                                  # commenceront chaque combat avec un nombre
                                  # de points de stamina compris entre
                                  # 0 et STAMINA_START_PERCENT

  # Cout en stamina pour lancer chaque sort. le format est :
  # SKILL_COST[id du sort] = coût en stamina
  SKILL_COST = []
  SKILL_COST[0] = 1000            # Coût en stamina pour lancer un sort par défaut
  # Attack
  SKILL_COST[1] = 1000            # Coût en stamina pour lancer le 1er sort (Atk)
  # Guard
  SKILL_COST[2] = 500            # Coût en stamina pour lancer le 2e sort (Def)
  ITEM_COST = 1000                # Coût en stamina pour lancer un objet

  STATES_HANDLE_AGI = false      # true : Seule l'agilité est prise en compte
                                  # pour calculer les gains de stamina
                                  # false : Les status influent aussi sur
                                  # les gains de stamina.
  # Ce qui suit n'est pas utilisé si STATES_HANDLE_AGI = true.
  # Ici on choisis les status qui ralentissent dans ce format :
  # STAMINA_STATES[id du status] = [Mult, Zéro, Efface]
  # - - - Mult : Multipli le gain en stamina
  # - - - Zéro : Remet la stamina à 0 et la maintient à 0 tant que le statut reste
  # - - - Efface : Efface et peut être effacé par les autres statut ayant "true" ici
  STAMINA_STATES = []
  STAMINA_STATES[0]  = [  1,false,false] # Sans status
  STAMINA_STATES[34] = [  2,false, true] # Exemple pour la vitesse
  STAMINA_STATES[35] = [0.5,false, true] # Exemple pour le ralentissement
  STAMINA_STATES[36] = [  0,false,false] # Exemple pour le stop
  STAMINA_STATES[37] = [  0, true,false] # Exemple pour le stun

  #--------------------------------------------------------------------------
  # ● New Method add_state
  #--------------------------------------------------------------------------
  def self.add_state(battler, state_id)
    unless STAMINA_STATES[state_id].nil?
      return unless STAMINA_STATES[state_id][2]
    end
    if !STATES_HANDLE_AGI
      for state in battler.states
        unless STAMINA_STATES[state.id].nil? or state.id == state_id
          battler.remove_state(state.id) if STAMINA_STATES[state.id][2]
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain?
  #--------------------------------------------------------------------------
  def self.stamina_gain?(battler)
    if !STATES_HANDLE_AGI
      for state in battler.states
        unless STAMINA_STATES[state.id].nil?
          if STAMINA_STATES[state.id][1]
            battler.stamina = 0
            return false
          end
        end
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.stamina_gain(battler)
    return ((2 + [0, battler.agi / 10].max) * self.stamina_mult(battler)).to_i
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.stamina_mult(battler)
    return 1 if STATES_HANDLE_AGI
    mult = STAMINA_STATES[0][0]
    for state in battler.states
      unless STAMINA_STATES[state.id].nil?
        mult *= STAMINA_STATES[state.id][0]
      end
    end
    return mult
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_start
  #--------------------------------------------------------------------------
  def self.stamina_start(battler, value = nil)
    battler.stamina = rand(MAX_STAMINA * STAMINA_START_PERCENT / 100)
    battler.stamina = value if value != nil
  end
end

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● New attr_accessor
  #--------------------------------------------------------------------------
  attr_accessor :stamina
  #--------------------------------------------------------------------------
  # ● Aliases initialize
  #--------------------------------------------------------------------------
  alias cbs_initialize initialize
  def initialize
    cbs_initialize
    @stamina = 0
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_rate
  #--------------------------------------------------------------------------
  def stamina_rate
    @stamina.to_f / CBS::MAX_STAMINA
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_rate
  #--------------------------------------------------------------------------
  def stamina_gain
    return if not CBS.stamina_gain?(self)
    return if not movable?
    @stamina = [CBS::MAX_STAMINA, @stamina + CBS.stamina_gain(self)].min
  end
  #--------------------------------------------------------------------------
  # * Determine if Auto Battle
  #--------------------------------------------------------------------------
  alias cbs_auto_battle? auto_battle?
  def auto_battle?
    return BattleManager.auto_battle?
    return cbs_auto_battle?
  end
end

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● Rewrote update
  #--------------------------------------------------------------------------
  def update
    super
    if (CBS::ENABLE_PASSING and @actor_command_window.active) and Input.press?(:A)
      command_pass
    end
    if BattleManager.in_turn? and !inputting?
      while @subject.nil? and !CBS::ATB
        process_stamina
      end
      if CBS::ATB
        process_stamina
      end
      process_event
      process_action
    end
    BattleManager.judge_win_loss
  end
  #--------------------------------------------------------------------------
  # ● New Method inputting?
  #--------------------------------------------------------------------------
  def inputting?
    return @actor_command_window.active || @skill_window.active ||
      @item_window.active || @actor_window.active || @enemy_window.active
  end
  #--------------------------------------------------------------------------
  # ● New Method process_stamina
  #--------------------------------------------------------------------------
  def process_stamina
    @actor_command_window.close
    return if @subject
    BattleManager.advance_turn
    all_battle_members.each do |battler|
      battler.stamina_gain
    end
    @status_window.refresh
    if @status_window.close?
      @status_window.open
    end
    if BattleManager.escaping?
      $game_party.battle_members.each do |battler|
        if battler.stamina < CBS::MAX_STAMINA
          $game_troop.members.each do |enemy|
            if enemy.stamina == CBS::MAX_STAMINA
              enemy.make_actions
              @subject = enemy
            end
          end
          return
        end
      end
      unless BattleManager.process_escape
        $game_party.battle_members.each do |actor|
          actor.stamina -= CBS::ESCAPE_COST
        end
        BattleManager.set_escaping(false) unless CBS::ATB
      end
    end
    all_battle_members.each do |battler|
      if battler.stamina == CBS::MAX_STAMINA
        battler.make_actions
        @subject = battler
        if @subject.inputable? and battler.is_a?(Game_Actor)
          @actor_command_window.setup(@subject)
          BattleManager.set_actor(battler)
        end
        return
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_info_viewport
  #--------------------------------------------------------------------------
  def create_info_viewport
    @info_viewport = Viewport.new
    @info_viewport.rect.y = Graphics.height - @status_window.height - 48
    @info_viewport.rect.height = @status_window.height + 48
    @info_viewport.z = 100
    @info_viewport.ox = 0
    @status_window.viewport = @info_viewport
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_party_command_window
  #--------------------------------------------------------------------------
  def create_party_command_window
    @party_command_window = Window_PartyCommand.new
    @party_command_window.viewport = @info_viewport
    @party_command_window.set_handler(:fight,  method(:command_fight))
    @party_command_window.set_handler(:escape, method(:command_escape))
    @party_command_window.set_handler(:auto_battle, method(:command_auto_battle))
    @party_command_window.unselect
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_status_window
  #--------------------------------------------------------------------------
  def create_status_window
    @status_window = Window_BattleStatus.new
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_actor_command_window
  #--------------------------------------------------------------------------
  def create_actor_command_window
    @actor_command_window = Window_ActorCommand.new
    @actor_command_window.viewport = @info_viewport
    @actor_command_window.set_handler(:attack, method(:command_attack))
    @actor_command_window.set_handler(:skill,  method(:command_skill))
    @actor_command_window.set_handler(:guard,  method(:command_guard))
    @actor_command_window.set_handler(:item,  method(:command_item))
    @actor_command_window.set_handler(:cancel, method(:prior_command))
    @actor_command_window.x = Graphics.width - 128
    @actor_command_window.y = 48
  end
  #--------------------------------------------------------------------------
  # ● Destroyed update_info_viewport
  #--------------------------------------------------------------------------
  def update_info_viewport
    # no thank you
  end
  #--------------------------------------------------------------------------
  # ● Rewrote start_party_command_selection
  #--------------------------------------------------------------------------
  def start_party_command_selection
    unless scene_changing?
      refresh_status
      @status_window.unselect
      @status_window.open
      if BattleManager.input_start
        @actor_command_window.close
        @party_command_window.setup
      else
        @party_command_window.deactivate
        turn_start
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Rewrote start_actor_command_selection
  #--------------------------------------------------------------------------
  def start_actor_command_selection
    @party_command_window.close
    BattleManager.set_escaping(false)
    turn_start
  end
  #--------------------------------------------------------------------------
  # ● Rewrote prior_command
  #--------------------------------------------------------------------------
  def prior_command
    start_party_command_selection
  end
  #--------------------------------------------------------------------------
  # ● Rewrote process_action
  #--------------------------------------------------------------------------
  def process_action
    return if scene_changing?
    if !@subject || !@subject.current_action
      @subject = BattleManager.next_subject
    end
    if Input.trigger?(:B) and (@subject == nil)
      start_party_command_selection
    end
    return unless @subject
    if @subject.current_action
      @subject.current_action.prepare
      if @subject.current_action.valid?
        @status_window.open
        execute_action
      end
      @subject.remove_current_action
      refresh_status
      @log_window.display_auto_affected_status(@subject)
      @log_window.wait_and_clear
    end
    process_action_end unless @subject.current_action
  end
  #--------------------------------------------------------------------------
  # ● Aliases use_item
  #--------------------------------------------------------------------------
  alias cbs_use_item use_item
  def use_item
    cbs_use_item
    @subject.stamina_loss
  end
  #--------------------------------------------------------------------------
  # ● Rewrote turn_end
  #--------------------------------------------------------------------------
  def turn_end
    all_battle_members.each do |battler|
      battler.on_turn_end
      refresh_status
      @log_window.display_auto_affected_status(battler)
      @log_window.wait_and_clear
    end
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_fight
  #--------------------------------------------------------------------------
  def command_fight
    BattleManager.next_command
    start_actor_command_selection
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_escape
  #--------------------------------------------------------------------------
  def command_escape
    @party_command_window.close
    BattleManager.set_escaping(true)
    turn_start
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_auto_battle
  #--------------------------------------------------------------------------
  def command_auto_battle
    @party_command_window.close
    BattleManager.set_auto_battle(true)
    start_actor_command_selection
  end
  #--------------------------------------------------------------------------
  # ● New method command_pass
  #--------------------------------------------------------------------------
  def command_pass
    BattleManager.actor.stamina -= CBS::PASSING_COST
    BattleManager.clear_actor
    @subject = nil
    turn_start
    @actor_command_window.active = false
    @actor_command_window.close
  end
  #--------------------------------------------------------------------------
  # ● Destroyed next_command
  #--------------------------------------------------------------------------
  def next_command
    # no thank you
  end
end

class Window_BattleSkill < Window_SkillList
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(help_window, info_viewport)
    y = help_window.height
    super(0, y, Graphics.width, info_viewport.rect.y - y + 48)
    self.visible = false
    @help_window = help_window
    @info_viewport = info_viewport
  end
end

class Window_BattleActor < Window_BattleStatus
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(info_viewport)
    super()
    self.y = info_viewport.rect.y + 48
    self.visible = false
    self.openness = 255
    @info_viewport = info_viewport
  end
end

class Window_BattleEnemy < Window_Selectable
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(info_viewport)
    super(0, info_viewport.rect.y + 48, window_width, fitting_height(4))
    refresh
    self.visible = false
    @info_viewport = info_viewport
  end
end

class Window_BattleItem < Window_ItemList
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(help_window, info_viewport)
    y = help_window.height
    super(0, y, Graphics.width, info_viewport.rect.y - y + 48)
    self.visible = false
    @help_window = help_window
    @info_viewport = info_viewport
  end
end

module BattleManager
  #--------------------------------------------------------------------------
  # ● Rewrote setup
  #--------------------------------------------------------------------------
  def self.setup(troop_id, can_escape = true, can_lose = false)
    init_members
    $game_troop.setup(troop_id)
    @can_escape = can_escape
    @can_lose = can_lose
    make_escape_ratio
    @escaping = false
    @auto_battle = false
    @turn_counter = 0
    @actions_per_turn = $game_party.members.size + $game_troop.members.size
    ($game_party.members + $game_troop.members).each do |battler|
      if battler.is_a?(Game_Enemy) or CBS::RESET_STAMINA
        CBS.stamina_start(battler)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Processing at Encounter Time
  #--------------------------------------------------------------------------
  def self.on_encounter
    @preemptive = (rand < rate_preemptive)
    @surprise = (rand < rate_surprise && !@preemptive)
   
    if @preemptive
      $game_party.members.each do |battler|
        CBS.stamina_start(battler, CBS::MAX_STAMINA)
      end
      $game_troop.members.each do |battler|
        CBS.stamina_start(battler, 0)
      end
    elsif @surprise
      $game_party.members.each do |battler|
        CBS.stamina_start(battler, 0)
      end
      $game_troop.members.each do |battler|
        CBS.stamina_start(battler, CBS::MAX_STAMINA)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● New Method set_auto_battle
  #--------------------------------------------------------------------------
  def self.set_auto_battle(auto_battle)
    @auto_battle = auto_battle
  end
  #--------------------------------------------------------------------------
  # ● New Method auto_battle?
  #--------------------------------------------------------------------------
  def self.auto_battle?
    return @auto_battle
  end
  #--------------------------------------------------------------------------
  # ● New Method set_escaping
  #--------------------------------------------------------------------------
  def self.set_escaping(escaping)
    @escaping = escaping
  end
  #--------------------------------------------------------------------------
  # ● New Method escaping?
  #--------------------------------------------------------------------------
  def self.escaping?
    return @escaping
  end
  #--------------------------------------------------------------------------
  # ● Rewrote turn_start
  #--------------------------------------------------------------------------
  def self.turn_start
    @phase = :turn
    clear_actor
    $game_troop.increase_turn if $game_troop.turn_count == 0
  end
  #--------------------------------------------------------------------------
  # ● New Method set_actor
  #--------------------------------------------------------------------------
  def self.set_actor(actor)
    @actor_index = actor.index
  end
  #--------------------------------------------------------------------------
  # ● New Increase action counter
  #--------------------------------------------------------------------------
  def self.add_action
    return if @actions_per_turn.nil?
    @turn_counter += 1
    if @turn_counter == @actions_per_turn and CBS::TURN_LENGTH == 0
      $game_troop.increase_turn
      SceneManager.scene.turn_end
      @turn_counter = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● New Method advance_turn
  #--------------------------------------------------------------------------
  def self.advance_turn
    return if CBS::TURN_LENGTH == 0
    @turn_counter += 1
    if @turn_counter == 60 * CBS::TURN_LENGTH
      $game_troop.increase_turn
      SceneManager.scene.turn_end
      @turn_counter = 0
    end
  end
end

class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● Rewrote on_turn_end
  #--------------------------------------------------------------------------
  def on_turn_end
    @result.clear
    regenerate_all
    update_state_turns
    update_buff_turns
    remove_states_auto(2)
  end
  #--------------------------------------------------------------------------
  # ● New Method on_turn_end
  #--------------------------------------------------------------------------
  def stamina_loss
    if self.actor?
      @stamina -= input.stamina_cost
    else
      @stamina -= @actions[0].stamina_cost
    end
    BattleManager.add_action
  end
  #--------------------------------------------------------------------------
  # * Add State
  #--------------------------------------------------------------------------
  alias cbs_add_state add_state
  def add_state(state_id)
    cbs_add_state(state_id)
    CBS.add_state(self, state_id)
  end
end

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● Rewrote input
  #--------------------------------------------------------------------------
  def input
    if @actions[@action_input_index] == nil
      @actions[@action_input_index] = Game_Action.new(self)
    end
    return @actions[@action_input_index]
  end
  #--------------------------------------------------------------------------
  # * Create Battle Action
  #--------------------------------------------------------------------------
  def make_actions
    super
    if confusion?
      make_confusion_actions
    elsif auto_battle?
      make_auto_battle_actions
    end
  end
end

class Game_Action
  #--------------------------------------------------------------------------
  # ● New Method stamina_cost
  #--------------------------------------------------------------------------
  def stamina_cost
    if @item.is_skill?
      return CBS::SKILL_COST[item.id] if CBS::SKILL_COST[item.id]
      return CBS::SKILL_COST[0]
    end
    return CBS::ITEM_COST if @item.is_item?
    return CBS::MAX_STAMINA
  end
end

Pour celui entre "LNX11b" et "LNX11bskin" :
Code:
class Spriteset_BattleStatus
  include LNX11
  include LNX11b
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #-------------------------------------------------------------------------- 
  def initialize(battler, status_window, viewport = nil)
    @battler = battler
    @viewport = viewport
    @status_window = status_window
    # 基準座標
    @x = $game_party.members_screen_x[battler.index] + STATUS_OFFSET[:x]
    @x -= STATUS_WIDTH / 2
    @y = @status_window.y + STATUS_OFFSET[:y]
    # メインスキン
    @main_skin_sprite = create_skin(MAIN_SKIN)
    # ステート
    @state_skin_sprite = create_skin(STATE_SKIN)
    @state_icon = create_state_icon(STATE_ICON)
    # 名前
    @name_sprite = create_name(NAME)
    # 数字
    num = @battler.hp ; max = @battler.mhp
    @hp_number_sprite = create_number(num, max, HP_NUMBER_FORMAT)
    num = @battler.mp ; max = @battler.mmp
    @mp_number_sprite = create_number(num, max, MP_NUMBER_FORMAT)
    if $data_system.opt_display_tp
      num = @battler.tp ; max = @battler.max_tp
      @tp_number_sprite = create_number(num, max, TP_NUMBER_FORMAT)
    end
    # 数字(最大値)
    num = @battler.mhp
    @mhp_number_sprite = create_number(num, num, MAXHP_NUMBER_FORMAT)
    num = @battler.mmp
    @mmp_number_sprite = create_number(num, num, MAXMP_NUMBER_FORMAT)
    if $data_system.opt_display_tp
      num = @battler.max_tp
      @mtp_number_sprite = create_number(num, num, MAXTP_NUMBER_FORMAT)
    end
    # ゲージ
    @hp_gauge_sprite = create_gauge(@battler.hp_rate, HP_GAUGE_FORMAT)
    @mp_gauge_sprite = create_gauge(@battler.mp_rate, MP_GAUGE_FORMAT)
    if CBS::ATB
      @atb_gauge_sprite = create_gauge(@battler.stamina_rate, ATB_GAUGE_FORMAT)
    end
    if $data_system.opt_display_tp
      @tp_gauge_sprite = create_gauge(@battler.tp_rate, TP_GAUGE_FORMAT)
    end
    # ゲージと数字スプライトの同期
    if HP_GAUGE_FORMAT[:number_link] && @hp_number_sprite
      @hp_gauge_sprite.number = @hp_number_sprite if @hp_gauge_sprite
    end
    if MP_GAUGE_FORMAT[:number_link] && @mp_number_sprite
      @mp_gauge_sprite.number = @mp_number_sprite if @mp_gauge_sprite
    end
    if TP_GAUGE_FORMAT[:number_link] && @tp_number_sprite
      @tp_gauge_sprite.number = @tp_number_sprite if @tp_gauge_sprite
    end
    # 更新するスプライトの配列
    @sprites = [@main_skin_sprite, @state_skin_sprite, @state_icon,
      @name_sprite, @hp_number_sprite, @mp_number_sprite, @tp_number_sprite,
      @mhp_number_sprite, @mmp_number_sprite, @mtp_number_sprite,
      @hp_gauge_sprite, @mp_gauge_sprite, @atb_gauge_sprite, @tp_gauge_sprite]
    @sprites.delete(nil)
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    @atb_gauge_sprite.set(@battler.stamina_rate, true) if @atb_gauge_sprite
    @sprites.each {|sprite| sprite.update }
  end
  #--------------------------------------------------------------------------
  # ● ゲージの作成
  #-------------------------------------------------------------------------- 
  def create_gauge(rate, format)
    return nil unless format[:enabled]
    case format[:type]
    when 0 # 横ゲージ
      sprite = Sprite_HorzGauge.new(rate, format, @viewport)
    when 1 # セルゲージ
      sprite = Sprite_CellGauge.new(rate, format, @viewport)
    when 2 # セルゲージ
      sprite = Sprite_VertGauge.new(rate, format, @viewport)
    end
    move(sprite, format)
    return sprite
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    # ゲージ
    @hp_gauge_sprite.set(@battler.hp_rate) if @hp_gauge_sprite
    @mp_gauge_sprite.set(@battler.mp_rate) if @mp_gauge_sprite
    @tp_gauge_sprite.set(@battler.tp_rate) if @tp_gauge_sprite
    # 数字
    @hp_number_sprite.set(@battler.hp, @battler.mhp) if @hp_number_sprite
    @mp_number_sprite.set(@battler.mp, @battler.mmp) if @mp_number_sprite
    @tp_number_sprite.set(@battler.tp, @battler.max_tp) if @tp_number_sprite
    # 数字(最大値)
    @mhp_number_sprite.set(@battler.mhp, @battler.mhp) if @mhp_number_sprite
    @mmp_number_sprite.set(@battler.mmp, @battler.mmp) if @mmp_number_sprite
    mtp = @battler.max_tp
    @mtp_number_sprite.set(mtp, mtp) if @mtp_number_sprite
    # ステート
    @state_icon.refresh if @state_icon
    @state_skin_sprite.visible = @state_icon.visible if @state_skin_sprite
    # 名前
    if @name_sprite
      @name_sprite.refresh
      if @state_icon && NAME[:auto_hide]
        @name_sprite.visible = !@state_icon.visible
      end
    end
  end
end

#==============================================================================
# ■ [追加]:Sprite_VertGauge
#------------------------------------------------------------------------------
#  バトルステータス:横方向のゲージ。
#==============================================================================

class Sprite_VertGauge < Sprite_BattleStatus
  NUMBERS    = [0,1,2,3,4,5,6,7,8,9]
  COLOR_SIZE = 4
  # 0:通常 1:ピンチ 2:最大 3:サブゲージ
  #--------------------------------------------------------------------------
  # ● [追加]:公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :number  # 同期する数字スプライト
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #-------------------------------------------------------------------------- 
  def initialize(rate, format, viewport)
    super(viewport)
    self.bitmap = Cache.system(format[:bitmap])
    @speed = format[:speed]
    @s_speed = format[:s_speed]
    @crisis = format[:crisis]   
    @direction = format[:direction]
    @sub_gauge = Sprite.new(viewport)
    @sub_gauge.bitmap = self.bitmap
    @number = nil
    @last_real_gauge_height = 0
    color_set_rect(3, @sub_gauge)
    set(rate, true)
  end
  #--------------------------------------------------------------------------
  # ● 解放
  #-------------------------------------------------------------------------- 
  def dispose
    @sub_gauge.dispose
    super
  end
  #--------------------------------------------------------------------------
  # ● 移動
  #--------------------------------------------------------------------------
  def move(x, y, z)
    if @direction == 0
      y += max_gauge_height - @real_gauge_height
    end
    super(x, y, z)
    @sub_gauge.x = x
    @sub_gauge.y = y
    @sub_gauge.z = z - 1
  end
  #--------------------------------------------------------------------------
  # ● ゲージ最大か?
  #--------------------------------------------------------------------------
  def max?
    @gauge_height / max_gauge_height >= 1.0
  end
  #--------------------------------------------------------------------------
  # ● ゲージが少ない?
  #-------------------------------------------------------------------------- 
  def crisis?
    @gauge_height / max_gauge_height < @crisis
  end
  #--------------------------------------------------------------------------
  # ● 最大ゲージ幅の取得
  #--------------------------------------------------------------------------
  def max_gauge_height
    self.bitmap.height.to_f
  end
  #--------------------------------------------------------------------------
  # ● ゲージ色変更(Rect)
  #--------------------------------------------------------------------------
  def color_set_rect(color, sprite)
    sprite.src_rect.width = self.bitmap.width / COLOR_SIZE
    sprite.src_rect.x = color * self.bitmap.width / COLOR_SIZE
  end
  #--------------------------------------------------------------------------
  # ● ゲージ色変更
  #--------------------------------------------------------------------------
  def gauge_color_set
    color_set_rect(max? ? 2 : crisis? ? 1 : 0, self)
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    # メインゲージ幅の更新
    if @real_gauge_height != @gauge_height
      if @number
        # 数字スプライトと同期
        rate = @number.real_rate
        height = ([max_gauge_height * rate, rate != 0 ? 1 : 0].max).to_i
        @real_gauge_height = height
      else
        @real_gauge_height = sma(@gauge_height, @real_gauge_height, @speed)
      end
      # ゲージ色変更
      gauge_color_set
    end
    # サブゲージ幅の更新
    if @sub_gauge_height > @gauge_height
      @sub_gauge_height = [@sub_gauge_height - @s_speed, @gauge_height].max
    elsif @sub_gauge_height != @gauge_height
      @sub_gauge_height = @real_gauge_height
    end
    # スプライトの更新
    update_sprite
  end
  #--------------------------------------------------------------------------
  # ● スプライトの更新
  #--------------------------------------------------------------------------
  def update_sprite
    if @direction == 0
      self.y += @last_real_gauge_height - @real_gauge_height
      self.src_rect.y = max_gauge_height - @real_gauge_height
      self.src_rect.height = @real_gauge_height
      @sub_gauge.y = self.y + @real_gauge_height
      @sub_gauge.src_rect.y = @real_gauge_height
      @sub_gauge.src_rect.height = @sub_gauge_height - @real_gauge_height
      @last_real_gauge_height = @real_gauge_height
    else
      self.src_rect.height = @real_gauge_height
      @sub_gauge.y = self.y + @real_gauge_height
      @sub_gauge.src_rect.y = @real_gauge_height
      @sub_gauge.src_rect.height = @sub_gauge_height - @real_gauge_height
    end
  end
  #--------------------------------------------------------------------------
  # ● ゲージレートの設定
  #-------------------------------------------------------------------------- 
  def set(rate, apply = false)
    @gauge_rate = rate
    @gauge_height = ([max_gauge_height * rate, rate != 0 ? 1 : 0].max).to_i
    # すぐに適用
    if apply
      @real_gauge_height = @gauge_height
      @sub_gauge_height = @gauge_height
      # ゲージ色変更
      gauge_color_set
      # スプライトの更新
      update_sprite
    end
  end
  #--------------------------------------------------------------------------
  # ● 移動平均
  #--------------------------------------------------------------------------
  def sma(a, b, p)
    # a = 目標位置 b = 現在地
    return a if a == b || (a - b).abs < 0.3 || p == 1
    result = ((a + b * (p.to_f - 1)) / p.to_f)
    return (a - result).abs <= 1.0 ? (b < a ? b + 0.3 : b - 0.3) : result
  end
end

#==============================================================================
# ** Window_PartyCommand
#==============================================================================
class Window_PartyCommand < Window_Command
  #--------------------------------------------------------------------------
  # * Create Command List
  #--------------------------------------------------------------------------
  alias cbs_make_command_list make_command_list
  def make_command_list
    cbs_make_command_list
    add_command("Combat auto.", :auto_battle)
  end
end

Enfin, les statuts on un bug de superposition avec la barre, c'est modifiable dans le LNX11bskin, soit tu y regarde, soit tu me dit si tu préfère décaler les status, passer la jauge au dessous ou passer la jauge et son fond au dessus
Nérylis
Nérylis
Membre

Nombre de messages : 612
Age : 31
Localisation : Seine Maritime
Distinction : aucune
Date d'inscription : 23/11/2014

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Ven 12 Aoû 2016 - 23:07
Oui, c'est mieux le recentrage des choix du menu et je trouve que c'est une bonne idée d'avoir mis l'option Combat Auto avec plutôt que de prévoir l'appui sur une touche. Par contre, est-ce qu'il serait possible d'avoir la possibilité de paramétrer une vitesse d'accélération du combat lorsqu'on est en Auto Combat ? Par ailleurs il y a un bug, après qu'on ait choisi l'option Combattre ou Combat Auto, on ne peut plus revenir en arrière. Normalement on peut en appuyant sur la touche X.

Pour les icônes des statuts, j'ai passé la valeur x (de la ligne 52) de -76 à -53, c'est à peu près centré entre la jauge ATB et le graphique TP. Pas de soucis à ce niveau-là.

J'ai eu l'occasion de tester un combat avec avantage au joueur. Impeccable, les jauges ATB des personnages sont pleines, ils agissent dans l'ordre puis les barres se remplissent normalement tout comme pour les ennemis.

Concernant la configuration, tu sais comment on peut passer son tour ? J'ai essayé plein de touches, sans succès. Je ne comprends pas bien non plus ce qu'est le Turn_Length. Pour le Escape_Cost, c'est réglé sur 500 mais les personnages s'enfuient une fois les barres pleines. Or, les barres pleines correspondent à la valeur Max_Stamina, non ? Qui est de 1000 là. Au niveau du Skill_Cost(2) pour la défense, réglé à 500, ça marche bien en tout cas. Les barres diminuent de moitié. D'ailleurs, c'est très intéressant cet élément de configuration, ça rend les choses très stratégiques.

Géniale aussi la configuration pour les statuts d'état qui changent la vitesse des barres ATB. J'ai pas testé par contre si par exemple un statut Booster appliqué par-dessus un statut Lenteur effaçait ce dernier. Parce que bien sûr on ne peut pas cumuler les deux. Comment c'est géré ce cas ?
Un point d'amélioration possible aussi à étudier : est-ce qu'il serait possible de changer la couleur de la barre ATB lorsque le personnage a un statut particulier ? Par exemple, passer la barre en dégradé rouge quand il a un statut qui améliore la vitesse de la barre, en dégradé bleu quand il a un statut qui réduit la vitesse de la barre, en dégradé gris quand il a un statut qui fige la barre. Sachant qu'à la base, par défaut, c'est un dégradé vert.

Par contre, j'ai peut-être loupé quelque chose mais qu'est-ce qui fait que la barre ATB se remplit à une certaine vitesse ?

Je vais éditer mon premier message avec ce qui a été fait actuellement. Je te remercie beaucoup pour le temps que tu m'accordes avec ce système.
DrakeRoxas
DrakeRoxas
Membre

Nombre de messages : 44
Age : 27
Distinction : aucune
Date d'inscription : 23/07/2016

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Sam 13 Aoû 2016 - 0:11
Pour le Turn_Length j'ai du mal d'expliquer ça en quelque ligne ... Si tu met un chiffre, c'est très simple : ce chiffre c'est le nombre de secondes avant qu'un tour se finisse. Par exemple, si tu met un stun qui dure 3 tours et Turn_Length à 4, les stuns durerons 12secondes.
Si tu met à 0, j'ai du mal d'expliquer ... Donc exemple !
1 héros (H) VS 2 ennemis (E1 et E2). Le jeu considèrera qu'un tour s'écoule toutes les 3 actions parce qu'il y a trois battler. Pour reprendre l'exemple du stun en 3 tours, il disparaitre toutes les 9 actions (3tours * 3 battlers). En exemple de combats donnera
Tour 1 :
H attaque
E1 attaque
E2 attaque
Tour 2 :
H attaque
E1 attaque
H attaque (parce qu'il est trop rapide pour E2 cette fois)
Tour 3 :
E2 attaque
E1 attaque
H attaque
Je sais pas si c'est + clair, mais si quelqu'un à une meilleur formulation je prend :3

Pour le Escape_Cost, il faut comprendre le RESET_STAMINA = false. Quand RESET_STAMINA est à false, si à la fin du combat les héros ont leurs jauges de stamina à 250, 430, 0, 900, ils commenceront le prochain combat avec les jauges remplis à 250, 430, 0, 900 (sauf si attaque surprise/préventive). Le Escape_Cost fait qu'il ne commenceront pas le prochain combat avec leurs jauges pleines (vu qu'ils doivent les remplir pour fuir) mais à "STAMINA_MAX-Escape_Cost"

Pour le cumule de statuts c'est par rapport à "STAMINA_STATES[0]  = [1,false,ICI]" (pour prendre cette ligne en exemple). Si le ICI est à false, il n'est pas influé par les autres statuts et peut se cumuler avec les autres. Si il est à true, il remplace tous les autres statuts qui on aussi un true à cet endroit (en vrai il en remplace qu'un, vu qu'a chaque fois ça remplace les autres ...).

Pour les couleurs des barres j'ai prévu et je sais comment je vais le faire, patience :3

Pour la vitesse de remplissage à chaque update, la jauge monte de "2 + (agilité du héros / 10)" (sans compter les multiplicateurs). Je sais pas du tout combien le jeu fait d'update en une seconde, sinon je pourrait essayer de trouver une formule obtenir la vitesse que tu désire

Pour le Combat auto qui revient pas en arrière j'ai pas vraiment fait gaffe, je vais voir à ça ...


Dans l'immédiat je fini le système d'Actif/Semi-Actif/Passif. Le mieux serait que tu ajoutes un menu d'option, qui permet de régler le son, les touches du claviers ou ce que tu veux :3


EDIT : Pour passer son tour c'est la touche Maj


Dernière édition par DrakeRoxas le Sam 13 Aoû 2016 - 0:14, édité 1 fois (Raison : Oublié un point ...)
Nérylis
Nérylis
Membre

Nombre de messages : 612
Age : 31
Localisation : Seine Maritime
Distinction : aucune
Date d'inscription : 23/11/2014

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Sam 13 Aoû 2016 - 8:33
Ah oui maintenant, c'est plus clair le Turn_Length, je comprends.

Ok pour le Escape_Cost.

Au niveau du cumul des statuts, je n'ai pas testé mais j'ai compris le principe. Je testerai Lenteur et Booster.

Pour la vitesse de remplissage, effectivement je n'avais pas fait attention à la formule. Par contre, ça pourrait être plus simple avec la méthode que j'ai proposée dans mon post d'origine. Et ça permettrait de brider les valeurs mini et maxi pour éviter d'avoir à un moment donné du jeu une vitesse trop rapide par exemple.

Pour le système Actif / Semi-Actif / Passif, il serait peut-être préférable dans un premier temps de le configurer dans le script. Je t'explique pourquoi. La démo que j'ai fournie ne contient que les scripts LNX. J'utilise à côté d'autres scripts dont certains gèrent les menus (tu as pu déjà avoir un aperçu). C'est volontaire de ma part de n'avoir mis que les scripts LNX car ça reste le souci majeur quant à la comptabilité avec l'ATB. Je pense qu'on verra plus tard pour le menu d'options sachant que c'est plus spécifique à mon projet. Je précise aussi pour ta rassurer que j'ai déjà testé ton système ATB actuel avec les autres scripts et que j'ai remarqué très peu de problèmes.

Ok pour la touche MAJ pour passer son tour. J'ai remarqué quelque chose de gênant par contre. Quand on reste appuyé sur MAJ, ça passe le tour des personnages sans qu'on n'ait le temps de voir la fenêtre de commande apparaître. Je me suis aperçu de ça car quand j'ai voulu tester, j'ai eu la chance d'avoir l'avantage au joueur. Et quand j'ai appuyé sur MAJ, j'ai passé le tour de 2 personnages sans le faire exprès. Je ne sais pas si on peut améliorer ce point.
DrakeRoxas
DrakeRoxas
Membre

Nombre de messages : 44
Age : 27
Distinction : aucune
Date d'inscription : 23/07/2016

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Sam 13 Aoû 2016 - 13:18
Pour la vitesse de remplissage je viens de voir que c'est du 60 FPS, donc je vais pouvoir changer la formule

Pour le Actif / Semi-Actif / Passif il suffira de faire CBS.set_mode(0 1 ou 2), ce sera clairement expliquer et simple pour passer de l'un à l'autre

Pour la touche Maj il faut remplacer cette ligne (normalement unique dans tout le projet, vu que j'ai plus le numéro ...)
Code:
if (CBS::ENABLE_PASSING and @actor_command_window.active) and Input.press?(:A)
par
if (CBS::ENABLE_PASSING and @actor_command_window.active) and Input.trigger?(:A)
Tu peux aussi remplacer la touche comme ça :3

Par contre, je suis partit sur l'Actif/etc et je me rend compte que ça va prendre du temps ... En fait il faut pouvoir gérer le fait que les actions ne sont pas une par une mais simultanées, et comme je connait mal VX j'en suis au stade où j'essaye de comprendre comment on il gère le menu en combat (parce qu'il me fait des trucs vraiment bizare du type "Je lance l'attaque sur un ennemi random et après je te demande sur qui tu voulais la lancer =D")
Nérylis
Nérylis
Membre

Nombre de messages : 612
Age : 31
Localisation : Seine Maritime
Distinction : aucune
Date d'inscription : 23/11/2014

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Sam 13 Aoû 2016 - 14:19
Effectivement, c'est mieux la touche avec Input.trigger, beaucoup plus pratique.

Il me semblait aussi que le mode Actif allait être la partie la plus compliquée. Je n'y connais pas grand chose en script mais je crois que MogHunter avait fait quelque chose dans son script de l'ATB et que les modes fonctionnaient. Si ça peut t'aider. Wink
DrakeRoxas
DrakeRoxas
Membre

Nombre de messages : 44
Age : 27
Distinction : aucune
Date d'inscription : 23/07/2016

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Sam 13 Aoû 2016 - 22:40
Enfin ... J'ai tellement galérer pour finalement aboutir à une solution plutôt simple, c'est dégoûtant xD
Du coups le changelog :
Code:
- Vitesse par palier
- Bug du combat auto empêchant de revenir au choix de combat/fuir/combat auto. résolu
- Ajout du mode Actif/Semi-Actif/Passif

Bon alors, faut remplacer que le 1er script, explications après :3
Code:
=begin
Customisable ATB/Stamina Based Battle System Script
by Fomar0153
Version 1.3
----------------------
Notes
----------------------
No requirements
Customises the battle system to be similar to
ATB or Stamina based battle systems.
----------------------
Instructions
----------------------
Edit variables in CBS to suit your needs.
The guard status should be set to 2~2 turns.
----------------------
Change Log
----------------------
1.0 -> 1.1 Restored turn functionality and a glitch
           related to message windows
1.1 -> 1.2 Added CTB related options
           Added the ability to pass a turn
           Fixed a bug which caused an error on maps
           with no random battles
           Added options for turn functionality to be based on time
           or number of actions
           Added the ability to change the bar colours based on states
1.2 -> 1.3 Fixed a bug when escaping using CTB mode
          
----------------------
Known bugs
----------------------
None
=end
module CBS

  MAX_STAMINA = 1000              # Valeur max de la jauge
  
  ATB = true                      # Active/Désactive le système ATB
  ENABLE_PASSING = true           # Active/Désactive la possibiliter de passer
                                  # son tour
  PASSING_COST = 200              # Stamania consommée en passant son tour
                                  # (ne pas mettre trop ici, sinon la guarde
                                  #  est bien mieux et rend cette action inutile)
  SLOW_SPEED = 0.5                # Ralentissement en mode Semi-Actif
                                  # (voir plus bas)
  FAST_SPEED = 2.0                # Accélération en mode Combat Auto.
  
  TURN_LENGTH = 4                 # Temps en seconde de chaque tour.
                                  # Si cette valeur est mise à 0 :
                                  # un tour = nb d'action égale à nb battlers
  
  RESET_STAMINA = true            # true : Reprend une valeur aléatoire en début
                                  # de combat ;
                                  # false : Garde les jauges de stamina du
                                  # dernier combat
  ESCAPE_COST = 500               # Si RESET_STAMINA = false, fuir consomera
                                  # ESCAPE_COST points de stamina
  STAMINA_START_PERCENT = 0       # Si RESET_STAMINA = true, les combatants
                                  # commenceront chaque combat avec un nombre
                                  # de points de stamina compris entre
                                  # 0 et STAMINA_START_PERCENT

  # Cout en stamina pour lancer chaque sort. le format est :
  # SKILL_COST[id du sort] = coût en stamina
  SKILL_COST = []
  SKILL_COST[0] = 1000            # Coût en stamina pour lancer un sort par défaut
  # Attack
  SKILL_COST[1] = 1000            # Coût en stamina pour lancer le 1er sort (Atk)
  # Guard
  SKILL_COST[2] = 500             # Coût en stamina pour lancer le 2e sort (Def)
  ITEM_COST = 1000                # Coût en stamina pour lancer un objet

  STATES_HANDLE_AGI = false       # true : Seule l'agilité est prise en compte
                                  # pour calculer les gains de stamina
                                  # false : Les status influent aussi sur
                                  # les gains de stamina.
  # Ce qui suit n'est pas utilisé si STATES_HANDLE_AGI = true.
  # Ici on choisis les status qui ralentissent dans ce format :
  # STAMINA_STATES[id du status] = [Mult, Zéro, Efface]
  # - - - Mult : Multipli le gain en stamina
  # - - - Zéro : Remet la stamina à 0 et la maintient à 0 tant que le statut reste
  # - - - Efface : Efface et peut être effacé par les autres statut ayant "true" ici
  STAMINA_STATES = []
  STAMINA_STATES[0]  = [  1,false,false] # Sans status
  STAMINA_STATES[34] = [  2,false, true] # Exemple pour la vitesse
  STAMINA_STATES[35] = [0.5,false, true] # Exemple pour le ralentissement
  STAMINA_STATES[36] = [  0,false,false] # Exemple pour le stop
  STAMINA_STATES[37] = [  0, true,false] # Exemple pour le stun
  
  # Mode par défaut, il faut le redéfinir à chaque nouvelle partie
  # (cette valeur est enregistrée dans les fichiers de sauvegarde)
  # Utilisez CBS.set_mode(X) pour changer cette valeur en jeu
  MODE = 0                        # 0 : Actif
                                  #     Le temps continu dans les menus
                                  # 1 : Semi-Actif
                                  #     Le temps ralentit dans les menus
                                  # 2 : Passif
                                  #     Le temps s'arrête dans les menus
  # Paliers de vitesse de remplissage de la jauge de stamina. Le format est
  # [AGI, TEMPS]
  # - - AGI : Agilité nécessaire pour atteindre le nouveau palier
  #           (ces valeurs doivent être dans l'ordre)
  # - - TEMPS : Temps en secondes pour remplir la jauge de stamina à cette agilité
  AGI_TIME = [
              [-1,  10],          # Garder une valeur inférieure à 0
              [1,  10],           # Permet d'avoir le "1 agi = 10s", et pas "9.Xs"
              [100, 3],           # Premier pallier, sert + de test qu'autre chose
              [200, 1],           # Le fameux 200 = 1s et pareil pour au dessus
              [9999, 1]           # Garder une valeur max qui ne sera jamais atteinte
             ]

  # ● Variable
  @mode = MODE
  #--------------------------------------------------------------------------
  # ● New Method set_mode
  #--------------------------------------------------------------------------
  def self.set_mode(mode)
    @mode = mode
  end
  #--------------------------------------------------------------------------
  # ● New Method get_mode
  #--------------------------------------------------------------------------
  def self.get_mode
    @mode
  end
  #--------------------------------------------------------------------------
  # ● New Method add_state
  #--------------------------------------------------------------------------
  def self.add_state(battler, state_id)
    unless STAMINA_STATES[state_id].nil?
      return unless STAMINA_STATES[state_id][2]
    end
    if !STATES_HANDLE_AGI
      for state in battler.states
        unless STAMINA_STATES[state.id].nil? or state.id == state_id
          battler.remove_state(state.id) if STAMINA_STATES[state.id][2]
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain?
  #--------------------------------------------------------------------------
  def self.stamina_gain?(battler)
    if !STATES_HANDLE_AGI
      for state in battler.states
        unless STAMINA_STATES[state.id].nil?
          if STAMINA_STATES[state.id][1]
            battler.stamina = 0
            return false
          end
        end
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.get_agi_margin(agi)
    last = AGI_TIME[0]
    used = [last, AGI_TIME[1]]
    AGI_TIME.each do |value|
      used = [last, value]
      last = value
      break if value[0] >= agi
    end
    return used.map {|i| i.map {|j| Float(j) } }
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.get_stamina_gain(agi)
    margin = get_agi_margin(agi)
    # Convert seconds to point/frames
    margin[0][1] = 1000.0 / (margin[0][1]*60.0)
    margin[1][1] = 1000.0 / (margin[1][1]*60.0)
    # Get affine function
    a = (margin[0][1] - margin[1][1]) / (margin[0][0] - margin[1][0])
    b = margin[0][1] - a*margin[0][0]
    return a*agi.to_f + b
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.stamina_gain(battler)
    return [0.0, get_stamina_gain(battler.agi)].max * self.stamina_mult(battler) * BattleManager.get_speed
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.stamina_mult(battler)
    return 1 if STATES_HANDLE_AGI
    mult = STAMINA_STATES[0][0]
    for state in battler.states
      unless STAMINA_STATES[state.id].nil?
        mult *= STAMINA_STATES[state.id][0]
      end
    end
    return mult
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_start
  #--------------------------------------------------------------------------
  def self.stamina_start(battler, value = nil)
    battler.stamina = rand(MAX_STAMINA * STAMINA_START_PERCENT / 100)
    battler.stamina = value if value != nil
  end
end

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # * Determine Skill/Item Usability
  #--------------------------------------------------------------------------
  def usable?(item)
    return skill_conditions_met?(item) if item.is_a?(RPG::Skill)
    return item_conditions_met?(item)  if item.is_a?(RPG::Item)
    return false
  end
  #--------------------------------------------------------------------------
  # ● New attr_accessor
  #--------------------------------------------------------------------------
  attr_accessor :stamina
  #--------------------------------------------------------------------------
  # ● Aliases initialize
  #--------------------------------------------------------------------------
  alias cbs_initialize initialize
  def initialize
    cbs_initialize
    @stamina = 0
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_rate
  #--------------------------------------------------------------------------
  def stamina_rate
    @stamina.to_f / CBS::MAX_STAMINA
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_rate
  #--------------------------------------------------------------------------
  def stamina_gain
    return if not CBS.stamina_gain?(self)
    return if not movable?
    @stamina = [CBS::MAX_STAMINA, @stamina + CBS.stamina_gain(self)].min
  end
  #--------------------------------------------------------------------------
  # * Determine if Auto Battle
  #--------------------------------------------------------------------------
  alias cbs_auto_battle? auto_battle?
  def auto_battle?
    return (BattleManager.auto_battle? or cbs_auto_battle?)
  end
end

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # * Start Processing
  #--------------------------------------------------------------------------
  alias cbs_start start
  def start
    @subjects = []
    @actor = nil
    @actor_command_window_active
    cbs_start
  end
  #--------------------------------------------------------------------------
  # ● Rewrote update
  #--------------------------------------------------------------------------
  def update
    super
    if (CBS::ENABLE_PASSING and @actor_command_window.active) and Input.trigger?(:A)
      command_pass
    end
    if BattleManager.in_turn?
      if inputting? and CBS.get_mode == 1
        BattleManager.set_speed(CBS::SLOW_SPEED)
      else
        BattleManager.set_speed(1)
      end
      if !inputting? or CBS.get_mode != 2
        while @subject.nil? and !CBS::ATB
          process_stamina
        end
        if CBS::ATB
          process_stamina
        end
      end
    end
    if BattleManager.in_turn? and !inputting?
      process_event
      process_action
    end
    if BattleManager.in_turn?
      actor_subject = @subject
      @subjects = @subjects.reject(&:nil?)
      for i in 0..@subjects.size
        subject = @subjects[i]
        next unless subject
        @subject = subject
        process_event
        process_action
        @subjects[i] = @subject
      end
      @subject = actor_subject
    end
    BattleManager.judge_win_loss
  end
  #--------------------------------------------------------------------------
  # ● New Method inputting?
  #--------------------------------------------------------------------------
  def inputting?
    return @actor_command_window.active || @skill_window.active ||
      @item_window.active || @actor_window.active || @enemy_window.active
  end
  #--------------------------------------------------------------------------
  # ● New Method process_stamina
  #--------------------------------------------------------------------------
  def process_stamina
    BattleManager.advance_turn
    all_battle_members.each do |battler|
      battler.stamina_gain
    end
    if !@subject
      @status_window.refresh
      if @status_window.close?
        @status_window.open
      end
    end
    if BattleManager.escaping?
      $game_party.battle_members.each do |battler|
        if battler.stamina < CBS::MAX_STAMINA
          $game_troop.members.each do |enemy|
            if enemy.stamina == CBS::MAX_STAMINA
              enemy.make_actions
              @subjects.push(enemy)
            end
          end
          return
        end
      end
      unless BattleManager.process_escape
        $game_party.battle_members.each do |actor|
          actor.stamina -= CBS::ESCAPE_COST
        end
        BattleManager.set_escaping(false) unless CBS::ATB
      end
    end
    $game_troop.members.each do |battler|
      if battler.stamina == CBS::MAX_STAMINA
        battler.make_actions
        @subjects.push(battler)
      end
    end
    process_actors if !@subject
  end
  #--------------------------------------------------------------------------
  # ● New Method process_actors
  #--------------------------------------------------------------------------
  def process_actors
    $game_party.battle_members.each do |actor|
      if actor.stamina == CBS::MAX_STAMINA
        actor.make_actions
        @subject = actor
        if @subject.inputable? and actor.is_a?(Game_Actor)
          @actor_command_window.setup(@subject)
          BattleManager.set_actor(actor)
        end
        return
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_info_viewport
  #--------------------------------------------------------------------------
  def create_info_viewport
    @info_viewport = Viewport.new
    @info_viewport.rect.y = Graphics.height - @status_window.height - 48
    @info_viewport.rect.height = @status_window.height + 48
    @info_viewport.z = 100
    @info_viewport.ox = 0
    @status_window.viewport = @info_viewport
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_party_command_window
  #--------------------------------------------------------------------------
  def create_party_command_window
    @party_command_window = Window_PartyCommand.new
    @party_command_window.viewport = @info_viewport
    @party_command_window.set_handler(:fight,  method(:command_fight))
    @party_command_window.set_handler(:escape, method(:command_escape))
    @party_command_window.set_handler(:auto_battle, method(:command_auto_battle))
    @party_command_window.unselect
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_status_window
  #--------------------------------------------------------------------------
  def create_status_window
    @status_window = Window_BattleStatus.new
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_actor_command_window
  #--------------------------------------------------------------------------
  def create_actor_command_window
    @actor_command_window = Window_ActorCommand.new
    @actor_command_window.viewport = @info_viewport
    @actor_command_window.set_handler(:attack, method(:command_attack))
    @actor_command_window.set_handler(:skill,  method(:command_skill))
    @actor_command_window.set_handler(:guard,  method(:command_guard))
    @actor_command_window.set_handler(:item,   method(:command_item))
    @actor_command_window.set_handler(:cancel, method(:prior_command))
    @actor_command_window.x = Graphics.width - 128
    @actor_command_window.y = 48
  end
  #--------------------------------------------------------------------------
  # ● Destroyed update_info_viewport
  #--------------------------------------------------------------------------
  def update_info_viewport
    # no thank you
  end
  #--------------------------------------------------------------------------
  # ● Rewrote start_party_command_selection
  #--------------------------------------------------------------------------
  def start_party_command_selection
    unless scene_changing?
      refresh_status
      @status_window.unselect
      @status_window.open
      if BattleManager.input_start
        @actor_command_window.close
        @party_command_window.setup
      else
        @party_command_window.deactivate
        turn_start
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Rewrote start_actor_command_selection
  #--------------------------------------------------------------------------
  def start_actor_command_selection
    @party_command_window.close
    BattleManager.set_escaping(false)
    turn_start
  end
  #--------------------------------------------------------------------------
  # ● Rewrote prior_command
  #--------------------------------------------------------------------------
  def prior_command
    start_party_command_selection
  end
  #--------------------------------------------------------------------------
  # ● Rewrote process_action
  #--------------------------------------------------------------------------
  def process_action
    return if scene_changing?
    if !@subject || !@subject.current_action
      @subject = BattleManager.next_subject
    end
    if Input.trigger?(:B) and (@actor == nil)
      start_party_command_selection
    end
    return unless @subject
    if @subject.current_action
      @subject.current_action.prepare
      if @subject.current_action.valid?
        @status_window.open
        execute_action
      end
      @subject.remove_current_action
      refresh_status
      @log_window.display_auto_affected_status(@subject)
      @log_window.wait_and_clear
    end
    process_action_end unless @subject.current_action
  end
  #--------------------------------------------------------------------------
  # ● Aliases use_item
  #--------------------------------------------------------------------------
  alias cbs_use_item use_item
  def use_item
    cbs_use_item
    @subject.stamina_loss
  end
  #--------------------------------------------------------------------------
  # ● Rewrote turn_end
  #--------------------------------------------------------------------------
  def turn_end
    all_battle_members.each do |battler|
      battler.on_turn_end
      refresh_status
      @log_window.display_auto_affected_status(battler)
      @log_window.wait_and_clear
    end
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_fight
  #--------------------------------------------------------------------------
  def command_fight
    BattleManager.next_command
    start_actor_command_selection
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_escape
  #--------------------------------------------------------------------------
  def command_escape
    @party_command_window.close
    BattleManager.set_escaping(true)
    turn_start
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_auto_battle
  #--------------------------------------------------------------------------
  def command_auto_battle
    @party_command_window.close
    BattleManager.set_auto_battle(true)
    start_actor_command_selection
  end
  #--------------------------------------------------------------------------
  # ● New method command_pass
  #--------------------------------------------------------------------------
  def command_pass
    BattleManager.actor.stamina -= CBS::PASSING_COST
    BattleManager.clear_actor
    @actor = nil
    turn_start
    @actor_command_window.active = false
    @actor_command_window.close
  end
  #--------------------------------------------------------------------------
  # ● Destroyed next_command
  #--------------------------------------------------------------------------
  def next_command
    # no thank you
  end
end

class Window_BattleSkill < Window_SkillList
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(help_window, info_viewport)
    y = help_window.height
    super(0, y, Graphics.width, info_viewport.rect.y - y + 48)
    self.visible = false
    @help_window = help_window
    @info_viewport = info_viewport
  end
end

class Window_BattleActor < Window_BattleStatus
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(info_viewport)
    super()
    self.y = info_viewport.rect.y + 48
    self.visible = false
    self.openness = 255
    @info_viewport = info_viewport
  end
end

class Window_BattleEnemy < Window_Selectable
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(info_viewport)
    super(0, info_viewport.rect.y + 48, window_width, fitting_height(4))
    refresh
    self.visible = false
    @info_viewport = info_viewport
  end
end

class Window_BattleItem < Window_ItemList
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(help_window, info_viewport)
    y = help_window.height
    super(0, y, Graphics.width, info_viewport.rect.y - y + 48)
    self.visible = false
    @help_window = help_window
    @info_viewport = info_viewport
  end
end

module BattleManager
  #--------------------------------------------------------------------------
  # ● Rewrote setup
  #--------------------------------------------------------------------------
  def self.setup(troop_id, can_escape = true, can_lose = false)
    init_members
    $game_troop.setup(troop_id)
    @can_escape = can_escape
    @can_lose = can_lose
    make_escape_ratio
    @escaping = false
    @auto_battle = false
    @speed = 1
    @turn_counter = 0
    @actions_per_turn = $game_party.members.size + $game_troop.members.size
    ($game_party.members + $game_troop.members).each do |battler|
      if battler.is_a?(Game_Enemy) or CBS::RESET_STAMINA
        CBS.stamina_start(battler)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Processing at Encounter Time
  #--------------------------------------------------------------------------
  def self.on_encounter
    @preemptive = (rand < rate_preemptive)
    @surprise = (rand < rate_surprise && !@preemptive)
    
    if @preemptive
      $game_party.members.each do |battler|
        CBS.stamina_start(battler, CBS::MAX_STAMINA)
      end
      $game_troop.members.each do |battler|
        CBS.stamina_start(battler, 0)
      end
    elsif @surprise
      $game_party.members.each do |battler|
        CBS.stamina_start(battler, 0)
      end
      $game_troop.members.each do |battler|
        CBS.stamina_start(battler, CBS::MAX_STAMINA)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● New Method set_auto_battle
  #--------------------------------------------------------------------------
  def self.set_auto_battle(auto_battle)
    @auto_battle = auto_battle
  end
  #--------------------------------------------------------------------------
  # ● New Method auto_battle?
  #--------------------------------------------------------------------------
  def self.auto_battle?
    return @auto_battle
  end
  #--------------------------------------------------------------------------
  # ● New Method set_speed
  #--------------------------------------------------------------------------
  def self.set_speed(speed)
    @speed = speed
  end
  #--------------------------------------------------------------------------
  # ● New Method get_speed
  #--------------------------------------------------------------------------
  def self.get_speed
    return auto_battle? ? @speed*CBS::FAST_SPEED : @speed
  end
  #--------------------------------------------------------------------------
  # ● New Method set_escaping
  #--------------------------------------------------------------------------
  def self.set_escaping(escaping)
    @escaping = escaping
  end
  #--------------------------------------------------------------------------
  # ● New Method escaping?
  #--------------------------------------------------------------------------
  def self.escaping?
    return @escaping
  end
  #--------------------------------------------------------------------------
  # ● Rewrote turn_start
  #--------------------------------------------------------------------------
  def self.turn_start
    @phase = :turn
    clear_actor
    $game_troop.increase_turn if $game_troop.turn_count == 0
  end
  #--------------------------------------------------------------------------
  # ● New Method set_actor
  #--------------------------------------------------------------------------
  def self.set_actor(actor)
    @actor_index = actor.index
  end
  #--------------------------------------------------------------------------
  # ● New Increase action counter
  #--------------------------------------------------------------------------
  def self.add_action
    return if @actions_per_turn.nil?
    @turn_counter += 1
    if @turn_counter == @actions_per_turn and CBS::TURN_LENGTH == 0
      $game_troop.increase_turn
      SceneManager.scene.turn_end
      @turn_counter = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● New Method advance_turn
  #--------------------------------------------------------------------------
  def self.advance_turn
    return if CBS::TURN_LENGTH == 0
    @turn_counter += 1
    if @turn_counter == 60 * CBS::TURN_LENGTH
      $game_troop.increase_turn
      SceneManager.scene.turn_end
      @turn_counter = 0
    end
  end
  #--------------------------------------------------------------------------
  # * Start Command Input
  #--------------------------------------------------------------------------
  def self.input_start
    if @phase != :input
      @phase = :input
      $game_party.make_actions
      $game_troop.make_actions
      clear_actor
    end
    return !@surprise && ($game_party.inputable? or @auto_battle)
  end
end

class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● Rewrote on_turn_end
  #--------------------------------------------------------------------------
  def on_turn_end
    @result.clear
    regenerate_all
    update_state_turns
    update_buff_turns
    remove_states_auto(2)
  end
  #--------------------------------------------------------------------------
  # ● New Method on_turn_end
  #--------------------------------------------------------------------------
  def stamina_loss
    if self.actor?
      @stamina -= input.stamina_cost
    else
      @stamina -= @actions[0].stamina_cost
    end
    BattleManager.add_action
  end
  #--------------------------------------------------------------------------
  # * Add State
  #--------------------------------------------------------------------------
  alias cbs_add_state add_state
  def add_state(state_id)
    cbs_add_state(state_id)
    CBS.add_state(self, state_id)
  end
end
class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● Rewrote input
  #--------------------------------------------------------------------------
  def input
    if @actions[@action_input_index] == nil
      @actions[@action_input_index] = Game_Action.new(self)
    end
    return @actions[@action_input_index]
  end
end
class Game_Action
  #--------------------------------------------------------------------------
  # ● New Method stamina_cost
  #--------------------------------------------------------------------------
  def stamina_cost
    if @item.is_skill?
      return CBS::SKILL_COST[item.id] if CBS::SKILL_COST[item.id]
      return CBS::SKILL_COST[0]
    end
    return CBS::ITEM_COST if @item.is_item?
    return CBS::MAX_STAMINA
  end
end

#==============================================================================
# ** DataManager
#==============================================================================
module DataManager
  #--------------------------------------------------------------------------
  # * Set Up New Game
  #--------------------------------------------------------------------------
  def self.setup_new_game
    create_game_objects
    CBS.set_mode(CBS::MODE)
    $game_party.setup_starting_members
    $game_map.setup($data_system.start_map_id)
    $game_player.moveto($data_system.start_x, $data_system.start_y)
    $game_player.refresh
    Graphics.frame_count = 0
  end
  #--------------------------------------------------------------------------
  # * Create Save Contents
  #--------------------------------------------------------------------------
  def self.make_save_contents
    contents = {}
    contents[:system]        = $game_system
    contents[:timer]         = $game_timer
    contents[:message]       = $game_message
    contents[:switches]      = $game_switches
    contents[:variables]     = $game_variables
    contents[:self_switches] = $game_self_switches
    contents[:actors]        = $game_actors
    contents[:party]         = $game_party
    contents[:troop]         = $game_troop
    contents[:map]           = $game_map
    contents[:player]        = $game_player
    contents[:cbs_mod]       = CBS.get_mode
    contents
  end
  #--------------------------------------------------------------------------
  # * Extract Save Contents
  #--------------------------------------------------------------------------
  def self.extract_save_contents(contents)
    $game_system        = contents[:system]
    $game_timer         = contents[:timer]
    $game_message       = contents[:message]
    $game_switches      = contents[:switches]
    $game_variables     = contents[:variables]
    $game_self_switches = contents[:self_switches]
    $game_actors        = contents[:actors]
    $game_party         = contents[:party]
    $game_troop         = contents[:troop]
    $game_map           = contents[:map]
    $game_player        = contents[:player]
    CBS.set_mode(contents[:cbs_mod])
  end
end
J'ai ajouté 4 variables : SLOW_SPEED, FAST_SPEED, MODE et AGI_TIME. Je pense pas avoir besoin d'expliquer celles en bleue (je trouve ça assez clair dans le script) par contre pour la rouge ...

En fait la variable AGI_TIME sert à créer des palier. Chaque palier fait une fonction affine. Pour donner un exemple avec ce que j'ai mis dans le script :
- 0 ou 1 d'agi = 10 secondes pour remplir la jauge
- 2 à 100 = temps égale à une fonction affine dont f(1) = 10s et f(100) = 3s
- 101 à 200 = temps égale à une fonction affine dont f(100) = 3s et f(200) = 1s
- 201 et + = temps égale à une fonction affine dont f(200) = 1s et f(9999) = 1s (soit 1s tout le temps)
Je sais pas si je suis clair

Demain je passerai au changement de perso. J'enlèverais surement le passage de tour avec la touche Maj qu'il y a actuellement pour les modes actifs, ça fera de trop sinon je pense ^^
Nérylis
Nérylis
Membre

Nombre de messages : 612
Age : 31
Localisation : Seine Maritime
Distinction : aucune
Date d'inscription : 23/11/2014

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Sam 13 Aoû 2016 - 23:17
Je viens de tester rapidement. C'est énorme, c'est exactement ça que je voulais. Avec quelques réglages, je vais bientôt avoir l'impression de jouer à un Final Fantasy en vue de face.^^

Encore un gros merci pour tout ce que tu accomplis, tu te débrouilles plutôt bien en plus.

Je n'ai pas testé tout ce qui me passait par la tête mais rapidement ce soir, je n'ai pas vu de problème. Pas de soucis pour les variables. Juste une question : comment évolue la courbe de remplissage de la barre ATB ? Est-ce que plus on approche d'un palier et plus la courbe monte rapidement ? la courbe n'est pas linéaire si j'ai bien compris.

Je regarderai plus en détail demain soir. Bravo encore pour avoir réussi la partie la plus délicate. Smile
DrakeRoxas
DrakeRoxas
Membre

Nombre de messages : 44
Age : 27
Distinction : aucune
Date d'inscription : 23/07/2016

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Sam 13 Aoû 2016 - 23:46
Alors si, la courbe "rejoins" chaque palier en faisant une ligne qui passe par les points extrémités de ce palier (le bézier c'est vraiment ingérable :p). En gros, là, à 100agi c'est 3sec et à 200 c'est 1sec; tu trace une droite et ça fait qu'a 150agi on met 2 secondes

EDIT : Finalement j'était motivé et j'ai fini le script =D A moins que tu ai d'autres points à revoir :3

Nouvelle variable : PASSING_RETURN_MENU. En gros, quand tu appuis sur la touche pour passer au personnage suivant, si tu es dans un menu (genre objets) et que la variable est à :
- true : tu reviens sur le menu de base (avec Attaque, Magie, Aptitude, Garde, Objets, Autres)
- false : tu passe directement au perso suivant
Autre nouvelle variable : PASSING_INPUT. C'est la touche pour passer son tour (le fameux Maj :p)

Donc j'ai ajouté ça et les couleurs des jauges selon les buffs en vitesse, ralentit et stop

Le 1er script
Code:
=begin
Customisable ATB/Stamina Based Battle System Script
by Fomar0153
Version 1.3
----------------------
Notes
----------------------
No requirements
Customises the battle system to be similar to
ATB or Stamina based battle systems.
----------------------
Instructions
----------------------
Edit variables in CBS to suit your needs.
The guard status should be set to 2~2 turns.
----------------------
Change Log
----------------------
1.0 -> 1.1 Restored turn functionality and a glitch
           related to message windows
1.1 -> 1.2 Added CTB related options
           Added the ability to pass a turn
           Fixed a bug which caused an error on maps
           with no random battles
           Added options for turn functionality to be based on time
           or number of actions
           Added the ability to change the bar colours based on states
1.2 -> 1.3 Fixed a bug when escaping using CTB mode
          
----------------------
Known bugs
----------------------
None
=end
module CBS

  MAX_STAMINA = 1000              # Valeur max de la jauge
  
  ATB = true                      # Active/Désactive le système ATB
  ENABLE_PASSING = true           # Active/Désactive la possibiliter de passer
                                  # son tour
  PASSING_INPUT = :A              # Touche pour passer son tour/passer au
                                  # prochain joueur
  PASSING_COST = 200              # Stamania consommée en passant son tour
                                  # (ne pas mettre trop ici, sinon la guarde
                                  #  est bien mieux et rend cette action inutile)
  PASSING_RETURN_MENU = true      # true : Si le joueur est dans un menu,
                                  #        il revient au choix
                                  #        Attaque/Magie/Garde/Objets,
                                  #        sinon il passe bien son tour
                                  # false : Passe systématiquement son tour,
                                  #         qu'il soit dans un menu ou non
  SLOW_SPEED = 0.5                # Ralentissement en mode Semi-Actif
                                  # (voir plus bas)
  FAST_SPEED = 2.0                # Accélération en mode Combat Auto.
  
  TURN_LENGTH = 4                 # Temps en seconde de chaque tour.
                                  # Si cette valeur est mise à 0 :
                                  # un tour = nb d'action égale à nb battlers
  
  RESET_STAMINA = true            # true : Reprend une valeur aléatoire en début
                                  #        de combat ;
                                  # false : Garde les jauges de stamina du
                                  #         dernier combat
  ESCAPE_COST = 500               # Si RESET_STAMINA = false, fuir consomera
                                  # ESCAPE_COST points de stamina
  STAMINA_START_PERCENT = 0       # Si RESET_STAMINA = true, les combatants
                                  # commenceront chaque combat avec un nombre
                                  # de points de stamina compris entre
                                  # 0 et STAMINA_START_PERCENT

  # Cout en stamina pour lancer chaque sort. le format est :
  # SKILL_COST[id du sort] = coût en stamina
  SKILL_COST = []
  SKILL_COST[0] = 1000            # Coût en stamina pour lancer un sort par défaut
  # Attack
  SKILL_COST[1] = 1000            # Coût en stamina pour lancer le 1er sort (Atk)
  # Guard
  SKILL_COST[2] = 500             # Coût en stamina pour lancer le 2e sort (Def)
  ITEM_COST = 1000                # Coût en stamina pour lancer un objet

  STATES_HANDLE_AGI = false       # true : Seule l'agilité est prise en compte
                                  # pour calculer les gains de stamina
                                  # false : Les status influent aussi sur
                                  # les gains de stamina.
  # Ce qui suit n'est pas utilisé si STATES_HANDLE_AGI = true.
  # Ici on choisis les status qui ralentissent dans ce format :
  # STAMINA_STATES[id du status] = [Mult, Zéro, Efface]
  # - - - Mult : Multipli le gain en stamina
  # - - - Zéro : Remet la stamina à 0 et la maintient à 0 tant que le statut reste
  # - - - Efface : Efface et peut être effacé par les autres statut ayant "true" ici
  STAMINA_STATES = []
  STAMINA_STATES[0]  = [  1,false,false] # Sans status
  STAMINA_STATES[34] = [  2,false, true] # Exemple pour la vitesse
  STAMINA_STATES[35] = [0.5,false, true] # Exemple pour le ralentissement
  STAMINA_STATES[36] = [  0,false,false] # Exemple pour le stop
  STAMINA_STATES[37] = [  0, true,false] # Exemple pour le stun
  
  # Mode par défaut, il faut le redéfinir à chaque nouvelle partie
  # (cette valeur est enregistrée dans les fichiers de sauvegarde)
  # Utilisez CBS.set_mode(X) pour changer cette valeur en jeu
  MODE = 0                        # 0 : Actif
                                  #     Le temps continu dans les menus
                                  # 1 : Semi-Actif
                                  #     Le temps ralentit dans les menus
                                  # 2 : Passif
                                  #     Le temps s'arrête dans les menus
  # Paliers de vitesse de remplissage de la jauge de stamina. Le format est
  # [AGI, TEMPS]
  # - - AGI : Agilité nécessaire pour atteindre le nouveau palier
  #           (ces valeurs doivent être dans l'ordre)
  # - - TEMPS : Temps en secondes pour remplir la jauge de stamina à cette agilité
  AGI_TIME = [
              [-1,  10],          # Garder une valeur inférieure à 0
              [1,  10],           # Permet d'avoir le "1 agi = 10s", et pas "9.Xs"
              [100, 3],           # Premier pallier, sert + de test qu'autre chose
              [200, 1],           # Le fameux 200 = 1s et pareil pour au dessus
              [9999, 1]           # Garder une valeur max qui ne sera jamais atteinte
             ]

  # ● Variable
  @mode = MODE
  #--------------------------------------------------------------------------
  # ● New Method set_mode
  #--------------------------------------------------------------------------
  def self.set_mode(mode)
    @mode = mode
  end
  #--------------------------------------------------------------------------
  # ● New Method get_mode
  #--------------------------------------------------------------------------
  def self.get_mode
    @mode
  end
  #--------------------------------------------------------------------------
  # ● New Method add_state
  #--------------------------------------------------------------------------
  def self.add_state(battler, state_id)
    unless STAMINA_STATES[state_id].nil?
      return unless STAMINA_STATES[state_id][2]
    end
    if !STATES_HANDLE_AGI
      for state in battler.states
        unless STAMINA_STATES[state.id].nil? or state.id == state_id
          battler.remove_state(state.id) if STAMINA_STATES[state.id][2]
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain?
  #--------------------------------------------------------------------------
  def self.stamina_gain?(battler)
    if !STATES_HANDLE_AGI
      for state in battler.states
        unless STAMINA_STATES[state.id].nil?
          if STAMINA_STATES[state.id][1]
            battler.stamina = 0
            return false
          end
        end
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.get_agi_margin(agi)
    last = AGI_TIME[0]
    used = [last, AGI_TIME[1]]
    AGI_TIME.each do |value|
      used = [last, value]
      last = value
      break if value[0] >= agi
    end
    return used.map {|i| i.map {|j| Float(j) } }
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.get_stamina_gain(agi)
    margin = get_agi_margin(agi)
    # Convert seconds to point/frames
    margin[0][1] = 1000.0 / (margin[0][1]*60.0)
    margin[1][1] = 1000.0 / (margin[1][1]*60.0)
    # Get affine function
    a = (margin[0][1] - margin[1][1]) / (margin[0][0] - margin[1][0])
    b = margin[0][1] - a*margin[0][0]
    return a*agi.to_f + b
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.stamina_gain(battler)
    return [0.0, get_stamina_gain(battler.agi)].max * self.stamina_mult(battler) * BattleManager.get_speed
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.stamina_mult(battler)
    return 1 if STATES_HANDLE_AGI
    mult = STAMINA_STATES[0][0]
    for state in battler.states
      unless STAMINA_STATES[state.id].nil?
        mult *= STAMINA_STATES[state.id][0]
      end
    end
    return mult
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_start
  #--------------------------------------------------------------------------
  def self.stamina_start(battler, value = nil)
    battler.stamina = rand(MAX_STAMINA * STAMINA_START_PERCENT / 100)
    battler.stamina = value if value != nil
  end
end

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # * Determine Skill/Item Usability
  #--------------------------------------------------------------------------
  def usable?(item)
    return skill_conditions_met?(item) if item.is_a?(RPG::Skill)
    return item_conditions_met?(item)  if item.is_a?(RPG::Item)
    return false
  end
  #--------------------------------------------------------------------------
  # ● New attr_accessor
  #--------------------------------------------------------------------------
  attr_accessor :stamina
  #--------------------------------------------------------------------------
  # ● Aliases initialize
  #--------------------------------------------------------------------------
  alias cbs_initialize initialize
  def initialize
    cbs_initialize
    @stamina = 0
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_rate
  #--------------------------------------------------------------------------
  def stamina_rate
    @stamina.to_f / CBS::MAX_STAMINA
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_rate
  #--------------------------------------------------------------------------
  def stamina_gain
    return if not CBS.stamina_gain?(self)
    return if not movable?
    @stamina = [CBS::MAX_STAMINA, @stamina + CBS.stamina_gain(self)].min
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_mult
  #--------------------------------------------------------------------------
  def stamina_mult
    return CBS.stamina_mult(self)
  end
  #--------------------------------------------------------------------------
  # * Determine if Auto Battle
  #--------------------------------------------------------------------------
  alias cbs_auto_battle? auto_battle?
  def auto_battle?
    return (BattleManager.auto_battle? or cbs_auto_battle?)
  end
end

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # * Start Processing
  #--------------------------------------------------------------------------
  alias cbs_start start
  def start
    @subjects = []
    cbs_start
  end
  #--------------------------------------------------------------------------
  # ● Rewrote update
  #--------------------------------------------------------------------------
  def update
    super
    if (CBS::ENABLE_PASSING and inputting?) and Input.trigger?(CBS::PASSING_INPUT)
      command_pass
    end
    if BattleManager.in_turn?
      if inputting? and CBS.get_mode == 1
        BattleManager.set_speed(CBS::SLOW_SPEED)
      else
        BattleManager.set_speed(1)
      end
      if !inputting? or CBS.get_mode != 2
        while @subject.nil? and !CBS::ATB
          process_stamina
        end
        if CBS::ATB
          process_stamina
        end
      end
    end
    if BattleManager.in_turn? and !inputting?
      process_event
      process_action
    end
    if BattleManager.in_turn?
      actor_subject = @subject
      @subjects = @subjects.reject(&:nil?)
      for i in 0..@subjects.size
        subject = @subjects[i]
        next unless subject
        @subject = subject
        process_event
        process_action
        @subjects[i] = @subject
      end
      @subject = actor_subject
    end
    BattleManager.judge_win_loss
  end
  #--------------------------------------------------------------------------
  # ● New Method inputting?
  #--------------------------------------------------------------------------
  def inputting?
    return @actor_command_window.active || @skill_window.active ||
      @item_window.active || @actor_window.active || @enemy_window.active
  end
  #--------------------------------------------------------------------------
  # ● New Method process_stamina
  #--------------------------------------------------------------------------
  def process_stamina
    BattleManager.advance_turn
    all_battle_members.each do |battler|
      battler.stamina_gain
    end
    if !@subject
      @status_window.refresh
      if @status_window.close?
        @status_window.open
      end
    end
    if BattleManager.escaping?
      $game_party.battle_members.each do |battler|
        if battler.stamina < CBS::MAX_STAMINA
          $game_troop.members.each do |enemy|
            if enemy.stamina == CBS::MAX_STAMINA
              enemy.make_actions
              @subjects.push(enemy)
            end
          end
          return
        end
      end
      unless BattleManager.process_escape
        $game_party.battle_members.each do |actor|
          actor.stamina -= CBS::ESCAPE_COST
        end
        BattleManager.set_escaping(false) unless CBS::ATB
      end
    end
    $game_troop.members.each do |battler|
      if battler.stamina == CBS::MAX_STAMINA
        battler.make_actions
        @subjects.push(battler)
      end
    end
    process_actors if !@subject
  end
  #--------------------------------------------------------------------------
  # ● New Method process_actors
  #--------------------------------------------------------------------------
  def process_actors
    $game_party.battle_members.each do |actor|
      if actor.stamina == CBS::MAX_STAMINA
        actor.make_actions
        @subject = actor
        if @subject.inputable? and actor.is_a?(Game_Actor)
          @actor_command_window.setup(@subject)
          BattleManager.set_actor(actor)
        end
        return
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_info_viewport
  #--------------------------------------------------------------------------
  def create_info_viewport
    @info_viewport = Viewport.new
    @info_viewport.rect.y = Graphics.height - @status_window.height - 48
    @info_viewport.rect.height = @status_window.height + 48
    @info_viewport.z = 100
    @info_viewport.ox = 0
    @status_window.viewport = @info_viewport
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_party_command_window
  #--------------------------------------------------------------------------
  def create_party_command_window
    @party_command_window = Window_PartyCommand.new
    @party_command_window.viewport = @info_viewport
    @party_command_window.set_handler(:fight,  method(:command_fight))
    @party_command_window.set_handler(:escape, method(:command_escape))
    @party_command_window.set_handler(:auto_battle, method(:command_auto_battle))
    @party_command_window.unselect
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_status_window
  #--------------------------------------------------------------------------
  def create_status_window
    @status_window = Window_BattleStatus.new
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_actor_command_window
  #--------------------------------------------------------------------------
  def create_actor_command_window
    @actor_command_window = Window_ActorCommand.new
    @actor_command_window.viewport = @info_viewport
    @actor_command_window.set_handler(:attack, method(:command_attack))
    @actor_command_window.set_handler(:skill,  method(:command_skill))
    @actor_command_window.set_handler(:guard,  method(:command_guard))
    @actor_command_window.set_handler(:item,   method(:command_item))
    @actor_command_window.set_handler(:cancel, method(:prior_command))
    @actor_command_window.x = Graphics.width - 128
    @actor_command_window.y = 48
  end
  #--------------------------------------------------------------------------
  # ● Destroyed update_info_viewport
  #--------------------------------------------------------------------------
  def update_info_viewport
    # no thank you
  end
  #--------------------------------------------------------------------------
  # ● Rewrote start_party_command_selection
  #--------------------------------------------------------------------------
  def start_party_command_selection
    unless scene_changing?
      refresh_status
      @status_window.unselect
      @status_window.open
      if BattleManager.input_start
        @actor_command_window.close
        @party_command_window.setup
      else
        @party_command_window.deactivate
        turn_start
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Rewrote start_actor_command_selection
  #--------------------------------------------------------------------------
  def start_actor_command_selection
    @party_command_window.close
    BattleManager.set_escaping(false)
    turn_start
  end
  #--------------------------------------------------------------------------
  # ● Rewrote prior_command
  #--------------------------------------------------------------------------
  def prior_command
    start_party_command_selection
  end
  #--------------------------------------------------------------------------
  # ● Rewrote process_action
  #--------------------------------------------------------------------------
  def process_action
    return if scene_changing?
    if !@subject || !@subject.current_action
      @subject = BattleManager.next_subject
    end
    if Input.trigger?(:B) and (@actor == nil)
      start_party_command_selection
    end
    return unless @subject
    if @subject.current_action
      @subject.current_action.prepare
      if @subject.current_action.valid?
        @status_window.open
        execute_action
      end
      @subject.remove_current_action
      refresh_status
      @log_window.display_auto_affected_status(@subject)
      @log_window.wait_and_clear
    end
    process_action_end unless @subject.current_action
  end
  #--------------------------------------------------------------------------
  # ● Aliases use_item
  #--------------------------------------------------------------------------
  alias cbs_use_item use_item
  def use_item
    cbs_use_item
    @subject.stamina_loss
  end
  #--------------------------------------------------------------------------
  # ● Rewrote turn_end
  #--------------------------------------------------------------------------
  def turn_end
    all_battle_members.each do |battler|
      battler.on_turn_end
      refresh_status
      @log_window.display_auto_affected_status(battler)
      @log_window.wait_and_clear
    end
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_fight
  #--------------------------------------------------------------------------
  def command_fight
    BattleManager.next_command
    start_actor_command_selection
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_escape
  #--------------------------------------------------------------------------
  def command_escape
    @party_command_window.close
    BattleManager.set_escaping(true)
    turn_start
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_auto_battle
  #--------------------------------------------------------------------------
  def command_auto_battle
    @party_command_window.close
    BattleManager.set_auto_battle(true)
    start_actor_command_selection
  end
  #--------------------------------------------------------------------------
  # ● New method command_pass
  #--------------------------------------------------------------------------
  def command_pass
    if CBS::PASSING_RETURN_MENU and inputting? and !@actor_command_window.active
      @actor_window.deactivate.hide
      @enemy_window.deactivate.hide
      @skill_window.deactivate.hide
      @item_window.deactivate.hide
      @actor_command_window.setup(@subject)
      BattleManager.set_actor(@subject)
      return
    end
    @actor_window.deactivate.hide
    @enemy_window.deactivate.hide
    @skill_window.deactivate.hide
    @item_window.deactivate.hide
    if CBS.get_mode == 2
      BattleManager.actor.stamina -= CBS::PASSING_COST
      BattleManager.clear_actor
      @actor = nil
      turn_start
      @actor_command_window.active = false
      @actor_command_window.close
    else
      return unless @subject
      members = $game_party.battle_members
      actual = members.index(@subject) - members.size
      for i in 1..members.size
        actor = members[actual+i]
        if actor.stamina == CBS::MAX_STAMINA
          actor.make_actions
          @subject = actor
          if @subject.inputable? and actor.is_a?(Game_Actor)
            @actor_command_window.setup(@subject)
            BattleManager.set_actor(actor)
          end
          return
        end
      end
    end
  end
  
  #--------------------------------------------------------------------------
  # ● Destroyed next_command
  #--------------------------------------------------------------------------
  def next_command
    # no thank you
  end
end

class Window_BattleSkill < Window_SkillList
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(help_window, info_viewport)
    y = help_window.height
    super(0, y, Graphics.width, info_viewport.rect.y - y + 48)
    self.visible = false
    @help_window = help_window
    @info_viewport = info_viewport
  end
end

class Window_BattleActor < Window_BattleStatus
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(info_viewport)
    super()
    self.y = info_viewport.rect.y + 48
    self.visible = false
    self.openness = 255
    @info_viewport = info_viewport
  end
end

class Window_BattleEnemy < Window_Selectable
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(info_viewport)
    super(0, info_viewport.rect.y + 48, window_width, fitting_height(4))
    refresh
    self.visible = false
    @info_viewport = info_viewport
  end
end

class Window_BattleItem < Window_ItemList
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(help_window, info_viewport)
    y = help_window.height
    super(0, y, Graphics.width, info_viewport.rect.y - y + 48)
    self.visible = false
    @help_window = help_window
    @info_viewport = info_viewport
  end
end

module BattleManager
  #--------------------------------------------------------------------------
  # ● Rewrote setup
  #--------------------------------------------------------------------------
  def self.setup(troop_id, can_escape = true, can_lose = false)
    init_members
    $game_troop.setup(troop_id)
    @can_escape = can_escape
    @can_lose = can_lose
    make_escape_ratio
    @escaping = false
    @auto_battle = false
    @speed = 1
    @turn_counter = 0
    @actions_per_turn = $game_party.members.size + $game_troop.members.size
    ($game_party.members + $game_troop.members).each do |battler|
      if battler.is_a?(Game_Enemy) or CBS::RESET_STAMINA
        CBS.stamina_start(battler)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Processing at Encounter Time
  #--------------------------------------------------------------------------
  def self.on_encounter
    @preemptive = (rand < rate_preemptive)
    @surprise = (rand < rate_surprise && !@preemptive)
    
    if @preemptive
      $game_party.members.each do |battler|
        CBS.stamina_start(battler, CBS::MAX_STAMINA)
      end
      $game_troop.members.each do |battler|
        CBS.stamina_start(battler, 0)
      end
    elsif @surprise
      $game_party.members.each do |battler|
        CBS.stamina_start(battler, 0)
      end
      $game_troop.members.each do |battler|
        CBS.stamina_start(battler, CBS::MAX_STAMINA)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● New Method set_auto_battle
  #--------------------------------------------------------------------------
  def self.set_auto_battle(auto_battle)
    @auto_battle = auto_battle
  end
  #--------------------------------------------------------------------------
  # ● New Method auto_battle?
  #--------------------------------------------------------------------------
  def self.auto_battle?
    return @auto_battle
  end
  #--------------------------------------------------------------------------
  # ● New Method set_speed
  #--------------------------------------------------------------------------
  def self.set_speed(speed)
    @speed = speed
  end
  #--------------------------------------------------------------------------
  # ● New Method get_speed
  #--------------------------------------------------------------------------
  def self.get_speed
    return auto_battle? ? @speed*CBS::FAST_SPEED : @speed
  end
  #--------------------------------------------------------------------------
  # ● New Method set_escaping
  #--------------------------------------------------------------------------
  def self.set_escaping(escaping)
    @escaping = escaping
  end
  #--------------------------------------------------------------------------
  # ● New Method escaping?
  #--------------------------------------------------------------------------
  def self.escaping?
    return @escaping
  end
  #--------------------------------------------------------------------------
  # ● Rewrote turn_start
  #--------------------------------------------------------------------------
  def self.turn_start
    @phase = :turn
    clear_actor
    $game_troop.increase_turn if $game_troop.turn_count == 0
  end
  #--------------------------------------------------------------------------
  # ● New Method set_actor
  #--------------------------------------------------------------------------
  def self.set_actor(actor)
    @actor_index = actor.index
  end
  #--------------------------------------------------------------------------
  # ● New Increase action counter
  #--------------------------------------------------------------------------
  def self.add_action
    return if @actions_per_turn.nil?
    @turn_counter += 1
    if @turn_counter == @actions_per_turn and CBS::TURN_LENGTH == 0
      $game_troop.increase_turn
      SceneManager.scene.turn_end
      @turn_counter = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● New Method advance_turn
  #--------------------------------------------------------------------------
  def self.advance_turn
    return if CBS::TURN_LENGTH == 0
    @turn_counter += 1
    if @turn_counter == 60 * CBS::TURN_LENGTH
      $game_troop.increase_turn
      SceneManager.scene.turn_end
      @turn_counter = 0
    end
  end
  #--------------------------------------------------------------------------
  # * Start Command Input
  #--------------------------------------------------------------------------
  def self.input_start
    if @phase != :input
      @phase = :input
      $game_party.make_actions
      $game_troop.make_actions
      clear_actor
    end
    return !@surprise && ($game_party.inputable? or @auto_battle)
  end
end

class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● Rewrote on_turn_end
  #--------------------------------------------------------------------------
  def on_turn_end
    @result.clear
    regenerate_all
    update_state_turns
    update_buff_turns
    remove_states_auto(2)
  end
  #--------------------------------------------------------------------------
  # ● New Method on_turn_end
  #--------------------------------------------------------------------------
  def stamina_loss
    if self.actor?
      @stamina -= input.stamina_cost
    else
      @stamina -= @actions[0].stamina_cost
    end
    BattleManager.add_action
  end
  #--------------------------------------------------------------------------
  # * Add State
  #--------------------------------------------------------------------------
  alias cbs_add_state add_state
  def add_state(state_id)
    cbs_add_state(state_id)
    CBS.add_state(self, state_id)
  end
end
class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● Rewrote input
  #--------------------------------------------------------------------------
  def input
    if @actions[@action_input_index] == nil
      @actions[@action_input_index] = Game_Action.new(self)
    end
    return @actions[@action_input_index]
  end
end
class Game_Action
  #--------------------------------------------------------------------------
  # ● New Method stamina_cost
  #--------------------------------------------------------------------------
  def stamina_cost
    if @item.is_skill?
      return CBS::SKILL_COST[item.id] if CBS::SKILL_COST[item.id]
      return CBS::SKILL_COST[0]
    end
    return CBS::ITEM_COST if @item.is_item?
    return CBS::MAX_STAMINA
  end
end

#==============================================================================
# ** DataManager
#==============================================================================
module DataManager
  #--------------------------------------------------------------------------
  # * Set Up New Game
  #--------------------------------------------------------------------------
  def self.setup_new_game
    create_game_objects
    CBS.set_mode(CBS::MODE)
    $game_party.setup_starting_members
    $game_map.setup($data_system.start_map_id)
    $game_player.moveto($data_system.start_x, $data_system.start_y)
    $game_player.refresh
    Graphics.frame_count = 0
  end
  #--------------------------------------------------------------------------
  # * Create Save Contents
  #--------------------------------------------------------------------------
  def self.make_save_contents
    contents = {}
    contents[:system]        = $game_system
    contents[:timer]         = $game_timer
    contents[:message]       = $game_message
    contents[:switches]      = $game_switches
    contents[:variables]     = $game_variables
    contents[:self_switches] = $game_self_switches
    contents[:actors]        = $game_actors
    contents[:party]         = $game_party
    contents[:troop]         = $game_troop
    contents[:map]           = $game_map
    contents[:player]        = $game_player
    contents[:cbs_mod]       = CBS.get_mode
    contents
  end
  #--------------------------------------------------------------------------
  # * Extract Save Contents
  #--------------------------------------------------------------------------
  def self.extract_save_contents(contents)
    $game_system        = contents[:system]
    $game_timer         = contents[:timer]
    $game_message       = contents[:message]
    $game_switches      = contents[:switches]
    $game_variables     = contents[:variables]
    $game_self_switches = contents[:self_switches]
    $game_actors        = contents[:actors]
    $game_party         = contents[:party]
    $game_troop         = contents[:troop]
    $game_map           = contents[:map]
    $game_player        = contents[:player]
    CBS.set_mode(contents[:cbs_mod])
  end
end


Dernière édition par DrakeRoxas le Dim 14 Aoû 2016 - 2:11, édité 1 fois (Raison : Oublié de mettre le script de couleurs ^^')
DrakeRoxas
DrakeRoxas
Membre

Nombre de messages : 44
Age : 27
Distinction : aucune
Date d'inscription : 23/07/2016

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Dim 14 Aoû 2016 - 2:12
Et le 2e qui passe pas à la suite de l'autre
Code:
class Spriteset_BattleStatus
  include LNX11
  include LNX11b
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------  
  def initialize(battler, status_window, viewport = nil)
    @battler = battler
    @viewport = viewport
    @status_window = status_window
    # 基準座標
    @x = $game_party.members_screen_x[battler.index] + STATUS_OFFSET[:x]
    @x -= STATUS_WIDTH / 2
    @y = @status_window.y + STATUS_OFFSET[:y]
    # メインスキン
    @main_skin_sprite = create_skin(MAIN_SKIN)
    # ステート
    @state_skin_sprite = create_skin(STATE_SKIN)
    @state_icon = create_state_icon(STATE_ICON)
    # 名前
    @name_sprite = create_name(NAME)
    # 数字
    num = @battler.hp ; max = @battler.mhp
    @hp_number_sprite = create_number(num, max, HP_NUMBER_FORMAT)
    num = @battler.mp ; max = @battler.mmp
    @mp_number_sprite = create_number(num, max, MP_NUMBER_FORMAT)
    if $data_system.opt_display_tp
      num = @battler.tp ; max = @battler.max_tp
      @tp_number_sprite = create_number(num, max, TP_NUMBER_FORMAT)
    end
    # 数字(最大値)
    num = @battler.mhp
    @mhp_number_sprite = create_number(num, num, MAXHP_NUMBER_FORMAT)
    num = @battler.mmp
    @mmp_number_sprite = create_number(num, num, MAXMP_NUMBER_FORMAT)
    if $data_system.opt_display_tp
      num = @battler.max_tp
      @mtp_number_sprite = create_number(num, num, MAXTP_NUMBER_FORMAT)
    end
    # ゲージ
    @hp_gauge_sprite = create_gauge(@battler.hp_rate, HP_GAUGE_FORMAT)
    @mp_gauge_sprite = create_gauge(@battler.mp_rate, MP_GAUGE_FORMAT)
    if CBS::ATB
      @atb_gauge_sprite = create_gauge(@battler.stamina_rate, ATB_GAUGE_FORMAT)
    end
    if $data_system.opt_display_tp
      @tp_gauge_sprite = create_gauge(@battler.tp_rate, TP_GAUGE_FORMAT)
    end
    # ゲージと数字スプライトの同期
    if HP_GAUGE_FORMAT[:number_link] && @hp_number_sprite
      @hp_gauge_sprite.number = @hp_number_sprite if @hp_gauge_sprite
    end
    if MP_GAUGE_FORMAT[:number_link] && @mp_number_sprite
      @mp_gauge_sprite.number = @mp_number_sprite if @mp_gauge_sprite
    end
    if TP_GAUGE_FORMAT[:number_link] && @tp_number_sprite
      @tp_gauge_sprite.number = @tp_number_sprite if @tp_gauge_sprite
    end
    # 更新するスプライトの配列
    @sprites = [@main_skin_sprite, @state_skin_sprite, @state_icon,
      @name_sprite, @hp_number_sprite, @mp_number_sprite, @tp_number_sprite,
      @mhp_number_sprite, @mmp_number_sprite, @mtp_number_sprite,
      @hp_gauge_sprite, @mp_gauge_sprite, @atb_gauge_sprite, @tp_gauge_sprite]
    @sprites.delete(nil)
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    @atb_gauge_sprite.set(@battler.stamina_rate, true, @battler.stamina_mult) if @atb_gauge_sprite
    @sprites.each {|sprite| sprite.update }
  end
  #--------------------------------------------------------------------------
  # ● ゲージの作成
  #--------------------------------------------------------------------------  
  def create_gauge(rate, format)
    return nil unless format[:enabled]
    case format[:type]
    when 0 # 横ゲージ
      sprite = Sprite_HorzGauge.new(rate, format, @viewport)
    when 1 # セルゲージ
      sprite = Sprite_CellGauge.new(rate, format, @viewport)
    when 2 # セルゲージ
      sprite = Sprite_VertGauge.new(rate, format, @viewport)
    end
    move(sprite, format)
    return sprite
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    # ゲージ
    @hp_gauge_sprite.set(@battler.hp_rate) if @hp_gauge_sprite
    @mp_gauge_sprite.set(@battler.mp_rate) if @mp_gauge_sprite
    @tp_gauge_sprite.set(@battler.tp_rate) if @tp_gauge_sprite
    # 数字
    @hp_number_sprite.set(@battler.hp, @battler.mhp) if @hp_number_sprite
    @mp_number_sprite.set(@battler.mp, @battler.mmp) if @mp_number_sprite
    @tp_number_sprite.set(@battler.tp, @battler.max_tp) if @tp_number_sprite
    # 数字(最大値)
    @mhp_number_sprite.set(@battler.mhp, @battler.mhp) if @mhp_number_sprite
    @mmp_number_sprite.set(@battler.mmp, @battler.mmp) if @mmp_number_sprite
    mtp = @battler.max_tp
    @mtp_number_sprite.set(mtp, mtp) if @mtp_number_sprite
    # ステート
    @state_icon.refresh if @state_icon
    @state_skin_sprite.visible = @state_icon.visible if @state_skin_sprite
    # 名前
    if @name_sprite
      @name_sprite.refresh
      if @state_icon && NAME[:auto_hide]
        @name_sprite.visible = !@state_icon.visible
      end
    end
  end
end

#==============================================================================
# ■ [追加]:Sprite_VertGauge
#------------------------------------------------------------------------------
#  バトルステータス:横方向のゲージ。
#==============================================================================

class Sprite_VertGauge < Sprite_BattleStatus
  NUMBERS    = [0,1,2,3,4,5,6,7,8,9]
  COLOR_SIZE = 4
  # 0:通常 1:ピンチ 2:最大 3:サブゲージ
  #--------------------------------------------------------------------------
  # ● [追加]:公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :number   # 同期する数字スプライト
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------  
  def initialize(rate, format, viewport)
    super(viewport)
    @bitmap_name = format[:bitmap]
    self.bitmap = Cache.system(format[:bitmap])
    @speed = format[:speed]
    @s_speed = format[:s_speed]
    @crisis = format[:crisis]    
    @direction = format[:direction]
    @sub_gauge = Sprite.new(viewport)
    @sub_gauge.bitmap = self.bitmap
    @number = nil
    @last_real_gauge_height = 0
    @color = 1
    color_set_rect(3, @sub_gauge)
    set(rate, true)
  end
  #--------------------------------------------------------------------------
  # ● 解放
  #--------------------------------------------------------------------------  
  def dispose
    @sub_gauge.dispose
    super
  end
  #--------------------------------------------------------------------------
  # ● 移動
  #--------------------------------------------------------------------------
  def move(x, y, z)
    if @direction == 0
      y += max_gauge_height - @real_gauge_height
    end
    super(x, y, z)
    @sub_gauge.x = x
    @sub_gauge.y = y
    @sub_gauge.z = z - 1
  end
  #--------------------------------------------------------------------------
  # ● ゲージ最大か?
  #--------------------------------------------------------------------------
  def max?
    @gauge_height / max_gauge_height >= 1.0
  end
  #--------------------------------------------------------------------------
  # ● ゲージが少ない?
  #--------------------------------------------------------------------------  
  def crisis?
    @gauge_height / max_gauge_height < @crisis
  end
  #--------------------------------------------------------------------------
  # ● 最大ゲージ幅の取得
  #--------------------------------------------------------------------------
  def max_gauge_height
    self.bitmap.height.to_f
  end
  #--------------------------------------------------------------------------
  # ● ゲージ色変更(Rect)
  #--------------------------------------------------------------------------
  def color_set_rect(color, sprite)
    sprite.src_rect.width = self.bitmap.width / COLOR_SIZE
    sprite.src_rect.x = color * self.bitmap.width / COLOR_SIZE
  end
  #--------------------------------------------------------------------------
  # ● ゲージ色変更
  #--------------------------------------------------------------------------
  def gauge_color_set
    color_set_rect(max? ? 2 : crisis? ? 1 : 0, self)
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    # メインゲージ幅の更新
    if @real_gauge_height != @gauge_height
      if @number
        # 数字スプライトと同期
        rate = @number.real_rate
        height = ([max_gauge_height * rate, rate != 0 ? 1 : 0].max).to_i
        @real_gauge_height = height
      else
        @real_gauge_height = sma(@gauge_height, @real_gauge_height, @speed)
      end
      # ゲージ色変更
      gauge_color_set
    end
    # サブゲージ幅の更新
    if @sub_gauge_height > @gauge_height
      @sub_gauge_height = [@sub_gauge_height - @s_speed, @gauge_height].max
    elsif @sub_gauge_height != @gauge_height
      @sub_gauge_height = @real_gauge_height
    end
    # スプライトの更新
    update_sprite
  end
  #--------------------------------------------------------------------------
  # ● スプライトの更新
  #--------------------------------------------------------------------------
  def update_sprite
    if @direction == 0
      self.y += @last_real_gauge_height - @real_gauge_height
      self.src_rect.y = max_gauge_height - @real_gauge_height
      self.src_rect.height = @real_gauge_height
      @sub_gauge.y = self.y + @real_gauge_height
      @sub_gauge.src_rect.y = @real_gauge_height
      @sub_gauge.src_rect.height = @sub_gauge_height - @real_gauge_height
      @last_real_gauge_height = @real_gauge_height
    else
      self.src_rect.height = @real_gauge_height
      @sub_gauge.y = self.y + @real_gauge_height
      @sub_gauge.src_rect.y = @real_gauge_height
      @sub_gauge.src_rect.height = @sub_gauge_height - @real_gauge_height
    end
  end
  #--------------------------------------------------------------------------
  # ● ゲージレートの設定
  #--------------------------------------------------------------------------  
  def set(rate, apply = false, color = 1)
    if color != @color
      if color == 1
        self.bitmap = Cache.system(@bitmap_name)
        @sub_gauge.bitmap = self.bitmap
      elsif color > 1
        self.bitmap = Cache.system(@bitmap_name + "_fast")
        @sub_gauge.bitmap = self.bitmap
      elsif color > 0
        self.bitmap = Cache.system(@bitmap_name + "_slow")
        @sub_gauge.bitmap = self.bitmap
      else
        self.bitmap = Cache.system(@bitmap_name + "_stop")
        @sub_gauge.bitmap = self.bitmap
      end
      @color = color
    end
    @gauge_rate = rate
    @gauge_height = ([max_gauge_height * rate, rate != 0 ? 1 : 0].max).to_i
    # すぐに適用
    if apply
      @real_gauge_height = @gauge_height
      @sub_gauge_height = @gauge_height
      # ゲージ色変更
      gauge_color_set
      # スプライトの更新
      update_sprite
    end
  end
  #--------------------------------------------------------------------------
  # ● 移動平均
  #--------------------------------------------------------------------------
  def sma(a, b, p)
    # a = 目標位置 b = 現在地
    return a if a == b || (a - b).abs < 0.3 || p == 1
    result = ((a + b * (p.to_f - 1)) / p.to_f)
    return (a - result).abs <= 1.0 ? (b < a ? b + 0.3 : b - 0.3) : result
  end
end

#==============================================================================
# ** Window_PartyCommand
#==============================================================================
class Window_PartyCommand < Window_Command
  #--------------------------------------------------------------------------
  # * Create Command List
  #--------------------------------------------------------------------------
  alias cbs_make_command_list make_command_list
  def make_command_list
    cbs_make_command_list
    add_command("Combat auto.", :auto_battle)
  end
end

Avec les 3 nouvelles images :
Jauge ATB pour LNX Battle Lnx11b13 Lnx11b_atbgauge_fast.png
Jauge ATB pour LNX Battle Lnx11b14 Lnx11b_atbgauge_slow.png
Jauge ATB pour LNX Battle 777605Lnx11batbgaugestop Lnx11b_atbgauge_stop.png

Petite précision pour les nom d'images : ils ne sont pas dans le script. En fait c'est Nom_Image_Jauge_Nomale + ("_fast", "_slow" ou "_stop") + .extension


Je vois rien d'autre à ajouter :3 Je te laisse t'amuser avec ton nouveau jouet, je suis toujours dispo si tu as besoin d'aide :p
Nérylis
Nérylis
Membre

Nombre de messages : 612
Age : 31
Localisation : Seine Maritime
Distinction : aucune
Date d'inscription : 23/11/2014

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Dim 14 Aoû 2016 - 8:17
Bon travail, je regarde en détail ce soir.

Pour les images, je n'ai pas compris ta précision. J'ai juste à les mettre dans Graphics System et à les nommer comme tu l'as fait ci-dessus, non ? Comme pour la jauge ATB standard plus haut.

Si tout marche bien, il y aura des points à revoir comme je te disais par rapport à la comptabilité avec d'autres scripts qui gravitent autour du système de combat. Je pense qu'on regardera ça en privé car c'est plus spécifique à mon projet.
Nérylis
Nérylis
Membre

Nombre de messages : 612
Age : 31
Localisation : Seine Maritime
Distinction : aucune
Date d'inscription : 23/11/2014

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Dim 14 Aoû 2016 - 21:42
Je viens de tester le morceau.

Pas de soucis au niveau des jauges ATB, j'ai repris les noms que tu avais mis et ça marche très bien. Les couleurs sont appliquées, je n'ai pas vu de problème à ce niveau-là. De même, j'ai regardé si Booster remplaçait Lenteur et ça marche.

Il y a un bug au niveau du statut d'état. Lorsqu'un personnage vient de subir l'effet du statut, s'il est le premier à agir aussitôt après, on a une indication une fois l'action terminée comme quoi le statut est appliqué de nouveau. Pareil lorsque le statut disparaît, après avoir agi, l'indication comme quoi le statut n'est plus là réapparaît. Cela ne se produit que si le personnage impacté est le premier à agir après l'application ou la disparition du statut sur lui-même.

J'ai fait un test pour savoir si les événements de combat se déroulaient bien lorsque les conditions font référence à un certain nombre de tours. Par exemple, un dialogue qui commence au Tour 0 (en début de combat) ou encore des actions qui se répètent tous les X tours. Tout cela a l'air de fonctionner. Si j'ai bien compris, le jeu continue de compter le nombre de tours selon la valeur en secondes que l'on attribue dans la configuration (Turn_Length), c'est bien ça ?

Au niveau de la courbe de remplissage de la jauge ATB, je pense que je n'utiliserai pas de palier intermédiaire. Je mettrai une valeur pour 1 en agilité et une autre valeur pour 200 en agilité. Comme ça, le remplissage de la jauge ATB sera linéaire par rapport à la valeur en agilité.

Pour ce qui est du switch entre les personnages qui ont la jauge ATB pleine, j'ai remarqué que celui-ci ne s'effectuait pas pendant les actions des adversaires. C'est possible d'arranger cela ? Par ailleurs, est-ce qu'il serait possible également de mettre un bruitage lorsqu'on appuie sur la touche de switch ? C'est valable que ce soit si on switch sur un autre personnage ou si on passe son tour. D'ailleurs à ce sujet, j'ai remarqué que la possibilité de passer son tour n'est possible qu'en mode Passif. Cela ne marche pas en mode Actif et Semi-actif si le personnage en question est le seul dont la barre est pleine. Cela dit, après réflexion, je trouve ça logique. C'est en quelque sorte une manière en mode Passif de prendre la main sur un autre personnage. Au passage, j'ai mis la touche :Z car la touche :A est celle qui permet d'accélérer les animations de combat avec le système LNX.

J'ai trouvé aussi quelque chose de bizarre lorsqu'un personnage peut agir et qu'on appuie sur la touche X pour revenir au menu Combattre, S'enfuir, Combat Auto. Parfois, on revient sur le même personnage au lieu d'aller sur le menu. Et dans d'autres cas, il me semble lorsque l'ennemi agit, j'ai même eu plusieurs messages d'erreur (voir ci-dessous). J'ai eu le même souci en sélectionnant S'enfuir et en revenant dans ce menu. Il me semble que c'est la navigation avec ce menu pendant les actions ennemies qui génèrent le plantage du jeu.

Jauge ATB pour LNX Battle Captur18

Jauge ATB pour LNX Battle Captur19

Une chose que je n'avais pas remarquée au niveau du Combat Auto, c'est que les personnages attaquent les ennemis aléatoirement, pas forcément le premier du groupe. C'est normal ? Au pire, je pense que ça sera un élément à configurer dans les options pour laisser le choix au joueur s'il veut qu'en Combat Auto, les personnages attaquent le premier ennemi du groupe ou bien de façon aléatoire.

Il y a un élément auquel je n'ai pas du tout pensé : le temps de lancement de certains skills, notamment les magies pour ceux qui utilisent les sorts. Est-ce qu'il serait possible de pouvoir configurer pour certains skills un temps de lancement qui serait symbolisé par le remplissage secondaire de la jauge ATB ? Je pense à une configuration dans le script, au même titre que celle pour le coût de stamina, dans laquelle on noterait l'ID du skill et son temps de lancement. La couleur de cette jauge secondaire serait orange, prioritaire sur les jauges spéciales mais subissant leur effet tout de même. Exemple : un mage en état normal (jauge verte) lance un sort, la jauge secondaire (jauge orange) se remplit par dessus la verte qui reste remplit à fond. La vitesse de remplissage de cette jauge secondaire équivaut à celle paramétrée dans la configuration. Ce même mage en état Booster (jauge rouge) lance le même sort, la jauge secondaire (jauge orange) se remplit par dessus la rouge qui reste remplit à fond. La vitesse de remplissage de cette jauge secondaire équivaut à celle paramétrée dans la configuration avec le facteur d'accélération définie pour le statut d'état Booster. Tu vois ce que je veux dire ?

Voilà ce que j'ai pu constater durant une petite heure de test. C'est du bon travail, je te félicite. Je continuerai à tester plusieurs choses une fois les correctifs appliqués.
DrakeRoxas
DrakeRoxas
Membre

Nombre de messages : 44
Age : 27
Distinction : aucune
Date d'inscription : 23/07/2016

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Mer 17 Aoû 2016 - 1:57
Effectivement, VX marche tellement pas comme XP xD
En fait, la gestion des Input est en processus parallèle, et quand tu choisis une option dans le menu (genre fuir) ça lance la fonction "turn_start" du combat, qui fait oublier qu'un mob/joueur est en train d'attaquer ... Du coup, quand l'animation est fini il fait "L'attaquant vient d'attaquer ce mec ! . . . C'est qui l'attaquant déjà ? Je sais plus, crash ..."
Un fois qu'on comprend le concept, ça facilite les choses x)

Du coup, pour le bug des statut en double c'est réglé;
Tu règle ta config comme tu veux, c'est le but d'avoir une configuration :p
Pour le passage de tour en Passif et pas Actif/Semi, tu as compris la logique ^^
Pour le bug qui fait crash, c'est ce dont je parle au dessus
Pour le combat auto, les personnages ont de base l'option "Attaque automatique", elle est juste utilisé uniquement via event. De mon coté je fait que dire "Utilise la commande d'action auto", je lui demande pas de prendre un ennemi au pif, il le fait lui-même, donc non configurable sans travail au préalable

Pour les skills je ferais ça quand j'aurai le temps, il est tard, je m'en vais faire un chapitre de Fire Emblem :3

Code:
=begin
Customisable ATB/Stamina Based Battle System Script
by Fomar0153
Version 1.3
----------------------
Notes
----------------------
No requirements
Customises the battle system to be similar to
ATB or Stamina based battle systems.
----------------------
Instructions
----------------------
Edit variables in CBS to suit your needs.
The guard status should be set to 2~2 turns.
----------------------
Change Log
----------------------
1.0 -> 1.1 Restored turn functionality and a glitch
          related to message windows
1.1 -> 1.2 Added CTB related options
          Added the ability to pass a turn
          Fixed a bug which caused an error on maps
          with no random battles
          Added options for turn functionality to be based on time
          or number of actions
          Added the ability to change the bar colours based on states
1.2 -> 1.3 Fixed a bug when escaping using CTB mode
         
----------------------
Known bugs
----------------------
None
=end
module CBS

  # =========================================================================
  # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  #                      DEBUT de la PARTIE CONFIGURABLE                   
  # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # =========================================================================

  MAX_STAMINA = 1000              # Valeur max de la jauge
 
  ATB = true                      # Active/Désactive le système ATB
  ENABLE_PASSING = true          # Active/Désactive la possibiliter de passer
                                  # son tour
  PASSING_INPUT = :A              # Touche pour passer son tour/passer au
                                  # prochain joueur
  PASSING_COST = 200              # Stamania consommée en passant son tour
                                  # (ne pas mettre trop ici, sinon la guarde
                                  #  est bien mieux et rend cette action inutile)
  PASSING_RETURN_MENU = true      # true : Si le joueur est dans un menu,
                                  #        il revient au choix
                                  #        Attaque/Magie/Garde/Objets,
                                  #        sinon il passe bien son tour
                                  # false : Passe systématiquement son tour,
                                  #        qu'il soit dans un menu ou non
  SLOW_SPEED = 0.5                # Ralentissement en mode Semi-Actif
                                  # (voir plus bas)
  FAST_SPEED = 2.0                # Accélération en mode Combat Auto.
 
  TURN_LENGTH = 4                # Temps en seconde de chaque tour.
                                  # Si cette valeur est mise à 0 :
                                  # un tour = nb d'action égale à nb battlers
 
  RESET_STAMINA = true            # true : Reprend une valeur aléatoire en début
                                  #        de combat ;
                                  # false : Garde les jauges de stamina du
                                  #        dernier combat
  ESCAPE_COST = 500              # Si RESET_STAMINA = false, fuir consomera
                                  # ESCAPE_COST points de stamina
  STAMINA_START_PERCENT = 0      # Si RESET_STAMINA = true, les combatants
                                  # commenceront chaque combat avec un nombre
                                  # de points de stamina compris entre
                                  # 0 et STAMINA_START_PERCENT

  # Cout en stamina pour lancer chaque sort. le format est :
  # SKILL_COST[id du sort] = coût en stamina
  SKILL_COST = []
  SKILL_COST[0] = 1000            # Coût en stamina pour lancer un sort par défaut
  # Attack
  SKILL_COST[1] = 1000            # Coût en stamina pour lancer le 1er sort (Atk)
  # Guard
  SKILL_COST[2] = 500            # Coût en stamina pour lancer le 2e sort (Def)
  ITEM_COST = 1000                # Coût en stamina pour lancer un objet

  STATES_HANDLE_AGI = false      # true : Seule l'agilité est prise en compte
                                  # pour calculer les gains de stamina
                                  # false : Les status influent aussi sur
                                  # les gains de stamina.
  # Ce qui suit n'est pas utilisé si STATES_HANDLE_AGI = true.
  # Ici on choisis les status qui ralentissent dans ce format :
  # STAMINA_STATES[id du status] = [Mult, Zéro, Efface]
  # - - - Mult : Multipli le gain en stamina
  # - - - Zéro : Remet la stamina à 0 et la maintient à 0 tant que le statut reste
  # - - - Efface : Efface et peut être effacé par les autres statut ayant "true" ici
  STAMINA_STATES = []
  STAMINA_STATES[0]  = [  1,false,false] # Sans status
  STAMINA_STATES[34] = [  2,false, true] # Exemple pour la vitesse
  STAMINA_STATES[35] = [0.5,false, true] # Exemple pour le ralentissement
  STAMINA_STATES[36] = [  0,false,false] # Exemple pour le stop
  STAMINA_STATES[37] = [  0, true,false] # Exemple pour le stun
 
  # Mode par défaut, il faut le redéfinir à chaque nouvelle partie
  # (cette valeur est enregistrée dans les fichiers de sauvegarde)
  # Utilisez CBS.set_mode(X) pour changer cette valeur en jeu
  MODE = 0                        # 0 : Actif
                                  #    Le temps continu dans les menus
                                  # 1 : Semi-Actif
                                  #    Le temps ralentit dans les menus
                                  # 2 : Passif
                                  #    Le temps s'arrête dans les menus
  # Paliers de vitesse de remplissage de la jauge de stamina. Le format est
  # [AGI, TEMPS]
  # - - AGI : Agilité nécessaire pour atteindre le nouveau palier
  #          (ces valeurs doivent être dans l'ordre)
  # - - TEMPS : Temps en secondes pour remplir la jauge de stamina à cette agilité
  AGI_TIME = [
              [-1,  10],          # Garder une valeur inférieure à 0
              [1,  10],          # Permet d'avoir le "1 agi = 10s", et pas "9.Xs"
              [100, 3],          # Premier pallier, sert + de test qu'autre chose
              [200, 1],          # Le fameux 200 = 1s et pareil pour au dessus
              [9999, 1]          # Garder une valeur max qui ne sera jamais atteinte
            ]
           
  # =========================================================================
  # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  #                      FIN de la PARTIE CONFIGURABLE                     
  # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # =========================================================================

  # ● Variable
  @mode = MODE
  #--------------------------------------------------------------------------
  # ● New Method set_mode
  #--------------------------------------------------------------------------
  def self.set_mode(mode)
    @mode = mode
  end
  #--------------------------------------------------------------------------
  # ● New Method get_mode
  #--------------------------------------------------------------------------
  def self.get_mode
    @mode
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain?
  #--------------------------------------------------------------------------
  def self.stamina_gain?(battler)
    if !STATES_HANDLE_AGI
      for state in battler.states
        unless STAMINA_STATES[state.id].nil?
          if STAMINA_STATES[state.id][1]
            battler.stamina = 0
            return false
          end
        end
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.get_agi_margin(agi)
    last = AGI_TIME[0]
    used = [last, AGI_TIME[1]]
    AGI_TIME.each do |value|
      used = [last, value]
      last = value
      break if value[0] >= agi
    end
    return used.map {|i| i.map {|j| Float(j) } }
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.get_stamina_gain(agi)
    margin = get_agi_margin(agi)
    # Convert seconds to point/frames
    margin[0][1] = 1000.0 / (margin[0][1]*60.0)
    margin[1][1] = 1000.0 / (margin[1][1]*60.0)
    # Get affine function
    a = (margin[0][1] - margin[1][1]) / (margin[0][0] - margin[1][0])
    b = margin[0][1] - a*margin[0][0]
    return a*agi.to_f + b
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.stamina_gain(battler)
    return [0.0, get_stamina_gain(battler.agi)].max * self.stamina_mult(battler) * BattleManager.get_speed
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.stamina_mult(battler)
    return 1 if STATES_HANDLE_AGI
    mult = STAMINA_STATES[0][0]
    for state in battler.states
      unless STAMINA_STATES[state.id].nil?
        mult *= STAMINA_STATES[state.id][0]
      end
    end
    return mult
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_start
  #--------------------------------------------------------------------------
  def self.stamina_start(battler, value = nil)
    battler.stamina = rand(MAX_STAMINA * STAMINA_START_PERCENT / 100)
    battler.stamina = value if value != nil
  end
end

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # * Determine Skill/Item Usability
  #--------------------------------------------------------------------------
  def usable?(item)
    return skill_conditions_met?(item) if item.is_a?(RPG::Skill)
    return item_conditions_met?(item)  if item.is_a?(RPG::Item)
    return false
  end
  #--------------------------------------------------------------------------
  # ● New attr_accessor
  #--------------------------------------------------------------------------
  attr_accessor :stamina
  #--------------------------------------------------------------------------
  # ● Aliases initialize
  #--------------------------------------------------------------------------
  alias cbs_initialize initialize
  def initialize
    cbs_initialize
    @stamina = 0
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_rate
  #--------------------------------------------------------------------------
  def stamina_rate
    @stamina.to_f / CBS::MAX_STAMINA
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_rate
  #--------------------------------------------------------------------------
  def stamina_gain
    return if not CBS.stamina_gain?(self)
    return if not movable?
    @stamina = [CBS::MAX_STAMINA, @stamina + CBS.stamina_gain(self)].min
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_mult
  #--------------------------------------------------------------------------
  def stamina_mult
    return CBS.stamina_mult(self)
  end
  #--------------------------------------------------------------------------
  # * Determine if Auto Battle
  #--------------------------------------------------------------------------
  alias cbs_auto_battle? auto_battle?
  def auto_battle?
    return (BattleManager.auto_battle? or cbs_auto_battle?)
  end
end

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # * Start Processing
  #--------------------------------------------------------------------------
  alias cbs_start start
  def start
    @subjects = []
    @excecuting_action = nil
    cbs_start
  end
  #--------------------------------------------------------------------------
  # ● Rewrote update
  #--------------------------------------------------------------------------
  def update
    super
    if BattleManager.in_turn?
      if inputting? and CBS.get_mode == 1
        BattleManager.set_speed(CBS::SLOW_SPEED)
      else
        BattleManager.set_speed(1)
      end
      if !inputting? or CBS.get_mode != 2
        while @subject.nil? and !CBS::ATB
          process_stamina
        end
        if CBS::ATB
          process_stamina
        end
      end
    end
    if BattleManager.in_turn? and !inputting? and @subject
      process_event
      process_action
    end
    if BattleManager.in_turn?
      @actor_subject = @subject
      @subjects = @subjects.reject(&:nil?)
      for i in 0..@subjects.size
        subject = @subjects[i]
        next unless subject
        @subject = subject
        process_event
        process_action
        @subjects[i] = @subject
      end
      @subject = @actor_subject
    end
    BattleManager.judge_win_loss
  end
  #--------------------------------------------------------------------------
  # ● New Method inputting?
  #--------------------------------------------------------------------------
  def inputting?
    return @actor_command_window.active || @skill_window.active ||
      @item_window.active || @actor_window.active || @enemy_window.active
  end
  #--------------------------------------------------------------------------
  # ● New Method process_stamina
  #--------------------------------------------------------------------------
  def process_stamina
    BattleManager.advance_turn
    all_battle_members.each do |battler|
      battler.stamina_gain
    end
    if !@subject
      @status_window.refresh
      if @status_window.close?
        @status_window.open
      end
    end
    if BattleManager.escaping?
      $game_party.battle_members.each do |battler|
        if battler.stamina < CBS::MAX_STAMINA
          $game_troop.members.each do |enemy|
            if enemy.stamina == CBS::MAX_STAMINA
              enemy.make_actions
              @subjects.push(enemy)
            end
          end
          return
        end
      end
      unless BattleManager.process_escape
        $game_party.battle_members.each do |actor|
          actor.stamina -= CBS::ESCAPE_COST
        end
        BattleManager.set_escaping(false) unless CBS::ATB
      end
    end
    $game_troop.members.each do |battler|
      if battler.stamina == CBS::MAX_STAMINA
        battler.make_actions
        @subjects.push(battler)
      end
    end
    process_actors if !@subject
  end
  #--------------------------------------------------------------------------
  # ● New Method process_actors
  #--------------------------------------------------------------------------
  def process_actors
    $game_party.battle_members.each do |actor|
      if actor.stamina == CBS::MAX_STAMINA
        actor.make_actions
        @subject = actor
        if @subject.inputable? and actor.is_a?(Game_Actor)
          @actor_command_window.setup(@subject)
          BattleManager.set_actor(actor)
        end
        return
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_info_viewport
  #--------------------------------------------------------------------------
  def create_info_viewport
    @info_viewport = Viewport.new
    @info_viewport.rect.y = Graphics.height - @status_window.height - 48
    @info_viewport.rect.height = @status_window.height + 48
    @info_viewport.z = 100
    @info_viewport.ox = 0
    @status_window.viewport = @info_viewport
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_party_command_window
  #--------------------------------------------------------------------------
  def create_party_command_window
    @party_command_window = Window_PartyCommand.new
    @party_command_window.viewport = @info_viewport
    @party_command_window.set_handler(:fight,  method(:command_fight))
    @party_command_window.set_handler(:escape, method(:command_escape))
    @party_command_window.set_handler(:auto_battle, method(:command_auto_battle))
    @party_command_window.unselect
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_status_window
  #--------------------------------------------------------------------------
  def create_status_window
    @status_window = Window_BattleStatus.new
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_actor_command_window
  #--------------------------------------------------------------------------
  def create_actor_command_window
    @actor_command_window = Window_ActorCommand.new
    @actor_command_window.viewport = @info_viewport
    @actor_command_window.set_handler(:attack, method(:command_attack))
    @actor_command_window.set_handler(:skill,  method(:command_skill))
    @actor_command_window.set_handler(:guard,  method(:command_guard))
    @actor_command_window.set_handler(:item,  method(:command_item))
    @actor_command_window.set_handler(:cbs,    method(:command_pass)) if CBS::ENABLE_PASSING
    @actor_command_window.set_handler(:cancel, method(:prior_command))
    @actor_command_window.x = Graphics.width - 128
    @actor_command_window.y = 48
  end
  #--------------------------------------------------------------------------
  # ● Destroyed update_info_viewport
  #--------------------------------------------------------------------------
  def update_info_viewport
    # no thank you
  end
  #--------------------------------------------------------------------------
  # ● Rewrote start_party_command_selection
  #--------------------------------------------------------------------------
  def start_party_command_selection
    unless scene_changing?
      refresh_status
      @status_window.unselect
      @status_window.open
      if BattleManager.input_start
        @actor_command_window.close
        @party_command_window.setup
      else
        @party_command_window.deactivate
        turn_start
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Rewrote start_actor_command_selection
  #--------------------------------------------------------------------------
  def start_actor_command_selection
    @party_command_window.close
    BattleManager.set_escaping(false)
    turn_start
  end
  #--------------------------------------------------------------------------
  # ● Rewrote prior_command
  #--------------------------------------------------------------------------
  def prior_command
    start_party_command_selection
  end
  #--------------------------------------------------------------------------
  # ● Rewrote process_action
  #--------------------------------------------------------------------------
  def process_action
    return if scene_changing?
    if !@subject || !@subject.current_action
      @subject = BattleManager.next_subject
    end
    if Input.trigger?(:B) and (@actor == nil)
      start_party_command_selection
    end
    return unless @subject
    @excecuting_action = @subject
    if @subject.current_action
      @subject.current_action.prepare
      if @subject.current_action.valid?
        @status_window.open
        execute_action
      end
      @subject.remove_current_action
      refresh_status
      #@log_window.display_auto_affected_status(@subject)
      @log_window.wait_and_clear
    end
    process_action_end unless @subject.current_action
    @excecuting_action = nil
  end
  #--------------------------------------------------------------------------
  # ● Aliases use_item
  #--------------------------------------------------------------------------
  alias cbs_use_item use_item
  def use_item
    cbs_use_item
    @subject.stamina_loss
  end
  #--------------------------------------------------------------------------
  # * Start Turn
  #--------------------------------------------------------------------------
  def turn_start
    @party_command_window.close
    @actor_command_window.close
    @status_window.unselect
    @subject =  @excecuting_action
    BattleManager.turn_start
    @log_window.wait
    @log_window.clear
  end
  #--------------------------------------------------------------------------
  # ● Rewrote turn_end
  #--------------------------------------------------------------------------
  def turn_end
    all_battle_members.each do |battler|
      battler.on_turn_end
      refresh_status
      @log_window.display_auto_affected_status(battler)
      @log_window.wait_and_clear
    end
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_fight
  #--------------------------------------------------------------------------
  def command_fight
    BattleManager.next_command
    start_actor_command_selection
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_escape
  #--------------------------------------------------------------------------
  def command_escape
    @party_command_window.close
    BattleManager.set_escaping(true)
    turn_start
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_auto_battle
  #--------------------------------------------------------------------------
  def command_auto_battle
    @party_command_window.close
    BattleManager.set_auto_battle(true)
    start_actor_command_selection
  end
  #--------------------------------------------------------------------------
  # ● New method command_pass
  #--------------------------------------------------------------------------
  def command_pass
    return if !inputting?
    current_actor = @subject.is_a?(Game_Actor) ? @subjet : @actor_subject 
    if CBS::PASSING_RETURN_MENU and inputting? and !@actor_command_window.active
      @actor_window.deactivate.hide
      @enemy_window.deactivate.hide
      @skill_window.deactivate.hide
      @item_window.deactivate.hide
      @actor_command_window.setup(current_actor)
      BattleManager.set_actor(current_actor)
      turn_start
      return
    end
    @actor_window.deactivate.hide
    @enemy_window.deactivate.hide
    @skill_window.deactivate.hide
    @item_window.deactivate.hide
    if CBS.get_mode == 2
      BattleManager.actor.stamina -= CBS::PASSING_COST
      BattleManager.clear_actor
      @actor = nil
      turn_start
      @actor_command_window.active = false
      @actor_command_window.close
    else
      return unless current_actor
      members = $game_party.battle_members
      actual = members.index(current_actor) - members.size
      for i in 1..members.size
        actor = members[actual+i]
        if actor.stamina == CBS::MAX_STAMINA
          actor.make_actions
          @actor_subject = actor
          @subject = actor if current_actor == @subject
          if @actor_subject.inputable?
            @actor_command_window.setup(@actor_subject)
            BattleManager.set_actor(actor)
          end
          turn_start
          return
        end
      end
    end
  end
 
  #--------------------------------------------------------------------------
  # ● Destroyed next_command
  #--------------------------------------------------------------------------
  def next_command
    # no thank you
  end
end

class Window_ActorCommand < Window_Command
  #--------------------------------------------------------------------------
  # * Handling Processing for OK and Cancel Etc.
  #--------------------------------------------------------------------------
  alias cbs_process_handling process_handling
  def process_handling
    cbs_process_handling
    return process_cbs if handle?(:cbs) && Input.trigger?(CBS::PASSING_INPUT)
  end
  #--------------------------------------------------------------------------
  # * Processing When CBS Button Is Pressed
  #--------------------------------------------------------------------------
  def process_cbs
    if current_item_enabled?
      Sound.play_cursor
      Input.update
      deactivate
      call_cbs_handler
    else
      Sound.play_buzzer
    end
  end
  #--------------------------------------------------------------------------
  # * Call CBS Handler
  #--------------------------------------------------------------------------
  def call_cbs_handler
    call_handler(:cbs)
  end
end

class Window_BattleSkill < Window_SkillList
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(help_window, info_viewport)
    y = help_window.height
    super(0, y, Graphics.width, info_viewport.rect.y - y + 48)
    self.visible = false
    @help_window = help_window
    @info_viewport = info_viewport
  end
end

class Window_BattleActor < Window_BattleStatus
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(info_viewport)
    super()
    self.y = info_viewport.rect.y + 48
    self.visible = false
    self.openness = 255
    @info_viewport = info_viewport
  end
end

class Window_BattleEnemy < Window_Selectable
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(info_viewport)
    super(0, info_viewport.rect.y + 48, window_width, fitting_height(4))
    refresh
    self.visible = false
    @info_viewport = info_viewport
  end
end

class Window_BattleItem < Window_ItemList
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(help_window, info_viewport)
    y = help_window.height
    super(0, y, Graphics.width, info_viewport.rect.y - y + 48)
    self.visible = false
    @help_window = help_window
    @info_viewport = info_viewport
  end
end

module BattleManager
  #--------------------------------------------------------------------------
  # ● Rewrote setup
  #--------------------------------------------------------------------------
  def self.setup(troop_id, can_escape = true, can_lose = false)
    init_members
    $game_troop.setup(troop_id)
    @can_escape = can_escape
    @can_lose = can_lose
    make_escape_ratio
    @escaping = false
    @auto_battle = false
    @speed = 1
    @turn_counter = 0
    @actions_per_turn = $game_party.members.size + $game_troop.members.size
    ($game_party.members + $game_troop.members).each do |battler|
      if battler.is_a?(Game_Enemy) or CBS::RESET_STAMINA
        CBS.stamina_start(battler)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Processing at Encounter Time
  #--------------------------------------------------------------------------
  def self.on_encounter
    @preemptive = (rand < rate_preemptive)
    @surprise = (rand < rate_surprise && !@preemptive)
   
    if @preemptive
      $game_party.members.each do |battler|
        CBS.stamina_start(battler, CBS::MAX_STAMINA)
      end
      $game_troop.members.each do |battler|
        CBS.stamina_start(battler, 0)
      end
    elsif @surprise
      $game_party.members.each do |battler|
        CBS.stamina_start(battler, 0)
      end
      $game_troop.members.each do |battler|
        CBS.stamina_start(battler, CBS::MAX_STAMINA)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● New Method set_auto_battle
  #--------------------------------------------------------------------------
  def self.set_auto_battle(auto_battle)
    @auto_battle = auto_battle
  end
  #--------------------------------------------------------------------------
  # ● New Method auto_battle?
  #--------------------------------------------------------------------------
  def self.auto_battle?
    return @auto_battle
  end
  #--------------------------------------------------------------------------
  # ● New Method set_speed
  #--------------------------------------------------------------------------
  def self.set_speed(speed)
    @speed = speed
  end
  #--------------------------------------------------------------------------
  # ● New Method get_speed
  #--------------------------------------------------------------------------
  def self.get_speed
    return auto_battle? ? @speed*CBS::FAST_SPEED : @speed
  end
  #--------------------------------------------------------------------------
  # ● New Method set_escaping
  #--------------------------------------------------------------------------
  def self.set_escaping(escaping)
    @escaping = escaping
  end
  #--------------------------------------------------------------------------
  # ● New Method escaping?
  #--------------------------------------------------------------------------
  def self.escaping?
    return @escaping
  end
  #--------------------------------------------------------------------------
  # ● Rewrote turn_start
  #--------------------------------------------------------------------------
  def self.turn_start
    @phase = :turn
    clear_actor
    $game_troop.increase_turn if $game_troop.turn_count == 0
  end
  #--------------------------------------------------------------------------
  # ● New Method set_actor
  #--------------------------------------------------------------------------
  def self.set_actor(actor)
    @actor_index = actor.index
  end
  #--------------------------------------------------------------------------
  # ● New Increase action counter
  #--------------------------------------------------------------------------
  def self.add_action
    return if @actions_per_turn.nil?
    @turn_counter += 1
    if @turn_counter == @actions_per_turn and CBS::TURN_LENGTH == 0
      $game_troop.increase_turn
      SceneManager.scene.turn_end
      @turn_counter = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● New Method advance_turn
  #--------------------------------------------------------------------------
  def self.advance_turn
    return if CBS::TURN_LENGTH == 0
    @turn_counter += 1
    if @turn_counter == 60 * CBS::TURN_LENGTH
      $game_troop.increase_turn
      SceneManager.scene.turn_end
      @turn_counter = 0
    end
  end
  #--------------------------------------------------------------------------
  # * Start Command Input
  #--------------------------------------------------------------------------
  def self.input_start
    if @phase != :input
      @phase = :input
      $game_party.make_actions
      $game_troop.make_actions
      clear_actor
    end
    return !@surprise && ($game_party.inputable? or @auto_battle)
  end
end

class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● Rewrote on_turn_end
  #--------------------------------------------------------------------------
  def on_turn_end
    @result.clear
    regenerate_all
    update_state_turns
    update_buff_turns
    remove_states_auto(2)
  end
  #--------------------------------------------------------------------------
  # ● New Method on_turn_end
  #--------------------------------------------------------------------------
  def stamina_loss
    if self.actor?
      @stamina -= input.stamina_cost
    else
      @stamina -= @actions[0].stamina_cost
    end
    BattleManager.add_action
  end
  #--------------------------------------------------------------------------
  # * Add State
  #--------------------------------------------------------------------------
  def add_state(state_id)
    if state_addable?(state_id)
      add_new_state(state_id) unless state?(state_id)
      reset_state_counts(state_id)
      @result.added_states.push(state_id).uniq!
     
      unless CBS::STAMINA_STATES[state_id].nil?
        return unless CBS::STAMINA_STATES[state_id][2]
      end
      if !CBS::STATES_HANDLE_AGI
        for state in @states
          unless CBS::STAMINA_STATES[state].nil? or state == state_id
            remove_state(state) if CBS::STAMINA_STATES[state][2]
          end
        end
      end
    end
  end
end
class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● Rewrote input
  #--------------------------------------------------------------------------
  def input
    if @actions[@action_input_index] == nil
      @actions[@action_input_index] = Game_Action.new(self)
    end
    return @actions[@action_input_index]
  end
end
class Game_Action
  #--------------------------------------------------------------------------
  # ● New Method stamina_cost
  #--------------------------------------------------------------------------
  def stamina_cost
    if @item.is_skill?
      return CBS::SKILL_COST[item.id] if CBS::SKILL_COST[item.id]
      return CBS::SKILL_COST[0]
    end
    return CBS::ITEM_COST if @item.is_item?
    return CBS::MAX_STAMINA
  end
end

#==============================================================================
# ** DataManager
#==============================================================================
module DataManager
  #--------------------------------------------------------------------------
  # * Set Up New Game
  #--------------------------------------------------------------------------
  def self.setup_new_game
    create_game_objects
    CBS.set_mode(CBS::MODE)
    $game_party.setup_starting_members
    $game_map.setup($data_system.start_map_id)
    $game_player.moveto($data_system.start_x, $data_system.start_y)
    $game_player.refresh
    Graphics.frame_count = 0
  end
  #--------------------------------------------------------------------------
  # * Create Save Contents
  #--------------------------------------------------------------------------
  def self.make_save_contents
    contents = {}
    contents[:system]        = $game_system
    contents[:timer]        = $game_timer
    contents[:message]      = $game_message
    contents[:switches]      = $game_switches
    contents[:variables]    = $game_variables
    contents[:self_switches] = $game_self_switches
    contents[:actors]        = $game_actors
    contents[:party]        = $game_party
    contents[:troop]        = $game_troop
    contents[:map]          = $game_map
    contents[:player]        = $game_player
    contents[:cbs_mod]      = CBS.get_mode
    contents
  end
  #--------------------------------------------------------------------------
  # * Extract Save Contents
  #--------------------------------------------------------------------------
  def self.extract_save_contents(contents)
    $game_system        = contents[:system]
    $game_timer        = contents[:timer]
    $game_message      = contents[:message]
    $game_switches      = contents[:switches]
    $game_variables    = contents[:variables]
    $game_self_switches = contents[:self_switches]
    $game_actors        = contents[:actors]
    $game_party        = contents[:party]
    $game_troop        = contents[:troop]
    $game_map          = contents[:map]
    $game_player        = contents[:player]
    CBS.set_mode(contents[:cbs_mod])
  end
end

Merci, je sais que je suis bon Jauge ATB pour LNX Battle 792365
Nérylis
Nérylis
Membre

Nombre de messages : 612
Age : 31
Localisation : Seine Maritime
Distinction : aucune
Date d'inscription : 23/11/2014

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Mer 17 Aoû 2016 - 20:49
Je viens de tester avec la dernière mise à jour.

Ok pour le bug des statuts d'état, c'est corrigé.
Mais j'ai trouvé un autre petit souci : lorsqu'un personnage voit sa barre ATB figée sans qu'elle repasse à 0 (comme le statut n°36 Stop que tu as fait), si au moment où ce statut est appliqué, la barre est pleine, le personnage peut quand même agir.
Par ailleurs, j'ai testé un peu l'utilisation des objets, chose que je n'avais pas faite la dernière fois. Pas de problème particulier à part une chose à laquelle j'ai pensé. Admettons qu'un personnage ait le statut Stop. Si on lui applique le statut Booster par exemple via un objet ou un sort, normalement, le statut ne vient pas remplacer Stop, il est sans effet. Ce n'est pas prévu actuellement ce cas-là, non ? Edit : J'y pense au moment d'aller dodo, peut-être si je mets une Immunité à Booster dans le statut Stop.

Pour le switch entre les personnages, j'ai vu qu'il y avait maintenant le son du Buzzer quand le switch n'est pas possible (aucune jauge ATB remplie). Il y a le son du Curseur quand le switch est effectué. Par contre, il y a un problème au niveau du switch en lui-même. Il ne s'effectue que dans un sens, c'est-à-dire vers le premier personnage. Une fois arrivé à celui-ci, le switch ne s'opère, on est bloqué sur le personnage. Et lorsqu'on appuie sur la touche de switch quand l'ennemi fait une action, la fenêtre de commande disparaît le temps que l'action soit passée. Ça serait mieux si elle restée visible pour savoir sur quel personnage on a atterri.^^

Pour le menu Combattre / S'enfuir / Combat auto, j'ai remarqué qu'on ne pouvait plus y accéder à partir du moment où aucune barre ATB n'est remplie. C'est un peu embêtant. J'ai vu aussi que parfois, au lieu d'aller dans le menu, le curseur va sur un autre personnage.

Ok pour le Combat auto, ça ne me gêne pas.

Pour le temps de lancement des magies, il en faudrait aussi un pour les objets je pense, même si dans ce cas c'est plus rapide. Il me semble que ça marche comme ça dans les Final fantasy si je ne dis pas de bêtises.

Je n'ai pas vu d'autres problèmes sinon. Désolé pour l'oubli du temps de chargement. J'essaie toujours de penser à tout et j'oublie tout le temps quelque chose.
Bon courage. Wink
DrakeRoxas
DrakeRoxas
Membre

Nombre de messages : 44
Age : 27
Distinction : aucune
Date d'inscription : 23/07/2016

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Mer 17 Aoû 2016 - 22:34
Alors, le problème du "je joue même en stop" est résolu.
Pour le switch de perso je l'ai vu et résolu aussi.
Je viens de résoudre le retour quand les jauges ATB ne sont pas pleines.

Pour les magies, j'ai fait un truc comme ça :
Code:
  # Cout en stamina pour lancer chaque sort. le format est :
  # SKILL_COST[id du sort] = [coût en stamina, stamina suplémentaire pour lancer]
  SKILL_COST = []
  SKILL_COST[0] = [1000,0]            # Coût en stamina pour lancer un sort par défaut
  # Attack
  SKILL_COST[1] = [1000,0]            # Coût en stamina pour lancer le 1er sort (Atk)
  # Guard
  SKILL_COST[2] = [ 500,0]            # Coût en stamina pour lancer le 2e sort (Def)
  # Exemples
  SKILL_COST[151] = [1000,5000]      # Met 5'000 stamina avant de lancer le
                                      # sort et perd toute sa stamina
  SKILL_COST[152] = [0,1000]          # Met 1'000 stamina avant de lancer le
                                      # sort et peut rejouer dès que le sort
                                      # est lancé
  SKILL_COST[153] = [500,500]        # Met 500 puis perd 500
  ITEM_COST = 1000                # Coût en stamina pour lancer un objet
Tu préfères avoir une temps de cast général pour tous les objets ou un truc comme pour les skills ?

Pas grave, tout le monde oublie des choses ^^

J'envoi pas la nouvelle version de suite, j'ai un problème avec la fenêtre d'aide qui fait nawak. Dès que j'ai résolu ça j'envoi :3
Nérylis
Nérylis
Membre

Nombre de messages : 612
Age : 31
Localisation : Seine Maritime
Distinction : aucune
Date d'inscription : 23/11/2014

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Jeu 18 Aoû 2016 - 6:46
Je préfère quelque chose comme pour les skills, on ne sait jamais les idées qu'on peut avoir à l'avenir donc autant anticiper.^^
DrakeRoxas
DrakeRoxas
Membre

Nombre de messages : 44
Age : 27
Distinction : aucune
Date d'inscription : 23/07/2016

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Ven 19 Aoû 2016 - 15:15
Voilà, en fait le bug de la fenêtre d'aide était tout simple à résoudre, j'ai passer une journée à trouver une solution pour me faire "Tient ... Et si j'avais fait ça au début ? . . . Ça marche ..." xD

Donc le 1er script :
Code:
=begin
Customisable ATB/Stamina Based Battle System Script
by Fomar0153
Version 1.3
----------------------
Notes
----------------------
No requirements
Customises the battle system to be similar to
ATB or Stamina based battle systems.
----------------------
Instructions
----------------------
Edit variables in CBS to suit your needs.
The guard status should be set to 2~2 turns.
----------------------
Change Log
----------------------
1.0 -> 1.1 Restored turn functionality and a glitch
           related to message windows
1.1 -> 1.2 Added CTB related options
           Added the ability to pass a turn
           Fixed a bug which caused an error on maps
           with no random battles
           Added options for turn functionality to be based on time
           or number of actions
           Added the ability to change the bar colours based on states
1.2 -> 1.3 Fixed a bug when escaping using CTB mode
          
----------------------
Known bugs
----------------------
None
=end
module CBS

  # =========================================================================
  # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  #                      DEBUT de la PARTIE CONFIGURABLE                    
  # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # =========================================================================

  MAX_STAMINA = 1000              # Valeur max de la jauge
  
  ATB = true                      # Active/Désactive le système ATB
  ENABLE_PASSING = true           # Active/Désactive la possibiliter de passer
                                  # son tour
  PASSING_INPUT = :A              # Touche pour passer son tour/passer au
                                  # prochain joueur
  PASSING_COST = 200              # Stamania consommée en passant son tour
                                  # (ne pas mettre trop ici, sinon la guarde
                                  #  est bien mieux et rend cette action inutile)
  PASSING_RETURN_MENU = true      # true : Si le joueur est dans un menu,
                                  #        il revient au choix
                                  #        Attaque/Magie/Garde/Objets,
                                  #        sinon il passe bien son tour
                                  # false : Passe systématiquement son tour,
                                  #         qu'il soit dans un menu ou non
  SLOW_SPEED = 0.5                # Ralentissement en mode Semi-Actif
                                  # (voir plus bas)
  FAST_SPEED = 2.0                # Accélération en mode Combat Auto.
  
  TURN_LENGTH = 4                 # Temps en seconde de chaque tour.
                                  # Si cette valeur est mise à 0 :
                                  # un tour = nb d'action égale à nb battlers
  
  RESET_STAMINA = true            # true : Reprend une valeur aléatoire en début
                                  #        de combat ;
                                  # false : Garde les jauges de stamina du
                                  #         dernier combat
  ESCAPE_COST = 500               # Si RESET_STAMINA = false, fuir consomera
                                  # ESCAPE_COST points de stamina
  STAMINA_START_PERCENT = 0       # Si RESET_STAMINA = true, les combatants
                                  # commenceront chaque combat avec un nombre
                                  # de points de stamina compris entre
                                  # 0 et STAMINA_START_PERCENT

  # Cout en stamina pour lancer chaque sort. Le format est :
  # SKILL_COST[id du sort] = [coût en stamina, stamina suplémentaire pour lancer]
  SKILL_COST = []
  SKILL_COST[0] = [1000,0]            # Coût en stamina pour lancer un sort par défaut
  # Attack
  SKILL_COST[1] = [1000,0]            # Coût en stamina pour lancer le 1er sort (Atk)
  # Guard
  SKILL_COST[2] = [ 500,0]            # Coût en stamina pour lancer le 2e sort (Def)
  # Exemples
  SKILL_COST[151] = [1000,5000]       # Met 5'000 stamina avant de lancer le
                                      # sort et perd toute sa stamina
  SKILL_COST[152] = [0,1000]          # Met 1'000 stamina avant de lancer le
                                      # sort et peut rejouer dès que le sort
                                      # est lancé
  SKILL_COST[153] = [500,500]        # Met 500 puis perd 500
  # Cout en stamina pour lancer chaque objet. CF. SKILL_COST en remplaçant
  # l'id du sort par l'id de l'objet
  ITEM_COST = []
  ITEM_COST[0] = [1000,0]

  STATES_HANDLE_AGI = false       # true : Seule l'agilité est prise en compte
                                  # pour calculer les gains de stamina
                                  # false : Les status influent aussi sur
                                  # les gains de stamina.
  # Ce qui suit n'est pas utilisé si STATES_HANDLE_AGI = true.
  # Ici on choisis les status qui ralentissent dans ce format :
  # STAMINA_STATES[id du status] = [Mult, Zéro, Efface]
  # - - - Mult : Multipli le gain en stamina
  # - - - Zéro : Remet la stamina à 0 et la maintient à 0 tant que le statut reste
  # - - - Efface : Efface et peut être effacé par les autres statut ayant "true" ici
  STAMINA_STATES = []
  STAMINA_STATES[0]  = [  1,false,false] # Sans status
  STAMINA_STATES[34] = [  2,false, true] # Exemple pour la vitesse
  STAMINA_STATES[35] = [0.5,false, true] # Exemple pour le ralentissement
  STAMINA_STATES[36] = [  0,false,false] # Exemple pour le stop
  STAMINA_STATES[37] = [  0, true,false] # Exemple pour le stun
  
  # Mode par défaut, il faut le redéfinir à chaque nouvelle partie
  # (cette valeur est enregistrée dans les fichiers de sauvegarde)
  # Utilisez CBS.set_mode(X) pour changer cette valeur en jeu
  MODE = 0                        # 0 : Actif
                                  #     Le temps continu dans les menus
                                  # 1 : Semi-Actif
                                  #     Le temps ralentit dans les menus
                                  # 2 : Passif
                                  #     Le temps s'arrête dans les menus
  # Paliers de vitesse de remplissage de la jauge de stamina. Le format est
  # [AGI, TEMPS]
  # - - AGI : Agilité nécessaire pour atteindre le nouveau palier
  #           (ces valeurs doivent être dans l'ordre)
  # - - TEMPS : Temps en secondes pour remplir la jauge de stamina à cette agilité
  AGI_TIME = [
              [-1,  10],          # Garder une valeur inférieure à 0
              [1,  10],           # Permet d'avoir le "1 agi = 10s", et pas "9.Xs"
              [100, 3],           # Premier pallier, sert + de test qu'autre chose
              [200, 1],           # Le fameux 200 = 1s et pareil pour au dessus
              [9999, 1]           # Garder une valeur max qui ne sera jamais atteinte
             ]
            
  # =========================================================================
  # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  #                       FIN de la PARTIE CONFIGURABLE                      
  # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # =========================================================================

  # ● Variable
  @mode = MODE
  #--------------------------------------------------------------------------
  # ● New Method set_mode
  #--------------------------------------------------------------------------
  def self.set_mode(mode)
    @mode = mode
  end
  #--------------------------------------------------------------------------
  # ● New Method get_mode
  #--------------------------------------------------------------------------
  def self.get_mode
    @mode
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain?
  #--------------------------------------------------------------------------
  def self.stamina_gain?(battler)
    if !STATES_HANDLE_AGI
      for state in battler.states
        unless STAMINA_STATES[state.id].nil?
          if STAMINA_STATES[state.id][1]
            battler.stamina = 0
            return false
          end
        end
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.get_agi_margin(agi)
    last = AGI_TIME[0]
    used = [last, AGI_TIME[1]]
    AGI_TIME.each do |value|
      used = [last, value]
      last = value
      break if value[0] >= agi
    end
    return used.map {|i| i.map {|j| Float(j) } }
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.get_stamina_gain(agi)
    margin = get_agi_margin(agi)
    # Convert seconds to point/frames
    margin[0][1] = 1000.0 / (margin[0][1]*60.0)
    margin[1][1] = 1000.0 / (margin[1][1]*60.0)
    # Get affine function
    a = (margin[0][1] - margin[1][1]) / (margin[0][0] - margin[1][0])
    b = margin[0][1] - a*margin[0][0]
    return a*agi.to_f + b
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.stamina_gain(battler)
    return [0.0, get_stamina_gain(battler.agi)].max * self.stamina_mult(battler) * BattleManager.get_speed
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_gain
  #--------------------------------------------------------------------------
  def self.stamina_mult(battler)
    return 1 if STATES_HANDLE_AGI
    mult = STAMINA_STATES[0][0]
    for state in battler.states
      unless STAMINA_STATES[state.id].nil?
        mult *= STAMINA_STATES[state.id][0]
      end
    end
    return mult
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_start
  #--------------------------------------------------------------------------
  def self.stamina_start(battler, value = nil)
    battler.stamina = rand(MAX_STAMINA * STAMINA_START_PERCENT / 100)
    battler.stamina = value if value != nil
  end
end

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● New attr_accessor
  #--------------------------------------------------------------------------
  attr_accessor :stamina
  #--------------------------------------------------------------------------
  # ● Aliases initialize
  #--------------------------------------------------------------------------
  alias cbs_initialize initialize
  def initialize
    cbs_initialize
    @stamina = 0.0
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_rate
  #--------------------------------------------------------------------------
  def stamina_rate
    [@stamina.to_f, CBS::MAX_STAMINA.to_f].min / CBS::MAX_STAMINA
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_rate
  #--------------------------------------------------------------------------
  def stamina_gain
    return if not CBS.stamina_gain?(self)
    return if not movable?
    @stamina = [CBS::MAX_STAMINA + stamina_over, @stamina + CBS.stamina_gain(self)].min
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_mult
  #--------------------------------------------------------------------------
  def stamina_mult
    return CBS.stamina_mult(self)
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_over
  #--------------------------------------------------------------------------
  def stamina_over
    return 0.0
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_over_rate
  #--------------------------------------------------------------------------
  def stamina_over_rate
    return 0 if stamina_over == 0.0
    [@stamina.to_f - CBS::MAX_STAMINA.to_f, 0].max / stamina_over
  end
  #--------------------------------------------------------------------------
  # * Determine if Auto Battle
  #--------------------------------------------------------------------------
  alias cbs_auto_battle? auto_battle?
  def auto_battle?
    return (BattleManager.auto_battle? or cbs_auto_battle?)
  end
  #--------------------------------------------------------------------------
  # * Check Usability Conditions for Skill
  #--------------------------------------------------------------------------
  def skill_conditions_met?(skill)
    usable_item_conditions_met?(skill) && stamina_full? &&
    skill_wtype_ok?(skill) && skill_cost_payable?(skill) &&
    !skill_sealed?(skill.id) && !skill_type_sealed?(skill.stype_id)
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_full?
  #--------------------------------------------------------------------------
  def stamina_full?
    return @stamina.to_f == CBS::MAX_STAMINA.to_f + stamina_over.to_f
  end
  #--------------------------------------------------------------------------
  # * Determine Skill/Item Usability
  #--------------------------------------------------------------------------
  def usable?(item)
    return skill_conditions_met?(item) if item.is_a?(RPG::Skill)
    return item_conditions_met?(item)  if item.is_a?(RPG::Item)
    return false
  end
end

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # * Start Processing
  #--------------------------------------------------------------------------
  alias cbs_start start
  def start
    @subjects = []
    @excecuting_action = nil
    @actor_subject = nil
    cbs_start
  end
  #--------------------------------------------------------------------------
  # ● Rewrote update
  #--------------------------------------------------------------------------
  def update
    super
    @subject = @actor_subject
    if BattleManager.in_turn?
      if inputting? and CBS.get_mode == 1
        BattleManager.set_speed(CBS::SLOW_SPEED)
      else
        BattleManager.set_speed(1)
      end
      if !inputting? or CBS.get_mode != 2
        while @subject.nil? and !CBS::ATB
          process_stamina
        end
        if CBS::ATB
          process_stamina
        end
      end
    end
    if BattleManager.in_turn? and !inputting? and @subject
      process_event
      process_action
    end
    if BattleManager.in_turn?
      @actor_subject = @subject
      @subjects = @subjects.reject(&:nil?)
      for i in 0..@subjects.size
        subject = @subjects[i]
        next unless subject
        @subject = subject
        BattleManager.set_actor(@subject) if @subject.is_a?(Game_Actor)
        process_event
        process_action
        @subjects[i] = @subject
      end
      @subject = @actor_subject
      BattleManager.set_actor(@subject) if @subject
    end
    BattleManager.judge_win_loss
    #@help_window.close if !@subject
  end
  #--------------------------------------------------------------------------
  # ● New Method inputting?
  #--------------------------------------------------------------------------
  def inputting?
    return @actor_command_window.active || @skill_window.active ||
      @item_window.active || @actor_window.active || @enemy_window.active
  end
  #--------------------------------------------------------------------------
  # ● New Method process_stamina
  #--------------------------------------------------------------------------
  def process_stamina
    BattleManager.advance_turn
    all_battle_members.each do |battler|
      battler.stamina_gain
    end
    if !@subject
      @status_window.refresh
      if @status_window.close?
        @status_window.open
      end
    end
    if BattleManager.escaping?
      $game_party.battle_members.each do |battler|
        if battler.stamina < CBS::MAX_STAMINA
          $game_troop.members.each do |enemy|
            if enemy.stamina == CBS::MAX_STAMINA
              enemy.make_actions
              @subjects.push(enemy)
            end
          end
          return
        end
      end
      unless BattleManager.process_escape
        $game_party.battle_members.each do |actor|
          actor.stamina -= CBS::ESCAPE_COST
        end
        BattleManager.set_escaping(false) unless CBS::ATB
      end
    end
    $game_troop.members.each do |battler|
      if battler.stamina == CBS::MAX_STAMINA
        battler.make_actions
        @subjects.push(battler)
      end
    end
    $game_party.battle_members.each do |actor|
      if actor.stamina_full? and actor.stamina != CBS::MAX_STAMINA
        @subjects.push(actor)
      end
    end
    return if @subject and @subject.stamina_full? and @subject.stamina_mult > 0
    @actor_command_window.setup(nil)
    process_actors
  end
  #--------------------------------------------------------------------------
  # ● New Method process_actors
  #--------------------------------------------------------------------------
  def process_actors
    $game_party.battle_members.each do |actor|
      if actor.stamina_full? and actor.stamina == CBS::MAX_STAMINA and
              actor.stamina_mult > 0
        actor.make_actions
        @subject = actor
        @actor_subject = @subject
        if @subject.inputable? and actor.is_a?(Game_Actor)
          @actor_command_window.setup(@subject)
          BattleManager.set_actor(actor)
        end
        return
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_info_viewport
  #--------------------------------------------------------------------------
  def create_info_viewport
    @info_viewport = Viewport.new
    @info_viewport.rect.y = Graphics.height - @status_window.height - 48
    @info_viewport.rect.height = @status_window.height + 48
    @info_viewport.z = 100
    @info_viewport.ox = 0
    @status_window.viewport = @info_viewport
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_party_command_window
  #--------------------------------------------------------------------------
  def create_party_command_window
    @party_command_window = Window_PartyCommand.new
    @party_command_window.viewport = @info_viewport
    @party_command_window.set_handler(:fight,  method(:command_fight))
    @party_command_window.set_handler(:escape, method(:command_escape))
    @party_command_window.set_handler(:auto_battle, method(:command_auto_battle))
    @party_command_window.unselect
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_status_window
  #--------------------------------------------------------------------------
  def create_status_window
    @status_window = Window_BattleStatus.new
  end
  #--------------------------------------------------------------------------
  # ● Rewrote create_actor_command_window
  #--------------------------------------------------------------------------
  def create_actor_command_window
    @actor_command_window = Window_ActorCommand.new
    @actor_command_window.viewport = @info_viewport
    @actor_command_window.set_handler(:attack, method(:command_attack))
    @actor_command_window.set_handler(:skill,  method(:command_skill))
    @actor_command_window.set_handler(:guard,  method(:command_guard))
    @actor_command_window.set_handler(:item,   method(:command_item))
    @actor_command_window.set_handler(:cbs,    method(:command_pass)) if CBS::ENABLE_PASSING
    @actor_command_window.set_handler(:cancel, method(:prior_command))
    @actor_command_window.x = Graphics.width - 128
    @actor_command_window.y = 48
  end
  #--------------------------------------------------------------------------
  # ● Destroyed update_info_viewport
  #--------------------------------------------------------------------------
  def update_info_viewport
    # no thank you
  end
  #--------------------------------------------------------------------------
  # ● Rewrote start_party_command_selection
  #--------------------------------------------------------------------------
  def start_party_command_selection
    unless scene_changing?
      refresh_status
      @status_window.unselect
      @status_window.open
      if BattleManager.input_start
        @actor_command_window.close
        @party_command_window.setup
      else
        @party_command_window.deactivate
        turn_start
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Rewrote start_actor_command_selection
  #--------------------------------------------------------------------------
  def start_actor_command_selection
    @party_command_window.close
    BattleManager.set_escaping(false)
    turn_start
  end
  #--------------------------------------------------------------------------
  # ● Rewrote prior_command
  #--------------------------------------------------------------------------
  def prior_command
    start_party_command_selection
  end
  #--------------------------------------------------------------------------
  # ● Rewrote process_action
  #--------------------------------------------------------------------------
  def process_action
    return if scene_changing?
    if !@subject || !@subject.current_action
      @subject = BattleManager.next_subject
    end
    if Input.trigger?(:B) and (@actor == nil)
      start_party_command_selection
    end
    return unless @subject
    return unless @subject.stamina_full?
    @excecuting_action = @subject
    if @subject.current_action
      @subject.current_action.prepare
      if @subject.current_action.valid?
        @status_window.open
        execute_action
      end
      @subject.remove_current_action
      refresh_status
      @log_window.wait_and_clear
    end
    process_action_end unless @subject.current_action
    @excecuting_action = nil
  end
  #--------------------------------------------------------------------------
  # ● Aliases use_item
  #--------------------------------------------------------------------------
  alias cbs_use_item use_item
  def use_item
    cbs_use_item
    @subject.stamina_loss
  end
  #--------------------------------------------------------------------------
  # * Start Turn
  #--------------------------------------------------------------------------
  def turn_start
    @party_command_window.close
    @status_window.unselect
    @subject = @excecuting_action
    BattleManager.turn_start
    @log_window.wait
    @log_window.clear
  end
  #--------------------------------------------------------------------------
  # ● Rewrote turn_end
  #--------------------------------------------------------------------------
  def turn_end
    all_battle_members.each do |battler|
      battler.on_turn_end
      refresh_status
      @log_window.display_auto_affected_status(battler)
      @log_window.wait_and_clear
    end
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_fight
  #--------------------------------------------------------------------------
  def command_fight
    BattleManager.set_auto_battle(false)
    BattleManager.next_command
    start_actor_command_selection
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_escape
  #--------------------------------------------------------------------------
  def command_escape
    @party_command_window.close
    BattleManager.set_auto_battle(false)
    BattleManager.set_escaping(true)
    turn_start
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_auto_battle
  #--------------------------------------------------------------------------
  def command_auto_battle
    @party_command_window.close
    BattleManager.set_auto_battle(true)
    start_actor_command_selection
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_attack
  #--------------------------------------------------------------------------
  alias cbs_command_attack command_attack
  def command_attack
    BattleManager.set_actor(@actor_subject) unless BattleManager.actor
    cbs_command_attack
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_skill
  #--------------------------------------------------------------------------
  alias cbs_command_skill command_skill
  def command_skill
    BattleManager.set_actor(@actor_subject) unless BattleManager.actor
    cbs_command_skill
  end
  #--------------------------------------------------------------------------
  # ● Rewrote command_guard
  #--------------------------------------------------------------------------
  alias cbs_command_guard command_guard
  def command_guard
    BattleManager.set_actor(@actor_subject) unless BattleManager.actor
    cbs_command_guard
  end
  #--------------------------------------------------------------------------
  # ● New method command_pass
  #--------------------------------------------------------------------------
  def command_pass
    return if !inputting?
    current_actor = @subject.is_a?(Game_Actor) ? @subject : @actor_subject  
    if CBS::PASSING_RETURN_MENU and inputting? and !@actor_command_window.active
      @actor_window.deactivate.hide
      @enemy_window.deactivate.hide
      @skill_window.deactivate.hide
      @item_window.deactivate.hide
      @actor_command_window.setup(current_actor)
      BattleManager.set_actor(current_actor)
      turn_start
      return
    end
    @actor_window.deactivate.hide
    @enemy_window.deactivate.hide
    @skill_window.deactivate.hide
    @item_window.deactivate.hide
    if CBS.get_mode == 2
      BattleManager.actor.stamina -= CBS::PASSING_COST
      BattleManager.clear_actor
      @actor = nil
      turn_start
      @actor_command_window.deactive.close
    else
      return unless current_actor
      members = $game_party.battle_members
      actual = members.index(current_actor) - members.size
      for i in 1..members.size
        actor = members[actual+i]
        if actor.stamina == CBS::MAX_STAMINA and actor.stamina_mult > 0
          actor.make_actions
          @actor_subject = actor
          @subject = actor if current_actor == @subject
          if @actor_subject.inputable?
            @actor_command_window.setup(@actor_subject)
            BattleManager.set_actor(actor)
          end
          turn_start
          return
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Destroyed next_command
  #--------------------------------------------------------------------------
  def next_command
    # no thank you
  end
  #--------------------------------------------------------------------------
  # ● Rewrote on_enemy_ok
  #--------------------------------------------------------------------------
  def on_enemy_ok
    BattleManager.actor.input.target_index = @enemy_window.enemy.index
    @enemy_window.hide
    @skill_window.hide
    @item_window.hide
    next_command
  end
end

class Window_ActorCommand < Window_Command
  #--------------------------------------------------------------------------
  # * Handling Processing for OK and Cancel Etc.
  #--------------------------------------------------------------------------
  alias cbs_process_handling process_handling
  def process_handling
    cbs_process_handling
    return process_cbs if handle?(:cbs) && Input.trigger?(CBS::PASSING_INPUT)
  end
  #--------------------------------------------------------------------------
  # * Processing When CBS Button Is Pressed
  #--------------------------------------------------------------------------
  def process_cbs
    if current_item_enabled?
      Sound.play_cursor
      Input.update
      call_cbs_handler
    else
      Sound.play_buzzer
    end
  end
  #--------------------------------------------------------------------------
  # * Call CBS Handler
  #--------------------------------------------------------------------------
  def call_cbs_handler
    call_handler(:cbs)
  end
end

class Window_BattleSkill < Window_SkillList
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(help_window, info_viewport)
    y = help_window.height
    super(0, y, Graphics.width, info_viewport.rect.y - y + 48)
    self.visible = false
    @help_window = help_window
    @info_viewport = info_viewport
  end
end

class Window_BattleActor < Window_BattleStatus
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(info_viewport)
    super()
    self.y = info_viewport.rect.y + 48
    self.visible = false
    self.openness = 255
    @info_viewport = info_viewport
  end
end

class Window_BattleEnemy < Window_Selectable
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(info_viewport)
    super(0, info_viewport.rect.y + 48, window_width, fitting_height(4))
    refresh
    self.visible = false
    @info_viewport = info_viewport
  end
end

class Window_BattleItem < Window_ItemList
  #--------------------------------------------------------------------------
  # ● Rewrote initialize
  #--------------------------------------------------------------------------
  def initialize(help_window, info_viewport)
    y = help_window.height
    super(0, y, Graphics.width, info_viewport.rect.y - y + 48)
    self.visible = false
    @help_window = help_window
    @info_viewport = info_viewport
  end
end

module BattleManager
  #--------------------------------------------------------------------------
  # ● Rewrote setup
  #--------------------------------------------------------------------------
  def self.setup(troop_id, can_escape = true, can_lose = false)
    init_members
    $game_troop.setup(troop_id)
    @can_escape = can_escape
    @can_lose = can_lose
    make_escape_ratio
    @escaping = false
    @auto_battle = false
    @speed = 1
    @turn_counter = 0
    @actions_per_turn = $game_party.members.size + $game_troop.members.size
    ($game_party.members + $game_troop.members).each do |battler|
      if battler.is_a?(Game_Enemy) or CBS::RESET_STAMINA
        CBS.stamina_start(battler)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Processing at Encounter Time
  #--------------------------------------------------------------------------
  def self.on_encounter
    @preemptive = (rand < rate_preemptive)
    @surprise = (rand < rate_surprise && !@preemptive)
    
    if @preemptive
      $game_party.members.each do |battler|
        CBS.stamina_start(battler, CBS::MAX_STAMINA)
      end
      $game_troop.members.each do |battler|
        CBS.stamina_start(battler, 0)
      end
    elsif @surprise
      $game_party.members.each do |battler|
        CBS.stamina_start(battler, 0)
      end
      $game_troop.members.each do |battler|
        CBS.stamina_start(battler, CBS::MAX_STAMINA)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● New Method set_auto_battle
  #--------------------------------------------------------------------------
  def self.set_auto_battle(auto_battle)
    @auto_battle = auto_battle
  end
  #--------------------------------------------------------------------------
  # ● New Method auto_battle?
  #--------------------------------------------------------------------------
  def self.auto_battle?
    return @auto_battle
  end
  #--------------------------------------------------------------------------
  # ● New Method set_speed
  #--------------------------------------------------------------------------
  def self.set_speed(speed)
    @speed = speed
  end
  #--------------------------------------------------------------------------
  # ● New Method get_speed
  #--------------------------------------------------------------------------
  def self.get_speed
    return auto_battle? ? @speed*CBS::FAST_SPEED : @speed
  end
  #--------------------------------------------------------------------------
  # ● New Method set_escaping
  #--------------------------------------------------------------------------
  def self.set_escaping(escaping)
    @escaping = escaping
  end
  #--------------------------------------------------------------------------
  # ● New Method escaping?
  #--------------------------------------------------------------------------
  def self.escaping?
    return @escaping
  end
  #--------------------------------------------------------------------------
  # ● Rewrote turn_start
  #--------------------------------------------------------------------------
  def self.turn_start
    @phase = :turn
    clear_actor
    $game_troop.increase_turn if $game_troop.turn_count == 0
  end
  #--------------------------------------------------------------------------
  # ● New Method set_actor
  #--------------------------------------------------------------------------
  def self.set_actor(actor)
    @actor_index = actor.index
  end
  #--------------------------------------------------------------------------
  # ● New Increase action counter
  #--------------------------------------------------------------------------
  def self.add_action
    return if @actions_per_turn.nil?
    @turn_counter += 1
    if @turn_counter == @actions_per_turn and CBS::TURN_LENGTH == 0
      $game_troop.increase_turn
      SceneManager.scene.turn_end
      @turn_counter = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● New Method advance_turn
  #--------------------------------------------------------------------------
  def self.advance_turn
    return if CBS::TURN_LENGTH == 0
    @turn_counter += 1
    if @turn_counter == 60 * CBS::TURN_LENGTH
      $game_troop.increase_turn
      SceneManager.scene.turn_end
      @turn_counter = 0
    end
  end
  #--------------------------------------------------------------------------
  # * Start Command Input
  #--------------------------------------------------------------------------
  def self.input_start
    if @phase != :input
      @phase = :input
      $game_party.make_actions
      $game_troop.make_actions
      clear_actor
    end
    return !@surprise && ($game_party.inputable? or @auto_battle)
  end
end

class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● Rewrote on_turn_end
  #--------------------------------------------------------------------------
  def on_turn_end
    @result.clear
    regenerate_all
    update_state_turns
    update_buff_turns
    remove_states_auto(2)
  end
  #--------------------------------------------------------------------------
  # ● New Method on_turn_end
  #--------------------------------------------------------------------------
  def stamina_loss
    if self.actor?
      @stamina -= input.stamina_cost
    else
      @stamina -= @actions[0].stamina_cost
    end
    BattleManager.add_action
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_over
  #--------------------------------------------------------------------------
  def stamina_over
    return 0.0 unless current_action
    return current_action.stamina_over
  end
  #--------------------------------------------------------------------------
  # * Add State
  #--------------------------------------------------------------------------
  def add_state(state_id)
    if state_addable?(state_id)
      add_new_state(state_id) unless state?(state_id)
      reset_state_counts(state_id)
      @result.added_states.push(state_id).uniq!
      
      unless CBS::STAMINA_STATES[state_id].nil?
        return unless CBS::STAMINA_STATES[state_id][2]
      end
      if !CBS::STATES_HANDLE_AGI
        for state in @states
          unless CBS::STAMINA_STATES[state].nil? or state == state_id
            remove_state(state) if CBS::STAMINA_STATES[state][2]
          end
        end
      end
    end
  end
end
class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● Rewrote input
  #--------------------------------------------------------------------------
  def input
    if @actions[@action_input_index] == nil
      @actions[@action_input_index] = Game_Action.new(self)
    end
    return @actions[@action_input_index]
  end
end
class Game_Action
  #--------------------------------------------------------------------------
  # ● New Method stamina_cost
  #--------------------------------------------------------------------------
  def stamina_cost
    if @item.is_skill?
      return CBS::SKILL_COST[item.id][0] + CBS::SKILL_COST[item.id][1] if CBS::SKILL_COST[item.id]
      return CBS::SKILL_COST[0][0]
    end
    if @item.is_item?
      return CBS::ITEM_COST[item.id][0] + CBS::ITEM_COST[item.id][1] if CBS::ITEM_COST[item.id]
      return CBS::ITEM_COST[0][0]
    end
    return CBS::MAX_STAMINA
  end
  #--------------------------------------------------------------------------
  # ● New Method stamina_over
  #--------------------------------------------------------------------------
  def stamina_over
    return 0.0 unless @item
    return 0.0 if @target_index == -1
    if @item.is_skill?
      return CBS::SKILL_COST[item.id][1].to_f if CBS::SKILL_COST[item.id]
      return CBS::SKILL_COST[0][1].to_f
    end
    if @item.is_item?
      return CBS::ITEM_COST[item.id][1].to_f if CBS::ITEM_COST[item.id]
      return CBS::ITEM_COST[0][1].to_f
    end
    return 0.0
  end
end

#==============================================================================
# ** DataManager
#==============================================================================
module DataManager
  #--------------------------------------------------------------------------
  # * Set Up New Game
  #--------------------------------------------------------------------------
  def self.setup_new_game
    create_game_objects
    CBS.set_mode(CBS::MODE)
    $game_party.setup_starting_members
    $game_map.setup($data_system.start_map_id)
    $game_player.moveto($data_system.start_x, $data_system.start_y)
    $game_player.refresh
    Graphics.frame_count = 0
  end
  #--------------------------------------------------------------------------
  # * Create Save Contents
  #--------------------------------------------------------------------------
  def self.make_save_contents
    contents = {}
    contents[:system]        = $game_system
    contents[:timer]         = $game_timer
    contents[:message]       = $game_message
    contents[:switches]      = $game_switches
    contents[:variables]     = $game_variables
    contents[:self_switches] = $game_self_switches
    contents[:actors]        = $game_actors
    contents[:party]         = $game_party
    contents[:troop]         = $game_troop
    contents[:map]           = $game_map
    contents[:player]        = $game_player
    contents[:cbs_mod]       = CBS.get_mode
    contents
  end
  #--------------------------------------------------------------------------
  # * Extract Save Contents
  #--------------------------------------------------------------------------
  def self.extract_save_contents(contents)
    $game_system        = contents[:system]
    $game_timer         = contents[:timer]
    $game_message       = contents[:message]
    $game_switches      = contents[:switches]
    $game_variables     = contents[:variables]
    $game_self_switches = contents[:self_switches]
    $game_actors        = contents[:actors]
    $game_party         = contents[:party]
    $game_troop         = contents[:troop]
    $game_map           = contents[:map]
    $game_player        = contents[:player]
    CBS.set_mode(contents[:cbs_mod])
  end
end

La suite ne rentrant pas dans ce message, on se retrouve prochainement pour le prochaine épisode ! (Par prochainement, je veux dire 3 secondes. C'est drôle, c'est de l'humour. Rit.)
DrakeRoxas
DrakeRoxas
Membre

Nombre de messages : 44
Age : 27
Distinction : aucune
Date d'inscription : 23/07/2016

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Ven 19 Aoû 2016 - 15:15


Ensuite, dans le 2e script :
Code:
Ligne 44 tu as :      @atb_gauge_sprite = create_gauge(@battler.stamina_rate, ATB_GAUGE_FORMAT)
Tu ajoutes en dessous :
      @atb_skill_gauge_sprite = create_gauge(@battler.stamina_rate, ATB_SKILL_GAUGE_FORMAT)
Ligne 64 tu as :       @hp_gauge_sprite, @mp_gauge_sprite, @atb_gauge_sprite, @tp_gauge_sprite]
A remplacer par :
      @hp_gauge_sprite, @mp_gauge_sprite, @atb_gauge_sprite, @atb_skill_gauge_sprite, @tp_gauge_sprite]
Ligne 71 tu as :    @atb_gauge_sprite.set(@battler.stamina_rate, true, @battler.stamina_mult) if @atb_gauge_sprite
Tu ajoutes en dessous :
    @atb_skill_gauge_sprite.set(@battler.stamina_over_rate, true) if @atb_skill_gauge_sprite
Enfin, a la fin tu ajoutes :
#==============================================================================
# ■ Window_ActorCommand
#------------------------------------------------------------------------------
#  バトル画面で、アクターの行動を選択するウィンドウです。
#==============================================================================

class Window_ActorCommand < Window_Command
  #--------------------------------------------------------------------------
  # ● [追加]:X 座標をアクターに合わせる
  #--------------------------------------------------------------------------
  def actor_x(actor)
    if !actor
      self.x = 0 - self.width
      return
    end
    ax = $game_party.members_screen_x_nooffset[actor.index] - self.width / 2
    pad = LNX11::STATUS_SIDE_PADDING / 2
    # 画面内に収める
    self.x = [[ax, pad].max, Graphics.width - pad - self.width].min
    self.x += LNX11::ACTOR_COMMAND_OFFSET[:x]
  end
  #--------------------------------------------------------------------------
  # ● [追加]:Y 座標をアクターに合わせる
  #--------------------------------------------------------------------------
  def actor_y(actor)
    if !actor
      self.y = 0 - self.height
      return
    end
    self.y = actor.screen_y_top - self.height
    self.y += LNX11::ACTOR_COMMAND_OFFSET[:y]
  end
  #--------------------------------------------------------------------------
  # ● [追加]:固定 Y 座標
  #--------------------------------------------------------------------------
  def screen_y
    if LNX11::ACTOR_COMMAND_Y_POSITION == 0
      self.y = Graphics.height - self.height + LNX11::ACTOR_COMMAND_OFFSET[:y]
    else
      self.y = LNX11::ACTOR_COMMAND_OFFSET[:y]
    end
  end
  #--------------------------------------------------------------------------
  # ● [エイリアス]:セットアップ
  #--------------------------------------------------------------------------
  def setup(actor)
    # 前のアクターのコマンドを記憶
    @actor.last_actor_command = @list[index] if @actor
    # 元のメソッドを呼ぶ
    lnx11a_setup(actor)
    self.arrows_visible = !LNX11::ACTOR_COMMAND_NOSCROLL
    self.height = window_height
    self.oy = 0
    # アクターコマンドの表示位置で分岐
    case LNX11::ACTOR_COMMAND_POSITION
    when 0
      # アクターの頭上
      actor_x(actor)
      actor_y(actor)
    when 1
      # Y 座標固定
      actor_x(actor)
      screen_y
    when 2
      # XY固定
      self.x = LNX11::ACTOR_COMMAND_OFFSET[:x]
      screen_y
    end
    # 最後に選択したコマンドを選択
    return unless LNX11::LAST_ACTOR_COMMAND and actor
    last_command = @actor.last_actor_command
    if last_command && @list.include?(last_command)
      select(0) #(@list.index(last_command))
    end
  end
end

Enfin pour le dernier script (le LNX11b_skin) tu as plein de config (pour MAIN_SKIN, STATE_SKIN, etc). Tu ajoute cette config dans le tas (en dessous de ATB_GAUGE_FORMAT par exemple) :
Code:

  #--------------------------------------------------------------------------
  # ● ATB SKILL ゲージ
  #--------------------------------------------------------------------------
  ATB_SKILL_GAUGE_FORMAT = {
  # ○ 基本
  :enabled => ATB_GAUGE_FORMAT[:enabled],              # 表示するか?   true = 表示 / false = 非表示
  :bitmap  => "Lnx11b_atbskillgauge", # ゲージのファイル名
  :x_fixed => ATB_GAUGE_FORMAT[:x_fixed],     # X 座標を自動調整しない true = 有効 / false = 無効
  :x => ATB_GAUGE_FORMAT[:x], :y => ATB_GAUGE_FORMAT[:y], :z => ATB_GAUGE_FORMAT[:z]+1,    # XYZ 座標
  # ○ 機能
  :number_link => ATB_GAUGE_FORMAT[:number_link],  # ゲージ量を表示されている表示と一致させる
  :speed      => ATB_GAUGE_FORMAT[:speed],   # ゲージ変化スピード 1.0以上(一致させない場合)  
  :type        => ATB_GAUGE_FORMAT[:type],     # Type de rendu : 0 = Barre horizontale / 1 = Suite d'images / 2 = Barre Verticale
  
    # type => 0 : 横ゲージの設定
    :crisis    => ATB_GAUGE_FORMAT[:crisis],  # ピンチ状態とみなすパーセンテージ
    :s_speed   => ATB_GAUGE_FORMAT[:s_speed],   # サブゲージ変化スピード(pixel per frame)
    
    # type => 1 : セルゲージの設定
    :width     => ATB_GAUGE_FORMAT[:width], :height => ATB_GAUGE_FORMAT[:height], # セルのサイズ :width = 幅 / :height = 高さ
    :pattern   => ATB_GAUGE_FORMAT[:pattern], # パターン数 :auto を指定するとパターン数を自動判定
    :direction => ATB_GAUGE_FORMAT[:direction],     # パターンの方向 0 = 横 / 1 = 縦
  }
Il ne te manque plus que cette image pour les jauges :
Jauge ATB pour LNX Battle Lnx11b16 Lnx11b_atbskillgauge.png

Et normalement le tout est fonctionnel :3
Si jamais il reste des bugs, (parce que normalement c'est fonction, j'ai pas dit "C'est fonctionnel" xD) tu peux toujours demander :p
Nérylis
Nérylis
Membre

Nombre de messages : 612
Age : 31
Localisation : Seine Maritime
Distinction : aucune
Date d'inscription : 23/11/2014

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

le Ven 19 Aoû 2016 - 17:19
Nouveau test effectué :

- Bug avec le statut Stop corrigé, le personnage n'agit plus si sa barre ATB est pleine et qu'il a le statut Stop.

- Pour le switch, le bug est corrigé au niveau du personnage qui récupère les commandes. Mais j'ai constaté que le temps se fige lorsqu'on switch sans arrêt entre les différents personnages, y compris pendant une attaque ennemie. Et si on s'arrête sur le personnage qui est ciblé, les dégâts ne sont pas validés. Ça repart que lorsqu'on passe à un autre personnage ou si on fait agir le personnage ciblé. C'est possible d'améliorer ce point ?
- Un petit détail : quand on appuie sur la touche de switch lorsqu'on arrive sur les messages de fin de combat, on entend le bruit du curseur ou du buzzer. De même lorsqu'on est sur le menu Combattre / S'enfuir / Combat auto. Est-ce qu'on peut éviter ça ?
- Une question aussi : c'est à quelle ligne le son du curseur ? Je mettrai certainement un autre son.
- Autre question : je ne sais pas si c'est dû aux dernières mises à jour mais est-ce que c'est normal d'entendre le bruit du buzzer lorsque j'essaie de valider une action (en appuyant sur la touche Entrée) alors qu'aucune barre ATB n'est pleine ? Sachant que j'ai mis la touche :Z pour le switch qui correspond à la touche D du clavier.

- Pour le menu Combattre / S'enfuir / Combat auto, on peut maintenant revenir à ce menu lorsque aucune barre ATB n'est pleine, sauf lorsqu'on sélectionne S'enfuir une première fois. Quand j'ai validé S'enfuir dès le début du combat, impossible de revenir dans le menu. La tentative de fuite ayant échouée, j'ai pu à ce moment-là revenir dans le menu. Et même si je sélectionne S'enfuir à nouveau, je peux revenir quand je veux dans le menu.
- J'ai toujours le bug qui fait que parfois, je ne vais pas dans le menu mais je reviens sur le personnage quand j'appuie sur la touche X.

- Pour les temps de chargement des skills et des objets, rien à redire. Je n'ai pas trouvé de bug ou de choses bizarres. Les statuts ayant un impact sur la barre ATB modifient bien la jauge secondaire comme demandé. Joli !

Il ne reste donc que quelques bugs à corriger, après on pourra finaliser ce morceau en privé.^^

Bon boulot. Smile
Contenu sponsorisé

Jauge ATB pour LNX Battle Empty Re: Jauge ATB pour LNX Battle

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