📄 levelplus.cpp
字号:
/* 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 + -