流程交互与设计

武将推荐任务设计交互

功能说明

  • 任务有大小周期之分,大周期是任务的开放时间,可以在开放时间段内开启这个任务,在大周期内按配置天数划分几个小周期;例如1月1号到31号为大周期,7天为小周期天数,就可能有5个小周期;
  • 默认玩家在开放时间段内首次登录就自动开启,所以每个玩家的开启时间点可能不同,每个小周期的时间段也不相同;例如玩家在1月4号开启的任务,那么玩家进入第一个周期为4号到10号,如果中间一直没登录,在1月30号再次登录,则玩家进入第4个小周期;
  • 每个小周期内的任务不相同,玩家走完一个小周期会自动进入下一个小周期;
  • 大周期结束,如果玩家的小周期还没走完则接着走完再关闭;例如玩家在1月30号开启了新的小周期,则这个小周期时间为1月30号到2月5号,不管该期间是否开启了新的大周期;
  • 玩家登录和每天0点是会检查在线玩家任务周期是否有变化;
  • 任务奖励为玩家手动领取,过期后不可以再领取;

数据库redis内容

  • 键值:hash:userrecommend区号
  • key: 玩家账号
  • value: {“periodId”:小周期,”recommendId”:大周期,”startTime”:大周期开启时间, “takeTask”: [领取了奖励的任务id集合]}

双端交互

任务数据请求与回复

ABROAD_CHR_RECOMMEND_INFO_REQ = 48416,         // 请求武将推荐信息
ABROAD_CHR_RECOMMEND_INFO_REP = 48417,         // 请求武将推荐信息的回复

// 武将推荐任务信息请求
struct ClientChrRecommendInfoReq : public PacketBase
{
    ClientChrRecommendInfoReq() : PacketBase(ABROAD_CHR_RECOMMEND_INFO_REQ, sizeof(ClientChrRecommendInfoReq))
    {
        PRO_ZERO_MEMORY(this, sizeof(ClientChrRecommendInfoReq));
    }
};

struct ClientChrRecommendInfoRep : public PacketBase
{
    static const unsigned int sc_max_task_count = 100;

    enum emResult
    {
        ok = 0,   
        fail,   
        close,  // 功能关闭
        over,   // 周期结束
    };

    enum emTaskState
    {
        not_finish = 0,
        can_take,
        had_take,
    };

    struct TaskState
    {
        unsigned int id;
        unsigned int state;
    };

    unsigned int    result;
    unsigned int    recommendId;   // 0 表示没有活动
    unsigned int    periodId;      // 0 表示没有下一个周期了,结束
    unsigned int    leftTime;      // 当前小周期剩余时间
    unsigned int    process;       // 累计任务的当前进度
    unsigned int    totalCount;    // 累计任务的总进度
    unsigned int    count;  // task个数
    TaskState        task[sc_max_task_count];

    ClientChrRecommendInfoRep() : PacketBase(ABROAD_CHR_RECOMMEND_INFO_REP, sizeof(ClientChrRecommendInfoRep))
    {
        PRO_ZERO_MEMORY(this, sizeof(ClientChrRecommendInfoRep));
    }

    friend bostream& operator<<(bostream& bos, const ClientChrRecommendInfoRep& t)
    {
        bos << t.result;
        bos << t.recommendId;
        bos << t.periodId;
        bos << t.leftTime;
        bos << t.process;
        bos << t.totalCount;
        bos << t.count;
        for (unsigned char i = 0; i < t.count && i < sc_max_task_count; ++i)
        {
            bos << t.task[i].id;
            bos << t.task[i].state;
        }
        return bos;
    }
};

领取奖励请求与回复

ABROAD_CHR_RECOMMEND_AWARD_TAKE_REQ = 48418,   // 武将推荐任务奖励领取
ABROAD_CHR_RECOMMEND_AWARD_TAKE_REP = 48419,   // 武将推荐任务奖励领取的回复

// 武将推荐任务奖励领取请求
struct ClientChrRecommendAwardReq : public PacketBase
{
    unsigned int    taskId;         // 任务id
    unsigned int    recommendId;    // 当前大周期
    unsigned int    periodId;       // 当前小周期
    ClientChrRecommendAwardReq() : PacketBase(ABROAD_CHR_RECOMMEND_AWARD_TAKE_REQ, sizeof(ClientChrRecommendAwardReq))
    {
        PRO_ZERO_MEMORY(this, sizeof(ClientChrRecommendAwardReq));
    }
};

struct ClientChrRecommendAwardRep : public PacketBase
{
    enum emResult
    {
        ok = 0,
        fail,
        close,  // 功能关闭
        over,   // 周期结束
        param_error,  // 参数检验失败
        take_already,  // 已领取
        no_task,  // 没有该任务
        not_finish,  // 未完成
        add_goods_fail,  // 发奖失败
    };
    unsigned int    result;
    unsigned int    taskId;
    unsigned int    recommendId;
    unsigned int    periodId;
    ClientChrRecommendAwardRep() : PacketBase(ABROAD_CHR_RECOMMEND_AWARD_TAKE_REP, sizeof(ClientChrRecommendAwardRep))
    {
        PRO_ZERO_MEMORY(this, sizeof(ClientChrRecommendAwardRep));
    }
};

任务数据变化通知

ABROAD_CHR_RECOMMEND_UPDATE_NTF = 48420,       // 武将推荐任务数据变化通知

// 武将推荐任务数据变化通知
struct ClientChrRecommendUpdateNtf : public PacketBase
{
    static const unsigned int sc_max_task_count = 100;
    enum emType
    {
        period_change                    = 1,    // 周期变化,
        task_state_change                = 2,    // 任务状态变化
        task_process_change                = 4,    // 累计任务进度变化
    };
    enum emTaskState
    {
        not_finish = 0,
        can_take,
        had_take,
    };

    struct TaskState
    {
        unsigned int id;
        unsigned int state;
    };
    unsigned int    ntfType; // emType组合值, period_change时为最新数据,客户端需要刷新
    unsigned int    recommendId;        
    unsigned int    periodId;
    unsigned int    leftTime;      
    unsigned int    process; // task_process_change时关注该值
    unsigned int    totalCount;
    unsigned int    count; // task_state_change时关注该值
    TaskState        task[sc_max_task_count]; // task_state_change时关注该值
    ClientChrRecommendUpdateNtf() : PacketBase(ABROAD_CHR_RECOMMEND_UPDATE_NTF, sizeof(ClientChrRecommendUpdateNtf))
    {
        PRO_ZERO_MEMORY(this, sizeof(ClientChrRecommendUpdateNtf));
    }

    friend bostream& operator<<(bostream& bos, const ClientChrRecommendUpdateNtf& t)
    {
        bos << t.ntfType;
        bos << t.recommendId;
        bos << t.periodId;
        bos << t.leftTime;
        bos << t.process;
        bos << t.totalCount;
        bos << t.count;
        for (unsigned char i = 0; i < t.count && i < sc_max_task_count; ++i)
        {
            bos << t.task[i].id;
            bos << t.task[i].state;
        }
        return bos;
    }
};