# Copyright 2014. Amazon Web Services, Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from boto.exception import JSONResponseError
import json
import requests
class GameController:
"""
This GameController hits the API Gateway to get game status json and stashed that json to be used to draw the board
"""
def __init__(self):
self.gameIdStr = ""
self.round = ""
self.it = ""
self.playerState = ["","","",""]
self.score = ["","","",""]
self.vehicles = [0, 1, 2, 3]
self.vehicleIdStr = ['white', 'red', 'blue', 'black']
def getRound(self):
return int(float(self.round))
def getIt(self):
return self.it
def getGameId(self):
return self.gameIdStr
def getScore(self, vehicleIdx):
return int(float(self.score[vehicleIdx]))
def getGameStatus(self):
"""
Calls API Gateway to get JSON representation of game status. All vehicles' x, y, facing, and score, and it
status, as well as the game ID and found
"""
api_url_base = ' https://game-api.iotracer.ninja/game/status'
headers = {'Content-Type': 'application/json'}
try:
response = requests.get(api_url_base, headers=headers)
if response.status_code == 200:
response_str = json.loads(response.content.decode('utf-8'))
if response_str is not None:
self.gameIdStr = response_str['gameid']
self.round = response_str['round']
for vehicleIdx in self.vehicles:
player_x = str(int(response_str['Scores'][vehicleIdx][self.vehicleIdStr[vehicleIdx]]['x']))
player_y = str(int(response_str['Scores'][vehicleIdx][self.vehicleIdStr[vehicleIdx]]['y']))
player_facing = response_str['Scores'][vehicleIdx][self.vehicleIdStr[vehicleIdx]]['facing']
player_it = str(response_str['Scores'][vehicleIdx][self.vehicleIdStr[vehicleIdx]]['it'])
player_score = str(response_str['Scores'][vehicleIdx][self.vehicleIdStr[vehicleIdx]]['score'])
self.score[vehicleIdx] = player_score
player_data = {}
player_data['x'] = player_x
player_data['y'] = player_y
player_data['facing'] = player_facing
player_data['it'] = player_it
player_data['score'] = player_score
self.playerState[vehicleIdx] = json.dumps(player_data)
else:
print('[!] Request Failed')
else:
return None
except JSONResponseError as jre:
return None
except IOError as ioe:
"""
eat any io errors
"""
return None
return None
def getVehicle(self, color):
"""
Gets the representation of the named (color) vehicle that was retrieved from the above API call
"""
idx = 0
for colors in self.vehicleIdStr:
if (color == self.vehicleIdStr[idx]):
return self.playerState[idx]
else:
idx = idx +1
def getImgNameIt(self, facing):
"""
Gets the name of the vehicle icon if it is 'it'
"""
return {
'E': '_east_it.png',
'W': '_west_it.png',
'N': '_north_it.png',
'S': '_south_it.png'
} [facing]
def getImgNameNoIt(self, facing):
"""
Gets the name of the vehicle icon if it is not 'it'
"""
return {
'E': '_east.png',
'W': '_west.png',
'N': '_north.png',
'S': '_south.png'
}[facing]
def getBoardState(self, blackVehicleState, blueVehicleState, whiteVehicleState, redVehicleState):
"""
Puts the state of the board into a list, putting a blank space for
spaces that are not occupied.
"""
strVals = ["One", "Two", "Three", "Four", "Five", "Six"]
# got my x's and y's mixed up on horizontal & vertical - sorry gang
blackVehicleState_x = blackVehicleState['y']
blackVehicleState_y = blackVehicleState['x']
blackVehicleDir = blackVehicleState['facing']
blackVehicleIt = blackVehicleState['it']
blueVehicleState_x = blueVehicleState['y']
blueVehicleState_y = blueVehicleState['x']
blueVehicleDir = blueVehicleState['facing']
blueVehicleIt = blueVehicleState['it']
whiteVehicleState_x = whiteVehicleState['y']
whiteVehicleState_y = whiteVehicleState['x']
whiteVehicleDir = whiteVehicleState['facing']
whiteVehicleIt = whiteVehicleState['it']
redVehicleState_x = redVehicleState['y']
redVehicleState_y = redVehicleState['x']
redVehicleDir = redVehicleState['facing']
redVehicleIt = redVehicleState['it']
blackVehicleSquareName = strVals[int(blackVehicleState_x)]+strVals[int(blackVehicleState_y)]
blueVehicleSquareName = strVals[int(blueVehicleState_x)] + strVals[int(blueVehicleState_y)]
whiteVehicleSquareName = strVals[int(whiteVehicleState_x)] + strVals[int(whiteVehicleState_y)]
redVehicleSquareName = strVals[int(redVehicleState_x)] + strVals[int(redVehicleState_y)]
squares = ["OneOne", "OneTwo", "OneThree", "OneFour", "OneFive", "OneSix", \
"TwoOne", "TwoTwo", "TwoThree", "TwoFour", "TwoFive", "TwoSix", \
"ThreeOne", "ThreeTwo", "ThreeThree", "ThreeFour", "ThreeFive", "ThreeSix", \
"FourOne", "FourTwo", "FourThree", "FourFour", "FourFive", "FourSix", \
"FiveOne", "FiveTwo", "FiveThree", "FiveFour", "FiveFive", "FiveSix", \
"SixOne", "SixTwo", "SixThree", "SixFour", "SixFive", "SixSix",]
state = []
for square in squares:
if square == blackVehicleSquareName:
if blackVehicleIt == 'True':
imgName = self.getImgNameIt(blackVehicleDir)
self.it = "Black"
else:
imgName = self.getImgNameNoIt(blackVehicleDir)
state.append('
')
else:
if square == blueVehicleSquareName:
if blueVehicleIt == 'True':
imgName = self.getImgNameIt(blueVehicleDir)
self.it = "Blue"
else:
imgName = self.getImgNameNoIt(blueVehicleDir)
state.append('
')
else:
if square == whiteVehicleSquareName:
if whiteVehicleIt == 'True':
self.it = "White"
imgName = self.getImgNameIt(whiteVehicleDir)
else:
imgName = self.getImgNameNoIt(whiteVehicleDir)
state.append('
')
else:
if square == redVehicleSquareName:
if redVehicleIt == 'True':
self.it = "Red"
imgName = self.getImgNameIt(redVehicleDir)
else:
imgName = self.getImgNameNoIt(redVehicleDir)
state.append('
')
else:
state.append(" ")
return state