赞 | 2 |
VIP | 73 |
好人卡 | 13 |
积分 | 2 |
经验 | 1598378 |
最后登录 | 2014-9-24 |
在线时间 | 2399 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 239
- 在线时间
- 2399 小时
- 注册时间
- 2008-4-11
- 帖子
- 12326
|
41星屑
本帖最后由 protosssonny 于 2013-4-7 18:15 编辑
这是取自一个最原始的ARPG工程的脚本
粗略看一下应该就能明白它简单到何种程度
最简单ARPG.rar
(243.21 KB, 下载次数: 81)
目前自然有很多完胜此脚本的ARPG工程,但是小瞬有强迫症
已经做到一半的游戏,再也不想大修大改了。
求在此脚本基础上增加三个不会和任何其他脚本有冲突的功能(包括半事件半脚本)
1.怪物可以掉落物品,物品掉落在地,主角经过后才会被捡起
2.技能可以更简便的使用(比如设置键盘快捷键)
3.敌人也可以使用技能,换而言之就是数据库里面敌人的属性都被被映射到战斗中
4.敌我之间有属性克制,求加入各角色属性耐性和属性伤害数据- #===================================
- # 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
- #--------------------------------------------------------------
- # Attack Animation, copy Enemy_atk_ani[2] = 13
- # change the 2 to the ID of the enemy, and the 13 to the ID of the animation.
- # Example: 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 [url=home.php?mod=space&uid=13302]@exp[/url] >= @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 = "黑体"
- 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
- #--------------------------------------------------------------
复制代码 |
最佳答案
查看完整内容
基本功能已经实现,占楼了,待优化。
[hr]问:什么时候优化?
答:P叔有时间再来优化,本周太多事情了。你先看看实现效果。
评分
-
查看全部评分
|