void LoadTerrain (char *filename) { grsBitmap bmHeight; int iff_error; int i, j; ubyte h, hMin, hMax; LogErr (" loading terrain height map\n"); iff_error = iff_read_bitmap (filename, &bmHeight, BM_LINEAR); if (iff_error != IFF_NO_ERROR) { #if TRACE con_printf (1, "File %s - IFF error: %s", filename, iff_errormsg (iff_error)); #endif Error ("File %s - IFF error: %s", filename, iff_errormsg (iff_error)); } if (gameData.render.terrain.pHeightMap) D2_FREE (gameData.render.terrain.pHeightMap) else atexit (FreeTerrainHeightMap); //first time gameData.render.terrain.nGridW = bmHeight.bmProps.w; gameData.render.terrain.nGridH = bmHeight.bmProps.h; Assert (gameData.render.terrain.nGridW <= TERRAIN_GRID_MAX_SIZE); Assert (gameData.render.terrain.nGridH <= TERRAIN_GRID_MAX_SIZE); LogErr ("heightmap loaded, size=%dx%d\n", gameData.render.terrain.nGridW, gameData.render.terrain.nGridH); gameData.render.terrain.pHeightMap = bmHeight.bmTexBuf; hMax = 0; hMin = 255; for (i = 0; i < gameData.render.terrain.nGridW; i++) for (j = 0; j < gameData.render.terrain.nGridH; j++) { h = HEIGHT (i, j); if (h > hMax) hMax = h; if (h < hMin) hMin = h; } for (i = 0; i < gameData.render.terrain.nGridW; i++) { for (j = 0; j < gameData.render.terrain.nGridH; j++) { HEIGHT (i, j) -= hMin; } } // D2_FREE (bmHeight.bmTexBuf); gameData.render.terrain.bmP = gameData.endLevel.terrain.bmP; #if 0 //the following code turns the (palettized) terrain texture into a white TGA texture for testing gameData.render.terrain.bmP->bmProps.rowSize *= 4; gameData.render.terrain.bmP->bmProps.flags |= BM_FLAG_TGA; D2_FREE (gameData.render.terrain.bmP->bmTexBuf); gameData.render.terrain.bmP->bmTexBuf = D2_ALLOC (gameData.render.terrain.bmP->bmProps.h * gameData.render.terrain.bmP->bmProps.rowSize); memset (gameData.render.terrain.bmP->bmTexBuf, 0xFF, gameData.render.terrain.bmP->bmProps.h * gameData.render.terrain.bmP->bmProps.rowSize); #endif LogErr (" building terrain light map\n"); BuildTerrainLightMap (); }
//called for each level to load & setup the exit sequence load_endlevel_data(int level_num) { char filename[13]; char line[LINE_LEN],*p; CFILE *ifile; int var,segnum,sidenum; int exit_side, i; int have_binary = 0; endlevel_data_loaded = 0; //not loaded yet try_again: ; if (level_num<0) //secret level strcpy(filename,Secret_level_names[-level_num-1]); else //normal level strcpy(filename,Level_names[level_num-1]); if (!convert_ext(filename,"END")) return; ifile = cfopen(filename,"rb"); if (!ifile) { convert_ext(filename,"TXB"); ifile = cfopen(filename,"rb"); if (!ifile) if (level_num==1) { return; //abort //Error("Cannot load file text of binary version of <%s>",filename); } else { level_num = 1; goto try_again; } have_binary = 1; } //ok...this parser is pretty simple. It ignores comments, but //everything else must be in the right place var = 0; while (cfgets(line,LINE_LEN,ifile)) { if (have_binary) { for (i = 0; i < strlen(line) - 1; i++) { encode_rotate_left(&(line[i])); line[i] = line[i] ^ BITMAP_TBL_XOR; encode_rotate_left(&(line[i])); } p = line; } if ((p=strchr(line,';'))!=NULL) *p = 0; //cut off comment for (p=line+strlen(line)-1;p>line && isspace(*p);*p--=0); for (p=line;isspace(*p);p++); if (!*p) //empty line continue; switch (var) { case 0: { //ground terrain int iff_error; ubyte pal[768]; if (terrain_bm_instance.bm_data) free(terrain_bm_instance.bm_data); iff_error = iff_read_bitmap(p,&terrain_bm_instance,BM_LINEAR,pal); if (iff_error != IFF_NO_ERROR) { mprintf((1, "File %s - IFF error: %s",p,iff_errormsg(iff_error))); Error("File %s - IFF error: %s",p,iff_errormsg(iff_error)); } terrain_bitmap = &terrain_bm_instance; gr_remap_bitmap_good( terrain_bitmap, pal, iff_transparent_color, -1); break; } case 1: //height map load_terrain(p); break; case 2: sscanf(p,"%d,%d",&exit_point_bmx,&exit_point_bmy); break; case 3: //exit heading exit_angles.h = i2f(atoi(p))/360; break; case 4: { //planet bitmap int iff_error; ubyte pal[768]; if (satellite_bm_instance.bm_data) free(satellite_bm_instance.bm_data); iff_error = iff_read_bitmap(p,&satellite_bm_instance,BM_LINEAR,pal); if (iff_error != IFF_NO_ERROR) { mprintf((1, "File %s - IFF error: %s",p,iff_errormsg(iff_error))); Error("File %s - IFF error: %s",p,iff_errormsg(iff_error)); } satellite_bitmap = &satellite_bm_instance; gr_remap_bitmap_good( satellite_bitmap, pal, iff_transparent_color, -1); break; } case 5: //earth pos case 7: { //station pos vms_matrix tm; vms_angvec ta; int pitch,head; sscanf(p,"%d,%d",&head,&pitch); ta.h = i2f(head)/360; ta.p = -i2f(pitch)/360; ta.b = 0; vm_angles_2_matrix(&tm,&ta); if (var==5) satellite_pos = tm.fvec; //vm_vec_copy_scale(&satellite_pos,&tm.fvec,SATELLITE_DIST); else station_pos = tm.fvec; break; } case 6: //planet size satellite_size = i2f(atoi(p)); break; } var++; } Assert(var == NUM_VARS); // OK, now the data is loaded. Initialize everything //find the exit sequence by searching all segments for a side with //children == -2 for (segnum=0,exit_segnum=-1;exit_segnum==-1 && segnum<=Highest_segment_index;segnum++) for (sidenum=0;sidenum<6;sidenum++) if (Segments[segnum].children[sidenum] == -2) { exit_segnum = segnum; exit_side = sidenum; break; } Assert(exit_segnum!=-1); compute_segment_center(&mine_exit_point,&Segments[exit_segnum]); extract_orient_from_segment(&mine_exit_orient,&Segments[exit_segnum]); compute_center_point_on_side(&mine_side_exit_point,&Segments[exit_segnum],exit_side); vm_vec_scale_add(&mine_ground_exit_point,&mine_exit_point,&mine_exit_orient.uvec,-i2f(20)); //compute orientation of surface { vms_vector tv; vms_matrix exit_orient,tm; vm_angles_2_matrix(&exit_orient,&exit_angles); vm_transpose_matrix(&exit_orient); vm_matrix_x_matrix(&surface_orient,&mine_exit_orient,&exit_orient); vm_copy_transpose_matrix(&tm,&surface_orient); vm_vec_rotate(&tv,&station_pos,&tm); vm_vec_scale_add(&station_pos,&mine_exit_point,&tv,STATION_DIST); vm_vec_rotate(&tv,&satellite_pos,&tm); vm_vec_scale_add(&satellite_pos,&mine_exit_point,&tv,SATELLITE_DIST); vm_vector_2_matrix(&tm,&tv,&surface_orient.uvec,NULL); vm_vec_copy_scale(&satellite_upvec,&tm.uvec,SATELLITE_HEIGHT); } cfclose(ifile); endlevel_data_loaded = 1; }
// formerly exitmodel_bm_load_sub static bitmap_index read_extra_bitmap_iff(const char * filename ) { bitmap_index bitmap_num; grs_bitmap * n = &GameBitmaps[extra_bitmap_num]; palette_array_t newpal; int iff_error; //reference parm to avoid warning message bitmap_num.index = 0; //MALLOC( new, grs_bitmap, 1 ); iff_error = iff_read_bitmap(filename, *n, &newpal); if (iff_error != IFF_NO_ERROR) { con_printf(CON_DEBUG, "Error loading exit model bitmap <%s> - IFF error: %s", filename, iff_errormsg(iff_error)); return bitmap_num; } gr_remap_bitmap_good(*n, newpal, iff_has_transparency ? iff_transparent_color : -1, 254); n->avg_color = 0; //compute_average_pixel(new); bitmap_num.index = extra_bitmap_num; GameBitmaps[extra_bitmap_num++] = *n; //d_free( n ); return bitmap_num; }
main(int argc,char **argv) { int ret; grs_bitmap my_bitmap; ubyte my_palette[256*3]; grs_bitmap *bm_list[100]; int n_bitmaps; char key; #if 0 { int new_len,i; new_len=rle_span(new_span,test_span,sizeof(test_span)); printf("old span (%d): ",sizeof(test_span)); for (i=0;i<sizeof(test_span);i++) printf("%d ",test_span[i]); printf("\nnew span (%d): ",new_len); for (i=0;i<new_len;i++) printf("%d ",new_span[i]); exit(0); } #endif #ifdef ANIM_TEST ret = iff_read_animbrush(argv[1],bm_list,100,&n_bitmaps,&my_palette); #else ret = iff_read_bitmap(argv[1],&my_bitmap,BM_LINEAR,&my_palette); bm_list[0] = &my_bitmap; n_bitmaps = 1; #endif printf("ret = %d\n",ret); printf("error message = <%s>",iff_errormsg(ret)); if (ret == IFF_NO_ERROR) { int i; vga_init(); gr_init(); vga_set_mode(SM_320x200C); for (i=0;i<n_bitmaps;) { if (argc>2) { ret = iff_write_bitmap(argv[2],bm_list[i],&my_palette); printf("ret = %d\n",ret); } //gr_pal_setblock(0,256,&my_palette); gr_palette_load(&my_palette); //gr_pal_fade_in(grd_curscreen->pal); //in case palette is blacked gr_ubitmap(0,0,bm_list[i]); key = getch(); if (key=='-') {if (i) i--;} else i++; } gr_close(); for (i=0;i<n_bitmaps;i++) { free(bm_list[i]->bm_data); #ifdef ANIM_TEST free(bm_list[i]); #endif } } }