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; }
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); } }
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);
/* 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; }