血战&异妖战斗

back_recharge
wangyuan 2019-08-31 13:45:45 +08:00
parent b9f2d0d096
commit 7cea36baab
39 changed files with 1438 additions and 119 deletions

View File

@ -23,6 +23,10 @@ local BattleMain = {}
local BattleLogic = BattleLogic
local Random = Random
local _BattleErrorCache = {}
local _BattleErrorIndex = 0
local _seed
local _type
local _fightData
local _optionData
@ -101,7 +105,7 @@ local function generateRecordFile()
os.date("%H"),
os.date("%M"),
os.date("%S"))
local file = io.open("../luafight/BattleRecord/"..time..".txt", "a")
local file = io.open("luafight/BattleRecord/"..time..".txt", "a")
local record = BattleLogic.GetRecord()
for i=1, #record do
file:write(record[i].."\n")
@ -109,7 +113,25 @@ local function generateRecordFile()
io.close(file)
end
local function addBattleData()
local str = ""
str = str.."seed:\n"..tostring(_seed).."\n"
str = str.."type:\n"..tostring(_type).."\n"
str = str.."fightData:\n"..PrintTable(_fightData).."\n"
str = str.."optionData:\n"..PrintTable(_optionData).."\n"
_BattleErrorIndex = _BattleErrorIndex + 1
if _BattleErrorIndex > 5 then
_BattleErrorIndex = 1
end
_BattleErrorCache[_BattleErrorIndex] = str
end
function BattleMain.Execute(args, fightData, optionData)
print("trfghjdfgucvhbjnfdcgvj")
_seed = args.seed
_type = args.type
_fightData = fightData
_optionData = optionData or {}
@ -121,6 +143,7 @@ function BattleMain.Execute(args, fightData, optionData)
if xpcall(function ()
Random.SetSeed(args.seed)
BattleLogic.Init(args.maxTime, fightData, optionData)
BattleLogic.Type = _type
BattleLogic.StartOrder()
while not BattleLogic.IsEnd do
@ -155,19 +178,7 @@ function BattleMain.Execute(args, fightData, optionData)
--print("最终运行帧数:"..BattleLogic.CurFrame())
--print("result:"..BattleLogic.Result)
local time = string.format("%d-%d-%d-%d-%d-%d",
os.date("%Y"),
os.date("%m"),
os.date("%d"),
os.date("%H"),
os.date("%M"),
os.date("%S"))
local file = io.open("../luafight/BattleRecord//record_"..time..".txt", "a")
file:write("fightData:\n"..PrintTable(_fightData).."\n")
file:write("optionData:\n"..PrintTable(_optionData).."\n")
file:write("seed:\n"..args.seed.."\n")
io.close(file)
addBattleData()
return resultList
end
if isError then --捕获异常,并输出错误日志
@ -178,16 +189,25 @@ function BattleMain.Execute(args, fightData, optionData)
os.date("%H"),
os.date("%M"),
os.date("%S"))
local file = io.open("../luafight/LogError/"..time..".txt", "a")
local file = io.open("luafight/LogError/"..time..".txt", "a")
file:write(errorCache)
file:write("seed:\n"..tostring(args.seed).."\n")
file:write("type:\n"..tostring(args.type).."\n")
file:write("fightData:\n"..PrintTable(_fightData).."\n")
file:write("optionData:\n"..PrintTable(_optionData).."\n")
file:write("seed:\n"..args.seed.."\n")
file:write("\n\nlast battle data:\n")
for i=1, #_BattleErrorCache do
file:write(string.format("\nindex:%d\n", i))
file:write(_BattleErrorCache[i])
end
io.close(file)
end
return { result = -1 }
end
--BattleMain.Execute(1553167956, {playerData={{professionId=3,passivity={},type=1,skill={0,{40001,0.7,{1,2.3,2,},},{30011,0.7,{4,9,0.2,4,1,},{4,10,0.2,4,1,},},},superSkill={1.6,{20211,0.7,{1,3.3,2,},{15,1.98,2,1.98,},},},roleId=10022,camp=0,property={1,1676,1678,248,167,200,173,0,0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},quality=1,},{professionId=5,passivity={},type=1,skill={0,{40001,0.7,{11,0.93,2,2,0.2,},},},superSkill={3,{20000,0.7,{2,1.06,2,},{3,0.6,1,4,},},},roleId=10008,camp=0,property={1,2206,2208,221,193,232,130,0,0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},quality=1,},{professionId=4,passivity={},type=1,skill={0,{40001,0.7,{1,1.35,2,},},{30011,0.7,{3,0,0,5,},},},superSkill={2.5,{20000,0.7,{14,1.55,2,1,10023,0.2,},},},roleId=10023,camp=0,property={1,1439,1441,284,131,157,168,0,0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},quality=1,},{professionId=1,passivity={},type=1,skill={0,{40001,0.7,{1,1,1,},},{30011,0.7,{4,9,0.1,5,1,},{4,10,0.1,5,1,},},},superSkill={2.3,{20312,0.7,{19,1.35,1,0.5,5,},},},roleId=10013,camp=0,property={1,1678,1680,246,194,162,163,0,0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},quality=1,},{professionId=3,passivity={},type=1,skill={0,{40001,0.7,{1,2.3,2,},},{30011,0.7,{4,9,0.2,4,1,},{4,10,0.2,4,1,},},},superSkill={1.6,{20211,0.7,{1,3.3,2,},{15,1.98,2,1.98,},},},roleId=10022,camp=0,property={17,2732,2734,401,272,326,308,0,0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},quality=1,},teamSkill={},},enemyData={{{professionId=0,passivity={},type=2,skill={0,{20013,0.7,{1,0.45,1,},},},superSkill={},roleId=1,camp=1,property={0,483,483,260,61,61,240,0,0,0.3,0.3,0.2,1.5,1,0,0,0,0,0,0,0,0,0,0,0,0,},quality=1,},{professionId=0,passivity={},type=2,skill={0,{20013,0.7,{1,0.45,1,},},},superSkill={},roleId=2,camp=1,property={0,483,483,260,61,61,80,0,0,0.3,0.3,0.2,1.5,1,0,0,0,0,0,0,0,0,0,0,0,0,},quality=1,},{professionId=0,passivity={},type=2,skill={0,{20013,0.7,{1,0.45,1,},},},superSkill={},roleId=3,camp=1,property={0,483,483,260,61,61,7,0,0,0.3,0.3,0.2,1.5,1,0,0,0,0,0,0,0,0,0,0,0,0,},quality=1,},teamSkill={},},},})
--BattleMain.Execute(1553167956, {playerData={{professionId=4,passivity={},type=1,skill={0,{40001,0.7,{1,1.35,2,},},{30011,0.7,{3,0,0,5,},},},superSkill={2.5,{20000,0.7,{14,1.55,2,1,10023,0.2,},},},roleId=10023,camp=0,property={1,1439,1441,284,131,157,168,0,0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},quality=1,},{professionId=3,passivity={},type=1,skill={0,{40001,0.7,{1,2.3,2,},},{30011,0.7,{4,9,0.2,4,1,},{4,9,0.2,4,1,},},},superSkill={1.6,{20211,0.7,{1,3.3,2,},{15,1.98,2,1.98,},},},roleId=10022,camp=0,property={1,1676,1678,248,167,200,173,0,0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},quality=1,},{professionId=2,passivity={},type=1,skill={0,{40001,0.7,{1,1.05,2,},{4,4,5,5,3,},},},superSkill={2.3,{20000,0.7,{2,1.89,2,},},{20012,0.7,{3,1,5,5,},},},roleId=10021,camp=0,property={1,1920,1922,209,170,204,178,0,0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},quality=1,},{professionId=5,passivity={},type=1,skill={0,{40001,0.7,{11,0.93,2,2,0.2,},},},superSkill={3,{20000,0.7,{2,1.06,2,},{3,0.6,1,4,},},},roleId=10008,camp=0,property={1,2206,2208,221,193,232,130,0,0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},quality=1,},{professionId=1,passivity={},type=1,skill={0,{40001,0.7,{1,1,1,},},{30011,0.7,{4,9,0.1,5,1,},{4,9,0.1,5,1,},},},superSkill={2.3,{20312,0.7,{19,1.35,1,0.5,5,},},},roleId=10013,camp=0,property={1,1678,1680,246,194,162,163,0,0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},quality=1,},teamSkill={{3,{20012,0.7,{26,600,},{27,100,4,},},{10014,0.7,{25,2,0.1,4,},},},},},enemyData={{{professionId=0,passivity={},type=2,skill={0,{20011,0.7,{1,1,1,},{3,0.3,1,3,},},},superSkill={},roleId=14,camp=1,property={0,772,772,260,61,61,80,0,0,0.3,0.3,0.2,1.5,1,0,0,0,0,0,0,0,0,0,0,2,2,},quality=1,},{professionId=0,passivity={},type=2,skill={0,{20013,0.7,{1,0.45,1,},},},superSkill={},roleId=1,camp=1,property={0,483,483,260,61,61,240,0,0,0.3,0.3,0.2,1.5,1,0,0,0,0,0,0,0,0,0,0,0,0,},quality=1,},{professionId=0,passivity={},type=2,skill={0,{20013,0.7,{1,0.45,1,},},},superSkill={},roleId=3,camp=1,property={0,483,483,260,61,61,7,0,0,0.3,0.3,0.2,1.5,1,0,0,0,0,0,0,0,0,0,0,0,0,},quality=1,},teamSkill={},},},})
--[[
BattleMain.Execute({seed=1565094199,maxTime=300}
,{enemyData={{{ai={0},camp=1,element=1,passivity={{45,1},{45,2}},professionId=0,property={139,117440,117440,18564,2911,2911,5960,0.0,0.0,0.05,0.15,0.2,1.5,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},quality=3,roleId=23,skill={0,{20001,0.7,{1,0.848,1},{13,2,0.1,2,4},{4,4,0.2,12,4}}},superSkill={1.5,{20002,0.7,{10,1.072,1,0.4},{13,3,0.2,1,4}},{30000,0.7,{4,4,0.2,9,2}}},type=4},teamSkill={}}},playerData={{camp=0,element=4,passivity={{5,0.3,1,0.1,5},{39,5,2800},{12,0.15,0.15,2},{44,0.1,4,0.05,6,2}},professionId=5,property={139,76728,76728,4144,3372,2321,3740,0,0,0,0,0.0847,1.5,0,1,1,0,0,0,0,0,0,0,0,0},quality=1,roleId=10005,skill={0,{20001,0.7,{1,0.65,2}},{30101,0.7,{24,1,0.68}},{30001,0.7,{4,1,0.2,9,2}}},superSkill={2,{20004,0.7,{2,0.86,2}},{10100,0.7,{24,1,0.74}}},type=1},{camp=0,element=3,passivity={{5,0.3,1,0.1,5},{39,5,2800},{12,0.15,0.15,2},{44,0.1,4,0.05,6,2}},professionId=5,property={139,76559,76559,4086,2372,3370,3734,0,0,0,0,0.0808,1.5,0,1,1,0,0,0,0,0,0,0,0,0},quality=1,roleId=10007,skill={0,{20001,0.7,{6,3,3,0.88,1},{4,2,0.15,8,4},{4,3,0.15,8,4}}},superSkill={2,{20001,0.7,{1,1.1,1}},{10721,0.7,{8,0,1,1}}},type=1},{camp=0,element=5,passivity={{6,0.25,1,0.25,1,10},{39,5,2800},{12,0.15,0.15,2},{44,0.1,4,0.05,6,2}},professionId=2,property={139,60127,60127,7669,1672,3242,4060,0,0,0,0,0.1287,1.5,0,1,1,0,0,0,0,0,0,0,0,0},quality=1,roleId=10015,skill={0,{20001,0.7,{10,0.95,2,0.3}}},superSkill={3,{20002,0.7,{33,1.4,2,1,10015,0.15,10},{16,0.04,1,10,2}}},type=1},{camp=0,element=1,passivity={{6,0.25,1,0.25,1,10},{39,5,2800},{12,0.15,0.15,2},{44,0.1,4,0.05,6,2}},professionId=1,property={140,72220,72220,3858,4378,2630,4246,0,0,0,0,0.1274,1.5,0,1,1,0,0,0,0,0,0,0,0,0},quality=1,roleId=10020,skill={0,{20001,0.7,{6,3,3,0.35,1}},{10002,0.7,{24,1,0.9}}},superSkill={5,{20000,0.7,{2,0.65,1}},{10000,0.7,{4,6,0.15,6,1}}},type=1},{camp=0,element=2,passivity={{14,0.4,2,0.3,1,10,1},{39,5,2800},{12,0.15,0.15,2},{44,0.1,4,0.05,6,2}},professionId=3,property={139,58750,58750,5175,2145,3634,3581,0,0,0,0,0.0915,1.5,0,1,1,0,0,0,0,0,0,0,0,0},quality=1,roleId=10008,skill={0,{20001,0.7,{29,4,4,0.45,2,2,0.1}}},superSkill={4,{20000,0.7,{2,0.7,2}},{20000,0.7,{3,0.15,1,8}}},type=1},teamSkill={}}}
,{{1,1,0},{1,6,11},{1,6,21},{1,6,31},{1,6,41},{1,6,51},{1,5,0}})
]]--
return BattleMain

View File

@ -27,6 +27,7 @@ local Random = Random
local _BattleErrorCache = {}
local _BattleErrorIndex = 0
local _seed
local _type
local _fightData
local _optionData
@ -117,6 +118,7 @@ end
local function addBattleData()
local str = ""
str = str.."seed:\n"..tostring(_seed).."\n"
str = str.."type:\n"..tostring(_type).."\n"
str = str.."fightData:\n"..PrintTable(_fightData).."\n"
str = str.."optionData:\n"..PrintTable(_optionData).."\n"
@ -128,7 +130,9 @@ local function addBattleData()
end
function BattleMain.Execute(args, fightData, optionData)
print("trfghjdfgucvhbjnfdcgvj")
_seed = args.seed
_type = args.type
_fightData = fightData
_optionData = optionData or {}
@ -140,6 +144,7 @@ function BattleMain.Execute(args, fightData, optionData)
if xpcall(function ()
Random.SetSeed(args.seed)
BattleLogic.Init(args.maxTime, fightData, optionData)
BattleLogic.Type = _type
BattleLogic.StartOrder()
while not BattleLogic.IsEnd do
@ -188,6 +193,7 @@ function BattleMain.Execute(args, fightData, optionData)
local file = io.open("luafight/LogError/"..time..".txt", "a")
file:write(errorCache)
file:write("seed:\n"..tostring(args.seed).."\n")
file:write("type:\n"..tostring(args.type).."\n")
file:write("fightData:\n"..PrintTable(_fightData).."\n")
file:write("optionData:\n"..PrintTable(_optionData).."\n")
file:write("\n\nlast battle data:\n")

View File

@ -20,6 +20,7 @@ local enemySkillUsable
local isAuto
BattleLogic.Type = 0 --1 故事副本 2 地图探索 3 竞技场 4 秘境boss 5 解锁秘境 6 公会战 7 血战
BattleLogic.IsEnd = false
BattleLogic.Result = -1
BattleLogic.Event = BattleEvent.New()
@ -123,6 +124,17 @@ function BattleLogic.StartOrder()
playerTeamSkillList[i] = skillPool:Get()
playerTeamSkillList[i]:Init(playerTeamDummyRole, fightData.playerData.teamSkill[i], true)
end
for i=1, #fightData.playerData.teamPassive do
for j=1, #fightData.playerData.teamPassive[i] do
local v = fightData.playerData.teamPassive[i][j]
local id = v[1]
local args = {}
for k = 2, #v do
args[k-1] = v[k]
end
BattleUtil.Passivity[id](playerTeamDummyRole, args)
end
end
for i=1, #enemyTeamSkillList do
skillPool:Put(enemyTeamSkillList[i])
@ -132,6 +144,17 @@ function BattleLogic.StartOrder()
enemyTeamSkillList[i] = skillPool:Get()
enemyTeamSkillList[i]:Init(enemyTeamDummyRole, fightData.enemyData[BattleLogic.CurOrder].teamSkill[i], true)
end
for i=1, #fightData.enemyData[BattleLogic.CurOrder].teamPassive do
for j=1, #fightData.enemyData[BattleLogic.CurOrder].teamPassive[i] do
local v = fightData.enemyData[BattleLogic.CurOrder].teamPassive[i][j]
local id = v[1]
local args = {}
for k = 2, #v do
args[k-1] = v[k]
end
BattleUtil.Passivity[id](enemyTeamDummyRole, args)
end
end
else
BattleLogic.ClearOrder()
for i=1, #fightData.enemyData[BattleLogic.CurOrder] do
@ -146,6 +169,17 @@ function BattleLogic.StartOrder()
enemyTeamSkillList[i] = skillPool:Get()
enemyTeamSkillList[i]:Init(enemyTeamDummyRole, fightData.enemyData[BattleLogic.CurOrder].teamSkill[i], true)
end
for i=1, #fightData.enemyData[BattleLogic.CurOrder].teamPassive do
for j=1, #fightData.enemyData[BattleLogic.CurOrder].teamPassive[i] do
local v = fightData.enemyData[BattleLogic.CurOrder].teamPassive[i][j]
local id = v[1]
local args = {}
for k = 2, #v do
args[k-1] = v[k]
end
BattleUtil.Passivity[id](enemyTeamDummyRole, args)
end
end
end
BattleLogic.InitAggro()
end

View File

@ -2,20 +2,177 @@ package com.ljsd.jieling.battle;
import com.googlecode.protobuf.format.JsonFormat;
import com.ljsd.jieling.battle.actor.Creature;
import com.ljsd.jieling.battle.actor.Life;
import com.ljsd.jieling.battle.actor.SceneMonster;
import com.ljsd.jieling.config.SArenaSetting;
import com.ljsd.jieling.config.SBloodyBattleSetting;
import com.ljsd.jieling.globals.Global;
import com.ljsd.jieling.handler.map.behavior.BehaviorUtil;
import com.ljsd.jieling.logic.blood.BloodLogic;
import com.ljsd.jieling.logic.dao.FamilyHeroInfo;
import com.ljsd.jieling.logic.dao.Hero;
import com.ljsd.jieling.logic.dao.TeamPosHeroInfo;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.logic.fight.CheckFight;
import com.ljsd.jieling.logic.fight.FightType;
import com.ljsd.jieling.logic.hero.HeroAttributeEnum;
import com.ljsd.jieling.logic.hero.HeroLogic;
import com.ljsd.jieling.protocols.CommonProto;
import com.ljsd.jieling.util.FightDataUtil;
import com.ljsd.jieling.util.MonsterUtil;
import org.luaj.vm2.LuaValue;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
public class BattleManager {
public static Map<Integer,UserBloodySnpInfo> bloodMyHeroInfoMap = new HashMap<>();
static Map<Integer, CommonProto.FightTeamInfo> fightTeamInfoMap = new HashMap<>();
/**
*
* @param mine
* @param myteamId
*/
public static UserBloodySnpInfo snapUserFightInfo(User mine, int myteamId){
//血量处理
mine.getTeamPosManager().setCurTeamPosId(myteamId);
UserBloodySnpInfo userBloodySnpInfo = new UserBloodySnpInfo(mine.getId(),mine.getPlayerInfoManager().getNickName());
List<TeamPosHeroInfo> teamPosHeroInfoList = mine.getTeamPosManager().getTeamPosForHero().get(myteamId);
Map<String, Hero> heroMap = mine.getHeroManager().getHeroMap();
for(TeamPosHeroInfo teamPosHeroInfo : teamPosHeroInfoList){
String heroId = teamPosHeroInfo.getHeroId();
Hero hero = heroMap.get(heroId);
StringBuilder skillSb = new StringBuilder();
String heroSkill = HeroLogic.getInstance().getHeroSkills(mine, hero,skillSb ).toString();
userBloodySnpInfo.updateHeroSkill(heroId,heroSkill.substring(0, heroSkill.length() - 1));
}
String pokenmonSkills = HeroLogic.getInstance().getPokenmonSkills(mine, myteamId);
userBloodySnpInfo.setPokenmonSkills(pokenmonSkills);
Map<String, FamilyHeroInfo> heroAllAttribute = BloodLogic.getInstance().battleRecord(mine, myteamId,null);
userBloodySnpInfo.setHeroAllAttributes(heroAllAttribute);
int maxHp = 0;
for(FamilyHeroInfo familyHeroInfo : heroAllAttribute.values()){
maxHp += familyHeroInfo.getAttribute().get(HeroAttributeEnum.Hp.getPropertyId());
}
userBloodySnpInfo.setMaxHp(maxHp);
bloodMyHeroInfoMap.put(mine.getId(),userBloodySnpInfo);
return userBloodySnpInfo;
}
public static void snapUserFightInfo(User mine, int myteamId){
CommonProto.FightTeamInfo fightTeamInfo = BehaviorUtil.getFightTeamInfo(mine,myteamId,false);
fightTeamInfoMap.put(mine.getId(),fightTeamInfo);
/**
*
* @return
*/
public static int[] battleOfP2P(Creature redCreature ,Creature blueCreature){
UserBloodySnpInfo redUserBloodySnpInfo = bloodMyHeroInfoMap.get(redCreature.getId());
UserBloodySnpInfo blueUserBloodySnpInfo = bloodMyHeroInfoMap.get(blueCreature.getId());
int seed = (int)(System.currentTimeMillis()/1000);
CommonProto.FightTeamInfo redFightTeamInfo = fightDataMake(redUserBloodySnpInfo);
CommonProto.FightTeamInfo bluefightTeamInfo = fightDataMake(blueUserBloodySnpInfo);
System.out.println(JsonFormat.printToString(redFightTeamInfo));
System.out.println(JsonFormat.printToString(bluefightTeamInfo));
LuaValue getFightData = FightDataUtil.getFinalPlayerFightData(redFightTeamInfo, bluefightTeamInfo);
LuaValue getOptionData = FightDataUtil.getOptionData("");
int[] checkResult = CheckFight.getInstance().checkFight(seed, SArenaSetting.getSArenaSetting().getMostTime(), getFightData, getOptionData,FightType.BloodyFight);
int resultCode = checkResult[0];
if(resultCode == 1){
rebirth(blueUserBloodySnpInfo);
blueCreature.setLife(new Life(blueCreature.getLife().getMaxMp(),blueCreature.getLife().getMaxMp()));
afterBattleRecord(redUserBloodySnpInfo.getHeroAllAttributes(),checkResult);
return checkResult;
}
rebirth(redUserBloodySnpInfo);
redCreature.setLife(new Life(redCreature.getLife().getMaxMp(),redCreature.getLife().getMaxMp()));
afterBattleRecord(blueUserBloodySnpInfo.getHeroAllAttributes(),checkResult);
return checkResult;
}
/**
*
* @return
*/
public static int[] battleOfP2M(Creature creature, SceneMonster sceneMonster){
UserBloodySnpInfo redUserBloodySnpInfo = bloodMyHeroInfoMap.get(creature.getId());
int seed = (int)(System.currentTimeMillis()/1000);
CommonProto.FightTeamInfo redFightTeamInfo = fightDataMake(redUserBloodySnpInfo);
int[][] monster = SBloodyBattleSetting.sBloodyBattleSetting.getMonster();
int monsterGroupId = monster[sceneMonster.getId() - 1][0];
Map<Integer,List<Integer>> hps = new HashMap<>(1);
hps.put(0,sceneMonster.getRemainHps());
Map<Integer, List<CommonProto.FightUnitInfo>> monsterByGroup = MonsterUtil.getMonsterByGroup(monsterGroupId,hps);
List<CommonProto.FightTeamInfo> monsterGroupList = BehaviorUtil.getFightTeamInfos(monsterGroupId,monsterByGroup, Global.MONSTER_1);
LuaValue getFightData = FightDataUtil.getFinalFightData(redFightTeamInfo, monsterGroupList);
LuaValue getOptionData = FightDataUtil.getOptionData("");
int[] checkResult = CheckFight.getInstance().checkFight(seed, SArenaSetting.getSArenaSetting().getMostTime(), getFightData, getOptionData, FightType.BloodyFight);
int resultCode = checkResult[0];
if(resultCode == 1){
afterBattleRecord(redUserBloodySnpInfo.getHeroAllAttributes(),checkResult);
return checkResult;
}
rebirth(redUserBloodySnpInfo);
creature.setLife(new Life(creature.getLife().getMaxMp(),creature.getLife().getMaxMp()));
updateMonsterHp(checkResult,sceneMonster);
return checkResult;
}
public static void updateMonsterHp(int[] checkResult,SceneMonster sceneMonster){
List<Integer> oldRemainHp = sceneMonster.getRemainHps();
List<Integer> result =new ArrayList<>(5);
for(int i=2;i<=oldRemainHp.size()+1;i++){
result.add(checkResult[i]);
}
sceneMonster.setRemainHps(result);
}
//战斗之后血量计算
public static Map<String, FamilyHeroInfo> afterBattleRecord(Map<String, FamilyHeroInfo> heroAttribute,int[] fightResult){
int index = 2;
for (Map.Entry<String, FamilyHeroInfo> entry : heroAttribute.entrySet()) {
FamilyHeroInfo value = entry.getValue();
Map<Integer, Integer> attribute = value.getAttribute();
attribute.put(HeroAttributeEnum.CurHP.getPropertyId(), fightResult[index]);
value.setAttribute(attribute);
index++;
}
return heroAttribute;
}
public static void rebirth(UserBloodySnpInfo userBloodySnpInfo){
Map<String, FamilyHeroInfo> heroAllAttributes = userBloodySnpInfo.getHeroAllAttributes();
for(FamilyHeroInfo familyHeroInfo : heroAllAttributes.values()){
Integer maxHp = familyHeroInfo.getAttribute().get(HeroAttributeEnum.Hp.getPropertyId());
familyHeroInfo.getAttribute().put(HeroAttributeEnum.CurHP.getPropertyId(),maxHp);
}
}
public static CommonProto.FightTeamInfo fightDataMake(UserBloodySnpInfo redUserBloodySnpInfo ){
List<CommonProto.FightUnitInfo> heroDefendFightInfos = new ArrayList<>(5);
Map<String, FamilyHeroInfo> heroAllAttributes = redUserBloodySnpInfo.getHeroAllAttributes();
for (Map.Entry<String, FamilyHeroInfo> entry : heroAllAttributes.entrySet()) {
FamilyHeroInfo value = entry.getValue();
String heroSkill = redUserBloodySnpInfo.getHeroSkills().get(entry.getKey());
StringBuilder propertySb = new StringBuilder();
String property = HeroLogic.getInstance().getHeroPropertyBuilder(propertySb, value, entry.getValue().getAttribute()).toString();
CommonProto.FightUnitInfo heroFightInfo = CommonProto.FightUnitInfo
.newBuilder()
.setUnitId(Integer.toString(value.getTempleteId()))
.setUnitSkillIds(heroSkill)
.setProperty(property.substring(0, property.length() - 1))
.build();
heroDefendFightInfos.add(heroFightInfo);
}
return CommonProto.FightTeamInfo.
newBuilder()
.addAllFightUnitList(heroDefendFightInfos)
.setTeamSkillList(redUserBloodySnpInfo.getPokenmonSkills())
.build();
}
}

View File

@ -0,0 +1,38 @@
package com.ljsd.jieling.battle;
import com.ljsd.jieling.battle.actor.ActorType;
import com.ljsd.jieling.battle.actor.SceneActor;
public class BattleRequest {
private long requestTime; // 请求时间戳
private SceneActor attackActor; //攻击方 只能是玩家
private SceneActor defActor; // 防守方 可能是玩家,可能是怪物
private ActorType defActorType; // 用于区分防守方类型
public BattleRequest(long requestTime, SceneActor attackActor, SceneActor defActor, ActorType defActorType) {
this.requestTime = requestTime;
this.attackActor = attackActor;
this.defActor = defActor;
this.defActorType = defActorType;
}
public long getRequestTime() {
return requestTime;
}
public SceneActor getAttackActor() {
return attackActor;
}
public SceneActor getDefActor() {
return defActor;
}
public ActorType getDefActorType() {
return defActorType;
}
}

View File

@ -0,0 +1,21 @@
package com.ljsd.jieling.battle;
import java.util.concurrent.Future;
public class FutureResult<T> {
private int type; //future类型 ,不同类型不同逻辑处理
private Future<T> future;
public FutureResult(int type, Future<T> future) {
this.type = type;
this.future = future;
}
public int getType() {
return type;
}
public Future<T> getFuture() {
return future;
}
}

View File

@ -0,0 +1,68 @@
package com.ljsd.jieling.battle;
import com.ljsd.jieling.logic.dao.FamilyHeroInfo;
import java.util.HashMap;
import java.util.Map;
public class UserBloodySnpInfo {
private int uid;
private String name;
private Map<String, FamilyHeroInfo> heroAllAttributes = new HashMap<>(5);
private Map<String, String> heroSkills = new HashMap<>();
private String pokenmonSkills;
private int maxHp;
public UserBloodySnpInfo(int uid, String name) {
this.uid = uid;
this.name = name;
}
public void updateHeroSkill(String heroId, String skills){
heroSkills.put(heroId,skills);
}
public void setPokenmonSkills(String pokenmonSkills) {
this.pokenmonSkills = pokenmonSkills;
}
public void setHeroAllAttributes(Map<String, FamilyHeroInfo> heroAllAttributes) {
this.heroAllAttributes = heroAllAttributes;
}
public int getUid() {
return uid;
}
public String getName() {
return name;
}
public Map<String, FamilyHeroInfo> getHeroAllAttributes() {
return heroAllAttributes;
}
public Map<String, String> getHeroSkills() {
return heroSkills;
}
public String getPokenmonSkills() {
return pokenmonSkills;
}
public int getMaxHp() {
return maxHp;
}
public void setMaxHp(int maxHp) {
this.maxHp = maxHp;
}
}

View File

@ -2,6 +2,10 @@ package com.ljsd.jieling.battle.actor;
import com.ljsd.jieling.battle.BattleManager;
import com.ljsd.jieling.battle.BattleRequest;
import com.ljsd.jieling.battle.room.SceneManager;
import com.ljsd.jieling.config.SBloodyBattleSetting;
import com.ljsd.jieling.util.CellUtil;
import com.ljsd.jieling.util.MathUtils;
import org.slf4j.Logger;
@ -17,16 +21,6 @@ public abstract class Creature extends SceneActor{
private static final Logger LOGGER = LoggerFactory.getLogger(Creature.class);
private static List<Integer> reclyPath = new ArrayList<>();
static {
reclyPath.add(256*5+11);
reclyPath.add(256*5+12);
reclyPath.add(256*5+13);
reclyPath.add(256*5+14);
reclyPath.add(256*4+14);
}
private Life life;
private List<Integer> path = new ArrayList<>(); //路径
@ -77,12 +71,10 @@ public abstract class Creature extends SceneActor{
if(result){
if(commandType == 1){
List<Integer> pathTmp = (List<Integer>) parm;
System.out.println("the uid="+getId() + " " + pathTmp);
System.out.println(getPos());
if(getPos()!=pathTmp.get(0)){
return false;
}
boolean continuous = CellUtil.isContinuous(getPos(), (List<Integer>) parm);
boolean continuous = CellUtil.isContinuous(getPos(), (List<Integer>) parm, SceneManager.bloodyMap.getBarrierPoints());
if(continuous){
continuous = canMoveNext(pathTmp.get(1), false);
}
@ -155,7 +147,8 @@ public abstract class Creature extends SceneActor{
}
}
int curPos = getPos();
LOGGER.info("the id={},preMoveTimestamp={},the time ={},move={},the oldXy={},the curXy={}",getId(),new Date(preMoveTimestamp),new Date(timestamp),moveDistance,oldXY,curPos);
LOGGER.info("the id={},preMoveTimestamp={},the time ={},move={},the oldXy={},the curXy={}",getId(),new Date(preMoveTimestamp),new Date(timestamp),moveDistance,CellUtil.pos2XY(oldXY),CellUtil.pos2XY(curPos));
preMoveTimestamp = timestamp;
return curPos;
@ -183,10 +176,19 @@ public abstract class Creature extends SceneActor{
this.addOrUpdateBuffer(effectBuffer); //战斗buffer
//打断自己行使路线 广播自己状态 位置信息
this.preMoveTimestamp = timestamp;
this.path.clear();
if(this.getType() != ActorType.Monster){
/*Collections.reverse(path);
cachePath.addAll(path);*/
this.path.clear();
}
}
public boolean checkEventTrigger(long timestamp){
if(this.getType() ==ActorType.Mineral || this.getType() ==ActorType.Npc){
return false;
}
Scene scene = getScene();
int curPos = getPos();
Set<Integer> xySet = CellUtil.getSurroundPos(15,20,curPos);
@ -222,17 +224,19 @@ public abstract class Creature extends SceneActor{
if(getStateType()!=StateType.FROZEN &&sceneActor.getStateType()!= StateType.FROZEN&& xySet.contains(sceneActor.getPos())){
triggerEvent=3;
setStateType(StateType.FROZEN);
//异步计算战斗结果
getScene().execASync(new BattleRequest(timestamp,this,sceneActor,sceneActor.getType()));
LOGGER.info("the attackUid={},the battleId={}",this.getId(),sceneActor.getId());
}
}
if(triggerEvent!=0){
int randomResult = MathUtils.randomInt(10) > 5 ?0:1;
if(this.getType() == ActorType.Player){
EffectBuffer effectBuffer = new EffectBuffer(getScene().getBufferId(),triggerEvent, timestamp, timestamp + 6000,getId(), sceneActor.getId(), randomResult&1);
if(triggerEvent == 3 || this.getType() == ActorType.Player){
EffectBuffer effectBuffer = new EffectBuffer(getScene().getBufferId(),triggerEvent, timestamp, -1,getId(), sceneActor.getId(), -1);
whenTriggerEvent(effectBuffer,timestamp);
result = true;
}
if(sceneActor.getType() == ActorType.Player){
EffectBuffer othereffectBuffer = new EffectBuffer(getScene().getBufferId(),triggerEvent, timestamp, timestamp + 6000,sceneActor.getId(),getId(), randomResult^1);
if(triggerEvent == 3 ){
EffectBuffer othereffectBuffer = new EffectBuffer(getScene().getBufferId(),triggerEvent, timestamp, -1,sceneActor.getId(),getId(), -1);
sceneActor.whenTriggerEvent(othereffectBuffer,timestamp);
result = true;
}
@ -268,4 +272,8 @@ public abstract class Creature extends SceneActor{
public void setPreMoveTimestamp(long preMoveTimestamp) {
this.preMoveTimestamp = preMoveTimestamp;
}
public void setSpeed(int speed) {
this.speed = speed;
}
}

View File

@ -23,6 +23,10 @@ public class EffectBuffer {
this.values.add(value);
}
public void addEffectValue(int value){
this.values.add(value);
}
public int getId() {
return id;
}
@ -79,4 +83,8 @@ public class EffectBuffer {
", values=" + values +
'}';
}
public void clearvalues(){
values.clear();
}
}

View File

@ -2,23 +2,44 @@ package com.ljsd.jieling.battle.actor;
import com.googlecode.protobuf.format.JsonFormat;
import com.ljsd.common.mogodb.util.BlockingUniqueQueue;
import com.ljsd.jieling.battle.BattleManager;
import com.ljsd.jieling.battle.BattleRequest;
import com.ljsd.jieling.battle.FutureResult;
import com.ljsd.jieling.battle.match.MatchServerice;
import com.ljsd.jieling.battle.room.BeanToProto;
import com.ljsd.jieling.battle.room.Command;
import com.ljsd.jieling.battle.room.SceneManager;
import com.ljsd.jieling.config.SBloodyBattleSetting;
import com.ljsd.jieling.db.mongo.MongoUtil;
import com.ljsd.jieling.logic.OnlineUserManager;
import com.ljsd.jieling.logic.dao.UserManager;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.network.session.ISession;
import com.ljsd.jieling.protocols.MessageTypeProto;
import com.ljsd.jieling.protocols.SceneFight;
import com.ljsd.jieling.util.MathUtils;
import com.ljsd.jieling.util.MessageUtil;
import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Scene implements Runnable{
private List<FutureResult> futureList = new ArrayList<>();
public static ExecutorService executorService = Executors.newFixedThreadPool(32);
private int roomId;
private int bufferId;
private int mapId; //地图id
private int state;
private long startTime;
private int tick;
private Map<Integer,SceneActor> sceneActorMap = new HashMap<>(3);
private BlockingUniqueQueue<Command> commandBlockingUniqueQueue = new BlockingUniqueQueue<>();
private Map<Integer,Integer> minealForPosMap = new HashMap<>();
public void addScenActor(SceneActor sceneActor){
sceneActorMap.put(sceneActor.getId(),sceneActor);
@ -38,6 +59,13 @@ public class Scene implements Runnable{
private Set<Integer> willUpdateActors = new HashSet<>(2);
private boolean isEnd;
public void monsterReflush(){
}
public void tick() throws InterruptedException {
Iterator<Map.Entry<Integer, SceneActor>> iterator = sceneActorMap.entrySet().iterator();
@ -73,6 +101,9 @@ public class Scene implements Runnable{
Thread.sleep(50);
}
/**
*
*/
@ -104,7 +135,14 @@ public class Scene implements Runnable{
while ( (poll = commandBlockingUniqueQueue.poll())!=null){
poll.getSceneActor().exec(poll.getType(),poll.getOperParm());
}
if(isEnd){
break;
}
tick++;
tick();
if(tick/20 == 1 && tick%20==0){
startAllRunning();
}
}catch (Exception e){
e.printStackTrace();
}
@ -112,6 +150,135 @@ public class Scene implements Runnable{
}
public void startAllRunning(){
for(SceneActor sceneActor : sceneActorMap.values()){
if(sceneActor.getType()== ActorType.Player){
sceneActor.setStateType(StateType.MOVEABLE);
processEventUpdate(EventType.SCENEACTORE_UPDATE,sceneActor.getId());
}
}
}
public void sysTick(){
int round = SceneManager.bloodyMap.getRound();
if( tick % round != 0){
return;
}
int[][] mineralCeiling = SBloodyBattleSetting.sBloodyBattleSetting.getMineralCeiling();
Map<Integer,Integer> mineralNums = new HashMap<>(mineralCeiling.length);
for(SceneActor sceneActor : sceneActorMap.values()){
if(sceneActor.getType() == ActorType.Mineral){
SceneMineral sceneMineral = (SceneMineral) sceneActor;
int size = sceneMineral.getSize();
Integer nums = mineralNums.get(size);
if(nums == null){
nums = 0;
}
mineralNums.put(size,nums);
}
}
for(int[] mineralCeilingSingle :mineralCeiling){
int flushTime = mineralCeilingSingle[1];
if(tick%(flushTime*20)==0){
int size = mineralCeilingSingle[0];
int flushNums = mineralCeilingSingle[2];
int maxNums = mineralCeilingSingle[3];
Integer existNums = mineralNums.get(size);
if(existNums == null){
existNums = 0;
}
//新增矿点
if(maxNums > existNums){
}
}
}
}
//退出操作
public void gameEnd() throws Exception {
isEnd = true;
for(SceneActor sceneActor : sceneActorMap.values()){
if(sceneActor.getType() == ActorType.Player){
int id = sceneActor.getId();
User user = UserManager.getUser(id);
user.getRoomInfo().setRoomId(-1);
MatchServerice.clearUidRoomInfo(id);
ISession iSession = OnlineUserManager.getSessionByUid(id);
if(iSession!=null){
MessageUtil.sendIndicationMessage(iSession, 1, MessageTypeProto.MessageType.SCENE_GAME_OVER_INDICATION_VALUE, null, true);
}
}
}
SceneManager.clearScene(roomId);
MongoUtil.getLjsdMongoTemplate().lastUpdate();
}
public void execASync(BattleRequest battleRequest){
executorService.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
System.out.println("exce battle...............................");
SceneActor attackActor = battleRequest.getAttackActor();
SceneActor defActor = battleRequest.getDefActor();
SceneActor temp = null;
int checkResult[] = null;
Thread.sleep(150);
//只能人是进攻方
if(attackActor.getType() == ActorType.Monster){
temp = defActor;
defActor = attackActor;
attackActor = temp;
}
/* if(defActor.getType() == ActorType.Monster || attackActor.getType() == ActorType.Monster){
checkResult = BattleManager.battleOfP2M((Creature) attackActor, (SceneMonster) defActor);
}else{
checkResult = BattleManager.battleOfP2P((Creature) attackActor, (Creature) defActor);
}*/
int[] fightTime = SBloodyBattleSetting.sBloodyBattleSetting.getFightTime();
//todo
checkResult = new int[]{0,1000,200,0,0,0,0};
int displayTime = checkResult[1] / fightTime[0];
if(displayTime>fightTime[2]){
displayTime = fightTime[2];
}
if(displayTime<fightTime[1]){
displayTime = fightTime[1];
}
displayTime = 10;
Map<Integer, EffectBuffer> bufferMap = attackActor.getBufferMap();
for(EffectBuffer effectBuffer : bufferMap.values()){
if(effectBuffer.getType() == 3 && effectBuffer.getTarget() == attackActor.getId() && effectBuffer.getCaster() == defActor.getId()){
effectBuffer.clearvalues();
effectBuffer.addEffectValue(checkResult[0]);
effectBuffer.setEndTime(effectBuffer.getStartTime() + displayTime *1000);
System.out.println(effectBuffer);
System.out.println(attackActor.getId());
}
}
Map<Integer, EffectBuffer> defBufferMap = defActor.getBufferMap();
for(EffectBuffer effectBuffer : defBufferMap.values()){
if(effectBuffer.getType() == 3 && effectBuffer.getTarget() == defActor.getId() && effectBuffer.getCaster() == attackActor.getId()){
effectBuffer.clearvalues();
effectBuffer.addEffectValue(checkResult[0]==1?0:1);
effectBuffer.setEndTime(effectBuffer.getStartTime() + displayTime *1000);
System.out.println(effectBuffer);
}
}
return 1;
}
});
}
public int getMapId() {
return mapId;
}
@ -133,4 +300,20 @@ public class Scene implements Runnable{
public void setState(int state) {
this.state = state;
}
public int getRoomId() {
return roomId;
}
public void setRoomId(int roomId) {
this.roomId = roomId;
}
public long getStartTime() {
return startTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
}

View File

@ -2,6 +2,9 @@ package com.ljsd.jieling.battle.actor;
import com.ljsd.jieling.battle.room.SceneManager;
import com.ljsd.jieling.config.SBloodyBattleSetting;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
@ -32,6 +35,7 @@ public abstract class SceneActor{
if(effectBuffer.getType() == 3){
stateType = StateType.FROZEN;
scene.processEventUpdate(EventType.SCENEACTORE_UPDATE,this.getId());
System.out.println("the actor" + id + "is frozen");
}
if(effectBuffer.getType() == 2){
scene.processEventUpdate(EventType.SCENEACTORE_UPDATE,this.getId());
@ -49,8 +53,12 @@ public abstract class SceneActor{
while (iterator.hasNext()){
Map.Entry<Integer, EffectBuffer> next = iterator.next();
EffectBuffer value = next.getValue();
if(value.getType() ==3 && value.getEndTime() == -1){
continue;
}
if(value.getType() == 2){ //挖矿
int willDgger = (int)((now - value.getStartTime()) / 1000);
int intervalMs = SBloodyBattleSetting.sBloodyBattleSetting.getCollectingInterval() * 1000;
int willDgger = (int)((now - value.getStartTime()) / intervalMs);
Creature creature = (Creature) this;
Creature mineral =(Creature) scene.getSceneActorMap().get(value.getCaster());
if(willDgger>0&&mineral.getLife().getCurHp()>0) {
@ -60,7 +68,7 @@ public abstract class SceneActor{
if(mineral.getLife().getCurHp()>0){
scene.processEventUpdate(EventType.SCENEACTORE_UPDATE,mineral.getId());
}
value.setStartTime(value.getStartTime() + reallyDigger*1000);
value.setStartTime(value.getStartTime() + reallyDigger*intervalMs);
}
if(needRemoveDigger || mineral.getLife().getCurHp()<=0 ){
iterator.remove();
@ -95,15 +103,28 @@ public abstract class SceneActor{
return;
}
addOrUpdateBuffer(new EffectBuffer(scene.getBufferId(),4,now,now+5000,this.getId(),0,0));
// 定位到出生点位置
this.setPos(SceneManager.selectForPlayerRebirth(scene));
scene.processEventUpdate(EventType.SCENEACTORE_UPDATE,id);
}else{
Creature creature = (Creature) scene.getSceneActorMap().get(value.getCaster());
int mineral = creature.getMineral();
if(mineral>0){
creature.setMineral(0);
scene.processEventUpdate(EventType.SCENEACTORE_UPDATE,creature.getId());
((Creature)this).addMineral(mineral);
}
if(creature.getType() == ActorType.Monster){
((Creature)this).addMineral(SBloodyBattleSetting.sBloodyBattleSetting.getMonster()[creature.getId()][2]);
}else{
int mineral = creature.getMineral();
if(mineral>1){
int gainMineral=mineral/2 + mineral%2;
creature.setMineral(mineral -gainMineral);
scene.processEventUpdate(EventType.SCENEACTORE_UPDATE,creature.getId());
if(this.getType() == ActorType.Player){
((Creature)this).addMineral(gainMineral);
}else{
//todo 随机散落
}
}
}
stateType = StateType.MOVEABLE;
scene.processEventUpdate(EventType.SCENEACTORE_UPDATE,this.getId());
}

View File

@ -2,6 +2,16 @@ package com.ljsd.jieling.battle.actor;
public class SceneMineral extends Creature {
private int size;
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
@Override
public ActorType getType() {
return ActorType.Mineral;

View File

@ -1,8 +1,20 @@
package com.ljsd.jieling.battle.actor;
import java.util.List;
public class SceneMonster extends Creature{
private List<Integer> remainHps;
@Override
public ActorType getType() {
return ActorType.Monster;
}
public List<Integer> getRemainHps() {
return remainHps;
}
public void setRemainHps(List<Integer> remainHps) {
this.remainHps = remainHps;
}
}

View File

@ -14,7 +14,7 @@ public class BloodyBattleMatchServer implements IMatch{
private static Map<Integer,Integer> roomFull = new HashMap<>();
private static Map<Integer,Room> uidToRommMap = new HashMap<>();
static {
roomFull.put(1,2);
roomFull.put(1,1);
}
@ -51,4 +51,9 @@ public class BloodyBattleMatchServer implements IMatch{
public Room getRoomId(int uid) {
return uidToRommMap.get(uid);
}
@Override
public void clearUidRoom(int uid) {
uidToRommMap.remove(uid);
}
}

View File

@ -26,4 +26,6 @@ public interface IMatch {
Room filter(List<Room> rooms) ;
}
public void clearUidRoom(int uid);
}

View File

@ -21,6 +21,11 @@ public class MatchServerice {
matcherServerMap.put(1,new BloodyBattleMatchServer());
}
public static void clearUidRoomInfo(int uid){
IMatch iMatch = matcherServerMap.get(1);
iMatch.clearUidRoom(uid);
}
//有用户加入时,同时做匹配
//matchRule 匹配规则
public static synchronized void addPlayer(ISession iSession, RoomProto.RoomMatchRequest request, int responseMsgId) throws Exception {
@ -115,8 +120,6 @@ public class MatchServerice {
SceneManager.startGame(scene);
for(SceneActor sceneActor : scene.getSceneActorMap().values()){
if(sceneActor.getType()== ActorType.Player){
sceneActor.setStateType(StateType.MOVEABLE);
scene.processEventUpdate(EventType.SCENEACTORE_UPDATE,sceneActor.getId());
MessageUtil.sendRoomStartGameIndication(sceneActor.getId());
}
}

View File

@ -1,6 +1,10 @@
package com.ljsd.jieling.battle.room;
import com.ljsd.jieling.battle.BattleManager;
import com.ljsd.jieling.battle.UserBloodySnpInfo;
import com.ljsd.jieling.battle.actor.*;
import com.ljsd.jieling.logic.dao.FamilyHeroInfo;
import com.ljsd.jieling.logic.hero.HeroAttributeEnum;
import com.ljsd.jieling.protocols.CommonProto;
import java.util.Iterator;
@ -18,12 +22,27 @@ public class BeanToProto {
if(actorType != ActorType.Npc){
builder.setCreature(getCreature((Creature)sceneActor));
}
if(actorType == ActorType.Player){
builder.setUserName(BattleManager.bloodMyHeroInfoMap.get(sceneActor.getId()).getName());
}
return builder.build();
}
public static CommonProto.Creature getCreature(Creature creature){
return CommonProto.Creature.newBuilder()
.setCurHp(creature.getLife().getCurHp())
CommonProto.Creature.Builder builder = CommonProto.Creature.newBuilder();
if(creature.getType() == ActorType.Player){
UserBloodySnpInfo userBloodySnpInfo = BattleManager.bloodMyHeroInfoMap.get(creature.getId());
Map<String, FamilyHeroInfo> heroAllAttributes = userBloodySnpInfo.getHeroAllAttributes();
for(Map.Entry<String,FamilyHeroInfo> familyHeroInfoEntry : heroAllAttributes.entrySet()){
String heroId = familyHeroInfoEntry.getKey();
FamilyHeroInfo familyHeroInfo = familyHeroInfoEntry.getValue();
Map<Integer, Integer> attribute = familyHeroInfo.getAttribute();
Integer hp = attribute.get(HeroAttributeEnum.Hp.getPropertyId());
Integer curHp = attribute.get(HeroAttributeEnum.CurHP.getPropertyId());
builder.addHeroInfo(CommonProto.BloodyHeroInfo.newBuilder().setHeroId(heroId).setHeroHp(curHp).setHeroMaxHp(hp).setHeroTid(familyHeroInfo.getTempleteId()));
}
}
return builder.setCurHp(creature.getLife().getCurHp())
.setMaxHp(creature.getLife().getMaxMp())
.setSpeed(creature.getSpeed())
.addAllPath(creature.getPath())
@ -33,11 +52,16 @@ public class BeanToProto {
}
public static CommonProto.ActorEffectBufferInfo getActorEffectBufferInfo(EffectBuffer effectBuffer){
int sendEndTime=-1;
long endTime = effectBuffer.getEndTime();
if(endTime!=-1){
sendEndTime = (int)(endTime/1000);
}
return CommonProto.ActorEffectBufferInfo.newBuilder()
.setId(effectBuffer.getId())
.setType(effectBuffer.getType())
.setStartTime((int)(effectBuffer.getStartTime()/1000))
.setEndTime((int)(effectBuffer.getEndTime()/1000))
.setEndTime(sendEndTime)
.setTarget(effectBuffer.getTarget())
.setCaster(effectBuffer.getCaster())
.addAllValue(effectBuffer.getValues())
@ -56,6 +80,7 @@ public class BeanToProto {
builder.addActorEffectBufferInfo(getActorEffectBufferInfo(next.getValue()));
}
}
builder.addAllBarrierPoint(SceneManager.bloodyMap.getBarrierPoints());
return builder.build();
}
}

View File

@ -0,0 +1,38 @@
package com.ljsd.jieling.battle.room;
import java.util.ArrayList;
import java.util.List;
public class BloodyMap {
private int mapId;
private List<Integer> barrierPoints = new ArrayList<>();
private int round;
public BloodyMap(int mapId) {
this.mapId = mapId;
}
public void addBarrierPoint(int pos){
barrierPoints.add(pos);
}
public int getMapId() {
return mapId;
}
public List<Integer> getBarrierPoints() {
return barrierPoints;
}
public int getRound() {
return round;
}
public void setRound(int round) {
this.round = round;
}
}

View File

@ -1,16 +1,29 @@
package com.ljsd.jieling.battle.room;
import com.ljsd.jieling.battle.BattleManager;
import com.ljsd.jieling.battle.UserBloodySnpInfo;
import com.ljsd.jieling.battle.actor.*;
import com.ljsd.jieling.config.MapPointConfig;
import com.ljsd.jieling.config.SBloodyBattleSetting;
import com.ljsd.jieling.config.SCMap;
import com.ljsd.jieling.config.SChallengeMapConfig;
import com.ljsd.jieling.globals.Global;
import com.ljsd.jieling.handler.map.EventType;
import com.ljsd.jieling.handler.map.behavior.BehaviorUtil;
import com.ljsd.jieling.logic.dao.UserManager;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.network.session.ISession;
import com.ljsd.jieling.protocols.CommonProto;
import com.ljsd.jieling.protocols.MessageTypeProto;
import com.ljsd.jieling.protocols.SceneFight;
import com.ljsd.jieling.util.CellUtil;
import com.ljsd.jieling.util.MathUtils;
import com.ljsd.jieling.util.MessageUtil;
import com.ljsd.jieling.util.MonsterUtil;
import java.util.*;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ScheduledThreadPoolExecutor;
public class SceneManager {
@ -18,10 +31,46 @@ public class SceneManager {
private static ScheduledThreadPoolExecutor scheduledExecutor=new ScheduledThreadPoolExecutor(8); //管理task
public static BloodyMap bloodyMap;
public static Queue<List<Integer>> possibalePositions = new LinkedBlockingDeque<>();
public static void initMap(){
BloodyMap bloodyMapTmp = new BloodyMap(12);
Map<Integer, SCMap> scMap = SCMap.sCMap.get(12);
for (Map.Entry<Integer, SCMap> entry : scMap.entrySet()) {
SCMap scMap1 = entry.getValue();
MapPointConfig mapPointConfig = MapPointConfig.getScMapEventMap().get(scMap1.getEvent());
if(mapPointConfig !=null && mapPointConfig.getStyle() == EventType.hinder){
int[][] groups = scMap1.getGroups();
for(int[] pos : groups){
int xy = CellUtil.xy2Pos(pos[0], pos[1]);
bloodyMapTmp.addBarrierPoint(xy);
}
}
}
int[][] mineralCeiling = SBloodyBattleSetting.sBloodyBattleSetting.getMineralCeiling();
int min =999999999;
for(int[] mineralCeilingSingle : mineralCeiling){
int minRound = mineralCeilingSingle[1];
if(min < minRound){
min = minRound;
}
}
bloodyMapTmp.setRound(min);
bloodyMap = bloodyMapTmp;
calPossiblePoss();
}
public static void createScene(Room room){
Scene scene = new Scene();
scene.setMapId(101);
int i = 6;
List<Integer> userInitBirths = null;
while ( ( userInitBirths=possibalePositions.poll()) == null){
calPossiblePoss();
}
scene.setMapId(bloodyMap.getMapId());
scene.setRoomId(room.getId());
SBloodyBattleSetting sBloodyBattleSetting = SBloodyBattleSetting.sBloodyBattleSetting;
for(Integer uid : room.fightPlayer){
User user = null;
try {
@ -31,54 +80,124 @@ public class SceneManager {
} catch (Exception e) {
e.printStackTrace();
}
UserBloodySnpInfo userBloodySnpInfo = BattleManager.snapUserFightInfo(user, 1);
ScenePlayer playerA = new ScenePlayer();
playerA.setId(uid);
playerA.setScene(scene);
playerA.setStateType(StateType.UNREADY_STATE);
playerA.setLife(new Life(1000,1000));
playerA.setPos(256*i+ MathUtils.randomInt(i)+1);
i++;
int hp = userBloodySnpInfo.getMaxHp();
playerA.setLife(new Life(hp,hp));
playerA.setPos(userInitBirths.remove(0));
playerA.setSpeed(sBloodyBattleSetting.getPlayerSpeed());
scene.addScenActor(playerA);
}
//创建矿点
createMinear(scene,-1,1);
SceneMineral sceneMineral = new SceneMineral();
sceneMineral.setId(999);
sceneMineral.setPos(256*3+10);
sceneMineral.setLife(new Life(300000,300000));
sceneMineral.setStateType(StateType.READYED_STATE);
scene.addScenActor(sceneMineral);
SceneMineral sceneMinera2 = new SceneMineral();
sceneMinera2.setId(1999);
sceneMinera2.setPos(256*5+2);
sceneMinera2.setLife(new Life(5,5));
scene.addScenActor(sceneMinera2);
/* SceneMonster sceneMonster = new SceneMonster();
sceneMonster.setId(52014);
sceneMonster.setScene(scene);
sceneMonster.setLife(new Life(20000,20000));
sceneMonster.setPos(256*5+ 10);
List<Integer> secondPath = new ArrayList<>();
secondPath.add(256*5+11);
secondPath.add(256*5+12);
secondPath.add(256*5+13);
secondPath.add(256*5+14);
secondPath.add(256*4+14);
Command commandC = new Command(1,sceneMonster,secondPath);
scene.addCommand(commandC);
scene.addScenActor(sceneMonster);*/
//创建怪物
int[][] monster = sBloodyBattleSetting.getMonster();
int[][][] monsterPatrol = sBloodyBattleSetting.getMonsterPatrol();
Map<Integer, List<Integer>> monsterPotrolPaths = sBloodyBattleSetting.getMonsterPotrolPaths();
int monsterIndex = 0;
for(int[] monsterSingle : monster){
SceneMonster sceneMonster = new SceneMonster();
sceneMonster.setScene(scene);
sceneMonster.setId(monsterIndex+1);
int[][] patrol = monsterPatrol[monsterIndex];
int xy2Pos = CellUtil.xy2Pos(patrol[0][0], patrol[0][1]);
sceneMonster.setPos(xy2Pos);
int monsterGroupId = monsterSingle[0];
Map<Integer, List<CommonProto.FightUnitInfo>> monsterByGroup = MonsterUtil.getMonsterByGroup(monsterGroupId);
List<CommonProto.FightTeamInfo> monsterGroupList = BehaviorUtil.getFightTeamInfos(monsterGroupId,monsterByGroup, Global.MONSTER_1);
int hp = 0;
List<Integer> hps = new ArrayList<>();
for(CommonProto.FightTeamInfo fightTeamInfo : monsterGroupList){
List<CommonProto.FightUnitInfo> fightUnitListList = fightTeamInfo.getFightUnitListList();
for(CommonProto.FightUnitInfo fightUnitInfo : fightUnitListList){
String hpS = fightUnitInfo.getProperty().split("#")[1];
int fightHp = Integer.parseInt(hpS);
hp+=fightHp;
hps.add(fightHp);
}
}
sceneMonster.setRemainHps(hps);
sceneMonster.setLife(new Life(hp,hp));
sceneMonster.setSpeed(sBloodyBattleSetting.getMonsterSpeed());
Command commandC = new Command(1,sceneMonster,monsterPotrolPaths.get(monsterIndex+1));
scene.addCommand(commandC);
scene.addScenActor(sceneMonster);
monsterIndex++;
break;
}
sceneMap.put(room.getId(),scene);
//todo 发送到redis房间服务器去这里拿数据
MessageUtil.sendRoomMatchSuccessIndication(scene);
}
public static void createMinear(Scene scene,int target,int nums){
//创建矿点
SBloodyBattleSetting sBloodyBattleSetting = SBloodyBattleSetting.sBloodyBattleSetting;
Map<Integer, Integer> initializeMineMap = sBloodyBattleSetting.getInitializeMineMap();
Map<Integer, SCMap> scMap = SCMap.sCMap.get(bloodyMap.getMapId());
Set<Integer> excluIndexs = new HashSet<>(bloodyMap.getBarrierPoints());
for(SceneActor sceneActor : scene.getSceneActorMap().values()){
excluIndexs.add(sceneActor.getPos());
}
for (Map.Entry<Integer, SCMap> entry : scMap.entrySet()) {
SCMap scMap1 = entry.getValue();
int event = scMap1.getEvent();
if(event == 1 || event == 2 ){
if(target!=-1 && target!=event){
continue;
}
int[][] groups = scMap1.getGroups();
if(target == -1){
nums = initializeMineMap.get(event);
}
Set<Integer> randomIndex = new HashSet<>();
Set<Integer> cacheRemove = new HashSet<>();
while (nums -- >0){
int index = MathUtils.randomWeight(groups, randomIndex);
int pos = CellUtil.xy2Pos(groups[index][0], groups[index][1]);
while(excluIndexs.contains(pos)){
cacheRemove.add(index);
index = MathUtils.randomWeight(groups, randomIndex);
pos = CellUtil.xy2Pos(groups[index][0], groups[index][1]);
}
excluIndexs.add(pos);
}
randomIndex.removeAll(cacheRemove);
for(Integer index : randomIndex){
SceneMineral sceneMineral = new SceneMineral();
int pos = CellUtil.xy2Pos(groups[index][0], groups[index][1]);
sceneMineral.setId(pos);
sceneMineral.setPos(pos);
int hp = sBloodyBattleSetting.getMineralCeilingMap().get(event)[4];
sceneMineral.setLife(new Life(hp,hp));
sceneMineral.setStateType(StateType.READYED_STATE);
sceneMineral.setSize(event);
scene.addScenActor(sceneMineral);
break;
}
break;
}
}
}
public static Scene getSceneMap(int roomId) {
return sceneMap.get(roomId);
}
public static void clearScene(int roomId){
sceneMap.remove(roomId);
}
public static void createScene() throws InterruptedException {
@ -170,11 +289,70 @@ public class SceneManager {
}
public static void calPossiblePoss(){
SChallengeMapConfig sChallengeMapConfig = SChallengeMapConfig.integerSChallengeMapConfigMap.get(bloodyMap.getMapId());
int[] size = sChallengeMapConfig.getSize();
int maxX = size[0];
int maxY = size[1];
SBloodyBattleSetting sBloodyBattleSetting = SBloodyBattleSetting.sBloodyBattleSetting;
if(possibalePositions.size()>50){
return;
}
for(int i=0;i<100;i++){
List<Integer> randomPositions = new ArrayList<>(10);
int[][] points = sBloodyBattleSetting.getPoint();
int selectNums = 0;
Set<Integer> randomIndexs = new HashSet<>();
Set<Integer> removeIndexs = new HashSet<>();
while (true){
int index= MathUtils.randomWeight(points,randomIndexs);
Set<Integer> cache = new HashSet<>();
int[] possiblePoint = points[index];
if( !CellUtil.calSurPos(possiblePoint[0],possiblePoint[1],sBloodyBattleSetting.getPointInterval(),maxX,maxY,cache) ){
removeIndexs.add(index);
continue;
}
selectNums++;
if(selectNums>=10){
break;
}
}
randomIndexs.removeAll(removeIndexs);
for(Integer index : randomIndexs){
int[] possiable = points[index];
randomPositions.add(CellUtil.xy2Pos(possiable[0], possiable[1]));
}
possibalePositions.add(randomPositions);
}
}
public static int selectForPlayerRebirth(Scene scene){
List<Integer> excludePosList = new ArrayList<>();
Map<Integer, SceneActor> sceneActorMap = scene.getSceneActorMap();
for(SceneActor sceneActor : sceneActorMap.values()){
int pos = sceneActor.getPos();
excludePosList.add(pos);
}
List<Integer> poll = null;
while (true){
while ( ( poll=possibalePositions.poll()) == null){
calPossiblePoss();
}
poll.removeAll(excludePosList);
if(poll.size()>0){
return poll.get(0);
}
}
}
public static void main(String[] args) throws InterruptedException {
createScene();
}
public static void startGame(Scene scene) {
scene.setStartTime(System.currentTimeMillis());
scheduledExecutor.execute(scene);
System.out.println("start battle pvp...........................");
}

View File

@ -0,0 +1,31 @@
package com.ljsd.jieling.config;
import com.ljsd.jieling.logic.STableManager;
import com.ljsd.jieling.logic.Table;
import java.util.Map;
@Table(name ="BeStronger")
public class SBeStronger implements BaseConfig {
private int id;
private int type;
@Override
public void init() throws Exception {
}
public int getId() {
return id;
}
public int getType() {
return type;
}
}

View File

@ -0,0 +1,227 @@
package com.ljsd.jieling.config;
import com.ljsd.jieling.logic.STableManager;
import com.ljsd.jieling.logic.Table;
import com.ljsd.jieling.util.CellUtil;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Table(name ="BloodyBattleSetting")
public class SBloodyBattleSetting implements BaseConfig {
private int id;
private int matchTime;
private int battleTime;
private int countDown;
private int invincible;
private int[] settleTime;
private int[][] playerSscore;
private int[] danIntegral;
private int[][] dropPoints;
private int[] price;
private int[] seasonPass;
private int[][][] seasonReward;
private int[][][] seasonTokenReward;
private int[][] point;
private int pointInterval;
private int[][] monster;
private int[][][] monsterPatrol;
private int[][] buildingBuff;
private int[][] mineralCeiling;
private int collectingInterval;
private int[][] debuff;
private int monsterSpeed;
public static SBloodyBattleSetting sBloodyBattleSetting;
private int[][] initializeMine;
private Map<Integer,Integer> initializeMineMap;
private Map<Integer, List<Integer>> monsterPotrolPaths;
private Map<Integer,int[]> mineralCeilingMap;
private int playerSpeed;
private int[] fightTime;
@Override
public void init() throws Exception {
SBloodyBattleSetting sBloodyBattleSettingTmp = STableManager.getConfig(SBloodyBattleSetting.class).get(1);
int[][] initializeMine = sBloodyBattleSettingTmp.getInitializeMine();
Map<Integer,Integer> initializeMineMapTmp = new HashMap<>(initializeMine.length);
for(int[] initializeMineSingle : initializeMine ){
initializeMineMapTmp.put(initializeMineSingle[0],initializeMineSingle[1]);
}
int[][][] monsterPatrol = sBloodyBattleSettingTmp.getMonsterPatrol();
int[][] monster = sBloodyBattleSettingTmp.getMonster();
Map<Integer, List<Integer>> monsterPotrolPaths = new HashMap<>(monsterPatrol.length);
for(int i=0;i<monsterPatrol.length;i++){
int[][] monsterPotrolPath = monsterPatrol[i];
List<Integer> paths = new ArrayList<>(monsterPotrolPath.length);
for(int j=0;j<monsterPotrolPath.length;j++){
paths.add(CellUtil.xy2Pos(monsterPotrolPath[j][0],monsterPotrolPath[j][1]));
}
monsterPotrolPaths.put(i+1,paths);
}
Map<Integer,int[]> mineralCeilingMapTmp = new HashMap<>(2);
for(int[] mineralCeilingSingle : sBloodyBattleSettingTmp.getMineralCeiling()){
mineralCeilingMapTmp.put(mineralCeilingSingle[0],mineralCeilingSingle);
}
sBloodyBattleSettingTmp.setMonsterPotrolPaths(monsterPotrolPaths);
sBloodyBattleSettingTmp.setInitializeMineMap(initializeMineMapTmp);
sBloodyBattleSettingTmp.setMineralCeilingMap(mineralCeilingMapTmp);
sBloodyBattleSetting = sBloodyBattleSettingTmp;
}
public int getId() {
return id;
}
public int getMatchTime() {
return matchTime;
}
public int getBattleTime() {
return battleTime;
}
public int getCountDown() {
return countDown;
}
public int getInvincible() {
return invincible;
}
public int[] getSettleTime() {
return settleTime;
}
public int[][] getPlayerSscore() {
return playerSscore;
}
public int[] getDanIntegral() {
return danIntegral;
}
public int[][] getDropPoints() {
return dropPoints;
}
public int[] getPrice() {
return price;
}
public int[] getSeasonPass() {
return seasonPass;
}
public int[][][] getSeasonReward() {
return seasonReward;
}
public int[][][] getSeasonTokenReward() {
return seasonTokenReward;
}
public int[][] getPoint() {
return point;
}
public int getPointInterval() {
return pointInterval;
}
public int[][] getMonster() {
return monster;
}
public int[][][] getMonsterPatrol() {
return monsterPatrol;
}
public int[][] getBuildingBuff() {
return buildingBuff;
}
public int[][] getMineralCeiling() {
return mineralCeiling;
}
public int getCollectingInterval() {
return collectingInterval;
}
public int[][] getDebuff() {
return debuff;
}
public int[][] getInitializeMine() {
return initializeMine;
}
public Map<Integer, Integer> getInitializeMineMap() {
return initializeMineMap;
}
public void setInitializeMineMap(Map<Integer, Integer> initializeMineMap) {
this.initializeMineMap = initializeMineMap;
}
public void setMonsterPotrolPaths(Map<Integer, List<Integer>> monsterPotrolPaths) {
this.monsterPotrolPaths = monsterPotrolPaths;
}
public Map<Integer, List<Integer>> getMonsterPotrolPaths() {
return monsterPotrolPaths;
}
public Map<Integer, int[]> getMineralCeilingMap() {
return mineralCeilingMap;
}
public void setMineralCeilingMap(Map<Integer, int[]> mineralCeilingMap) {
this.mineralCeilingMap = mineralCeilingMap;
}
public int getMonsterSpeed() {
return monsterSpeed;
}
public int getPlayerSpeed() {
return playerSpeed;
}
public int[] getFightTime() {
return fightTime;
}
}

View File

@ -11,6 +11,12 @@ public class SDifferDemonsStageConfig implements BaseConfig {
private int id;
private int[] passiveSkillId;
private String passiveSkillString;
private int skillId;
@ -23,7 +29,19 @@ public class SDifferDemonsStageConfig implements BaseConfig {
@Override
public void init() throws Exception {
sDifferDemonsStageConfigMap = STableManager.getConfig(SDifferDemonsStageConfig.class);
Map<Integer, SDifferDemonsStageConfig> sDifferDemonsStageConfigMapTmp = SDifferDemonsStageConfig.sDifferDemonsStageConfigMap = STableManager.getConfig(SDifferDemonsStageConfig.class);
for(SDifferDemonsStageConfig sDifferDemonsStageConfig : sDifferDemonsStageConfigMapTmp.values()){
int[] passiveSkillIds = sDifferDemonsStageConfig.getPassiveSkillId();
if(passiveSkillIds.length>0){
StringBuilder sb = new StringBuilder();
for(int i=0;i<passiveSkillIds.length-1;i++){
sb.append(passiveSkillIds[i]).append("#");
}
sb.append(passiveSkillIds[passiveSkillIds.length-1]);
sDifferDemonsStageConfig.setPassiveSkillString(sb.toString());
}
}
sDifferDemonsStageConfigMap = sDifferDemonsStageConfigMapTmp;
}
@ -47,4 +65,16 @@ public class SDifferDemonsStageConfig implements BaseConfig {
public int getComonpentPreStage() {
return comonpentPreStage;
}
public void setPassiveSkillString(String passiveSkillString) {
this.passiveSkillString = passiveSkillString;
}
public int[] getPassiveSkillId() {
return passiveSkillId;
}
public String getPassiveSkillString() {
return passiveSkillString;
}
}

View File

@ -18,4 +18,5 @@ public interface GlobalGm {
int TREASURE_SCORE = 15;//生成孙龙宝藏积分
int MONSTER_JUMP = 16;//跳到兽潮层
int OUT_BLOODY_BATTLE = 17;//退出血战
}

View File

@ -1,6 +1,8 @@
package com.ljsd.jieling.handler.GameGM;
import com.ljsd.GameApplication;
import com.ljsd.jieling.battle.actor.Scene;
import com.ljsd.jieling.battle.room.SceneManager;
import com.ljsd.jieling.config.*;
import com.ljsd.jieling.core.GlobalsDef;
import com.ljsd.jieling.globals.BIReason;
@ -218,9 +220,20 @@ public class GMRequestHandler extends BaseHandler{
case GlobalGm.MONSTER_JUMP:
cUser.getMapManager().setLastMonsterAttack(prarm1);
break;
case GlobalGm.TREASURE_SCORE:
treasureScore(iSession,prarm1);
break;
case GlobalGm.TREASURE_SCORE:
treasureScore(iSession,prarm1);
break;
case GlobalGm.OUT_BLOODY_BATTLE:
int roomId = cUser.getRoomInfo().getRoomId();
if(roomId!=0){
Scene sceneMap = SceneManager.getSceneMap(roomId);
if(sceneMap!=null){
sceneMap.gameEnd();
}
}
break;
default:
}
try {

View File

@ -24,6 +24,7 @@ import com.ljsd.jieling.logic.activity.event.StoryEvent;
import com.ljsd.jieling.logic.dao.*;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.logic.fight.CheckFight;
import com.ljsd.jieling.logic.fight.FightType;
import com.ljsd.jieling.logic.hero.HeroAttributeEnum;
import com.ljsd.jieling.logic.hero.HeroLogic;
import com.ljsd.jieling.logic.mission.GameEvent;
@ -1191,7 +1192,7 @@ public class MapLogic {
SChallengeConfig sChallengeConfig = SChallengeConfig.sChallengeConfigs.get(user.getMapManager().getCurMapId());
int mostTime = sChallengeConfig.getMostTime();
int[] checkResult = CheckFight.getInstance().checkFight(seed, mostTime, getFightData, getOptionData);
int[] checkResult = CheckFight.getInstance().checkFight(seed, mostTime, getFightData, getOptionData,FightType.MapExploreFight);
List<Integer> remainHp = new ArrayList<>(5);
for (int i = 2; i < checkResult.length; i++) {
if (checkResult[i] <= 0) {
@ -1417,7 +1418,7 @@ public class MapLogic {
LuaValue getFightData = FightDataUtil.getFinalFightData(fightTeamInfo, monsterTeamList);
LuaValue getOptionData = FightDataUtil.getOptionData(frames);
int mostTime = SChallengeConfig.sChallengeConfigs.get(mapManager.getCurMapId()).getMostTime();
checkResult = CheckFight.getInstance().checkFight(seed, mostTime, getFightData, getOptionData);
checkResult = CheckFight.getInstance().checkFight(seed, mostTime, getFightData, getOptionData, FightType.MapExploreFight);
resultCode = checkResult[0];
if (resultCode == -1) {
MessageUtil.sendErrorResponse(session, 0, messageType.getNumber(), "战斗异常!");
@ -2003,7 +2004,7 @@ public class MapLogic {
LuaValue getOptionData = FightDataUtil.getOptionData(frames);
MapManager mapManager = user.getMapManager();
SChallengeConfig sChallengeConfig = SChallengeConfig.sChallengeConfigs.get(mapManager.getFindSuddenlyBossMapId());
int[] checkResult = CheckFight.getInstance().checkFight(seed, sChallengeConfig.getMostTime(), getFightData, getOptionData);
int[] checkResult = CheckFight.getInstance().checkFight(seed, sChallengeConfig.getMostTime(), getFightData, getOptionData,FightType.MapExploreFight);
//校验结果码 1胜利
int resultCode = checkResult[0];
@ -2145,7 +2146,7 @@ public class MapLogic {
LuaValue getFightData = FightDataUtil.getFinalFightData(fightTeamInfo, monsterTeamList);
LuaValue getOptionData = FightDataUtil.getOptionData(frames);
int[] checkResult = CheckFight.getInstance().checkFight(seed, sLevelDifficultyConfig.getRankTime(), getFightData, getOptionData);
int[] checkResult = CheckFight.getInstance().checkFight(seed, sLevelDifficultyConfig.getRankTime(), getFightData, getOptionData,FightType.StoryFight);
LevelDifficultyManager levelDifficultyManager = user.getLevelDifficultyManager();
@ -2288,7 +2289,7 @@ public class MapLogic {
LuaValue getFightData = FightDataUtil.getFinalFightData(fightTeamInfo, monsterTeamList);
LuaValue getOptionData = FightDataUtil.getOptionData(frames);
int[] checkResult = CheckFight.getInstance().checkFight(seed, sFloodConfig.getBattleTime(), getFightData, getOptionData);
int[] checkResult = CheckFight.getInstance().checkFight(seed, sFloodConfig.getBattleTime(), getFightData, getOptionData,FightType.MapExploreFight);
//校验结果码 1胜利
int resultCode = checkResult[0];

View File

@ -18,6 +18,7 @@ import com.ljsd.jieling.logic.dao.StoreInfo;
import com.ljsd.jieling.logic.dao.StoreManager;
import com.ljsd.jieling.logic.dao.TeamPosHeroInfo;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.logic.fight.FightType;
import com.ljsd.jieling.logic.hero.HeroLogic;
import com.ljsd.jieling.logic.store.StoreLogic;
import com.ljsd.jieling.protocols.CommonProto;
@ -229,6 +230,7 @@ public class BehaviorUtil {
newBuilder()
.addAllFightUnitList(heroFightInfos)
.setTeamSkillList(HeroLogic.getInstance().getPokenmonSkills(user,teamId))
.setTeamPassiveList(HeroLogic.getInstance().getPokenmonPassiveSkills(user,teamId))
.build();
return fightTeamInfo;
}
@ -362,6 +364,7 @@ public class BehaviorUtil {
//设置战斗随机种子
int seed = (int)(System.currentTimeMillis()/1000);
fightData.setFightSeed(seed);
fightData.setFightType(FightType.StoryFight.getType());
fightData.setFightMaxTime(maxTime);
fightStartRespons.setFightData(fightData);

View File

@ -15,6 +15,7 @@ public class KTDataUtil {
ParamDataBean paramDataBean = dataInfo.get(uid);
if(paramDataBean!=null){
try {
paramDataBean.setData_unix((int)(System.currentTimeMillis()/1000));
return paramDataBean.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();

View File

@ -1,6 +1,7 @@
package com.ljsd.jieling.logic;
import com.ljsd.GameApplication;
import com.ljsd.jieling.battle.room.SceneManager;
import com.ljsd.jieling.config.SDailyTasksConfig;
import com.ljsd.jieling.config.SGlobalSystemConfig;
import com.ljsd.jieling.config.ServerConfig;
@ -198,7 +199,7 @@ public class GlobalDataManaager {
TimeControllerOfFunction timeControllerOfFunction = globalSystemControl.getTimeControllerOfFunctionMap().get(8);
ArenaLogic.getInstance().updateArenaSeason(timeControllerOfFunction.getTimes());
MapLogic.getInstance().updateEndlessSeason(globalSystemControl.getTimeControllerOfFunctionMap().get(46).getTimes());
MapLogic.getInstance().setEndlessMapId(getEndleeMapIdByLevel());
MapLogic.setEndlessMapId(getEndleeMapIdByLevel());
}
MissionEventDistributor.init();
DataManagerDistributor.init();
@ -207,6 +208,7 @@ public class GlobalDataManaager {
GuilidManager.init();
new RPCServerTask(configurableApplicationContext).start();
new RPCGmServerTask(configurableApplicationContext).start();
SceneManager.initMap();
} catch (Exception e) {
LOGGER.error("e",e);
}

View File

@ -2,6 +2,7 @@ package com.ljsd.jieling.logic.arena;
import com.googlecode.protobuf.format.JsonFormat;
import com.ljsd.jieling.config.*;
import com.ljsd.jieling.core.GlobalsDef;
import com.ljsd.jieling.core.VipPrivilegeType;
@ -20,6 +21,7 @@ import com.ljsd.jieling.logic.activity.event.Poster;
import com.ljsd.jieling.logic.dao.*;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.logic.fight.CheckFight;
import com.ljsd.jieling.logic.fight.FightType;
import com.ljsd.jieling.logic.hero.HeroLogic;
import com.ljsd.jieling.logic.mail.MailLogic;
import com.ljsd.jieling.logic.mission.GameEvent;
@ -249,6 +251,8 @@ public class ArenaLogic {
public static int getFightResultByPersonToPerson(User mine, int myteamId, User defUser, int defTeamId, ArenaRecord arenaRecord, int skipFight, ArenaInfoProto.ArenaChallengeResponse.Builder builder){
CommonProto.FightTeamInfo fightTeamInfo = BehaviorUtil.getFightTeamInfo(mine,myteamId,true);
CommonProto.FightTeamInfo deffightTeamInfo = BehaviorUtil.getFightTeamInfo(defUser,defTeamId,false);
System.out.println(JsonFormat.printToString(fightTeamInfo));
System.out.println(JsonFormat.printToString(deffightTeamInfo));
//设置战斗随机种子
int seed = (int)(System.currentTimeMillis()/1000);
@ -269,7 +273,7 @@ public class ArenaLogic {
arenaRecord.setFightData(snapRecord);
LuaValue getFightData = FightDataUtil.getFinalPlayerFightData(fightTeamInfo, deffightTeamInfo);
LuaValue getOptionData = FightDataUtil.getOptionData("");
int[] checkResult = CheckFight.getInstance().checkFight(seed,SArenaSetting.getSArenaSetting().getMostTime(), getFightData, getOptionData);
int[] checkResult = CheckFight.getInstance().checkFight(seed,SArenaSetting.getSArenaSetting().getMostTime(), getFightData, getOptionData, FightType.ArenaFight);
return checkResult[0];
}
@ -288,7 +292,7 @@ public class ArenaLogic {
.build());
LuaValue getFightData = FightDataUtil.getFinalPlayerFightData(fightTeamInfo, deffightTeamInfo);
LuaValue getOptionData = FightDataUtil.getOptionData("");
int[] checkResult = CheckFight.getInstance().checkFight(seed,SArenaSetting.getSArenaSetting().getMostTime(), getFightData, getOptionData);
int[] checkResult = CheckFight.getInstance().checkFight(seed,SArenaSetting.getSArenaSetting().getMostTime(), getFightData, getOptionData,FightType.ArenaFight);
return checkResult[0];
}

View File

@ -38,9 +38,9 @@ public class BloodLogic {
while (it.hasNext()) {
TeamPosHeroInfo heroInfo = it.next();
Hero hero = heroManager.getHero(heroInfo.getHeroId());
Map<Integer, Integer> heroAttributeMap = HeroLogic.getInstance().calHeroNotBufferAttribute(user, hero, false, 501);
Map<Integer, Integer> heroAttributeMap = HeroLogic.getInstance().calHeroNotBufferAttribute(user, hero, false, teamId);
//加buff
if(buffInfo.length>0){
if(buffInfo!=null && buffInfo.length>0){
for(int i = 0 ; i < buffInfo.length ; i++){
heroAttributeMap = CombatLogic.getInstance().bufferOneHeroAttrAfterEat(heroAttributeMap,buffInfo[i]);
}

View File

@ -13,6 +13,7 @@ import com.ljsd.jieling.logic.dao.*;
import com.ljsd.jieling.logic.dao.root.GuildInfo;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.logic.fight.CheckFight;
import com.ljsd.jieling.logic.fight.FightType;
import com.ljsd.jieling.logic.hero.HeroAttributeEnum;
import com.ljsd.jieling.logic.hero.HeroLogic;
import com.ljsd.jieling.network.session.ISession;
@ -377,7 +378,7 @@ public class GuildFightLogic {
heroAttackFightInfos.add(heroFightInfo);
}
CommonProto.FightTeamInfo.Builder fightAttackTeamInfoBuilder = CommonProto.FightTeamInfo.newBuilder().addAllFightUnitList(heroAttackFightInfos)
.setTeamSkillList(HeroLogic.getInstance().getPokenmonSkills(userAttack, 1));
.setTeamSkillList(HeroLogic.getInstance().getPokenmonSkills(userAttack, 1)).setTeamPassiveList(HeroLogic.getInstance().getPokenmonPassiveSkills(userAttack,1));
fightAttackTeamInfo = fightAttackTeamInfoBuilder.build();
}else{
fightAttackTeamInfo = BehaviorUtil.getFightTeamInfo(userAttack,502,true);
@ -392,7 +393,7 @@ public class GuildFightLogic {
.setHeroFightInfos(fightAttackTeamInfo)
.addMonsterList(fightDefendTeamInfo)
.build();
int[] fightResult = CheckFight.getInstance().checkFight(seed, 1000, getFightData, getOptionData);
int[] fightResult = CheckFight.getInstance().checkFight(seed, 1000, getFightData, getOptionData, FightType.GuildFight);
for (int i = 0; i < fightResult.length; i++) {
System.out.println(fightResult[i]);
}

View File

@ -101,12 +101,14 @@ public class CheckFight {
* @param optionData
* @return {,1,2,3,4,5}
*/
public int[] checkFight(int seed,int maxTime, LuaValue fightData, LuaValue optionData){
public int[] checkFight(int seed,int maxTime, LuaValue fightData, LuaValue optionData,FightType fightType){
LuaValue transCoderObj = this.getTransCoderObj();
LuaValue func = transCoderObj.get(LuaValue.valueOf("Execute"));
LuaValue args = new LuaTable();
args.set("seed",seed);
args.set("maxTime",maxTime);
//todo type
args.set("type",fightType.getType());
LuaValue result = func.call( args,fightData,optionData);
int status = result.get("result").toint();
int duration = result.get("duration").toint();

View File

@ -227,7 +227,7 @@ public class CombatLogic {
int seed = (int)(System.currentTimeMillis()/1000);
LuaValue getFightData = FightDataUtil.getFinalFightData(fightTeamInfo, monsterTeamList);
LuaValue getOptionData = FightDataUtil.getOptionData("");
int[] checkResult = CheckFight.getInstance().checkFight(seed, sAdventureConfig.getSystemBossTime(), getFightData, getOptionData);
int[] checkResult = CheckFight.getInstance().checkFight(seed, sAdventureConfig.getSystemBossTime(), getFightData, getOptionData,FightType.AdventureLock);
int fightResult = checkResult[0];
if(fightResult == 1){
adventureManager.addAdventureStation(new AdventureStateInfo(arenaId));
@ -716,7 +716,7 @@ public class CombatLogic {
.addAllMonsterList(monsterGroupList)
.build();
builder.setFightData(build);
int[] checkResult = CheckFight.getInstance().checkFight(seed, sAdventureConfig.getInvasionBossTime(), getFightData, getOptionData);
int[] checkResult = CheckFight.getInstance().checkFight(seed, sAdventureConfig.getInvasionBossTime(), getFightData, getOptionData,FightType.InvasionBossFight);
totalHurt+= updateBossAndGetHurtForFight(checkResult, adventureBoss);
fightResult = checkResult[0];
//发送击杀boss奖励和发现者奖励

View File

@ -0,0 +1,24 @@
package com.ljsd.jieling.logic.fight;
public enum FightType {
StoryFight(1), //故事副本
MapExploreFight(2), // 地图探索
ArenaFight(3), //竞技场
InvasionBossFight(4),//秘境boss
AdventureLock(5), // 解锁秘境
GuildFight(6), // 公会站
BloodyFight(7), // 血战
;
private int type;
public int getType() {
return type;
}
FightType(int type) {
this.type = type;
}
}

View File

@ -860,6 +860,32 @@ public class HeroLogic {
return sb;
}
public StringBuilder getHeroPropertyBuilder(StringBuilder sb,FamilyHeroInfo hero,Map<Integer, Integer> heroAttributeMap){
int heroLevel = hero.getLevel();
sb.append(heroLevel).append(DIVISION);
SCHero scHero = SCHero.getsCHero().get(hero.getTempleteId());
List<Integer> templatePropetyIds = transTemplateByHeroPropertyName.get(scHero.getPropertyName());
for(Integer templatePropetyId:templatePropetyIds){
Integer propertyValue = heroAttributeMap.get(templatePropetyId);
if(propertyValue == null){
propertyValue =0;
}
SPropertyConfig sPropertyConfig = SPropertyConfig.getsPropertyConfigByPID(templatePropetyId);
if(sPropertyConfig.getIfFormula() == 1){
sb.append(propertyValue/(heroLevel+10)/100).append(DIVISION);
}else{
if(sPropertyConfig.getStyle() == GlobalsDef.PERCENT_TYPE){
sb.append(propertyValue/10000f).append(DIVISION);
}else{
sb.append(propertyValue).append(DIVISION);
}
}
}
return sb;
}
public StringBuilder getRobotHeroProperty(SArenaRobotConfig sArenaRobotConfig,SCHero scHero, StringBuilder sb){
int[] differDemonsId = sArenaRobotConfig.getDifferDemonsId();
@ -892,7 +918,7 @@ public class HeroLogic {
StringBuilder pokenSkillResult = new StringBuilder();
List<TeamPosForPokenInfo> teamPosForPokenInfos = user.getTeamPosManager().getTeamPosForPoken().get(teamId);
if (teamPosForPokenInfos==null){
return "";
return "";
}
Map<Integer, Pokemon> pokemonMap = user.getPokemonManager().getPokemonMap();
Collections.sort(teamPosForPokenInfos);
@ -905,6 +931,24 @@ public class HeroLogic {
return pokenSkillResult.toString();
}
public String getPokenmonPassiveSkills(User user,int teamId){
StringBuilder pokenSkillResult = new StringBuilder();
List<TeamPosForPokenInfo> teamPosForPokenInfos = user.getTeamPosManager().getTeamPosForPoken().get(teamId);
if (teamPosForPokenInfos==null){
return "";
}
Map<Integer, Pokemon> pokemonMap = user.getPokemonManager().getPokemonMap();
Collections.sort(teamPosForPokenInfos);
for(TeamPosForPokenInfo teamPosForPokenInfo:teamPosForPokenInfos){
int pokemonId = teamPosForPokenInfo.getPokenId();
Pokemon pokemon = pokemonMap.get(pokemonId);
SDifferDemonsStageConfig sDifferDemonsStageConfig = SDifferDemonsStageConfig.getsDifferDemonsStageConfigMap(pokemonId*100 + pokemon.getAllStage());
pokenSkillResult.append(sDifferDemonsStageConfig.getPassiveSkillString()).append("|");
}
String s = pokenSkillResult.toString();
return s.substring( 0,(s.length()-1));
}
public String getRobotPokenmonSkills(SArenaRobotConfig sArenaRobotConfig){
StringBuilder pokenSkillResult = new StringBuilder();
int[] differDemonsId = sArenaRobotConfig.getDifferDemonsId();
@ -925,6 +969,7 @@ public class HeroLogic {
SCHero scHero = SCHero.getsCHero().get(hero.getTemplateId());
int profession = scHero.getProfession();
Map<Integer, Pokemon> pokemonMap = pokemonManager.getPokemonMap();
LOGGER.info("cal herotid = {},hero51value = {},end",hero.getTemplateId(),heroAllAttribute.get(HeroAttributeEnum.Hp.getPropertyId()));
for(Map.Entry<Integer,Pokemon> item : pokemonMap.entrySet()){
Pokemon pokemon = item.getValue();
Map<Integer, Integer> comonpentsLevelMap = pokemon.getComonpentsLevelMap();
@ -941,6 +986,7 @@ public class HeroLogic {
combinedAttribute(sDifferDemonsComonpentsConfig.getBaseAttribute(),heroAllAttribute);
}
}
LOGGER.info("cal herotid = {},hero51value = {},end",hero.getTemplateId(),heroAllAttribute.get(HeroAttributeEnum.Hp.getPropertyId()));
//装备总战力评分
int equipForce=0;
boolean needRemove = false;
@ -988,6 +1034,7 @@ public class HeroLogic {
HandlerLogicThread handlerThread = instance.handlerThreads[user.getId() % instance.HANDLER_THREAD_NUM];
handlerThread.addAyyncWorker(ayyncWorker);
}
LOGGER.info("cal herotid = {},hero51value = {},end",hero.getTemplateId(),heroAllAttribute.get(HeroAttributeEnum.Hp.getPropertyId()));
//天赋异妖加成
Map<Integer, Pokemon> ringFireMap = pokemonManager.getRingFireMap();
for(Map.Entry<Integer,Pokemon> item : ringFireMap.entrySet()){
@ -1016,10 +1063,12 @@ public class HeroLogic {
SRingFireMaterialConfig sRingFireMaterialConfig = SRingFireMaterialConfig.config.get(comonpentId);
int[][] comonpentIdProperty = sRingFireMaterialConfig.getProperty();
combinedAttribute(comonpentIdProperty,heroAllAttribute);
LOGGER.info("cal herotid = {},hero51value = {},end",hero.getTemplateId(),heroAllAttribute.get(HeroAttributeEnum.Hp.getPropertyId()));
}
}
LOGGER.info("cal herotid = {},hero51value = {},end",hero.getTemplateId(),heroAllAttribute.get(HeroAttributeEnum.Hp.getPropertyId()));
//工坊科技树加成
Map<Integer, Integer> techProfressionMap = user.getWorkShopController().getTechnologyMap().get(scHero.getProfession());
/* Map<Integer, Integer> techProfressionMap = user.getWorkShopController().getTechnologyMap().get(scHero.getProfession());
if(techProfressionMap!=null){
for(Map.Entry<Integer,Integer> item : techProfressionMap.entrySet()){
SWorkShopTechnology sWorkShopTechnology = SWorkShopTechnology.getsWorkTechMapByTechIdAndLevel(item.getKey(), item.getValue());
@ -1032,7 +1081,7 @@ public class HeroLogic {
}
}
}
}*/
//阵营光环加成
if(!isForce){
if(teamId!=0){
@ -1048,7 +1097,7 @@ public class HeroLogic {
heroAllAttribute.put(HeroAttributeEnum.CurHP.getPropertyId(),heroAllAttribute.get(GlobalsDef.HP_TYPE));
//装备战力保存
heroAllAttribute.put(HeroAttributeEnum.EquipForce.getPropertyId(),equipForce);
// LOGGER.info("cal herotid = {},end",hero.getTemplateId());
LOGGER.info("cal herotid = {},hero51value = {},end",hero.getTemplateId(),heroAllAttribute.get(HeroAttributeEnum.Hp.getPropertyId()));
return heroAllAttribute;
}
@ -1154,7 +1203,7 @@ public class HeroLogic {
Integer propertyId = item.getKey();
float propertyValue = item.getValue();
if(propertyId == HeroAttributeEnum.EquipForce.getPropertyId()){
// LOGGER.info("the equipScore={}",propertyValue);
LOGGER.info("the equipScore={}",propertyValue);
continue;
}
SPropertyConfig sPropertyConfig = SPropertyConfig.getsPropertyConfigByPID(propertyId);
@ -1164,7 +1213,7 @@ public class HeroLogic {
float score = sPropertyConfig.getScore();
result += propertyValue*score;
//LOGGER.info("the propertyId={} the value is ={},propertyValue={},score={}result ={},the value={}",propertyId,propertyValue*score,propertyValue,score,result,propertyValue*score);
// LOGGER.info("the propertyId={} the value is ={},propertyValue={},score={}result ={},the value={}",propertyId,propertyValue*score,propertyValue,score,result,propertyValue*score);
}
return (int)result;
}

View File

@ -306,7 +306,8 @@ public class WorkShopLogic {
CommonProto.Equip equipProto = CBean2Proto.getEquipProto(unDetermined);
builder.setUnDetermined(equipProto);
}
builder.addAllTechnologyInfo(CBean2Proto.getTechInfo(workShopController.getTechnologyMap().values()));
// builder.addAllTechnologyInfo(CBean2Proto.getTechInfo(workShopController.getTechnologyMap().values()));
builder.addAllTechnologyInfo(new ArrayList<>());
MessageUtil.sendMessage(session,1, MessageTypeProto.MessageType.GET_WORKSHOP_INFO_RESPONSE_VALUE,builder.build(),true);
}

View File

@ -25,9 +25,10 @@ public class CellUtil {
public static void main(String[] args) {
System.out.println(17*256+13);
List<Integer> path = new ArrayList<>();
path.add(2051);
path.add(2307);
path.add(1257);
path.add(1798);
for(Integer pos : path){
System.out.println(pos +"----------------");
System.out.print(pos2XY(pos)[0] + " ");
@ -167,5 +168,50 @@ public class CellUtil {
return true;
}
public static boolean isContinuous(int lastXY, List<Integer> cells,List<Integer> excludes){
boolean first = false;
if (cells.size() > 0) {
first = checkIsNextOrMineCell(lastXY, cells.get(0));
if(!first){
return false;
}
}
for (int i = 1; i < cells.size() - 1; i++) {
if(excludes.contains(cells.get(i)) || excludes.contains(cells.get(i +1 )) ){
return false;
}
boolean other = checkIsNextOrMineCell(cells.get(i), cells.get(i + 1));
if (!other) {
return false;
}
}
return true;
}
public static boolean calSurPos(int x,int y,int diff,int maxX,int maxY,Set<Integer> cachePos){
Set<Integer> possibalePos = new HashSet<>();
for(int i = 0 ; i <=diff ; i++){
for(int j = 0 ;j <=i;j++){
if(x-j>0 && x+i-j>0 && x+i-j <= maxY){
int xy2Pos = xy2Pos(x - j, y + i - j);
if(cachePos.contains(xy2Pos)){
return false;
}
possibalePos.add(xy2Pos(x-j,y+i-j));
}
if(x+j>0 && x+j <= maxX && y-i+j<= maxY && y-i+j>0){
int xy2Pos = xy2Pos(x+j,y-i+j);
if(cachePos.contains(xy2Pos)){
return false;
}
possibalePos.add(xy2Pos(x+j,y-i+j));
}
}
}
cachePos.addAll(possibalePos);
// System.out.println(possibalePos);
return true;
}
}

View File

@ -171,9 +171,41 @@ public class FightDataUtil {
playerData.rawset(i, getHeroFightUnit(heroTeam.getFightUnitList(i - 1),position));
}
playerData.set("teamSkill", getTeamSkill(heroTeam.getTeamSkillList()));
playerData.set("teamPassive", getTeamPassive(heroTeam.getTeamPassiveList()));
return playerData;
}
private static LuaValue getTeamPassive(String pokemonSkill) {
LuaValue passivityData = new LuaTable();
if (StringUtil.isEmpty(pokemonSkill)){
return passivityData;
}
String[] skills = pokemonSkill.trim().split("\\|");
for (int j = 0; j < skills.length; j++) {
if (skills[j].length()>0){
String[] unitSkill = skills[j].split("#");
LuaValue passivityDataPer= new LuaTable();
for(int i=0;i<unitSkill.length;i++){
LuaValue detail = new LuaTable();
int passivityId = Integer.parseInt(unitSkill[i]);
SPassiveSkillLogicConfig sPassiveSkillLogicConfig = SPassiveSkillLogicConfig.getConfig(passivityId);
detail.rawset(1, LuaValue.valueOf(sPassiveSkillLogicConfig.getType()));
List<LuaValue> effectList = parseArraayToLuaValues(sPassiveSkillLogicConfig.getValue());
int size = effectList.size();
if (size > 0) {
for (int t = 0; t < size; t++) {
detail.rawset(t + 2, effectList.get(t));
}
}
passivityDataPer.rawset(i+1,detail);
}
passivityData.rawset(j+1,passivityDataPer);
}
}
return passivityData;
}
private static LuaValue getTeamSkill(String pokemonSkill) {
LuaValue teamSkill = new LuaTable();
if (pokemonSkill.equals("") || pokemonSkill==null){

View File

@ -259,4 +259,18 @@ public class MathUtils {
}
}
public static int randomWeight(int[][] source,Set<Integer> excluIndexs){
int length = source.length;
int randomIndex = 0;
while (true){
randomIndex= randomInt(length);
if(!excluIndexs.contains(randomIndex)){
break;
}
}
excluIndexs.add(randomIndex);
return randomIndex;
}
}