pattern.c 1.6 KB

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