⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dumpflt.cpp

📁 空战游戏flacon源码
💻 CPP
字号:
//--------------------------------------

/*

  DumpFLT - Tool to dump the content of flt file

  Usage: DumpFLT fltfile [fltopcode]
  where fltfile is the fltfile to be dumped
        fltopcode is the flt opcode to be dumped (Default to all)

  Created by Erick Jap   October 21, 1996
  Copyright Spectrum Holobyte, Inc.

*/

//--------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <io.h>

//--------------------------------------
// FLT Opcodes

#define	OPCODE_HEADER										1
#define	OPCODE_GROUP										2
#define	OPCODE_OBJECT										4
#define	OPCODE_POLYGON										5
#define	OPCODE_PUSH_LEVEL									10
#define	OPCODE_POP_LEVEL									11
#define	OPCODE_DEGREE_OF_FREEDOM							14
#define	OPCODE_PUSH_SUBFACE									19
#define	OPCODE_POP_SUBFACE									20
#define	OPCODE_TEXT_COMMENT									31
#define	OPCODE_COLOR_TABLE									32
#define	OPCODE_LONG_IDENTIFIER								33
#define	OPCODE_TRANSFORMATION_MATRIX						49
#define	OPCODE_VECTOR										50
#define	OPCODE_BINARY_SEPARATING_PLANE						55
#define	OPCODE_REPLICATE_CODE								60
#define	OPCODE_LOCAL_INSTANCE								61
#define	OPCODE_LOCAL_INSTANCE_LIBRARY						62
#define	OPCODE_EXTERNAL_REFERENCE							63
#define	OPCODE_TEXTURE_REFERENCE_RECORD						64

// unused for version > 1500
#define	OPCODE_MATERIAL_TABLE								66

#define	OPCODE_SHARED_VERTEX_TABLE							67
// new name for version > 1500
#define	OPCODE_VERTEX_PALETTE								67

#define	OPCODE_VERTEX_COORDINATE							68
#define	OPCODE_VERTEX_WITH_NORMAL							69
#define	OPCODE_VERTEX_WITH_NORMAL_AND_UV					70
#define	OPCODE_VERTEX_WITH_UV								71
#define	OPCODE_VERTEX_LIST									72
#define	OPCODE_LEVEL_OF_DETAIL								73
#define	OPCODE_BOUNDING_BOX									74
#define	OPCODE_ROTATE_ABOUT_EDGE_TRANSFORM					76

// unused for version > 1500
#define	OPCODE_SCALE_TRANSFORM								77

#define	OPCODE_TRANSLATE_TRANSFORM							78
#define	OPCODE_SCALE_WITH_INDEPENDENT_XYZ_SCALE				79
#define	OPCODE_ROTATE_ABOUT_POINT_TRANSFORM					80
#define	OPCODE_ROTATE_AND_OR_SCALE_TRANSFORM				81
#define	OPCODE_PUT_TRANSFORM								82
#define	OPCODE_EYEPOINT_AND_TRACKPLANE_POSITION				83
#define	OPCODE_ROAD_SEGMENT									87
#define	OPCODE_ROAD_ZONE									88
#define	OPCODE_MORPHING_VERTEX_LIST							89
#define	OPCODE_LINKAGE_RECORD								90
#define	OPCODE_SOUND_BEAD									91
#define	OPCODE_ROAD_PATH_BEAD								92
#define	OPCODE_SOUND_PALETTE								93
#define	OPCODE_GENERAL_MATRIX_TRANSFORM						94
#define	OPCODE_TEXT_BEAD 									95
#define	OPCODE_SWITCH_BEAD									96
#define	OPCODE_LINE_STYLE_RECORD							97
#define	OPCODE_CLIPPING_QUADRILATERAL_BEAD					98
#define	OPCODE_LIGHT_SOURCE_RECORD							101
#define	OPCODE_LIGHT_SOURCE_PALETTE							102

// unused for version > 1500
#define	OPCODE_DELAUNAY_HEADER								103
#define	OPCODE_DELAUNAY_POINTS								104

#define	OPCODE_BOUNDING_SPHERE								105
#define	OPCODE_BOUNDING_CYLINDER							106
#define	OPCODE_BOUNDING_VOLUME_CENTER						108
#define	OPCODE_BOUNDING_VOLUME_ORIENTATION					109
#define	OPCODE_TEXTURE_MAPPING_PALETTE						112
#define	OPCODE_MATERIAL_PALETTE								113
#define	OPCODE_COLOR_NAME_PALETTE							114
#define	OPCODE_CONTINUOUSLY_ADAPTIVE_TERRAIN				115
#define	OPCODE_CAT_DATA										116
#define	OPCODE_PUSH_ATTRIBUTE								122
#define	OPCODE_POP_ATTRIBUTE								123

//--------------------------------------

inline void exch_char (char *a, char *b)
{
	*a ^= *b;
	*b ^= *a;
	*a ^= *b;
}

inline short swap_short (short num)
{
	char *cnum = (char *) &num;
	exch_char (&cnum[1], &cnum[0]);
	return num;
}

//--------------------------------------

char *getRecord (int in);
void printbyte (char *name, char *buffer, int total);
void displayRecord (char *rec, int rectype, int reclen);

//--------------------------------------

void main (int argc, char *argv[])
{
	printf ("DumpFLT v1.0 by Erick Jap\n\n");
	if (argc < 2) {
		puts ("DumpFLT - Tool to dump the content of flt file");
		puts ("Usage: DumpFLT fltfile [fltopcode]");
		puts ("where fltfile is the flt file to be dumped");
        puts ("      fltopcode is the flt opcode to be dumped (Default to dump all)\n");
		exit (1);
	}

	int infile = open (argv[1], O_BINARY | O_RDONLY);
	if (!infile) {
		printf ("Can not open input file %s\n", argv[1]);
		exit (1);
	}

	int	recfilter = -1;
	if (argc > 2) recfilter = atoi (argv[2]);

	while (!eof(infile)) {
		char *record = getRecord (infile);
		if (!record) exit (1);
		unsigned short *srec = (unsigned short *) record;
		unsigned short rectype = *(srec);
		unsigned short reclen = *(srec+1);
		int i = 1;
		if (recfilter != -1) {
			if (rectype != recfilter) i = 0;
		}
		if (i) {
			*(srec) = swap_short (rectype);
			*(srec+1) = swap_short (reclen);
			displayRecord (record, rectype, reclen);
		}
		free (record);
	}
	close (infile);
}

char *getRecord (int infile)
{
	short rectype, reclen;
	read (infile, &rectype, 2);
	read (infile, &reclen, 2);
	rectype = swap_short (rectype);
	reclen = swap_short (reclen);
	char *buf = (char *) malloc (reclen);
	if (!buf) {
		printf ("\nCan not allocate memory for record %d len = %d\n",
				rectype, reclen);
		return 0;
	}
	short *sbuf = (short *) buf;
	*sbuf++ = rectype;
	*sbuf++ = reclen;
	if (reclen > 4) read (infile, (char *) sbuf, reclen-4);
	return buf;
}

void printbyte (char *name, char *buffer, int total)
{
	printf ("%s\n", name);
	int i = 0;
	while (total--) {
		unsigned char c = (unsigned char) *buffer++;
		printf ("%02X", c);
		i++;
		i %= 16;
		if (total) {
			if (i) printf (" ");
			else printf ("\n");
		}
	}
	printf ("\n-----------------------------------------------\n\n");
}

void displayRecord (char *rec, int rectype, int reclen)
{
	switch (rectype) {
		case OPCODE_HEADER:
			printbyte ("Header", rec, reclen);
			break;
		case OPCODE_GROUP:
			printbyte ("Group", rec, reclen);
			break;
		case OPCODE_OBJECT:
			printbyte ("Object", rec, reclen);
			break;
		case OPCODE_POLYGON:
			printbyte ("Polygon", rec, reclen);
			break;
		case OPCODE_PUSH_LEVEL:
			printbyte ("Push", rec, reclen);
			break;
		case OPCODE_POP_LEVEL:
			printbyte ("Pop", rec, reclen);
			break;
		case OPCODE_DEGREE_OF_FREEDOM:
			printbyte ("Degree of Freedom", rec, reclen);
			break;
		case OPCODE_PUSH_SUBFACE:
			printbyte ("Push Subface", rec, reclen);
			break;
		case OPCODE_POP_SUBFACE:
			printbyte ("Pop Subface", rec, reclen);
			break;
		case OPCODE_TEXT_COMMENT:
			printbyte ("Text Comment", rec, reclen);
			break;
		case OPCODE_COLOR_TABLE:
			printbyte ("Color Table", rec, reclen);
			break;
		case OPCODE_LONG_IDENTIFIER:
			printbyte ("Long Identifier", rec, reclen);
			break;
		case OPCODE_TRANSFORMATION_MATRIX:
			printbyte ("Transformation Matrix", rec, reclen);
			break;
		case OPCODE_VECTOR:
			printbyte ("Vector", rec, reclen);
			break;
		case OPCODE_BINARY_SEPARATING_PLANE:
			printbyte ("Binary Separating Plane", rec, reclen);
			break;
		case OPCODE_REPLICATE_CODE:
			printbyte ("Replicate Code", rec, reclen);
			break;
		case OPCODE_LOCAL_INSTANCE:
			printbyte ("Local Instance", rec, reclen);
			break;
		case OPCODE_LOCAL_INSTANCE_LIBRARY:
			printbyte ("Local Instance Library", rec, reclen);
			break;
		case OPCODE_EXTERNAL_REFERENCE:
			printbyte ("External Reference", rec, reclen);
			break;
		case OPCODE_TEXTURE_REFERENCE_RECORD:
			printbyte ("Texture Reference", rec, reclen);
			break;
		case OPCODE_MATERIAL_TABLE:
			printbyte ("Material Table", rec, reclen);
			break;
		case OPCODE_SHARED_VERTEX_TABLE:
//		case OPCODE_VERTEX_PALETTE:
			printbyte ("Shared Vertex or Vertex Palette", rec, reclen);
			break;
		case OPCODE_VERTEX_COORDINATE:
			printbyte ("Vertex Coordinate", rec, reclen);
			break;
		case OPCODE_VERTEX_WITH_NORMAL:
			printbyte ("Vertex with Normal", rec, reclen);
			break;
		case OPCODE_VERTEX_WITH_NORMAL_AND_UV:
			printbyte ("Vertex with Normal and UV", rec, reclen);
			break;
		case OPCODE_VERTEX_WITH_UV:
			printbyte ("Vertex with UV", rec, reclen);
			break;
		case OPCODE_VERTEX_LIST:
			printbyte ("Vertex List", rec, reclen);
			break;
		case OPCODE_LEVEL_OF_DETAIL:
			printbyte ("Level Of Detail", rec, reclen);
			break;
		case OPCODE_BOUNDING_BOX:
			printbyte ("Bounding Box", rec, reclen);
			break;
		case OPCODE_ROTATE_ABOUT_EDGE_TRANSFORM:
			printbyte ("Rotate about Edge Transform", rec, reclen);
			break;
		case OPCODE_SCALE_TRANSFORM:
			printbyte ("Scale Transform", rec, reclen);
			break;
		case OPCODE_TRANSLATE_TRANSFORM:
			printbyte ("Translate Transform", rec, reclen);
			break;
		case OPCODE_SCALE_WITH_INDEPENDENT_XYZ_SCALE:
			printbyte ("Scale with independent XYZ", rec, reclen);
			break;
		case OPCODE_ROTATE_ABOUT_POINT_TRANSFORM:
			printbyte ("Rotate about Point Transform", rec, reclen);
			break;
		case OPCODE_ROTATE_AND_OR_SCALE_TRANSFORM:
			printbyte ("Rotate and/or Scale Transform", rec, reclen);
			break;
		case OPCODE_PUT_TRANSFORM:
			printbyte ("Put Transform", rec, reclen);
			break;
		case OPCODE_EYEPOINT_AND_TRACKPLANE_POSITION:
			printbyte ("Eyepoint and Trackplane Position", rec, reclen);
			break;
		case OPCODE_ROAD_SEGMENT:
			printbyte ("Road Segment", rec, reclen);
			break;
		case OPCODE_ROAD_ZONE:
			printbyte ("Road Zone", rec, reclen);
			break;
		case OPCODE_MORPHING_VERTEX_LIST:
			printbyte ("Morphing Vertex List", rec, reclen);
			break;
		case OPCODE_LINKAGE_RECORD:
			printbyte ("Linkage Record", rec, reclen);
			break;
		case OPCODE_SOUND_BEAD:
			printbyte ("Sound Bead", rec, reclen);
			break;
		case OPCODE_ROAD_PATH_BEAD:
			printbyte ("Road Path Bead", rec, reclen);
			break;
		case OPCODE_SOUND_PALETTE:
			printbyte ("Sound Palette", rec, reclen);
			break;
		case OPCODE_GENERAL_MATRIX_TRANSFORM:
			printbyte ("General Matrix Transform", rec, reclen);
			break;
		case OPCODE_TEXT_BEAD:
			printbyte ("Text Bead", rec, reclen);
			break;
		case OPCODE_SWITCH_BEAD:
			printbyte ("Switch Bead", rec, reclen);
			break;
		case OPCODE_LINE_STYLE_RECORD:
			printbyte ("Line Style Record", rec, reclen);
			break;
		case OPCODE_CLIPPING_QUADRILATERAL_BEAD:
			printbyte ("Clipping Quadrilateral Bead", rec, reclen);
			break;
		case OPCODE_LIGHT_SOURCE_RECORD:
			printbyte ("Light Source Record", rec, reclen);
			break;
		case OPCODE_LIGHT_SOURCE_PALETTE:
			printbyte ("Light Source Palette", rec, reclen);
			break;
		case OPCODE_DELAUNAY_HEADER:
			printbyte ("Delaunay Header", rec, reclen);
			break;
		case OPCODE_DELAUNAY_POINTS:
			printbyte ("Delaunay Points", rec, reclen);
			break;
		case OPCODE_BOUNDING_SPHERE:
			printbyte ("Bounding Sphere", rec, reclen);
			break;
		case OPCODE_BOUNDING_CYLINDER:
			printbyte ("Bounding Cylinder", rec, reclen);
			break;
		case OPCODE_BOUNDING_VOLUME_CENTER:
			printbyte ("Bounding Volume Center", rec, reclen);
			break;
		case OPCODE_BOUNDING_VOLUME_ORIENTATION:
			printbyte ("Bounding Volume Orientation", rec, reclen);
			break;
		case OPCODE_TEXTURE_MAPPING_PALETTE:
			printbyte ("Texture Mapping Palette", rec, reclen);
			break;
		case OPCODE_MATERIAL_PALETTE:
			printbyte ("Material Palette", rec, reclen);
			break;
		case OPCODE_COLOR_NAME_PALETTE:
			printbyte ("Color Name Palette", rec, reclen);
			break;
		case OPCODE_CONTINUOUSLY_ADAPTIVE_TERRAIN:
			printbyte ("Continuously Adaptive Terrain", rec, reclen);
			break;
		case OPCODE_CAT_DATA:
			printbyte ("CAT Data", rec, reclen);
			break;
		case OPCODE_PUSH_ATTRIBUTE:
			printbyte ("Push Attribute", rec, reclen);
			break;
		case OPCODE_POP_ATTRIBUTE:
			printbyte ("Pop Attribute", rec, reclen);
			break;

		default:
			printf ("Record type is unknown (%d), length is %d\n", rectype, reclen);
			printbyte ("Unsupported Type", rec, reclen);
			break;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -