Aide pour créer un script

Avatar du membre
Foo
Petit nouveau ! | 7 Messages

18 févr. 2024, 23:34

Bonjour à tous :)

Je suis confronté à un soucis auquel je ne sais pas quoi faire.

Dans le jeu vidéo World of Warcraft, on peut faire des assauts, il y en a 6 différentes, toutes les 12 heures et l'assaut a une durée de a 4h, cela dans un ordre défini.

Aujourd'hui, je souhaite écrire un script qui me rappel quel est l'assaut en cours et si il y en a pas, quel sera le prochain et dans combien de temps.

Mais le problème, c'est que je ne sais pas par où commencer.

Pourriez-vous m'orienté ou me donner une idée de comment faire ? sans utiliser de base de donnée ça serai top !

Rappel :

- 6 assauts dans un ordre défini
-- Assaut 1 > Assaut 2 > Assaut 3 > Assaut 4 > Assaut 5 > Assaut 6
- 1 assaut toutes les 12 heures
- 1 assaut a une durée de 4 heures

Exemple de timer :

Assault 1 - 5h - 12h
Assault 2 - 12h - 19h
Assault 3 - 19h - 2h
Assault 4 - 2h - 9h

Je n'ai encore rien écrit, mais je souhaite juste une direction, si possible =)

Cordialement

Mammouth du PHP | 2605 Messages

18 févr. 2024, 23:45

" Assault 1 - 5h - 12h"
12 - 5 = 7
" - 1 assaut a une durée de 4 heures"
on trouve un 7h dans votre exemple, mais pas de 4h
votre exemple est juste ?

l'assaut 1 commence toujours à 5h ?

Avatar du membre
Foo
Petit nouveau ! | 7 Messages

19 févr. 2024, 01:00

Non, par exemple :

Les 3 prochains assauts sont à :

- lundi à 9h
- mardi à 4h
- mardi à 23h

Donc un assaut dure 4h + 12h d'attente entre. Je crois que c'est calculé comme ça.

Mammouth du PHP | 2605 Messages

19 févr. 2024, 01:03

c'est par toutes les semaines
- lundi à 9h
- mardi à 4h
- mardi à 23h
ou cela change d'une semaine à l'autre ?

" Assault 1 - 5h - 12h"
12 - 5 = 7
" - 1 assaut a une durée de 4 heures"
on trouve un 7h dans votre exemple, mais pas de 4h
votre exemple est juste ?

Avatar du membre
Foo
Petit nouveau ! | 7 Messages

19 févr. 2024, 15:53

En gros, c'est un assaut toutes les 12h, d'une durée de 4h

je pense que les 4h s'additionnent aux 12h je ne sais pas vraiment :

Assaut :

Assaut 1 : Lundi (aujd) : 9h - durée : 4h
Assaut 2 : Mardi : 4h - durée 4h
Assaut 3 : Mardi : 23h - durée 4h
Assaut 4 : Mercredi 18h - durée 4h

Je n'arrive pas à avoir horaires totaux, car c'est pas indiqué, je dois calculer par moi même ^^

Avatar du membre
Mammouth du PHP | 1476 Messages

19 févr. 2024, 23:40

Un réveil en ligne et gratuit pour ne pas réinventer la roue serait adapté ?

https://webhorloge.fr/

Avatar du membre
Foo
Petit nouveau ! | 7 Messages

20 févr. 2024, 17:36

Un réveil en ligne et gratuit pour ne pas réinventer la roue serait adapté ?

https://webhorloge.fr/
Alors c'est pour l'intégrer à un ageanda déjà bien fourni, un sorte de module complémentaire, donc ça ne fonctionne pas merci pour ce message :)

Avatar du membre
Mammouth du PHP | 1476 Messages

20 févr. 2024, 17:59

D'accord. En quel langage il est codé cet agenda ?

Avatar du membre
Foo
Petit nouveau ! | 7 Messages

21 févr. 2024, 19:14

Et bien en PHP, évidement ^^

Avatar du membre
Mammouth du PHP | 1476 Messages

21 févr. 2024, 21:05

C'est un payant ? S'il est gratuit, je veux bien le lien pour que je regarde ce qu'on peut faire stp. ;)

Avatar du membre
Foo
Petit nouveau ! | 7 Messages

21 févr. 2024, 21:22

C'est moi l'ai écrit, tout est en local, mais l'agenda en soit n'a aucune importance, en gros, ma question serai :

comment incrémenter une date, à partir d'une autre, toutes les 12h, et ajouter 4h ^^

Mammouth du PHP | 2605 Messages

21 févr. 2024, 21:29


Avatar du membre
Mammouth du PHP | 1476 Messages

21 févr. 2024, 22:09

$date_a_incrementer = '2024-02-21 21:04';
$date_prochaine = date('Y-m-d H:i', strtotime('+12 hours', strtotime($date_a_incrementer)));
var_dump($date_a_incrementer, $date_prochaine);

Code : Tout sélectionner

C:\wamp64\www\test.php:6:string '2024-02-21 21:04' (length=16) C:\wamp64\www\test.php:6:string '2024-02-22 09:04' (length=16)

Avatar du membre
Mammouth du PHP | 1582 Messages

22 févr. 2024, 18:34

Salut, c'est le genre de problématique que j'aime bien, j'ai donc voulu m'y essayer.

En partant sur cette base :

Assaut 1 : Lundi (aujd) : 9h - durée : 4h
Assaut 2 : Mardi : 4h - durée 4h
Assaut 3 : Mardi : 23h - durée 4h
Assaut 4 : Mercredi 18h - durée 4h

on peut dire qu'il y a un assaut toutes les 19h.

Je suis donc parti sur ce principe un assaut toutes les 19h avec un assaut référence le 21 février à 18h.

Ma fonction, on peut surement faire mieux mais ça marche (la date par défaut sur la fonction c'est juste pour montrer le format attendu) :
function getDayAssaults(string $dayDate = '2024-02-22'): array
{
    $referenceDate = new DateTime('2024-02-21 18:00');
    $assaultDelayHours = 19;

    $assaultDelaySecondes = $assaultDelayHours * 60 * 60;
    $referenceTime = $referenceDate->getTimestamp();

    $startRatio = ((new DateTime($dayDate . '00:00'))->getTimestamp() - $referenceTime) / $assaultDelaySecondes;
    $endRatio = ((new DateTime($dayDate . '23:59'))->getTimestamp() - $referenceTime) / $assaultDelaySecondes;

    $dayAssaults = [];
    for ($i = floor($endRatio - floor(24 / $assaultDelayHours)); $i < $endRatio; $i++) {
        $hour = floor((24 / ($endRatio - $startRatio)) * ($i - $startRatio));

        if ($hour < 0) {
            continue ;
        }

        $dayAssaults[] = new DateTime($dayDate . ' ' . $hour . ':00');
    }

    return $dayAssaults;
}

$oneDayInterval = new DateInterval('P1D');
$date = (new DateTime('2024-02-19'))->sub($oneDayInterval);

for ($i = 0; $i < 20; $i++) {
    $dayDate = $date->add($oneDayInterval)->format('Y-m-d');
    $dayAssaults = getDayAssaults($dayDate);

    echo $dayAssaults[0]->format('l d F') . ' at ';
    echo implode(' and ', array_map(static function ($assaultDate) {
        return $assaultDate->format('H:i');
    }, $dayAssaults)) . '.';

    echo '<br/>';
}

/*
Résultat :
Monday 19 February at 09:00.
Tuesday 20 February at 04:00 and 23:00.
Wednesday 21 February at 18:00.
Thursday 22 February at 13:00.
Friday 23 February at 08:00.
Saturday 24 February at 03:00 and 22:00.
Sunday 25 February at 17:00.
Monday 26 February at 12:00.
Tuesday 27 February at 07:00.
Wednesday 28 February at 02:00 and 21:00.
Thursday 29 February at 16:00.
Friday 01 March at 11:00.
Saturday 02 March at 06:00.
Sunday 03 March at 01:00 and 20:00.
Monday 04 March at 15:00.
Tuesday 05 March at 10:00.
Wednesday 06 March at 05:00.
Thursday 07 March at 00:00 and 19:00.
Friday 08 March at 14:00.
Saturday 09 March at 09:00.
*/
Tu peux modifier le délai ou la date de référence et ça devrait toujours fonctionner.

En gros mon idée a été de me dire à combien de fois 19h suis-je au début et à la fin de la journée depuis la date de référence.
A partir de la, si par exemple au début de la journée, c'est à dire à minuit, je suis à 4,9 fois 19h ; alors quelle heure est-il à 5 fois 19h ? et si la fin de la journée est à plus de 6 fois 19h alors quelle heure est-il à 6 fois 19h ? C'est ce que permettent de faire la boucle et le calcul.
Développeur web depuis + de 20 ans

Avatar du membre
Mammouth du PHP | 1476 Messages

22 févr. 2024, 19:00

=D>