|
|
|
@ -8,7 +8,7 @@ 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
|
|
|
|
|
from .models import Game, Player, Fear
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def lookup_access_code(func):
|
|
|
|
@ -89,15 +89,85 @@ def qr_code(request, access_code):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@lookup_access_code
|
|
|
|
|
@require_safe
|
|
|
|
|
@require_http_methods(["HEAD", "GET", "POST"])
|
|
|
|
|
def game(request, game):
|
|
|
|
|
players = OrderedDict()
|
|
|
|
|
for player in game.player_set.order_by('order').all():
|
|
|
|
|
player.total_fear = 0
|
|
|
|
|
player.changed_to_ready = False
|
|
|
|
|
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] = {
|
|
|
|
|
|
|
|
|
|
errors = []
|
|
|
|
|
fear_kind_dict = {
|
|
|
|
|
'fear': 'pure_fear',
|
|
|
|
|
'towns': 'towns_destroyed',
|
|
|
|
|
'cities': 'cities_destroyed',
|
|
|
|
|
}
|
|
|
|
|
current_phase = game.get_current_phase()
|
|
|
|
|
if request.method == 'POST':
|
|
|
|
|
for key, value in request.POST.items():
|
|
|
|
|
sections = key.split('-')
|
|
|
|
|
if key == 'csrfmiddlewaretoken' or sections[-1] == 'orig':
|
|
|
|
|
pass
|
|
|
|
|
elif sections[0] == 'player':
|
|
|
|
|
orig_value = request.POST.get(key + '-orig', None)
|
|
|
|
|
player_ord = int(sections[1])
|
|
|
|
|
player = players[player_ord]
|
|
|
|
|
if sections[2] == 'visible':
|
|
|
|
|
player.visible = True
|
|
|
|
|
elif sections[2] == 'ready':
|
|
|
|
|
if value != orig_value:
|
|
|
|
|
if value == 'true':
|
|
|
|
|
player.ready = True
|
|
|
|
|
player.changed_to_ready = True
|
|
|
|
|
else:
|
|
|
|
|
player.ready = False
|
|
|
|
|
player.save()
|
|
|
|
|
elif sections[2] == 'effect':
|
|
|
|
|
effect_num = int(sections[3])
|
|
|
|
|
effect_kind = sections[4]
|
|
|
|
|
if orig_value != value:
|
|
|
|
|
amount = int(value)
|
|
|
|
|
orig = int(orig_value)
|
|
|
|
|
if amount != orig:
|
|
|
|
|
if player.ready and not player.changed_to_ready:
|
|
|
|
|
errors.append(
|
|
|
|
|
f"{player.name} " +
|
|
|
|
|
f"({player.get_spirit_name()}) was " +
|
|
|
|
|
"marked as ready by another user, so " +
|
|
|
|
|
"your attempt to change their effect " +
|
|
|
|
|
f"#{effect_num} {effect_kind} " +
|
|
|
|
|
f"from {orig} to {amount} " +
|
|
|
|
|
"was not processed.")
|
|
|
|
|
else:
|
|
|
|
|
fear_row, created = Fear.objects.get_or_create(
|
|
|
|
|
phase=current_phase,
|
|
|
|
|
player=player,
|
|
|
|
|
effect=effect_num)
|
|
|
|
|
prop_name = fear_kind_dict[effect_kind]
|
|
|
|
|
current_value = getattr(fear_row, prop_name)
|
|
|
|
|
if current_value == orig:
|
|
|
|
|
setattr(fear_row, prop_name, amount)
|
|
|
|
|
fear_row.save()
|
|
|
|
|
else:
|
|
|
|
|
errors.append(
|
|
|
|
|
f"{player.name} " +
|
|
|
|
|
f"({player.get_spirit_name()})'s " +
|
|
|
|
|
"effect " +
|
|
|
|
|
f"#{effect_num} {effect_kind} " +
|
|
|
|
|
"was changed by another user to " +
|
|
|
|
|
f"{current_value}, so " +
|
|
|
|
|
f"your attempt to change it from " +
|
|
|
|
|
f"{orig} to {amount} " +
|
|
|
|
|
"was not processed.")
|
|
|
|
|
else:
|
|
|
|
|
raise Exception(key + ": " + value)
|
|
|
|
|
else:
|
|
|
|
|
raise Exception(key + ": " + value)
|
|
|
|
|
|
|
|
|
|
for fear in current_phase.fear_set.order_by('effect').all():
|
|
|
|
|
players[fear.player.order].fear[fear.effect] = {
|
|
|
|
|
'pure_fear': fear.pure_fear,
|
|
|
|
|
'towns': fear.towns_destroyed,
|
|
|
|
|
'cities': fear.cities_destroyed,
|
|
|
|
@ -121,8 +191,12 @@ def game(request, game):
|
|
|
|
|
'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(),
|
|
|
|
|
'fear_this_phase': current_phase.fear_this_phase(),
|
|
|
|
|
'total_fear': game.get_current_total_fear(),
|
|
|
|
|
'players': players,
|
|
|
|
|
'all_ready': all(player.ready for player in players.values()),
|
|
|
|
|
'range': range(21),
|
|
|
|
|
'errors': errors,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|