static void PrintPlayerStats(FILE *stream, wbstartstruct_t *stats, int player_num) { wbplayerstruct_t *player = &stats->plyr[player_num]; fprintf(stream, "Player %i (%s):\n", player_num + 1, player_colors[player_num]); /* Kills percentage */ fprintf(stream, "\tKills: "); PrintPercentage(stream, player->skills, stats->maxkills); fprintf(stream, "\n"); /* Items percentage */ fprintf(stream, "\tItems: "); PrintPercentage(stream, player->sitems, stats->maxitems); fprintf(stream, "\n"); /* Secrets percentage */ fprintf(stream, "\tSecrets: "); PrintPercentage(stream, player->ssecret, stats->maxsecret); fprintf(stream, "\n"); }
/* * Show our progress, unless we're expanding to a pipe. Invoked as a * callback by nufxlib. */ NuResult ProgressUpdater(NuArchive* pArchive, void* vProgress) { const NuProgressData* pProgress = vProgress; NulibState* pState; const char* percStr; const char* actionStr; char nameBuf[kMaxDisplayLen+1]; Boolean showName, eolConv; Assert(pArchive != NULL); (void) NuGetExtraData(pArchive, (void**) &pState); Assert(pState != NULL); if (NState_GetSuppressOutput(pState)) return kNuOK; percStr = NULL; showName = false; eolConv = false; switch (pProgress->operation) { case kNuOpAdd: switch (pProgress->state) { case kNuProgressPreparing: case kNuProgressOpening: actionStr = "adding "; showName = true; break; case kNuProgressAnalyzing: actionStr = "analyzing "; break; case kNuProgressCompressing: actionStr = "compressing"; break; case kNuProgressStoring: actionStr = "storing "; break; default: actionStr = "?????? "; break; } break; case kNuOpExtract: switch (pProgress->state) { case kNuProgressPreparing: case kNuProgressOpening: actionStr = "extracting"; showName = true; break; case kNuProgressExpanding: actionStr = "expanding "; break; case kNuProgressCopying: actionStr = "extracting"; break; default: actionStr = "?????? "; break; } if (pProgress->expand.convertEOL == kNuConvertOn) eolConv = true; break; case kNuOpTest: switch (pProgress->state) { case kNuProgressPreparing: case kNuProgressOpening: showName = true; /* no break */ case kNuProgressExpanding: case kNuProgressCopying: actionStr = "verifying"; break; default: actionStr = "?????? "; break; } break; default: Assert(0); actionStr = "????"; } switch (pProgress->state) { case kNuProgressDone: actionStr = NULL; percStr = "DONE\n"; break; case kNuProgressSkipped: actionStr = NULL; percStr = "SKIP\n"; break; case kNuProgressAborted: /* not currently possible in NuLib2 */ actionStr = NULL; percStr = "CNCL\n"; break; case kNuProgressFailed: actionStr = NULL; percStr = "FAIL\n"; break; default: break; } if (showName) { /* * Use "pathname" (whole thing) rather than "filename" (file part). * Could also use "origPathname", but I like to show what they're * getting instead of what they're giving. */ int len = strlen(pProgress->pathnameUNI); if (len < sizeof(nameBuf)) { strcpy(nameBuf, pProgress->pathnameUNI); } else { nameBuf[0] = nameBuf[1] = '.'; strncpy(nameBuf+2, pProgress->pathnameUNI + len - (sizeof(nameBuf)-3), sizeof(nameBuf)-3); nameBuf[sizeof(nameBuf)-1] = '\0'; } } if (actionStr == NULL && percStr != NULL) { printf("\r%s", percStr); } else if (actionStr != NULL && percStr == NULL) { if (percStr == NULL) { putc('\r', stdout); PrintPercentage(pProgress->uncompressedLength, pProgress->uncompressedProgress); if (showName) printf(" %s%c %s", actionStr, eolConv ? '+' : ' ', nameBuf); else printf(" %s%c", actionStr, eolConv ? '+' : ' '); } } else { Assert(0); printf("????\n"); } fflush(stdout); /*printf(" %ld \n", pProgress->uncompressedProgress);*/ /*usleep(250000);*/ return kNuOK; }