服务器多人回合制RPG战斗框架设计
最终目标是写出一个纯服务器的回合制战斗框架,可以进行简单的战斗
战斗设计时回合制战斗最难也是最复杂的部分
语言:python2
相似RPG游戏:梦幻西游、神武等
RPG战斗框架包含以下四部分的内容:
一、基本战斗流程
二、战斗角色设计
三、战斗伤害计算
四、技能设计
五、BUFF设计
六、战斗AI、
一、基本战斗流程
战斗流程不复杂,基本就是安装以下流程走
①回合开始
②回合数 + 1
③si玩家操作:攻击\防御
④C2S客户端通知准备完成
⑤服务器开始计算伤害:S2C
⑥客户端开始表现
⑦客户端表现结束通知
⑧回合结束
⑨判断游戏结束 or 进入下一回合
流程如下:
由于RPG游戏对网络要求不高,战斗计算都是放在服务器
服务器处理比较的是OnFight里面,各种嵌套复杂的技能、效果、Buff、AI都在里面计算
伪代码如下:
warframe.py
# -*- coding: utf-8-*-
from war_def import *
class CWarFrame(object):
def __init__(self):
self.m_teams = [[None] * 5, [None] * 5] # 战斗角色队伍
self.m_ready_warriors = 0 # 准备的战斗角色数量
self.m_bout = 0 # 当前回合数
def start(self):
self.turn()
def turn(self, delay=0):
self.callout(self.on_turn, delay, "war_fight")
def on_turn(self):
win = self.check_end()
if win:
self.end(win)
else:
self.m_bout += 1
self.callout(self.on_fight, FIGHT_COMMAND_OUT_TIME, "war_wait")
def on_fight(self):
"""
服务器开始战斗计算
"""
def __prefight(w):
w.pre_Fight()
self.warriors_call(__prefight)
warriors = [wobj for line in self.m_teams for wobj in line]
warriors.sort() # 按速度排序
delay = 0 # 每回合客户端表现事件
while warriors:
wobj = warriors.pop()
d = wobj.m_command(wobj) # 战斗角色对象执行操作
delay += d
self.on_bout_over()
self.turn(delay)
def end(self, win):
for line in self.m_teams:
for wobj in line:
self.leave(wobj)
def leave(self, wobj):
"""
战斗角色对象离场
"""
wobj.on_leave()
def on_bout_over(self):
"""
服务器回合结束,等待客户端表现
"""
self.warriors_call(self.action, WARACT_BOUTEND)
def check_end(self):
if self.m_bout >= 5:
return True
return False
def callout(self, func, delay, key):
# timer = threading.Timer(delay, func, key)
# timer.start()
# self.m_Timer = {key} = timer
pass
def remove_callout(self, key):
# timer = self.m_Timer.pop(key, None)
# if timer:
# timer.cancel()
pass
def action(self, wobj, act):
"""
战斗角色进行行为
:param wobj: 战斗角色对象
:param act: 行为
"""
wobj.m_action = act
if act == WARACT_READY:
self.m_ready_warriors += 1
if self.m_ready_warriors >= 5:
self.remove_callout("war_wait")
self.on_fight()
elif act == WARACT_BOUTEND:
wobj.on_bout()
elif act == WARACT_WAIT:
wobj.do_ready(self)
def warriors_call(self, func, *args):
for line in self.m_teams:
for wobj in line:
if wobj:
func(wobj, *args)
战斗行为类型定义:
war_def.py
# -*- coding: utf-8-*-
WARACT_FINISH = 0
WARACT_WAIT = 1
WARACT_READY = 2
WARACT_FIGHT = 3
WARACT_BOUTEND = 4
FIGHT_COMMAND_OUT_TIME = 30