Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#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();
}