/* Raffael Himmelreich */ /* and Clifford Wolf */ /* gcc ambassador_of_pain.c -o aop -lcurses */ #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int old_px, old_py, px, py, x, y, c, fd, dir, lifes=5, level=1; char ch, field[25][81], *lastword = "Bye."; if ( argc < 2 || *argv[1] == '-' ) return printf("Usage: %s aop-level-1.txt ... " "aop-level-n.txt\n", argv[0]) != 0; memset(field, ' ', 25*81); initscr(); cbreak(); noecho(); curs_set(0); keypad(stdscr, TRUE); nodelay(stdscr, 1); start_level: fd = open(argv[level], O_RDONLY); for(dir=y=x=0; y <= 25; x=(x+1)%81, y+=x==0) if ( !read(fd, &ch, 1)) break; else if( ch == 'O' ) { old_px=px=x; old_py=py=y; } else if( field[y][x] == '0' ) continue; else field[y][x] = ch; close(fd); while( (c=getch()) != 'q' ) { if ( c == KEY_UP ) dir = 8; if ( c == KEY_DOWN ) dir = 2; if ( c == KEY_LEFT ) dir = 4; if ( c == KEY_RIGHT ) dir = 6; py += dir==8 ? -1 : (dir==2 ? +1 : 0); px += dir==4 ? -1 : (dir==6 ? +1 : 0); if (field[py][px] == '@') { if(level+1 == argc) { lastword="Well done!"; break; } memset(field, ' ', 25*81); level++; goto start_level; } else if (field[py][px] == '0') lifes++; else if (field[py][px] != ' ' && dir) { field[old_py][old_px] = '0'; if(--lifes == 0) { lastword="Sucker!"; break; } goto start_level; } field[old_py][old_px] = ' '; field[old_py=py][old_px=px] = 'O'; for(y=x=0; y < 25; x=(x+1)%80, y+=x==0) mvaddch(y, x, field[y][x]); mvprintw(0, 0, "Lifes: %d", lifes); refresh(); usleep(dir==4 || dir==6 ? 50000 : 100000); } endwin(); printf("%s\n", lastword); return strcmp(lastword, "Sucker!") == 0; } /* Yup - This are 64 lines of C code. ;-) */