大闹天宫改活动

master_ob2
PC-202302260912\Administrator 2023-07-25 17:23:23 +08:00
parent 710ad4c35d
commit c297f5184a
8 changed files with 178 additions and 131 deletions

View File

@ -15,12 +15,10 @@ import com.ljsd.jieling.util.CBean2Proto;
import config.SExpeditionNodeConfig;
import config.SExpeditionRecruitConfig;
import config.SExpeditionSetting;
import config.SRobotProperty;
import manager.STableManager;
import rpc.protocols.CommonProto;
import rpc.protocols.Expedition;
import rpc.protocols.MessageTypeProto;
import util.StringUtil;
import java.util.Map;
import java.util.TreeSet;
@ -72,7 +70,7 @@ public class HeroNodeGetInfoRequestHandler extends BaseHandler<Expedition.HeroNo
// 获取英雄池id
int poolId = sExpeditionNodeConfig.getPoolId();
// 从池中随机指定数量的英雄模板
TreeSet<Integer> randomTid = ExpeditionLogic.getRandomTid(poolId, recruitTime);
TreeSet<Integer> randomTid = ExpeditionLogic.getInstance().getRandomTid(poolId, recruitTime);
//获取最高等级英雄
Hero hero = HeroLogic.getHeroByMaxLevel(user);

View File

@ -247,7 +247,7 @@ public class Cmd_role_gm extends GmRoleAbstract {
SExpeditionNodeConfig sExpeditionNodeConfig = STableManager.getConfig(SExpeditionNodeConfig.class).get(nodeInfo.getType());
int poolId = sExpeditionNodeConfig.getPoolId();
int tempId =ExpeditionLogic.getRandomTid(poolId,1).first();
int tempId =ExpeditionLogic.getInstance().getRandomTid(poolId,1).first();
SExpeditionRecruitConfig sExpeditionRecruitConfig = STableManager.getConfig(SExpeditionRecruitConfig.class).get(tempId);
if(sExpeditionRecruitConfig==null) {
throw new ErrorCodeException(ErrorCode.CFG_NULL);

View File

@ -118,7 +118,7 @@ public enum ActivityTypeEnum {
FABAO_BOOK_REWARD(ActivityType.FABAO_BOOK_REWARD,FabaoBookRewardActivity::new),//法宝图鉴宝箱
DRAW_FABAO_LV_CHEST(ActivityType.DRAW_FABAO_LV_CHEST,DrawLvChestActivity::new),//抽卡等级宝箱
TIAN_JIANG_GIFT(ActivityType.TIAN_JIANG_GIFT,DefaultEmptyActivity::new),//抽卡等级宝箱
DA_NAO_TIAN_GONG(ActivityType.DA_NAO_TIAN_GONG, DaNaoTianGongActivity::new),//大闹天宫
DA_NAO_TIAN_GONG(ActivityType.DA_NAO_TIAN_GONG, ExpeditionActivity::new),//大闹天宫
LINGLONG_BAOJING_TASK(ActivityType.LINGLONG_BAOJING_TASK, DefaultEmptyActivity::new),//玲珑宝镜任务
/****************************************************** bt **********************************************************/

View File

@ -14,16 +14,20 @@ import com.ljsd.jieling.logic.expedition.ExpeditionLogic;
import com.ljsd.jieling.network.session.ISession;
import com.ljsd.jieling.util.ItemUtil;
import com.ljsd.jieling.util.MessageUtil;
import config.SExpeditionDaily;
import config.SSpecialConfig;
import rpc.protocols.CommonProto;
import rpc.protocols.PlayerInfoProto;
import util.TimeUtils;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Map;
import java.util.Set;
public class DaNaoTianGongActivity extends AbstractActivity{
public class ExpeditionActivity extends AbstractActivity{
public DaNaoTianGongActivity(int id) {
public ExpeditionActivity(int id) {
super(id);
Poster.getPoster().listenEvent(this, ZeroRefreshEvent.class);
}
@ -51,8 +55,41 @@ public class DaNaoTianGongActivity extends AbstractActivity{
refresh(user);
}
private void refresh(User user){
/**
*
* @param user
* @return
*/
private int getDay(User user){
ActivityMission mission = user.getActivityManager().getActivityMissionMap().get(id);
if (mission == null){
return 0;
}
return TimeUtils.differentDays(mission.getCreatTime(), TimeUtils.now()) + 1;
}
/**
*
* @param user
*/
private void refresh(User user){
int day = getDay(user);
SExpeditionDaily daily = SExpeditionDaily.map.get(day);
if (daily == null){
return;
}
ActivityMission mission = user.getActivityManager().getActivityMissionMap().get(id);
if (mission == null){
return;
}
Map<Integer, ActivityProgressInfo> missionMap = mission.getActivityMissionMap();
missionMap.clear();
Set<Integer> randomHoly = ExpeditionLogic.getInstance().getRandomHoly(user,5,daily.getHolyProbability());
for (Integer holy : randomHoly) {
ActivityProgressInfo info = new ActivityProgressInfo();
info.setProgrss(holy);
missionMap.put(holy,info);
}
}
@Override
@ -68,7 +105,8 @@ public class DaNaoTianGongActivity extends AbstractActivity{
throw new ErrorCodeException(ErrorCode.HAD_TAKE_REWARD, format);
}
checkAndSetProgress(mission,missionId,ActivityType.HAD_TAKED);
// 领取并更新状态
checkAndSetProgress(session,missionId,ActivityType.HAD_TAKED);
int[] value = SSpecialConfig.getOnceArrayValue("Danaotiangong_daily_reward");
int[][] reward = {value};
@ -87,15 +125,19 @@ public class DaNaoTianGongActivity extends AbstractActivity{
/**
*
*/
public void checkAndSetProgress(ActivityMission activityMission, int missionId, int state) {
public void checkAndSetProgress(ISession session, int missionId, int state) throws Exception {
ExpeditionLogic.getInstance().takeHoly(session, missionId);
User user = UserManager.getUser(session.getUid());
ActivityProgressInfo progressInfo = new ActivityProgressInfo();
progressInfo.setProgrss(missionId);
progressInfo.setState(state);
activityMission.getActivityMissionMap().put(missionId, progressInfo);
activityMission.setV(1);
ActivityMission mission = user.getActivityManager().getActivityMissionMap().get(id);
mission.getActivityMissionMap().put(missionId, progressInfo);
mission.setV(1);
}
@Override
public boolean checkActivityMissionFinishAndTake(int uid, int activityId, ActivityMission activityMission) {
return false;

View File

@ -1,19 +1,25 @@
package com.ljsd.jieling.logic.expedition;
import com.ljsd.fight.FamilyHeroInfo;
import com.ljsd.jieling.config.clazzStaticCfg.CommonStaticConfig;
import com.ljsd.jieling.exception.ErrorCode;
import com.ljsd.jieling.exception.ErrorCodeException;
import com.ljsd.jieling.logic.dao.*;
import com.ljsd.jieling.logic.dao.ExpeditionNodeInfo;
import com.ljsd.jieling.logic.dao.SnapFightInfo;
import com.ljsd.jieling.logic.dao.UserManager;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.logic.hero.HeroLogic;
import com.ljsd.jieling.logic.rank.RankLogic;
import config.*;
import config.SExpeditionFloorConfig;
import config.SExpeditionSetting;
import config.SRobotProperty;
import config.SRobotSkill;
import manager.STableManager;
import util.MathUtils;
import util.StringUtil;
import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
*
@ -33,7 +39,7 @@ public class BattleNode extends AbstractExpedition {
SExpeditionFloorConfig config = STableManager.getConfig(SExpeditionFloorConfig.class).get(index);
User user = UserManager.getUser(uid);
nodeHolyInfo(user,type,config,nodeInfo);
nodeHolyInfo(user, config,nodeInfo);
nodeFightInfo(user,leve,nodeInfo);
@ -60,8 +66,9 @@ public class BattleNode extends AbstractExpedition {
// 万分比
double base = 10000d;
// 上下浮动值
double min = sExpeditionSetting.getMatchForce()[leve-1][0]/base;
double max = sExpeditionSetting.getMatchForce()[leve-1][1]/base;
int[][] matchForce = sExpeditionSetting.getMatchForce();
double min = matchForce[leve-1][0]/base;
double max = matchForce[leve-1][1]/base;
// 初始等级,前六名平均等级
int averageLevel = HeroLogic.getInstance().getAverageLevel(user, 6);
// 第一次计算,随机出来机器人等级,(【向上取整】基础等级 *(最低浮动 + (当前节点位置 / 总层数 *(最高浮动-最低浮动))))
@ -88,36 +95,12 @@ public class BattleNode extends AbstractExpedition {
/**
*
* @param user
* @param type
* @param cfg
* @param nodeInfo
*/
private void nodeHolyInfo(User user, int type, SExpeditionFloorConfig cfg, ExpeditionNodeInfo nodeInfo){
Set<Integer> staffsSet = new HashSet<>();
while (staffsSet.size()<3){
int[][] probability = cfg.getHolyProbability();
int[][] holyProbability = new int[probability.length][2];
for(int j = 0; j < holyProbability.length; j++){
System.arraycopy(probability[j], 0, holyProbability[j], 0, 2);
}
SExpeditionNodeConfig sExpeditionNodeConfig = STableManager.getConfig(SExpeditionNodeConfig.class).get(type);
if(null!=sExpeditionNodeConfig && sExpeditionNodeConfig.getHolyProbability().length==3){
for (int j = 0; j <holyProbability.length ; j++) {
holyProbability[j][1]+= sExpeditionNodeConfig.getHolyProbability()[j][1];
}
}
int ints;
try {
ints = MathUtils.randomFromWeight(holyProbability);
}catch (Exception e){
break;
}
Map<Integer, Integer> type2holy2weight = getType2holy2weightRemoveHas(user, ints);
int i1 = ExpeditionLogic.ranndomFromWeight(type2holy2weight);
staffsSet.add(i1);
}
nodeInfo.setHolyEquipId(staffsSet);
private void nodeHolyInfo(User user, SExpeditionFloorConfig cfg, ExpeditionNodeInfo nodeInfo){
Set<Integer> randomHoly = ExpeditionLogic.getInstance().getRandomHoly(user,type,cfg.getHolyProbability());
nodeInfo.setHolyEquipId(randomHoly);
}
/**
@ -212,77 +195,4 @@ public class BattleNode extends AbstractExpedition {
nodeInfo.setBossHP(bossHP);
}
/**
*
* @param user
* @param type
* @return
*/
private Map<Integer, Integer> getType2holy2weightRemoveHas(User user, int type) {
// 策划表的圣物,因为会有删除操作,所以需要重新赋值,而不是直接引用
Map<Integer, Integer> weight = STableManager.getFigureConfig(CommonStaticConfig.class).getType2holy2weight(type);
if (weight == null){
return new HashMap<>();
}
Map<Integer, Integer> valueMap = new HashMap<>(weight);
ExpeditionManager expeditionManager = user.getExpeditionManager();
// 已拥有的圣物
Set<ExpeditionItem> items = expeditionManager.getPropertyItems();
Set<Integer> ids = new HashSet<>();
items.forEach(id->ids.add(id.getEquipId()));
// 大闹天宫临时英雄
Map<String, Hero> expeditonHeroMap = expeditionManager.getHeroMap();
Set<Integer> expeditonHeroIds = new HashSet<>();
expeditonHeroMap.values().forEach(v->expeditonHeroIds.add(v.getTemplateId()));
expeditonHeroIds.addAll(expeditionManager.getGHeroSet());
// 已生成得节点圣物信息
Set<Integer> nodeHolyInfo = getNodeHolyInfo(user);
// 因为有删除操作所以使用iterator遍历
Iterator<Integer> iterator = valueMap.keySet().iterator();
while (iterator.hasNext()){
Integer v = iterator.next();
SExpeditionHolyConfig holyConfig = STableManager.getConfig(SExpeditionHolyConfig.class).get(v);
// 重复圣物
if (ids.contains(v) && holyConfig.getCanRepeat() == 0){
iterator.remove();
continue;
}
// 不存在的英雄,专属圣物
if (holyConfig.getHeroId() != 0){
if (!expeditonHeroIds.contains(holyConfig.getHeroId())){
iterator.remove();
continue;
}
}
// 已经生成过得圣物
if(nodeHolyInfo.contains(v)){
iterator.remove();
}
}
return valueMap;
}
/**
*
* @param user
* @return
*/
private static Set<Integer> getNodeHolyInfo(User user){
Set<Integer> set = new HashSet<>();
// 以生成得节点信息,非空验证
Collection<ExpeditionNodeInfo> values = user.getExpeditionManager().getExpeditionNodeInfos().values();
if (values.size() <= 0){
return set;
}
// 聚合操作,首先排除不存在圣物得节点,然后循环添加剩余节点圣物
values.stream()
.filter(val->val.getHolyEquipId() != null && val.getHolyEquipId().size() > 0)
.forEach(val->set.addAll(val.getHolyEquipId()));
return set;
}
}

View File

@ -699,8 +699,112 @@ public class ExpeditionLogic {
}
}
/**
* buff
* @param user
* @param probability
* @return
*/
public Set<Integer> getRandomHoly(User user,int type, int[][] probability){
Set<Integer> staffsSet = new HashSet<>();
while (staffsSet.size()<3){
int[][] holyProbability = new int[probability.length][2];
for(int j = 0; j < holyProbability.length; j++){
System.arraycopy(probability[j], 0, holyProbability[j], 0, 2);
}
SExpeditionNodeConfig sExpeditionNodeConfig = STableManager.getConfig(SExpeditionNodeConfig.class).get(type);
if(null!=sExpeditionNodeConfig && sExpeditionNodeConfig.getHolyProbability().length==3){
for (int j = 0; j <holyProbability.length ; j++) {
holyProbability[j][1]+= sExpeditionNodeConfig.getHolyProbability()[j][1];
}
}
int ints;
try {
ints = MathUtils.randomFromWeight(holyProbability);
}catch (Exception e){
break;
}
Map<Integer, Integer> type2holy2weight = getType2holy2weightRemoveHas(user, ints);
int i1 = ExpeditionLogic.ranndomFromWeight(type2holy2weight);
staffsSet.add(i1);
}
return staffsSet;
}
public static TreeSet<Integer> getRandomTid(int type,int size)throws ErrorCodeException{
/**
*
* @param user
* @param type
* @return
*/
private Map<Integer, Integer> getType2holy2weightRemoveHas(User user, int type) {
// 策划表的圣物,因为会有删除操作,所以需要重新赋值,而不是直接引用
Map<Integer, Integer> weight = STableManager.getFigureConfig(CommonStaticConfig.class).getType2holy2weight(type);
if (weight == null){
return new HashMap<>();
}
Map<Integer, Integer> valueMap = new HashMap<>(weight);
ExpeditionManager expeditionManager = user.getExpeditionManager();
// 已拥有的圣物
Set<ExpeditionItem> items = expeditionManager.getPropertyItems();
Set<Integer> ids = new HashSet<>();
items.forEach(id->ids.add(id.getEquipId()));
// 大闹天宫临时英雄
Map<String, Hero> expeditonHeroMap = expeditionManager.getHeroMap();
Set<Integer> expeditonHeroIds = new HashSet<>();
expeditonHeroMap.values().forEach(v->expeditonHeroIds.add(v.getTemplateId()));
expeditonHeroIds.addAll(expeditionManager.getGHeroSet());
// 已生成得节点圣物信息
Set<Integer> nodeHolyInfo = getNodeHolyInfo(user);
// 因为有删除操作所以使用iterator遍历
Iterator<Integer> iterator = valueMap.keySet().iterator();
while (iterator.hasNext()){
Integer v = iterator.next();
SExpeditionHolyConfig holyConfig = STableManager.getConfig(SExpeditionHolyConfig.class).get(v);
// 重复圣物
if (ids.contains(v) && holyConfig.getCanRepeat() == 0){
iterator.remove();
continue;
}
// 不存在的英雄,专属圣物
if (holyConfig.getHeroId() != 0){
if (!expeditonHeroIds.contains(holyConfig.getHeroId())){
iterator.remove();
continue;
}
}
// 已经生成过得圣物
if(nodeHolyInfo.contains(v)){
iterator.remove();
}
}
return valueMap;
}
/**
*
* @param user
* @return
*/
private Set<Integer> getNodeHolyInfo(User user){
Set<Integer> set = new HashSet<>();
// 以生成得节点信息,非空验证
Collection<ExpeditionNodeInfo> values = user.getExpeditionManager().getExpeditionNodeInfos().values();
if (values.size() <= 0){
return set;
}
// 聚合操作,首先排除不存在圣物得节点,然后循环添加剩余节点圣物
values.stream()
.filter(val->val.getHolyEquipId() != null && val.getHolyEquipId().size() > 0)
.forEach(val->set.addAll(val.getHolyEquipId()));
return set;
}
public TreeSet<Integer> getRandomTid(int type,int size)throws ErrorCodeException{
//select collections
Map<Integer, Integer> cfg = STableManager.getFigureConfig(CommonStaticConfig.class).type2Recruitcfgs.getOrDefault(type, new HashMap<>());

View File

@ -48,7 +48,7 @@ public class SpecialNode extends AbstractExpedition {
SExpeditionNodeConfig sExpeditionNodeConfig = STableManager.getConfig(SExpeditionNodeConfig.class).get(nodeInfo.getType());
int poolId = sExpeditionNodeConfig.getPoolId();
SnapFightInfo fightInfo = new SnapFightInfo();
int tempId =ExpeditionLogic.getRandomTid(poolId,1).first();
int tempId =ExpeditionLogic.getInstance().getRandomTid(poolId,1).first();
SExpeditionRecruitConfig sExpeditionRecruitConfig = STableManager.getConfig(SExpeditionRecruitConfig.class).get(tempId);
if(sExpeditionRecruitConfig==null) {
throw new ErrorCodeException(ErrorCode.CFG_NULL);

View File

@ -4,9 +4,7 @@ import com.ljsd.jieling.logic.dao.CumulationData;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.logic.mission.MissionLoigc;
import com.ljsd.jieling.logic.mission.MissionState;
import config.SHomeLandTask;
import config.SThemeActivityTaskConfig;
import manager.STableManager;
import java.util.List;
import java.util.Set;
@ -32,11 +30,6 @@ public class DonghaiXunxianMissionType extends AbstractMissionType {
return config.getIntegral();
}
@Override
public void getAllRewards(List<int[][]> itemAttrs){
super.getAllRewards(this, itemAttrs);
}
@Override
public void calCumulationDataResult(User user, CumulationData.Result result, List<MissionStateChangeInfo> missionStateChangeInfos, CumulationData cumulationData) throws Exception {
// 进行中得任务