123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- #include <u.h>
- #include <libc.h>
- #include <draw.h>
- #include "sokoban.h"
- /* pretty ghastly, if you ask me */
- void
- move(int key)
- {
- Point g = level.glenda;
- int moved = 0;
- /* this is messy; no time for math */
- switch(key) {
- case Up:
- switch(level.board[g.x][g.y-1]) {
- case Empty:
- case Goal:
- moved = 1;
- level.glenda = Pt(g.x, g.y-1);
- break;
- case Cargo:
- case GoalCargo:
- switch(level.board[g.x][g.y-2]) {
- case Empty:
- moved = 1;
- level.board[g.x][g.y-2] = Cargo;
- drawboard(Pt(g.x, g.y-2));
- break;
- case Goal:
- moved = 1;
- level.board[g.x][g.y-2] = GoalCargo;
- drawboard(Pt(g.x, g.y-2));
- break;
- }
- if(moved) {
- level.board[g.x][g.y-1] = (level.board[g.x][g.y-1] == Cargo) ? Empty : Goal;
- level.glenda = Pt(g.x, g.y-1);
- }
- break;
- }
- break;
- case Down:
- switch(level.board[g.x][g.y+1]) {
- case Empty:
- case Goal:
- moved = 1;
- level.glenda = Pt(g.x, g.y+1);
- break;
- case Cargo:
- case GoalCargo:
- switch(level.board[g.x][g.y+2]) {
- case Empty:
- moved = 1;
- level.board[g.x][g.y+2] = Cargo;
- drawboard(Pt(g.x, g.y+2));
- break;
- case Goal:
- moved = 1;
- level.board[g.x][g.y+2] = GoalCargo;
- drawboard(Pt(g.x, g.y+2));
- break;
- }
- if(moved) {
- level.board[g.x][g.y+1] = (level.board[g.x][g.y+1] == Cargo) ? Empty : Goal;
- level.glenda = Pt(g.x, g.y+1);
- }
- break;
- }
- break;
- case Left:
- glenda = gleft;
- switch(level.board[g.x-1][g.y]) {
- case Empty:
- case Goal:
- moved = 1;
- level.glenda = Pt(g.x-1, g.y);
- break;
- case Cargo:
- case GoalCargo:
- switch(level.board[g.x-2][g.y]) {
- case Empty:
- moved = 1;
- level.board[g.x-2][g.y] = Cargo;
- drawboard(Pt(g.x-2, g.y));
- break;
- case Goal:
- moved = 1;
- level.board[g.x-2][g.y] = GoalCargo;
- drawboard(Pt(g.x-2, g.y));
- break;
- }
- if(moved) {
- level.board[g.x-1][g.y] = (level.board[g.x-1][g.y] == Cargo) ? Empty : Goal;
- level.glenda = Pt(g.x-1, g.y);
- }
- break;
- }
- break;
- case Right:
- glenda = gright;
- switch(level.board[g.x+1][g.y]) {
- case Empty:
- case Goal:
- moved = 1;
- level.glenda = Pt(g.x+1, g.y);
- break;
- case Cargo:
- case GoalCargo:
- switch(level.board[g.x+2][g.y]) {
- case Empty:
- moved = 1;
- level.board[g.x+2][g.y] = Cargo;
- drawboard(Pt(g.x+2, g.y));
- break;
- case Goal:
- moved = 1;
- level.board[g.x+2][g.y] = GoalCargo;
- drawboard(Pt(g.x+2, g.y));
- break;
- }
- if(moved) {
- level.board[g.x+1][g.y] = (level.board[g.x+1][g.y] == Cargo) ? Empty : Goal;
- level.glenda = Pt(g.x+1, g.y);
- }
- break;
- }
- break;
- }
- if(moved)
- drawboard(Pt(g.x, g.y));
- drawglenda();
- }
|