// ========================================================================== int main(int argc, char * argv[]) { BLOCK_S * block_ptr=NULL; BITMAP * pcxbmp = NULL; FILE * in, * out; char strtmp[256], pcxfilename[256], * ptr; long b, t, w, h; enum {PT_FA, PT_FS, PT_WU, PT_WD, PT_MAX}; int pcx_idx, i; struct { char * name; long w; long h; int col; } pcx[PT_MAX]; // header & syntaxe printf("DT1EXTR v 0.97 beta, by Paul Siramy, Freeware\n" "=============================================\n"); if (argc == 1) { printf("syntaxe : dt1extr <file.dt1> [-pal <file.dat>]\n"); exit(0); } // palette & atexit() if (strcmp(argv[2], "-pal") == 0) load_palette(argv[3]); else { printf("opening default palette\n "); load_palette("d2pal\\act1.dat"); } // dt1 file in = fopen(argv[1], "rb"); if (in == NULL) { printf("can't open %s\n", argv[1]); exit(1); } else printf("opening %s\n", argv[1]); read_dt1_header(in); read_blocks_headers(in); for (t=0; t<glb_block_number; t++) read_tiles_of_block(in, t); fclose(in); allegro_init(); set_color_depth(8); atexit(dt1con_exit); memset(pcx, 0, sizeof(pcx)); pcx[PT_FA].name = "fa"; // floor animated pcx[PT_FS].name = "fs"; // floor static pcx[PT_WU].name = "wu"; // walls up pcx[PT_WD].name = "wd"; // walls down ptr = argv[1]; i=strlen(ptr) - 1; while ((i >= 0) && ( * (ptr+i) != '\\') && ( * (ptr+i) != ':')) i--; if (i != 0) i++; strcpy(strtmp, ptr+i); strtmp[strlen(strtmp) - 4] = 0; strcat(strtmp, ".ini"); out = fopen(strtmp, "wt"); printf("saving %s\n", strtmp); strtmp[strlen(strtmp) - 4] = 0; // start of ini fprintf(out, "nb_blocks = %li\n\n", glb_block_number); // check the size of each pcx for (b=0; b<glb_block_number; b++) { block_ptr = glb_block + b; // set some flags if ( ((block_ptr->direction == 3) && (block_ptr->orientation == 0)) || ((block_ptr->direction == 5) && (block_ptr->orientation == 15)) ) { // floor set_floor(block_ptr->f); if (block_ptr->animated) { set_animated(block_ptr->f); } else set_static(block_ptr->f); } else { // wall set_wall(block_ptr->f); if (block_ptr->orientation & 0xF0) set_wall_down(block_ptr->f); else set_wall_up(block_ptr->f); } // boxsize h = block_ptr->ysize; if (h < 0) h = - h; if (is_wall(block_ptr->f)) h += 32; // 1 worldstone down wall need more border w = block_ptr->xsize; // place the block in the pcx pcx_idx = -1; if (is_floor(block_ptr->f)) { h = 80; if (is_static(block_ptr->f)) pcx_idx = PT_FS; else if (is_animated(block_ptr->f)) pcx_idx = PT_FA; } else if (is_wall(block_ptr->f)) { if (is_wall_up(block_ptr->f)) pcx_idx = PT_WU; else if (is_wall_down(block_ptr->f)) pcx_idx = PT_WD; } if (pcx_idx != -1) { block_ptr->pcx_n = pcx_idx; block_ptr->pcx_x = pcx[pcx_idx].w; if ( (pcx_idx == PT_FA) || (pcx_idx == PT_FS) ) { block_ptr->pcx_y = 80 * (block_ptr->pcx_x / 800); block_ptr->pcx_x = block_ptr->pcx_x % 800; } pcx[pcx_idx].w += 160; if (pcx[pcx_idx].h < h) pcx[pcx_idx].h = h; pcx[pcx_idx].col++; // ini fprintf(out, "block = %li\n", b); fprintf(out, "pcx_file = %s\n", pcx[pcx_idx].name); fprintf(out, "pcx_x = %i\n", block_ptr->pcx_x); fprintf(out, "pcx_y = %i\n", block_ptr->pcx_y); fprintf(out, "direction = %08lX\n", block_ptr->direction); // fprintf(out, "flags = %08lX\n", block_ptr->flags); fprintf(out, "y_delta = %i\n", block_ptr->y_delta); fprintf(out, "tile_sound = %i\n", block_ptr->tile_sound); fprintf(out, "animated = %i\n", block_ptr->animated); fprintf(out, "orientation = %08lX\n", block_ptr->orientation); fprintf(out, "main_index = %08lX\n", block_ptr->main_index); fprintf(out, "sub_index = %08lX\n", block_ptr->sub_index); fprintf(out, "frame = %08lX\n", block_ptr->frame); fprintf(out, "unknown = %08lX\n", block_ptr->unknown); fprintf(out, "floor_flag1 = %02X %02X %02X %02X %02X\n", block_ptr->sub_tiles_flags[20], block_ptr->sub_tiles_flags[21], block_ptr->sub_tiles_flags[22], block_ptr->sub_tiles_flags[23], block_ptr->sub_tiles_flags[24] ); fprintf(out, "floor_flag2 = %02X %02X %02X %02X %02X\n", block_ptr->sub_tiles_flags[15], block_ptr->sub_tiles_flags[16], block_ptr->sub_tiles_flags[17], block_ptr->sub_tiles_flags[18], block_ptr->sub_tiles_flags[19] ); fprintf(out, "floor_flag3 = %02X %02X %02X %02X %02X\n", block_ptr->sub_tiles_flags[10], block_ptr->sub_tiles_flags[11], block_ptr->sub_tiles_flags[12], block_ptr->sub_tiles_flags[13], block_ptr->sub_tiles_flags[14] ); fprintf(out, "floor_flag4 = %02X %02X %02X %02X %02X\n", block_ptr->sub_tiles_flags[5], block_ptr->sub_tiles_flags[6], block_ptr->sub_tiles_flags[7], block_ptr->sub_tiles_flags[8], block_ptr->sub_tiles_flags[9] ); fprintf(out, "floor_flag5 = %02X %02X %02X %02X %02X\n", block_ptr->sub_tiles_flags[0], block_ptr->sub_tiles_flags[1], block_ptr->sub_tiles_flags[2], block_ptr->sub_tiles_flags[3], block_ptr->sub_tiles_flags[4] ); fprintf(out, "\n"); } } for (i=0; i<PT_MAX; i++) { if (pcx[i].w > 0) { if ((i == PT_FA) || (i == PT_FS)) { if (pcx[i].w > 800) { pcx[i].h = 80 * (1 + pcx[i].w / 800); pcx[i].w = 800; } } pcxbmp = create_bitmap(pcx[i].w, pcx[i].h); clear(pcxbmp); if (pcxbmp != NULL) { for (b=0; b<glb_block_number; b++) { block_ptr = glb_block + b; if (block_ptr->pcx_n == i) { if (is_floor(block_ptr->f)) draw_block(pcxbmp, block_ptr->pcx_x, block_ptr->pcx_y, b); else { if (is_wall_up(block_ptr->f)) draw_block(pcxbmp, block_ptr->pcx_x, pcx[i].h, b); else draw_block(pcxbmp, block_ptr->pcx_x, 96, b); } } } } sprintf(pcxfilename, "%s-%s.pcx", strtmp, pcx[i].name); printf("saving %s\n", pcxfilename); save_pcx(pcxfilename, pcxbmp, & the_pal); destroy_bitmap(pcxbmp); } } fclose(out); // end printf("done\n"); return 0; }
double Foothold::ground_below(double x) const { return is_floor() ? y1() : slope() * (x - x1()) + y1(); }
/* direction should be 0 for horizontal walls and 1 for vertical walls */ void do_linedef(int y, int x, int ye, int xe, int direction) { /* walls */ if((cave_feat[y][x] >= FEAT_MAGMA && is_floor_ish(cave_feat[ye][xe])) || (is_floor_ish(cave_feat[y][x]) && cave_feat[ye][xe] >= FEAT_MAGMA)) { linedefs[++linedef_counter].flags=0; linedefs[linedef_counter].type=0; linedefs[linedef_counter].tag=0; linedefs[linedef_counter].right_sidedef_idx=++sidedef_counter; linedefs[linedef_counter].left_sidedef_idx=-1; sidedefs[sidedef_counter].x_texture_off=0; sidedefs[sidedef_counter].y_texture_off=0; memset(sidedefs[sidedef_counter].upper_texture, 0, 8); memset(sidedefs[sidedef_counter].lower_texture, 0, 8); memset(sidedefs[sidedef_counter].normal_texture, 0, 8); memcpy(sidedefs[sidedef_counter].upper_texture, "ROCK1", 5); memcpy(sidedefs[sidedef_counter].lower_texture, "ROCK1", 5); memcpy(sidedefs[sidedef_counter].normal_texture, "ROCK1", 5); if(vertex_idx[ye][xe]==-1) vertex_idx[ye][xe]=vertex_counter++; if(vertex_idx[y+1][x+1]==-1) vertex_idx[y+1][x+1]=vertex_counter++; /* wall left/top, floor right/bottom */ if(cave_feat[y][x] >= FEAT_MAGMA && is_floor_ish(cave_feat[ye][xe])) { if(direction) { linedefs[linedef_counter].from_vertex=vertex_idx[y+1][x+1]; linedefs[linedef_counter].to_vertex=vertex_idx[ye][xe]; } else { linedefs[linedef_counter].from_vertex=vertex_idx[ye][xe]; linedefs[linedef_counter].to_vertex=vertex_idx[y+1][x+1]; } sidedefs[sidedef_counter].sector=cave_sector_map[ye][xe]; } /* floor left/top, wall right/bottom */ if(is_floor_ish(cave_feat[y][x]) && cave_feat[ye][xe] >= FEAT_MAGMA) { if(direction) { linedefs[linedef_counter].to_vertex=vertex_idx[y+1][x+1]; linedefs[linedef_counter].from_vertex=vertex_idx[ye][xe]; } else { linedefs[linedef_counter].to_vertex=vertex_idx[ye][xe]; linedefs[linedef_counter].from_vertex=vertex_idx[y+1][x+1]; } sidedefs[sidedef_counter].sector=cave_sector_map[y][x]; } return; } /* doors */ if((is_floor(cave_feat[y][x]) && is_door(cave_feat[ye][xe])) || (is_door(cave_feat[y][x]) && is_floor(cave_feat[ye][xe]))) { linedef_counter++; if(vertex_idx[ye][xe]==-1) vertex_idx[ye][xe]=vertex_counter++; if(vertex_idx[y+1][x+1]==-1) vertex_idx[y+1][x+1]=vertex_counter++; linedefs[linedef_counter].flags=0x4; linedefs[linedef_counter].type=1; linedefs[linedef_counter].right_sidedef_idx=++sidedef_counter; /* door left/top, floor right/bottom */ if(is_door(cave_feat[y][x]) && is_floor(cave_feat[ye][xe])) { if(direction) { linedefs[linedef_counter].from_vertex=vertex_idx[y+1][x+1]; linedefs[linedef_counter].to_vertex=vertex_idx[ye][xe]; } else { linedefs[linedef_counter].from_vertex=vertex_idx[ye][xe]; linedefs[linedef_counter].to_vertex=vertex_idx[y+1][x+1]; } sidedefs[sidedef_counter].sector=cave_sector_map[ye][xe]; sidedefs[sidedef_counter+1].sector=cave_sector_map[y][x]; } /* floor left/top, door right/bottom */ if(is_floor(cave_feat[y][x]) && is_door(cave_feat[ye][xe])) { if(direction) { linedefs[linedef_counter].to_vertex=vertex_idx[y+1][x+1]; linedefs[linedef_counter].from_vertex=vertex_idx[ye][xe]; } else { linedefs[linedef_counter].to_vertex=vertex_idx[ye][xe]; linedefs[linedef_counter].from_vertex=vertex_idx[y+1][x+1]; } sidedefs[sidedef_counter].sector=cave_sector_map[y][x]; sidedefs[sidedef_counter+1].sector=cave_sector_map[ye][xe]; } sidedefs[sidedef_counter].x_texture_off=0; sidedefs[sidedef_counter].y_texture_off=0; memset(sidedefs[sidedef_counter].upper_texture, 0, 8); memset(sidedefs[sidedef_counter].lower_texture, 0, 8); memset(sidedefs[sidedef_counter].normal_texture, 0, 8); memcpy(sidedefs[sidedef_counter].lower_texture, "-", 1); memcpy(sidedefs[sidedef_counter].normal_texture, "-", 1); linedefs[linedef_counter].left_sidedef_idx=++sidedef_counter; sidedefs[sidedef_counter].x_texture_off=0; sidedefs[sidedef_counter].y_texture_off=0; memset(sidedefs[sidedef_counter].upper_texture, 0, 8); memset(sidedefs[sidedef_counter].lower_texture, 0, 8); memset(sidedefs[sidedef_counter].normal_texture, 0, 8); memcpy(sidedefs[sidedef_counter].upper_texture, "-", 1); memcpy(sidedefs[sidedef_counter].lower_texture, "-", 1); memcpy(sidedefs[sidedef_counter].normal_texture, "-", 1); if(cave_feat[y][x] == FEAT_SECRET || cave_feat[ye][xe] == FEAT_SECRET) { memcpy(sidedefs[sidedef_counter-1].upper_texture, "ROCK1", 5); linedefs[linedef_counter].flags |= 0x20; } else { memcpy(sidedefs[sidedef_counter-1].upper_texture, "WOODMET1", 8); } if(is_door(cave_feat[ye][xe])) { if(sectors[cave_sector_map[ye][xe]].tag == -1) sectors[cave_sector_map[ye][xe]].tag=tag_counter++; linedefs[linedef_counter].tag = sectors[cave_sector_map[ye][xe]].tag; sectors[cave_sector_map[ye][xe]].ceiling_height=0; } if(is_door(cave_feat[y][x])) { if(sectors[cave_sector_map[y][x]].tag == -1) sectors[cave_sector_map[y][x]].tag=tag_counter++; linedefs[linedef_counter].tag = sectors[cave_sector_map[y][x]].tag; sectors[cave_sector_map[y][x]].ceiling_height=0; } return; } /* floor left/top, floor right/top */ if(is_floor_ish(cave_feat[y][x]) && is_floor_ish(cave_feat[ye][xe])) { if(vertex_idx[ye][xe]==-1) vertex_idx[ye][xe]=vertex_counter++; if(vertex_idx[y+1][x+1]==-1) vertex_idx[y+1][x+1]=vertex_counter++; linedefs[++linedef_counter].from_vertex=vertex_idx[ye][xe]; linedefs[linedef_counter].to_vertex=vertex_idx[y+1][x+1]; linedefs[linedef_counter].flags=0x4; linedefs[linedef_counter].type=0; linedefs[linedef_counter].tag=0; linedefs[linedef_counter].right_sidedef_idx=++sidedef_counter; sidedefs[sidedef_counter].x_texture_off=0; sidedefs[sidedef_counter].y_texture_off=0; memset(sidedefs[sidedef_counter].upper_texture, 0, 8); memset(sidedefs[sidedef_counter].lower_texture, 0, 8); memset(sidedefs[sidedef_counter].normal_texture, 0, 8); memcpy(sidedefs[sidedef_counter].upper_texture, "-", 1); memcpy(sidedefs[sidedef_counter].lower_texture, "-", 1); memcpy(sidedefs[sidedef_counter].normal_texture, "-", 1); sidedefs[sidedef_counter].sector=cave_sector_map[ye][xe]; linedefs[linedef_counter].left_sidedef_idx=++sidedef_counter; sidedefs[sidedef_counter].x_texture_off=0; sidedefs[sidedef_counter].y_texture_off=0; memset(sidedefs[sidedef_counter].upper_texture, 0, 8); memset(sidedefs[sidedef_counter].lower_texture, 0, 8); memset(sidedefs[sidedef_counter].normal_texture, 0, 8); memcpy(sidedefs[sidedef_counter].upper_texture, "-", 1); memcpy(sidedefs[sidedef_counter].lower_texture, "-", 1); memcpy(sidedefs[sidedef_counter].normal_texture, "-", 1); sidedefs[sidedef_counter].sector=cave_sector_map[y][x]; return; } }