int main(void) { engine_sel = ENGINE_SEL_WRAP_OPT; engine_state = ENGINE_RUN; show_hotkeys(); #ifdef MIXED_MODE // our program just uses the bottom 4 lines of the display gotoxy(0,MAXROWPAIRCNT); POKE(TEXTWINDOW_TOP_EDGE,MAXROWPAIRCNT); gr_mode(SS_PAGE2OFF, SS_MIXEDON); #else gr_mode(SS_PAGE2OFF, SS_MIXEDOFF); #endif glider(gr_page[0]); while (engine_state == ENGINE_RUN) { switch (engine_sel) { case ENGINE_SEL_WRAP_NAIVE: naive_wrap_engine(); break; case ENGINE_SEL_NOWRAP_NAIVE: naive_nowrap_engine(); break; case ENGINE_SEL_WRAP_OPT: opt_wrap_engine(); break; case ENGINE_SEL_NOWRAP_OPT: opt_nowrap_engine(); break; default: #ifdef MIXED_MODE printf("bogus engine selection!\n"); #endif engine_state = ENGINE_STOP; break; } } // all done POKE(TEXTWINDOW_TOP_EDGE,0); softsw(SS_TEXTON); return EXIT_SUCCESS; }
u8 OpenMenu(){ ClearTextVram(); SetTileTable(tiles); SetFontTilesIndex(TILES_SIZE); //Show object types Print(6,2,PSTR("Select life object to insert")); Print(5,3,PSTR("at the current cursor position")); Print(7,7,PSTR("Glider")); Print(7,8,PSTR("Lightweight spaceship (LWSS)")) ; Print(7,9,PSTR("R-Pentamino")); Print(7,10,PSTR("Gosper glider gun")); Print(7,11,PSTR("Clear field")); Print(7,12,PSTR("Exit game")); //slide in menu WaitVsync(1); Fill(0,0,40,1,0); for(u8 i=1;i<29;i++){ WaitVsync(1); vmode_text_lines=i; } s8 option=0,x=5,y=7; u16 joy,prevJoy=0; while(1){ WaitVsync(1); joy=ReadJoypad(0); if(prevJoy==0){ if (joy==BTN_UP){ if(option>0) option--; }else if (joy==BTN_DOWN){ if(option<5)option++; }else if(joy==BTN_SELECT){ break; }else if(joy==BTN_START){ switch(option){ case 0: glider(cursor_x,cursor_y); break; case 1: lwss(cursor_x,cursor_y); break; case 2: rPentamino(cursor_x,cursor_y); break; case 3: gliderGun(cursor_x,cursor_y); break; case 4: ClearVram(); break; default: while(ReadJoypad(0)!=0); return 1; //signal game end, back to main menu } break; } } prevJoy=joy; AnimateCursor(x,y+option); } while(ReadJoypad(0)!=0); //close menu for(u8 i=29;i>0;i--){ WaitVsync(1); vmode_text_lines=i; } ClearTextVram(); SetTileTable(font); SetFontTilesIndex(0); CreateStatusBar(); return 0; }
static void st_life(int size_w,int size_h, struct life_object *life_objects, life_callback callback,void *user_data) { char *arena,*count_arena; int w_mul_h,k,q,rq,x,rx,y,line_counter; w_mul_h=size_w*size_h; arena=ALLOC(w_mul_h); count_arena=ALLOC(w_mul_h); MEMSET(arena,0,w_mul_h); MEMSET(count_arena,0,w_mul_h); for(k=0;life_objects[k].type!=LIFE_OBJECT_TYPE_UNKNOWN;k++) { switch(life_objects[k].type){ case LIFE_OBJECT_TYPE_BOAT: boat(arena,size_w,size_h,life_objects[k].x,life_objects[k].y); break; case LIFE_OBJECT_TYPE_PENT_R: pent_r(arena,size_w,size_h,life_objects[k].x,life_objects[k].y); break; case LIFE_OBJECT_TYPE_TUMBLER: tumbler(arena,size_w,size_h,life_objects[k].x,life_objects[k].y); break; case LIFE_OBJECT_TYPE_LINE_OSC: line_osc(arena,size_w,size_h,life_objects[k].x,life_objects[k].y); break; case LIFE_OBJECT_TYPE_GLIDER: glider(arena,size_w,size_h,life_objects[k].x,life_objects[k].y); break; case LIFE_OBJECT_TYPE_QUEEN_BEE: bee_queen(arena,size_w,size_h,life_objects[k].x,life_objects[k].y,0); break; case LIFE_OBJECT_TYPE_QUEEN_BEE_OSC: bee_queen(arena,size_w,size_h,life_objects[k].x,life_objects[k].y,1); break; } } while(callback(arena,size_w,size_h,user_data)==0) { for(k=0,line_counter=0;k<w_mul_h;k++) { if(arena[k]) { q=k-size_w; for(y=0;y<3;y++) { if(q<0) rq=w_mul_h+q; else if(q>=w_mul_h) rq=q-w_mul_h; else rq=q; for(x=-1;x<2;x++) { if(!(x==0 && y==1)) { if(line_counter==0 && x==-1) rx=(size_w-1); else if(line_counter==size_w-1 && x==1) rx=-(size_w-1); else rx=x; count_arena[rq+rx]++; } } q+=size_w; } } if(++line_counter==size_w) line_counter=0; } for(k=0;k<w_mul_h;k++) { if(count_arena[k]<2) arena[k]=0; else if(count_arena[k]>3) arena[k]=0; else if(count_arena[k]==3) arena[k]=1; count_arena[k]=0; } } FREE(arena); FREE(count_arena); }