小兵招募加保底

master_zzxx
grimm 2024-06-04 18:04:23 +08:00
parent e0b0eb793e
commit e0695cf73e
4 changed files with 117 additions and 10 deletions

View File

@ -200,7 +200,7 @@ public class ArenaLogic {
*/
public void checkChallenge(User user, boolean ifUpdate) throws Exception {
if (!user.getTeamPosManager().getTeamPosForHero().containsKey(TeamEnum.TEAM_ARENA_DEFENSE.getTeamId())) {
throw new ErrorTableException(161);//编队未配置
throw new ErrorTableException(189);//编队未配置
}
SArenaSetting sArenaSetting = SArenaSetting.getSArenaSetting();
int battleFree = sArenaSetting.getBattleFree();

View File

@ -31,6 +31,8 @@ public class MainLevelManager extends MongoBase {
private int upSoldierLvEndTime;//兵力升级结束时间
private int soldierRestartTime;//小兵挂机开始时间
private Map<Integer, Integer> soldierStateInfo = new HashMap<>();//小兵每关单独挂机时间
private int soldierLowCount;// 小兵最低属性次数
public void init(){
int nowInt = TimeUtils.nowInt();
setStartTime(nowInt);
@ -269,4 +271,18 @@ public class MainLevelManager extends MongoBase {
this.soldierStateInfo.clear();
updateString("soldierStateInfo",soldierStateInfo);
}
public int getSoldierLowCount() {
return soldierLowCount;
}
public void setSoldierLowCount(int soldierLowCount) {
this.soldierLowCount = soldierLowCount;
updateString("soldierLowCount",soldierLowCount);
}
public void addSoldierLowCount(int count) {
this.soldierLowCount += count;
updateString("soldierLowCount",soldierLowCount);
}
}

View File

@ -101,7 +101,7 @@ public class DuoduiTowerLogic {
}
if (!verifyTeam(type, user)) {
LOGGER.error("队伍存在空阵容,类型:{},当前层数:{},要挑战层数:{}uid{}", type, rankTier, tier, user.getId());
throw new ErrorTableException(187);
throw new ErrorTableException(187);//编队为空
}
for (SDuoDuiTower tower : towers) {
PVEFightEvent pveFightEvent = new PVEFightEvent(user.getId(), tower.getTowerWaveTeam(), 20, GameFightType.DuoduiFight, tower.getId());

View File

@ -25,6 +25,7 @@ import com.ljsd.jieling.util.ItemUtil;
import com.ljsd.jieling.util.MessageUtil;
import com.ljsd.jieling.util.ToolsUtil;
import config.*;
import org.apache.commons.lang3.RandomUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import rpc.protocols.CommonProto;
@ -159,6 +160,35 @@ public class SoldierLogic {
if (lotteryConfig == null){
throw new ErrorCodeException(ErrorCode.CFG_NULL);//配置不存在
}
Soldier soldier = null;
int lowCount = mainLevelManager.getSoldierLowCount();//be
int maxNumber = SSpecialConfig.getIntegerValue("Soldiers_Lottery_Maxnumber");
if (lowCount >= maxNumber){
// 特殊招募
soldier = specialRecruitSoldier(user);
}
if (soldier == null){
// 普通招募
soldier = usuallyRecruitSoldier(user);
}
// 消耗
ItemUtil.itemCost(user, new int[][]{lotteryCost}, BIReason.SOLDIER_LOTTERY_COST, 0);
// 获得
mainLevelManager.updateSoldier(soldier);
CommonProto.Soldier soldierProto = CBean2Proto.getSoldierProto(soldier);
MapInfoProto.RecruitSoldierResponse.Builder builder = MapInfoProto.RecruitSoldierResponse.newBuilder().setSoldier(soldierProto);
MessageUtil.sendMessage(session, 1, MessageTypeProto.MessageType.RecruitSoldierResponse_VALUE, builder.build(), true);
}
/**
*
* @param user
* @return
*/
public Soldier usuallyRecruitSoldier(User user){
int soldierLv = user.getMainLevelManager().getSoldierLv();
SSoldiersLotteryConfig lotteryConfig = SSoldiersLotteryConfig.levelMap.get(soldierLv);
int[] soldierType = lotteryConfig.getSoldierType();
Random random = new Random();
int typeIndex = random.nextInt(soldierType.length);
@ -193,14 +223,73 @@ public class SoldierLogic {
soldier.setLevel(level);
soldier.setPosition(-1);
soldier.setAttributes(attributes);
// 消耗
ItemUtil.itemCost(user, new int[][]{lotteryCost}, BIReason.SOLDIER_LOTTERY_COST, 0);
// 获得
mainLevelManager.updateSoldier(soldier);
CommonProto.Soldier soldierProto = CBean2Proto.getSoldierProto(soldier);
MapInfoProto.RecruitSoldierResponse.Builder builder = MapInfoProto.RecruitSoldierResponse.newBuilder().setSoldier(soldierProto);
MessageUtil.sendMessage(session, 1, MessageTypeProto.MessageType.RecruitSoldierResponse_VALUE, builder.build(), true);
return soldier;
}
/**
*
* @param user
* @return
*/
public Soldier specialRecruitSoldier(User user){
MainLevelManager manager = user.getMainLevelManager();
int size = manager.getSoldierMap().values().size();
if (size == 0){
LOGGER.error("特殊次数招募小兵退出,玩家当前没有小兵, uid:{}, size{}",user.getId(), size);
return null;
}
int[] randomIntS = new int[size];
int index = 0;
for (Soldier value : manager.getSoldierMap().values()) {
randomIntS[index] = value.getPosition();
index++;
}
int i = RandomUtils.nextInt(0, size);
Soldier soldier = manager.getSoldier(randomIntS[i]);
if (soldier == null){
LOGGER.error("特殊次数招募小兵退出,随机的位置没有小兵, uid:{}, position{}",user.getId(), randomIntS[i]);
return null;
}
SSoldiersSetting setting = SSoldiersSetting.idMap.get(soldier.getId());
if (setting == null){
LOGGER.error("特殊次数招募小兵退出小兵id在SoldiersSetting表找不到, uid:{}, id{}",user.getId(), soldier.getId());
return null;
}
SSoldiersLevelConfig levelConfig = SSoldiersLevelConfig.libForLevelMap.get(setting.getSoldiers()).get(soldier.getLevel());
if (levelConfig == null){
LOGGER.error("特殊次数招募小兵退出小兵信息在SoldiersLevelConfig表找不到, uid:{}, libraryId{}, level:{}",user.getId(), setting.getSoldiers(), soldier.getLevel());
return null;
}
// 最大属性
HashMap<Integer, Long> maxAttrMap = new HashMap<>();
for (int[] ints : levelConfig.getProperty()) {
maxAttrMap.put(ints[0], (long) (ints[1] * (setting.getSoldierProperty()[1]/10000D)));
}
// 属性
HashMap<Integer, Long> attributes = new HashMap<>();
for (Map.Entry<Integer, Long> entry : soldier.getAttributes().entrySet()) {
int id = entry.getKey();
long value = entry.getValue();
Long maxValue = maxAttrMap.getOrDefault(id, 0L);
// 不到最大属性值,则随机增加
if (maxValue != 0 && value < maxValue){
attributes.put(id, value+1);
}else {
attributes.put(id, value);
}
}
// 封装
Soldier resultSoldier = new Soldier();
resultSoldier.setId(soldier.getId());
resultSoldier.setType(soldier.getType());
resultSoldier.setQuality(soldier.getQuality());
resultSoldier.setLevel(soldier.getLevel());
resultSoldier.setPosition(-1);
resultSoldier.setAttributes(attributes);
// 清零特殊次数
manager.setSoldierLowCount(0);
return resultSoldier;
}
/**
@ -249,6 +338,8 @@ public class SoldierLogic {
builder.setDrop(drop);
// 删除待招募区小兵
soldierMap.remove(notUsePosition);
// 记录遣散次数
mainLevelManager.addSoldierLowCount(1);
}
}
@ -276,7 +367,7 @@ public class SoldierLogic {
}
boolean levelOpen = MapLogic.getInstance().checkMainLevelOpen(user, stageConfig.getOpenRule());
if (!levelOpen){
throw new ErrorTableException(162);//关卡条件不满足
throw new ErrorTableException(188);//关卡条件不满足
}
int teamId = TeamEnum.MIAN_LINE_TEAM.getTeamId();