void CSegment::ReadExtras (CFile& cf) { m_nType = cf.ReadByte (); m_nMatCen = cf.ReadByte (); m_value = cf.ReadByte (); m_flags = cf.ReadByte (); m_xAvgSegLight = cf.ReadFix (); }
/* * reads a descent 1 tPIGBitmapHeader structure from a CFile */ void PIGBitmapHeaderD1Read (tPIGBitmapHeader *dbh, CFile& cf) { cf.Read (dbh->name, 8, 1); dbh->dflags = cf.ReadByte (); dbh->width = cf.ReadByte (); dbh->height = cf.ReadByte (); dbh->wh_extra = 0; dbh->flags = cf.ReadByte (); dbh->bmAvgColor = cf.ReadByte (); dbh->offset = cf.ReadInt (); }
void CSegment::ReadType (CFile& cf, ubyte flags) { if (flags & (1 << MAX_SIDES_PER_SEGMENT)) { m_nType = cf.ReadByte (); m_nMatCen = cf.ReadByte (); m_value = char (cf.ReadShort ()); } else { m_nType = 0; m_nMatCen = -1; m_value = 0; } }
void CSegment::Read (CFile& cf) { #if DBG if (Index () == nDbgSeg) nDbgSeg = nDbgSeg; #endif if (gameStates.app.bD2XLevel) { m_owner = cf.ReadByte (); m_group = cf.ReadByte (); } else { m_owner = -1; m_group = -1; } ubyte flags = bNewFileFormat ? cf.ReadByte () : 0x7f; if (gameData.segs.nLevelVersion == 5) { // d2 SHAREWARE level ReadType (cf, flags); ReadVerts (cf); ReadChildren (cf, flags); } else { ReadChildren (cf, flags); ReadVerts (cf); if (gameData.segs.nLevelVersion <= 1) { // descent 1 level ReadType (cf, flags); } } m_objects = -1; if (gameData.segs.nLevelVersion <= 5) // descent 1 thru d2 SHAREWARE level m_xAvgSegLight = fix (cf.ReadShort ()) << 4; // Read the walls as a 6 byte array flags = bNewFileFormat ? cf.ReadByte () : 0x3f; int i; for (i = 0; i < MAX_SIDES_PER_SEGMENT; i++) m_sides [i].ReadWallNum (cf, (flags & (1 << i)) != 0); ushort sideVerts [4]; for (i = 0; i < MAX_SIDES_PER_SEGMENT; i++) { ::GetCorners (Index (), i, sideVerts); m_sides [i].Read (cf, sideVerts, m_children [i] == -1); } }
void ReadColor (CFile& cf, tFaceColor *pc, int bFloatData, int bRegisterColor) { pc->index = cf.ReadByte (); if (bFloatData) { tRgbColord c; cf.Read (&c, sizeof (c), 1); pc->color.red = (float) c.red; pc->color.green = (float) c.green; pc->color.blue = (float) c.blue; } else { int c = cf.ReadInt (); pc->color.red = (float) c / (float) 0x7fffffff; c = cf.ReadInt (); pc->color.green = (float) c / (float) 0x7fffffff; c = cf.ReadInt (); pc->color.blue = (float) c / (float) 0x7fffffff; } if (bRegisterColor && (((pc->color.red > 0) && (pc->color.red < 1)) || ((pc->color.green > 0) && (pc->color.green < 1)) || ((pc->color.blue > 0) && (pc->color.blue < 1)))) gameStates.render.bColored = 1; pc->color.alpha = 1; }
void CTrigger::LoadState (CFile& cf, bool bObjTrigger) { m_info.nType = (ubyte) cf.ReadByte (); if (bObjTrigger && (saveGameManager.Version () >= 41)) m_info.flags = cf.ReadShort (); else m_info.flags = short (cf.ReadByte ()); m_info.nLinks = cf.ReadByte (); m_info.value = cf.ReadFix (); m_info.time = cf.ReadFix (); for (int i = 0; i < MAX_TRIGGER_TARGETS; i++) { m_info.segments [i] = cf.ReadShort (); m_info.sides [i] = cf.ReadShort (); } m_info.nChannel = -1; m_info.tOperated = (saveGameManager.Version () < 44) ? -1 : cf.ReadFix (); }
/* * reads n tTexMapInfo structs from a CFile */ int ReadTMapInfoN (CArray<tTexMapInfo>& ti, int n, CFile& cf) { int i; for (i = 0;i < n;i++) { ti [i].flags = cf.ReadByte (); ti [i].pad [0] = cf.ReadByte (); ti [i].pad [1] = cf.ReadByte (); ti [i].pad [2] = cf.ReadByte (); ti [i].lighting = cf.ReadFix (); ti [i].damage = cf.ReadFix (); ti [i].nEffectClip = cf.ReadShort (); ti [i].destroyed = cf.ReadShort (); ti [i].slide_u = cf.ReadShort (); ti [i].slide_v = cf.ReadShort (); } return i; }
int ReadTMapInfoND1 (tTexMapInfo *ti, int n, CFile& cf) { int i; for (i = 0;i < n;i++) { cf.Seek (13, SEEK_CUR);// skip filename ti [i].flags = cf.ReadByte (); ti [i].lighting = cf.ReadFix (); ti [i].damage = cf.ReadFix (); ti [i].nEffectClip = cf.ReadInt (); } return i; }
void CObject::Read (CFile& cf) { #if DBG if (OBJ_IDX (this) == nDbgObj) nDbgObj = nDbgObj; #endif info.nType = cf.ReadByte (); info.nId = cf.ReadByte (); info.controlType = cf.ReadByte (); info.movementType = cf.ReadByte (); info.renderType = cf.ReadByte (); info.nFlags = cf.ReadByte (); info.nSegment = cf.ReadShort (); info.nAttachedObj = -1; cf.ReadVector (info.position.vPos); cf.ReadMatrix (info.position.mOrient); info.xSize = cf.ReadFix (); info.xShields = cf.ReadFix (); cf.ReadVector (info.vLastPos); info.contains.nType = cf.ReadByte (); info.contains.nId = cf.ReadByte (); info.contains.nCount = cf.ReadByte (); switch (info.movementType) { case MT_PHYSICS: cf.ReadVector (mType.physInfo.velocity); cf.ReadVector (mType.physInfo.thrust); mType.physInfo.mass = cf.ReadFix (); mType.physInfo.drag = cf.ReadFix (); mType.physInfo.brakes = cf.ReadFix (); cf.ReadVector (mType.physInfo.rotVel); cf.ReadVector (mType.physInfo.rotThrust); mType.physInfo.turnRoll = cf.ReadFixAng (); mType.physInfo.flags = cf.ReadShort (); break; case MT_SPINNING: cf.ReadVector (mType.spinRate); break; case MT_NONE: break; default: Int3(); } int i; switch (info.controlType) { case CT_AI: cType.aiInfo.behavior = cf.ReadByte (); for (i = 0; i < MAX_AI_FLAGS; i++) cType.aiInfo.flags [i] = cf.ReadByte (); cType.aiInfo.nHideSegment = cf.ReadShort (); cType.aiInfo.nHideIndex = cf.ReadShort (); cType.aiInfo.nPathLength = cf.ReadShort (); cType.aiInfo.nCurPathIndex = (char) cf.ReadShort (); if (gameTopFileInfo.fileinfoVersion <= 25) { cf.ReadShort (); // cType.aiInfo.follow_path_start_seg = cf.ReadShort (); // cType.aiInfo.follow_path_end_seg = } break; case CT_EXPLOSION: cType.explInfo.nSpawnTime = cf.ReadFix (); cType.explInfo.nDeleteTime = cf.ReadFix (); cType.explInfo.nDeleteObj = cf.ReadShort (); cType.explInfo.attached.nNext = cType.explInfo.attached.nPrev = cType.explInfo.attached.nParent = -1; break; case CT_WEAPON: //do I really need to read these? Are they even saved to disk? cType.laserInfo.parent.nType = cf.ReadShort (); cType.laserInfo.parent.nObject = cf.ReadShort (); cType.laserInfo.parent.nSignature = cf.ReadInt (); break; case CT_LIGHT: cType.lightInfo.intensity = cf.ReadFix (); break; case CT_POWERUP: if (gameTopFileInfo.fileinfoVersion >= 25) cType.powerupInfo.nCount = cf.ReadInt (); else cType.powerupInfo.nCount = 1; if (info.nId == POW_VULCAN) cType.powerupInfo.nCount = VULCAN_WEAPON_AMMO_AMOUNT; else if (info.nId == POW_GAUSS) cType.powerupInfo.nCount = VULCAN_WEAPON_AMMO_AMOUNT; else if (info.nId == POW_OMEGA) cType.powerupInfo.nCount = MAX_OMEGA_CHARGE; break; case CT_NONE: case CT_FLYING: case CT_DEBRIS: break; case CT_SLEW: //the CPlayerData is generally saved as slew break; case CT_CNTRLCEN: break; case CT_MORPH: case CT_FLYTHROUGH: case CT_REPAIRCEN: default: Int3(); } switch (info.renderType) { case RT_NONE: break; case RT_MORPH: case RT_POLYOBJ: { rType.polyObjInfo.nModel = cf.ReadInt (); for (int i = 0; i <MAX_SUBMODELS; i++) cf.ReadAngVec(rType.polyObjInfo.animAngles [i]); rType.polyObjInfo.nSubObjFlags = cf.ReadInt (); int tmo = cf.ReadInt (); rType.polyObjInfo.nTexOverride = tmo; rType.polyObjInfo.nAltTextures = 0; break; } case RT_WEAPON_VCLIP: case RT_HOSTAGE: case RT_POWERUP: case RT_FIREBALL: rType.vClipInfo.nClipIndex = cf.ReadInt (); rType.vClipInfo.xFrameTime = cf.ReadFix (); rType.vClipInfo.nCurFrame = cf.ReadByte (); break; case RT_THRUSTER: case RT_LASER: break; case RT_SMOKE: rType.particleInfo.nLife = cf.ReadInt (); rType.particleInfo.nSize [0] = cf.ReadInt (); rType.particleInfo.nParts = cf.ReadInt (); rType.particleInfo.nSpeed = cf.ReadInt (); rType.particleInfo.nDrift = cf.ReadInt (); rType.particleInfo.nBrightness = cf.ReadInt (); rType.particleInfo.color.red = cf.ReadByte (); rType.particleInfo.color.green = cf.ReadByte (); rType.particleInfo.color.blue = cf.ReadByte (); rType.particleInfo.color.alpha = cf.ReadByte (); rType.particleInfo.nSide = cf.ReadByte (); if (gameData.segs.nLevelVersion < 18) rType.particleInfo.nType = 0; else rType.particleInfo.nType = cf.ReadByte (); break; case RT_LIGHTNING: rType.lightningInfo.nLife = cf.ReadInt (); rType.lightningInfo.nDelay = cf.ReadInt (); rType.lightningInfo.nLength = cf.ReadInt (); rType.lightningInfo.nAmplitude = cf.ReadInt (); rType.lightningInfo.nOffset = cf.ReadInt (); rType.lightningInfo.nLightnings = cf.ReadShort (); rType.lightningInfo.nId = cf.ReadShort (); rType.lightningInfo.nTarget = cf.ReadShort (); rType.lightningInfo.nNodes = cf.ReadShort (); rType.lightningInfo.nChildren = cf.ReadShort (); rType.lightningInfo.nSteps = cf.ReadShort (); rType.lightningInfo.nAngle = cf.ReadByte (); rType.lightningInfo.nStyle = cf.ReadByte (); rType.lightningInfo.nSmoothe = cf.ReadByte (); rType.lightningInfo.bClamp = cf.ReadByte (); rType.lightningInfo.bPlasma = cf.ReadByte (); rType.lightningInfo.bSound = cf.ReadByte (); rType.lightningInfo.bRandom = cf.ReadByte (); rType.lightningInfo.bInPlane = cf.ReadByte (); rType.lightningInfo.color.red = cf.ReadByte (); rType.lightningInfo.color.green = cf.ReadByte (); rType.lightningInfo.color.blue = cf.ReadByte (); rType.lightningInfo.color.alpha = cf.ReadByte (); break; default: Int3(); } }
void CObject::LoadState (CFile& cf) { info.nSignature = cf.ReadInt (); info.nType = (ubyte) cf.ReadByte (); info.nId = (ubyte) cf.ReadByte (); info.nNextInSeg = cf.ReadShort (); info.nPrevInSeg = cf.ReadShort (); info.controlType = (ubyte) cf.ReadByte (); info.movementType = (ubyte) cf.ReadByte (); info.renderType = (ubyte) cf.ReadByte (); info.nFlags = (ubyte) cf.ReadByte (); info.nSegment = cf.ReadShort (); info.nAttachedObj = cf.ReadShort (); cf.ReadVector (info.position.vPos); cf.ReadMatrix (info.position.mOrient); info.xSize = cf.ReadFix (); info.xShields = cf.ReadFix (); cf.ReadVector (info.vLastPos); info.contains.nType = cf.ReadByte (); info.contains.nId = cf.ReadByte (); info.contains.nCount = cf.ReadByte (); info.nCreator = cf.ReadByte (); info.xLifeLeft = cf.ReadFix (); if (info.movementType == MT_PHYSICS) { cf.ReadVector (mType.physInfo.velocity); cf.ReadVector (mType.physInfo.thrust); mType.physInfo.mass = cf.ReadFix (); mType.physInfo.drag = cf.ReadFix (); mType.physInfo.brakes = cf.ReadFix (); cf.ReadVector (mType.physInfo.rotVel); cf.ReadVector (mType.physInfo.rotThrust); mType.physInfo.turnRoll = cf.ReadFixAng (); mType.physInfo.flags = (ushort) cf.ReadShort (); } else if (info.movementType == MT_SPINNING) { cf.ReadVector (mType.spinRate); } switch (info.controlType) { case CT_WEAPON: cType.laserInfo.parent.nType = cf.ReadShort (); cType.laserInfo.parent.nObject = cf.ReadShort (); cType.laserInfo.parent.nSignature = cf.ReadInt (); cType.laserInfo.xCreationTime = cf.ReadFix (); cType.laserInfo.nLastHitObj = cf.ReadShort (); if (cType.laserInfo.nLastHitObj < 0) cType.laserInfo.nLastHitObj = 0; else { gameData.objs.nHitObjects [Index () * MAX_HIT_OBJECTS] = cType.laserInfo.nLastHitObj; cType.laserInfo.nLastHitObj = 1; } cType.laserInfo.nHomingTarget = cf.ReadShort (); cType.laserInfo.xScale = cf.ReadFix (); break; case CT_EXPLOSION: cType.explInfo.nSpawnTime = cf.ReadFix (); cType.explInfo.nDeleteTime = cf.ReadFix (); cType.explInfo.nDeleteObj = cf.ReadShort (); cType.explInfo.attached.nParent = cf.ReadShort (); cType.explInfo.attached.nPrev = cf.ReadShort (); cType.explInfo.attached.nNext = cf.ReadShort (); break; case CT_AI: cType.aiInfo.behavior = (ubyte) cf.ReadByte (); cf.Read (cType.aiInfo.flags, 1, MAX_AI_FLAGS); cType.aiInfo.nHideSegment = cf.ReadShort (); cType.aiInfo.nHideIndex = cf.ReadShort (); cType.aiInfo.nPathLength = cf.ReadShort (); cType.aiInfo.nCurPathIndex = cf.ReadByte (); cType.aiInfo.bDyingSoundPlaying = cf.ReadByte (); cType.aiInfo.nDangerLaser = cf.ReadShort (); cType.aiInfo.nDangerLaserSig = cf.ReadInt (); cType.aiInfo.xDyingStartTime = cf.ReadFix (); break; case CT_LIGHT: cType.lightInfo.intensity = cf.ReadFix (); break; case CT_POWERUP: cType.powerupInfo.nCount = cf.ReadInt (); cType.powerupInfo.xCreationTime = cf.ReadFix (); cType.powerupInfo.nFlags = cf.ReadInt (); break; } switch (info.renderType) { case RT_MORPH: case RT_POLYOBJ: { int i; rType.polyObjInfo.nModel = cf.ReadInt (); for (i = 0; i < MAX_SUBMODELS; i++) cf.ReadAngVec (rType.polyObjInfo.animAngles [i]); rType.polyObjInfo.nSubObjFlags = cf.ReadInt (); rType.polyObjInfo.nTexOverride = cf.ReadInt (); rType.polyObjInfo.nAltTextures = cf.ReadInt (); break; } case RT_WEAPON_VCLIP: case RT_HOSTAGE: case RT_POWERUP: case RT_FIREBALL: case RT_THRUSTER: rType.vClipInfo.nClipIndex = cf.ReadInt (); rType.vClipInfo.xFrameTime = cf.ReadFix (); rType.vClipInfo.nCurFrame = cf.ReadByte (); break; case RT_LASER: break; } }
/* * reads n tRobotInfo structs from a CFile */ int ReadRobotInfos (CArray<tRobotInfo>& botInfo, int n, CFile& cf, int o) { int h, i, j; for (i = 0; i < n; i++) { h = i + o; botInfo [h].nModel = cf.ReadInt (); for (j = 0; j < MAX_GUNS; j++) cf.ReadVector (botInfo [h].gunPoints [j]); cf.Read (botInfo [h].gunSubModels, MAX_GUNS, 1); botInfo [h].nExp1VClip = cf.ReadShort (); botInfo [h].nExp1Sound = cf.ReadShort (); botInfo [h].nExp2VClip = cf.ReadShort (); botInfo [h].nExp2Sound = cf.ReadShort (); botInfo [h].nWeaponType = cf.ReadByte (); botInfo [h].nSecWeaponType = cf.ReadByte (); botInfo [h].nGuns = cf.ReadByte (); botInfo [h].containsId = cf.ReadByte (); botInfo [h].containsCount = cf.ReadByte (); botInfo [h].containsProb = cf.ReadByte (); botInfo [h].containsType = cf.ReadByte (); botInfo [h].kamikaze = cf.ReadByte (); botInfo [h].scoreValue = cf.ReadShort (); botInfo [h].badass = cf.ReadByte (); botInfo [h].energyDrain = cf.ReadByte (); botInfo [h].lighting = cf.ReadFix (); botInfo [h].strength = cf.ReadFix (); botInfo [h].mass = cf.ReadFix (); botInfo [h].drag = cf.ReadFix (); for (j = 0; j < NDL; j++) botInfo [h].fieldOfView [j] = cf.ReadFix (); for (j = 0; j < NDL; j++) botInfo [h].primaryFiringWait [j] = cf.ReadFix (); for (j = 0; j < NDL; j++) botInfo [h].secondaryFiringWait [j] = cf.ReadFix (); for (j = 0; j < NDL; j++) botInfo [h].turnTime [j] = cf.ReadFix (); for (j = 0; j < NDL; j++) botInfo [h].xMaxSpeed [j] = cf.ReadFix (); for (j = 0; j < NDL; j++) botInfo [h].circleDistance [j] = cf.ReadFix (); cf.Read (botInfo [h].nRapidFireCount, NDL, 1); cf.Read (botInfo [h].evadeSpeed, NDL, 1); botInfo [h].cloakType = cf.ReadByte (); botInfo [h].attackType = cf.ReadByte (); botInfo [h].seeSound = cf.ReadByte (); botInfo [h].attackSound = cf.ReadByte (); botInfo [h].clawSound = cf.ReadByte (); botInfo [h].tauntSound = cf.ReadByte (); botInfo [h].bossFlag = cf.ReadByte (); botInfo [h].companion = cf.ReadByte (); botInfo [h].smartBlobs = cf.ReadByte (); botInfo [h].energyBlobs = cf.ReadByte (); botInfo [h].thief = cf.ReadByte (); botInfo [h].pursuit = cf.ReadByte (); botInfo [h].lightcast = cf.ReadByte (); botInfo [h].bDeathRoll = cf.ReadByte (); botInfo [h].flags = cf.ReadByte (); cf.Read(botInfo [h].pad, 3, 1); botInfo [h].deathrollSound = cf.ReadByte (); botInfo [h].glow = cf.ReadByte (); botInfo [h].behavior = cf.ReadByte (); botInfo [h].aim = cf.ReadByte (); for (j = 0; j < MAX_GUNS + 1; j++) ReadJointLists (botInfo [h].animStates [j], N_ANIM_STATES, cf); botInfo [h].always_0xabcd = cf.ReadInt (); } return i; }
static sbyte OOF_ReadByte (CFile& cf, const char *pszIdent) { sbyte b = cf.ReadByte (); OOF_PrintLog (" %s = %d\n", pszIdent, b); return b; }
// ---------------------------------------------------------------------------- //loads a level (.LVL) file from disk //returns 0 if success, else error code int LoadLevelData (char * pszFilename, int nLevel) { CFile cf; char filename [128]; int sig, nMineDataOffset, nGameDataOffset; int nError; SetDataVersion (-1); gameData.segs.bHaveSlideSegs = 0; if (gameData.app.nGameMode & GM_NETWORK) { gameData.multiplayer.maxPowerupsAllowed.Clear (0); gameData.multiplayer.powerupsInMine.Clear (0); } #if DBG Level_being_loaded = pszFilename; #endif gameStates.render.nMeshQuality = gameOpts->render.nMeshQuality; for (;;) { strcpy (filename, pszFilename); if (!cf.Open (filename, "", "rb", gameStates.app.bD1Mission)) return 1; strcpy(gameData.segs.szLevelFilename, filename); // #ifdef NEWDEMO // if (gameData.demo.nState == ND_STATE_RECORDING) // NDRecordStartDemo(); // #endif sig = cf.ReadInt (); gameData.segs.nLevelVersion = cf.ReadInt (); gameStates.app.bD2XLevel = (gameData.segs.nLevelVersion >= 10); #if TRACE console.printf (CON_DBG, "gameData.segs.nLevelVersion = %d\n", gameData.segs.nLevelVersion); #endif nMineDataOffset = cf.ReadInt (); nGameDataOffset = cf.ReadInt (); Assert(sig == MAKE_SIG('P','L','V','L')); if (gameData.segs.nLevelVersion >= 8) { //read dummy data cf.ReadInt (); cf.ReadShort (); cf.ReadByte (); } if (gameData.segs.nLevelVersion < 5) cf.ReadInt (); //was hostagetext_offset if (gameData.segs.nLevelVersion > 1) { cf.GetS (szCurrentLevelPalette, sizeof (szCurrentLevelPalette)); if (szCurrentLevelPalette [strlen(szCurrentLevelPalette) - 1] == '\n') szCurrentLevelPalette [strlen(szCurrentLevelPalette) - 1] = 0; } if ((gameData.segs.nLevelVersion <= 1) || (szCurrentLevelPalette [0] == 0)) // descent 1 level strcpy (szCurrentLevelPalette, DEFAULT_LEVEL_PALETTE); //D1_PALETTE if (gameData.segs.nLevelVersion >= 3) gameStates.app.nBaseCtrlCenExplTime = cf.ReadInt (); else gameStates.app.nBaseCtrlCenExplTime = DEFAULT_CONTROL_CENTER_EXPLOSION_TIME; if (gameData.segs.nLevelVersion >= 4) gameData.reactor.nStrength = cf.ReadInt (); else gameData.reactor.nStrength = -1; //use old defaults if (gameData.segs.nLevelVersion >= 7) { #if TRACE console.printf (CON_DBG, " loading dynamic lights ...\n"); #endif if (0 > ReadVariableLights (cf)) { cf.Close (); return 5; } } if (gameData.segs.nLevelVersion < 6) { gameData.segs.secret.nReturnSegment = 0; gameData.segs.secret.returnOrient = CFixMatrix::IDENTITY; } else { gameData.segs.secret.nReturnSegment = cf.ReadInt (); for (int i = 0; i < 9; i++) gameData.segs.secret.returnOrient [i] = cf.ReadInt (); } //NOTE LINK TO ABOVE!! cf.Seek (nGameDataOffset, SEEK_SET); nError = LoadMineDataCompiled (cf, 1); cf.Seek (nMineDataOffset, SEEK_SET); nError = LoadMineSegmentsCompiled (cf); if (nError == -1) { //error!! cf.Close (); return 2; } cf.Seek (nGameDataOffset, SEEK_SET); gameData.objs.lists.Init (); nError = LoadMineDataCompiled (cf, 0); if (nError == -1) { //error!! cf.Close (); return 3; } cf.Close (); networkData.nSegmentCheckSum = CalcSegmentCheckSum (); if (meshBuilder.Build (nLevel)) break; if (gameStates.render.nMeshQuality <= 0) return 6; gameStates.render.nMeshQuality--; } gameStates.render.nMeshQuality = gameOpts->render.nMeshQuality; #if 0 if (!(gameData.render.lights.Create () && gameData.render.color.Create () && gameData.render.shadows.Create ())) return 7; #endif if (!gameData.render.mine.Create ()) return 4; lightManager.Setup (nLevel); //moved to loadgame.cpp::LoadLevel() SetAmbientSoundFlags (); return 0; }
void BMReadGameDataD1 (CFile& cf) { int h, i, j, v10DataOffset; #if 1 tD1WallClip w; D1_tmap_info t; //D1Robot_info r; #endif tWallClip *pw; tTexMapInfo *pt; tRobotInfo *pr; CPolyModel model; ubyte tmpSounds [D1_MAX_SOUNDS]; v10DataOffset = cf.ReadInt (); cf.Read (&gameData.pig.tex.nTextures [1], sizeof (int), 1); j = (gameData.pig.tex.nTextures [1] == 70) ? 70 : D1_MAX_TEXTURES; /*---*/PrintLog (" Loading %d texture indices\n", j); //cf.Read (gameData.pig.tex.bmIndex [1], sizeof (tBitmapIndex), D1_MAX_TEXTURES); ReadBitmapIndices (gameData.pig.tex.bmIndex [1], D1_MAX_TEXTURES, cf); BuildTextureIndex (1, D1_MAX_TEXTURES); /*---*/PrintLog (" Loading %d texture descriptions\n", j); for (i = 0, pt = &gameData.pig.tex.tMapInfo [1][0]; i < j; i++, pt++) { #if DBG cf.Read (t.filename, sizeof (t.filename), 1); #else cf.Seek (sizeof (t.filename), SEEK_CUR); #endif pt->flags = (ubyte) cf.ReadByte (); pt->lighting = cf.ReadFix (); pt->damage = cf.ReadFix (); pt->nEffectClip = cf.ReadInt (); pt->slide_u = pt->slide_v = 0; pt->destroyed = -1; } cf.Read (Sounds [1], sizeof (ubyte), D1_MAX_SOUNDS); cf.Read (AltSounds [1], sizeof (ubyte), D1_MAX_SOUNDS); /*---*/PrintLog (" Initializing %d sounds\n", D1_MAX_SOUNDS); if (gameOpts->sound.bUseD1Sounds) { memcpy (Sounds [1] + D1_MAX_SOUNDS, Sounds [0] + D1_MAX_SOUNDS, MAX_SOUNDS - D1_MAX_SOUNDS); memcpy (AltSounds [1] + D1_MAX_SOUNDS, AltSounds [0] + D1_MAX_SOUNDS, MAX_SOUNDS - D1_MAX_SOUNDS); } else { memcpy (Sounds [1], Sounds [0], MAX_SOUNDS); memcpy (AltSounds [1], AltSounds [0], MAX_SOUNDS); } for (i = 0; i < D1_MAX_SOUNDS; i++) { if (Sounds [1][i] == 255) Sounds [1][i] = Sounds [0][i]; if (AltSounds [1][i] == 255) AltSounds [1][i] = AltSounds [0][i]; } gameData.eff.nClips [1] = cf.ReadInt (); /*---*/PrintLog (" Loading %d animation clips\n", gameData.eff.nClips [1]); ReadVideoClips (gameData.eff.vClips [1], D1_VCLIP_MAXNUM, cf); gameData.eff.nEffects [1] = cf.ReadInt (); /*---*/PrintLog (" Loading %d animation descriptions\n", gameData.eff.nClips [1]); ReadEffectClips (gameData.eff.effects [1], D1_MAX_EFFECTS, cf); gameData.walls.nAnims [1] = cf.ReadInt (); /*---*/PrintLog (" Loading %d CWall animations\n", gameData.walls.nAnims [1]); for (i = 0, pw = &gameData.walls.anims [1][0]; i < D1_MAX_WALL_ANIMS; i++, pw++) { //cf.Read (&w, sizeof (w), 1); pw->xTotalTime = cf.ReadFix (); pw->nFrameCount = cf.ReadShort (); for (j = 0; j < D1_MAX_CLIP_FRAMES; j++) pw->frames [j] = cf.ReadShort (); pw->openSound = cf.ReadShort (); pw->closeSound = cf.ReadShort (); pw->flags = cf.ReadShort (); cf.Read (pw->filename, sizeof (w.filename), 1); pw->pad = (char) cf.ReadByte (); } cf.Read (&gameData.bots.nTypes [1], sizeof (int), 1); /*---*/PrintLog (" Loading %d robot descriptions\n", gameData.bots.nTypes [1]); gameData.bots.info [1] = gameData.bots.info [0]; if (!gameOpts->sound.bUseD1Sounds) return; for (i = 0, pr = &gameData.bots.info [1][0]; i < D1_MAX_ROBOT_TYPES; i++, pr++) { //cf.Read (&r, sizeof (r), 1); cf.Seek ( sizeof (int) * 3 + (sizeof (CFixVector) + sizeof (ubyte)) * MAX_GUNS + sizeof (short) * 5 + sizeof (sbyte) * 7 + sizeof (fix) * 4 + sizeof (fix) * 7 * NDL + sizeof (sbyte) * 2 * NDL, SEEK_CUR); pr->seeSound = (ubyte) cf.ReadByte (); pr->attackSound = (ubyte) cf.ReadByte (); pr->clawSound = (ubyte) cf.ReadByte (); cf.Seek ( JOINTLIST_SIZE * (MAX_GUNS + 1) * N_ANIM_STATES + sizeof (int), SEEK_CUR); pr->always_0xabcd = 0xabcd; } cf.Seek ( sizeof (int) + JOINTPOS_SIZE * D1_MAX_ROBOT_JOINTS + sizeof (int) + D1_WEAPON_INFO_SIZE * D1_MAX_WEAPON_TYPES + sizeof (int) + POWERUP_TYPE_INFO_SIZE * MAX_POWERUP_TYPES_D1, SEEK_CUR); i = cf.ReadInt (); /*---*/PrintLog (" Acquiring model data size of %d polymodels\n", i); for (h = 0; i; i--) { cf.Seek (MODEL_DATA_SIZE_OFFS, SEEK_CUR); model.SetDataSize (cf.ReadInt ()); h += model.DataSize (); cf.Seek (POLYMODEL_SIZE - MODEL_DATA_SIZE_OFFS - sizeof (int), SEEK_CUR); } cf.Seek ( h + sizeof (tBitmapIndex) * D1_MAX_GAUGE_BMS + sizeof (int) * 2 * D1_MAX_POLYGON_MODELS + sizeof (tBitmapIndex) * D1_MAX_OBJ_BITMAPS + sizeof (ushort) * D1_MAX_OBJ_BITMAPS + PLAYER_SHIP_SIZE + sizeof (int) + sizeof (tBitmapIndex) * D1_N_COCKPIT_BITMAPS, SEEK_CUR); /*---*/PrintLog (" Loading sound data\n", i); cf.Read (tmpSounds, sizeof (ubyte), D1_MAX_SOUNDS); //for (i = 0, pr = &gameData.bots.info [1][0]; i < gameData.bots.nTypes [1]; i++, pr++) pr = gameData.bots.info [1] + 17; /*---*/PrintLog (" Initializing sound data\n", i); for (i = 0; i < D1_MAX_SOUNDS; i++) { if (Sounds [1][i] == tmpSounds [pr->seeSound]) pr->seeSound = i; if (Sounds [1][i] == tmpSounds [pr->attackSound]) pr->attackSound = i; if (Sounds [1][i] == tmpSounds [pr->clawSound]) pr->clawSound = i; } pr = gameData.bots.info [1] + 23; for (i = 0; i < D1_MAX_SOUNDS; i++) { if (Sounds [1][i] == tmpSounds [pr->seeSound]) pr->seeSound = i; if (Sounds [1][i] == tmpSounds [pr->attackSound]) pr->attackSound = i; if (Sounds [1][i] == tmpSounds [pr->clawSound]) pr->clawSound = i; } cf.Read (tmpSounds, sizeof (ubyte), D1_MAX_SOUNDS); // for (i = 0, pr = &gameData.bots.info [1][0]; i < gameData.bots.nTypes [1]; i++, pr++) { pr = gameData.bots.info [1] + 17; for (i = 0; i < D1_MAX_SOUNDS; i++) { if (AltSounds [1][i] == tmpSounds [pr->seeSound]) pr->seeSound = i; if (AltSounds [1][i] == tmpSounds [pr->attackSound]) pr->attackSound = i; if (AltSounds [1][i] == tmpSounds [pr->clawSound]) pr->clawSound = i; } pr = gameData.bots.info [1] + 23; for (i = 0; i < D1_MAX_SOUNDS; i++) { if (AltSounds [1][i] == tmpSounds [pr->seeSound]) pr->seeSound = i; if (AltSounds [1][i] == tmpSounds [pr->attackSound]) pr->attackSound = i; if (AltSounds [1][i] == tmpSounds [pr->clawSound]) pr->clawSound = i; } #if 0 cf.Seek (v10DataOffset, SEEK_SET); i = cf.ReadInt (); j = cf.ReadInt (); cf.Seek (i * sizeof (tD1TextureHeader), SEEK_CUR); gameStates.app.bD1Mission = 1; for (i = 0; i < j; i++) { cf.Read (&gameData.pig.sound.sounds [1][i].szName, sizeof (gameData.pig.sound.sounds [1][i].szName), 1); cf.Seek (sizeof (tD1SoundHeader) - sizeof (gameData.pig.sound.sounds [1][i].szName), SEEK_CUR); } #endif }
void BMReadWeaponInfoD1N (CFile& cf, int i) { CD1WeaponInfo* wiP = gameData.weapons.infoD1 + i; wiP->renderType = cf.ReadByte (); wiP->nModel = cf.ReadByte (); wiP->nInnerModel = cf.ReadByte (); wiP->persistent = cf.ReadByte (); wiP->nFlashVClip = cf.ReadByte (); wiP->flashSound = cf.ReadShort (); wiP->nRobotHitVClip = cf.ReadByte (); wiP->nRobotHitSound = cf.ReadShort (); wiP->nWallHitVClip = cf.ReadByte (); wiP->nWallHitSound = cf.ReadShort (); wiP->fireCount = cf.ReadByte (); wiP->nAmmoUsage = cf.ReadByte (); wiP->nVClipIndex = cf.ReadByte (); wiP->destructible = cf.ReadByte (); wiP->matter = cf.ReadByte (); wiP->bounce = cf.ReadByte (); wiP->homingFlag = cf.ReadByte (); wiP->dum1 = cf.ReadByte (); wiP->dum2 = cf.ReadByte (); wiP->dum3 = cf.ReadByte (); wiP->xEnergyUsage = cf.ReadFix (); wiP->xFireWait = cf.ReadFix (); wiP->bitmap.index = cf.ReadShort (); wiP->blob_size = cf.ReadFix (); wiP->xFlashSize = cf.ReadFix (); wiP->xImpactSize = cf.ReadFix (); for (i = 0; i < NDL; i++) wiP->strength [i] = cf.ReadFix (); for (i = 0; i < NDL; i++) wiP->speed [i] = cf.ReadFix (); wiP->mass = cf.ReadFix (); wiP->drag = cf.ReadFix (); wiP->thrust = cf.ReadFix (); wiP->poLenToWidthRatio = cf.ReadFix (); wiP->light = cf.ReadFix (); wiP->lifetime = cf.ReadFix (); wiP->xDamageRadius = cf.ReadFix (); wiP->picture.index = cf.ReadShort (); }
int LoadMineSegmentsCompiled (CFile& cf) { int i, nSegments, nVertices; ubyte nCompiledVersion; char *psz; gameData.segs.vMin.Set (0x7fffffff, 0x7fffffff, 0x7fffffff); /* [X] = gameData.segs.vMin[Y] = gameData.segs.vMin[Y] = 0x7fffffff;*/ gameData.segs.vMax.Set (-0x7fffffff, -0x7fffffff, -0x7fffffff); /*[X] = gameData.segs.vMax[X] = gameData.segs.vMax[Y] = gameData.segs.vMax[Y] = -0x7fffffff;*/ gameStates.render.bColored = 0; bD1PigPresent = CFile::Exist (D1_PIGFILE, gameFolders.szDataDir, 0); psz = strchr (gameData.segs.szLevelFilename, '.'); bNewFileFormat = !psz || strcmp (psz, ".sdl"); // For compiled levels, textures map to themselves, prevent nTexOverride always being gray, // bug which Matt and John refused to acknowledge, so here is Mike, fixing it. //=============================== Reading part ============================== nCompiledVersion = cf.ReadByte (); //Assert ( nCompiledVersion==COMPILED_MINE_VERSION ); #if TRACE if (nCompiledVersion != COMPILED_MINE_VERSION) console.printf (CON_DBG, "compiled mine version=%i\n", nCompiledVersion); //many levels have "wrong" versions. Theres no point in aborting because of it, I think. console.printf (CON_DBG, " compiled mine version = %d\n", nCompiledVersion); #endif nVertices = bNewFileFormat ? cf.ReadShort () : cf.ReadInt (); Assert (nVertices <= MAX_VERTICES); #if TRACE console.printf (CON_DBG, " %d vertices\n", gameData.segs.nVertices); #endif nSegments = bNewFileFormat ? cf.ReadShort () : cf.ReadInt (); if (nSegments >= MAX_SEGMENTS) { Warning (TXT_LEVEL_TOO_LARGE); return -1; } if (!InitGame (nSegments, nVertices)) return -1; #if TRACE console.printf (CON_DBG, " %d segments\n", gameData.segs.nSegments); #endif for (i = 0; i < gameData.segs.nVertices; i++) { cf.ReadVector (gameData.segs.vertices [i]); #if !FLOAT_COORD gameData.segs.fVertices [i][X] = X2F (gameData.segs.vertices [i][X]); gameData.segs.fVertices [i][Y] = X2F (gameData.segs.vertices [i][Y]); gameData.segs.fVertices [i][Z] = X2F (gameData.segs.vertices [i][Z]); #endif if (gameData.segs.vMin [X] > gameData.segs.vertices [i][X]) gameData.segs.vMin [X] = gameData.segs.vertices [i][X]; if (gameData.segs.vMin [Y] > gameData.segs.vertices [i][Y]) gameData.segs.vMin [Y] = gameData.segs.vertices [i][Y]; if (gameData.segs.vMin [Z] > gameData.segs.vertices [i][Z]) gameData.segs.vMin [Z] = gameData.segs.vertices [i][Z]; if (gameData.segs.vMax [X] < gameData.segs.vertices [i][X]) gameData.segs.vMax [X] = gameData.segs.vertices [i][X]; if (gameData.segs.vMax [Y] < gameData.segs.vertices [i][Y]) gameData.segs.vMax [Y] = gameData.segs.vertices [i][Y]; if (gameData.segs.vMax [Z] < gameData.segs.vertices [i][Z]) gameData.segs.vMax [Z] = gameData.segs.vertices [i][Z]; } SEGMENTS.Clear (); #if TRACE console.printf (CON_DBG, " loading segments ...\n"); #endif gameData.segs.nLastVertex = gameData.segs.nVertices - 1; gameData.segs.nLastSegment = gameData.segs.nSegments - 1; if (gameStates.app.bProgressBars && gameOpts->menus.nStyle) LoadSegmentsGauge (cf); else { LoadSegmentsCompiled (-1, cf); SetupSegments (); // Fill in side type and normals. LoadExtSegmentsCompiled (cf); LoadVertLightsCompiled (-1, cf); LoadSideLightsCompiled (-1, cf); LoadTexColorsCompiled (-1, cf); ComputeSegSideCenters (-1); } gameData.segs.fRad = X2F (CFixVector::Dist(gameData.segs.vMax, gameData.segs.vMin)); ResetObjects (1); //one CObject, the player return 0; }