From c518d41641232c1bcfa469255a657d77d39bd298 Mon Sep 17 00:00:00 2001 From: Walter Date: Mon, 17 Feb 2025 08:54:37 +0100 Subject: [PATCH] Fixed css/js/html --- app/bloonsa_api/views.py | 18 +++++- .../0022_alter_levelrating_level.py | 19 ++++++ app/bloonsa_game/models.py | 20 +++++- .../static/bloonsa_game/css/levelinfo.css | 21 ++++-- .../bloonsa_game/img/levelinfo/star.svg | 12 +--- .../static/bloonsa_game/js/flash_handler.js | 64 ++++++++++++++++--- .../bloonsa_game/modules/levelinfo.html | 15 +++-- 7 files changed, 133 insertions(+), 36 deletions(-) create mode 100644 app/bloonsa_game/migrations/0022_alter_levelrating_level.py diff --git a/app/bloonsa_api/views.py b/app/bloonsa_api/views.py index ab79dc1..bf3a1e7 100644 --- a/app/bloonsa_api/views.py +++ b/app/bloonsa_api/views.py @@ -142,9 +142,13 @@ class GetStatusData(CSRFexemptTemplateView): player: Player = Player.objects.get(user=request.user) score: LevelScore = LevelScore.objects.filter(player=player, level=level).first() + total_levels = Level.objects.count() level_cleared = player.has_beaten_bloonsa_level(level=level) - + level_plays = level.play_count + level_wins = level.win_count + level_win_percentage = 0.00 if level_wins == 0 else level_wins / level_plays + dart_glitch_count = level.dart_glitch_count jdata = { "bloonsa_levels_played": player.bloonsa_levels_played_count, "bloonsa_levels_beaten": player.bloonsa_levels_beaten_count, @@ -155,9 +159,17 @@ class GetStatusData(CSRFexemptTemplateView): "level_title": level.title, "level_id": level.level_id, "level_legacy_plays": level.plays, - "level_plays": level.play_count, - "level_rating": level.rating, + "level_legacy_rating": level.rating, + "level_darts": level.darts, + "level_target": level.target, "level_cleared": level_cleared, + + "level_rating": level.stars, + "level_plays": level_plays, + "level_wins": level_wins, + "level_win_percentage": level_win_percentage, + "dart_glitch_count": dart_glitch_count, + } if score: jdata.update({ diff --git a/app/bloonsa_game/migrations/0022_alter_levelrating_level.py b/app/bloonsa_game/migrations/0022_alter_levelrating_level.py new file mode 100644 index 0000000..de29b33 --- /dev/null +++ b/app/bloonsa_game/migrations/0022_alter_levelrating_level.py @@ -0,0 +1,19 @@ +# Generated by Django 5.1.6 on 2025-02-17 07:14 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('bloonsa_game', '0021_alter_levelscore_player'), + ] + + operations = [ + migrations.AlterField( + model_name='levelrating', + name='level', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bloonsa_level_ratings', to='bloonsa_game.level'), + ), + ] diff --git a/app/bloonsa_game/models.py b/app/bloonsa_game/models.py index aeb7a95..b145a00 100644 --- a/app/bloonsa_game/models.py +++ b/app/bloonsa_game/models.py @@ -1,5 +1,8 @@ +import math + from django.core.validators import MinValueValidator, MaxValueValidator from django.db import models +from django.db.models import Avg from users.models import Player @@ -28,6 +31,20 @@ class Level(models.Model): def play_count(self): return self.played_by.count() + @property + def win_count(self): + return LevelScore.objects.filter(level=self, clear=True).count() + + @property + def dart_glitch_count(self): + return LevelScore.objects.filter(level=self, dart_glitch=True).count() + + @property + def stars(self): + result = list(self.bloonsa_level_ratings.aggregate(Avg("rating")).values())[0] + return 0 if result is None else math.floor(result) + + def __str__(self): return f"{self.author} - {self.title}" @@ -48,10 +65,11 @@ class Level(models.Model): class LevelRating(models.Model): player = models.ForeignKey(Player, on_delete=models.CASCADE, related_name="bloonsa_level_ratings", null=True) - level = models.ForeignKey(Level, on_delete=models.CASCADE) + level = models.ForeignKey(Level, on_delete=models.CASCADE, related_name="bloonsa_level_ratings") rating = models.SmallIntegerField(validators=[MinValueValidator(1), MaxValueValidator(10)]) + def __str__(self): return (f"{self.player.user.username if self.player else ''}" f" - [<{int(self.rating) * '★'}> - {self.level.title}]") diff --git a/app/bloonsa_game/static/bloonsa_game/css/levelinfo.css b/app/bloonsa_game/static/bloonsa_game/css/levelinfo.css index f0edf7a..9b3565a 100644 --- a/app/bloonsa_game/static/bloonsa_game/css/levelinfo.css +++ b/app/bloonsa_game/static/bloonsa_game/css/levelinfo.css @@ -27,13 +27,12 @@ flex-grow: 1; } -#level-title { - font-size: 24px; - white-space: pre; +#level-title, #level-author, #level-pb-darts { + white-space: pre; } -#level-author { - white-space: pre; +#level-title { + font-size: 24px; } #level-stats { @@ -81,7 +80,7 @@ } .level-wins-img, .level-glitches-img { - filter: invert(75%) sepia(23%) saturate(6404%) hue-rotate(355deg) brightness(98%) contrast(107%); // orange + filter: invert(75%) sepia(23%) saturate(6404%) hue-rotate(355deg) brightness(98%) contrast(107%) !important; // orange } .level-plays-img { filter: invert(17%) sepia(2%) saturate(72%) hue-rotate(66deg) brightness(94%) contrast(89%); // grey @@ -92,4 +91,12 @@ .level-darts-img { filter: invert(0%) sepia(96%) saturate(15%) hue-rotate(246deg) brightness(105%) contrast(105%); // black } - +.filter-black { + filter: invert(0%) sepia(96%) saturate(15%) hue-rotate(246deg) brightness(105%) contrast(105%); // black +} +.filter-softblue { + filter: invert(53%) sepia(93%) saturate(488%) hue-rotate(182deg) brightness(103%) contrast(103%); +} +.filter-orange { + filter: invert(75%) sepia(23%) saturate(6404%) hue-rotate(355deg) brightness(98%) contrast(107%) !important; // orange +} diff --git a/app/bloonsa_game/static/bloonsa_game/img/levelinfo/star.svg b/app/bloonsa_game/static/bloonsa_game/img/levelinfo/star.svg index d55308f..eb791c8 100644 --- a/app/bloonsa_game/static/bloonsa_game/img/levelinfo/star.svg +++ b/app/bloonsa_game/static/bloonsa_game/img/levelinfo/star.svg @@ -1,11 +1,3 @@ - - - - + + \ No newline at end of file diff --git a/app/bloonsa_game/static/bloonsa_game/js/flash_handler.js b/app/bloonsa_game/static/bloonsa_game/js/flash_handler.js index b221670..decc110 100644 --- a/app/bloonsa_game/static/bloonsa_game/js/flash_handler.js +++ b/app/bloonsa_game/static/bloonsa_game/js/flash_handler.js @@ -30,19 +30,63 @@ function bloonsa_update_data(level_id) { })); } +function set_stars(rating) { + for (let i = 0; i < 10; i++) { + let star = document.getElementById(`level-star${i}`); + if (i < rating) { + star.classList.add("filter-orange") + } else { + star.classList.remove("filter-orange") + } + }; +} + function bloonsa_update_html(r) { - document.getElementById("level_title").textContent = r.level_title; - document.getElementById("level_id").textContent = `(${r.level_id})`; - document.getElementById("level_author").textContent = `by ${r.level_author_name}`; - document.getElementById("level_author_id").textContent = `(${r.level_author_id})`; - if (r.level_cleared) { - document.getElementById("level_clear_state").textContent = `✅`; + // Level Infobox + document.getElementById("level-name").textContent = r.level_title; + document.getElementById("level-id").textContent = `${r.level_id}`; + document.getElementById("level-author-name").textContent = r.level_author_name; + document.getElementById("level-author-id").textContent = `${r.level_author_id}`; + + set_stars(r.level_rating); + + document.getElementById("level-wins-number").textContent = r.level_wins; + document.getElementById("level-wins-percentage").textContent = (r.level_win_percentage * 100).toFixed(2) + "%"; + document.getElementById("level-plays-number").textContent = r.level_plays; + document.getElementById("level-glitch-number").textContent = r.dart_glitch_count; + + // Personal best + var darts_img = document.getElementById("level-pb-darts-img"); + if ("score_pops" in r) { + document.getElementById("level-pb-pops-number").textContent = r.score_pops; + document.getElementById("level-target").textContent = r.level_target; + document.getElementById("level-pb-darts-number").textContent = r.score_darts_left; + document.getElementById("level-pb-darts-glitch").textContent = r.score_dart_glitch ? "+1": ""; + + if (r.score_dart_glitch) { + darts_img.classList.add("level-glitches-img"); + } else { + darts_img.classList.remove("level-glitches-img"); + } + } else { - document.getElementById("level_clear_state").textContent = ``; + document.getElementById("level-pb-pops-number").textContent = "0"; + document.getElementById("level-target").textContent = r.level_target; + document.getElementById("level-pb-darts-number").textContent = "-"; + document.getElementById("level-pb-darts-glitch").textContent = ""; + darts_img.classList.remove("level-glitches-img"); } - document.getElementById("levels_played").textContent = `${r.bloonsa_levels_played}`; - document.getElementById("levels_beaten").textContent = `${r.bloonsa_levels_beaten}`; - document.getElementById("total_levels").textContent = `${r.bloonsa_total_levels}`; + + + + + //if (r.level_cleared) { + + + // Profile + document.getElementById("levels_played").textContent = r.bloonsa_levels_played; + document.getElementById("levels_beaten").textContent = r.bloonsa_levels_beaten; + document.getElementById("total_levels").textContent = r.bloonsa_total_levels; diff --git a/app/bloonsa_game/templates/bloonsa_game/modules/levelinfo.html b/app/bloonsa_game/templates/bloonsa_game/modules/levelinfo.html index 2de3ea1..696354a 100644 --- a/app/bloonsa_game/templates/bloonsa_game/modules/levelinfo.html +++ b/app/bloonsa_game/templates/bloonsa_game/modules/levelinfo.html @@ -17,7 +17,10 @@
{% for i in '0123456789' %} - + {% endfor %}
@@ -25,7 +28,8 @@
7 - (2.87%) + + (2.87%)
@@ -44,12 +48,13 @@ 126 / - 120 + 120
- + 2 - +1 + + +1