void makeMove(Piece *p1, Piece *p2) { p1->mode = NORMAL; moves[n_moves++] = *p1; p1->value = BLANK; p2->mode = NORMAL; moves[n_moves++] = *p2; p2->value = BLANK; updatePiece(p1); updatePiece(p2); n_pairs_remaining--; giveHelp(0); }
/* In the constructor, we just pass the standard parameters on to QWidget. The menu uses a single slot to simplify the process of adding more items to the options menu. */ ImageViewer::ImageViewer( QWidget *parent, const char *name, int wFlags ) : QWidget( parent, name, wFlags ), conversion_flags( PreferDither ), helpmsg( 0 ) { pickx = -1; picky = -1; clickx = -1; clicky = -1; alloc_context = 0; menubar = new QMenuBar(this); menubar->setSeparator( QMenuBar::InWindowsStyle ); QStrList fmt = QImage::outputFormats(); saveimage = new QPopupMenu( menubar ); savepixmap = new QPopupMenu( menubar ); for (const char* f = fmt.first(); f; f = fmt.next()) { saveimage->insertItem( f ); savepixmap->insertItem( f ); } connect( saveimage, SIGNAL(activated(int)), this, SLOT(saveImage(int)) ); connect( savepixmap, SIGNAL(activated(int)), this, SLOT(savePixmap(int)) ); file = new QPopupMenu( menubar ); menubar->insertItem( "&File", file ); file->insertItem( "&New window", this, SLOT(newWindow()), CTRL+Key_N ); file->insertItem( "&Open...", this, SLOT(openFile()), CTRL+Key_O ); si = file->insertItem( "Save image", saveimage ); sp = file->insertItem( "Save pixmap", savepixmap ); file->insertSeparator(); file->insertItem( "E&xit", qApp, SLOT(quit()), CTRL+Key_Q ); edit = new QPopupMenu( menubar ); menubar->insertItem( "&Edit", edit ); edit->insertItem("&Copy", this, SLOT(copy()), CTRL+Key_C); edit->insertItem("&Paste", this, SLOT(paste()), CTRL+Key_V); edit->insertSeparator(); edit->insertItem("&Horizontal flip", this, SLOT(hFlip()), ALT+Key_H); edit->insertItem("&Vertical flip", this, SLOT(vFlip()), ALT+Key_V); edit->insertItem("&Rotate 180", this, SLOT(rot180()), ALT+Key_R); edit->insertSeparator(); edit->insertItem("&Text...", this, SLOT(editText())); edit->insertSeparator(); t1 = edit->insertItem( "Convert to &1 bit", this, SLOT(to1Bit()) ); t8 = edit->insertItem( "Convert to &8 bit", this, SLOT(to8Bit()) ); t32 = edit->insertItem( "Convert to &32 bit", this, SLOT(to32Bit()) ); options = new QPopupMenu( menubar ); menubar->insertItem( "&Options", options ); ac = options->insertItem( "AutoColor" ); co = options->insertItem( "ColorOnly" ); mo = options->insertItem( "MonoOnly" ); options->insertSeparator(); fd = options->insertItem( "DiffuseDither" ); bd = options->insertItem( "OrderedDither" ); td = options->insertItem( "ThresholdDither" ); options->insertSeparator(); ta = options->insertItem( "ThresholdAlphaDither" ); ba = options->insertItem( "OrderedAlphaDither" ); fa = options->insertItem( "DiffuseAlphaDither" ); options->insertSeparator(); ad = options->insertItem( "PreferDither" ); dd = options->insertItem( "AvoidDither" ); options->insertSeparator(); ss = options->insertItem( "Smooth scaling" ); cc = options->insertItem( "Use color context" ); if ( QApplication::colorSpec() == QApplication::ManyColor ) options->setItemEnabled( cc, FALSE ); options->setCheckable( TRUE ); setMenuItemFlags(); menubar->insertSeparator(); QPopupMenu* help = new QPopupMenu( menubar ); menubar->insertItem( "&Help", help ); help->insertItem( "Help!", this, SLOT(giveHelp()), CTRL+Key_H ); connect( options, SIGNAL(activated(int)), this, SLOT(doOption(int)) ); status = new QLabel(this); status->setFrameStyle( QFrame::WinPanel | QFrame::Sunken ); status->setFixedHeight( fontMetrics().height() + 4 ); setMouseTracking( TRUE ); }
int main(int argc, char *argv[]) { { int i; if((argc - 1) % 2) goto help; for(i = 1; i < argc - 1; i += 2) if(!editing && (!strcmp(argv[i], "-e") || !strcmp(argv[i], "--edit"))) editing = argv[i+1]; else if(!layout_title[0] && (!strcmp(argv[i], "-t") || !strcmp(argv[i], "--title"))) { bzero(layout_title, 55); strncpy(layout_title, argv[i+1], 54); } else { help: printf("usage: mahjong [--edit <layout> [--title <layout title>]]\n"); return 0; } } srand(time(NULL)); allegro_init(); { int x, y, z; for(x = 16; x--;) for(y = 9; y--;) for(z = 3; z--;) pieceInit(board[x][y][z], x, y, z); } set_color_depth(SCREEN_DEPTH); if(set_gfx_mode(GFX_AUTODETECT_WINDOWED, SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_WIDTH*2, SCREEN_HEIGHT) < 0) { fprintf(stderr, "fatal: %s\n", allegro_error); exit(1); } #ifdef ALLEGRO_WINDOWS set_display_switch_callback(SWITCH_IN, update); #endif left_view = create_sub_bitmap(screen, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); right_view = create_sub_bitmap(screen, SCREEN_WIDTH, 0, SCREEN_WIDTH, SCREEN_HEIGHT); // init colors BACKGROUND_COLOR = makecol32(0x2F, 0x5F, 0x2F); // soft green SELECTED_COLOR = makecol32(0x00, 0xDF, 0x00); // green OLD_SELECTED_COLOR = makecol32(0x00, 0xBF, 0xBF); // cyan // load data { DATAFILE *data = load_datafile("#"); new_game = data[NEW_GAME_BMP].dat; undo = data[UNDO_BMP].dat; help = data[HELP_BMP].dat; quit = data[QUIT_BMP].dat; tile = data[TILE_BMP].dat; number[ 0] = data[BLACK1_BMP].dat; number[ 2] = data[BLACK2_BMP].dat; number[ 4] = data[BLACK3_BMP].dat; number[ 6] = data[BLACK4_BMP].dat; number[ 8] = data[BLACK5_BMP].dat; number[10] = data[BLACK6_BMP].dat; number[12] = data[BLACK7_BMP].dat; number[14] = data[BLACK8_BMP].dat; number[16] = data[BLACK9_BMP].dat; number[ 1] = data[RED1_BMP].dat; number[ 3] = data[RED2_BMP].dat; number[ 5] = data[RED3_BMP].dat; number[ 7] = data[RED4_BMP].dat; number[ 9] = data[RED5_BMP].dat; number[11] = data[RED6_BMP].dat; number[13] = data[RED7_BMP].dat; number[15] = data[RED8_BMP].dat; number[17] = data[RED9_BMP].dat; suit[0] = data[SPADE_BMP].dat; suit[1] = data[CLUB_BMP].dat; suit[2] = data[DIAMOND_BMP].dat; suit[3] = data[HEART_BMP].dat; layouts[0] = data[BLOCK_LYT].dat; layouts[1] = data[FLAT_LYT].dat; layouts[2] = data[FROGGER_LYT].dat; layouts[3] = data[PRECIOUS_LYT].dat; layouts[4] = data[PTRAD_LYT].dat; layouts[5] = data[PYRAMID_LYT].dat; layouts[6] = data[STEPS_LYT].dat; layouts[7] = data[THETA_LYT].dat; } scroll_screen(SCREEN_WIDTH, 0); current_view = right_view; install_timer(); install_mouse(); install_keyboard(); show_mouse(current_view); text_mode(BACKGROUND_COLOR); if(!editing) { defaultLayout(); if(alert("Our Own Version of Mahjong Solitaire, v0.1.4", NULL, "Copyright (c) 2001 Eric Mulvaney, Michelle Bondy", "Play", "Edit", 0, 0) == 2 && file_select_ex("Please select layout file to edit:", path, "lyt", PATH_LENGTH-1, OLD_FILESEL_WIDTH, OLD_FILESEL_HEIGHT)) { int x, y, z; editing = path; for(x = 16; x--;) for(y = 9; y--;) for(z = 3; z--;) board[x][y][z].value = EMPTY; } } mouse_callback = editing ? mouse_handler_for_editing : mouse_handler; if(editing) { Layout data; FILE *file = fopen(editing, "r"); if(file) { if(fread(&data, sizeof(Layout), 1, file)) { int x, y, z; if(!layout_title[0]) memcpy(layout_title, data.title, 55); for(x = 16; x--;) for(y = 9; y--;) for(z = (data.board[x][y] > 3) ? 3 : data.board[x][y]; z--;) { board[x][y][z].value = BLANK; if(!--n_pieces_left) goto skip; } } skip: fclose(file); } update(); } click_ready = 0; while(1) // game loop { if(click_ready) { int x = click_x - (BOARD_XOFF - 2 * EDGE_WIDTH ); int y = click_y - (BOARD_YOFF - 2 * EDGE_HEIGHT); int z; for(z = 3; x > 0 && y > 0 && z--; x -= EDGE_WIDTH, y -= EDGE_HEIGHT) { int i = x / FACE_WIDTH; int j = y / FACE_HEIGHT; if(i >= 16 || j >= 9) continue; if(editing) { if(click_ready == 1 && board[i][j][z].value == EMPTY) { if((z == 0 || board[i][j][z-1].value != EMPTY) && n_pieces_left) { n_pieces_left--; board[i][j][z].value = BLANK; updatePiece(&board[i][j][z]); goto event_handled; } } else if(click_ready == 2 && board[i][j][z].value != EMPTY) { if(z == 2 || board[i][j][z+1].value == EMPTY) { board[i][j][z].value = EMPTY; n_pieces_left++; updatePiece(&board[i][j][z]); goto event_handled; } } } else if(selectPiece(&board[i][j][z])) { if(!n_pairs_remaining) { if(current_view != left_view) update(); if(alert("Congratulations! You won!", "Play another?", NULL, "Yes", "No", 0, 0) == 1) newGame(); else return 0; } goto event_handled; } } if(click_y < BUTTON_YOFF + BUTTON_HEIGHT && click_y > BUTTON_YOFF) { if(editing) { if(click_x > NEW_GAME_BUTTON_X1 && click_x < NEW_GAME_BUTTON_X2) { if(n_pieces_left == 144) goto event_handled; if(current_view != left_view) update(); if(alert("Are you sure you want to clear the current Layout?", NULL, NULL, "Yes", "No", 0, 0) == 1) { int x, y, z; for(x = 16; x--;) for(y = 9; y--;) for(z = 3; z--;) board[x][y][z].value = EMPTY; n_pieces_left = 144; update(); } } else if(click_x > QUIT_BUTTON_X1 && click_x < QUIT_BUTTON_X2) { int ync; if(current_view != left_view) update(); if(n_pieces_left) ync = alert3("WARNING: Layout is incomplete.", NULL, "Do you wish to save before exiting?", "Yes", "No", "Cancel", 0, 0, 0); else ync = alert3("Do you wish to save before exiting?", NULL, NULL, "Yes", "No", "Cancel", 0, 0, 0); if(ync == 2) return 0; else if(ync == 1) { Layout data; FILE *file; memcpy(data.title, layout_title, 55); data.complete = (n_pieces_left) ? 0 : 1; if((file = fopen(editing, "w"))) { for(x = 16; x--;) for(y = 9; y--;) { if (board[x][y][2].value == BLANK) data.board[x][y] = 3; else if(board[x][y][1].value == BLANK) data.board[x][y] = 2; else if(board[x][y][0].value == BLANK) data.board[x][y] = 1; else data.board[x][y] = 0; } if(fwrite(&data, sizeof(Layout), 1, file)) { fclose(file); return 0; } else fclose(file); } if(alert("WARNING: Save failed!", NULL, "Do you still wish to exit?", "Yes", "No", 0, 0) == 1) return 0; } } } else if(click_x > NEW_GAME_BUTTON_X1 && click_x < NEW_GAME_BUTTON_X2) newGame(); else if(click_x > UNDO_BUTTON_X1 && click_x < UNDO_BUTTON_X2) undoMove(); else if(click_x > HELP_BUTTON_X1 && click_x < HELP_BUTTON_X2) giveHelp(1); else if(click_x > QUIT_BUTTON_X1 && click_x < QUIT_BUTTON_X2) { if(current_view != left_view) update(); if(alert("Are you sure you want to quit?", NULL, NULL, "Yes", "No", 0, 0) == 1) return 0; } } event_handled: click_ready = 0; } else rest(100); } return 0; }