def destroy(self, staff_id, tp): from core.club import Club from core.formation import Formation self._destroy_check(staff_id) staff = self.get_staff_object(staff_id) if not staff: raise GameException( ConfigErrorMessage.get_error_id("STAFF_NOT_EXIST")) if tp == 0: # 普通分解 items = staff.get_cost_items(70) crystal = ConfigStaffNew.get(staff.oid).crystal items.append((money_text_to_item_id('crystal'), crystal)) else: if staff.is_initial_state(): raise GameException( ConfigErrorMessage.get_error_id( "STAFF_CANNOT_DESTROY_INITIAL_STATE")) # TODO diamond count resource_classified = ResourceClassification.classify([ (money_text_to_item_id('diamond'), 50) ]) resource_classified.check_exist(self.server_id, self.char_id) resource_classified.remove( self.server_id, self.char_id, message="StaffManger.destroy:{0},{1}".format(staff.oid, tp)) items = staff.get_cost_items(100) resource_classified = ResourceClassification.classify(items) resource_classified.add(self.server_id, self.char_id, message="StaffManger.destroy:{0},{1}".format( staff.oid, tp)) if tp == 0: self.remove(staff_id) else: staff.reset() in_formation_staff_ids = Formation( self.server_id, self.char_id).in_formation_staffs().keys() if staff.id in in_formation_staff_ids: Club(self.server_id, self.char_id, load_staffs=False).force_load_staffs(send_notify=True) else: staff.calculate() staff.make_cache() self.send_notify(ids=[staff_id]) self.after_staffs_change_for_trig_signal() return resource_classified
def equipment_destroy(self, slot_id, use_sycee): # 装备销毁 """ :rtype: ResourceClassification """ self._equipment_destroy_check(slot_id) this_slot = self.doc['slots'][slot_id] item_id = this_slot['item_id'] config = ConfigEquipmentNew.get(item_id) level = this_slot['level'] equip = Equipment.load_from_slot_data(this_slot) if use_sycee: if equip.is_special: min_level = 0 else: min_level = min(config.levels.keys()) if level == min_level: raise GameException(ConfigErrorMessage.get_error_id("EQUIPMENT_CANNOT_DESTROY_NO_LEVEL_UP")) diamond = GlobalConfig.value("EQUIPMENT_DESTROY_SYCEE") rf = ResourceClassification.classify([(money_text_to_item_id('diamond'), diamond)]) rf.check_exist(self.server_id, self.char_id) rf.remove(self.server_id, self.char_id) MongoBag.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'slots.{0}.level'.format(slot_id): 0 }} ) self.doc['slots'][slot_id]['level'] = 0 self.send_notify(slot_ids=[slot_id]) results = equip.get_destroy_back_items(is_normal_destroy=False) else: self.remove_by_slot_id(slot_id, 1) results = equip.get_destroy_back_items(is_normal_destroy=True) if config.renown: results.append((money_text_to_item_id('renown'), config.renown)) resource_classified = ResourceClassification.classify(results) resource_classified.add(self.server_id, self.char_id, message="Bag.equipment_destroy:{0}".format(item_id)) return resource_classified
def speedup(self): if not self.doc['item_id']: raise GameException(ConfigErrorMessage.get_error_id("SPECIAL_EQUIPMENT_NOT_IN_PROCESS")) seconds = self.doc['finish_at'] - arrow.utcnow().timestamp if seconds <= 0: raise GameException(ConfigErrorMessage.get_error_id("SPECIAL_EQUIPMENT_ALREADY_FINISHED")) minutes, remained = divmod(seconds, 60) if remained: minutes += 1 diamond = minutes * GlobalConfig.value("EQUIPMENT_SPECIAL_SPEEDUP_PARAM") * 0.1 diamond = int(diamond) cost = [(money_text_to_item_id('diamond'), diamond)] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="SpecialEquipmentGenerator.speedup") # make sure is finished self.doc['finish_at'] = arrow.utcnow().timestamp - 1 MongoSpecialEquipment.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'finish_at': self.doc['finish_at'] }} ) self.send_notify()
def create(self, name): cost = [(money_text_to_item_id('diamond'), GlobalConfig.value("UNION_CREATE_COST"))] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) doc = MongoUnion.document() doc['_id'] = make_string_id() doc['create_at'] = arrow.utcnow().timestamp doc['name'] = name doc['owner'] = self.char_id try: MongoUnion.db(self.server_id).insert_one(doc) except DuplicateKeyError: raise GameException(ConfigErrorMessage.get_error_id("UNION_NAME_HAS_TAKEN")) MongoUnionMember.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'joined': doc['_id'], 'joined_at': arrow.utcnow().timestamp }} ) rc.remove(self.server_id, self.char_id, message="Union.create") Union(self.server_id, self.char_id).send_all_notify()
def daily_buy(self): config = ConfigActivityDailyBuy.get(self.create_day) if not config: raise GameException( ConfigErrorMessage.get_error_id("INVALID_OPERATE")) if self.create_day in self.doc['daily_buy']: raise GameException( ConfigErrorMessage.get_error_id( "ACTIVITY_DAILY_BUY_HAS_BOUGHT")) cost = [ (money_text_to_item_id('diamond'), config.diamond_now), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="ActivityNewPlayer.daily_buy") rc = ResourceClassification.classify(config.items) rc.add(self.server_id, self.char_id, message="ActivityNewPlayer.daily_buy") self.doc['daily_buy'].append(self.create_day) MongoActivityNewPlayer.db(self.server_id).update_one( {'_id': self.char_id}, {'$push': { 'daily_buy': self.create_day }}) self.send_daily_buy_notify() return rc
def create(self, party_level): ret = api_handle.API.Party.CreateDone() ret.ret = 0 config = ConfigPartyLevel.get(party_level) if not config: ret.ret = ConfigErrorMessage.get_error_id("INVALID_OPERATE") return ret union = Union(self.server_id, self.char_id) union_id = union.get_joined_union_id() if not union_id: ret.ret = ConfigErrorMessage.get_error_id( "PARTY_CANNOT_CREATE_NO_UNION") try: union.check_level(config.need_union_level) cost = [ (money_text_to_item_id('diamond'), config.need_diamond), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) except GameException as e: ret.ret = e.error_id return ret ret.union_id = union_id return ret
def send_reward(self, goods_id): if goods_id == YUEKA_ID: # 月卡买了就立即发送 # 后面的再定时发送 config = ConfigPurchaseYueka.get(YUEKA_ID) got = 0 actual_got = 0 MongoPurchase.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'yueka_remained_days': 29, 'yueka_new': True }} ) self.doc['yueka_remained_days'] = 29 self.doc['yueka_new'] = True rc = ResourceClassification.classify(config.rewards) attachment = rc.to_json() m = MailManager(self.server_id, self.char_id) m.add(config.mail_title, config.mail_content, attachment=attachment) else: config = ConfigPurchaseGoods.get(goods_id) got = config.diamond actual_got = config.diamond + config.diamond_extra if self.get_purchase_times() == 0: # 首充 actual_got = config.diamond * 2 + config.diamond_extra doc = MongoPurchaseLog.document() doc['_id'] = make_string_id() doc['char_id'] = self.char_id doc['goods_id'] = goods_id doc['got'] = got doc['actual_got'] = actual_got doc['timestamp'] = arrow.utcnow().timestamp MongoPurchaseLog.db(self.server_id).insert_one(doc) reward = [ (VIP_EXP_ITEM_ID, config.vip_exp), (money_text_to_item_id('diamond'), actual_got) ] rc = ResourceClassification.classify(reward) rc.add(self.server_id, self.char_id, message="Purchase.send_reward:{0}".format(goods_id)) purchase_done_signal.send( sender=None, server_id=self.server_id, char_id=self.char_id, goods_id=goods_id, got=got, actual_got=actual_got, ) self.send_notify()
def buy_reward(self, vip_level): self.check(vip_level) config = ConfigVIP.get(vip_level) if not config: raise GameException( ConfigErrorMessage.get_error_id("INVALID_OPERATE")) if vip_level in self.doc['rewards']: raise GameException( ConfigErrorMessage.get_error_id("VIP_ALREADY_BUY_REWARD")) needs = [(money_text_to_item_id('diamond'), config.diamond_now)] rc = ResourceClassification.classify(needs) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="VIP.buy_reward:{0}".format(vip_level)) got = [(config.item_id, 1)] rc = ResourceClassification.classify(got) rc.add(self.server_id, self.char_id, message="VIP.buy_reward:{0}".format(vip_level)) self.doc['rewards'].append(vip_level) MongoVIP.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'rewards': self.doc['rewards'] }}) self.send_notify() return rc
def buy_reward(self, vip_level): self.check(vip_level) config = ConfigVIP.get(vip_level) if not config: raise GameException(ConfigErrorMessage.get_error_id("INVALID_OPERATE")) if vip_level in self.doc['rewards']: raise GameException(ConfigErrorMessage.get_error_id("VIP_ALREADY_BUY_REWARD")) needs = [(money_text_to_item_id('diamond'), config.diamond_now)] rc = ResourceClassification.classify(needs) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="VIP.buy_reward:{0}".format(vip_level)) got = [(config.item_id, 1)] rc = ResourceClassification.classify(got) rc.add(self.server_id, self.char_id, message="VIP.buy_reward:{0}".format(vip_level)) self.doc['rewards'].append(vip_level) MongoVIP.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'rewards': self.doc['rewards'] }} ) self.send_notify() return rc
def create(self, party_level): ret = api_handle.API.Party.CreateDone() ret.ret = 0 config = ConfigPartyLevel.get(party_level) if not config: ret.ret = ConfigErrorMessage.get_error_id("INVALID_OPERATE") return ret union = Union(self.server_id, self.char_id) union_id = union.get_joined_union_id() if not union_id: ret.ret = ConfigErrorMessage.get_error_id("PARTY_CANNOT_CREATE_NO_UNION") try: union.check_level(config.need_union_level) cost = [(money_text_to_item_id('diamond'), config.need_diamond), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) except GameException as e: ret.ret = e.error_id return ret ret.union_id = union_id return ret
def buy_plunder_times(self): info = PlunderTimesBuyInfo(self.server_id, self.char_id) if not info.remained_buy_times: raise GameException( ConfigErrorMessage.get_error_id("PLUNDER_NO_BUY_TIMES")) cost = [ (money_text_to_item_id('diamond'), info.buy_cost), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Plunder.buy_plunder_times") ValueLogPlunderBuyTimes(self.server_id, self.char_id).record() self.doc['plunder_remained_times'] += 1 MongoPlunder.db(self.server_id).update_one({'_id': self.char_id}, { '$set': { 'plunder_remained_times': self.doc['plunder_remained_times'] } }) self.send_plunder_times_notify()
def make_inspire(self): """ :rtype: ResourceClassification | None """ if not self.remained_inspire_times(): raise GameException( ConfigErrorMessage.get_error_id("TERRITORY_NO_INSPIRE_TIMES")) cost = [ (money_text_to_item_id('diamond'), self.inspire_cost()), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Building.make_inspire") ValueLogTerritoryBuildingInspireTimes( self.server_id, self.char_id).record(sub_id=self.id) config = ConfigTerritoryBuilding.get( self.id).levels[self.level].inspire level_up = self.add_exp(config.exp) reward = config.get_reward() if reward: rc = ResourceClassification.classify(reward) rc.add(self.server_id, self.char_id, message="Building.make_inspire") return rc, level_up return None, level_up
def start(self, party_level, member_ids): # member_ids 只是组员, 不包括创建者自己 ret = api_handle.API.Party.StartDone() ret.ret = 0 config = ConfigPartyLevel.get(party_level) try: cost = [ (money_text_to_item_id('diamond'), config.need_diamond), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Party.start:{0}".format(party_level)) except GameException as e: ret.ret = e.error_id return ret ValueLogPartyCreateTimes(self.server_id, self.char_id).record() ValueLogPartyEngageTimes(self.server_id, self.char_id).record() for mid in member_ids: ValueLogPartyJoinTimes(self.server_id, mid).record() ValueLogPartyEngageTimes(self.server_id, self.char_id).record() return ret
def refresh(self): cd = self.get_refresh_cd() if cd: # 就是要花钱了 ti = TimesInfo(self.server_id, self.char_id) if not ti.remained_reset_times: raise GameException(ConfigErrorMessage.get_error_id("ARENA_NO_SEARCH_RESET_TIMES")) cost = [(money_text_to_item_id('diamond'), ti.reset_cost), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Arena.refresh") ValueLogArenaSearchResetTimes(self.server_id, self.char_id).record() else: ArenaRefreshCD(self.server_id, self.char_id).set(ARENA_REFRESH_CD_SECONDS) rival = self.search_rival() MongoArena.db(self.server_id).update_one( {'_id': str(self.char_id)}, {'$set': { 'rival': rival }} ) self.send_notify()
def equipment_batch_destroy(self, slot_ids): total_items = {} for slot_id in slot_ids: self._equipment_destroy_check(slot_id) this_slot = self.doc['slots'][slot_id] item_id = this_slot['item_id'] config = ConfigEquipmentNew.get(item_id) equip = Equipment.load_from_slot_data(this_slot) items = equip.get_destroy_back_items(is_normal_destroy=True) if config.renown: items.append((money_text_to_item_id('renown'), config.renown)) for _id, _amount in items: if _id in total_items: total_items[_id] += _amount else: total_items[_id] = _amount rc = ResourceClassification.classify(total_items.items()) rc.add(self.server_id, self.char_id, message="Bag.equipment_batch_destroy") for slot_id in slot_ids: self.remove_by_slot_id(slot_id, 1) return rc
def destroy(self, using_sycee): if self.level == UNIT_INIT_LEVEL and self.step == UNIT_INIT_STEP: raise GameException(ConfigErrorMessage.get_error_id("UNIT_IS_INIT_CANNOT_DESTROY")) if using_sycee: need_diamond = GlobalConfig.value("UNIT_DESTROY_SYCEE") cost = [(money_text_to_item_id('diamond'), need_diamond), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Unit.destroy:{0}".format(self.id)) percent = 1 else: percent = 0.7 items = self.get_strengthen_cost() items = [(_id, int(_amount * percent)) for _id, _amount in items] rc = ResourceClassification.classify(items) rc.add(self.server_id, self.char_id, message="Unit.destroy:{0}".format(self.id)) self.level = UNIT_INIT_LEVEL self.step = UNIT_INIT_STEP MongoUnit.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'units.{0}.level'.format(self.id): self.level, 'units.{0}.step'.format(self.id): self.step, }} ) return rc
def batch_destroy(self, staff_ids): total_items = {} for sid in staff_ids: self._destroy_check(sid) staff = self.get_staff_object(sid) if not staff: raise GameException( ConfigErrorMessage.get_error_id("STAFF_NOT_EXIST")) _items = staff.get_cost_items(70) _crystal = ConfigStaffNew.get(staff.oid).crystal _items.append((money_text_to_item_id('crystal'), _crystal)) for _id, _amount in _items: if _id in total_items: total_items[_id] += _amount else: total_items[_id] = _amount rc = ResourceClassification.classify(total_items.items()) rc.add(self.server_id, self.char_id, message="StaffManger.batch_destroy") self.remove(staff_ids) self.after_staffs_change_for_trig_signal() return rc
def make_inspire(self): """ :rtype: ResourceClassification | None """ if not self.remained_inspire_times(): raise GameException(ConfigErrorMessage.get_error_id("TERRITORY_NO_INSPIRE_TIMES")) cost = [(money_text_to_item_id('diamond'), self.inspire_cost()), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Building.make_inspire") ValueLogTerritoryBuildingInspireTimes(self.server_id, self.char_id).record(sub_id=self.id) config = ConfigTerritoryBuilding.get(self.id).levels[self.level].inspire level_up = self.add_exp(config.exp) reward = config.get_reward() if reward: rc = ResourceClassification.classify(reward) rc.add(self.server_id, self.char_id, message="Building.make_inspire") return rc, level_up return None, level_up
def batch_destroy(self, staff_ids): total_items = {} for sid in staff_ids: self._destroy_check(sid) staff = self.get_staff_object(sid) if not staff: raise GameException(ConfigErrorMessage.get_error_id("STAFF_NOT_EXIST")) _items = staff.get_cost_items(70) _crystal = ConfigStaffNew.get(staff.oid).crystal _items.append((money_text_to_item_id('crystal'), _crystal)) for _id, _amount in _items: if _id in total_items: total_items[_id] += _amount else: total_items[_id] = _amount rc = ResourceClassification.classify(total_items.items()) rc.add(self.server_id, self.char_id, message="StaffManger.batch_destroy") self.remove(staff_ids) self.after_staffs_change_for_trig_signal() return rc
def daily_buy(self): config = ConfigActivityDailyBuy.get(self.create_day) if not config: raise GameException(ConfigErrorMessage.get_error_id("INVALID_OPERATE")) if self.create_day in self.doc['daily_buy']: raise GameException(ConfigErrorMessage.get_error_id("ACTIVITY_DAILY_BUY_HAS_BOUGHT")) cost = [(money_text_to_item_id('diamond'), config.diamond_now), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="ActivityNewPlayer.daily_buy") rc = ResourceClassification.classify(config.items) rc.add(self.server_id, self.char_id, message="ActivityNewPlayer.daily_buy") self.doc['daily_buy'].append(self.create_day) MongoActivityNewPlayer.db(self.server_id).update_one( {'_id': self.char_id}, {'$push': { 'daily_buy': self.create_day }} ) self.send_daily_buy_notify() return rc
def create(self, name): cost = [(money_text_to_item_id('diamond'), GlobalConfig.value("UNION_CREATE_COST"))] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) doc = MongoUnion.document() doc['_id'] = make_string_id() doc['create_at'] = arrow.utcnow().timestamp doc['name'] = name doc['owner'] = self.char_id try: MongoUnion.db(self.server_id).insert_one(doc) except DuplicateKeyError: raise GameException( ConfigErrorMessage.get_error_id("UNION_NAME_HAS_TAKEN")) MongoUnionMember.db(self.server_id).update_one({'_id': self.char_id}, { '$set': { 'joined': doc['_id'], 'joined_at': arrow.utcnow().timestamp } }) rc.remove(self.server_id, self.char_id, message="Union.create") Union(self.server_id, self.char_id).send_all_notify()
def reset(self): if not self.doc['cost_point']: raise GameException( ConfigErrorMessage.get_error_id( "TALENT_CANNOT_RESET_NOT_USE_POINT")) using_items = [(money_text_to_item_id('diamond'), RESET_TALENT_TREE_COST)] resource_classified = ResourceClassification.classify(using_items) resource_classified.check_exist(self.server_id, self.char_id) resource_classified.remove(self.server_id, self.char_id, message="TalentManager.reset") self.doc['talents'] = ConfigTalent.INIT_TALENT_IDS self.doc['cost_point'] = 0 MongoTalent.db(self.server_id).update_one({'_id': self.char_id}, { '$set': { 'talents': self.doc['talents'], 'cost_point': self.doc['cost_point'], } }) self.send_notify() self.after_change()
def refresh(self): cd = self.get_refresh_cd() if cd: # 就是要花钱了 ti = TimesInfo(self.server_id, self.char_id) if not ti.remained_reset_times: raise GameException( ConfigErrorMessage.get_error_id( "ARENA_NO_SEARCH_RESET_TIMES")) cost = [ (money_text_to_item_id('diamond'), ti.reset_cost), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Arena.refresh") ValueLogArenaSearchResetTimes(self.server_id, self.char_id).record() else: ArenaRefreshCD(self.server_id, self.char_id).set(ARENA_REFRESH_CD_SECONDS) rival = self.search_rival() MongoArena.db(self.server_id).update_one({'_id': str(self.char_id)}, {'$set': { 'rival': rival }}) self.send_notify()
def _remove_money(): cost = [(money_text_to_item_id('gold'), config.cost_value_1)] resource_classify = ResourceClassification.classify(cost) resource_classify.check_exist(self.server_id, self.char_id) resource_classify.remove(self.server_id, self.char_id, message="StaffRecruit.recruit:1,1")
def destroy(self, staff_id, tp): from core.club import Club from core.formation import Formation self._destroy_check(staff_id) staff = self.get_staff_object(staff_id) if not staff: raise GameException(ConfigErrorMessage.get_error_id("STAFF_NOT_EXIST")) if tp == 0: # 普通分解 items = staff.get_cost_items(70) crystal = ConfigStaffNew.get(staff.oid).crystal items.append((money_text_to_item_id('crystal'), crystal)) else: if staff.is_initial_state(): raise GameException(ConfigErrorMessage.get_error_id("STAFF_CANNOT_DESTROY_INITIAL_STATE")) # TODO diamond count resource_classified = ResourceClassification.classify([(money_text_to_item_id('diamond'), 50)]) resource_classified.check_exist(self.server_id, self.char_id) resource_classified.remove(self.server_id, self.char_id, message="StaffManger.destroy:{0},{1}".format(staff.oid, tp)) items = staff.get_cost_items(100) resource_classified = ResourceClassification.classify(items) resource_classified.add(self.server_id, self.char_id, message="StaffManger.destroy:{0},{1}".format(staff.oid, tp)) if tp == 0: self.remove(staff_id) else: staff.reset() in_formation_staff_ids = Formation(self.server_id, self.char_id).in_formation_staffs().keys() if staff.id in in_formation_staff_ids: Club(self.server_id, self.char_id, load_staffs=False).force_load_staffs(send_notify=True) else: staff.calculate() staff.make_cache() self.send_notify(ids=[staff_id]) self.after_staffs_change_for_trig_signal() return resource_classified
def item_destroy(self, slot_id): # 碎片销毁 item_id = self.doc['slots'][slot_id]['item_id'] amount = self.doc['slots'][slot_id]['amount'] tp = get_item_type(item_id) assert tp == TYPE_FRAGMENT self.remove_by_slot_id(slot_id, amount) config = ConfigItemMerge.get(item_id) drop = [] if config.renown: drop.append((money_text_to_item_id('renown'), config.renown * amount)) if config.crystal: drop.append((money_text_to_item_id('crystal'), config.crystal * amount)) resource_classified = ResourceClassification.classify(drop) resource_classified.add(self.server_id, self.char_id, message="Bag.item_destroy:{0}".format(item_id)) return resource_classified
def _recruit_tp_2_mode_2(self): # 钻石十连抽 config = ConfigStaffRecruit.get(2) cost = [(money_text_to_item_id('diamond'), config.cost_value_10)] resource_classify = ResourceClassification.classify(cost) resource_classify.check_exist(self.server_id, self.char_id) resource_classify.remove(self.server_id, self.char_id, message="StaffRecruit.recruit:2,2") return 10
def buy_times(self): ti = TimesInfo(self.server_id, self.char_id) if not ti.remained_buy_times: raise GameException(ConfigErrorMessage.get_error_id("ARENA_NO_BUY_TIMES")) cost = [(money_text_to_item_id('diamond'), ti.buy_cost), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Arena.buy_times") ValueLogArenaBuyTimes(self.server_id, self.char_id).record() self.send_notify()
def buy_times(self): if not self.remained_buy_times: raise GameException(ConfigErrorMessage.get_error_id("UNION_HARASS_NO_BUY_TIMES")) cost = [(money_text_to_item_id('diamond'), self.buy_cost)] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="HarassInfo.buy_times") ValueLogUnionHarassBuyTimes(self.server_id, self.char_id).record() self.current_buy_times += 1 self._calculate()
def buy_times(self, category_id, send_notify=True): ri = TimesInfo(self.server_id, self.char_id, category_id) if not ri.remained_buy_times: raise GameException(ConfigErrorMessage.get_error_id("DUNGEON_NO_BUY_TIMES")) cost = [(money_text_to_item_id('diamond'), ri.buy_cost), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Dungeon.buy_times:{0}".format(category_id)) ValueLogDungeonBuyTimes(self.server_id, self.char_id).record(sub_id=category_id) if send_notify: self.send_notify(category_id=category_id)
def buy_times(self): if not self.remained_buy_times: raise GameException( ConfigErrorMessage.get_error_id("UNION_HARASS_NO_BUY_TIMES")) cost = [(money_text_to_item_id('diamond'), self.buy_cost)] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="HarassInfo.buy_times") ValueLogUnionHarassBuyTimes(self.server_id, self.char_id).record() self.current_buy_times += 1 self._calculate()
def refresh(self, tp): if tp not in ALL_TYPES: raise GameException(ConfigErrorMessage.get_error_id("INVALID_OPERATE")) ri = RefreshInfo(self.server_id, self.char_id, tp) if not ri.remained_refresh_times: raise GameException(ConfigErrorMessage.get_error_id("STORE_REFRESH_NO_TIMES")) cost = [(money_text_to_item_id('diamond'), ri.refresh_cost), ] resource_classified = ResourceClassification.classify(cost) resource_classified.check_exist(self.server_id, self.char_id) resource_classified.remove(self.server_id, self.char_id, message="Store.refresh:{0}".format(tp)) ValueLogStoreRefreshTimes(self.server_id, self.char_id).record(sub_id=tp) self.make_refresh(tp)
def buy_times(self): ti = TimesInfo(self.server_id, self.char_id) if not ti.remained_buy_times: raise GameException( ConfigErrorMessage.get_error_id("ARENA_NO_BUY_TIMES")) cost = [ (money_text_to_item_id('diamond'), ti.buy_cost), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Arena.buy_times") ValueLogArenaBuyTimes(self.server_id, self.char_id).record() self.send_notify()
def buy(self): # 购买体力 ri = BuyTimeInfo(self.server_id, self.char_id) if not ri.remained_buy_times: raise GameException(ConfigErrorMessage.get_error_id("ENERGY_CANNOT_BUY_NO_TIMES")) if self.doc['current'] + 60 > MAX_ENERGY_HARD_LIMIT: raise GameException(ConfigErrorMessage.get_error_id("ENERGY_CANNOT_BUY_REACH_HARD_LIMIT")) cost = [(money_text_to_item_id('diamond'), ri.buy_cost), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Energy.buy") ValueLogEnergyBuyTimes(self.server_id, self.char_id).record() self.add(60)
def buy_goods(self, goods_index): goods = self.doc.get('goods', []) try: goods_id, bought = goods[goods_index] except IndexError: raise GameException(ConfigErrorMessage.get_error_id("INVALID_OPERATE")) if bought: raise GameException(ConfigErrorMessage.get_error_id("TOWER_GOODS_HAS_BOUGHT")) config = ConfigTowerSaleGoods.get(goods_id) if config.vip_need: VIP(self.server_id, self.char_id).check(config.vip_need) cost = [(money_text_to_item_id('diamond'), config.price_now)] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Tower.buy_goods") got = [(config.item_id, config.amount)] rc = ResourceClassification.classify(got) rc.add(self.server_id, self.char_id, message="Tower.buy_goods") self.doc['goods'][goods_index][1] = 1 # NOTE 这里要把买完的那一组删掉 if goods_index % 2 == 0: # 0, 2, 4 的情况,这组下一个的index是 goods_index+1 other_index = goods_index + 1 else: other_index = goods_index - 1 if self.doc['goods'][other_index][1] == 1: _index = min(other_index, goods_index) self.doc['goods'].pop(_index) self.doc['goods'].pop(_index) MongoTower.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'goods': self.doc['goods'] }} ) self.send_goods_notify() return rc
def join(self): if self.doc['joined']: return diamond = GlobalConfig.value("LEVEL_GROWING_ACTIVITY_JOIN_COST_DIAMOND") vip_need = GlobalConfig.value("LEVEL_GROWING_ACTIVITY_JOIN_VIP_LIMIT") VIP(self.server_id, self.char_id).check(vip_need) cost = [(money_text_to_item_id('diamond'), diamond), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id) current_level = get_club_property(self.server_id, self.char_id, 'level') self._update(current_level, joined=True) self.send_notify()
def spy(self, target_id): index = self.find_search_target_index_by_target_id(target_id) if self.doc['search'][index]['spied']: return cost = [(money_text_to_item_id('diamond'), 5), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Plunder.spy") self.doc['search'][index]['spied'] = True MongoPlunder.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'search.{0}.spied'.format(index): True }} ) self.send_search_notify()
def buy_times(self, category_id, send_notify=True): ri = TimesInfo(self.server_id, self.char_id, category_id) if not ri.remained_buy_times: raise GameException( ConfigErrorMessage.get_error_id("DUNGEON_NO_BUY_TIMES")) cost = [ (money_text_to_item_id('diamond'), ri.buy_cost), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Dungeon.buy_times:{0}".format(category_id)) ValueLogDungeonBuyTimes(self.server_id, self.char_id).record(sub_id=category_id) if send_notify: self.send_notify(category_id=category_id)
def reset(self, challenge_id): config = ConfigChallengeMatch.get(challenge_id) if not config: raise GameException(ConfigErrorMessage.get_error_id("CHALLENGE_NOT_EXIST")) rt = RemainedTimes(self.server_id, self.char_id, challenge_id) if rt.remained_match_times: raise GameException(ConfigErrorMessage.get_error_id("CHALLENGE_CANNOT_RESET_HAS_FREE_TIMES")) if not rt.remained_reset_times: raise GameException(ConfigErrorMessage.get_error_id("CHALLENGE_NO_RESET_TIMES")) cost = [(money_text_to_item_id('diamond'), rt.reset_cost), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Challenge.reset:{0}".format(challenge_id)) ValueLogChallengeResetTimes(self.server_id, self.char_id).record(sub_id=challenge_id) self.send_challenge_notify(ids=[challenge_id])
def buy(self): # 购买体力 ri = BuyTimeInfo(self.server_id, self.char_id) if not ri.remained_buy_times: raise GameException( ConfigErrorMessage.get_error_id("ENERGY_CANNOT_BUY_NO_TIMES")) if self.doc['current'] + 60 > MAX_ENERGY_HARD_LIMIT: raise GameException( ConfigErrorMessage.get_error_id( "ENERGY_CANNOT_BUY_REACH_HARD_LIMIT")) cost = [ (money_text_to_item_id('diamond'), ri.buy_cost), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Energy.buy") ValueLogEnergyBuyTimes(self.server_id, self.char_id).record() self.add(60)
def join(self): if self.doc['joined']: return diamond = GlobalConfig.value( "LEVEL_GROWING_ACTIVITY_JOIN_COST_DIAMOND") vip_need = GlobalConfig.value("LEVEL_GROWING_ACTIVITY_JOIN_VIP_LIMIT") VIP(self.server_id, self.char_id).check(vip_need) cost = [ (money_text_to_item_id('diamond'), diamond), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id) current_level = get_club_property(self.server_id, self.char_id, 'level') self._update(current_level, joined=True) self.send_notify()
def spy(self, target_id): index = self.find_search_target_index_by_target_id(target_id) if self.doc['search'][index]['spied']: return cost = [ (money_text_to_item_id('diamond'), 5), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Plunder.spy") self.doc['search'][index]['spied'] = True MongoPlunder.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'search.{0}.spied'.format(index): True }}) self.send_search_notify()
def buy_plunder_times(self): info = PlunderTimesBuyInfo(self.server_id, self.char_id) if not info.remained_buy_times: raise GameException(ConfigErrorMessage.get_error_id("PLUNDER_NO_BUY_TIMES")) cost = [(money_text_to_item_id('diamond'), info.buy_cost), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Plunder.buy_plunder_times") ValueLogPlunderBuyTimes(self.server_id, self.char_id).record() self.doc['plunder_remained_times'] += 1 MongoPlunder.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'plunder_remained_times': self.doc['plunder_remained_times'] }} ) self.send_plunder_times_notify()
def reset(self): sweep_end_at = self.doc.get('sweep_end_at', 0) if sweep_end_at: raise GameException(ConfigErrorMessage.get_error_id("TOWER_IN_SWEEP_CANNOT_OPERATE")) ri = ResetInfo(self.server_id, self.char_id) if not ri.remained_times: raise GameException(ConfigErrorMessage.get_error_id("TOWER_NO_RESET_TIMES")) if -1 not in self.doc['levels'].values(): # 没有失败的, 看看是不是全部完成了 if not self.is_all_complete(): raise GameException(ConfigErrorMessage.get_error_id("TOWER_CANNOT_RESET_NO_FAILURE")) if ri.reset_cost: cost = [(money_text_to_item_id('diamond'), ri.reset_cost)] resource_classified = ResourceClassification.classify(cost) resource_classified.check_exist(self.server_id, self.char_id) resource_classified.remove(self.server_id, self.char_id, message="Tower.reset") self.doc['levels'] = {'1': 0} self.doc['talents'] = [] self.doc['current_star'] = 0 self.doc['turntable'] = {} self.doc['goods'] = [] MongoTower.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'levels': self.doc['levels'], 'talents': self.doc['talents'], 'current_star': self.doc['current_star'], 'turntable': {}, 'goods': [], }} ) ValueLogTowerResetTimes(self.server_id, self.char_id).record() self.send_notify() self.send_goods_notify()
def _recruit_tp_2_mode_1(self): # 钻石单抽 config = ConfigStaffRecruit.get(2) cd_seconds = self.get_cd_seconds(2) if cd_seconds: cost = [(money_text_to_item_id('diamond'), config.cost_value_1)] resource_classify = ResourceClassification.classify(cost) resource_classify.check_exist(self.server_id, self.char_id) resource_classify.remove(self.server_id, self.char_id, message="StaffRecruit.recruit:2,1") else: self.doc['recruit_at']['2'] = arrow.utcnow().timestamp MongoStaffRecruit.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'recruit_at.2': self.doc['recruit_at']['2'] }} ) return 1, not bool(cd_seconds)
def start(self, party_level, member_ids): # member_ids 只是组员, 不包括创建者自己 ret = api_handle.API.Party.StartDone() ret.ret = 0 config = ConfigPartyLevel.get(party_level) try: cost = [(money_text_to_item_id('diamond'), config.need_diamond), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Party.start:{0}".format(party_level)) except GameException as e: ret.ret = e.error_id return ret ValueLogPartyCreateTimes(self.server_id, self.char_id).record() ValueLogPartyEngageTimes(self.server_id, self.char_id).record() for mid in member_ids: ValueLogPartyJoinTimes(self.server_id, mid).record() ValueLogPartyEngageTimes(self.server_id, self.char_id).record() return ret
def reset(self): if not self.doc['cost_point']: raise GameException(ConfigErrorMessage.get_error_id("TALENT_CANNOT_RESET_NOT_USE_POINT")) using_items = [(money_text_to_item_id('diamond'), RESET_TALENT_TREE_COST)] resource_classified = ResourceClassification.classify(using_items) resource_classified.check_exist(self.server_id, self.char_id) resource_classified.remove(self.server_id, self.char_id, message="TalentManager.reset") self.doc['talents'] = ConfigTalent.INIT_TALENT_IDS self.doc['cost_point'] = 0 MongoTalent.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'talents': self.doc['talents'], 'cost_point': self.doc['cost_point'], }} ) self.send_notify() self.after_change()
def refresh(self, tp): if tp not in ALL_TYPES: raise GameException( ConfigErrorMessage.get_error_id("INVALID_OPERATE")) ri = RefreshInfo(self.server_id, self.char_id, tp) if not ri.remained_refresh_times: raise GameException( ConfigErrorMessage.get_error_id("STORE_REFRESH_NO_TIMES")) cost = [ (money_text_to_item_id('diamond'), ri.refresh_cost), ] resource_classified = ResourceClassification.classify(cost) resource_classified.check_exist(self.server_id, self.char_id) resource_classified.remove(self.server_id, self.char_id, message="Store.refresh:{0}".format(tp)) ValueLogStoreRefreshTimes(self.server_id, self.char_id).record(sub_id=tp) self.make_refresh(tp)
def destroy(self, using_sycee): if self.level == UNIT_INIT_LEVEL and self.step == UNIT_INIT_STEP: raise GameException( ConfigErrorMessage.get_error_id("UNIT_IS_INIT_CANNOT_DESTROY")) if using_sycee: need_diamond = GlobalConfig.value("UNIT_DESTROY_SYCEE") cost = [ (money_text_to_item_id('diamond'), need_diamond), ] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="Unit.destroy:{0}".format(self.id)) percent = 1 else: percent = 0.7 items = self.get_strengthen_cost() items = [(_id, int(_amount * percent)) for _id, _amount in items] rc = ResourceClassification.classify(items) rc.add(self.server_id, self.char_id, message="Unit.destroy:{0}".format(self.id)) self.level = UNIT_INIT_LEVEL self.step = UNIT_INIT_STEP MongoUnit.db(self.server_id).update_one({'_id': self.char_id}, { '$set': { 'units.{0}.level'.format(self.id): self.level, 'units.{0}.step'.format(self.id): self.step, } }) return rc
def _recruit_tp_2_mode_1(self): # 钻石单抽 config = ConfigStaffRecruit.get(2) cd_seconds = self.get_cd_seconds(2) if cd_seconds: cost = [(money_text_to_item_id('diamond'), config.cost_value_1)] resource_classify = ResourceClassification.classify(cost) resource_classify.check_exist(self.server_id, self.char_id) resource_classify.remove(self.server_id, self.char_id, message="StaffRecruit.recruit:2,1") else: self.doc['recruit_at']['2'] = arrow.utcnow().timestamp MongoStaffRecruit.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'recruit_at.2': self.doc['recruit_at']['2'] }}) return 1, not bool(cd_seconds)
def speedup(self): if not self.doc['item_id']: raise GameException( ConfigErrorMessage.get_error_id( "SPECIAL_EQUIPMENT_NOT_IN_PROCESS")) seconds = self.doc['finish_at'] - arrow.utcnow().timestamp if seconds <= 0: raise GameException( ConfigErrorMessage.get_error_id( "SPECIAL_EQUIPMENT_ALREADY_FINISHED")) minutes, remained = divmod(seconds, 60) if remained: minutes += 1 diamond = minutes * GlobalConfig.value( "EQUIPMENT_SPECIAL_SPEEDUP_PARAM") * 0.1 diamond = int(diamond) cost = [(money_text_to_item_id('diamond'), diamond)] rc = ResourceClassification.classify(cost) rc.check_exist(self.server_id, self.char_id) rc.remove(self.server_id, self.char_id, message="SpecialEquipmentGenerator.speedup") # make sure is finished self.doc['finish_at'] = arrow.utcnow().timestamp - 1 MongoSpecialEquipment.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'finish_at': self.doc['finish_at'] }}) self.send_notify()
def sweep_finish(self): # 加速或者领奖 都是这一个协议 start_level = self.get_current_level() sweep_end_at = self.doc.get('sweep_end_at', 0) if sweep_end_at == 0: # 没有扫荡过,直接 完成 levels_amount = self._sweep_check() else: # 已经扫荡了, 现在要加速完成 need_seconds = sweep_end_at - arrow.utcnow().timestamp if need_seconds <= 0: # 已经完成了, 直接领奖 levels_amount = 0 else: levels_amount, _remained = divmod(need_seconds, GlobalConfig.value("TOWER_SWEEP_SECONDS_PER_LEVEL")) if _remained: levels_amount += 1 if levels_amount: need_diamond = levels_amount * GlobalConfig.value("TOWER_SWEEP_DIAMOND_PER_LEVEL") resource_classified = ResourceClassification.classify([(money_text_to_item_id('diamond'), need_diamond)]) resource_classified.check_exist(self.server_id, self.char_id) resource_classified.remove(self.server_id, self.char_id, message="Tower.sweep_finish") drops = {} updater = {} for i in range(start_level, self.doc['max_star_level'] + 1): updater['levels.{0}'.format(i)] = 3 self.doc['levels'][str(i)] = 3 self.doc['current_star'] += 3 config = ConfigTowerLevel.get(i) drop = config.get_star_reward(3) for _id, _amount in drop: if _id in drops: drops[_id] += _amount else: drops[_id] = _amount turntable = config.get_turntable() if turntable: if self.doc['current_star'] >= 9: got = random.choice(turntable['9']) self.doc['talents'].append(got) self.doc['current_star'] -= 9 elif self.doc['current_star'] >= 6: got = random.choice(turntable['6']) self.doc['talents'].append(got) self.doc['current_star'] -= 6 elif self.doc['current_star'] >= 3: got = random.choice(turntable['3']) self.doc['talents'].append(got) self.doc['current_star'] -= 3 goods = config.get_sale_goods() if goods: self.doc['goods'].append([goods[0], 0]) self.doc['goods'].append([goods[1], 0]) self.doc['sweep_end_at'] = 0 updater['sweep_end_at'] = 0 updater['current_star'] = self.doc['current_star'] updater['talents'] = self.doc['talents'] updater['goods'] = self.doc['goods'] # 扫荡完下一关要可打 next_level = self.doc['max_star_level'] + 1 if next_level <= ConfigTowerLevel.MAX_LEVEL: self.doc['levels'][str(next_level)] = 0 updater['levels.{0}'.format(next_level)] = 0 self.set_today_max_star() total_star = self.get_total_current_star() if total_star > self.doc['history_max_star']: self.doc['history_max_star'] = total_star updater['history_max_star'] = total_star MongoTower.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': updater} ) resource_classified = ResourceClassification.classify(drops.items()) resource_classified.add(self.server_id, self.char_id, message="Tower.sweep_finish") self.send_notify(act=ACT_UPDATE) self.send_goods_notify() return resource_classified
def send_reward(self, goods_id): if goods_id == YUEKA_ID: # 月卡买了就立即发送 # 后面的再定时发送 config = ConfigPurchaseYueka.get(YUEKA_ID) got = 0 actual_got = 0 MongoPurchase.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'yueka_remained_days': 29, 'yueka_new': True }}) self.doc['yueka_remained_days'] = 29 self.doc['yueka_new'] = True rc = ResourceClassification.classify(config.rewards) attachment = rc.to_json() m = MailManager(self.server_id, self.char_id) m.add(config.mail_title, config.mail_content, attachment=attachment) else: config = ConfigPurchaseGoods.get(goods_id) got = config.diamond actual_got = config.diamond + config.diamond_extra if self.get_purchase_times() == 0: # 首充 actual_got = config.diamond * 2 + config.diamond_extra doc = MongoPurchaseLog.document() doc['_id'] = make_string_id() doc['char_id'] = self.char_id doc['goods_id'] = goods_id doc['got'] = got doc['actual_got'] = actual_got doc['timestamp'] = arrow.utcnow().timestamp MongoPurchaseLog.db(self.server_id).insert_one(doc) reward = [(VIP_EXP_ITEM_ID, config.vip_exp), (money_text_to_item_id('diamond'), actual_got)] rc = ResourceClassification.classify(reward) rc.add(self.server_id, self.char_id, message="Purchase.send_reward:{0}".format(goods_id)) purchase_done_signal.send( sender=None, server_id=self.server_id, char_id=self.char_id, goods_id=goods_id, got=got, actual_got=actual_got, ) self.send_notify()