Example #1
0
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)
Example #2
0
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)
Example #3
0
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)
Example #4
0
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
Example #5
0
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
                    )
Example #6
0
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
Example #7
0
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)
Example #8
0
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)
Example #9
0
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)
Example #10
0
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)
Example #11
0
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)
Example #12
0
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)
Example #13
0
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)
Example #14
0
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)
Example #15
0
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)
Example #16
0
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)
Example #17
0
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)
Example #18
0
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)
Example #19
0
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
Example #20
0
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()
Example #21
0
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 = {}