def addGunEffectPower(self, gunId, power, gunX): """ 使用狂暴弹增加威力 """ if gunId not in self.useGunEffect: return power, False data = self.useGunEffect[gunId] if data["state"] != State.USING: return power, False if float('%.2f' % time.time( )) - data["start_time"] + data["progress"][0] >= data["progress"][1]: return power, False if gunId not in self.gunEffectData: return power, False data = self.gunEffectData[gunId] if not data: return power, False conf = config.getGunConf(gunId, self.clientId, 1, self.mode) if data[0] >= int(power * gunX * conf["power_rate"] / 100.0): val = int(power * gunX * (conf["power_rate"] / 100.0 - 1)) self.updateFireOrEnergy(self, gunId, 0, val, add=False) # 消耗能量 newPower = power * conf["power_rate"] / 100.0 # 最大威力 else: self.updateFireOrEnergy(self, gunId, 0, absValue=1) newPower = power * (float(data[0]) / (power * gunX * conf["power_rate"] / 100.0) + 1) if ftlog.is_debug(): ftlog.debug("addGunEffectPower", newPower) return newPower, True
def changeGunSkin(userId, gunId, skinId, mode): """ 切换火炮皮肤 """ if ftlog.is_debug(): ftlog.debug("changeGunSkin, userId =", userId, "gunId =", gunId, "skinId =", skinId, "mode =", mode) mo = MsgPack() mo.setCmd("gun_change_skin") mo.setResult("gameId", FISH_GAMEID) mo.setResult("userId", userId) mo.setResult("gunId", gunId) mo.setResult("skinId", skinId) mo.setResult("gameMode", mode) clientId = util.getClientId(userId) skins = config.getGunConf(gunId, clientId, mode=mode).get("skins") ownGunSkinSkinsKey = GameData.ownGunSkinSkins ownGunSkinSkins = gamedata.getGameAttrJson(userId, FISH_GAMEID, ownGunSkinSkinsKey, []) if skinId not in ownGunSkinSkins and skinId != skins[0]: mo.setResult("code", 1) # 未获得 router.sendToUser(mo, userId) return False if skinId not in skins: mo.setResult("code", 2) # 皮肤不在该火炮下属的皮肤列表中 router.sendToUser(mo, userId) return False equipGunSkin(userId, gunId, skinId, mode) mo.setResult("code", 0) router.sendToUser(mo, userId) return True
def updateFireOrEnergy(self, gunId, idx=0, val=0, absValue=0, add=True): """ 更新开火次数 :param gunId: 皮肤炮 :param idx: 更新位置 :param val: 更新的值 :param abs_value: 赋值 0不赋值 1赋值 :param add: 增加|减少 """ if gunId not in self.gunEffectData: listVal = self._getData(gunId) else: listVal = self.gunEffectData[gunId] if not listVal and ftlog.is_debug(): ftlog.debug("updateFireOrEnergy", gunId, idx, val, absValue, add) return 0 conf = config.getGunConf(gunId, self.clientId, 1, self.mode) if add: listVal[idx] += val else: listVal[idx] -= val if idx == 1: listVal[idx] = min(listVal[idx], conf["fire_count"]) if absValue: listVal[idx] = val if ftlog.is_debug(): ftlog.debug("updateFireOrEnergy", gunId, idx, val, absValue, listVal) self.gunEffectData[gunId] = listVal return listVal[idx]
def getAllGuns(userId, mode): """ 获得所有皮肤炮数据 """ clientId = util.getClientId(userId) assert isinstance(userId, int) and userId > 0 _key = _buildUserGunKey(userId, mode) value = daobase.executeUserCmd(userId, "HGETALL", _key) if value: gunInfos = {} savaData = [] for index in xrange(0, len(value), 2): gunId = value[index] if gunId in config.getAllGunIds(clientId, mode): gunData = strutil.loads(value[index + 1], False, True) if len(gunData) <= 2: gunConfig = config.getGunConf(gunId, clientId, gunData[INDEX_LEVEL], mode) gunData.append(gunConfig["skins"][0]) savaData.append(gunId) savaData.append(strutil.dumps(gunData)) gunInfos[gunId] = gunData if savaData: daobase.executeUserCmd(userId, "HMSET", _key, *savaData) return gunInfos return {}
def firstFireEffect(self, gunId): """开火第一颗子弹触发狂暴效果""" if gunId in self.useGunEffect and self.useGunEffect[gunId][ "state"] == State.PREPARE: conf = config.getGunConf(gunId, self.clientId, 1, self.mode) self.useGunEffect[gunId] = { "state": State.USING, "start_time": float('%.2f' % time.time()), "progress": [0, conf["duration"]] } self.updateFireOrEnergy(gunId, idx=1, absValue=1) self._setData(gunId) data = self.gunEffectData[gunId] self.setUseEffectTimer(conf["duration"]) # 启动结束的定时器 if data: dataTmp = deepcopy(data) dataTmp.pop(0) dataTmp.append(conf["fire_count"]) data = dataTmp msg = MsgPack() msg.setCmd("use_gun_effect") msg.setResult("userId", self.userId) msg.setResult("gunId", gunId) msg.setResult("code", 0) msg.setResult("progressData", data) msg.setResult("data", self.useGunEffect[gunId]) GameMsg.sendMsg(msg, self.table.getBroadcastUids()) return
def updateGun(userId, gunId, mode): """ 更新新增炮数据 """ clientId = util.getClientId(userId) assert int(gunId) in config.getAllGunIds(clientId, mode) gunConf = config.getGunConf(gunId, clientId, mode=mode) gunInfo = [1, 0, gunConf["skins"][0]] # 皮肤炮熟练等级 | 经验 | 默认皮肤 daobase.executeUserCmd(userId, "HSETNX", _buildUserGunKey(userId, mode), str(gunId), json.dumps(gunInfo))
def addGunEffectEnergy(self, gunId, coin): """ 添加能量 """ if gunId in self.useGunEffect and self.useGunEffect[gunId][ "state"] in [State.PREPARE, State.USING, State.PAUSE]: return conf = config.getGunConf(gunId, self.clientId, 1, self.mode) add_energy = coin * conf["percent"] / 100 self.updateFireOrEnergy(gunId, 0, add_energy) return coin - add_energy
def isUnlock(userId, gunId, gunConf, mode): """ 皮肤炮是否已解锁 """ # 先判断当前模式是否解锁 _isUnlocked = _isUnlockGun(userId, gunConf, mode) # 如果当前模式未达到解锁条件则检测另一个模式是否已达到解锁条件.(经典/千炮) if not _isUnlocked: clientId = util.getClientId(userId) _mode = MULTIPLE_MODE if mode == CLASSIC_MODE else CLASSIC_MODE _gunConf = config.getGunConf(gunId, clientId, mode=_mode) _isUnlocked = _isUnlockGun(userId, _gunConf, _mode) return _isUnlocked
def _getData(self, gunId): """ 获取狂暴皮肤炮的效果 """ conf = config.getGunConf(gunId, self.clientId, 1, self.mode) if "fire_count" not in conf: return [] if conf["fire_count"] > 0 and gunId not in self.gunEffectData: val = daobase.executeUserCmd(self.userId, "HGET", self.rdKey, gunId) val = json.loads(val) if val else deepcopy(self.defaultVal) self.gunEffectData[gunId] = val self._setData(gunId) return self.gunEffectData.get(gunId, [])
def initGun(userId): """ 初始化炮数据 """ clientId = util.getClientId(userId) for mode in config.GAME_MODES: for gunId in config.getAllGunIds(clientId, mode): updateGun(userId, gunId, mode) gunData = getGunData(userId, gunId, mode) skinId = gunData[INDEX_SKINID] skins = config.getGunConf(gunId, clientId, mode=mode).get("skins") # 配置炮的皮肤 if skinId not in skins: gunData[INDEX_SKINID] = skins[0] setGunData(userId, gunId, gunData, mode)
def setGunData(userId, gunId, gunInfo, mode): """ 存储单个炮数据 """ clientId = util.getClientId(userId) assert int(gunId) in config.getAllGunIds(clientId, mode) assert isinstance(gunInfo, list) and len(gunInfo) == 3 skins = config.getGunConf(gunId, clientId, mode=mode).get("skins") if gunInfo[INDEX_SKINID] not in skins: ftlog.error("setGunData, not find skin, userId =", userId, "gunId =", gunId, "gunInfo =", gunInfo, "skins =", skins, "mode =", mode, "clientId =", clientId) gunInfo[INDEX_SKINID] = skins[0] daobase.executeUserCmd(userId, "HSET", _buildUserGunKey(userId, mode), str(gunId), json.dumps(gunInfo))
def addGunEffectFire(self, gunId, count): """ 增加开火次数 :param gunId: 武器ID :param count: 次数 """ if gunId in self.useGunEffect and self.useGunEffect[gunId][ "state"] in [State.USING, State.PAUSE]: return count = self.updateFireOrEnergy(gunId, 1, count) conf = config.getGunConf(gunId, self.clientId, 1, self.mode) if count >= conf["fire_count"]: # 达到了临界值把内存的数据保存到数据库 self.sendProgress(gunId) self._setData(gunId) return count
def getGunData(userId, gunId, mode): """ 获得单个皮肤炮数据 """ clientId = util.getClientId(userId) assert int(gunId) in config.getAllGunIds(clientId, mode) gunConf = config.getGunConf(gunId, clientId, mode=mode) value = daobase.executeUserCmd(userId, "HGET", _buildUserGunKey(userId, mode), str(gunId)) if value: value = strutil.loads(value, False, True) if len(value) <= 2: value.append(gunConf["skins"][0]) # 默认皮肤 return value # 获取初始化的值 return [1, 0, gunConf["skins"][0]]
def getGunNonCurveOdds(self, gunConf): """ 火炮-非曲线概率系数 """ gunConf = gunConf or {} gunId = gunConf.get("gunId", 0) gunLevel = gunConf.get("gunLevel", 1) aloofOdds = config.getGunConf(gunId, self.player.clientId, gunLevel, self.table.gameMode).get( "aloofOdds", []) probb = 0 randomNum = random.randint(1, 10000) for oddsMap in aloofOdds: probb += oddsMap["probb"] * 10000 if randomNum <= probb: return oddsMap["odds"]
def composeGunSkin(userId, gunId, skinId, mode): """ 合成火炮皮肤 """ clientId = util.getClientId(userId) if ftlog.is_debug(): ftlog.debug("composeGunSkin, userId =", userId, "gunId =", gunId, "skinId =", skinId, "clientId =", clientId, "mode =", mode) skinConf = config.getGunSkinConf(skinId, clientId, mode) mo = MsgPack() mo.setCmd("gun_compose_skin") mo.setResult("gameId", FISH_GAMEID) mo.setResult("userId", userId) mo.setResult("gunId", gunId) mo.setResult("skinId", skinId) mo.setResult("gameMode", mode) skins = config.getGunConf(gunId, clientId, mode=mode).get("skins") if skinId not in skins: mo.setResult("code", 99) # 数据不对 router.sendToUser(mo, userId) return False if not skinConf: mo.setResult("code", 99) # 数据不对 router.sendToUser(mo, userId) return False surplusCount = util.balanceItem(userId, skinConf["kindId"]) ownGunSkinSkinsKey = GameData.ownGunSkinSkins ownGunSkinSkins = gamedata.getGameAttrJson(userId, FISH_GAMEID, ownGunSkinSkinsKey, []) if surplusCount < skinConf["consumeCount"]: mo.setResult("code", 1) # 资源不足 return False elif skinId in ownGunSkinSkins: mo.setResult("code", 2) # 已经合成 return False else: # 合成消耗皮肤碎片 _consume = [{ "name": skinConf["kindId"], "count": abs(skinConf["consumeCount"]) }] util.consumeItems(userId, _consume, "ITEM_USE", int(gunId), mode) addEquipGunSkinSkin(userId, skinId, clientId, False) mo.setResult("code", 0) router.sendToUser(mo, userId) return True
def getGunIds(userId, mode): """ 玩家当前拥有的火炮ID """ clientId = util.getClientId(userId) gunIds = [0] userBag = hallitem.itemSystem.loadUserAssets(userId).getUserBag() ownGunSkinSkinsKey = GameData.ownGunSkinSkins ownGunSkinSkins = gamedata.getGameAttrJson(userId, FISH_GAMEID, ownGunSkinSkinsKey, []) for kindId in config.getAllGunIds(clientId, mode): item = userBag.getItemByKindId(kindId) gunConf = config.getGunConf(kindId, clientId, mode=mode) if gunConf["skins"][0] in ownGunSkinSkins: # 是否拥有皮肤炮默认永久皮肤 gunIds.append(kindId) elif item and not item.isDied(int(time.time())): # 皮肤炮是否过期 没过期 gunIds.append(kindId) return gunIds
def gunChange(self, gLv): """ 切换火炮等级 """ reason = 0 if gLv > self.gunLevel or not config.getGunLevelConf( gLv, self.table.gameMode): reason = 1 else: if gLv < self.table.runConfig.minGunLevel: return elif gLv > self.tableMaxGunLevel(): return elif self.getUsingSkillInfo(): # 技能处于使用中时,升级炮台,炮台等级需等技能状态结束后才会切换更新 self.nowGunLevel = gLv return gunMultiple = config.getGunConf(self.gunId, self.clientId, self.gunLv, self.table.gameMode).get( "multiple", 1) retMsg = MsgPack() retMsg.setCmd("gchg") retMsg.setResult("gameId", config.FISH_GAMEID) retMsg.setResult("gLv", gLv) retMsg.setResult("userId", self.userId) retMsg.setResult("seatId", self.seatId) retMsg.setResult("gunMultiple", gunMultiple) retMsg.setResult("gameMode", self.table.gameMode) retMsg.setResult("reason", reason) retMsg.setResult("tableMaxGunLevel", self.tableMaxGunLevel()) GameMsg.sendMsg(retMsg, self.userId) if reason == 0: self.nowGunLevel = gLv result = retMsg.getKey("result") del result["reason"] GameMsg.sendMsg(retMsg, self.table.getBroadcastUids(self.userId)) from newfish.game import TGFish event = ChangeGunLevelEvent(self.userId, config.FISH_GAMEID, self.table.bigRoomId, self.nowGunLevel) TGFish.getEventBus().publishEvent(event) self.syncSkillSlots()
def useEffect(self, gunId=None): """ 使用狂暴 """ code = 0 gunId = self.player.gunId if gunId is None else gunId if gunId not in self.gunEffectData: data = self._getData(gunId) else: data = self.gunEffectData[gunId] if not data: code = 1 # 此炮不存在狂暴效果 conf = config.getGunConf(gunId, self.clientId, 1, self.mode) if data and data[1] < conf["fire_count"]: # 开火次数没有达到要求 code = 2 if self.useGunEffect[gunId]["state"] != State.CAN_USE: code = 3 if len(self.player.usingSkill) > 0: # 使用技能期间, 不能使用狂暴 code = 4 if code == 0: self.useGunEffect[gunId] = { "state": State.PREPARE, # 准备 "start_time": 0, # float('%.2f' % time.time()) "progress": [0, conf["duration"]] } if data: dataTmp = deepcopy(data) dataTmp.pop(0) dataTmp.append(conf["fire_count"]) data = dataTmp msg = MsgPack() msg.setCmd("use_gun_effect") msg.setResult("userId", self.userId) msg.setResult("gunId", gunId) msg.setResult("code", code) msg.setResult("progressData", data) msg.setResult("data", self.useGunEffect[gunId]) GameMsg.sendMsg(msg, self.table.getBroadcastUids())
def sendProgress(self, gunId=None, isSend=1): """ 发送是否开启狂暴技能效果|使用狂暴的数据 """ gunId = self.player.gunId if gunId is None else gunId if gunId not in self.gunEffectData: data = self._getData(gunId) else: data = self.gunEffectData[gunId] if not data: return conf = config.getGunConf(gunId, self.clientId, 1, self.mode) temp_data = deepcopy(data) temp_data.pop(0) temp_data.append(conf["fire_count"]) msg = MsgPack() msg.setCmd("gun_effect_process") msg.setResult("userId", self.userId) msg.setResult("gunId", gunId) msg.setResult("progressData", temp_data) GameMsg.sendMsg(msg, [self.player.userId]) if data[1] >= conf["fire_count"] and isSend: self.sendUseEffectState(gunId)
def isCanEquip(userId, gunId, mode): """ 皮肤炮是否可以装配(条件同解锁,但是只检测当前模式是否可以装备) """ clientId = util.getClientId(userId) gunConf = config.getGunConf(gunId, clientId, 1, mode) _isCanEquip = False if gunConf: from newfish.entity.honor import honor_system vipLevel = hallvip.userVipSystem.getVipInfo(userId).get("level", 0) gunLevelVal = util.getGunLevelVal(userId, mode) if gunId == 0: _isCanEquip = True elif gunConf["equipType"] == 0: _isCanEquip = True elif gunConf["equipType"] == 1 and vipLevel >= gunConf["equipValue"]: _isCanEquip = True elif gunConf["equipType"] == 2 and gunConf[ "equipValue"] in honor_system.getOwnedHonors(userId): _isCanEquip = True elif gunConf["equipType"] == 3 and gunLevelVal >= gunConf["equipValue"]: _isCanEquip = True return _isCanEquip
def sendUseEffectState(self, gunId=None): """ 发送是否开启狂暴技能效果|使用狂暴的数据 """ gunId = self.player.gunId if gunId is None else gunId if gunId not in self.gunEffectData: data_list = self._getData(gunId) else: data_list = self.gunEffectData[gunId] msg = MsgPack() msg.setCmd("gun_use_effect_state") msg.setResult("userId", self.userId) msg.setResult("gunId", gunId) if not data_list: msg.setResult("data", { "state": State.NOT_EFFECT, "start_time": 0, "progress": [0, 0] }) GameMsg.sendMsg(msg, self.table.getBroadcastUids()) return conf = config.getGunConf(gunId, self.clientId, 1, self.mode) if conf["fire_count"] <= 0: return if gunId not in self.useGunEffect: if data_list[1] >= conf["fire_count"]: self.useGunEffect[gunId] = { "state": State.CAN_USE, "start_time": 0, "progress": [0, conf["duration"]] } else: self.useGunEffect[gunId] = { "state": State.NOT_USE, "start_time": 0, "progress": [0, conf["duration"]] } else: data = self.useGunEffect[gunId] if data["state"] == State.NOT_USE and data_list[1] >= conf[ "fire_count"]: data["state"] = State.CAN_USE if data["state"] == State.USING or data["state"] == State.PAUSE: if float('%.2f' % time.time()) - data["start_time"] + data[ "progress"][0] < data["progress"][1]: data["progress"][0] += float( '%.2f' % time.time()) - data["start_time"] data["progress"][0] = min(data["progress"][0], data["progress"][1]) data["start_time"] = float('%.2f' % time.time()) else: data["state"] = State.END if data["state"] == State.END: self.useGunEffect[gunId].update({ "state": State.END, "start_time": 0, "progress": [conf["duration"], conf["duration"]] }) msg.setResult("data", self.useGunEffect[gunId]) GameMsg.sendMsg(msg, self.table.getBroadcastUids()) if self.useGunEffect[gunId]["state"] == State.END: self.clearUeTimer() del self.useGunEffect[gunId]
def sendGunListMsg(userId, mode): """ 发送火炮列表消息 """ clientId = util.getClientId(userId) guns = [] installedGunId = refreshGunId(userId, mode) # 当前已装备的皮肤炮过期时,默认装备已拥有的最后一个皮肤炮 userBag = hallitem.itemSystem.loadUserAssets(userId).getUserBag() allGuns = getAllGuns(userId, mode) # 获得所有皮肤炮数据 lang = util.getLanguage(userId) ownGunSkinSkinsKey = GameData.ownGunSkinSkins ownGunSkinSkins = gamedata.getGameAttrJson(userId, FISH_GAMEID, ownGunSkinSkinsKey, []) # 已拥有的皮肤炮皮肤 for gunId in config.getAllGunIds(clientId, mode): if gunId not in allGuns: continue gun = {} gunLv = allGuns[gunId][INDEX_LEVEL] gunExp = allGuns[gunId][INDEX_EXP] skinId = allGuns[gunId][INDEX_SKINID] gunConf = config.getGunConf(gunId, clientId, gunLv, mode) gun["gunId"] = gunId gun["name"] = config.getMultiLangTextConf(gunConf["name"], lang=lang) gun["unlockDesc"] = gunConf["unlockDesc"] # 解锁描述 if gunConf["unlockDesc"]: gun["unlockDesc"] = config.getMultiLangTextConf( gunConf["unlockDesc"], lang=lang) % gunConf.get( "unlockValue", 0) gun["equipDesc"] = gunConf.get("equipDesc") # 装备描述 if gunConf["equipDesc"]: gun["equipDesc"] = config.getMultiLangTextConf( gunConf["equipDesc"], lang=lang) % gunConf.get( "equipValue", 0) gun["level"] = gunLv gun["exp"] = gunExp - (gunConf["totalExp"] - gunConf["exp"] ) # 炮经验-上一级的经验 gun["totalExp"] = gunConf["exp"] # 本级所需经验 gun["expires"] = -1 # 有效期 gun["state"] = 1 gun["mode"] = 0 gun["skinId"] = skinId if skinId in gunConf["skins"] else gunConf[ "skins"][0] # 皮肤炮皮肤 gun["skins"] = [] for skinId_ in gunConf["skins"]: skinState = SKIN_NOTOPEN if skinId_ != -1 and config.getGunSkinConf(skinId_, clientId, mode): skinState = SKIN_GOT if (skinId_ in ownGunSkinSkins) else SKIN_NOTGOT elif skinId_ == 0: skinState = SKIN_GOT skinData = {"skinId": skinId_, "state": skinState} gun["skins"].append(skinData) unLock = isUnlock(userId, gunId, gunConf, mode) item = userBag.getItemByKindId(gunId) if gunConf["skins"][0] in ownGunSkinSkins: # 永久获得 if installedGunId == gunId: gun["state"] = 0 if not unLock: # 未解锁拥有(试用) gun["mode"] = 1 elif item and not item.isDied(int(time.time())): # 试用 gun["expires"] = item.expiresTime # 用道具购买有效期 if installedGunId == gunId: gun["state"] = 0 if not unLock: # 未解锁拥有(试用) gun["mode"] = 1 elif gunId == 0: if installedGunId == gunId: gun["state"] = 0 else: gun["expires"] = 0 gun["state"] = 2 if not unLock: gun["state"] = 3 gun["equipState"] = 1 if isCanEquip(userId, gunId, mode) else 0 guns.append(gun) mo = MsgPack() mo.setCmd("guns_list") mo.setResult("gameId", FISH_GAMEID) mo.setResult("userId", userId) mo.setResult("gameMode", mode) mo.setResult("guns", guns) router.sendToUser(mo, userId)