update_states.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #include "update_states.h"
  2. #include "pattern.h"
  3. #include "fixed.h"
  4. static void game_over(Game_Data *data);
  5. void update_title(Game_Data *data)
  6. {
  7. data->last_time = data->current_time;
  8. data->current_time = RTC_GetTicks();
  9. data->chrono_time += (data->current_time - data->last_time)/ 128.;
  10. if(KeyDown(K_SHIFT) && data->shift_latch_value == 0) {
  11. switch_to_state(MENU, data);
  12. }
  13. updateCamera(&(data->cam), data->current_time - data->last_time);
  14. }
  15. #define min(a, b) ((a) < (b) ? (a) : (b))
  16. void update_game(Game_Data *data)
  17. {
  18. data->last_time = data->current_time;
  19. data->current_time = RTC_GetTicks();
  20. data->chrono_time += (data->current_time - data->last_time)/ 128.;
  21. if(data->chrono_time >= 60) {
  22. data->are_colors_reversed = 1;
  23. }
  24. if(data->list != NULL) {
  25. // if the linked list is not empty
  26. updateWalls(data->list, min(data->current_time - data->last_time, 2));
  27. // update the linked list
  28. // if the player and a wall collide
  29. if(isColliding(data->list, data->player_angle, data->nb_lines) == true) {
  30. game_over(data);
  31. return;
  32. }
  33. // remove every wall whose distance to the center equals zero
  34. data->list = removeWall(data->list, 8);
  35. }
  36. // level generation
  37. if(!data->cooldown_timer--) {
  38. Pattern pattern = data->level->patterns[rand()% data->level->nb_patterns];
  39. addPattern(data, &pattern, rand()%data->nb_lines, rand()&1);
  40. data->cooldown_timer = pattern.cooldown;
  41. }
  42. if(KeyDown(K_LEFT) && !isCollidingSide(data->list, data->player_angle, data->nb_lines)) {
  43. data->player_angle = data->player_angle - data->level->player_rotation_speed * (data->current_time - data->last_time)*FRAME_TIME;
  44. // int newAngle = data->player_angle - data->level->player_rotation_speed * (data->current_time - data->last_time)*FRAME_TIME;
  45. //if(isCollidingSide(data->list, newAngle, data->nb_lines))
  46. // data->player_angle = ((newAngle)/data->nb_lines)*data->nb_lines + 1;
  47. //else
  48. //data->player_angle = newAngle;
  49. }
  50. if(KeyDown(K_RIGHT)) {
  51. // if(isCollidingSide(data->list, data->player_angle, data->nb_lines))
  52. // else
  53. data->player_angle = data->player_angle + data->level->player_rotation_speed * (data->current_time - data->last_time)*FRAME_TIME;
  54. }
  55. if(KeyDown(K_ALPHA) && data->alpha_latch_value == 0) {
  56. game_over(data);
  57. }
  58. if(KeyDown(K_PLUS) && data->line_transition.counter == 0)
  59. {
  60. data->line_transition.counter = 10;
  61. data->line_transition.counter_start = 10;
  62. data->line_transition.delta_nb_lines = 1;
  63. }else if(KeyDown(K_MINUS) && data->line_transition.counter == 0){
  64. data->line_transition.counter = 10;
  65. data->line_transition.counter_start = 10;
  66. data->line_transition.delta_nb_lines = -1;
  67. }
  68. if(data->line_transition.counter != 0){
  69. data->line_transition.counter --;
  70. if(data->line_transition.counter <= 0){
  71. data->nb_lines += data->line_transition.delta_nb_lines;
  72. data->line_transition.counter_start = 0;
  73. data->line_transition.delta_nb_lines = 0;
  74. }
  75. }
  76. data->player_angle = MOD(data->player_angle, 360);
  77. updateCamera(&(data->cam), data->current_time - data->last_time);
  78. }
  79. void update_game_over(Game_Data *data)
  80. {
  81. if(KeyDown(K_SHIFT) && data->shift_latch_value == 0) {
  82. switch_to_state(GAME, data);
  83. }
  84. if((KeyDown(K_ALPHA) && data->alpha_latch_value == 0)) {
  85. switch_to_state(MENU, data);
  86. }
  87. updateCamera(&(data->cam), data->current_time - data->last_time);
  88. }
  89. void update_menu(Game_Data *data)
  90. {
  91. //WARNING: THIS IS JUST PLACEHOLDER TO TEST THE GRAPHICS (too lazy to do some real level handling right now...)
  92. data->last_time = data->current_time;//updating the time variables
  93. data->current_time = RTC_GetTicks();
  94. if(data->keypress_delay == 0) //to make sure that the user isn't scrolling too fast
  95. {
  96. if(KeyDown(K_SHIFT)) //load the selected level
  97. switch_to_state(GAME, data);//TODO: change some values in data first
  98. else if(KeyDown(K_LEFT))
  99. {
  100. data->current_entry --;//change the selected id
  101. data->chrono_time = data->entry_highscores[data->current_entry - 1];
  102. if(data->current_entry == 0)//check for overflows
  103. data->current_entry = 6;
  104. data->keypress_delay = 15;//init the delay
  105. data->are_colors_reversed = data->current_entry > 3;
  106. //TODO: load high score data and stuff, probably not at run time, but in init_states
  107. data->cam.speed = 4;
  108. }else if(KeyDown(K_RIGHT))
  109. {
  110. data->current_entry ++;
  111. data->chrono_time = data->entry_highscores[data->current_entry - 1];
  112. if(data->current_entry == 7)
  113. data->current_entry = 1;
  114. data->keypress_delay = 15;
  115. data->are_colors_reversed = data->current_entry > 3;
  116. data->cam.speed = -4;
  117. }
  118. }else if(data->keypress_delay-- != 0 && data->cam.speed != 0) {
  119. if(data->cam.speed < 0)
  120. data->cam.angle += 360 + data->cam.speed;
  121. else
  122. data->cam.angle += data->cam.speed;
  123. data->cam.angle %= 360;
  124. if(data->keypress_delay == 0)
  125. data->cam.speed = 0;
  126. //Because the updateCamera isn't really precise
  127. //updateCamera(&(data->cam), data->current_time - data->last_time);//update the camera for the background
  128. }
  129. }
  130. void updateCamera(Camera *cam, unsigned int delta_time){
  131. cam->angle += (int)(cam->speed * delta_time / 2.);
  132. if(cam->angle < 0) cam->angle += 360;
  133. if(cam->angle >= 360)
  134. cam->angle = cam->angle % 360;
  135. }
  136. static void game_over(Game_Data *data) {
  137. // clean up wall
  138. int i = 128;
  139. while(data->list != NULL) {
  140. Wall *next = data->list->nxt;
  141. free(data->list);
  142. data->list = next;
  143. }
  144. for (i = 0; i < data->level->nb_patterns; ++i)
  145. {
  146. freePattern(&data->level->patterns[i]);
  147. }
  148. free(data->level);
  149. data->level = NULL;
  150. switch_to_state(GAME_OVER, data);
  151. }