|
|
@@ -1,7 +1,9 @@
|
|
|
package com.td.WaDa.game.comcharactersdiscovery.service;
|
|
|
|
|
|
+import cn.hutool.core.convert.Convert;
|
|
|
import cn.hutool.core.date.DateUnit;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.util.ArrayUtil;
|
|
|
import cn.hutool.core.util.NumberUtil;
|
|
|
import com.td.WaDa.common.pojo.PageInfo;
|
|
|
import com.td.WaDa.common.service.*;
|
|
|
@@ -15,6 +17,8 @@ import com.td.WaDa.game.comcharactersdiscovery.pojo.ComCharactersDiscovery;
|
|
|
import com.td.WaDa.game.comcharactersdiscovery.vo.ComCharactersDiscoveryClientVo;
|
|
|
import com.td.WaDa.game.comcharactersdiscovery.vo.ComCharactersDiscoveryVo;
|
|
|
import com.td.WaDa.game.comcharactersdiscovery.repository.ComCharactersDiscoveryRepository;
|
|
|
+import com.td.WaDa.game.excelcharacterlevel.service.ExcelCharacterLevelService;
|
|
|
+import com.td.WaDa.game.excelcharacterlevel.vo.ExcelCharacterLevelVo;
|
|
|
import com.td.WaDa.game.exceldrop.pojo.ExcelDrop;
|
|
|
import com.td.WaDa.game.exceldrop.service.ExcelDropService;
|
|
|
import com.td.WaDa.game.exceldrop.vo.ExcelDropClientVo;
|
|
|
@@ -28,11 +32,13 @@ import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.util.StringUtils;
|
|
|
|
|
|
import javax.persistence.EntityManager;
|
|
|
import javax.persistence.PersistenceContext;
|
|
|
import java.io.IOException;
|
|
|
import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
@Service
|
|
|
@Transactional
|
|
|
@@ -53,6 +59,9 @@ public class ComCharactersDiscoveryServiceImpl extends CommonServiceImpl<ComChar
|
|
|
@Autowired
|
|
|
private ExcelSceneService excelSceneService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private ExcelCharacterLevelService excelCharacterLevelService;
|
|
|
+
|
|
|
|
|
|
@Override
|
|
|
public ComCharactersDiscoveryVo addDiscoverRole(ComCharactersVo charactersVo, Integer sceneId) {
|
|
|
@@ -132,39 +141,64 @@ public class ComCharactersDiscoveryServiceImpl extends CommonServiceImpl<ComChar
|
|
|
return backPageInfo;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 挖矿工作状态
|
|
|
+ * 1.工作时间未完结时候,刷新按照最后一次updateTime来判定是否重新计算产出,假如挖矿和勘探分别有不同的时间
|
|
|
+ * 2.工作未完结时间,记录当前产出的物品和产出m
|
|
|
+ * 3.工作完结,删除工作队列,相关产出转移背包,计算经验等。(todo 删除的队列进入回收列表)
|
|
|
+ * 4.可中途结束工作
|
|
|
+ *
|
|
|
+ * @param discoveryVo
|
|
|
+ * @return
|
|
|
+ */
|
|
|
@Override
|
|
|
- public ComCharactersDiscoveryClientVo explorationState(ComCharactersDiscoveryVo discoveryVo) {
|
|
|
+ public ComCharactersDiscoveryClientVo explorationState(ComCharactersDiscoveryVo discoveryVo, Boolean isStop) {
|
|
|
+ //todo 经验如何设置
|
|
|
+ Integer outExp = 500;
|
|
|
+ //todo 获取当前人物等级经验表,待优化
|
|
|
+ List<ExcelCharacterLevelVo> excelCharacterLevelVo = excelCharacterLevelService.list(new ExcelCharacterLevelVo()).getData();
|
|
|
+ //todo 已产生的奖励物品
|
|
|
+ String[] _hasDropIds = StringUtils.hasText(discoveryVo.getRewardItem()) ? discoveryVo.getRewardItem().split("\\|") : new String[0];
|
|
|
//记录当前的产出奖励
|
|
|
List<ExcelDropClientVo> outExcelDrops = new ArrayList<>();
|
|
|
- //工作开始后到现在的 当前的秒数
|
|
|
- Long difSecond = DateUtil.between(discoveryVo.getWorkStart(), DateUtil.date(), DateUnit.SECOND);
|
|
|
+ //用更新数据时间来计算 当前的秒数,为零说明工作完成
|
|
|
+ Long difSecond = isStop ? 0 : DateUtil.between(discoveryVo.getUpdateTime(), DateUtil.date(), DateUnit.SECOND);
|
|
|
Integer outTransUpperLimit = 0;
|
|
|
|
|
|
+ //开始工作时间 + 工作天数
|
|
|
+ Date endDate = DateUtil.offsetDay(discoveryVo.getWorkStart(), discoveryVo.getWorkDay());
|
|
|
+ //当前时间与结束时间的毫秒
|
|
|
+ Long dif = DateUtil.between(DateUtil.date(), endDate, DateUnit.MS);
|
|
|
+
|
|
|
+ //判断是否结束工作 小于等于零即完成
|
|
|
+ if (dif <= 0) {
|
|
|
+ discoveryVo.setIsWork(1);
|
|
|
+ }
|
|
|
|
|
|
//todo 根据场景id获取当前场景配置 后面处理缓存,提高速度
|
|
|
//主场景id
|
|
|
ExcelScene excelScene = excelSceneService.findBySceneId(discoveryVo.getSceneId());
|
|
|
//当前场景层级对应的物品
|
|
|
- Integer[] _dropIds = (Integer[]) Arrays.stream(excelScene.getSceneEvent().split("\\|")).map(Integer::parseInt).toArray();
|
|
|
+ Integer[] _dropIds = Convert.toIntArray(excelScene.getSceneEvent().split("\\|"));
|
|
|
List<ExcelDrop> excelDrops = excelDropService.getListByIds(_dropIds);
|
|
|
List<ExcelDropClientVo> dropClientVos = CopyUtil.copyList(excelDrops, ExcelDropClientVo.class);
|
|
|
|
|
|
//当前探索队伍
|
|
|
String[] roleId = discoveryVo.getRoleId().split("\\|");
|
|
|
- Integer[] _roleIds = (Integer[]) Arrays.stream(roleId).map(Integer::parseInt).toArray();
|
|
|
+ Integer[] _roleIds = Convert.toIntArray(roleId);
|
|
|
|
|
|
//角色list
|
|
|
List<ComCharactersClientVo> comCharactersClientVos = new ArrayList<>();
|
|
|
|
|
|
-
|
|
|
//先找出三个职业对象
|
|
|
ComCharactersVo powerChar = null, intelliChar = null, skillChar = null;
|
|
|
List<ComCharacters> characters = comCharactersService.findByRoleIdIn(_roleIds);
|
|
|
for (int i = 0; i < characters.size(); i++) {
|
|
|
- ComCharactersVo comCharactersVo = CopyUtil.copy(characters,ComCharactersVo.class); //comCharactersService.getVo(Integer.parseInt(roleId[i]));
|
|
|
+ ComCharactersVo comCharactersVo = CopyUtil.copy(characters.get(i), ComCharactersVo.class); //comCharactersService.getVo(Integer.parseInt(roleId[i]));
|
|
|
//根据当前角色的职业计算
|
|
|
Integer _professional = Integer.parseInt(comCharactersVo.getProfessional());
|
|
|
- if (_professional.equals(GameEnum.PRO_POWER.getValue())) {
|
|
|
+ if (_professional.equals(GameEnum.PRO_SKIlLS.getValue())) {
|
|
|
+ //运输工
|
|
|
skillChar = comCharactersVo;
|
|
|
//计算当前运输格数,即获取到物品的上限
|
|
|
//场景的最低运输数量
|
|
|
@@ -172,12 +206,13 @@ public class ComCharactersDiscoveryServiceImpl extends CommonServiceImpl<ComChar
|
|
|
Integer _sceneLimit = excelScene.getAmount();
|
|
|
outTransUpperLimit = _selfLimit > _sceneLimit ? _selfLimit : _sceneLimit;
|
|
|
} else if (_professional.equals(GameEnum.PRO_POWER.getValue())) {
|
|
|
+ //矿工
|
|
|
powerChar = comCharactersVo;
|
|
|
} else if (_professional.equals(GameEnum.PRO_INTELLIGENCE.getValue())) {
|
|
|
+ //勘测地形
|
|
|
intelliChar = comCharactersVo;
|
|
|
}
|
|
|
- ComCharactersClientVo comCharactersClientVo = CopyUtil.copy(comCharactersVo, ComCharactersClientVo.class);
|
|
|
- comCharactersClientVos.add(comCharactersClientVo);
|
|
|
+
|
|
|
}
|
|
|
if (powerChar != null) {
|
|
|
// 每3秒执行一次挖矿动作。根据属性数值概率,获得收益
|
|
|
@@ -187,21 +222,28 @@ public class ComCharactersDiscoveryServiceImpl extends CommonServiceImpl<ComChar
|
|
|
int _count = (int) Math.floor(difSecond / 3); // 一共执行的工作次数和休息
|
|
|
log.info("执行的工作次数:" + _count);
|
|
|
//按次数执行奖励
|
|
|
- for (int j = 0; j < _count; j++) {
|
|
|
- //采集x4+休息x1
|
|
|
- if (_count % 5 != 0) {
|
|
|
- //工作,并且奖励物品
|
|
|
- if (NumberUtil.compare(new Random().nextDouble(), getRatioByPower(_power)) > 0) {
|
|
|
- //判断是否达到获取物品上限,todo 目前暂时最多对应30
|
|
|
- if (j < 30) {
|
|
|
- //ExcelDrop excelDrop = excelDropService.randomGetDropBySceneId(141);
|
|
|
+ //对应物品数量少于或等于运输数量
|
|
|
+ if (_hasDropIds.length < outTransUpperLimit) {
|
|
|
+ for (int j = 0; j < _count; j++) {
|
|
|
+ //采集x4+休息x1
|
|
|
+ if (_count % 5 != 0) {
|
|
|
+ //工作,并且奖励物品
|
|
|
+ if (NumberUtil.compare(new Random().nextDouble(), getRatioByPower(_power)) > 0) {
|
|
|
int index = (int) (Math.random() * dropClientVos.size());
|
|
|
ExcelDropClientVo _clientVo = dropClientVos.get(index);
|
|
|
- outExcelDrops.add(_clientVo);
|
|
|
+ _hasDropIds = (String[]) ArrayUtil.append(_hasDropIds, _clientVo.getId());
|
|
|
+ if (_hasDropIds.length == outTransUpperLimit) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ //完结后三个分别增加经验
|
|
|
+ //收获经验 todo 处理人物升级等
|
|
|
+ ComCharactersClientVo comCharactersClientVo = upgradeComCharactersVo(powerChar, excelCharacterLevelVo, outExp);
|
|
|
+ comCharactersClientVos.add(comCharactersClientVo);
|
|
|
}
|
|
|
if (intelliChar != null) {
|
|
|
//勘测地形,用于进入下层场景的职业
|
|
|
@@ -212,7 +254,7 @@ public class ComCharactersDiscoveryServiceImpl extends CommonServiceImpl<ComChar
|
|
|
int _count = (int) Math.floor(difSecond / 15); // 一共执行勘探的次数
|
|
|
//按次数执行奖励
|
|
|
for (int j = 0; j < _count; j++) {
|
|
|
- //计算是否进入下一层,最底层就不再判断
|
|
|
+ //计算是否进入下一层的概率
|
|
|
double _nextRatio = gotoNextSceneRatio(discoveryVo.getDiscoverLevel(), _intelligence);
|
|
|
if (NumberUtil.compare(new Random().nextDouble(), _nextRatio) > 0) {
|
|
|
//todo 切换关卡的奖励物品
|
|
|
@@ -231,29 +273,37 @@ public class ComCharactersDiscoveryServiceImpl extends CommonServiceImpl<ComChar
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ //完结后三个分别增加经验
|
|
|
+ //收获经验 todo 处理人物升级等
|
|
|
+ ComCharactersClientVo comCharactersClientVo = upgradeComCharactersVo(intelliChar, excelCharacterLevelVo, outExp);
|
|
|
+ comCharactersClientVos.add(comCharactersClientVo);
|
|
|
+ }
|
|
|
+ if (skillChar != null) {
|
|
|
+ //完结后三个分别增加经验
|
|
|
+ //收获经验 todo 处理人物升级等
|
|
|
+ ComCharactersClientVo comCharactersClientVo = upgradeComCharactersVo(skillChar, excelCharacterLevelVo, outExp);
|
|
|
+ comCharactersClientVos.add(comCharactersClientVo);
|
|
|
}
|
|
|
- //完结后三个分别增加经验
|
|
|
- //收获经验 todo 处理人物升级等
|
|
|
- Integer _exp = powerChar.getExp() + 500;
|
|
|
- powerChar.setExp(_exp);
|
|
|
- comCharactersService.save(powerChar);
|
|
|
-
|
|
|
- Integer _exp3 = intelliChar.getExp() + 500;
|
|
|
- intelliChar.setExp(_exp3);
|
|
|
- comCharactersService.save(intelliChar);
|
|
|
-
|
|
|
- Integer _exp2 = skillChar.getExp() + 500;
|
|
|
- skillChar.setExp(_exp2);
|
|
|
- comCharactersService.save(skillChar);
|
|
|
-
|
|
|
-
|
|
|
ComCharactersDiscoveryClientVo discoveryClientVo = CopyUtil.copy(discoveryVo, ComCharactersDiscoveryClientVo.class);
|
|
|
-
|
|
|
discoveryClientVo.setSubCharacters(comCharactersClientVos);//当前职业
|
|
|
+
|
|
|
+ for (int i = 0; i < _hasDropIds.length; i++) {
|
|
|
+ //这里的对应excel_drop表格的id,dropClientVos id顺序就是当前的index+1
|
|
|
+ outExcelDrops.add(dropClientVos.get(Integer.parseInt(_hasDropIds[i]) + 1));
|
|
|
+ }
|
|
|
+ //List<ExcelDropClientVo> _getDrops = outExcelDrops.subList(0, outTransUpperLimit);
|
|
|
+ //记录一个物品获得情况
|
|
|
+ //List<String> _getDropIds = _getDrops.stream().map(e -> e.getId().toString()).collect(Collectors.toList());
|
|
|
+ String _rewardItem = String.join("|", _hasDropIds);
|
|
|
+ discoveryVo.setRewardItem(_rewardItem);
|
|
|
+ //保存挖矿数据
|
|
|
+ //设置一次updateTime
|
|
|
+ discoveryVo.setUpdateTime(DateUtil.date());
|
|
|
+ super.save(discoveryVo);
|
|
|
//输出限制
|
|
|
- discoveryClientVo.setSubDrops(outExcelDrops.subList(0, outTransUpperLimit));//当前产出物品
|
|
|
- //当前奖励的物品
|
|
|
- discoveryClientVo.setSubRewardDrops(dropClientVos);
|
|
|
+ discoveryClientVo.setSubGetDrops(outExcelDrops);//当前产出物品
|
|
|
+ //全部的奖励物品
|
|
|
+ discoveryClientVo.setSubAllDrops(dropClientVos);
|
|
|
return discoveryClientVo;
|
|
|
}
|
|
|
|
|
|
@@ -291,6 +341,35 @@ public class ComCharactersDiscoveryServiceImpl extends CommonServiceImpl<ComChar
|
|
|
return discoveryClientVo;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 存储
|
|
|
+ *
|
|
|
+ * @param comCharactersVo
|
|
|
+ */
|
|
|
+ private ComCharactersClientVo upgradeComCharactersVo(ComCharactersVo comCharactersVo, List<ExcelCharacterLevelVo> excelCharacterLevelVo, Integer outExp) {
|
|
|
+ Integer _exp = comCharactersVo.getExp() + outExp;
|
|
|
+ Integer _level = comCharactersVo.getLevel();
|
|
|
+ Integer final_level = _level;
|
|
|
+ ExcelCharacterLevelVo characterLevelVo = excelCharacterLevelVo.stream().filter(e -> e.getId().equals(final_level)).findFirst().get();
|
|
|
+
|
|
|
+
|
|
|
+ while (_exp > characterLevelVo.getExp()) {
|
|
|
+ _exp -= characterLevelVo.getExp();
|
|
|
+ _level += 1;//提升一级
|
|
|
+ Integer final_level2 = _level;
|
|
|
+ characterLevelVo = excelCharacterLevelVo.stream().filter(e -> e.getId().equals(final_level2)).findFirst().get();
|
|
|
+ }
|
|
|
+ //最后的等级和经验
|
|
|
+ comCharactersVo.setLevel(_level);
|
|
|
+ comCharactersVo.setExp(_exp);
|
|
|
+ //存储一次
|
|
|
+ comCharactersService.save(comCharactersVo);
|
|
|
+ ComCharactersClientVo comCharactersClientVo = CopyUtil.copy(comCharactersVo, ComCharactersClientVo.class);
|
|
|
+ //返回当前需要升级的经验
|
|
|
+ comCharactersClientVo.setLevelUpExp(characterLevelVo.getExp());
|
|
|
+ return comCharactersClientVo;
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
private double getRatioByPower(Integer value) {
|
|
|
double _ratio = 0d;
|