1
0
Fork 0
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
fear_tracker/fear_tracker/views.py

134 linhas
4.3 KiB
Python

from collections import OrderedDict
from io import BytesIO
import qrcode
from django.http import HttpResponse
from django.shortcuts import get_object_or_404, redirect, render
from django.views.decorators.http import require_safe, require_http_methods
from django.urls import reverse
from .forms import NewGameForm, JoinGameForm, PlayerFormSet
from .models import Game, Player
def lookup_access_code(func):
def with_game(request, access_code, *args, **kwargs):
game = get_object_or_404(Game, access_code=access_code.lower())
return func(request, game, *args, **kwargs)
return with_game
@require_safe
def index(request):
return render(request, 'index.html')
@require_http_methods(["HEAD", "GET", "POST"])
def enter_code(request):
if request.method == 'POST':
form = JoinGameForm(request.POST)
if form.is_valid():
game = form.cleaned_data['game']
return redirect('game', access_code=game.access_code)
else:
form = JoinGameForm()
return render(request, 'enter_code.html', {'form': form})
@require_http_methods(["HEAD", "GET", "POST"])
def new_game(request):
if request.method == 'POST':
form = NewGameForm(request.POST)
formset = PlayerFormSet(request.POST)
if form.is_valid() and formset.is_valid():
player_forms = list(filter(lambda p: p.cleaned_data.get('name'),
formset.forms))
num_players = len(player_forms)
game = Game()
game.combined_growth_spirit =\
form.cleaned_data.get('combined_growth_spirit')
game.england_build = form.cleaned_data.get('england_build')
game.fear_per_card =\
form.cleaned_data.get('fear_per_player') * num_players
game.save()
for player_form in player_forms:
player = Player()
player.order = int(player_form.prefix[5:]) + 1
player.spirit = player_form.cleaned_data.get('spirit')
player.name = player_form.cleaned_data.get('name')
player.game = game
player.save()
game.advance_phase()
return redirect('game', access_code=game.access_code)
else:
form = NewGameForm()
initial_player_data = [{'spirit': i}
for i in enumerate(Player.SPIRIT_NAMES)]
formset = PlayerFormSet(initial=initial_player_data)
for player_form in formset:
player_form.player_id = int(player_form.prefix[5:]) + 1
return render(request, 'new_game.html',
{'form': form, 'formset': formset})
@require_safe
def qr_code(request, access_code):
join_url = reverse('game', kwargs={'access_code': access_code.lower()})
join_url = request.build_absolute_uri(join_url)
img = qrcode.make(join_url)
output = BytesIO()
img.save(output, "PNG")
return HttpResponse(output.getvalue(), content_type='image/png')
@lookup_access_code
@require_safe
def game(request, game):
players = OrderedDict()
for player in game.player_set.order_by('order').all():
player.total_fear = 0
player.fear = OrderedDict()
players[player.order] = player
for fear in game.get_current_phase().fear_set.order_by('effect').all():
player[fear.player.order].fear[fear.effect] = {
'pure_fear': fear.pure_fear,
'towns': fear.towns_destroyed,
'cities': fear.cities_destroyed,
}
players[fear.player.order].total_fear +=\
fear.pure_fear + fear.towns_destroyed + 2*fear.cities_destroyed
for player in players.values():
info = player.fear
if not info:
new_effect = 0
else:
new_effect = max(info.keys()) + 1
info[new_effect] = {
'pure_fear': 0,
'towns': 0,
'cities': 0,
}
return render(request, 'game.html', {
'access_code': game.access_code,
'turn': game.game_turn,
'phase': game.get_current_phase_name(),
'available_fear_cards': game.num_available_fear_cards(),
'fear_to_next_card': game.get_fear_to_next_card(),
'fear_this_phase': game.get_current_phase().fear_this_phase(),
'players': players,
})
@lookup_access_code
@require_safe
def status(request, game):
# TODO status json
pass