def join_island(request): try: q = request.GET #jEmail = q.__getitem__('email') jEmail = request.session['account'].email jIslandId = int(q.__getitem__('islandId')) query = Player.gql("WHERE email = :1 and islandId = :2",jEmail,jIslandId) if query.count() > 0: return redirect("/play?islandId="+str(jIslandId)) #change to play game else: island = Island.get_by_id(jIslandId) if island != None and island.numOfPlayer < island.maxNumOfPlayers: player = Player(email = jEmail,money_spent=0.0,money=1000000.0,islandId=jIslandId,networth=1000000.0) player.put() island.numOfPlayer = island.numOfPlayer + 1 island.put() return redirect("/play?islandId="+str(island.key().id())) else: return HttpResponse("error","text") #dd = {} #return HttpResponse(simplejson.dumps(dd),mimetype="application/json") except KeyError: return redirect("/") except ValueError: return "/app/error.html?error=ValueError"
def island_ranking(request): if request.session.__contains__('islandId') and request.session.__contains__('account'): islandId = int(request.session['islandId']) playerQuery = Player.gql("WHERE islandId = :1 ORDER BY networth DESC",islandId) players = playerQuery.fetch(10) results = [] for player in players: _playerDict = player.__dict__['_entity'] playerId = player.key().id() plantQuery = Plant.gql("WHERE playerId = :1",playerId) countPlant = plantQuery.count() _playerDict['numPlants'] = countPlant _playerDict['numShoes'] = 0 _playerDict['numWorkers'] = 0 plants = plantQuery.fetch(countPlant) for plant in plants: _playerDict['numWorkers'] += plant.numOfWorkers plantId = plant.key().id() shoeQuery = Shoe.gql("WHERE plantId = :1",plantId) shoes = shoeQuery.fetch(1000) for shoe in shoes: _playerDict['numShoes'] += shoe.qty results.append(_playerDict) return HttpResponse(simplejson.dumps(results),mimetype="application/json") else: dd = {} dd['error'] = "Error: No island selected. Please join or resume your game." return HttpResponse(simplejson.dumps(dd),mimetype="application/json")
def buy_plant(request): ''' Check user logged in Check playerId belongs to account Get max plant limit from island id Check player's plant count ''' if request.session.__contains__('account'): q = request.GET bPlayerId = int(q.__getitem__('playerId')) bIslandId = int(q.__getitem__('islandId')) bRegion = q.__getitem__('region') player = Player.get_by_id(bPlayerId) if player.email == request.session['account'].email: island = Island.get_by_id(bIslandId) if island != None: maxNumPlants = island.maxNumOfPlants plants = Plant.gql("WHERE playerId = :1 and islandId = :2",bPlayerId, bIslandId) if plants.count() < maxNumPlants: bPlant = Plant(playerId=bPlayerId,islandId=bIslandId,region=bRegion,cost=plant[bRegion][0],capacity=plant[bRegion][1],numOfWorkers = 0, workerCost=worker[bRegion][0],workerHealth = worker[bRegion][1],workerSkills=worker[bRegion][2],workerProductivity=worker[bRegion][3], currentCapacity = 0, productionLimit = 0) bPlant.put() player.money = player.money - plant[bRegion][0] player.money_spent = player.money_spent + plant[bRegion][0] player.put() return redirect("/app/main.html#/theworld")
def manufacture_shoe(request): ''' Check user login Check plantId, playerId, sole, body, color, sellprice, qty exist in querydict (request.GET) Check plantId belongs to account Check shoeId belongs to plant Get plant by plantId ''' if request.session.__contains__('account'): args = request.GET if args.__contains__('sole') and args.__contains__('body') and args.__contains__('color') and args.__contains__('playerId') and args.__contains__('plantId') and args.__contains__('sellprice') and args.__contains__('qty'): _sole = int(args.__getitem__('sole')) _body = int(args.__getitem__('body')) _color= int(args.__getitem__('color')) _qty= int(args.__getitem__('qty')) _sellprice = float(args.__getitem__('sellprice')) _plantId = int(args.__getitem__('plantId')) _playerId = int(args.__getitem__('playerId')) plant = Plant.get_by_id(_plantId) if plant != None and plant.playerId == _playerId: if _body < 10 or _sole < 10 or _color < 10: return HttpResponse("Minimum shoe body, sole and color is 10") player = Player.get_by_id(_playerId) _costPrice = _body * shoeMatCost['body'] + _sole * shoeMatCost['sole'] + _color * shoeMatCost['color'] _totalCost = _costPrice * _qty ##check if player has money hasMoney = (_totalCost <= player.money) ##has enough capacity hasCapacity = (_qty+plant.currentCapacity <= plant.productionLimit) if hasMoney == True and hasCapacity == True: shoe = Shoe(plantId = _plantId, sole = _sole, body = _body, color = _color, price = _sellprice, qty = _qty, costPrice = _costPrice) shoe.put() player.money -= _totalCost player.money_spent += _totalCost player.networth = player.money + player.money_spent player.put() plant.currentCapacity += _qty plant.put() supTrxn = SupplyTransaction(shoeId = shoe.key().id(), costPerUnit = _costPrice, qty = _qty, totalCost = _totalCost, trxnDate = datetime.datetime.now()) supTrxn.put() return redirect("/app/main.html#/theworld") elif hasMoney == False: return HttpResponse("not enough money") else: return HttpResponse("insufficient factory capacity") else: return HttpResponse("plant does not belong to player") else: return HttpResponse("value missing") else: return HttpResponse("Please Login.")
def buy_credits_fail(request): args = request.GET if args.__contains__('details'): d = args.__getitem__('details') dd = d.split(",") _playerId = int(dd[0]) _money = float(dd[1]) _cashAmt = float(dd[2]) player = Player.get_by_id(_playerId) ppTrxn = PayPalTransaction(email = player.email,cashAmt = _cashAmt, money = _money, status="ERROR",playerId = _playerId) ppTrxn.put() return HttpResponse("Fail") else: return HttpResponse("Not enough arguments")
def hire_worker(request): ''' Check user login Check plantId, numWorker, playerId exist in querydict (request.GET) Check plantId belongs to account Get plant by plantId ''' if request.session.__contains__('account'): args = request.GET if args.__contains__('numWorker') and args.__contains__('plantId') and args.__contains__('playerId'): try: playerId = int(args.__getitem__('playerId')) plantId = int(args.__getitem__('plantId')) numWorker = int(args.__getitem__('numWorker')) plant = Plant.get_by_id(plantId) if plant != None and plant.playerId == playerId: player = Player.get_by_id(playerId) region = plant.region workerCost = worker[region][0] totalHireCost = workerCost * numWorker if totalHireCost <= player.money: plant.numOfWorkers += numWorker capProd = int((1*plant.workerHealth) + (0.5*plant.workerSkills) + (0.75 * plant.workerProductivity) * 10 * plant.numOfWorkers) if capProd > plant.capacity: capProd = plant.capacity plant.productionLimit = capProd player.money = player.money - totalHireCost player.money_spent = player.money_spent + totalHireCost player.networth = player.money + player.money_spent plant.put() player.put() else: return redirect("/app/error.html?error=NotEnoughMoney") else: return redirect("/app/error.htmlerror=InvalidPlant") except ValueError: return redirect("/app/error.html?error=ValueError") else: return redirect("/app/error.html?error=NotEnoughArguments") else: return redirect("/") return redirect("/app/main.html#/theworld")
def load_player(request): session = request.session dd = {} #check necessary arguments if session.__contains__('islandId') == False: dd['error'] = "missing islandId" return HttpResponse(simplejson.dumps(dd),mimetype="application/json") if session.__contains__('account') == False: dd['error'] = "Error: Not logined." return HttpResponse(simplejson.dumps(dd),mimetype="application/json") email = session['account'].email islandId = session['islandId'] island = Island.get_by_id(islandId) player_q = Player.gql("WHERE email = :1 and islandId = :2",email,islandId) player = player_q.get() player_dict = player.__dict__['_entity'] player_dict['playerId'] = player.key().id() #get number of factories plantQuery = Plant.gql("WHERE playerId = :1 and islandId = :2",player.key().id(), islandId) player_dict['numPlants'] = plantQuery.count() player_dict['numWorkers'] = 0 plants = plantQuery.fetch(1000) plantIds = [] for p in plants: player_dict['numWorkers'] += p.numOfWorkers plantIds.append(p.key().id()) player_dict['numShoes'] = 0 shoeQuery = Shoe.gql("WHERE plantId in :1",plantIds) shoes = shoeQuery.fetch(1000) for shoe in shoes: player_dict['numShoes'] += shoe.qty player_dict['islandName'] = island.name jsonString = simplejson.dumps(player_dict) return HttpResponse(jsonString,mimetype="application/json")
def buy_credits(request): args = request.GET if args.__contains__('details'): d = args.__getitem__('details') dd = d.split(",") _playerId = int(dd[0]) _money = float(dd[1]) _cashAmt = float(dd[2]) player = Player.get_by_id(_playerId) player.money += _money player.networth = player.money + player.money_spent player.put() email = player.email accQuery = Account.gql("WHERE email = :1",email) acc = accQuery.get() acc.payment += _cashAmt acc.put() ppTrxn = PayPalTransaction(email = player.email,cashAmt = _cashAmt, money = _money, status="OK",playerId = _playerId) ppTrxn.put() return redirect("/app/main.html#/theworld") else: return HttpResponse("Not enough arguments")
def get_account_players(request): session = request.session try: if session['account']: acc = session['account'] q = Player.gql("WHERE email = :1",acc.email) f = q.fetch(1000) players = [] for i in f: islandId = i.islandId island = Island.get_by_id(islandId) dd = i.__dict__['_entity'] dd['playerId'] = i.key().id() dd['islandName'] = island.name players.append(dd) return HttpResponse(simplejson.dumps(players),mimetype="application/json") else: return HttpResponse("error","text") except KeyError: pass dd = {} dd['error'] = "Error: cannot get session account" return HttpResponse(simplejson.dumps(dd),mimetype="application/json")
def system_buy_shoes(request): ''' Check the logged in user ''' user = users.get_current_user() marketing = 1 dd = [] if user: islandQuery = Island.all() islandCount = islandQuery.count() islands = islandQuery.fetch(islandCount) for island in islands: islandId = island.key().id() playerQuery = Player.gql("WHERE islandId = :1",islandId) numPlayers = playerQuery.count() plantQuery = Plant.gql("WHERE islandId = :1",islandId) plantCount = plantQuery.count() plants = plantQuery.fetch(plantCount) for plant in plants: plantId = plant.key().id() plantRegion = plant.region shoeQuery = Shoe.gql("WHERE plantId = :1",plantId) shoeCount = shoeQuery.count() shoes = shoeQuery.fetch(shoeCount) for shoe in shoes: body = shoe.body sole = shoe.sole color = shoe.color qty = shoe.qty attractiveness = math.fabs((0.75*sole + body + 1.25 * color) / 3) saleRegion = "" #randomly select sale-to-region i = random.randint(1,4) if i == 1: saleRegion = "north" elif i == 2: saleRegion = "east" elif i == 3: saleRegion = "west" elif i == 4: saleRegion = "south" _shippingcost = shippingCost[plantRegion][saleRegion] price = shoe.price + _shippingcost salesVolume = int(math.ceil(numPlayers * math.pow((attractiveness*marketing/price),2))) if salesVolume > qty: salesVolume = qty shoe.qty = shoe.qty - salesVolume shoe.put() dd.append(shoe.key().id()) dd.append(salesVolume) n = {'count':len(dd)} totalShippingCost = salesVolume * _shippingcost totalRevenue = salesVolume * shoe.price player = Player.get_by_id(plant.playerId) player.money = player.money - totalShippingCost + totalRevenue player.money_spent = player.money_spent + totalShippingCost player.networth = player.money + player.money_spent player.put() plant.currentCapacity = plant.currentCapacity - salesVolume plant.put() demandTransaction = DemandTransaction(shoeId = shoe.key().id(),salePrice = shoe.price,shippingCost = _shippingcost,qty = salesVolume) demandTransaction.put() else: return redirect(users.create_login_url("/system_buy_shoes")) return HttpResponse(simplejson.dumps(n),mimetype="application/json")