game2005api/webapp/services/MissionService.php
aozhiwei fc0d165440 1
2021-12-14 17:04:45 +08:00

496 lines
18 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace services;
require_once('mt/Task.php');
require_once('models/Mission.php');
use phpcommon\SqlHelper;
use mt;
use models\User;
use models\Mission;
class MissionService extends BaseService {
private $userInfo = null;
private $seasonDb = null;
private $hisBattleData = array();
private $seasonBattleData = array();
private $weeklyBattleData = array();
private $dailyBattleData = array();
public function init($userInfo, $seasonDb)
{
$this->userInfo = $userInfo;
$this->seasonDb = $seasonDb;
}
public function getMissionDto($userInfo, $seasonDb, $missionDb, $missionMeta)
{
$missionDto = array(
'mission_id' => $missionMeta['id'],
'current' => 0,
'target' => getXVal($missionMeta, 'target', 1),
'state' => Mission::NOT_FINISHED_STATE,
);
if ($missionDb) {
if ($missionMeta['type'] == mt\Task::DAILY_MISSON_TYPE) {
if (myself()->_getDaySeconds($missionDb['modifytime']) == myself()->_getNowDaySeconds()) {
$missionDto['current'] = $missionDto['target'];
$missionDto['state'] = Mission::RECEIVED_STATE;
return $missionDto;
}
} else {
$missionDto['current'] = $missionDto['target'];
$missionDto['state'] = Mission::RECEIVED_STATE;
return $missionDto;
}
}
$handled =true;
switch ($missionMeta['condition']) {
case mt\Task::DAILY_LOGIN_TIMES_COND:
{
//今日登陆
$missionDto['current'] = myself()->_getDailyV(TN_DAILY_LOGINS, 0);
}
break;
case mt\Task::PLAYER_LEVEL_COND:
{
//玩家等级达到X
$missionDto['current'] = $this->userInfo['level'];
}
break;
case mt\Task::TOTAL_BATTLE_TIMES_COND:
{
//进行X场比赛
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'total_battle_times');
}
break;
case mt\Task::SHARE_GAME_TIMES_COND:
{
//分享1次游戏
$missionDto['current'] = $this->getMissionV($missionMeta,
TN_DAILY_SHARE_GAMES,
TN_WEEKLY_SHARE_GAMES,
TN_SHARE_GAMES);
}
break;
case mt\Task::SINGLE_BATTLE_TIMES_COND:
{
//进行X场单人比赛
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'total_single_battle_times');
}
break;
case mt\Task::TEAM_BATTLE_TIMES_COND:
{
//进行X场组队比赛
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'total_team_battle_times');
}
break;
case mt\Task::SINGLE_BATTLE_RANK_COND:
{
//单人比赛排名前X
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'single_battle_rank');
}
break;
case mt\Task::TEAM_BATTLE_RANK_COND:
{
//组队比赛排名前X
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'team_battle_rank');
}
break;
case mt\Task::TOTAL_KILL_NUM_COND:
{
//累计击败X个敌人
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'total_kills_times');
}
break;
case mt\Task::TOTAL_DAMGE_OUT_COND:
{
//累计造成X点伤害
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'total_damage_out');
}
break;
case mt\Task::RESCUE_TEAMMATE_TIMES_COND:
{
//救援X个队友
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'rescue_teammate_times');
}
break;
case mt\Task::TOTAL_SURVIVAL_TIME_COND:
{
//累计生存X分钟
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'total_alive_time');
}
break;
case mt\Task::USE_WEAPON_KILL_NUM_COND:
{
//使用X枪械击杀Y个敌人 cond_param1=equip.type cond_param2=equip.sub_type
$missionDto['current'] = $this->getWeaponKills($missionMeta);
}
break;
case mt\Task::USE_WEAPON_DAMGE_OUT_COND:
{
//使用X种枪械对敌人累计造成Y点伤害 cond_param1=equip.type cond_param2=equip.sub_type
$missionDto['current'] = $this->getWeaponDamageOut($missionMeta);
}
break;
case mt\Task::USE_WEAPON_SLOT_TIMES_COND:
{
//使用某个槽位的次数 cond_param1=槽位
$missionDto['current'] = $this->getWeaponSlotUseTimes($missionMeta);
}
break;
case mt\Task::GET_EQUIP_TIMES_COND:
{
//获得某种类型的装备 cond_param1=equip.type cond_param2=equip.sub_type
$missionDto['current'] = $this->getEquipObtainCount($missionMeta);
}
break;
case mt\Task::TOTAL_DIVING_TIMES_COND:
{
//累计潜水X次
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'diving_times');
}
break;
case mt\Task::TOTAL_DAMAGE_IN_COND:
{
//累计受到X点伤害
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'total_damage_in');
}
break;
case mt\Task::TOTAL_RECOVER_HP_COND:
{
//累计恢复X点血量
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'total_recover_hp');
}
break;
case mt\Task::TOTAL_OPEN_AIRDROP_COND:
{
//累计打开空投补给X次
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'open_airdrop_times');
}
break;
case mt\Task::BATTLE_IN_HERO_LV_COND:
{
//单局内英雄技能升级到X级
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'max_hero_skill_lv');
}
break;
case mt\Task::BATTLE_IN_GUN_LV_COND:
{
//单局内英雄专属枪械升到X级 cond_param1=英雄id
$missionDto['current'] = $this->getHeroLv($missionDb, $missionMeta);
}
break;
case mt\Task::TOTAL_MEDICINE_TIMES_COND:
{
//累计使用X药品Y次 cond_param1=槽位
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'use_medicine_times');
}
break;
case mt\Task::TOTAL_DESTORY_CAR_TIMES_COND:
{
//累计破坏载具X个
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'destory_car_times');
}
break;
case mt\Task::TOTAL_USE_CAMOUFLAGE_TIMES_COND:
{
//累计使用X个伪装物
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'use_camouflage_times');
}
break;
case mt\Task::TOTAL_USE_SKILL_TIMES_COND:
{
//累计使用X次角色技能
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'use_skill_times');
}
break;
case mt\Task::RIDE_CAR_MOVE_DISTANCE_COND:
{
//驾驶或乘坐载具累计移动X米所有模式
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'ride_car_move_distance');
}
break;
case mt\Task::RIDE_CAR_KILL_NUM_COND:
{
//驾驶或乘坐载具累计击杀X个敌人所有模式
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'ride_car_kills');
}
break;
case mt\Task::LIKE_TEAMMATE_TIMES_COND:
{
//战斗结算中累计给队友点赞X次
$missionDto['current'] = $this->getBattleData($missionDb, $missionMeta,
'to_teammate_like_times');
}
break;
case mt\Task::SEASON_LEVEL_COND:
{
//赛季段位达到X
$missionDto['current'] = $this->userInfo['rank'];
}
break;
case mt\Task::CONSUME_GOLD_COND:
{
//消耗X个金币
$missionDto['current'] = $this->userInfo['consume_gold'];
}
break;
case mt\Task::BATTLE_RANK_COND:
{
//获得X级评价Y次
$handled = false;
}
break;
case mt\Task::FINISHED_ALL_DAILY_MISSION_COND:
{
//完成所有每日任务
$handled = false;
}
break;
case mt\Task::SHOP_BUY_TIMES_COND:
{
//在X商店消费Y次
$missionDto['current'] = $this->getMissionV($missionMeta,
TN_DAILY_SHOP,
TN_WEEKLY_SHOP,
TN_SHOP);
}
break;
case mt\Task::TOTAL_UPGRADE_TALENT_LV_COND:
{
//科研升级X次
$missionDto['current'] = $this->getMissionV($missionMeta,
TN_DAILY_RECHARGE_UPGRADE_TIMES,
TN_WEEKLY_RECHARGE_UPGRADE_TIMES,
TN_RECHARGE_UPGRADE_TIMES);
}
break;
case mt\Task::TOTAL_GET_HERO_SKIN_COUNT_COND:
{
//累计获得X个角色时装
$handled = false;
}
break;
case mt\Task::TOTAL_GET_GUN_SKIN_COUNT_COND:
{
//累计获得X个枪械皮肤
$handled = false;
}
break;
case mt\Task::TOTAL_INVITE_FRIEND_TIMES_COND:
{
//邀请好友组队X次
$handled = false;
}
break;
case mt\Task::TOTAL_GIVE_FRIEND_GOLD_COUNT_COND:
{
//赠送X个好友金币
$handled = false;
}
break;
case mt\Task::TOTAL_INVITE_FRIEND_ONLINE_TIMES_COND:
{
//邀请X个好友上线
$handled = false;
}
break;
case mt\Task::TOTAL_CREATE_OR_JOIN_GUILD_COUNT_COND:
{
//创建或加入1个战队
$handled = false;
}
break;
case mt\Task::T1OTAL_CREATE_OR_JOIN_GUILD_COUNT_COND:
{
//段位达到X且进行Y场比赛
$handled = false;
}
break;
case mt\Task::DAILY_ACTIVE_VALUE_COND:
{
//每日活跃度达到X
$missionDto['current'] = myself()->_getDailyV(TN_DAILY_ACTIVE, 0);
}
break;
case mt\Task::WEEKLY_ACTIVE_VALUE_COND:
{
//每周活跃度达到X
$missionDto['current'] = myself()->_getWeeklyV(TN_WEEKLY_ACTIVE, 0);
}
break;
default:
{
}
break;
}
$missionDto['current'] = $missionDto['target'];
if ($missionDto['current'] >= $missionDto['target']) {
$missionDto['current'] = $missionDto['target'];
$missionDto['state'] = Mission::RECEIVEABLE_STATE;
}
if (!$handled) {
error_log(json_encode($missionDto));
}
return $missionDto;
}
private function getBattleData($missionDb, $missionMeta, $key)
{
//今天
//本周
//本季度
//永久
$val = 0;
if ($missionMeta['season_task'] == mt\Task::SEASON_MISSON_FLAG) {
if ($missionMeta['type'] == mt\Task::SEASONCARD_MISSON_TYPE &&
$missionMeta['subtype'] == mt\Task::SEASON_WEAKLY_MISSON_SUBTYPE) {
$weeklyData = getXVal($this->seasonDb, 'weekly_data', array());
$weekDb = getXVal($weeklyData, $missionMeta['week'], array());
$val = getXVal($weekDb, $key, 0);
} else {
$val = getXVal($this->seasonDb, $key, 0);
}
} else {
$val = getXVal($this->userInfo, $key, 0);
}
return $val;
}
private function internalGetBattleData($missionMeta)
{
$battleData = null;
if ($missionMeta['type'] == mt\Task::DAILY_MISSON_TYPE) {
$battleData = $this->$this->dailyBattleData;
} else {
if ($missionMeta['season_task'] == mt\Task::SEASON_MISSON_FLAG) {
if ($missionMeta['type'] == mt\Task::SEASONCARD_MISSON_TYPE &&
$missionMeta['subtype'] == mt\Task::SEASON_WEAKLY_MISSON_SUBTYPE) {
$battleData = getXVal($this->weeklyBattleData, $missionMeta['week'], array());
} else {
$battleData = $this->seasonBattleData;
}
} else {
$battleData = $this->hisBattleData;
}
}
return $battleData ? $battleData : array();
}
private function getWeaponDamageOut($missionMeta)
{
$val = 0;
$battleData = $this->internalGetBattleData($missionMeta);
$weaponData = getXVal($battleData, 'weapon_type_data', null);
if ($weaponData) {
$key = $missionMeta['param1'] . '_' . $missionMeta['param2'];
$data = getXVal($weaponData, $key, null);
if ($data) {
$val = getXVal($data, 'damage_out', 0);
}
}
return $val;
}
private function getWeaponKills($missionMeta)
{
$val = 0;
$battleData = $this->internalGetBattleData($missionMeta);
$weaponData = getXVal($battleData, 'weapon_type_data', null);
if ($weaponData) {
$key = $missionMeta['param1'] . '_' . $missionMeta['param2'];
$data = getXVal($weaponData, $key, null);
if ($data) {
$val = getXVal($data, 'kills', 0);
}
}
return $val;
}
private function getWeaponSlotUseTimes($missionMeta)
{
$val = 0;
$battleData = $this->internalGetBattleData($missionMeta);
$weaponData = getXVal($battleData, 'weapon_slot_data', null);
if ($weaponData) {
$key = $missionMeta['param1'];
$data = getXVal($weaponData, $key, null);
if ($data) {
$val = getXVal($data, 'use_times', 0);
}
}
return $val;
}
private function getEquipObtainCount($missionMeta)
{
$val = 0;
$battleData = $this->internalGetBattleData($missionMeta);
$weaponData = getXVal($battleData, 'weapon_type_data', null);
if ($weaponData) {
$key = $missionMeta['param1'] . '_' . $missionMeta['param2'];
$data = getXVal($weaponData, $key, null);
if ($data) {
$val = getXVal($data, 'obtain_count', 0);
}
}
return $val;
}
private function getHeroLv($missionDb, $missionMeta)
{
//'max_single_battle_hero_weapon_lv' . $missionMeta['param1']
$val = 0;
$battleData = $this->internalGetBattleData($missionMeta);
$heroData = getXVal($battleData, 'hero_data', null);
if ($weaponData) {
$key = $missionMeta['param1'];
$data = getXVal($heroData, $key, null);
if ($data) {
$val = getXVal($data, 'hero_lv', 0);
}
}
return $val;
}
private function getMissionV($missionMeta, $dailyX, $weeklyX, $hisX, $y)
{
if ($missionMeta['type'] == mt\Task::DAILY_MISSON_TYPE) {
return myself()->_getDailyV($dailyX, $y);
} else {
if ($missionMeta['season_task'] == mt\Task::SEASON_MISSON_FLAG) {
if ($missionMeta['type'] == mt\Task::SEASONCARD_MISSON_TYPE &&
$missionMeta['subtype'] == mt\Task::SEASON_WEAKLY_MISSON_SUBTYPE) {
return myself()->_getWeeklyV($dailyX, $y);
}
}
}
return myself()->_getV($x, $y);
}
}