Correction du classement #13

Merged
nemunaire merged 4 commits from fix/classement into master 2021-01-01 20:07:03 +00:00
Collaborator

Il y a trois parties a cette PR : le calcul des points, le calcul du classement et l'historique.

Calcul des points

Les points a ajouté au joueur lors de la construction d'un batiment (ou tout autre ressources) sont calculés là : https://gitea.nemunai.re/halo-battle/game/src/branch/master/onyx2/include/Class/user.php#L114. On voit que ce calcul se base fortement sur la fonction bourse_calcPrixBase(ici et la valeure de la bourse. Si la bourse est à 0, pas de points. Non content d'être très inégalitaire (car la « valeure » d'un point peut varier), il se base sur la bourse, système pas fini du tout dans le coe (ni dans les docs d'ailleurs).
Il faut donc le nourrir de fausse valeure, via les requêtes SQL suivantes :
INSERT INTO bourse_ressources VALUES (1, 1000, "");
UPDATE bourse_ressources SET id=0;
INSERT INTO bourse_ressources VALUES (1, 1000, "");
INSERT INTO bourse_ressources VALUES (2, 1000, "");

En fait, c'était n'importe quoi :) En regardant plus précisément, on ne devrait pas du tout utiliser cette fonction, qui a un but tout autre : calculer le prix d'achat d'une ressource sur le marché. Je repasse donc a un système plus simple : le nombre de ressources consommées x 0.7

Calcul du classement

Le calcul du classement est assez simple, celui qui a le plus de point est en haut, celui avec le moins de points en bas. Pour celà, la requête suivante fait le job : SET @p=0; UPDATE $table_user SET place_points = (@p:=@p+1) ORDER BY points DESC;

Il faut faire tourner cette requête assez réguliérement, j'ai donc créer un système de cron, qui permet de faire tourner des scripts en backends, quand il y a moins de charge (à 3h du matin par exemple).

Historique

De nombreux joueurs ont déjà lancé plein de constructions sur le server, on aimerait donc les prendre en compte dans le calcul. Pour cela, le script suivant est à placer dans cron/ et a executer, une et une seule fois (sinon il double le nombre de point):

<?php

//Définition de la constante anti-hacking
define("INDEX", 1);
define("DEBUG", false);

//Inclusion de l'API Onyx
require_once(__DIR__ . "/../onyx2/load.php");
require_once("common.php");

require_once("donnees.php");
include_once("Class/user.php");
include_once("Class/planete.php");

$bdd = new BDD();
$reqPlan = $bdd->query("SELECT id, id_user, file_bat, file_tech, file_cas, file_vais, file_ter, timestamp FROM $table_planete;");
foreach ($reqPlan as $plan) {
    $metal = $cristal = $hydrogene = 0;
    $planete = new Planete($plan['id'], true);
    $user = new User($plan['id_user']);
    print "Updating points for planete '" . $planete->nom_planete . "', colonized by user '" . $user->pseudo . "'\n";
    foreach ($planete->batiments as $i => $niveau) {
        if ($niveau == 0) {
            continue;
        }
        for ($j=1; $j <= $niveau; $j++) {
            $metal += dBatiments::metal($i, $j, $planete);
            $cristal += dBatiments::cristal($i, $j, $planete);
            $hydrogene += dBatiments::hydrogene($i, $j, $planete);
        }
    }
    $rate = 0.7;
    $points = $metal *$rate;
    $points += $cristal *$rate;
    $points += $hydrogene *$rate;
    print "Adding $points points to this user\n";
    $user->addPoints($metal, $cristal, $hydrogene);
    $user = null;
}


Il y a trois parties a cette PR : le calcul des points, le calcul du classement et l'historique. ### Calcul des points ~~Les points a ajouté au joueur lors de la construction d'un batiment (ou tout autre ressources) sont calculés là : https://gitea.nemunai.re/halo-battle/game/src/branch/master/onyx2/include/Class/user.php#L114. On voit que ce calcul se base fortement sur la fonction `bourse_calcPrixBase`([ici](https://gitea.nemunai.re/halo-battle/game/src/branch/master/onyx2/include/function.php#L309-L322) et la valeure de la bourse. Si la bourse est à 0, pas de points. Non content d'être très inégalitaire (car la « valeure » d'un point peut varier), il se base sur la bourse, système pas fini du tout dans le coe (ni dans les docs d'ailleurs).~~ ~~Il faut donc le nourrir de fausse valeure, via les requêtes SQL suivantes :~~ ~~INSERT INTO bourse_ressources VALUES (1, 1000, "");~~ ~~UPDATE bourse_ressources SET id=0;~~ ~~INSERT INTO bourse_ressources VALUES (1, 1000, "");~~ ~~INSERT INTO bourse_ressources VALUES (2, 1000, "");~~ En fait, c'était n'importe quoi :) En regardant plus précisément, on ne devrait pas du tout utiliser cette fonction, qui a un but tout autre : calculer le prix d'achat d'une ressource sur le marché. Je repasse donc a un système plus simple : `le nombre de ressources consommées x 0.7` ### Calcul du classement Le calcul du classement est assez simple, celui qui a le plus de point est en haut, celui avec le moins de points en bas. Pour celà, la requête suivante fait le job : `SET @p=0; UPDATE $table_user SET place_points = (@p:=@p+1) ORDER BY points DESC;` Il faut faire tourner cette requête assez réguliérement, j'ai donc créer un système de cron, qui permet de faire tourner des scripts en backends, quand il y a moins de charge (à 3h du matin par exemple). ### Historique De nombreux joueurs ont déjà lancé plein de constructions sur le server, on aimerait donc les prendre en compte dans le calcul. Pour cela, le script suivant est à placer dans `cron/` et a executer, une et une seule fois (sinon il double le nombre de point): ``` <?php //Définition de la constante anti-hacking define("INDEX", 1); define("DEBUG", false); //Inclusion de l'API Onyx require_once(__DIR__ . "/../onyx2/load.php"); require_once("common.php"); require_once("donnees.php"); include_once("Class/user.php"); include_once("Class/planete.php"); $bdd = new BDD(); $reqPlan = $bdd->query("SELECT id, id_user, file_bat, file_tech, file_cas, file_vais, file_ter, timestamp FROM $table_planete;"); foreach ($reqPlan as $plan) { $metal = $cristal = $hydrogene = 0; $planete = new Planete($plan['id'], true); $user = new User($plan['id_user']); print "Updating points for planete '" . $planete->nom_planete . "', colonized by user '" . $user->pseudo . "'\n"; foreach ($planete->batiments as $i => $niveau) { if ($niveau == 0) { continue; } for ($j=1; $j <= $niveau; $j++) { $metal += dBatiments::metal($i, $j, $planete); $cristal += dBatiments::cristal($i, $j, $planete); $hydrogene += dBatiments::hydrogene($i, $j, $planete); } } $rate = 0.7; $points = $metal *$rate; $points += $cristal *$rate; $points += $hydrogene *$rate; print "Adding $points points to this user\n"; $user->addPoints($metal, $cristal, $hydrogene); $user = null; } ```
Owner

Peux-tu plutôt ajouter une méthode multi_query, au lieu de faire la condition, celle-ci n'est pas nécessaire car on sait au départ si l'on souhaite faire du multi_query ou non.

Peux-tu plutôt ajouter une méthode `multi_query`, au lieu de faire la condition, celle-ci n'est pas nécessaire car on sait au départ si l'on souhaite faire du multi_query ou non.
Nigel force-pushed fix/classement from e25094d4f6 to afa97638fa 2021-01-01 13:28:20 +00:00 Compare
nemunaire merged commit dcb0eaf50d into master 2021-01-01 20:07:03 +00:00
Sign in to join this conversation.
No reviewers
No Label
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: halo-battle/game#13
No description provided.