ref: 73ffc757d57e3b84fe62d679425be6be209fcfac
dir: /sys/src/games/sokoban/move.c/
#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(); }