cmd) {
case CmdCode::fight_settle: # 6801 主线战斗结算
return FightProc::Settle();
case CmdCode::fight_PassGateTsPrizeReceive: # 6802 章节宝箱的领取
return FightProc::PassGateTsPrizeReceive();
case CmdCode::fight_selectGate: # 6803 主线剧情关卡选择
return FightProc::SelectGate();
case CmdCode::fight_gateChallengeRewards: # 6804 挑战关卡: 领取奖励
return FightProc::GateChallengeRewards();
case CmdCode::fihgt_reliveCost: # 6805 战斗: 复活花费
return FightProc::ReliveCost();
case CmdCode::fight_plotSav: # 6806 主线剧情(已播放)回存
return FightProc::PlotSav();
case CmdCode::fight_sweep: # 6807 主线扫荡
return FightProc::FightSweep();
case CmdCode::fight_startFight: # 6808 主线剧情关卡开始挑战
return self::StartFight();
case CmdCode::fight_tower_RefreshSkills: # 6809 挑战关卡: 刷新初始技能
return self::TowerRefreshSkills();
case CmdCode::fight_tower_updatelocklist: # 6810 挑战关卡: 更新技能锁定列表
return self::TowerUpdateLockskillList();
case CmdCode::fight_rankInfo: # 6811 获取主线关卡排行榜信息
return self::GetRankInfo();
case CmdCode::fight_rank_uidEquipInfo: # 6812 获取主线关卡榜内玩家的装备信息
return self::GetUidEquipInfo_Rank();
case CmdCode::fight_rank_GetMainGateRankRewardInfo: # 6813 获取通关荣誉榜信息
return self::GetmainGate_RankRewardInfo();
case CmdCode::fight_rank_GetFightPowerRankRewardInfo: # 6814 获取战力荣誉榜信息
return self::GetFightPower_RankRewardInfo();
case CmdCode::fight_rank_ReceiveRankReward_MainGate: # 6815 领取通关荣誉榜奖励
return self::ReceiveRankReward_MainGate();
case CmdCode::fight_rank_ReceiveRankReward_FightPower: # 6816 领取战力荣誉榜奖励
return self::ReceiveRankReward_FightPower();
case CmdCode::fight_rank_IsExistRankReward: # 6817 是否存在未领取的荣誉榜奖励
return self::IsExistRankReward();
default:
Err(ErrCode::cmd_err);
}
}
/**
* 6807 扫荡
* @return type
*/
public static function FightSweep() {
//list($gateId) = req()->paras;
$passGateId = ctx()->gates->maxPassGateId();
my_Assert($passGateId != 0, ErrCode::gate_NoSweep);
//$mo = GameConfig::gate_getItem(ctx()->gates->UnlockedGatesMaxId);
$costTili = glc()->sweep_cost_tili;
my_Assert(ctx()->baseInfo->tili >= $costTili, ErrCode::notenough_tili);
$max = glc()->sweepMaxNum;
my_Assert(ctx()->gates->fightSweepNum < $max, ErrCode::gate_SweepMaxNum_limit);
ctx()->gates->fightSweepNum += 1;
ctx()->baseInfo->Consume_tili($costTili);
$prizeArr = array();
$wavesArr = GameConfig::waves_getItemArray($passGateId);
$count = count($wavesArr);
$wavesMo = $wavesArr[$count - 1];
ctx()->baseInfo->Add_Gold($wavesMo->rewardGold);
$gold = $wavesMo->rewardGold;
$prizeArr[] = "1," . $gold;
ctx()->baseInfo->Add_Gold($gold);
$exp = $wavesMo->rewardExp;
$prizeArr[] = "4," . $exp;
ctx()->baseInfo->Add_Exp($exp);
if ($wavesMo->rewardTuZhi != null) {
$tuzhi = explode('-', $wavesMo->rewardTuZhi);
$n = rand($tuzhi[0], $tuzhi[1]);
$tuzhiArr = array();
$item = GameConfig::item();
foreach ($item as $id => $mo) {
if ($mo->itemType == 100) {
$tuzhiArr[] = $id;
}
}
$index = rand(0, count($tuzhiArr) - 1);
$goodsStr = $tuzhiArr[$index] . ',' . $n;
$prizeArr[] = $goodsStr;
StoreProc::AddMultiItemInStore($goodsStr);
}
if ($wavesMo->rewardGem != null) {
$goodsStr = self::sweepRandReward($wavesMo->rewardGem);
$str = explode(';', $goodsStr);
$dic = GameConfig::gem();
foreach ($str as $value) {
$list = explode(',', $value);
$posId = rand(1, 6);
$qual = $list[0];
foreach ($dic as $key => $gemMo) {
if ($gemMo->qual == $qual && $gemMo->position == $posId) {
$prizeArr[] = $gemMo->typeId . ',' . $list[1];
StoreProc::PutGemInStore($gemMo->typeId, $list[1]);
break;
}
}
}
}
UserProc::updateUserInfo();
$ret = array(
'tili' => ctx()->baseInfo->tili,
'fightSweepNum' => ctx()->gates->fightSweepNum,
'prizeArr' => $prizeArr,
'store' => ctx()->store,
'task' => ctx()->task,
);
return Resp::ok($ret);
}
static function sweepRandReward($rewardStr) {
$ctxArr = explode(';', $rewardStr);
$numArr = explode('-', $ctxArr[0]);
$num = rand($numArr[0], $numArr[1]);
$rand = 0;
$itemArr = explode(',', $ctxArr[1]);
foreach ($itemArr as $value) {
$arr = explode(':', $value);
$itemId = $arr[0];
$per = $arr[1];
$rand += $per;
}
$res = "";
for ($i = 0; $i < $num; $i++) {
$start = 0;
$end = 0;
$randNum = rand(1, $rand);
$id = 0;
foreach ($itemArr as $str) {
$arr = explode(':', $str);
$itemId = $arr[0];
$per = $arr[1];
$end += $per;
if ($randNum > $start && $randNum <= $end) {
$id = $itemId;
break;
}
$start = $end;
}
if ($id != 0) {
$str = $id . ',1';
if ($res == "") {
$res = $str;
} else {
$res = $res . ';' . $str;
}
}
}
return $res;
}
/**
* 6808 开始挑战 (主线关卡:扣除体力, 挑战关卡: 增加次数)
*/
private static function StartFight() {
list($gateId, $layerNum) = req()->paras;
my_Assert($gateId > 0, ErrCode::paras_err);
$mo = GameConfig::gate_getItem($gateId);
my_Assert(null != $mo, ErrCode::err_const_no);
if (Ints::Slice($gateId, 0, 1) == 9) { # 爬塔模式
// list($layerNum) = req()->paras;
if ($layerNum != ctx()->gates()->TowerGateInfo()->CurLayer) { # 起始层数校验
Err(ErrCode::tower_layerNum);
}
if (ctx()->gates()->TowerGateInfo()->TodayChanNum < 1) { # 剩余次数校验
Err(ErrCode::tower_timeNo);
}
ctx()->gates()->TowerGateInfo()->TodayChanNum--; # 增加次数
} else { # 主线剧情
my_Assert(ctx()->base()->Consume_tili($mo->cost_tili), ErrCode::notenough_tili);
}
UserProc::updateUserInfo();
return Resp::ok(array("tili" => ctx()->baseInfo->tili, "tili_ts" => ctx()->baseInfo->tili_ts));
}
public static function FightDailyClear() {
//ctx()->gates->xunluo_quick_buyRecord = 0;
ctx()->gates->fightSweepNum = 0;
ctx()->gates()->TowerGateInfo()->RefreshSkillTimes = 0;
ctx()->gates()->TowerGateInfo()->TodayChanNum = glc()->tower_daily_chanceNum;
}
/**
* 6806 剧情回存
* @return type
*/
public static function PlotSav() {
list($gateId) = req()->paras;
my_Assert(StlUtil::dictHasProperty(ctx()->gates->GateList, $gateId), ErrCode::err_const_no);
ctx()->gates->GateList->$gateId->plotStart = 1;
UserProc::updateUserInfo();
$ret = array(
'ok' => 1,
);
return Resp::ok($ret);
}
//
/**
* 6810 挑战关卡: 更新锁定技能列表
*/
public static function TowerUpdateLockskillList() {
list($li_zd, $li_bd, $li_zds, $li_bds) = req()->paras; # 参数解析
$t = ctx()->gates()->TowerGateInfo(); # 记忆技能刷新结果
$t->skill_zhudong = $li_zd;
$t->skill_beidong = $li_bd;
$t->skill_zhudong_lockState = $li_zds;
$t->skill_beidong_lockState = $li_bds;
UserProc::updateUserInfo();
return Resp::ok();
}
/**
* 6809 挑战关卡: 刷新初始技能(扣除免费次数/cost)
*/
public static function TowerRefreshSkills() {
list($isFree, $li_zd, $li_bd, $li_zds, $li_bds) = req()->paras; # 参数解析
if ($isFree) {
if (ctx()->gates()->TowerGateInfo()->RefreshSkillTimes > glc()->tower_daily_refreshChanceNum) {
Err(ErrCode::tower_refreshNo); # 免费次数不足
}
} else {
list($type, $num) = explode(':', glc()->tower_refreshCost); # 二级货币类型(1:金币,2:元宝):数量
if ($type == 1) { # 金币
my_Assert(ctx()->base()->Consume_Gold($num), ErrCode::notenough_gold_msg);
} else if ($type == 2) { # 元宝
my_Assert(ctx()->base()->Consume_Cash($num), ErrCode::notenough_cash_msg);
} else {
Err(ErrCode::err_const_no, "检查刷新扣费配置信息!");
}
}
$t = ctx()->gates()->TowerGateInfo(); # 记忆技能刷新结果
$t->RefreshSkillTimes++;
$t->skill_zhudong = $li_zd;
$t->skill_beidong = $li_bd;
$t->skill_zhudong_lockState = $li_zds;
$t->skill_beidong_lockState = $li_bds;
UserProc::updateUserInfo();
$ret = array(
'task' => ctx()->task,
);
return Resp::ok($ret);
}
/**
* 6805 战斗: 复活花费
* @return type
* @version 2024年5月17日 重整利用为复活扣除消耗功能
*/
public static function ReliveCost() {
// 复活可以扣除复活币(暂无)或者元宝,(客户端看广告复活不需要跟服务器通讯)
list($reliveNum) = req()->paras;
$arr = explode(',', glc()->Relive_cost);
my_Assert($reliveNum > 0 && $reliveNum <= Count($arr), ErrCode::paras_err); # 参数范围>0
$amt = $arr[$reliveNum - 1];
my_Assert(ctx()->base()->Consume_Cash($amt), ErrCode::notenought_yuanbao);
UserProc::updateUserInfo();
return Resp::ok();
}
/**
* 6804 挑战关卡: 奖励领取
* @return type
*/
public static function GateChallengeRewards() {
list($finalLayer) = req()->paras; # 战斗结束时的层数
$lastLayer = ctx()->gates()->TowerGateInfo()->CurLayer;
$arr = GameConfig::waves_getItemArray(self::TowerGateId);
if ($finalLayer > $lastLayer) {
foreach ($arr as $layerId => $layerMo) {
if ($layerId >= $lastLayer && $layerId < $finalLayer) {
my_Assert($layerMo != null, ErrCode::err_const_no);
StoreProc::AddMultiItemInStore($layerMo->rewards); # 发放奖励
}
}
ctx()->gates()->TowerGateInfo()->CurLayer = $finalLayer;
UserProc::updateUserInfo();
$ret = array(
'store' => ctx()->store,
'gold' => ctx()->base()->gold,
'cash' => ctx()->base()->cash,
'task' => ctx()->task,
);
return Resp::ok($ret);
} else if ($finalLayer == $lastLayer) {
$ret = array(
'store' => ctx()->store,
'gold' => ctx()->base()->gold,
'cash' => ctx()->base()->cash,
'task' => ctx()->task,
);
return Resp::ok($ret);
}
return Resp::err(ErrCode::tower_rewardNo); # 没有奖励
}
//
/**
* 6803 关卡选择
* @return type
*/
public static function SelectGate() {
list($gateId) = req()->paras;
ctx()->gates->CurrentGateId = $gateId;
UserProc::updateUserInfo();
$ret = array(
'gates' => ctx()->gates,
);
return Resp::ok($ret);
}
/**
* 6802 章节宝箱的领取
* @return type
*/
public static function PassGateTsPrizeReceive() {
list($gateId, $index) = req()->paras;
$gateMo = GameConfig::gate_getItem($gateId);
my_Assert($gateMo != null, ErrCode::err_const_no);
my_Assert(StlUtil::dictHasProperty(ctx()->gates->GateList, $gateId), ErrCode::gate_NoUserGateInfo);
$gateInfo = ctx()->gates->GateList->$gateId;
$tag = false;
$prize = "";
$mask = 0;
switch ($index) {
case 1:
$ts = $gateMo->first_ts1 * 60;
if ($gateInfo->MaxSeconds >= $ts) {
$tag = true;
}
$mask = 1;
$prize = $gateMo->first_reward1;
break;
case 2:
$ts = $gateMo->first_ts2 * 60;
if ($gateInfo->MaxSeconds >= $ts) {
$tag = true;
}
$mask = 2;
$prize = $gateMo->first_reward2;
break;
case 3:
if ($gateInfo->pass > 0) {
$tag = true;
}
$mask = 3;
$prize = $gateMo->first_reward3;
break;
default:
break;
}
if ($tag) {
my_Assert(!in_array($mask, $gateInfo->FirstReward), ErrCode::gate_GatePriceHasReceive);
$gateInfo->FirstReward[] = $mask;
StoreProc::AddMultiItemInStore($prize);
}
ctx()->gates->GateList->$gateId = $gateInfo;
UserProc::updateUserInfo();
$ret = array(
'gates' => ctx()->gates,
'store' => ctx()->store,
'task' => ctx()->task,
'gold' => ctx()->baseInfo->gold,
'reward' => StoreProc::$reward,
);
return Resp::ok($ret);
}
/**
* [6801]关卡战斗结算
* @return type
*/
public static function Settle() {
list($resultType, $gateId, $gold, $curTs, $pickups,
$finalLayer, $finalHpPercent, $killMonsterNum, $killBossNum) = req()->paras;
# 客户端需要增加参数: killmonserNum,killBosssNum, finalHpPercent(最终血量百分比)
$gateMo = GameConfig::gate_getItem($gateId);
my_Assert($gateMo != null, ErrCode::err_const_no);
my_Assert(StlUtil::dictHasProperty(ctx()->gates->GateList, $gateId), ErrCode::gate_NoUserGateInfo);
$gateInfo = ctx()->gates->GateList->$gateId;
$ts = $gateInfo->MaxSeconds;
if ($curTs >= $ts) {
$gateInfo->MaxSeconds = $curTs;
}
if ($resultType) { # 胜利
if (ctx()->gates->GateList->$gateId->pass == 0) {
ctx()->gates->GateList->$gateId->pass = 1;
TaskProc::Day7TaskReset($gateId); # 刷新七日任务
$maxGateId = ctx()->gates->maxPassGateId();
if ($maxGateId > 0) {
self::Ranking_MainGateIndex($maxGateId);
self::IsAchievedMainGate_PassReward($maxGateId);
}
}
TaskProc::OnPassGate_X($gateId); # 刷新任务进度: 通关第X关
if (Ins_GateInfo::GateTypeFromId($gateId) == Enum_GateType::MainStoryGate) {
ctx()->gates()->UnlockNextPlotGate($gateId); # 解锁下一主线关卡
// ctx()->gates()->UnlockMainChallengeGate($gateId); # 挑战关卡解锁逻辑. -gwang 2024年4月15日
} else { # 不是主线关卡, 暂时没有其他逻辑
}
// StoreProc::AddMultiItemInStore($gateMo->reward_win); # 发放胜利奖励(2024.5.30 过期)
}
// else { # 失败
//// StoreProc::AddMultiItemInStore($gateMo->reward_fail); # 发放失败奖励(2024.5.30 过期)
// }
StoreProc::AddMultiItemInStore($pickups); # 战场拾取道具直接入背包
ctx()->base()->Add_Gold($gold); # 战场拾取的金币直接入背包
//ctx()->base()->Add_Exp($exp);
$waveMo = GameConfig::waveItem_getItem($gateId, $finalLayer);
my_Assert(null != $waveMo, ErrCode::err_const_no);
ctx()->base()->Add_Exp($waveMo->rewardExp); # 指挥官经验
ctx()->base()->Add_Gold($waveMo->rewardGold); # 金币奖励
$pickups .= ";1," . $gold + $waveMo->rewardGold;
# 图纸奖励: 数量min-max, 部位随机
if (strlen($waveMo->rewardTuZhi) > 0 && str_contains($waveMo->rewardTuZhi, '-')) {
list($tz_min, $tz_max) = explode('-', $waveMo->rewardTuZhi); # 图纸数量
$tz_n = rand($tz_min, $tz_max);
# 图纸部位数据源 1001, 1002, 1003, 1004, 1005, 1006
for ($i = 0; $i < $tz_n; $i++) {
$id = 1000 + rand(1, 6);
StoreProc::AddMultiItemInStore("$id,1"); # 获得图纸
$pickups .= ";$id,1";
}
}
# 宝石奖励: 数量min-max;品质:权重,品质:权重...
if (strlen($waveMo->rewardGem) > 0) {
list($gs_num, $gs_props) = explode(';', $waveMo->rewardGem);
list($gem_min, $gem_max) = explode('-', $gs_num); # 宝石数量
$gem_n = rand($gem_min, $gem_max);
$arr = explode(",", $gs_props);
$pool = array();
$n = 0;
foreach ($arr as $str) {
list($qual, $props) = explode(':', $str);
$pool[] = array('q' => $qual, 'p' => $props);
$n += $props;
}
for ($i = 0; $i < $gem_n; $i++) { # 随机n块宝石
$r = rand(1, $n); # 投色子
$l = 0;
foreach ($pool as $item) {
if ($r <= ($l + $item['p'])) {
$gemId = $item['q'] * 100000 + rand(1, 6) * 1000;
StoreProc::PutGemInStore($gemId); # 发放宝石并退出本次投色子
$pickups .= ";$gemId,1";
break;
}
$l += $item['p']; # 累计到下一段
}
}
}
if (Ins_GateInfo::GateTypeFromId($gateId) == Enum_GateType::MainStoryGate) { # 主线剧情,
TaskProc::OnFightNumMainGate();
} else if (Ins_GateInfo::GateTypeFromId($gateId) == Enum_GateType::MainChallengeGate) { # 主线剧情对应的难度挑战
TaskProc::OnFightNumChallengeGate();
}
TaskProc::OnKillCommonNumMonster($killMonsterNum);
TaskProc::OnKillleaderNumMonster($killBossNum);
UserProc::updateUserInfo();
$ret = array(
'gates' => ctx()->gates,
'store' => ctx()->store,
'task' => ctx()->task,
'baseInfo' => ctx()->base(),
'gold' => $gold + $waveMo->rewardGold,
'exp' => $waveMo->rewardExp,
'rewardStr' => $pickups
);
return Resp::ok($ret);
}
// /**
// * [6801]关卡战斗结算
// * @return type
// */
// public static function Settle_bak() {
// list($resultType, $gateId, $gold, $curTs, $pickups) = req()->paras;
// # 客户端需要增加参数: killmonserNum,killBosssNum, finalHpPercent(最终血量百分比)
// $gateMo = GameConfig::gate_getItem($gateId);
// my_Assert($gateMo != null, ErrCode::err_const_no);
// my_Assert(StlUtil::dictHasProperty(ctx()->gates->GateList, $gateId), ErrCode::gate_NoUserGateInfo);
// $gateInfo = ctx()->gates->GateList->$gateId;
// $ts = $gateInfo->MaxSeconds;
// if ($curTs >= $ts) {
// $gateInfo->MaxSeconds = $curTs;
// }
// if ($resultType) { # 胜利
// if (ctx()->gates->GateList->$gateId->pass == 0) {
// ctx()->gates->GateList->$gateId->pass = 1;
// TaskProc::Day7TaskReset($gateId);
// }
// TaskProc::OnPassGate_X($gateId);
// StoreProc::AddMultiItemInStore($gateMo->reward_win);
// if (Ins_GateInfo::GateTypeFromId($gateId) == Enum_GateType::MainStoryGate) {
// ctx()->gates->UnlockNextPlotGate();
// $dic = GameConfig::gate();
// $index = 0; # 挑战关卡解锁逻辑. -gwang 2024年4月15日
// foreach ($dic as $id => $item) {
// if (Ins_GateInfo::GateTypeFromId($id) == Enum_GateType::MainChallengeGate && $item->challengeGateId == $gateId) {
// $index += 1;
// $gate = new Ins_GateInfo();
// $gate->GateId = $id;
// ctx()->gates->GateList->$id = $gate;
// }
// if ($index >= 3) {
// break;
// }
// }
// } else {
//
// }
// } else { # 失败
// StoreProc::AddMultiItemInStore($gateMo->reward_fail);
// }
//
// StoreProc::AddMultiItemInStore($pickups); # 战场拾取道具
// ctx()->baseInfo->Add_Gold($gold);
// //ctx()->baseInfo->Add_Exp($exp);
//
// if (Ins_GateInfo::GateTypeFromId($gateId) == Enum_GateType::MainStoryGate) {
// TaskProc::OnFightNumMainGate();
// } else if (Ins_GateInfo::GateTypeFromId($gateId) == Enum_GateType::MainChallengeGate) {
// TaskProc::OnFightNumChallengeGate();
// }
// TaskProc::OnKillCommonNumMonster(1000);
// TaskProc::OnKillleaderNumMonster(500);
//
// UserProc::updateUserInfo();
// $ret = array(
// 'gates' => ctx()->gates,
// 'store' => ctx()->store,
// 'task' => ctx()->task,
// );
// return Resp::ok($ret);
// }
//
/**
* 参与主线关卡排行榜
* @param type $gateIndex
*/
public static function Ranking_MainGateIndex($maxGateIndex) {
$memKey = MemKey_GameRun::Rank_MainGateIndex_Zone_zset(req()->zoneid);
$mem = gMem();
$index = 9999999999 - now();
$uid = $index . "-" . req()->uid;
$arr = self::GetRankUid(req()->uid, 1);
$gateId = 0;
if (count($arr) > 0) {
$uid = $arr[0];
$gateId = $arr[1];
}
if ($maxGateIndex > $gateId) {
$arr2 = array();
$arr2["$uid"] = $maxGateIndex;
$mem->zadd($memKey, $arr2);
}
$length = $mem->zlen($memKey);
if ($length > glc()->Rank_MainGateIndex_OnListRank) {
$num = $length - glc()->Rank_MainGateIndex_OnListRank;
$mem->zremrangebyrank($memKey, 0, $num - 1);
}
}
/**
* 战力榜
* @param type $gateIndex
*/
public static function Ranking_FightPower() {
$memKey = MemKey_GameRun::Rank_FightPower_Zone_zset(req()->zoneid);
$mem = gMem();
$index = 9999999999 - now();
$uid = $index . "-" . req()->uid;
$lastPower = 0;
$arr = self::GetRankUid(req()->uid, 2);
if (count($arr) > 0) {
$uid = $arr[0];
$lastPower = $arr[1];
}
$power = self::countUserFightPower();
if ($power > $lastPower) {
$arr2["$uid"] = $power;
$mem->zadd($memKey, $arr2);
self::IsAchievedFightPower_PassReward($power);
}
$length = $mem->zlen($memKey);
if ($length > glc()->Rank_FightPower_OnListRank) {
$num = $length - glc()->Rank_FightPower_OnListRank;
$mem->zremrangebyrank($memKey, 0, $num - 1);
}
}
public static function GetRankUid($uid_rank, $type) {
if ($type == 1) {
$dic = gMem()->zrevrange(MemKey_GameRun::Rank_MainGateIndex_Zone_zset(req()->zoneid), 0, glc()->Rank_MainGateIndex_OnListRank, true);
} else {
$dic = gMem()->zrevrange(MemKey_GameRun::Rank_FightPower_Zone_zset(req()->zoneid), 0, glc()->Rank_FightPower_OnListRank, true);
}
$arr = array();
foreach ($dic as $uid => $score) {
$strUid = explode('-', $uid);
if ($strUid[1] == $uid_rank) {
$arr[] = $uid;
$arr[] = $score;
break;
}
}
return $arr;
}
/**
* 6811 获取主线关卡排行榜信息
* @return type
*/
public static function GetRankInfo() {
list($type) = req()->paras;
$selfIsHasRank = 0; //本人是否上榜 0未上榜没有排名 1上榜则selfRank就是排名
$selfExtraInfo = 0;
$isExistFinishReward = false;
if ($type == 1) {
$list = gMem()->zrevrange(MemKey_GameRun::Rank_MainGateIndex_Zone_zset(req()->zoneid), 0, glc()->Rank_MainGateIndex_OnListRank, true);
$selfExtraInfo = ctx()->gates->maxPassGateId();
$memKey = MemKey_GameRun::RankReward_MainGateIndex_Zone_hash(req()->zoneid);
$dic = gMem()->hgetall($memKey);
foreach ($dic as $gateId => $ins_rank) {
if (!in_array($gateId, ctx()->privateState->rankReward_drawed_MainGate)) {
$isExistFinishReward = true;
break;
}
}
} else {
$list = gMem()->zrevrange(MemKey_GameRun::Rank_FightPower_Zone_zset(req()->zoneid), 0, glc()->Rank_FightPower_OnListRank, true);
$selfExtraInfo = self::countUserFightPower();
$memKey = MemKey_GameRun::RankReward_FightPower_Zone_hash(req()->zoneid);
$dic = gMem()->hgetall($memKey);
foreach ($dic as $fightPower => $ins_rank) {
if (!in_array($fightPower, ctx()->privateState->rankReward_drawed_fightPower)) {
$isExistFinishReward = true;
break;
}
}
}
$selfRank = null;
$retArr = array();
if (count($list) > 0) {
foreach ($list as $uid => $score) {
$rankInfo = self::initOtherUidRankInfo($uid, $score, $type);
if ($rankInfo->uid == req()->uid) {
$selfIsHasRank = 1;
$selfRank = $rankInfo;
}
$retArr[] = $rankInfo;
}
}
if ($selfRank == null) {
$index = 9999999999 - now();
$uid = $index . "-" . req()->uid;
$selfRank = self::initOtherUidRankInfo($uid, $selfExtraInfo, $type);
}
UserProc::updateUserInfo();
$ret = array(
'rankInfo' => $retArr,
'selfRank' => $selfRank,
'selfIsHasRank' => $selfIsHasRank,
'isExistFinishReward' => $isExistFinishReward,
);
return Resp::ok($ret);
}
/**
* 初始化玩家rank
* @param type $uid
* @param type $score
* @return \loyalsoft\Ins_rank
*/
static function initOtherUidRankInfo($uid, $score, $type = null) {
$ins_rank = new Ins_rank();
if ($type == 1) {
$lv = gMem()->zrevrank(MemKey_GameRun::Rank_MainGateIndex_Zone_zset(req()->zoneid), $uid);
} else {
$lv = gMem()->zrevrank(MemKey_GameRun::Rank_FightPower_Zone_zset(req()->zoneid), $uid);
}
if ($lv == null) {
$lv = 0;
}
$strUid = explode('-', $uid);
$ins_rank->rank = $lv + 1;
$ins_rank->uid = $strUid[1];
$userInfo = UserProc::getUserGame(req()->zoneid, $strUid[1]);
$ins_rank->name = $userInfo->baseInfo->name;
$ins_rank->headImg = $userInfo->baseInfo->headImg;
$ins_rank->score = $score;
return $ins_rank;
}
/**
* 6812 获取排行榜内玩家的装备信息
* @return type
*/
public static function GetUidEquipInfo_Rank() {
list($uid) = req()->paras;
$userInfo = UserProc::getUserGame(req()->zoneid, $uid);
$store = $userInfo->store;
$heros = $userInfo->heros;
UserProc::updateUserInfo();
$ret = array(
'store' => $store,
'heros' => $heros,
);
return Resp::ok($ret);
}
/**
* 通关奖励是否达成
* @param type $maxGateIndex
*/
public static function IsAchievedMainGate_PassReward($maxGateIndex) {
$rewards = GameConfig::rank_passgatereward();
$memKey = MemKey_GameRun::RankReward_MainGateIndex_Zone_hash(req()->zoneid);
foreach ($rewards as $passGateId => $mo) {
if ($passGateId == $maxGateIndex && !gMem()->hexists($memKey, $maxGateIndex)) {
$ins_rank = new Ins_rank();
$ins_rank->uid = req()->uid;
$ins_rank->name = ctx()->baseInfo->name;
$ins_rank->headImg = ctx()->baseInfo->headImg;
$ins_rank->score = $passGateId;
gMem()->hset($memKey, $maxGateIndex, $ins_rank);
break;
}
}
}
/*
* 战力奖励是否达成
*/
public static function IsAchievedFightPower_PassReward($power) {
$rewards = GameConfig::rank_fightpowerreward();
$memKey = MemKey_GameRun::RankReward_FightPower_Zone_hash(req()->zoneid);
foreach ($rewards as $fightPower => $mo) {
if ($power >= $fightPower && !gMem()->hexists($memKey, $fightPower)) {
$ins_rank = new Ins_rank();
$ins_rank->uid = req()->uid;
$ins_rank->name = ctx()->baseInfo->name;
$ins_rank->headImg = ctx()->baseInfo->headImg;
$ins_rank->score = $fightPower;
gMem()->hset($memKey, $fightPower, $ins_rank);
}
}
}
/**
* 6813
* @return type
*/
public static function GetmainGate_RankRewardInfo() {
//list($type) = req()->paras;
$memKey = MemKey_GameRun::RankReward_MainGateIndex_Zone_hash(req()->zoneid);
$dic = gMem()->hgetall($memKey);
if ($dic == null) {
$dic = new \stdClass();
}
UserProc::updateUserInfo();
$ret = array(
'rankReward' => $dic,
);
return Resp::ok($ret);
}
/**
* 6814
* @return type
*/
public static function GetFightPower_RankRewardInfo() {
//list($type) = req()->paras;
$memKey = MemKey_GameRun::RankReward_FightPower_Zone_hash(req()->zoneid);
$dic = gMem()->hgetall($memKey);
if ($dic == null) {
$dic = new \stdClass();
}
UserProc::updateUserInfo();
$ret = array(
'rankReward' => $dic,
);
return Resp::ok($ret);
}
/**
* 6815 领取通关荣誉榜奖励
* @return type
*/
public static function ReceiveRankReward_MainGate() {
list($gateId) = req()->paras;
my_Assert(!in_array($gateId, ctx()->privateState->rankReward_drawed_MainGate), ErrCode::rankReward_HasReceive);
$mo = GameConfig::rank_passgatereward_getItem($gateId);
my_Assert($mo != null, ErrCode::err_const_no);
$memKey = MemKey_GameRun::RankReward_MainGateIndex_Zone_hash(req()->zoneid);
if (gMem()->hexists($memKey, $gateId)) {
StoreProc::AddMultiItemInStore($mo->reward);
ctx()->privateState->rankReward_drawed_MainGate[] = $gateId;
}
UserProc::updateUserInfo();
$ret = array();
return Resp::ok($ret);
}
/**
* 6816 领取战力荣誉榜奖励
* @return type
*/
public static function ReceiveRankReward_FightPower() {
list($fightPower) = req()->paras;
my_Assert(!in_array($fightPower, ctx()->privateState->rankReward_drawed_fightPower), ErrCode::rankReward_HasReceive);
$mo = GameConfig::rank_fightpowerreward_getItem($fightPower);
my_Assert($mo != null, ErrCode::err_const_no);
$memKey = MemKey_GameRun::RankReward_FightPower_Zone_hash(req()->zoneid);
if (gMem()->hexists($memKey, $fightPower)) {
StoreProc::AddMultiItemInStore($mo->reward);
ctx()->privateState->rankReward_drawed_fightPower[] = $fightPower;
}
UserProc::updateUserInfo();
$ret = array();
return Resp::ok($ret);
}
/**
* 6817
*/
public static function IsExistRankReward() {
//list($type) = req()->paras;
$type = 0;
$isExistFinishReward = false;
$memKey = MemKey_GameRun::RankReward_MainGateIndex_Zone_hash(req()->zoneid);
$dic = gMem()->hgetall($memKey);
foreach ($dic as $gateId => $ins_rank) {
if (!in_array($gateId, ctx()->privateState->rankReward_drawed_MainGate)) {
$isExistFinishReward = true;
$type = 1;
break;
}
}
$memKey2 = MemKey_GameRun::RankReward_FightPower_Zone_hash(req()->zoneid);
$dic2 = gMem()->hgetall($memKey2);
foreach ($dic2 as $fightPower => $ins_rank) {
if (!in_array($fightPower, ctx()->privateState->rankReward_drawed_fightPower)) {
$isExistFinishReward = true;
$type = 2;
break;
}
}
UserProc::updateUserInfo();
$ret = array(
'isExistFinishReward' => $isExistFinishReward,
'type' => $type,
);
return Resp::ok($ret);
}
/*
* 删除排行榜内注销账号的玩家
*/
public static function DeleteRankInvalidUser($uid2) {
$dic1 = gMem()->zrevrangebyscore(MemKey_GameRun::Rank_MainGateIndex_Zone_zset(req()->zoneid), 0, glc()->Rank_MainGateIndex_OnListRank, true);
$key1 = "";
foreach ($dic1 as $uid => $score) {
$strUid = explode('-', $uid);
if ($strUid[1] == $uid2) {
$key1 = $uid;
break;
}
}
$dic2 = gMem()->zrevrangebyscore(MemKey_GameRun::Rank_FightPower_Zone_zset(req()->zoneid), 0, glc()->Rank_FightPower_OnListRank, true);
$key2 = "";
foreach ($dic2 as $uid => $score) {
$strUid = explode('-', $uid);
if ($strUid[1] == $uid2) {
$key2 = $uid;
break;
}
}
if ($key1 != "") {
gMem()->zrem(MemKey_GameRun::Rank_MainGateIndex_Zone_zset(req()->zoneid), $key1);
}
if ($key1 != "") {
gMem()->zrem(MemKey_GameRun::Rank_FightPower_Zone_zset(req()->zoneid), $key2);
}
}
/*
* 排行玩家头像变动
*/
public static function UpdateRankUserHeadImg($uid, $headImg) {
$memKey1 = MemKey_GameRun::RankReward_MainGateIndex_Zone_hash(req()->zoneid);
$dic = gMem()->hgetall($memKey1);
foreach ($dic as $gateId => $ins_rank) {
if ($ins_rank->uid == $uid) {
$ins_rank->headImg = $headImg;
gMem()->hset($memKey1, $gateId, $ins_rank);
}
}
$memKey2 = MemKey_GameRun::RankReward_FightPower_Zone_hash(req()->zoneid);
$dic2 = gMem()->hgetall($memKey2);
foreach ($dic2 as $fightPower => $ins_rank) {
if ($ins_rank->uid == $uid) {
$ins_rank->headImg = $headImg;
gMem()->hset($memKey2, $fightPower, $ins_rank);
}
}
}
/*
* 统计战力 战斗力=攻击x(生命-伤害减免值)x(1+暴击率/100x(暴击伤害倍率-1))
*/
public static function countUserFightPower() {
$CurrentHeroId = ctx()->heros->CurrentHeroId;
//$hero = ctx()->heros->Dic->$CurrentHeroId;
$mo = GameConfig::hero_getItem($CurrentHeroId);
my_Assert($mo != null, ErrCode::err_const_no);
$heroBashAttack = $mo->attack;
$heroBashHp = $mo->hp;
$equipDic = ctx()->store->equip;
$attck = 0;
$hp = 0;
foreach ($equipDic as $index => $ins_equip) {
$Ins_Equip = new Ins_Equip($ins_equip);
if ($Ins_Equip->mo()->upgradeType == 1) {//攻击力
$attck += GameConfig::equip_levelupgrade_getItem($ins_equip->level)->attckNum;
} elseif ($Ins_Equip->mo()->upgradeType == 2) {
$hp += GameConfig::equip_levelupgrade_getItem($ins_equip->level)->hpNum;
} else {
$attck += GameConfig::equip_levelupgrade_getItem($ins_equip->level)->attckNum;
$hp += GameConfig::equip_levelupgrade_getItem($ins_equip->level)->hpNum;
}
}
$heroAttck = $heroBashAttack + $attck;
$heroHp = $heroBashHp + $hp;
$dec_demage = $mo->dec_demage;
$bigHit_Val = $mo->bigHit_Val / 100;
$bigHit_rate = $mo->bigHit_rate / 100;
$val = $heroAttck * ($heroHp - $dec_demage) * (1 + $bigHit_rate * ($bigHit_Val - 1));
return intval($val);
}
//
}