2022-10-30 10:12:49 +01:00
|
|
|
from django.contrib.auth.decorators import login_required
|
|
|
|
from django.core.handlers.wsgi import WSGIRequest
|
|
|
|
from django.http import HttpResponse
|
|
|
|
from django.shortcuts import get_object_or_404, render
|
2022-10-30 23:33:28 +01:00
|
|
|
from django_htmx.http import trigger_client_event
|
2022-10-30 10:12:49 +01:00
|
|
|
|
2022-10-31 00:06:20 +01:00
|
|
|
from character.forms import EquipmentForm
|
2022-10-30 10:12:49 +01:00
|
|
|
from character.models import Character
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def character_view(request: WSGIRequest, pk: int) -> HttpResponse:
|
2022-10-30 17:56:36 +01:00
|
|
|
character = get_object_or_404(
|
|
|
|
Character.objects.select_related(
|
|
|
|
"player", "racial_capability", "profile", "race"
|
|
|
|
).prefetch_related("capabilities__path", "weapons"),
|
|
|
|
pk=pk,
|
|
|
|
)
|
2022-10-30 10:12:49 +01:00
|
|
|
context = {"character": character}
|
|
|
|
return render(request, "character/view.html", context)
|
2022-10-30 17:37:09 +01:00
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def character_health_change(request: WSGIRequest, pk: int) -> HttpResponse:
|
2022-10-30 17:56:36 +01:00
|
|
|
character = get_object_or_404(
|
|
|
|
Character.objects.only("health_max", "health_remaining"), pk=pk
|
|
|
|
)
|
2022-10-30 18:42:55 +01:00
|
|
|
value = get_updated_value(request, character.health_remaining, character.health_max)
|
2022-10-30 17:56:36 +01:00
|
|
|
character.health_remaining = value
|
2022-10-30 17:37:09 +01:00
|
|
|
character.save(update_fields=["health_remaining"])
|
2022-10-30 18:45:30 +01:00
|
|
|
return HttpResponse(value)
|
2022-10-30 17:47:42 +01:00
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def character_mana_change(request: WSGIRequest, pk: int) -> HttpResponse:
|
2022-10-30 17:56:36 +01:00
|
|
|
character = get_object_or_404(
|
2022-10-30 22:44:28 +01:00
|
|
|
Character.objects.only(
|
|
|
|
"mana_remaining", "level", "value_intelligence", "profile"
|
|
|
|
).select_related("profile"),
|
|
|
|
pk=pk,
|
2022-10-30 17:56:36 +01:00
|
|
|
)
|
2022-10-30 18:42:55 +01:00
|
|
|
value = get_updated_value(request, character.mana_remaining, character.mana_max)
|
2022-10-30 17:56:36 +01:00
|
|
|
character.mana_remaining = value
|
|
|
|
character.save(update_fields=["mana_remaining"])
|
2022-10-30 18:45:30 +01:00
|
|
|
return HttpResponse(value)
|
2022-10-30 17:56:36 +01:00
|
|
|
|
|
|
|
|
2022-10-30 21:55:05 +01:00
|
|
|
@login_required
|
|
|
|
def character_recovery_points_change(request: WSGIRequest, pk: int) -> HttpResponse:
|
|
|
|
character = get_object_or_404(
|
|
|
|
Character.objects.only("recovery_points_remaining"), pk=pk
|
|
|
|
)
|
|
|
|
value = get_updated_value(
|
|
|
|
request, character.recovery_points_remaining, character.recovery_points_max
|
|
|
|
)
|
|
|
|
character.recovery_points_remaining = value
|
|
|
|
character.save(update_fields=["recovery_points_remaining"])
|
|
|
|
return HttpResponse(value)
|
|
|
|
|
|
|
|
|
2022-10-30 23:33:28 +01:00
|
|
|
@login_required
|
|
|
|
def character_defense_misc_change(request: WSGIRequest, pk: int) -> HttpResponse:
|
|
|
|
character = get_object_or_404(Character.objects.only("defense_misc"), pk=pk)
|
|
|
|
value = get_updated_value(request, character.defense_misc, float("inf"))
|
|
|
|
character.defense_misc = value
|
|
|
|
character.save(update_fields=["defense_misc"])
|
|
|
|
response = HttpResponse(value)
|
|
|
|
return trigger_client_event(response, "update_defense", {})
|
|
|
|
|
|
|
|
|
2022-10-30 22:02:21 +01:00
|
|
|
@login_required
|
|
|
|
def character_luck_points_change(request: WSGIRequest, pk: int) -> HttpResponse:
|
|
|
|
character = get_object_or_404(
|
2022-10-30 22:43:50 +01:00
|
|
|
Character.objects.only("luck_points_remaining", "value_charisma"), pk=pk
|
2022-10-30 22:02:21 +01:00
|
|
|
)
|
|
|
|
value = get_updated_value(
|
|
|
|
request, character.luck_points_remaining, character.luck_points_max
|
|
|
|
)
|
|
|
|
character.luck_points_remaining = value
|
|
|
|
character.save(update_fields=["luck_points_remaining"])
|
|
|
|
return HttpResponse(value)
|
|
|
|
|
|
|
|
|
2022-10-30 18:42:55 +01:00
|
|
|
def get_updated_value(
|
2022-10-30 23:33:28 +01:00
|
|
|
request: WSGIRequest, remaining_value: int, max_value: int | float
|
2022-10-30 18:42:55 +01:00
|
|
|
) -> int:
|
|
|
|
form_value = request.GET.get("value")
|
|
|
|
if form_value == "ko":
|
|
|
|
remaining_value = 0
|
|
|
|
elif form_value == "max":
|
|
|
|
remaining_value = max_value
|
2022-10-30 17:47:42 +01:00
|
|
|
else:
|
2022-10-30 18:42:55 +01:00
|
|
|
form_value = int(form_value)
|
|
|
|
remaining_value += form_value
|
|
|
|
remaining_value = min([max_value, remaining_value])
|
|
|
|
remaining_value = max([0, remaining_value])
|
|
|
|
return remaining_value
|
2022-10-30 18:33:30 +01:00
|
|
|
|
|
|
|
|
2022-10-30 23:33:28 +01:00
|
|
|
@login_required
|
|
|
|
def character_get_defense(request: WSGIRequest, pk: int) -> HttpResponse:
|
|
|
|
character = get_object_or_404(
|
|
|
|
Character.objects.only("defense_misc", "armor", "shield", "value_dexterity"),
|
|
|
|
pk=pk,
|
|
|
|
)
|
|
|
|
return HttpResponse(character.defense)
|
|
|
|
|
|
|
|
|
2022-10-30 18:33:30 +01:00
|
|
|
@login_required
|
|
|
|
def character_notes_change(request: WSGIRequest, pk: int) -> HttpResponse:
|
2022-10-30 18:36:18 +01:00
|
|
|
return update_text_field(request, pk, "notes")
|
2022-10-30 18:33:30 +01:00
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def character_equipment_change(request: WSGIRequest, pk: int) -> HttpResponse:
|
2022-10-31 00:06:20 +01:00
|
|
|
field = "equipment"
|
|
|
|
character = get_object_or_404(Character.objects.only(field), pk=pk)
|
|
|
|
context = {"character": character}
|
|
|
|
if request.method == "GET":
|
|
|
|
return render(request, f"character/{field}_update.html", context)
|
|
|
|
form = EquipmentForm(request.POST, instance=character)
|
|
|
|
if form.is_valid():
|
|
|
|
form.save()
|
|
|
|
return render(request, f"character/{field}_display.html", context)
|
|
|
|
else:
|
|
|
|
context["errors"] = form.errors
|
|
|
|
return render(request, f"character/{field}_update.html", context)
|
2022-10-30 18:36:18 +01:00
|
|
|
|
|
|
|
|
2022-10-30 23:44:02 +01:00
|
|
|
@login_required
|
|
|
|
def character_damage_reduction_change(request: WSGIRequest, pk: int) -> HttpResponse:
|
|
|
|
return update_text_field(request, pk, "damage_reduction")
|
|
|
|
|
|
|
|
|
2022-10-30 18:36:18 +01:00
|
|
|
def update_text_field(request, pk, field):
|
|
|
|
character = get_object_or_404(Character.objects.only(field), pk=pk)
|
2022-10-30 18:33:30 +01:00
|
|
|
context = {"character": character}
|
|
|
|
if request.method == "GET":
|
2022-10-30 18:36:18 +01:00
|
|
|
return render(request, f"character/{field}_update.html", context)
|
|
|
|
setattr(character, field, request.POST.get(field))
|
2022-10-30 18:45:30 +01:00
|
|
|
character.save(update_fields=[field])
|
2022-10-30 18:36:18 +01:00
|
|
|
return render(request, f"character/{field}_display.html", context)
|