军团优化:军团上次排行榜

This commit is contained in:
luying
2022-07-22 09:41:54 +08:00
parent 1f045bd11d
commit a3af186161
17 changed files with 259 additions and 196 deletions

View File

@@ -3,7 +3,7 @@ import { RoleModel } from "../../db/Role";
import { GUILDACTIVITY } from "../../pubUtils/dicParam";
import { gameData, getGuildAuctionRewards, getCityActivityRewards, getGuildAuctionBasicNum } from "../../pubUtils/data";
import { getCurDay, nowSeconds, getTimeFun, getZeroPoint } from "../../pubUtils/timeUtil";
import { GUILD_ACTIVITY_STATUS, GET_POINT_WAYS, GUILD_ACTIVITY_TYPE, REDIS_KEY, AUCTION_SOURCE, MAIL_TYPE, CITY_STATUS, DEBUG_MAGIC_WORD, GUILD_POINT_WAYS, TASK_TYPE, AUCTION_TIME, CITY_ACTIVITY_DOOR, ABI_TYPE, PUSH_ROUTE, RACE_ACTIVITY_STATUS, SHOP_REFRESH_TYPE } from "../../consts";
import { GUILD_ACTIVITY_STATUS, GET_POINT_WAYS, GUILD_ACTIVITY_TYPE, REDIS_KEY, AUCTION_SOURCE, MAIL_TYPE, CITY_STATUS, DEBUG_MAGIC_WORD, GUILD_POINT_WAYS, TASK_TYPE, AUCTION_TIME, CITY_ACTIVITY_DOOR, ABI_TYPE, PUSH_ROUTE, RACE_ACTIVITY_STATUS, SHOP_REFRESH_TYPE, COUNTER } from "../../consts";
import { Record, UserGuildActivityRecModel } from "../../db/UserGuildActivityRec";
import { GateMembersRec, CityParam, Member, WoodenHorse, RaceActivityRankParam } from "../../domain/battleField/guildActivity";
import { DicGuildActivity } from "../../pubUtils/dictionary/DicGuildActivity";
@@ -29,6 +29,7 @@ import { sendMessageToCityWithSuc, sendMessageToGuildWithSuc, sendMessageToServe
import { saveGuildGateHpLog } from "../../pubUtils/logUtil";
import { GuildActivityCityDeclareModel } from "../../db/GuildActivityCityDeclare";
import { getRandSingleEelm } from "../../pubUtils/util";
import { CounterModel } from "../../db/Counter";
let gateActivityObj: GateActivityObject;
let cityActivityObj: CityActivityObject;
@@ -116,10 +117,11 @@ export function getGuildActivityStatus(id: number) {
export async function getAllGuildActivityStatus(guildCode: string, serverId: number) {
let guildActivities: { aid: number, status: number, time: number, isOpen: boolean, isCompleted?: boolean }[] = [];
for(let [ aid, dicGuildActivity ] of gameData.guildActivity) {
let index = getGAIndexInPinus(aid);
let res = getGuildActivityByDic(dicGuildActivity);
let isCompleted = res.isOpen;
if(res.status == GUILD_ACTIVITY_STATUS.START && guildCode) {
let guildActivityRec = await GuildActivityRecordModel.getRecord(guildCode, serverId, aid);
let guildActivityRec = await GuildActivityRecordModel.getRecord(guildCode, serverId, aid, index);
if(guildActivityRec) isCompleted = guildActivityRec.isCompleted;
}
guildActivities.push({aid, ...res, isCompleted});
@@ -193,14 +195,15 @@ export function getRecordScore(aid: number, round: number, record: { round: numb
export async function getGateActivityRank(guildCode: string, serverId: number, roleId?: string, roleName?: string) {
let r = new Rank(REDIS_KEY.GATE_ACTIVITY, { serverId }, true);
let index = getGAIndexInPinus(GUILD_ACTIVITY_TYPE.GATE_ACTIVITY);
let r = new Rank(REDIS_KEY.GATE_ACTIVITY, { serverId, index }, true);
r.setGenerFieldsFun(generGuildActivityRankField);
let { ranks: guildRank, myRank: myGuildRank } = await r.getRankListWithMyRank({ guildCode });
if (!myGuildRank) {
myGuildRank = await r.generMyRankWithGuild(guildCode, 0, 0);
}
let myR = new Rank(REDIS_KEY.USER_GATE_ACTIVITY, { serverId, guildCode }, true);
let myR = new Rank(REDIS_KEY.USER_GATE_ACTIVITY, { serverId, guildCode, index }, true);
myR.setGenerFieldsFun(generGuildActivityMemberRankField);
let { ranks: memberRank, myRank: myMemberRank } = await myR.getRankListWithMyRank({ roleId });
if (roleName && !myMemberRank) {
@@ -212,14 +215,18 @@ export async function getGateActivityRank(guildCode: string, serverId: number, r
export async function getCityActivityRank(guildCode: string, serverId: number, cityId: number, roleId?: string, roleName?: string) {
let r = new Rank(REDIS_KEY.CITY_ACTIVITY, { serverId, cityId }, true);
if(!cityId) {
return { guildRank: [], myGuildRank: undefined, memberRank: [], myMemberRank: undefined }
}
let index = getGAIndexInPinus(GUILD_ACTIVITY_TYPE.CITY_ACTIVITY);
let r = new Rank(REDIS_KEY.CITY_ACTIVITY, { serverId, cityId, index }, true);
r.setGenerFieldsFun(generGuildActivityRankField);
let { ranks: guildRank, myRank: myGuildRank } = await r.getRankListWithMyRank({ guildCode });
if (!myGuildRank) {
myGuildRank = await r.generMyRankWithGuild(guildCode, 0, 0);
}
let myR = new Rank(REDIS_KEY.USER_CITY_ACTIVITY, { serverId, guildCode }, true);
let myR = new Rank(REDIS_KEY.USER_CITY_ACTIVITY, { serverId, guildCode, index }, true);
myR.setGenerFieldsFun(generGuildActivityMemberRankField);
let { ranks: memberRank, myRank: myMemberRank } = await myR.getRankListWithMyRank({ roleId });
if (roleName && !myMemberRank) {
@@ -306,6 +313,7 @@ export async function settleGuildActivityReward(aid: number) {
}
} else if (aid == GUILD_ACTIVITY_TYPE.CITY_ACTIVITY) {
let obj = getCityActivityObj();
obj.endActivity();
let { cities } = obj.getAllCities();
for (let { serverId, cityId } of cities) {
await cityActivitySettleReward(cityId, serverId);
@@ -376,7 +384,8 @@ export async function gateActivitySettleReward(guildCode: string, serverId: numb
let { members } = obj.getObj(guildCode, serverId);
// console.log('***** gateHp', gateHp, 'members', members);
let r = new Rank(REDIS_KEY.GATE_ACTIVITY, { serverId }, true);
let index = getGAIndexInPinus(GUILD_ACTIVITY_TYPE.GATE_ACTIVITY);
let r = new Rank(REDIS_KEY.GATE_ACTIVITY, { serverId, index }, true);
let rank = await r.getMyRank({ guildCode });
let guildScore = await r.getMyScore({ guildCode });
// console.log('****** ranks', rank, 'guildScore', guildScore);
@@ -384,7 +393,7 @@ export async function gateActivitySettleReward(guildCode: string, serverId: numb
let rewards = getGuildAuctionRewards(GUILD_ACTIVITY_TYPE.GATE_ACTIVITY, rank);
// console.log('***** rewards', JSON.stringify(rewards));
let rec = await GuildActivityRecordModel.updateInfo(guildCode, GUILD_ACTIVITY_TYPE.GATE_ACTIVITY, {
let rec = await GuildActivityRecordModel.updateInfo(guildCode, GUILD_ACTIVITY_TYPE.GATE_ACTIVITY, index, {
isSuccess: true,
isCompleted: true,
rank, score: guildScore,
@@ -395,7 +404,7 @@ export async function gateActivitySettleReward(guildCode: string, serverId: numb
// 结算功勋等奖励
let dic = gameData.guildActivity.get(GUILD_ACTIVITY_TYPE.GATE_ACTIVITY);
let myR = new Rank(REDIS_KEY.USER_GATE_ACTIVITY, { serverId, guildCode }, true);
let myR = new Rank(REDIS_KEY.USER_GATE_ACTIVITY, { serverId, guildCode, index }, true);
let hasSentMember: string[] = [];
let ranks = <RoleRankInfo[]>await myR.getRankByRange();
@@ -444,21 +453,23 @@ export async function cityActivitySettleReward(cityId: number, serverId: number)
let {gateHp} = await obj.getGateHpAndInc(serverId, cityId);
let isSuccess = gateHp <= 0; // 血条未击破则没有占领军团
let r = new Rank(REDIS_KEY.CITY_ACTIVITY, { serverId, cityId }, true);
let index = getGAIndexInPinus(GUILD_ACTIVITY_TYPE.CITY_ACTIVITY);
let r = new Rank(REDIS_KEY.CITY_ACTIVITY, { serverId, cityId, index }, true);
let ranks = <GuildRankInfo[]>await r.getRankByRange();
console.log('###### cityActivitySettleReward', ranks)
for (let { rank: guildRank, code: guildCode, name, num } of ranks) {
if (guildRank == 1) {
if (isSuccess) {
await GuildActivityCityModel.guard(serverId, cityId, guildCode, name); // 占领
await declareCity(serverId, "", guildCode, dicCity.nextCity, true);
await GuildActivityCityModel.guard(serverId, cityId, guildCode, name, index + 1); // 占领
await declareCity(serverId, "", guildCode, dicCity.nextCity, true, index + 1);
} else {
await GuildActivityCityModel.guard(serverId, cityId, "", ""); // 无人能占领
await GuildActivityCityModel.guard(serverId, cityId, "", "", index + 1); // 无人能占领
}
}
let rewards = getGuildAuctionRewards(GUILD_ACTIVITY_TYPE.CITY_ACTIVITY, guildRank, cityId);
let members = obj.getMembersOfGuild(guildCode);
let rec = await GuildActivityRecordModel.updateInfo(guildCode, GUILD_ACTIVITY_TYPE.CITY_ACTIVITY, {
let rec = await GuildActivityRecordModel.updateInfo(guildCode, GUILD_ACTIVITY_TYPE.CITY_ACTIVITY, index, {
memberCnt: members.length, members,
isSuccess, isCompleted: true,
rank: guildRank, damage: num, remainGateHp: gateHp,
@@ -470,7 +481,7 @@ export async function cityActivitySettleReward(cityId: number, serverId: number)
await genAuction(guildCode, AUCTION_SOURCE.CITY, rec.code, serverId, rewards);
let dic = gameData.guildActivity.get(GUILD_ACTIVITY_TYPE.CITY_ACTIVITY);
let myR = new Rank(REDIS_KEY.USER_CITY_ACTIVITY, { serverId, guildCode }, true);
let myR = new Rank(REDIS_KEY.USER_CITY_ACTIVITY, { serverId, guildCode, index }, true);
let ranks = <RoleRankInfo[]>await myR.getRankByRange();
let userRank = 0;
let hasSentMember: string[] = [];
@@ -496,12 +507,7 @@ export async function cityActivitySettleReward(cityId: number, serverId: number)
obj.delCityRecord(cityId, serverId);
}
/**
* 清空完declareGuilds之后做下一次活动的自动宣战
*/
export async function autoDeclare(serverId: number) {
await GuildActivityCityModel.clearGuardAndStartNext(serverId);
await GuildActivityCityDeclareModel.clearDeclare(serverId);
for(let [ cityId ] of gameData.cityActivity) {
let msg = { cityId, declareGuildCode: "", declareCount: 0 };
await sendMessageToCityWithSuc(cityId, PUSH_ROUTE.GUILD_CITY_DECLARE, msg);
@@ -533,7 +539,7 @@ export async function participants(guildCode: string, sourceType: number, source
let rec = await GuildActivityRecordModel.findBySourceCode(guildCode, sourceType, sourceCode);
if (!rec) return [];
let baseNum = getGuildAuctionBasicNum(rec.aid, rec.rank, rec.cityId);
let baseNum = getGuildAuctionBasicNum(rec.aid, rec.rank, rec.challengeCityId);
let members = rec.members || [];
return members.map(cur => {
return { roleId: cur.roleId, job: cur.job, baseNum }
@@ -594,7 +600,7 @@ export function getCityStatus(guildCode: string, cityId: number, dic: DicCityAct
if (curCity) {
if (curCity.guardGuildCode == guildCode) {
status = CITY_STATUS.GUARD;
} else if (curCity.declareGuilds.includes(guildCode)) {
} else if (curCity.declareGuilds?.includes(guildCode)) {
status = CITY_STATUS.DECLARED;
}
}
@@ -640,14 +646,15 @@ export async function sendRaceStartMsg(serverId: number) {
await calWoodenHorseAndSend(serverId);
}
export async function cityActivityStart() {
let obj = getCityActivityObj();
obj.startActivity();
}
export async function gateActivityStart() {
let obj = getGateActivityObj();
obj.startActivity();
export async function guildActivityStart(aid: number) {
if(aid == GUILD_ACTIVITY_TYPE.GATE_ACTIVITY) {
let obj = getGateActivityObj();
obj.startActivity();
} else if (aid == GUILD_ACTIVITY_TYPE.CITY_ACTIVITY) {
let obj = getCityActivityObj();
obj.startActivity();
} else if (aid == GUILD_ACTIVITY_TYPE.RACE_ACTIVITY) {
}
}
/**
@@ -663,16 +670,17 @@ export async function raceActivitySettleReward(guildCode: string, woodenHorse: W
let { guildRank, myGuildRank } = await obj.getRanks(serverId, guildCode);
let rank = myGuildRank?.rank||0;
let r = new Rank(REDIS_KEY.RACE_ACTIVITY, { serverId });
let index = getGAIndexInPinus(GUILD_ACTIVITY_TYPE.RACE_ACTIVITY);
let r = new Rank(REDIS_KEY.RACE_ACTIVITY, { serverId, index });
await r.setRankWithGuildInfo2(guildCode, myGuildRank.num, myGuildRank.sortTime, myGuildRank.durability);
let tomorrow = <number>getTimeFun().getAfterDayWithHour();
await r.setExpire(tomorrow);
let nextWeek = <number>getTimeFun().getAfterDayWithHour(7);
await r.setExpire(nextWeek);
let isSuccess = distance >= GUILDACTIVITY.RACEACTIVITY_LENGTH; // 血条未击破则没有占领军团
let members = obj.getMembersOfGuild(guildCode);
let rewards = getGuildAuctionRewards(GUILD_ACTIVITY_TYPE.RACE_ACTIVITY, rank);
let rec = await GuildActivityRecordModel.updateInfo(guildCode, GUILD_ACTIVITY_TYPE.RACE_ACTIVITY, {
let rec = await GuildActivityRecordModel.updateInfo(guildCode, GUILD_ACTIVITY_TYPE.RACE_ACTIVITY, index, {
memberCnt: members.length, members,
isSuccess, isCompleted: true, rank,
rewards: rewards.map(cur => cur.goods),
@@ -788,11 +796,11 @@ export async function getCityActivityGateHp(serverId: number, cityId: number) {
return gateHp;
}
export async function declareCity(serverId: number, roleId: string, guildCode: string, cityId: number, isAutoDeclare: boolean) {
export async function declareCity(serverId: number, roleId: string, guildCode: string, cityId: number, isAutoDeclare: boolean, declareIndex: number) {
let declareTime = Date.now();
let declareInfo = await GuildActivityCityDeclareModel.declareIfNot(serverId, guildCode, cityId, roleId, declareTime, isAutoDeclare);
let declareInfo = await GuildActivityCityDeclareModel.declareIfNot(serverId, guildCode, cityId, roleId, declareTime, isAutoDeclare, declareIndex);
if(!!declareInfo && declareInfo.declareTime == declareTime) { // 确实没有人宣战过,自己是第一个
let cityRec = await GuildActivityCityModel.declare(serverId, cityId, guildCode);
let cityRec = await GuildActivityCityModel.declare(serverId, cityId, guildCode, declareIndex);
await sendGuildCityDeclare(cityId, guildCode, cityRec.declareCount);
return true;
}
@@ -800,17 +808,66 @@ export async function declareCity(serverId: number, roleId: string, guildCode: s
}
// 非军团长的团员自动宣战
export async function autoDeclareMyCity(serverId: number, roleId: string, guildCode: string) {
let checkResult = await GuildActivityCityDeclareModel.checkDeclartion(serverId, guildCode);
export async function autoDeclareMyCity(serverId: number, roleId: string, guildCode: string, declareIndex: number) {
let checkResult = await GuildActivityCityDeclareModel.checkDeclartion(serverId, guildCode, declareIndex);
if(checkResult) return false
let cityIds = gameData.juniorCities;
let cities = await GuildActivityCityModel.findMinDeclareCountCity(serverId, cityIds);
let cities = await GuildActivityCityModel.findMinDeclareCountCity(serverId, cityIds, declareIndex);
let notDeclaredCitites = cityIds.filter(curCityId => {
return cities.findIndex(city => city.cityId == curCityId) == -1;
});
let cityId = notDeclaredCitites.length > 0? getRandSingleEelm(notDeclaredCitites): cities[0].cityId;
if(!cityId) return false;
return declareCity(serverId, roleId, guildCode, cityId, true);
return declareCity(serverId, roleId, guildCode, cityId, true, declareIndex);
}
function getCounterName(aid: GUILD_ACTIVITY_TYPE) {
switch(aid) {
case GUILD_ACTIVITY_TYPE.GATE_ACTIVITY:
return COUNTER.GATE_ACTIVITY;
case GUILD_ACTIVITY_TYPE.CITY_ACTIVITY:
return COUNTER.CITY_ACTIVITY;
case GUILD_ACTIVITY_TYPE.RACE_ACTIVITY:
return COUNTER.RACE_ACTIVITY;
}
}
export async function incCurGuildActivityIndex(aid: number) {
let name = getCounterName(aid);
let index = await CounterModel.getNewCounter(name);
setGuildActivityIndexInPinus(aid, index); // systime
pinus.app.rpc.guild.guildActivityRemote.setGuildActivityIndex.broadcast(aid, index);
}
export async function initGuildActivityIndexInPinus() {
for(let aid = GUILD_ACTIVITY_TYPE.GATE_ACTIVITY; aid <= GUILD_ACTIVITY_TYPE.RACE_ACTIVITY; aid++){
let index = await getCurGuildActivityIndexByDb(aid);
setGuildActivityIndexInPinus(aid, index);
}
}
export async function getCurGuildActivityIndexByDb(aid: number) {
let name = getCounterName(aid);
return await CounterModel.getCounter(name);
}
export function getGAPinusName(aid: number) {
return `guildact${aid}`;
}
export function setGuildActivityIndexInPinus(aid: number, index: number) {
pinus.app.set(getGAPinusName(aid), index);
}
export function getGAIndexInPinus(aid: number) {
return pinus.app.get(getGAPinusName(aid));
}
export function getDeclareIndex() {
let index = getGAIndexInPinus(GUILD_ACTIVITY_TYPE.CITY_ACTIVITY);
let obj = getCityActivityObj();
if(obj.guildActivityStatus == GUILD_ACTIVITY_STATUS.START) return index;
return index + 1;
}