def get_info(self): return { 'max_buy_times': GlobalConfig.value("PARTY_BUY_MAX_TIMES"), 'remained_create_times': self.get_remained_create_times(), 'remained_join_times': self.get_remained_join_times(), 'talent_id': self.doc['talent_id'], }
def record(self): ValueLogUnionExploreTimes(self.server_id, self.char_id).record() UnionExploreCD(self.server_id, self.char_id).set( GlobalConfig.value("UNION_EXPLORE_CD")) self.current_times += 1 self._calculate()
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 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 __init__(self, server_id, char_id): self.server_id = server_id self.char_id = char_id self.max_times = GlobalConfig.value("UNION_EXPLORE_TIMES") self.current_times = ValueLogUnionExploreTimes(server_id, char_id).count_of_today() self._calculate()
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 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 get_info(self): return { 'max_buy_times': GlobalConfig.value("PARTY_BUY_MAX_TIMES"), 'remained_create_times': self.get_remained_create_times(), 'remained_join_times': self.get_remained_join_times(), 'talent_id': self.doc['talent_id'], }
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 __init__(self, server_id, char_id): self.server_id = server_id self.char_id = char_id self.max_times = GlobalConfig.value("UNION_EXPLORE_TIMES") self.current_times = ValueLogUnionExploreTimes( server_id, char_id).count_of_today() self._calculate()
def get_reward(self): if self.doc['count'] < 1: raise GameException(ConfigErrorMessage.get_error_id("INVALID_OPERATE")) self.add_count(-1) item_id = GlobalConfig.value("PURCHASE_DAILY_REWARD_ITEM_ID") rc = ResourceClassification.classify(ConfigItemUse.get(item_id).using_result()) rc.add(self.server_id, self.char_id) return rc
def __init__(self, server_id, char_id): self.server_id = server_id self.char_id = char_id self.max_times = GlobalConfig.value("UNION_HARASS_TIMES") self.current_times = ValueLogUnionHarassTimes(server_id, char_id).count_of_today() self.current_buy_times = ValueLogUnionHarassBuyTimes(server_id, char_id).count_of_today() self.vip_max_buy_times = VIP(server_id, char_id).union_harass_buy_times self._calculate()
def auto_increase_product(cls, server_id): level_limit = GlobalConfig.value("TERRITORY_BUILDING_AUTO_INCREASE_LEVEL") level_condition = {'level': {'$gte': level_limit}} char_ids = Club.get_recent_login_char_ids(server_id, other_conditions=[level_condition]) char_ids = [i for i in char_ids] docs = MongoTerritory.db(server_id).find({'_id': {'$in': char_ids}}) for doc in docs: t = Territory(server_id, doc['_id'], doc) t.building_auto_increase_product()
def __init__(self, server_id, char_id): self.server_id = server_id self.char_id = char_id self.max_times = GlobalConfig.value("UNION_HARASS_TIMES") self.current_times = ValueLogUnionHarassTimes( server_id, char_id).count_of_today() self.current_buy_times = ValueLogUnionHarassBuyTimes( server_id, char_id).count_of_today() self.vip_max_buy_times = VIP(server_id, char_id).union_harass_buy_times self._calculate()
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 get_reward(self): if self.doc['count'] < 1: raise GameException( ConfigErrorMessage.get_error_id("INVALID_OPERATE")) self.add_count(-1) item_id = GlobalConfig.value("PURCHASE_DAILY_REWARD_ITEM_ID") rc = ResourceClassification.classify( ConfigItemUse.get(item_id).using_result()) rc.add(self.server_id, self.char_id) return rc
def auto_increase_product(cls, server_id): level_limit = GlobalConfig.value( "TERRITORY_BUILDING_AUTO_INCREASE_LEVEL") level_condition = {'level': {'$gte': level_limit}} char_ids = Club.get_recent_login_char_ids( server_id, other_conditions=[level_condition]) char_ids = [i for i in char_ids] docs = MongoTerritory.db(server_id).find({'_id': {'$in': char_ids}}) for doc in docs: t = Territory(server_id, doc['_id'], doc) t.building_auto_increase_product()
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 post(self, content): from core.club import get_club_property if self.CD(self.server_id, self.char_id).get_cd_seconds(): raise GameException(ConfigErrorMessage.get_error_id("CHAT_TOO_FAST")) if len(content) > 300: raise GameException(ConfigErrorMessage.get_error_id("CHAT_TOO_LARGE")) try: with self.LOCK(self.server_id, self.char_id).lock(3, 3): now = arrow.utcnow().timestamp message = { 'msg_id': make_string_id(), 'club_id': str(self.char_id), 'name': get_club_property(self.server_id, self.char_id, 'name'), 'content': content, 'post_at': now, 'approval': 0, 'last_update_at': now, } _data = self.make_notify_data(message=message) self.broadcast(_data) self.doc['value'].insert(0, message) if len(self.doc['value']) > 100: self.doc['value'].sort(key=lambda item: -item['last_update_at']) removed = self.doc['value'].pop(-1) remove_notify = self.REMOVE_NOTIFY() remove_notify.msg_id = removed['msg_id'] WinningChatApprovalMark(self.server_id, self.char_id, removed['msg_id']).delete() self.broadcast(MessageFactory.pack(remove_notify)) MongoCommon.db(self.server_id).update_one( {'_id': self.get_id()}, {'$set': { 'value': self.doc['value'] }} ) except LockTimeOut: raise GameException(ConfigErrorMessage.get_error_id("SERVER_BUSY")) self.CD(self.server_id, self.char_id).set(GlobalConfig.value("LEADERBOARD_CHAT_INTERVAL"))
def send_notify(self): notify = ActivityPurchaseDailyNotify() if self.doc['count'] > 0: status = ACTIVITY_REWARD else: if Purchase(self.server_id, self.char_id).get_purchase_info_of_day_shift(): status = ACTIVITY_COMPLETE else: status = ACTIVITY_DOING notify.status = status item_id = GlobalConfig.value("PURCHASE_DAILY_REWARD_ITEM_ID") rc = ResourceClassification.classify(ConfigItemUse.get(item_id).using_result()) notify.items.MergeFrom(rc.make_protomsg()) MessagePipe(self.char_id).put(msg=notify)
def send_notify(self): notify = ActivityPurchaseDailyNotify() if self.doc['count'] > 0: status = ACTIVITY_REWARD else: if Purchase(self.server_id, self.char_id).get_purchase_info_of_day_shift(): status = ACTIVITY_COMPLETE else: status = ACTIVITY_DOING notify.status = status item_id = GlobalConfig.value("PURCHASE_DAILY_REWARD_ITEM_ID") rc = ResourceClassification.classify( ConfigItemUse.get(item_id).using_result()) notify.items.MergeFrom(rc.make_protomsg()) MessagePipe(self.char_id).put(msg=notify)
def sweep(self): sweep_end_at = self.doc.get('sweep_end_at', 0) if sweep_end_at: raise GameException(ConfigErrorMessage.get_error_id("TOWER_ALREADY_IN_SWEEP")) levels_amount = self._sweep_check() end_at = arrow.utcnow().timestamp + levels_amount * GlobalConfig.value("TOWER_SWEEP_SECONDS_PER_LEVEL") self.doc['sweep_end_at'] = end_at MongoTower.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'sweep_end_at': end_at }} ) ValueLogTowerWinTimes(self.server_id, self.char_id).record(value=levels_amount) self.send_notify(act=ACT_UPDATE, levels=[])
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 __init__(self, server_id, char_id): self.server_id = server_id self.char_id = char_id self.is_active = Challenge(server_id, char_id).is_challenge_id_passed( GlobalConfig.value("PLUNDER_ACTIVE_CHALLENGE_ID")) self.doc = MongoPlunder.db(self.server_id).find_one( {'_id': self.char_id}) if not self.doc: self.doc = MongoPlunder.document() self.doc['_id'] = self.char_id self.doc['plunder_remained_times'] = PLUNDER_TIMES_INIT_TIMES MongoPlunder.db(self.server_id).insert_one(self.doc) _, today_daily_reward_info = self.get_daily_reward_info() if not today_daily_reward_info: # 可以清理数据 self.doc['daily_reward'] = {} MongoPlunder.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'daily_reward': {} }})
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 __init__(self, server_id, char_id): self.server_id = server_id self.char_id = char_id self.is_active = Challenge(server_id, char_id).is_challenge_id_passed( GlobalConfig.value("PLUNDER_ACTIVE_CHALLENGE_ID")) self.doc = MongoPlunder.db(self.server_id).find_one({'_id': self.char_id}) if not self.doc: self.doc = MongoPlunder.document() self.doc['_id'] = self.char_id self.doc['plunder_remained_times'] = PLUNDER_TIMES_INIT_TIMES MongoPlunder.db(self.server_id).insert_one(self.doc) _, today_daily_reward_info = self.get_daily_reward_info() if not today_daily_reward_info: # 可以清理数据 self.doc['daily_reward'] = {} MongoPlunder.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'daily_reward': {} }} )
def set_search_cd(self): cd = GlobalConfig.value("PLUNDER_SEARCH_CD") PlunderSearchCD(self.server_id, self.char_id).set(cd)
def record(self): ValueLogUnionExploreTimes(self.server_id, self.char_id).record() UnionExploreCD(self.server_id, self.char_id).set(GlobalConfig.value("UNION_EXPLORE_CD")) self.current_times += 1 self._calculate()
def normal_chat(self, channel, text): from tasks import world char_doc = MongoCharacter.db(self.server_id).find_one( {'_id': self.char_id}, {'name': 1, 'vip': 1, 'level': 1} ) union_id = 0 if channel == CHAT_CHANNEL_PUBLIC: if char_doc['level'] < GlobalConfig.value("CHAT_LEVEL_LIMIT"): raise GameException(ConfigErrorMessage.get_error_id("CHAT_LEVEL_NOT_ENOUGH")) if ChatCD(self.server_id, self.char_id).get_cd_seconds(): raise GameException(ConfigErrorMessage.get_error_id("CHAT_TOO_FAST")) if len(text) > CHAT_MAX_SIZE: raise GameException(ConfigErrorMessage.get_error_id("CHAT_TOO_LARGE")) ChatCD(self.server_id, self.char_id).set(GlobalConfig.value("CHAT_CD")) elif channel == CHAT_CHANNEL_UNION: union_id = Union(self.server_id, self.char_id).get_joined_union_id() if not union_id: raise GameException(ConfigErrorMessage.get_error_id("UNION_CHAT_NO_UNION")) else: raise GameException(ConfigErrorMessage.get_error_id("BAD_MESSAGE")) # 创建一个消息 msg = ChatMessage() msg.channel = channel msg.club.id = str(self.char_id) msg.club.name = char_doc['name'] msg.club.vip = VIP(self.server_id, self.char_id).level msg.msg = text data = base64.b64encode(msg.SerializeToString()) # 立即通知自己 notify = ChatNotify() notify.act = ACT_UPDATE notify_msg = notify.msgs.add() notify_msg.MergeFrom(msg) notify_bin = MessageFactory.pack(notify) MessagePipe(self.char_id).put(data=notify_bin) # 放入公共空间,让后面登陆的人都能看到 # 等于离线消息 if channel == CHAT_CHANNEL_PUBLIC: CommonPublicChat(self.server_id).push(data, slice_amount=20) # 给其他人广播通知 arg = { 'server_id': self.server_id, 'exclude_chars': [self.char_id], 'data': MessageFactory.pack(notify) } payload = cPickle.dumps(arg) world.broadcast(payload=payload) else: CommonUnionChat(self.server_id, union_id).push(data, slice_amount=20) arg = { 'server_id': self.server_id, 'exclude_chars': [self.char_id], 'data': MessageFactory.pack(notify), 'char_id': self.char_id } payload = cPickle.dumps(arg) world.broadcast_union_chat(payload=payload) chat_signal.send( sender=None, server_id=self.server_id, char_id=self.char_id )
def get_result(self): if not self.doc['item_id']: raise GameException(ConfigErrorMessage.get_error_id("SPECIAL_EQUIPMENT_NOT_IN_PROCESS")) if arrow.utcnow().timestamp < self.doc['finish_at']: raise GameException(ConfigErrorMessage.get_error_id("SPECIAL_EQUIPMENT_NOT_FINISH")) tp = self.doc['tp'] score = self.doc['score'][str(tp)] growing = ConfigEquipmentSpecialScoreToGrowing.get_random_growing_by_score(tp, score) config_generate = ConfigEquipmentSpecialGenerate.get(self.doc['item_id']) if tp == SPECIAL_EQUIPMENT_GENERATE_NORMAL: equip_id = random.choice(config_generate.normal_generate) if growing >= GlobalConfig.value("EQUIPMENT_SPECIAL_NORMAL_SCORE_RESET_AT"): new_score = 0 else: new_score = score + 1 else: equip_id = random.choice(config_generate.advance_generate) if growing >= GlobalConfig.value("EQUIPMENT_SPECIAL_ADVANCE_SCORE_RESET_AT"): new_score = 0 else: new_score = score + 1 config_property = ConfigEquipmentSpecialGrowingProperty.get_by_growing(growing) config_equipment = ConfigEquipmentSpecial.get(equip_id) properties = [] for k, v in PROPERTY_TO_NAME_MAP.iteritems(): if k in SPECIAL_EQUIPMENT_BASE_PROPERTY: continue if getattr(config_equipment, v, 0): properties.append(k) equip_properties = [] for _ in config_property.property_active_levels: p = random.choice(properties) equip_properties.append(p) equip_skills = [] for _ in config_property.skill_active_levels: s = random.choice(config_equipment.skills) equip_skills.append(s) equip_obj = Equipment.initialize_for_special(equip_id, self.doc['item_id'], tp, growing, equip_properties, equip_skills) bag = Bag(self.server_id, self.char_id) bag.add_equipment_object(equip_obj) self.doc['item_id'] = 0 self.doc['finish_at'] = 0 self.doc['tp'] = 0 self.doc['score'][str(tp)] = new_score MongoSpecialEquipment.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'item_id': 0, 'finish_at': 0, 'tp': 0, 'score.{0}'.format(tp): new_score }} ) ValueLogSpecialEquipmentGenerateTimes(self.server_id, self.char_id).record() self.send_notify() return equip_obj
def set_search_cd(self): cd = GlobalConfig.value("PLUNDER_SEARCH_CD") PlunderSearchCD(self.server_id, self.char_id).set(cd)
def search(self, check_cd=True, replace_search_index=None, send_notify=True): if check_cd and self.get_search_cd(): raise GameException(ConfigErrorMessage.get_error_id("PLUNDER_SEARCH_IN_CD")) def _query_real(_level_low, _level_high): _skip_char_ids = [_s['id'] for _s in self.doc['search']] _skip_char_ids.append(self.char_id) _condition = {'$and': [ {'_id': {'$nin': _skip_char_ids}}, {'level': {'$gte': _level_low}}, {'level': {'$lte': _level_high}} ]} _docs = MongoCharacter.db(self.server_id).find(_condition, {'_id': 1}) _ids = [] for _doc in _docs: _ids.append(_doc['_id']) return _ids self_club_level = get_club_property(self.server_id, self.char_id, 'level') level_low = self_club_level - GlobalConfig.value("PLUNDER_SEARCH_LEVEL_RANGE_LOW") level_high = self_club_level + GlobalConfig.value("PLUNDER_SEARCH_LEVEL_RANGE_HIGH") real_ids = _query_real(level_low, level_high) # filter by active and loss_percent condition = {'$and': [ {'_id': {'$in': real_ids}}, {'active': True}, {'loss_percent': {'$lt': PLUNDER_MAX_LOST}} ]} docs = MongoPlunder.db(self.server_id).find(condition, {'_id': 1}) result_ids = [] for doc in docs: if PlunderMatchCD(self.server_id, self.char_id, doc['_id']).get_cd_seconds(): continue result_ids.append(doc['_id']) random.shuffle(result_ids) search_docs = [] for i in result_ids: search_docs.append({'id': i, 'spied': False}) if len(search_docs) == 2: break need_npc_amount = 2 - len(search_docs) if need_npc_amount: for i in range(need_npc_amount): config_plunder_npc = ConfigPlunderNPC.get_by_level(self_club_level) npc_doc = config_plunder_npc.to_doc(self.doc['level']) search_docs.append(npc_doc) if replace_search_index: self.doc['search'][replace_search_index] = search_docs[0] updater = { 'search.{0}'.format(replace_search_index): self.doc['search'][replace_search_index] } else: self.doc['search'] = search_docs updater = {'search': search_docs} MongoPlunder.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': updater} ) if check_cd: self.set_search_cd() if send_notify: self.send_search_notify()
def plunder_start(self, _id, tp, formation_slots=None, win=None): if tp not in [PLUNDER_TYPE_PLUNDER, PLUNDER_TYPE_REVENGE]: raise GameException(ConfigErrorMessage.get_error_id("BAD_MESSAGE")) for i in [0, 1, 2]: if self.doc['matching']['result'][i] == 0: way = i + 1 break else: # 都打完了 raise GameException(ConfigErrorMessage.get_error_id("PLUNDER_MATCH_ALL_FINISHED")) target_id = self.doc['matching']['id'] if not target_id: if tp == PLUNDER_TYPE_PLUNDER: _index = self.find_search_target_index_by_target_id(_id) target_id = self.doc['search'][_index]['id'] else: _index = self.find_revenge_target_index_by_target_id(_id) target_id = self.doc['revenge_list'][_index][0] else: # 要保证target_id 一样 if str(target_id) != _id: raise GameException(ConfigErrorMessage.get_error_id("PLUNDER_TARGET_ID_NOT_SAME")) updater = {} if not self.doc['matching']['id']: self.doc['matching']['id'] = target_id self.doc['matching']['tp'] = tp updater['matching.id'] = target_id updater['matching.tp'] = tp if way == 1: # 开始的第一路,这时候要判断次数 if tp == PLUNDER_TYPE_PLUNDER: if not self.doc['plunder_remained_times']: self.buy_plunder_times() PlunderMatchCD(self.server_id, self.char_id, target_id).set(GlobalConfig.value("PLUNDER_MATCH_CD")) else: if not self.get_revenge_remained_times(): raise GameException(ConfigErrorMessage.get_error_id("PLUNDER_REVENGE_NO_TIMES")) self.send_revenge_notify() if updater: MongoPlunder.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': updater} ) if win is not None: self.plunder_report(way, win) return None my_way = self.get_way_object(way) if formation_slots: my_way.sync_slots(formation_slots) my_way.load_formation_staffs() self.send_formation_notify() my_club = Club(self.server_id, self.char_id, load_staffs=False) my_club.formation_staffs = my_way.formation_staffs match = ClubMatch(my_club, None, 3, my_way.get_skill_sequence(), {}) msg = match.start(auto_load_staffs=False) msg.key = str(way) msg.map_name = GlobalConfig.value_string("MATCH_MAP_PLUNDER") return msg
def get_result(self): if not self.doc['item_id']: raise GameException( ConfigErrorMessage.get_error_id( "SPECIAL_EQUIPMENT_NOT_IN_PROCESS")) if arrow.utcnow().timestamp < self.doc['finish_at']: raise GameException( ConfigErrorMessage.get_error_id( "SPECIAL_EQUIPMENT_NOT_FINISH")) tp = self.doc['tp'] score = self.doc['score'][str(tp)] growing = ConfigEquipmentSpecialScoreToGrowing.get_random_growing_by_score( tp, score) config_generate = ConfigEquipmentSpecialGenerate.get( self.doc['item_id']) if tp == SPECIAL_EQUIPMENT_GENERATE_NORMAL: equip_id = random.choice(config_generate.normal_generate) if growing >= GlobalConfig.value( "EQUIPMENT_SPECIAL_NORMAL_SCORE_RESET_AT"): new_score = 0 else: new_score = score + 1 else: equip_id = random.choice(config_generate.advance_generate) if growing >= GlobalConfig.value( "EQUIPMENT_SPECIAL_ADVANCE_SCORE_RESET_AT"): new_score = 0 else: new_score = score + 1 config_property = ConfigEquipmentSpecialGrowingProperty.get_by_growing( growing) config_equipment = ConfigEquipmentSpecial.get(equip_id) properties = [] for k, v in PROPERTY_TO_NAME_MAP.iteritems(): if k in SPECIAL_EQUIPMENT_BASE_PROPERTY: continue if getattr(config_equipment, v, 0): properties.append(k) equip_properties = [] for _ in config_property.property_active_levels: p = random.choice(properties) equip_properties.append(p) equip_skills = [] for _ in config_property.skill_active_levels: s = random.choice(config_equipment.skills) equip_skills.append(s) equip_obj = Equipment.initialize_for_special(equip_id, self.doc['item_id'], tp, growing, equip_properties, equip_skills) bag = Bag(self.server_id, self.char_id) bag.add_equipment_object(equip_obj) self.doc['item_id'] = 0 self.doc['finish_at'] = 0 self.doc['tp'] = 0 self.doc['score'][str(tp)] = new_score MongoSpecialEquipment.db(self.server_id).update_one( {'_id': self.char_id}, { '$set': { 'item_id': 0, 'finish_at': 0, 'tp': 0, 'score.{0}'.format(tp): new_score } }) ValueLogSpecialEquipmentGenerateTimes(self.server_id, self.char_id).record() self.send_notify() return equip_obj
def report(self, key, win): rival_id = key my_rank = self.get_current_rank() my_max_rank = self.get_max_rank() doc = MongoArena.db(self.server_id).find_one( {'_id': str(self.char_id)}, { 'search_index': 1, 'continue_win': 1, } ) ArenaRefreshCD(self.server_id, self.char_id).clean() ArenaMatchCD(self.server_id, self.char_id, rival_id).set(GlobalConfig.value("ARENA_MATCH_CD")) config_search = ConfigArenaSearchRange.get(doc['search_index']) if win: score_changed = config_search.score_win new_search_index = doc['search_index'] + 1 continue_win = doc.get('continue_win', 0) + 1 else: score_changed = -config_search.score_lose new_search_index = doc['search_index'] - 1 continue_win = 0 if new_search_index > ConfigArenaSearchRange.MAX_INDEX: new_search_index = ConfigArenaSearchRange.MAX_INDEX if new_search_index < 0: new_search_index = 0 MongoArena.db(self.server_id).update_one( {'_id': str(self.char_id)}, { '$set': { 'search_index': new_search_index, 'rival': 0, 'continue_win': continue_win, }, '$inc': { 'match_times': 1, } } ) ass = ArenaScore(self.server_id, self.char_id) score_changed = ass.add_score(score_changed) new_rank = ass.rank max_rank_changed = False if new_rank > my_max_rank: my_max_rank = new_rank MongoArena.db(self.server_id).update_one( {'_id': str(self.char_id)}, {'$set': {'max_rank': new_rank}} ) max_rank_changed = True rank_changed = new_rank - my_rank rival_rank = Arena(self.server_id, rival_id).get_current_rank() if win: ValueLogArenaWinTimes(self.server_id, self.char_id).record() config_reward = ConfigArenaMatchReward.get(1) else: config_reward = ConfigArenaMatchReward.get(2) ValueLogArenaHonorPoints(self.server_id, self.char_id).record(value=config_reward.honor) ValueLogArenaMatchTimes(self.server_id, self.char_id).record() drop = config_reward.get_drop() resource_classified = ResourceClassification.classify(drop) resource_classified.add(self.server_id, self.char_id, message="Arena.report:{0}".format(win)) self.send_honor_notify() self.send_notify() arena_match_signal.send( sender=None, server_id=self.server_id, char_id=self.char_id, target_id=rival_id, target_name=ArenaClub(self.server_id, rival_id).name, my_rank=new_rank, target_rank=rival_rank, win=win, continue_win=continue_win, ) if max_rank_changed: task_condition_trig_signal.send( sender=None, server_id=self.server_id, char_id=self.char_id, condition_name='core.arena.Arena' ) WinningArena(self.server_id, self.char_id).set(win) return resource_classified, score_changed, -rank_changed, my_max_rank, new_rank, ass.score
def sweep(self, challenge_id, tp): # 扫荡 config = ConfigChallengeMatch.get(challenge_id) if not config: raise GameException(ConfigErrorMessage.get_error_id("CHALLENGE_NOT_EXIST")) doc = MongoChallenge.db(self.server_id).find_one( {'_id': self.char_id}, { 'challenge_star.{0}'.format(challenge_id): 1, 'challenge_drop.{0}'.format(challenge_id): 1, } ) star = doc['challenge_star'].get(str(challenge_id), None) if star is None: raise GameException(ConfigErrorMessage.get_error_id("CHALLENGE_NOT_OPEN")) if star != 3: raise GameException(ConfigErrorMessage.get_error_id("CHALLENGE_NOT_3_STAR")) if tp == CHALLENGE_SWEEP_TYPE_ONE: sweep_times = 1 else: sweep_times = 10 need_vip_level = GlobalConfig.value("CHALLENGE_SWEEP_10_VIP_LEVEL") VIP(self.server_id, self.char_id).check(need_vip_level) rt = RemainedTimes(self.server_id, self.char_id, challenge_id) if not rt.remained_match_times: raise GameException(ConfigErrorMessage.get_error_id("CHALLENGE_WITHOUT_TIMES")) # 剩余次数限制 if rt.remained_match_times < sweep_times: sweep_times = rt.remained_match_times # 体力限制 en = Energy(self.server_id, self.char_id) # NOTE 要保证至少可以打一次! en.check(config.energy) current_energy_can_sweep_times = en.energy / config.energy if sweep_times > current_energy_can_sweep_times: sweep_times = current_energy_can_sweep_times en.remove(sweep_times * config.energy) drop_times = doc['challenge_drop'].get(str(challenge_id), {}) drops = {} resource_classified_list = [] for i in range(sweep_times): _drop = config.get_drop(drop_times) for _id, _amount in _drop: if _id in drops: drops[_id] += _amount else: drops[_id] = _amount resource_classified_list.append(ResourceClassification.classify(_drop)) MongoChallenge.db(self.server_id).update_one( {'_id': self.char_id}, {'$set': { 'challenge_drop.{0}'.format(challenge_id): drop_times }} ) ValueLogChallengeMatchTimes(self.server_id, self.char_id).record(sub_id=challenge_id, value=sweep_times) ValueLogAllChallengeWinTimes(self.server_id, self.char_id).record(value=sweep_times) resource_classified = ResourceClassification.classify(drops.items()) resource_classified.add(self.server_id, self.char_id, message="Challenge.sweep:{0}".format(challenge_id)) self.send_challenge_notify(ids=[challenge_id]) return resource_classified_list
def search(self, check_cd=True, replace_search_index=None, send_notify=True): if check_cd and self.get_search_cd(): raise GameException( ConfigErrorMessage.get_error_id("PLUNDER_SEARCH_IN_CD")) def _query_real(_level_low, _level_high): _skip_char_ids = [_s['id'] for _s in self.doc['search']] _skip_char_ids.append(self.char_id) _condition = { '$and': [{ '_id': { '$nin': _skip_char_ids } }, { 'level': { '$gte': _level_low } }, { 'level': { '$lte': _level_high } }] } _docs = MongoCharacter.db(self.server_id).find( _condition, {'_id': 1}) _ids = [] for _doc in _docs: _ids.append(_doc['_id']) return _ids self_club_level = get_club_property(self.server_id, self.char_id, 'level') level_low = self_club_level - GlobalConfig.value( "PLUNDER_SEARCH_LEVEL_RANGE_LOW") level_high = self_club_level + GlobalConfig.value( "PLUNDER_SEARCH_LEVEL_RANGE_HIGH") real_ids = _query_real(level_low, level_high) # filter by active and loss_percent condition = { '$and': [{ '_id': { '$in': real_ids } }, { 'active': True }, { 'loss_percent': { '$lt': PLUNDER_MAX_LOST } }] } docs = MongoPlunder.db(self.server_id).find(condition, {'_id': 1}) result_ids = [] for doc in docs: if PlunderMatchCD(self.server_id, self.char_id, doc['_id']).get_cd_seconds(): continue result_ids.append(doc['_id']) random.shuffle(result_ids) search_docs = [] for i in result_ids: search_docs.append({'id': i, 'spied': False}) if len(search_docs) == 2: break need_npc_amount = 2 - len(search_docs) if need_npc_amount: for i in range(need_npc_amount): config_plunder_npc = ConfigPlunderNPC.get_by_level( self_club_level) npc_doc = config_plunder_npc.to_doc(self.doc['level']) search_docs.append(npc_doc) if replace_search_index: self.doc['search'][replace_search_index] = search_docs[0] updater = { 'search.{0}'.format(replace_search_index): self.doc['search'][replace_search_index] } else: self.doc['search'] = search_docs updater = {'search': search_docs} MongoPlunder.db(self.server_id).update_one({'_id': self.char_id}, {'$set': updater}) if check_cd: self.set_search_cd() if send_notify: self.send_search_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 plunder_start(self, _id, tp, formation_slots=None, win=None): if tp not in [PLUNDER_TYPE_PLUNDER, PLUNDER_TYPE_REVENGE]: raise GameException(ConfigErrorMessage.get_error_id("BAD_MESSAGE")) for i in [0, 1, 2]: if self.doc['matching']['result'][i] == 0: way = i + 1 break else: # 都打完了 raise GameException( ConfigErrorMessage.get_error_id("PLUNDER_MATCH_ALL_FINISHED")) target_id = self.doc['matching']['id'] if not target_id: if tp == PLUNDER_TYPE_PLUNDER: _index = self.find_search_target_index_by_target_id(_id) target_id = self.doc['search'][_index]['id'] else: _index = self.find_revenge_target_index_by_target_id(_id) target_id = self.doc['revenge_list'][_index][0] else: # 要保证target_id 一样 if str(target_id) != _id: raise GameException( ConfigErrorMessage.get_error_id( "PLUNDER_TARGET_ID_NOT_SAME")) updater = {} if not self.doc['matching']['id']: self.doc['matching']['id'] = target_id self.doc['matching']['tp'] = tp updater['matching.id'] = target_id updater['matching.tp'] = tp if way == 1: # 开始的第一路,这时候要判断次数 if tp == PLUNDER_TYPE_PLUNDER: if not self.doc['plunder_remained_times']: self.buy_plunder_times() PlunderMatchCD(self.server_id, self.char_id, target_id).set( GlobalConfig.value("PLUNDER_MATCH_CD")) else: if not self.get_revenge_remained_times(): raise GameException( ConfigErrorMessage.get_error_id( "PLUNDER_REVENGE_NO_TIMES")) self.send_revenge_notify() if updater: MongoPlunder.db(self.server_id).update_one({'_id': self.char_id}, {'$set': updater}) if win is not None: self.plunder_report(way, win) return None my_way = self.get_way_object(way) if formation_slots: my_way.sync_slots(formation_slots) my_way.load_formation_staffs() self.send_formation_notify() my_club = Club(self.server_id, self.char_id, load_staffs=False) my_club.formation_staffs = my_way.formation_staffs match = ClubMatch(my_club, None, 3, my_way.get_skill_sequence(), {}) msg = match.start(auto_load_staffs=False) msg.key = str(way) msg.map_name = GlobalConfig.value_string("MATCH_MAP_PLUNDER") return msg
def report(self, key, win): rival_id = key my_rank = self.get_current_rank() my_max_rank = self.get_max_rank() doc = MongoArena.db(self.server_id).find_one( {'_id': str(self.char_id)}, { 'search_index': 1, 'continue_win': 1, }) ArenaRefreshCD(self.server_id, self.char_id).clean() ArenaMatchCD(self.server_id, self.char_id, rival_id).set(GlobalConfig.value("ARENA_MATCH_CD")) config_search = ConfigArenaSearchRange.get(doc['search_index']) if win: score_changed = config_search.score_win new_search_index = doc['search_index'] + 1 continue_win = doc.get('continue_win', 0) + 1 else: score_changed = -config_search.score_lose new_search_index = doc['search_index'] - 1 continue_win = 0 if new_search_index > ConfigArenaSearchRange.MAX_INDEX: new_search_index = ConfigArenaSearchRange.MAX_INDEX if new_search_index < 0: new_search_index = 0 MongoArena.db(self.server_id).update_one({'_id': str(self.char_id)}, { '$set': { 'search_index': new_search_index, 'rival': 0, 'continue_win': continue_win, }, '$inc': { 'match_times': 1, } }) ass = ArenaScore(self.server_id, self.char_id) score_changed = ass.add_score(score_changed) new_rank = ass.rank max_rank_changed = False if new_rank > my_max_rank: my_max_rank = new_rank MongoArena.db(self.server_id).update_one( {'_id': str(self.char_id)}, {'$set': { 'max_rank': new_rank }}) max_rank_changed = True rank_changed = new_rank - my_rank rival_rank = Arena(self.server_id, rival_id).get_current_rank() if win: ValueLogArenaWinTimes(self.server_id, self.char_id).record() config_reward = ConfigArenaMatchReward.get(1) else: config_reward = ConfigArenaMatchReward.get(2) ValueLogArenaHonorPoints( self.server_id, self.char_id).record(value=config_reward.honor) ValueLogArenaMatchTimes(self.server_id, self.char_id).record() drop = config_reward.get_drop() resource_classified = ResourceClassification.classify(drop) resource_classified.add(self.server_id, self.char_id, message="Arena.report:{0}".format(win)) self.send_honor_notify() self.send_notify() arena_match_signal.send( sender=None, server_id=self.server_id, char_id=self.char_id, target_id=rival_id, target_name=ArenaClub(self.server_id, rival_id).name, my_rank=new_rank, target_rank=rival_rank, win=win, continue_win=continue_win, ) if max_rank_changed: task_condition_trig_signal.send(sender=None, server_id=self.server_id, char_id=self.char_id, condition_name='core.arena.Arena') WinningArena(self.server_id, self.char_id).set(win) return resource_classified, score_changed, -rank_changed, my_max_rank, new_rank, ass.score
APPLY_WEEKDAY = [ # 0, # 星期一 1, # 星期二 # 2, # 星期三 3, # 星期四 # 4, # 星期五 5, # 星期六 # 6, # 星期日 ] # 允许报名时间范围 hour, minute APPLY_TIME_RANGE = [(8, 0), (13, 30)] MATCH_SERVER_REQ_HEADERS = {'NMVC_APIRequest': 'StartCombat'} AUTO_APPLY_VIP_LEVEL = GlobalConfig.value("CHAMPIONSHIP_AUTO_APPLY_VIP_LEVEL") APPLY_CLUB_LEVEL_LIMIT = GlobalConfig.value("CHAMPIONSHIP_APPLY_LEVEL_LIMIT") def find_level_match_at(lv): today = get_start_time_of_today() weekday = today.weekday() days_shift = 0 while True: if weekday in APPLY_WEEKDAY: break weekday -= 1 if weekday < 0: weekday = 6