244 lines
4.6 KiB
C
244 lines
4.6 KiB
C
#define TYPE_CHECKPOINT 100
|
|
|
|
#define TYPE_LOOP 30
|
|
|
|
#define TYPE_START_E 10
|
|
#define TYPE_START_W 11
|
|
#define TYPE_START_N 12
|
|
#define TYPE_START_S 13
|
|
|
|
#define TYPE_END 20
|
|
|
|
#define TYPE_TURBO_E 2
|
|
#define TYPE_TURBO_W 3
|
|
#define TYPE_TURBO_N 4
|
|
#define TYPE_TURBO_S 5
|
|
|
|
#define TYPE_CAR 1
|
|
#define TYPE_CAR_BODY 7
|
|
#define TYPE_CAR_BODY_SP 8
|
|
#define TYPE_BALANCIER 6
|
|
|
|
#define TURBO_POWA 0.5
|
|
|
|
#define IS_CAR_BODY(a) (((a)==TYPE_CAR_BODY) || ((a)==TYPE_CAR_BODY_SP))
|
|
|
|
typedef struct Grid
|
|
{
|
|
char state;
|
|
float x;
|
|
float y;
|
|
float z;
|
|
int rot;
|
|
int flags;
|
|
int obj;
|
|
} Grid;
|
|
|
|
typedef struct Box
|
|
{
|
|
char state;
|
|
float x;
|
|
float y;
|
|
float z;
|
|
float tx;
|
|
float ty;
|
|
float tz;
|
|
int type;
|
|
int id;
|
|
} Box;
|
|
|
|
#define MAX_ELEMS 4096
|
|
#define FACT 6
|
|
#define MOVE_X -5
|
|
#define MOVE_Y -3
|
|
#define MOVE_Z -1
|
|
|
|
Grid grid[MAX_ELEMS];
|
|
Box box[MAX_ELEMS];
|
|
char tdata[4096];
|
|
|
|
void extract_data(char *from, char *to_name, char *to_author, char *to_gold, char *to_author_time, char *message_file)
|
|
{
|
|
char d[4096];
|
|
int i,start,cpt;
|
|
|
|
message_file[0]=0;
|
|
|
|
strcpy(d,from);
|
|
cpt=0;
|
|
start=0;
|
|
for(i=0;i<=strlen(from);i++)
|
|
{
|
|
if(d[i]==';' || d[i]==0 || d[i]=='\r')
|
|
{
|
|
d[i]=0;
|
|
//printf("%i %s\n",cpt,d+start);
|
|
if(cpt==0)
|
|
strcpy(to_name,d+start);
|
|
if(cpt==1)
|
|
strcpy(to_author,d+start);
|
|
if(cpt==2)
|
|
strcpy(to_gold,d+start);
|
|
if(cpt==3)
|
|
strcpy(to_author_time,d+start);
|
|
if(cpt==4)
|
|
strcpy(message_file,d+start);
|
|
|
|
// finalize
|
|
cpt++;
|
|
start=i+1;
|
|
}
|
|
}
|
|
}
|
|
|
|
void dump_data_to(char *filename)
|
|
{
|
|
FILE *fp;
|
|
char d[5][512];
|
|
|
|
fp=fopen(filename,"wt");
|
|
if(!fp) { printf("cannot write to file \"%s\", fopen() failed\n",filename); return; }
|
|
|
|
fprintf(fp,"// generated track data (mania2)\n\n");
|
|
|
|
extract_data(tdata,d[0],d[1],d[2],d[3],d[4]);
|
|
fprintf(fp,"name=\"%s\";\n",d[0]);
|
|
fprintf(fp,"author=\"%s\";\n",d[1]);
|
|
fprintf(fp,"gold_time=%s;\n",d[2]);
|
|
fprintf(fp,"author_time=%s;\n",d[3]);
|
|
fprintf(fp,"message=\"%s\";\n",d[4]);
|
|
|
|
fprintf(fp,"\n// EOF\n");
|
|
fclose(fp);
|
|
printf("data file generated.\n");
|
|
}
|
|
|
|
|
|
// read mni file and generate .tri, .box and .dat
|
|
signed char mni_generate(char *filename)
|
|
{
|
|
FILE *in;
|
|
FILE *tri, *box;
|
|
char c;
|
|
char str[RAYDIUM_MAX_NAME_LEN];
|
|
float x,y,z;
|
|
float vx,vy,vz;
|
|
float rvx,rvy,rvz;
|
|
float nx,ny,nz;
|
|
float rnx,rny,rnz;
|
|
float tx,ty,tz;
|
|
int rot,flags,type;
|
|
int obj;
|
|
int i;
|
|
|
|
in=raydium_file_fopen(filename,"rt");
|
|
if(!in)
|
|
{
|
|
raydium_log("mni_gen: unable to open '%s'",filename);
|
|
return 0;
|
|
}
|
|
|
|
tri=fopen(raydium_file_home_path("mania.tri"),"wt");
|
|
if(!tri)
|
|
{
|
|
raydium_log("mni_gen: unable to create TRI file");
|
|
fclose(in);
|
|
return 0;
|
|
}
|
|
|
|
box=fopen(raydium_file_home_path("mania.box"),"wt");
|
|
if(!box)
|
|
{
|
|
raydium_log("mni_gen: unable to create BOX file");
|
|
fclose(in);
|
|
fclose(tri);
|
|
return 0;
|
|
}
|
|
|
|
unlink(raydium_file_home_path("mania.dat"));
|
|
|
|
fprintf(tri,"1\n");
|
|
while(1)
|
|
{
|
|
c=fgetc(in);
|
|
fgetc(in);
|
|
|
|
if(c==EOF) break;
|
|
|
|
switch(c)
|
|
{
|
|
case 'b':
|
|
fscanf(in,"%f %f %f %f %f %f %i\n", &x,
|
|
&y,
|
|
&z,
|
|
&tx,
|
|
&ty,
|
|
&tz,
|
|
&type);
|
|
x=x*FACT+MOVE_X;
|
|
y=y*FACT+MOVE_Y;
|
|
z=z*FACT+MOVE_Z;
|
|
tx=tx*FACT;
|
|
ty=ty*FACT;
|
|
tz=tz*FACT;
|
|
fprintf(box,"%f %f %f %f %f %f %i\n",x,y,z,tx,ty,tz,type);
|
|
break;
|
|
case 'g':
|
|
fscanf(in,"%f %f %f %i %i %s\n",&x,
|
|
&y,
|
|
&z,
|
|
&rot,
|
|
&flags,
|
|
str);
|
|
obj=raydium_object_find_load(str);
|
|
for(i=raydium_object_start[obj];i<raydium_object_end[obj];i++)
|
|
{
|
|
vx=raydium_vertex_x[i];
|
|
vy=raydium_vertex_y[i];
|
|
vz=raydium_vertex_z[i];
|
|
nx=raydium_vertex_normal_visu_x[i];
|
|
ny=raydium_vertex_normal_visu_y[i];
|
|
nz=raydium_vertex_normal_visu_z[i];
|
|
vx-=0.5;
|
|
vy-=0.5;
|
|
|
|
rvx=vx*raydium_trigo_cos(rot) - vy*raydium_trigo_sin(rot);
|
|
rvy=vx*raydium_trigo_sin(rot) + vy*raydium_trigo_cos(rot);
|
|
rvz=vz;
|
|
rnx=nx*raydium_trigo_cos(rot) - ny*raydium_trigo_sin(rot);
|
|
rny=nx*raydium_trigo_sin(rot) + ny*raydium_trigo_cos(rot);
|
|
rnz=nz;
|
|
|
|
rvx+=0.5;
|
|
rvy+=0.5;
|
|
rvx+=x;
|
|
rvy+=y;
|
|
rvz+=z;
|
|
rvx*=FACT;
|
|
rvy*=FACT;
|
|
rvz*=FACT;
|
|
rvx+=MOVE_X;
|
|
rvy+=MOVE_Y;
|
|
rvz+=MOVE_Z;
|
|
fprintf(tri,"%f %f %f %f %f %f %f %f %s\n",rvx,rvy,rvz,rnx,rny,rnz,raydium_vertex_texture_u[i],raydium_vertex_texture_v[i],raydium_texture_name[raydium_vertex_texture[i]]);
|
|
}
|
|
break;
|
|
case 'd':
|
|
fgets(tdata,4000,in);
|
|
if(tdata[strlen(tdata)-1]=='\n')
|
|
tdata[strlen(tdata)-1]=0;
|
|
dump_data_to(raydium_file_home_path("mania.dat"));
|
|
break;
|
|
default:
|
|
raydium_log("mni_gen: invalid track file (block type '%c' unknown)",c);
|
|
break;
|
|
}
|
|
} // end while
|
|
|
|
|
|
fclose(in);
|
|
fclose(tri);
|
|
fclose(box);
|
|
return 1;
|
|
}
|