Giter Club home page Giter Club logo

jdisgames-2020's Introduction

pipeline status test-realtime status

JDIS Games 2020

Démarrage

Besoin de docker et docker-compose pour démarrer.

cd server

docker-compose up

Le serveur sera disponible à l'adresse http://localhost:4000.

Utilisation

Pages du client web

  • /

    Page d'accueil de l'application. Cette page est présentement vide, mais sera éventuellement remplie d'informations utiles pour les participants de la compétition.

  • /admin

    Page d'administration de la compétition. Le nom d'utilisateur et le mot de passe sont tous les deux "admin". Permet de démarrer, arrêter le redémarrage automatique et terminer la partie.

  • /spectate

    Permet de visualiser la partie en cours.

  • /scoreboard

    Permet de consulter le tableau des scores pour l'entièreté de la compétition.

  • /team-registration

    Permet d'inscrire une équipe pour la compétition.

Préparation et démarrage d'une partie

Avant de démarrer une partie, il est recommandé d'inscrire au moins une équipe à la compétition. Après l'inscription, prenez soin de noter la clé d'authentification qui vous sera donnée. Vous en aurez besoin pour connecter un agent intelligent au serveur.

Une fois une ou plusieurs équipes inscrites, vous pouvez vous rendre dans la page d'administration pour démarrer la partie. Spécifiez tout d'abord le nombre de «ticks» (le serveur exécute 15 «ticks» par seconde), puis démarrez la partie.

Une fois la partie démarrée, vous pouvez vous rendre dans les pages de visualisation de la partie ou du tableau des scores.

Connection d'un agent au serveur

L'agent inclus dans le projet est écrit en Python. Voir ici pour le télécharger si nécessaire. L'agent a été testé avec les versions 3.7 à 3.10.

Pour démarrer l'agent, rendez-vous dans le dossier StarterPacks/python puis exécutez la commande suivante :

python run_bot.py {secret_key}

L'agent se connectera au serveur et enverra périodiquement des actions au serveur.

Il est possible de démarrer plusieurs agents simultanément avec des clés secrètes différentes pour simuler plusieurs équipes.

Développement

Pour apporter des modifications ou pour exécuter le serveur dans un environnement de développement, il faut d'abord installer Elixir (version 1.13.4) et PostgreSQL (n'importe quelle version récente).

Une fois ces dépendances installées, assurez-vous d'avoir une base de données PostgreSQL accessible avec les paramètres suivants :

  • nom d'utilisateur : postgres
  • mot de passe : postgres
  • nom de la base de données : diep_io_dev

Le reste des instructions de développement sont disponibles dans le fichier README du serveur.

Stress test

La tâche mix stress_test est disponible pour stress tester l'application. Elle démarre le serveur et 30 bots et doit être interrompue avec CTRL+C.

jdisgames-2020's People

Contributors

res260 avatar lamachinecaron avatar blond11516 avatar zelarpmaster avatar francishamel avatar

Stargazers

Fatih Altuntaş avatar nyapsilon avatar  avatar

Watchers

 avatar  avatar  avatar

jdisgames-2020's Issues

Déplacer fabric en dépendance npm

Présentement, fabric est téléchargé par le client via une balise script dans ./lib/diep_io_web/templates/page/spectate.html.leex`. Il faudrait plutôt l'installer comme dépendance npm afin de centraliser toutes les dépendances au même endroit.

Impémenter une "hot zone"

Ajouter un système de "hot zone"/roi de la montagne.

Idées d'implémentation:

  • spawn une zone at random
  • on gagne des points chaque seconde qu'on est à l'intérieur/après être resté dedans X secondes
  • la zone disparait après un certain temps
  • no points si ya plusieurs personnes dans la zone
  • ça pourrait aussi être une zone statique sur la map
  • pourrait avoir des zones qui donnent des points et d'autres qui donnent de l'xp

Figure out ce qu'il rest à faire pour terminer le jeu

Features actuelles

  • tank purchase

    • speed
    • fire rate
    • projectile damage
    • max hp
    • body damage
    • hp regen
  • set target

  • set destination

  • shoot

  • collisions

  • hp regen

  • débris

  • respawn after death

  • time corrections

  • score

  • experience -> upgrade tokens

  • main and secondary game

    • start, stop, kill, spectate
  • team registration

  • scoreboard

  • frontend

    • spectate
      • follow team

Trucs à refactor

  • phoenix best practices
  • ecto best practices
  • release best practices (config)
  • architecture (boundary)
  • tests best practices

Trucs à faire

  • js starter pack?
  • nouvelles upgrades?
  • upgrades majeures?

Fix real time stats badges in readme

README real time stats badges are currently broken because they rely on GitLab artifacts urls. Gonna have to figure out how to get the artifacts from GitHub actions. (Also the badges are not event generated right now)

Réusiner l'implémentation Python de channels

Notre implémentation homemade des channels leak pas mal de détails d'implémentation dans les autres couches. Il y a un risque que ça nous complique la vie si on doit faire des quick fixes dans le starter pack pendant la compé.

Je propose de réusiner ça un peu pour que ça ressemble plus à la lib JS.

Inscrire des équipes

Right now on seed des users bidons sans nom précis, ça va prendre un mécanisme pour inscrire des users avec des bons nom de team et leur partager leur secret key

Valider le format des actions envoyées par les bots

En ce moment rien ne garantit le format des actions envoyées au serveur par les bots. En cas d'action invalide, le process du channel lève une ArgumentError et plante.

Il faudrait au moins valider le format des actions dans les clients, mais idéalement dans le serveur aussi de façon à pouvoir retourner une erreur claire.

Some collision tests fails with specific seeds

Some collision tests fail with specific seeds:

  • 284189

    Test output
    18:05:40.441 [info]  Already up
    Excluding tags: [:RT]
    
    ..................................................................................
    
    1) test handle_collisions/1 does not decrease hp of tank hit by it's own projectile (GameStateTest)
      test/diep_io/core/game_state_test.exs:217
      Assertion with == failed
      code:  assert Map.fetch!(updated_game_state.tanks(), @user_id) == tank
      left:  %Diep.Io.Core.Tank{body_damage: 20, cannon_angle: -132.84216689386466, cooldown: 25, destination: nil, fire_rate: 25, has_died: false, hp_regen: 0.4, id: 420, max_hp: 100, name: "SomeUsername", position: {7851, 8412}, projectile_damage: 20, speed: 10, target: {2411, 2546}, upgrade_levels: %{body_damage: 0, fire_rate: 0, hp_regen: 0, max_hp: 0, projectile_damage: 0, speed: 0}, current_hp: 90, experience: 25, score: 25, upgrade_tokens: 2}
      right: %Diep.Io.Core.Tank{body_damage: 20, cannon_angle: -132.84216689386466, cooldown: 25, destination: nil, fire_rate: 25, has_died: false, hp_regen: 0.4, id: 420, max_hp: 100, name: "SomeUsername", position: {7851, 8412}, projectile_damage: 20, speed: 10, target: {2411, 2546}, upgrade_levels: %{body_damage: 0, fire_rate: 0, hp_regen: 0, max_hp: 0, projectile_damage: 0, speed: 0}, current_hp: 100, experience: 0, score: 0, upgrade_tokens: 0}
      stacktrace:
        test/diep_io/core/game_state_test.exs:226: (test)
    
    ................................................................................
    
    Finished in 2.5 seconds
    165 tests, 1 failure, 2 excluded
    
    Randomized with seed 284189
    [os_mon] memory supervisor port (memsup): Erlang has closed
    [os_mon] cpu supervisor port (cpu_sup): Erlang has closed
    
  • 440815

    Test output
    08:24:44.060 [info]  Already up
    Excluding tags: [:RT]
    
    ......................................................................................
    
    1) test handle_collisions/1 decreases hp of all tanks hit by projectiles (GameStateTest)
      test/diep_io/core/game_state_test.exs:208
      Assertion with == failed
      code:  assert Map.fetch!(updated_game_state.tanks(), tank.id()).current_hp() == Tank.hit(tank, tank.projectile_damage()).current_hp()
      left:  70
      right: 80
      stacktrace:
        test/diep_io/core/game_state_test.exs:213: (test)
    
    ............................................................................
    
    Finished in 2.3 seconds
    165 tests, 1 failure, 2 excluded
    
    Randomized with seed 440815
    [os_mon] memory supervisor port (memsup): Erlang has closed
    [os_mon] cpu supervisor port (cpu_sup): Erlang has closed
    
  • 795773

    Test output
    08:28:54.965 [info]  Already up
    Excluding tags: [:RT]
    
    ......................................................................................
    
    1) test handle_collisions/1 does not decrease hp of tank hit by it's own projectile (GameStateTest)
       test/diep_io/core/game_state_test.exs:217
       Assertion with == failed
       code:  assert Map.fetch!(updated_game_state.tanks(), @user_id) == tank
       left:  %Diep.Io.Core.Tank{body_damage: 20, cannon_angle: 173.92307439303102, cooldown: 25, destination: nil, experience: 0, fire_rate: 25, has_died: false, hp_regen: 0.4, id: 420, max_hp: 100, name: "SomeUsername", position: {6958, 7870}, projectile_damage: 20, score: 0, speed: 10, target: {5070, 8071}, upgrade_levels: %{body_damage: 0, fire_rate: 0, hp_regen: 0, max_hp: 0, projectile_damage: 0, speed: 0}, upgrade_tokens: 0, current_hp: 90}
       right: %Diep.Io.Core.Tank{body_damage: 20, cannon_angle: 173.92307439303102, cooldown: 25, destination: nil, experience: 0, fire_rate: 25, has_died: false, hp_regen: 0.4, id: 420, max_hp: 100, name: "SomeUsername", position: {6958, 7870}, projectile_damage: 20, score: 0, speed: 10, target: {5070, 8071}, upgrade_levels: %{body_damage: 0, fire_rate: 0, hp_regen: 0, max_hp: 0, projectile_damage: 0, speed: 0}, upgrade_tokens: 0, current_hp: 100}
       stacktrace:
         test/diep_io/core/game_state_test.exs:226: (test)
    
    ............................................................................
    
    Finished in 2.3 seconds
    165 tests, 1 failure, 2 excluded
    
    Randomized with seed 795773
    [os_mon] memory supervisor port (memsup): Erlang has closed
    [os_mon] cpu supervisor port (cpu_sup): Erlang has closed
    

Repenser le fire rate

les autres upgrades ont des diminuting returns, mais pas le fire rate (c'est le même problème que le Cooldown reduction, passer de 0% CDR à 20%CDR donne un moins bon résultat que de passer de 20%CDR à 40%CDR, même si les deux sont un bon de 20%CDR)

Il est possible de gagner des points dans la hot zone même si plusieurs joueurs y sont présents

Le problème est dans entity grid, on considère seulement la cell qui contient directement l'entité et les 9 cells directement adjacentes. La hot zone est beaucoup plus grosse que ça, donc si on est sur le bord de la hot zone, on est pas considéré par l'algo de collision.

Il faudrait modifier l'algo de construction de la grille d'entités pour supporter des entités qui peuvent être plus grandes qu'une cellule.

Enlever gettext

Gettxt est setup dans le projet mais n'est pas utilisé. Il faudrait l'enlever pour réduire la charge de maintenance.

Real time constraints test fail

The real time constraint for broadcast standard_deviation currently fails. I suspect this is because of the recent decoupling of game logic tick rate and client update rate.

Since client broadcasts are currently emitted by the gameloop, the client update rate can only be respected if it is a divisor of the game logic tick rate.

We should probably use separate processes for handling these two loops.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.