From 38feaa1a16bdf911621fc5dc2827f78701beba0b Mon Sep 17 00:00:00 2001 From: Anthony Debucquoy Date: Mon, 13 Feb 2023 18:53:37 +0100 Subject: [PATCH 01/30] =?UTF-8?q?Premi=C3=A8re=20entrevue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JournalDeBord/src/SUMMARY.md | 5 +- JournalDeBord/src/chapter2.md | 1 - JournalDeBord/src/chapter_1.md | 5 - JournalDeBord/src/rapports/130223.md | 59 +++++ prototypes/tonitch/.gitattributes | 9 + prototypes/tonitch/.gitignore | 5 + prototypes/tonitch/app/build.gradle | 44 ++++ .../src/main/java/graphicals_test/App.java | 14 + .../test/java/graphicals_test/AppTest.java | 14 + .../gradle/wrapper/gradle-wrapper.properties | 6 + prototypes/tonitch/gradlew | 244 ++++++++++++++++++ prototypes/tonitch/gradlew.bat | 92 +++++++ prototypes/tonitch/settings.gradle | 12 + 13 files changed, 503 insertions(+), 7 deletions(-) delete mode 100644 JournalDeBord/src/chapter2.md delete mode 100644 JournalDeBord/src/chapter_1.md create mode 100644 JournalDeBord/src/rapports/130223.md create mode 100644 prototypes/tonitch/.gitattributes create mode 100644 prototypes/tonitch/.gitignore create mode 100644 prototypes/tonitch/app/build.gradle create mode 100644 prototypes/tonitch/app/src/main/java/graphicals_test/App.java create mode 100644 prototypes/tonitch/app/src/test/java/graphicals_test/AppTest.java create mode 100644 prototypes/tonitch/gradle/wrapper/gradle-wrapper.properties create mode 100755 prototypes/tonitch/gradlew create mode 100644 prototypes/tonitch/gradlew.bat create mode 100644 prototypes/tonitch/settings.gradle diff --git a/JournalDeBord/src/SUMMARY.md b/JournalDeBord/src/SUMMARY.md index 57c2365..9f00b0e 100644 --- a/JournalDeBord/src/SUMMARY.md +++ b/JournalDeBord/src/SUMMARY.md @@ -1,3 +1,6 @@ # Summary -- [First Toughts](./chapter_1.md) +# Rapports + +- [Première entrevue](./rapports/130223.md) + diff --git a/JournalDeBord/src/chapter2.md b/JournalDeBord/src/chapter2.md deleted file mode 100644 index 59d2d42..0000000 --- a/JournalDeBord/src/chapter2.md +++ /dev/null @@ -1 +0,0 @@ -Ceci est la page 2 du site \ No newline at end of file diff --git a/JournalDeBord/src/chapter_1.md b/JournalDeBord/src/chapter_1.md deleted file mode 100644 index 8f3dbc5..0000000 --- a/JournalDeBord/src/chapter_1.md +++ /dev/null @@ -1,5 +0,0 @@ -# First Toughts - -[Here will be transcribed the tought about the first reunion] - -blop diff --git a/JournalDeBord/src/rapports/130223.md b/JournalDeBord/src/rapports/130223.md new file mode 100644 index 0000000..1cd3e47 --- /dev/null +++ b/JournalDeBord/src/rapports/130223.md @@ -0,0 +1,59 @@ +# 13 Février 2023 + +Nous nous sommes réunis ce **Lundi 13 Février** pour une première entre-vue et pour discuter de notre vision vis à vis du projet. + +Nous avons pu discuter de plusieurs choses, notament: + +- Methode pour travailler en équipe +- Structure du projet +- Petite explication du fonctionnement de git +- Brainstorming des idées du jeu + +## Projet d'équipe + +Pour travailler en équipe nous allons utiliser gitea (équivalent à github) hosté par Anthony. (juste parce qu'il n'aime pas Microsoft) +Le projet est donc hosté à [cette addresse](http://git.herisson.ovh/undefined_name/School_Project.git). Il est dans un premier temps privé car d'autre membres de l'école +sont sur cette instance de gitea et ca serait dommage de leurs donner toutes nos idées! + +L'avantage de gitea est que nous pouvons utiliser une vue kanban des issues, ce qui nous permetterais de nous organiser plus facilement et de voir l'avancement +du projet! + +Nous avons également accés à ce Journal de bord à l'addresse (school.debucquoy.me)[http://school.debucquoy.me] sur un nom de domaine appartenant déjà à anthony qui nous +évide de payer un nouveau nom de domaine dans un premier temps + +Ce journal de bord devrais contenir tout les points important du dévelopement du projet ainsi que les rapports des différentes réunions. +Il nous sera autant utile pour améliorer notre structure et ne pas oublier des points précédament dit que pour les correcteurs voulants "aprécier" notre méthode de travaille + +## Idées + +Les premières idées du jeu ont pu être trouvée mais ne sont absolument pas fixe et pourrons donc être modifié à volonté lors du dévelopement. + +Le but serait de rendre le jeu plus intéréssant en y implémentant une histoire un peut intéréssante. (comme un visual novel) +L'histoire serait qu'un étudiant sur le point d'emménager dans un nouvel appartement doit donc ranger ses affaire dans un premier temps + +Nous aurions donc: +1) Level 1-10: Rangement des affaires dans des cartons +2) Level 11-20: Rangement des cartons dans un camion +3) Level 21-30: Rangement des nouvelles affaires dans un camion + +La représenations des pièces se ferait à l'aide d'éléments dans des matrices. Nous devons donc trouver un moyen de sauvegarder les différent niveau. + +## Easter Egg + +**Attention ne pas lire ce qui suit et passer directement au prochain chapitre pour ne pas être spoiler de ce potentiel easter-egg** + +Une idée d'easter-egg que nous pourrions implémenter dans le jeu si nous avons le temps serait de transformer le jeu en Tetris (car les pièces sont trés resemblantes) +et pour activer cet easter-egg, il faudrait lors des derniers niveau utiliser le bureau à placer d'une certaine manière pas encore définie. comme si nous jouions sur le pc +du bureau + +## Objectif pour la prochaine entre-vue / réunion + +Etant donnée que le java n'est pas encore un acquis pour tous, nous allons commencer par des prototypes en python. +Ces prototypes n'ont pas besoin d'être trés complexe puisque le but est de représenter une seule fonctionnalitée du jeu et +de le faire bien. ainsi lors du dévelopement on pourrait traduire nos code de python à java en ayant déjà une vision plus aboutie +du dévelopement + +Dans un premier temps donc, nous allons faire des prototypes de parties du jeu chaquns pour soi puis les mettre dans [le dossier prototype](https://git.herisson.ovh/undefined_name/School_Project/src/branch/master/prototypes) +du repo. Vu que chaques modifications de la master branche du repo doivent être aprouvée par les 3 membres, celà va permettre à chaquns d'entre nous de donner un +avis constructifs sur les prototypes fait ce qui peut nous permettre de nous améliorer + diff --git a/prototypes/tonitch/.gitattributes b/prototypes/tonitch/.gitattributes new file mode 100644 index 0000000..097f9f9 --- /dev/null +++ b/prototypes/tonitch/.gitattributes @@ -0,0 +1,9 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# Linux start script should use lf +/gradlew text eol=lf + +# These are Windows script files and should use crlf +*.bat text eol=crlf + diff --git a/prototypes/tonitch/.gitignore b/prototypes/tonitch/.gitignore new file mode 100644 index 0000000..1b6985c --- /dev/null +++ b/prototypes/tonitch/.gitignore @@ -0,0 +1,5 @@ +# Ignore Gradle project-specific cache directory +.gradle + +# Ignore Gradle build output directory +build diff --git a/prototypes/tonitch/app/build.gradle b/prototypes/tonitch/app/build.gradle new file mode 100644 index 0000000..7068743 --- /dev/null +++ b/prototypes/tonitch/app/build.gradle @@ -0,0 +1,44 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * This generated file contains a sample Java application project to get you started. + * For more details take a look at the 'Building Java & JVM projects' chapter in the Gradle + * User Manual available at https://docs.gradle.org/7.6/userguide/building_java_projects.html + * This project uses @Incubating APIs which are subject to change. + */ + +plugins { + // Apply the application plugin to add support for building a CLI application in Java. + id 'application' + id 'org.openjfx.javafxplugin' version '0.0.13' +} + +repositories { + // Use Maven Central for resolving dependencies. + mavenCentral() +} + +dependencies { + // This dependency is used by the application. + implementation 'com.google.guava:guava:31.1-jre' +} + +testing { + suites { + // Configure the built-in test suite + test { + // Use JUnit Jupiter test framework + useJUnitJupiter('5.9.1') + } + } +} + +application { + // Define the main class for the application. + mainClass = 'graphicals_test.App' +} + +javafx { + version = "19" + modules = [ 'javafx.controls' ] +} diff --git a/prototypes/tonitch/app/src/main/java/graphicals_test/App.java b/prototypes/tonitch/app/src/main/java/graphicals_test/App.java new file mode 100644 index 0000000..599da0a --- /dev/null +++ b/prototypes/tonitch/app/src/main/java/graphicals_test/App.java @@ -0,0 +1,14 @@ +/* + * This Java source file was generated by the Gradle 'init' task. + */ +package graphicals_test; + +public class App { + public String getGreeting() { + return "Hello World!"; + } + + public static void main(String[] args) { + System.out.println(new App().getGreeting()); + } +} diff --git a/prototypes/tonitch/app/src/test/java/graphicals_test/AppTest.java b/prototypes/tonitch/app/src/test/java/graphicals_test/AppTest.java new file mode 100644 index 0000000..def8bc1 --- /dev/null +++ b/prototypes/tonitch/app/src/test/java/graphicals_test/AppTest.java @@ -0,0 +1,14 @@ +/* + * This Java source file was generated by the Gradle 'init' task. + */ +package graphicals_test; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +class AppTest { + @Test void appHasAGreeting() { + App classUnderTest = new App(); + assertNotNull(classUnderTest.getGreeting(), "app should have a greeting"); + } +} diff --git a/prototypes/tonitch/gradle/wrapper/gradle-wrapper.properties b/prototypes/tonitch/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..f398c33 --- /dev/null +++ b/prototypes/tonitch/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip +networkTimeout=10000 +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/prototypes/tonitch/gradlew b/prototypes/tonitch/gradlew new file mode 100755 index 0000000..65dcd68 --- /dev/null +++ b/prototypes/tonitch/gradlew @@ -0,0 +1,244 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/prototypes/tonitch/gradlew.bat b/prototypes/tonitch/gradlew.bat new file mode 100644 index 0000000..93e3f59 --- /dev/null +++ b/prototypes/tonitch/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/prototypes/tonitch/settings.gradle b/prototypes/tonitch/settings.gradle new file mode 100644 index 0000000..d256b94 --- /dev/null +++ b/prototypes/tonitch/settings.gradle @@ -0,0 +1,12 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user manual at https://docs.gradle.org/7.6/userguide/multi_project_builds.html + * This project uses @Incubating APIs which are subject to change. + */ + +rootProject.name = 'graphicals_test' +include('app') From 90161800bc1214446c04bba70327b1f292161f5b Mon Sep 17 00:00:00 2001 From: Anthony Debucquoy Date: Mon, 13 Feb 2023 18:55:12 +0100 Subject: [PATCH 02/30] =?UTF-8?q?fixup!=20Premi=C3=A8re=20entrevue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- prototypes/tonitch/.gitattributes | 9 - prototypes/tonitch/.gitignore | 5 - prototypes/tonitch/app/build.gradle | 44 ---- .../src/main/java/graphicals_test/App.java | 14 - .../test/java/graphicals_test/AppTest.java | 14 - .../gradle/wrapper/gradle-wrapper.properties | 6 - prototypes/tonitch/gradlew | 244 ------------------ prototypes/tonitch/gradlew.bat | 92 ------- prototypes/tonitch/settings.gradle | 12 - 9 files changed, 440 deletions(-) delete mode 100644 prototypes/tonitch/.gitattributes delete mode 100644 prototypes/tonitch/.gitignore delete mode 100644 prototypes/tonitch/app/build.gradle delete mode 100644 prototypes/tonitch/app/src/main/java/graphicals_test/App.java delete mode 100644 prototypes/tonitch/app/src/test/java/graphicals_test/AppTest.java delete mode 100644 prototypes/tonitch/gradle/wrapper/gradle-wrapper.properties delete mode 100755 prototypes/tonitch/gradlew delete mode 100644 prototypes/tonitch/gradlew.bat delete mode 100644 prototypes/tonitch/settings.gradle diff --git a/prototypes/tonitch/.gitattributes b/prototypes/tonitch/.gitattributes deleted file mode 100644 index 097f9f9..0000000 --- a/prototypes/tonitch/.gitattributes +++ /dev/null @@ -1,9 +0,0 @@ -# -# https://help.github.com/articles/dealing-with-line-endings/ -# -# Linux start script should use lf -/gradlew text eol=lf - -# These are Windows script files and should use crlf -*.bat text eol=crlf - diff --git a/prototypes/tonitch/.gitignore b/prototypes/tonitch/.gitignore deleted file mode 100644 index 1b6985c..0000000 --- a/prototypes/tonitch/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# Ignore Gradle project-specific cache directory -.gradle - -# Ignore Gradle build output directory -build diff --git a/prototypes/tonitch/app/build.gradle b/prototypes/tonitch/app/build.gradle deleted file mode 100644 index 7068743..0000000 --- a/prototypes/tonitch/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This file was generated by the Gradle 'init' task. - * - * This generated file contains a sample Java application project to get you started. - * For more details take a look at the 'Building Java & JVM projects' chapter in the Gradle - * User Manual available at https://docs.gradle.org/7.6/userguide/building_java_projects.html - * This project uses @Incubating APIs which are subject to change. - */ - -plugins { - // Apply the application plugin to add support for building a CLI application in Java. - id 'application' - id 'org.openjfx.javafxplugin' version '0.0.13' -} - -repositories { - // Use Maven Central for resolving dependencies. - mavenCentral() -} - -dependencies { - // This dependency is used by the application. - implementation 'com.google.guava:guava:31.1-jre' -} - -testing { - suites { - // Configure the built-in test suite - test { - // Use JUnit Jupiter test framework - useJUnitJupiter('5.9.1') - } - } -} - -application { - // Define the main class for the application. - mainClass = 'graphicals_test.App' -} - -javafx { - version = "19" - modules = [ 'javafx.controls' ] -} diff --git a/prototypes/tonitch/app/src/main/java/graphicals_test/App.java b/prototypes/tonitch/app/src/main/java/graphicals_test/App.java deleted file mode 100644 index 599da0a..0000000 --- a/prototypes/tonitch/app/src/main/java/graphicals_test/App.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * This Java source file was generated by the Gradle 'init' task. - */ -package graphicals_test; - -public class App { - public String getGreeting() { - return "Hello World!"; - } - - public static void main(String[] args) { - System.out.println(new App().getGreeting()); - } -} diff --git a/prototypes/tonitch/app/src/test/java/graphicals_test/AppTest.java b/prototypes/tonitch/app/src/test/java/graphicals_test/AppTest.java deleted file mode 100644 index def8bc1..0000000 --- a/prototypes/tonitch/app/src/test/java/graphicals_test/AppTest.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * This Java source file was generated by the Gradle 'init' task. - */ -package graphicals_test; - -import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; - -class AppTest { - @Test void appHasAGreeting() { - App classUnderTest = new App(); - assertNotNull(classUnderTest.getGreeting(), "app should have a greeting"); - } -} diff --git a/prototypes/tonitch/gradle/wrapper/gradle-wrapper.properties b/prototypes/tonitch/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index f398c33..0000000 --- a/prototypes/tonitch/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip -networkTimeout=10000 -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/prototypes/tonitch/gradlew b/prototypes/tonitch/gradlew deleted file mode 100755 index 65dcd68..0000000 --- a/prototypes/tonitch/gradlew +++ /dev/null @@ -1,244 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/prototypes/tonitch/gradlew.bat b/prototypes/tonitch/gradlew.bat deleted file mode 100644 index 93e3f59..0000000 --- a/prototypes/tonitch/gradlew.bat +++ /dev/null @@ -1,92 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/prototypes/tonitch/settings.gradle b/prototypes/tonitch/settings.gradle deleted file mode 100644 index d256b94..0000000 --- a/prototypes/tonitch/settings.gradle +++ /dev/null @@ -1,12 +0,0 @@ -/* - * This file was generated by the Gradle 'init' task. - * - * The settings file is used to specify which projects to include in your build. - * - * Detailed information about configuring a multi-project build in Gradle can be found - * in the user manual at https://docs.gradle.org/7.6/userguide/multi_project_builds.html - * This project uses @Incubating APIs which are subject to change. - */ - -rootProject.name = 'graphicals_test' -include('app') From 56cde5623e79d6811c44f1ca61a2b732ecb58f43 Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Tue, 14 Feb 2023 15:21:43 +0100 Subject: [PATCH 03/30] WIP: prototype for saves --- prototypes/saves_prototypes/README | 35 +++++++++++++++++ prototypes/saves_prototypes/parser.py | 56 +++++++++++++++++++++++++++ prototypes/saves_prototypes/test.map | 1 + 3 files changed, 92 insertions(+) create mode 100644 prototypes/saves_prototypes/README create mode 100644 prototypes/saves_prototypes/parser.py create mode 100644 prototypes/saves_prototypes/test.map diff --git a/prototypes/saves_prototypes/README b/prototypes/saves_prototypes/README new file mode 100644 index 0000000..606b9f6 --- /dev/null +++ b/prototypes/saves_prototypes/README @@ -0,0 +1,35 @@ +# Prototypes Saves files + +This prototype is aiming at defining a structure for saving "map" files. + +The objective is to have it quite modular so that if we want to add more level we can easily do so. + +Another objective is that theses files are as small as possible without missing information. + +## What needs to be saved + +We need to have the shape of the map itself and the shape and number of each pieces it is a minimum + +I also want to define an header (and maybe a footer) to the file so that it is easier to recover if any corruption occure to a drive +(we all been trough that) + +## Method + +I would like to save a file as byte so I need to have a bitewise parser. This is the objective of this prototype + +## Structure + +The map file should have the following structure: +- The file should be named .shmap (where shmap stand for shape map) +- The file should start with the ascii characters S, M then S (0x534D53) +- The file should end with the ascii characters S, M then E (0x534D45) +- First we define the map shape + 1) the map should always be a square. the lenght of this square will be the first octet after the header. + 2) next we have s x s (where s is the size of the square) bits (1/0) where + - 0 represent an empty cell (where we can place a shape) + - 1 represent a filled cell (where we can't place a shape) +- Next we define the amount of shape for this level with a number on one octet +- Next we define each shapes with the same method defined previously for a map + +With all that we should have all that is needed for a level to work... further information could be added later this is just a prototype atm + diff --git a/prototypes/saves_prototypes/parser.py b/prototypes/saves_prototypes/parser.py new file mode 100644 index 0000000..78a96ba --- /dev/null +++ b/prototypes/saves_prototypes/parser.py @@ -0,0 +1,56 @@ +class MapNotSquareException(Exception): + pass + +class PieceNotSquareException(Exception): + pass + +class save_Parser: + def __init__(self, filename:str ): + self.filename = filename + self.map_shape = [[0]] + self.pieces = list() + + def define_map(self, map_shape): + size = len(map_shape) + for row in map_shape: + if size != len(row): + raise MapNotSquareException + self.map_shape = map_shape + + def add_piece(self, piece_shape): + size = len(piece_shape) + for row in piece_shape: + if size != len(row): + raise PieceNotSquareException + self.pieces.append(piece_shape) + + def __str__(self): + return str(self.map_shape) + + def shape_to_bytes(self, shape): + bytes_ammount = len(shape) // 8 + bytes_trash = len(shape) % 8 + tray = 0 + + def load(self): + """ + load the file and prepare to parse informations + """ + + def save(self): + """ + save parsed info to the file + """ + save_data = b'' + save_data += b'SMS' + save_data += bytes(len(map_shape)) + save_data += shape_to_bytes(self.map_shape) + save_data += bytes() + save_data += b'SME' + with open(self.filename, mode='bw') as file: + file.write(save_data) + +if __name__ == "__main__": + p = save_Parser('test.map') + p.define_map([[0,1],[0,1]]) + p.save() diff --git a/prototypes/saves_prototypes/test.map b/prototypes/saves_prototypes/test.map new file mode 100644 index 0000000..406295c --- /dev/null +++ b/prototypes/saves_prototypes/test.map @@ -0,0 +1 @@ +SMSSME \ No newline at end of file From c6d7e148df518fc2bbd20130ee1a7e02fd13d5bd Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Tue, 14 Feb 2023 16:27:02 +0100 Subject: [PATCH 04/30] save parser finished --- prototypes/saves_prototypes/parser.py | 23 ++++++++++++++++------- prototypes/saves_prototypes/test.map | 2 +- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/prototypes/saves_prototypes/parser.py b/prototypes/saves_prototypes/parser.py index 78a96ba..6adf531 100644 --- a/prototypes/saves_prototypes/parser.py +++ b/prototypes/saves_prototypes/parser.py @@ -27,10 +27,14 @@ class save_Parser: def __str__(self): return str(self.map_shape) - def shape_to_bytes(self, shape): - bytes_ammount = len(shape) // 8 - bytes_trash = len(shape) % 8 + def shape_to_bytes(self, shape_matrix): + shape_list = [b for r in shape_matrix for b in r] + byte_ammount = len(shape_list) // 8 + 1 tray = 0 + for i in shape_list: + tray = (tray << 1) | i + return tray.to_bytes(byte_ammount, 'big') + def load(self): """ @@ -43,14 +47,19 @@ class save_Parser: """ save_data = b'' save_data += b'SMS' - save_data += bytes(len(map_shape)) - save_data += shape_to_bytes(self.map_shape) - save_data += bytes() + save_data += len(self.map_shape).to_bytes(1, 'big') + save_data += self.shape_to_bytes(self.map_shape) + save_data += len(self.pieces).to_bytes(1, 'big') + for piece in self.pieces: + save_data +=len(piece).to_bytes(1, 'big') + save_data += self.shape_to_bytes(piece) save_data += b'SME' with open(self.filename, mode='bw') as file: file.write(save_data) if __name__ == "__main__": p = save_Parser('test.map') - p.define_map([[0,1],[0,1]]) + p.define_map([[1,0,1],[1,1,1], [1,0,0]]) + p.add_piece([[0, 1],[0, 1]]) p.save() + # print(p.shape_to_bytes([[1,0,1],[1,1,1], [1,0,0]])) diff --git a/prototypes/saves_prototypes/test.map b/prototypes/saves_prototypes/test.map index 406295c..fff7b49 100644 --- a/prototypes/saves_prototypes/test.map +++ b/prototypes/saves_prototypes/test.map @@ -1 +1 @@ -SMSSME \ No newline at end of file +SMS|SME \ No newline at end of file From 56ee3e943cd1aea61d9bd08965bb38f54a7b8489 Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Fri, 17 Feb 2023 17:02:34 +0100 Subject: [PATCH 05/30] wip: menu --- prototypes/saves_prototypes/parser.py | 64 ++++++++++++++++++++++----- prototypes/saves_prototypes/test.map | 1 - 2 files changed, 53 insertions(+), 12 deletions(-) delete mode 100644 prototypes/saves_prototypes/test.map diff --git a/prototypes/saves_prototypes/parser.py b/prototypes/saves_prototypes/parser.py index 6adf531..f08c2ae 100644 --- a/prototypes/saves_prototypes/parser.py +++ b/prototypes/saves_prototypes/parser.py @@ -1,11 +1,20 @@ +import os + class MapNotSquareException(Exception): - pass + """ + Matrix used is not a Square and cannot be interpretted as a piece + """ -class PieceNotSquareException(Exception): - pass +class PieceNotSquareException(Exception): + """ + Matrix used is not a Square and cannot be interpretted as a piece + """ -class save_Parser: - def __init__(self, filename:str ): +class SaveParser: + """ + Parser for the game file + """ + def __init__(self): self.filename = filename self.map_shape = [[0]] self.pieces = list() @@ -41,7 +50,7 @@ class save_Parser: load the file and prepare to parse informations """ - def save(self): + def save(self, filename): """ save parsed info to the file """ @@ -54,12 +63,45 @@ class save_Parser: save_data +=len(piece).to_bytes(1, 'big') save_data += self.shape_to_bytes(piece) save_data += b'SME' - with open(self.filename, mode='bw') as file: + with open(filename, mode='bw') as file: file.write(save_data) +def cls(): + 'clear the screen' + for _ in range(os.get_terminal_size()[1]): + print() + +def menu(): + """draw a simple menu to test the SaveParser class""" + + P = SaveParser() + + print("1) define terrain") + print("2) add a piece") + print("3) show data") + print("4) save data") + print("5) load data") + item = input("Select an option :") + cls() + match item: + case 1: + pass + case 2: + pass + case 3: + pass + case 4: + filename = input('enter the file name (default: default.smap):') + filename = filename if filename else "default.smap" + P.save(filename) + case 5: + filename = input('enter the file name (default: default.smap):') + filename = filename if filename else "default.smap" + P.load(filename) if __name__ == "__main__": - p = save_Parser('test.map') - p.define_map([[1,0,1],[1,1,1], [1,0,0]]) - p.add_piece([[0, 1],[0, 1]]) - p.save() + cls() + # p = SaveParser('test.smap') + # p.define_map([[1,0,1],[1,1,1], [1,0,0]]) + # p.add_piece([[0, 1],[0, 1]]) + # p.save() # print(p.shape_to_bytes([[1,0,1],[1,1,1], [1,0,0]])) diff --git a/prototypes/saves_prototypes/test.map b/prototypes/saves_prototypes/test.map deleted file mode 100644 index fff7b49..0000000 --- a/prototypes/saves_prototypes/test.map +++ /dev/null @@ -1 +0,0 @@ -SMS|SME \ No newline at end of file From a74c78d8a9573c99476697440805897d7de493d8 Mon Sep 17 00:00:00 2001 From: Anthony Debucquoy Date: Mon, 20 Feb 2023 12:37:04 +0100 Subject: [PATCH 06/30] finishing prototype --- prototypes/saves_prototypes/parser.py | 122 ++++++++++++++++++++++---- 1 file changed, 106 insertions(+), 16 deletions(-) mode change 100644 => 100755 prototypes/saves_prototypes/parser.py diff --git a/prototypes/saves_prototypes/parser.py b/prototypes/saves_prototypes/parser.py old mode 100644 new mode 100755 index f08c2ae..736c426 --- a/prototypes/saves_prototypes/parser.py +++ b/prototypes/saves_prototypes/parser.py @@ -1,23 +1,26 @@ +#!/bin/python import os + class MapNotSquareException(Exception): """ Matrix used is not a Square and cannot be interpretted as a piece """ + class PieceNotSquareException(Exception): """ Matrix used is not a Square and cannot be interpretted as a piece """ + class SaveParser: """ Parser for the game file """ def __init__(self): - self.filename = filename self.map_shape = [[0]] - self.pieces = list() + self.pieces = [] def define_map(self, map_shape): size = len(map_shape) @@ -44,11 +47,49 @@ class SaveParser: tray = (tray << 1) | i return tray.to_bytes(byte_ammount, 'big') + def bytes_to_shape(self, bytes_list, map_size): + list_octet = [] + for octet in bytes_list: + octet_data = list(f"{octet:08b}") + [list_octet.append(d) for d in octet_data] + list_octet = list_octet[-(map_size**2):] - def load(self): + matrix = [] + for i in range(map_size): + matrix.append([]) + for j in range(map_size): + matrix[i].append(list_octet.pop(0)) + return matrix + + def load(self, filename): """ load the file and prepare to parse informations """ + with open(filename, mode='br') as file: + data = list(file.read()) + + data_pos = [0, 0] + for i in range(len(data)): + if data[i] == 83 and data[i+1] == 77 and data[i+2] == 83: # SMS + data_pos[0] = i+3 + break + for i in range(data_pos[0], len(data)): + if data[i] == 83 and data[i+1] == 77 and data[i+2] == 69: # SME + data_pos[1] = i + break + map_data = data[data_pos[0]:data_pos[1]] + self.define_map(self.bytes_to_shape(map_data[1:((map_data[0]**2)//8)+2], map_data[0])) + map_data = map_data[(map_data[0]**2) // 8 + 2:] + pieces_ammount = map_data.pop(0) + for i in range(pieces_ammount): + print(map_data) + piece_size = map_data.pop(0) + print(piece_size) + piece_data = map_data[:(piece_size**2) // 8 + 1] + print(piece_data) + map_data = map_data[(map_data[0]**2) // 8 + 2:] + print(map_data) + self.add_piece(self.bytes_to_shape(piece_data, piece_size)) def save(self, filename): """ @@ -60,36 +101,82 @@ class SaveParser: save_data += self.shape_to_bytes(self.map_shape) save_data += len(self.pieces).to_bytes(1, 'big') for piece in self.pieces: - save_data +=len(piece).to_bytes(1, 'big') + save_data += len(piece).to_bytes(1, 'big') save_data += self.shape_to_bytes(piece) save_data += b'SME' with open(filename, mode='bw') as file: file.write(save_data) + +def show_matrix(matrix, highlight: tuple = None): + """ + :matrix: matrix to draw + :highlight: tuple of the coordinates to hightligh + """ + size = len(matrix) + h_x, h_y = None, None + if highlight: + h_x, h_y = highlight + if size != len(matrix[0]): + print("ERROR: The matrix is not square") + return + + line_str = "+" + ''.join(['-+' for _ in range(size)]) + + for k, x in enumerate(matrix): + print(line_str) + print('|', end="") + for l, y in enumerate(x): + if k == h_x and l == h_y: + print("\033[42m", end="") + print(str(y) + "\033[00m" + '|', end="") + print() + print(line_str) + + def cls(): 'clear the screen' for _ in range(os.get_terminal_size()[1]): print() -def menu(): - """draw a simple menu to test the SaveParser class""" - P = SaveParser() +def menu(P): + """draw a simple menu to test the SaveParser class""" print("1) define terrain") print("2) add a piece") print("3) show data") print("4) save data") print("5) load data") - item = input("Select an option :") + print("6) quit") + item = int(input("Select an option :")) cls() match item: case 1: - pass + size = int(input("what is the size of the map: ")) + P.map_shape = [[0 for _ in range(size)] for _ in range(size)] + for i in range(size): + for j in range(size): + cls() + show_matrix(P.map_shape, (i,j)) + P.map_shape[i][j] = int(input("0: empty; 1: filled :")) case 2: - pass + size = int(input("what is the size of the piece: ")) + temp = [[0 for _ in range(size)] for _ in range(size)] + for i in range(size): + for j in range(size): + cls() + show_matrix(temp, (i,j)) + temp[i][j] = int(input("0: empty; 1: filled :")) + P.add_piece(temp) case 3: - pass + if P.map_shape: + print("map:") + show_matrix(P.map_shape) + for i, v in enumerate(P.pieces): + print() + print(f"piece {i+1}") + show_matrix(v) case 4: filename = input('enter the file name (default: default.smap):') filename = filename if filename else "default.smap" @@ -98,10 +185,13 @@ def menu(): filename = input('enter the file name (default: default.smap):') filename = filename if filename else "default.smap" P.load(filename) + case 6: + return False + return True + + if __name__ == "__main__": cls() - # p = SaveParser('test.smap') - # p.define_map([[1,0,1],[1,1,1], [1,0,0]]) - # p.add_piece([[0, 1],[0, 1]]) - # p.save() - # print(p.shape_to_bytes([[1,0,1],[1,1,1], [1,0,0]])) + P = SaveParser() + while menu(P): + pass From 40b6c8cfb4b73220ee41b2cb884b93894803138f Mon Sep 17 00:00:00 2001 From: Anthony Debucquoy Date: Mon, 20 Feb 2023 15:15:48 +0100 Subject: [PATCH 07/30] Default gradle implementation + openjfx --- .gitattributes | 9 + app/build.gradle | 41 +++ app/src/main/java/school_project/App.java | 14 + app/src/test/java/school_project/AppTest.java | 14 + gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 244 ++++++++++++++++++ gradlew.bat | 92 +++++++ settings.gradle | 11 + 8 files changed, 431 insertions(+) create mode 100644 .gitattributes create mode 100644 app/build.gradle create mode 100644 app/src/main/java/school_project/App.java create mode 100644 app/src/test/java/school_project/AppTest.java create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..097f9f9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,9 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# Linux start script should use lf +/gradlew text eol=lf + +# These are Windows script files and should use crlf +*.bat text eol=crlf + diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..a4cfb09 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,41 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * This generated file contains a sample Java application project to get you started. + * For more details take a look at the 'Building Java & JVM projects' chapter in the Gradle + * User Manual available at https://docs.gradle.org/8.0/userguide/building_java_projects.html + */ + +plugins { + // Apply the application plugin to add support for building a CLI application in Java. + id 'application' + id 'org.openjfx.javafxplugin' version '0.0.13' +} + +repositories { + // Use Maven Central for resolving dependencies. + mavenCentral() +} + +dependencies { + // Use JUnit Jupiter for testing. + testImplementation 'org.junit.jupiter:junit-jupiter:5.9.1' + + // This dependency is used by the application. + implementation 'com.google.guava:guava:31.1-jre' +} + +application { + // Define the main class for the application. + mainClass = 'school_project.App' +} + +javafx { + version = "19" + modules = [ 'javafx.controls' ] +} + +tasks.named('test') { + // Use JUnit Platform for unit tests. + useJUnitPlatform() +} diff --git a/app/src/main/java/school_project/App.java b/app/src/main/java/school_project/App.java new file mode 100644 index 0000000..e28b649 --- /dev/null +++ b/app/src/main/java/school_project/App.java @@ -0,0 +1,14 @@ +/* + * This Java source file was generated by the Gradle 'init' task. + */ +package school_project; + +public class App { + public String getGreeting() { + return "Hello World!"; + } + + public static void main(String[] args) { + System.out.println(new App().getGreeting()); + } +} diff --git a/app/src/test/java/school_project/AppTest.java b/app/src/test/java/school_project/AppTest.java new file mode 100644 index 0000000..0d68e1a --- /dev/null +++ b/app/src/test/java/school_project/AppTest.java @@ -0,0 +1,14 @@ +/* + * This Java source file was generated by the Gradle 'init' task. + */ +package school_project; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +class AppTest { + @Test void appHasAGreeting() { + App classUnderTest = new App(); + assertNotNull(classUnderTest.getGreeting(), "app should have a greeting"); + } +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..42defcc --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip +networkTimeout=10000 +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..79a61d4 --- /dev/null +++ b/gradlew @@ -0,0 +1,244 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..93e3f59 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..afb0ca7 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,11 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user manual at https://docs.gradle.org/8.0/userguide/multi_project_builds.html + */ + +rootProject.name = 'School_Project' +include('app') From b01572f49e17f348c61e2313f9f37874281c097d Mon Sep 17 00:00:00 2001 From: BrokenBrad Date: Tue, 21 Feb 2023 20:48:38 +0100 Subject: [PATCH 08/30] Ajouter 'JournalDeBord/src/rapports/200223' --- JournalDeBord/src/rapports/200223 | 59 +++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 JournalDeBord/src/rapports/200223 diff --git a/JournalDeBord/src/rapports/200223 b/JournalDeBord/src/rapports/200223 new file mode 100644 index 0000000..71ae31a --- /dev/null +++ b/JournalDeBord/src/rapports/200223 @@ -0,0 +1,59 @@ +# 20 fevrier 2023 + +le **Lundi 20 Février** à eu lieu notre deuxième meeting. + +En occasion de cette deuxième rencontre nous avons continué à proposer des idées pour renforcer les bases de ce projet. + +##Prototypes + +Nous avons commencé par une exposition et analyse des prototypes qui avaient été créé jusqu’à ce jour. + +**Prototype Anthony** + +Anthony se pose le challenge de réussir à résumer toute les informations du projet et du développement du jeu en très peu d’espace sans perdre des datas . + +Le résultat de son travail est un fichier répartie en en tête (SMS) et pied de page +(SME) entre ces deux il y stocké les infos suivantes: map size , map data , nombre de pieces , (piece size and data) ; chaque info est un octet . + +**prototype Mat** + +Mat concentre sont travail sur la création d’un code qui puisse servir de fondements pour notre moteur de jeux . + +On y trouve un algorithme pour le choix du niveau et le pick des pieces et une fonction pour tourner les pièce à l’aide du module rotate_matrix , tout ça à l’intérieur d’une boucle while qui permet de run le jeu temps que la condition est respectée. + + + + +**Brainstorming** + +On un deuxième moment on est passé à un brainstorming pour trouver des nouvelles idées concernâtes le moteur de jeu: + +-piece ~>objects avec des attributes communs + +-attributes +•tourner +•lock +•léger +•lourd (les objects lourd écrasent les légères) + +-selection objects +•vibrations objects + +-chois du teme (histoire) +•étudiant qui déménage + +-objects en general +game logic ~> +•menu +•jeux>map(shape)>pieces(formes et propriétés) + +et en dernier on à porté des modifications sur notre serveur git pour améliorer l’organisation du travail : + +-cration du gradle + +-creation d’un ideas +(à faire après les to do) + +**Directives pour le prochain meeting** + +Pour le prochain meeting on créera des nouveaux prototypes et on pensera à des manières pour accéder aux images et au sons , multimédias du jeu. \ No newline at end of file From 4a04faac06910c1349ac7788b8e2bd62590b72f6 Mon Sep 17 00:00:00 2001 From: BrokenBrad Date: Tue, 21 Feb 2023 20:53:01 +0100 Subject: [PATCH 09/30] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'JournalDeBor?= =?UTF-8?q?d/src/rapports/200223.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/rapports/{200223 => 200223.md} | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) rename JournalDeBord/src/rapports/{200223 => 200223.md} (77%) diff --git a/JournalDeBord/src/rapports/200223 b/JournalDeBord/src/rapports/200223.md similarity index 77% rename from JournalDeBord/src/rapports/200223 rename to JournalDeBord/src/rapports/200223.md index 71ae31a..8c7a295 100644 --- a/JournalDeBord/src/rapports/200223 +++ b/JournalDeBord/src/rapports/200223.md @@ -24,36 +24,36 @@ On y trouve un algorithme pour le choix du niveau et le pick des pieces et une f -**Brainstorming** +##Brainstorming On un deuxième moment on est passé à un brainstorming pour trouver des nouvelles idées concernâtes le moteur de jeu: --piece ~>objects avec des attributes communs +- piece ~>objects avec des attributes communs --attributes -•tourner -•lock -•léger -•lourd (les objects lourd écrasent les légères) +- attributes +• tourner +• lock +• léger +• lourd (les objects lourd écrasent les légères) --selection objects -•vibrations objects +- selection objects +• vibrations objects --chois du teme (histoire) +- chois du teme (histoire) •étudiant qui déménage --objects en general +- objects en general game logic ~> •menu •jeux>map(shape)>pieces(formes et propriétés) -et en dernier on à porté des modifications sur notre serveur git pour améliorer l’organisation du travail : +En dernier on à apportè des modifications sur notre serveur git pour améliorer l’organisation du travail : --cration du gradle +- cration du gradle --creation d’un ideas +- creation d’un ideas (à faire après les to do) -**Directives pour le prochain meeting** +##Directives pour le prochain meeting Pour le prochain meeting on créera des nouveaux prototypes et on pensera à des manières pour accéder aux images et au sons , multimédias du jeu. \ No newline at end of file From 46987915de5c01a0af69b974dcad10e09324cd56 Mon Sep 17 00:00:00 2001 From: BrokenBrad Date: Tue, 21 Feb 2023 21:00:09 +0100 Subject: [PATCH 10/30] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'JournalDeBor?= =?UTF-8?q?d/src/rapports/200223.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JournalDeBord/src/rapports/200223.md | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/JournalDeBord/src/rapports/200223.md b/JournalDeBord/src/rapports/200223.md index 8c7a295..63ce99d 100644 --- a/JournalDeBord/src/rapports/200223.md +++ b/JournalDeBord/src/rapports/200223.md @@ -1,10 +1,10 @@ # 20 fevrier 2023 -le **Lundi 20 Février** à eu lieu notre deuxième meeting. +En date **Lundi 20 Février** à eu lieu notre deuxième meeting. En occasion de cette deuxième rencontre nous avons continué à proposer des idées pour renforcer les bases de ce projet. -##Prototypes +## Prototypes Nous avons commencé par une exposition et analyse des prototypes qui avaient été créé jusqu’à ce jour. @@ -21,14 +21,11 @@ Mat concentre sont travail sur la création d’un code qui puisse servir de fon On y trouve un algorithme pour le choix du niveau et le pick des pieces et une fonction pour tourner les pièce à l’aide du module rotate_matrix , tout ça à l’intérieur d’une boucle while qui permet de run le jeu temps que la condition est respectée. +## Brainstorming +En un deuxième moment on est passé à un brainstorming pour trouver des nouvelles idées concernâtes le moteur de jeu: - -##Brainstorming - -On un deuxième moment on est passé à un brainstorming pour trouver des nouvelles idées concernâtes le moteur de jeu: - -- piece ~>objects avec des attributes communs +- piece ~> objects avec des attributes communs - attributes • tourner @@ -40,20 +37,20 @@ On un deuxième moment on est passé à un brainstorming pour trouver des nouvel • vibrations objects - chois du teme (histoire) -•étudiant qui déménage +• étudiant qui déménage - objects en general game logic ~> -•menu -•jeux>map(shape)>pieces(formes et propriétés) +• menu +• jeux > map(shape) > pieces(formes et propriétés) En dernier on à apportè des modifications sur notre serveur git pour améliorer l’organisation du travail : - cration du gradle -- creation d’un ideas +- creation d’un 'ideas' (à faire après les to do) -##Directives pour le prochain meeting +## Directives pour le prochain meeting Pour le prochain meeting on créera des nouveaux prototypes et on pensera à des manières pour accéder aux images et au sons , multimédias du jeu. \ No newline at end of file From 424da00791ab7f5ee06578f1911f992c9d5ed450 Mon Sep 17 00:00:00 2001 From: Debucquoy Anthony Date: Tue, 21 Feb 2023 21:54:37 +0100 Subject: [PATCH 11/30] Adding meeting to the summary This is the file for the menu on the right of the screen. Signed-off-by: Debucquoy Anthony --- JournalDeBord/src/SUMMARY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JournalDeBord/src/SUMMARY.md b/JournalDeBord/src/SUMMARY.md index 9f00b0e..7c32410 100644 --- a/JournalDeBord/src/SUMMARY.md +++ b/JournalDeBord/src/SUMMARY.md @@ -3,4 +3,4 @@ # Rapports - [Première entrevue](./rapports/130223.md) - +- [Deuxième entrevue](./rapports/200223.md) \ No newline at end of file From 30388303bad3675aeb466055a49875f56145300d Mon Sep 17 00:00:00 2001 From: BrokenBrad Date: Fri, 24 Feb 2023 12:24:40 +0100 Subject: [PATCH 12/30] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'JournalDeBor?= =?UTF-8?q?d/src/rapports/200223.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JournalDeBord/src/rapports/200223.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/JournalDeBord/src/rapports/200223.md b/JournalDeBord/src/rapports/200223.md index 63ce99d..ae15f1e 100644 --- a/JournalDeBord/src/rapports/200223.md +++ b/JournalDeBord/src/rapports/200223.md @@ -23,26 +23,26 @@ On y trouve un algorithme pour le choix du niveau et le pick des pieces et une f ## Brainstorming -En un deuxième moment on est passé à un brainstorming pour trouver des nouvelles idées concernâtes le moteur de jeu: +En un deuxième moment on est passé à un brainstorming pour trouver des nouvelles idées concernat le moteur de jeu: - piece ~> objects avec des attributes communs - attributes -• tourner -• lock -• léger -• lourd (les objects lourd écrasent les légères) + - tourner + - lock + - léger + - lourd (les objects lourd écrasent les légères) - selection objects -• vibrations objects + - vibrations objects - chois du teme (histoire) -• étudiant qui déménage + - étudiant qui déménage - objects en general -game logic ~> -• menu -• jeux > map(shape) > pieces(formes et propriétés) + - game logic ~> + - menu + - jeux > map(shape) > pieces(formes et propriétés) En dernier on à apportè des modifications sur notre serveur git pour améliorer l’organisation du travail : From 0cba7899abc5cdccf8f3ce39ab18bbad5857b38d Mon Sep 17 00:00:00 2001 From: Anthony Debucquoy Date: Fri, 24 Feb 2023 13:55:29 +0100 Subject: [PATCH 13/30] Adding idea and pref to .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 837e27e..e102534 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,6 @@ replay_pid* # Ignore Gradle build output directory build + +.idea/ +.settings/ From 4055f12fbac6fdd5adc7ddc3641deb1ad4e402ce Mon Sep 17 00:00:00 2001 From: "Debucquoy Anthony (tonitch)" Date: Sat, 25 Feb 2023 13:55:35 +0100 Subject: [PATCH 14/30] Starting Window --- app/build.gradle | 2 +- app/src/main/java/school_project/App.java | 14 -------- .../main/java/school_project/Controller.java | 32 +++++++++++++++++++ app/src/test/java/school_project/AppTest.java | 4 +-- 4 files changed, 34 insertions(+), 18 deletions(-) delete mode 100644 app/src/main/java/school_project/App.java create mode 100644 app/src/main/java/school_project/Controller.java diff --git a/app/build.gradle b/app/build.gradle index a4cfb09..3f8d793 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,7 +27,7 @@ dependencies { application { // Define the main class for the application. - mainClass = 'school_project.App' + mainClass = 'school_project.Controller' } javafx { diff --git a/app/src/main/java/school_project/App.java b/app/src/main/java/school_project/App.java deleted file mode 100644 index e28b649..0000000 --- a/app/src/main/java/school_project/App.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * This Java source file was generated by the Gradle 'init' task. - */ -package school_project; - -public class App { - public String getGreeting() { - return "Hello World!"; - } - - public static void main(String[] args) { - System.out.println(new App().getGreeting()); - } -} diff --git a/app/src/main/java/school_project/Controller.java b/app/src/main/java/school_project/Controller.java new file mode 100644 index 0000000..c979cac --- /dev/null +++ b/app/src/main/java/school_project/Controller.java @@ -0,0 +1,32 @@ +/* + * This Java source file was generated by the Gradle 'init' task. + */ +package school_project; + +import javafx.application.Application; +import javafx.scene.Group; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.stage.Stage; + +public class Controller extends Application { + + @Override + public void start(Stage primaryStage) throws Exception { + primaryStage.setTitle("test"); + Button btn = new Button("test"); + btn.setOnAction(event -> System.out.println("hey")); + + Group root = new Group(); + root.getChildren().add(btn); + + Scene scene = new Scene(root, 300,300); + primaryStage.setScene(scene); + + primaryStage.show(); + } + + public static void main(String[] args) { + launch(); + } +} diff --git a/app/src/test/java/school_project/AppTest.java b/app/src/test/java/school_project/AppTest.java index 0d68e1a..e0dda21 100644 --- a/app/src/test/java/school_project/AppTest.java +++ b/app/src/test/java/school_project/AppTest.java @@ -4,11 +4,9 @@ package school_project; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; class AppTest { @Test void appHasAGreeting() { - App classUnderTest = new App(); - assertNotNull(classUnderTest.getGreeting(), "app should have a greeting"); + Controller classUnderTest = new Controller(); } } From 2d9a4d2aec2a2d406d7e86f392b3f50bebd63f14 Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Sat, 4 Mar 2023 10:33:57 +0100 Subject: [PATCH 15/30] pre-commit script for linux --- gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 4 +- misc/pre-commit.sh | 82 ++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 3 deletions(-) create mode 100755 misc/pre-commit.sh diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 42defcc..f398c33 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 79a61d4..65dcd68 100755 --- a/gradlew +++ b/gradlew @@ -144,7 +144,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +152,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac diff --git a/misc/pre-commit.sh b/misc/pre-commit.sh new file mode 100755 index 0000000..33b41fb --- /dev/null +++ b/misc/pre-commit.sh @@ -0,0 +1,82 @@ +#!/bin/sh + +echo 'Lovely Idea'; + +BASE_DIR="$(dirname $(readlink -f $0))/.." +cd $BASE_DIR +echo $BASE_DIR + +function clean() { + echo "Cleaning the folder" + $BASE_DIR/gradlew clean + +} + +function build() { + echo "Building the project" + $BASE_DIR/gradlew build + +} + +function test() { + echo "Testing the project" + $BASE_DIR/gradlew test + +} + +function run() { + echo "Running the project" + $BASE_DIR/gradlew run & + _PID=$! + sleep 3 + killpid $_PID +} + +function check_syntax() { + echo "Checking the syntax" + echo 'TODO Tonitch: check syntax script' + +} + +function make_archive() { + echo "Creating the archive on the parent folder" + tar --create --gzip --exclude-vcs --exclude-vcs-ignores -f ../archive.tar.gz "${BASE_DIR}/{app/, gradle/, gralew, gradlew.bat, settings.gradle}" +} + +case $1 in + + clean ) + clean ;; + + build ) + build ;; + + test ) + test ;; + + run ) + run ;; + + syntax ) + check_syntax ;; + + archive ) + clean && + build && + test && + run && + check_syntax && + make_archive ;; + + all ) + clean && + build && + test && + run && + check_syntax ;; + * ) + clean && + build && + test && + check_syntax ;; +esac From d5b8da4f2152b15e90ba15c8f3a62b6483146565 Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Sat, 4 Mar 2023 13:49:40 +0100 Subject: [PATCH 16/30] adding drone ci --- .drone.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .drone.yml diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..5e4691b --- /dev/null +++ b/.drone.yml @@ -0,0 +1,11 @@ +kind: pipeline +type: docker +name: master_builds + +steps: + - name: quality_check + image: alpine-java + commands: ./misc/pre-commit.sh + - name: archive + image: alpine + commands: ./misc/pre-commit.sh archive From a55dcc678a017bd4987013f116a55e064b368c79 Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Sat, 4 Mar 2023 13:56:10 +0100 Subject: [PATCH 17/30] fixup! adding drone ci --- .drone.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index 5e4691b..4738ca4 100644 --- a/.drone.yml +++ b/.drone.yml @@ -5,7 +5,9 @@ name: master_builds steps: - name: quality_check image: alpine-java - commands: ./misc/pre-commit.sh + commands: + - ./misc/pre-commit.sh - name: archive image: alpine - commands: ./misc/pre-commit.sh archive + commands: + - ./misc/pre-commit.sh archive From c70e30b629096e44836645b226e8a1cde4d55fc7 Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Sat, 4 Mar 2023 14:00:22 +0100 Subject: [PATCH 18/30] fixup! fixup! adding drone ci --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 4738ca4..ba3d99d 100644 --- a/.drone.yml +++ b/.drone.yml @@ -4,7 +4,7 @@ name: master_builds steps: - name: quality_check - image: alpine-java + image: openjdk commands: - ./misc/pre-commit.sh - name: archive From 5a45ab43bac9cb1cdd5ccd3a181d60551e608c15 Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Sat, 4 Mar 2023 14:05:04 +0100 Subject: [PATCH 19/30] fixup! fixup! fixup! adding drone ci --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index ba3d99d..339cd4e 100644 --- a/.drone.yml +++ b/.drone.yml @@ -4,7 +4,7 @@ name: master_builds steps: - name: quality_check - image: openjdk + image: jdk11-alpine commands: - ./misc/pre-commit.sh - name: archive From 36c79daa4e15c6cc0f714555fd999a9b6ffa5007 Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Sat, 4 Mar 2023 14:05:59 +0100 Subject: [PATCH 20/30] fixup! fixup! fixup! fixup! adding drone ci --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 339cd4e..b4d8061 100644 --- a/.drone.yml +++ b/.drone.yml @@ -4,7 +4,7 @@ name: master_builds steps: - name: quality_check - image: jdk11-alpine + image: gradle:jdk11-alpine commands: - ./misc/pre-commit.sh - name: archive From bc05260ba71d375de37f4b7f19935b08c2c6508d Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Sat, 4 Mar 2023 14:21:14 +0100 Subject: [PATCH 21/30] adding missing wraper --- gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 61574 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 gradle/wrapper/gradle-wrapper.jar diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..943f0cbfa754578e88a3dae77fce6e3dea56edbf GIT binary patch literal 61574 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 literal 0 HcmV?d00001 From 5c4dc5c3700b6c9d7f845145975eee503951bf37 Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Sat, 4 Mar 2023 14:53:38 +0100 Subject: [PATCH 22/30] maybe finishing ci? hopefully --- .drone.yml | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/.drone.yml b/.drone.yml index b4d8061..76a0e47 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,13 +1,36 @@ kind: pipeline type: docker -name: master_builds +name: Check_Requirement steps: - - name: quality_check + - name: base_check image: gradle:jdk11-alpine commands: - - ./misc/pre-commit.sh - - name: archive - image: alpine + - ./gradlew clean + - ./gradlew build + - ./gradlew test + +--- + +kind: pipeline +type: docker +name: master_build + +steps: + - name: make_archive + image: alpine:latest + volumes: + - name: archives + path: /build commands: - - ./misc/pre-commit.sh archive + tar cvzf /build/$(git log -n 1 --format="%h")_school_archive.gz.tar app/ gradle/ gradlew/ gradlew.bat README.md settings.gradle + trigger: + branch: + - master + event: + include: + - push +volumes: + - name: archives + host: + path: /srv/drone/school_project/archive/ From ec7692f8d37b6f0a8b385c50af88c30cfe26ee61 Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Sat, 4 Mar 2023 14:59:37 +0100 Subject: [PATCH 23/30] fixup! maybe finishing ci? hopefully --- .drone.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 76a0e47..89ab9ad 100644 --- a/.drone.yml +++ b/.drone.yml @@ -11,7 +11,6 @@ steps: - ./gradlew test --- - kind: pipeline type: docker name: master_build From 207195c0c8db81d9bdef47ca178400bf021fd1af Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Sat, 4 Mar 2023 15:05:17 +0100 Subject: [PATCH 24/30] fixup! fixup! maybe finishing ci? hopefully --- .drone.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.drone.yml b/.drone.yml index 89ab9ad..333ea2d 100644 --- a/.drone.yml +++ b/.drone.yml @@ -33,3 +33,5 @@ volumes: - name: archives host: path: /srv/drone/school_project/archive/ +depends_on: +- Check_Requirement From 08c4a08a01198a5dc7111c04195c2b36537605b5 Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Sat, 4 Mar 2023 15:12:15 +0100 Subject: [PATCH 25/30] fixup! fixup! fixup! maybe finishing ci? hopefully --- .drone.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.drone.yml b/.drone.yml index 333ea2d..d9cdf98 100644 --- a/.drone.yml +++ b/.drone.yml @@ -4,8 +4,8 @@ name: Check_Requirement steps: - name: base_check - image: gradle:jdk11-alpine - commands: + - image: gradle:jdk11-alpine + - commands: - ./gradlew clean - ./gradlew build - ./gradlew test @@ -23,15 +23,15 @@ steps: path: /build commands: tar cvzf /build/$(git log -n 1 --format="%h")_school_archive.gz.tar app/ gradle/ gradlew/ gradlew.bat README.md settings.gradle - trigger: - branch: - - master - event: - include: - - push + - trigger: + branch: + - master + event: + include: + - push volumes: - name: archives host: path: /srv/drone/school_project/archive/ depends_on: -- Check_Requirement + - Check_Requirement From e55b17fcd850181f0c27a064650136786594f4f4 Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Sat, 4 Mar 2023 15:13:21 +0100 Subject: [PATCH 26/30] fixup! fixup! fixup! fixup! maybe finishing ci? hopefully --- .drone.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.drone.yml b/.drone.yml index d9cdf98..1fbb243 100644 --- a/.drone.yml +++ b/.drone.yml @@ -4,11 +4,11 @@ name: Check_Requirement steps: - name: base_check - - image: gradle:jdk11-alpine - - commands: - - ./gradlew clean - - ./gradlew build - - ./gradlew test + image: gradle:jdk11-alpine + commands: + - ./gradlew clean + - ./gradlew build + - ./gradlew test --- kind: pipeline @@ -22,7 +22,7 @@ steps: - name: archives path: /build commands: - tar cvzf /build/$(git log -n 1 --format="%h")_school_archive.gz.tar app/ gradle/ gradlew/ gradlew.bat README.md settings.gradle + - tar cvzf /build/$(git log -n 1 --format="%h")_school_archive.gz.tar app/ gradle/ gradlew/ gradlew.bat README.md settings.gradle - trigger: branch: - master From 922497573bf67f429444736f95ca3dc9a89fd936 Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Sat, 4 Mar 2023 15:14:38 +0100 Subject: [PATCH 27/30] fixup! fixup! fixup! fixup! fixup! maybe finishing ci? hopefully --- .drone.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.drone.yml b/.drone.yml index 1fbb243..6a51478 100644 --- a/.drone.yml +++ b/.drone.yml @@ -4,11 +4,11 @@ name: Check_Requirement steps: - name: base_check - image: gradle:jdk11-alpine - commands: - - ./gradlew clean - - ./gradlew build - - ./gradlew test + image: gradle:jdk11-alpine + commands: + - ./gradlew clean + ./gradlew build + ./gradlew test --- kind: pipeline From bbfc5687d9cebcf1e0e0e8b5f19b3d21ad4ecfc0 Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Sat, 4 Mar 2023 15:36:11 +0100 Subject: [PATCH 28/30] fix ci --- .drone.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.drone.yml b/.drone.yml index 6a51478..a5749b0 100644 --- a/.drone.yml +++ b/.drone.yml @@ -7,8 +7,8 @@ steps: image: gradle:jdk11-alpine commands: - ./gradlew clean - ./gradlew build - ./gradlew test + - ./gradlew build + - ./gradlew test --- kind: pipeline @@ -23,12 +23,12 @@ steps: path: /build commands: - tar cvzf /build/$(git log -n 1 --format="%h")_school_archive.gz.tar app/ gradle/ gradlew/ gradlew.bat README.md settings.gradle - - trigger: - branch: - - master - event: - include: - - push + trigger: + - branch: + - master + event: + - include: + - push volumes: - name: archives host: From aafb5f5c66040800e6481f515e62106d43f6c07e Mon Sep 17 00:00:00 2001 From: Debucquoy Anthony Date: Sat, 4 Mar 2023 16:15:42 +0100 Subject: [PATCH 29/30] Update 'README.md' --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 80a3590..1babb91 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ # School_Project +[![Build Status](http://drone.herisson.ovh/api/badges/undefined_name/School_Project/status.svg)](http://drone.herisson.ovh/undefined_name/School_Project) + School Project based on Cats Organized Neatly \ No newline at end of file From f08ed988971360756cfc8de7d69d93e976277b3f Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Sat, 4 Mar 2023 18:58:14 +0100 Subject: [PATCH 30/30] signing --- .drone.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.drone.yml b/.drone.yml index a5749b0..0e21a63 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,3 +1,4 @@ +--- kind: pipeline type: docker name: Check_Requirement @@ -35,3 +36,8 @@ volumes: path: /srv/drone/school_project/archive/ depends_on: - Check_Requirement +--- +kind: signature +hmac: 82ce5e9bc63570a5614c4e7b3ddc888fadb36f7660ab0ab521d0cda3c5842e05 + +...