⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dump.c

📁 Microwindows genesis was with the NanoGUI project, and is now the primary distribution for both th
💻 C
字号:
/* * NanoBreaker, a Nano-X Breakout clone by Alex Holden. * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ *  * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. *  * The Original Code is NanoBreaker. *  * The Initial Developer of the Original Code is Alex Holden. * Portions created by Alex Holden are Copyright (C) 2002 * Alex Holden <alex@alexholden.net>. All Rights Reserved. *  * Contributor(s): *  * Alternatively, the contents of this file may be used under the terms * of the GNU General Public license (the  "[GNU] License"), in which case the * provisions of [GNU] License are applicable instead of those * above.  If you wish to allow use of your version of this file only * under the terms of the [GNU] License and not to allow others to use * your version of this file under the MPL, indicate your decision by * deleting  the provisions above and replace  them with the notice and * other provisions required by the [GNU] License.  If you do not delete * the provisions above, a recipient may use your version of this file * under either the MPL or the [GNU] License. *//* dump.c contains dump_state(), but only if NB_DEBUG is defined in * nbreaker.h. */#include <stdio.h>#include <nano-X.h>#include "nbreaker.h"#ifdef NB_DEBUG/* Returns the string passed to it, or a pointer to the string "<unnamed>" if * the passed string is NULL. Used when printing the file names in the state, * which may be NULL if they don't have a name. */static char *fname(char *f){	return f ? f : "<unnamed>";}/* Prints out the contents of the specified brick list. */static void dump_bricks(brick *b){	/* Print "<empty>" if the list is empty: */	if(!b) {		printf("\t<empty>\n");		return;	}	/* Iterate through the list: */	while(b) {		/* Print the identifier (the character that symbolises the		 * brick in the game file): */		printf("\t\"%c\"", b->identifier);		/* If there is a sprite associated with this brick, print the		 * name of the file the sprite was loaded from: */		if(b->s) printf(" (\"%s\")", fname(b->s->fname));		/* Print the flags associated with this brick: */		if(b->flags & BRICK_FLAG_IMMUTABLE) printf(" Immutable");		if(b->flags & BRICK_FLAG_2_HITS) printf(" 2hits");		if(b->flags & BRICK_FLAG_3_HITS) printf(" 3hits");		if(b->flags & BRICK_FLAG_SMALL_BONUS) printf(" smallbonus");		if(b->flags & BRICK_FLAG_MEDIUM_BONUS) printf(" mediumbonus");		if(b->flags & BRICK_FLAG_LARGE_BONUS) printf(" largebonus");		if(b->flags & BRICK_FLAG_HUGE_BONUS) printf(" hugebonus");		printf("\n");		b = b->next;	}}/* Prints out the specified game grid (it's assumed that if it exists, it is * state->width * state->height in size, which should always be true): */static void dump_grid(nbstate *state, grid *g){	grid *gp;	int x, y;	/* The letters that symbolise each of the power-ups and power-downs: */	char powers[] = " WSTPNFRI";	/* If the grid is empty, just print "<empty>" and return: */	if(!g) {		printf("\t<empty>\n");		return;	}	/* Print the title and top line of the bricks description box: */	printf("\tbricks:\n\t\t");	for(x = 0; x < state->width + 2; x++) putchar('-');	putchar('\n');	gp = g;	for(y = 0; y < state->height; y++) { /* For each grid row. */		printf("\t\t|"); /* Left side of the box. */		for(x = 0; x < state->width; x++) { /* For each grid column. */			/* Print a space if there is no brick in this grid			 * box or the brick identifier if there is one: */			if(!gp->b) putchar(' ');			else putchar(gp->b->identifier);			gp++;		}		printf("|\n"); /* Right side of the box. */	}	/* The bottom line of the box: */	printf("\t\t");	for(x = 0; x < state->width + 2; x++) putchar('-');	/* Print the title and top line of the powers description box: */	printf("\n\tpowers:\n\t\t");	for(x = 0; x < state->width + 2; x++) putchar('-');	putchar('\n');	gp = g;	for(y = 0; y < state->height; y++) { /* For each grid row. */		printf("\t\t|"); /* Left side of the box. */		for(x = 0; x < state->width; x++) { /* For each grid row. */			/* Print the symbol associated with this power: */			putchar(powers[gp->power + 1]);			gp++;		}		printf("|\n"); /* Right side of the box. */	}	/* The bottom line of the box: */	printf("\t\t");	for(x = 0; x < state->width + 2; x++) putchar('-');	putchar('\n');}/* Print the contents of each level in turn: */static void dump_levels(nbstate *state){	level *l;	int num = 1;	/* If there are no levels, just print "<empty>" and return: */	printf("Levels:\n");	if(!state->levels) {		printf("\t<empty>\n");		return;	}	/* Iterate through the list of levels: */	for(l = state->levels; l; l = l->next) {		/* Print the level number: */		printf("\tLevel %d\n\tlevel bricks:\n", num++);		/* Print out the level specific bricks: */		dump_bricks(l->bricks);		/* Various other information associated with this level: */		printf("\tbackgroundname = \"%s\"\n", fname(l->backgroundname));		printf("\tbackgroundtiled = %s\n", l->backgroundtiled ?							"Yes" : "No");		printf("\tnumbricks = %d\n", l->numbricks);		/* Print the actual brick area definition: */		dump_grid(state, l->grid);	}}/* Print the ASCII name of the specified state number. */static void printstate(int state){	switch(state) {		case STATE_TITLESCREEN:			printf("STATE_TITLESCREEN\n");			break;		case STATE_FADING:			printf("STATE_FADING\n");			break;		case STATE_RUNNING:			printf("STATE_RUNNING\n");			break;		case STATE_GAMEWON:			printf("STATE_GAMEWON\n");			break;		case STATE_GAMELOST:			printf("STATE_GAMELOST\n");			break;		case STATE_FINISHED:			printf("STATE_FINISHED\n");			break;		default:			printf("unknown (%d)\n", state);			break;	}}/* Dumps (almost) the entire game state on request. Called by * handle_keystroke_event() when the F10 key is pressed. */void dump_state(nbstate *state){	int i;	power *p;	sprite *s;	/* The letters symbolising each of the powers: */	char powers[NUMPOWERS] = "WSTPNF";	/* The names of the cheats: */	char *cheats[] = { "SolidFloor", "Teleport", "NoBounce",		"NoPowerDown", "NoPowerUpTimeout" };	/* Print the title: */	printf("Printing NanoBreaker Game State\n"		"-------------------------------\n");	/* Print the current game state: */	printf("state = ");	printstate(state->state);	/* Print the name of the game directory and the game file: */	printf("gamedir = \"%s\"\ngamefile = \"%s\"\n", fname(state->gamedir),		fname(state->gamefile));	/* Print the name of the title screen background image and whether it	 * should be tiled or not: */	printf("titlebackground = \"%s\"\n", fname(state->titlebackground));	printf("titlebackgroundtiled = %s\n", state->titlebackgroundtiled ?								"Yes" : "No");	/* Print the file names of the various splash graphics: */	printf("titlesplash = \"%s\"\n", fname(state->titlesplash));	printf("gamewonsplash = \"%s\"\n", fname(state->gamewonsplash));	printf("gamelostsplash = \"%s\"\n", fname(state->gamelostsplash));	/* Print the full list of sprites: */	printf("sprites = \n");	if(!state->spritelist) printf("\t<empty>\n");	else for(s = state->spritelist; s; s = s->next)		printf("\t\"%s\" (%d * %d) is in use %d time%s\n",				fname(s->fname), s->w, s->h, s->usage,				s->usage > 1 ? "s" : "");	/* Print the name and dimensions of the current background image (or	 * "none" if there isn't one, and whether or not is tiled: */	printf("background = ");	if(!state->background) printf("none\n");	else printf("\"%s\" (%d * %d), %stiled\n",		fname(state->background->fname), state->background->w,		state->background->h, state->backgroundtiled ? "" : "not ");	/* Print the points gained in various different circumstances, the	 * balls given at the start of the game, and the balls given at the	 * start of each new level: */	printf("normalpoints = %d\nsmallbonuspoints = %d\nmediumbonuspoints = "		"%d\nlargebonuspoints = %d\nhugebonuspoints = %d\n"		"poweruppoints = %d\npowerdownpoints = %d\nstartballs = %d\n"		"newlevelballs = %d\n", state->normalpoints,		state->smallbonuspoints, state->mediumbonuspoints,		state->largebonuspoints, state->hugebonuspoints,		state->poweruppoints, state->powerdownpoints,		state->startballs, state->newlevelballs);	/* Print the dimensions of the brick area, the size of the bricks,	 * the ID of the brick drawing alpha channel, and the global brick	 * list: */	printf("width = %d\nheight = %d\nbrickwidth = %d\nbrickheight = %d\n"		"brickalpha = %d\n", state->width, state->height,		state->brickwidth, state->brickheight, state->brickalpha);	printf("bricks =\n");	dump_bricks(state->bricks);	/* Print the bat sizes, the names of all the various bat graphics, the	 * current bat, and the current bat X position: */	printf("batheight = %d\nsmall bat width = %d\nnormal bat width = %d\n"		"large bat width = %d\n", state->batheight,		state->batwidths[SMALLBAT], state->batwidths[NORMALBAT],		state->batwidths[LARGEBAT]);	printf("small bat = ");	if(!state->bats[SMALLBAT]) printf("none\n");	else printf("\"%s\"\n", fname(state->bats[SMALLBAT]->fname));	printf("normal bat = ");	if(!state->bats[NORMALBAT]) printf("none\n");	else printf("\"%s\"\n", fname(state->bats[NORMALBAT]->fname));	printf("large bat = ");	if(!state->bats[SMALLBAT]) printf("none\n");	else printf("\"%s\"\n", fname(state->bats[LARGEBAT]->fname));	printf("current bat = ");	switch(state->bat) {		case NORMALBAT:			printf("NORMALBAT\n");			break;		case SMALLBAT:			printf("SMALLBAT\n");			break;		case LARGEBAT:			printf("LARGEBAT\n");			break;		default:			printf("unknown (%d)\n", state->bat);	}	printf("batx = %d\nbatv = %d\n", state->batx, state->batv);	/* Print the names of each of the power sprites: */	printf("Power sprites:\n");	for(i = 0; i < NUMPOWERS; i++) {		printf("\t%c ", powers[i]);		if(state->powersprites[i])			printf("\"%s\"\n",				fname(state->powersprites[i]->fname));		else printf("<empty>\n");	}	/* If there is a splash sprite, print its name and dimensions: */	printf("splash = ");	if(!state->splash) printf("none\n");	else printf("\"%s\" (%d * %d)\n", fname(state->splash->fname),					state->splash->w, state->splash->h);	/* Print the times that power-ups and power-downs last for: */	printf("poweruptime = %d\npowerdowntime = %d\n", state->poweruptime,			state->powerdowntime);	/* Print the cheat sequences, the cheat status, and the cheat flags: */	printf("Cheat sequences:\n");	for(i = 0; i < NUMCHEATS; i++) {		printf("\t%s = ", cheats[i]);		if(state->cheats[i]) printf("\"%s\"\n", state->cheats[i]);		else printf("disabled\n");	}	printf("cheatstate = \"%s\"\n", state->cheatstate);	printf("SolidFloor flag is %s\n", state->flags.sf ? "active" :								"inactive");	printf("NoBounce flag is %s\n", state->flags.nb ? "active" :								"inactive");	printf("NoPowerDown flag is %s\n", state->flags.npd ?							"active" : "inactive");	printf("NoPowerUpTimeout flag is %s\n", state->flags.nputo ?							"active" : "inactive");	/* Print the other various boolean flags: */	printf("Paused flag is %s\n", state->flags.paused ?  "active" :								"inactive");	printf("Left flag is %s\n", state->flags.left ?  "active" :								"inactive");	printf("Right flag is %s\n", state->flags.right ?  "active" :								"inactive");	/* Print the current level and the total number of levels: */	printf("level = %d\nnumlevels = %d\n", state->level, state->numlevels);	/* Print the Nano-X IDs of the output window, the canvases, and the	 * one second periodic timer, as well as the absolute X position of	 * the output window and the dimensions of the canvas area: */	printf("wid = %d\nwinx = %d\ncanvas = %d\noldcanvas = %d\n"		"newcanvas = %d\ntid = %d\ncanvaswidth = %d\n"		"canvasheight = %d\n", state->wid, state->winx, state->canvas,		state->oldcanvas, state->newcanvas, state->tid,		state->canvaswidth, state->canvasheight);	/* The current brick area: */	dump_grid(state, state->grid);	/* The number of bricks remaining in the current level: */	printf("numbricks = %d\n", state->numbricks);	/* Print the ball related data: */	printf("ball = ");	if(!state->ball.s) printf("none\n");	else printf("\"%s\" (%d * %d)\n", fname(state->ball.s->fname),					state->ball.s->w, state->ball.s->h);	printf("ball x = %f\nball y = %f\nball d = %f\nball v = %d\n"			"lx = %d\nly = %d\nparked = %s\nslow ball velocity = "			"%d\nnormal ball velocity = %d\nfast ball velocity = "			"%d\n", state->ball.x, state->ball.y, state->ball.d,			state->ball.v, state->ball.lx, state->ball.ly,			state->ball.parked ?  "Yes" : "No", state->ball.sv,			state->ball.nv, state->ball.fv);	/* Print the current list of powers: */	printf("current powers:\n");	if(!state->powers) printf("\t<empty>\n");	else for(p = state->powers; p; p = p->next)		printf("\t%c at (%d, %d)\n", powers[p->type], p->x, p->y);	/* Print the score related data: */	printf("score = %d\nhiscore = %d\n file hiscore = %d\n"			"score pixmap = %d\n", state->scores.s,			state->scores.hi, state->scores.fhi, state->scores.p);	/* Print out the power velocity and the animate period: */	printf("powerv = %d\nanimateperiod = %d\n", state->powerv,						state->animateperiod);	/* Print the time of the last animate() call: */	printf("lastanim = %ldS %lduS\n", state->lastanim.tv_sec,					state->lastanim.tv_usec);	/* Print the current power-up and power-down timer values: */	printf("powertimes:\n"		"\twidebat = %d\n"		"\tslowmotion = %d\n"		"\tstickybat = %d\n"		"\tpowerball = %d\n"		"\tnarrowbat = %d\n"		"\tfastmotion = %d\n",		state->powertimes.widebat,		state->powertimes.slowmotion,		state->powertimes.stickybat,		state->powertimes.powerball,		state->powertimes.narrowbat,		state->powertimes.fastmotion);	/* Print the fade rate and current fade level: */	printf("faderate = %d\nfadelevel = %d\n", state->faderate,						state->fadelevel);	/* Print the next game state: */	printf("nextstate = ");	printstate(state->nextstate);	/* Print all of the level data: */	dump_levels(state);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -