From 0585d6dea088fc718446538762af54524bff1ec5 Mon Sep 17 00:00:00 2001
From: KosmX <kosmx.mc@gmail.com>
Date: Thu, 3 Dec 2020 17:53:57 +0100
Subject: [PATCH] //comments

---
 Makefile           |   8 ++
 config.cfg         |   2 +-
 foods.txt          |   7 ++
 multiplatformLib.o | Bin 0 -> 3208 bytes
 snake.c            | 201 +++++++++++++++++++++++++++++++++++++++++----
 snake.o            | Bin 0 -> 28440 bytes
 snek.txt           |   0
 structs.h          |  24 +++---
 8 files changed, 216 insertions(+), 26 deletions(-)
 create mode 100644 Makefile
 create mode 100644 foods.txt
 create mode 100644 multiplatformLib.o
 create mode 100644 snake.o
 create mode 100644 snek.txt

diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..fe9ebc2
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,8 @@
+snek: snake.o multiplatformLib.o
+	gcc -O3 snake.o multiplatformLib.o -o snake
+
+snake.o: snake.c structs.h debugmalloc.h
+	gcc -O3 -c snake.c -o snake.o
+
+multiplatformLib.o: multiplatformLib.c multiplatformLib.h
+	gcc -O3 -c multiplatformLib.c -o multiplatformLib.o
\ No newline at end of file
diff --git a/config.cfg b/config.cfg
index d63f538..53a9f72 100644
--- a/config.cfg
+++ b/config.cfg
@@ -1,4 +1,4 @@
 use_utf8 = 1
-tickspeed = 120
+tickspeed = 180
 repeat_map = 1
 feed_amount = 23
diff --git a/foods.txt b/foods.txt
new file mode 100644
index 0000000..46130df
--- /dev/null
+++ b/foods.txt
@@ -0,0 +1,7 @@
+6
+XX
+HH
+JJ
+KK
+EE
+RR
\ No newline at end of file
diff --git a/multiplatformLib.o b/multiplatformLib.o
new file mode 100644
index 0000000000000000000000000000000000000000..b55f7c3f15feea88f5bbdd852c5d768f30839e9a
GIT binary patch
literal 3208
zcmb<-^>JfjWMqH=Mg}_u1P><4z~I4&U^{@B4h*~uJPe=t<$fJbOVi_*Zvl&f_>Lil
z|2>-D1f+O$v#4q?Ffe#@x~O;<9`NjZ;?w!;1xTIYH^cuvosXJRRCvCE1w6WKA>vS;
zi;72zhcQHZDZ5AWkpRb-!(cfi%lPHN_IotHkudzfPdbEw0mVuV!vh|@Au23jZQU*^
zEFRrHDjX>u#yntGm9ly?ACZ6>itK)nd0^8F|Km5W^+1U_)Zt(|(99PCo1exn@4~>a
z<NyEv|6kt&D?{?Z1W<T^?Gp}RVAu}|c?>H%AAxo8Z)Z{A-yWjE<Z<wUf(PdXG|P}Z
zgNP28`5K+S48Nh6EMa)SBl-BjU-BNA2QK?233wd*p{9AkBl$$;ffvjS3~3(xc?UI*
zXa09^;%D$k{tx1x_vn0{#-DSLUz0@z>?DtF7ZnLaG=ZF;fh9aUf3*Iu5VQPV!=?G5
z`5j~HC4QG<hxz3jKoQRPVLylhi5)-8;O^{frJxa-RGL>(s$i*StY@HWXkH5D8rB&Z
z=oy%3LWCJu7#J7?7#J8>85kJc{X!X-7#I$K#F#;*F)%QQKxxLRAO^+?0Y+&ac8&>*
z5Ir(bIgnluQ-Ohj!2rZyU|>iB(QbSKJxp$V2~2)md;(5<9FE)!5)2FsAs{)BeIVL{
zPoa_vECrS;0Esa$Fr<KJ4?YDZPcA+VcZj|okQhuqNX`wS5oG2Hs9ZUS_TV#M%7n;)
z+<ycl#=yX!3#IW<pp?VH@bN!3HOyFZGy?-O11z*qbuoiO7gY?zV`g9jQ5cw+fgM8(
zB*4tT0irN4GdR{zg+cxmLUJc8Zj=}p7(n8nxCZF}#}5Mog9$YLL1M_*3x_x;?qFsh
ztB=E>9u$w*)Mw*RUjua~I8npW2m=E{GY<8gQ1us}jse*RVot@Oeil@{11O?lX^DY>
z0hE3~;j;iL4o*i53=A7_n6n#djsg?NHl(zbTbfgnS&)-hl9peT>yw$Jm&{O<npTur
zoDrN{l$x5ykeQcR;)|?^A>Q4`-^tM@-rvnF*fk_R#L>yeHJ+g)IX$%`v81Gkp(ME&
z$|^2N$;@LYPAy3)O=F0UFD^+;&W=yc$c|4-%*<hk&rZt7EMdsZPcF$}NKY;CORXqz
z&PXf*v6DeWcxGNoetB?aRVqViUS@GlYH9&PUSeK8gq540!oXk*@eVlU@-Q$k`~j7>
z|NsAYK@#Uh68DCRgMxt%NjwND4k}Cdk;L<m#6jr-X8uwnaUmr2hmpjQ)qh12M^?`Q
zjX!kva6-jF?g8Zyn7sx_;>hNwA&DcK4=VdWR)fqzR{s-8y*QHlg+UHsU;u|FvU*Ti
z2{H#H4Z<Kc2!rw?hz5y)Fh~!G9|0m57(nGS7{l^M37R-8A51_Kho$#5XyUN+egaJ#
zmaZA}iYs$V5|bG8ic5+hbOwx7l$w*MSCU#$!l0LuSdz$~msDKLpqHGVo12<f!l0Lz
zUy`cl?iZ>HPNq<PdS0nsK~a7|YEelggC5v~)QtGFqQu-(s0%2gK;a6C3iJ{d($->N
z@C5}bk`=J<g$YSR;|iu8CVm2HU<Sx=1_lN$1_p2`3oDsHbr49c8dMy;M(9Pe7o--1
zp~iujV64Ny050vx)o%#3A65^84P{_pfZ4AN6M)h%`(d;dR6kT2PVFGl{h)dSREwc2
zhv^5!58P0wUy=EsdI{tfbp1D=0ymHqW6>XrBmNAa5d|veK}LY$4<rP_AU-Vqu-Ofg
z-vEt}2&g-_85kHqO?h<vATg*?kTy8xfTkaCD-A9RNkd3n20;c;djeSm!oC5uC<nrY
MlOXrPISdR805Ck>;s5{u

literal 0
HcmV?d00001

diff --git a/snake.c b/snake.c
index 53a4148..4fcdfc9 100644
--- a/snake.c
+++ b/snake.c
@@ -21,6 +21,10 @@
 
 //-----------methods--------------
 
+/**
+ * @param   set set the unicode encoding
+ * @return  is the program in unicode mode
+ */
 int isUnicodeEncoding(int set){
     static int bl = 0;
     if(set){
@@ -31,6 +35,8 @@ int isUnicodeEncoding(int set){
 
 /**
  * Only the first byte is required
+ * @param   c   first byte of the unicode char
+ * @return  How long is this utf-8 character (in bytes)
  */
 int checkUnicharLen(char c){
     int i = 0;
@@ -50,6 +56,9 @@ int checkUnicharLen(char c){
     return i;
 }
 
+/**
+ * @deprecated only used for debugging
+ */
 void printChar(unichar c){
     int len;
     len = checkUnicharLen(c.bytes.c[0]);
@@ -60,6 +69,12 @@ void printChar(unichar c){
 
 //fueoetoeoecsoeoe *next //what to NOT do
 
+/**
+ * read file into the map matrix
+ * @param   file    the map file "object"
+ * @param   matrix  the pointer of the matrix to return
+ * @return  was the read successful
+ */
 int readFile(FILE *file, Matrix *matrix){
     int c, len, maxLineLen = 0, lineCount = 1, lineLen = 0; //lineCount = (3,1) ??? why?... i was just bored
     struct Vec2i pos;
@@ -158,6 +173,9 @@ int readFile(FILE *file, Matrix *matrix){
     return 0;
 }
 
+/** free up matrix
+ * @param map matrix to free up
+ */
 void rmMatrix(Matrix *map){
     for(int i = 0; i < map->width; i++){
         free(map->matrix[i]);
@@ -168,25 +186,38 @@ void rmMatrix(Matrix *map){
 //Use what chunk,
 //witch screen coordinates?
 //just the screen data
+/**
+ * prints a chunk into the screen, if the input position is relative
+ * @param ch chunk to print
+ * @param pos position relative to the screen
+ * @param scrDat standard screen infos
+ */
 void printChunk(chunk ch, Pos pos, screenData *scrDat){
     //pos.x -= scrDat->pos.x;
     //pos.y -= scrDat->pos.y;
     if(pos.x < 0 || pos.y < 0 || pos.x >= scrDat->size.x || pos.y >= scrDat->size.y){
         return; //if pos is not on the screen, just do nothing.
     }
+    if(ch.isFood){
+        chunk ch = scrDat->foodTexture.text[ch.data.FRand%scrDat->foodTexture.len];
+    }
     printf("\e[%d;%dH", pos.y+1, pos.x *2+1);
     for(int i = 0; i < 2; i++){
-        printChar(ch.data.chars[i]);
+        printChar(ch.data.chars[i]); 
     }
     #ifdef DEBUG
     printf("\e[0;0H\n"); //to update terminal after EVERY print but drasticlally slowing it down
     #endif
 }
 
-/**Print characters to a map pos
- * 
+/** Print characters to the screen with an absolute position input
  * It will check if the character is on the screen
  * 
+ * @param ch chunk to print
+ * @param pos absolute position
+ * @param scrDat standard screen data
+ * @param width map width
+ * @param height map height
  */
 void print(chunk ch, Pos pos, screenData *scrDat, int width, int height){
     pos.x = pos.x - scrDat->pos.x;
@@ -210,10 +241,21 @@ void print(chunk ch, Pos pos, screenData *scrDat, int width, int height){
     printChunk(ch, pos, scrDat);
 }
 
-void printSnakeChunk(snakeChain *snake){
+
+/** prints snake chain onto the map, listening to directions
+ */
+//TODO
+void printSnakeChunk(snakeChain *snake, Direction prevDir, screenData *scrDat){
     //TODO
 }
 
+
+/**
+ * update the windows size if resized
+ * @param map map for width and height
+ * @param scrDat standard screen data. changes will apply
+ * @return did the screen size changed
+ */
 int updateScreenSize(Matrix *map, screenData *scrDat){
     struct Vec2i size = getWindowSize();
     size.x = size.x / 2;
@@ -230,19 +272,27 @@ int updateScreenSize(Matrix *map, screenData *scrDat){
     return 1;
 }
 
-//Update screen if required 
+/**
+ * Update the screen if it changed size of snek is near to the screen border
+ * The game doesn't update every character in every round to be more efficient
+ * 
+ * @param map map
+ * @param scrDat screenData
+ * @param head the head of the snake
+ * @param d snek's current moving direction
+ */
 void updateScreen(Matrix *map, screenData *scrDat, snakeChain *head, Direction d){
     int do_update;
     do_update = updateScreenSize(map, scrDat);
 
     if(do_update){
         if(scrDat->size.x < map->width){
-            scrDat->pos.x = mod((head->pos.x + scrDat->size.x) - scrDat->size.x / 2 ,map->width, scrDat->repeatMap);
+            scrDat->pos.x = mod(head->pos.x - scrDat->size.x / 2 ,map->width, scrDat->repeatMap);
         }else{
             scrDat->pos.x = 0;
         }
         if(scrDat->size.y < map->height){
-            scrDat->pos.y = mod((head->pos.y + scrDat->size.y) - scrDat->size.y / 2 ,map->height, scrDat->repeatMap);
+            scrDat->pos.y = mod(head->pos.y - scrDat->size.y / 2 ,map->height, scrDat->repeatMap);
         }else{
             scrDat->pos.y = 0;
         }
@@ -300,6 +350,13 @@ void updateScreen(Matrix *map, screenData *scrDat, snakeChain *head, Direction d
     }
 }
 
+/**
+ * reads the stdin for new control commands (wasd), apply them to the scrDat commands standardDat
+ * and dooesn't start to wait for user input if not available.
+ * 
+ * @param scrDat standard game data
+ * @param direction current direction
+ */
 void getControl(screenData *scrDat, Direction *direction){
     int i;
     while(i = getNextChar(), i != EOF){
@@ -352,14 +409,31 @@ void getControl(screenData *scrDat, Direction *direction){
     }
 }
 
+/**
+ * @param c input chunk
+ * @return false if the input chunk is a wall
+ */
 int isNotWall(chunk c){
     return c.isFood || (c.data.chars[0].bytes.c[0] == ' ' && c.data.chars[1].bytes.c[0] == ' ');
 }
 
+/**
+ * @param c input chunk
+ * @return is the chunk air (not wall and not food)
+ */
 int isAir(chunk c){
     return !c.isFood && isNotWall(c);
 }
 
+/**
+ * after some round it will place a new food onto the map randomly.
+ * 
+ * @param map map
+ * @param foodTick how long ago was the last food placed (pointer)
+ * @param feedAmount how often (in ticks) sould be a new food placed
+ * @param firstSnake snake, to avoid placing food into snake
+ * @param scrDat food will be printed, screed data is needed for this
+ */
 void updateFood(Matrix *map, int *foodTick, int feedAmount, snakeChain *firstSnake, screenData *scrDat){
     if((*foodTick)++ > feedAmount){
         for(int i = 0; i < 128; i++){
@@ -399,6 +473,18 @@ void updateFood(Matrix *map, int *foodTick, int feedAmount, snakeChain *firstSna
 }
 
 //EOF fatal error, 1 game over
+
+/**
+ * step and check snake
+ * 
+ * 
+ * @param map map
+ * @param scrDat screenData
+ * @param d current direction
+ * @param head head of snek
+ * @param canBite can sneak bite itself (boolean)
+ * @return EOF if fatal error happened, 1 if the game is over, 0 instead.
+ */
 int updateSnake(Matrix *map, screenData *scrDat, Direction d, snakeChain *head, int canBite){
     Pos pos = head->pos;
     switch (d)
@@ -447,14 +533,19 @@ int updateSnake(Matrix *map, screenData *scrDat, Direction d, snakeChain *head,
         }
         snakeChain *snake = head;
         Pos tmp_pos1 = head->pos, tmp_pos2;
+        Direction dir_tmp = head->dir, dir_tmp2;
+        head->dir = d;
         head->pos = pos;
         while (snake->next != 0)
         {
             snake = snake->next;
             chunk c;
+
+            //if snek hit itself
             if(snake != head && snake->pos.x == head->pos.x && snake->pos.y == head->pos.y){
                 if(snake->next != NULL){
                     if(canBite){
+                        //if snek can bite its own tail, free that space and fill these places with   .
                         snakeChain *current = snake, *tmp_snek = snake->next;
                         current->next = NULL;
                         while (tmp_snek != NULL)
@@ -478,12 +569,26 @@ int updateSnake(Matrix *map, screenData *scrDat, Direction d, snakeChain *head,
                 
                 
             }
+            //step position
             tmp_pos2 = snake->pos;
             snake->pos = tmp_pos1;
             tmp_pos1 = tmp_pos2;
 
+            //step direction
+            dir_tmp2 = snake->dir;
+            snake->dir = dir_tmp;
+
+            //render snek
+            
+            /*
             c.data.chars[0].bytes.c[0] = '>';
             c.data.chars[1].bytes.c[0] = '<';            
+            */
+            if(snake->pos.x != -1){
+                //TODO call render
+            }
+
+            //create a new segment
             if(snake->next == NULL && isFood){
                 isFood = false;
                 snake->next = malloc(sizeof(snakeChain));
@@ -492,15 +597,18 @@ int updateSnake(Matrix *map, screenData *scrDat, Direction d, snakeChain *head,
                 }
                 snake->next->next = NULL;
                 snake->next->pos = tmp_pos1;
+                snake->next->num = snake->num + 1;
             }
-            if(snake->pos.x == -1){
-                continue;   //don't render snake part with initial position
-            }
-            printf(blue);
-            print(c, snake->pos, scrDat, map->width, map->height); //TODO direction snake
-            printf("\e[0m");
+            //printf(blue);
+            //print(c, snake->pos, scrDat, map->width, map->height); //TODO direction snake
+
+            #ifdef DEBUG
+            printf("\e[0m"); //if debug active, update display after every segments
+            #endif
 
         }
+
+        //clear last segment form the screen
         if(tmp_pos2.x != -1){
             chunk c; 
             c.data.chars[0].bytes.c[0] = ' ';
@@ -512,7 +620,10 @@ int updateSnake(Matrix *map, screenData *scrDat, Direction d, snakeChain *head,
         c.data.chars[1].bytes.c[0] = ')';
         printf(blue);
         print(c, head->pos, scrDat, map->width, map->height); //TODO direction snake
+
+        #ifdef DEBUG
         printf("\e[0m");
+        #endif
     }
     else
     {
@@ -523,6 +634,16 @@ int updateSnake(Matrix *map, screenData *scrDat, Direction d, snakeChain *head,
 
 //------------config loader------------
 
+/**
+ * Loads game config file
+ * 
+ * @param tickSpeed game tickSpeed in miliseconds
+ * @param repeatMap is the map repeated
+ * @param feedAmount food spawn rate
+ * @param canBite can snek bite itself
+ * 
+ * @return EOF if error 0 instead
+ */
 int loadConfig(int *tickSpeed, int *repeatMap, int *feedAmount, int *canBite){
     FILE *config;
     config = fopen("config.cfg", "r");
@@ -581,6 +702,21 @@ int loadConfig(int *tickSpeed, int *repeatMap, int *feedAmount, int *canBite){
 //update display
 //update food state
 //step snake
+/**
+ * ticks the game including everything
+ * updates the control
+ * updates the screen
+ * updates the foods
+ * steps snek
+ * 
+ * @param map map
+ * @param scrDat screenData
+ * @param snake snake's head
+ * @param d direction
+ * @param feedAmount food spawn rate
+ * @param canBite can snake bite its own tail
+ * @return 1 if game over
+ */
 int tick(Matrix *map, screenData *scrDat, snakeChain *snake, Direction *d, int feedAmount, int canBite){
     static int foodTick = 0;
     getControl(scrDat, d);
@@ -609,6 +745,16 @@ int tick(Matrix *map, screenData *scrDat, snakeChain *snake, Direction *d, int f
     return 0;
 }
 
+/**
+ * prepares the game for loop and then starts the infinite loop
+ * 
+ * @param matrix map
+ * @param tickspeed game tickspeed in milis
+ * @param repeatMap does the map repeat itself
+ * @param feedAmount food spawn rate
+ * @param canBite can snake bite itself
+ * @return 0
+ */
 int loop(Matrix *matrix, int tickspeed, int repeatMap, int feedAmount, int canBite){
 
     Direction d = NONE; //Init with none
@@ -636,6 +782,7 @@ int loop(Matrix *matrix, int tickspeed, int repeatMap, int feedAmount, int canBi
         chain = chain->next;
         chain->pos = p;
         chain->next = NULL;
+        chain->num = i-1;
     }
 
     scrDat.size.x = 0;
@@ -653,6 +800,13 @@ int loop(Matrix *matrix, int tickspeed, int repeatMap, int feedAmount, int canBi
 }
 
 //------------TESTING METHODS-------------
+
+/**
+ * ONLY FOR DEBUG
+ * print the map for debug
+ * 
+ * @param map map
+ */
 void _testprint(Matrix *map){
     for (int y = 0; y < map->height; y++){
         for(int x = 0; x < map->width; x++){
@@ -667,6 +821,12 @@ void _testprint(Matrix *map){
     }
 }
 
+/**
+ * ONLY FOR DEBUG
+ * reads coordinates from stdin and print this pos to the stdout
+ * 
+ * @param map map
+ */
 void _print1char(Matrix *map){
     int x, y;
     while(scanf(" %d%d", &x, &y) == 2){
@@ -688,6 +848,13 @@ void _print1char(Matrix *map){
 
 //-------------CORE METHOD----------------
 
+/**
+ * The main method is respinsible for the debug or release mode start, technically the main is redirected here
+ * initialize the game then start tle game
+ * 
+ * @param argc redirected argc
+ * @param argv redirected argv
+ */
 int core(int argc, char const *argv[])
 {
     FILE *f;
@@ -716,7 +883,7 @@ int core(int argc, char const *argv[])
     //----import map----
 
     if(argc == 1){
-        printf("Usage: snake <map name> [<snake skin>]");
+        printf("Usage: snake \<map name\> \[\<snake skin\>\]");
         return 0;
     }
     else{
@@ -731,7 +898,9 @@ int core(int argc, char const *argv[])
     //----start game----
 
 
+    #ifdef DEBUG
     _testprint(&map);
+    #endif
 
     loop(&map, tickspeed, repeatMap, feedAmount, canBite);
 
@@ -760,6 +929,8 @@ int main(int argc, char const *argv[])
  * debugger main function
  * in debug mode, starts the core with correct params
  * in release mode, it will use user input files.
+ * @param argc argc
+ * @param argv *argv[]
  */
 int main(int argc, char const *argv[])
 {
@@ -768,7 +939,7 @@ int main(int argc, char const *argv[])
     //2 + 3;  //... this does nothing...
     #ifdef DEBUG
     int ret;
-    char const *array[] = {argv[0], "map1.txt"};
+    char const *array[] = {argv[0], "snake.c"}; // set the debug input
     ret = core(2, array);
     printf("\npress any key to continue");
     getchar();
diff --git a/snake.o b/snake.o
new file mode 100644
index 0000000000000000000000000000000000000000..6fd6ac0bdae107f5e918285595ad9f0923372095
GIT binary patch
literal 28440
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
GT|WSRiM~1j

literal 0
HcmV?d00001

diff --git a/snek.txt b/snek.txt
new file mode 100644
index 0000000..e69de29
diff --git a/structs.h b/structs.h
index ce24712..21c3580 100644
--- a/structs.h
+++ b/structs.h
@@ -2,11 +2,11 @@
 #define SNAKE_STRUCTS
 
 typedef enum Direction{
-    NONE = 0,
-    UP,
-    RIGHT,
-    DOWN,
-    LEFT,
+    NONE = -1,
+    UP = 0,
+    RIGHT = 1,
+    DOWN = 2,
+    LEFT = 3,
 }Direction;
 
 typedef struct Vec2i{
@@ -18,6 +18,7 @@ typedef struct snakeChain
 {
     int num;
     struct Vec2i pos;
+    Direction dir;
     struct snakeChain *next;
 
 }snakeChain;
@@ -62,12 +63,13 @@ typedef struct chunkMatrix{
     int height;
 }Matrix;
 
-/*typedef struct Food{
-    Pos pos;
-    int rand;
-    struct Food *next;
-}Food;*/
 
+typedef struct foodText{
+    int len;
+    chunk *text;
+}foodText;
+
+//Storing important information from the screen
 typedef struct screenData{
     Pos pos;
     Pos size;
@@ -75,6 +77,8 @@ typedef struct screenData{
     int isXRepeat;
     int isYRepeat;
     Direction commands[2];
+    foodText foodTexture;//not real texture, but characters
+    //snake texture will be a bit more difficult
 }screenData;
 
 #endif
\ No newline at end of file
-- 
GitLab