Ejemplo n.º 1
0
 def test_status_item_inactive(self):
     # Even when item is not set to active, ability statuses should be shown
     # like item is active
     # Setup
     effect1 = self.mkeffect(
         effect_id=EffectId.fighter_ability_attack_m,
         category_id=EffectCategoryId.active)
     effect2 = self.mkeffect(
         effect_id=EffectId.fighter_ability_microwarpdrive,
         category_id=EffectCategoryId.active)
     effect3 = self.mkeffect(
         effect_id=EffectId.fighter_ability_missiles,
         category_id=EffectCategoryId.active)
     fighter_type = self.mktype(
         effects=(effect1, effect2, effect3),
         default_effect=effect1,
         abilities_data={
             FighterAbilityId.pulse_cannon: AbilityData(0, math.inf),
             FighterAbilityId.microwarpdrive: AbilityData(60, math.inf),
             FighterAbilityId.heavy_rocket_salvo_em: AbilityData(0, 12)})
     fit = Fit()
     item = FighterSquad(fighter_type.id, state=State.online)
     fit.fighters.add(item)
     # Verification
     abilities = item.abilities
     self.assertEqual(len(abilities), 3)
     self.assertIs(abilities[FighterAbilityId.pulse_cannon], True)
     self.assertIs(abilities[FighterAbilityId.microwarpdrive], False)
     self.assertIs(abilities[FighterAbilityId.heavy_rocket_salvo_em], False)
     # Cleanup
     self.assert_solsys_buffers_empty(fit.solar_system)
     self.assert_log_entries(0)
Ejemplo n.º 2
0
 def test_ability_disabling_no_ability(self):
     # Setup
     src_attr = self.mkattr()
     tgt_attr = self.mkattr()
     modifier = self.mkmod(
         affectee_filter=ModAffecteeFilter.item,
         affectee_domain=ModDomain.self,
         affectee_attr_id=tgt_attr.id,
         operator=ModOperator.post_percent,
         affector_attr_id=src_attr.id)
     effect = self.mkeffect(
         effect_id=EffectId.fighter_ability_attack_m,
         category_id=EffectCategoryId.active,
         modifiers=[modifier])
     fighter_type = self.mktype(
         attrs={src_attr.id: 50, tgt_attr.id: 10},
         effects=[effect],
         default_effect=effect,
         abilities_data={
             FighterAbilityId.pulse_cannon: AbilityData(0, math.inf)})
     fit = Fit()
     item = FighterSquad(fighter_type.id, state=State.active)
     fit.fighters.add(item)
     self.assertAlmostEqual(item.attrs[tgt_attr.id], 15)
     # Verification
     with self.assertRaises(NoSuchAbilityError):
         item.set_ability_status(FighterAbilityId.beam_cannon, False)
     self.assertIs(item.abilities[FighterAbilityId.pulse_cannon], True)
     self.assertAlmostEqual(item.attrs[tgt_attr.id], 15)
     # Cleanup
     self.assert_solsys_buffers_empty(fit.solar_system)
     self.assert_log_entries(0)
Ejemplo n.º 3
0
 def test_ability_charges_zero(self):
     self.abilities_data = {FighterAbilityId.launch_bomb: AbilityData(0, 0)}
     fit = Fit()
     bomb_type = self.make_charge_type({
         AttrId.em_dmg: 52,
         AttrId.therm_dmg: 63,
         AttrId.kin_dmg: 74,
         AttrId.expl_dmg: 85
     })
     item = self.make_item({
         AttrId.fighter_ability_launch_bomb_type:
         bomb_type.id,
         AttrId.fighter_squadron_max_size:
         9
     })
     fit.fighters.add(item)
     # Verification
     volley = item.get_volley()
     self.assertAlmostEqual(volley.em, 0)
     self.assertAlmostEqual(volley.thermal, 0)
     self.assertAlmostEqual(volley.kinetic, 0)
     self.assertAlmostEqual(volley.explosive, 0)
     self.assertAlmostEqual(volley.total, 0)
     # Cleanup
     self.assert_solsys_buffers_empty(fit.solar_system)
     self.assert_log_entries(0)
Ejemplo n.º 4
0
 def setUp(self):
     StatsTestCase.setUp(self)
     self.mkattr(attr_id=AttrId.em_dmg)
     self.mkattr(attr_id=AttrId.therm_dmg)
     self.mkattr(attr_id=AttrId.kin_dmg)
     self.mkattr(attr_id=AttrId.expl_dmg)
     self.mkattr(attr_id=AttrId.dmg_mult)
     self.mkattr(attr_id=AttrId.volume)
     self.mkattr(attr_id=AttrId.capacity)
     self.mkattr(attr_id=AttrId.reload_time)
     self.mkattr(attr_id=AttrId.charge_rate)
     self.mkattr(attr_id=AttrId.fighter_ability_kamikaze_dmg_em)
     self.mkattr(attr_id=AttrId.fighter_ability_kamikaze_dmg_therm)
     self.mkattr(attr_id=AttrId.fighter_ability_kamikaze_dmg_kin)
     self.mkattr(attr_id=AttrId.fighter_ability_kamikaze_dmg_expl)
     cycle_attr = self.mkattr()
     effect_dd = self.mkeffect(effect_id=EffectId.projectile_fired,
                               category_id=EffectCategoryId.active,
                               duration_attr_id=cycle_attr.id)
     effect_suppressor = self.mkeffect(
         effect_id=EffectId.fighter_ability_kamikaze,
         category_id=EffectCategoryId.target,
         duration_attr_id=cycle_attr.id)
     item_dd = ModuleHigh(self.mktype(attrs={
         AttrId.dmg_mult: 2,
         AttrId.capacity: 1,
         AttrId.charge_rate: 1,
         cycle_attr.id: 2500,
         AttrId.reload_time: 2000
     },
                                      effects=[effect_dd],
                                      default_effect=effect_dd).id,
                          state=State.active)
     item_dd.charge = Charge(
         self.mktype(
             attrs={
                 AttrId.volume: 1.0,
                 AttrId.em_dmg: 1.2,
                 AttrId.therm_dmg: 2.4,
                 AttrId.kin_dmg: 4.8,
                 AttrId.expl_dmg: 9.6
             }).id)
     self.item_suppressor = FighterSquad(self.mktype(
         attrs={
             AttrId.fighter_ability_kamikaze_dmg_em: 50000,
             AttrId.fighter_ability_kamikaze_dmg_therm: 50000,
             AttrId.fighter_ability_kamikaze_dmg_kin: 50000,
             AttrId.fighter_ability_kamikaze_dmg_expl: 50000,
             AttrId.fighter_squadron_max_size: 6,
             cycle_attr.id: 10000
         },
         effects=[effect_suppressor],
         default_effect=effect_suppressor,
         abilities_data={
             FighterAbilityId.kamikaze: AbilityData(0, math.inf)
         }).id,
                                         state=State.active)
     self.fit.modules.high.append(item_dd)
     self.fit.fighters.add(self.item_suppressor)
Ejemplo n.º 5
0
 def setUp(self):
     ItemMixinTestCase.setUp(self)
     self.mkattr(attr_id=AttrId.em_dmg)
     self.mkattr(attr_id=AttrId.therm_dmg)
     self.mkattr(attr_id=AttrId.kin_dmg)
     self.mkattr(attr_id=AttrId.expl_dmg)
     self.mkattr(attr_id=AttrId.fighter_squadron_max_size)
     self.effect_item = self.mkeffect(
         effect_id=EffectId.fighter_ability_launch_bomb,
         category_id=EffectCategoryId.active)
     self.effect_charge = self.mkeffect(effect_id=EffectId.bomb_launching,
                                        category_id=EffectCategoryId.active)
     self.abilities_data = {FighterAbilityId.launch_bomb: AbilityData(0, 3)}
Ejemplo n.º 6
0
 def setUp(self):
     ItemMixinTestCase.setUp(self)
     self.mkattr(attr_id=AttrId.fighter_ability_attack_missile_dmg_mult)
     self.mkattr(attr_id=AttrId.fighter_ability_attack_missile_dmg_em)
     self.mkattr(attr_id=AttrId.fighter_ability_attack_missile_dmg_therm)
     self.mkattr(attr_id=AttrId.fighter_ability_attack_missile_dmg_kin)
     self.mkattr(attr_id=AttrId.fighter_ability_attack_missile_dmg_expl)
     self.mkattr(attr_id=AttrId.fighter_squadron_max_size)
     self.effect = self.mkeffect(
         effect_id=EffectId.fighter_ability_attack_m,
         category_id=EffectCategoryId.target)
     self.abilities_data = {
         FighterAbilityId.pulse_cannon: AbilityData(0, math.inf)
     }
Ejemplo n.º 7
0
 def setUp(self):
     ItemMixinTestCase.setUp(self)
     self.mkattr(attr_id=AttrId.fighter_ability_kamikaze_dmg_em)
     self.mkattr(attr_id=AttrId.fighter_ability_kamikaze_dmg_therm)
     self.mkattr(attr_id=AttrId.fighter_ability_kamikaze_dmg_kin)
     self.mkattr(attr_id=AttrId.fighter_ability_kamikaze_dmg_expl)
     self.mkattr(attr_id=AttrId.fighter_squadron_max_size)
     self.cycle_attr = self.mkattr()
     self.effect = self.mkeffect(
         effect_id=EffectId.fighter_ability_kamikaze,
         category_id=EffectCategoryId.target,
         duration_attr_id=self.cycle_attr.id)
     self.abilities_data = {
         FighterAbilityId.kamikaze: AbilityData(0, math.inf)}
Ejemplo n.º 8
0
 def setUp(self):
     ItemMixinTestCase.setUp(self)
     self.mkattr(attr_id=AttrId.fighter_ability_missiles_dmg_mult)
     self.mkattr(attr_id=AttrId.fighter_ability_missiles_dmg_em)
     self.mkattr(attr_id=AttrId.fighter_ability_missiles_dmg_therm)
     self.mkattr(attr_id=AttrId.fighter_ability_missiles_dmg_kin)
     self.mkattr(attr_id=AttrId.fighter_ability_missiles_dmg_expl)
     self.mkattr(attr_id=AttrId.fighter_squadron_max_size)
     self.cycle_attr = self.mkattr()
     self.effect = self.mkeffect(
         effect_id=EffectId.fighter_ability_missiles,
         category_id=EffectCategoryId.target,
         duration_attr_id=self.cycle_attr.id)
     self.abilities_data = {
         FighterAbilityId.heavy_rocket_salvo_em: AbilityData(0, 12)}
Ejemplo n.º 9
0
 def __type_decompress(self, type_data):
     """Reconstruct item type from python primitives."""
     default_effect_id = type_data[5]
     if default_effect_id is None:
         default_effect = None
     else:
         default_effect = self.get_effect(default_effect_id)
     return TypeFactory.make(
         type_id=type_data[0],
         group_id=type_data[1],
         category_id=type_data[2],
         attrs={k: v
                for k, v in type_data[3]},
         effects=tuple(self.get_effect(eid) for eid in type_data[4]),
         default_effect=default_effect,
         abilities_data={k: AbilityData(*v)
                         for k, v in type_data[6]})
Ejemplo n.º 10
0
 def test_ability_charges_zero(self):
     self.abilities_data = {
         FighterAbilityId.heavy_rocket_salvo_em: AbilityData(0, 0)}
     fit = Fit()
     item = self.make_item({
         AttrId.fighter_ability_attack_missile_dmg_mult: 2.5,
         AttrId.fighter_ability_attack_missile_dmg_em: 52,
         AttrId.fighter_ability_attack_missile_dmg_therm: 63,
         AttrId.fighter_ability_attack_missile_dmg_kin: 74,
         AttrId.fighter_ability_attack_missile_dmg_expl: 85,
         AttrId.fighter_squadron_max_size: 9})
     fit.fighters.add(item)
     # Verification
     volley = item.get_volley()
     self.assertAlmostEqual(volley.em, 0)
     self.assertAlmostEqual(volley.thermal, 0)
     self.assertAlmostEqual(volley.kinetic, 0)
     self.assertAlmostEqual(volley.explosive, 0)
     self.assertAlmostEqual(volley.total, 0)
     # Cleanup
     self.assert_solsys_buffers_empty(fit.solar_system)
     self.assert_log_entries(0)
Ejemplo n.º 11
0
    def run(data):
        """Convert data into eve objects.

        Args:
            data: Dictionary in {table name: {table, rows}} format.

        Returns:
            3 iterables, which contain types, attributes and effects.
        """
        # Before actually instantiating anything, we need to collect some data
        # in convenient form
        # Format: {group ID: group row}
        groups_keyed = {}
        for row in data['evegroups']:
            groups_keyed[row['groupID']] = row
        # Format: {type ID: default effect ID}
        types_defeff_map = {}
        for row in data['dgmtypeeffects']:
            if row.get('isDefault') is True:
                types_defeff_map[row['typeID']] = row['effectID']
        # Format: {type ID: {effect IDs}}
        types_effects = {}
        for row in data['dgmtypeeffects']:
            types_effects.setdefault(row['typeID'], set()).add(row['effectID'])
        # Format: {type ID: {attribute ID: value}}
        types_attrs = {}
        for row in data['dgmtypeattribs']:
            type_attrs = types_attrs.setdefault(row['typeID'], {})
            type_attrs[row['attributeID']] = row['value']
        # Format: {type ID: {ability ID: (cooldown, charge quantity)}}
        types_abilities_data = {}
        for row in data['typefighterabils']:
            type_id = row['typeID']
            type_abilities_data = types_abilities_data.setdefault(type_id, {})
            type_abilities_data[row['abilityID']] = AbilityData(
                cooldown_time=row.get('cooldownSeconds', 0),
                charge_quantity=row.get('chargeCount', math.inf))

        # Convert attributes
        attrs = []
        for row in data['dgmattribs']:
            attrs.append(
                Attribute(attr_id=row['attributeID'],
                          max_attr_id=row.get('maxAttributeID'),
                          default_value=row.get('defaultValue'),
                          high_is_good=row.get('highIsGood'),
                          stackable=row.get('stackable')))

        # Convert effects
        effects = []
        mod_builder = ModBuilder(data['dgmexpressions'])
        for row in data['dgmeffects']:
            modifiers, build_status = mod_builder.build(row)
            effects.append(
                Effect(
                    effect_id=row['effectID'],
                    category_id=row.get('effectCategory'),
                    is_offensive=row.get('isOffensive'),
                    is_assistance=row.get('isAssistance'),
                    duration_attr_id=row.get('durationAttributeID'),
                    discharge_attr_id=row.get('dischargeAttributeID'),
                    range_attr_id=row.get('rangeAttributeID'),
                    falloff_attr_id=row.get('falloffAttributeID'),
                    tracking_speed_attr_id=row.get('trackingSpeedAttributeID'),
                    fitting_usage_chance_attr_id=(
                        row.get('fittingUsageChanceAttributeID')),
                    resist_attr_id=row.get('resistanceID'),
                    build_status=build_status,
                    modifiers=tuple(modifiers)))

        # Convert types
        types = []
        effect_map = {e.id: e for e in effects}
        for row in data['evetypes']:
            type_id = row['typeID']
            type_group = row.get('groupID')
            type_effect_ids = types_effects.get(type_id, set())
            type_effect_ids.intersection_update(effect_map)
            types.append(
                Type(type_id=type_id,
                     group_id=type_group,
                     category_id=groups_keyed.get(type_group,
                                                  {}).get('categoryID'),
                     attrs=types_attrs.get(type_id, {}),
                     effects=tuple(effect_map[eid] for eid in type_effect_ids),
                     default_effect=effect_map.get(
                         types_defeff_map.get(type_id)),
                     abilities_data=types_abilities_data.get(type_id, {})))

        return types, attrs, effects