move.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <draw.h>
  4. #include "sokoban.h"
  5. /* pretty ghastly, if you ask me */
  6. void
  7. move(int key)
  8. {
  9. Point g = level.glenda;
  10. int moved = 0;
  11. /* this is messy; no time for math */
  12. switch(key) {
  13. case Up:
  14. switch(level.board[g.x][g.y-1]) {
  15. case Empty:
  16. case Goal:
  17. moved = 1;
  18. level.glenda = Pt(g.x, g.y-1);
  19. break;
  20. case Cargo:
  21. case GoalCargo:
  22. switch(level.board[g.x][g.y-2]) {
  23. case Empty:
  24. moved = 1;
  25. level.board[g.x][g.y-2] = Cargo;
  26. drawboard(Pt(g.x, g.y-2));
  27. break;
  28. case Goal:
  29. moved = 1;
  30. level.board[g.x][g.y-2] = GoalCargo;
  31. drawboard(Pt(g.x, g.y-2));
  32. break;
  33. }
  34. if(moved) {
  35. level.board[g.x][g.y-1] = (level.board[g.x][g.y-1] == Cargo) ? Empty : Goal;
  36. level.glenda = Pt(g.x, g.y-1);
  37. }
  38. break;
  39. }
  40. break;
  41. case Down:
  42. switch(level.board[g.x][g.y+1]) {
  43. case Empty:
  44. case Goal:
  45. moved = 1;
  46. level.glenda = Pt(g.x, g.y+1);
  47. break;
  48. case Cargo:
  49. case GoalCargo:
  50. switch(level.board[g.x][g.y+2]) {
  51. case Empty:
  52. moved = 1;
  53. level.board[g.x][g.y+2] = Cargo;
  54. drawboard(Pt(g.x, g.y+2));
  55. break;
  56. case Goal:
  57. moved = 1;
  58. level.board[g.x][g.y+2] = GoalCargo;
  59. drawboard(Pt(g.x, g.y+2));
  60. break;
  61. }
  62. if(moved) {
  63. level.board[g.x][g.y+1] = (level.board[g.x][g.y+1] == Cargo) ? Empty : Goal;
  64. level.glenda = Pt(g.x, g.y+1);
  65. }
  66. break;
  67. }
  68. break;
  69. case Left:
  70. glenda = gleft;
  71. switch(level.board[g.x-1][g.y]) {
  72. case Empty:
  73. case Goal:
  74. moved = 1;
  75. level.glenda = Pt(g.x-1, g.y);
  76. break;
  77. case Cargo:
  78. case GoalCargo:
  79. switch(level.board[g.x-2][g.y]) {
  80. case Empty:
  81. moved = 1;
  82. level.board[g.x-2][g.y] = Cargo;
  83. drawboard(Pt(g.x-2, g.y));
  84. break;
  85. case Goal:
  86. moved = 1;
  87. level.board[g.x-2][g.y] = GoalCargo;
  88. drawboard(Pt(g.x-2, g.y));
  89. break;
  90. }
  91. if(moved) {
  92. level.board[g.x-1][g.y] = (level.board[g.x-1][g.y] == Cargo) ? Empty : Goal;
  93. level.glenda = Pt(g.x-1, g.y);
  94. }
  95. break;
  96. }
  97. break;
  98. case Right:
  99. glenda = gright;
  100. switch(level.board[g.x+1][g.y]) {
  101. case Empty:
  102. case Goal:
  103. moved = 1;
  104. level.glenda = Pt(g.x+1, g.y);
  105. break;
  106. case Cargo:
  107. case GoalCargo:
  108. switch(level.board[g.x+2][g.y]) {
  109. case Empty:
  110. moved = 1;
  111. level.board[g.x+2][g.y] = Cargo;
  112. drawboard(Pt(g.x+2, g.y));
  113. break;
  114. case Goal:
  115. moved = 1;
  116. level.board[g.x+2][g.y] = GoalCargo;
  117. drawboard(Pt(g.x+2, g.y));
  118. break;
  119. }
  120. if(moved) {
  121. level.board[g.x+1][g.y] = (level.board[g.x+1][g.y] == Cargo) ? Empty : Goal;
  122. level.glenda = Pt(g.x+1, g.y);
  123. }
  124. break;
  125. }
  126. break;
  127. }
  128. if(moved)
  129. drawboard(Pt(g.x, g.y));
  130. drawglenda();
  131. }