예제 #1
0
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"
예제 #2
0
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")
예제 #3
0
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")
예제 #4
0
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.")
예제 #5
0
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")
예제 #6
0
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")
예제 #7
0
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")
예제 #8
0
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")
예제 #9
0
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")
예제 #10
0
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")