/******************************************************************** FILENAME: VIEW_IO.CPP AUTHOR : JAKE HILL DATE : 12/1/94 Copyright (c) 1994 by Jake Hill: If you use any part of this code in your own project, please credit me in your documentation and source code. Thanks. ********************************************************************/ #include "VIEW.HPP" #include "TRIG.HPP" #include #include // int86 #include #include // kbhit, getch #include // printf #include #include // exit // Some more yucky global variables. short NumThings; short NumSegs; short NumSides; short NumLines; short NumNodes; short NumSectors; short NumSSectors; short NumVertexes; short BlockmapSize; // Sets the graphics mode. void setmode(unsigned short n) { union REGS inregs, outregs; inregs.x.ax = n; int86(0x10, &inregs, &outregs); }; // This function opens the wadfile, determines if it is a PWAD // or an IWAD, then reads in the resources for THINGS, LINES, SIDES, // VERTEXES, SEGS, SSECTORS, NODES, and SECTORS. void View::OpenWad(char *WadName, long Level) { int handle; short EntriesRead = 0; unsigned long EntryOffset = 0; WAD_Header HEADER; Directory_Entry DIRECTORY; handle = open( WadName ,O_BINARY|O_RDONLY); if (handle == (-1)) { printf("ERROR:Could not open file %s.\n",WadName); exit(-1); } read(handle, &HEADER, sizeof(WAD_Header)); if ( strnicmp(HEADER.signature, "IWAD", 4) == 0 ) { printf("Reading IWAD file.\n"); // We need to skip past the PLAYPAL, and DEMO stuff if in an IWAD. HEADER.foffset += 6L * sizeof(Directory_Entry); } else if ( strnicmp(HEADER.signature, "PWAD", 4) == 0 ) { printf("Reading PWAD file.\n"); } else { printf("This is not a valid WAD file!\n"); exit(-1); } printf("This file contains %d directory entries.\n\n", HEADER.num_entries); EntryOffset += HEADER.foffset + (Level*11L*sizeof(Directory_Entry)); while ( EntriesRead < 11 ) { lseek(handle, EntryOffset, SEEK_SET); read(handle, &DIRECTORY, sizeof(Directory_Entry)); if ( strnicmp( DIRECTORY.name, "THINGS", 6 ) == 0 ) LoadThings( &DIRECTORY, handle ); else if ( strnicmp( DIRECTORY.name, "LINEDEFS", 8 ) == 0 ) LoadLines( &DIRECTORY, handle ); else if ( strnicmp( DIRECTORY.name, "SIDEDEFS", 8 ) == 0 ) LoadSides( &DIRECTORY, handle ); else if ( strnicmp( DIRECTORY.name, "VERTEXES", 8 ) == 0 ) LoadVertexes( &DIRECTORY, handle ); else if ( strnicmp( DIRECTORY.name, "SEGS", 4 ) == 0 ) LoadSegs( &DIRECTORY, handle ); else if ( strnicmp( DIRECTORY.name, "SSECTORS", 8 ) == 0 ) LoadSSectors( &DIRECTORY, handle ); else if ( strnicmp( DIRECTORY.name, "NODES", 5 ) == 0 ) LoadNodes( &DIRECTORY, handle ); else if ( strnicmp( DIRECTORY.name, "SECTORS", 7 ) == 0 ) LoadSectors( &DIRECTORY, handle ); else printf("Skipping %8s.\n",DIRECTORY.name); EntriesRead++; EntryOffset += sizeof( Directory_Entry ); } printf("Allocated memory for arrays...\n"); close(handle); InitTrig(); printf("Press Any key to continue...\n"); while ( !kbhit() ); getch(); setmode(19); }; // All of the following procedures read in the indicated // resource from a WAD file pointed to by handle. void View::LoadThings( Directory_Entry *Dir, int handle ) { float angle; NumThings = (short) (Dir->size / sizeof(thing)); thing *Thing_Array = new thing [ NumThings ]; lseek(handle, Dir->foffset, SEEK_SET); read(handle, Thing_Array, (unsigned int) Dir->size); for (short i=0; isize / sizeof(seg)); Seg_Array = new seg [ NumSegs ]; lseek(handle, Dir->foffset, SEEK_SET); read(handle, Seg_Array, (unsigned int) Dir->size); printf("SEGS : %d\n", NumSegs); } void View::LoadSides( Directory_Entry *Dir, int handle ) { NumSides = (short) Dir->size/sizeof(side); Side_Array = new side [ NumSides ]; lseek(handle, Dir->foffset, SEEK_SET); read(handle, Side_Array, (unsigned int) Dir->size); printf("SIDEDEFS : %d\n", NumSides); } void View::LoadLines( Directory_Entry *Dir, int handle ) { NumLines = (short) (Dir->size / sizeof(line)); Line_Array = new line [ NumLines ]; lseek(handle, Dir->foffset, SEEK_SET); read(handle, Line_Array, (unsigned int)Dir->size); printf("LINEDEFS : %d\n", NumLines); } void View::LoadNodes( Directory_Entry *Dir, int handle ) { NumNodes = (short) Dir->size/sizeof(node); Node_Array = new node [ NumNodes ]; PNode_Array = new node * [ NumNodes ]; MaxNode = NumNodes - 1; lseek(handle, Dir->foffset, SEEK_SET); read(handle, Node_Array, (unsigned int) Dir->size); for (int i=0; isize/sizeof(sector); Sector_Array = new sector [ NumSectors ]; lseek(handle, Dir->foffset, SEEK_SET); read(handle, Sector_Array, (unsigned int) Dir->size); printf("SECTORS : %d\n", NumSectors); } void View::LoadVertexes( Directory_Entry *Dir, int handle ) { NumVertexes = (short) Dir->size/sizeof(vertex); Vertex_Array = new vertex [ NumVertexes ]; lseek(handle, Dir->foffset, SEEK_SET); read(handle, Vertex_Array, (unsigned int) Dir->size); printf("VERTEXES : %d\n", NumVertexes); } void View::LoadSSectors( Directory_Entry *Dir, int handle ) { NumSSectors = (short) Dir->size/sizeof(ssector); SSector_Array = new ssector [ NumSSectors ]; lseek(handle, Dir->foffset, SEEK_SET); read(handle, SSector_Array, (unsigned int) Dir->size); printf("SSECTORS : %d\n", NumSSectors); } // Returns the screen mode to normal text. void View::Close(void) { setmode(3); };