#===================================
# 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
[url=home.php?mod=space&uid=13302]@exp[/url] = [[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 [url=home.php?mod=space&uid=22147]@level[/url] > 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[i]
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[i] == 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[i], 1)
bitmap.draw_text(+1, (12+(16*i)-1)-16, 160, 36, damage_string[i], 1)
bitmap.draw_text(-1, (12+(16*i)+1)-16, 160, 36, damage_string[i], 1)
bitmap.draw_text(+1, (12+(16*i)+1)-16, 160, 36, damage_string[i], 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[i], 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)
[url=home.php?mod=space&uid=25505]@memory[/url] = 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
#--------------------------------------------------------------