Add recovery points

This commit is contained in:
Gabriel Augendre 2022-10-30 21:55:05 +01:00
parent 1f77eb98e1
commit 3a8d7c832f
7 changed files with 160 additions and 87 deletions

View file

@ -106,7 +106,7 @@ class CharacterAdmin(admin.ModelAdmin):
"Combat", "Combat",
{"fields": ["initiative", "attack_melee", "attack_range", "attack_magic"]}, {"fields": ["initiative", "attack_melee", "attack_range", "attack_magic"]},
), ),
("Vitalité", {"fields": ["health_max", "health_remaining"]}), ("Vitalité", {"fields": [("health_max", "health_remaining")]}),
("Défense", {"fields": ["armor", "shield", "defense_misc", "defense"]}), ("Défense", {"fields": ["armor", "shield", "defense_misc", "defense"]}),
( (
"Armes & équipement", "Armes & équipement",
@ -120,8 +120,12 @@ class CharacterAdmin(admin.ModelAdmin):
), ),
("Race", {"fields": ["racial_capability"]}), ("Race", {"fields": ["racial_capability"]}),
("Capacités", {"fields": ["capabilities"]}), ("Capacités", {"fields": ["capabilities"]}),
("Chance", {"fields": ["luck_points_max", "luck_points_remaining"]}), ("Chance", {"fields": [("luck_points_max", "luck_points_remaining")]}),
("Mana", {"fields": ["mana_max", "mana_remaining"]}), ("Mana", {"fields": [("mana_max", "mana_remaining")]}),
(
"Récupération",
{"fields": [("recovery_points_max", "recovery_points_remaining")]},
),
("Notes", {"fields": ["notes"]}), ("Notes", {"fields": ["notes"]}),
] ]
readonly_fields = [ readonly_fields = [
@ -137,7 +141,7 @@ class CharacterAdmin(admin.ModelAdmin):
"attack_magic", "attack_magic",
"defense", "defense",
"mana_max", "mana_max",
"mana_remaining", "recovery_points_max",
] ]
filter_horizontal = [ filter_horizontal = [
"capabilities", "capabilities",

View file

@ -0,0 +1,20 @@
# Generated by Django 4.1.2 on 2022-10-30 20:49
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("character", "0014_remove_character_mana_consumed_and_more"),
]
operations = [
migrations.AddField(
model_name="character",
name="recovery_points_remaining",
field=models.PositiveSmallIntegerField(
default=5, verbose_name="points de récupération restants"
),
),
]

View file

@ -1 +1 @@
0014_remove_character_mana_consumed_and_more 0015_character_recovery_points_remaining

View file

@ -138,6 +138,10 @@ class Character(models.Model):
money_pa = models.PositiveSmallIntegerField(default=0, verbose_name="PA") money_pa = models.PositiveSmallIntegerField(default=0, verbose_name="PA")
money_pc = models.PositiveSmallIntegerField(default=0, verbose_name="PC") money_pc = models.PositiveSmallIntegerField(default=0, verbose_name="PC")
recovery_points_remaining = models.PositiveSmallIntegerField(
default=5, verbose_name="points de récupération restants"
)
notes = models.TextField(blank=True, verbose_name="notes") notes = models.TextField(blank=True, verbose_name="notes")
objects = CharacterManager() objects = CharacterManager()
@ -227,6 +231,10 @@ class Character(models.Model):
def imc(self) -> float: def imc(self) -> float:
return self.weight / (self.height_m**2) return self.weight / (self.height_m**2)
@property
def recovery_points_max(self) -> int:
return 5
def get_capabilities_by_path(self) -> dict[Path, list[Capability]]: def get_capabilities_by_path(self) -> dict[Path, list[Capability]]:
capabilities_by_path = collections.defaultdict(list) capabilities_by_path = collections.defaultdict(list)
for capability in self.capabilities.all(): for capability in self.capabilities.all():

View file

@ -185,6 +185,29 @@
</div> </div>
</th> </th>
<td id="mana-remaining">{{ character.mana_remaining }}</td> <td id="mana-remaining">{{ character.mana_remaining }}</td>
<tr>
<th scope="row">PR max</th>
<td>{{ character.recovery_points_max }}</td>
</tr>
<tr>
<th scope="row">
PR restants
<div class="btn-group btn-group-sm" role="group">
<button
hx-get="{% url "character:recovery_points_change" pk=character.pk %}?value=-1"
hx-target="#recovery-points-remaining"
hx-swap="innerHTML"
type="button"
class="btn btn-danger">-</button>
<button
hx-get="{% url "character:recovery_points_change" pk=character.pk %}?value=1"
hx-target="#recovery-points-remaining"
hx-swap="innerHTML"
type="button"
class="btn btn-success">+</button>
</div>
</th>
<td id="recovery-points-remaining">{{ character.recovery_points_remaining }}</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View file

@ -7,6 +7,11 @@ urlpatterns = [
path("<int:pk>/", views.character_view, name="view"), path("<int:pk>/", views.character_view, name="view"),
path("<int:pk>/health_change", views.character_health_change, name="health_change"), path("<int:pk>/health_change", views.character_health_change, name="health_change"),
path("<int:pk>/mana_change", views.character_mana_change, name="mana_change"), path("<int:pk>/mana_change", views.character_mana_change, name="mana_change"),
path(
"<int:pk>/recovery_points_change",
views.character_recovery_points_change,
name="recovery_points_change",
),
path("<int:pk>/notes_change", views.character_notes_change, name="notes_change"), path("<int:pk>/notes_change", views.character_notes_change, name="notes_change"),
path( path(
"<int:pk>/equipment_change", "<int:pk>/equipment_change",

View file

@ -40,6 +40,19 @@ def character_mana_change(request: WSGIRequest, pk: int) -> HttpResponse:
return HttpResponse(value) return HttpResponse(value)
@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)
def get_updated_value( def get_updated_value(
request: WSGIRequest, remaining_value: int, max_value: int request: WSGIRequest, remaining_value: int, max_value: int
) -> int: ) -> int: