Esempio n. 1
0
    def get_violations_on_item(self, item):
        violations = []
        if item.removed:
            violations.append(self._create_removed_item_violation(item))
        for vio in self._check_items_stat_conditions(item):
            violations.append(vio)
        if item.weird_conditions['light_set']:
            if not self.check_if_set_is_light():
                violation = Violation()
                violation.item_name = item.localized_name
                violation.stat_name = _("Set bonus < 2")
                violation.condition_type = 'weird_light_set'
                violation.is_red = True
                violation.cant_equip = False
                violations.append(violation)
        item_type_id = get_structure().get_type_id_by_name(item.type)
        repeat = self._get_repeat_violations(item_type_id)
        for vio in repeat:
            if vio.item_name == item.name:
                violations.append(vio)
#        shield = self._get_item_shield_violation(item)
#         for vio in shield:
#             if vio.item_name == item.name:
#                 violations.append(vio)
        return violations
Esempio n. 2
0
    def __init__(self, item):
        if item:
            structure = get_structure()
            self.item_added = True
            self.id = item.id
            self.name = item.name
            self.or_name = (item.or_name if item.or_name else item.name)
            self.type = structure.get_type_name_by_id(item.type)
            self.level = item.level
            self.set = item.set
            self.ankama_id = item.ankama_id
            self.ankama_type = item.ankama_type
            or_item = structure.get_or_item_by_name(item.name)
            if or_item:
                any_or_item = or_item[0]
                self.removed = any_or_item.removed
            else:
                self.removed = item.removed
#            self.is_one_handed = item.is_one_handed
            self.slot = None
            if get_supported_language() in item.localized_names:
                self.localized_name = item.localized_names[get_supported_language()]
            else:
                self.localized_name = or_item[0].localized_names[get_supported_language()]
            
            self.weird_conditions = item.weird_conditions
    
            self.stats = {}
            for stat_id, stat_value in item.stats:
                stat = structure.get_stat_by_id(stat_id)
                self.stats[stat.key] = stat_value
    
            self.min_stats_to_equip = {}
            for stat_id, stat_value in item.min_stats_to_equip:
                self.min_stats_to_equip[structure.get_stat_by_id(stat_id).key] = stat_value
            self.max_stats_to_equip = {}
            for stat_id, stat_value in item.max_stats_to_equip:
                self.max_stats_to_equip[structure.get_stat_by_id(stat_id).key] = stat_value
            
    
            localized_extras = item.localized_extras.get(get_supported_language())
            if localized_extras is None:
                localized_extras = ['[!] ' + line for line in item.localized_extras.get('en', [])]
            self.extras = localized_extras
    
            if self.type == 'Weapon':
                # Just copy?
                weapon = structure.get_weapon_by_name(self.name)
                self.is_mageable = weapon.is_mageable
                self.non_crit_hits = weapon.non_crit_hits
                self.crit_hits = weapon.crit_hits
                self.crit_bonus = weapon.crit_bonus
                self.crit_chance = weapon.crit_chance_percent
                self.ap = weapon.ap
                self.weapon_type = structure.get_weapon_type_by_id(weapon.weapon_type).name
        else:
            self.name = 'NoItem'
            self.id = None
            self.localized_name = None
            self.item_added = False
Esempio n. 3
0
 def _get_min_violations(self, min_stats):
     violations = []
     s = get_structure()
     for stat_key, min_val in min_stats.iteritems():
         if stat_key != 'adv_mins':
             if self.stats_total[stat_key] < min_val:
                 stat_name = _(s.get_stat_by_key(stat_key).name)
                 violation = Violation()
                 violation.item_name = _('project')
                 violation.stat_name = stat_name
                 violation.stat_value = min_val
                 violation.condition_type = 'min_eq'
                 violation.cant_equip = False
                 violations.append(violation)
         else: 
             composite_mins = s.get_adv_mins() 
             for stat in composite_mins:
                 if stat['key'] in min_val:
                     char_stat = 0
                     for attribute in stat['stats']:
                         char_stat += self.stats_total[STAT_NAME_TO_KEY[attribute]]
                     if char_stat < min_val[stat['key']]:
                         violation = Violation()
                         violation.item_name = _('project')
                         violation.stat_name = stat['local_name']
                         violation.stat_value = min_val[stat['key']]
                         violation.condition_type = 'min_eq'
                         violation.cant_equip = False
                         violations.append(violation)
     return violations
Esempio n. 4
0
 def _check_items_stat_conditions(self, item_result):  
     violations = []
     s = get_structure()  
     if not item_result.item_added:
         return violations
     if item_result.min_stats_to_equip:
         for stat_key, value in item_result.min_stats_to_equip.iteritems():
             if self.stats_total[stat_key] < value:
                 stat_name = _(s.get_stat_by_key(stat_key).name)
                 violation = Violation()
                 violation.item_name = item_result.localized_name
                 violation.stat_name = stat_name
                 violation.stat_value = value
                 violation.is_red = True
                 violation.condition_type = 'min'
                 violation.cant_equip = False
                 violations.append(violation)
                 
     if item_result.max_stats_to_equip:
         for stat_key, value in item_result.max_stats_to_equip.iteritems():
             if self.stats_total[stat_key] > value:
                 stat_name = _(s.get_stat_by_key(stat_key).name)
                 violation = Violation()
                 violation.item_name = item_result.localized_name
                 violation.stat_name = stat_name
                 violation.stat_value = value
                 violation.is_red = True
                 violation.condition_type = 'max'
                 violation.cant_equip = False
                 violations.append(violation)
     return violations
Esempio n. 5
0
 def add_all_sets(self):
     self.sets = []
     structure = get_structure()
     items_of_set = Counter()
     for item in self.item_list:
         if item.item_added:
             items_of_set[item.set] += 1
     for set_number, number_of_items in items_of_set.iteritems():
         if set_number and number_of_items > 1:
             self._add_set(structure.get_set_by_id(set_number), number_of_items)
Esempio n. 6
0
 def __init__(self, item_set, number_of_items):
     structure = get_structure()
     self.name = item_set.name
     self.total_number_of_items = structure.get_number_of_items_in_set_by_id(item_set.id)
     self.number_of_items = number_of_items
     self.bonus_per_num_items = item_set.bonus_per_num_items
     self.items = []
     for item_id in item_set.items:
         item = structure.get_item_by_id(item_id)
         self.items.append(ModelResultItem(item))
     self.localized_name = item_set.localized_names[get_supported_language()]
Esempio n. 7
0
 def switch_item(self, item, slot):
     result_item = ModelResultItem(item)
     result_item.set_slot(slot)
     to_remove = None
     for candidate_item in self.item_list:
         if candidate_item.slot == slot:
             to_remove = candidate_item
             break
     self.items[SLOT_NAME_TO_TYPE.get(slot)].remove(to_remove)
     self.items[SLOT_NAME_TO_TYPE.get(slot)].append(result_item)
     self.item_list.remove(to_remove)
     self.item_list.append(result_item)
     s = get_structure()
     if not self._get_repeat_violations(s.get_type_id_by_name(SLOT_NAME_TO_TYPE.get(slot))):
         self.calculate_stats()
     return result_item
Esempio n. 8
0
 def get_stats_gear(self):
     if self.stats_gear is None:
         self.stats_gear = {}
         for stat in get_structure().get_stats_list():
             self.stats_gear[stat.key] = 0
         for result_item in self.item_list:
             if result_item.item_added:
                 for stat_key, stat_value in result_item.stats.iteritems():
                     self.stats_gear[stat_key] += stat_value
         for result_set in self.sets:
             for stat_key, stat_value in result_set.get_bonus().iteritems():
                 self.stats_gear[stat_key] += stat_value
         if self.input['options']['ap_exo']:
             self.stats_gear['ap'] += 1
         if 'range_exo' in self.input['options'] and self.input['options']['range_exo']:
             self.stats_gear['range'] += 1
         if self.input['options']['mp_exo'] == True:
             self.stats_gear['mp'] += 1
     return self.stats_gear
Esempio n. 9
0
def model_result_from_minimal(minimal):
    structure = get_structure()
    if hasattr(minimal, 'stats'):
        result = ModelResult(minimal.input, minimal.stats)
    else:
        result = ModelResult(minimal.input)
        
    for slot, item_id in minimal.item_per_slot.iteritems():
        if item_id is not None and structure.get_item_by_id(item_id):
            result.add_item_at_slot(structure.get_item_by_id(item_id), slot)
        else:
            result.add_item_at_slot(None, slot) 
    open_slots = []
    for slot in result.open_slots:
        open_slots.append(slot)
    for slot in open_slots:
        result.add_item_at_slot(None, slot) 
    result.calculate_stats()
    return result
Esempio n. 10
0
    def create_set_constraints(self):
        for item_set in self.sets_list:

            valid_items_in_set = []
            s = get_structure()
            for item in item_set.items:
                if not s.get_item_by_id(item).removed:
                    valid_items_in_set.append(item)
            restriction = self.problem.restriction_eq(
                0, [(1, 'x', item)
                    for item in valid_items_in_set] + [(-1, 's', item_set.id)])
            self.restrictions.first_set_constraints[
                item_set.name] = restriction

        for item_set in self.sets_list:
            restrictions_list = []
            for slot in xrange(1, 9):
                restriction = self.problem.restriction_lt_eq(
                    0, [(slot, 'ss', '%d_%d' % (item_set.id, slot + 1)),
                        (-1, 's', item_set.id)])
                restrictions_list.append(restriction)
            self.restrictions.second_presence_constraints[
                item_set.name] = restrictions_list

        for item_set in self.sets_list:
            restriction = self.problem.restriction_eq(
                1, [(1, 'ss', '%d_%d' % (item_set.id, slot + 1))
                    for slot in xrange(0, 9)])
            self.restrictions.third_set_constraints[
                item_set.name] = restriction

        for item_set in self.sets_list:
            restrictions_list = []
            for slot in xrange(0, 9):
                restriction = self.problem.restriction_lt_eq(
                    8 + slot, [(8, 'ss', '%d_%d' % (item_set.id, slot + 1)),
                               (1, 's', item_set.id)])
                restrictions_list.append(restriction)
            self.restrictions.fourth_set_constraints[
                item_set.name] = restrictions_list
Esempio n. 11
0
 def from_item_id_list(cls, item_id_list, input_, stats):
     structure = get_structure()
     
     # Determine locked slots that were honored. They might not have been if
     # the locked item is now removed, for example.
     locked_slots = {}
     item_id_list_left = list(item_id_list)
     for locked_slot, locked_id in input_['locked_equips'].iteritems():
         for variation in structure.get_items_by_or_id(locked_id):
             if variation.id in item_id_list_left:
                 item_id_list_left.remove(variation.id)
                 locked_slots[locked_slot] = locked_id
                 break
     
     item_per_slot = {}
     open_slots = set(SLOTS)
     for item_id in item_id_list:
         item = structure.get_item_by_id(item_id)
         item_type = structure.get_type_name_by_id(item.type)
     
         # Define slot
         slot = None
         for open_slot in open_slots:
             if locked_slots.get(open_slot, None) == item.id:
                 slot = open_slot
                 break
         if slot is None:
             slot = TYPE_NAME_TO_SLOT[item_type]
             slot_number = TYPE_NAME_TO_SLOT_NUMBER[item_type]
             if slot_number > 1:
                 for i in range(1, slot_number + 1):
                     candidate_slot = "%s%d" % (slot, i)
                     if (candidate_slot in open_slots
                         and not locked_slots.get(candidate_slot, None)):
                         slot = candidate_slot
                         break
                     
         item_per_slot[slot] = item.id
         open_slots.remove(slot)
     return cls(item_per_slot, {k: input_[k] for k in input_ if k in RELEVANT_INPUT}, stats)
Esempio n. 12
0
 def _get_repeat_violations(self, item_type_id):
     violations = []
     s = get_structure()
     item_type = s.get_type_name_by_id(item_type_id)
     if len(self.items[item_type]) > 1:
         dict_names = {}
         for item in self.items[item_type]:
             if item.item_added:
                 or_name = s.get_or_item_name(item.name)
                 dict_names.setdefault(or_name, []).append(item.name)
         for (name, occurrences) in dict_names.iteritems():
             if len(occurrences) > 1:
                 item_name = occurrences[0]
                 if (s.get_item_by_name(item_name).type == s.get_type_id_by_name('Dofus')
                     or s.get_item_by_name(item_name).set):
                     violation = Violation()
                     violation.is_red = True
                     violation.item_name = name
                     violation.condition_type = 'repeated'
                     violation.cant_equip = True
                     violations.append(violation)
     return violations
Esempio n. 13
0
 def get_stats_total(self): 
     if self.stats_total is None:
         self.stats_total = self.get_stats_gear().copy()
         structure = get_structure()
         main_stats = structure.get_main_stats_list()
         for stat in structure.get_stats_list():
             self.stats_total[stat.key] += self.input['base_stats_by_attr'].get(stat.name, 0)
             if stat in main_stats:
                 if hasattr(self, 'stats') and self.stats is not None:
                     self.stats_total[stat.key] += self.stats.get(stat.key, 0)
         self.stats_total['apres'] += self.stats_total['wis'] / 10
         self.stats_total['mpres'] += self.stats_total['wis'] / 10
         self.stats_total['apred'] += self.stats_total['wis'] / 10
         self.stats_total['mpred'] += self.stats_total['wis'] / 10
         self.stats_total['dodge'] += self.stats_total['agi'] / 10
         self.stats_total['lock'] += self.stats_total['agi'] / 10
         self.stats_total['pp'] += self.stats_total['cha'] / 10
         self.stats_total['pod'] += self.stats_total['str'] * 5
         self.stats_total['init'] += (self.stats_total['str']
                                      + self.stats_total['int']
                                      + self.stats_total['cha']
                                      + self.stats_total['agi'])
         self.stats_total['hp'] = self.stats_total['vit'] + self.input['char_level'] * 5 + 50 + self.stats_total['hp']
     return self.stats_total
Esempio n. 14
0
 def create_structure(self):
     self.structure = get_structure()
     self.items_list = self.structure.get_available_items_list()
     self.sets_list = self.structure.get_sets_list()
     self.stats_list = self.structure.get_stats_list()
     self.main_stats_list = self.structure.get_main_stats_list()