活动玩法-四谛法洞

2020/12/04 Mmo-Game

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()

Search

    Table of Contents