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

📄 levelplus.cpp

📁 一个96K的3D游戏源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*    LEVELPLUS.CPP
 *
 *  provides Level-Declarations & -operations for LevelEditor
 *
 * Copyright 2004 by PaP / JTMK
*/

#include "stdio.h"
#include "stdlib.h"
#include <string.h>
#include <stdarg.h>
#include <math.h>
#include <windows.h>
#include <conio.h>
#include "SystemIO.h"
#include "level.h"
#include "levelplus.h"
#include "Vectors.h"

long GetSectorPolys(tSector *Sector,bool WithSub,bool WithNext)
{
	long I=0;
	if(Sector==NULL) return(0);
	if((Sector->SubSector!=NULL)&&(WithSub)) I+=GetSectorPolys(Sector->SubSector,true,true);
	if((Sector->Next!=NULL)&&(WithNext)) I+=GetSectorPolys(Sector->Next,true,true);
	if(Sector->Mesh!=NULL) I+=CountPolys(Sector->Mesh->Poly);
	return(I);
}
/*
void SaveFloat(FILE *F,float *Temp)
{
		fwrite(Temp,sizeof(float),1,F);
}
void SaveLong(FILE *F,long *Temp)
{
		fwrite(Temp,sizeof(long),1,F);
}
void SaveShort(FILE *F,unsigned short *Temp)
{
		fwrite(Temp,sizeof(unsigned short),1,F);
}
void SaveChar(FILE *F,char *Temp)
{
		fwrite(Temp,sizeof(char),1,F);
}
void SavetP3D(FILE *F,tP3D *Temp)
{
	SaveFloat(F,&Temp->X);
	SaveFloat(F,&Temp->Y);
	SaveFloat(F,&Temp->Z);
}

void SaveCube(FILE *F,tCommand_Create_Cube *Temp)
{
	SaveChar(&Temp->PartsI);
	SaveFloat(&Temp->EckAmount);
}

void SavePlane(FILE *F,tCommand_Create_Plane *Temp)
{
	SaveChar(&Temp->PartsI);
	SaveFloat(&Temp->EckAmount);
}

void SaveKegel(FILE *F,tCommand_Create_Kegel *Temp)
{
	SaveChar(&Temp->BParts);
	SaveChar(&Temp->Parts);
	SaveChar(&Temp->Rings);
}

void SaveCylinder(FILE *F,tCommand_Create_Cylinder *Temp)
{
	SaveChar(&Temp->Parts);
	SaveChar(&Temp->Rings);

}
*/

void WriteFloat(FILE *F,float Val)
{
	fwrite((((unsigned char*)&Val)+1),sizeof(float)-1,1,F);
}
/*
void WriteInsertOpt(FILE *F,void *Data)
{
//	fwrite(&Val,sizeof(float)-1,1,F);
	tCommand_InsertOpt *Temp;
	unsigned char TempC;

	Temp=(tCommand_Insert_Opt*)Data;
//	fwrite((((unsigned char*)&Val)+1),sizeof(float)-1,1,F);
}
*/
void WriteRotateOpt(FILE *F,void *Data)
{
	tCommand_Rotate_Opt *Temp;
	unsigned char TempC,Status;
	float Fl;

	Temp=(tCommand_Rotate_Opt*)Data;

	Status=Temp->Dir;
	if((Temp->SNr>=0)&&(Temp->SNr<=255)) Status|=4;
	Fl=Temp->Amount;
	*(((unsigned char*)&Fl)+1)&=(unsigned char)(255-7);
	*(((unsigned char*)&Fl)+1)|=Status;

	WriteFloat(F,Fl);
	if(Status&4)
	{
		TempC=Temp->SNr;
		fwrite(&TempC,sizeof(unsigned char),1,F);
	} else {
		fwrite(&Temp->SNr,sizeof(unsigned short),1,F);
	}
}

void WriteMaterialOpt(FILE *F,void *Data)
{
	tCommand_Set_Material_Opt *Temp;
	unsigned char TempC,Status;
	float Fl;

	Temp=(tCommand_Set_Material_Opt*)Data;

	Status=Temp->TexType;
	TempC=Temp->Material;
	if((Temp->SNr>=0)&&(Temp->SNr<=255)) TempC|=128;

	fwrite(&TempC,sizeof(unsigned char),1,F);
	if(TempC&128)
	{
		TempC=Temp->SNr;
		fwrite(&TempC,sizeof(unsigned char),1,F);
	} else {
		fwrite(&Temp->SNr,sizeof(unsigned short),1,F);
	}

	Fl=Temp->Par1;
	*(((unsigned char*)&Fl)+1)&=(unsigned char)(255-7);
	*(((unsigned char*)&Fl)+1)|=Status;
	WriteFloat(F,Fl);
	WriteFloat(F,Temp->Par2);

}

void WriteCreateItemOpt(FILE *F,void *Data)
{
	tCommand_CreateItem_Opt *Temp;
	unsigned char TempC,Status;
	float Fl;

	Temp=(tCommand_CreateItem_Opt*)Data;

	WriteFloat(F,Temp->Pos.X);
	WriteFloat(F,Temp->Pos.Y);
	WriteFloat(F,Temp->Pos.Z);
	fwrite(&Temp->Flags,sizeof(unsigned char),1,F);
	fwrite(&Temp->Attr,sizeof(unsigned char),1,F);
}

void WriteAttrOpt(FILE *F,void *Data)
{
	tCommand_Change_Attributes_Opt *Temp;
	unsigned char TempC;

	Temp=(tCommand_Change_Attributes_Opt*)Data;

	fwrite(&Temp->Content,sizeof(unsigned char),1,F);
	if(Temp->Content&128)
	{
		TempC=Temp->Nr;
		fwrite(&TempC,sizeof(unsigned char),1,F);
	} else {
		fwrite(&Temp->Nr,sizeof(unsigned short),1,F);
	}
	
	if(Flag(Temp->Content,1)) WriteFloat(F,Temp->Pos.X);
	if(Flag(Temp->Content,2)) WriteFloat(F,Temp->Pos.Y);
	if(Flag(Temp->Content,4)) WriteFloat(F,Temp->Pos.Z);
	if(Flag(Temp->Content,8)) WriteFloat(F,Temp->Size.X);
	if(Flag(Temp->Content,16)) WriteFloat(F,Temp->Size.Y);
	if(Flag(Temp->Content,32)) WriteFloat(F,Temp->Size.Z);
	if(Flag(Temp->Content,64)) WriteFloat(F,Temp->SizeMul);
/*
	if(Flag(Temp->Content,1)) fwrite(&Temp->Pos.X,sizeof(float),1,F);
	if(Flag(Temp->Content,2)) fwrite(&Temp->Pos.Y,sizeof(float),1,F);
	if(Flag(Temp->Content,4)) fwrite(&Temp->Pos.Z,sizeof(float),1,F);
	if(Flag(Temp->Content,8)) fwrite(&Temp->Size.X,sizeof(float),1,F);
	if(Flag(Temp->Content,16)) fwrite(&Temp->Size.Y,sizeof(float),1,F);
	if(Flag(Temp->Content,32)) fwrite(&Temp->Size.Z,sizeof(float),1,F);
	if(Flag(Temp->Content,64)) fwrite(&Temp->SizeMul,sizeof(float),1,F);
*/
}

void WriteMoveVertOpt(FILE *F,void *Data)
{
	tCommand_Move_Vertice_With_Radius_Opt *Temp;
	Temp=(tCommand_Move_Vertice_With_Radius_Opt*)Data;

	unsigned char Status=Temp->SubDivs;
	unsigned char TempC;

	if((Temp->SNr>=0)&&(Temp->SNr<=255)) Status|=8;
	if((Temp->VNr>=0)&&(Temp->VNr<=255)) Status|=16;
	if(Temp->Vek.X!=0) Status|=32;
	if(Temp->Vek.Y!=0) Status|=64;
	if(Temp->Vek.Z!=0) Status|=128;

	fwrite(&Status,sizeof(unsigned char),1,F);
	if(Status&8)
	{
		TempC=Temp->SNr;
		fwrite(&TempC,sizeof(unsigned char),1,F);
	} else {
		fwrite(&Temp->SNr,sizeof(unsigned short),1,F);
	}
	if(Status&16)
	{
		TempC=Temp->VNr;
		fwrite(&TempC,sizeof(unsigned char),1,F);
	} else {
		fwrite(&Temp->VNr,sizeof(unsigned short),1,F);
	}
	if(Status&32) WriteFloat(F,Temp->Vek.X);
	if(Status&64) WriteFloat(F,Temp->Vek.Y);
	if(Status&128) WriteFloat(F,Temp->Vek.Z);
	WriteFloat(F,Temp->Radius);
/*
	if(Status&32) fwrite(&Temp->Vek.X,sizeof(float),1,F);
	if(Status&64) fwrite(&Temp->Vek.Y,sizeof(float),1,F);
	if(Status&128) fwrite(&Temp->Vek.Z,sizeof(float),1,F);
	fwrite(&Temp->Radius,sizeof(float),1,F);
*/
/*
	fwrite(&Temp->Nr,sizeof(unsigned short),1,F);
	fwrite(&Temp->Content,sizeof(unsigned char),1,F);

	if(Flag(Temp->Content,1)) fwrite(&Temp->Pos.X,sizeof(float),1,F);
	if(Flag(Temp->Content,2)) fwrite(&Temp->Pos.Y,sizeof(float),1,F);
	if(Flag(Temp->Content,4)) fwrite(&Temp->Pos.Z,sizeof(float),1,F);
	if(Flag(Temp->Content,8)) fwrite(&Temp->Size.X,sizeof(float),1,F);
	if(Flag(Temp->Content,16)) fwrite(&Temp->Size.Y,sizeof(float),1,F);
	if(Flag(Temp->Content,32)) fwrite(&Temp->Size.Z,sizeof(float),1,F);
	if(Flag(Temp->Content,64)) fwrite(&Temp->SizeMul,sizeof(float),1,F);
*/
}


void SaveLevel(char *fname,tCommand *CommandList)
{
		
	long I,K;
	char M;
	tCommand *Temp;
	char Ch;

	FILE *F;
	fpos_t Pos;
	if(strchr(fname,'.')==NULL) 
		strcat(fname,".bcl");
	F=fopen(fname,"wb");
	Temp=CommandList;
	while(Temp!=NULL)
	{
		fwrite(&Temp->Type,sizeof(char),1,F);

		if(Temp->Type==_Command_Cube) fwrite(Temp->Data,sizeof(tCommand_Create_Cube),1,F);
		if(Temp->Type==_Command_Cube_Opt) fwrite(Temp->Data,sizeof(tCommand_Create_Cube_Opt),1,F);
		if(Temp->Type==_Command_Change_Attributes) fwrite(Temp->Data,sizeof(tCommand_Change_Attributes),1,F);
		if(Temp->Type==_Command_Change_Attributes_Opt) WriteAttrOpt(F,Temp->Data);
		if(Temp->Type==_Command_Move_Vertice_With_Radius) fwrite(Temp->Data,sizeof(tCommand_Move_Vertice_With_Radius),1,F);
		if(Temp->Type==_Command_Move_Vertice_With_Radius_Opt) WriteMoveVertOpt(F,Temp->Data);
		if(Temp->Type==_Command_Clone) fwrite(Temp->Data,sizeof(tCommand_Clone),1,F);
		if(Temp->Type==_Command_Clone2) fwrite(Temp->Data,sizeof(tCommand_Clone2),1,F);
		if(Temp->Type==_Command_MoveMitte) fwrite(Temp->Data,sizeof(tCommand_MoveMitte),1,F);
		if(Temp->Type==_Command_CreateItem) fwrite(Temp->Data,sizeof(tCommand_CreateItem),1,F);
		if(Temp->Type==_Command_CreateItem_Opt) WriteCreateItemOpt(F,Temp->Data);
		if(Temp->Type==_Command_Rotate) fwrite(Temp->Data,sizeof(tCommand_Rotate),1,F);
//		if(Temp->Type==_Command_Rotate_Opt) fwrite(Temp->Data,sizeof(tCommand_Rotate_Opt),1,F);
		if(Temp->Type==_Command_Rotate_Opt) WriteRotateOpt(F,Temp->Data);
		if(Temp->Type==_Command_Make_Sub) fwrite(Temp->Data,sizeof(tCommand_Make_Sub),1,F);
		if(Temp->Type==_Command_Make_Sub2) fwrite(Temp->Data,sizeof(tCommand_Make_Sub2),1,F);
		if(Temp->Type==_Command_Merge) fwrite(Temp->Data,sizeof(tCommand_Merge),1,F);
		if(Temp->Type==_Command_ChangeFlags) fwrite(Temp->Data,sizeof(tCommand_ChangeFlags),1,F);
		if(Temp->Type==_Command_ChangeFlags_Opt) fwrite(Temp->Data,sizeof(tCommand_ChangeFlags_Opt),1,F);
		if(Temp->Type==_Command_InsertLevel) fwrite(Temp->Data,sizeof(tCommand_InsertLevel),1,F);
		if(Temp->Type==_Command_Insert_Opt) fwrite(Temp->Data,sizeof(tCommand_InsertOpt),1,F);
		if(Temp->Type==_Command_Create_Plane) fwrite(Temp->Data,sizeof(tCommand_Create_Plane),1,F);
		if(Temp->Type==_Command_Create_Kegel) fwrite(Temp->Data,sizeof(tCommand_Create_Kegel),1,F);

⌨️ 快捷键说明

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