void texpage_init( UI_WINDOW * win ) { int i; ui_add_gadget_button( win, TMAPCURBOX_X + 00, TMAPCURBOX_Y - 24, 30, 20, "<<", texpage_goto_prev ); ui_add_gadget_button( win, TMAPCURBOX_X + 32, TMAPCURBOX_Y - 24, 30, 20, ">>", texpage_goto_next ); ui_add_gadget_button( win, TMAPCURBOX_X + 00, TMAPCURBOX_Y - 48, 15, 20, "T", texpage_goto_first ); ui_add_gadget_button( win, TMAPCURBOX_X + 17, TMAPCURBOX_Y - 48, 15, 20, "M", texpage_goto_metals ); ui_add_gadget_button( win, TMAPCURBOX_X + 34, TMAPCURBOX_Y - 48, 15, 20, "L", texpage_goto_lights ); ui_add_gadget_button( win, TMAPCURBOX_X + 51, TMAPCURBOX_Y - 48, 15, 20, "E", texpage_goto_effects ); for (i=0;i<TMAPS_PER_PAGE;i++) TmapBox[i] = ui_add_gadget_userbox( win, TMAPBOX_X + (i/3)*(2+TMAPBOX_W), TMAPBOX_Y + (i%3)*(2+TMAPBOX_H), TMAPBOX_W, TMAPBOX_H); TmapCurrent = ui_add_gadget_userbox( win, TMAPCURBOX_X, TMAPCURBOX_Y, 64, 64 ); TmapnameCanvas = gr_create_sub_canvas(&grd_curscreen->sc_canvas, TMAPCURBOX_X , TMAPCURBOX_Y + TMAPBOX_H + 10, 100, 20); gr_set_current_canvas( TmapnameCanvas ); gr_set_curfont( ui_small_font ); gr_set_fontcolor( CBLACK, CWHITE ); texpage_redraw(); // Don't reset the current tmap every time we go back to the editor. // CurrentTmap = TexturePage*TMAPS_PER_PAGE; // CurrentTexture = TmapList[CurrentTmap]; texpage_show_current(); }
// ----------------------------------------------------------------------------- void show_briefing_bitmap(grs_bitmap *bmp) { grs_canvas *curcanv_save, *bitmap_canv; bitmap_canv = gr_create_sub_canvas(grd_curcanv, 220, 45, 166, 138); curcanv_save = grd_curcanv; grd_curcanv = bitmap_canv; gr_bitmapm(0, 0, bmp); grd_curcanv = curcanv_save; free(bitmap_canv); }
// ----------------------------------------------------------------------------- void init_spinning_robot(void) { // Robot_angles.p += 0; // Robot_angles.b += 0; // Robot_angles.h += 0; int x = rescale_x(138); int y = rescale_y(55); int w = rescale_x(166); int h = rescale_y(138); Robot_canv = gr_create_sub_canvas(grd_curcanv, x, y, w, h); }
//draws the given model in the current canvas. The distance is set to //more-or-less fill the canvas. Note that this routine actually renders //into an off-screen canvas that it creates, then copies to the current //canvas. void draw_model_picture(int mn,vms_angvec *orient_angles) { vms_vector temp_pos=ZERO_VECTOR; vms_matrix temp_orient = IDENTITY_MATRIX; grs_canvas *save_canv = grd_curcanv,*temp_canv; //int save_light; Assert(mn>=0 && mn<N_polygon_models); #ifdef OGLES temp_canv = gr_create_sub_canvas(save_canv, 0, 0, save_canv->cv_bitmap.bm_w,save_canv->cv_bitmap.bm_h); #else temp_canv = gr_create_canvas(save_canv->cv_bitmap.bm_w,save_canv->cv_bitmap.bm_h); #endif gr_set_current_canvas(temp_canv); gr_clear_canvas( BM_XRGB(0,0,0) ); g3_start_frame(); g3_set_view_matrix(&temp_pos,&temp_orient,0x9000); if (Polygon_models[mn].rad != 0) temp_pos.z = fixmuldiv(DEFAULT_VIEW_DIST,Polygon_models[mn].rad,BASE_MODEL_SIZE); else temp_pos.z = DEFAULT_VIEW_DIST; vm_angles_2_matrix(&temp_orient, orient_angles); //save_light = Lighting_on; //Lighting_on = 0; draw_polygon_model(&temp_pos,&temp_orient,NULL,mn,0,f1_0,NULL,NULL); //Lighting_on = save_light; g3_end_frame(); gr_set_current_canvas(save_canv); gr_bitmap(0,0,&temp_canv->cv_bitmap); #ifdef OGLES gr_free_sub_canvas(temp_canv); #else gr_free_canvas(temp_canv); #endif }
void texpage_init( UI_DIALOG * dlg ) { int i; ui_add_gadget_button( dlg, TMAPCURBOX_X + 00, TMAPCURBOX_Y - 24, 30, 20, "<<", texpage_goto_prev ); ui_add_gadget_button( dlg, TMAPCURBOX_X + 32, TMAPCURBOX_Y - 24, 30, 20, ">>", texpage_goto_next ); ui_add_gadget_button( dlg, TMAPCURBOX_X + 00, TMAPCURBOX_Y - 48, 15, 20, "T", texpage_goto_first ); ui_add_gadget_button( dlg, TMAPCURBOX_X + 17, TMAPCURBOX_Y - 48, 15, 20, "M", texpage_goto_metals ); ui_add_gadget_button( dlg, TMAPCURBOX_X + 34, TMAPCURBOX_Y - 48, 15, 20, "L", texpage_goto_lights ); ui_add_gadget_button( dlg, TMAPCURBOX_X + 51, TMAPCURBOX_Y - 48, 15, 20, "E", texpage_goto_effects ); for (i=0;i<TMAPS_PER_PAGE;i++) TmapBox[i] = ui_add_gadget_userbox( dlg, TMAPBOX_X + (i/3)*(2+TMAPBOX_W), TMAPBOX_Y + (i%3)*(2+TMAPBOX_H), TMAPBOX_W, TMAPBOX_H); TmapCurrent = ui_add_gadget_userbox( dlg, TMAPCURBOX_X, TMAPCURBOX_Y, 64, 64 ); TmapnameCanvas = gr_create_sub_canvas(&grd_curscreen->sc_canvas, TMAPCURBOX_X , TMAPCURBOX_Y + TMAPBOX_H + 10, 100, 20); }
UI_GADGET * ui_gadget_add( UI_WINDOW * wnd, short kind, short x1, short y1, short x2, short y2 ) { UI_GADGET * gadget; gadget = (UI_GADGET *)malloc( sizeof(UI_GADGET) ); if (gadget==NULL) exit(1); if (wnd->gadget == NULL ) { wnd->gadget = gadget; gadget->prev = gadget; gadget->next = gadget; } else { wnd->gadget->prev->next = gadget; gadget->next = wnd->gadget; gadget->prev = wnd->gadget->prev; wnd->gadget->prev = gadget; } gadget->when_tab = NULL; gadget->when_btab = NULL; gadget->when_up = NULL; gadget->when_down = NULL; gadget->when_left = NULL; gadget->when_right = NULL; gadget->kind = kind; gadget->status = 1; gadget->oldstatus = 0; if ( x1==0 && x2==0 && y1==0 && y2== 0 ) gadget->canvas = NULL; else gadget->canvas = gr_create_sub_canvas( wnd->canvas, x1, y1, x2-x1+1, y2-y1+1 ); gadget->x1 = gadget->canvas->cv_bitmap.bm_x; gadget->y1 = gadget->canvas->cv_bitmap.bm_y; gadget->x2 = gadget->canvas->cv_bitmap.bm_x+x2-x1+1; gadget->y2 = gadget->canvas->cv_bitmap.bm_y+y2-y1+1; gadget->parent = NULL; gadget->hotkey = -1; return gadget; }
static grs_subcanvas_ptr create_spinning_robot_sub_canvas(grs_canvas &canvas) { return gr_create_sub_canvas(canvas, rescale_x(canvas.cv_bitmap, 138), rescale_y(canvas.cv_bitmap, 55), rescale_x(canvas.cv_bitmap, 166), rescale_y(canvas.cv_bitmap, 138)); }
//setup the editors windows, canvases, gadgets, etc. //called whenever the editor screen is selected void init_editor_screen() { // grs_bitmap * bmp; if (editor_screen_open) return; grd_curscreen->sc_canvas.cv_font = editor_font; //create canvas for game on the editor screen initializing = 1; gr_set_current_canvas(Canv_editor); Canv_editor->cv_font = editor_font; gr_init_sub_canvas(Canv_editor_game,Canv_editor,GAMEVIEW_X,GAMEVIEW_Y,GAMEVIEW_W,GAMEVIEW_H); //Editor renders into full (320x200) game screen init_info = 1; //do other editor screen setup // Since the palette might have changed, find some good colors... CBLACK = gr_find_closest_color( 1, 1, 1 ); CGREY = gr_find_closest_color( 28, 28, 28 ); CWHITE = gr_find_closest_color( 38, 38, 38 ); CBRIGHT = gr_find_closest_color( 60, 60, 60 ); CRED = gr_find_closest_color( 63, 0, 0 ); gr_set_curfont(editor_font); gr_set_fontcolor( CBLACK, CWHITE ); EditorWindow = ui_open_window( 0 , 0, ED_SCREEN_W, ED_SCREEN_H, WIN_FILLED ); LargeViewBox = ui_add_gadget_userbox( EditorWindow,LVIEW_X,LVIEW_Y,LVIEW_W,LVIEW_H); #if ORTHO_VIEWS TopViewBox = ui_add_gadget_userbox( EditorWindow,TVIEW_X,TVIEW_Y,TVIEW_W,TVIEW_H); FrontViewBox = ui_add_gadget_userbox( EditorWindow,FVIEW_X,FVIEW_Y,FVIEW_W,FVIEW_H); RightViewBox = ui_add_gadget_userbox( EditorWindow,RVIEW_X,RVIEW_Y,RVIEW_W,RVIEW_H); #endif ui_gadget_calc_keys(EditorWindow); //make tab work for all windows GameViewBox = ui_add_gadget_userbox( EditorWindow, GAMEVIEW_X, GAMEVIEW_Y, GAMEVIEW_W, GAMEVIEW_H ); // GroupViewBox = ui_add_gadget_userbox( EditorWindow,GVIEW_X,GVIEW_Y,GVIEW_W,GVIEW_H); // GameViewBox->when_tab = GameViewBox->when_btab = (UI_GADGET *) LargeViewBox; // LargeViewBox->when_tab = LargeViewBox->when_btab = (UI_GADGET *) GameViewBox; // ui_gadget_calc_keys(EditorWindow); //make tab work for all windows ViewIcon = ui_add_gadget_icon( EditorWindow, "Lock\nview", 455,25+530, 40, 22, KEY_V+KEY_CTRLED, ToggleLockViewToCursegp ); AllIcon = ui_add_gadget_icon( EditorWindow, "Draw\nall", 500,25+530, 40, 22, KEY_A+KEY_CTRLED, ToggleDrawAllSegments ); AxesIcon = ui_add_gadget_icon( EditorWindow, "Coord\naxes",545,25+530, 40, 22, KEY_D+KEY_CTRLED, ToggleCoordAxes ); //-NOLIGHTICON- LightIcon = ui_add_gadget_icon( EditorWindow, "Light\ning", 590,25+530, 40, 22, KEY_L+KEY_SHIFTED,ToggleLighting ); ChaseIcon = ui_add_gadget_icon( EditorWindow, "Chase\nmode",635,25+530, 40, 22, -1, ToggleChaseMode ); OutlineIcon = ui_add_gadget_icon( EditorWindow, "Out\nline", 680,25+530, 40, 22, KEY_O, ToggleOutlineMode ); LockIcon = ui_add_gadget_icon( EditorWindow, "Lock\nstep", 725,25+530, 40, 22, KEY_L, ToggleLockstep ); meddraw_init_views(LargeViewBox->canvas); //ui_add_gadget_button( EditorWindow, 460, 510, 50, 25, "Quit", ExitEditor ); //ui_add_gadget_button( EditorWindow, 520, 510, 50, 25, "Lisp", CallLisp ); //ui_add_gadget_button( EditorWindow, 580, 510, 50, 25, "Mine", MineMenu ); //ui_add_gadget_button( EditorWindow, 640, 510, 50, 25, "Help", DoHelp ); //ui_add_gadget_button( EditorWindow, 460, 540, 50, 25, "Macro", MacroMenu ); //ui_add_gadget_button( EditorWindow, 520, 540, 50, 25, "About", ShowAbout ); //ui_add_gadget_button( EditorWindow, 640, 540, 50, 25, "Shell", DosShell ); ui_pad_activate( EditorWindow, PAD_X, PAD_Y ); Pad_text_canvas = gr_create_sub_canvas(Canv_editor, PAD_X + 250, PAD_Y + 8, 180, 160); ui_add_gadget_button( EditorWindow, PAD_X+6, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "<<", med_keypad_goto_prev ); ui_add_gadget_button( EditorWindow, PAD_X+PAD_WIDTH1+6, PAD_Y+(30*5)+22, PAD_WIDTH, 20, ">>", med_keypad_goto_next ); { int i; i = 0; ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "SR", med_keypad_goto_0 ); i++; ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "SS", med_keypad_goto_1 ); i++; ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "CF", med_keypad_goto_2 ); i++; ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "TM", med_keypad_goto_3 ); i++; ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "OP", med_keypad_goto_4 ); i++; ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "OR", med_keypad_goto_5 ); i++; ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "GE", med_keypad_goto_6 ); i++; ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "LI", med_keypad_goto_7 ); i++; ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "TT", med_keypad_goto_8 ); } gr_set_curfont(editor_font); menubar_show(); // INIT TEXTURE STUFF texpage_init( EditorWindow ); objpage_init( EditorWindow ); EditorWindow->keyboard_focus_gadget = (UI_GADGET *)LargeViewBox; canv_offscreen->cv_font = grd_curscreen->sc_canvas.cv_font; // BigCanvas[0]->cv_font = grd_curscreen->sc_canvas.cv_font; // BigCanvas[1]->cv_font = grd_curscreen->sc_canvas.cv_font; // BigCanvasFirstTime = 1; // Draw status box gr_set_current_canvas( NULL ); gr_setcolor( CGREY ); gr_rect(STATUS_X,STATUS_Y,STATUS_X+STATUS_W-1,STATUS_Y+STATUS_H-1); //0, 582, 799, 599 ); // Draw icon box // gr_set_current_canvas( NULL ); // gr_setcolor( CBRIGHT ); // gr_rect( 528, 2, 798, 22); // gr_setcolor( CGREY); // gr_rect( 530, 2, 799, 20); Update_flags = UF_ALL; initializing = 0; editor_screen_open = 1; }
void scores_view(int citem) { grs_canvas *center_canv; fix t1; int i,done,looper; int k; sbyte fades[64] = { 1,1,1,2,2,3,4,4,5,6,8,9,10,12,13,15,16,17,19,20,22,23,24,26,27,28,28,29,30,30,31,31,31,31,31,30,30,29,28,28,27,26,24,23,22,20,19,17,16,15,13,12,10,9,8,6,5,4,4,3,2,2,1,1 }; ReshowScores: scores_read(); set_screen_mode(SCREEN_MENU); gr_set_current_canvas(NULL); nm_draw_background(0, 0, GWIDTH-1, GHEIGHT-1); // args are x,y,x2,y2 NOT x,y,w,h center_canv = gr_create_sub_canvas(grd_curcanv, GWIDTH/2-LHX(160), 0, LHX(320), GHEIGHT); gr_set_current_canvas(center_canv); grd_curcanv->cv_font = MEDIUM3_FONT; gr_string( 0x8000, LHY(15), TXT_HIGH_SCORES ); grd_curcanv->cv_font = SMALL_FONT; gr_set_fontcolor( BM_XRGB(31,26,5), -1 ); gr_string( LHX(31+33+XX), LHY(46+7+YY), TXT_NAME ); gr_string( LHX(82+33+XX), LHY(46+7+YY), TXT_SCORE ); gr_string( LHX(127+33+XX), LHY(46+7+YY), TXT_SKILL ); gr_string( LHX(170+33+XX), LHY(46+7+YY), TXT_LEVELS ); // gr_string( 202, 46, "Kills" ); // gr_string( 234, 46, "Rescues" ); gr_string( LHX(288-42+XX), LHY(46+7+YY), TXT_TIME ); if ( citem < 0 ) gr_string( 0x8000, LHY(175), TXT_PRESS_CTRL_R ); gr_set_fontcolor( BM_XRGB(28,28,28), -1 ); gr_printf( 0x8000, LHY(31), "%c%s%c - %s", 34, Scores.cool_saying, 34, Scores.stats[0].name ); for (i=0; i<MAX_HIGH_SCORES; i++ ) { //@@if (i==0) { //@@ gr_set_fontcolor( BM_XRGB(28,28,28), -1 ); //@@} else { //@@ gr_set_fontcolor( gr_fade_table[BM_XRGB(28,28,28)+((28-i*2)*256)], -1 ); //@@} gr_set_fontcolor( BM_XRGB(28-i*2,28-i*2,28-i*2), -1 ); scores_draw_item( i, &Scores.stats[i] ); } gr_palette_fade_in( gr_palette,32, 0); #ifdef OGL vid_update(); #endif game_flush_inputs(); done = 0; looper = 0; while(!done) { if ( citem > -1 ) { t1 = timer_get_fixed_seconds(); while ( timer_get_fixed_seconds() < t1+F1_0/128 ); //@@gr_set_fontcolor( gr_fade_table[fades[looper]*256+BM_XRGB(28,28,28)], -1 ); gr_set_fontcolor( BM_XRGB(7+fades[looper],7+fades[looper],7+fades[looper]), -1 ); looper++; if (looper>63) looper=0; if ( citem == MAX_HIGH_SCORES ) scores_draw_item( MAX_HIGH_SCORES, &Last_game ); else scores_draw_item( citem, &Scores.stats[citem] ); vid_update(); } for (i=0; i<4; i++ ) if (joy_get_button_down_cnt(i)>0) done=1; for (i=0; i<3; i++ ) if (mouse_button_down_count(i)>0) done=1; //see if redbook song needs to be restarted songs_check_redbook_repeat(); k = newmenu_inkey(); switch( k ) { case KEY_CTRLED+KEY_R: if ( citem < 0 ) { // Reset scores... if ( nm_messagebox( NULL, 2, TXT_NO, TXT_YES, TXT_RESET_HIGH_SCORES )==1 ) { PHYSFS_delete(get_scores_filename()); gr_palette_fade_out( gr_palette, 32, 0 ); goto ReshowScores; } } break; case KEY_BACKSP: Int3(); k = 0; break; case KEY_PRINT_SCREEN: save_screen_shot(0); k = 0; break; case KEY_ENTER: case KEY_SPACEBAR: case KEY_ESC: done=1; break; } } // Restore background and exit gr_palette_fade_out( gr_palette, 32, 0 ); gr_set_current_canvas(NULL); gr_free_sub_canvas(center_canv); game_flush_inputs(); }
UI_WINDOW * ui_open_window( short x, short y, short w, short h, int flags ) { UI_WINDOW * wnd; int sw, sh, req_w, req_h; wnd = (UI_WINDOW *)d_malloc(sizeof(UI_WINDOW)); if (wnd==NULL) Error("Could not create window: Out of memory"); W_NEXT = NULL; W_PREV = NULL; add_window_to_end( wnd ); sw = grd_curscreen->sc_w; sh = grd_curscreen->sc_h; // mouse_set_limits( 0,0, sw-1, sh-1 ); req_w = w; req_h = h; if (flags & WIN_BORDER) { x -= BORDER_WIDTH; y -= BORDER_WIDTH; w += 2*BORDER_WIDTH; h += 2*BORDER_WIDTH; } if ( x < 0 ) x = 0; if ( (x+w-1) >= sw ) x = sw - w; if ( y < 0 ) y = 0; if ( (y+h-1) >= sh ) y = sh - h; W_X = x; W_Y = y; W_WIDTH = w; W_HEIGHT = h; W_OLDCANVAS = grd_curcanv; W_GADGET = NULL; wnd->keyboard_focus_gadget = NULL; ui_mouse_hide(); if (flags & WIN_SAVE_BG) { W_BACKGROUND = gr_create_bitmap( w, h ); gr_bm_ubitblt(w, h, 0, 0, x, y, &(grd_curscreen->sc_canvas.cv_bitmap), W_BACKGROUND ); } else W_BACKGROUND = NULL; if (flags & WIN_BORDER) { W_CANVAS = gr_create_sub_canvas( &(grd_curscreen->sc_canvas), x+BORDER_WIDTH, y+BORDER_WIDTH, req_w, req_h ); gr_set_current_canvas( NULL ); ui_draw_frame( x, y, x+w-1, y+h-1 ); } else W_CANVAS = gr_create_sub_canvas( &(grd_curscreen->sc_canvas), x, y, req_w, req_h ); gr_set_current_canvas( W_CANVAS ); if (flags & WIN_FILLED) ui_draw_box_out( 0, 0, req_w-1, req_h-1 ); gr_set_fontcolor( CBLACK, CWHITE ); selected_gadget = NULL; W_TEXT_X = 0; W_TEXT_Y = 0; return wnd; }
// ----------------------------------------------------------------------------- void init_briefing_bitmap(void) { Robot_canv = gr_create_sub_canvas(grd_curcanv, 138, 55, 166, 138); }
// ----------------------------------------------------------------------------- void show_bitmap_frame(void) { grs_canvas *curcanv_save, *bitmap_canv=0; grs_bitmap *bitmap_ptr; // Only plot every nth frame. if (Door_div_count) { Door_div_count--; return; } Door_div_count = DOOR_DIV_INIT; if (Bitmap_name[0] != 0) { char *pound_signp; int num, dig1, dig2; // Set supertransparency color to black if (!New_pal_254_bash) { New_pal_254_bash = 1; New_pal[254*3] = 0; New_pal[254*3+1] = 0; New_pal[254*3+2] = 0; gr_palette_load( New_pal ); // vfx_set_palette_sub( New_pal ); } switch (Animating_bitmap_type) { case 0: bitmap_canv = gr_create_sub_canvas(grd_curcanv, rescale_x(220), rescale_y(45), 64, 64); break; case 1: bitmap_canv = gr_create_sub_canvas(grd_curcanv, rescale_x(220), rescale_y(45), 94, 94); break; // Adam: Change here for your new animating bitmap thing. 94, 94 are bitmap size. default: Int3(); // Impossible, illegal value for Animating_bitmap_type } curcanv_save = grd_curcanv; grd_curcanv = bitmap_canv; pound_signp = strchr(Bitmap_name, '#'); Assert(pound_signp != NULL); dig1 = *(pound_signp+1); dig2 = *(pound_signp+2); if (dig2 == 0) num = dig1-'0'; else num = (dig1-'0')*10 + (dig2-'0'); switch (Animating_bitmap_type) { case 0: num += Door_dir; if (num > EXIT_DOOR_MAX) { num = EXIT_DOOR_MAX; Door_dir = -1; } else if (num < 0) { num = 0; Door_dir = 1; } break; case 1: num++; if (num > OTHER_THING_MAX) num = 0; break; } Assert(num < 100); if (num >= 10) { *(pound_signp+1) = (num / 10) + '0'; *(pound_signp+2) = (num % 10) + '0'; *(pound_signp+3) = 0; } else { *(pound_signp+1) = (num % 10) + '0'; *(pound_signp+2) = 0; } { bitmap_index bi; bi = piggy_find_bitmap(Bitmap_name); bitmap_ptr = &GameBitmaps[bi.index]; PIGGY_PAGE_IN( bi ); } gr_bitmapm(0, 0, bitmap_ptr); grd_curcanv = curcanv_save; free(bitmap_canv); switch (Animating_bitmap_type) { case 0: if (num == EXIT_DOOR_MAX) { Door_dir = -1; Door_div_count = 64; } else if (num == 0) { Door_dir = 1; Door_div_count = 64; } break; case 1: break; } } }
int state_save_all_sub(char *filename, char *desc, int between_levels) { int i,j; FILE * fp; grs_canvas * cnv; #ifdef OGLES GLubyte *screen; GLint viewWidth, viewHeight; #endif if ( Game_mode & GM_MULTI ) { #ifdef MULTI_SAVE if ( !FindArg( "-multisave" ) ) #endif return 0; } fp = fopen( filename, "wb" ); if ( !fp ) { start_time(); return 0; } //Save id fwrite( dgss_id, sizeof(char)*4, 1, fp ); //Save version i = STATE_VERSION; fwrite( &i, sizeof(int), 1, fp ); //Save description fwrite( desc, sizeof(char)*DESC_LENGTH, 1, fp ); // Save the current screen shot... #ifdef OGLES cnv = gr_create_sub_canvas(grd_curcanv, 0, 0, THUMBNAIL_W, THUMBNAIL_H); screen = malloc(THUMBNAIL_W * THUMBNAIL_H * 4); #else cnv = gr_create_canvas( THUMBNAIL_W, THUMBNAIL_H ); #endif if ( cnv ) { gr_set_current_canvas( cnv ); if ( between_levels ) { char * pcx_file; ubyte pcx_palette[768]; grs_bitmap bmp; gr_clear_canvas( BM_XRGB(0,0,0) ); pcx_file = get_briefing_screen( Next_level_num ); if ( pcx_file != NULL ) { bmp.bm_data = NULL; if (pcx_read_bitmap( pcx_file, &bmp, BM_LINEAR, pcx_palette )==PCX_ERROR_NONE) { grs_point vertbuf[3]; gr_clear_canvas( 255 ); vertbuf[0].x = vertbuf[0].y = -F1_0*6; // -6 pixel rows for ascpect vertbuf[1].x = vertbuf[1].y = 0; vertbuf[2].x = i2f(THUMBNAIL_W); vertbuf[2].y = i2f(THUMBNAIL_H+7); // + 7 pixel rows for ascpect scale_bitmap(&bmp, vertbuf ); gr_remap_bitmap_good( &cnv->cv_bitmap, pcx_palette, -1, -1 ); free( bmp.bm_data ); } } } else { render_frame(0); #ifdef OGLES getRenderBufferSize(&viewWidth, &viewHeight); glReadPixels(0, viewHeight - THUMBNAIL_H, THUMBNAIL_W, THUMBNAIL_H, GL_RGBA, GL_UNSIGNED_BYTE, screen); cnv->cv_bitmap.bm_data = malloc(THUMBNAIL_H * THUMBNAIL_W); ogles_map_bitmap(cnv->cv_bitmap.bm_data, screen, THUMBNAIL_W, THUMBNAIL_H); free(screen); #endif } fwrite( cnv->cv_bitmap.bm_data, THUMBNAIL_W*THUMBNAIL_H, 1, fp ); #ifdef OGLES free(cnv->cv_bitmap.bm_data); gr_free_sub_canvas(cnv); #else gr_free_canvas( cnv ); #endif } else { ubyte color = 0; for ( i=0; i<THUMBNAIL_W*THUMBNAIL_H; i++ ) fwrite( &color, sizeof(ubyte), 1, fp ); } // Save the Between levels flag... fwrite( &between_levels, sizeof(int), 1, fp ); // Save the mission info... fwrite( &Mission_list[Current_mission_num], sizeof(char)*9, 1, fp ); //Save level info fwrite( &Current_level_num, sizeof(int), 1, fp ); fwrite( &Next_level_num, sizeof(int), 1, fp ); //Save GameTime fwrite( &GameTime, sizeof(fix), 1, fp ); //Save player info fwrite( &Players[Player_num], sizeof(player), 1, fp ); // Save the current weapon info fwrite( &Primary_weapon, sizeof(byte), 1, fp ); fwrite( &Secondary_weapon, sizeof(byte), 1, fp ); // Save the difficulty level fwrite( &Difficulty_level, sizeof(int), 1, fp ); // Save the Cheats_enabled fwrite( &Cheats_enabled, sizeof(int), 1, fp ); fwrite( &Game_turbo_mode, sizeof(int), 1, fp ); if ( !between_levels ) { //Finish all morph objects for (i=0; i<=Highest_object_index; i++ ) { if ( (Objects[i].type != OBJ_NONE) && (Objects[i].render_type==RT_MORPH)) { morph_data *md; md = find_morph_data(&Objects[i]); if (md) { md->obj->control_type = md->morph_save_control_type; md->obj->movement_type = md->morph_save_movement_type; md->obj->render_type = RT_POLYOBJ; md->obj->mtype.phys_info = md->morph_save_phys_info; md->obj = NULL; } else { //maybe loaded half-morphed from disk Objects[i].flags |= OF_SHOULD_BE_DEAD; Objects[i].render_type = RT_POLYOBJ; Objects[i].control_type = CT_NONE; Objects[i].movement_type = MT_NONE; } } } //Save object info i = Highest_object_index+1; fwrite( &i, sizeof(int), 1, fp ); fwrite( Objects, sizeof(object)*i, 1, fp ); //Save wall info i = Num_walls; fwrite( &i, sizeof(int), 1, fp ); fwrite( Walls, sizeof(wall)*i, 1, fp ); //Save door info i = Num_open_doors; fwrite( &i, sizeof(int), 1, fp ); fwrite( ActiveDoors, sizeof(active_door)*i, 1, fp ); //Save trigger info fwrite( &Num_triggers, sizeof(int), 1, fp ); fwrite( Triggers, sizeof(trigger)*Num_triggers, 1, fp ); //Save tmap info for (i=0; i<=Highest_segment_index; i++ ) { for (j=0; j<6; j++ ) { fwrite( &Segments[i].sides[j].wall_num, sizeof(short), 1, fp ); fwrite( &Segments[i].sides[j].tmap_num, sizeof(short), 1, fp ); fwrite( &Segments[i].sides[j].tmap_num2, sizeof(short), 1, fp ); } } // Save the fuelcen info fwrite( &Fuelcen_control_center_destroyed, sizeof(int), 1, fp ); fwrite( &Fuelcen_seconds_left, sizeof(int), 1, fp ); fwrite( &Num_robot_centers, sizeof(int), 1, fp ); fwrite( RobotCenters, sizeof(matcen_info)*Num_robot_centers, 1, fp ); fwrite( &ControlCenterTriggers, sizeof(control_center_triggers), 1, fp ); fwrite( &Num_fuelcenters, sizeof(int), 1, fp ); fwrite( Station, sizeof(FuelCenter)*Num_fuelcenters, 1, fp ); // Save the control cen info fwrite( &Control_center_been_hit, sizeof(int), 1, fp ); fwrite( &Control_center_player_been_seen, sizeof(int), 1, fp ); fwrite( &Control_center_next_fire_time, sizeof(int), 1, fp ); fwrite( &Control_center_present, sizeof(int), 1, fp ); fwrite( &Dead_controlcen_object_num, sizeof(int), 1, fp ); // Save the AI state ai_save_state( fp ); // Save the automap visited info fwrite( Automap_visited, sizeof(ubyte)*MAX_SEGMENTS, 1, fp ); } fwrite( &state_game_id, sizeof(uint), 1, fp ); fwrite( &Laser_rapid_fire, sizeof(int), 1, fp ); fwrite( &Ugly_robot_cheat, sizeof(int), 1, fp ); fwrite( &Ugly_robot_texture, sizeof(int), 1, fp ); fwrite( &Physics_cheat_flag, sizeof(int), 1, fp ); fwrite( &Lunacy, sizeof(int), 1, fp ); fclose(fp); start_time(); return 1; }