diff --git a/www/games/results.php b/www/games/results.php
index 5d81e87..23cb15c 100644
--- a/www/games/results.php
+++ b/www/games/results.php
@@ -9,6 +9,87 @@ $stmt->execute([
 $title = "Results: " . $stmt->fetch(PDO::FETCH_COLUMN);
 $description = "View the results of particular issue's voting.";
 
+// use new weights for Winter 2024 and later
+// i want to normalise the old and new ranking formulas, but for now
+// this will have to do
+if (intval($_GET['game']) >= 381):
+/** === START new display query === */
+$temp = "";
+$view =
+    'CREATE TEMPORARY VIEW round_%2$d AS SELECT
+        submissions.id AS submission_id,
+        SUM(score) AS total_score,
+        COUNT(completed) AS num_scores,
+        AVG(score) AS average_score
+        FROM submissions
+        LEFT JOIN assignments ON submissions.id = assignments.submission_id
+        WHERE submissions.game_id = %1$d AND round_number = %2$d
+        GROUP BY submission_id;' . PHP_EOL;
+
+$temp .= sprintf($view, $_GET["game"], 1);
+$temp .= sprintf($view, $_GET["game"], 2);
+$temp .= sprintf($view, $_GET["game"], 3);
+
+$temp .= sprintf(
+    'CREATE TEMPORARY VIEW participants AS SELECT
+            member_id,
+            COUNT(completed) != COUNT(id) AS disqualified
+            FROM assignments
+            WHERE game_id = %d
+            GROUP BY member_id;',
+    $_GET["game"]
+);
+
+$db["data"]->exec($temp);
+
+$stmt = $db["data"]->query(
+    'SELECT submissions.id AS id, submissions.hash, members.name, members.handle,
+    CASE WHEN name_is_public = 1 AND name IS NOT NULL
+        THEN name
+        ELSE CONCAT("Member ", submissions.member_id)
+    END AS author,
+    CASE WHEN doc_is_public = 1
+        THEN title
+        ELSE CONCAT("Entry ", submissions.id)
+    END AS title
+    ,
+    doc_is_public,
+    name_is_public,
+    participants.disqualified,
+
+    row_number() OVER(ORDER BY
+    round_1.average_score DESC, round_1.num_scores DESC) AS rank_round_1,
+    iif(round_1.average_score, format("%.2f", round_1.average_score), NULL) AS score_round_1,
+    round_1.num_scores AS round_1_num_scores,
+
+    row_number() OVER(ORDER BY
+    round_2.average_score DESC, round_2.num_scores DESC,
+    round_1.average_score DESC, round_1.num_scores DESC) AS rank_round_2,
+    iif(round_2.average_score, format("%.2f", round_2.average_score), NULL) AS score_round_2,
+    round_2.num_scores AS round_2_num_scores,
+
+    row_number() OVER(ORDER BY
+    round_3.average_score DESC, round_3.num_scores DESC,
+    round_2.average_score DESC, round_2.num_scores DESC,
+    round_1.average_score DESC, round_1.num_scores DESC) AS rank_round_3,
+    iif(round_3.average_score, format("%.2f", round_3.average_score), NULL) AS score_round_3,
+    round_3.num_scores AS round_3_num_scores
+    FROM submissions
+    LEFT JOIN members ON submissions.member_id = members.id
+    JOIN round_1 ON submissions.id = round_1.submission_id
+    LEFT JOIN round_2 ON submissions.id = round_2.submission_id
+    LEFT JOIN round_3 ON submissions.id = round_3.submission_id
+    LEFT JOIN participants ON participants.member_id = submissions.member_id
+    GROUP BY submissions.id, submissions.member_id
+    ORDER BY rank_round_3;',
+    PDO::FETCH_OBJ
+);
+
+/** === END new display query === */
+
+else:
+
+/** === START old display query === */
 $stmt = $db["data"]
     ->prepare('SELECT submissions.id AS id, submissions.hash, members.name, members.handle,
     CASE WHEN name_is_public = 1 AND name IS NOT NULL
@@ -18,15 +99,32 @@ $stmt = $db["data"]
     CASE WHEN doc_is_public = 1
         THEN title
         ELSE CONCAT("Entry ", submissions.id)
-    END AS title
-    , doc_is_public, name_is_public, score_round_1, rank_round_1, score_round_2, rank_round_2, score_round_3, rank_round_3, rank_final, votes_round_1, votes_round_2, votes_round_3, num_assignments_round_1, num_assignments_round_2, num_assignments_round_3
+    END AS title,
+    doc_is_public,
+    name_is_public,
+    score_round_1,
+    rank_round_1,
+    score_round_2,
+    rank_round_2,
+    score_round_3,
+    rank_round_3,
+    rank_final,
+    votes_round_1,
+    votes_round_2,
+    votes_round_3,
+    num_assignments_round_1,
+    num_assignments_round_2,
+    num_assignments_round_3
     FROM submissions
     JOIN members ON submissions.member_id = members.id
     WHERE submissions.game_id = :id AND rank_final IS NOT NULL AND submissions.transaction_id IS NOT NULL ORDER BY rank_final ASC');
 
-$results = $stmt->execute([
+$stmt->execute([
     "id" => $_GET["game"],
 ]);
+/** === END old display query === */
+endif;
+
 $row = $stmt->fetch();
 
 if (!$row) {
@@ -38,103 +136,95 @@ include "partials/head.php";
 ?>
     
         
-    
-    
-    
-    
-            
-                
-                    Results for Game = $_GET[
-                        "game"
-                    ] ?>
-                
-                    
-                        | Title | 
-                        Author | 
-                        Score | 
-                        Rank | 
-                    
-                    
-                        | Round One | 
-                        Round Two | 
-                        Round Three | 
-                        Round One | 
-                        Round Two | 
-                        Round Three | 
-                    
-                
-                
-                    
-                        >
-                            | 
-                                = $has_visible_doc
-                                    ? "$doc_title"
-                                    : $doc_title ?>
-                                (disqualified)
-                             | 
-                            = $row["name_is_public"]
-                                ? "$author"
-                                : $author ?> | 
-                            >= is_null($row["score_round_1"])
-    ? 0
-    : $row["score_round_1"] ?> | 
-                            >= is_null($row["score_round_2"])
-    ? 0
-    : $row["score_round_2"] ?> | 
-                            >= is_null($row["score_round_3"])
-    ? 0
-    : $row["score_round_3"] ?> | 
-                            = $row["rank_round_1"] ?> | 
-                            = $row["rank_round_2"] ?> | 
-                            = $row["rank_round_3"] ?> | 
+        
+        
+        
+        
+                
+                    
+                        Results for Game = $_GET[
+                            "game"
+                        ] ?>
+                    
+                        
+                            | Title | 
+                            Author | 
+                            Score | 
+                            Rank | 
                         
-                    fetch()); ?>
-                
-                
-                
-            
-        
 
-        
-        = $description ?>
-        
-        
+                        
+                            | Round One | 
+                            Round Two | 
+                            Round Three | 
+                            Round One | 
+                            Round Two | 
+                            Round Three | 
+                        
+                    
+                    
+                        doc_is_public || IS_ADMIN;
+                            $doc_title = htmlspecialchars(
+                                $row->title,
+                                ENT_QUOTES
+                            );
+                            $doc_url = sprintf("/docs/%s", $row->hash);
+                            $author = htmlspecialchars($row->author, ENT_QUOTES);
+                            $profile_url = "/members/" . $row->handle;
+
+                            $is_disqualified = $row->disqualified ??
+                                ($row->rank_round_1 &&
+                                    $row->num_assignments_round_1 &&
+                                    !$row->votes_round_1) ||
+                                    ($row->rank_round_2 &&
+                                    $row->num_assignments_round_2 &&
+                                    !$row->votes_round_2) ||
+                                    ($row->rank_round_3 &&
+                                    $row->num_assignments_round_3 &&
+                                    !$row->votes_round_3)
+                                    ? true
+                                    : false;
+                            ?>
+                            >
+                                | 
+                                    = $has_visible_doc
+                                        ? "$doc_title"
+                                        : $doc_title ?>
+                                    (disqualified)
+                                 | 
+                                = $row->name_is_public
+                                    ? "$author"
+                                    : $author ?> | 
+                                score_round_1)
+                                    ? 'class="empty"'
+                                    : "" ?>>= is_null($row->score_round_1)
+        ? 0
+        : $row->score_round_1 ?> | 
+                                score_round_2)
+                                    ? 'class="empty"'
+                                    : "" ?>>= is_null($row->score_round_2)
+        ? 0
+        : $row->score_round_2 ?> | 
+                                score_round_3)
+                                    ? 'class="empty"'
+                                    : "" ?>>= is_null($row->score_round_3)
+        ? 0
+        : $row->score_round_3 ?> | 
+                                = $row->rank_round_1 ?> | 
+                                = $row->rank_round_2 ?> | 
+                                = $row->rank_round_3 ?> | 
+                            
+                        fetch(PDO::FETCH_OBJ)); ?>
+                    
+                    
+                    
+                
+            
 
+            
+            = $description ?>
+            
+