]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Improve player_handicap icon implementation
authorotta8634 <k9wolf@pm.me>
Sun, 15 Dec 2024 11:01:37 +0000 (19:01 +0800)
committerotta8634 <k9wolf@pm.me>
Sun, 15 Dec 2024 11:01:37 +0000 (19:01 +0800)
Changed the handicap_total calculation method to average given and taken, instead of multiplying them.
Made .handicap_level range from 0 to 16 instead of to 255, so the player_handicap icon will essentially be \xFFF, \xFEE, ..., \xF00 from 1 to 16.
Added HANDICAP_MAX_LEVEL_EQUIVALENT, set to 2, the cl_handicap at which .handicap_level 16 is reached.
Improved some associated comments.
Fixed ".handicap_total" typo.

qcsrc/client/hud/panel/scoreboard.qc
qcsrc/server/handicap.qc
qcsrc/server/handicap.qh

index 7fb6c512ced88ea366b59395ae2661b7b4b23be3..5bd5bb96a4f2b4f8217afbc0310696693555858d 100644 (file)
@@ -1010,8 +1010,8 @@ string Scoreboard_GetName(entity pl)
        if (handicap_lvl != 0)
        {
                sbt_field_icon_extra1 = "gfx/scoreboard/player_handicap";
-               sbt_field_icon_extra1_rgb = '1 0 0' + '0 1 1' * ((255 - handicap_lvl) / 254);
-               // goes from white to red over level 1 to 255
+               sbt_field_icon_extra1_rgb = '1 0 0' + '0 1 1' * ((16 - handicap_lvl) / 15);
+               // goes from white to red over level 1 to 16
        }
        return entcs_GetName(pl.sv_entnum);
 }
index 12cfbed848fac456443729006b99391e326199c7..4ff59a729ff54a582091b55e057067468c7bc6f5 100644 (file)
@@ -6,7 +6,7 @@
 /// \copyright GNU GPLv2 or any later version.
 
 #include <common/state.qh>
-#include <common/ent_cs.qh> // for .handicap_total
+#include <common/ent_cs.qh> // for .handicap_level
 #include <lib/replicate.qh> // for REPLICATE_APPLYCHANGE
 #include <server/client.qh>
 
@@ -95,12 +95,12 @@ float Handicap_GetTotalHandicap(entity player, bool receiving)
 
 void Handicap_UpdateHandicapLevel(entity player)
 {
-       float handicap_total = Handicap_GetTotalHandicap(player, true) *
-               Handicap_GetTotalHandicap(player, false);
+       float handicap_total = (Handicap_GetTotalHandicap(player, true) +
+               Handicap_GetTotalHandicap(player, false)) / 2;
        if (handicap_total <= 1)
                player.handicap_level = 0;
        else
-               player.handicap_level = map_bound_ranges(handicap_total, 1, 5, 1, 255);
+               player.handicap_level = floor(map_bound_ranges(handicap_total, 1, HANDICAP_MAX_LEVEL_EQUIVALENT, 1, 16));
 }
 
 REPLICATE_APPLYCHANGE("cl_handicap_damage_given", { Handicap_UpdateHandicapLevel(this); });
index b31f3273c63dcebd0eb168dda7053562a6d426f1..39a00e1a5c4f15c0d5334d35f98e2a072fde094a 100644 (file)
@@ -50,7 +50,11 @@ float Handicap_GetTotalHandicap(entity player, bool receiving);
 /// \param[in] player Player to check.
 void Handicap_UpdateHandicapLevel(entity player);
 
+#define HANDICAP_MAX_LEVEL_EQUIVALENT  2.0
+
 .int handicap_level;
-// This int ranges 0 to 255, 0 meaning no handicap, 1-255 representing handicap "levels"
-// ... mapped from 1.0 to 5.0, using given * taken (i.e. both-ways handicap)
-// It is networked to the client
+// This int ranges 0 to 16, 0 meaning no handicap, 1 to 16 representing handicap "levels" mapped
+// from 1.0 to HANDICAP_MAX_LEVEL_EQUIVALENT, using (given + taken)/2 (i.e. both-ways handicap).
+// It is networked to the client.
+// The levels are mostly meaningless, just used to determine the player_handicap icon color.
+