活动:战令
This commit is contained in:
238
shared/domain/activityField/taskPassField.ts
Normal file
238
shared/domain/activityField/taskPassField.ts
Normal file
@@ -0,0 +1,238 @@
|
||||
|
||||
import { pick } from 'underscore';
|
||||
import { TASK_PASS_TYPE } from '../../consts';
|
||||
import { ActivityModelType } from '../../db/Activity';
|
||||
import { ActivityTaskPassModelType } from '../../db/ActivityTaskPass';
|
||||
import { ActivityBase } from './activityField';
|
||||
|
||||
interface TaskPassProgressInDb { // 进度
|
||||
lv: number; // 等级
|
||||
point: number; // 到达下一级所需的积分
|
||||
}
|
||||
|
||||
interface TaskPassRewardItemInDb {
|
||||
lv: number;
|
||||
reward: string;
|
||||
needShow: boolean;
|
||||
}
|
||||
|
||||
interface TaskPassRewardsInDb {
|
||||
pageIndex: number;
|
||||
type: number; // 1-标准版 2-豪华版
|
||||
price: number; // 花多少钱
|
||||
productID: string; // 商品id,如果是标准版这里填&
|
||||
items: TaskPassRewardItemInDb[];
|
||||
}
|
||||
|
||||
interface TaskPassSpdUpInDb {
|
||||
cost: string;
|
||||
point: number;
|
||||
}
|
||||
|
||||
interface TaskPassDataInDb {
|
||||
progress: TaskPassProgressInDb[];
|
||||
rewards: TaskPassRewardsInDb[];
|
||||
spdUp: TaskPassSpdUpInDb;
|
||||
}
|
||||
|
||||
export class TaskPassProgress {
|
||||
lv: number;
|
||||
point: number;
|
||||
|
||||
constructor(data: TaskPassProgressInDb) {
|
||||
this.lv = data.lv;
|
||||
this.point = data.point;
|
||||
}
|
||||
}
|
||||
|
||||
export class TaskPassRewardItem {
|
||||
lv: number;
|
||||
reward: string;
|
||||
needShow: boolean;
|
||||
|
||||
hasReceived: boolean = false;
|
||||
|
||||
constructor(item: TaskPassRewardItemInDb) {
|
||||
this.lv = item.lv;
|
||||
this.reward = item.reward;
|
||||
this.needShow = item.needShow;
|
||||
}
|
||||
|
||||
setHasReceived(hasReceived: boolean) {
|
||||
this.hasReceived = hasReceived;
|
||||
}
|
||||
}
|
||||
|
||||
export class TaskPassReward {
|
||||
pageIndex: number; // 第几页
|
||||
type: number; // 1-标准版 2-豪华版
|
||||
price: number; // 花多少钱
|
||||
productID: string; // 商品id,如果是标准版这里填&
|
||||
items: TaskPassRewardItem[] = [];
|
||||
|
||||
hasBuy: boolean = false; // 是否购买了
|
||||
map: Map<number, number> = new Map(); // lv => index
|
||||
|
||||
constructor(reward: TaskPassRewardsInDb) {
|
||||
this.pageIndex = reward.pageIndex;
|
||||
this.type = reward.type;
|
||||
this.price = reward.price;
|
||||
this.productID = reward.productID;
|
||||
for(let item of reward.items) {
|
||||
let obj = new TaskPassRewardItem(item);
|
||||
this.items.push(obj);
|
||||
this.map.set(obj.lv, this.items.length - 1);
|
||||
}
|
||||
}
|
||||
|
||||
findItemByLv(lv: number) {
|
||||
let index = this.map.get(lv);
|
||||
return this.items[index];
|
||||
}
|
||||
|
||||
setPlayerRecord(record: ActivityTaskPassModelType) {
|
||||
if(record.productIDs && record.productIDs.indexOf(this.productID) != -1) {
|
||||
this.hasBuy = true;
|
||||
}
|
||||
if(record.receivedReward) {
|
||||
for(let { pageIndex, lv } of record.receivedReward) {
|
||||
if(pageIndex == this.pageIndex) {
|
||||
let item = this.findItemByLv(lv);
|
||||
item.setHasReceived(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
getShowResult() {
|
||||
return pick(this, ['pageIndex', 'type', 'price', 'productID', 'items', 'hasBuy']);
|
||||
}
|
||||
|
||||
canReceiveItems() {
|
||||
if(this.type == TASK_PASS_TYPE.VIP) {
|
||||
if(!this.hasBuy) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
export class TaskPassSpdUp {
|
||||
cost: string;
|
||||
point: number;
|
||||
|
||||
spdUpCnt: number = 0; // 加速过的次数
|
||||
|
||||
constructor(obj: TaskPassSpdUpInDb) {
|
||||
this.cost = obj.cost;
|
||||
this.point = obj.point;
|
||||
}
|
||||
|
||||
setSpdUpCnt(cnt: number) {
|
||||
this.spdUpCnt = cnt;
|
||||
}
|
||||
|
||||
addSpdUpCnt(cnt: number) {
|
||||
this.spdUpCnt += cnt;
|
||||
}
|
||||
}
|
||||
|
||||
// 战令活动数据
|
||||
export class TaskPassData extends ActivityBase {
|
||||
progress: TaskPassProgress[] = [];
|
||||
rewards: TaskPassReward[] = [];
|
||||
spdUp: TaskPassSpdUp;
|
||||
|
||||
lv: number = 1;
|
||||
totalPoint: number = 0;
|
||||
map: Map<number, number> = new Map(); // pageIndex => rewards的index
|
||||
|
||||
constructor(activityData: ActivityModelType, createTime: number) {
|
||||
super(activityData, createTime)
|
||||
this.initData(activityData.data)
|
||||
}
|
||||
|
||||
public initData(data: string) {
|
||||
let dataObj: TaskPassDataInDb = JSON.parse(data);
|
||||
for(let obj of dataObj.progress) {
|
||||
this.progress.push(new TaskPassProgress(obj));
|
||||
}
|
||||
for(let obj of dataObj.rewards) {
|
||||
let reward = new TaskPassReward(obj);
|
||||
this.rewards.push(reward);
|
||||
this.map.set(reward.pageIndex, this.rewards.length - 1);
|
||||
}
|
||||
this.spdUp = new TaskPassSpdUp(dataObj.spdUp);
|
||||
}
|
||||
|
||||
|
||||
public setPlayerRecord(record: ActivityTaskPassModelType) {
|
||||
if(!record) return null;
|
||||
this.setLvByPoint(record.totalPoint);
|
||||
for(let reward of this.rewards) {
|
||||
reward.setPlayerRecord(record);
|
||||
}
|
||||
this.spdUp.setSpdUpCnt(record.spdUpCnt);
|
||||
}
|
||||
|
||||
public getShowResult() {
|
||||
return {
|
||||
...this.getBaseKeys(),
|
||||
progress: this.progress,
|
||||
rewards: this.rewards.map(reward => reward.getShowResult()),
|
||||
spdUp: this.spdUp,
|
||||
lv: this.lv,
|
||||
totalPoint: this.totalPoint,
|
||||
}
|
||||
}
|
||||
|
||||
private setLvByPoint(totalPoint: number) {
|
||||
this.totalPoint = totalPoint;
|
||||
for(let { lv, point } of this.progress) {
|
||||
this.lv = lv;
|
||||
totalPoint -= point;
|
||||
if(totalPoint < 0) break;
|
||||
}
|
||||
}
|
||||
|
||||
public findRewardByPageIndex(pageIndex: number) {
|
||||
let index = this.map.get(pageIndex);
|
||||
return this.rewards[index];
|
||||
}
|
||||
|
||||
// 领取道具
|
||||
public receiveItems(pageIndex: number, lv: number) {
|
||||
let reward = this.findRewardByPageIndex(pageIndex);
|
||||
if(!reward) return false;
|
||||
|
||||
if(!reward.canReceiveItems()) return false;
|
||||
|
||||
let items: TaskPassRewardItem[] = [];
|
||||
if(lv == 0) {
|
||||
for(let item of reward.items) {
|
||||
if(item.lv <= this.lv && !item.hasReceived) {
|
||||
item.setHasReceived(true);
|
||||
items.push(item);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
let item = reward.findItemByLv(lv);
|
||||
if(!item.hasReceived) {
|
||||
item.setHasReceived(true);
|
||||
items.push(item);
|
||||
}
|
||||
}
|
||||
if(items.length <= 0) return false;
|
||||
return items
|
||||
}
|
||||
|
||||
// 加速
|
||||
public addPoint(point: number, count: number) {
|
||||
this.spdUp.addSpdUpCnt(count)
|
||||
this.setLvByPoint(this.totalPoint + point);
|
||||
return {
|
||||
lv: this.lv,
|
||||
totalPoint: this.totalPoint,
|
||||
spdUpCnt: this.spdUp.spdUpCnt
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user