def character_behavior(character_id: int, now_time: datetime.datetime): """ 角色行为控制 Keyword arguments: character_id -- 角色id now_time -- 指定时间 """ if character_id in cache.over_behavior_character: return character_data: game_type.Character = cache.character_data[character_id] if character_data.dead: if character_id not in cache.over_behavior_character: cache.over_behavior_character.add(character_id) return if character_data.behavior.start_time == None: character.init_character_behavior_start_time(character_id, now_time) game_time.init_now_course_time_slice(character_id) if character_data.state == constant.CharacterStatus.STATUS_ARDER: if character_id: character_target_judge(character_id, now_time) else: cache.over_behavior_character.add(0) else: status_judge = judge_character_status(character_id, now_time) if status_judge: cache.over_behavior_character.add(character_id)
def handle_teach_a_lesson(): """ 处理教课指令 """ character.init_character_behavior_start_time(0, cache.game_time) character_data: game_type.Character = cache.character_data[0] end_time = 0 now_week = cache.game_time.weekday() now_time_value = cache.game_time.hour * 100 + cache.game_time.minute timetable_list: List[ game_type.TeacherTimeTable] = cache.teacher_school_timetable[0] course = 0 end_time = 0 for timetable in timetable_list: if timetable.week_day != now_week: continue if timetable.time <= now_time_value and timetable.end_time <= now_time_value: now_value = int(now_time_value / 100) * 60 + now_time_value % 100 end_value = int( timetable.end_time / 100) * 60 + timetable.end_time % 100 end_time = end_value - now_value + 1 course = timetable.course break character_data.behavior.duration = end_time character_data.behavior.behavior_id = constant.Behavior.TEACHING character_data.state = constant.CharacterStatus.STATUS_TEACHING character_data.behavior.course_id = course update.game_update_flow(end_time)
def handle_attend_class(): """ 处理上课指令 """ character.init_character_behavior_start_time(0, cache.game_time) character_data: game_type.Character = cache.character_data[0] end_time = 0 school_id, phase = course.get_character_school_phase(0) now_time_value = cache.game_time.hour * 100 + cache.game_time.minute now_course_index = 0 for session_id in game_config.config_school_session_data[school_id]: session_config = game_config.config_school_session[session_id] if session_config.start_time <= now_time_value and session_config.end_time >= now_time_value: now_value = int(now_time_value / 100) * 60 + now_time_value % 100 end_value = int(session_config.end_time / 100) * 60 + session_config.end_time % 100 end_time = end_value - now_value + 1 now_course_index = session_config.session break now_week = cache.game_time.weekday() if not now_course_index: now_course = random.choice( list( game_config.config_school_phase_course_data[school_id][phase])) else: now_course = cache.course_time_table_data[school_id][phase][now_week][ now_course_index] character_data.behavior.duration = end_time character_data.behavior.behavior_id = constant.Behavior.ATTEND_CLASS character_data.state = constant.CharacterStatus.STATUS_ATTEND_CLASS character_data.behavior.course_id = now_course update.game_update_flow(end_time)
def judge_character_status(character_id: int) -> bool: """ 校验并结算角色状态 Keyword arguments: character_id -- 角色id Return arguments: bool -- 本次update时间切片内活动是否已完成 """ character_data = cache_contorl.character_data[character_id] start_time = character_data.behavior["StartTime"] end_time = game_time.datetime_to_game_time( game_time.get_sub_date( minute=character_data.behavior["Duration"], old_date=game_time.game_time_to_datetime(start_time), )) now_time = cache_contorl.game_time time_judge = game_time.judge_date_big_or_small(now_time, end_time) if time_judge: settle_behavior.handle_settle_behavior(character_id) character_data.behavior["BehaviorId"] = constant.Behavior.SHARE_BLANKLY character_data.state = constant.CharacterStatus.STATUS_ARDER if time_judge == 1: character_data.behavior["StartTime"] = end_time return 0 elif time_judge == 2: character.init_character_behavior_start_time(character_id) return 0 return 1
def handle_interrupt_target_activity( character_id: int, add_time: int, change_data: game_type.CharacterStatusChange ): """ 打断交互目标活动 Keyword arguments: character_id -- 角色id add_time -- 结算时间 change_data -- 状态变更信息记录对象 """ if not add_time: return character_data: game_type.Character = cache.character_data[character_id] target_data: game_type.Character = cache.character_data[character_data.target_character_id] if target_data.dead: return if target_data.state == constant.CharacterStatus.STATUS_DEAD: return if target_data.behavior.behavior_id: if target_data.behavior.start_time <= character_data.behavior.start_time: target_end_time = game_time.get_sub_date( target_data.behavior.duration, old_date=target_data.behavior.start_time ) if target_end_time >= character_data.behavior.start_time: if target_data.behavior.behavior_id == constant.Behavior.MOVE: target_data.behavior = game_type.Behavior() target_data.state = constant.CharacterStatus.STATUS_ARDER character.init_character_behavior_start_time( target_data.cid, character_data.behavior.start_time ) else: settle_behavior.handle_settle_behavior( target_data.cid, character_data.behavior.start_time )
def own_charcter_move(target_scene: list): """ 主角寻路至目标场景 Keyword arguments: target_scene -- 寻路目标场景(在地图系统下的绝对坐标) """ while 1: character_data: game_type.Character = cache.character_data[0] if character_data.position != target_scene: ( move_now, now_path_list, now_target_position, now_need_time, ) = character_move(0, target_scene) if move_now == "Null": break character_data.behavior.behavior_id = constant.Behavior.MOVE character_data.behavior.move_target = now_target_position character_data.behavior.duration = now_need_time character_data.state = constant.CharacterStatus.STATUS_MOVE character.init_character_behavior_start_time(0, cache.game_time) update.game_update_flow(now_need_time) else: break cache.character_data[0].target_character_id = 0 cache.now_panel_id = constant.Panel.IN_SCENE
def handle_singing(): """ 处理唱歌指令 """ character.init_character_behavior_start_time(0, cache.game_time) character_data = cache.character_data[0] character_data.behavior.duration = 5 character_data.behavior.behavior_id = constant.Behavior.SINGING character_data.state = constant.CharacterStatus.STATUS_SINGING update.game_update_flow(5)
def handle_play_guitar(): """ 处理弹吉他指令 """ character.init_character_behavior_start_time(0, cache.game_time) character_data = cache.character_data[0] character_data.behavior.duration = 10 character_data.behavior.behavior_id = constant.Behavior.PLAY_GUITAR character_data.state = constant.CharacterStatus.STATUS_PLAY_GUITAR update.game_update_flow(10)
def handle_play_piano(): """ 处理弹钢琴指令 """ character.init_character_behavior_start_time(0, cache.game_time) character_data = cache.character_data[0] character_data.behavior.duration = 30 character_data.behavior.behavior_id = constant.Behavior.PLAY_PIANO character_data.state = constant.CharacterStatus.STATUS_PLAY_PIANO update.game_update_flow(30)
def handle_touch_head(): """ 处理摸头指令 """ character.init_character_behavior_start_time(0, cache.game_time) character_data = cache.character_data[0] character_data.behavior.duration = 2 character_data.behavior.behavior_id = constant.Behavior.TOUCH_HEAD character_data.state = constant.CharacterStatus.STATUS_TOUCH_HEAD update.game_update_flow(2)
def handle_rest(): """ 处理休息指令 """ character.init_character_behavior_start_time(0, cache.game_time) character_data = cache.character_data[0] character_data.behavior.duration = 10 character_data.behavior.behavior_id = constant.Behavior.REST character_data.state = constant.CharacterStatus.STATUS_REST update.game_update_flow(10)
def handle_stroke(): """ 处理抚摸指令 """ character.init_character_behavior_start_time(0, cache.game_time) character_data: game_type.Character = cache.character_data[0] character_data.behavior.duration = 10 character_data.behavior.behavior_id = constant.Behavior.STROKE character_data.state = constant.CharacterStatus.STATUS_STROKE update.game_update_flow(10)
def handle_touch_chest(): """ 处理摸胸指令 """ character.init_character_behavior_start_time(0, cache.game_time) character_data: game_type.Character = cache.character_data[0] character_data.behavior.duration = 10 character_data.behavior.behavior_id = constant.Behavior.TOUCH_CHEST character_data.state = constant.CharacterStatus.STATUS_TOUCH_CHEST update.game_update_flow(10)
def handle_handle_in_handle(): """ 处理牵手指令 """ character.init_character_behavior_start_time(0, cache.game_time) character_data: game_type.Character = cache.character_data[0] character_data.behavior.duration = 10 character_data.behavior.behavior_id = constant.Behavior.HAND_IN_HAND character_data.state = constant.CharacterStatus.STATUS_HAND_IN_HAND update.game_update_flow(10)
def handle_kiss(): """ 处理亲吻指令 """ character.init_character_behavior_start_time(0, cache.game_time) character_data: game_type.Character = cache.character_data[0] character_data.behavior.duration = 2 character_data.behavior.behavior_id = constant.Behavior.KISS character_data.state = constant.CharacterStatus.STATUS_KISS update.game_update_flow(2)
def handle_embrace(): """ 处理拥抱指令 """ character.init_character_behavior_start_time(0, cache.game_time) character_data: game_type.Character = cache.character_data[0] character_data.behavior.duration = 3 character_data.behavior.behavior_id = constant.Behavior.EMBRACE character_data.state = constant.CharacterStatus.STATUS_EMBRACE update.game_update_flow(3)
def handle_sleep(): """ 处理睡觉指令 """ character.init_character_behavior_start_time(0, cache.game_time) character_data: game_type.Character = cache.character_data[0] character_data.behavior.duration = 480 character_data.behavior.behavior_id = constant.Behavior.SLEEP character_data.state = constant.CharacterStatus.STATUS_SLEEP cache.wframe_mouse.w_frame_skip_wait_mouse = 1 update.game_update_flow(480)
def handle_self_study(): """ 处理自习指令 """ character.init_character_behavior_start_time(0, cache.game_time) character_data: game_type.Character = cache.character_data[0] school_id, phase = course.get_character_school_phase(0) now_course_list = list( game_config.config_school_phase_course_data[school_id][phase]) now_course = random.choice(now_course_list) character_data.behavior.behavior_id = constant.Behavior.SELF_STUDY character_data.behavior.duration = 10 character_data.state = constant.CharacterStatus.STATUS_SELF_STUDY character_data.behavior.course_id = now_course update.game_update_flow(10)
def judge_character_status(character_id: int, now_time: datetime.datetime) -> int: """ 校验并结算角色状态 Keyword arguments: character_id -- 角色id Return arguments: bool -- 本次update时间切片内活动是否已完成 """ character_data: game_type.Character = cache.character_data[character_id] scene_path_str = map_handle.get_map_system_path_str_for_list(character_data.position) scene_data: game_type.Scene = cache.scene_data[scene_path_str] start_time = character_data.behavior.start_time end_time = game_time.get_sub_date(minute=character_data.behavior.duration, old_date=start_time) if ( character_data.target_character_id != character_id and character_data.target_character_id not in scene_data.character_list ): end_time = now_time time_judge = game_time.judge_date_big_or_small(now_time, end_time) add_time = (end_time.timestamp() - start_time.timestamp()) / 60 if not add_time: character_data.behavior = game_type.Behavior() character_data.behavior.start_time = end_time character_data.state = constant.CharacterStatus.STATUS_ARDER return 1 last_hunger_time = start_time if character_data.last_hunger_time is not None: last_hunger_time = character_data.last_hunger_time hunger_time = int((now_time - last_hunger_time).seconds / 60) character_data.status.setdefault(27, 0) character_data.status.setdefault(28, 0) character_data.status[27] += hunger_time * 0.02 character_data.status[28] += hunger_time * 0.02 character_data.last_hunger_time = now_time if time_judge: settle_behavior.handle_settle_behavior(character_id, end_time) talk.handle_talk(character_id) character_data.behavior = game_type.Behavior() character_data.state = constant.CharacterStatus.STATUS_ARDER if time_judge == 1: character_data.behavior.start_time = end_time return 0 elif time_judge == 2: character.init_character_behavior_start_time(character_id, now_time) return 0 return 1
def handle_rest(): """ 处理休息指令 """ character.init_character_behavior_start_time(0) character_data = cache_contorl.character_data[0] character_data.behavior["Duration"] = 10 character_data.behavior["BehaviorId"] = constant.Behavior.REST character_data.state = constant.CharacterStatus.STATUS_REST if character_data.hit_point > character_data.hit_point_max: character_data.hit_point = character_data.hit_point_max target_character = cache_contorl.character_data[ character_data.target_character_id] if (target_character.state == constant.CharacterStatus.STATUS_ARDER and target_character.behavior["BehaviorId"] == constant.Behavior.SHARE_BLANKLY): target_character.state = constant.CharacterStatus.STATUS_REST character.init_character_behavior_start_time( character_data.target_character_id) target_character.behavior["Duration"] = 10 target_character.behavior["BehaviorId"] = constant.Behavior.REST update.game_update_flow() game_time.sub_time_now(10) update.game_update_flow()
def init_character_behavior(): """ 角色行为树总控制 """ while 1: if (len(cache_contorl.over_behavior_character) >= len(cache_contorl.character_data) - 1): break for character_id in cache_contorl.character_data: if (character_id == 0 or character_id in cache_contorl.over_behavior_character): continue if (cache_contorl.character_data[character_id]. behavior["StartTime"] == {}): character.init_character_behavior_start_time(character_id) game_time.init_now_course_time_slice(character_id) if (cache_contorl.character_data[character_id].state == constant.CharacterStatus.STATUS_ARDER): character_target_judge(character_id) else: status_judge = judge_character_status(character_id) if status_judge: cache_contorl.over_behavior_character[character_id] = 1 cache_contorl.over_behavior_character = {}