Example #1
0
gameobj::gameobj(int x, int y, int typenum) {
  this->size_x = x;
  this->size_y = y;
  this->typenum = typenum;
  init_objnum();
  init_field();
  init_objs();
  point = objs;
}
Example #2
0
void		init_scene(t_rt *rt, char *scene)
{
	if (rt)
	{
		rt->objs = NULL;
		rt->lights = NULL;
		if (!(rt->camera))
			init_camera(&(rt->camera), *(rt->screen),
						rt->space);
		load_scene(rt, scene);
		if (!(rt->lights))
			init_lights(&(rt->lights));
		if (!(rt->objs))
			init_objs(&(rt->objs));
		if (scene)
			free(scene);
	}
}
Example #3
0
void design (void) {
	int updflag=0;
	int dx,dy,tempx,n;
	int lastcell=1;
	int tempint;
	int drawmode=0;
	char tempstr[32];
	char tempfname[32];
	char tempstr2[12];
	char tempstr3[32];
	int new_col=0;
	int bc_x=0,bc_y=0,bc_w=0,bc_h=0;		// Block copy x,y and width,height
	int tx,ty;

	disy=0;
	designflag=1;
	gamecount=0;
	tempstr[0]='\0';
	tempfname[0]='\0';
	setorigin();
	dx=objs[0].x/16;
	dy=objs[0].y/16;
	drawboard();
	fontcolor (&statvp,1,0);
	clearvp (&statvp);

	do {
		if (drawmode) {
			setboard (dx,dy,lastcell);
			drawcell (dx,dy);
			updflag=1;
			}
		fontcolor (&statvp,3,0);						// memory usage
		wprint (&statvp,248,1,2,"       ");
		ultoa (coreleft(),tempstr3,10);
		wprint (&statvp,290-(1+strlen(tempstr3)*6),1,2,tempstr3);
		tempstr3[0]='\0';

		fontcolor (&statvp,1,0);
		wprint (&statvp,248,21,2, "# objs: ");
		fontcolor (&statvp,3,0);
		wprint (&statvp,296,21,2,itoa(numobjs,tempstr2,10));

		drawshape (&gamevp,0x0100,dx*16+4,dy*16+4);
		do {
			checkctrl(0);
			} while ((dx1==0)&&(dy1==0)&&(key==0)&&(updflag==0));
		updflag=0;
		modboard(dx,dy);
		upd_objs(0);
		refresh(0);
		purgeobjs();
		if ((dx1!=0)||(dy1!=0)) {
			dx+=dx1*(1+fire1*(scrnxs/2-1));
			dy+=dy1*(1+fire1*(scrnys/2-1));
			if (dx<0) dx=0;
			if (dx>=boardxs) dx=boardxs-1;
			if (dy<0) dy=0;
			if (dy>=boardys) dy=boardys-1;
			if ((dx*16)<gamevp.vpox) {
				gamevp.vpox-=scrnxs*8;
				if (gamevp.vpox<0) gamevp.vpox=0;
				drawboard();
				};
			if ((dx*16)>=(gamevp.vpox+16*scrnxs-16)) {
				gamevp.vpox+=scrnxs*8;
				if (gamevp.vpox>=(16*(boardxs-scrnxs)+8))
					gamevp.vpox=16*(boardxs-scrnxs)+8;
				drawboard();
				};
			if ((16*dy)<gamevp.vpoy) {
				gamevp.vpoy-=scrnys*8;
				if (gamevp.vpoy<0) gamevp.vpoy=0;
				drawboard();
				};
			if ((16*dy)>=(gamevp.vpoy+16*(scrnys-1))) {
				gamevp.vpoy+=scrnys*8;
				if (gamevp.vpoy>=(16*(boardys-scrnys+1)))
					gamevp.vpoy=(boardys-scrnys+1)*16;
				drawboard();
				};
			};

		switch (toupper(key)) {
			case k_f1:					// Mark top left corner of block
				bc_x=dx; bc_y=dy; break;
			case k_f2:
				// Mark bottom right corner of block and copy
				//	block of tile numbers into temp array bc_array
				if(dx<bc_x) break;
					// 0-width or negative width rectangle	(can't do that)
				if(dy<bc_y) break;
					// 0-height or negative height rectangle (can't do that)
				bc_w=(dx-bc_x)+1; bc_h=(dy-bc_y)+1;
				if((bc_w>normxs)||(bc_h>normys)) {			// Too big!!
					bc_w=0; bc_h=0; break;
					};
				for(ty=0; ty<bc_h; ty++) {
					for(tx=0; tx<bc_w; tx++) {
						bc_array[(ty*bc_w)+tx]=board(bc_x+tx,bc_y+ty);
						};
					};	break;
			case k_f3:
				for(ty=0; ty<bc_h; ty++) {
					for(tx=0; tx<bc_w; tx++) {
						setboard(dx+tx, dy+ty, bc_array[(ty*bc_w)+tx]);
						};
					};	updflag=1; break;
			case k_f4:
				do {
					upd_colors (); gamecount++; checkctrl0(0);
					} while (key==0); break;
			case enter:
				clearvp (&statvp);
				wprint (&statvp,2,1,1,"Put:");
				fontcolor (&statvp,6,0);
				winput (&statvp,2,11,1,tempstr,16);
				strupr (tempstr);
				for (tempint=0; tempint<numinfotypes; tempint++) {
					if (strcmp (tempstr,info[tempint].na)==0) {
						lastcell=tempint;
						setboard(dx,dy,tempint);
						shm_want[(info[tempint].sh>>8)&0x3f]=1;
						shm_do(); break;
						};
					};
				updflag=1; break;
			case 9: drawmode=!drawmode; break;				// tab
			case 'K': lastcell=board(dx,dy); break;
			case ' ':
				setboard(dx,dy,lastcell);
				updflag=1; break;
			case 'I':
				pl.score=1000;
				printhi (1);
				pl.score=0; break;
			case 'V':
				if (pl.numinv==0) addinv (inv_hero);
				else {
					pl.numinv=0;
					init_inv();
					};
				pl.score=0;
				pl.level=0; break;
			case 'H':
				tempint=board(dx,dy);
				tempx=dx;
				while (board(tempx,dy)==tempint) {
					setboard(tempx,dy,lastcell);
					drawcell (tempx,dy);
					tempx--;
					};
				tempx=dx+1;
				while (board(tempx,dy)==tempint) {
					setboard(tempx,dy,lastcell);
					drawcell (tempx,dy);
					tempx++;
					}; break;
			case 'O': updflag=objdesign(dx,dy); break;	// Object Mgmt
			case 'U':
				for (n=0; n<numobjs; n++) {
//					if (((kindflags[objs[n].objkind]&f_inside)==0)&&
//						(objs[n].inside!=NULL)) {
//						objs[n].inside=NULL;
//						sound(240);
//						delay(500);
//						nosound();
//						};
					setobjsize (n);
					}; break;
			case 'Z':
				infname ("Clear?",tempfname);
				if (toupper(tempfname[0])=='Y') {
					init_brd();
					init_objs();
					drawboard();
					}; break;
			case 'L':
				infname ("Load:",tempfname);
				if (tempfname[0]!='\0') {
					loadboard (tempfname);
					setorigin();
					dx=objs[0].x/16; dy=objs[0].y/16;
					drawboard();
					}; break;
			case 'Y':												// Disalign Y
				clearvp (&statvp);
				wprint (&statvp,2,1,1,"Dis Y:");
				itoa (disy,tempstr,10);
				winput (&statvp,2,11,1,tempstr,16);
				disy=atoi (tempstr);
				strupr (tempstr); break;
			case 'N':
				infname ("New board?",tempfname);
				if (toupper (tempfname[0])=='Y') {
					zapobjs();
					init_brd();
					}; break;
			case 'S':
				infname ("Save:",tempfname);
				if (tempfname[0]!='\0') saveboard (tempfname); break;
			case 'C':
				clearvp (&statvp);
				wprint (&statvp,2,1,1,"New Color:");
				fontcolor (&statvp,6,0);
				itoa (new_col,tempstr,10);
				winput (&statvp,2,11,1,tempstr,16);
				new_col=atoi (tempstr);

				switch (new_col) {
					case 0: setcolor (250,0,0,0);
						setcolor (251,0,0,0); break;				// reset all
					case 1: setcolor (251,0,0,0); break;		// reset #251
					case 2: setcolor (250,0,0,32);		 		// dk. blue sky
						setcolor (251,0,0,32); break;
					case 3:												// lt. blue sky
						setcolor (176,8,16,25); setcolor (177,8,20,29);
						setcolor (178,12,24,33); setcolor (179,16,28,41);
						setcolor (180,20,32,45); setcolor (181,24,40,49);
						setcolor (182,28,44,57); setcolor (183,36,48,60);
						setcolor (250,36,48,60); setcolor (251,36,48,60); break;
					case 4:												// yellow sky
						setcolor (176,32,0,0); setcolor (177,40,0,0);
						setcolor (178,52,0,0); setcolor (179,60,0,0);
						setcolor (180,60,28,0); setcolor (181,60,40,0);
						setcolor (182,60,52,0); setcolor (183,60,60,0);
						setcolor (250,60,60,0);	setcolor (251,60,60,0); break;
					case 5:												// emerald sky
						setcolor (176,0,12,12); setcolor (177,0,18,17);
						setcolor (178,0,25,23); setcolor (179,0,32,27);
						setcolor (180,0,39,32); setcolor (181,0,46,35);
						setcolor (182,0,53,38); setcolor (183,0,60,40);
						setcolor (250,0,60,40); setcolor (251,0,60,40); break;
					case 6: setcolor (250,32,32,24);				// olive green
						setcolor (251,32,32,24); break;
					case 7:												// violet sky
						setcolor (176,13,5,22); setcolor (177,18,8,27);
						setcolor (178,23,13,33); setcolor (179,29,19,39);
						setcolor (180,35,25,45); setcolor (181,42,32,51);
						setcolor (182,49,40,57); setcolor (183,57,50,63);
						setcolor (250,57,50,63); setcolor (251,57,50,63); break;
					case 8: setcolor (250,23,23,23);				// factory grey
						setcolor (251,23,23,23); break;
					case 9: setcolor (250,12,23,63);		 		// royal blue
						setcolor (251,12,23,63); break;
					case 10: setcolor (250,20,20,23);			// factory grey v3
						setcolor (251,20,20,23); break;
					};
			};
		} while (key!=escape);
Example #4
0
/* Mode: 0 - Speed mode, 1 - time mode (other settings set globally) */
int game(int mode) {
		/* Vars */
	int i=0,j=0,k=0; /* Multi use variables */
	int x_max=64,y_max=64; /* Max coordinates */
	int step = 8; /* Moneyman pixel per step */
	int padding = 16; /* Field's distance from window edge */

	int starttime=0; /* Start time (saved there later) */
	int currtime=0;

	int p1collectedcoins = 0; /* Number of collected coins */
	int p2collectedcoins = 0;
	int score = 0; /* Score if P1 (in 2P mode no scores) */
	int p1wins=0;
	int p2wins=0;
	int finished = 0; /* Finished (0=none, 1 =p1, 2=p2) */

	/* Moneyman coordinates */
	int p1_x=x_max/2, p2_x=p1_x;
	int p1_y=y_max/2, p2_y=p1_y;


	struct obj_struct *objs=0; /* Dyn. array with coins + exit door */

	BITMAP *buffer=0,*p1pic=0,*p2pic=0,*coinpic=0,*exitpic=0; /* all bitmaps */

	/* Init movement timer */
	install_int_ex(increment_coinmove_counter, SECS_TO_TIMER(relocinterval));

	/* Load bitmaps */
	buffer = create_bitmap(800,600);
	p1pic = load_bitmap("gfx/MoneyMan.bmp",NULL);
	p2pic = load_bitmap("gfx/Player2.bmp",NULL);
	coinpic = load_bitmap("gfx/Coin.bmp",NULL);
	exitpic = load_bitmap("gfx/Exit.bmp",NULL);

	/* Random seed */
	srand(time(NULL));

	/* Init objects */
	objs = malloc(sizeof(*objs)*(coinnumber+1)); /* Allocate */
	if (objs==0) { /* Allocation failed */
		fprintf(stderr,"Memory couldn't be allocated, sorry :( free your RAM!\n");
		return 1;
	}
	init_objs(objs,coinnumber+1); /* Init with 0 */
	objs[0].hidden = 1; /* Door invisible */
	relocate_objs(objs,coinnumber+1,x_max,y_max); /* Random position */

	readysetgo();
	starttime = time(NULL); /* Here it's fair to start time counting */
	while (!key[KEY_ESC] && !close_button_pressed) { /* ESC quits game */
		clear_bitmap(buffer);
		rectfill(buffer,0,0,buffer->w,buffer->h,backcolor);

		while (speed_counter > 0) { /* logical tick event happened */
			/* Collision check */
			for (i=1; i<coinnumber+1; i++) {
			/* For coins - if visible, hide, increase counter */
				if (PicCollision(p1pic,p1_x*step,p1_y*step,
						coinpic,objs[i].x*step,objs[i].y*step)
						&& objs[i].hidden==0) {
					objs[i].hidden=1;
					p1collectedcoins++;
				}
				if (players==2)
					if (PicCollision(p2pic,p2_x*step,p2_y*step,
							coinpic,objs[i].x*step,objs[i].y*step)
							&& objs[i].hidden==0) {
						objs[i].hidden=1;
						p2collectedcoins++;
					}
			}

			/* All coins collected - show door (speed mode) */
			if (mode==0 && p1collectedcoins+p2collectedcoins == coinnumber) {
				objs[0].hidden=0;
			}

			currtime = time(NULL)-starttime;

			/* Calculate current score */
			if (players==1) {
				if (mode==0)
					score = get_score(p1collectedcoins,relocinterval,currtime);
				else if (mode==1)
					score = get_score(p1collectedcoins,relocinterval,ttime);
			}


			if ((mode==0 && PicCollision(p1pic,p1_x*step,p1_y*step,
							exitpic,objs[0].x*step,objs[0].y*step)
							&& objs[0].hidden==0) ||
							(mode==1 && currtime>=ttime)) {
				finished = 1;
			} else if (players == 2)
				if (mode==0 && PicCollision(p2pic,p2_x*step,p2_y*step,
							exitpic,objs[0].x*step,objs[0].y*step)
							&& objs[0].hidden==0)
					finished = 2;

			/* Movement of MoneyMan */
			if(key[KEY_LEFT] && p1_x > 0)
				p1_x--;
			else if(key[KEY_RIGHT] && p1_x < x_max)
				p1_x++;
			if(key[KEY_UP] && p1_y > 0)
				p1_y--;
			else if(key[KEY_DOWN] && p1_y < y_max)
				p1_y++;
			/* Movement of P2 */
			if(key[KEY_A] && p2_x > 0)
				p2_x--;
			else if(key[KEY_D] && p2_x < x_max)
				p2_x++;
			if(key[KEY_W] && p2_y > 0)
				p2_y--;
			else if(key[KEY_S] && p2_y < y_max)
				p2_y++;

			/*Reset tick counter*/
			speed_counter=0;
		}

		/* win count (must be here) */
		if (players==2 && mode==0) { /* More coins + reaches door -> win, else -> draw */
			if (finished==1 && p1collectedcoins>p2collectedcoins)
				p1wins++;
			else if (finished==2 && p2collectedcoins>p1collectedcoins)
				p2wins++;
		} else if (players==2 && mode==1 && finished) { /* more coins -> win, else -> draw */
			if (p1collectedcoins>p2collectedcoins)
				p1wins++;
			else if (p2collectedcoins>p1collectedcoins)
				p2wins++;
		}

		/* Move coins every some secs */
		if (coinmove_counter > 0) {
			relocate_objs(objs,coinnumber+1,x_max,y_max);
			if (mode==1) /* Time mode */
				for(i=1;i<coinnumber+1;i++)  /* Make visible again */
					objs[i].hidden=0;
			coinmove_counter = 0; /* reset interval tick */
		}

		/* Fill buffer */
		if (objs[0].hidden==0) /* index 0 = exit door */
			draw_sprite(buffer,exitpic,step*objs[0].x+padding,step*objs[0].y+padding);
		for(i=1;i<=coinnumber;i++) /* the coins */
			if (objs[i].hidden==0)
				draw_sprite(buffer,coinpic,step*objs[i].x+padding,step*objs[i].y+padding);

		/* Draw money man */
		draw_sprite(buffer,p1pic,step*p1_x+padding,step*p1_y+padding);
		if (players==2)
			draw_sprite(buffer,p2pic,step*p2_x+padding,step*p2_y+padding);

		/* Borders of game field */
		i=(x_max+p1pic->w/step)*step+padding;
		j=(y_max+p1pic->h/step)*step+padding;

		/* Draw borders */
		for (k=0;k<5;k++)
			rect(buffer,padding-k,padding-k,i+k,j+k,makecol(0,0,255-k*20));


		/* Print info */
		textprintf_ex(buffer,myfont,i+padding,32,titlecol,-1,"MoneyMan");
		textprintf_ex(buffer,myfont,i+padding,fontpxsize * 2,
			menuselcol,-1,
			(mode==0) ? "Time: %d" : "Time left: %d",
			(mode==0) ? currtime : ttime-currtime );
		textprintf_ex(buffer,myfont,i+padding,fontpxsize * 3,
				menuselcol,-1,
				(mode==0) ? "Coins left: %d" : "P1 Coins: %d" ,
				(mode==0) ? coinnumber-(p1collectedcoins+p2collectedcoins) : p1collectedcoins );
		if (players==2 && mode==1)
			textprintf_ex(buffer,myfont,i+padding,fontpxsize * 4,
				menuselcol,-1, "P2 Coins: %d" , p2collectedcoins );
		if (players==1)
			textprintf_ex(buffer,myfont,
						(x_max+p1pic->w/step)*step+2*padding,fontpxsize*5,
						menuselcol,-1,
						"Score: %d",score);
		/* Draw wins info */
		if (players==2) {
			textprintf_ex(buffer,myfont,
				(x_max+p1pic->w/step)*step+2*padding,fontpxsize*11,
				infocol,backcolor,
				"P1 wins: %d",p1wins);
			textprintf_ex(buffer,myfont,
				(x_max+p1pic->w/step)*step+2*padding,fontpxsize*12,
				infocol,backcolor,
				"P2 wins: %d",p2wins);
		}

		/* Apply on screen */
		blit(buffer,screen,0,0,0,0,800,600); /*Copy buffer to screen*/

		/* If win */
		if (finished) {
			if (mode==0)
				textprintf_ex(screen,myfont,
					(x_max+p1pic->w/step)*step+2*padding,fontpxsize*6,
					infocol,-1,
					"Finished!");
			else if (mode==1)
				textprintf_ex(screen,myfont,
					(x_max+p1pic->w/step)*step+2*padding,fontpxsize*6,
					infocol,-1,
					"Time is over!");
				if (players==1)
				add_if_highscore(score);
				textprintf_ex(screen,myfont,
				(x_max+p1pic->w/step)*step+2*padding,fontpxsize*8,
				infocol,-1,
				"ENTER=retry");
			textprintf_ex(screen,myfont,
				(x_max+p1pic->w/step)*step+2*padding,fontpxsize*9,
				infocol,-1,
				"ESC=quit");
			while(!(key[KEY_ENTER] || key[KEY_ESC]));
			if (key[KEY_ENTER]) {
				readysetgo();
				finished = 0;
				p1collectedcoins = 0;
				p2collectedcoins = 0;
				init_objs(objs,coinnumber+1);
				relocate_objs(objs,coinnumber+1,x_max,y_max);
				objs[0].hidden = 1; /* hide door again */
				remove_int(increment_coinmove_counter);
				install_int_ex(increment_coinmove_counter, SECS_TO_TIMER(relocinterval));
				starttime = time(NULL);
			}
		}
	}

	/* clean up on finish */
	remove_int(increment_coinmove_counter);
	destroy_bitmap(exitpic);
	destroy_bitmap(coinpic);
	destroy_bitmap(p1pic);
	destroy_bitmap(p2pic);
	destroy_bitmap(buffer);
	free(objs); objs=0;
	clear_bitmap(screen);
	rectfill(screen,0,0,screen->w,screen->h,backcolor);
	return 0;
}