import cgi import webapp2 import random import time from google.appengine.api import users ##BEGIN POKEMON CLASSES & FUNCTIONS class pokemon(object): def __init__(self, name, pokemonType, health, moves, attack, defense, speed): self.name = name self.type = pokemonType self.health = health self.moves = moves self.attack = attack self.defense = defense self.speed = speed self.accuracy = 1 def isAlive(self): if self.health > 0: return True else: return False def useMove(self, opponent, move): chance = random.random() chance *= self.accuracy if chance > move.accuracy: return ['missed'] elif chance <= move.accuracy: #hit if type(move.effect) == list: if move.effect[0] == 'self': stat = move.effect[1] if stat == 'attack': self.attack *= move.effect[2] return ['hit', 'status', 'self', 'attack'] if stat == 'defense': self.defense *= move.effect[2] return ['hit', 'status', 'self', 'defense'] if stat == 'speed': self.speed *= move.effect[2] return ['hit', 'status', 'self', 'speed'] if stat == 'accuracy': self.accuracy *= move.effect[2] return ['hit', 'status', 'self', 'accuracy'] elif move.effect[0] == 'other': stat = move.effect[1] if stat == 'attack': opponent.active.attack *= move.effect[2] return ['hit', 'status', 'other', 'attack'] if stat == 'defense': opponent.active.attack *= move.effect[2] return ['hit', 'status', 'other', 'defense'] if stat == 'speed': opponent.active.attack *= move.effect[2] return ['hit', 'status', 'other', 'speed'] if stat == 'accuracy': return ['hit', 'status', 'other', 'accuracy'] elif move.effect == False: toReturn = ['hit', 'physical'] #apply attack and def stats dmgDone = ((float(move.damage) / opponent.active.defense) * self.attack) #critical hits critRate = self.speed * 100.0 / 512 critRate = 100 - critRate critRoll = random.random() if critRoll > critRate: toReturn.append('crit') dmgDone *= 2 elif critRoll < critRate: toReturn.append('noCrit') #check for super-effectiveness if isWeakTo(opponent.active, move): toReturn.append('super') dmgDone *= 2 if isStrongTo(opponent.active, move): toReturn.append('ineffective') dmgDone *= .5 else: toReturn.append('normal') opponent.active.health -= dmgDone toReturn.append(dmgDone) return toReturn class move(object): def __init__(self, name, moveType, damage, accuracy, effect=False): self.name = name self.type = moveType self.damage = damage self.accuracy = accuracy self.effect = effect class character(object): def __init__(self, name, roster): self.name = name self.roster = roster self.active = 'nothing' self.living = self.listLiving() self.alive = len(self.living) def checkLiving(self): self.alive = len(self.roster) for pokemon in self.roster: if not pokemon.isAlive(): self.alive -= 1 self.living = self.listLiving() if self.active != 'nothing': if self.active.health <= 0: print self.active.name, 'has died!' self.active = 'nothing' def hasActive(self): if self.active != 'nothing': return True else: return False def listLiving(self): living = [] for pokemon in self.roster: if pokemon.health > 0: living.append(pokemon) return living def printLiving(self): index = 0 for pokemon in self.living: print index, pokemon.name index += 1 def isWeakTo(pkmn, move): if pkmn.type in weakTo.keys(): if move.type in weakTo[pkmn.type]: return True else: return False def isStrongTo(pkmn, move): if pkmn.type in strongTo.keys(): if move.type in strongTo[pkmn.type]: return True else: return False def getHeroChoice(character): global gamePlaying character.checkLiving() if character.alive <= 0: print print print 'You have no more pokemon!' print 'You lose.' print print gamePlaying = False else: if character.hasActive(): while True: choice = raw_input('Do you want to (l)ist pokemon, (c)hange pokemon, or (u)se a move?') if choice == 'l': character.printLiving() elif choice == 'c': #SELECT A POKEMON index = 0 for pokemon in character.living: print index, ':', pokemon.name index += 1 while True: choice = raw_input('Choose a pokemon to play.') try: choice = int(choice) except ValueError: print 'Not a valid choice.' if choice in range(0, len(character.living)): print character.name, 'chose', character.living[choice].name return ['c', character.living[choice]] elif choice == 'u': #SELECT A MOVE index = 0 for move in character.active.moves: print index, move.name index += 1 while True: choice = raw_input('Choose a move to use. (1, 2, 3, or 4)') choice = int(choice) if choice in range(0, 4): return ['u', character.active.moves[choice]] else: print 'Not a valid choice' elif not character.hasActive(): #SELECT A POKEMON index = 0 for pokemon in character.living: print index, ':', pokemon.name index += 1 while True: choice = raw_input('Choose a pokemon to play.') try: choice = int(choice) except ValueError: print 'Not a valid choice' if choice in range(0, len(character.living)): print character.name, 'chose', character.living[choice].name return ['c', character.living[choice]] def getAntagChoice(character): global gamePlaying character.checkLiving() if character.alive <= 0: print print print 'Your opponent has no more pokemon!' print 'You win.' print print gamePlaying = False else: if character.hasActive(): moveRoll = random.randint(0, len(character.active.moves) - 1) return ['u', character.active.moves[moveRoll]] else: monsterRoll = random.randint(0, (len(character.living) - 1)) return ['c', character.living[monsterRoll]] ### END POKEMON CLASSES AND FUNCTIONS # BEGIN POKEMON DATA AND CLASS INSTANTIATIONS weakTo = {'fire': ['water'], 'water': ['grass'], 'grass': ['fire', 'flying'], 'normal': ['none']} strongTo = {'fire': ['grass'], 'water': ['fire'], 'grass': ['water', 'flying'], 'normal': ['none']} #Moves: Name, type, power, accuracy, effect[self/other, stat, amount]=False Tackle = move('tackle', 'normal', 50, .85) Ember = move('ember', 'fire', 40, 1) Bubble = move('bubble', 'water', 20, 1) Scratch = move('scratch', 'normal', 40, 1) Gust = move('gust', 'flying', 40, 1) Growl = move('growl', 'normal', 0, 1, ['other', 'attack', .5]) TailWhip = move('tail whip', 'normal', 0, 1, ['other', 'defense', .5]) SandAttack = move('sand attack', 'normal', 0, 1, ['other', 'accuracy', .5]) #Pokemon: Name, type, health, moves(list), attack, defense, speed AshPidgey = pokemon('Pidgey', 'flying', 40, [Tackle, Gust, SandAttack], 45, 40, 56) AshRattata = pokemon('Rattata', 'normal', 30, [Tackle, TailWhip], 56, 35, 72) AshCharmander = pokemon('Charmander', 'fire', 39, [Ember, Scratch, Growl], 52, 43, 65) ashRoster = [AshCharmander, AshPidgey, AshRattata] GaryPidgey = pokemon('Pidgey', 'flying', 40, [Tackle, Gust, SandAttack], 45, 40, 56) GaryRattata = pokemon('Rattata', 'normal', 30, [Tackle, TailWhip], 56, 35, 72) GarySquirtle = pokemon('Squirtle', 'water', 44, [Bubble, Tackle, TailWhip], 48, 65, 43) garyRoster = [GaryPidgey, GaryRattata, GarySquirtle] Ash = character('Ash', ashRoster) Gary = character('Gary', garyRoster) hero = Ash antag = Gary pokeList = [AshPidgey, AshRattata] ### END POKEMONE DATA AND CLASS INSTANTIATIONS ### BEGIN GOOGLE APP ENGINE HANDLER CLASSES #Selection variable determines which request is used. Can be 'main', 'change', 'use', or 'buffer' selection = '' class MainPage(webapp2.RequestHandler): def get(self): global selection hero.checkLiving() pokeIndex = 0 self.response.out.write("""""") self.response.out.write('Hello ') self.response.out.write(hero.name) self.response.out.write('
') self.response.out.write('Living pokemon: ') self.response.out.write(hero.alive) self.response.out.write('
') self.response.out.write('Your available pokemon:') self.response.out.write('
') selection = 'main' for pkmn in hero.living: self.response.out.write(pokeIndex) self.response.out.write(' ') self.response.out.write(pkmn.name) self.response.out.write('
') pokeIndex += 1 self.response.out.write('Choose a pokemon to play. (1, 2, or 3)') self.response.out.write("""
""") class ChangePage(webapp2.RequestHandler): def doMove(self, char, opponent, move): moveData = char.active.useMove(opponent, move) if moveData[0] == 'missed': self.response.out.write(char.active.name) self.response.out.write(' tried to use ') self.response.out.write(move.name) self.response.out.write(' but it missed.') self.response.out.write('
') if moveData[0] == 'hit': self.response.out.write(char.active.name) self.response.out.write(' used ') self.response.out.write(move.name) if moveData[1] == 'status': if moveData[2] == 'self': self.response.out.write("It's ") self.response.out.write(moveData[3]) self.response.out.write(' increases.') self.response.out.write('
') if moveData[2] == 'other': self.response.out.write('It lowered the ') self.response.out.write(moveData[3]) self.response.out.write(' of ') self.response.out.write(opponent.active.name) self.response.out.write('
') if moveData[1] == 'physical': if moveData[2] == 'crit': self.response.out.write('Crital hit!') self.response.out.write('
') if moveData[3] == 'super': self.response.out.write("It's super-effective!") self.response.out.write('
') if moveData[3] == 'ineffective': self.response.out.write("It's not very effective...") self.response.out.write('
') self.response.out.write('It does ') self.response.out.write(moveData[4]) self.response.out.write(' damage.') def post(self): global selction if selection == 'main': heroChoice = str(self.request.get('mainChoice')) if selection == 'buffer': heroChoice = str(self.request.get('bufferChoice')) hero.checkLiving() self.response.out.write('') self.response.out.write(hero.name) self.response.out.write('
') if hero.active != 'nothing': if hero.active.isAlive(): self.response.out.write('Your active pokemon is ') self.response.out.write(hero.active.name) self.response.out.write('
') self.response.out.write("It's health is: ") self.response.out.write(hero.active.health) self.response.out.write('
') if hero.alive <= 0: self.response.out.write('You lose!') self.response.out.write('
') elif antag.alive <= 0: self.response.out.write('You win!') self.response.out.write('
') else: EM = getAntagChoice(antag) if EM[0] == 'c': hero.active = hero.living[int(heroChoice)] self.response.out.write('You chose ') self.response.out.write(hero.active.name) self.response.out.write('
') antag.active = EM[1] self.response.out.write(antag.name) self.response.out.write(' chose ') self.response.out.write(antag.active.name) self.response.out.write('
') if EM[0] == 'u': hero.active = hero.living[int(heroChoice)] self.response.out.write('You chose ') self.response.out.write(hero.active.name) self.response.out.write('
') #antag does move EM[1] == a randomly selected move object self.doMove(antag, hero, EM[1]) hero.checkLiving() self.response.out.write('Your living pokemon: ') self.response.out.write(hero.alive) self.response.out.write('
') if hero.active != 'nothing': if hero.active.isAlive(): self.response.out.write('Your active pokemon is ') self.response.out.write(hero.active.name) self.response.out.write('
') self.response.out.write("It's health is: ") self.response.out.write(hero.active.health) self.response.out.write('
') if hero.alive <= 0: self.response.out.write('You lose!') self.response.out.write('
') elif antag.alive <= 0: self.response.out.write('You win!') self.response.out.write('
') else: #Ask to change pkmn or use move selection = 'change' self.response.out.write('Do you want to (c)hange pokemon or do you want to (u)se a move?') self.response.out.write("""
""") class BufferPage(webapp2.RequestHandler): def post(self): global selection if selection == 'change': chooseChoice = self.request.get('chooseChoice') if chooseChoice == 'c': self.response.out.write('') pokeIndex = 0 self.response.out.write('Select a pokemon.') for pkmn in hero.living: self.response.out.write('
') self.response.out.write(pokeIndex) self.response.out.write(' ') self.response.out.write(pkmn.name) self.response.out.write('
') pokeIndex += 1 selection = 'buffer' self.response.out.write("""
""") elif chooseChoice == 'u': self.response.out.write('') pokeIndex = 0 self.response.out.write('Select a move.') for move in hero.active.moves: self.response.out.write('
') self.response.out.write(pokeIndex) self.response.out.write(' ') self.response.out.write(move.name) self.response.out.write('
') pokeIndex += 1 selection = 'buffer' self.response.out.write("""
""") if selection == 'use': useChoice = self.request.get('useChoice') if useChoice == 'c': self.response.out.write('') pokeIndex = 0 self.response.out.write('Select a pokemon.') for pkmn in hero.living: self.response.out.write('
') self.response.out.write(pokeIndex) self.response.out.write(' ') self.response.out.write(pkmn.name) self.response.out.write('
') pokeIndex += 1 selection = 'buffer' self.response.out.write("""
""") elif useChoice == 'u': self.response.out.write('') pokeIndex = 0 self.response.out.write('Select a move.') for move in hero.active.moves: self.response.out.write('
') self.response.out.write(pokeIndex) self.response.out.write(' ') self.response.out.write(move.name) self.response.out.write('
') pokeIndex += 1 selection = 'buffer' self.response.out.write("""
""") class UsePage(webapp2.RequestHandler): def doMove(self, char, opponent, move): moveData = char.active.useMove(opponent, move) if moveData[0] == 'missed': self.response.out.write(char.active.name) self.response.out.write(' tried to use ') self.response.out.write(move.name) self.response.out.write(' but it missed.') self.response.out.write('
') if moveData[0] == 'hit': self.response.out.write(char.active.name) self.response.out.write(' used ') self.response.out.write(move.name) if moveData[1] == 'status': if moveData[2] == 'self': self.response.out.write("It's ") self.response.out.write(moveData[3]) self.response.out.write(' increases.') self.response.out.write('
') if moveData[2] == 'other': self.response.out.write('It lowered the ') self.response.out.write(moveData[3]) self.response.out.write(' of ') self.response.out.write(opponent.active.name) self.response.out.write('
') if moveData[1] == 'physical': if moveData[2] == 'crit': self.response.out.write('Crital hit!') self.response.out.write('
') if moveData[3] == 'super': self.response.out.write("It's super-effective!") self.response.out.write('
') if moveData[3] == 'ineffective': self.response.out.write("It's not very effective...") self.response.out.write('
') self.response.out.write('It does ') self.response.out.write(moveData[4]) self.response.out.write(' damage.') def post(self): global selection choice = str(self.request.get('bufferChoice')) choice = int(choice) moveChoice = hero.active.moves[choice] hero.checkLiving() self.response.out.write('') self.response.out.write(hero.name) self.response.out.write('
') if hero.active != 'nothing': if hero.active.isAlive(): self.response.out.write('Your active pokemon is ') self.response.out.write(hero.active.name) self.response.out.write('
') self.response.out.write("It's health is: ") self.response.out.write(hero.active.health) self.response.out.write('
') if hero.alive <= 0: self.response.out.write('You lose!') self.response.out.write('
') elif antag.alive <= 0: self.response.out.write('You win!') self.response.out.write('
') EM = getAntagChoice(antag) if EM[0] == 'c': antag.active = EM[1] self.response.out.write(antag.name) self.response.out.write(' chose ') self.response.out.write(antag.active.name) self.response.out.write('
') self.doMove(hero, antag, moveChoice) if EM[0] == 'u': if antag.active.speed > hero.active.speed: self.doMove(antag, hero, EM[1]) hero.checkLiving if hero.active.isAlive(): self.doMove(hero, antag, moveChoice) antag.checkLiving # if not antag.active.isAlive(): ### END GOOGLE APP ENGING HANDLER CLASSES app = webapp2.WSGIApplication([ ('/', MainPage), ('/buffer', BufferPage), ('/change', ChangePage), ('/use', UsePage) ], debug=True)