查看: 2586|回复: 4

[已经过期] VX有ARPG战斗系统吗??

[复制链接]
梦石
0
星屑
60
在线时间
56 小时
注册时间
2012-12-23
回帖
58
发表于 2013-1-31 12:11:58 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
我弄到一个VX的ARPG战斗系统,但是我不知道怎么攻击怪,怪也不会攻击我
万分蛋疼哇
我吧那个系统的脚本发出来

第一段
[pre lang="ruby" line="1"]#===================================

# Vlad ABS

#===================================

#--------------------------------------------------------------

# Credits to Vlad

#--------------------------------------------------------------

# 創造一個敵人(事件),在事件中加上這些註釋:

# Enemy ID - 在數據庫中敵人的ID

# Die X - X為 1 / 2 ( 1:死後删除敵人   2:不死之身 )

# Follow - 設定是否跟隨敵人

#--------------------------------------------------------------

# 自定義項目

#--------------------------------------------------------------

#--------------------------------------------------------------

# 武器攻撃鍵, 不要改變 [正常對應鍵: A]

Attack_Button = Input::X

#--------------------------------------------------------------

# 技能攻撃鍵, 不要改變 [正常對應鍵: S]  <--也是技能畫面的技能記憶鍵

Skill_Button = {Input::Y => 0}

#--------------------------------------------------------------

# 升級動畫ID (對應數據庫) :

LevelUp_Ani = 40

#--------------------------------------------------------------

# 攻擊動畫, 複製 Enemy_atk_ani[2] = 13

# 修改敵人ID 2 , 還有動畫ID 13

# 範例:25敵人使用24動畫作攻擊動畫 Enemy_atk_ani[25] = 24

Enemy_atk_ani = {}

Enemy_atk_ani[2] = 8

#--------------------------------------------------------------


#--------------------------------------------------------------

# Game Character

#--------------------------------------------------------------

class Game_Character

  attr_accessor :hp

  attr_accessor :mp

  attr_accessor :damage

  attr_accessor :critical

  attr_accessor :wait_ataque

  attr_accessor :die

  alias vlad_abs_gchar_initialize initialize

  def initialize

    @hp = 0

    @mp = 0

    @die = 0

    $skill_for_use = 0

    @wait_ataque = 0

    @damage = nil

    @critical = false

    vlad_abs_gchar_initialize

  end  

  def recebe_atk(attacker)

    attacker_status = (attacker.is_a?(Game_Event) ? attacker.enemy_status : $game_actors[1])

    receptor_status = (self.is_a?(Game_Event) ? self.enemy_status : $game_actors[1])

    self.damage = attacker_status.atk - receptor_status.def

    self.damage *= attacker_status.elements_max_rate(attacker_status.element_set)

    self.damage /= 100

    self.damage = 0 if self.damage < 0

    self.critical = (rand(100) < 4)

    self.damage *= 2 if self.critical

    if self.is_a?(Game_Player)

    $game_actors[1].hp -= self.damage

    if $game_actors[1].hp <= 0

      $scene = Scene_Gameover.new

    end

    elsif self.is_a?(Game_Event)

      self.hp -= self.damage

      if self.hp <= 0

        self.animation_id = 88

          $game_actors[1].gain_exp(enemy_status.exp, 1)

          if @die == 1

          self.erase

        elsif @die == 2

          key = [$game_map.map_id, self.id, "A"]

          $game_self_switches[key] = true

          end

          refresh

        end

    end

  end

   def recebe_skl(attacker)

     for key in Skill_Button.keys

    sklid = Skill_Button[key]

    attacker_status = (attacker.is_a?(Game_Event) ? attacker.enemy_status : $game_actors[1])

    receptor_status = (self.is_a?(Game_Event) ? self.enemy_status : $game_actors[1])

    self.damage = $data_skills[sklid].atk_f - receptor_status.def

    self.damage *= attacker_status.elements_max_rate(attacker_status.element_set)

    self.damage /= 100

    self.damage = 0 if self.damage < 0

    self.critical = (rand(100) < 4)

    self.damage *= 2 if self.critical

    attacker_status.mp -= $data_skills[sklid].mp_cost

    if self.is_a?(Game_Player)

    $game_actors[1].hp -= self.damage

    $scene = Scene_Gameover.new if $game_actors[1].hp <= 0

    elsif self.is_a?(Game_Event)

      self.hp -= self.damage

      if self.hp <= 0

          $game_actors[1].gain_exp(enemy_status.exp, 1)

          if @die == 1

          self.erase

        elsif @die == 2

          key = [$game_map.map_id, self.id, "A"]

          $game_self_switches[key] = true

          end

          refresh

        end

    end

  end

end

  def follow_hero(dx, dy)

        sx = @x - dx

        sy = @y - dy

        if sx == 0 and sy == 0

          return

        end

        abs_sx = sx.abs

        abs_sy = sy.abs

        if abs_sx == 0

          sy > 0 ? move_up : move_down

          if not moving? and sx != 0

            sx > 0 ? move_left : move_right

          end

          return

        elsif abs_sy == 0

          sx > 0 ? move_left : move_right

          if not moving? and sy != 0

            sy > 0 ? move_up : move_down

          end

          return

        end

        if abs_sx == abs_sy

          rand(2) == 0 ? abs_sx += 1 : abs_sy += 1

        end

        if abs_sx > abs_sy

          sx > 0 ? move_left : move_right

          if not moving? and sy != 0

            sy > 0 ? move_up : move_down

          end

        else

          sy > 0 ? move_up : move_down

          if not moving? and sx != 0

            sx > 0 ? move_left : move_right

          end

        end

      end

      def raio(dx, dy)

        ax = (@x - dx) ** 2

        ay = (@y - dy) ** 2

        return Math.sqrt(ax + ay)

      end

end


#--------------------------------------------------------------

# Game Event

#--------------------------------------------------------------

class Game_Event < Game_Character

  attr_reader :inimigo

  attr_reader :enemy_status

  alias vlad_abs_gevent_initialize initialize

  alias vlad_abs_gevent_update update

  alias vlad_abs_gevent_refresh refresh

  def initialize(map_id, event)

    @inimigo = false

    @automove = false

    vlad_abs_gevent_initialize(map_id, event)

  end

  def check_com(comentario)

    return false if @list.nil? or @list.size <= 0
    for item in @list

      if item.code == 108 or item.code == 408

        if item.parameters[0].downcase.include?(comentario.downcase)

          return true

        end

      end

    end

  end

  def check_comment(comentario)

    com = comentario.downcase

    return 0 if @list.nil? or @list.size <= 0
    for item in @list

      if item.code == 108 or item.code == 408

        if item.parameters[0].downcase =~ /#{com}[ ]?(\d+)?/

          return $1.to_i

        end

      end

    end

    return 0

  end

  def update

    vlad_abs_gevent_update

    if @inimigo

      new_x = (@x + (@direction == 4 ? -1 : @direction == 6 ? 1 : 0))

      new_y = (@y + (@direction == 8 ? -1 : @direction == 2 ? 1 : 0))

      if self.wait_ataque > 0

        self.wait_ataque -= 1

      elsif $game_player.x == new_x and $game_player.y == new_y

         $game_player.recebe_atk(self)

         $game_player.animation_id = self.enemy_atk_animation_id

         $game_player.jump(0,0)

        self.wait_ataque = 60

      end

    end

     if @automove

          unless moving?

            self.follow_hero($game_player.x, $game_player.y)

          end

        end

  end

  def refresh

    vlad_abs_gevent_refresh

    @inimigo = false

    @enemy_id = check_comment("Enemy")

    @automove = true if check_com("Follow") == true

    @die = check_comment("Die")

    if @enemy_id > 0

      @inimigo = true

      @enemy_status = Game_Enemy.new(@enemy_id, @enemy_id)

            self.hp = @enemy_status.maxhp

            self.mp = @enemy_status.maxmp

    end

  end

  def enemy_atk_animation_id

    if Enemy_atk_ani[@enemy_id]

    return (@enemy_status.nil? ? 0 : Enemy_atk_ani[@enemy_id])

  else

    return (@enemy_status.nil? ? 0 : 1)

  end

  end

  def Enemy_atk_ani

    return Enemy_atk_ani

  end

end


#--------------------------------------------------------------

# Game Player

#--------------------------------------------------------------

class Game_Player < Game_Character

  alias vlad_abs_gplayer_update update

  alias vlad_abs_gplayer_refresh refresh

  def update

    vlad_abs_gplayer_update

    if self.wait_ataque > 0

      self.wait_ataque -= 1

    end

  def refresh

    vlad_abs_gplayer_refresh

    self.hp = $game_actors[1].hp

    self.mp = $game_actors[1].mp

  end

    if Input.trigger?(Attack_Button) and self.wait_ataque <= 0

      new_x = (@x + ($game_player.direction == 4 ? -1 : $game_player.direction == 6 ? 1 : 0))

      new_y = (@y + ($game_player.direction == 8 ? -1 : $game_player.direction == 2 ? 1 : 0))

      for event in $game_map.events.values

        if event.inimigo

          if event.x == new_x and event.y == new_y

            event.recebe_atk(self)

            event.animation_id = self.player_atk_animation_id

            event.jump(0,0)

            self.wait_ataque = 30

            break

          end

        end

      end

    end

    for key in Skill_Button.keys

    if Input.trigger?(key) and Skill_Button[key] != nil and Skill_Button[key] != 0 and $game_actors[1].mp >= $data_skills[Skill_Button[key]].mp_cost and self.wait_ataque <= 0

      new_x = (@x + ($game_player.direction == 4 ? -1 : $game_player.direction == 6 ? 1 : 0))

      new_y = (@y + ($game_player.direction == 8 ? -1 : $game_player.direction == 2 ? 1 : 0))

      for event in $game_map.events.values

        if event.inimigo

          if event.x == new_x and event.y == new_y

            event.recebe_skl(self)

            event.animation_id = self.player_skl_animation_id

            event.jump(0,0)

            self.wait_ataque = 60

            break

          end

        end

      end

    end

    end

    def player_atk_animation_id

    return ($game_actors[1].nil? ? 0 : $game_actors[1].atk_animation_id)

  end

  def player_skl_animation_id

    for key in Skill_Button.keys

      sklid = Skill_Button[key]

    return ($game_actors[1].nil? ? 0 : $data_skills[sklid].animation_id)

    end

  end

    def Attack_Button

    return Attack_Button

  end

  def Skill_Button

    return Skill_Button

  end

  end

end


#--------------------------------------------------------------

# Game Actor

#--------------------------------------------------------------

class Game_Actor

  alias vlad_abs_change_exp change_exp

  def change_exp(exp, show)

    last_level = @level

    last_skills = skills

    @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, maxhp].min

    @mp = [@mp, maxmp].min

    if show and @level > last_level

      show_level_up

    end

    vlad_abs_change_exp(exp,show)

  end

  def show_level_up

    $game_player.animation_id = LevelUp_Ani

    $game_actors[1].hp = $game_actors[1].maxhp

    $game_actors[1].mp = $game_actors[1].maxmp

  end

  def LevelUp_Ani

    return LevelUp_Ani

  end

end


#--------------------------------------------------------------

# Sprite Base

#--------------------------------------------------------------

  class Sprite_Base
  alias animation animation_set_sprites

def animation_set_sprites(frame)

    cell_data = frame.cell_data

    for i in 0..15

      sprite = @animation_sprites

      next if sprite == nil

      pattern = cell_data[i, 0]

      if pattern == nil or pattern == -1

        sprite.visible = false

        next

      end

      if pattern < 100

        sprite.bitmap = @animation_bitmap1

      else

        sprite.bitmap = @animation_bitmap2

      end

      sprite.visible = true

      sprite.src_rect.set(pattern % 5 * 192,

        pattern % 100 / 5 * 192, 192, 192)

      if @animation_mirror

        sprite.x = @animation_ox - cell_data[i, 1] / 2

        sprite.y = @animation_oy - cell_data[i, 2] / 2

        sprite.angle = (360 - cell_data[i, 4])

        sprite.mirror = (cell_data[i, 5] == 0)

      else

        sprite.x = @animation_ox + cell_data[i, 1] / 2

        sprite.y = @animation_oy + cell_data[i, 2] / 2

        sprite.angle = cell_data[i, 4]

        sprite.mirror = (cell_data[i, 5] == 1)

      end

      sprite.z = self.z + 300

      sprite.ox = 96

      sprite.oy = 96

      sprite.zoom_x = cell_data[i, 3] / 200.0

      sprite.zoom_y = cell_data[i, 3] / 200.0

      sprite.opacity = cell_data[i, 6] * self.opacity / 255.0

      sprite.blend_type = cell_data[i, 7]

    end

  end

end

#--------------------------------------------------------------

# Sprite Character

#--------------------------------------------------------------

class Sprite_Character < Sprite_Base

  alias vlad_abs_spchar_update update

  def initialize(viewport, character = nil)

    super(viewport)

    @character = character

    @balloon_duration = 0

    @_damage_duration = 0

    update

  end

  def update

    super

    if @_damage_duration > 0

      @_damage_duration -=1

        @_damage_sprite.x = self.x

        if @_damage_duration <= 0

          dispose_damage

        end

      end

      if @character != nil and @character.damage != nil

      damage(@character.damage, @character.critical)

      @character.damage = nil

      @character.critical = false

    end

    vlad_abs_spchar_update

  end

def damage(value, critical)

      dispose_damage

      if value.is_a?(Numeric)

        damage_string = value.abs.to_s

      else

        damage_string = value.to_s

      end

      bitmap = Bitmap.new(160, 48)

      bitmap.font.name = "Georgia"

      bitmap.font.size = 20

      bitmap.font.italic = true

      if value.is_a?(Numeric) and value <= 0

        bitmap.font.color.set(0, 0, 0)

        bitmap.draw_text(1, 13, 160, 36, "Fallo", 1)

        bitmap.font.color.set(255, 245, 155)

        bitmap.draw_text(0, 12, 160, 36, "Fallo", 1)

      else

        bitmap.font.color.set(0, 0, 0)

        bitmap.draw_text(1, 13, 160, 36, damage_string, 1)

        bitmap.font.color.set(255, 255, 255)

        bitmap.draw_text(0, 12, 160, 36, damage_string, 1)

      end

      if critical

        bitmap.font.color.set(0, 0, 0)

        bitmap.draw_text(1, 6, 160, 20, "Critical", 1)

        bitmap.font.color.set(255, 245, 155)

        bitmap.draw_text(0, 5, 160, 20, "Critical", 1)

      end

      @_damage_sprite = ::Sprite.new(self.viewport)

      @_damage_sprite.bitmap = bitmap

      @_damage_sprite.ox = 80

      @_damage_sprite.oy = 20

      @_damage_sprite.x = self.x

      @_damage_sprite.y = self.y - self.oy / 2 - 40

      @_damage_sprite.z += 99999

      @_damage_duration = 30

    end

    def show_text(string, size=16, color=0)

      dispose_damage

      damage_string = string

      if string.is_a?(Array)

        array = true

      else

        array = false

      end

      bitmap = Bitmap.new(160, 48)

      bitmap.font.name = "Georgia"

      bitmap.font.size = size

      bitmap.font.italic = true

      if array

        for i in 0..string.size

          next if damage_string == nil

          bitmap.font.color.set(96, 96-20, 0) if color == 0

          bitmap.font.color.set(0, 0, 0) if color != 0
          bitmap.draw_text(-1, (12+(16*i)-1)-16, 160, 36, damage_string, 1)

          bitmap.draw_text(+1, (12+(16*i)-1)-16, 160, 36, damage_string, 1)

          bitmap.draw_text(-1, (12+(16*i)+1)-16, 160, 36, damage_string, 1)

          bitmap.draw_text(+1, (12+(16*i)+1)-16, 160, 36, damage_string, 1)

          bitmap.font.color.set(255, 245, 155) if color == 0

          bitmap.font.color.set(144, 199, 150) if color == 1

          bitmap.font.color.set(197, 147, 190)if color == 2

          bitmap.font.color.set(138, 204, 198)if color == 3

          bitmap.draw_text(0, (12+(16*i))-16, 160, 36, damage_string, 1)

        end

      else

        bitmap.font.color.set(96, 96-20, 0) if color == 0

        bitmap.font.color.set(0, 0, 0) if color != 0
        bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)

        bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)

        bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)

        bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)

        bitmap.font.color.set(255, 245, 155) if color == 0

        bitmap.font.color.set(144, 199, 150) if color == 1

        bitmap.font.color.set(197, 147, 190)if color == 2

        bitmap.font.color.set(138, 204, 198)if color == 3

        bitmap.draw_text(0, 12, 160, 36, damage_string, 1)

      end

      @_damage_sprite = ::Sprite.new(self.viewport)

      @_damage_sprite.bitmap = bitmap

      @_damage_sprite.ox = 80

      @_damage_sprite.oy = 20

      @_damage_sprite.x = self.x

      @_damage_sprite.y = self.y - self.oy / 2

      @_damage_sprite.z = 3000

      @_damage_duration = 30

    end
    def dispose_damage

    if @_damage_sprite != nil

      @_damage_sprite.dispose

      @_damage_sprite = nil

    end

  end

end

  

#--------------------------------------------------------------

# Window Skill

#--------------------------------------------------------------

class Scene_Skill

  alias vlad_abs_sskill_initialize initialize

  alias vlad_abs_sskill_update update

  def initialize(actor_index = 0, equip_index = 0)

    @memory = Window_Command.new(150, ["確 定 S 鍵 技 能"])

    @memory.active = false

    @memory.visible = false

    @memory.x = (544 - @memory.width) / 2

    @memory.y = (416 - @memory.height) / 2

    @memory.z = 1500

    vlad_abs_sskill_initialize

  end

def update

  update_skill

  @memory.update if @memory.active

  return update_memory if @memory.active

  vlad_abs_sskill_update

end

def update_skill

  for key in Skill_Button.keys

  if Input.trigger?(key)

  Sound.play_decision

  Skill_Button[key] = @skill_window.skill.id

  @memory.active = @memory.visible = true

  @skill_window.active = false

end

end

end

  def update_memory

if Input.trigger?(Input::C)

  Sound.play_decision

  @memory.active = @memory.visible = false

  @skill_window.active = true

end

end

  def Skill_Button

    return Skill_Button

  end

end


#--------------------------------------------------------------

# FINISH

#--------------------------------------------------------------[/pre]


这个是HUD的
[pre lang="ruby" line="1"]#=============================================================================

# Window Hud

#=============================================================================


class Window_Hud < Window_Base

  def initialize

    super(0,0,128,96)

    self.opacity = 0

#    self.visible = false

    refresh

  end

  def refresh

    self.contents.clear

      actor = $game_actors[1]

      draw_actor_hp(actor, 0, 0, 96)

      draw_actor_mp(actor, 0, 32, 96)

   end

   def update

#     self.visible = true if $game_switches[1] == true # 1=interruptor que activa y desactiva el HUD

     refresh

   end

end


class Scene_Map

  alias hud_main main

  alias hud_update update

  alias hud_terminate terminate

  def main

    @hud = Window_Hud.new

    hud_main

  end

  def update

    @hud.update

    hud_update

  end

  def terminate

    @hud.dispose

  end

end[/pre]
梦石
0
星屑
48
在线时间
841 小时
注册时间
2010-8-11
回帖
1029
发表于 2013-1-31 15:49:51 | 显示全部楼层
乃不如找XAS= =
回复

使用道具 举报

梦石
0
星屑
58
在线时间
24 小时
注册时间
2012-1-5
回帖
14
发表于 2013-1-31 18:39:20 | 显示全部楼层
XAS中文站里面...
XAS要比这灵活多了-c-
回复

使用道具 举报

梦石
0
星屑
60
在线时间
56 小时
注册时间
2012-12-23
回帖
58
 楼主| 发表于 2013-1-31 19:08:46 | 显示全部楼层
XAS又是神马东西
回复

使用道具 举报

梦石
0
星屑
58
在线时间
24 小时
注册时间
2012-1-5
回帖
14
发表于 2013-2-1 10:35:05 | 显示全部楼层
恢复楼上
按我们ra2mod制作者来说
XAS无疑是rpg制作大师系列的一个MOD(模型.拓展版.番外版)
挺适合做-x-   ARPG的,,,
而且里面脚本都是自带的     
有XAS中文站的-x-   
不过技能稍微难点吧0x0
倒是用过XP版的
看了下VX版本,发现更加灵活-x-

点评

感谢您老的批评..  发表于 2013-2-1 17:57
而且这颜文字弱爆了啦! (o#゜ 曲゜)o  发表于 2013-2-1 17:54
颜文字适可而止,不要影响阅读  发表于 2013-2-1 17:53
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部