void ui_close_window( UI_WINDOW * wnd ) { ui_mouse_hide(); ui_gadget_delete_all( wnd ); if (W_BACKGROUND) { gr_bm_ubitblt(W_WIDTH, W_HEIGHT, W_X, W_Y, 0, 0, W_BACKGROUND, &(grd_curscreen->sc_canvas.cv_bitmap)); gr_free_bitmap( W_BACKGROUND ); } else { gr_set_current_canvas( NULL ); gr_setcolor( CBLACK ); gr_rect( W_X, W_Y, W_X+W_WIDTH-1, W_Y+W_HEIGHT-1 ); } gr_free_sub_canvas( W_CANVAS ); gr_set_current_canvas( W_OLDCANVAS ); selected_gadget = NULL; remove_window( wnd ); if (CurWindow==wnd) CurWindow = NULL; d_free( wnd ); ui_mouse_show(); }
void ui_gadget_delete_all( UI_WINDOW * wnd ) { UI_GADGET * tmp; while( wnd->gadget != NULL ) { tmp = wnd->gadget; if (tmp->next == tmp ) { wnd->gadget = NULL; } else { tmp->next->prev = tmp->prev; tmp->prev->next = tmp->next; wnd->gadget = tmp->next; } if (tmp->canvas) gr_free_sub_canvas( tmp->canvas ); if (tmp->kind == 1 ) // Button { UI_GADGET_BUTTON * but1 = (UI_GADGET_BUTTON *)tmp; if (but1->text) free( but1->text ); } if (tmp->kind == 6 ) // Inputbox { UI_GADGET_INPUTBOX * but1 = (UI_GADGET_INPUTBOX *)tmp; free( but1->text ); } if (tmp->kind == 5 ) // Checkbox { UI_GADGET_CHECKBOX * but1 = (UI_GADGET_CHECKBOX *)tmp; free( but1->text ); } if (tmp->kind == 9 ) // Icon { UI_GADGET_ICON * but1 = (UI_GADGET_ICON *)tmp; free( but1->text ); } free( tmp ); } }
//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 }
//shutdown ui on the editor screen void close_editor_screen() { if (!editor_screen_open) return; editor_screen_open = 0; ui_pad_deactivate(); gr_free_sub_canvas(Pad_text_canvas); ui_close_window(EditorWindow); close_all_windows(); // CLOSE TEXTURE STUFF texpage_close(); objpage_close(); menubar_hide(); }
void texpage_close() { gr_free_sub_canvas(TmapnameCanvas); }
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(); }
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; }