UNPKG

gamecloud

Version:
501 lines (453 loc) 16.7 kB
let facade = require('../../../../Facade') let {EntityType, ActionExecuteType, UserStatus, NotifyType, ActivityType, ResType, ReturnCode} = facade.const let baseMgr = facade.Assistant /** * 奴隶管理器 * Added by liub 2017.7.25 */ class slave extends baseMgr { constructor(parent){ super(parent, 'friend'); this.v = { master:[], //主人 slave:[], //奴隶 }; } /** * 状态检测,自动释放到期奴隶 */ CheckStatus(){ if(!this.v.master){ this.v.master = []; } if(!this.v.slave){ this.v.slave = []; } let $now = facade.util.now(); for(let idx in this.v.master){ if(this.v.master[idx].time < $now) { //被奴役时间到期,你自动获得了解放 let $msg = {type:NotifyType.slaveRelease, info:{src:this.v.master[idx].openid, dst:this.parent.openid, time:this.v.master[idx].time}}; this.parent.socialNotify($msg); this.parent.socialNotify($msg, $msg.info.src); } } for(let idx in this.v.slave){ if(this.v.slave[idx].time < $now) { //奴役时间到期,你主动释放奴隶 - 向对方发送事件 let $msg = {type:NotifyType.slaveRelease, info:{src:this.parent.openid, dst:this.v.slave[idx].openid, time:this.v.slave[idx].time}}; this.parent.socialNotify($msg); this.parent.socialNotify($msg, $msg.info.dst); } } if(this.v.master.length == 0){ this.parent.baseMgr.info.UnsetStatus(UserStatus.slave); //修改奴隶状态位 } else{ this.parent.baseMgr.info.SetStatus(UserStatus.slave); //修改奴隶状态位 } if(this.v.slave.length == 0){ //所有奴隶都被释放 this.parent.baseMgr.info.UnsetStatus(UserStatus.master); //修改奴隶主状态位 } else{ this.parent.baseMgr.info.SetStatus(UserStatus.master); //修改奴隶主状态位 } } /** * 释放全部奴隶,在自己被奴役的时候调用 */ releaseAll(){ for(let idx in this.v.slave){ //奴役时间到期,你主动释放奴隶 - 向对方发送事件 let $msg = {type:NotifyType.slaveRelease, info:{src:this.parent.openid, dst:this.v.slave[idx].openid, time:this.v.slave[idx].time}}; this.parent.socialNotify($msg); this.parent.socialNotify($msg, $msg.info.dst); } } /** * 鞭挞 * @param {*} openid */ lash(openid){ this.CheckStatus(); if(!this.parent.getTxFriendMgr().getFriend(openid)){ //没有发现指定好友 return [ReturnCode.socialNoEnemyToAttack, 0]; } else{ let slv = this.getSlave(openid); if(!slv){//当前对象未被抓捕 return [ReturnCode.socialSimUserNotExist, 0]; } else{ //检测并扣除所需道具 // "401":{ // "id":401, // "desc":"鞭打奴隶消耗的道具;无法直接使用", // }, let ret = this.parent.baseMgr.item.useItem(401, 1); if(ret.code == ReturnCode.Success){ let fri = this.parent.getTxFriendMgr().getFriend(openid); // 奴隶收到鞭挞推送消息 if(!!fri) { let desc = facade.config.slaveMsg["lash"].desc; this.parent.core.service.txApi.send_gamebar_msg(this.parent,openid,3,desc,"V1_AND_QZ_4.9.3_148_RDM_T"); } } return [ret.code, slv.time]; } } } /** * 赎身,扣除相应的钻石 * @param {string} openid - 标记当前主人的标识串 */ ransom(openid){ this.CheckStatus(); if(!this.parent.getTxFriendMgr().getFriend(openid)){ //没有发现指定好友 return ReturnCode.socialNoEnemyToAttack; } else{ let master = this.getMaster(openid); if(!master){ return ReturnCode.socialSimUserNotExist; } else{ //检测并扣除所需道具 let $cost = Math.ceil((master.time - facade.util.now()) / 3600.0); if(this.parent.baseMgr.item.GetRes(ResType.Diamond) >= $cost){ this.parent.getBonus({type:ResType.Diamond, num:-$cost}); let fri = this.parent.getTxFriendMgr().getFriend(openid); // 奴隶主收到赎身推送消息 if(!!fri) { let desc = facade.config.slaveMsg["ransom"].desc; this.parent.core.service.txApi.send_gamebar_msg(this.parent,openid,3,desc,"V1_AND_QZ_4.9.3_148_RDM_T"); } return ReturnCode.Success; } else{ return ReturnCode.DiamondNotEnough; } } } } food(openid){ this.CheckStatus(); if(!this.parent.getTxFriendMgr().getFriend(openid)){ //没有发现指定好友 return ReturnCode.socialNoEnemyToAttack; } else if(!this.findSlave(openid)){ //当前对象未被抓捕 return ReturnCode.socialSimUserNotExist; } else{ //检测并扣除所需道具 // "402":{ // "id":402, // "desc":"给奴隶加餐消耗的道具;无法直接使用", // }, let ret = this.parent.baseMgr.item.useItem(402, 1); if(ret.code == ReturnCode.Success){ let fri = this.parent.getTxFriendMgr().getFriend(openid); // 奴隶收到喂食推送消息 if(!!fri) { let desc = facade.config.slaveMsg["food"].desc; desc = desc.replace("&slave",decodeURIComponent(fri.name)); this.parent.core.service.txApi.send_gamebar_msg(this.parent,openid,3,desc,"V1_AND_QZ_4.9.3_148_RDM_T"); } } return ret.code; } } avenge(openid){ this.CheckStatus(); if(!this.parent.getTxFriendMgr().getFriend(openid)){ //没有发现指定好友 return ReturnCode.socialNoEnemyToAttack; } else if(!this.findMaster(openid)){ return ReturnCode.socialSimUserNotExist; } else{ //检测并扣除所需道具 // "403":{ // "id":403, // "desc":"报复奴隶主消耗的道具;无法直接使用", // }, // let ret = this.parent.baseMgr.item.useItem(403, 1); let fri = this.parent.getTxFriendMgr().getFriend(openid); // 奴隶主收到报复推送消息 if(!!fri) { let desc = facade.config.slaveMsg["avange"].desc; this.parent.core.service.txApi.send_gamebar_msg(this.parent,openid,3,desc,"V1_AND_QZ_4.9.3_148_RDM_T"); } return ReturnCode.Success; } } flattery(openid){ this.CheckStatus(); if(!this.parent.getTxFriendMgr().getFriend(openid)){ //没有发现指定好友 return [ReturnCode.socialNoEnemyToAttack, 0]; } else{ let mst = this.getMaster(openid); if(!mst){ return [ReturnCode.socialSimUserNotExist, 0]; } //检测并扣除所需道具 // "403":{ // "id":403, // "desc":"报复奴隶主消耗的道具;无法直接使用", // }, let ret = this.parent.baseMgr.item.useItem(403, 1); if(ret.code == ReturnCode.Success){ if(this.parent.getActionMgr().GetExecuteNum(ActionExecuteType.slaveFlattery)<=3){ mst.time -= this.parent.core.fileMap.DataConst.slave.catchTime * 0.05; } this.CheckStatus(); let fri = this.parent.getTxFriendMgr().getFriend(openid); // 奴隶主收到谄媚推送消息 if(!!fri) { let desc = this.parent.core.slaveMsg["flattery"].desc; this.parent.core.service.txApi.send_gamebar_msg(this.parent,openid,3,desc,"V1_AND_QZ_4.9.3_148_RDM_T"); } } return [ret.code, mst.time - facade.util.now()]; } } /** * 判断是否可逃脱 * @param {*} openid */ canEscape(openid){ this.CheckStatus(); if(!this.findMaster(openid)){ //没有发现指定好友 return ReturnCode.socialNoEnemyToAttack; } else{ return ReturnCode.Success; } } /** * 判断是否能够抓捕指定好友为奴隶 * @param {*} openid */ canCatch(openid){ this.CheckStatus(); if(this.v.master.length>0){ //自己被他人奴役 return ReturnCode.socialIsSlave; } else if(!this.parent.core.options.debug && this.v.slave.length >= this.MaxSlave){ //奴隶数量达到上限 return ReturnCode.socialMaxSlave; } else if(this.findSlave(openid)){ //当前对象已被抓捕 return ReturnCode.socialIsEnemy; } else{ return ReturnCode.Success; } } findSlave(openid) { let $find = false; for(let idx in this.v.slave){ if(this.v.slave[idx].openid == openid){ $find = true; break; } } return $find; } findMaster(openid) { let $find = false; for(let idx in this.v.master){ if(this.v.master[idx].openid == openid){ $find = true; break; } } return $find; } getMaster(openid) { for(let idx in this.v.master){ if(this.v.master[idx].openid == openid){ return this.v.master[idx]; } } return null; } getSlave(openid) { for(let idx in this.v.slave){ if(this.v.slave[idx].openid == openid){ return this.v.slave[idx]; } } return null; } /** * 移除指定的奴隶主 * @param {*} openid */ removeMaster(openid){ for(let idx in this.v.master){ if(this.v.master[idx].openid == openid) { return this.removeMasterByIdx(idx); } } return [ReturnCode.Success, 0]; } /** * 移除指定的奴隶 * @param {*} openid */ removeSlave(openid){ for(let idx in this.v.slave){ if(this.v.slave[idx].openid == openid) { return this.removeSlaveByIdx(idx); } } return [ReturnCode.Success, 0]; } removeMasterByIdx(idx){ if(!this.v.master[idx]){ return [ReturnCode.Success, 0]; } let ret = [ReturnCode.Success, this.v.master[idx].time]; this.v.master.splice(idx, 1); this.dirty = true; if(this.v.master.length == 0){ this.parent.baseMgr.info.UnsetStatus(UserStatus.slave); //修改奴隶状态位 } return ret; } calcSlaveTime(t){ let $now = facade.util.now(); return Math.ceil(Math.max(0, $now - (t - this.parent.core.fileMap.DataConst.slave.catchTime)) / 3600.0); } fullSlaveTime(t){ return t >= this.parent.core.fileMap.DataConst.slave.catchTime; } removeSlaveByIdx(idx){ if(!this.v.slave[idx]){ return [ReturnCode.Success, 0]; } let ret = [ReturnCode.Success, this.v.slave[idx].time]; //写报告, 附加奖励字段 let msg = { type:NotifyType.slaveRelease, info:{ src: this.parent.openid, dst: this.v.slave[idx].openid, time: this.v.slave[idx].time, code: ReturnCode.Success, } }; let time = this.calcSlaveTime(msg.info.time); //释放分两种情况(1、期满自动释放,获得两个奖励——即全额奖励;2、玩家提前释放——只获得时常奖励:金币 if(time > 0){ //根据msg.info.time和当前时间的差额计算奖励 msg.info.bonus = [{type:ResType.Gold, num:50*time}]; if(this.fullSlaveTime(time)){ msg.info.bonus.push({type:ResType.Item, id:22, num:20}); } } this.parent.core.GetMapping(EntityType.Mail).Create(this.parent, msg, "system", this.parent.openid); //删除奴隶 this.v.slave.splice(idx, 1); this.dirty = true; if(this.v.slave.length == 0){ //所有奴隶都被释放 this.parent.baseMgr.info.UnsetStatus(UserStatus.master); //修改奴隶主状态位 } return ret; } /** * 添加一个主人 * @param {*} openid */ addMaster(openid){ this.CheckStatus(); //修改奴隶状态位 this.parent.baseMgr.info.SetStatus(UserStatus.slave); if(this.v.master.length == 0){ //因为自己被抓捕,所以主动释放所有奴隶 this.releaseAll(); //添加新的主人条目 this.v.master.push({openid:openid, time: this.parent.core.fileMap.DataConst.slave.catchTime + facade.util.now()}); this.dirty = true; return ReturnCode.Success; } else { return ReturnCode.socialCatched; } } /** * 添加一个奴隶 */ addSlave(openid){ this.CheckStatus(); let $find = false; for(let idx in this.v.slave){ if(this.v.slave[idx].openid == openid){ $find = true; break; } } if(this.v.slave.length >= this.MaxSlave) { return ReturnCode.socialMaxSlave; } else if(this.findSlave(openid)){ return ReturnCode.socialCatchedBySelf; } else { this.v.slave.push({openid:openid, time: this.parent.core.fileMap.DataConst.slave.catchTime + facade.util.now()}); this.dirty = true; this.parent.baseMgr.info.SetStatus(UserStatus.master); //修改奴隶主状态位 return ReturnCode.Success; } let m = { "type":3105, "info":{ "src":"777.492", "dst":"777.493", "bonus":[ {"type":"M","num":-1000}, {"type":"I","id":22,"num":20} ] } } } /** * 最大可抓捕数量 */ get MaxSlave(){ if(this.parent.hisGateNo < 5){ return 0; } else if(this.parent.hisGateNo >= 5 && this.parent.hisGateNo < 20){ return 2; } else if(this.parent.hisGateNo >= 20 && this.parent.hisGateNo < 35){ return 4; } else if(this.parent.hisGateNo >= 35 && this.parent.hisGateNo < 50){ return 10; } else{ return 20; } } /** * 获取列表 */ getList(){ this.CheckStatus(); let ret = { master:[], //主人 slave:[], //奴隶 }; this.v.slave.map(item=>{ ret.slave.push({openid: item.openid, time: item.time - facade.util.now()}); }); this.v.master.map(item=>{ ret.master.push({openid: item.openid, time: item.time - facade.util.now()}); }); return ret; } } exports = module.exports = slave;