Browse Source

任务逻辑框架

gwang 5 years ago
parent
commit
57b1c0efd5

+ 1 - 0
Gameserver/Amfphp/Services/AppServer.php

@@ -47,6 +47,7 @@ class AppServer {
         if (isset($req->updateInfo)) {                                          # 透传参数
             $resp->updateInfo = $req->updateInfo;
         }
+        $resp->tag = arr2obj(array_merge((array) $resp->tag, (array) Resp::$ext_tag)); # 合并附加tag,  
         self::LogCmd($req, $resp);                                              # 记录操作日志
         CLog::flush();                                                          # flush日志
     }

+ 89 - 77
Gameserver/Amfphp/base/ErrCode.php

@@ -131,6 +131,89 @@ class ErrCode {
     const err_const_no = 1825;
 
     // </editor-fold>
+    //
+    //   // <editor-fold defaultstate="collapsed" desc="    商城/付费 88xx    ">
+
+    /**
+     * 尚未首付
+     */
+    const pay_firstpayno_err = 8801;
+
+    /**
+     * 已经领取首付
+     */
+    const pay_firstpaygetted = 8802;
+
+    /**
+     * 系统繁忙
+     */
+    const pay_systembusy_err = 8803;
+
+    /**
+     * 不是黄钻或已经领取黄钻礼包
+     */
+    const pay_vipnewerno = 8804;
+
+    /**
+     * amt数值小于等于0
+     */
+    const pay_m_amtzero_err = 8805;
+
+    /**
+     * 价格异常
+     */
+    const pay_price_err = 8806;
+
+    /**
+     *  支付类型异常
+     */
+    const pay_m_type_err = 8807;
+
+    /**
+     * 商品常量数据错误-货物内容
+     */
+    const pay_shopItem_cosnt_goods_err = 8808;
+
+    /**
+     * 商城 已达刷新次数上限
+     */
+    const pay_refresh_times = 8809;
+
+    /**
+     * 神秘商城 - 购买次数已达上限
+     */
+    const pay_secretshop_buytimes = 8810;
+
+    /**
+     * 神秘商城 - 物品数据错误
+     */
+    const pay_secretshop_noitem_err = 8811;
+
+    /**
+     * 充值 - 订单不存在
+     */
+    const pay_order_no = 8812;
+
+    /**
+     * 充值 - 付款状态不正确 正在重新查询...
+     */
+    const pay_order_paystatus = 8813;
+
+    /**
+     * 充值 - 此订单已经发货, 无需重复请求
+     */
+    const pay_order_drawed = 8814;
+
+    /**
+     * 充值 - 订单uid不符
+     */
+    const pay_order_uid = 8815;
+
+    /**
+     * 神秘商城 - 免费刷新时间未到
+     */
+    const pay_secretshopt_freeRefresh_Time = 8816;
+// </editor-fold>
     //
     // <editor-fold defaultstate="collapsed" desc="    not enough 系列    ">
 
@@ -410,92 +493,21 @@ class ErrCode {
      * 未知装备类型
      */
     const store_equip_type = 3411;
-
 // </editor-fold>
     //  
-    // <editor-fold defaultstate="collapsed" desc="    商城/付费 88xx    ">
-
-    /**
-     * 尚未首付
-     */
-    const pay_firstpayno_err = 8801;
-
-    /**
-     * 已经领取首付
-     */
-    const pay_firstpaygetted = 8802;
-
-    /**
-     * 系统繁忙
-     */
-    const pay_systembusy_err = 8803;
-
-    /**
-     * 不是黄钻或已经领取黄钻礼包
-     */
-    const pay_vipnewerno = 8804;
-
-    /**
-     * amt数值小于等于0
-     */
-    const pay_m_amtzero_err = 8805;
-
-    /**
-     * 价格异常
-     */
-    const pay_price_err = 8806;
+    // <editor-fold defaultstate="collapsed" desc="   任务错误码 35xx系列   ">
 
     /**
-     *  支付类型异常
+     * 找不到任务数据
      */
-    const pay_m_type_err = 8807;
+    const task_no = 3501;
 
     /**
-     * 商品常量数据错误-货物内容
+     * 任务进度尚未完成
      */
-    const pay_shopItem_cosnt_goods_err = 8808;
-
-    /**
-     * 商城 已达刷新次数上限
-     */
-    const pay_refresh_times = 8809;
-
-    /**
-     * 神秘商城 - 购买次数已达上限
-     */
-    const pay_secretshop_buytimes = 8810;
-
-    /**
-     * 神秘商城 - 物品数据错误
-     */
-    const pay_secretshop_noitem_err = 8811;
-
-    /**
-     * 充值 - 订单不存在
-     */
-    const pay_order_no = 8812;
-
-    /**
-     * 充值 - 付款状态不正确 正在重新查询...
-     */
-    const pay_order_paystatus = 8813;
-
-    /**
-     * 充值 - 此订单已经发货, 无需重复请求
-     */
-    const pay_order_drawed = 8814;
-
-    /**
-     * 充值 - 订单uid不符
-     */
-    const pay_order_uid = 8815;
-
-    /**
-     * 神秘商城 - 免费刷新时间未到
-     */
-    const pay_secretshopt_freeRefresh_Time = 8816;
+    const task_progress_not_complete = 3502;
 // </editor-fold>
-    //
+// 
     // <editor-fold defaultstate="collapsed" desc="    交互操作 36xx    ">
     //
     // </editor-fold>

+ 5 - 0
Gameserver/Amfphp/base/OpeCode.php

@@ -23,6 +23,11 @@ class OpeCode {
      */
     const Friend = 601;
 
+    /**
+     * 任务模块
+     */
+    const Task = 602;
+
     /**
      * 英雄功能
      */

+ 14 - 0
Gameserver/Amfphp/base/Resp.php

@@ -86,4 +86,18 @@ class Resp extends Object_ext {
         return $resp;
     }
 
+    static $ext_tag = null;
+
+    /**
+     * 向返回值添加附加数据
+     * @param string $name
+     * @param any $value
+     */
+    public static function addTag($name, $value) {
+        if (null == self::$ext_tag) {
+            self::$ext_tag = ObjectInit();
+        }
+        self::$ext_tag->$name = $value;
+    }
+
 }

+ 109 - 11
Gameserver/Amfphp/process/TaskProc.php

@@ -3,15 +3,54 @@
 namespace loyalsoft;
 
 /**
- * 1. 初始化玩家数据结构
- * 2. 添加玩家数据同步功能.
- * 3. API:拉取最新任务数据
- * 4. API:领取任务奖励
- * 
+ * 任务类型枚举 用于任务进度对比,参数传递.
  */
+class EnumTaskType extends Enum {
+
+    const CommanderLevelUpTo = 11;
+    const HeroLevelUpTo = 12;
+    const HeroGradeUpTo = 13;
+    const HeroSegmentNumberTo = 14;
+    const HeroSkillUnlock = 15;
+    const PassGateN = 21;
+    const passCarbonN = 22;
+    const PvPWinNumberTo = 31;
+    const PvPScoreTo = 32;
+    const UserPowerTo = 33;
+    const UserCollectScoreTo = 34;
+
+}
 
 /**
- * Description of TaskProc
+ * 任务参数,用于任务进度判定逻辑
+ */
+class TaskParams {
+
+    public function __construct($_taskType, $_canshu1 = null, $_canshu2 = null) {
+        $this->taskType = $_taskType;
+        $this->canshu1 = $_canshu1;
+        $this->canshu2 = $_canshu2;
+    }
+
+    /**
+     * @var int 任务类型
+     */
+    public $taskType;
+
+    /**
+     * @var number 参数1
+     */
+    public $canshu1;
+
+    /**
+     * @var number 参数2
+     */
+    public $canshu2;
+
+}
+
+/**
+ * 任务模块
  * @version
  *          1.0.0 Created at 2017-11-3. by --gwang
  * @author gwang (mail@wanggangzero.cn)
@@ -35,7 +74,9 @@ class TaskProc {
      * @param req $req
      */
     static function GetTaskInfo($req) {
-        
+        // 刷新
+        // 返回
+        return Resp::ok($req->userInfo->game->task);
     }
 
     /**
@@ -43,20 +84,76 @@ class TaskProc {
      * @param req $req
      */
     static function GetTaskReward($req) {
-        
+        list($taskId) = $req->paras;                                            # 提取参数: 任务id
+        $userTask = $req->userInfo->game->task;
+        # 根据任务类型分支不同任务容器 暂时未添加每日任务分支
+        my_Assert(StlUtil::dictHasProperty($userTask->taskListPlot, $taskId), ErrCode::task_no); #判断是否存在指定任务
+        isEditor() and $task = new TaskInfo();
+        $task = $userTask->taskListPlot->$taskId;
+        my_Assert($task->progress >= 1, ErrCode::task_progress_not_complete);   # 判断任务进度是否已完成>=1f
+        #
+        $taskCfg = GameConfig::task_getItem($taskId);                           # 任务配置数据
+        my_Assert($taskCfg != null, ErrCode::err_const_no);
+        $ok = StoreProc::AddMultiItemInStore($req, $taskCfg->reward);           # 发放任务奖励
+        my_Assert($ok == ErrCode::ok, $ok);
+        $task->rewardGeted = 1;
+        $req->userInfo->game->task = $userTask;                                 # 回存,理论上不用
+
+        return Resp::ok(array(//                                                # 返回
+                    "gold" => $req->userInfo->game->gold,
+                    "cash" => $req->userInfo->game->cash,
+                    "tili" => $req->userInfo->game->tili,
+                    "store" => $req->userInfo->game->store,
+                    "task" => $req->userInfo->game->task
+        ));
     }
 
 // 每日任务, 自动刷新
 // 
 // 
+    // <editor-fold defaultstate="collapsed" desc="辅助方法-比对判断">
 
     /**
      * 检查任务条件是否达成
+     * @param TaskParams $taskParam Description
      */
-    static function CheckTaskConditions() {
-        
+    static function CheckTaskConditions($taskParam) {
+        $bUpdate = false;
+        foreach (req()->userInfo->game->task->taskListPlot as $tid => $task) {
+            $taskCfg = GameConfig::task_getItem($tid);
+            my_Assert($taskCfg != null, ErrCode::err_const_no);                 # 获取任务配置数据   
+            if ($taskCfg->tasktype != $taskParam->taskType) {                   # 任务类型必须匹配
+                continue;
+            }
+            isEditor() and $task = new TaskInfo();
+            if (is_null($taskCfg->canshu1)) {
+                $task->progress = 1;
+                $bUpdate = true;
+                continue;
+            }
+            if ($taskCfg->canshu1 <= $taskParam->canshu1) {
+                if (is_null($taskCfg->canshu2)) {
+                    $bUpdate = true;
+                    $task->progress = 1;
+                } else {
+                    if ($taskCfg->canshu2 <= $taskParam->canshu2) {
+                        $bUpdate = true;
+                        $task->progress = 1;
+                    } else {
+                        // 更新下进度, 具体细节待修订
+                    }
+                }
+            } else {
+                // 进度更新,具体细节待修订
+            }
+        }
+        // meiri
+        if ($bUpdate) {
+            Resp::addTag("isTaskUpdated", true);                                # 附加tag信息, 任务有更新
+        }
     }
 
+// </editor-fold>
 // 
     // <editor-fold defaultstate="collapsed" desc="处理各种任务检测事务">
     // 
@@ -65,7 +162,8 @@ class TaskProc {
      * 例如当指挥官等级提升的时候需要检查是否有任务达成
      */
     static function OnUserLevelUp() {
-        
+        $param = new TaskParams(EnumTaskType::CommanderLevelUpTo, req()->userInfo->game->level);
+        self::CheckTaskConditions($param);
     }
 
     // 

+ 0 - 1
Gameserver/Amfphp/process/UserProc.php

@@ -296,7 +296,6 @@ class UserProc {
             self::backupUserInfo($req);                                         # 数据回写
             self::updtateUserZoneInfo($req);                                    # 1. 更新玩家分区记录
         }
-
         return $resp;
     }
 

+ 0 - 8
Gameserver/Amfphp/test.php

@@ -9,11 +9,3 @@ include __DIR__ . '/main.php';
 echoLine("phpver:" . PHP_VERSION);
 
 
-$key = "testzset";
-$key_new = "wanggang";
-//gMem()->zcopy($key, $key_new);
-
-echoLine(sprintf("%s:%s", $key, $key_new));
-//var_dump(gMem()->zrevrangebyscore($key_new, 100, 1, $withScore));
-$arr = explode(',', "4001");
-var_dump($arr);

+ 25 - 1
Gameserver/Amfphp/util/CommUtil.php

@@ -219,7 +219,7 @@ class CommUtil {
 
     /**
      * PHP stdClass Object转array
-     *
+     * 
      */
     public static function object_array($array) {
         if (is_object($array)) {
@@ -233,6 +233,22 @@ class CommUtil {
         return $array;
     }
 
+    /**
+     * 数组转对象
+     * @param type $arr
+     * @return \stdClass
+     */
+    public static function array2obj($arr) {
+        $obj = new \stdClass();
+        if (!is_null($arr)) {
+            $vars = is_array($arr) ? $arr : (array) $arr;                       # 关联数组
+            foreach ($vars as $name => $value) {
+                $obj->$name = $value;                                           # 取参数中的或者默认值
+            }
+        }
+        return $obj;
+    }
+
     /**
      * 将转义符"\"增加为"\\",方便入库
      * * */
@@ -256,3 +272,11 @@ class CommUtil {
     }
 
 }
+
+function arr2obj($arr) {
+    return CommUtil::array2obj($arr);
+}
+
+function obj2arr($obj) {
+    return CommUtil::object_array($obj);
+}