¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 3378 miembros registrados.
El último usuario registrado es Max003.

Nuestros miembros han publicado un total de 79742 mensajes en 11241 argumentos.
Navega con Google Chrome
[DESCARGA]

[XP] Item Durability v0.2

 :: RPG Maker :: Scripts

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Item Durability v0.2

Mensaje por Eron el 2013-09-08, 15:51

Este script es un intento que hice y que no conseguí acabar, pero bueno quizá alguien pueda aprovecharlo. Hace que ciertos objetos tengan una duración determinada que se configura al principio del script, por segundos. Una vez ha pasado ese tiempo desde que conseguiste el objeto, se rompe, o caduca o como queráis, y pasa a ser no usable. Hasta ahí funciona el script /=D



Código:
#==============================================================================
# [XP] Item Durability v0.2
#------------------------------------------------------------------------------
# by Eron
#==============================================================================

module RPG
  class Item
    def durability
      case @id
      when 1, 4
        return 120
      when 2, 5
        return 240
      when 3, 7
        return 360
      else
        return 0
      end
    end
  end
end

module RPG
  class Weapon
    def durability
      case @id
      when 1
        return 120
      else
        return 0
      end
    end
  end
end

module RPG
  class Armor
    def durability
      case @id
      when 1
        return 120
      else
        return 0
      end
    end
  end
end


#==============================================================================
# ** Window_Base
#------------------------------------------------------------------------------
#  This class is for all in-game windows.
#==============================================================================

class Window_Base < Window
  def draw_bar(actual_value, max_value, x, y, w, h, color)
    border_color = Color.new(0,0,0,255)
    bar_color = color
    empty_color = Color.new(75,75,75,255)
    bar_width = ((actual_value * 1.0 / max_value) * (w - 2)).to_i
    border = Rect.new(x, y, w, h)
    bar = Rect.new(x + 1, y + 1, bar_width, h - 2)
    empty = Rect.new(x + 1, y + 1, w - 2, h - 2)
    self.contents.fill_rect(border, border_color)
    self.contents.fill_rect(empty, empty_color)
    self.contents.fill_rect(bar, bar_color)
  end
  
  def draw_empty_bar(x, y, w, h)
    border_color = Color.new(0,0,0,255)
    empty_color = Color.new(75,75,75,255)
    border = Rect.new(x, y, w, h)
    empty = Rect.new(x + 1, y + 1, w - 2, h - 2)
    self.contents.fill_rect(border, border_color)
    self.contents.fill_rect(empty, empty_color)
  end
end

#==============================================================================
# ** Game_Party
#------------------------------------------------------------------------------
#  This class handles the party. It includes information on amount of gold
#  and items. Refer to "$game_party" for the instance of this class.
#==============================================================================

class Game_Party
  
  attr_reader :item_data
  attr_reader :item_durability
  attr_reader :item_break
  attr_reader :weapon_data
  attr_reader :weapon_durability
  attr_reader :weapon_break
  attr_reader :armor_data
  attr_reader :armor_durability
  attr_reader :armor_break
  
  alias durability_initialize initialize unless $@
  def initialize
    durability_initialize
    @item_data = []
    @item_durability = []
    @item_break = []
    @weapon_data = []
    @weapon_durability = []
    @weapon_break = []
    @armor_data = []
    @armor_durability = []
    @armor_break = []
  end
  
  def gain_item(*args)
    item_id = args[0]
    case args.size
    when 2
      return if args[1] == 0
      if args[1] > 0
        args[1].times{gain_item(item_id)}
      else
        args[1].abs.times{lose_item(item_id)}
      end
    else
      if item_id > 0
        @items[item_id] = [item_number(item_id) + 1, 99].min
        @item_data.push(item_id)
        @item_data.sort!
        rindex = @item_data.rindex(item_id)
        now = Graphics.frame_count / Graphics.frame_rate
        @item_durability.insert(rindex, now + $data_items[item_id].durability)
        @item_break.insert(rindex, false)
      end
    end
  end
  
  def lose_item(*args)
    item_id = args[0]
    case args.size
    when 2
      return if args[1] == 0
      if args[1] > 0
        args[1].times{lose_item(item_id)}
      else
        args[1].abs.times{gain_item(item_id)}
      end
    else
      if item_id > 0
        @items[item_id] = [item_number(item_id) - 1, 0].max
        index = @item_data.index(item_id)
        @item_data.delete_at(index)
        @item_durability.delete_at(index)
        @item_break.delete_at(index)
      end
    end
  end
  
  def item_keys
    keys = []
    for i in 0...@items.to_a.sort.size
      keys.push @items.to_a.sort[i][0]
    end
    return keys
  end
  
  def item_values
    values = []
    for i in 0...@items.to_a.sort.size
      values.push @items.to_a.sort[i][0]
    end
    return values
  end
  
  def break_item(index)
    @item_break[index] = true
  end
  
  def mend_item(index)
    @item_break[index] = false
  end
  
  def item_broken?(index)
    return @item_break[index]
  end
  
  def item_can_use?(index)
    return false if item_broken?(index)
    item_id = @item_data[index]
    occasion = $data_items[item_id].occasion
    if $game_temp.in_battle
      return (occasion == 0 or occasion == 1)
    end
    return (occasion == 0 or occasion == 2)
  end
    
  def gain_weapon(weapon_id, n, index=0)
    return if n == 0
    if n > 0
      n.times{_gain_weapon(weapon_id, index)}
    else
      n.abs.times{_lose_weapon(weapon_id, index)}
    end
  end
  
  def _gain_weapon(weapon_id, index)
    if weapon_id > 0
      @weapons[weapon_id] = [weapon_number(weapon_id) + 1, 99].min
      @weapon_data.push(weapon_id)
      @weapon_data.sort!
      index += @weapon_data.index(weapon_id)
      now = Graphics.frame_count / Graphics.frame_rate
      @weapon_durability.insert(index, now + $data_weapons[weapon_id].durability)
      @weapon_break.insert(index, false)
    end
  end
  
  def lose_weapon(weapon_id, n, index=0)
    gain_weapon(weapon_id, -n, index)
  end

  def _lose_weapon(weapon_id, index)
    if weapon_id > 0
      @weapons[weapon_id] = [weapon_number(weapon_id) - 1, 0].max
      index += @weapon_data.index(weapon_id)
      @weapon_data.delete_at(index)
      @weapon_durability.delete_at(index)
      @weapon_break.delete_at(index)
    end
  end
  
  def weapon_keys
    keys = []
    for i in 0...@weapons.to_a.sort.size
      keys.push @weapons.to_a.sort[i][0]
    end
    return keys
  end
  
  def weapon_values
    values = []
    for i in 0...@weapons.to_a.sort.size
      values.push @weapons.to_a.sort[i][0]
    end
    return values
  end
  
  def break_weapon(index)
    @weapon_break[index] = true
  end
  
  def mend_weapon(index)
    @weapon_break[index] = false
  end
  
  def weapon_broken?(index)
    return @weapon_break[index]
  end
  
  def gain_armor(*args)
    armor_id = args[0]
    case args.size
    when 2
      return if args[1] == 0
      if args[1] > 0
        args[1].times{gain_armor(armor_id)}
      else
        args[1].abs.times{lose_armor(armor_id)}
      end
    else
      if armor_id > 0
        @armors[armor_id] = [armor_number(armor_id) + 1, 99].min
        @armor_data.push(armor_id)
        @armor_data.sort!
        rindex = @armor_data.rindex(armor_id)
        now = Graphics.frame_count / Graphics.frame_rate
        @armor_durability.insert(rindex, now + $data_armors[armor_id].durability)
        @armor_break.insert(rindex, false)
      end
    end
  end
  
  def lose_armor(*args)
    armor_id = args[0]
    case args.size
    when 2
      return if args[1] == 0
      if args[1] > 0
        args[1].times{lose_armor(armor_id)}
      else
        args[1].abs.times{gain_armor(armor_id)}
      end
    else
      if armor_id > 0
        @armors[armor_id] = [armor_number(armor_id) - 1, 0].max
        index = @armor_data.index(armor_id)
        @armor_data.delete_at(index)
        @armor_durability.delete_at(index)
        @armor_break.delete_at(index)
      end
    end
  end
  
  def armor_keys
    keys = []
    for i in 0...@armors.to_a.sort.size
      keys.push @armors.to_a.sort[i][0]
    end
    return keys
  end
  
  def armor_values
    values = []
    for i in 0...@armors.to_a.sort.size
      values.push @armors.to_a.sort[i][0]
    end
    return values
  end
  
  def break_armor(index)
    @armor_break[index] = true
  end
  
  def mend_armor(index)
    @armor_break[index] = false
  end
  
  def armor_broken?(index)
    return @armor_break[index]
  end
end

#==============================================================================
# ** Window_Item
#------------------------------------------------------------------------------
#  This window displays items in possession on the item and battle screens.
#==============================================================================

class Window_Item < Window_Selectable
  def durable_data_items
    for i in 1...$data_items.size
      if $game_party.item_data.include?(i)
        if $data_items[i].durability > 0
          index = $game_party.item_data.index(i)
          for j in 0...$game_party.item_number(i)
            @data.push($data_items[i])
            @data2.push(1)
            @data3.push($game_party.item_durability[index+j])
          end
        end
      end
    end
  end
  
  def default_data_items
    for i in 1...$data_items.size
      if $game_party.item_data.include?(i)
        if $data_items[i].durability == 0
          for j in 0...$game_party.item_number(i)
            @data.push($data_items[i])
            @data2.push(0)
            @data3.push(0)
          end
        end
      end
    end
  end

  def durable_data_weapons
    for i in 1...$data_weapons.size
      if $game_party.weapon_data.include?(i)
        if $data_weapons[i].durability > 0
          index = $game_party.weapon_data.index(i)
          for j in 0...$game_party.weapon_number(i)
            @data.push($data_weapons[i])
            @data2.push(1)
            @data3.push($game_party.weapon_durability[index+j])
          end
        end
      end
    end
  end
  
  def default_data_weapons
    for i in 1...$data_weapons.size
      if $game_party.weapon_data.include?(i)
        if $data_weapons[i].durability == 0
          for j in 0...$game_party.weapon_number(i)
            @data.push($data_weapons[i])
            @data2.push(0)
            @data3.push(0)
          end
        end
      end
    end
  end
  
  def durable_data_armors
    for i in 1...$data_armors.size
      if $game_party.armor_data.include?(i)
        if $data_armors[i].durability > 0
          index = $game_party.armor_data.index(i)
          for j in 0...$game_party.armor_number(i)
            @data.push($data_armors[i])
            @data2.push(1)
            @data3.push($game_party.armor_durability[index+j])
          end
        end
      end
    end
  end
  
  def default_data_armors
    for i in 1...$data_armors.size
      if $game_party.armor_data.include?(i)
        if $data_armors[i].durability == 0
          for j in 0...$game_party.armor_number(i)
            @data.push($data_armors[i])
            @data2.push(0)
            @data3.push(0)
          end
        end
      end
    end
  end
  
  def refresh
    @total_sec = Graphics.frame_count / Graphics.frame_rate
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    @data2 = []
    @data3 = []
    durable_data_items
    default_data_items
    unless $game_temp.in_battle
      durable_data_weapons
      default_data_weapons
      durable_data_armors
      default_data_armors
    end
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
  
  def draw_item(index)
    item = @data[index]
    draw_durability = @data2[index]
    durability = @data3[index]
    if draw_durability == 1
      d1 = durability - @total_sec
      if item.is_a?(RPG::Item)
        d2 = $data_items[item.id].durability
        $game_party.break_item(index) if d2 - d1 >= durability
      elsif item.is_a?(RPG::Weapon)
        d2 = $data_weapons[item.id].durability
        $game_party.break_weapon(index) if d2 - d1 >= durability
      elsif item.is_a?(RPG::Armor)
        d2 = $data_armors[item.id].durability
        $game_party.break_armor(index) if d2 - d1 >= durability
      end
    end
    self.contents.font.color = disabled_color
    if item.is_a?(RPG::Item)
      if $game_party.item_can_use?(index)
        self.contents.font.color = normal_color
      end
    end
    x = 4 + index % 2 * (288 + 32)
    y = index / 2 * 32
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(item.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    if draw_durability == 1
      if d2 - d1 >= durability
        draw_empty_bar(x + 200, y + 10, 80, 8)
      else
        draw_bar(d1, d2, x + 200, y + 10, 80, 8, Color.new(200,200,10,255))
      end
    end
  end
  
  def update
    super
    if Graphics.frame_count / Graphics.frame_rate != @total_sec
      @total_sec = Graphics.frame_count / Graphics.frame_rate
      refresh
    end
  end
end

#==============================================================================
# ** Scene_Item
#------------------------------------------------------------------------------
#  This class performs item screen processing.
#==============================================================================

class Scene_Item
  def update_item
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Menu.new(0)
      return
    end
    if Input.trigger?(Input::C)
      @item = @item_window.item
      unless @item.is_a?(RPG::Item)
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      unless $game_party.item_can_use?(@item_window.index) ## EDIT
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      if @item.scope >= 3
        @item_window.active = false
        @target_window.x = (@item_window.index + 1) % 2 * 304
        @target_window.visible = true
        @target_window.active = true
        if @item.scope == 4 || @item.scope == 6
          @target_window.index = -1
        else
          @target_window.index = 0
        end
      else
        if @item.common_event_id > 0
          $game_temp.common_event_id = @item.common_event_id
          $game_system.se_play(@item.menu_se)
          if @item.consumable
            $game_party.lose_item(@item.id, 1)
            @item_window.draw_item(@item_window.index)
          end
          $scene = Scene_Map.new
          return
        end
      end
      return
    end
  end
  def update_target
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      unless $game_party.item_can_use?(@item_window.index) ## EDIT
        @item_window.refresh
      end
      @item_window.active = true
      @target_window.visible = false
      @target_window.active = false
      return
    end
    if Input.trigger?(Input::C)
      if $game_party.item_number(@item.id) == 0
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      if @target_window.index == -1
        used = false
        for i in $game_party.actors
          used |= i.item_effect(@item)
        end
      end
      if @target_window.index >= 0
        target = $game_party.actors[@target_window.index]
        used = target.item_effect(@item)
      end
      if used
        $game_system.se_play(@item.menu_se)
        if @item.consumable
          $game_party.lose_item(@item.id, 1)
          @item_window.draw_item(@item_window.index)
        end
        @target_window.refresh
        if $game_party.all_dead?
          $scene = Scene_Gameover.new
          return
        end
        if @item.common_event_id > 0
          $game_temp.common_event_id = @item.common_event_id
          $scene = Scene_Map.new
          return
        end
      end
      unless used
        $game_system.se_play($data_system.buzzer_se)
      end
      return
    end
  end
end

#==============================================================================
# ** Scene_Battle
#------------------------------------------------------------------------------
#  This class performs battle screen processing.
#==============================================================================

class Game_BattleAction
  attr_accessor :item_index
  alias durability_clear clear unless $@
  def clear
    durability_clear
    @item_index = 0
  end
end

class Scene_Battle
  def update_phase3_item_select
    @item_window.visible = true
    @item_window.update
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      end_item_select
      return
    end
    if Input.trigger?(Input::C)
      @item = @item_window.item
      unless $game_party.item_can_use?(@item_window.index)
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      @active_battler.current_action.item_id = @item.id
      @active_battler.current_action.item_index = @item_window.index
      @item_window.visible = false
      if @item.scope == 1
        start_enemy_select
      elsif @item.scope == 3 or @item.scope == 5
        start_actor_select
      else
        end_item_select
        phase3_next_actor
      end
      return
    end
  end

  def make_item_action_result
    @item = $data_items[@active_battler.current_action.item_id]
    @item_index = $data_items[@active_battler.current_action.item_index]
    unless $game_party.item_can_use?(@item_index)
      @phase4_step = 1
      return
    end
    if @item.consumable
      $game_party.lose_item(@item.id, 1)
    end
    @help_window.set_text(@item.name, 1)
    @animation1_id = @item.animation1_id
    @animation2_id = @item.animation2_id
    @common_event_id = @item.common_event_id
    index = @active_battler.current_action.target_index
    target = $game_party.smooth_target_actor(index)
    set_target_battlers(@item.scope)
    for target in @target_battlers
      target.item_effect(@item)
    end
  end
end
Lo que no pude acabar fueron los sistemas a parte para ese script: Scene_Equip, Shop_Sell y Shop_Smith.

El Scene_Equip no se diferencia entre distintas armas iguales con distintos tiempos, así que funciona por defecto. Además, cuando cambias el equipo reinicia el contador.

El Scene_Sell quería que fuera normal pero que el precio del objeto dependiera de cuanto le quedara por romperse, y sobretodo dependiera de si estaba roto o no.

Y el Shop_Smith fuera una espécie de herrería en la que se pudieran arreglar las armas y armaduras dañadas, el precio de arreglo también dependería de su estado.

Si alguien lo acaba genial y si no pues quizá yo pueda acabarlo más adelante cuando sea más experto si es que alguna vez llego a serlo D=

Eron
Soñador
Soñador

0/3

Créditos 1235

Gracias : 40

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Item Durability v0.2

Mensaje por orochii el 2013-09-08, 21:33

El Scene_Equip supongo el bug de que se resetee el contador es porque, al equiparse un objeto, se realiza un add_item/remove_item. Añade el objeto que se desequipa al inventario (si lo hay), y remueve el que se ha equipado. Hay que revisar el cómo está manejando eso, y que no sea por IDs como es lo estándar sino como instancias de objetos por separado, para poder guardar esas propiedades, o como lo haces que son arrays separados de valores actuales. Lo bueno de las instancias es que daría para mejorar armas y tal en el smith directamente xD, y aparte se siente poco más ordenado .-. . Hay una complicación eso sí con la database, pero es hacer algo parecido a como se construyen los héroes. Sacan muchas cosas del database, y luego aplican un ajuste, como el dex_plus y tal.

Eso también mejoraría en teoría lo de la venta, para que cada precio de cada objeto se calcule de acuerdo a su valor de durabilidad. Y bueno, el Shop_Smith sería cuestión de que recibiera el objeto a alterar, y los cambios. Y entonces hiciera algo tipo:
Código:
def smithDoChange(obj,changes,dur_plus)
  #obj es un RPG::Item/Armor/Weapon
  #changes sería un hash
  changes.each_pair{|property,value|
    obj.method(property)+=value
  }
  #No necesariamente el objeto se restaurará al máximo
  #Pero si se quisiera, se pone algo como 9999999999
  obj.durability = [obj.durability+dur_plus,obj.max_durability(obj.id)].min
end
En fin, está interesante eso =BBBBB, deberíamos tener este tema para una siguiente edición de las crónicas comunitarias de la armada scripteriana (? después de los hextiles).

Salut,
Orochii Zouveleki

orochii
Caballero Shiro
Caballero Shiro

0/3

Créditos 6045

Gracias : 266

http://drekirokr.weebly.com/

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


 :: RPG Maker :: Scripts

Permisos de este foro:
No puedes responder a temas en este foro.