第九章 战斗系统(Combat System)
在SRPG中,大多数情况是指角色与角色之间的战斗。而这种战斗一般有两种模式:
-
地图中直接战斗;
-
有专门的战斗场景。
这两种模式的战斗在数据上没有任何区别,只有战斗动画的区别。
就像之前描述的,SRPG也是RPG,所以战斗方式和回合制RPG的战斗几乎是相同的。主要区别是RPG每个回合需要手动操作(也有自动战斗的),直到战斗结束;而SRPG是自动战斗,且多数情况只有一个回合(额外回合也是由于技能、物品或剧情需要)。且RPG多数是多人战斗,而SRPG多数是每边就一个。
我们这一章就来写一个战斗系统。
文章目录
一 战斗属性(Combat Properties)
战斗中需要的属性是需要从我们的角色身上获取的。
我们在这里还是拿《FE4》来举例,在《FE4》中的基础战斗属性包含:
-
物理攻击力(attack) = 武器攻击力 + 角色力量(STR) + 道具力量
-
魔法攻击力(mage attack) = 武器攻击力 + 角色魔力(MAG) + 道具魔力
-
物理防御力(defence) = 角色防御(DEF) + 道具防御
-
魔法防御力(mage defence) = 角色魔防(MDF) + 道具魔防
-
攻速(speed) = 角色速度(SPD) + 道具速度 - 武器重量(weight)
-
命中(hit rate) = (角色技巧(SKL) + 道具技巧) * 2 + 武器命中(hit rate)
-
回避(avoidance) = (角色速度 + 道具速度) * 2 + 角色幸运 + 道具幸运
-
爆击(crit):暂不考虑
-
攻击范围(attack range):来自武器
-
生命值(hp)与最大生命值(max hp)
了解这些后,我们来实现它们。
1 角色战斗属性(Role Fight Properties)
经过之前的分析,我们的角色需要一些战斗属性;而属性是需要计算的。而在属性中,我们需要装备的属性(装备的武器和饰品)。
1.1 物品属性叠加(Sum of Item Properties)
我们在Role
类中添加计算属性叠加方法:
/// <summary>
/// 物品属性叠加
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public int GetItemFightPropertySum(FightPropertyType type)
{
if (type == FightPropertyType.MaxLength)
{
return 0;
}
int value = 0;
// 如果装备武器不为null,则叠加武器属性
if (equipedWeapon != null)
{
value += equipedWeapon.uniqueInfo.fightProperties[type];
}
// 叠加所有饰品属性
foreach (Item item in items)
{
if (item != null && item.itemType == ItemType.Ornament)
{
value += (item as Ornament).uniqueInfo.fightProperties[type];
}
}
return value;
}
添加Luk叠加方法:
/// <summary>
/// 物品幸运叠加
/// </summary>
/// <returns></returns>
public int GetItemLukSum()
{
int value = 0;
// 如果装备武器不为null,则叠加武器幸运
if (equipedWeapon != null)
{
value += equipedWeapon.uniqueInfo.luk;
}
// 叠加所有饰品幸运
foreach (Item item in items)
{
if (item != null && item.itemType == ItemType.Ornament)
{