You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
318 lines
8.6 KiB
318 lines
8.6 KiB
"""
|
|
剧情系统,整个游戏最核心的系统之一
|
|
create by 狡猾的皮球
|
|
qq:871245007
|
|
2020年2月13日 15:43:34
|
|
"""
|
|
from code.fight import Fighter, Magic
|
|
from code.game_global import g
|
|
from code.npc import Npc
|
|
|
|
|
|
class Command:
|
|
"""
|
|
基本指令
|
|
"""
|
|
|
|
def __init__(self, cmd_name, cmd_args=None):
|
|
self.cmd_name = cmd_name
|
|
self.cmd_args = cmd_args
|
|
for i in range(len(self.cmd_args)):
|
|
if self.cmd_args[i].isdigit():
|
|
self.cmd_args[i] = int(self.cmd_args[i])
|
|
self.done = False # 是否执行完成
|
|
self.working = False # 是否正在执行
|
|
|
|
def logic(self):
|
|
"""
|
|
逻辑
|
|
"""
|
|
if not self.working:
|
|
return
|
|
cmd_logic = getattr(self, self.cmd_name + '_logic')
|
|
if cmd_logic:
|
|
cmd_logic()
|
|
|
|
def execute(self):
|
|
"""
|
|
开始执行
|
|
"""
|
|
if self.working:
|
|
return
|
|
self.working = True
|
|
cmd = getattr(self, self.cmd_name)
|
|
cmd(*self.cmd_args)
|
|
|
|
def show_npc(self, *args):
|
|
"""
|
|
创建或显示npc
|
|
指令结构:
|
|
show_npc npc_id,mx,my,face,talk_id_list
|
|
"""
|
|
npc_id = args[0]
|
|
mx = args[1]
|
|
my = args[2]
|
|
face = args[3]
|
|
if len(args) == 5:
|
|
talk_id_list = args[4]
|
|
else:
|
|
talk_id_list = None
|
|
npc = g.npc_mgr.exists(npc_id)
|
|
if npc:
|
|
npc.set_point(mx, my)
|
|
npc.face = face
|
|
npc.visible = True
|
|
else:
|
|
npc = Npc(npc_id, mx, my, face, talk_id_list)
|
|
g.npc_mgr.add(npc)
|
|
self.done = True
|
|
self.working = False
|
|
|
|
def remove_npc(self, *args):
|
|
"""
|
|
移除npc
|
|
"""
|
|
npc_id = args[0]
|
|
g.npc_mgr.remove(npc_id)
|
|
self.done = True
|
|
self.working = False
|
|
|
|
def hide_npc(self, *args):
|
|
"""
|
|
隐藏npc
|
|
"""
|
|
npc_id = args[0]
|
|
npc = g.npc_mgr.exists(npc_id)
|
|
if npc:
|
|
npc.visible = False
|
|
self.done = True
|
|
self.working = False
|
|
|
|
def start_talk(self, *args):
|
|
"""
|
|
开始对话
|
|
"""
|
|
talk_id = args[0]
|
|
g.talk_mgr.start(talk_id)
|
|
self.talk_id = talk_id
|
|
self.working = True
|
|
|
|
def start_talk_logic(self):
|
|
"""
|
|
对话逻辑
|
|
"""
|
|
if g.talk_mgr.talk_id != self.talk_id or not g.talk_mgr.switch:
|
|
self.working = False
|
|
self.done = True
|
|
|
|
def move_npc(self, *args):
|
|
"""
|
|
移动npc
|
|
"""
|
|
npc_id = args[0]
|
|
mx = args[1]
|
|
my = args[2]
|
|
self.face = args[3]
|
|
npc = g.npc_mgr.exists(npc_id)
|
|
self.npc = npc
|
|
npc.find_path(g.game_map.walk_data, [mx, my])
|
|
self.working = True
|
|
|
|
def move_npc_logic(self):
|
|
"""
|
|
移动npc逻辑
|
|
"""
|
|
if not self.npc.walking:
|
|
self.npc.face = self.face
|
|
self.working = False
|
|
self.done = True
|
|
|
|
def move_camera(self, *args):
|
|
"""
|
|
移动镜头
|
|
"""
|
|
mx = args[0]
|
|
my = args[1]
|
|
g.camera_mgr.move_m_pos(mx, my)
|
|
self.working = True
|
|
|
|
def move_camera_logic(self, *args):
|
|
"""
|
|
移动镜头逻辑
|
|
"""
|
|
if not g.camera_mgr.moving:
|
|
self.working = False
|
|
self.done = True
|
|
|
|
def delay(self, *args):
|
|
"""
|
|
延迟
|
|
"""
|
|
second = args[0]
|
|
self.total_frame = second * g.fps # 计算second秒需要经过多少个主循环
|
|
self.count = 0
|
|
self.working = True
|
|
|
|
def delay_logic(self):
|
|
self.count += 1
|
|
if self.count >= self.total_frame:
|
|
self.working = False
|
|
self.done = True
|
|
|
|
def unlock_camera(self, *args):
|
|
"""
|
|
解锁镜头
|
|
"""
|
|
x = args[0]
|
|
y = args[1]
|
|
g.camera_mgr.unlock(x, y)
|
|
self.working = False
|
|
self.done = True
|
|
|
|
def play_ani(self, *args):
|
|
"""
|
|
播放动画
|
|
"""
|
|
ani_id = args[0]
|
|
x = args[1]
|
|
y = args[2]
|
|
need_blend = bool(args[3])
|
|
self.ani = g.ani_factory.create(ani_id, x, y, need_blend=need_blend)
|
|
self.working = True
|
|
|
|
def play_ani_logic(self):
|
|
if self.ani.least_once:
|
|
self.working = False
|
|
self.done = True
|
|
|
|
def play_async_ani(self, *args):
|
|
"""
|
|
播放异步动画,不会阻塞剧情播放器
|
|
"""
|
|
ani_id = args[0]
|
|
x = args[1]
|
|
y = args[2]
|
|
need_blend = bool(args[3])
|
|
self.ani = g.ani_factory.create(ani_id, x, y, need_blend=need_blend)
|
|
self.working = False
|
|
self.done = True
|
|
|
|
def play_music(self, *args):
|
|
"""
|
|
播放音乐
|
|
"""
|
|
music_id = args[0]
|
|
g.audio_player.play_music(music_id)
|
|
self.working = False
|
|
self.done = True
|
|
|
|
def start_fight_t(self, *args):
|
|
"""
|
|
开始测试战斗
|
|
"""
|
|
fighter = Fighter(0, 10, 10, 3)
|
|
fighter.set_attr([500, 500], [100, 100], 70, 10, 10, 4, 10000, 4, 3, 1)
|
|
fighter.set_name('苏媚')
|
|
fighter.set_skill([Magic(1), Magic(2), ])
|
|
|
|
fighter_bt = Fighter(0, 10, 11, 3)
|
|
fighter_bt.set_attr([999, 999], [100, 100], 200, 2000, 10, 4, 10000, 4, 3, 1)
|
|
fighter_bt.set_name('变态苏媚')
|
|
fighter_bt.set_skill([Magic(1)])
|
|
|
|
fighter_dgt = Fighter(4, 17, 10, 2, True)
|
|
fighter_dgt.set_attr([30000, 30000], [100, 100], 10, 10, 10, 8, 10, 1, 2, 4)
|
|
fighter_dgt.set_name('千叶禅师')
|
|
# fighter_dgt.set_skill([Magic(1)])
|
|
|
|
fighter_dgt3 = Fighter(2, 18, 10, 2, True)
|
|
fighter_dgt3.set_attr([100, 100], [100, 100], 10, 10, 10, 8, 10, 10, 2, 5)
|
|
fighter_dgt3.set_name('大光头吴涛3')
|
|
fighter_dgt3.set_skill([Magic(1)])
|
|
|
|
fighter_dgt1 = Fighter(2, 34, 9, 2, True)
|
|
fighter_dgt1.set_attr([100, 100], [100, 100], 10, 10, 10, 8, 10, 10, 2, 5)
|
|
fighter_dgt1.set_name('大光头吴涛1')
|
|
fighter_dgt1.set_skill([Magic(1)])
|
|
|
|
fighter_dgt2 = Fighter(2, 44, 4, 2, True)
|
|
fighter_dgt2.set_attr([100, 100], [100, 100], 10, 10, 10, 8, 10, 10, 2, 5)
|
|
fighter_dgt2.set_name('大光头吴涛2')
|
|
fighter_dgt2.set_skill([Magic(1)])
|
|
|
|
fighter_dgt4 = Fighter(2, 35, 9, 2, True)
|
|
fighter_dgt4.set_attr([100, 100], [100, 100], 10, 10, 10, 8, 10, 10, 2, 5)
|
|
fighter_dgt4.set_name('大光头吴涛4')
|
|
fighter_dgt4.set_skill([Magic(1)])
|
|
|
|
fighter_dgt5 = Fighter(2, 36, 9, 2, True)
|
|
fighter_dgt5.set_attr([100, 100], [100, 100], 10, 10, 10, 8, 10, 10, 2, 5)
|
|
fighter_dgt5.set_name('大光头吴涛5')
|
|
fighter_dgt5.set_skill([Magic(1)])
|
|
|
|
fighter_dgt6 = Fighter(2, 37, 9, 2, True)
|
|
fighter_dgt6.set_attr([100, 100], [100, 100], 10, 10, 10, 8, 10, 10, 2, 5)
|
|
fighter_dgt6.set_name('大光头吴涛6')
|
|
fighter_dgt6.set_skill([Magic(1)])
|
|
|
|
g.fight_mgr.start([fighter, fighter_dgt, fighter_dgt3, fighter_bt, fighter_dgt1, fighter_dgt2,fighter_dgt4,fighter_dgt5,fighter_dgt6], 1)
|
|
g.audio_player.play_music(5013)
|
|
self.working = False
|
|
self.done = True
|
|
|
|
|
|
class StoryPlayer:
|
|
"""
|
|
剧情播放器
|
|
"""
|
|
|
|
def __init__(self):
|
|
self.cmd_list = [] # 指令队列
|
|
self.current_cmd = None # 当前正在执行的命令
|
|
|
|
def load_script(self, script_id):
|
|
"""
|
|
加载剧本文件
|
|
"""
|
|
with open(f'./resource/story/{script_id}.txt', 'r', encoding='utf8') as file:
|
|
cmd_list = file.readlines()
|
|
for cmd in cmd_list:
|
|
if cmd.startswith('#') or cmd.startswith('//') or cmd.startswith("'"):
|
|
continue
|
|
if cmd.replace('\n', '').replace(' ', '') == '':
|
|
continue
|
|
cmd = cmd.replace('\n', '')
|
|
cmd_name, args = cmd.split(' ')
|
|
args = args.split(',')
|
|
command = Command(cmd_name, args)
|
|
self.cmd_list.append(command)
|
|
|
|
def play(self):
|
|
"""
|
|
播放剧情
|
|
"""
|
|
if len(self.cmd_list) == 0:
|
|
self.current_cmd = None
|
|
return
|
|
|
|
while True:
|
|
self.current_cmd = self.cmd_list.pop(0)
|
|
self.current_cmd.execute()
|
|
if not self.current_cmd.done:
|
|
break
|
|
if len(self.cmd_list) == 0:
|
|
break
|
|
|
|
def logic(self):
|
|
"""
|
|
逻辑
|
|
"""
|
|
if self.current_cmd is None:
|
|
return
|
|
|
|
if self.current_cmd.done:
|
|
self.play()
|
|
return
|
|
|
|
self.current_cmd.logic()
|