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