adjust to match the expanded name.
[AROS-Contrib.git] / Games / Moria3D / Source / Level.c
blobe9239f92062258355f5fa5c5c80b798ddbe0bc03
1 /****************************************************************************
2 * *
3 * Level.C 970319 *
4 * *
5 * Level loaders *
6 * *
7 ****************************************************************************/
9 #include <stdio.h>
10 #include <string.h>
11 #include <stdlib.h>
13 #include "Clean.h"
14 #include "MyMath.h"
15 #include "Level.h"
17 /* Variables */
19 Missions MyMissions;
20 LevelData MyLevelData;
21 int16 MyPoints[8];
23 Color MyColor;
24 Fade MyFade;
25 pBot FirstUnusedBot=0;
27 /* Replace strtod1000() cause of bug */
29 fix strtod1000(char * MyStr, char ** EndStr)
31 return ((fix)strtol(MyStr,EndStr,10))/1000.0;
34 /* Parse a string from File */
35 /* No error checking yet */
37 int16 ParseFile(FILE *MyFile,char *Buffer)
39 int16 Error=0;
40 char *Pos;
41 char *Pos2;
42 char *Pos3;
44 fscanf(MyFile,"%s",Buffer);
46 Pos=Buffer;
48 if (feof(MyFile))
49 return 1;
50 else
52 if (*Pos==(char)34) /* Check for " and parse until " */
53 { /* Eliminate first " */
54 Pos2=Pos;
55 while (*(Pos2)!=(char)0)
57 *Pos2=*(Pos2+1);
58 Pos2++;
60 while (*Pos!=(char)34) /* Parse until " */
62 if (*Pos==(char)0)
64 *Pos=(char)32;
65 Pos++;
66 fscanf(MyFile,"%s",Pos);
68 else
69 Pos++;
71 while (*(Pos)!=(char)0) /* Eliminate second " */
73 *Pos=*(Pos+1);
74 Pos++;
77 else
79 while (*Pos!=(char)0) /* Check for `/''*` */
81 if ((*Pos=='/') && (*(Pos+1)=='*'))
83 Pos2=Pos; /* Remember start of comment */
84 Pos+=2;
85 while ((*Pos!='*') || (*(Pos+1)!='/'))
86 { /* parse until '*''/' */
87 if (*Pos==(char)0)
89 Pos=Pos2;
90 fscanf(MyFile,"%s",Pos);
92 else
93 Pos++;
95 Pos3=Pos+2; /* Eliminate Comment */
96 Pos=Pos2;
97 while (*Pos2!=(char)0)
99 *Pos2=*Pos3;
100 Pos2++;
101 Pos3++;
104 else
105 Pos++;
109 if ((*Buffer==(char)0)&&(Error==0))
110 return ParseFile(MyFile,Buffer);
111 else
112 return Error;
116 /* Parse Missionfile and build Mission Menu */
118 int16 LoadMissions(char *Name)
120 int16 Error=0;
121 char PadStr[512];
122 FILE *MissionFile = NULL;
123 pMission PosMission = NULL;
124 pLevel PosLevel = NULL;
126 MissionFile=fopen(Name,"r");
128 while (!feof(MissionFile))
130 if (!ParseFile(MissionFile,PadStr))
132 if (!strcmp(PadStr,"OnFile")) /* Parse loader helpers */
133 while (strcmp(PadStr,"OnFileEnd"))
135 ParseFile(MissionFile,PadStr);
137 else if (!strcmp(PadStr,"Missions")) /* Parse Missions */
138 while (strcmp(PadStr,"MissionsEnd"))
140 ParseFile(MissionFile,PadStr);
141 if (!strcmp(PadStr,"NumMissions:"))
143 ParseFile(MissionFile,PadStr);
144 MyMissions.Num=strtol(PadStr,0,0);
145 MyMissions.Missions=(pMission)MemAlloc((int32)(MyMissions.Num*sizeof(Mission)));
146 if (MyMissions.Missions==0)
148 printf("Not enough mem to alloc Missions\n");
149 /* To be considered */
151 PosMission=MyMissions.Missions;
153 else if (!strcmp(PadStr,"MissionsName:"))
155 ParseFile(MissionFile,PadStr);
156 strcpy(MyMissions.Name,PadStr);
158 else if (!strcmp(PadStr,"MissionsStorry:"))
160 ParseFile(MissionFile,PadStr);
161 if (*PadStr!='@')
163 MyMissions.Storry="MissionsStorry";
164 /* To be considered */
166 else
168 MyMissions.Storry="MissionsStorry";
169 /* To be considered */
173 else if (!strcmp(PadStr,"Mission")) /* parse Mission */
175 while (strcmp(PadStr,"MissionEnd"))
177 ParseFile(MissionFile,PadStr);
178 if (!strcmp(PadStr,"MissionName:"))
180 ParseFile(MissionFile,PadStr);
181 strcpy(PosMission->Name,PadStr);
183 else if (!strcmp(PadStr,"MissionStorry:"))
185 ParseFile(MissionFile,PadStr);
186 if (*PadStr!='@')
188 PosMission->Storry="MissionStorry";
189 /* To be considered */
191 else
193 PosMission->Storry="MissionStorry";
194 /* To be considered */
197 else if (!strcmp(PadStr,"NumLevels:"))
199 ParseFile(MissionFile,PadStr);
200 PosMission->Num=strtol(PadStr,0,0);
201 PosMission->Levels=(pLevel)MemAlloc((int32)(PosMission->Num*sizeof(Level)));
202 if (PosMission==0)
204 printf("Could not allocate mem for LevelNames\n");
205 /* To be considered */
207 PosLevel=PosMission->Levels;
209 else if (!strcmp(PadStr,"Level:"))
211 ParseFile(MissionFile,PadStr);
212 if (*PadStr!='@')
214 printf("Levelnames should have a leeding @\n");
215 /* To be considered */
217 else
219 strcpy((char *)PosLevel,PadStr+1);
220 PosLevel++;
225 PosMission++;
230 fclose(MissionFile);
232 return Error;
235 void ReadTextureFile(char * Name,pTexture Texture)
237 FILE * TextFile;
239 printf("Loading Texture :%s\n",Name);
241 TextFile=fopen(Name,"r");
243 if (TextFile != NULL)
245 Texture->TextureWidth = 256;
246 Texture->TextureHeight = 256;
247 fread(&Texture->ColMap,256,256,TextFile);
249 fclose(TextFile);
251 else
253 printf("Could not open Texture: %s\n",Name);
254 exit(10);
258 void LoadColors(char * Name,pColor MyColor)
260 FILE * ColFile;
261 int t;
262 uint32 *col;
263 uint8 bytes[4];
265 printf("Loading Colors...\n");
267 ColFile = fopen(Name,"r");
269 if (ColFile != NULL)
271 col = &MyColor->RGB[0][0];
273 for (t=0; t<256*3; t++)
275 fread(bytes,1,4,ColFile);
277 col[t] = (bytes[0] << 24) | (bytes[1] << 16) |
278 (bytes[2] << 8) | bytes[3];
281 fclose(ColFile);
283 else
285 printf("Could not open Colors:%s\n",Name);
286 exit(10);
290 void LoadFading(char * Name,pFade MyFade)
292 FILE * FadeFile;
294 printf("Loading Fading...\n");
296 FadeFile = fopen(Name,"r");
298 if (FadeFile != NULL)
300 fread(&MyFade->Col,256,256,FadeFile);
302 fclose(FadeFile);
304 else
306 printf("Could not open Fadeings:%s\n",Name);
307 exit(10);
310 int16 LoadLevel(char * Name)
312 int16 Error=0;
313 char PadStr[512];
314 FILE * LevelFile;
315 pPnt PosPoint = NULL;
316 pTexture PosTexture = NULL;
317 pSide PosSide = NULL;
318 pCube PosCube = NULL;
319 pPolygon PosPolygon = NULL;
320 pMesh PosMesh = NULL;
321 pBot PosBot = NULL;
322 int16 u,v;
324 LevelFile=fopen(Name,"r");
326 if (LevelFile != 0)
328 while (!feof(LevelFile))
330 ParseFile(LevelFile,PadStr);
331 if (!strcmp(PadStr,"Header"))
333 while(strcmp(PadStr,"HeaderEnd"))
335 ParseFile(LevelFile,PadStr);
336 /* To be considered */
337 if (!strcmp(PadStr,"Colors:"))
339 ParseFile(LevelFile,PadStr);
340 if (PadStr[0] != '@')
342 printf("Colors must be in a file!\n");
343 fclose(LevelFile);
344 exit(10);
346 else
348 LoadColors(&PadStr[1],&MyColor);
351 if (!strcmp(PadStr,"Fadeing:"))
353 ParseFile(LevelFile,PadStr);
354 if (PadStr[0] != '@')
356 printf("Fading must be in a file!\n");
357 fclose(LevelFile);
358 exit(10);
360 else
362 LoadFading(&PadStr[1],&MyFade);
365 if (!strcmp(PadStr,"Rings:"))
367 ParseFile(LevelFile,PadStr);
368 MyLevelData.NumRings = strtol(PadStr,0,0);
372 else if (!strcmp(PadStr,"Points"))
374 while(strcmp(PadStr,"PointsEnd"))
376 ParseFile(LevelFile,PadStr);
377 if (!strcmp(PadStr,"NumPoints:"))
379 ParseFile(LevelFile,PadStr);
380 MyLevelData.NumPoints=strtol(PadStr,0,0);
381 MyLevelData.Points=(pPnt)MemAlloc((int32)(MyLevelData.NumPoints*sizeof(Pnt)));
382 PosPoint=MyLevelData.Points;
384 else if (!strcmp(PadStr,"Point:"))
386 ParseFile(LevelFile,PadStr);
387 PosPoint->x=(fix)strtod1000(PadStr,0);
388 ParseFile(LevelFile,PadStr);
389 PosPoint->y=(fix)strtod1000(PadStr,0);
390 ParseFile(LevelFile,PadStr);
391 PosPoint->z=(fix)strtod1000(PadStr,0);
392 PosPoint++;
397 else if (!strcmp(PadStr,"Textures"))
399 while(strcmp(PadStr,"TexturesEnd"))
401 ParseFile(LevelFile,PadStr);
402 if (!strcmp(PadStr,"NumTextures:"))
404 ParseFile(LevelFile,PadStr);
405 MyLevelData.NumTextures=strtol(PadStr,0,0);
406 MyLevelData.Textures=(pTexture)MemAlloc((int32)(MyLevelData.NumTextures*sizeof(Texture)));
407 PosTexture=MyLevelData.Textures;
409 else if (!strcmp(PadStr,"Texture:"))
411 ParseFile(LevelFile,PadStr);
412 if (PadStr[0] != '@')
414 printf("Textures should be in a file\n");
415 exit(10);
417 else
419 ReadTextureFile(&PadStr[1],PosTexture);
421 PosTexture++;
426 else if (!strcmp(PadStr,"Sides"))
428 while(strcmp(PadStr,"SidesEnd"))
430 ParseFile(LevelFile,PadStr);
431 if (!strcmp(PadStr,"NumSides:"))
433 ParseFile(LevelFile,PadStr);
434 MyLevelData.NumSides=strtol(PadStr,0,0);
435 MyLevelData.Sides=(pSide)MemAlloc((int32)(MyLevelData.NumSides*sizeof(Side)));
436 PosSide=MyLevelData.Sides;
438 else if (!strcmp(PadStr,"Side:"))
440 ParseFile(LevelFile,PadStr);
441 if (strtol(PadStr,0,0) != 0)
443 PosSide->Back=&MyLevelData.Textures[strtol(PadStr,0,0)];
444 for (v=0;v<4;v++)
446 ParseFile(LevelFile,PadStr);
447 PosSide->BackPnts[v].x=strtod1000(PadStr,0);
448 ParseFile(LevelFile,PadStr);
449 PosSide->BackPnts[v].y=strtod1000(PadStr,0);
450 ParseFile(LevelFile,PadStr);
451 PosSide->BackPnts[v].z=strtod1000(PadStr,0);
454 else
456 PosSide->Back=0;
458 ParseFile(LevelFile,PadStr);
459 if (strtol(PadStr,0,0) != 0)
461 PosSide->Front=&MyLevelData.Textures[strtol(PadStr,0,0)];
462 for (v=0;v<4;v++)
464 ParseFile(LevelFile,PadStr);
465 PosSide->FrontPnts[v].x=strtod1000(PadStr,0);
466 ParseFile(LevelFile,PadStr);
467 PosSide->FrontPnts[v].y=strtod1000(PadStr,0);
468 ParseFile(LevelFile,PadStr);
469 PosSide->FrontPnts[v].z=strtod1000(PadStr,0);
472 else
474 PosSide->Front=0;
476 PosSide++;
481 else if (!strcmp(PadStr,"Cubes"))
483 while(strcmp(PadStr,"CubesEnd"))
485 ParseFile(LevelFile,PadStr);
486 if (!strcmp(PadStr,"NumCubes:"))
488 ParseFile(LevelFile,PadStr);
489 MyLevelData.NumCubes=strtol(PadStr,0,0);
490 MyLevelData.Cubes=(pCube)MemAlloc((int32)(MyLevelData.NumCubes*sizeof(Cube)));
491 PosCube=MyLevelData.Cubes;
493 else if (!strcmp(PadStr,"Cube:"))
495 PosCube->FirstBot=0;
497 for (v=0;v<8;v++) /* Read 8 Points */
499 ParseFile(LevelFile,PadStr);
500 MyPoints[v]=strtol(PadStr,0,0);
502 ParseFile(LevelFile,PadStr); /* Read Light */
503 PosCube->Light=strtod1000(PadStr,0);
505 for (v=0;v<6;v++) /* Read 6 Sides */
507 ParseFile(LevelFile,PadStr);
508 if (strtol(PadStr,0,0) != 0)
510 PosCube->Sides[v].Back=MyLevelData.Sides[strtol(PadStr,0,0)-1].Back;
511 PosCube->Sides[v].BackPnts[0]=MyLevelData.Sides[strtol(PadStr,0,0)-1].BackPnts[0];
512 PosCube->Sides[v].BackPnts[1]=MyLevelData.Sides[strtol(PadStr,0,0)-1].BackPnts[1];
513 PosCube->Sides[v].BackPnts[2]=MyLevelData.Sides[strtol(PadStr,0,0)-1].BackPnts[2];
514 PosCube->Sides[v].BackPnts[3]=MyLevelData.Sides[strtol(PadStr,0,0)-1].BackPnts[3];
515 PosCube->Sides[v].Front=MyLevelData.Sides[strtol(PadStr,0,0)-1].Front;
516 PosCube->Sides[v].FrontPnts[0]=MyLevelData.Sides[strtol(PadStr,0,0)-1].FrontPnts[0];
517 PosCube->Sides[v].FrontPnts[1]=MyLevelData.Sides[strtol(PadStr,0,0)-1].FrontPnts[1];
518 PosCube->Sides[v].FrontPnts[2]=MyLevelData.Sides[strtol(PadStr,0,0)-1].FrontPnts[2];
519 PosCube->Sides[v].FrontPnts[3]=MyLevelData.Sides[strtol(PadStr,0,0)-1].FrontPnts[3];
520 ParseFile(LevelFile,PadStr);
521 PosCube->Sides[v].Light=strtod1000(PadStr,0);
523 else
525 PosCube->Sides[v].Light=0.0;
526 PosCube->Sides[v].Back=0;
527 PosCube->Sides[v].Front=0;
529 switch (v) /* Insert Points depending on the side */
531 case 0:
533 PosCube->Sides[0].Pnts[0]=&MyLevelData.Points[MyPoints[SideFront0]-1];
534 PosCube->Sides[0].Pnts[1]=&MyLevelData.Points[MyPoints[SideFront1]-1];
535 PosCube->Sides[0].Pnts[2]=&MyLevelData.Points[MyPoints[SideFront2]-1];
536 PosCube->Sides[0].Pnts[3]=&MyLevelData.Points[MyPoints[SideFront3]-1];
538 case 1:
540 PosCube->Sides[1].Pnts[0]=&MyLevelData.Points[MyPoints[SideBack0]-1];
541 PosCube->Sides[1].Pnts[1]=&MyLevelData.Points[MyPoints[SideBack1]-1];
542 PosCube->Sides[1].Pnts[2]=&MyLevelData.Points[MyPoints[SideBack2]-1];
543 PosCube->Sides[1].Pnts[3]=&MyLevelData.Points[MyPoints[SideBack3]-1];
545 case 2:
547 PosCube->Sides[2].Pnts[0]=&MyLevelData.Points[MyPoints[SideLeft0]-1];
548 PosCube->Sides[2].Pnts[1]=&MyLevelData.Points[MyPoints[SideLeft1]-1];
549 PosCube->Sides[2].Pnts[2]=&MyLevelData.Points[MyPoints[SideLeft2]-1];
550 PosCube->Sides[2].Pnts[3]=&MyLevelData.Points[MyPoints[SideLeft3]-1];
552 case 3:
554 PosCube->Sides[3].Pnts[0]=&MyLevelData.Points[MyPoints[SideRight0]-1];
555 PosCube->Sides[3].Pnts[1]=&MyLevelData.Points[MyPoints[SideRight1]-1];
556 PosCube->Sides[3].Pnts[2]=&MyLevelData.Points[MyPoints[SideRight2]-1];
557 PosCube->Sides[3].Pnts[3]=&MyLevelData.Points[MyPoints[SideRight3]-1];
559 case 4:
561 PosCube->Sides[4].Pnts[0]=&MyLevelData.Points[MyPoints[SideTop0]-1];
562 PosCube->Sides[4].Pnts[1]=&MyLevelData.Points[MyPoints[SideTop1]-1];
563 PosCube->Sides[4].Pnts[2]=&MyLevelData.Points[MyPoints[SideTop2]-1];
564 PosCube->Sides[4].Pnts[3]=&MyLevelData.Points[MyPoints[SideTop3]-1];
566 case 5:
568 PosCube->Sides[5].Pnts[0]=&MyLevelData.Points[MyPoints[SideBottom0]-1];
569 PosCube->Sides[5].Pnts[1]=&MyLevelData.Points[MyPoints[SideBottom1]-1];
570 PosCube->Sides[5].Pnts[2]=&MyLevelData.Points[MyPoints[SideBottom2]-1];
571 PosCube->Sides[5].Pnts[3]=&MyLevelData.Points[MyPoints[SideBottom3]-1];
574 ParseFile(LevelFile,PadStr);
575 if (strtol(PadStr,0,0) != 0)
577 PosCube->Cubes[v]=&MyLevelData.Cubes[strtol(PadStr,0,0)-1];
579 else
581 PosCube->Cubes[v]=0;
583 CalcNormalToSide(&PosCube->Sides[v]);
585 PosCube++;
590 else if (!strcmp(PadStr,"Polygons"))
592 while(strcmp(PadStr,"PolygonsEnd"))
594 ParseFile(LevelFile,PadStr);
595 if (!strcmp(PadStr,"NumPolygons:"))
597 ParseFile(LevelFile,PadStr);
598 MyLevelData.NumPolygons=strtol(PadStr,0,0);
599 MyLevelData.Polygons=(pPolygon)MemAlloc((int32)(MyLevelData.NumPolygons*sizeof(Polygon)));
600 PosPolygon=MyLevelData.Polygons;
602 else if (!strcmp(PadStr,"Polygon:"))
604 /* Read NumPoints */
606 ParseFile(LevelFile,PadStr);
607 PosPolygon->NumPoints=strtol(PadStr,0,0);
609 /* Read Points */
611 for (u=0;u<PosPolygon->NumPoints;u++)
613 ParseFile(LevelFile,PadStr);
614 PosPolygon->Pnts[u].x=strtod1000(PadStr,0);
615 ParseFile(LevelFile,PadStr);
616 PosPolygon->Pnts[u].y=strtod1000(PadStr,0);
617 ParseFile(LevelFile,PadStr);
618 PosPolygon->Pnts[u].z=strtod1000(PadStr,0);
621 /* Read Normal */
623 ParseFile(LevelFile,PadStr);
624 PosPolygon->Normal.x=strtod1000(PadStr,0);
625 ParseFile(LevelFile,PadStr);
626 PosPolygon->Normal.y=strtod1000(PadStr,0);
627 ParseFile(LevelFile,PadStr);
628 PosPolygon->Normal.z=strtod1000(PadStr,0);
630 /* Read Textures */
632 ParseFile(LevelFile,PadStr);
634 if (strtol(PadStr,0,0) == 0)
636 PosPolygon->Back = 0;
638 else
640 PosPolygon->Back = &MyLevelData.Textures[strtol(PadStr,0,0)];
642 /* Read uvls´s */
644 for (u=0;u<4;u++)
646 ParseFile(LevelFile,PadStr);
647 PosPolygon->BackPnts[u].x=strtod1000(PadStr,0);
648 ParseFile(LevelFile,PadStr);
649 PosPolygon->BackPnts[u].y=strtod1000(PadStr,0);
650 ParseFile(LevelFile,PadStr);
651 PosPolygon->BackPnts[u].z=strtod1000(PadStr,0);
655 ParseFile(LevelFile,PadStr);
657 if (strtol(PadStr,0,0) == 0)
659 PosPolygon->Front = 0;
661 else
663 PosPolygon->Front = &MyLevelData.Textures[strtol(PadStr,0,0)];
665 /* Read uvls´s */
667 for (u=0;u<4;u++)
669 ParseFile(LevelFile,PadStr);
670 PosPolygon->FrontPnts[u].x=strtod1000(PadStr,0);
671 ParseFile(LevelFile,PadStr);
672 PosPolygon->FrontPnts[u].y=strtod1000(PadStr,0);
673 ParseFile(LevelFile,PadStr);
674 PosPolygon->FrontPnts[u].z=strtod1000(PadStr,0);
678 PosPolygon++;
682 else if (!strcmp(PadStr,"Meshes"))
684 while(strcmp(PadStr,"MeshesEnd"))
686 ParseFile(LevelFile,PadStr);
687 if (!strcmp(PadStr,"NumMeshes:"))
689 ParseFile(LevelFile,PadStr);
690 MyLevelData.NumMeshes=strtol(PadStr,0,0);
691 MyLevelData.Meshes=(pMesh)MemAlloc((int32)(MyLevelData.NumMeshes*sizeof(Mesh)));
692 PosMesh=MyLevelData.Meshes;
694 else if (!strcmp(PadStr,"Mesh:"))
696 /* Read NumPolygons */
698 ParseFile(LevelFile,PadStr);
699 PosMesh->NumPolygons=strtol(PadStr,0,0);
701 /* Read Polygons */
703 for (u=0;u<PosMesh->NumPolygons;u++)
705 /* Read Polygon */
707 ParseFile(LevelFile,PadStr);
708 PosMesh->Polygons[u] = &MyLevelData.Polygons[strtol(PadStr,0,0)-1];
710 ParseFile(LevelFile,PadStr);
711 PosMesh->Base[u].x=strtod1000(PadStr,0);
712 ParseFile(LevelFile,PadStr);
713 PosMesh->Base[u].y=strtod1000(PadStr,0);
714 ParseFile(LevelFile,PadStr);
715 PosMesh->Base[u].z=strtod1000(PadStr,0);
718 /* Read Light */
720 ParseFile(LevelFile,PadStr);
721 PosMesh->Light=strtod1000(PadStr,0);
723 PosMesh++;
727 else if (!strcmp(PadStr,"Bots"))
729 while(strcmp(PadStr,"BotsEnd"))
731 ParseFile(LevelFile,PadStr);
732 if (!strcmp(PadStr,"NumBots:"))
734 ParseFile(LevelFile,PadStr);
735 MyLevelData.NumBots=strtol(PadStr,0,0);
736 MyLevelData.Bots=(pBot)MemAlloc((int32)(MyLevelData.NumBots*sizeof(Bot)));
737 PosBot=MyLevelData.Bots;
739 MyLevelData.Bots[0].AbsPrev=0;
741 if (MyLevelData.NumBots >1)
743 MyLevelData.Bots[0].AbsNext=&MyLevelData.Bots[1];
744 for (u=1;u<MyLevelData.NumBots-1;u++)
746 MyLevelData.Bots[u].AbsNext = &MyLevelData.Bots[u+1];
747 MyLevelData.Bots[u].AbsPrev = &MyLevelData.Bots[u-1];
750 MyLevelData.Bots[MyLevelData.NumBots-1].AbsNext = 0;
751 MyLevelData.Bots[MyLevelData.NumBots-1].AbsPrev = &MyLevelData.Bots[MyLevelData.NumBots-2];
753 else
755 MyLevelData.Bots[0].AbsNext = 0;
758 else if (!strcmp(PadStr,"Bot:"))
760 PosBot->Next=0;
761 PosBot->Prev=0;
763 /* Read Position */
765 ParseFile(LevelFile,PadStr);
766 PosBot->Pos.x=strtod1000(PadStr,0);
767 ParseFile(LevelFile,PadStr);
768 PosBot->Pos.y=strtod1000(PadStr,0);
769 ParseFile(LevelFile,PadStr);
770 PosBot->Pos.z=strtod1000(PadStr,0);
772 /* Read Direction */
774 ParseFile(LevelFile,PadStr);
775 PosBot->Direction.a.x=strtod1000(PadStr,0);
776 ParseFile(LevelFile,PadStr);
777 PosBot->Direction.a.y=strtod1000(PadStr,0);
778 ParseFile(LevelFile,PadStr);
779 PosBot->Direction.a.z=strtod1000(PadStr,0);
781 ParseFile(LevelFile,PadStr);
782 PosBot->Direction.b.x=strtod1000(PadStr,0);
783 ParseFile(LevelFile,PadStr);
784 PosBot->Direction.b.y=strtod1000(PadStr,0);
785 ParseFile(LevelFile,PadStr);
786 PosBot->Direction.b.z=strtod1000(PadStr,0);
788 ParseFile(LevelFile,PadStr);
789 PosBot->Direction.c.x=strtod1000(PadStr,0);
790 ParseFile(LevelFile,PadStr);
791 PosBot->Direction.c.y=strtod1000(PadStr,0);
792 ParseFile(LevelFile,PadStr);
793 PosBot->Direction.c.z=strtod1000(PadStr,0);
795 /* Read Speed */
797 ParseFile(LevelFile,PadStr);
798 PosBot->Speed.x=strtod1000(PadStr,0);
799 ParseFile(LevelFile,PadStr);
800 PosBot->Speed.y=strtod1000(PadStr,0);
801 ParseFile(LevelFile,PadStr);
802 PosBot->Speed.z=strtod1000(PadStr,0);
804 /* Read Size */
806 ParseFile(LevelFile,PadStr);
807 PosBot->Size=strtod1000(PadStr,0);
809 /* Read Cube */
811 ParseFile(LevelFile,PadStr);
812 PosBot->Cube=&MyLevelData.Cubes[strtol(PadStr,0,0)-1];
814 if (PosBot->Cube->FirstBot != 0)
816 PosBot->Next = PosBot->Cube->FirstBot;
817 PosBot->Cube->FirstBot->Prev = PosBot;
820 PosBot->Cube->FirstBot = PosBot;
822 /* Read Type */
824 ParseFile(LevelFile,PadStr);
825 PosBot->Type=strtol(PadStr,0,0);
827 /* Read Light */
829 ParseFile(LevelFile,PadStr);
830 PosBot->Light=strtod1000(PadStr,0);
832 /* Read Mesh */
834 ParseFile(LevelFile,PadStr);
836 if (strtol(PadStr,0,0) == 0)
838 PosBot->Mesh=0;
840 else
842 PosBot->Mesh = &MyLevelData.Meshes[strtol(PadStr,0,0)-1];
845 PosBot->NumRings=0;
847 PosBot++;
853 fclose(LevelFile);
855 else
857 printf ("Failed to open LevelFile\n");
858 exit(10);
859 Error = (0==0);
862 return Error;