roguelike活动玩法-四谛法洞
目录
活动玩法介绍
挑战玩法,难度梯度,可以让低战玩家参与。
高战玩家炫耀性,增加高战的知名度,每周排名靠前的玩家需要有额外奖励。
rougelike关卡生成模式,让玩家每一次都有不同的体验。
1.选择侠客流程

2.进副本
功能开启->活动开->挑战次数->申请进副本
3.副本数据初始化
1.init:
  dictTowerFloorData = DictTowerFloorData.getDataByCopySceneId(getCopySceneId());
  根据副本id初始化爬塔数据表,init只有在新创建线的时候调用一次。任何逻辑只能对表数据进行
  读取,不能增删操作。
  
2.activeCallback:
  清空下数据。
  如果当前是第一层爬塔数据:
                 需要从世界拉取数据守关的boss数据(第一层,玩家外显)。
  从世界获取随机路线。
4.进入副本
第一层开始时,在出生点可选择一次初始buff。
每一层获得的buff都需要存服务器,会完全继承到下一层,上下线不消失。
Buff仅在副本内生效,注意不要带到外面。
onAddBpObject():
1.记录侠客信息:
  出战侠客的血量和蓝量。
2.如果添加进来的是外显npc, 动态给npc设置外显数据。
3.
onEnterScene():
1.进场景先随机一组增益buff供玩家选择,通知客户端。
  如果副本已经有选择的buff了,说明不是第一层,那么不随机。
2.判断路线,如果玩家身上有存储的路线id则覆盖当前副本路线id。
3.当前副本生效的buff列表加到玩家或者npc上。
5.客户端选择buff
1.判断是否在四谛法洞副本内
2.选择buff:
  判断当前上发的buffID是否属于之前随机的列表。
  添加到当前副本选择的buff列表(每次进入副本是会判断列表是否为空,
  如果不为空那么不是第一层,不用给玩家随机选择buff操作)。
  添加到生效的buff列表里。
  清空可以选择的buff列表,防止外挂一次性上发多个。
角色断线重连进场景,如果buff没选,重新选择:
if (!this.canChooseBuffIds.isEmpty())
{
    actor.getActorTowerModule().towerChooseBuffNotice(this.canChooseBuffIds);
}
6.副本里记录分数事件
1.onCombo释放组合技能(最大连击数)
  actor.getActorTowerModule().addTowerScoreNum(TowerScoreTypeEnum.MAX_COMBO_NUM.getIndex(), value);
 
2.击杀可破坏物
    》
    》
    》
    省略
7.副本胜利
1.添加各种事件:速杀,通过,不吃buff...
2.最后一层胜利加次数,其他层加层数
3.将当前展示的主副侠客,添加到已使用列表(存库)
4.获取玩家身上的buff列表数据(存库),将当前场景生效的buff列表数据
  加入到玩家身上的buff列表,可以带入下一层。
5.存储爬塔数据:
  a.添加各级别对应爬塔数据。
  b.设置今日积分。
  c.今日积分大于周积分,法送世界更新挑战数据(排行榜)。
6.推送爬塔数据。
8.副本失败
1.添加今日进入次数(会不会退出副本也增加次数了?导致重复?)
2.清空积分和路线信息
3.爬塔数据发送前端
9.挑战规则
需求:
   1.玩家每日可挑战一次。
   2.双侠客阵亡则消耗挑战次数,挑战结束。
   3.玩家在副本中可手动离开,消耗挑战次数。
   4.副本超时,强制退出,挑战失败,消耗次数。
实现:
  1.onTowerFloorFail()副本挑战失败,消耗次数。
  2.中途退出爬塔场景,消耗次数
     /**
     * 退出爬塔场景
     *
     * @param actor 玩家
     */
    public void exitCopySceneTowerFloor(Actor actor)
    {
        if (!isEnd())
        {
            // 未结束前退出,失败扣次数
            actor.getActorTowerModule().onTowerFloorFail();
        }
        exitReturnLastMainScene(actor);
    }
    这里end是待移除或者结束两个状态,
    加了一个不是结束阶段退出,所以不会和副本失败重复扣除,副本失败会将副本状态
    置为等待移除属于end状态。
  3.副本超时退出逻辑:
     /**
     * 副本存在时间超时处理
     * <p>
     *     存在时间达到直接清理出副本,不倒计时。
     *     和副本完成OR失败后退出副本倒计时拨离。
     * </p>
     */
    private void timeOutOperate()
    {
        if (state != CopySceneStateType.RUNNING)
        {
            return;
        }
        state = CopySceneStateType.WAITING_REMOVE;
        //默认设置失败
        isWin = false;
        sendOver();
        recycleDropAndBanSkill();
        //副本结束倒计时结束(直接清人)
        onOverTimeOut();
    }
    是将状态设置为待移除,!!!!
    所以在exitCopySceneTowerFloor()里状态是不对的,
    不会扣除消耗次数,属于bug!!!!待修改。
    
    4.本人修改如下,将副本运行时间超时修改为走统一调用fail()方法当成失败,
    让上面逻辑正确。
10.结束挑战(消耗挑战次数、隔天重置挑战进度)
11.活动开启和活动结束
活动开启:
ActorTowerModule:
DictActivity dictActivity = DictActivity.getRecordById(ActivityType.TOWER);
if (null == dictActivity)
{
    BPLog.BP_LOGIC.error("[四谛法洞]afterLoad dictActivity null, actorId:{}", 
    getActor().getActorID());
    return;
}
// 下次活动开始时间
long activityNextStartTime = TimeUtils.getNextTimeByCron(
    getActor().getActorCommonModule().getLastOffLineTime(), dictActivity.getStartTime());
if (getNowTickTime() >= activityNextStartTime)
{
    onActivityStart();
}
WorldTowerModule:
活动结束:
 /**
* 活动结束
*
* @param id
*/
public void onActivityEnd(int id)
{
    //获取排行榜数据迭代,拿到第一名玩家id存储
}
生成本场景npc外显是在WorldTowerModule.java下:
afterLoad()方法:
  buildTowerHoleNpcShow()