Project1
标题:
角色的心情变化影响战斗状态与故事进程(脚本写成)
[打印本页]
作者:
slick
时间:
2008-6-5 02:31
标题:
角色的心情变化影响战斗状态与故事进程(脚本写成)
本人在半夜睡不着状态下的又一个怨念产物。。。。。。事件、战斗状态等可以由角色的心情来决定。。。。。。
这个示例工程可以让大家了解角色的不同心情是如何影响战斗状态以及事件触发的。
角色在不同心情下触发的同一个事件也会有不一样的结果
在这里可以查看角色心情
一、物品改变角色心情值的定义方法:
在物品的“说明”一栏中写入:“难吃的药,己方单体 HP 回复,-1”,因为文字后面附带了一个参数"-1",故角色使用该物品后心情变差1点。
在物品的“说明”一栏中写入:“美味食物,己方单体 HP 少量回复,1”,因为文字后面附带了一个参数"1",故角色使用该物品后心情变好1点。
数字越大,心情的改变量就越大。
二、地图界面调用脚本改变角色心情:
举一例——
$game_party.actors[0].mstep=0
$game_party.actors[0].mood=0
其中mstep是该角色的心情程度,mood是心情种类(0平静 1高兴 2愤怒 3忧郁 4恐惧)。当mood为0时,mstep值无意义。
菜单栏中选择“状态”时,可以看到角色的心情脸谱,很有趣哦。
(说句老实话= =|||其实我个人感觉用一个小萝莉来表现角色的心情最容易,与男性角色相比,娇小可爱的女孩子更容易表现撒娇、发脾气等情感,
这也是我为什么总喜欢让西露达作示例工程的主角,而不是阿尔西斯的原因)
冲突可能:战斗类(主要是伤害计算方面)、状态菜单显示类等。
示例工程:
http://rpg.blue/upload_program/f ... 状态_93032765.rar
最后给大家出个小谜题:
在本示例的状态窗口中,反映角色心情的表情一共有九种。不看工程中的参数设置,也不要先看脚本,你能把它们全找出来吗?
核心脚本:
# 角色心情变化 BY SLICK V1.00
# 心情对战斗的影响:
# 高兴-增加角色的灵巧和速度(目前版本暂不支持)
# 愤怒-攻击力提高,防御力降低
# 忧郁-降低角色的灵巧和速度(目前版本暂不支持)
# 恐惧-攻击力降低,防御力提高
module RPG
class Item
attr_accessor :emood
def description
description = @description.split(/,/)[0]
return description != nil ? description.to_s : ''
end
def emood
emood = @description.split(/,/)[1]
return emood != nil ? emood.to_i : 0
end
end
class Skill
attr_accessor :emood
def description
description = @description.split(/,/)[0]
return description != nil ? description.to_s : ''
end
def emood
emood = @description.split(/,/)[1]
return emood != nil ? emood.to_i : 0
end
end
end
class Game_Actor < Game_Battler
attr_accessor :mood # 心情类别(0平静 1高兴 2生气 3忧郁 4恐惧)
attr_accessor :mstep # 心情程度
#--------------------------------------------------------------------------
# ● セットアップ
# actor_id : アクター ID
#--------------------------------------------------------------------------
alias ooo_setup setup
def setup(actor_id)
#这里做修改==================================
@mood=0 #初登场时心情默认为“平静”
@mstep=0
#=======================================
ooo_setup(actor_id)
end
end
class Game_Battler
#--------------------------------------------------------------------------
# ● 应用通常攻击效果
# attacker : 攻击者 (battler)
#--------------------------------------------------------------------------
def attack_effect(attacker)
# 清除会心一击标志
self.critical = false
# 第一命中判定
hit_result = (rand(100) < attacker.hit)
# 命中的情况下
if hit_result == true
# 计算基本伤害
#加入心情修正==================================================================
if attacker.is_a?(Game_Actor)
if attacker.mood==2
mpfix=attacker.mstep*5
elsif attacker.mood==4
mpfix=attacker.mstep*(-5)
else
mpfix=0
end
else
mpfix=0
end
if self.is_a?(Game_Actor)
if self.mood==4
mdfix=self.mstep*5
elsif self.mood==2
mdfix=self.mstep*(-5)
else
mdfix=0
end
else
mdfix=0
end
atk = [attacker.atk+mpfix - self.pdef / 2-mdfix, 0].max
self.damage = atk * (20 + attacker.str) / 20
#==============================================================================
# 属性修正
self.damage *= elements_correct(attacker.element_set)
self.damage /= 100
# 伤害符号正确的情况下
if self.damage > 0
# 会心一击修正
if rand(100) < 4 * attacker.dex / self.agi
self.damage *= 2
self.critical = true
end
# 防御修正
if self.guarding?
self.damage /= 2
end
end
# 分散
if self.damage.abs > 0
amp = [self.damage.abs * 15 / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp
end
# 第二命中判定
eva = 8 * self.agi / attacker.dex + self.eva
hit = self.damage < 0 ? 100 : 100 - eva
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(100) < hit)
end
# 命中的情况下
if hit_result == true
# 状态冲击解除
remove_states_shock
# HP 的伤害计算
self.hp -= self.damage
# 状态变化
@state_changed = false
states_plus(attacker.plus_state_set)
states_minus(attacker.minus_state_set)
# Miss 的情况下
else
# 伤害设置为 "Miss"
self.damage = "Miss"
# 清除会心一击标志
self.critical = false
end
# 过程结束
return true
end
#--------------------------------------------------------------------------
# ● 应用特技效果
# user : 特技的使用者 (battler)
# skill : 特技
#--------------------------------------------------------------------------
def skill_effect(user, skill)
# 清除会心一击标志
self.critical = false
# 特技的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
# 或者特技的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
# 过程结束
return false
end
# 清除有效标志
effective = false
# 公共事件 ID 是有效的情况下,设置为有效标志
effective |= skill.common_event_id > 0
# 第一命中判定
hit = skill.hit
if skill.atk_f > 0
hit *= user.hit / 100
end
hit_result = (rand(100) < hit)
# 不确定的特技的情况下设置为有效标志
effective |= hit < 100
# 命中的情况下
if hit_result == true
# 计算威力
#加入心情修正==================================================================
if user.is_a?(Game_Actor)
if user.mood==2
mpfix=user.mstep*5
elsif user.mood==4
mpfix=user.mstep*(-5)
else
mpfix=0
end
else
mpfix=0
end
if self.is_a?(Game_Actor)
if self.mood==4
mdfix=self.mstep*5
elsif self.mood==2
mdfix=self.mstep*(-5)
else
mdfix=0
end
else
mdfix=0
end
power = skill.power + mpfix + user.atk * skill.atk_f / 100
if power > 0
power -= (self.pdef + mdfix) * skill.pdef_f / 200
power -= (self.mdef + mdfix) * skill.mdef_f / 200
power = [power, 0].max
end
#==============================================================================
# 计算倍率
rate = 20
rate += (user.str * skill.str_f / 100)
rate += (user.dex * skill.dex_f / 100)
rate += (user.agi * skill.agi_f / 100)
rate += (user.int * skill.int_f / 100)
# 计算基本伤害
self.damage = power * rate / 20
# 属性修正
self.damage *= elements_correct(skill.element_set)
self.damage /= 100
# 伤害符号正确的情况下
if self.damage > 0
# 防御修正
if self.guarding?
self.damage /= 2
end
end
# 分散
if skill.variance > 0 and self.damage.abs > 0
amp = [self.damage.abs * skill.variance / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp
end
# 第二命中判定
eva = 8 * self.agi / user.dex + self.eva
hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(100) < hit)
# 不确定的特技的情况下设置为有效标志
effective |= hit < 100
end
# 命中的情况下
if hit_result == true
# 威力 0 以外的物理攻击的情况下
if skill.power != 0 and skill.atk_f > 0
# 状态冲击解除
remove_states_shock
# 设置有效标志
effective = true
end
# HP 的伤害减法运算
last_hp = self.hp
self.hp -= self.damage
effective |= self.hp != last_hp
# 状态变化
@state_changed = false
effective |= states_plus(skill.plus_state_set)
effective |= states_minus(skill.minus_state_set)
# 威力为 0 的场合
if skill.power == 0
# 伤害设置为空的字串
self.damage = ""
# 状态没有变化的情况下
unless @state_changed
# 伤害设置为 "Miss"
self.damage = "Miss"
end
end
# Miss 的情况下
else
# 伤害设置为 "Miss"
self.damage = "Miss"
end
# 不在战斗中的情况下
unless $game_temp.in_battle
# 伤害设置为 nil
self.damage = nil
end
# 过程结束
return effective
end
#--------------------------------------------------------------------------
# ● 应用物品效果
# item : 物品
#--------------------------------------------------------------------------
def item_effect(item)
# 清除会心一击标志
self.critical = false
# 物品的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
# 或者物品的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
((item.scope == 5 or item.scope == 6) and self.hp >= 1)
# 过程结束
return false
end
# 清除有效标志
effective = false
# 公共事件 ID 是有效的情况下,设置为有效标志
effective |= item.common_event_id > 0
# 命中判定
hit_result = (rand(100) < item.hit)
# 不确定的特技的情况下设置为有效标志
effective |= item.hit < 100
# 命中的情况
if hit_result == true
# 计算回复量
recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp
if recover_hp < 0
recover_hp += self.pdef * item.pdef_f / 20
recover_hp += self.mdef * item.mdef_f / 20
recover_hp = [recover_hp, 0].min
end
# 属性修正
recover_hp *= elements_correct(item.element_set)
recover_hp /= 100
recover_sp *= elements_correct(item.element_set)
recover_sp /= 100
# 分散
if item.variance > 0 and recover_hp.abs > 0
amp = [recover_hp.abs * item.variance / 100, 1].max
recover_hp += rand(amp+1) + rand(amp+1) - amp
end
if item.variance > 0 and recover_sp.abs > 0
amp = [recover_sp.abs * item.variance / 100, 1].max
recover_sp += rand(amp+1) + rand(amp+1) - amp
end
# 回复量符号为负的情况下
if recover_hp < 0
# 防御修正
if self.guarding?
recover_hp /= 2
end
end
# HP 回复量符号的反转、设置伤害值
self.damage = -recover_hp
# HP 以及 SP 的回复
last_hp = self.hp
last_sp = self.sp
self.hp += recover_hp
self.sp += recover_sp
#effective |= self.hp != last_hp
#effective |= self.sp != last_sp
effective=true
#食用物品后心情产生变化========================================================
if self.is_a?(Game_Actor)
if item.emood>0
case self.mood
when 0
self.mood=1
self.mstep+=item.emood
when 1
self.mstep+=item.emood
when 2
self.mstep-=item.emood
when 3
self.mstep-=item.emood
when 4
self.mstep-=item.emood
end
else
case self.mood
when 0
self.mood=3
self.mstep-=item.emood
when 1
self.mstep+=item.emood
when 2
self.mood=3
self.mstep-=item.emood
when 3
self.mstep-=item.emood
when 4
self.mood=3
self.mstep-=item.emood
end
end
if self.mstep>10
self.mstep=10
end
if self.mstep<0
self.mstep=0
self.mood=0
end
end
#==============================================================================
# 状态变化
@state_changed = false
effective |= states_plus(item.plus_state_set)
effective |= states_minus(item.minus_state_set)
# 能力上升值有效的情况下
if item.parameter_type > 0 and item.parameter_points != 0
# 能力值的分支
case item.parameter_type
when 1 # MaxHP
@maxhp_plus += item.parameter_points
when 2 # MaxSP
@maxsp_plus += item.parameter_points
when 3 # 力量
@str_plus += item.parameter_points
when 4 # 灵巧
@dex_plus += item.parameter_points
when 5 # 速度
@agi_plus += item.parameter_points
when 6 # 魔力
@int_plus += item.parameter_points
end
# 设置有效标志
effective = true
end
# HP 回复率与回复量为 0 的情况下
if item.recover_hp_rate == 0 and item.recover_hp == 0
# 设置伤害为空的字符串
self.damage = ""
# SP 回复率与回复量为 0、能力上升值无效的情况下
if item.recover_sp_rate == 0 and item.recover_sp == 0 and
(item.parameter_type == 0 or item.parameter_points == 0)
# 状态没有变化的情况下
unless @state_changed
# 伤害设置为 "Miss"
self.damage = "Miss"
end
end
end
# Miss 的情况下
else
# 伤害设置为 "Miss"
self.damage = "Miss"
end
# 不在战斗中的情况下
unless $game_temp.in_battle
# 伤害设置为 nil
self.damage = nil
end
# 过程结束
return effective
end
#--------------------------------------------------------------------------
# ● 应用连续伤害效果
#--------------------------------------------------------------------------
def slip_damage_effect
# 设置伤害
self.damage = self.maxhp / 10
# 分散
if self.damage.abs > 0
amp = [self.damage.abs * 15 / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp
end
# HP 的伤害减法运算
self.hp -= self.damage
# 过程结束
return true
end
#--------------------------------------------------------------------------
# ● 属性修正计算
# element_set : 属性
#--------------------------------------------------------------------------
def elements_correct(element_set)
# 無属性的情况
if element_set == []
# 返回 100
return 100
end
# 在被赋予的属性中返回最弱的
# ※过程 element_rate 是、本类以及继承的 Game_Actor
# 和 Game_Enemy 类的定义
weakest = -100
for i in element_set
weakest = [weakest, self.element_rate(i)].max
end
return weakest
end
end
class Window_Status < Window_Base
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh
self.contents.clear
draw_actor_graphic(@actor, 40, 112)
draw_actor_name(@actor, 4, 0)
draw_actor_class(@actor, 4 + 144, 0)
draw_actor_level(@actor, 96, 32)
draw_actor_state(@actor, 96, 64)
draw_actor_hp(@actor, 48, 112, 172)
draw_actor_sp(@actor, 48, 144, 172)
draw_actor_parameter(@actor, 48, 192, 0)
draw_actor_parameter(@actor, 48, 224, 1)
draw_actor_parameter(@actor, 48, 256, 2)
draw_actor_parameter(@actor, 48, 304, 3)
draw_actor_parameter(@actor, 48, 336, 4)
draw_actor_parameter(@actor, 48, 368, 5)
draw_actor_parameter(@actor, 48, 400, 6)
self.contents.font.color = system_color
self.contents.draw_text(320, 48, 80, 32, "EXP")
self.contents.draw_text(320, 80, 80, 32, "NEXT")
self.contents.font.color = normal_color
self.contents.draw_text(320 + 80, 48, 84, 32, @actor.exp_s, 2)
self.contents.draw_text(320 + 80, 80, 84, 32, @actor.next_rest_exp_s, 2)
self.contents.font.color = system_color
self.contents.draw_text(256, 112, 96, 32, "装备")
draw_item_name($data_weapons[@actor.weapon_id], 256, 144)
draw_item_name($data_armors[@actor.armor1_id], 256, 176)
draw_item_name($data_armors[@actor.armor2_id], 256, 208)
draw_item_name($data_armors[@actor.armor3_id], 256, 240)
draw_item_name($data_armors[@actor.armor4_id], 256, 272)
#self.contents = Bitmap.new(width, height)
case @actor.mood
when 0
bitmap = Bitmap.new("Graphics/Pictures/Mood00.png")
when 1
if @actor.mstep<7 then
bitmap = Bitmap.new("Graphics/Pictures/Mood11.png")
else
bitmap = Bitmap.new("Graphics/Pictures/Mood12.png")
end
when 2
if @actor.mstep<7 then
bitmap = Bitmap.new("Graphics/Pictures/Mood21.png")
else
bitmap = Bitmap.new("Graphics/Pictures/Mood22.png")
end
when 3
if @actor.mstep<7 then
bitmap = Bitmap.new("Graphics/Pictures/Mood31.png")
else
bitmap = Bitmap.new("Graphics/Pictures/Mood32.png")
end
when 4
if @actor.mstep<7 then
bitmap = Bitmap.new("Graphics/Pictures/Mood41.png")
else
bitmap = Bitmap.new("Graphics/Pictures/Mood42.png")
end
end
self.contents.stretch_blt(Rect.new(376, 192, 288, 240), bitmap, Rect.new(0, 0, 576, 480))
end
end
复制代码
作者:
越前リョーマ
时间:
2008-6-6 21:15
话说事件里的话是用条件分歧的吧……{/gg}
作者:
禾西
时间:
2008-6-6 21:17
直接用公共事件比較快==
作者:
柳之一
时间:
2008-6-6 21:26
好严重的冲突,对于深受党来说
直接和66得一些脚本冲突。
最好直接判断物品id比较好
def description
description = @description.split(/,/)[0]
return description != nil ? description.to_s : ''
end
这种注释法用的泛滥了。冲突也就多了
作者:
禾西
时间:
2008-6-6 21:31
其實我也覺得還是直接自己設定數據庫比較好...
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1