diff --git a/.gitignore b/.gitignore index 52e4e61..ad198d9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ *.pyc *.pyo + +*.idea diff --git a/ev-tracker.py b/ev-tracker.py index 46fc034..83efa23 100755 --- a/ev-tracker.py +++ b/ev-tracker.py @@ -151,8 +151,19 @@ def _cmd_status(args): print pokemon.status() +def _cmd_set(args): + pokemon = _tracker.active + pokemon.set_ev(ev_stat=args.ev_stat, ev_value=args.ev_value) + print pokemon.evs + _save_tracker() + + def _cmd_update(args): - raise NotImplementedError('update command is not yet implemented.') + pokemon = _tracker.active + pokerus = args.pokerus if args.pokerus else pokemon.pokerus + pokemon.update(pokerus=pokerus, item=args.item) + print pokemon.status() + _save_tracker() def _cmd_battle(args): @@ -162,10 +173,8 @@ def _cmd_battle(args): else: pokemon = _tracker.get_pokemon(args.id) - pokemon.battle(species) - - print evs - print pokemon + pokemon.battle(species, number=args.number) + _save_tracker() def _cmd_release(args): @@ -216,13 +225,21 @@ def _build_parser(): status_parser.set_defaults(func=_cmd_status) update_parser = subparsers.add_parser('update', help='Update a tracked Pokemon\'s details') + update_parser.add_argument('--pokerus', '-p', action='store_true', help='Indicates the given Pokemon has Pokerus') + update_parser.add_argument('--item', '-i', help='Add an item to the active pokemon') update_parser.set_defaults(func=_cmd_update) battle_parser = subparsers.add_parser('battle', help='Record a battle for a tracked Pokemon') battle_parser.add_argument('species', help='Name of number of Pokemon species to battle') battle_parser.add_argument('--id', '-i', type=int) + battle_parser.add_argument('--number', '-n', type=int, default=1, help="Number of pokemon battles to record") battle_parser.set_defaults(func=_cmd_battle) + set_ev_parser = subparsers.add_parser('set', help='Set an EV value explicitly') + set_ev_parser.add_argument('ev_stat', help='Name of EV Stat to be explicitly set') + set_ev_parser.add_argument('ev_value', help='Value of EV to set Stat to') + set_ev_parser.set_defaults(func=_cmd_set) + release_parser = subparsers.add_parser('release', help='Stop tracking a Pokemon') release_parser.add_argument('id', type=int) release_parser.set_defaults(func=_cmd_release) diff --git a/pokemon.py b/pokemon.py index 89606cf..7d5714d 100644 --- a/pokemon.py +++ b/pokemon.py @@ -58,7 +58,7 @@ def __str__(self): return ', '.join(ev_string) def verbose(self): - ev_string = ['%s: %d' % (EvSet.label(stat), ev) for stat, ev in self.evs.items()] + ev_string = ['%s: %d' % (EvSet.label(stat), ev) for stat, ev in self.to_dict().items()] if not len(ev_string): return 'No EVs' return '\n'.join(ev_string) @@ -73,7 +73,6 @@ def to_dict(self): return dict - class Species(object): def __init__(self, id, name, evs=None): @@ -106,9 +105,6 @@ def __init__(self, id, species, name=None, item=None, pokerus=False, evs=None): name = property(lambda self: self.get_name(), lambda self, name: self.set_name(name)) - item = property(lambda self: self._item, - lambda self, item: self.set_item(item)) - def get_name(self): return self.species.name if self._name is None else self._name @@ -119,7 +115,13 @@ def set_name(self, name): def set_item(self, item): if item is not None and item not in ITEMS: raise ValueError("Invalid item '%s'" % item) - self._item = ITEMS[item] if item is not None else None + if item: + self.item = item + + def update_evs_for_item(self, evs): + if self.item: + evs = ITEMS[self.item](evs) + return evs def __str__(self): name = self.name @@ -143,18 +145,46 @@ def listing(self, active): padding = '* ' if self is active else ' ' return '%s%s' % (padding, self) - def battle(species, number=1): - ''' + def update(self, pokerus, item=None): + """ + Updates the active pokemon + :param pokerus: Set pokerus to True or False + :param item: give the pokemon an item + """ + self.pokerus = pokerus + if item: + self.set_item(item=item) + + def battle(self, species, number=1): + """ Alter's a tracked Pokemons EVs to simulate having battled a Species. These values are altered by pokerus and any item held. The EV increment can be multiplied by number to simulate multiple battles. - ''' + """ evs = species.evs.clone() if self.item is not None: - evs = self.item(evs) + evs = self.update_evs_for_item(evs) if self.pokerus: evs *= 2 - self.evs += evs * number + gained_evs = evs * number + if number > 1: + print "Battled {} x #{} {} \t {}".format(number, species.id, species.name, gained_evs) + else: + print "Battled #{} {} \t {}".format(species.id, species.name, gained_evs) + self.evs += gained_evs + + def set_ev(self, ev_stat, ev_value): + """ + Method to explicitly set an ev value from the command line. + Call structure: `ev set hp 134` would set the active pokemon's hp ev to 134 + :param ev_stat: The stat being explicitly set + :param ev_value: The value that should be set for the ev_stat + """ + if ev_stat not in self.evs.STATS: + raise AttributeError("{} is not an eligible ev stat".format(ev_stat)) + evs = self.evs.clone() + setattr(evs, ev_stat, int(ev_value)) + self.evs = evs def to_dict(self): return {'species': self.species.id, 'name': self._name,