Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP] Add-Ons de la Base de Datos usando scripts cortos

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Add-Ons de la Base de Datos usando scripts cortos

Mensaje por Wecoc el 2015-01-21, 15:10

Si necesitáis respuesta a alguna de las preguntas que pondré a continuación, la respuesta es que la forma más sencilla es hacerlo con un pequeño script add-on que tendréis que poner encima de main y configurarlo especialmente para vuestras necesidades. Otros cambios en la Base de Datos pueden requerir scripts más complejos, os dejo los más triviales por lo tanto ninguno requiere créditos.

Puse como nota dentro del script dónde hacer los añadidos. Se puede poner más de un añadido a la vez, poniendo más when debajo (los que se hacen dentro de un when)
Los scripts también son compatibles entre ellos.

Personajes

¿Cómo modifico algo de un actor al conseguir cierto nivel?

Spoiler:
Código:
# Level up / down

class Game_Actor < Game_Battler
  def exp=(exp)
    @exp = [[exp, 9999999].min, 0].max
    while @exp >= @exp_list[@level+1] and @exp_list[@level+1] > 0
      level_up
    end
    while @exp < @exp_list[@level]
      level_down
    end
    @hp = [@hp, self.maxhp].min
    @sp = [@sp, self.maxsp].min
  end
 
  def level_up
    @level += 1
    for j in $data_classes[@class_id].learnings
      if j.level == @level
        learn_skill(j.skill_id)
      end
    end
    # Cambia el 1 por el ID del actor. También puedes usar @class_id.
    if @actor_id == 1
      case @level
      when 5 # Nivel
        # Aquí añades lo que quieras para ese nivel
      end
    end
  end
 
  def level_down
    @level -= 1
    # Puedes hacer lo mismo al bajar nivel aunque no tiene mucho sentido.
  end
end

Habilidades

¿Cómo modifico algo de un actor al aprender cierta habilidad?

Spoiler:
Código:
class Game_Actor < Game_Battler
  def learn_skill(skill_id)
    if skill_id > 0 and not skill_learn?(skill_id)
      @skills.push(skill_id)
      @skills.sort!
      case skill_id
      when 1 # ID de la skill
        # Aquí añades lo que quieras al aprender la habilidad
        # Puede depender de @actor_id o @class_id
      end
    end
  end

  def forget_skill(skill_id)
    if skill_id > 0 and skill_learn?(skill_id)
      @skills.delete(skill_id)
      case skill_id
      when 1 # ID de la skill
        # Aquí añades lo que quieras al desaprender la habilidad
        # Puede depender de @actor_id o @class_id
      end
    end
  end
end

¿Cómo hago que una habilidad otorgue propiedades que las normales no pueden otorgar? *

Spoiler:
Código:
class Game_Battler
  alias wecoc_sedits_skill_effect skill_effect unless $@
  def skill_effect(user, skill)
    wecoc_sedits_skill_effect(user, skill)
    case skill.id
    when 1 # ID de la skill
      # Aquí añades lo que quieras
    end
  end
end

Objetos

¿Cómo hago que un objeto otorgue propiedades que los normales no pueden otorgar? *

Spoiler:
Código:
class Game_Battler
  alias wecoc_sedits_item_effect item_effect unless $@
  def item_effect(item)
    wecoc_sedits_item_effect(item)
    case item.id
    when 1 # ID del objeto
      # Aquí añades lo que quieras
    end
  end
end

Estados

¿Cómo hago que un estado alterado tenga un efecto distinto al de los descritos en la base de datos? *

Spoiler:
Código:
# Ganar un estado alterado

class Game_Battler
  alias wecoc_sedits_add_state add_state unless $@
  def add_state(state_id, force = false)
    old_state = state?(state_id)
    wecoc_sedits_add_state(state_id, force)
    return if old_state == true
    case state_id
    when 1 # ID del estado
      # Aquí añades lo que quieras para ese estado
    end
  end
end

# Perder un estado alterado

class Game_Battler
  alias wecoc_sedits_rem_state remove_state unless $@
  def remove_state(state_id, force = false)
    old_state = state?(state_id)
    wecoc_sedits_rem_state(state_id, force)
    return if old_state == false
    case state_id
    when 1 # ID del estado
      # Aquí añades lo que quieras para ese estado
    end
  end
end

¿Cómo atribuyo un estado invisible? (Es decir que no se muestre que lo tiene)

Spoiler:
Código:
class Game_Battler
  attr_accessor :actor_id
end

class Window_Base < Window
  def make_battler_state_text(battler, width, need_normal)
    brackets_width = self.contents.text_size("[]").width
    text = ""
    for i in battler.states
      # Cambia ese 1 por la ID del estado que quieras
      if i == 1
        next
      end
      # Puedes añadir más aquí.
      # Además puedes usar battler.actor_id y battler.class_id como condiciones
      if $data_states[i].rating >= 1
        if text == ""
          text = $data_states[i].name
        else
          new_text = text + "/" + $data_states[i].name
          text_width = self.contents.text_size(new_text).width
          if text_width > width - brackets_width
            break
          end
          text = new_text
        end
      end
    end
    if text == ""
      if need_normal
        text = "[Normal]"
      end
    else
      text = "[" + text + "]"
    end
    return text
  end
end

Batalla

¿Cómo hago que pase algo distinto cuando un actor o enemigo ataca respecto a los demás?

Spoiler:
Código:
# Atacar

class Game_Battler
  attr_accessor :actor_id
  alias wecoc_sedits_attack_effect attack_effect unless $@
  def attack_effect(attacker)
    wecoc_sedits_attack_effect(attacker)
    return if self.damage == "Miss"
    if attacker.is_a?(Game_Actor)
      case attacker.actor_id
      when 1 # ID del actor que ataca
        # Aquí añades lo que quieras;
        # attacker --> actor
        # self --> enemigo
      end
    else
      case @enemy_id
      when 1 # ID del enemigo que ataca
        # Aquí añades lo que quieras;
        # self --> actor
        # attacker --> enemigo
      end
    end
  end
end

¿Cómo hago que pase algo distinto cuando un actor o enemigo es atacado respecto a los demás?

Spoiler:
Código:
# Ser atacado

class Game_Battler
  alias wecoc_sedits_attack_effectb attack_effect unless $@
  def attack_effect(attacker)
    wecoc_sedits_attack_effectb(attacker)
    return if self.damage == "Miss"
    if self.is_a?(Game_Actor)
      case @actor_id
      when 1 # ID del actor que es atacado
        # Aquí añades lo que quieras;
        # self --> actor
        # attacker --> enemigo
      end
    else
      case @enemy_id
      when 1 # ID del enemigo que es atacado
        # Aquí añades lo que quieras;
        # self --> enemigo
        # attacker --> actor
      end
    end
  end
end

¿Cómo hago que pase algo distinto cuando un actor o enemigo se defiende, huye o no hace nada?

Spoiler:
Código:
# Hacer una acción de batalla (que no sea atacar)

class Scene_Battle
  alias wecoc_sedits_action_result make_basic_action_result unless $@
  def make_basic_action_result
    wecoc_sedits_action_result
    ## 1 --> Defender, 2 --> Huir, 3 --> No hacer nada
    if @active_battler.current_action.basic == 1 ##
      if @active_battler.is_a?(Game_Actor)
        case @actor_id
        when 1 # ID del actor que se defiende, huye o no hace nada
          # Aquí añades lo que quieras
        end
      else
        case @enemy_id
        when 1 # ID del enemigo que se defiende, huye o no hace nada
          # Aquí añades lo que quieras
        end
      end
    end
  end
end

¿Cómo hago que pase algo distinto cuando termina la batalla si un actor o enemigo estan en batalla?

Spoiler:
Código:
# Modificar victoria

class Game_Battler
  attr_accessor :actor_id
  attr_accessor :enemy_id
end

class Scene_Battle
  alias wecoc_sedits_start_phase5 start_phase5 unless $@
  def start_phase5
    wecoc_sedits_start_phase5
    actors = []
    for i in 0...$game_party.actors.size
      actors.push($game_party.actors[i].actor_id)
    end
    if actors.include?(1) # Cambia 1 por el ID de actor que te interese
      unless $game_actors[1].dead? # ¿Solo si el actor está vivo?
        # Aquí añades lo que quieras
      end
    end
    enemies = []
    for i in 0...$game_troop.enemies.size
      enemies.push($game_troop.enemies[i].enemy_id)
    end
    if enemies.include?(1) # Cambia 1 por el ID de enemigo que te interese
      # Aquí añades lo que quieras
    end
  end
end

Armamento / Protectores

¿Cómo modifico algo especial al cambiar el equipamento?

Spoiler:
Código:
# Equip

class Scene_Equip
  def refresh
    @item_window1.visible = (@right_window.index == 0)
    @item_window2.visible = (@right_window.index == 1)
    @item_window3.visible = (@right_window.index == 2)
    @item_window4.visible = (@right_window.index == 3)
    @item_window5.visible = (@right_window.index == 4)
    item1 = @right_window.item
    case @right_window.index
    when 0
      @item_window = @item_window1
    when 1
      @item_window = @item_window2
    when 2
      @item_window = @item_window3
    when 3
      @item_window = @item_window4
    when 4
      @item_window = @item_window5
    end
    if @right_window.active
      @left_window.set_new_parameters(nil, nil, nil)
    end
    if @item_window.active
      item2 = @item_window.item
      last_hp = @actor.hp
      last_sp = @actor.sp
      @actor.safe_equip(@right_window.index, item2 == nil ? 0 : item2.id)
      new_atk = @actor.atk
      new_pdef = @actor.pdef
      new_mdef = @actor.mdef
      @actor.safe_equip(@right_window.index, item1 == nil ? 0 : item1.id)
      @actor.hp = last_hp
      @actor.sp = last_sp
      @left_window.set_new_parameters(new_atk, new_pdef, new_mdef)
    end
  end
end

class Game_Actor < Game_Battler   
  alias wecoc_sedits_equip equip unless $@
  def equip(equip_type, id)
    old_weapon = @weapon_id
    old_armor1 = @armor1_id
    old_armor2 = @armor2_id
    old_armor3 = @armor3_id
    old_armor4 = @armor4_id
    wecoc_sedits_equip(equip_type, id)
    new_weapon = @weapon_id
    new_armor1 = @armor1_id
    new_armor2 = @armor2_id
    new_armor3 = @armor3_id
    new_armor4 = @armor4_id
    # Mira si el arma 1 fue equipada, puedes hacer lo mismo con cada armor
    if new_weapon == 1 and old_weapon != 1 # ID de arma
      # Aquí haces lo que quieras cuando equipes el arma
    end
    # Mira si el arma 1 fue desequipada, puedes hacer lo mismo con cada armor
    if old_weapon == 1 and new_weapon != 1 # ID de arma
      # Aquí haces lo que quieras cuando desequipes el arma
    end
  end
 
  # Equipar sin ejecutar nuevos cambios
  def safe_equip(equip_type, id)
    wecoc_sedits_equip(equip_type, id)
  end
end

* ¿Cómo hago que algo dependa de qué actor lo está usando?

Si quieres que el efecto dependa de qué actor pon lo que tienes que añadir dentro de la siguiente condición:

if self.is_a?(Game_Actor) and @actor_id == 1 # Cambia 1 por el ID de actor

Además puedes hacer lo mismo con la clase:

if self.is_a?(Game_Actor) and @class_id == 1 # Cambia 1 por el ID de clase

Y también con los enemigos:

if self.is_a?(Game_Enemy) and @enemy_id == 1

Eso es todo.


Última edición por Wecoc el 2015-02-01, 14:18, editado 2 veces
avatar
Wecoc
Administrador
Administrador



Créditos 12388

Gracias : 595

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Add-Ons de la Base de Datos usando scripts cortos

Mensaje por Lance Amano el 2015-01-21, 20:35

Una consulta, ¿Es posible crear con el "Ser atacado" addon que el afectado contrataque al atacante con una abilidad en específico? Por ejemplo, que el afectado contraataque todos los ataques mágicos con una abilidad que cause silencio
avatar
Lance Amano
Soñador
Soñador

0/3

Créditos 218

Gracias : 23

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Add-Ons de la Base de Datos usando scripts cortos

Mensaje por natalie_cuxi el 2015-01-21, 23:06

¡Cuanta información! A ver, tengo 2 preguntas:

● El script de "¿Como hago que pase algo distinto cuando termina la batalla si un enemigo o aliado está en la batalla? serviria para hacer que no se termine el juego si aliado X llega a 1pv de vida? Que en realidad ahora que lo pienso el problema seria hacer que llegue a 1pv y salir de la batalla...¿se puede hacer eso con script?

● ¿Vale alguno de estos scripts para hacer que solo un determinado aliado use un determinado grupo de objetos en batalla?

Creo que para ambas dudas sería necesario alguna modificaciones de estos scripts, pero como veo a Wecoc muy motivado con los scripts de este tipo es el momento de preguntar xD

¡Saludos! :D
avatar
natalie_cuxi
Principiante
Principiante

0/3

Créditos 1072

Gracias : 25

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Add-Ons de la Base de Datos usando scripts cortos

Mensaje por Wecoc el 2015-01-22, 00:16

Lance: Entre las cosas que puedes poner que pasen está definir el ataque siguiente del atacado.

Por ejemplo si dentro de lo modificable usaras el siguiente código, la siguiente acción del enemigo sería la definida.
Código:
        @current_action.kind = 1 # 0 --> basic, 1 --> skill
        @current_action.skill_id = 1 # Skill ID

El problema es que alterar el orden de modo que el contraataque sea instantáneo no es tan fácil desde ahí, de hecho ahora mismo no te sé decir cómo hacerlo. Si necesitas eso estoy seguro que hay scripts de contraataque que te irán como anillo al enanillo.

Natalie Cuxi: Tu primera duda no la he entendido. Si lo que quieres es al morir no ir a Game Over, usa la opción "Ejecutar comandos en caso de derrota" al llamar la batalla. Plantea también usar las condiciones de batalla (en Grupos de Enemigos), hay una para el PV del personaje. Si no es nada de eso en todo caso será algo más difícil, se requeriría un script "de verdad" para solucionarlo xD

Tu segunda pregunta también requiere otro script, lo bueno es que sé que hay por ahí. De hecho hice uno hace tiempo que creo que te podría servir, éste: Sistema Momotaro.
avatar
Wecoc
Administrador
Administrador



Créditos 12388

Gracias : 595

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Add-Ons de la Base de Datos usando scripts cortos

Mensaje por natalie_cuxi el 2015-01-22, 01:02

●Pues no había caído en esa opción...¡me sirve! Yo planteaba una batalla en la que el enemigo usara una habilidad devastadora que te deja 1 PV y hubiera algo de diálogo (más bien monólogo, porque los aliados acabarían hechos polvo, pobrecitos xD) y ya se volviera al mapa, pero puedo modificar la situación, hacer una habilidad que los fulmine completamente, termine la batalla, vuelva al mapa y ahí que hablen, y mientras en un evento poner que aumente en 1PV la vida de los aliados...y ya está! El resultado es el mismo y a nivel de juego queda bien ^ ^

● Sistema Momotaro, eh? Apuntado queda, en breve podré volver a makear en serio y probaré como se personaliza, que lo he leido y necesitará toda mi concentracion y mis escasos conocimientos de scriting xD

¡Muchísimas gracias por contestar tan rápidamente! ¡Saludos! :D
avatar
natalie_cuxi
Principiante
Principiante

0/3

Créditos 1072

Gracias : 25

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Add-Ons de la Base de Datos usando scripts cortos

Mensaje por Lance Amano el 2015-01-22, 17:06

@Wecoc escribió:Lance: Entre las cosas que puedes poner que pasen está definir el ataque siguiente del atacado.

Por ejemplo si dentro de lo modificable usaras el siguiente código, la siguiente acción del enemigo sería la definida.
Código:
        @current_action.kind = 1 # 0 --> basic, 1 --> skill
        @current_action.skill_id = 1 # Skill ID


El problema es que alterar el orden de modo que el contraataque sea instantáneo no es tan fácil desde ahí, de hecho ahora mismo no te sé decir cómo hacerlo. Si necesitas eso estoy seguro que hay scripts de contraataque que te irán como anillo al enanillo.


Ya veo, supuse que sería asi.

El problema que he tenido con los scripts de contrataque que he encontrado que es solo permiten contraatacar con ataques normales y no con abilidades predeterminadas. Pero esto ya es tema de otro tópico.
avatar
Lance Amano
Soñador
Soñador

0/3

Créditos 218

Gracias : 23

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Add-Ons de la Base de Datos usando scripts cortos

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


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