int read_sfp_dump(void *udata, uint8_t bank_addr, uint16_t start, uint16_t count, void *data) { uint16_t offset; FILE *f; char *filename=0; prm_t *prm = (prm_t *)udata; /* Select filename to open * If only filename1 provided * we attempt to read bank A2 from filename1 */ filename = prm->file1; offset = 0; if (bank_addr == LIBSFP_DEF_A2_ADDRESS) { if (prm->file2) filename = prm->file2; else offset = 0x100; } /*printf("a:%x s:%u c:%u f:%s o:%u\n", bank_addr, start, count, filename, offset);*/ /* Open file */ f = fopen(filename, "rb"); if (!f) { ERRCALL("fopen"); return -1; } /* Read data portion */ if (fseek(f, start+offset, SEEK_SET)) { ERRCALL("fseek"); fclose(f); return -1; } if (fread(data, 1, count, f) != count) { ERR("Data read failed"); fclose(f); return -1; } fclose(f); return 0; }
boolean MouseHandler(Game *game, unsigned int mousePressed, int x, int y) { MSGERROR err; COORD coord; int i, j; int distance; int boardsize; int checker; CheckerState state; int playerID; PlayerList *plist; Player *player; if (!game) return 0; switch(game->gamestate) { case GAME_NEWGAME: ERRCALL(GetPlayerList(&game->board, &plist)); GetBoardSize(&game->board, &boardsize); distance = (BOARDGAME_MAXWIDTH-BOARDGAME_MINWIDTH)/boardsize/2; x += BOARDGAME_CHECKERSIZE/2; y += BOARDGAME_CHECKERSIZE/2; for(i=0; i<boardsize; i++) { for(j=0; j<8; j++) { GetCheckersBoardCoord(&coord, j, BOARDGAME_MAXWIDTH-i*distance*2); if (CheckMouseCollision(x, y, BOARDGAME_POSX+i*distance+coord.X, BOARDGAME_POSY+i*distance+coord.Y, 20, 20)) { ERRCALL(GetCurrentPlayerID(&game->board, &playerID)); ERRCALL(GetPlayerList(&game->board, &plist)); ERRCALL(GetPlayer(plist, playerID, &player)); if (game->deleteState == 1) { ERRCALL(DeleteChecker(&game->board, i, j, &playerID, &state)); switch(state) { case CHECKERSTATE_SUCCESS: game->deleteState = 0; ERRCALL(GetCheckerCount(&game->board, playerID, &checker)); if (checker < 3) { game->infomessage = 150; game->dieplayerevent = 0; game->diedplayer = playerID; ERRCALL(KickPlayer(plist, playerID)); ERRCALL(CheckVictory(&game->board, &state)); if (state == CHECKERSTATE_VICTORY) { MessageBox(game->hWnd, "Congratulazioni, hai vinto!", "Vittoria", MB_ICONINFORMATION); Victory(game); return 0; } } NextRoundHandler(game); break; } } else if (player->tableCheckersCount > 0) // Se il numero di pedine fuori il campo è maggiore di 0, allora le sposta nel campo da gioco { ERRCALL(PutChecker(&game->board, i, j, playerID, &state)); // Imposta una pedina switch(state) { case CHECKERSTATE_ALREADYUSED: break; case CHECKERSTATE_SUCCESS: NextRoundHandler(game); break; case CHECKERSTATE_TRIS: game->deleteState = 1; break; } } else // altrimenti muove le pedine già esistenti { ERRCALL(GetChecker(&game->board, i, j, &checker)); if (checker != CHECKER_EMPTY) // E' stato selezionato un nodo già occupato { if (checker == playerID) // Controlla se la pedina selezionata in quel punto appartiene al giocatore che deve prendere la pedina { game->isCheckerSelected = 1; // Ora che la pedina è stata selezionata, ci si prepara per il movimento game->gameMoveCheckerIndex = i; // Coordinate della pedina selezionata game->gameMoveCheckerPosition = j; // Coordinate della pedina selezionata } } } return 1; } } } break; } return 0; }