package org.skfiy.typhon.spi.dargon; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Random; import javax.inject.Inject; import org.skfiy.typhon.AbstractComponent; import org.skfiy.typhon.Typhons; import org.skfiy.typhon.domain.Dargon; import org.skfiy.typhon.domain.DargonObject; import org.skfiy.typhon.domain.Normal; import org.skfiy.typhon.domain.Player; import org.skfiy.typhon.packet.DargonPacket; import org.skfiy.typhon.packet.Packet; import org.skfiy.typhon.packet.PacketError; import org.skfiy.typhon.packet.SingleValue; import org.skfiy.typhon.session.BagUtils; import org.skfiy.typhon.session.SessionUtils; import org.skfiy.typhon.spi.ItemProvider; import org.skfiy.typhon.spi.RoleProvider; import org.skfiy.typhon.spi.Vip; import org.skfiy.typhon.spi.pvp.DargonPvpRival; import org.skfiy.typhon.spi.pvp.PvpProvider; import org.skfiy.typhon.spi.task.TaskDargonProvider; import org.skfiy.typhon.util.ComponentUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import java.util.Comparator; public class DargonProvider extends AbstractComponent { private static final Random RANDOM = new Random(); private static final int[] NUCLEUS_RANKINGS = {4, 3, 2, 1}; private final DargonComparator dargonComparator = new DargonComparator(); private final List<DargonEventEnum> dargonEvents = new ArrayList<>(); private final List<DargonDroplibrary> dargonBox = new ArrayList<>(); private final List<DargonDroplibrary> dargonSoul = new ArrayList<>(); private final List<DargonWar> dargonWar = new ArrayList<>(); private JSONArray dargonQuestion; private List<Integer> buyCounts; private int answerCeiling; private int answerFloor; private int goldCeiling; private int goldFloor; private int luckey; private int bad; private int levelGold; @Inject private ItemProvider itemProvider; @Inject private PvpProvider pvpProvider; @Inject private TaskDargonProvider taskDargonProvider; @Inject private RoleProvider roleProvider; @Override protected void doInit() { JSONArray array; dargonEvents.addAll(JSON.parseArray(ComponentUtils.readDataFile("dargon_events.json"), DargonEventEnum.class)); dargonWar.addAll(JSON.parseArray(ComponentUtils.readDataFile("dargon_war.json"), DargonWar.class)); array = JSON.parseArray(ComponentUtils.readDataFile("dargon_soul.json")); dargonSoul.addAll(total(array)); array = JSON.parseArray(ComponentUtils.readDataFile("dargon_box.json")); dargonBox.addAll(total(array)); dargonQuestion = JSON.parseArray(ComponentUtils.readDataFile("answerDatabase.json")); array = JSON.parseArray(ComponentUtils.readDataFile("dargon_buy_counts.json")); buyCounts = Arrays.asList(array.toArray(new Integer[]{})); answerCeiling = Typhons.getInteger("typhon.spi.dargon.answer.ceiling"); answerFloor = Typhons.getInteger("typhon.spi.dargon.answer.floor"); goldCeiling = Typhons.getInteger("typhon.spi.dargon.gold.ceiling"); goldFloor = Typhons.getInteger("typhon.spi.dargon.gold.floor"); luckey = -Typhons.getInteger("typhon.spi.dargon.luckey"); bad = -Typhons.getInteger("typhon.spi.dargon.bad"); levelGold = Typhons.getInteger("typhon.spi.dargon.gold.floor"); } @Override protected void doReload() { } @Override protected void doDestroy() { } public void dargonStart(DargonPacket packet) { Player player = SessionUtils.getPlayer(); Normal normal = player.getNormal(); int count = player.getNormal().getDargonNumber(); if (count >= Typhons.getInteger("typhon.spi.dargon.numbers")) { PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict); error.setText("not have Dargoncounts "); player.getSession().write(error); return; } Object obj = null; int id = packet.getAid(); Dargon dargon = normal.getDargonEvent().get(id - 1); if (!checkDargonLocation(normal, id, dargon)) { PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict); error.setText("the dargon Location is wrong"); player.getSession().write(error); return; } int event = dargon.getFlag(); switch (DargonEventEnum.valueOf(event)) { case gold: obj = getGold(player); break; case box: obj = randomReward(dargonBox); break; case lucky: obj = luckyEvent(normal); break; case bad: obj = badEvent(normal); break; case hero_soul: obj = randomReward(dargonSoul); break; case vigor: obj = getVigor(player); break; case gmwz: obj = light(player, packet); break; case question: obj = questionAnswer(player, packet); break; default: break; } player.getNormal().changeDargonNumber(1); player.getNormal().setRoleLocation(id); dargon.setState(1); // 日常任务 int task = normal.getDailyTask().getTaskDargonCounts(); if (task >= 0) { normal.getDailyTask().setTaskDargonCounts(task + 1); } //发给客户端判断 if (DargonEventEnum.valueOf(event).equals(DargonEventEnum.question) && obj == null) { obj = -1; } SingleValue result = new SingleValue(); Packet.assignResult(packet, result); result.setVal(obj); player.getSession().write(result); } private boolean checkDargonLocation(Normal normal, int id, Dargon dargon) { boolean bool = false; int last = normal.getRoleLocation(); // id 下一步的位置,dargon,上一个格子的状态 if ((id == 33 || (last == 0 || last - 1 == id || last + 1 == id || last + 4 == id || last - 4 == id)) && dargon.getState() != 1) { bool = true; } return bool; } public void reset(SingleValue packet) { Player player = SessionUtils.getPlayer(); reset(player); player.getSession().write(Packet.createResult(packet)); } private void reset(Player player) { player.getInvisible().getDargonAdversary().clear(); Normal normal = player.getNormal(); normal.clearDargonEvent(); normal.setBuyDargonCounts(0); normal.setOnceDargonMoney(0); normal.setRoleLocation(0); normal.setDargonNumber(0); } public void comeBack(SingleValue packet) { Player player = SessionUtils.getPlayer(); int id = (int) packet.getVal() - 1; player.getNormal().changeDargonNumber(1); player.getNormal().setRoleLocation(id + 1); player.getNormal().getDargonEvent().get(id).setState(1); player.getSession().write(Packet.createResult(packet)); } public Object questionAnswer(Player player, DargonPacket packet) { JSONObject object = null; Object obj = null; for (int i = 0; i < dargonQuestion.size(); i++) { object = dargonQuestion.getJSONObject(i); if (packet.getQid().equals(object.getString("id")) && packet.getAnswer().equals(object.getString("answer"))) { int get = (int) (Math.round(Math.random() * (answerCeiling - answerFloor)) + answerFloor); int copper = player.getRole().getLevel() * (get + levelGold); SessionUtils.incrementCopper(copper); obj = copper; break; } } return obj; } public DargonPvpRival randomWar(Player player, Dargon dargon) { int random = 0; int pvpRanking = player.getNormal().getPvpRanking(); int min = (int) Math.max(pvpRanking * 49 / 60, 0); int max = pvpRanking + 10; if (pvpRanking > 100) { max = pvpRanking; } random = RandomRival(min, max); return pvpProvider.loadRoleId(player, random, dargonWar.get(0).getFactor()); } public DargonPvpRival fixedWar(Player player, Dargon dargon) { int nucleus = dargon.getNucleus(); DargonWar dargonW = dargonWar.get(nucleus); double factor = dargonW.getFactor(); int pvpRanking = player.getNormal().getPvpRanking(); int max; int min; int random = 0; if (pvpRanking > 5) { switch (nucleus) { case 1: min = (int) Math.max(pvpRanking * 49 / 60, 0); max = pvpRanking + 10; if (pvpRanking > 100) { max = pvpRanking; } random = RandomRival(min, max); break; case 2: min = (int) Math.max(pvpRanking / 2, 0); max = (int) Math.max(pvpRanking * 49 / 60 - 1, 1); random = RandomRival(min, max); break; case 3: min = (int) Math.max(pvpRanking / 3, 0); max = (int) Math.max(pvpRanking / 2 - 1, 1); random = RandomRival(min, max); break; case 4: // MAX(ROUNDDOWN(pvpRanking/4-pvpRanking/30,0),1) min = (int) Math.max(pvpRanking * 26 / 120, 1); max = (int) Math.max(pvpRanking / 3 - 1, 1); random = RandomRival(min, max); break; } } else { random = NUCLEUS_RANKINGS[nucleus - 1]; } return pvpProvider.loadRoleId(player, random, factor); } private int RandomRival(int min, int max) { int x = max - min; if (x > 0) { x = RANDOM.nextInt(x + 1); } return (x + min); } public void dargonPrepare(SingleValue packet) { Player player = SessionUtils.getPlayer(); Normal normal = player.getNormal(); // 判断Vip相关的攻打次数 Vip vip = roleProvider.getVip(normal.getVipLevel()); if (normal.getDargonVipCount() >= vip.privileged.max_dargon_count) { PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict); error.setText("the dargonNumber is not enough "); player.getSession().write(error); return; } // 重置 reset(player); List<Dargon> dargons = new ArrayList<>(32); for (DargonEventEnum dargonEvent : dargonEvents) { dargons.add(new Dargon(dargonEvent.getFlag())); } Collections.shuffle(dargons); // 核心战斗 Dargon dargon; int t; for (int i = 1; i < 4; i++) { t = (int) (Math.random() * 7) + 8 * i; dargon = new Dargon(DargonEventEnum.fixed_war.getFlag(), i); dargons.add(t, dargon); } // Boss战斗 dargon = new Dargon(DargonEventEnum.fixed_war.getFlag(), 4); dargons.add(dargon); List<Dargon> tempDargons = new ArrayList<>(dargons); Collections.sort(tempDargons, dargonComparator); initDargonWar(tempDargons, player); normal.setDargonEvent(dargons); normal.addDargonVipCount(1); SingleValue result = new SingleValue(); Packet.assignResult(packet, result); result.setVal(dargons); player.getSession().write(result); } /** * @param packet */ public void warResults(DargonPacket packet) { Player player = SessionUtils.getPlayer(); Normal normal = player.getNormal(); int aid = packet.getAid(); Dargon dargon = normal.getDargonEvent().get(aid - 1); int rewards = 0; if (packet.getResult() == 1) { dargon.setState(1); int flag = dargon.getFlag(); DargonWar beDargonWar; if (DargonEventEnum.valueOf(flag).equals(DargonEventEnum.fixed_war)) { beDargonWar = dargonWar.get(dargon.getNucleus()); } else { beDargonWar = dargonWar.get(0); } rewards = beDargonWar.getRewards(); if (normal.getOnceDargonMoney() >= 0) { normal.setOnceDargonMoney(normal.getOnceDargonMoney() + rewards); taskDargonProvider.update(normal, normal.getOnceDargonMoney()); } SessionUtils.incrementDargonMoney(rewards); // 如果当前位置是大龙则不记录 if (aid != player.getNormal().getDargonEvent().size()) { player.getNormal().setRoleLocation(aid); } } normal.changeDargonNumber(1); SingleValue result = new SingleValue(); Packet.assignResult(packet, result); result.setVal(rewards); player.getSession().write(result); } public void buyDargonCounts(SingleValue packet) { Player player = SessionUtils.getPlayer(); Normal normal = player.getNormal(); int counts = normal.getBuyDargonCounts(); if (counts >= buyCounts.size()) { counts = buyCounts.size() - 1; } int cost = buyCounts.get(counts); JSONObject object = new JSONObject(); object.put("place", "DargonBuyActionCounts"); object.put("buyCounts", counts); SessionUtils.decrementDiamond(cost, object.toString()); normal.setBuyDargonCounts(counts + 1); normal.changeDargonNumber(-1); player.getSession().write(Packet.createResult(packet)); } private int getGold(Player player) { int random = (int) (Math.round(Math.random() * (goldCeiling - goldFloor)) + goldFloor); int copper = player.getRole().getLevel() * (random + levelGold); SessionUtils.incrementCopper(copper); return copper; } private int luckyEvent(Normal normal) { normal.changeDargonNumber(luckey); return luckey; } private int badEvent(Normal normal) { int number = Typhons.getInteger("typhon.spi.dargon.numbers"); if (normal.getDargonNumber() + bad >= number) { normal.setDargonNumber(number - 1); } else { normal.changeDargonNumber(bad); } return bad; } private int getVigor(Player player) { int vigor = player.getNormal().getVigor(); player.getNormal().setVigor(vigor + 2); return 2; } private int light(Player player, DargonPacket packet) { Dargon dargon = player.getNormal().getDargonEvent().get(packet.getGid() - 1); if (dargon.getState() == 0) { dargon.setState(2); } return packet.getGid(); } private List<DargonDroplibrary> total(JSONArray jsonArray) { int count = 0; List<DargonDroplibrary> list = new ArrayList<>(); for (int i = 0; i < jsonArray.size(); i++) { DargonDroplibrary dargon = new DargonDroplibrary(); JSONObject obj = jsonArray.getJSONObject(i); dargon.setItemDobj(itemProvider.getItem(obj.getString("#item.id"))); dargon.setPorb(obj.getIntValue("prob")); dargon.setMin(count); count += dargon.getPorb(); dargon.setMax(count); list.add(dargon); } return list; } private Object randomReward(List<DargonDroplibrary> drops) { int random = RANDOM.nextInt(drops.get(drops.size() - 1).getMax()); int count = 1; DargonObject obj = new DargonObject(); for (DargonDroplibrary drop : drops) { if (random >= drop.getMin() && random < drop.getMax()) { if (!drop.getItemDobj().getId().startsWith("h")) { int index = RANDOM.nextInt(100); if (index >= 30) { count = 3; } else if (index >= 2) { count = 2; } } obj.setSid(drop.getItemDobj().getId()); obj.setCount(count); BagUtils.intoItem(drop.getItemDobj(), count); break; } } return obj; } private void initDargonWar(List<Dargon> dargons, Player player) { DargonPvpRival rival; for (Dargon dargon : dargons) { if (dargon.getFlag() == DargonEventEnum.fixed_war.getFlag()) { for (;;) { rival = fixedWar(player, dargon); if (rival != null) { break; } } } else if (dargon.getFlag() == DargonEventEnum.random_war.getFlag()) { for (;;) { rival = randomWar(player, dargon); if (rival != null) { break; } } } else { break; } dargon.setHostInformation(rival); } } private class DargonComparator implements Comparator<Dargon> { @Override public int compare(Dargon o1, Dargon o2) { return Integer.compare(o1.getFlag(), o2.getFlag()); } } }