pattern.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include "pattern.h"
  2. #include "struct.h"
  3. #include "wall.h"
  4. static Pattern* allocatePattern(unsigned int pattern_length) {
  5. // Freaking free cascade
  6. pattern->side = malloc(sizeof(unsigned char) * pattern_length);
  7. if(pattern_length->side == NULL) {
  8. free(pattern);
  9. return NULL;
  10. }
  11. pattern->distance = malloc(sizeof(unsigned short) * pattern_length);
  12. if(pattern_length->distance == NULL) {
  13. free(pattern->side);
  14. free(pattern);
  15. return NULL;
  16. }
  17. pattern->wall_length = malloc(sizeof(unsigned short) * pattern_length);
  18. if(pattern_length->wall_length == NULL) {
  19. free(pattern->distance);
  20. free(pattern->side);
  21. free(pattern);
  22. return NULL;
  23. }
  24. }
  25. Pattern* readPattern(unsigned char* data, unsigned int length) {
  26. unsigned char* iterator = data+1;
  27. unsigned i, pattern_length;
  28. Pattern* pattern;
  29. pattern_length = data[0];
  30. pattern = allocatePattern(pattern_length);
  31. if(pattern == NULL) return NULL;
  32. for(int i = 0; i < pattern_length; i++) {
  33. pattern->side[i] = data[iterator];
  34. pattern->distance[i] = ((data[iterator]+1)<<8) + (data[iterator]+2);
  35. pattern->wall_length[i] = ((data[iterator]+2)<<8) + (data[iterator]+3);
  36. iterator+= 5;
  37. }
  38. return pattern;
  39. }
  40. void addPattern(Game_Data* data, Pattern* pattern, unsigned char offset) {
  41. unsigned int i;
  42. for(i = 0; i < pattern->length; i++) {
  43. // Build wall
  44. addWall(data->list, pattern->distance[i], pattern->wall_length, 1, (pattern->side[i] + offset)%data->nb_lines);
  45. }
  46. }
  47. Pattern* freePattern(Pattern* pattern) {
  48. free(pattern->side);
  49. free(pattern->distance);
  50. free(pattern->wall_length);
  51. free(pattern);
  52. return NULL;
  53. }