¡Bienvenido a Universo Maker!
¿Es esta la primera vez que visitas el foro? Si es así te recomendamos que te registres para tener completo acceso a todas las áreas y secciones del foro, así también podrás participar activamente en la comunidad. Si ya tienes una cuenta, conectate cuanto antes.
Iniciar Sesión Registrarme

No estás conectado. Conéctate o registrate

Ver el tema anterior Ver el tema siguiente Ir abajo Mensaje [Página 1 de 1.]

reyerta

avatar
¡Hola! llevo un tiempo dándole mano a el modo de combate ZTBS (que publico Razor aquí)
pero me he encontrado con una dificultad que mi pocas ganas de modificar no han podido solucionar y es:

Quiero que cuando un personaje (poco importa si aliado o enemigo; puesto que en realidad me gustaría para ambos) pierda todos sus HP no desaparezca del mapa, si no que se cambie a otra animación del personaje "caido". Dejo aquí la ubicación donde se define que le pasa al personaje...

Código:
#==============================================================================
# Zenith Tactical Battle System
# Cursor Interpreter
#------------------------------------------------------------------------------
# Cursor Commands and Control
#==============================================================================
class Interpreter
  #--------------------------------------------------------------------------
  # ● Define cursor to move a event by ID
  #--------------------------------------------------------------------------
  def cursor_moveto_event(event_id)
    if $game_system.in_tactics
      event = $game_map.events[event_id]
      $game_player.moveto(event.x, event.y)
      # Get the cursor to the battler
      $scene.get_cursor_battler
      # Battler acts with cursor using info
      $scene.set_battler_info
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● Define cursor to move a position using x and y axis
  #--------------------------------------------------------------------------
  def cursor_moveto_position(x, y)
    if $game_system.in_tactics
      $game_player.moveto(x, y)
      # Get the cursor to the battler
      $scene.get_cursor_battler
      # Battler acts with cursor using info
      $scene.set_battler_info
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● Deal damage to battlers via events by commands
  #--------------------------------------------------------------------------
  def add_damage(event_id, damage)
    # In tactic battle battlers become events
    if $game_system.tactics_actors.keys.include?(event_id)
      event = $game_map.events[event_id]
      battler = $game_system.tactics_actors[event_id]
      # Event damage becomes battler damage
      battler.hp -= damage
      event.damage = damage
      event.damage_pop = true
      if $game_player.x == event.x and $game_player.y == event.y
        $scene.refresh_battler_info
      end
      # Battler dissapear upon defeat
      $scene.set_erase_battler
      # Event gains battlers powers and statistics
      elsif $game_system.tactics_enemies.keys.include?(event_id)
      event = $game_map.events[event_id]
      battler = $game_system.tactics_enemies[event_id]
      # Event damage becomes battler damage
      battler.hp -= damage
      event.damage = damage
      event.damage_pop = true
      if $game_player.x == event.x and $game_player.y == event.y and
        !battler.dead?
        $scene.refresh_battler_info
      end
      # Battler dissapear upon defeat
      $scene.set_erase_battler
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● Add state to event actor
  #--------------------------------------------------------------------------
  def add_state(event_id, state_id)
    # In tactic battle battlers become events
    if $game_system.tactics_actors.keys.include?(event_id)
      event = $game_map.events[event_id]
      battler = $game_system.tactics_actors[event_id]
      # Battler inflicted states become actor inflicted states
      battler.add_state(state_id)
      if $game_player.x == event.x and $game_player.y == event.y
        $scene.refresh_battler_info
      end
      # Battler dissapear upon defeat
      $scene.set_erase_battler
    #  In tactic battle enemy battlers become events
    elsif $game_system.tactics_enemies.keys.include?(event_id)
      event = $game_map.events[event_id]
      battler = $game_system.tactics_enemies[event_id]
      # Battler inflicted states become actor inflicted states
      battler.add_state(state_id)
      if $game_player.x == event.x and $game_player.y == event.y
        $scene.refresh_battler_info
      end
      # Battler dissapear upon defeat
      $scene.set_erase_battler
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● Remove State
  #--------------------------------------------------------------------------
  def remove_state(event_id, state_id)
    # In tactic battle battlers become events
    if $game_system.tactics_actors.keys.include?(event_id)
      event = $game_map.events[event_id]
      battler = $game_system.tactics_actors[event_id]
      # When battler state is removed so is the actors
      battler.remove_state(state_id)
      if $game_player.x == event.x and $game_player.y == event.y
        $scene.refresh_battler_info
      end
      # Battler dissapear upon defeat
      $scene.set_erase_battler
    # When battlers are subdue so do the events
    elsif $game_system.tactics_dead_actors.keys.include?(event_id)
      event = $game_map.events[event_id]
      battler = $game_system.tactics_dead_actors[event_id]
      # When the KO state is removed they are revived on the spot chosen
      battler.remove_state(state_id)
      if $game_player.x == event.x and $game_player.y == event.y
        $scene.refresh_battler_info
      end
      # Battler dissapear upon defeat
      $scene.set_erase_battler
    # In tactic battle battlers become events
    elsif $game_system.tactics_enemies.keys.include?(event_id)
      event = $game_map.events[event_id]
      battler = $game_system.tactics_enemies[event_id]
      # When the KO state is removed they are revived on the spot chosen
      battler.remove_state(state_id)
      if $game_player.x == event.x and $game_player.y == event.y
        $scene.refresh_battler_info
      end
      # Battler dissapear upon defeat
      $scene.set_erase_battler
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● Transform Event to Actor
  #--------------------------------------------------------------------------
  def transform_to_actor(event_id, actor_id)
    # If map event is erased return
    if $game_map.events[event_id].erased
      return
    end
    # In tactic battle battlers become events
    if $game_system.tactics_enemies.keys.include?(event_id)
      $game_system.tactics_enemies.delete(event_id)
    end
    if $game_actors[actor_id].dead?
      $game_map.events[event_id].erase
      # Dead actor is still classified as game actor
      $game_system.tactics_dead_actors[event_id] = $game_actors[actor_id]
    else
      # Game actors are still game actors
      $game_system.tactics_actors[event_id] = $game_actors[actor_id]
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● Transform Event to Enemy Actor
  #--------------------------------------------------------------------------
  def transform_to_enemy(event_id, enemy_id)
    # If map event is erased return
    if $game_map.events[event_id].erased
      return
    end
    # If dead actor is included as event return
    if $game_system.tactics_dead_actors.keys.include?(event_id)
      return
    end
    # If tactics actor is included, delete.
    if $game_system.tactics_actors.keys.include?(event_id)
      $game_system.tactics_actors.delete(event_id)
    end
    # Create a new Enemy refer to database enemy id
    $game_system.tactics_enemies[event_id] = Game_Enemy.new(0, enemy_id)
    return true
  end
end

    end


Tengo claro, que el problema ocurre donde siempre aparece:
Código:
$scene.set_erase_battler
pero no se que debería ponerle si solo quiero que cambie el personaje por uno "caido".

Agradezco cualquier ayuda por pequeña que sea...

Tomate

avatar
Si esto fuera Game Maker, normalmente bastaría con reemplazar el código "$scene.set_erase_battler" por "spr_change_"nombre del sprite"...pero Ruby es mucho más difícil y la ausencia de verdaderos tutoriales (todos sólo te enseñan a hacer ventanas) me desalienta a aprender.

Lo siento mucho, reye, pero al parecer es algo que sólo se solucionará mediante códigos del script reemplazando la orden de borrar el sprite presente y reemplazarlo por otro caído. Por lo tanto, no puedo ayudarte.

Los siento mucho...realmente desearía comprender algo de todo esto, pero va más allá de mis capacidades. Y para el colmo, el autor abondonó este proyecto.

...¡Espera! ¿Y si intentas contactarlo? Si no te manejas bien con el inglés, yo puedo hacerlo por ti. Quizás se anime a guiarnos. Ópalo Contento



youkai

avatar
Segun lei el script usa eventos para simular los personajes de la batalla en el mapa asi que todos los characters son instancias de esa clase. Entonces dado el caso(y si mi memoria no falla) podemos decir lo siguiente:

Bueno desgraciadamente aqui no tengo nada para confirmar mi teoria pero si bien recuerdo en $game_event existe una variable(que por defecto no puedes alterar su valor fuera de la clase) en la cual se guarda el grafico del evento. Su nombre es character_name. Habria que hacer algo para poder cambiarle el valor a esa variable(aunque existe un metodo para eso pero no recuerdo cual era...) De todas formas cuando llegue a casa hoy reviso eso junto al sistema de batalla y te comento una respuesta mas certera. Por lo menos ni es imposible, ni es muy complicado de hacer.(lo que quiza haya que ajustar algunas cosas...)
Saludos,
¥oukai

reyerta

avatar
Chicos, lamento no haberles podido contestar, estaba lejos de una computadora hahahaha....

@
Tomate: Si, algo así tenia pensado, pero no tengo ni idea si el autor aun continua online o mas aun si todavía esta trabajando en este proyecto. Trataré de buscar alguna información *va corriendo a preguntarle a Razor hahaha*

@Youkai: No entiendo bien tu comentario... Creo haber entendido que entonces, ¿tendríamos que llamar a el character_name? Pero lo cierto, es que me has dado una pista súper importante, trataré tambien de ver que puedo conseguir mediante eso... Cualquier cosa que se te ocurra coméntamela pilis! me ayudaría full...

Tomate

avatar
¿Alguien conoce el blog del autor? Lo estuve buscando en Google y no consigo encontrarlo para hacer el contacto.

Si no encontramos la solución, temo que deberás dejar las cosas tal como están...o bien, buscar otro script de batalla táctica. Lo siento, reyerta.

Opalo Triste



Reputación del mensaje :100% (1 voto)

reyerta

avatar
Hola, como creo que todo en esta vida es a razón de esfuerzos... He descubierto, un modo de cambiar la animación por script, sucede que tal y como decía Youkai, el secreto se encuentra en Game_event; así que lo comentaré:

Código:
#--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    # Initialize local variable: new_page
    new_page = nil
    # If not temporarily erased
    unless @erased
      # Check in order of large event pages
      for page in @event.pages.reverse
        # Make possible referrence for event condition with c
        c = page.condition
        # Switch 1 condition confirmation
        if c.switch1_valid
         ---- if $game_switches[c.switch1_id] == false ----
            next
          end
        end

Si cambio el valor
Código:
if $game_switches[c.switch1_id] == false
a true los personajes que tengan 2 paginas (es decir funcionen con interruptores)cambiarán a la animación de la 2da página... Así puedo generar una animación del personaje cuando ha perdido.

Pero tengo algunos inconvenientes:
1. Para que esto funcione, el personaje debe estar vivo (es decir con HP).
2. Todavía puedo controlarlo si tiene HP.
3. No tengo control de cuando va a hacer el cambio de animación.
4. Si le pegan se muere y desaparece...

¿alguien se le ocurre como puedo llamar ese script? Pues tal vez si consigo llamarle cuando mi pj quede con HP= 0 pueda conseguir que no desaparezca...

PD: Si no se entiende, diganmelo y monto la versión que he modificado (hay muchas cosas que he mejorado, corregido, adaptado, apuntando a mis necesidades, así que lo verán diferente) y así pueden probar lo que trato de decir...

PD2: Gracias Tomate, no sabes cuanto me alegra saber que te has dado a la tarea de colaborarme; pero insisto en usar este sistema de batalla, las razones, me gusta mucho; es distinto, cumple con mis deseos y representa un reto... Tal vez sea terquedad mía, pero deseo mucho usarle cueste lo que cueste, además; aun no he hecho un aporte guay a la comunidad y desearía que este sistema de batalla fuese mi gran aporte Ópalo Sonriente

Tomate

avatar
Lo que pides se entiende perfectamente, el problema es que yo no dispongo de los conocimientos necesarios para ayudarte. Ópalo Triste

He venido a comentar para darte un punto de reputación por tu gran actitud de no rendirte y conseguir avanzar. A demás, de todo el empeño que estás poniendo para aportar con este script tan complicado a la comunidad. ¡¡Gracias reye!! Espero que algún scripter pueda darte una mano.

Ópalo Reputación



youkai

avatar
@reyerta escribió:Hola, como creo que todo en esta vida es a razón de esfuerzos... He descubierto, un modo de cambiar la animación por script, sucede que tal y como decía Youkai, el secreto se encuentra en Game_event; así que lo comentaré:

Código:
#--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    # Initialize local variable: new_page
    new_page = nil
    # If not temporarily erased
    unless @erased
      # Check in order of large event pages
      for page in @event.pages.reverse
        # Make possible referrence for event condition with c
        c = page.condition
        # Switch 1 condition confirmation
        if c.switch1_valid
         ---- if $game_switches[c.switch1_id] == false ----
            next
          end
        end

Si cambio el valor
Código:
if $game_switches[c.switch1_id] == false
a true los personajes que tengan 2 paginas (es decir funcionen con interruptores)cambiarán a la animación de la 2da página... Así puedo generar una animación del personaje cuando ha perdido.

Pero tengo algunos inconvenientes:
1. Para que esto funcione, el personaje debe estar vivo (es decir con HP).
2. Todavía puedo controlarlo si tiene HP.
3. No tengo control de cuando va a hacer el cambio de animación.
4. Si le pegan se muere y desaparece...

¿alguien se le ocurre como puedo llamar ese script? Pues tal vez si consigo llamarle cuando mi pj quede con HP= 0 pueda conseguir que no desaparezca...

PD: Si no se entiende, diganmelo y monto la versión que he modificado (hay muchas cosas que he mejorado, corregido, adaptado, apuntando a mis necesidades, así que lo verán diferente) y así pueden probar lo que trato de decir...

PD2: Gracias Tomate, no sabes cuanto me alegra saber que te has dado a la tarea de colaborarme; pero insisto en usar este sistema de batalla, las razones, me gusta mucho; es distinto, cumple con mis deseos y representa un reto... Tal vez sea terquedad mía, pero deseo mucho usarle cueste lo que cueste, además; aun no he hecho un aporte guay a la comunidad y desearía que este sistema de batalla fuese mi gran aporte Ópalo Sonriente
Es una pena que cuando mas ganas tengo de hacer algo en el maker nunca lo tenga cerca...estoy apunto de ponerle el maker hasta a mi @*)$ movil...si a mi movil!! xDDD
Reye descargue el script para echarle un ojo completo cuando llegue a mi casa. Eso que quieres hacer no es tan complicado pero quiero darte una solucion elegante Ópalo Sonriente De todas formas, para resolver de momento tu problema...quiza si borras la linea de la que hablabas en el post inicial($scene.set_erase_battler) ya el player no va a desaparecer, el problema es que no se si te deje controlarlo... Haz esa prueba si quieres, de todas formas hoy por la tarde voy a darte una mejor solucion para eso.
Saludos

reyerta

avatar
Hola Youkai!!! muchas gracias por estar presto a ayudarme... Y creo que lo que expones podría servir, ¿pero el juego no se bloquearía? digo, a la final se debería hacer esa orden ¿no? y pues si no ocurre, supongo que el juego se vería afectado...

Mira que me he puesto a editar lineas al garrete y ya me da lag el inicio del juego...

De todas formas, muchas gracias; trataré de comprobar si lo que me sugieres funciona y estaré comentándote... Lastimosamente, no podré hacerlo si no hasta la noche...

youkai

avatar
No se si se queden depues del combate si no los borras en ese momento. No creo que queden pero uno nunca sabe... No he tenido la oportunida de leer mas que ese fracmento de codigo que publicaste entonces si te digo te miento xD Luego doy una idea mas correcta como solucion al problema...en cuanto llegue a algun lugar con maker xD
Saludos

reyerta

avatar
Malas noticias... No sirvió. Creí mucho que funcionaría, pero no... Me puse a borrar todas las partes en donde salía ese código y pues apenas le bajan la vida a mi personaje a 0 se desaparece...

Sinceramente ya no se me ocurre que puedo hacer. Pero trataré de pensar un poco mas haber si consigo un nuevo método...

De todas formas, sigo dándote las gracias Youkai, tus consejos siempre me muestran una nueva solución y espero que este no sea la excepción.

Reputación del mensaje :100% (1 voto)

youkai

avatar
Mas que un consejo o una idea prefiero darte de una vez la solucion xD
Código:
class Game_Event < Game_Character
  attr_accessor  :pages
  alias events_initialize initialize
  def initialize(map_id, event)
    @pages = event.pages
    events_initialize(map_id, event)
  end
end

class Scene_Map
  #--------------------------------------------------------------------------
  # ● 勝敗判定
  #--------------------------------------------------------------------------
  def judge
    # 消去対象を消す
    if @erase != nil
      for battler in @erase
    #    if battler.invisible
          #battler.erase
          if $game_system.tactics_actors.keys.include?(battler.id)
            $game_system.tactics_dead_actors[battler.id] = $game_system.tactics_actors[battler.id]
            $game_system.tactics_actors.delete(battler.id)
          else
            $game_system.tactics_enemies.delete(battler.id)
          end
          @battler = nil if @battler == battler
    #  end
      end
      @erase = nil
    end
    # エネミー全滅で勝利
    if $game_system.in_tactics and $game_system.tactics_enemies.size == 0
      start_phase3(0)
      return true
    end
    # アクター全滅で敗北
    if $game_system.in_tactics and $game_system.tactics_actors.size == 0
      start_phase3(1)
      return true
    end
    return false
  end

  #--------------------------------------------------------------------------
  # ● 消去バトラーセット
  #--------------------------------------------------------------------------
  def set_erase_battler
    @erase = []
    common_event = []
    for i in $game_system.tactics_actors.keys
      battler = $game_system.tactics_actors[i]
      # 戦闘不能か?
      if battler.dead?
        # コラプス
        # $game_map.events[i].collapse = 1
        # 消去対象に入れる
          @erase.push($game_map.events[i])
        # 撃破イベントセット
          $game_map.events[i].pages[$game_map.events[i].pages.size - 1].condition.self_switch_valid = false
          $game_map.events[i].refresh
        if defined? beat_event
          common_event += set_beat_event(i)
        end
      end
    end
    for i in $game_system.tactics_enemies.keys
      battler = $game_system.tactics_enemies[i]
      # 戦闘不能か?
      if battler.dead?
        # コラプス
        # $game_map.events[i].collapse = 2
        # 消去対象に入れる
          @erase.push($game_map.events[i])
        # 撃破イベントセット
          $game_map.events[i].pages[$game_map.events[i].pages.size - 1].condition.self_switch_valid = false
          $game_map.events[i].refresh
        if defined? beat_event
          common_event += set_beat_event(i)
        end
      end
    end
    # 撃破イベント実行
    if common_event.size > 0
      $game_system.map_interpreter.setup(common_event, 0)
    end
  end
 
  #--------------------------------------------------------------------------
  # ● アクター復活
  #--------------------------------------------------------------------------
  def battler_revival
    for i in $game_system.tactics_dead_actors.keys
      battler = $game_system.tactics_dead_actors[i]
      # 戦闘不能か?
      if !battler.dead?
        $game_map.events[i].cancel_erase
        $game_system.tactics_actors[i] = $game_system.tactics_dead_actors[i]
        $game_system.tactics_dead_actors.delete(i)
        $game_map.events[i].pages[$game_map.events[i].pages.size - 1].condition.self_switch_valid = true
        $game_map.events[i].refresh
      end
    end
  end
end
Tiene un pequeño bug que no encuentro santa forma de solucionarlo...cuando atacas un evento, este se vira a donde vino el ataque y no existe manera de que mira a otra direccion...lo que significa que si usas un mismo chara para varios characters muertos(como los que trae el maker por defecto), el muerto va a variar segun a donde estaba mirando al morir...sin contar que va a hacer 2 o 3 cambios con otros muertos antes de decidirse en como lucir al morir xDDDD
No he tenido mucho tiempo para leer todo el codigo en busca de donde es que se maneja esa parte de que cuando te ataquen te vires y te claves como una estaca en esa posicion...
Por lo menos ahi lo principal esta resuleto, si pudieras decirme en que parte esta lo que el personaje se vira con cada ataque al momento te doy(o debo darte) la solucion al bug.

Para que funcione bien tienes que crear una ultima pagina (y ahi configurar todo lo que quieras del muerto) en cada evento y asignarle un interruptor local. Dale cualquier interruptor local que sepas que nunca se va a activar en ese evento Ópalo Sonrisa Grande De lo demas se encarga el codigo Ópalo Guiño
De todas formas prueba bien todo: morir, renacer, etc... por si se me paso algo.
Saludos

reyerta

avatar
No sabes cuanto te lo agradezco Youkai!!!! me servirá bastante, aun no he podido ver el bug (pues no he llegado a casa) pero se que viniendo de ti será bastante bueno. ¡Muchas gracias nuevamente! y como no tengo otra forma de pagarte este inmenso favor, ten +1 Rep!

Contenido patrocinado


Ver el tema anterior Ver el tema siguiente Volver arriba  Mensaje [Página 1 de 1.]

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